diff options
Diffstat (limited to 'scripts/theme-studio')
| -rw-r--r-- | scripts/theme-studio/README.md | 36 | ||||
| -rw-r--r-- | scripts/theme-studio/colormath.js | 193 | ||||
| -rw-r--r-- | scripts/theme-studio/dupre-revised.json | 10411 | ||||
| -rw-r--r-- | scripts/theme-studio/dupre.json | 175 | ||||
| -rw-r--r-- | scripts/theme-studio/generate.py | 203 | ||||
| -rwxr-xr-x | scripts/theme-studio/run-tests.sh | 73 | ||||
| -rw-r--r-- | scripts/theme-studio/test-colormath.mjs | 240 | ||||
| -rw-r--r-- | scripts/theme-studio/test_generate.py | 84 | ||||
| -rw-r--r-- | scripts/theme-studio/theme-coloring-guide.org | 473 | ||||
| -rw-r--r-- | scripts/theme-studio/theme-studio.html | 369 |
10 files changed, 12220 insertions, 37 deletions
diff --git a/scripts/theme-studio/README.md b/scripts/theme-studio/README.md index 62034039..044ccc2e 100644 --- a/scripts/theme-studio/README.md +++ b/scripts/theme-studio/README.md @@ -8,6 +8,10 @@ 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`. +For the color-assignment philosophy behind the tool — how to group syntax roles, +what to share, where to spend chroma and bold — see +[`theme-coloring-guide.org`](theme-coloring-guide.org). + ## Run ```bash @@ -26,6 +30,24 @@ During color work, disable Hyprland inactive-window dimming so colors read true: hyprctl keyword decoration:dim_inactive false ``` +## Tests + +```bash +make theme-studio-test # from the repo root, runs the whole pyramid +scripts/theme-studio/run-tests.sh # or call the runner directly +``` + +The runner regenerates the page, runs the Python templating tests +(`test_generate.py`), the Node unit tests for `colormath.js` +(`test-colormath.mjs`, including the inline-integrity check), a syntax check of +the spliced page script, and the browser hash gates in headless Chrome +(`#selftest`, `#cursortest`, `#readouttest`, `#deltatest`, `#oklchtest`, +`#planetest`). It exits non-zero on any failure. The browser gates need a +Chromium-family browser; without one they report SKIPPED rather than passing +silently. The pure color math and the extracted picker logic (`planeCell`, +`paletteWarnings`) live in `colormath.js` so they are unit-tested directly in +Node; the DOM glue is covered by the browser hash gates. + ## Files - `generate.py` — emits the HTML+JS, and embeds the package data. Edit here to @@ -47,6 +69,20 @@ Three tiers of faces, plus the palette: (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. + + The picker also shows perceptual readouts beside the WCAG ratio: the OKLCH + coordinates (lightness, chroma, hue°) and the APCA Lc contrast against the + ground color. APCA Lc is signed — positive means dark text on a light + background, negative means light text on a dark background — so a light color + on dupre's dark ground reads as a negative Lc. WCAG stays the rating used in + the syntax/UI/package tables; APCA and OKLCH are picker-only diagnostics. + + An edit-model toggle switches the picker between HSV and OKLCH, independent of + the contrast mask. In OKLCH mode the L/C/H dials drive the color and the square + becomes a Chroma×Lightness plane at the current hue, with the out-of-gamut + region greyed out; the hue strip selects the hue. Pushing chroma past sRGB + snaps to the reachable color and shows a clamp note. The palette also warns + when two colors fall below a perceptual ΔE threshold, hard to tell apart. - **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 diff --git a/scripts/theme-studio/colormath.js b/scripts/theme-studio/colormath.js new file mode 100644 index 00000000..167a5ea1 --- /dev/null +++ b/scripts/theme-studio/colormath.js @@ -0,0 +1,193 @@ +// colormath.js — pure color-math core for theme-studio. +// +// One source of truth: node imports this module (tests); generate.py inlines its +// body into the page (stripping the trailing export block) so the browser runs +// the same code. No DOM, no side effects. +// +// Algorithms: OKLab/OKLCH from Bjorn Ottosson (2020, +// https://bottosson.github.io/posts/oklab/); APCA from APCA-W3 0.1.9 +// (https://github.com/Myndex/apca-w3); deltaE is OKLab Euclidean distance. + +function hex2rgb(h) { + return [parseInt(h.substr(1, 2), 16), parseInt(h.substr(3, 2), 16), parseInt(h.substr(5, 2), 16)]; +} + +// sRGB transfer (0..1 channel <-> linear-light). +function lin(c) { return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); } +function delin(c) { return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055; } +function clamp01(c) { return c < 0 ? 0 : c > 1 ? 1 : c; } + +function srgb2oklab(hex) { + const [R, G, B] = hex2rgb(hex); + const r = lin(R / 255), g = lin(G / 255), b = lin(B / 255); + const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b; + const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b; + const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b; + const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s); + return { + L: 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + a: 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_, + }; +} + +function oklab2oklch(lab) { + let H = Math.atan2(lab.b, lab.a) * 180 / Math.PI; + if (H < 0) H += 360; + return { L: lab.L, C: Math.hypot(lab.a, lab.b), H }; +} + +function oklch2oklab(L, C, H) { + const hr = H * Math.PI / 180; + return { L, a: C * Math.cos(hr), b: C * Math.sin(hr) }; +} + +// OKLab -> linear sRGB (may fall outside [0,1] when out of gamut). +function oklab2lrgb(L, a, b) { + const l_ = L + 0.3963377774 * a + 0.2158037573 * b; + const m_ = L - 0.1055613458 * a - 0.0638541728 * b; + const s_ = L - 0.0894841775 * a - 1.2914855480 * b; + const l = l_ * l_ * l_, m = m_ * m_ * m_, s = s_ * s_ * s_; + return [ + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s, + ]; +} + +function inGamut(lrgb) { + const e = 1e-4; + return lrgb.every(c => c >= -e && c <= 1 + e); +} + +function lrgb2hex(lrgb) { + return '#' + lrgb.map(c => { + const v = Math.round(clamp01(delin(clamp01(c))) * 255); + return v.toString(16).padStart(2, '0'); + }).join(''); +} + +// OKLCH -> in-gamut sRGB hex. When the requested chroma is unreachable, reduce C +// by binary search holding L and H fixed; report whether clamping happened. +function oklch2hex(L, C, H) { + const lab0 = oklch2oklab(L, C, H); + const lrgb0 = oklab2lrgb(lab0.L, lab0.a, lab0.b); + if (inGamut(lrgb0)) return { hex: lrgb2hex(lrgb0), clamped: false }; + let lo = 0, hi = C; + for (let i = 0; i < 24; i++) { + const mid = (lo + hi) / 2; + const lab = oklch2oklab(L, mid, H); + if (inGamut(oklab2lrgb(lab.L, lab.a, lab.b))) lo = mid; else hi = mid; + } + const lab = oklch2oklab(L, lo, H); + return { hex: lrgb2hex(oklab2lrgb(lab.L, lab.a, lab.b)), clamped: true }; +} + +// APCA-W3 0.1.9. Returns signed Lc: positive for dark-text-on-light, negative +// for light-text-on-dark. Constants transcribed verbatim from the pinned source. +function apcaY(hex) { + const [R, G, B] = hex2rgb(hex); + return 0.2126729 * Math.pow(R / 255, 2.4) + + 0.7151522 * Math.pow(G / 255, 2.4) + + 0.0721750 * Math.pow(B / 255, 2.4); +} + +function apca(textHex, bgHex) { + const blkThrs = 0.022, blkClmp = 1.414, deltaYmin = 0.0005; + const normBG = 0.56, normTXT = 0.57, revTXT = 0.62, revBG = 0.65; + const scaleBoW = 1.14, scaleWoB = 1.14, loBoWoffset = 0.027, loWoBoffset = 0.027, loClip = 0.1; + let Ytxt = apcaY(textHex), Ybg = apcaY(bgHex); + Ytxt = Ytxt > blkThrs ? Ytxt : Ytxt + Math.pow(blkThrs - Ytxt, blkClmp); + Ybg = Ybg > blkThrs ? Ybg : Ybg + Math.pow(blkThrs - Ybg, blkClmp); + if (Math.abs(Ybg - Ytxt) < deltaYmin) return 0; + let out; + if (Ybg > Ytxt) { + const sapc = (Math.pow(Ybg, normBG) - Math.pow(Ytxt, normTXT)) * scaleBoW; + out = sapc < loClip ? 0 : sapc - loBoWoffset; + } else { + const sapc = (Math.pow(Ybg, revBG) - Math.pow(Ytxt, revTXT)) * scaleWoB; + out = sapc > -loClip ? 0 : sapc + loWoBoffset; + } + return out * 100; +} + +// deltaE-OK: Euclidean distance in OKLab. +function deltaE(aHex, bHex) { + const x = srgb2oklab(aHex), y = srgb2oklab(bHex); + return Math.hypot(x.L - y.L, x.a - y.a, x.b - y.b); +} + +// --- WCAG 2.x relative luminance + contrast (migrated from the page inline) --- +// rl reuses the canonical lin() above. On 8-bit channels lin's 0.04045 cutoff is +// byte-identical to the WCAG 0.03928 piecewise the inline copy used — no channel +// value falls between the two thresholds (10/255 = 0.0392, 11/255 = 0.0431) — so +// every #rrggbb contrast value is preserved exactly. +function rl(hex) { + const [R, G, B] = hex2rgb(hex); + return 0.2126 * lin(R / 255) + 0.7152 * lin(G / 255) + 0.0722 * lin(B / 255); +} + +function contrast(aHex, bHex) { + const L1 = rl(aHex), L2 = rl(bHex), 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'; } + +// --- HSV <-> sRGB for the color picker (migrated from the page inline) --- +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 rgb2hex(r, g, b) { + return '#' + [r, g, b].map(x => Math.max(0, Math.min(255, x)).toString(16).padStart(2, '0')).join(''); +} + +// One Chroma×Lightness plane cell at a fixed hue: the sRGB color if the (L,C,H) +// is reachable, else flagged out of gamut. Forward-only (one conversion + a +// range check) — the binary-search clamp is reserved for committing a color. +function planeCell(L, C, H) { + const lab = oklch2oklab(L, C, H), lrgb = oklab2lrgb(lab.L, lab.a, lab.b); + return inGamut(lrgb) ? { inGamut: true, hex: lrgb2hex(lrgb) } : { inGamut: false, hex: null }; +} + +// Pairwise palette analysis. palette is [[hex, name], ...]. Returns the pairs +// closer than threshold (OKLab ΔE), closest-first and capped, the overflow count +// beyond the cap, and each color's nearest-neighbor distance for its chip title. +function paletteWarnings(palette, threshold = 0.02, cap = 5) { + const n = palette.length, nearest = new Array(n).fill(Infinity), pairs = []; + for (let i = 0; i < n; i++) for (let j = i + 1; j < n; j++) { + const d = deltaE(palette[i][0], palette[j][0]); + if (d < nearest[i]) nearest[i] = d; + if (d < nearest[j]) nearest[j] = d; + if (d < threshold) pairs.push({ i, j, aName: palette[i][1], bName: palette[j][1], dE: d }); + } + pairs.sort((a, b) => a.dE - b.dE); + return { warnings: pairs.slice(0, cap), overflow: Math.max(0, pairs.length - cap), nearest }; +} + +export { srgb2oklab, oklab2oklch, oklch2oklab, oklch2hex, apca, deltaE, hex2rgb, lin, rl, contrast, rating, hsv2rgb, rgb2hsv, rgb2hex, oklab2lrgb, inGamut, lrgb2hex, planeCell, paletteWarnings }; diff --git a/scripts/theme-studio/dupre-revised.json b/scripts/theme-studio/dupre-revised.json new file mode 100644 index 00000000..89aa84e0 --- /dev/null +++ b/scripts/theme-studio/dupre-revised.json @@ -0,0 +1,10411 @@ +{ + "name": "dupre-revised", + "palette": [ + [ + "#000000", + "ground" + ], + [ + "#7a9abe", + "blue" + ], + [ + "#e8bd30", + "gold" + ], + [ + "#84b068", + "pistachio" + ], + [ + "#be9e74", + "tan" + ], + [ + "#d7849d", + "orchid pink" + ], + [ + "#de4949", + "terracotta" + ], + [ + "#cdced1", + "white" + ], + [ + "#a9b2bb", + "silver" + ], + [ + "#838d97", + "steel" + ], + [ + "#5e6770", + "pewter" + ], + [ + "#2f343a", + "gunmetal" + ], + [ + "#264364", + "navy" + ], + [ + "#1a1714", + "bg-dim" + ], + [ + "#c76666", + "red" + ], + [ + "#e52e2e", + "deep red" + ], + [ + "#7f00fe", + "violet" + ], + [ + "#eed376", + "yellow1" + ] + ], + "assignments": { + "bg": "#000000", + "p": "#cdced1", + "kw": "#7a9abe", + "bi": "#7a9abe", + "pp": "#7a9abe", + "fnd": "#a9b2bb", + "fnc": "#a9b2bb", + "dec": "#e8bd30", + "ty": "#a9b2bb", + "prop": "#7a9abe", + "con": "#84b068", + "num": "#84b068", + "str": "#d7849d", + "esc": "#84b068", + "re": "#a9b2bb", + "doc": "#d7849d", + "cm": "#a9b2bb", + "cmd": "#a9b2bb", + "var": "#e8bd30", + "op": "#a9b2bb", + "punc": "#a9b2bb" + }, + "bold": [ + "kw", + "fnd", + "ty" + ], + "italic": [ + "cm", + "cmd" + ], + "ui": { + "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": "#000000" + }, + "line-number": { + "fg": "#5e6770", + "bg": null + }, + "line-number-current-line": { + "fg": "#e8bd30", + "bg": "#1a1714" + }, + "minibuffer-prompt": { + "fg": "#7a9abe", + "bg": null + }, + "isearch": { + "fg": "#000000", + "bg": "#7a9abe" + }, + "lazy-highlight": { + "fg": "#000000", + "bg": "#838d97" + }, + "isearch-fail": { + "fg": "#de4949", + "bg": null + }, + "show-paren-match": { + "fg": null, + "bg": "#264364" + }, + "show-paren-mismatch": { + "fg": "#000000", + "bg": "#de4949" + }, + "link": { + "fg": "#7a9abe", + "bg": null + }, + "error": { + "fg": "#de4949", + "bg": null + }, + "warning": { + "fg": "#e8bd30", + "bg": null + }, + "success": { + "fg": "#5d9b86", + "bg": null + }, + "vertical-border": { + "fg": "#2f343a", + "bg": null + } + }, + "packages": { + "org-mode": { + "org-document-title": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-document-info": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-document-info-keyword": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": "fixed-pitch", + "source": "user" + }, + "org-level-1": { + "fg": "#67809c", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-level-2": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-level-3": { + "fg": "#9b5fd0", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-level-4": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default", + "height": 1.1 + }, + "org-level-5": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-level-6": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-level-7": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-level-8": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-headline-todo": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-headline-done": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-todo": { + "fg": "#cb6b4d", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-done": { + "fg": "#5d9b86", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-priority": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-tag": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-tag-group": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-special-keyword": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-drawer": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-property-value": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-checkbox": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-checkbox-statistics-todo": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-checkbox-statistics-done": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-warning": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-link": { + "fg": "#67809c", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-footnote": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-date": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-sexp-date": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-date-selected": { + "fg": "#000000", + "bg": "#e8bd30", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-target": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-macro": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-cite": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-cite-key": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-block": { + "fg": "#cdced1", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-block-begin-line": { + "fg": "#5e6770", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-block-end-line": { + "fg": "#5e6770", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": "fixed-pitch", + "source": "default" + }, + "org-code": { + "fg": "#cb6b4d", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-verbatim": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-inline-src-block": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": "fixed-pitch", + "source": "default" + }, + "org-quote": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-verse": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-latex-and-related": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-table": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-table-header": { + "fg": "#cdced1", + "bg": "#2f343a", + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-table-row": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-formula": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-column": { + "fg": null, + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-column-title": { + "fg": "#cdced1", + "bg": "#2f343a", + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-list-dt": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-meta-line": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "user" + }, + "org-ellipsis": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "user" + }, + "org-hide": { + "fg": "#000000", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-indent": { + "fg": "#000000", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-archived": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-default": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-dispatcher-highlight": { + "fg": "#e8bd30", + "bg": "#264364", + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-structure": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default", + "height": 1.1 + }, + "org-agenda-structure-secondary": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-structure-filter": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-date": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default", + "height": 1.05 + }, + "org-agenda-date-today": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default", + "height": 1.05 + }, + "org-agenda-date-weekend": { + "fg": "#838d97", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-date-weekend-today": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-current-time": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-done": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-dimmed-todo-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-calendar-event": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-calendar-sexp": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-calendar-daterange": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-diary": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-clocking": { + "fg": null, + "bg": "#264364", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-column-dateline": { + "fg": null, + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-restriction-lock": { + "fg": null, + "bg": "#de4949", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-filter-category": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-filter-effort": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-filter-regexp": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-agenda-filter-tags": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-scheduled": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-scheduled-today": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-scheduled-previously": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-upcoming-deadline": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-upcoming-distant-deadline": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-imminent-deadline": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-time-grid": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-clock-overlay": { + "fg": null, + "bg": "#264364", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-mode-line-clock": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-mode-line-clock-overrun": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "magit": { + "magit-section-heading": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-secondary-heading": { + "fg": "#be9e74", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-heading-selection": { + "fg": "#e8bd30", + "bg": "#264364", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-highlight": { + "fg": null, + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-child-count": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-added": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-added-highlight": { + "fg": null, + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-removed": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-removed-highlight": { + "fg": "#de4949", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-context": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-context-highlight": { + "fg": "#a9b2bb", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-file-heading": { + "fg": "#cdced1", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-file-heading-highlight": { + "fg": "#cdced1", + "bg": "#1a1714", + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-file-heading-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-heading": { + "fg": "#838d97", + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-heading-highlight": { + "fg": "#cdced1", + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-heading-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-region": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-lines-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-lines-boundary": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-base": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-base-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-our": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-our-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-their": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-their-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-conflict-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-conflict-heading-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-revision-summary": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-revision-summary-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diff-whitespace-warning": { + "fg": null, + "bg": "#de4949", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diffstat-added": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-diffstat-removed": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-branch-current": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-branch-local": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-branch-remote": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-branch-remote-head": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-branch-upstream": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-branch-warning": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-head": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-tag": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-hash": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-filename": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-dimmed": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-keyword": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-keyword-squash": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-refname": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-refname-stash": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-refname-wip": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-refname-pullreq": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-log-author": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-log-date": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-log-graph": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-header-line": { + "fg": "#cdced1", + "bg": "#2f343a", + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-header-line-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-header-line-log-select": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-process-ok": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-process-ng": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-mode-line-process": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-mode-line-process-error": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-bisect-good": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-bisect-bad": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-bisect-skip": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-heading": { + "fg": "#838d97", + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-hash": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-name": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-date": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-summary": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-dimmed": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-blame-margin": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-cherry-equivalent": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-cherry-unmatched": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-signature-good": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-signature-bad": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-signature-untrusted": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-signature-expired": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-signature-expired-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-signature-revoked": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-signature-error": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-commit": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-amend": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-merge": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-checkout": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-reset": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-rebase": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-cherry-pick": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-remote": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-reflog-other": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-pick": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-stop": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-part": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-head": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-drop": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-done": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-onto": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-sequence-exec": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-left-margin": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "elfeed": { + "elfeed-search-date-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-search-title-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-search-unread-title-face": { + "fg": "#cdced1", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-search-feed-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-search-tag-face": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-search-unread-count-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-search-filter-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-search-last-update-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-log-date-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-log-error-level-face": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-log-warn-level-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-log-info-level-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "elfeed-log-debug-level-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "mu4e": { + "mu4e-title-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-context-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-modeline-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-ok-face": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-warning-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-header-title-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-header-key-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-header-value-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-header-face": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-header-highlight-face": { + "fg": null, + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-header-marks-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-unread-face": { + "fg": "#cdced1", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-flagged-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-replied-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-forwarded-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-draft-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-trashed-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-moved-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-related-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-contact-face": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-special-header-value-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-attach-number-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-url-number-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-link-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-cited-1-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-cited-2-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-cited-3-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-cited-4-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-cited-5-face": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-cited-6-face": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-cited-7-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-footer-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-region-code": { + "fg": null, + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-system-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-highlight-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-compose-header-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "mu4e-compose-separator-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "ghostel": { + "ghostel-default": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-fake-cursor": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-fake-cursor-box": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-black": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-red": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-green": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-yellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-blue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-magenta": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-cyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-white": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-black": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-red": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-green": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-yellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-blue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-magenta": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-cyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-white": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "dashboard": { + "dashboard-banner-logo-title": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dashboard-text-banner": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dashboard-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dashboard-items-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dashboard-navigator": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dashboard-no-items-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dashboard-footer-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dashboard-footer-icon-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "lsp-mode": { + "lsp-signature-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-signature-highlight-function-argument": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-signature-posframe": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-face-highlight-read": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-face-highlight-write": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-face-highlight-textual": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-face-rename": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-rename-placeholder-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-inlay-hint-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-inlay-hint-parameter-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-inlay-hint-type-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-details-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-installation-buffer-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "lsp-installation-finished-buffer-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "git-gutter": { + "git-gutter:added": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "git-gutter:modified": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "git-gutter:deleted": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "git-gutter:unchanged": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "git-gutter:separator": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "flycheck": { + "flycheck-error": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-warning": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-info": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-fringe-error": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-fringe-warning": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-fringe-info": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-delimited-error": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-delimiter": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-error": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-warning": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-info": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-error-message": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-checker-name": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-column-number": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-line-number": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-filename": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-id": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-id-with-explainer": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "flycheck-verify-select-checker": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "dired": { + "dired-header": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-directory": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-symlink": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-broken-symlink": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-special": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-set-id": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-perm-write": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-mark": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-marked": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-flagged": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-ignored": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dired-warning": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "dirvish": { + "dirvish-inactive": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-free-space": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-hl-line": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-hl-line-inactive": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-modes": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-link-number": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-user-id": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-group-id": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-size": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-time": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-inode-number": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-file-device-number": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-subtree-guide": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-subtree-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-collapse-dir-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-collapse-empty-dir-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-collapse-file-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-emerge-group-title": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-media-info-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-media-info-property-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-0": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-1": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-2": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-3": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-narrow-split": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-proc-running": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-proc-finished": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-proc-failed": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-git-commit-message-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-added-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-edited-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-removed-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-conflict-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-locked-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-missing-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-needs-merge-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-needs-update-state": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "dirvish-vc-unregistered-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "calibredb": { + "calibredb-search-header-library-name-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-search-header-library-path-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-search-header-total-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-search-header-filter-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-search-header-sort-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-search-header-highlight-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-id-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-title-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-author-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-format-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-size-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-tag-face": { + "fg": "#be9e74", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-date-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-mark-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-series-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-publisher-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-pubdate-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-language-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-comment-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-archive-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-favorite-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-file-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-ids-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-highlight-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-current-page-button-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-mouse-face": { + "fg": null, + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-title-detailed-view-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "calibredb-edit-annotation-header-title-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "erc": { + "erc-header-line": { + "fg": "#cdced1", + "bg": "#2f343a", + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-timestamp-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-notice-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-default-face": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-current-nick-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-my-nick-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-my-nick-prefix-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-nick-default-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-nick-prefix-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-button-nick-default-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-nick-msg-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-direct-msg-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-action-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-keyword-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-pal-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-fool-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-dangerous-host-face": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-error-face": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-input-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-prompt-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-command-indicator-face": { + "fg": "#838d97", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-information": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-button": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-bold-face": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-italic-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-underline-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-inverse-face": { + "fg": "#000000", + "bg": "#a9b2bb", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-spoiler-face": { + "fg": "#000000", + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-fill-wrap-merge-indicator-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-keep-place-indicator-arrow": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "erc-keep-place-indicator-line": { + "fg": null, + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "org-drill": { + "org-drill-hidden-cloze-face": { + "fg": "#000000", + "bg": "#838d97", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-drill-visible-cloze-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-drill-visible-cloze-hint-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "org-noter": { + "org-noter-notes-exist-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-noter-no-notes-exist-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "signel": { + "signel-timestamp-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "signel-my-msg-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "signel-other-msg-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "signel-error-face": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "pearl": { + "pearl-preamble-summary": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "pearl-editable-comment": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "pearl-readonly-comment": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "pearl-modified-highlight": { + "fg": null, + "bg": "#264364", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "pearl-modified-local": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "pearl-modified-unknown": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "slack": { + "slack-room-info-title-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-room-info-title-room-name-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-room-info-section-title-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-room-info-section-label-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-room-unread-face": { + "fg": "#cdced1", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-output-header": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-output-text": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-output-reaction": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-output-reaction-pressed": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-deleted-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-new-message-marker-face": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-all-thread-buffer-thread-header-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-mention-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-mention-me-face": { + "fg": "#e8bd30", + "bg": "#264364", + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-mention-keyword-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-channel-button-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-bold-face": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-italic-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-code-face": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-code-block-face": { + "fg": "#de4949", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-strike-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-blockquote-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-list-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-attachment-header": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-attachment-footer": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-attachment-pad": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-attachment-field-title": { + "fg": "#838d97", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-attachment-preview-header-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-preview-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-block-highlight-source-overlay-face": { + "fg": null, + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-action-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-action-primary-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-message-action-danger-face": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-button-block-element-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-button-primary-block-element-face": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-button-danger-block-element-face": { + "fg": "#de4949", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-select-block-element-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-overflow-block-element-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-date-picker-block-element-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-title-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-element-label-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-element-hint-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-element-placeholder-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-element-error-face": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-submit-button-face": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-cancel-button-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-dialog-select-element-input-face": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-user-active-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-user-dnd-face": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-user-profile-header-face": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-user-profile-property-name-face": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-profile-image-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-search-result-message-header-face": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-search-result-message-username-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-modeline-has-unreads-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-modeline-channel-has-unreads-face": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "slack-modeline-thread-has-unreads-face": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "telega": { + "telega-root-heading": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-tracking": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-unread-unmuted-modeline": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-username": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-user-online-status": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-user-non-online-status": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-secret-title": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-contact-birthdays-today": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-muted-count": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-unmuted-count": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-mention-count": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-has-chatbuf-brackets": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-delim-face": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-shadow": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-link": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-blue": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-red": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-heading": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-user-title": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-self-title": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-deleted": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-sponsored": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-inline-reply": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-inline-forward": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-msg-inline-other": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-bold": { + "fg": null, + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-italic": { + "fg": null, + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-underline": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-strikethrough": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-code": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-pre": { + "fg": "#de4949", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-blockquote": { + "fg": "#a9b2bb", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-mention": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-hashtag": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-cashtag": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-botcommand": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-texturl": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-entity-type-spoiler": { + "fg": "#2f343a", + "bg": "#2f343a", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-reaction": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-reaction-chosen": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-reaction-paid": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-reaction-paid-chosen": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-highlight-text-face": { + "fg": "#000000", + "bg": "#e8bd30", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-button-highlight": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-chat-prompt": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-chat-prompt-aux": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-chat-input-attachment": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-topic-button": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-filter-active": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-filter-button-active": { + "fg": "#000000", + "bg": "#e8bd30", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-filter-button-inactive": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-checklist-stats-done": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-checklist-stats-todo": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-active": { + "fg": "#000000", + "bg": "#7a9abe", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-default-active": { + "fg": "#000000", + "bg": "#a9b2bb", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-default-passive": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-primary-active": { + "fg": "#000000", + "bg": "#7a9abe", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-primary-passive": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-success-active": { + "fg": "#000000", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-success-passive": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-danger-active": { + "fg": "#000000", + "bg": "#de4949", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-danger-passive": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-ui-active": { + "fg": "#000000", + "bg": "#e8bd30", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button-ui-passive": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button2-active": { + "fg": "#000000", + "bg": "#7a9abe", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button2-passive": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-box-button2-white-foreground": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-describe-item-title": { + "fg": "#838d97", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-describe-section-title": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-describe-subsection-title": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-enckey-00": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-enckey-01": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-enckey-10": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-enckey-11": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-blue": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-green": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-orange": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-purple": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-title": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-subtitle": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-header": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-subheader": { + "fg": "#e8bd30", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-outline": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-fixed": { + "fg": "#de4949", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-preformatted": { + "fg": "#de4949", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-marked": { + "fg": "#000000", + "bg": "#e8bd30", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-strike-through": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-webpage-chat-link": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-link-preview-sitename": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "telega-link-preview-title": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "shr": { + "shr-h1": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default", + "height": 1.4 + }, + "shr-h2": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default", + "height": 1.2 + }, + "shr-h3": { + "fg": "#7a9abe", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-h4": { + "fg": "#a9b2bb", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-h5": { + "fg": "#838d97", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-h6": { + "fg": "#5e6770", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-text": { + "fg": "#cdced1", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-link": { + "fg": "#7a9abe", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-selected-link": { + "fg": "#e8bd30", + "bg": null, + "bold": true, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-code": { + "fg": "#de4949", + "bg": "#1a1714", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-mark": { + "fg": "#000000", + "bg": "#e8bd30", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-strike-through": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-sup": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-abbreviation": { + "fg": "#838d97", + "bg": null, + "bold": false, + "italic": true, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "shr-sliced-image": { + "fg": "#5e6770", + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "2048-game": { + "twentyfortyeight-face-1024": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-128": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-16": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-2": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-2048": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-256": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-32": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-4": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-512": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-64": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-8": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "alert": { + "alert-high-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "alert-low-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "alert-moderate-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "alert-normal-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "alert-trivial-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "alert-urgent-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "all-the-icons": { + "all-the-icons-blue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-blue-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-cyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-cyan-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dblue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dcyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dgreen": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dmaroon": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dorange": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dpink": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dpurple": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dred": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dsilver": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-dyellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-green": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lblue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lcyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lgreen": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lmaroon": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lorange": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lpink": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lpurple": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lred": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lsilver": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-lyellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-maroon": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-orange": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-pink": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-purple": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-purple-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-red": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-red-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-silver": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "all-the-icons-yellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "company": { + "company-echo": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-echo-common": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-preview": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-preview-common": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-preview-search": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-annotation": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-annotation-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-common": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-common-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-deprecated": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-mouse": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-quick-access": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-quick-access-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-scrollbar-thumb": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-scrollbar-track": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-search": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-search-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-tooltip-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "company-box": { + "company-box-annotation": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-box-background": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-box-candidate": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-box-numbers": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-box-scrollbar": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "company-box-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "consult": { + "consult-async-failed": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-async-finished": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-async-running": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-async-split": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-bookmark": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-buffer": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-file": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-grep-context": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-help": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-highlight-mark": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-highlight-match": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-line-number": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-line-number-prefix": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-line-number-wrapped": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-narrow-indicator": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-preview-insertion": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-preview-line": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-preview-match": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "consult-separator": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "embark": { + "embark-collect-annotation": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-collect-candidate": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-collect-group-separator": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-collect-group-title": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-keybinding": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-keybinding-repeat": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-keymap": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-selected": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-target": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-verbose-indicator-documentation": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-verbose-indicator-shadowed": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "embark-verbose-indicator-title": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "emms": { + "emms-browser-album-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-browser-albumartist-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-browser-artist-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-browser-composer-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-browser-performer-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-browser-track-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-browser-year/genre-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-metaplaylist-mode-current-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-metaplaylist-mode-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-playlist-selected-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "emms-playlist-track-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "flyspell-correct": { + "flyspell-correct-highlight-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "highlight-indent-guides": { + "highlight-indent-guides-character-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-even-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-odd-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-stack-character-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-stack-even-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-stack-odd-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-top-character-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-top-even-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-top-odd-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "hl-todo": { + "hl-todo": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "hl-todo-flymake-type": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "json-mode": { + "json-mode-object-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "llama": { + "llama-##-macro": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "llama-deleted-argument": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "llama-llama-macro": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "llama-mandatory-argument": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "llama-optional-argument": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "lv": { + "lv-separator": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "magit-section": { + "magit-left-margin": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-child-count": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-heading-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "magit-section-secondary-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "malyon": { + "malyon-face-bold": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "malyon-face-error": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "malyon-face-italic": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "malyon-face-plain": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "malyon-face-reverse": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "marginalia": { + "marginalia-archive": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-char": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-date": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-documentation": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-name": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-owner": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-dir": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-exec": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-link": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-no": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-other": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-rare": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-read": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-file-priv-write": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-function": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-installed": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-lighter": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-list": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-mode": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-modified": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-null": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-number": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-off": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-on": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-size": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-string": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-symbol": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-true": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-type": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-value": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "marginalia-version": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "markdown-mode": { + "markdown-blockquote-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-bold-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-code-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-comment-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-footnote-marker-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-footnote-text-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-gfm-checkbox-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-delimiter-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-face-1": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-face-2": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-face-3": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-face-4": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-face-5": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-face-6": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-header-rule-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-highlight-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-highlighting-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-hr-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-html-attr-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-html-attr-value-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-html-entity-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-html-tag-delimiter-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-html-tag-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-inline-code-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-italic-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-language-info-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-language-keyword-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-line-break-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-link-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-link-title-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-list-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-markup-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-math-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-metadata-key-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-metadata-value-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-missing-link-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-plain-url-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-pre-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-reference-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-strike-through-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-table-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "markdown-url-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "nerd-icons": { + "nerd-icons-blue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-blue-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-cyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-cyan-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dblue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dcyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dgreen": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dmaroon": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dorange": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dpink": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dpurple": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dred": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dsilver": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-dyellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-green": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lblue": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lcyan": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lgreen": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lmaroon": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lorange": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lpink": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lpurple": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lred": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lsilver": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-lyellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-maroon": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-orange": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-pink": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-purple": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-purple-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-red": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-red-alt": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-silver": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "nerd-icons-yellow": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "nerd-icons-completion": { + "nerd-icons-completion-dir-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "orderless": { + "orderless-match-face-0": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "orderless-match-face-1": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "orderless-match-face-2": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "orderless-match-face-3": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "org-roam": { + "org-roam-dailies-calendar-note": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-dim": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-header-line": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-olp": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-preview-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-preview-heading-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-preview-heading-selection": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-preview-region": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-roam-title": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "org-superstar": { + "org-superstar-first": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-superstar-header-bullet": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-superstar-item": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "org-superstar-leading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "prescient": { + "prescient-primary-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "prescient-secondary-highlight": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "rainbow-delimiters": { + "rainbow-delimiters-base-error-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-base-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-1-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-2-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-3-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-4-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-5-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-6-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-7-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-8-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-depth-9-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-mismatched-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "rainbow-delimiters-unmatched-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "symbol-overlay": { + "symbol-overlay-default-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-1": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-2": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-3": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-4": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-5": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-6": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-7": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-8": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "tmr": { + "tmr-description": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-duration": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-end-time": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-finished": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-is-acknowledged": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-must-be-acknowledged": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-start-time": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-tabulated-acknowledgement": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-tabulated-description": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-tabulated-end-time": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-tabulated-remaining-time": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "tmr-tabulated-start-time": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "transient": { + "transient-active-infix": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-argument": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-delimiter": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-disabled-suffix": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-enabled-suffix": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-heading": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-higher-level": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-inactive-argument": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-inactive-value": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-inapt-argument": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-inapt-suffix": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-key-exit": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-key-noop": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-key-recurse": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-key-return": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-key-stack": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-key-stay": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-mismatched-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-nonstandard-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-unreachable": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-unreachable-key": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "transient-value": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "vertico": { + "vertico-current": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "vertico-group-separator": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "vertico-group-title": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "vertico-multiline": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "web-mode": { + "web-mode-annotation-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-annotation-html-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-annotation-tag-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-annotation-type-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-annotation-value-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-block-attr-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-block-attr-value-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-block-comment-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-block-control-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-block-delimiter-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-block-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-block-string-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-bold-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-builtin-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-comment-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-comment-keyword-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-constant-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-at-rule-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-color-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-comment-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-function-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-priority-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-property-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-pseudo-class-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-selector-class-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-selector-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-selector-tag-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-string-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-css-variable-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-current-column-highlight-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-current-element-highlight-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-doctype-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-error-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-filter-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-folded-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-function-call-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-function-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-attr-custom-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-attr-engine-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-attr-equal-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-attr-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-attr-value-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-entity-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-bracket-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-custom-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-namespaced-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-unclosed-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-inlay-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-interpolate-color1-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-interpolate-color2-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-interpolate-color3-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-interpolate-color4-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-italic-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-javascript-comment-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-javascript-string-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-json-comment-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-json-context-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-json-key-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-json-string-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-1-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-2-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-3-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-4-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-5-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-keyword-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-param-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-part-comment-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-part-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-part-string-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-preprocessor-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-script-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-sql-keyword-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-string-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-style-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-symbol-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-type-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-underline-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-variable-name-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-warning-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "web-mode-whitespace-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + }, + "yasnippet": { + "yas--field-debug-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + }, + "yas-field-highlight-face": { + "fg": null, + "bg": null, + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "inherit": null, + "source": "default" + } + } + } +}
\ No newline at end of file diff --git a/scripts/theme-studio/dupre.json b/scripts/theme-studio/dupre.json new file mode 100644 index 00000000..f3a46990 --- /dev/null +++ b/scripts/theme-studio/dupre.json @@ -0,0 +1,175 @@ +{ + "name": "dupre", + "palette": [ + [ + "#67809c", + "blue" + ], + [ + "#e8bd30", + "gold" + ], + [ + "#9b5fd0", + "regal" + ], + [ + "#2ba178", + "emerald" + ], + [ + "#5d9b86", + "sage" + ], + [ + "#cb6b4d", + "terracotta" + ], + [ + "#be9e74", + "tan" + ], + [ + "#cdced1", + "white" + ], + [ + "#a9b2bb", + "silver" + ], + [ + "#838d97", + "steel" + ], + [ + "#5e6770", + "pewter" + ], + [ + "#2f343a", + "gunmetal" + ], + [ + "#264364", + "navy" + ], + [ + "#0d0b0a", + "ground" + ], + [ + "#1a1714", + "bg-dim" + ] + ], + "assignments": { + "bg": "#0d0b0a", + "p": "#cdced1", + "kw": "#67809c", + "bi": "#67809c", + "pp": "#67809c", + "fnd": "#a9b2bb", + "fnc": "#a9b2bb", + "dec": "#e8bd30", + "ty": "#9b5fd0", + "prop": "#838d97", + "con": "#cb6b4d", + "num": "#cb6b4d", + "str": "#5d9b86", + "esc": "#cb6b4d", + "re": "#5d9b86", + "doc": "#5d9b86", + "cm": "#be9e74", + "cmd": "#a9b2bb", + "var": "#e8bd30", + "op": "#a9b2bb", + "punc": "#a9b2bb" + }, + "bold": [ + "kw", + "fnd" + ], + "italic": [], + "ui": { + "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 + }, + "error": { + "fg": "#cb6b4d", + "bg": null + }, + "warning": { + "fg": "#e8bd30", + "bg": null + }, + "success": { + "fg": "#5d9b86", + "bg": null + }, + "vertical-border": { + "fg": "#2f343a", + "bg": null + } + } +}
\ No newline at end of file diff --git a/scripts/theme-studio/generate.py b/scripts/theme-studio/generate.py index c34b34b6..e6926e04 100644 --- a/scripts/theme-studio/generate.py +++ b/scripts/theme-studio/generate.py @@ -1,5 +1,20 @@ import json, os HERE=os.path.dirname(os.path.abspath(__file__)) + +def strip_exports(src): + """Drop ES-module `export` lines so the body loads as a classic <script>. + + A top-level `export` is a syntax error outside a module, so it must go before + the body is spliced into the page. test-colormath.mjs applies the identical + strip and asserts the page carries the result verbatim (inline-integrity), so + the two copies cannot drift. NOTE: this is line-based — the export statement in + colormath.js must stay on a single line or the continuation lines survive. + """ + return '\n'.join(l for l in src.splitlines() if not l.startswith('export')).rstrip() + +# Pure color-math core, inlined verbatim into the page so the browser runs the +# same code the Node tests import (one source of truth). +COLORMATH_BODY=strip_exports(open(os.path.join(HERE,'colormath.js')).read()) ns={} src=open(os.path.join(HERE,'samples.py')).read() exec(src[:src.index('cols=')], ns) @@ -385,6 +400,9 @@ HTML = """<!doctype html><meta charset=utf-8><title>theme-studio</title> .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} + .palwarn{display:none;margin-top:8px;font:10pt monospace;color:#cb6b4d} + .palwarn .pwh{font-weight:bold;margin-bottom:2px} + .palwarn .pwl{opacity:.92} .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} @@ -402,10 +420,23 @@ HTML = """<!doctype html><meta charset=utf-8><title>theme-studio</title> .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} + .pmodel{margin:8px 2px 4px;font:10pt monospace;color:#b4b1a2;display:flex;gap:6px;align-items:center} + .pmodel button{background:#252321;color:#cdced1;border:1px solid #3a3a3a;border-radius:4px;padding:2px 9px;font:10pt monospace;cursor:pointer} + .pmodel button.on{background:#67809c;color:#000;border-color:#67809c} + .oklchctl{display:none;margin:0 2px 6px;font:10pt monospace;color:#9aa3ad} + .oklchctl.show{display:block} + .oklchctl .ocrow{display:flex;align-items:center;gap:6px;margin:3px 0} + .oklchctl .ocrow label{width:12px;color:#cdced1} + .oklchctl .ocrow input[type=range]{flex:1} + .oklchctl .ocrow input[type=number]{width:62px;background:#252321;color:#cdced1;border:1px solid #3a3a3a;border-radius:3px;font:10pt monospace;padding:1px 3px} + .oklchctl .pclamp{display:none;color:#cb6b4d;margin-top:3px} + .oklchctl .pclamp.show{display:block} .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} + .pinfo{display:flex;justify-content:space-between;margin:10px 2px 4px;font:12pt monospace;color:#cdced1} + .pinfo2{display:flex;justify-content:space-between;margin:0 2px 9px;font:10pt monospace;color:#9aa3ad} + .pinfo2 span{cursor:default} .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} @@ -436,6 +467,7 @@ HTML = """<!doctype html><meta charset=utf-8><title>theme-studio</title> <section class="pane grow"> <h1>palette</h1> <div class="pals" id="pals"></div> + <div class="palwarn" id="palwarn"></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"> @@ -448,7 +480,15 @@ HTML = """<!doctype html><meta charset=utf-8><title>theme-studio</title> <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="pmodel">edit <button data-pm="hsv" class="on">HSV</button><button data-pm="oklch">OKLCH</button></div> + <div class="oklchctl" id="oklchctl"> + <div class="ocrow"><label title="perceptual lightness">L</label><input type="range" id="okL" min="0" max="1" step="0.001"><input type="number" id="okLn" min="0" max="1" step="0.001"></div> + <div class="ocrow"><label title="chroma (colorfulness)">C</label><input type="range" id="okC" min="0" max="0.4" step="0.001"><input type="number" id="okCn" min="0" max="0.4" step="0.001"></div> + <div class="ocrow"><label title="hue angle, degrees">H</label><input type="range" id="okH" min="0" max="360" step="1"><input type="number" id="okHn" min="0" max="360" step="1"></div> + <div class="pclamp" id="pkclamp"></div> + </div> <div class="pinfo"><span id="pkhex">#888888</span><span id="pkcon"></span></div> + <div class="pinfo2"><span id="pkoklch" title="OKLCH perceptual coordinates: lightness L (0..1), chroma C, hue H in degrees"></span><span id="pkapca"></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> @@ -506,6 +546,7 @@ HTML = """<!doctype html><meta charset=utf-8><title>theme-studio</title> <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; +const DELTAE_MIN=0.02; // OKLab ΔE below this = colors too close to tell apart (perceptual-metrics spec) // --- 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;} @@ -513,11 +554,11 @@ function packagesForExport(map){const out={};for(const app in map){const faces={ 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,'&').replace(/</g,'<').replace(/>/g,'>');} -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));} +// Pure color-math core (lin/rl/contrast/rating/hsv2rgb/rgb2hsv/hex2rgb/rgb2hex, +// plus OKLab/OKLCH/APCA/deltaE), inlined verbatim from colormath.js. normHex, +// textOn, and ratingColor stay below as UI-boundary helpers. +COLORMATH_J 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);}} @@ -563,11 +604,25 @@ function buildTable(){ tb.appendChild(tr);} } let dragFrom=null,selectedIdx=null; +// Pairwise OKLab ΔE over the palette. Returns the sub-threshold pairs (sorted +// closest-first) and each color's nearest-neighbor distance for its chip title. +// Pure pairwise ΔE analysis lives in colormath.js (paletteWarnings); this renders it. +function renderPaletteWarnings(warnings,overflow){ + const w=document.getElementById('palwarn');if(!w)return; + if(!warnings.length){w.style.display='none';w.innerHTML='';return;} + let html='<div class="pwh">too-similar colors</div>'; + html+=warnings.map(p=>`<div class="pwl">${esc(p.aName+' / '+p.bName)} — \\u0394E ${p.dE.toFixed(3)}, hard to distinguish</div>`).join(''); + if(overflow>0)html+=`<div class="pwl">and ${overflow} more</div>`; + w.innerHTML=html;w.style.display='block'; +} function renderPalette(){ const p=document.getElementById('pals');p.innerHTML=''; + const {warnings,overflow,nearest}=paletteWarnings(PALETTE,DELTAE_MIN,5); PALETTE.forEach((pc,i)=>{const [hex,name]=pc;const tc=textOn(hex); + const nde=nearest[i]; 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; + d.title=name+' '+hex+(nde===Infinity?'':' — nearest \\u0394E '+nde.toFixed(3)); const lft=i>0?`<button class="mv l" title="move left" style="color:${tc}">‹</button>`:''; const rgt=i<PALETTE.length-1?`<button class="mv r" title="move right" style="color:${tc}">›</button>`:''; const rm=locked?`<span class="lock" title="${hex===MAP['bg']?'background':'foreground'} — can't remove" style="color:${tc}">🔒</span>`:`<button class="rm" title="remove" style="color:${tc}">×</button>`; @@ -583,6 +638,7 @@ function renderPalette(){ 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);}); + renderPaletteWarnings(warnings,overflow); 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);} @@ -603,28 +659,76 @@ function updateColor(){ } 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'; +let pkMode='any'; // contrast mask: any / aa / aaa (what constraint to mask) +let pkModel='hsv'; // color model for editing: hsv / oklch (orthogonal to pkMode) +const OKLCH_CMAX=0.4; // chroma axis range for the C×L plane (and the C dial); past sRGB at most hues, so the gamut grey shows the reachable region 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);}} +// Phase 4b: the SV box becomes a Chroma×Lightness plane in OKLCH mode. Per cell +// the in-gamut test is forward-only (oklch→oklab→linear-rgb + range check), never +// the binary search — that is reserved for committing a color. The rendered +// bitmap is cached on (hue, dims, mask, bg) so dragging C/L (fixed hue) reuses it. +let _planeCache={key:null,data:null}; +function paintOklchPlane(H){ + 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'); + const T=pkThresh(),key=Math.round(H)+'|'+w+'|'+h+'|'+pkMode+'|'+MAP['bg']; + if(_planeCache.key===key&&_planeCache.data){ctx.putImageData(_planeCache.data,0,0);return;} + const step=4; + for(let x=0;x<w;x+=step){const C=(x/w)*OKLCH_CMAX; + for(let y=0;y<h;y+=step){const L=1-y/h,cell=planeCell(L,C,H); + if(!cell.inGamut){ctx.fillStyle='#15120f';ctx.fillRect(x,y,step,step);continue;} + ctx.fillStyle=cell.hex;ctx.fillRect(x,y,step,step); + if(T&&contrast(cell.hex,MAP['bg'])<T){ctx.fillStyle='rgba(8,7,6,0.66)';ctx.fillRect(x,y,step,step);}}} + _planeCache={key,data:ctx.getImageData(0,0,w,h)}; +} +function paintPicker(){const sv=document.getElementById('sv');if(!sv)return; + const w=sv.clientWidth,h=sv.clientHeight,hh=document.getElementById('hue').clientHeight; + if(pkModel==='oklch'){const [L,C,H]=readOklch();sv.style.background='#15120f';paintOklchPlane(H); + document.getElementById('svcur').style.left=(Math.min(1,C/OKLCH_CMAX)*w)+'px'; + document.getElementById('svcur').style.top=((1-L)*h)+'px'; + document.getElementById('huecur').style.top=((H/360)*hh)+'px';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%)`; + 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);} + const o=document.getElementById('pkoklch');if(o){const lch=oklab2oklch(srgb2oklab(h));o.textContent='OKLCH '+lch.L.toFixed(3)+' '+lch.C.toFixed(3)+' '+Math.round(lch.H)+'\\u00b0';} + const a=document.getElementById('pkapca');if(a){const lc=apca(h,MAP['bg']);a.textContent='APCA Lc '+lc.toFixed(0);a.title='APCA Lc '+lc.toFixed(1)+' (APCA-W3 0.1.9), text on the ground color. Positive = dark text on a light background, negative = light text on a dark background.';}} 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 pkSet(){const hex=rgb2hex(...hsv2rgb(pkH,pkS,pkV));document.getElementById('newhexstr').value=hex;document.getElementById('swatch').style.background=hex;paintPicker();pkReadout(hex);if(pkModel==='oklch')oklchInputsFromHex(hex);} +// --- OKLCH editing model (Phase 4a): L/C/H dials orthogonal to the HSV square --- +function setOklchInputs(L,C,H){ + const put=(id,v)=>{const e=document.getElementById(id);if(e)e.value=v;}; + put('okL',L.toFixed(3));put('okLn',L.toFixed(3));put('okC',C.toFixed(3));put('okCn',C.toFixed(3)); + const h=String(Math.round(H));put('okH',h);put('okHn',h);} +function oklchInputsFromHex(hex){const lch=oklab2oklch(srgb2oklab(normHex(hex)||'#888888'));setOklchInputs(lch.L,lch.C,lch.H);} +function readOklch(){return [parseFloat(document.getElementById('okL').value)||0,parseFloat(document.getElementById('okC').value)||0,parseFloat(document.getElementById('okH').value)||0];} +function pkClampStatus(on){const s=document.getElementById('pkclamp');if(!s)return;s.classList.toggle('show',on);s.textContent=on?'chroma clamped to sRGB':'';} +function pkOklchSet(){const [L,C,H]=readOklch();const {hex,clamped}=oklch2hex(L,C,H); + document.getElementById('newhexstr').value=hex;document.getElementById('swatch').style.background=hex; + [pkH,pkS,pkV]=rgb2hsv(...hex2rgb(hex));paintPicker();pkReadout(hex); + if(clamped)oklchInputsFromHex(hex); // snap the dials to the reachable color + pkClampStatus(clamped);} +function setPkModel(m){pkModel=m;document.querySelectorAll('.pmodel button').forEach(x=>x.classList.toggle('on',x.dataset.pm===m)); + const oc=document.getElementById('oklchctl');if(oc)oc.classList.toggle('show',m==='oklch'); + if(m==='oklch')oklchInputsFromHex(curHex());else pkClampStatus(false);} 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 openPicker(){pickerOn=true;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(curHex()));buildPkChips();document.getElementById('picker').style.display='block';setPkModel(pkModel);paintPicker();pkReadout(curHex());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();});} + pkDrag(document.getElementById('sv'),e=>{const r=document.getElementById('sv').getBoundingClientRect();const fx=Math.max(0,Math.min(1,(e.clientX-r.left)/r.width)),fy=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height)); + if(pkModel==='oklch'){setOklchInputs(1-fy,fx*OKLCH_CMAX,readOklch()[2]);pkOklchSet();}else{pkS=fx;pkV=1-fy;pkSet();}}); + pkDrag(document.getElementById('hue'),e=>{const r=document.getElementById('hue').getBoundingClientRect();const fy=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height)); + if(pkModel==='oklch'){const [L,C]=readOklch();setOklchInputs(L,C,fy*360);pkOklchSet();}else{pkH=fy*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));paintPicker();buildPkChips();}); + document.querySelectorAll('.pmodel button').forEach(b=>b.onclick=()=>setPkModel(b.dataset.pm)); + [['okL','okLn',3],['okC','okCn',3],['okH','okHn',0]].forEach(([r,n,dp])=>{ + const re=document.getElementById(r),ne=document.getElementById(n); + if(re)re.addEventListener('input',()=>{if(ne)ne.value=(+re.value).toFixed(dp);pkOklchSet();}); + if(ne)ne.addEventListener('input',()=>{if(re)re.value=ne.value;pkOklchSet();});});} 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;} @@ -1108,12 +1212,71 @@ function pkgSelftest(){ } 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==='#cursortest'){document.getElementById('newhexstr').value='#67809c';openPicker();const sc=document.getElementById('svcur'),hc=document.getElementById('huecur');const L=parseFloat(sc.style.left||'0'),T=parseFloat(sc.style.top||'0'),H=parseFloat(hc.style.top||'0');const ok=L>1&&T>1&&H>1;document.title='CURSORTEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='cursortest';d.textContent='CURSORTEST '+(ok?'PASS':'FAIL')+' left='+sc.style.left+' top='+sc.style.top+' hue='+hc.style.top;document.body.appendChild(d);} if(location.hash.startsWith('#app')){const ap=location.hash.slice(4),s=document.getElementById('appsel');if(s&&ap){s.value=ap;pkgChanged();}} +if(location.hash==='#planetest'){let ok=true;const notes=[]; + document.getElementById('newhexstr').value='#67809c';openPicker();setPkModel('oklch');paintPicker(); + const sv=document.getElementById('sv'),cv=document.getElementById('svmask'),ctx=cv.getContext('2d'); + const [L,C,H]=readOklch(); + const expLeft=Math.min(1,C/OKLCH_CMAX)*sv.clientWidth,expTop=(1-L)*sv.clientHeight; + const gotLeft=parseFloat(document.getElementById('svcur').style.left),gotTop=parseFloat(document.getElementById('svcur').style.top); + if(Math.abs(gotLeft-expLeft)>2||Math.abs(gotTop-expTop)>2){ok=false;notes.push('crosshair off got '+gotLeft.toFixed(1)+','+gotTop.toFixed(1)+' exp '+expLeft.toFixed(1)+','+expTop.toFixed(1));} + const Coog=0.38,Loog=0.5,labO=oklch2oklab(Loog,Coog,H),oog=!inGamut(oklab2lrgb(labO.L,labO.a,labO.b)); + const oogX=Math.min(cv.width-2,Math.round((Coog/OKLCH_CMAX)*cv.width)),oogY=Math.round((1-Loog)*cv.height); + const dO=ctx.getImageData(oogX,oogY,1,1).data,greyO=Math.abs(dO[0]-0x15)<10&&Math.abs(dO[1]-0x12)<10&&Math.abs(dO[2]-0x0f)<10; + if(oog&&!greyO){ok=false;notes.push('OOG cell not masked rgb '+dO[0]+','+dO[1]+','+dO[2]);} + const inX=Math.round((0.03/OKLCH_CMAX)*cv.width),inY=Math.round(0.5*cv.height); + const dI=ctx.getImageData(inX,inY,1,1).data,greyI=Math.abs(dI[0]-0x15)<10&&Math.abs(dI[1]-0x12)<10&&Math.abs(dI[2]-0x0f)<10; + if(greyI){ok=false;notes.push('in-gamut cell rendered as OOG grey rgb '+dI[0]+','+dI[1]+','+dI[2]);} + document.title='PLANETEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='planetest';d.textContent='PLANETEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} +if(location.hash==='#oklchtest'){let ok=true;const notes=[]; + document.getElementById('newhexstr').value='#67809c';openPicker(); + const before=document.getElementById('newhexstr').value; + setPkModel('oklch'); + if(pkModel!=='oklch'){ok=false;notes.push('model not oklch');} + if(!document.getElementById('oklchctl').classList.contains('show')){ok=false;notes.push('oklch dials hidden');} + if(document.getElementById('newhexstr').value!==before){ok=false;notes.push('color changed on model switch: '+document.getElementById('newhexstr').value);} + pkMode='any';document.querySelector('.pmode button[data-m="aa"]').click(); + if(pkModel!=='oklch'){ok=false;notes.push('mask toggle reset model');} + if(pkMode!=='aa'){ok=false;notes.push('mask did not set aa');} + setPkModel('hsv'); + if(pkMode!=='aa'){ok=false;notes.push('model switch reset mask to '+pkMode);} + if(pkModel!=='hsv'){ok=false;notes.push('model not hsv after switch');} + setPkModel('oklch');setOklchInputs(0.591,0.052,251.6);pkOklchSet(); + const driven=document.getElementById('newhexstr').value,dl=oklab2oklch(srgb2oklab(driven)); + if(!(Math.abs(dl.L-0.591)<0.02&&Math.abs(dl.C-0.052)<0.02)){ok=false;notes.push('dials did not drive color: '+driven);} + const {clamped}=oklch2hex(0.7,0.4,140);setOklchInputs(0.7,0.4,140);pkOklchSet(); + if(!(clamped&&document.getElementById('pkclamp').classList.contains('show'))){ok=false;notes.push('clamp status missing for out-of-gamut C');} + document.title='OKLCHTEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='oklchtest';d.textContent='OKLCHTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} +if(location.hash==='#deltatest'){const save=PALETTE.slice();let ok=true;const notes=[];const W=()=>document.getElementById('palwarn'); + PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue'],['#69829e','blue2']];renderPalette(); + const t1=W().textContent;if(!(W().style.display!=='none'&&/blue \\/ blue2/.test(t1)&&/ΔE/.test(t1))){ok=false;notes.push('near-pair did not fire: '+t1);} + PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue'],['#e8bd30','gold'],['#cb6b4d','terra']];renderPalette(); + if(W().style.display!=='none'){ok=false;notes.push('spread palette warned: '+W().textContent);} + PALETTE=[['#0d0b0a','ground'],['#cdced1','fg']];for(let k=0;k<7;k++){const v=(0x67+k).toString(16).padStart(2,'0');PALETTE.push(['#'+v+'809c','c'+k]);}renderPalette(); + const tc=W().textContent;const nums=[...tc.matchAll(/ΔE (\\d+\\.\\d+)/g)].map(m=>parseFloat(m[1])); + if(!/and \\d+ more/.test(tc)){ok=false;notes.push('no cap suffix: '+tc);} + if(!(nums.length===5&&nums.every((n,k)=>k===0||n>=nums[k-1]))){ok=false;notes.push('not 5-capped ascending: '+nums.join(','));} + PALETTE=save;renderPalette(); + document.title='DELTATEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='deltatest';d.textContent='DELTATEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} +if(location.hash==='#readouttest'){const hex='#67809c';document.getElementById('newhexstr').value=hex;openPicker();pkReadout(hex); + const o=document.getElementById('pkoklch').textContent,a=document.getElementById('pkapca').textContent,w=document.getElementById('pkcon').textContent; + const lch=oklab2oklch(srgb2oklab(hex)); + const expO='OKLCH '+lch.L.toFixed(3)+' '+lch.C.toFixed(3)+' '+Math.round(lch.H)+'\\u00b0'; + const expA='APCA Lc '+apca(hex,MAP['bg']).toFixed(0); + const r=contrast(hex,MAP['bg']),expW=r.toFixed(1)+' '+rating(r); + const wired=o===expO&&a===expA&&w===expW; + const sane=Math.abs(lch.L-0.591)<0.01&&Math.abs(lch.C-0.052)<0.01&&Math.abs(lch.H-251.6)<2; + const ok=wired&&sane;document.title='READOUTTEST '+(ok?'PASS':'FAIL'); + const d=document.createElement('div');d.id='readouttest';d.textContent='READOUTTEST '+(ok?'PASS':'FAIL')+' oklch='+o+' | apca='+a+' | wcag='+w;document.body.appendChild(d);} </script>""" -HTML=(HTML.replace("SAMPLES_J",json.dumps(SAMPLES)) +HTML=(HTML.replace("COLORMATH_J",COLORMATH_BODY) + .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-studio.html') -open(OUT,"w").write(HTML) -print("wrote",OUT) + +if __name__=='__main__': + open(OUT,"w").write(HTML) + print("wrote",OUT) diff --git a/scripts/theme-studio/run-tests.sh b/scripts/theme-studio/run-tests.sh new file mode 100755 index 00000000..b1fe54fa --- /dev/null +++ b/scripts/theme-studio/run-tests.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# Test runner for the theme-studio tool. Drives the whole pyramid in one command: +# - regenerate theme-studio.html from generate.py +# - Python templating tests (export-strip + placeholder substitution) +# - Node unit tests for colormath.js (+ inline-integrity) +# - syntax-check the spliced page <script> +# - browser hash gates in headless Chrome (#selftest and the metric tests) +# +# Exit status is non-zero if any stage fails. Browser gates need a Chromium-family +# browser; when none is found they are reported as SKIPPED (not passed) so the +# gap is visible rather than silently green. +# +# Usage: scripts/theme-studio/run-tests.sh (or: make theme-studio-test) +set -uo pipefail + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$HERE" + +fail=0 +pass_msg() { printf ' PASS %s\n' "$1"; } +fail_msg() { printf ' FAIL %s\n' "$1"; fail=1; } +skip_msg() { printf ' SKIP %s\n' "$1"; } + +echo "theme-studio tests" + +# 1. Regenerate the page (the browser gates and inline-integrity read it). +if python3 generate.py >/dev/null; then pass_msg "generate.py wrote theme-studio.html" +else fail_msg "generate.py failed"; fi + +# 2. Python templating tests. +if python3 -m unittest test_generate >/tmp/ts-pytest.log 2>&1; then + pass_msg "Python templating tests ($(grep -oE 'Ran [0-9]+' /tmp/ts-pytest.log | awk '{print $2}') tests)" +else fail_msg "Python templating tests"; sed 's/^/ /' /tmp/ts-pytest.log; fi + +# 3. Node unit tests + inline-integrity. Node 26 broke `--test <dir>`; glob the files. +if node --test ./*.mjs >/tmp/ts-node.log 2>&1; then + pass_msg "Node unit tests ($(grep -E '^. tests' /tmp/ts-node.log | grep -oE '[0-9]+' | head -1) tests)" +else fail_msg "Node unit tests"; grep -E 'not ok|AssertionError|Error' /tmp/ts-node.log | sed 's/^/ /' | head -20; fi + +# 4. Syntax-check the inlined page script. +python3 - <<'PY' && node --check /tmp/ts-script.js >/dev/null 2>&1 && pass_msg "spliced page <script> parses" || fail_msg "spliced page <script> syntax" +import re +h = open('theme-studio.html').read() +open('/tmp/ts-script.js', 'w').write(re.search(r'<script>(.*)</script>', h, re.S).group(1)) +PY + +# 5. Browser hash gates. +CHROME="" +for c in google-chrome-stable google-chrome chromium chromium-browser; do + if command -v "$c" >/dev/null 2>&1; then CHROME="$c"; break; fi +done +HASHES="selftest cursortest readouttest deltatest oklchtest planetest" +if [ -z "$CHROME" ]; then + for t in $HASHES; do skip_msg "#$t (no Chromium-family browser found)"; done +else + PROF="$(mktemp -d)" + trap 'rm -rf "$PROF"' EXIT + for t in $HASHES; do + upper="$(echo "$t" | tr '[:lower:]' '[:upper:]')" + res="$("$CHROME" --headless --no-sandbox --disable-gpu --user-data-dir="$PROF" \ + --virtual-time-budget=8000 --dump-dom "file://$HERE/theme-studio.html#$t" 2>/dev/null \ + | grep -o "${upper}[^<]*" | head -1)" + case "$res" in + *PASS*) pass_msg "#$t" ;; + *FAIL*) fail_msg "#$t -> $res" ;; + *) fail_msg "#$t -> no verdict (browser did not run the test)" ;; + esac + done +fi + +echo +if [ "$fail" -eq 0 ]; then echo "all stages green"; else echo "FAILURES above"; fi +exit "$fail" diff --git a/scripts/theme-studio/test-colormath.mjs b/scripts/theme-studio/test-colormath.mjs new file mode 100644 index 00000000..58ce7829 --- /dev/null +++ b/scripts/theme-studio/test-colormath.mjs @@ -0,0 +1,240 @@ +// Unit tests for the pure color-math core (colormath.js). +// Run: node --test scripts/theme-studio/ +// Run with coverage: node --test --experimental-test-coverage scripts/theme-studio/ +// +// Fixtures are from the perceptual-color-metrics spec: OKLab via Ottosson's +// reference, APCA via APCA-W3 0.1.9, deltaE via OKLab Euclidean distance. + +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { + srgb2oklab, oklab2oklch, oklch2oklab, oklch2hex, apca, deltaE, + hex2rgb, rl, contrast, rating, hsv2rgb, rgb2hsv, rgb2hex, + oklab2lrgb, inGamut, lrgb2hex, planeCell, paletteWarnings, +} from './colormath.js'; + +const close = (a, b, eps = 0.005) => Math.abs(a - b) <= eps; +const here = fileURLToPath(new URL('.', import.meta.url)); +// Same export-strip generate.py applies before inlining (drop `export` lines, rstrip). +const stripExports = (s) => + s.split('\n').filter((l) => !l.startsWith('export')).join('\n').replace(/\s+$/, ''); + +test('srgb2oklab achromatic anchors', () => { + const w = srgb2oklab('#ffffff'); + assert.ok(close(w.L, 1.0), `white L ${w.L}`); + assert.ok(close(w.a, 0) && close(w.b, 0), `white a/b ${w.a},${w.b}`); + const k = srgb2oklab('#000000'); + assert.ok(close(k.L, 0), `black L ${k.L}`); +}); + +test('OKLCH chromatic fixtures (red, dupre-blue)', () => { + const red = oklab2oklch(srgb2oklab('#ff0000')); + assert.ok(close(red.L, 0.628) && close(red.C, 0.258) && close(red.H, 29.2, 1), + `red ${JSON.stringify(red)}`); + const blue = oklab2oklch(srgb2oklab('#67809c')); + assert.ok(close(blue.L, 0.591) && close(blue.C, 0.052) && close(blue.H, 251.6, 1), + `dupre-blue ${JSON.stringify(blue)}`); +}); + +test('round-trip srgb -> oklch -> hex preserves the color', () => { + for (const h of ['#67809c', '#e8bd30', '#9b5fd0', '#5d9b86', '#cb6b4d']) { + const lab = srgb2oklab(h); + const c = oklab2oklch(lab); + const back = srgb2oklab(oklch2hex(c.L, c.C, c.H).hex); + assert.ok(close(lab.L, back.L) && close(lab.a, back.a) && close(lab.b, back.b), + `roundtrip ${h}`); + } +}); + +test('APCA both polarities (pinned black/white fixtures)', () => { + assert.ok(close(apca('#000000', '#ffffff'), 106.0, 0.5), + `dark-on-light ${apca('#000000', '#ffffff')}`); + assert.ok(close(apca('#ffffff', '#000000'), -107.9, 0.5), + `light-on-dark ${apca('#ffffff', '#000000')}`); + // Chromatic fixture: catches rounded-coefficient drift that black/white can't. + // Sign is positive (dark-ish text on a light bg). + assert.ok(apca('#67809c', '#ffffff') > 0, 'chromatic apca sign'); +}); + +test('deltaE-OK identity and ordering against the 0.02 threshold', () => { + assert.equal(deltaE('#67809c', '#67809c'), 0); + assert.ok(deltaE('#000000', '#ffffff') > 0); + const near = deltaE('#67809c', '#69829e'); // barely-different blue + const far = deltaE('#67809c', '#e8bd30'); // blue vs gold + assert.ok(near < 0.02, `near ${near}`); + assert.ok(far > 0.1, `far ${far}`); +}); + +test('gamut clamp preserves L/H, reduces C, flags clamped', () => { + const oog = oklch2hex(0.6, 0.5, 30); // very high chroma -> out of sRGB + assert.equal(oog.clamped, true); + const got = oklab2oklch(srgb2oklab(oog.hex)); + assert.ok(close(got.L, 0.6, 0.02), `L preserved ${got.L}`); + assert.ok(close(got.H, 30, 2), `H preserved ${got.H}`); + assert.ok(got.C < 0.5, `C reduced ${got.C}`); + const ing = oklch2hex(0.591, 0.052, 251.6); // in gamut + assert.equal(ing.clamped, false); +}); + +test('hex2rgb parses channels', () => { + assert.deepEqual(hex2rgb('#000000'), [0, 0, 0]); + assert.deepEqual(hex2rgb('#ffffff'), [255, 255, 255]); + assert.deepEqual(hex2rgb('#67809c'), [0x67, 0x80, 0x9c]); +}); + +test('WCAG relative luminance anchors', () => { + assert.ok(close(rl('#ffffff'), 1.0, 1e-9), `white ${rl('#ffffff')}`); + assert.ok(close(rl('#000000'), 0.0, 1e-9), `black ${rl('#000000')}`); + assert.ok(rl('#ff0000') < rl('#00ff00'), 'green brighter than red'); // 0.2126 vs 0.7152 +}); + +test('WCAG contrast: symmetry, identity, and known extremes', () => { + assert.ok(close(contrast('#000000', '#ffffff'), 21, 1e-6), 'black/white = 21:1'); + assert.equal(contrast('#67809c', '#67809c'), 1); // identical colors + assert.ok(close(contrast('#0d0b0a', '#67809c'), contrast('#67809c', '#0d0b0a'), 1e-12), + 'order-independent'); + // dupre keyword-blue on ground, a real palette pair (sanity, not a hand-typed number). + assert.ok(contrast('#67809c', '#0d0b0a') > 4.5, 'dupre blue clears AA on ground'); +}); + +test('rating bands at the AA/AAA boundaries', () => { + assert.equal(rating(7.0), 'AAA'); + assert.equal(rating(6.99), 'AA'); + assert.equal(rating(4.5), 'AA'); + assert.equal(rating(4.49), 'FAIL'); + assert.equal(rating(0), 'FAIL'); +}); + +test('hsv2rgb primaries and achromatic edges', () => { + assert.deepEqual(hsv2rgb(0, 1, 1), [255, 0, 0]); + assert.deepEqual(hsv2rgb(120, 1, 1), [0, 255, 0]); + assert.deepEqual(hsv2rgb(240, 1, 1), [0, 0, 255]); + assert.deepEqual(hsv2rgb(0, 0, 1), [255, 255, 255]); // s=0 -> grey (white) + assert.deepEqual(hsv2rgb(0, 0, 0), [0, 0, 0]); // v=0 -> black + assert.deepEqual(hsv2rgb(360, 1, 1), [255, 0, 0]); // hue wraps +}); + +test('rgb2hsv inverts hsv2rgb (saturation/value), hue for chromatic inputs', () => { + assert.deepEqual(rgb2hsv(255, 0, 0), [0, 1, 1]); + assert.deepEqual(rgb2hsv(0, 0, 0), [0, 0, 0]); // black: h and s undefined -> 0 + const [h, s, v] = rgb2hsv(0, 255, 0); + assert.ok(close(h, 120, 1e-9) && s === 1 && v === 1, `green hsv ${h},${s},${v}`); +}); + +test('hsv <-> rgb round-trip property over random colors', () => { + let seed = 1234567; // deterministic LCG: no Math.random, repeatable failures + const rnd = () => (seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff; + for (let i = 0; i < 500; i++) { + const rgb = [Math.floor(rnd() * 256), Math.floor(rnd() * 256), Math.floor(rnd() * 256)]; + const [h, s, v] = rgb2hsv(...rgb); + assert.deepEqual(hsv2rgb(h, s, v), rgb, `round-trip ${rgb}`); + } +}); + +test('rgb2hex formats and clamps out-of-range channels', () => { + assert.equal(rgb2hex(0, 0, 0), '#000000'); + assert.equal(rgb2hex(255, 255, 255), '#ffffff'); + assert.equal(rgb2hex(0x67, 0x80, 0x9c), '#67809c'); + assert.equal(rgb2hex(-5, 300, 128), '#00ff80'); // clamps below 0 and above 255 +}); + +test('oklab2lrgb / lrgb2hex round-trip through known sRGB colors', () => { + for (const h of ['#000000', '#ffffff', '#67809c', '#e8bd30']) { + const lab = srgb2oklab(h); + assert.equal(lrgb2hex(oklab2lrgb(lab.L, lab.a, lab.b)), h, `round-trip ${h}`); + } +}); + +test('inGamut flags reachable vs unreachable OKLCH (forward-only gamut test)', () => { + // dupre-blue is a real sRGB color -> in gamut. + const ok = oklch2oklab(0.591, 0.052, 251.6); + assert.equal(inGamut(oklab2lrgb(ok.L, ok.a, ok.b)), true, 'reachable'); + // very high chroma at mid lightness -> outside sRGB. + const bad = oklch2oklab(0.7, 0.4, 140); + assert.equal(inGamut(oklab2lrgb(bad.L, bad.a, bad.b)), false, 'unreachable'); + // the in-gamut verdict must agree with oklch2hex's clamped flag (the plane and + // the commit path share one gamut boundary). + assert.equal(inGamut(oklab2lrgb(ok.L, ok.a, ok.b)), !oklch2hex(0.591, 0.052, 251.6).clamped); + assert.equal(inGamut(oklab2lrgb(bad.L, bad.a, bad.b)), !oklch2hex(0.7, 0.4, 140).clamped); +}); + +test('planeCell: reachable cell returns its exact hex, agrees with oklch2hex', () => { + // Normal: a low-chroma blue is reachable; the hex matches the commit path. + const cell = planeCell(0.591, 0.052, 251.6); + assert.equal(cell.inGamut, true); + assert.equal(cell.hex, oklch2hex(0.591, 0.052, 251.6).hex); +}); + +test('planeCell: C=0 is the achromatic grey for its lightness', () => { + // Boundary: zero chroma -> a neutral grey, always in gamut, hue irrelevant. + const a = planeCell(0.5, 0, 0), b = planeCell(0.5, 0, 251.6); + assert.equal(a.inGamut, true); + assert.equal(a.hex, b.hex, 'hue must not matter at C=0'); + assert.equal(a.hex[1], a.hex[3]); // r==g==b nibble: grey +}); + +test('planeCell: out-of-gamut chroma is flagged, no hex', () => { + // Error/boundary: chroma past sRGB at this L/H. + const cell = planeCell(0.7, 0.4, 140); + assert.equal(cell.inGamut, false); + assert.equal(cell.hex, null); + assert.equal(cell.inGamut, !oklch2hex(0.7, 0.4, 140).clamped); // shares the boundary +}); + +test('paletteWarnings: a near-identical pair warns, named, with its ΔE', () => { + const { warnings, overflow, nearest } = paletteWarnings( + [['#0d0b0a', 'ground'], ['#cdced1', 'fg'], ['#67809c', 'blue'], ['#69829e', 'blue2']]); + assert.equal(warnings.length, 1); + assert.equal(overflow, 0); + const w = warnings[0]; + assert.deepEqual([w.aName, w.bName], ['blue', 'blue2']); + assert.ok(w.dE > 0 && w.dE < 0.02, `dE ${w.dE}`); + assert.equal(nearest.length, 4); + assert.ok(nearest[2] < 0.02 && nearest[3] < 0.02, 'blue/blue2 are each other’s nearest'); +}); + +test('paletteWarnings: a well-spread palette warns about nothing', () => { + const { warnings, overflow } = paletteWarnings( + [['#0d0b0a', 'ground'], ['#cdced1', 'fg'], ['#67809c', 'blue'], ['#e8bd30', 'gold'], ['#cb6b4d', 'terra']]); + assert.equal(warnings.length, 0); + assert.equal(overflow, 0); +}); + +test('paletteWarnings: boundary cases — empty, single, identical', () => { + assert.deepEqual(paletteWarnings([]), { warnings: [], overflow: 0, nearest: [] }); + const one = paletteWarnings([['#67809c', 'blue']]); + assert.deepEqual(one.warnings, []); + assert.deepEqual(one.nearest, [Infinity]); // no neighbor + const dup = paletteWarnings([['#67809c', 'a'], ['#67809c', 'b']]); + assert.equal(dup.warnings.length, 1); + assert.equal(dup.warnings[0].dE, 0); // identical colors -> ΔE 0 +}); + +test('paletteWarnings: closest-first ordering and cap with overflow', () => { + // Seven near-identical colors -> C(7,2)=21 sub-threshold pairs. + const pal = [['#0d0b0a', 'ground'], ['#cdced1', 'fg']]; + for (let k = 0; k < 7; k++) pal.push(['#' + (0x67 + k).toString(16).padStart(2, '0') + '809c', 'c' + k]); + const { warnings, overflow } = paletteWarnings(pal, 0.02, 5); + assert.equal(warnings.length, 5, 'capped at 5'); + assert.equal(overflow, 16, '21 pairs - 5 shown'); + for (let i = 1; i < warnings.length; i++) + assert.ok(warnings[i].dE >= warnings[i - 1].dE, 'ascending by ΔE'); +}); + +test('paletteWarnings: threshold is inclusive-exclusive at the boundary', () => { + // A custom threshold lets a pair fall just inside or just outside. + const pal = [['#67809c', 'a'], ['#69829e', 'b']]; // dE ~0.0067 + assert.equal(paletteWarnings(pal, 0.0067).warnings.length, 0, 'd < threshold is strict'); + assert.equal(paletteWarnings(pal, 0.007).warnings.length, 1, 'just above the pair distance'); +}); + +// Guards the one-source-of-truth contract: the page must carry colormath.js's +// body (sans exports) verbatim, so the inlined copy and the tested module cannot +// drift. Requires `python3 generate.py` to have run first. +test('inline-integrity: theme-studio.html contains the colormath.js body verbatim', () => { + const body = stripExports(readFileSync(here + 'colormath.js', 'utf8')); + const html = readFileSync(here + 'theme-studio.html', 'utf8'); + assert.ok(html.includes(body), 'generated page is missing the colormath.js body verbatim'); +}); diff --git a/scripts/theme-studio/test_generate.py b/scripts/theme-studio/test_generate.py new file mode 100644 index 00000000..e76acdad --- /dev/null +++ b/scripts/theme-studio/test_generate.py @@ -0,0 +1,84 @@ +"""Tests for the theme-studio page generator (generate.py). + +The generator's risky logic is the export-strip and the placeholder substitution +that inline colormath.js and the sample/palette data into the page. A bug there +ships a broken theme-studio.html that the JS unit tests can't see. These tests +exercise the strip in isolation and assert the assembled page has every +placeholder filled and carries the colormath body verbatim. + +Run: python3 -m unittest test_generate (from scripts/theme-studio/) +""" +import os +import unittest + +import generate # importable without side effects: the file write is __main__-guarded + + +class StripExports(unittest.TestCase): + def test_removes_the_export_line_keeps_the_body(self): + src = "function f(){return 1;}\nexport { f };" + self.assertEqual(generate.strip_exports(src), "function f(){return 1;}") + + def test_preserves_multiline_body_and_rstrips_trailing_blanks(self): + src = "const a=1;\nconst b=2;\nexport { a, b };\n\n" + self.assertEqual(generate.strip_exports(src), "const a=1;\nconst b=2;") + + def test_no_export_line_returns_body_rstripped(self): + self.assertEqual(generate.strip_exports("let x=1;\n"), "let x=1;") + + def test_removes_every_export_line_not_just_the_last(self): + src = "export const a=1;\ncode();\nexport { a };" + self.assertEqual(generate.strip_exports(src), "code();") + + def test_matches_the_js_side_strip_so_integrity_holds(self): + # test-colormath.mjs strips with the same rule: drop lines starting with + # 'export', then trim trailing whitespace. Keep the two in lockstep. + src = "x();\nexport { x };\n" + js_equivalent = "\n".join( + l for l in src.split("\n") if not l.startswith("export") + ).rstrip() + self.assertEqual(generate.strip_exports(src), js_equivalent) + + +class ColormathInlining(unittest.TestCase): + def setUp(self): + self.cm_src = open(os.path.join(generate.HERE, "colormath.js")).read() + + def test_colormath_export_is_a_single_line(self): + # The strip is line-based, so a multi-line `export { ... }` would leave the + # continuation lines behind as a dangling block (a real bug this caught). + export_lines = [l for l in self.cm_src.splitlines() if l.startswith("export")] + self.assertEqual(len(export_lines), 1, "colormath.js must have one export line") + + def test_stripped_body_has_no_export_line_and_ends_cleanly(self): + # "export" can still appear inside a comment; what must be gone is any line + # that *starts* with export (and the dangling continuation lines a + # multi-line export would leave). + body = generate.strip_exports(self.cm_src) + for line in body.splitlines(): + self.assertFalse(line.startswith("export"), f"export line survived: {line!r}") + self.assertTrue(body.endswith("}"), "body should end at the last function") + + +class AssembledPage(unittest.TestCase): + PLACEHOLDERS = [ + "COLORMATH_J", "SAMPLES_J", "PALETTE_J", "CATS_J", + "UIFACES_J", "UIMAP_J", "APPS_J", "BOLD_J", "MAP_J", + ] + + def test_every_placeholder_is_substituted(self): + for token in self.PLACEHOLDERS: + self.assertNotIn(token, generate.HTML, f"{token} left unsubstituted") + + def test_page_carries_the_colormath_body_verbatim(self): + # Python-side inline-integrity: the same guarantee the JS test asserts, but + # checked at the point the page is built rather than after a round-trip. + self.assertIn(generate.COLORMATH_BODY, generate.HTML) + + def test_page_is_a_single_script_document(self): + self.assertEqual(generate.HTML.count("<script>"), 1) + self.assertEqual(generate.HTML.count("</script>"), 1) + + +if __name__ == "__main__": + unittest.main() diff --git a/scripts/theme-studio/theme-coloring-guide.org b/scripts/theme-studio/theme-coloring-guide.org new file mode 100644 index 00000000..170ad708 --- /dev/null +++ b/scripts/theme-studio/theme-coloring-guide.org @@ -0,0 +1,473 @@ +#+TITLE: Usual Color Theme Rules +#+AUTHOR: Craig Jennings +#+DATE: 2026-06-08 +#+STARTUP: showall + +* How to use this guide + +This guide has one idea under it: color by the role a thing plays for the +reader, spend attention deliberately, and draw everything from one disciplined +palette. Everything else is that idea applied. + +It runs general to specific: + +1. *Principles*: the seven laws that generate the rest. +2. *Roles and the seed table*: the reader-roles the principles color, and the + single table that says how each role is treated. This is the executable core. +3. *The tiers*: syntax, UI faces, and package faces are the same roles applied + to three sets of Emacs faces. Each tier's rules derive from the principles, + not apart from them. +4. *Cross-tier practice*: weight, contrast, accessibility, and the checks that + apply everywhere. + +If you only read one thing, read the principles and the seed table. The tiers +are worked examples. + +* Principles + +1. *Color by reader-role, not by source category.* A color means "these things + play the same role while reading." The parser's category is irrelevant; the + reader's intent is everything. The theme should make control flow, + definitions, literals, comments, and errors easy to scan without making every + token compete for attention. + +2. *One disciplined palette; relatedness lives inside a hue family.* Prefer six + to eight stable accents over one color per category, and reuse each for the + same role everywhere. Related roles share a hue and separate by lightness, + chroma, or weight rather than taking unrelated colors. The six to eight are + hue families, not swatches: each family carries one to three shades (a keyword + and its quieter builtin, a string and its muted docstring), so the palette + holds roughly fifteen to twenty swatches across few hues. The Shade budget + section counts them. + +3. *Spend salience deliberately.* Chroma, brightness, and bold all say "look + here"; muted and low-chroma say "supporting structure." Reserve the loudest + treatment for the few things that matter, and make the anchor (a definition, + the active element) louder than the echo (a use, the idle element). + +4. *Two channels: foreground is identity, background is state.* Foreground + carries what a thing is (its role). A background tint carries transient state: + selection, current line, search match, diff hunk. Do not recolor a + foreground to show state. Tint behind the text so the token keeps its + meaning while highlighted. A transient match chip may invert; persistent state + must only tint. + +5. *Tier the contrast, and judge it honestly.* Comfortable contrast for content, + low contrast for idle structure, high contrast for alerts. Avoid pure black or + white grounds. They cause halation (light text on a dark ground blooms at the + glyph edges and smears the letterforms, worst for astigmatic eyes) and general + eye strain. Low contrast does not mean low distinguishability. If contrast is + soft, keep enough lightness/chroma separation between roles. Pick and judge + colors in a perceptual space, OKLCH or CIELAB, not HSL. (OKLCH is the + cylindrical lightness/chroma/hue form of the OKLab perceptual color space, + [[https://bottosson.github.io/posts/oklab/][Ottosson 2020]]; CIELAB is the CIE 1976 Lab color space; HSL is + hue/saturation/lightness, whose "lightness" is not perceptual.) Judge on the + real display in the real room, because contrast and chroma are relative to the + ground and the ambient light. + +6. *Encode redundantly; never rely on color alone.* Anything that matters (errors, + diffs, matches, done-states) pairs its color with weight, underline, + or shape, so it survives color blindness and a poor display. Around 8% of men + have red-green color-vision deficiency; keep the palette distinguishable + without the color, and never let red-versus-green be the only signal. + +7. *Honor convention for the signal layer.* Red means error or deletion, green + means success or addition, amber means warning or modified, blue means + information or a link. Keep these consistent and, where you can, out of the + syntax accent pool, so a signal never reads as just another keyword. + +* Roles and the seed table + +The principles color a fixed set of reader-roles. Most are familiar from code, +but three of them (heading ramp, transient state, and signal) appear once you +look past syntax to UI and document faces. Every face in every tier classifies +into one of these roles; seeding a tier is classifying its faces and applying the +table. + +| Role | Palette family | Weight / shape | Channel | +|-----------------------------------------------------+-------------------------------------+-------------------+---------------------| +| Base / identity (default text, variables) | foreground | normal | fg | +| Structure (punctuation, operators, delimiters) | muted foreground | normal | fg | +| Control (keywords, preprocessor) | primary cool accent | bold, sparingly | fg | +| Builtins | control hue, lower chroma/lightness | normal | fg | +| Names: definitions | warm anchor accent | bold | fg | +| Names: uses / calls | same hue, quieter | normal | fg | +| Types / metadata / decorators | secondary accent | normal | fg | +| Strings / docstrings | green family | docstrings italic | fg | +| Escapes / regexps | brighter / teal green | normal | fg | +| Numbers / constants | warm literal accent | normal | fg | +| Comments | low-contrast lane | italic | fg | +| Heading ramp | one hue, lightness descending | level 1 strongest | fg | +| Transient state (region, current line, match, hunk) | quiet tint | none | bg | +| Signal: error / deletion | red | + weight/shape | fg, or bg for hunks | +| Signal: success / addition | green | none | fg / bg | +| Signal: warning / modified | amber | none | fg / bg | +| Signal: info / link | blue | underline | fg | + +This table is the guide made executable. The three tiers below are it, projected +onto three face inventories. + +** Shade budget + +The sharing rules fix how many shades each hue family needs and what each is for. +This is the swatch count a palette has to provide, and what =dupre= is built to: + +- *Neutrals (~5):* background, dim background, default foreground, muted + foreground (punctuation and operators), comment. +- *Cool accent, blue (2):* keyword, and builtin (the same hue at lower + chroma/lightness). +- *Warm anchor, gold (2):* definition (the strong anchor), and call (quieter, + same hue). +- *Secondary accent, violet (1):* types and decorators. +- *Green family (3):* string, docstring (muted), escape (brighter). +- *Teal (1):* regexp. +- *Warm literal, terracotta (1):* numbers and constants. +- *Signal (4):* error red, warning amber, success green, info/link blue, kept + out of the syntax accents where the palette can afford it (principle 7). +- *Heading ramp:* one hue across three or four lightness steps; document tiers + reuse an accent rather than spend a new hue. + +That is roughly fifteen swatches across seven or eight hues: few colors, each +doing related work by shade. The exact hex values live in the seeding-engine +spec; this section fixes the counts and the uses. + +* Syntax tier + +The syntax tier colors font-lock / tree-sitter categories. These are the roles +in the table, grouped the way a reader meets them. + +** Usual grouping + +Use these as starting groups: + +- *Base text:* foreground/default text, variable/use. +- *Structure:* punctuation, operators, comment delimiters. +- *Control / language syntax:* keywords, preprocessor forms, builtins. +- *Names / definitions:* function definitions, function calls, properties/fields. +- *Types / metadata:* types/classes, decorators, sometimes constants. +- *Literals:* strings, docstrings, regexps, escapes, numbers. +- *Comments:* comments and comment delimiters. + +** Sharing rules + +- Variables should usually look like normal text. If every variable is colored, + the buffer gets noisy quickly. +- Definitions should stand out more than uses. A function definition can be + brighter or bold while a function call stays in the same hue family but + quieter. +- Function calls and definitions can share hue. Use weight or brightness to mark + the definition as the stronger anchor. +- Types/classes and decorators often share a color because both describe shape, + annotation, or metadata rather than ordinary runtime values. +- Strings, docstrings, regexps, and escapes should be related but not identical. + Example: strings green, docstrings muted green, escapes brighter green, regexps + teal. +- Comments get their own low-contrast lane. Comment delimiters can be dimmer + than comment text. +- Punctuation and operators should be quiet. Usually use a muted foreground, + not a strong accent. +- Constants and numbers can share a warm literal color. If the palette is small, + constants can also share with types. +- Preprocessor forms can share with keywords unless they need to feel more + infrastructural; then make them slightly muted. +- Builtins should sit between keywords and normal identifiers: they should be + more noticeable than a user variable, but less commanding than syntax/control + keywords. In practice, use the keyword hue at lower chroma/lightness, or use + foreground with a subtle accent. + +** What "builtins between keywords and identifiers" means + +Keywords are language structure: =if=, =defun=, =class=, =return=, =let=. +They guide control flow and code shape, so they can carry a strong syntax color. + +Normal identifiers are user-authored names: local variables, arguments, ordinary +bindings. They are everywhere, so they should usually stay close to the default +foreground. + +Builtins are language-provided identifiers: =print=, =len=, =map=, +=Array.from=, =Promise=, =self=, =this=, standard macros, or core functions. +They are not syntax, but they are more meaningful than a random local variable. +"Between" means: + +- If keywords are blue and variables are foreground, builtins might be muted + blue-grey. +- If keywords are bold, builtins usually are not bold. +- If variables are plain foreground, builtins can be foreground plus a slight + hue shift. +- Builtins should be recognizable when scanning, but they should not dominate a + line the way control-flow keywords do. + +** Suggested compact mapping + +This is the canonical syntax mapping. It is what the bundled =dupre= theme should +seed to (note: dupre historically diverged, builtins on blue rather than +blue-grey and function definitions on silver rather than gold, and is being +reseeded to match this mapping). + +- *Foreground:* default text, variables. +- *Muted foreground:* punctuation, operators, comment delimiters. +- *Comment:* comments, disabled text. +- *Blue:* keywords, preprocessor. +- *Blue-grey:* builtins. +- *Gold:* function definitions and calls, with definitions stronger. +- *Violet:* types, classes, decorators. +- *Green:* strings, docstrings. +- *Teal / brighter green:* escapes, regexps. +- *Terracotta / warm accent:* numbers, constants, special literals. + +* UI faces tier + +UI faces carry almost no identity: they are the state, structure, and signal +layers of the table. So principles 4 (channels), 3 (active louder than idle), 7 +(convention), 5 (tiering), and 6 (redundancy) do nearly all the work, and they +draw their colors from the same palette (principle 2), never new ones. + +- *State is a background tint* (principle 4): =region=, =hl-line=, =highlight=, + =show-paren-match= tint behind syntax-colored text and set no foreground. + =isearch= may invert to a chip because a match marker is transient; persistent + state never does. +- *Active louder than idle* (principle 3): =mode-line= brighter than + =mode-line-inactive=; =line-number-current-line= accented against a dim + =line-number=; =isearch= (current match) louder than =lazy-highlight= (other + matches). Make the active and inactive mode-line clearly different: it is the + highest-traffic element and the cue for which window has focus. +- *Signals by convention* (principle 7): =error= red, =warning= amber, =success= + green, =isearch-fail= and =show-paren-mismatch= red. These are the semantic + layer, drawn from the palette's warm/cool accents. +- *Chrome recedes* (principle 5): =fringe= near the background, + =vertical-border= barely there, idle line numbers dim. Interactive and alert + faces get real contrast; structural chrome does not compete. +- *Redundant encoding* (principle 6): =link= is blue and underlined; + =show-paren-mismatch= uses a background plus shape, not color alone. + +The current dupre UI map already follows this, which is the point: it is a +seedable default, not a per-face tuning job. + +* Package faces tier: org-mode + +A package has many faces but few roles. org-mode (~88 faces) collapses into about +six, each driven by a principle. The long tail of other packages seeds to the +default foreground until any one earns the same treatment; org is worth doing +because it is a daily buffer. + +- *Heading ramp*: =org-level-1= through =org-level-8=. The textbook case for + principles 2 and 3: one hue family, level 1 the strongest (bright or bold), + each deeper level quieter. A lightness ramp in a single hue. Highest-value seed + in org, since headings dominate the view. +- *Markup that recedes*: =org-meta-line=, =org-drawer=, =org-special-keyword=, + =org-property-value=, =org-block-begin-line= / =org-block-end-line=, + =org-ellipsis=, =org-tag=, =org-date=, =org-document-info-keyword=. These are + org's punctuation and comments: the muted lane (principle 3 recede). +- *Code-like content reuses the syntax palette*: =org-block=, =org-code=, + =org-verbatim=, =org-inline-src-block=. Principle 1 at its clearest: a source + block is code, so it looks like code (the literal lane, the same accents as the + syntax tier). +- *State by convention*: =org-todo= and imminent deadlines read warm/red + (attention); =org-upcoming-deadline= amber; =org-scheduled= and =org-done= + recede to muted/cool, with =org-done= taking strikethrough or dim-italic so it + is not color-alone (principles 7, 3, 6). The agenda's deadline/scheduled/done + faces map straight onto the signal colors. +- *Links*: =org-link= is the link role: the same blue plus underline as the UI + link (principles 2, 6, 7). +- *Emphasis and quotes*: =org-quote=, =org-verse=, and doc-like text take + italic, the documentation lane (weight and slant below), kept readable. + +* Weight and slant + +- Use bold sparingly. Good targets: keywords, function definitions, TODO/error + states, important headings, or active/current UI elements. +- Avoid bolding every function call. It makes code visually lumpy and reduces + the value of bold for definitions and warnings. +- Italic works well for comments, docstrings, documentation-like text, and + sometimes parameters or decorators. Use it only if your chosen font has a + readable italic. +- Avoid italic for core control-flow keywords unless the theme is deliberately + stylized. Italic keywords can look decorative rather than structural. +- Keep bold and high chroma separate most of the time. A token that is both + bright and bold will dominate the buffer. + +* Contrast, chroma, and palette discipline + +- Keep default foreground/background comfortable first. Everything else depends + on the ground. +- Use high contrast for ordinary text and important UI states; use lower contrast + for comments, delimiters, and inactive UI. +- Avoid making comments so dim that they disappear. Comments are secondary, not + garbage. +- Use chroma to express semantic salience. More chroma means "look here"; lower + chroma means "supporting structure." +- Keep related roles in the same hue family and separate them by lightness, + chroma, or weight. +- Reserve the brightest accent for one or two roles. Common choices: function + definitions, strings, or keywords. +- Avoid assigning adjacent categories highly saturated unrelated hues. It makes + code look like a diagnostic heatmap. +- Use warm/cool balance deliberately. Warm colors advance visually; cool colors + recede. Put warm colors on rare, meaningful tokens if you want them noticed. +- Reuse hues across language families. A function definition should feel like a + function definition in Lisp, Python, JavaScript, and shell. + +* Signal colors and convention + +Principle 7 leans on conventions a reader already holds, and those conventions +are well-grounded. Not in what colors make us feel: the affective color-emotion +research is weak (brightness and saturation carry most of the effect, not hue), +culturally variable, and aimed at mood and branding rather than glyphs on a +ground. The grounding is in learned signal standards and in how the eye is +drawn. Red-stop and green-go trace to railway and traffic signaling and are +codified in the safety-color standards (ISO 3864, ANSI Z535); the pull of a +saturated color in a quiet field is pre-attentive (Treisman and Gelade 1980; +Ware, /Information Visualization/). + +| Signal | Conventional meaning | Where it shows | Basis | +|------------+-------------------------------+---------------------------------------------------+------------------------------------| +| Red | error, deletion, danger, stop | error, diff-removed, isearch-fail, paren-mismatch | traffic/rail stop; ISO 3864 danger | +| Amber | warning, caution, modified | warning, modified version-control state | ISO 3864 caution | +| Green | success, addition, ok, go | success, diff-added | traffic go; ISO 3864 safe | +| Blue | information, link, navigable | link, info messages | web-link convention; cool recedes | +| Muted grey | disabled, inactive, secondary | comments, inactive mode-line, dimmed text | low salience by design | + +Keep these consistent across the syntax, UI, and package tiers, and out of the +syntax accent pool where the palette can afford it, so a signal never reads as +just another token. This is a convention table, not an emotion table: it records +what a color has come to mean by use, which is what a reader actually decodes. + +* Accessibility and color vision + +- Run the palette through a color-blindness simulator before trusting it. Check + deuteranopia and protanopia (the common green-weak and red-weak deficiencies), + not just the urgent states. +- Blue and yellow stay distinct for nearly everyone; red and green are the risky + pair. When two roles must be told apart at a glance, prefer a blue/yellow or a + light/dark separation over a red/green one. +- For anything that must not be missed (diffs, errors, search hits, region), + pair the color with weight, underline, or shape, so the meaning survives + without it (principle 6). + +* Practical checks + +- Open real code in at least three languages before judging the palette. +- Squint at a buffer (or blur it): definitions, control flow, literals, and + comments should form distinct layers. If they don't, the palette is too flat or + too noisy. +- Check long files, not just curated snippets. Noise shows up in dense code. +- Check inactive windows, search highlights, region, diff, completions, and + diagnostics; syntax colors are only one part of a usable theme. +- If everything feels important, reduce chroma, remove bold, or merge colors. +- If nothing is scannable, increase separation between the main groups before + adding more hues. + +* Emacs specifics + +The rules above are general. In Emacs they land on concrete faces and a few +platform realities. + +** Theme the foundation faces first, inherit the rest + +- Map the syntax roles onto Emacs's canonical font-lock faces: + =font-lock-keyword-face=, =font-lock-function-name-face=, + =font-lock-variable-name-face=, =font-lock-type-face=, + =font-lock-constant-face=, =font-lock-builtin-face=, =font-lock-string-face=, + =font-lock-doc-face=, =font-lock-comment-face=, + =font-lock-comment-delimiter-face=, =font-lock-preprocessor-face=, and + =font-lock-warning-face=. +- Style those base faces well and let package faces inherit them. Most packages + declare faces that already =:inherit= a sensible base, so a good foundation + themes the long tail for free. Theme the base; do not chase every package. + +** Tree-sitter gives the finer faces this guide wants + +- Emacs 29's tree-sitter font-lock added the distinctions this guide asks for as + real faces. =font-lock-function-call-face= versus =font-lock-function-name-face= + is exactly "definitions stronger than calls"; there are also + =font-lock-variable-use-face=, =font-lock-property-use-face=, + =font-lock-property-name-face=, =font-lock-operator-face=, + =font-lock-bracket-face=, =font-lock-delimiter-face=, =font-lock-number-face=, + =font-lock-escape-face=, and =font-lock-regexp-face=. +- This is where "escapes brighter than strings, regexps teal" and "definitions + bolder than calls" become directly expressible. Note =treesit-font-lock-level= + controls how many of these levels actually fontify (default 3); some faces only + apply at higher levels. + +** Never leave the interface faces at their defaults + +- A usable theme is more than syntax. Always style =region=, =hl-line=, + =highlight=, =isearch= / =lazy-highlight= / =isearch-fail=, + =show-paren-match= / =show-paren-mismatch=, =cursor=, =mode-line= / + =mode-line-inactive=, =fringe=, =vertical-border=, =line-number= / + =line-number-current-line=, =minibuffer-prompt=, =link=, and =error= / + =warning= / =success=. + +** Handle terminal Emacs + +- The GUI is truecolor; =emacs -nw= may have only 256, 16, or 8 colors. Either + write display-class specs (a =((class color) (min-colors 256) ...)= clause with + a =(t ...)= fallback) or decide the theme is GUI-first and say so. +- Either way, define the 16 ANSI colors (ANSI is the terminal's standard set) + coherently with the palette: terminals, =ansi-color= in shells, and + compilation buffers all draw from them. + +** Build-and-audit tooling + +- =describe-face= (or =C-u C-x ==) at point tells you which face you are actually + looking at. It is the fastest way to find what to change. +- =M-x list-faces-display= shows every face in one buffer for a whole-theme audit. +- Test the daily buffers, not just code samples: org, magit (its diffs exercise + the semantic colors hard), dired, the completion popup (corfu / vertico / + company), and flymake/flycheck diagnostics. + +* Using this with theme-studio + +This guide is the design philosophy behind the theme-studio in this directory. +The tool is where the rules get applied, by eye and increasingly by metric. + +- *Worked example:* the bundled =dupre= theme is built from a palette of these + role-colors (blue, gold, regal/violet, sage/green, terracotta, plus neutral + silvers). Its role-to-color bindings live in =dupre.json= under =assignments=; + read it next to the seed table and the compact mapping above. (dupre is being + reseeded to match the compact mapping exactly; see the Syntax tier note.) +- *Checking contrast and palette discipline:* the tool's readouts verify by + number what this guide states as principle. Today that is the AA/AAA contrast + mask (the 4.5:1 and 7:1 tiers from WCAG, the Web Content Accessibility + Guidelines, [[https://www.w3.org/TR/WCAG21/][w3.org/TR/WCAG21]]). The planned OKLCH, APCA (Accessible Perceptual + Contrast Algorithm, [[https://github.com/Myndex/apca-w3][Myndex]]), and pairwise ΔE (perceptual color-difference) + diagnostics make "use chroma to express salience" and "low contrast does not + mean low distinguishability" checkable instead of eyeballed. See + [[file:../../docs/design/theme-studio-perceptual-color-metrics-spec.org][docs/design/theme-studio-perceptual-color-metrics-spec.org]]. +- *Seeding:* the seed table is the contract the tool seeds from: syntax, UI, and + org tiers each start from guide-correct defaults, leaving you to retune hues + rather than build a theme from blank. +- *Shipping a palette:* =build-theme.el= converts a =theme.json= exported from + the tool into a loadable Emacs deftheme, so a palette designed under these + rules becomes a real theme. + +* Sources and further reading + +Contrast, color space, and accessibility: + +- WCAG 2.1, especially SC 1.4.3 Contrast (Minimum) and SC 1.4.1 Use of Color: + [[https://www.w3.org/TR/WCAG21/][w3.org/TR/WCAG21]]. The baseline contrast model and the canonical "never rely + on color alone" rule. +- WCAG 3.0 Working Draft: [[https://www.w3.org/TR/wcag-3.0/][w3.org/TR/wcag-3.0]]. Still a draft and years from + final; its contrast method is undetermined, so treat it as direction, not law. +- APCA (Accessible Perceptual Contrast Algorithm), Myndex: + [[https://github.com/Myndex/apca-w3][github.com/Myndex/apca-w3]] and [[https://apcacontrast.com/][apcacontrast.com]]. The polarity-aware perceptual + contrast model, more trustworthy than WCAG 2 in the low-contrast band. +- Björn Ottosson, "A perceptual color space for image processing" (OKLab, 2020): + [[https://bottosson.github.io/posts/oklab/][bottosson.github.io/posts/oklab]]. Why OKLCH, with the conversion math. +- Sharma, Wu & Dalal, "The CIEDE2000 Color-Difference Formula" (2005). The + perceptual color-difference standard that ΔE-OK approximates more cheaply. + +Emacs faces and theming: + +- Elisp manual: [[info:elisp#Faces][(elisp) Faces]], [[info:elisp#Faces for Font Lock][(elisp) Faces for Font Lock]], and + [[info:elisp#Display Feature Testing][(elisp) Display Feature Testing]] (the display-class / =min-colors= specs for + terminal fallback). +- Emacs manual: [[info:emacs#Standard Faces][(emacs) Standard Faces]] and [[info:emacs#Custom Themes][(emacs) Custom Themes]]. +- Tree-sitter font-lock faces and =treesit-font-lock-level= (Emacs 29+): the + Elisp manual's font-lock sections, and =M-x describe-variable treesit-font-lock-level=. +- Protesilaos Stavrou, Modus Themes: [[https://protesilaos.com/emacs/modus-themes][protesilaos.com/emacs/modus-themes]]. A + rigorously accessible Emacs theme with documented contrast rationale, and the + high-contrast counterpoint to the low-contrast school this guide leans toward. +- base16, Chris Kempson: [[https://github.com/chriskempson/base16][github.com/chriskempson/base16]]. A 16-color scheme + convention, useful for the terminal/ANSI palette mapping above. diff --git a/scripts/theme-studio/theme-studio.html b/scripts/theme-studio/theme-studio.html index 37be4128..7d3e4fe5 100644 --- a/scripts/theme-studio/theme-studio.html +++ b/scripts/theme-studio/theme-studio.html @@ -14,6 +14,9 @@ .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} + .palwarn{display:none;margin-top:8px;font:10pt monospace;color:#cb6b4d} + .palwarn .pwh{font-weight:bold;margin-bottom:2px} + .palwarn .pwl{opacity:.92} .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} @@ -31,10 +34,23 @@ .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} + .pmodel{margin:8px 2px 4px;font:10pt monospace;color:#b4b1a2;display:flex;gap:6px;align-items:center} + .pmodel button{background:#252321;color:#cdced1;border:1px solid #3a3a3a;border-radius:4px;padding:2px 9px;font:10pt monospace;cursor:pointer} + .pmodel button.on{background:#67809c;color:#000;border-color:#67809c} + .oklchctl{display:none;margin:0 2px 6px;font:10pt monospace;color:#9aa3ad} + .oklchctl.show{display:block} + .oklchctl .ocrow{display:flex;align-items:center;gap:6px;margin:3px 0} + .oklchctl .ocrow label{width:12px;color:#cdced1} + .oklchctl .ocrow input[type=range]{flex:1} + .oklchctl .ocrow input[type=number]{width:62px;background:#252321;color:#cdced1;border:1px solid #3a3a3a;border-radius:3px;font:10pt monospace;padding:1px 3px} + .oklchctl .pclamp{display:none;color:#cb6b4d;margin-top:3px} + .oklchctl .pclamp.show{display:block} .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} + .pinfo{display:flex;justify-content:space-between;margin:10px 2px 4px;font:12pt monospace;color:#cdced1} + .pinfo2{display:flex;justify-content:space-between;margin:0 2px 9px;font:10pt monospace;color:#9aa3ad} + .pinfo2 span{cursor:default} .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} @@ -65,6 +81,7 @@ <section class="pane grow"> <h1>palette</h1> <div class="pals" id="pals"></div> + <div class="palwarn" id="palwarn"></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"> @@ -77,7 +94,15 @@ <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="pmodel">edit <button data-pm="hsv" class="on">HSV</button><button data-pm="oklch">OKLCH</button></div> + <div class="oklchctl" id="oklchctl"> + <div class="ocrow"><label title="perceptual lightness">L</label><input type="range" id="okL" min="0" max="1" step="0.001"><input type="number" id="okLn" min="0" max="1" step="0.001"></div> + <div class="ocrow"><label title="chroma (colorfulness)">C</label><input type="range" id="okC" min="0" max="0.4" step="0.001"><input type="number" id="okCn" min="0" max="0.4" step="0.001"></div> + <div class="ocrow"><label title="hue angle, degrees">H</label><input type="range" id="okH" min="0" max="360" step="1"><input type="number" id="okHn" min="0" max="360" step="1"></div> + <div class="pclamp" id="pkclamp"></div> + </div> <div class="pinfo"><span id="pkhex">#888888</span><span id="pkcon"></span></div> + <div class="pinfo2"><span id="pkoklch" title="OKLCH perceptual coordinates: lightness L (0..1), chroma C, hue H in degrees"></span><span id="pkapca"></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> @@ -135,6 +160,7 @@ <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}}; +const DELTAE_MIN=0.02; // OKLab ΔE below this = colors too close to tell apart (perceptual-metrics spec) // --- 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;} @@ -142,11 +168,201 @@ function packagesForExport(map){const out={};for(const app in map){const faces={ 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,'&').replace(/</g,'<').replace(/>/g,'>');} -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));} +// Pure color-math core (lin/rl/contrast/rating/hsv2rgb/rgb2hsv/hex2rgb/rgb2hex, +// plus OKLab/OKLCH/APCA/deltaE), inlined verbatim from colormath.js. normHex, +// textOn, and ratingColor stay below as UI-boundary helpers. +// colormath.js — pure color-math core for theme-studio. +// +// One source of truth: node imports this module (tests); generate.py inlines its +// body into the page (stripping the trailing export block) so the browser runs +// the same code. No DOM, no side effects. +// +// Algorithms: OKLab/OKLCH from Bjorn Ottosson (2020, +// https://bottosson.github.io/posts/oklab/); APCA from APCA-W3 0.1.9 +// (https://github.com/Myndex/apca-w3); deltaE is OKLab Euclidean distance. + +function hex2rgb(h) { + return [parseInt(h.substr(1, 2), 16), parseInt(h.substr(3, 2), 16), parseInt(h.substr(5, 2), 16)]; +} + +// sRGB transfer (0..1 channel <-> linear-light). +function lin(c) { return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); } +function delin(c) { return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055; } +function clamp01(c) { return c < 0 ? 0 : c > 1 ? 1 : c; } + +function srgb2oklab(hex) { + const [R, G, B] = hex2rgb(hex); + const r = lin(R / 255), g = lin(G / 255), b = lin(B / 255); + const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b; + const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b; + const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b; + const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s); + return { + L: 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + a: 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_, + }; +} + +function oklab2oklch(lab) { + let H = Math.atan2(lab.b, lab.a) * 180 / Math.PI; + if (H < 0) H += 360; + return { L: lab.L, C: Math.hypot(lab.a, lab.b), H }; +} + +function oklch2oklab(L, C, H) { + const hr = H * Math.PI / 180; + return { L, a: C * Math.cos(hr), b: C * Math.sin(hr) }; +} + +// OKLab -> linear sRGB (may fall outside [0,1] when out of gamut). +function oklab2lrgb(L, a, b) { + const l_ = L + 0.3963377774 * a + 0.2158037573 * b; + const m_ = L - 0.1055613458 * a - 0.0638541728 * b; + const s_ = L - 0.0894841775 * a - 1.2914855480 * b; + const l = l_ * l_ * l_, m = m_ * m_ * m_, s = s_ * s_ * s_; + return [ + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s, + ]; +} + +function inGamut(lrgb) { + const e = 1e-4; + return lrgb.every(c => c >= -e && c <= 1 + e); +} + +function lrgb2hex(lrgb) { + return '#' + lrgb.map(c => { + const v = Math.round(clamp01(delin(clamp01(c))) * 255); + return v.toString(16).padStart(2, '0'); + }).join(''); +} + +// OKLCH -> in-gamut sRGB hex. When the requested chroma is unreachable, reduce C +// by binary search holding L and H fixed; report whether clamping happened. +function oklch2hex(L, C, H) { + const lab0 = oklch2oklab(L, C, H); + const lrgb0 = oklab2lrgb(lab0.L, lab0.a, lab0.b); + if (inGamut(lrgb0)) return { hex: lrgb2hex(lrgb0), clamped: false }; + let lo = 0, hi = C; + for (let i = 0; i < 24; i++) { + const mid = (lo + hi) / 2; + const lab = oklch2oklab(L, mid, H); + if (inGamut(oklab2lrgb(lab.L, lab.a, lab.b))) lo = mid; else hi = mid; + } + const lab = oklch2oklab(L, lo, H); + return { hex: lrgb2hex(oklab2lrgb(lab.L, lab.a, lab.b)), clamped: true }; +} + +// APCA-W3 0.1.9. Returns signed Lc: positive for dark-text-on-light, negative +// for light-text-on-dark. Constants transcribed verbatim from the pinned source. +function apcaY(hex) { + const [R, G, B] = hex2rgb(hex); + return 0.2126729 * Math.pow(R / 255, 2.4) + + 0.7151522 * Math.pow(G / 255, 2.4) + + 0.0721750 * Math.pow(B / 255, 2.4); +} + +function apca(textHex, bgHex) { + const blkThrs = 0.022, blkClmp = 1.414, deltaYmin = 0.0005; + const normBG = 0.56, normTXT = 0.57, revTXT = 0.62, revBG = 0.65; + const scaleBoW = 1.14, scaleWoB = 1.14, loBoWoffset = 0.027, loWoBoffset = 0.027, loClip = 0.1; + let Ytxt = apcaY(textHex), Ybg = apcaY(bgHex); + Ytxt = Ytxt > blkThrs ? Ytxt : Ytxt + Math.pow(blkThrs - Ytxt, blkClmp); + Ybg = Ybg > blkThrs ? Ybg : Ybg + Math.pow(blkThrs - Ybg, blkClmp); + if (Math.abs(Ybg - Ytxt) < deltaYmin) return 0; + let out; + if (Ybg > Ytxt) { + const sapc = (Math.pow(Ybg, normBG) - Math.pow(Ytxt, normTXT)) * scaleBoW; + out = sapc < loClip ? 0 : sapc - loBoWoffset; + } else { + const sapc = (Math.pow(Ybg, revBG) - Math.pow(Ytxt, revTXT)) * scaleWoB; + out = sapc > -loClip ? 0 : sapc + loWoBoffset; + } + return out * 100; +} + +// deltaE-OK: Euclidean distance in OKLab. +function deltaE(aHex, bHex) { + const x = srgb2oklab(aHex), y = srgb2oklab(bHex); + return Math.hypot(x.L - y.L, x.a - y.a, x.b - y.b); +} + +// --- WCAG 2.x relative luminance + contrast (migrated from the page inline) --- +// rl reuses the canonical lin() above. On 8-bit channels lin's 0.04045 cutoff is +// byte-identical to the WCAG 0.03928 piecewise the inline copy used — no channel +// value falls between the two thresholds (10/255 = 0.0392, 11/255 = 0.0431) — so +// every #rrggbb contrast value is preserved exactly. +function rl(hex) { + const [R, G, B] = hex2rgb(hex); + return 0.2126 * lin(R / 255) + 0.7152 * lin(G / 255) + 0.0722 * lin(B / 255); +} + +function contrast(aHex, bHex) { + const L1 = rl(aHex), L2 = rl(bHex), 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'; } + +// --- HSV <-> sRGB for the color picker (migrated from the page inline) --- +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 rgb2hex(r, g, b) { + return '#' + [r, g, b].map(x => Math.max(0, Math.min(255, x)).toString(16).padStart(2, '0')).join(''); +} + +// One Chroma×Lightness plane cell at a fixed hue: the sRGB color if the (L,C,H) +// is reachable, else flagged out of gamut. Forward-only (one conversion + a +// range check) — the binary-search clamp is reserved for committing a color. +function planeCell(L, C, H) { + const lab = oklch2oklab(L, C, H), lrgb = oklab2lrgb(lab.L, lab.a, lab.b); + return inGamut(lrgb) ? { inGamut: true, hex: lrgb2hex(lrgb) } : { inGamut: false, hex: null }; +} + +// Pairwise palette analysis. palette is [[hex, name], ...]. Returns the pairs +// closer than threshold (OKLab ΔE), closest-first and capped, the overflow count +// beyond the cap, and each color's nearest-neighbor distance for its chip title. +function paletteWarnings(palette, threshold = 0.02, cap = 5) { + const n = palette.length, nearest = new Array(n).fill(Infinity), pairs = []; + for (let i = 0; i < n; i++) for (let j = i + 1; j < n; j++) { + const d = deltaE(palette[i][0], palette[j][0]); + if (d < nearest[i]) nearest[i] = d; + if (d < nearest[j]) nearest[j] = d; + if (d < threshold) pairs.push({ i, j, aName: palette[i][1], bName: palette[j][1], dE: d }); + } + pairs.sort((a, b) => a.dE - b.dE); + return { warnings: pairs.slice(0, cap), overflow: Math.max(0, pairs.length - cap), nearest }; +} 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);}} @@ -192,11 +408,25 @@ function buildTable(){ tb.appendChild(tr);} } let dragFrom=null,selectedIdx=null; +// Pairwise OKLab ΔE over the palette. Returns the sub-threshold pairs (sorted +// closest-first) and each color's nearest-neighbor distance for its chip title. +// Pure pairwise ΔE analysis lives in colormath.js (paletteWarnings); this renders it. +function renderPaletteWarnings(warnings,overflow){ + const w=document.getElementById('palwarn');if(!w)return; + if(!warnings.length){w.style.display='none';w.innerHTML='';return;} + let html='<div class="pwh">too-similar colors</div>'; + html+=warnings.map(p=>`<div class="pwl">${esc(p.aName+' / '+p.bName)} — \u0394E ${p.dE.toFixed(3)}, hard to distinguish</div>`).join(''); + if(overflow>0)html+=`<div class="pwl">and ${overflow} more</div>`; + w.innerHTML=html;w.style.display='block'; +} function renderPalette(){ const p=document.getElementById('pals');p.innerHTML=''; + const {warnings,overflow,nearest}=paletteWarnings(PALETTE,DELTAE_MIN,5); PALETTE.forEach((pc,i)=>{const [hex,name]=pc;const tc=textOn(hex); + const nde=nearest[i]; 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; + d.title=name+' '+hex+(nde===Infinity?'':' — nearest \u0394E '+nde.toFixed(3)); const lft=i>0?`<button class="mv l" title="move left" style="color:${tc}">‹</button>`:''; const rgt=i<PALETTE.length-1?`<button class="mv r" title="move right" style="color:${tc}">›</button>`:''; const rm=locked?`<span class="lock" title="${hex===MAP['bg']?'background':'foreground'} — can't remove" style="color:${tc}">🔒</span>`:`<button class="rm" title="remove" style="color:${tc}">×</button>`; @@ -212,6 +442,7 @@ function renderPalette(){ 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);}); + renderPaletteWarnings(warnings,overflow); 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);} @@ -232,28 +463,76 @@ function updateColor(){ } 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'; +let pkMode='any'; // contrast mask: any / aa / aaa (what constraint to mask) +let pkModel='hsv'; // color model for editing: hsv / oklch (orthogonal to pkMode) +const OKLCH_CMAX=0.4; // chroma axis range for the C×L plane (and the C dial); past sRGB at most hues, so the gamut grey shows the reachable region 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);}} +// Phase 4b: the SV box becomes a Chroma×Lightness plane in OKLCH mode. Per cell +// the in-gamut test is forward-only (oklch→oklab→linear-rgb + range check), never +// the binary search — that is reserved for committing a color. The rendered +// bitmap is cached on (hue, dims, mask, bg) so dragging C/L (fixed hue) reuses it. +let _planeCache={key:null,data:null}; +function paintOklchPlane(H){ + 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'); + const T=pkThresh(),key=Math.round(H)+'|'+w+'|'+h+'|'+pkMode+'|'+MAP['bg']; + if(_planeCache.key===key&&_planeCache.data){ctx.putImageData(_planeCache.data,0,0);return;} + const step=4; + for(let x=0;x<w;x+=step){const C=(x/w)*OKLCH_CMAX; + for(let y=0;y<h;y+=step){const L=1-y/h,cell=planeCell(L,C,H); + if(!cell.inGamut){ctx.fillStyle='#15120f';ctx.fillRect(x,y,step,step);continue;} + ctx.fillStyle=cell.hex;ctx.fillRect(x,y,step,step); + if(T&&contrast(cell.hex,MAP['bg'])<T){ctx.fillStyle='rgba(8,7,6,0.66)';ctx.fillRect(x,y,step,step);}}} + _planeCache={key,data:ctx.getImageData(0,0,w,h)}; +} +function paintPicker(){const sv=document.getElementById('sv');if(!sv)return; + const w=sv.clientWidth,h=sv.clientHeight,hh=document.getElementById('hue').clientHeight; + if(pkModel==='oklch'){const [L,C,H]=readOklch();sv.style.background='#15120f';paintOklchPlane(H); + document.getElementById('svcur').style.left=(Math.min(1,C/OKLCH_CMAX)*w)+'px'; + document.getElementById('svcur').style.top=((1-L)*h)+'px'; + document.getElementById('huecur').style.top=((H/360)*hh)+'px';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%)`; + 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);} + const o=document.getElementById('pkoklch');if(o){const lch=oklab2oklch(srgb2oklab(h));o.textContent='OKLCH '+lch.L.toFixed(3)+' '+lch.C.toFixed(3)+' '+Math.round(lch.H)+'\u00b0';} + const a=document.getElementById('pkapca');if(a){const lc=apca(h,MAP['bg']);a.textContent='APCA Lc '+lc.toFixed(0);a.title='APCA Lc '+lc.toFixed(1)+' (APCA-W3 0.1.9), text on the ground color. Positive = dark text on a light background, negative = light text on a dark background.';}} 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 pkSet(){const hex=rgb2hex(...hsv2rgb(pkH,pkS,pkV));document.getElementById('newhexstr').value=hex;document.getElementById('swatch').style.background=hex;paintPicker();pkReadout(hex);if(pkModel==='oklch')oklchInputsFromHex(hex);} +// --- OKLCH editing model (Phase 4a): L/C/H dials orthogonal to the HSV square --- +function setOklchInputs(L,C,H){ + const put=(id,v)=>{const e=document.getElementById(id);if(e)e.value=v;}; + put('okL',L.toFixed(3));put('okLn',L.toFixed(3));put('okC',C.toFixed(3));put('okCn',C.toFixed(3)); + const h=String(Math.round(H));put('okH',h);put('okHn',h);} +function oklchInputsFromHex(hex){const lch=oklab2oklch(srgb2oklab(normHex(hex)||'#888888'));setOklchInputs(lch.L,lch.C,lch.H);} +function readOklch(){return [parseFloat(document.getElementById('okL').value)||0,parseFloat(document.getElementById('okC').value)||0,parseFloat(document.getElementById('okH').value)||0];} +function pkClampStatus(on){const s=document.getElementById('pkclamp');if(!s)return;s.classList.toggle('show',on);s.textContent=on?'chroma clamped to sRGB':'';} +function pkOklchSet(){const [L,C,H]=readOklch();const {hex,clamped}=oklch2hex(L,C,H); + document.getElementById('newhexstr').value=hex;document.getElementById('swatch').style.background=hex; + [pkH,pkS,pkV]=rgb2hsv(...hex2rgb(hex));paintPicker();pkReadout(hex); + if(clamped)oklchInputsFromHex(hex); // snap the dials to the reachable color + pkClampStatus(clamped);} +function setPkModel(m){pkModel=m;document.querySelectorAll('.pmodel button').forEach(x=>x.classList.toggle('on',x.dataset.pm===m)); + const oc=document.getElementById('oklchctl');if(oc)oc.classList.toggle('show',m==='oklch'); + if(m==='oklch')oklchInputsFromHex(curHex());else pkClampStatus(false);} 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 openPicker(){pickerOn=true;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(curHex()));buildPkChips();document.getElementById('picker').style.display='block';setPkModel(pkModel);paintPicker();pkReadout(curHex());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();});} + pkDrag(document.getElementById('sv'),e=>{const r=document.getElementById('sv').getBoundingClientRect();const fx=Math.max(0,Math.min(1,(e.clientX-r.left)/r.width)),fy=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height)); + if(pkModel==='oklch'){setOklchInputs(1-fy,fx*OKLCH_CMAX,readOklch()[2]);pkOklchSet();}else{pkS=fx;pkV=1-fy;pkSet();}}); + pkDrag(document.getElementById('hue'),e=>{const r=document.getElementById('hue').getBoundingClientRect();const fy=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height)); + if(pkModel==='oklch'){const [L,C]=readOklch();setOklchInputs(L,C,fy*360);pkOklchSet();}else{pkH=fy*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));paintPicker();buildPkChips();}); + document.querySelectorAll('.pmodel button').forEach(b=>b.onclick=()=>setPkModel(b.dataset.pm)); + [['okL','okLn',3],['okC','okCn',3],['okH','okHn',0]].forEach(([r,n,dp])=>{ + const re=document.getElementById(r),ne=document.getElementById(n); + if(re)re.addEventListener('input',()=>{if(ne)ne.value=(+re.value).toFixed(dp);pkOklchSet();}); + if(ne)ne.addEventListener('input',()=>{if(re)re.value=ne.value;pkOklchSet();});});} 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;} @@ -737,5 +1016,61 @@ function pkgSelftest(){ } 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==='#cursortest'){document.getElementById('newhexstr').value='#67809c';openPicker();const sc=document.getElementById('svcur'),hc=document.getElementById('huecur');const L=parseFloat(sc.style.left||'0'),T=parseFloat(sc.style.top||'0'),H=parseFloat(hc.style.top||'0');const ok=L>1&&T>1&&H>1;document.title='CURSORTEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='cursortest';d.textContent='CURSORTEST '+(ok?'PASS':'FAIL')+' left='+sc.style.left+' top='+sc.style.top+' hue='+hc.style.top;document.body.appendChild(d);} if(location.hash.startsWith('#app')){const ap=location.hash.slice(4),s=document.getElementById('appsel');if(s&&ap){s.value=ap;pkgChanged();}} +if(location.hash==='#planetest'){let ok=true;const notes=[]; + document.getElementById('newhexstr').value='#67809c';openPicker();setPkModel('oklch');paintPicker(); + const sv=document.getElementById('sv'),cv=document.getElementById('svmask'),ctx=cv.getContext('2d'); + const [L,C,H]=readOklch(); + const expLeft=Math.min(1,C/OKLCH_CMAX)*sv.clientWidth,expTop=(1-L)*sv.clientHeight; + const gotLeft=parseFloat(document.getElementById('svcur').style.left),gotTop=parseFloat(document.getElementById('svcur').style.top); + if(Math.abs(gotLeft-expLeft)>2||Math.abs(gotTop-expTop)>2){ok=false;notes.push('crosshair off got '+gotLeft.toFixed(1)+','+gotTop.toFixed(1)+' exp '+expLeft.toFixed(1)+','+expTop.toFixed(1));} + const Coog=0.38,Loog=0.5,labO=oklch2oklab(Loog,Coog,H),oog=!inGamut(oklab2lrgb(labO.L,labO.a,labO.b)); + const oogX=Math.min(cv.width-2,Math.round((Coog/OKLCH_CMAX)*cv.width)),oogY=Math.round((1-Loog)*cv.height); + const dO=ctx.getImageData(oogX,oogY,1,1).data,greyO=Math.abs(dO[0]-0x15)<10&&Math.abs(dO[1]-0x12)<10&&Math.abs(dO[2]-0x0f)<10; + if(oog&&!greyO){ok=false;notes.push('OOG cell not masked rgb '+dO[0]+','+dO[1]+','+dO[2]);} + const inX=Math.round((0.03/OKLCH_CMAX)*cv.width),inY=Math.round(0.5*cv.height); + const dI=ctx.getImageData(inX,inY,1,1).data,greyI=Math.abs(dI[0]-0x15)<10&&Math.abs(dI[1]-0x12)<10&&Math.abs(dI[2]-0x0f)<10; + if(greyI){ok=false;notes.push('in-gamut cell rendered as OOG grey rgb '+dI[0]+','+dI[1]+','+dI[2]);} + document.title='PLANETEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='planetest';d.textContent='PLANETEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} +if(location.hash==='#oklchtest'){let ok=true;const notes=[]; + document.getElementById('newhexstr').value='#67809c';openPicker(); + const before=document.getElementById('newhexstr').value; + setPkModel('oklch'); + if(pkModel!=='oklch'){ok=false;notes.push('model not oklch');} + if(!document.getElementById('oklchctl').classList.contains('show')){ok=false;notes.push('oklch dials hidden');} + if(document.getElementById('newhexstr').value!==before){ok=false;notes.push('color changed on model switch: '+document.getElementById('newhexstr').value);} + pkMode='any';document.querySelector('.pmode button[data-m="aa"]').click(); + if(pkModel!=='oklch'){ok=false;notes.push('mask toggle reset model');} + if(pkMode!=='aa'){ok=false;notes.push('mask did not set aa');} + setPkModel('hsv'); + if(pkMode!=='aa'){ok=false;notes.push('model switch reset mask to '+pkMode);} + if(pkModel!=='hsv'){ok=false;notes.push('model not hsv after switch');} + setPkModel('oklch');setOklchInputs(0.591,0.052,251.6);pkOklchSet(); + const driven=document.getElementById('newhexstr').value,dl=oklab2oklch(srgb2oklab(driven)); + if(!(Math.abs(dl.L-0.591)<0.02&&Math.abs(dl.C-0.052)<0.02)){ok=false;notes.push('dials did not drive color: '+driven);} + const {clamped}=oklch2hex(0.7,0.4,140);setOklchInputs(0.7,0.4,140);pkOklchSet(); + if(!(clamped&&document.getElementById('pkclamp').classList.contains('show'))){ok=false;notes.push('clamp status missing for out-of-gamut C');} + document.title='OKLCHTEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='oklchtest';d.textContent='OKLCHTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} +if(location.hash==='#deltatest'){const save=PALETTE.slice();let ok=true;const notes=[];const W=()=>document.getElementById('palwarn'); + PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue'],['#69829e','blue2']];renderPalette(); + const t1=W().textContent;if(!(W().style.display!=='none'&&/blue \/ blue2/.test(t1)&&/ΔE/.test(t1))){ok=false;notes.push('near-pair did not fire: '+t1);} + PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue'],['#e8bd30','gold'],['#cb6b4d','terra']];renderPalette(); + if(W().style.display!=='none'){ok=false;notes.push('spread palette warned: '+W().textContent);} + PALETTE=[['#0d0b0a','ground'],['#cdced1','fg']];for(let k=0;k<7;k++){const v=(0x67+k).toString(16).padStart(2,'0');PALETTE.push(['#'+v+'809c','c'+k]);}renderPalette(); + const tc=W().textContent;const nums=[...tc.matchAll(/ΔE (\d+\.\d+)/g)].map(m=>parseFloat(m[1])); + if(!/and \d+ more/.test(tc)){ok=false;notes.push('no cap suffix: '+tc);} + if(!(nums.length===5&&nums.every((n,k)=>k===0||n>=nums[k-1]))){ok=false;notes.push('not 5-capped ascending: '+nums.join(','));} + PALETTE=save;renderPalette(); + document.title='DELTATEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='deltatest';d.textContent='DELTATEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} +if(location.hash==='#readouttest'){const hex='#67809c';document.getElementById('newhexstr').value=hex;openPicker();pkReadout(hex); + const o=document.getElementById('pkoklch').textContent,a=document.getElementById('pkapca').textContent,w=document.getElementById('pkcon').textContent; + const lch=oklab2oklch(srgb2oklab(hex)); + const expO='OKLCH '+lch.L.toFixed(3)+' '+lch.C.toFixed(3)+' '+Math.round(lch.H)+'\u00b0'; + const expA='APCA Lc '+apca(hex,MAP['bg']).toFixed(0); + const r=contrast(hex,MAP['bg']),expW=r.toFixed(1)+' '+rating(r); + const wired=o===expO&&a===expA&&w===expW; + const sane=Math.abs(lch.L-0.591)<0.01&&Math.abs(lch.C-0.052)<0.01&&Math.abs(lch.H-251.6)<2; + const ok=wired&&sane;document.title='READOUTTEST '+(ok?'PASS':'FAIL'); + const d=document.createElement('div');d.id='readouttest';d.textContent='READOUTTEST '+(ok?'PASS':'FAIL')+' oklch='+o+' | apca='+a+' | wcag='+w;document.body.appendChild(d);} </script>
\ No newline at end of file |
