aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-studio/theme-studio.html
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/theme-studio/theme-studio.html')
-rw-r--r--scripts/theme-studio/theme-studio.html1249
1 files changed, 886 insertions, 363 deletions
diff --git a/scripts/theme-studio/theme-studio.html b/scripts/theme-studio/theme-studio.html
index b85eead8..b815e5bf 100644
--- a/scripts/theme-studio/theme-studio.html
+++ b/scripts/theme-studio/theme-studio.html
@@ -8,19 +8,38 @@
pre{background:#0d0b0a;border:1px solid #252321;border-radius:8px;padding:14px 16px;font-size:12pt;overflow:auto;white-space:pre}
table.leg{border-collapse:collapse} table.leg td{padding:4px 12px;vertical-align:middle}
table.leg th{cursor:pointer;color:#b4b1a2;text-align:left;padding:4px 12px;user-select:none;font-weight:normal}
+ #legtable th:nth-child(3),#legtable th:nth-child(4),
+ #legtable td:nth-child(3),#legtable td:nth-child(4),
+ #uitable th:nth-child(3),#uitable th:nth-child(4),
+ #uitable td:nth-child(3),#uitable td:nth-child(4),
+ #pkgtable th:nth-child(3),#pkgtable th:nth-child(4),
+ #pkgtable td:nth-child(3),#pkgtable td:nth-child(4){width:78px;min-width:78px;max-width:78px;padding-left:4px;padding-right:4px;text-align:center}
+ #legtable th:nth-child(6),#legtable td:nth-child(6),
+ #uitable th:nth-child(8),#uitable td:nth-child(8),
+ #pkgtable th:nth-child(9),#pkgtable td:nth-child(9){width:166px;min-width:166px;max-width:166px;padding-left:6px;padding-right:6px;text-align:left}
table.leg th:hover{color:#e8bd30}
select.chip{appearance:none;border:1px solid #00000060;border-radius:5px;padding:5px 10px;font:bold 14px monospace;width:160px;cursor:pointer}
- .cdd{display:inline-flex;align-items:center;gap:7px;border:1px solid #00000060;border-radius:5px;padding:5px 10px;font:bold 13px monospace;width:160px;cursor:pointer;box-sizing:border-box;overflow:hidden;white-space:nowrap}
+ .cstep{display:inline-flex;align-items:center;gap:4px}
+ .cstepbtn{width:22px;height:28px;padding:0;border:1px solid #3a3a3a;border-radius:4px;background:#1f1c19;color:#e8bd30;font:bold 14px monospace;cursor:pointer}
+ .cstepbtn:disabled{opacity:.28;cursor:default;color:#8f8977}
+ .cstep.locked .cstepbtn{opacity:.28;cursor:default}
+ .cdd{display:inline-flex;align-items:center;gap:7px;border:1px solid #00000060;border-radius:5px;padding:5px 10px;font:bold 13px monospace;width:150px;cursor:pointer;box-sizing:border-box;overflow:hidden;white-space:nowrap}
+ .cdd.compact{width:28px;height:28px;padding:0;justify-content:center;gap:0}
+ .cdd.compact.is-default{border-color:#8f7810;box-shadow:inset 0 0 0 1px #8f7810}
.cddsw{display:inline-block;width:13px;height:13px;border-radius:3px;border:1px solid #0007;flex:none}
+ .cdd.compact .cddsw{width:18px;height:18px}
.cddpop{position:fixed;z-index:200;background:#161412;border:1px solid #3a3a3a;border-radius:6px;box-shadow:0 12px 34px #000c;max-height:60vh;overflow:auto;padding:4px}
.cddrow{display:flex;align-items:center;gap:9px;padding:4px 9px;cursor:pointer;color:#cdced1;font:12px monospace;border-radius:4px;white-space:nowrap}
.cddrow:hover{background:#252321}
.cddrow.sel{outline:1px solid #e8bd30;outline-offset:-1px}
.cddrow .cddnm{flex:1}
.cddrow .cddhx{opacity:.55;margin-left:10px}
- .cdd.locked{cursor:default;opacity:.85;box-shadow:inset 0 0 0 2px #e8bd3088}
+ .cstep.locked .cdd{cursor:default;opacity:.85;box-shadow:inset 0 0 0 2px #e8bd3088}
.lockbtn{background:none;border:none;cursor:pointer;font-size:15px;line-height:1;padding:2px 4px;opacity:.5;filter:grayscale(1)}
.lockbtn.on{opacity:1;filter:none}
+ .boxctl{display:flex;align-items:center;gap:5px}
+ .boxctl .cdd:not(.compact){width:108px}
+ .boxctl .cstepbtn{width:18px}
.legctl{margin:0 0 8px;display:flex;gap:8px;align-items:center}
.cat{color:#b4b1a2} .ex{font-size:17px}
.sbtn{width:26px;height:24px;border:1px solid #3a3a3a;border-radius:3px;background:#eaeaea;color:#111;cursor:pointer;font-size:15px;margin-right:2px;padding:0}
@@ -28,16 +47,25 @@
.pals{display:flex;flex-direction:row;flex-wrap:wrap;gap:10px;align-items:flex-start}
.fstrip{display:flex;flex-direction:column;gap:6px;padding:5px;border-radius:7px;border:1px solid transparent}
.fstrip.ground{border-color:#252321;background:#161412}
+ .fhead{min-height:17px;width:128px;display:flex;align-items:center;justify-content:center;gap:3px;color:#b4b1a2;font:9pt monospace;text-align:center}
+ .fhead .ctitle{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:none;border:none;color:#b4b1a2;font:9pt monospace;text-align:center;cursor:pointer;padding:0}
+ .fhead .ctitle:hover{color:#e8bd30}
+ .fhead .cmove,.fhead .cdel{width:18px;height:17px;background:#161412;border:1px solid #252321;border-radius:3px;color:#8a9496;font:10pt monospace;line-height:13px;padding:0;cursor:pointer}
+ .fhead .cmove:hover:not(:disabled),.fhead .cdel:hover{color:#e8bd30;border-color:#3a3a3a}
+ .fhead .cmove:disabled{opacity:.28;cursor:default}
+ .fhead .cdel{margin-left:5px;color:#b36a5e}
+ .fhead .cdel:hover{color:#ff9078;border-color:#6d342c;background:#211512}
.fcount{margin-top:3px;font:9pt monospace;color:#8a9496;text-align:center}
.fcount input{width:40px;background:#0d0b0a;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:2px 4px;font:9pt monospace;text-align:center}
.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.sel{outline:3px solid #e8bd30;outline-offset:2px} .pchip input.nm{background:transparent;border:none;text-align:center;font:bold 10pt monospace;width:108px;outline:none}
+ .pchip.sel{outline:3px solid #e8bd30;outline-offset:2px} .pchip input.nm{background:transparent;border:none;text-align:center;font:bold 10pt monospace;width:108px;outline:none;cursor:pointer}
+ .pchip input.nm.editing{cursor:text;text-align:left}
.pchip .hx{font-size:10pt;opacity:.8} .pchip .rm{position:absolute;top:2px;right:5px;background:none;border:none;cursor:pointer;font-size:14px;font-weight:bold;opacity:.7}
.pchip .lock{position:absolute;top:3px;right:5px;font-size:10px;opacity:.6}
- .palctl{margin-top:12px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
+ .palctl{margin:0 0 12px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.palctl input[type=text]{background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace}
.palctl input[type=text]::placeholder{color:#b4b1a2;opacity:1}
.palctl{position:relative}
@@ -72,7 +100,8 @@
#palmsg{font:10pt monospace;opacity:0;transition:opacity .35s;margin-left:6px}
#export{width:100%;height:180px;margin-top:10px;background:#0d0b0a;color:#a4ac64;border:1px solid #252321;border-radius:6px;font:10pt monospace;padding:10px}
.filebar{margin:6px 0 0;display:flex;gap:8px;align-items:center}
- #pagetitle{font-size:30px;color:#cdced1;font-weight:normal;border:none;margin:4px 0 18px;padding:0}
+ #pagetitle{font-size:30px;color:#cdced1;font-weight:normal;border:none;margin:0;padding:0}
+ .topbar{display:flex;gap:24px;align-items:flex-start;justify-content:space-between;margin:4px 0 18px}
.cols{display:flex;gap:28px;align-items:flex-start} .cols.stretch{align-items:stretch}
.pane{min-width:0} .pane.grow{flex:1} .pane.saveload{flex:0 0 auto;margin-left:auto}
.pane h1{margin-top:0}
@@ -92,18 +121,27 @@
@keyframes flashtok{0%,55%{background:#e8bd30aa;color:#000}100%{background:transparent}}
.flashtok{animation:flashtok 1.1s ease-out;border-radius:2px}
</style>
-<h1 id="pagetitle">Untitled: theme</h1>
-<div class="cols">
+<div class="topbar">
+ <h1 id="pagetitle">Untitled: theme</h1>
+ <div class="saveload">
+ <div class="filebar end">
+ <label style="color:#b4b1a2">theme name</label><input type="text" id="themename" value="" placeholder="untitled" oninput="updateTitle()" style="background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace;width:200px">
+ <button onclick="exportTheme()">&#11015; export</button>
+ <button class="fbtn" onclick="importTheme()">&#11014; import</button><input type="file" id="fileinput" accept=".json" onchange="importFile(event)" style="display:none">
+ <button id="jsonbtn" onclick="toggleJSON()">show</button>
+ </div>
+ <textarea id="export" style="display:none" readonly></textarea>
+ </div>
+</div>
<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">
+ <input type="text" id="newhexstr" placeholder="#rrggbb" value="#67809c" oninput="syncHex()" onkeydown="if(event.key==='Enter')applyEdit()" style="width:110px">
<input type="text" id="newname" placeholder="name" onkeydown="if(event.key==='Enter')applyEdit()">
<button onclick="addColor()">+ add color</button>
<button onclick="updateColor()">&#8635; update selected</button>
+ <button onclick="clearPalette()" title="remove every palette color except the bg and fg tiles">clear palette</button>
<span id="palmsg"></span>
<div id="picker" class="picker">
<div class="prow">
@@ -118,32 +156,20 @@
<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="pinfo"><span id="pkhex">#67809c</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>
</div>
+ <div class="pals" id="pals"></div>
+ <div class="palwarn" id="palwarn"></div>
</section>
- <section class="pane saveload">
- <h1>export, import, and save</h1>
- <div class="filebar end">
- <label style="color:#b4b1a2">theme name</label><input type="text" id="themename" value="" placeholder="untitled" oninput="updateTitle()" style="background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace;width:200px">
- </div>
- <div class="filebar end">
- <button id="savebtn" onclick="saveTheme()" style="display:none">&#128190; save</button>
- <button onclick="exportTheme()">&#11015; export</button>
- <button class="fbtn" onclick="importTheme()">&#11014; import</button><input type="file" id="fileinput" accept=".json" onchange="importFile(event)" style="display:none">
- <button id="jsonbtn" onclick="toggleJSON()">show</button>
- </div>
- <textarea id="export" style="display:none" readonly></textarea>
- </section>
-</div>
<h1>code/color assignments</h1>
<div class="cols">
<section class="pane">
- <div class="legctl"><button class="fbtn" onclick="clearUnlocked()" title="reset every unlocked element to default (reads as plain foreground text); locked rows are left untouched">clear unlocked</button></div>
- <table class="leg" id="legtable"><thead><tr><th onclick="srtTable('legbody',0)">elements &#9651;</th><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',2)">color &#9651;</th><th>style</th><th title="WCAG contrast of this color on the background">contrast</th><th>example</th></tr></thead><tbody id="legbody"></tbody></table>
+ <div class="legctl"><button id="syntaxlocktoggle" class="fbtn" onclick="toggleAllLocks('syntax')" title="lock or unlock every syntax row">lock all</button><button class="fbtn" onclick="resetUnlocked()" title="reset to captured defaults, preserving locked rows">&#8635; reset</button><button class="fbtn" onclick="clearUnlocked()" title="erase, preserving locked rows">erase</button></div>
+ <table class="leg" id="legtable"><thead><tr><th onclick="srtTable('legbody',0)">elements &#9651;</th><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',2)">fg &#9651;</th><th onclick="srtTable('legbody',3)">bg &#9651;</th><th>style</th><th title="face :box (border)">box</th><th title="WCAG contrast of this color on the background">contrast</th><th>example</th></tr></thead><tbody id="legbody"></tbody></table>
</section>
<section class="pane grow">
<div class="langbar"><label style="color:#b4b1a2">language</label><select id="langsel" class="chip" style="width:auto;font:bold 10pt monospace" onchange="renderCode()"></select></div>
@@ -153,8 +179,8 @@
<h1>ui faces</h1>
<div class="cols stretch">
<section class="pane">
- <div class="legctl"><button class="fbtn" onclick="clearUnlockedUI()" title="reset every unlocked UI face to default (no foreground/background); locked rows are left untouched">clear unlocked</button></div>
- <table class="leg" id="uitable"><thead><tr><th onclick="srtTable('uibody',0)">face &#9651;</th><th title="lock a decided face"></th><th onclick="srtTable('uibody',2)">foreground &#9651;</th><th onclick="srtTable('uibody',3)">background &#9651;</th><th>style</th><th onclick="srtTable('uibody',5)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast &#9651;</th><th>preview</th><th title="face :box (border)">box</th></tr></thead><tbody id="uibody"></tbody></table>
+ <div class="legctl"><button id="uilocktoggle" class="fbtn" onclick="toggleAllLocks('ui')" title="lock or unlock every UI face row">lock all</button><button class="fbtn" onclick="resetUnlockedUI()" title="reset to captured defaults, preserving locked rows">&#8635; reset</button><button class="fbtn" onclick="clearUnlockedUI()" title="erase, preserving locked rows">erase</button></div>
+ <table class="leg" id="uitable"><thead><tr><th onclick="srtTable('uibody',0)">face &#9651;</th><th title="lock a decided face"></th><th onclick="srtTable('uibody',2)" title="foreground">fg &#9651;</th><th onclick="srtTable('uibody',3)" title="background">bg &#9651;</th><th>style</th><th onclick="srtTable('uibody',5)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast &#9651;</th><th>preview</th><th title="face :box (border)">box</th></tr></thead><tbody id="uibody"></tbody></table>
</section>
<section class="pane grow" style="display:flex;flex-direction:column">
<div class="langbar"><label style="color:#b4b1a2">live buffer preview</label></div>
@@ -165,8 +191,9 @@
<div class="pkgbar">
<label style="color:#b4b1a2">application</label><select id="appsel" class="chip" style="width:auto;font:bold 10pt monospace"></select>
<label style="color:#b4b1a2">filter</label><input id="pkgfilter" type="text" placeholder="face name" oninput="buildPkgTable()" style="background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace;width:160px">
- <button onclick="resetApp()">&#8635; reset all</button>
- <button class="fbtn" onclick="clearUnlockedPkg()" title="reset every unlocked face in this app to default (no fg/bg); locked rows are left untouched">clear unlocked</button>
+ <button onclick="resetApp()" title="reset to captured defaults, preserving locked rows">&#8635; reset</button>
+ <button id="pkglocktoggle" class="fbtn" onclick="toggleAllLocks('pkg')" title="lock or unlock every face row in the current package">lock all</button>
+ <button class="fbtn" onclick="clearUnlockedPkg()" title="erase, preserving locked rows">erase</button>
</div>
<div class="cols stretch">
<section class="pane">
@@ -178,10 +205,19 @@
</section>
</div>
<script>
-const SAMPLES={"Elisp": [[["cmd", ";;"], ["cm", " cache.el"]], [["punc", "("], ["kw", "require"], ["p", " "], ["con", "'cl-lib"], ["punc", ")"]], [], [["punc", "("], ["kw", "defvar"], ["p", " "], ["var", "cache--tbl"], ["p", " "], ["punc", "("], ["fnc", "make-hash-table"], ["p", " "], ["con", ":test"], ["p", " "], ["con", "'equal"], ["punc", "))"]], [["p", " "], ["doc", "\"Memo table.\")"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-get"], ["p", " "], ["punc", "("], ["var", "key"], ["punc", ")"]], [["p", " "], ["doc", "\"Return cached value for KEY.\""]], [["p", " "], ["punc", "("], ["kw", "or"], ["p", " "], ["punc", "("], ["bi", "gethash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "v"], ["p", " "], ["punc", "("], ["fnc", "compute"], ["p", " "], ["var", "key"], ["p", " "], ["num", "42"], ["punc", "))) "]], [["p", " "], ["punc", "("], ["fnc", "puthash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "v"], ["p", " "], ["var", "cache--tbl"], ["punc", ") "], ["var", "v"], ["punc", "))))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-clear"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Empty the memo table.\""]], [["p", " "], ["punc", "("], ["kw", "interactive"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "clrhash"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "message"], ["p", " "], ["str", "\"cleared"], ["esc", "\\n"], ["str", "\""], ["punc", "))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-keys"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Return all keys.\""]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "acc"], ["p", " "], ["con", "nil"], ["punc", "))"]], [["p", " "], ["punc", "("], ["fnc", "maphash"], ["p", " "], ["punc", "("], ["kw", "lambda"], ["p", " "], ["punc", "("], ["var", "k"], ["p", " "], ["var", "_v"], ["punc", ")"], ["p", " "], ["punc", "("], ["fnc", "push"], ["p", " "], ["var", "k"], ["p", " "], ["var", "acc"], ["punc", "))"]], [["p", " "], ["var", "cache--tbl"], ["punc", ")"], ["p", " "], ["var", "acc"], ["punc", "))"]], [], [["punc", "("], ["kw", "provide"], ["p", " "], ["con", "'cache"], ["punc", ")"]]], "Go": [[["cmd", "//"], ["cm", " queue.go"]], [["kw", "package"], ["p", " "], ["var", "main"]], [], [["kw", "import"], ["p", " "], ["str", "\"fmt\""]], [], [["kw", "const"], ["p", " "], ["con", "MaxItems"], ["p", " "], ["op", "="], ["p", " "], ["num", "100"]], [], [["kw", "type"], ["p", " "], ["ty", "Order"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "ID"], ["p", " "], ["ty", "int"]], [["p", " "], ["prop", "Name"], ["p", " "], ["ty", "string"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["punc", "("], ["var", "q"], ["p", " "], ["op", "*"], ["ty", "Queue"], ["punc", ")"], ["p", " "], ["fnd", "Push"], ["punc", "("], ["var", "o"], ["p", " "], ["op", "*"], ["ty", "Order"], ["punc", ")"], ["p", " "], ["ty", "error"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " reject nil"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "nil"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "return"], ["p", " "], ["fnc", "fmt.Errorf"], ["punc", "("], ["str", "\"nil"], ["esc", "\\n"], ["str", "\""], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["p", " "], ["var", "q"], ["op", "."], ["prop", "items"], ["p", " "], ["op", "="], ["p", " "], ["bi", "append"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "items"], ["punc", ","], ["p", " "], ["var", "o"], ["punc", ")"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "nil"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["fnc", "fmt.Println"], ["punc", "("], ["op", "&"], ["ty", "Queue"], ["punc", "{}"], ["punc", ")"]], [["punc", "}"]]], "Python": [[["cmd", "#"], ["cm", " theme.py"]], [["kw", "from"], ["p", " "], ["var", "dataclasses"], ["p", " "], ["kw", "import"], ["p", " "], ["var", "dataclass"], ["punc", ","], ["p", " "], ["var", "field"]], [], [["con", "DEFAULT_PORT"], ["op", ":"], ["p", " "], ["ty", "int"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"]], [["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["var", "re"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "r\"#[0-9a-f]{6}\""], ["punc", ")"]], [], [["dec", "@dataclass"]], [["kw", "class"], ["p", " "], ["ty", "Theme"], ["op", ":"]], [["p", " "], ["doc", "\"\"\"A color theme.\"\"\""]], [["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""]], [["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["ty", "dict"], ["p", " "], ["op", "="], ["p", " "], ["fnc", "field"], ["punc", "("], ["prop", "default_factory"], ["op", "="], ["ty", "dict"], ["punc", ")"]], [], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "|"], ["p", " "], ["con", "None"], ["op", ":"]], [["p", " "], ["cmd", "#"], ["cm", " fallback to none"]], [["p", " "], ["var", "v"], ["p", " "], ["op", "="], ["p", " "], ["var", "self"], ["op", "."], ["prop", "colors"], ["op", "."], ["fnc", "get"], ["punc", "("], ["var", "key"], ["punc", ","], ["p", " "], ["str", "\""], ["esc", "\\t"], ["str", "none\""], ["punc", ")"]], [["p", " "], ["kw", "if"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "v"], ["punc", ")"], ["p", " "], ["op", "=="], ["p", " "], ["num", "0"], ["op", ":"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "None"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "v"]], [], [["p", " "], ["dec", "@property"]], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "size"], ["punc", "("], ["var", "self"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "int"], ["op", ":"]], [["p", " "], ["kw", "return"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "self"], ["op", "."], ["prop", "colors"], ["punc", ")"]], [], [["var", "theme"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["punc", "("], ["str", "\"dupre\""], ["punc", ")"]], [["fnc", "print"], ["punc", "("], ["var", "theme"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"]]], "TypeScript": [[["cmd", "//"], ["cm", " orders.ts"]], [["kw", "import"], ["p", " "], ["punc", "{"], ["p", " "], ["ty", "Order"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "from"], ["p", " "], ["str", "\"./types\""]], [], [["kw", "export"], ["p", " "], ["kw", "interface"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "max"], ["op", ":"], ["p", " "], ["ty", "number"], ["punc", ";"]], [["p", " "], ["prop", "items"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", "[];"]], [["punc", "}"]], [], [["dec", "@Injectable"], ["punc", "()"]], [["kw", "export"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "OrderQueue"], ["p", " "], ["kw", "implements"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["prop", "re"], ["p", " "], ["op", "="], ["p", " "], ["re", "/^#[0-9a-f]{6}$/i"], ["punc", ";"]], [], [["p", " "], ["fnd", "push"], ["punc", "("], ["var", "o"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "boolean"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "==="], ["p", " "], ["con", "null"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "false"], ["punc", ";"]], [["p", " "], ["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["str", "`id "], ["punc", "${"], ["var", "o"], ["op", "."], ["prop", "id"], ["punc", "}"], ["esc", "\\n"], ["str", "`"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "true"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "const"], ["p", " "], ["con", "LIMIT"], ["op", ":"], ["p", " "], ["ty", "number"], ["p", " "], ["op", "="], ["p", " "], ["num", "50"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "q"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "OrderQueue"], ["punc", "()"], ["punc", ";"]], [["var", "q"], ["op", "."], ["fnd", "push"], ["punc", "("], ["punc", "{"], ["p", " "], ["prop", "id"], ["op", ":"], ["p", " "], ["num", "1"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "as"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["punc", ";"]], [["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "max"], ["punc", ")"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "cap"], ["p", " "], ["op", "="], ["p", " "], ["var", "Math"], ["op", "."], ["bi", "max"], ["punc", "("], ["con", "LIMIT"], ["punc", ","], ["p", " "], ["num", "0"], ["punc", ")"], ["punc", ";"]]], "Java": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["kw", "package"], ["p", " "], ["var", "com"], ["op", "."], ["var", "dupre"], ["punc", ";"]], [["kw", "import"], ["p", " "], ["var", "java"], ["op", "."], ["var", "util"], ["op", "."], ["var", "regex"], ["op", "."], ["ty", "Pattern"], ["punc", ";"]], [], [["dec", "@Deprecated"]], [["kw", "public"], ["p", " "], ["kw", "final"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "String"], ["p", " "], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "Pattern"], ["p", " "], ["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Pattern"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "\"#[0-9a-f]{6}\""], ["punc", ")"], ["punc", ";"]], [], [["p", " "], ["dec", "@Override"]], [["p", " "], ["kw", "public"], ["p", " "], ["ty", "String"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["ty", "String"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " fall back to null"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "isEmpty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "null"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "key"], ["op", "."], ["fnc", "strip"], ["punc", "("], ["punc", ")"], ["op", "+"], ["str", "\""], ["esc", "\\t"], ["str", "\""], ["punc", ";"]], [["p", " "], ["punc", "}"]], [], [["p", " "], ["kw", "public"], ["p", " "], ["kw", "static"], ["p", " "], ["ty", "void"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "String"], ["punc", "[]"], ["p", " "], ["var", "args"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "var"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "Theme"], ["punc", "()"], ["punc", ";"]], [["p", " "], ["ty", "System"], ["op", "."], ["prop", "out"], ["op", "."], ["fnc", "println"], ["punc", "("], ["var", "t"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]]], "C": [[["cmd", "/**"], ["doc", " Order queue. */"]], [["pp", "#include"], ["p", " "], ["str", "<stdio.h>"]], [["pp", "#include"], ["p", " "], ["str", "<stdlib.h>"]], [["pp", "#define"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["num", "8080"]], [], [["kw", "typedef"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "int"], ["p", " "], ["prop", "id"], ["punc", ";"]], [["p", " "], ["kw", "const"], ["p", " "], ["ty", "char"], ["p", " "], ["op", "*"], ["prop", "name"], ["punc", ";"]], [["punc", "}"], ["p", " "], ["ty", "Order"], ["punc", ";"]], [], [["cmd", "//"], ["cm", " returns -1 on null input"]], [["ty", "int"], ["p", " "], ["fnd", "push"], ["punc", "("], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "o"], ["punc", ")"], ["p", " "], ["dec", "__attribute__"], ["punc", "(("], ["dec", "nonnull"], ["punc", "))"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "NULL"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["num", "-1"], ["punc", ";"]], [["p", " "], ["fnc", "printf"], ["punc", "("], ["str", "\"id=%d"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "o"], ["op", "->"], ["prop", "id"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "void"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "Order"], ["p", " "], ["var", "o"], ["p", " "], ["op", "="], ["p", " "], ["punc", "{"], ["p", " "], ["op", "."], ["prop", "id"], ["p", " "], ["op", "="], ["p", " "], ["num", "1"], ["punc", ","], ["p", " "], ["op", "."], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "p2"], ["p", " "], ["op", "="], ["p", " "], ["bi", "malloc"], ["punc", "("], ["bi", "sizeof"], ["punc", "("], ["ty", "Order"], ["punc", "))"], ["punc", ";"]], [["p", " "], ["fnc", "push"], ["punc", "("], ["op", "&"], ["var", "o"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["bi", "free"], ["punc", "("], ["var", "p2"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "C++": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["pp", "#include"], ["p", " "], ["str", "<string>"]], [["pp", "#include"], ["p", " "], ["str", "<regex>"]], [["pp", "#pragma"], ["p", " "], ["pp", "once"]], [], [["kw", "namespace"], ["p", " "], ["var", "dupre"], ["p", " "], ["punc", "{"]], [], [["kw", "template"], ["op", "<"], ["kw", "typename"], ["p", " "], ["ty", "T"], ["op", ">"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["kw", "public"], ["op", ":"]], [["p", " "], ["kw", "static"], ["p", " "], ["kw", "constexpr"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX"], ["p", " "], ["op", "="], ["p", " "], ["num", "0x20"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["p", " "], ["prop", "name_"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [], [["p", " "], ["dec", "[[nodiscard]]"], ["p", " "], ["ty", "T"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["kw", "const"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["op", "&"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["kw", "const"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " validate against a hex pattern"]], [["p", " "], ["kw", "static"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "regex"], ["p", " "], ["var", "re"], ["punc", "("], ["re", "R\"(#[0-9a-f]{6})\""], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "empty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "nullptr"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["ty", "T"], ["punc", "{"], ["var", "key"], ["punc", "}"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"], ["punc", ";"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "auto"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "{}"], ["punc", ";"]], [["p", " "], ["bi", "static_cast"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "("], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "size"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["fnc", "printf"], ["punc", "("], ["str", "\"%s"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "c_str"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "Shell": [[["cmd", "#!"], ["cm", "/bin/bash"]], [["cmd", "#"], ["cm", " deploy.sh"]], [["bi", "set"], ["p", " "], ["op", "-"], ["var", "euo"], ["p", " "], ["var", "pipefail"]], [], [["var", "PORT"], ["op", "="], ["num", "8080"]], [["var", "NAME"], ["op", "="], ["str", "\"dupre\""]], [], [["fnd", "deploy"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "local"], ["p", " "], ["var", "target"], ["op", "="], ["str", "\"$1\""]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "[["], ["p", " "], ["op", "-z"], ["p", " "], ["str", "\"$target\""], ["p", " "], ["punc", "]]"], ["punc", ";"], ["p", " "], ["kw", "then"]], [["p", " "], ["bi", "echo"], ["p", " "], ["str", "\"no target\""]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "fi"]], [["p", " "], ["fnc", "rsync"], ["p", " "], ["op", "-az"], ["p", " "], ["str", "\"$NAME\""], ["p", " "], ["str", "\"$target\""]], [["punc", "}"]], [], [["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "for"], ["p", " "], ["var", "host"], ["p", " "], ["kw", "in"], ["p", " "], ["str", "\"$@\""], ["punc", ";"], ["p", " "], ["kw", "do"]], [["p", " "], ["fnc", "deploy"], ["p", " "], ["str", "\"$host\""], ["p", " "], ["op", "||"], ["p", " "], ["bi", "exit"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "done"]], [["p", " "], ["bi", "echo"], ["p", " "], ["op", "-e"], ["p", " "], ["str", "\"all done"], ["esc", "\\n"], ["str", "\""]], [["punc", "}"]], [], [["fnc", "main"], ["p", " "], ["str", "\"$@\""]]]}, CATS=[["bg", "bg (ground)", "Aa Bb 123"], ["p", "fg", "other / whitespace"], ["kw", "keyword", "class def if return"], ["bi", "builtin", "len echo printf"], ["pp", "preprocessor", "#include #define"], ["fnd", "function \u00b7 def", "resolve push"], ["fnc", "function \u00b7 call", "printf rsync get"], ["dec", "decorator", "@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": null, "bg": null, "bold": true, "height": 1.5, "source": "default"}], ["org-document-info", "document info", {"fg": "#8a9496", "bg": null, "source": "default"}], ["org-document-info-keyword", "document info keyword", {"fg": "#8a9496", "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-level-1", "level 1", {"fg": "#67809c", "bg": null, "bold": true, "height": 1.3, "source": "default"}], ["org-level-2", "level 2", {"fg": null, "bg": null, "height": 1.2, "source": "default"}], ["org-level-3", "level 3", {"fg": null, "bg": null, "height": 1.15, "source": "default"}], ["org-level-4", "level 4", {"fg": null, "bg": null, "height": 1.1, "source": "default"}], ["org-level-5", "level 5", {"fg": null, "bg": null, "source": "default"}], ["org-level-6", "level 6", {"fg": null, "bg": null, "source": "default"}], ["org-level-7", "level 7", {"fg": null, "bg": null, "source": "default"}], ["org-level-8", "level 8", {"fg": "#8a9496", "bg": null, "source": "default"}], ["org-headline-todo", "headline todo", {"fg": null, "bg": null, "source": "default"}], ["org-headline-done", "headline done", {"fg": null, "bg": null, "source": "default"}], ["org-todo", "todo", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-done", "done", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-priority", "priority", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-tag", "tag", {"fg": null, "bg": null, "source": "default"}], ["org-tag-group", "tag group", {"fg": null, "bg": null, "source": "default"}], ["org-special-keyword", "special keyword", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-drawer", "drawer", {"fg": null, "bg": null, "source": "default"}], ["org-property-value", "property value", {"fg": "#8a9496", "bg": null, "source": "default"}], ["org-checkbox", "checkbox", {"fg": null, "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-checkbox-statistics-todo", "checkbox statistics todo", {"fg": null, "bg": null, "source": "default"}], ["org-checkbox-statistics-done", "checkbox statistics done", {"fg": null, "bg": null, "source": "default"}], ["org-warning", "warning", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-link", "link", {"fg": "#67809c", "bg": null, "underline": true, "source": "default"}], ["org-footnote", "footnote", {"fg": "#67809c", "bg": null, "source": "default"}], ["org-date", "date", {"fg": "#8a9496", "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-sexp-date", "sexp date", {"fg": "#8a9496", "bg": null, "source": "default"}], ["org-date-selected", "date selected", {"fg": null, "bg": null, "source": "default"}], ["org-target", "target", {"fg": null, "bg": null, "source": "default"}], ["org-macro", "macro", {"fg": null, "bg": null, "source": "default"}], ["org-cite", "cite", {"fg": "#67809c", "bg": null, "underline": true, "source": "default"}], ["org-cite-key", "cite key", {"fg": "#67809c", "bg": null, "underline": true, "source": "default"}], ["org-block", "block", {"fg": null, "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-block-begin-line", "block begin line", {"fg": null, "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-block-end-line", "block end line", {"fg": null, "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-code", "code", {"fg": null, "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-verbatim", "verbatim", {"fg": "#8a9496", "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-inline-src-block", "inline src block", {"fg": null, "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-quote", "quote", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["org-verse", "verse", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["org-latex-and-related", "latex and related", {"fg": null, "bg": null, "source": "default"}], ["org-table", "table", {"fg": "#8a9496", "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-table-header", "table header", {"fg": null, "bg": "#58574e", "bold": true, "source": "default"}], ["org-table-row", "table row", {"fg": null, "bg": null, "source": "default"}], ["org-formula", "formula", {"fg": null, "bg": null, "source": "default"}], ["org-column", "column", {"fg": null, "bg": null, "source": "default"}], ["org-column-title", "column title", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-list-dt", "list dt", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-meta-line", "meta line", {"fg": null, "bg": null, "inherit": "fixed-pitch", "source": "default"}], ["org-ellipsis", "ellipsis", {"fg": null, "bg": null, "source": "default"}], ["org-hide", "hide", {"fg": null, "bg": null, "source": "default"}], ["org-indent", "indent", {"fg": null, "bg": null, "source": "default"}], ["org-archived", "archived", {"fg": null, "bg": null, "source": "default"}], ["org-default", "default", {"fg": null, "bg": null, "source": "default"}], ["org-dispatcher-highlight", "dispatcher highlight", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-agenda-structure", "agenda structure", {"fg": "#67809c", "bg": null, "bold": true, "height": 1.1, "source": "default"}], ["org-agenda-structure-secondary", "agenda structure secondary", {"fg": "#67809c", "bg": null, "source": "default"}], ["org-agenda-structure-filter", "agenda structure filter", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-agenda-date", "agenda date", {"fg": "#8a9496", "bg": null, "height": 1.05, "source": "default"}], ["org-agenda-date-today", "agenda date today", {"fg": null, "bg": null, "bold": true, "height": 1.05, "source": "default"}], ["org-agenda-date-weekend", "agenda date weekend", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["org-agenda-date-weekend-today", "agenda date weekend today", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-agenda-current-time", "agenda current time", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-done", "agenda done", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-dimmed-todo-face", "agenda dimmed todo", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-calendar-event", "agenda calendar event", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-calendar-sexp", "agenda calendar sexp", {"fg": "#8a9496", "bg": null, "source": "default"}], ["org-agenda-calendar-daterange", "agenda calendar daterange", {"fg": "#8a9496", "bg": null, "source": "default"}], ["org-agenda-diary", "agenda diary", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-clocking", "agenda clocking", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-column-dateline", "agenda column dateline", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-restriction-lock", "agenda restriction lock", {"fg": null, "bg": null, "source": "default"}], ["org-agenda-filter-category", "agenda filter category", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-agenda-filter-effort", "agenda filter effort", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-agenda-filter-regexp", "agenda filter regexp", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-agenda-filter-tags", "agenda filter tags", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-scheduled", "scheduled", {"fg": null, "bg": null, "source": "default"}], ["org-scheduled-today", "scheduled today", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-scheduled-previously", "scheduled previously", {"fg": null, "bg": null, "source": "default"}], ["org-upcoming-deadline", "upcoming deadline", {"fg": null, "bg": null, "source": "default"}], ["org-upcoming-distant-deadline", "upcoming distant deadline", {"fg": null, "bg": null, "source": "default"}], ["org-imminent-deadline", "imminent deadline", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-time-grid", "time grid", {"fg": null, "bg": null, "source": "default"}], ["org-clock-overlay", "clock overlay", {"fg": null, "bg": null, "source": "default"}], ["org-mode-line-clock", "mode line clock", {"fg": "#8a9496", "bg": null, "source": "default"}], ["org-mode-line-clock-overrun", "mode line clock overrun", {"fg": null, "bg": null, "bold": true, "source": "default"}]]}, "magit": {"label": "magit", "preview": "magit", "faces": [["magit-section-heading", "section heading", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-section-secondary-heading", "section secondary heading", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-section-heading-selection", "section heading selection", {"fg": null, "bg": null, "source": "default"}], ["magit-section-highlight", "section highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-section-child-count", "section child count", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-added", "diff added", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-added-highlight", "diff added highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-removed", "diff removed", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-removed-highlight", "diff removed highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-context", "diff context", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-context-highlight", "diff context highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-file-heading", "diff file heading", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-diff-file-heading-highlight", "diff file heading highlight", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-diff-file-heading-selection", "diff file heading selection", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-hunk-heading", "diff hunk heading", {"fg": "#8a9496", "bg": null, "source": "default"}], ["magit-diff-hunk-heading-highlight", "diff hunk heading highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-hunk-heading-selection", "diff hunk heading selection", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-hunk-region", "diff hunk region", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-lines-heading", "diff lines heading", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-lines-boundary", "diff lines boundary", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-base", "diff base", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-base-highlight", "diff base highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-our", "diff our", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-our-highlight", "diff our highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-their", "diff their", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-their-highlight", "diff their highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-conflict-heading", "diff conflict heading", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-conflict-heading-highlight", "diff conflict heading highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-revision-summary", "diff revision summary", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-revision-summary-highlight", "diff revision summary highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-diff-whitespace-warning", "diff whitespace warning", {"fg": null, "bg": null, "source": "default"}], ["magit-diffstat-added", "diffstat added", {"fg": null, "bg": null, "source": "default"}], ["magit-diffstat-removed", "diffstat removed", {"fg": null, "bg": null, "source": "default"}], ["magit-branch-current", "branch current", {"fg": "#67809c", "bg": null, "bold": true, "box": {"style": "line", "width": 1, "color": null}, "source": "default"}], ["magit-branch-local", "branch local", {"fg": "#67809c", "bg": null, "source": "default"}], ["magit-branch-remote", "branch remote", {"fg": null, "bg": null, "source": "default"}], ["magit-branch-remote-head", "branch remote head", {"fg": null, "bg": null, "bold": true, "box": {"style": "line", "width": 1, "color": null}, "source": "default"}], ["magit-branch-upstream", "branch upstream", {"fg": null, "bg": null, "source": "default"}], ["magit-branch-warning", "branch warning", {"fg": null, "bg": null, "source": "default"}], ["magit-head", "head", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["magit-tag", "tag", {"fg": null, "bg": null, "source": "default"}], ["magit-hash", "hash", {"fg": null, "bg": null, "source": "default"}], ["magit-filename", "filename", {"fg": "#8a9496", "bg": null, "source": "default"}], ["magit-dimmed", "dimmed", {"fg": null, "bg": null, "source": "default"}], ["magit-keyword", "keyword", {"fg": null, "bg": null, "source": "default"}], ["magit-keyword-squash", "keyword squash", {"fg": null, "bg": null, "source": "default"}], ["magit-refname", "refname", {"fg": null, "bg": null, "source": "default"}], ["magit-refname-stash", "refname stash", {"fg": null, "bg": null, "source": "default"}], ["magit-refname-wip", "refname wip", {"fg": null, "bg": null, "source": "default"}], ["magit-refname-pullreq", "refname pullreq", {"fg": null, "bg": null, "source": "default"}], ["magit-log-author", "log author", {"fg": null, "bg": null, "source": "default"}], ["magit-log-date", "log date", {"fg": "#8a9496", "bg": null, "source": "default"}], ["magit-log-graph", "log graph", {"fg": null, "bg": null, "source": "default"}], ["magit-header-line", "header line", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-header-line-key", "header line key", {"fg": null, "bg": null, "source": "default"}], ["magit-header-line-log-select", "header line log select", {"fg": null, "bg": null, "source": "default"}], ["magit-process-ok", "process ok", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-process-ng", "process ng", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-mode-line-process", "mode line process", {"fg": null, "bg": null, "source": "default"}], ["magit-mode-line-process-error", "mode line process error", {"fg": null, "bg": null, "source": "default"}], ["magit-bisect-good", "bisect good", {"fg": null, "bg": null, "source": "default"}], ["magit-bisect-bad", "bisect bad", {"fg": null, "bg": null, "source": "default"}], ["magit-bisect-skip", "bisect skip", {"fg": null, "bg": null, "source": "default"}], ["magit-blame-heading", "blame heading", {"fg": "#8a9496", "bg": null, "source": "default"}], ["magit-blame-highlight", "blame highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-blame-hash", "blame hash", {"fg": null, "bg": null, "source": "default"}], ["magit-blame-name", "blame name", {"fg": null, "bg": null, "source": "default"}], ["magit-blame-date", "blame date", {"fg": "#8a9496", "bg": null, "source": "default"}], ["magit-blame-summary", "blame summary", {"fg": null, "bg": null, "source": "default"}], ["magit-blame-dimmed", "blame dimmed", {"fg": null, "bg": null, "source": "default"}], ["magit-blame-margin", "blame margin", {"fg": null, "bg": null, "source": "default"}], ["magit-cherry-equivalent", "cherry equivalent", {"fg": null, "bg": null, "source": "default"}], ["magit-cherry-unmatched", "cherry unmatched", {"fg": null, "bg": null, "source": "default"}], ["magit-signature-good", "signature good", {"fg": null, "bg": null, "source": "default"}], ["magit-signature-bad", "signature bad", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["magit-signature-untrusted", "signature untrusted", {"fg": null, "bg": null, "source": "default"}], ["magit-signature-expired", "signature expired", {"fg": null, "bg": null, "source": "default"}], ["magit-signature-expired-key", "signature expired key", {"fg": null, "bg": null, "source": "default"}], ["magit-signature-revoked", "signature revoked", {"fg": null, "bg": null, "source": "default"}], ["magit-signature-error", "signature error", {"fg": null, "bg": null, "source": "default"}], ["magit-reflog-commit", "reflog commit", {"fg": null, "bg": null, "source": "default"}], ["magit-reflog-amend", "reflog amend", {"fg": null, "bg": null, "source": "default"}], ["magit-reflog-merge", "reflog merge", {"fg": null, "bg": null, "source": "default"}], ["magit-reflog-checkout", "reflog checkout", {"fg": "#67809c", "bg": null, "source": "default"}], ["magit-reflog-reset", "reflog reset", {"fg": null, "bg": null, "source": "default"}], ["magit-reflog-rebase", "reflog rebase", {"fg": null, "bg": null, "source": "default"}], ["magit-reflog-cherry-pick", "reflog cherry pick", {"fg": null, "bg": null, "source": "default"}], ["magit-reflog-remote", "reflog remote", {"fg": "#8a9496", "bg": null, "source": "default"}], ["magit-reflog-other", "reflog other", {"fg": "#8a9496", "bg": null, "source": "default"}], ["magit-sequence-pick", "sequence pick", {"fg": null, "bg": null, "source": "default"}], ["magit-sequence-stop", "sequence stop", {"fg": null, "bg": null, "source": "default"}], ["magit-sequence-part", "sequence part", {"fg": null, "bg": null, "source": "default"}], ["magit-sequence-head", "sequence head", {"fg": "#67809c", "bg": null, "source": "default"}], ["magit-sequence-drop", "sequence drop", {"fg": null, "bg": null, "source": "default"}], ["magit-sequence-done", "sequence done", {"fg": null, "bg": null, "source": "default"}], ["magit-sequence-onto", "sequence onto", {"fg": null, "bg": null, "source": "default"}], ["magit-sequence-exec", "sequence exec", {"fg": null, "bg": null, "source": "default"}], ["magit-left-margin", "left margin", {"fg": null, "bg": null, "source": "default"}]]}, "elfeed": {"label": "elfeed", "preview": "elfeed", "faces": [["elfeed-search-date-face", "search date", {"fg": "#8a9496", "bg": null, "source": "default"}], ["elfeed-search-title-face", "search title", {"fg": null, "bg": null, "source": "default"}], ["elfeed-search-unread-title-face", "search unread title", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["elfeed-search-feed-face", "search feed", {"fg": null, "bg": null, "source": "default"}], ["elfeed-search-tag-face", "search tag", {"fg": null, "bg": null, "source": "default"}], ["elfeed-search-unread-count-face", "search unread count", {"fg": null, "bg": null, "source": "default"}], ["elfeed-search-filter-face", "search filter", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["elfeed-search-last-update-face", "search last update", {"fg": null, "bg": null, "source": "default"}], ["elfeed-log-date-face", "log date", {"fg": "#8a9496", "bg": null, "source": "default"}], ["elfeed-log-error-level-face", "log error level", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["elfeed-log-warn-level-face", "log warn level", {"fg": null, "bg": null, "source": "default"}], ["elfeed-log-info-level-face", "log info level", {"fg": null, "bg": null, "source": "default"}], ["elfeed-log-debug-level-face", "log debug level", {"fg": null, "bg": null, "source": "default"}]]}, "mu4e": {"label": "mu4e", "preview": "mu4e", "faces": [["mu4e-title-face", "title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["mu4e-context-face", "context", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["mu4e-modeline-face", "modeline", {"fg": null, "bg": null, "source": "default"}], ["mu4e-ok-face", "ok", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["mu4e-warning-face", "warning", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["mu4e-header-title-face", "header title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["mu4e-header-key-face", "header key", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["mu4e-header-value-face", "header value", {"fg": null, "bg": null, "source": "default"}], ["mu4e-header-face", "header", {"fg": "#cdced1", "bg": null, "source": "default"}], ["mu4e-header-highlight-face", "header highlight", {"fg": null, "bg": null, "underline": true, "source": "default"}], ["mu4e-header-marks-face", "header marks", {"fg": null, "bg": null, "source": "default"}], ["mu4e-unread-face", "unread", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["mu4e-flagged-face", "flagged", {"fg": null, "bg": null, "source": "default"}], ["mu4e-replied-face", "replied", {"fg": null, "bg": null, "source": "default"}], ["mu4e-forwarded-face", "forwarded", {"fg": null, "bg": null, "source": "default"}], ["mu4e-draft-face", "draft", {"fg": "#8a9496", "bg": null, "italic": true, "source": "default"}], ["mu4e-trashed-face", "trashed", {"fg": null, "bg": null, "strike": true, "source": "default"}], ["mu4e-related-face", "related", {"fg": "#8a9496", "bg": null, "italic": true, "source": "default"}], ["mu4e-contact-face", "contact", {"fg": "#cdced1", "bg": null, "source": "default"}], ["mu4e-special-header-value-face", "special header value", {"fg": null, "bg": null, "source": "default"}], ["mu4e-url-number-face", "url number", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["mu4e-link-face", "link", {"fg": "#67809c", "bg": null, "underline": true, "source": "default"}], ["mu4e-footer-face", "footer", {"fg": null, "bg": null, "source": "default"}], ["mu4e-region-code", "region code", {"fg": null, "bg": null, "source": "default"}], ["mu4e-system-face", "system", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["mu4e-highlight-face", "highlight", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["mu4e-compose-separator-face", "compose separator", {"fg": null, "bg": null, "source": "default"}]]}, "ghostel": {"label": "ghostel", "preview": "ghostel", "faces": [["ghostel-default", "default", {"fg": "#cdced1", "bg": null, "source": "default"}], ["ghostel-fake-cursor", "fake cursor", {"fg": "#000000", "bg": null, "source": "default"}], ["ghostel-fake-cursor-box", "fake cursor box", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-black", "color black", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-red", "color red", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-green", "color green", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-yellow", "color yellow", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-blue", "color blue", {"fg": "#67809c", "bg": null, "source": "default"}], ["ghostel-color-magenta", "color magenta", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-cyan", "color cyan", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-white", "color white", {"fg": null, "bg": null, "source": "default"}], ["ghostel-color-bright-black", "color bright black", {"fg": "#8a9496", "bg": null, "source": "default"}], ["ghostel-color-bright-red", "color bright red", {"fg": "#de4949", "bg": null, "source": "default"}], ["ghostel-color-bright-green", "color bright green", {"fg": "#84b068", "bg": null, "source": "default"}], ["ghostel-color-bright-yellow", "color bright yellow", {"fg": "#eed376", "bg": null, "source": "default"}], ["ghostel-color-bright-blue", "color bright blue", {"fg": "#7a9abe", "bg": null, "source": "default"}], ["ghostel-color-bright-magenta", "color bright magenta", {"fg": "#b07fd0", "bg": null, "source": "default"}], ["ghostel-color-bright-cyan", "color bright cyan", {"fg": "#7fc0a8", "bg": null, "source": "default"}], ["ghostel-color-bright-white", "color bright white", {"fg": null, "bg": null, "source": "default"}]]}, "dashboard": {"label": "dashboard", "preview": "dashboard", "faces": [["dashboard-banner-logo-title", "banner logo title", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dashboard-text-banner", "text banner", {"fg": "#8a9496", "bg": null, "source": "default"}], ["dashboard-heading", "heading", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["dashboard-items-face", "items", {"fg": "#cdced1", "bg": null, "source": "default"}], ["dashboard-navigator", "navigator", {"fg": "#67809c", "bg": null, "source": "default"}], ["dashboard-no-items-face", "no items", {"fg": null, "bg": null, "source": "default"}], ["dashboard-footer-face", "footer", {"fg": null, "bg": null, "source": "default"}], ["dashboard-footer-icon-face", "footer icon", {"fg": null, "bg": null, "source": "default"}]]}, "lsp-mode": {"label": "lsp-mode", "preview": "lsp", "faces": [["lsp-signature-face", "signature", {"fg": null, "bg": null, "source": "default"}], ["lsp-signature-highlight-function-argument", "signature highlight function argument", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["lsp-signature-posframe", "signature posframe", {"fg": null, "bg": null, "source": "default"}], ["lsp-face-highlight-read", "face highlight read", {"fg": null, "bg": null, "underline": true, "source": "default"}], ["lsp-face-highlight-write", "face highlight write", {"fg": null, "bg": "#3d2f4a", "bold": true, "source": "default"}], ["lsp-face-highlight-textual", "face highlight textual", {"fg": null, "bg": null, "source": "default"}], ["lsp-face-rename", "face rename", {"fg": null, "bg": null, "bold": true, "underline": true, "source": "default"}], ["lsp-rename-placeholder-face", "rename placeholder", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["lsp-inlay-hint-face", "inlay hint", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["lsp-inlay-hint-parameter-face", "inlay hint parameter", {"fg": "#8a9496", "bg": null, "italic": true, "source": "default"}], ["lsp-inlay-hint-type-face", "inlay hint type", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["lsp-details-face", "details", {"fg": null, "bg": null, "italic": true, "height": 0.8, "source": "default"}], ["lsp-installation-buffer-face", "installation buffer", {"fg": "#67809c", "bg": null, "source": "default"}], ["lsp-installation-finished-buffer-face", "installation finished buffer", {"fg": null, "bg": null, "source": "default"}]]}, "git-gutter": {"label": "git-gutter", "preview": "gitgutter", "faces": [["git-gutter:added", "added", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["git-gutter:modified", "modified", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["git-gutter:deleted", "deleted", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["git-gutter:unchanged", "unchanged", {"fg": null, "bg": null, "source": "default"}], ["git-gutter:separator", "separator", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}]]}, "flycheck": {"label": "flycheck", "preview": "flycheck", "faces": [["flycheck-error", "error", {"fg": null, "bg": null, "underline": true, "source": "default"}], ["flycheck-warning", "warning", {"fg": null, "bg": null, "underline": true, "source": "default"}], ["flycheck-info", "info", {"fg": "#67809c", "bg": null, "underline": true, "source": "default"}], ["flycheck-fringe-error", "fringe error", {"fg": null, "bg": null, "source": "default"}], ["flycheck-fringe-warning", "fringe warning", {"fg": null, "bg": null, "source": "default"}], ["flycheck-fringe-info", "fringe info", {"fg": "#67809c", "bg": null, "source": "default"}], ["flycheck-delimited-error", "delimited error", {"fg": null, "bg": null, "source": "default"}], ["flycheck-error-delimiter", "error delimiter", {"fg": null, "bg": null, "source": "default"}], ["flycheck-error-list-error", "error list error", {"fg": null, "bg": null, "source": "default"}], ["flycheck-error-list-warning", "error list warning", {"fg": null, "bg": null, "source": "default"}], ["flycheck-error-list-info", "error list info", {"fg": "#67809c", "bg": null, "source": "default"}], ["flycheck-error-list-error-message", "error list error message", {"fg": "#cdced1", "bg": null, "source": "default"}], ["flycheck-error-list-checker-name", "error list checker name", {"fg": "#8a9496", "bg": null, "source": "default"}], ["flycheck-error-list-column-number", "error list column number", {"fg": null, "bg": null, "source": "default"}], ["flycheck-error-list-line-number", "error list line number", {"fg": null, "bg": null, "source": "default"}], ["flycheck-error-list-filename", "error list filename", {"fg": "#67809c", "bg": null, "source": "default"}], ["flycheck-error-list-id", "error list id", {"fg": "#8a9496", "bg": null, "source": "default"}], ["flycheck-error-list-id-with-explainer", "error list id with explainer", {"fg": "#8a9496", "bg": null, "bold": true, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["flycheck-error-list-highlight", "error list highlight", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["flycheck-verify-select-checker", "verify select checker", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}]]}, "dired": {"label": "dired", "preview": "dired", "faces": [["dired-header", "header", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["dired-directory", "directory", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["dired-symlink", "symlink", {"fg": null, "bg": null, "source": "default"}], ["dired-broken-symlink", "broken symlink", {"fg": "#de4949", "bg": null, "bold": true, "source": "default"}], ["dired-special", "special", {"fg": null, "bg": null, "source": "default"}], ["dired-set-id", "set id", {"fg": null, "bg": null, "source": "default"}], ["dired-perm-write", "perm write", {"fg": null, "bg": null, "source": "default"}], ["dired-mark", "mark", {"fg": null, "bg": null, "source": "default"}], ["dired-marked", "marked", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dired-flagged", "flagged", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dired-ignored", "ignored", {"fg": null, "bg": null, "source": "default"}], ["dired-warning", "warning", {"fg": null, "bg": null, "bold": true, "source": "default"}]]}, "dirvish": {"label": "dirvish", "preview": "dirvish", "faces": [["dirvish-inactive", "inactive", {"fg": null, "bg": null, "source": "default"}], ["dirvish-free-space", "free space", {"fg": null, "bg": null, "source": "default"}], ["dirvish-hl-line", "hl line", {"fg": null, "bg": null, "source": "default"}], ["dirvish-hl-line-inactive", "hl line inactive", {"fg": null, "bg": null, "source": "default"}], ["dirvish-file-modes", "file modes", {"fg": "#8a9496", "bg": null, "source": "default"}], ["dirvish-file-link-number", "file link number", {"fg": null, "bg": null, "source": "default"}], ["dirvish-file-user-id", "file user id", {"fg": "#67809c", "bg": null, "source": "default"}], ["dirvish-file-group-id", "file group id", {"fg": "#8a9496", "bg": null, "source": "default"}], ["dirvish-file-size", "file size", {"fg": null, "bg": null, "source": "default"}], ["dirvish-file-time", "file time", {"fg": null, "bg": null, "source": "default"}], ["dirvish-file-inode-number", "file inode number", {"fg": null, "bg": null, "source": "default"}], ["dirvish-file-device-number", "file device number", {"fg": null, "bg": null, "source": "default"}], ["dirvish-subtree-guide", "subtree guide", {"fg": null, "bg": null, "source": "default"}], ["dirvish-subtree-state", "subtree state", {"fg": "#8a9496", "bg": null, "source": "default"}], ["dirvish-collapse-dir-face", "collapse dir", {"fg": "#67809c", "bg": null, "source": "default"}], ["dirvish-collapse-empty-dir-face", "collapse empty dir", {"fg": null, "bg": null, "source": "default"}], ["dirvish-collapse-file-face", "collapse file", {"fg": null, "bg": null, "source": "default"}], ["dirvish-emerge-group-title", "emerge group title", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dirvish-media-info-heading", "media info heading", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["dirvish-media-info-property-key", "media info property key", {"fg": "#8a9496", "bg": null, "italic": true, "source": "default"}], ["dirvish-narrow-match-face-0", "narrow match 0", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dirvish-narrow-match-face-1", "narrow match 1", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["dirvish-narrow-match-face-2", "narrow match 2", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dirvish-narrow-match-face-3", "narrow match 3", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dirvish-narrow-split", "narrow split", {"fg": null, "bg": null, "source": "default"}], ["dirvish-proc-running", "proc running", {"fg": null, "bg": null, "source": "default"}], ["dirvish-proc-finished", "proc finished", {"fg": null, "bg": null, "source": "default"}], ["dirvish-proc-failed", "proc failed", {"fg": null, "bg": null, "source": "default"}], ["dirvish-git-commit-message-face", "git commit message", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["dirvish-vc-added-state", "vc added state", {"fg": null, "bg": null, "source": "default"}], ["dirvish-vc-edited-state", "vc edited state", {"fg": null, "bg": null, "source": "default"}], ["dirvish-vc-removed-state", "vc removed state", {"fg": null, "bg": null, "source": "default"}], ["dirvish-vc-conflict-state", "vc conflict state", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["dirvish-vc-locked-state", "vc locked state", {"fg": "#67809c", "bg": null, "source": "default"}], ["dirvish-vc-missing-state", "vc missing state", {"fg": null, "bg": null, "source": "default"}], ["dirvish-vc-needs-merge-face", "vc needs merge", {"fg": null, "bg": null, "source": "default"}], ["dirvish-vc-needs-update-state", "vc needs update state", {"fg": null, "bg": null, "source": "default"}], ["dirvish-vc-unregistered-face", "vc unregistered", {"fg": null, "bg": null, "source": "default"}]]}, "calibredb": {"label": "calibredb", "preview": "calibredb", "faces": [["calibredb-search-header-library-name-face", "search header library name", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["calibredb-search-header-library-path-face", "search header library path", {"fg": null, "bg": null, "source": "default"}], ["calibredb-search-header-total-face", "search header total", {"fg": null, "bg": null, "source": "default"}], ["calibredb-search-header-filter-face", "search header filter", {"fg": null, "bg": null, "source": "default"}], ["calibredb-search-header-sort-face", "search header sort", {"fg": "#8a9496", "bg": null, "source": "default"}], ["calibredb-search-header-highlight-face", "search header highlight", {"fg": null, "bg": null, "bold": true, "underline": true, "source": "default"}], ["calibredb-id-face", "id", {"fg": null, "bg": null, "source": "default"}], ["calibredb-title-face", "title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["calibredb-author-face", "author", {"fg": null, "bg": null, "source": "default"}], ["calibredb-format-face", "format", {"fg": "#8a9496", "bg": null, "source": "default"}], ["calibredb-size-face", "size", {"fg": null, "bg": null, "source": "default"}], ["calibredb-tag-face", "tag", {"fg": null, "bg": null, "source": "default"}], ["calibredb-date-face", "date", {"fg": null, "bg": null, "source": "default"}], ["calibredb-mark-face", "mark", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["calibredb-series-face", "series", {"fg": null, "bg": null, "source": "default"}], ["calibredb-publisher-face", "publisher", {"fg": "#8a9496", "bg": null, "source": "default"}], ["calibredb-pubdate-face", "pubdate", {"fg": null, "bg": null, "source": "default"}], ["calibredb-language-face", "language", {"fg": "#8a9496", "bg": null, "source": "default"}], ["calibredb-comment-face", "comment", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["calibredb-archive-face", "archive", {"fg": null, "bg": null, "source": "default"}], ["calibredb-favorite-face", "favorite", {"fg": null, "bg": null, "source": "default"}], ["calibredb-file-face", "file", {"fg": "#67809c", "bg": null, "source": "default"}], ["calibredb-ids-face", "ids", {"fg": null, "bg": null, "source": "default"}], ["calibredb-highlight-face", "highlight", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["calibredb-current-page-button-face", "current page button", {"fg": "#67809c", "bg": null, "bold": true, "height": 1.1, "source": "default"}], ["calibredb-mouse-face", "mouse", {"fg": null, "bg": null, "source": "default"}], ["calibredb-title-detailed-view-face", "title detailed view", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["calibredb-edit-annotation-header-title-face", "edit annotation header title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}]]}, "erc": {"label": "erc", "preview": "erc", "faces": [["erc-header-line", "header line", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-timestamp-face", "timestamp", {"fg": null, "bg": null, "source": "default"}], ["erc-notice-face", "notice", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["erc-default-face", "default", {"fg": "#cdced1", "bg": null, "source": "default"}], ["erc-current-nick-face", "current nick", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-my-nick-face", "my nick", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-my-nick-prefix-face", "my nick prefix", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-nick-default-face", "nick default", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["erc-nick-prefix-face", "nick prefix", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-button-nick-default-face", "button nick default", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["erc-nick-msg-face", "nick msg", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-direct-msg-face", "direct msg", {"fg": null, "bg": null, "source": "default"}], ["erc-action-face", "action", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["erc-keyword-face", "keyword", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-pal-face", "pal", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-fool-face", "fool", {"fg": null, "bg": null, "source": "default"}], ["erc-dangerous-host-face", "dangerous host", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-error-face", "error", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-input-face", "input", {"fg": null, "bg": null, "source": "default"}], ["erc-prompt-face", "prompt", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["erc-command-indicator-face", "command indicator", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["erc-information", "information", {"fg": "#8a9496", "bg": null, "source": "default"}], ["erc-button", "button", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["erc-bold-face", "bold", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["erc-italic-face", "italic", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["erc-underline-face", "underline", {"fg": null, "bg": null, "underline": true, "source": "default"}], ["erc-inverse-face", "inverse", {"fg": "#000000", "bg": null, "source": "default"}], ["erc-spoiler-face", "spoiler", {"fg": "#000000", "bg": null, "source": "default"}], ["erc-fill-wrap-merge-indicator-face", "fill wrap merge indicator", {"fg": null, "bg": null, "source": "default"}], ["erc-keep-place-indicator-arrow", "keep place indicator arrow", {"fg": null, "bg": null, "source": "default"}], ["erc-keep-place-indicator-line", "keep place indicator line", {"fg": null, "bg": null, "source": "default"}]]}, "org-drill": {"label": "org-drill", "preview": "orgdrill", "faces": [["org-drill-hidden-cloze-face", "hidden cloze", {"fg": "#000000", "bg": "#8a9496", "source": "default"}], ["org-drill-visible-cloze-face", "visible cloze", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-drill-visible-cloze-hint-face", "visible cloze hint", {"fg": null, "bg": null, "italic": true, "source": "default"}]]}, "org-noter": {"label": "org-noter", "preview": "orgnoter", "faces": [["org-noter-notes-exist-face", "notes exist", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["org-noter-no-notes-exist-face", "no notes exist", {"fg": null, "bg": null, "bold": true, "source": "default"}]]}, "signel": {"label": "signel", "preview": "signel", "faces": [["signel-timestamp-face", "timestamp", {"fg": null, "bg": null, "source": "default"}], ["signel-my-msg-face", "my msg", {"fg": "#67809c", "bg": null, "source": "default"}], ["signel-other-msg-face", "other msg", {"fg": null, "bg": null, "source": "default"}], ["signel-error-face", "error", {"fg": null, "bg": null, "bold": true, "source": "default"}]]}, "pearl": {"label": "pearl", "preview": "pearl", "faces": [["pearl-preamble-summary", "preamble summary", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["pearl-editable-comment", "editable comment", {"fg": null, "bg": null, "source": "default"}], ["pearl-readonly-comment", "readonly comment", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["pearl-modified-highlight", "modified highlight", {"fg": null, "bg": null, "source": "default"}], ["pearl-modified-local", "modified local", {"fg": null, "bg": null, "source": "default"}], ["pearl-modified-unknown", "modified unknown", {"fg": null, "bg": null, "source": "default"}]]}, "slack": {"label": "slack", "preview": "slack", "faces": [["slack-room-info-title-face", "room info title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["slack-room-info-title-room-name-face", "room info title room name", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-room-info-section-title-face", "room info section title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["slack-room-info-section-label-face", "room info section label", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["slack-room-unread-face", "room unread", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-message-output-header", "message output header", {"fg": "#67809c", "bg": null, "bold": true, "underline": true, "source": "default"}], ["slack-message-output-text", "message output text", {"fg": "#cdced1", "bg": null, "source": "default"}], ["slack-message-output-reaction", "message output reaction", {"fg": "#8a9496", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-message-output-reaction-pressed", "message output reaction pressed", {"fg": null, "bg": null, "bold": true, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-message-deleted-face", "message deleted", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["slack-new-message-marker-face", "new message marker", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-all-thread-buffer-thread-header-face", "all thread buffer thread header", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["slack-message-mention-face", "message mention", {"fg": "#67809c", "bg": null, "source": "default"}], ["slack-message-mention-me-face", "message mention me", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-message-mention-keyword-face", "message mention keyword", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-channel-button-face", "channel button", {"fg": "#67809c", "bg": null, "underline": true, "source": "default"}], ["slack-mrkdwn-bold-face", "mrkdwn bold", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-mrkdwn-italic-face", "mrkdwn italic", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["slack-mrkdwn-code-face", "mrkdwn code", {"fg": null, "bg": null, "source": "default"}], ["slack-mrkdwn-code-block-face", "mrkdwn code block", {"fg": null, "bg": null, "source": "default"}], ["slack-mrkdwn-strike-face", "mrkdwn strike", {"fg": null, "bg": null, "strike": true, "source": "default"}], ["slack-mrkdwn-blockquote-face", "mrkdwn blockquote", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["slack-mrkdwn-list-face", "mrkdwn list", {"fg": null, "bg": null, "source": "default"}], ["slack-attachment-header", "attachment header", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["slack-attachment-footer", "attachment footer", {"fg": null, "bg": null, "source": "default"}], ["slack-attachment-pad", "attachment pad", {"fg": null, "bg": null, "source": "default"}], ["slack-attachment-field-title", "attachment field title", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["slack-message-attachment-preview-header-face", "message attachment preview header", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["slack-preview-face", "preview", {"fg": null, "bg": null, "source": "default"}], ["slack-block-highlight-source-overlay-face", "block highlight source overlay", {"fg": null, "bg": null, "source": "default"}], ["slack-message-action-face", "message action", {"fg": "#67809c", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-message-action-primary-face", "message action primary", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-message-action-danger-face", "message action danger", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-button-block-element-face", "button block element", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-button-primary-block-element-face", "button primary block element", {"fg": null, "bg": null, "bold": true, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-button-danger-block-element-face", "button danger block element", {"fg": null, "bg": null, "bold": true, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-select-block-element-face", "select block element", {"fg": "#67809c", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-overflow-block-element-face", "overflow block element", {"fg": "#8a9496", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-date-picker-block-element-face", "date picker block element", {"fg": "#67809c", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-dialog-title-face", "dialog title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["slack-dialog-element-label-face", "dialog element label", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["slack-dialog-element-hint-face", "dialog element hint", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["slack-dialog-element-placeholder-face", "dialog element placeholder", {"fg": null, "bg": null, "source": "default"}], ["slack-dialog-element-error-face", "dialog element error", {"fg": null, "bg": null, "source": "default"}], ["slack-dialog-submit-button-face", "dialog submit button", {"fg": null, "bg": null, "bold": true, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-dialog-cancel-button-face", "dialog cancel button", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-dialog-select-element-input-face", "dialog select element input", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["slack-user-active-face", "user active", {"fg": null, "bg": null, "source": "default"}], ["slack-user-dnd-face", "user dnd", {"fg": null, "bg": null, "source": "default"}], ["slack-user-profile-header-face", "user profile header", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["slack-user-profile-property-name-face", "user profile property name", {"fg": "#8a9496", "bg": null, "source": "default"}], ["slack-profile-image-face", "profile image", {"fg": null, "bg": null, "source": "default"}], ["slack-search-result-message-header-face", "search result message header", {"fg": "#67809c", "bg": null, "source": "default"}], ["slack-search-result-message-username-face", "search result message username", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-modeline-has-unreads-face", "modeline has unreads", {"fg": null, "bg": null, "source": "default"}], ["slack-modeline-channel-has-unreads-face", "modeline channel has unreads", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["slack-modeline-thread-has-unreads-face", "modeline thread has unreads", {"fg": null, "bg": null, "source": "default"}]]}, "telega": {"label": "telega", "preview": "telega", "faces": [["telega-root-heading", "root heading", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["telega-tracking", "tracking", {"fg": null, "bg": null, "source": "default"}], ["telega-unread-unmuted-modeline", "unread unmuted modeline", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-username", "username", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-user-online-status", "user online status", {"fg": null, "bg": null, "source": "default"}], ["telega-user-non-online-status", "user non online status", {"fg": null, "bg": null, "source": "default"}], ["telega-secret-title", "secret title", {"fg": null, "bg": null, "source": "default"}], ["telega-contact-birthdays-today", "contact birthdays today", {"fg": null, "bg": null, "source": "default"}], ["telega-muted-count", "muted count", {"fg": null, "bg": null, "source": "default"}], ["telega-unmuted-count", "unmuted count", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-mention-count", "mention count", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-has-chatbuf-brackets", "has chatbuf brackets", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-delim-face", "delim", {"fg": null, "bg": null, "source": "default"}], ["telega-shadow", "shadow", {"fg": null, "bg": null, "source": "default"}], ["telega-link", "link", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-blue", "blue", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-red", "red", {"fg": null, "bg": null, "source": "default"}], ["telega-msg-heading", "msg heading", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-msg-user-title", "msg user title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["telega-msg-self-title", "msg self title", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-msg-deleted", "msg deleted", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["telega-msg-sponsored", "msg sponsored", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["telega-msg-inline-reply", "msg inline reply", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-msg-inline-forward", "msg inline forward", {"fg": null, "bg": null, "source": "default"}], ["telega-msg-inline-other", "msg inline other", {"fg": null, "bg": null, "source": "default"}], ["telega-entity-type-bold", "entity type bold", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-entity-type-italic", "entity type italic", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["telega-entity-type-underline", "entity type underline", {"fg": null, "bg": null, "underline": true, "source": "default"}], ["telega-entity-type-strikethrough", "entity type strikethrough", {"fg": null, "bg": null, "strike": true, "source": "default"}], ["telega-entity-type-code", "entity type code", {"fg": null, "bg": null, "source": "default"}], ["telega-entity-type-pre", "entity type pre", {"fg": null, "bg": null, "source": "default"}], ["telega-entity-type-blockquote", "entity type blockquote", {"fg": null, "bg": null, "italic": true, "source": "default"}], ["telega-entity-type-mention", "entity type mention", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-entity-type-hashtag", "entity type hashtag", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-entity-type-cashtag", "entity type cashtag", {"fg": null, "bg": null, "source": "default"}], ["telega-entity-type-botcommand", "entity type botcommand", {"fg": null, "bg": null, "source": "default"}], ["telega-entity-type-texturl", "entity type texturl", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-entity-type-spoiler", "entity type spoiler", {"fg": null, "bg": null, "source": "default"}], ["telega-reaction", "reaction", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-reaction-chosen", "reaction chosen", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-reaction-paid", "reaction paid", {"fg": null, "bg": null, "source": "default"}], ["telega-reaction-paid-chosen", "reaction paid chosen", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-highlight-text-face", "highlight text", {"fg": "#000000", "bg": null, "source": "default"}], ["telega-button-highlight", "button highlight", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-chat-prompt", "chat prompt", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["telega-chat-prompt-aux", "chat prompt aux", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-chat-input-attachment", "chat input attachment", {"fg": null, "bg": null, "source": "default"}], ["telega-topic-button", "topic button", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-filter-active", "filter active", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-filter-button-active", "filter button active", {"fg": "#000000", "bg": null, "source": "default"}], ["telega-filter-button-inactive", "filter button inactive", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-checklist-stats-done", "checklist stats done", {"fg": null, "bg": null, "source": "default"}], ["telega-checklist-stats-todo", "checklist stats todo", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-box-button", "box button", {"fg": "#67809c", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-active", "box button active", {"fg": "#000000", "bg": "#67809c", "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-default-active", "box button default active", {"fg": "#000000", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-default-passive", "box button default passive", {"fg": "#8a9496", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-primary-active", "box button primary active", {"fg": "#000000", "bg": "#67809c", "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-primary-passive", "box button primary passive", {"fg": "#67809c", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-success-active", "box button success active", {"fg": "#000000", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-success-passive", "box button success passive", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-danger-active", "box button danger active", {"fg": "#000000", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-danger-passive", "box button danger passive", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-ui-active", "box button ui active", {"fg": "#000000", "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button-ui-passive", "box button ui passive", {"fg": null, "bg": null, "box": {"style": "released", "width": 1, "color": null}, "source": "default"}], ["telega-box-button2-active", "box button2 active", {"fg": "#000000", "bg": "#67809c", "source": "default"}], ["telega-box-button2-passive", "box button2 passive", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-box-button2-white-foreground", "box button2 white foreground", {"fg": null, "bg": null, "source": "default"}], ["telega-describe-item-title", "describe item title", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["telega-describe-section-title", "describe section title", {"fg": "#67809c", "bg": null, "bold": true, "underline": true, "source": "default"}], ["telega-describe-subsection-title", "describe subsection title", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-enckey-00", "enckey 00", {"fg": null, "bg": null, "source": "default"}], ["telega-enckey-01", "enckey 01", {"fg": null, "bg": null, "source": "default"}], ["telega-enckey-10", "enckey 10", {"fg": null, "bg": null, "source": "default"}], ["telega-enckey-11", "enckey 11", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-palette-builtin-blue", "palette builtin blue", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-palette-builtin-green", "palette builtin green", {"fg": null, "bg": null, "source": "default"}], ["telega-palette-builtin-orange", "palette builtin orange", {"fg": null, "bg": null, "source": "default"}], ["telega-palette-builtin-purple", "palette builtin purple", {"fg": null, "bg": null, "source": "default"}], ["telega-webpage-title", "webpage title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["telega-webpage-subtitle", "webpage subtitle", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-webpage-header", "webpage header", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["telega-webpage-subheader", "webpage subheader", {"fg": null, "bg": null, "source": "default"}], ["telega-webpage-outline", "webpage outline", {"fg": null, "bg": null, "source": "default"}], ["telega-webpage-fixed", "webpage fixed", {"fg": null, "bg": null, "source": "default"}], ["telega-webpage-preformatted", "webpage preformatted", {"fg": null, "bg": null, "source": "default"}], ["telega-webpage-marked", "webpage marked", {"fg": "#000000", "bg": null, "source": "default"}], ["telega-webpage-strike-through", "webpage strike through", {"fg": null, "bg": null, "strike": true, "source": "default"}], ["telega-webpage-chat-link", "webpage chat link", {"fg": "#67809c", "bg": null, "source": "default"}], ["telega-link-preview-sitename", "link preview sitename", {"fg": "#8a9496", "bg": null, "source": "default"}], ["telega-link-preview-title", "link preview title", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}]]}, "shr": {"label": "shr (HTML: nov/eww/mail)", "preview": "shr", "faces": [["shr-h1", "h1", {"fg": null, "bg": null, "bold": true, "height": 1.4, "source": "default"}], ["shr-h2", "h2", {"fg": "#67809c", "bg": null, "bold": true, "height": 1.2, "source": "default"}], ["shr-h3", "h3", {"fg": "#67809c", "bg": null, "bold": true, "source": "default"}], ["shr-h4", "h4", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["shr-h5", "h5", {"fg": "#8a9496", "bg": null, "bold": true, "source": "default"}], ["shr-h6", "h6", {"fg": null, "bg": null, "bold": true, "source": "default"}], ["shr-text", "text", {"fg": "#cdced1", "bg": null, "source": "default"}], ["shr-link", "link", {"fg": "#67809c", "bg": null, "underline": true, "source": "default"}], ["shr-selected-link", "selected link", {"fg": null, "bg": null, "bold": true, "underline": true, "source": "default"}], ["shr-code", "code", {"fg": null, "bg": null, "source": "default"}], ["shr-mark", "mark", {"fg": "#000000", "bg": null, "source": "default"}], ["shr-strike-through", "strike through", {"fg": null, "bg": null, "strike": true, "source": "default"}], ["shr-sup", "sup", {"fg": "#8a9496", "bg": null, "height": 0.8, "source": "default"}], ["shr-abbreviation", "abbreviation", {"fg": "#8a9496", "bg": null, "italic": true, "underline": true, "source": "default"}], ["shr-sliced-image", "sliced image", {"fg": null, "bg": null, "source": "default"}]]}, "2048-game": {"label": "2048-game", "preview": "generic", "faces": [["twentyfortyeight-face-1024", "twentyfortyeight 1024", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-128", "twentyfortyeight 128", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-16", "twentyfortyeight 16", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-2", "twentyfortyeight 2", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-2048", "twentyfortyeight 2048", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-256", "twentyfortyeight 256", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-32", "twentyfortyeight 32", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-4", "twentyfortyeight 4", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-512", "twentyfortyeight 512", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-64", "twentyfortyeight 64", {"fg": null, "bg": null, "source": "default"}], ["twentyfortyeight-face-8", "twentyfortyeight 8", {"fg": null, "bg": null, "source": "default"}]]}, "alert": {"label": "alert", "preview": "generic", "faces": [["alert-high-face", "high", {"fg": null, "bg": null, "source": "default"}], ["alert-low-face", "low", {"fg": null, "bg": null, "source": "default"}], ["alert-moderate-face", "moderate", {"fg": null, "bg": null, "source": "default"}], ["alert-normal-face", "normal", {"fg": null, "bg": null, "source": "default"}], ["alert-trivial-face", "trivial", {"fg": null, "bg": null, "source": "default"}], ["alert-urgent-face", "urgent", {"fg": null, "bg": null, "source": "default"}]]}, "all-the-icons": {"label": "all-the-icons", "preview": "generic", "faces": [["all-the-icons-blue", "blue", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-blue-alt", "blue alt", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-cyan", "cyan", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-cyan-alt", "cyan alt", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dblue", "dblue", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dcyan", "dcyan", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dgreen", "dgreen", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dmaroon", "dmaroon", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dorange", "dorange", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dpink", "dpink", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dpurple", "dpurple", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dred", "dred", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dsilver", "dsilver", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-dyellow", "dyellow", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-green", "green", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lblue", "lblue", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lcyan", "lcyan", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lgreen", "lgreen", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lmaroon", "lmaroon", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lorange", "lorange", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lpink", "lpink", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lpurple", "lpurple", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lred", "lred", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lsilver", "lsilver", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-lyellow", "lyellow", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-maroon", "maroon", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-orange", "orange", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-pink", "pink", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-purple", "purple", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-purple-alt", "purple alt", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-red", "red", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-red-alt", "red alt", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-silver", "silver", {"fg": null, "bg": null, "source": "default"}], ["all-the-icons-yellow", "yellow", {"fg": null, "bg": null, "source": "default"}]]}, "company": {"label": "company", "preview": "generic", "faces": [["company-echo", "echo", {"fg": null, "bg": null, "source": "default"}], ["company-echo-common", "echo common", {"fg": null, "bg": null, "source": "default"}], ["company-preview", "preview", {"fg": null, "bg": null, "source": "default"}], ["company-preview-common", "preview common", {"fg": null, "bg": null, "source": "default"}], ["company-preview-search", "preview search", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip", "tooltip", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-annotation", "tooltip annotation", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-annotation-selection", "tooltip annotation selection", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-common", "tooltip common", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-common-selection", "tooltip common selection", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-deprecated", "tooltip deprecated", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-mouse", "tooltip mouse", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-quick-access", "tooltip quick access", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-quick-access-selection", "tooltip quick access selection", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-scrollbar-thumb", "tooltip scrollbar thumb", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-scrollbar-track", "tooltip scrollbar track", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-search", "tooltip search", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-search-selection", "tooltip search selection", {"fg": null, "bg": null, "source": "default"}], ["company-tooltip-selection", "tooltip selection", {"fg": null, "bg": null, "source": "default"}]]}, "company-box": {"label": "company-box", "preview": "generic", "faces": [["company-box-annotation", "annotation", {"fg": null, "bg": null, "source": "default"}], ["company-box-background", "background", {"fg": null, "bg": null, "source": "default"}], ["company-box-candidate", "candidate", {"fg": null, "bg": null, "source": "default"}], ["company-box-numbers", "numbers", {"fg": null, "bg": null, "source": "default"}], ["company-box-scrollbar", "scrollbar", {"fg": null, "bg": null, "source": "default"}], ["company-box-selection", "selection", {"fg": null, "bg": null, "source": "default"}]]}, "consult": {"label": "consult", "preview": "generic", "faces": [["consult-async-failed", "async failed", {"fg": null, "bg": null, "source": "default"}], ["consult-async-finished", "async finished", {"fg": null, "bg": null, "source": "default"}], ["consult-async-running", "async running", {"fg": null, "bg": null, "source": "default"}], ["consult-async-split", "async split", {"fg": null, "bg": null, "source": "default"}], ["consult-bookmark", "bookmark", {"fg": null, "bg": null, "source": "default"}], ["consult-buffer", "buffer", {"fg": null, "bg": null, "source": "default"}], ["consult-file", "file", {"fg": null, "bg": null, "source": "default"}], ["consult-grep-context", "grep context", {"fg": null, "bg": null, "source": "default"}], ["consult-help", "help", {"fg": null, "bg": null, "source": "default"}], ["consult-highlight-mark", "highlight mark", {"fg": null, "bg": null, "source": "default"}], ["consult-highlight-match", "highlight match", {"fg": null, "bg": null, "source": "default"}], ["consult-key", "key", {"fg": null, "bg": null, "source": "default"}], ["consult-line-number", "line number", {"fg": null, "bg": null, "source": "default"}], ["consult-line-number-prefix", "line number prefix", {"fg": null, "bg": null, "source": "default"}], ["consult-line-number-wrapped", "line number wrapped", {"fg": null, "bg": null, "source": "default"}], ["consult-narrow-indicator", "narrow indicator", {"fg": null, "bg": null, "source": "default"}], ["consult-preview-insertion", "preview insertion", {"fg": null, "bg": null, "source": "default"}], ["consult-preview-line", "preview line", {"fg": null, "bg": null, "source": "default"}], ["consult-preview-match", "preview match", {"fg": null, "bg": null, "source": "default"}], ["consult-separator", "separator", {"fg": null, "bg": null, "source": "default"}]]}, "embark": {"label": "embark", "preview": "generic", "faces": [["embark-collect-annotation", "collect annotation", {"fg": null, "bg": null, "source": "default"}], ["embark-collect-candidate", "collect candidate", {"fg": null, "bg": null, "source": "default"}], ["embark-collect-group-separator", "collect group separator", {"fg": null, "bg": null, "source": "default"}], ["embark-collect-group-title", "collect group title", {"fg": null, "bg": null, "source": "default"}], ["embark-keybinding", "keybinding", {"fg": null, "bg": null, "source": "default"}], ["embark-keybinding-repeat", "keybinding repeat", {"fg": null, "bg": null, "source": "default"}], ["embark-keymap", "keymap", {"fg": null, "bg": null, "source": "default"}], ["embark-selected", "selected", {"fg": null, "bg": null, "source": "default"}], ["embark-target", "target", {"fg": null, "bg": null, "source": "default"}], ["embark-verbose-indicator-documentation", "verbose indicator documentation", {"fg": null, "bg": null, "source": "default"}], ["embark-verbose-indicator-shadowed", "verbose indicator shadowed", {"fg": null, "bg": null, "source": "default"}], ["embark-verbose-indicator-title", "verbose indicator title", {"fg": null, "bg": null, "source": "default"}]]}, "emms": {"label": "emms", "preview": "generic", "faces": [["emms-browser-album-face", "browser album", {"fg": null, "bg": null, "source": "default"}], ["emms-browser-albumartist-face", "browser albumartist", {"fg": null, "bg": null, "source": "default"}], ["emms-browser-artist-face", "browser artist", {"fg": null, "bg": null, "source": "default"}], ["emms-browser-composer-face", "browser composer", {"fg": null, "bg": null, "source": "default"}], ["emms-browser-performer-face", "browser performer", {"fg": null, "bg": null, "source": "default"}], ["emms-browser-track-face", "browser track", {"fg": null, "bg": null, "source": "default"}], ["emms-browser-year/genre-face", "browser year/genre", {"fg": null, "bg": null, "source": "default"}], ["emms-metaplaylist-mode-current-face", "metaplaylist mode current", {"fg": null, "bg": null, "source": "default"}], ["emms-metaplaylist-mode-face", "metaplaylist mode", {"fg": null, "bg": null, "source": "default"}], ["emms-playlist-selected-face", "playlist selected", {"fg": null, "bg": null, "source": "default"}], ["emms-playlist-track-face", "playlist track", {"fg": null, "bg": null, "source": "default"}]]}, "flyspell-correct": {"label": "flyspell-correct", "preview": "generic", "faces": [["flyspell-correct-highlight-face", "highlight", {"fg": null, "bg": null, "source": "default"}]]}, "highlight-indent-guides": {"label": "highlight-indent-guides", "preview": "generic", "faces": [["highlight-indent-guides-character-face", "character", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-even-face", "even", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-odd-face", "odd", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-stack-character-face", "stack character", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-stack-even-face", "stack even", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-stack-odd-face", "stack odd", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-top-character-face", "top character", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-top-even-face", "top even", {"fg": null, "bg": null, "source": "default"}], ["highlight-indent-guides-top-odd-face", "top odd", {"fg": null, "bg": null, "source": "default"}]]}, "hl-todo": {"label": "hl-todo", "preview": "generic", "faces": [["hl-todo", "hl todo", {"fg": null, "bg": null, "source": "default"}], ["hl-todo-flymake-type", "flymake type", {"fg": null, "bg": null, "source": "default"}]]}, "json-mode": {"label": "json-mode", "preview": "generic", "faces": [["json-mode-object-name-face", "object name", {"fg": null, "bg": null, "source": "default"}]]}, "llama": {"label": "llama", "preview": "generic", "faces": [["llama-##-macro", "## macro", {"fg": null, "bg": null, "source": "default"}], ["llama-deleted-argument", "deleted argument", {"fg": null, "bg": null, "source": "default"}], ["llama-llama-macro", "llama macro", {"fg": null, "bg": null, "source": "default"}], ["llama-mandatory-argument", "mandatory argument", {"fg": null, "bg": null, "source": "default"}], ["llama-optional-argument", "optional argument", {"fg": null, "bg": null, "source": "default"}]]}, "lv": {"label": "lv", "preview": "generic", "faces": [["lv-separator", "separator", {"fg": null, "bg": null, "source": "default"}]]}, "magit-section": {"label": "magit-section", "preview": "generic", "faces": [["magit-left-margin", "magit left margin", {"fg": null, "bg": null, "source": "default"}], ["magit-section-child-count", "child count", {"fg": null, "bg": null, "source": "default"}], ["magit-section-heading", "heading", {"fg": null, "bg": null, "source": "default"}], ["magit-section-heading-selection", "heading selection", {"fg": null, "bg": null, "source": "default"}], ["magit-section-highlight", "highlight", {"fg": null, "bg": null, "source": "default"}], ["magit-section-secondary-heading", "secondary heading", {"fg": null, "bg": null, "source": "default"}]]}, "malyon": {"label": "malyon", "preview": "generic", "faces": [["malyon-face-bold", "face bold", {"fg": null, "bg": null, "source": "default"}], ["malyon-face-error", "face error", {"fg": null, "bg": null, "source": "default"}], ["malyon-face-italic", "face italic", {"fg": null, "bg": null, "source": "default"}], ["malyon-face-plain", "face plain", {"fg": null, "bg": null, "source": "default"}], ["malyon-face-reverse", "face reverse", {"fg": null, "bg": null, "source": "default"}]]}, "marginalia": {"label": "marginalia", "preview": "generic", "faces": [["marginalia-archive", "archive", {"fg": null, "bg": null, "source": "default"}], ["marginalia-char", "char", {"fg": null, "bg": null, "source": "default"}], ["marginalia-date", "date", {"fg": null, "bg": null, "source": "default"}], ["marginalia-documentation", "documentation", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-name", "file name", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-owner", "file owner", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-dir", "file priv dir", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-exec", "file priv exec", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-link", "file priv link", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-no", "file priv no", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-other", "file priv other", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-rare", "file priv rare", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-read", "file priv read", {"fg": null, "bg": null, "source": "default"}], ["marginalia-file-priv-write", "file priv write", {"fg": null, "bg": null, "source": "default"}], ["marginalia-function", "function", {"fg": null, "bg": null, "source": "default"}], ["marginalia-installed", "installed", {"fg": null, "bg": null, "source": "default"}], ["marginalia-key", "key", {"fg": null, "bg": null, "source": "default"}], ["marginalia-lighter", "lighter", {"fg": null, "bg": null, "source": "default"}], ["marginalia-list", "list", {"fg": null, "bg": null, "source": "default"}], ["marginalia-mode", "mode", {"fg": null, "bg": null, "source": "default"}], ["marginalia-modified", "modified", {"fg": null, "bg": null, "source": "default"}], ["marginalia-null", "null", {"fg": null, "bg": null, "source": "default"}], ["marginalia-number", "number", {"fg": null, "bg": null, "source": "default"}], ["marginalia-off", "off", {"fg": null, "bg": null, "source": "default"}], ["marginalia-on", "on", {"fg": null, "bg": null, "source": "default"}], ["marginalia-size", "size", {"fg": null, "bg": null, "source": "default"}], ["marginalia-string", "string", {"fg": null, "bg": null, "source": "default"}], ["marginalia-symbol", "symbol", {"fg": null, "bg": null, "source": "default"}], ["marginalia-true", "true", {"fg": null, "bg": null, "source": "default"}], ["marginalia-type", "type", {"fg": null, "bg": null, "source": "default"}], ["marginalia-value", "value", {"fg": null, "bg": null, "source": "default"}], ["marginalia-version", "version", {"fg": null, "bg": null, "source": "default"}]]}, "markdown-mode": {"label": "markdown-mode", "preview": "generic", "faces": [["markdown-blockquote-face", "markdown blockquote", {"fg": null, "bg": null, "source": "default"}], ["markdown-bold-face", "markdown bold", {"fg": null, "bg": null, "source": "default"}], ["markdown-code-face", "markdown code", {"fg": null, "bg": null, "source": "default"}], ["markdown-comment-face", "markdown comment", {"fg": null, "bg": null, "source": "default"}], ["markdown-footnote-marker-face", "markdown footnote marker", {"fg": null, "bg": null, "source": "default"}], ["markdown-footnote-text-face", "markdown footnote text", {"fg": null, "bg": null, "source": "default"}], ["markdown-gfm-checkbox-face", "markdown gfm checkbox", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-delimiter-face", "markdown header delimiter", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-face", "markdown header", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-face-1", "markdown header 1", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-face-2", "markdown header 2", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-face-3", "markdown header 3", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-face-4", "markdown header 4", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-face-5", "markdown header 5", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-face-6", "markdown header 6", {"fg": null, "bg": null, "source": "default"}], ["markdown-header-rule-face", "markdown header rule", {"fg": null, "bg": null, "source": "default"}], ["markdown-highlight-face", "markdown highlight", {"fg": null, "bg": null, "source": "default"}], ["markdown-highlighting-face", "markdown highlighting", {"fg": null, "bg": null, "source": "default"}], ["markdown-hr-face", "markdown hr", {"fg": null, "bg": null, "source": "default"}], ["markdown-html-attr-name-face", "markdown html attr name", {"fg": null, "bg": null, "source": "default"}], ["markdown-html-attr-value-face", "markdown html attr value", {"fg": null, "bg": null, "source": "default"}], ["markdown-html-entity-face", "markdown html entity", {"fg": null, "bg": null, "source": "default"}], ["markdown-html-tag-delimiter-face", "markdown html tag delimiter", {"fg": null, "bg": null, "source": "default"}], ["markdown-html-tag-name-face", "markdown html tag name", {"fg": null, "bg": null, "source": "default"}], ["markdown-inline-code-face", "markdown inline code", {"fg": null, "bg": null, "source": "default"}], ["markdown-italic-face", "markdown italic", {"fg": null, "bg": null, "source": "default"}], ["markdown-language-info-face", "markdown language info", {"fg": null, "bg": null, "source": "default"}], ["markdown-language-keyword-face", "markdown language keyword", {"fg": null, "bg": null, "source": "default"}], ["markdown-line-break-face", "markdown line break", {"fg": null, "bg": null, "source": "default"}], ["markdown-link-face", "markdown link", {"fg": null, "bg": null, "source": "default"}], ["markdown-link-title-face", "markdown link title", {"fg": null, "bg": null, "source": "default"}], ["markdown-list-face", "markdown list", {"fg": null, "bg": null, "source": "default"}], ["markdown-markup-face", "markdown markup", {"fg": null, "bg": null, "source": "default"}], ["markdown-math-face", "markdown math", {"fg": null, "bg": null, "source": "default"}], ["markdown-metadata-key-face", "markdown metadata key", {"fg": null, "bg": null, "source": "default"}], ["markdown-metadata-value-face", "markdown metadata value", {"fg": null, "bg": null, "source": "default"}], ["markdown-missing-link-face", "markdown missing link", {"fg": null, "bg": null, "source": "default"}], ["markdown-plain-url-face", "markdown plain url", {"fg": null, "bg": null, "source": "default"}], ["markdown-pre-face", "markdown pre", {"fg": null, "bg": null, "source": "default"}], ["markdown-reference-face", "markdown reference", {"fg": null, "bg": null, "source": "default"}], ["markdown-strike-through-face", "markdown strike through", {"fg": null, "bg": null, "source": "default"}], ["markdown-table-face", "markdown table", {"fg": null, "bg": null, "source": "default"}], ["markdown-url-face", "markdown url", {"fg": null, "bg": null, "source": "default"}]]}, "nerd-icons": {"label": "nerd-icons", "preview": "generic", "faces": [["nerd-icons-blue", "blue", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-blue-alt", "blue alt", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-cyan", "cyan", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-cyan-alt", "cyan alt", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dblue", "dblue", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dcyan", "dcyan", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dgreen", "dgreen", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dmaroon", "dmaroon", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dorange", "dorange", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dpink", "dpink", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dpurple", "dpurple", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dred", "dred", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dsilver", "dsilver", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-dyellow", "dyellow", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-green", "green", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lblue", "lblue", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lcyan", "lcyan", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lgreen", "lgreen", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lmaroon", "lmaroon", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lorange", "lorange", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lpink", "lpink", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lpurple", "lpurple", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lred", "lred", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lsilver", "lsilver", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-lyellow", "lyellow", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-maroon", "maroon", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-orange", "orange", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-pink", "pink", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-purple", "purple", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-purple-alt", "purple alt", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-red", "red", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-red-alt", "red alt", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-silver", "silver", {"fg": null, "bg": null, "source": "default"}], ["nerd-icons-yellow", "yellow", {"fg": null, "bg": null, "source": "default"}]]}, "nerd-icons-completion": {"label": "nerd-icons-completion", "preview": "generic", "faces": [["nerd-icons-completion-dir-face", "dir", {"fg": null, "bg": null, "source": "default"}]]}, "orderless": {"label": "orderless", "preview": "generic", "faces": [["orderless-match-face-0", "match 0", {"fg": null, "bg": null, "source": "default"}], ["orderless-match-face-1", "match 1", {"fg": null, "bg": null, "source": "default"}], ["orderless-match-face-2", "match 2", {"fg": null, "bg": null, "source": "default"}], ["orderless-match-face-3", "match 3", {"fg": null, "bg": null, "source": "default"}]]}, "org-roam": {"label": "org-roam", "preview": "generic", "faces": [["org-roam-dailies-calendar-note", "dailies calendar note", {"fg": null, "bg": null, "source": "default"}], ["org-roam-dim", "dim", {"fg": null, "bg": null, "source": "default"}], ["org-roam-header-line", "header line", {"fg": null, "bg": null, "source": "default"}], ["org-roam-olp", "olp", {"fg": null, "bg": null, "source": "default"}], ["org-roam-preview-heading", "preview heading", {"fg": null, "bg": null, "source": "default"}], ["org-roam-preview-heading-highlight", "preview heading highlight", {"fg": null, "bg": null, "source": "default"}], ["org-roam-preview-heading-selection", "preview heading selection", {"fg": null, "bg": null, "source": "default"}], ["org-roam-preview-region", "preview region", {"fg": null, "bg": null, "source": "default"}], ["org-roam-title", "title", {"fg": null, "bg": null, "source": "default"}]]}, "org-superstar": {"label": "org-superstar", "preview": "generic", "faces": [["org-superstar-first", "first", {"fg": null, "bg": null, "source": "default"}], ["org-superstar-header-bullet", "header bullet", {"fg": null, "bg": null, "source": "default"}], ["org-superstar-item", "item", {"fg": null, "bg": null, "source": "default"}], ["org-superstar-leading", "leading", {"fg": null, "bg": null, "source": "default"}]]}, "prescient": {"label": "prescient", "preview": "generic", "faces": [["prescient-primary-highlight", "primary highlight", {"fg": null, "bg": null, "source": "default"}], ["prescient-secondary-highlight", "secondary highlight", {"fg": null, "bg": null, "source": "default"}]]}, "rainbow-delimiters": {"label": "rainbow-delimiters", "preview": "generic", "faces": [["rainbow-delimiters-base-error-face", "base error", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-base-face", "base", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-1-face", "depth 1", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-2-face", "depth 2", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-3-face", "depth 3", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-4-face", "depth 4", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-5-face", "depth 5", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-6-face", "depth 6", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-7-face", "depth 7", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-8-face", "depth 8", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-depth-9-face", "depth 9", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-mismatched-face", "mismatched", {"fg": null, "bg": null, "source": "default"}], ["rainbow-delimiters-unmatched-face", "unmatched", {"fg": null, "bg": null, "source": "default"}]]}, "symbol-overlay": {"label": "symbol-overlay", "preview": "generic", "faces": [["symbol-overlay-default-face", "default", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-1", "face 1", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-2", "face 2", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-3", "face 3", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-4", "face 4", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-5", "face 5", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-6", "face 6", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-7", "face 7", {"fg": null, "bg": null, "source": "default"}], ["symbol-overlay-face-8", "face 8", {"fg": null, "bg": null, "source": "default"}]]}, "tmr": {"label": "tmr", "preview": "generic", "faces": [["tmr-description", "description", {"fg": null, "bg": null, "source": "default"}], ["tmr-duration", "duration", {"fg": null, "bg": null, "source": "default"}], ["tmr-end-time", "end time", {"fg": null, "bg": null, "source": "default"}], ["tmr-finished", "finished", {"fg": null, "bg": null, "source": "default"}], ["tmr-is-acknowledged", "is acknowledged", {"fg": null, "bg": null, "source": "default"}], ["tmr-must-be-acknowledged", "must be acknowledged", {"fg": null, "bg": null, "source": "default"}], ["tmr-start-time", "start time", {"fg": null, "bg": null, "source": "default"}], ["tmr-tabulated-acknowledgement", "tabulated acknowledgement", {"fg": null, "bg": null, "source": "default"}], ["tmr-tabulated-description", "tabulated description", {"fg": null, "bg": null, "source": "default"}], ["tmr-tabulated-end-time", "tabulated end time", {"fg": null, "bg": null, "source": "default"}], ["tmr-tabulated-remaining-time", "tabulated remaining time", {"fg": null, "bg": null, "source": "default"}], ["tmr-tabulated-start-time", "tabulated start time", {"fg": null, "bg": null, "source": "default"}]]}, "transient": {"label": "transient", "preview": "generic", "faces": [["transient-active-infix", "active infix", {"fg": null, "bg": null, "source": "default"}], ["transient-argument", "argument", {"fg": null, "bg": null, "source": "default"}], ["transient-delimiter", "delimiter", {"fg": null, "bg": null, "source": "default"}], ["transient-disabled-suffix", "disabled suffix", {"fg": null, "bg": null, "source": "default"}], ["transient-enabled-suffix", "enabled suffix", {"fg": null, "bg": null, "source": "default"}], ["transient-heading", "heading", {"fg": null, "bg": null, "source": "default"}], ["transient-higher-level", "higher level", {"fg": null, "bg": null, "source": "default"}], ["transient-inactive-argument", "inactive argument", {"fg": null, "bg": null, "source": "default"}], ["transient-inactive-value", "inactive value", {"fg": null, "bg": null, "source": "default"}], ["transient-inapt-argument", "inapt argument", {"fg": null, "bg": null, "source": "default"}], ["transient-inapt-suffix", "inapt suffix", {"fg": null, "bg": null, "source": "default"}], ["transient-key", "key", {"fg": null, "bg": null, "source": "default"}], ["transient-key-exit", "key exit", {"fg": null, "bg": null, "source": "default"}], ["transient-key-noop", "key noop", {"fg": null, "bg": null, "source": "default"}], ["transient-key-recurse", "key recurse", {"fg": null, "bg": null, "source": "default"}], ["transient-key-return", "key return", {"fg": null, "bg": null, "source": "default"}], ["transient-key-stack", "key stack", {"fg": null, "bg": null, "source": "default"}], ["transient-key-stay", "key stay", {"fg": null, "bg": null, "source": "default"}], ["transient-mismatched-key", "mismatched key", {"fg": null, "bg": null, "source": "default"}], ["transient-nonstandard-key", "nonstandard key", {"fg": null, "bg": null, "source": "default"}], ["transient-unreachable", "unreachable", {"fg": null, "bg": null, "source": "default"}], ["transient-unreachable-key", "unreachable key", {"fg": null, "bg": null, "source": "default"}], ["transient-value", "value", {"fg": null, "bg": null, "source": "default"}]]}, "vertico": {"label": "vertico", "preview": "generic", "faces": [["vertico-current", "current", {"fg": null, "bg": null, "source": "default"}], ["vertico-group-separator", "group separator", {"fg": null, "bg": null, "source": "default"}], ["vertico-group-title", "group title", {"fg": null, "bg": null, "source": "default"}], ["vertico-multiline", "multiline", {"fg": null, "bg": null, "source": "default"}]]}, "web-mode": {"label": "web-mode", "preview": "generic", "faces": [["web-mode-annotation-face", "annotation", {"fg": null, "bg": null, "source": "default"}], ["web-mode-annotation-html-face", "annotation html", {"fg": null, "bg": null, "source": "default"}], ["web-mode-annotation-tag-face", "annotation tag", {"fg": null, "bg": null, "source": "default"}], ["web-mode-annotation-type-face", "annotation type", {"fg": null, "bg": null, "source": "default"}], ["web-mode-annotation-value-face", "annotation value", {"fg": null, "bg": null, "source": "default"}], ["web-mode-block-attr-name-face", "block attr name", {"fg": null, "bg": null, "source": "default"}], ["web-mode-block-attr-value-face", "block attr value", {"fg": null, "bg": null, "source": "default"}], ["web-mode-block-comment-face", "block comment", {"fg": null, "bg": null, "source": "default"}], ["web-mode-block-control-face", "block control", {"fg": null, "bg": null, "source": "default"}], ["web-mode-block-delimiter-face", "block delimiter", {"fg": null, "bg": null, "source": "default"}], ["web-mode-block-face", "block", {"fg": null, "bg": null, "source": "default"}], ["web-mode-block-string-face", "block string", {"fg": null, "bg": null, "source": "default"}], ["web-mode-bold-face", "bold", {"fg": null, "bg": null, "source": "default"}], ["web-mode-builtin-face", "builtin", {"fg": null, "bg": null, "source": "default"}], ["web-mode-comment-face", "comment", {"fg": null, "bg": null, "source": "default"}], ["web-mode-comment-keyword-face", "comment keyword", {"fg": null, "bg": null, "source": "default"}], ["web-mode-constant-face", "constant", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-at-rule-face", "css at rule", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-color-face", "css color", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-comment-face", "css comment", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-function-face", "css function", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-priority-face", "css priority", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-property-name-face", "css property name", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-pseudo-class-face", "css pseudo class", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-selector-class-face", "css selector class", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-selector-face", "css selector", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-selector-tag-face", "css selector tag", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-string-face", "css string", {"fg": null, "bg": null, "source": "default"}], ["web-mode-css-variable-face", "css variable", {"fg": null, "bg": null, "source": "default"}], ["web-mode-current-column-highlight-face", "current column highlight", {"fg": null, "bg": null, "source": "default"}], ["web-mode-current-element-highlight-face", "current element highlight", {"fg": null, "bg": null, "source": "default"}], ["web-mode-doctype-face", "doctype", {"fg": null, "bg": null, "source": "default"}], ["web-mode-error-face", "error", {"fg": null, "bg": null, "source": "default"}], ["web-mode-filter-face", "filter", {"fg": null, "bg": null, "source": "default"}], ["web-mode-folded-face", "folded", {"fg": null, "bg": null, "source": "default"}], ["web-mode-function-call-face", "function call", {"fg": null, "bg": null, "source": "default"}], ["web-mode-function-name-face", "function name", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-attr-custom-face", "html attr custom", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-attr-engine-face", "html attr engine", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-attr-equal-face", "html attr equal", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-attr-name-face", "html attr name", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-attr-value-face", "html attr value", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-entity-face", "html entity", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-tag-bracket-face", "html tag bracket", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-tag-custom-face", "html tag custom", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-tag-face", "html tag", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-tag-namespaced-face", "html tag namespaced", {"fg": null, "bg": null, "source": "default"}], ["web-mode-html-tag-unclosed-face", "html tag unclosed", {"fg": null, "bg": null, "source": "default"}], ["web-mode-inlay-face", "inlay", {"fg": null, "bg": null, "source": "default"}], ["web-mode-interpolate-color1-face", "interpolate color1", {"fg": null, "bg": null, "source": "default"}], ["web-mode-interpolate-color2-face", "interpolate color2", {"fg": null, "bg": null, "source": "default"}], ["web-mode-interpolate-color3-face", "interpolate color3", {"fg": null, "bg": null, "source": "default"}], ["web-mode-interpolate-color4-face", "interpolate color4", {"fg": null, "bg": null, "source": "default"}], ["web-mode-italic-face", "italic", {"fg": null, "bg": null, "source": "default"}], ["web-mode-javascript-comment-face", "javascript comment", {"fg": null, "bg": null, "source": "default"}], ["web-mode-javascript-string-face", "javascript string", {"fg": null, "bg": null, "source": "default"}], ["web-mode-json-comment-face", "json comment", {"fg": null, "bg": null, "source": "default"}], ["web-mode-json-context-face", "json context", {"fg": null, "bg": null, "source": "default"}], ["web-mode-json-key-face", "json key", {"fg": null, "bg": null, "source": "default"}], ["web-mode-json-string-face", "json string", {"fg": null, "bg": null, "source": "default"}], ["web-mode-jsx-depth-1-face", "jsx depth 1", {"fg": null, "bg": null, "source": "default"}], ["web-mode-jsx-depth-2-face", "jsx depth 2", {"fg": null, "bg": null, "source": "default"}], ["web-mode-jsx-depth-3-face", "jsx depth 3", {"fg": null, "bg": null, "source": "default"}], ["web-mode-jsx-depth-4-face", "jsx depth 4", {"fg": null, "bg": null, "source": "default"}], ["web-mode-jsx-depth-5-face", "jsx depth 5", {"fg": null, "bg": null, "source": "default"}], ["web-mode-keyword-face", "keyword", {"fg": null, "bg": null, "source": "default"}], ["web-mode-param-name-face", "param name", {"fg": null, "bg": null, "source": "default"}], ["web-mode-part-comment-face", "part comment", {"fg": null, "bg": null, "source": "default"}], ["web-mode-part-face", "part", {"fg": null, "bg": null, "source": "default"}], ["web-mode-part-string-face", "part string", {"fg": null, "bg": null, "source": "default"}], ["web-mode-preprocessor-face", "preprocessor", {"fg": null, "bg": null, "source": "default"}], ["web-mode-script-face", "script", {"fg": null, "bg": null, "source": "default"}], ["web-mode-sql-keyword-face", "sql keyword", {"fg": null, "bg": null, "source": "default"}], ["web-mode-string-face", "string", {"fg": null, "bg": null, "source": "default"}], ["web-mode-style-face", "style", {"fg": null, "bg": null, "source": "default"}], ["web-mode-symbol-face", "symbol", {"fg": null, "bg": null, "source": "default"}], ["web-mode-type-face", "type", {"fg": null, "bg": null, "source": "default"}], ["web-mode-underline-face", "underline", {"fg": null, "bg": null, "source": "default"}], ["web-mode-variable-name-face", "variable name", {"fg": null, "bg": null, "source": "default"}], ["web-mode-warning-face", "warning", {"fg": null, "bg": null, "source": "default"}], ["web-mode-whitespace-face", "whitespace", {"fg": null, "bg": null, "source": "default"}]]}, "yasnippet": {"label": "yasnippet", "preview": "generic", "faces": [["yas--field-debug-face", "yas field debug", {"fg": null, "bg": null, "source": "default"}], ["yas-field-highlight-face", "yas field highlight", {"fg": null, "bg": null, "source": "default"}]]}};
-let MAP={"kw": "#67809c", "bi": "#d7af5f", "pp": "#acb0b3", "fnd": "#d47c59", "fnc": "", "dec": "", "ty": "#a4ac64", "prop": "", "con": "#d7af5f", "num": "#d7af5f", "esc": "", "str": "#a4ac64", "re": "", "doc": "#969385", "cm": "#969385", "cmd": "#969385", "var": "#b2c3cc", "op": "", "punc": "", "p": "#f0fef0", "bg": "#000000"}, PALETTE=[["#f0fef0", "fg"], ["#000000", "bg"], ["#151311", "bg+0"], ["#252321", "bg+1"], ["#474544", "bg+2"], ["#58574e", "gray-2"], ["#6c6a60", "gray-1"], ["#969385", "gray"], ["#b4b1a2", "gray+1"], ["#d0cbc0", "gray+2"], ["#8a9496", "steel"], ["#acb0b3", "steel+1"], ["#c0c7ca", "steel+2"], ["#67809c", "blue"], ["#b2c3cc", "blue+1"], ["#d9e2ff", "blue+2"], ["#646d14", "green-2"], ["#869038", "green-1"], ["#a4ac64", "green"], ["#ccc768", "green+1"], ["#3f1c0f", "red-3"], ["#7c2a09", "red-2"], ["#a7502d", "red-1"], ["#d47c59", "red"], ["#edb08f", "red+1"], ["#edbca2", "red+2"], ["#875f00", "yellow-2"], ["#8e784c", "yellow-1"], ["#d7af5f", "yellow"], ["#ffd75f", "yellow+1"], ["#f9ee98", "yellow+2"], ["#ff2a00", "intense-red"]], BOLD={"kw": true, "bi": true, "pp": true, "fnd": true, "fnc": false, "dec": false, "ty": true, "prop": false, "con": true, "num": false, "esc": false, "str": false, "re": false, "doc": false, "cm": false, "cmd": false, "var": false, "op": false, "punc": false, "p": false}, ITALIC={"pp": true, "cm": true, "var": true, "cmd": true}, UIMAP={"cursor": {"fg": null, "bg": "#f0fef0"}, "region": {"fg": null, "bg": "#474544"}, "hl-line": {"fg": null, "bg": "#151311"}, "highlight": {"fg": null, "bg": "#646d14"}, "mode-line": {"fg": "#000000", "bg": "#67809c", "box": {"style": "released", "width": 1, "color": null}}, "mode-line-inactive": {"fg": "#67809c", "bg": "#000000", "box": {"style": "released", "width": 1, "color": null}}, "fringe": {"fg": "#58574e", "bg": "#151311"}, "line-number": {"fg": "#58574e", "bg": null}, "line-number-current-line": {"fg": "#d7af5f", "bg": null}, "minibuffer-prompt": {"fg": "#d7af5f", "bg": null}, "isearch": {"fg": null, "bg": null}, "lazy-highlight": {"fg": null, "bg": "#8e784c", "underline": true}, "isearch-fail": {"fg": "#f0fef0", "bg": "#a7502d"}, "show-paren-match": {"fg": "#000000", "bg": "#a4ac64", "underline": true}, "show-paren-mismatch": {"fg": "#f0fef0", "bg": "#a7502d"}, "link": {"fg": "#b2c3cc", "bg": null, "underline": true}, "error": {"fg": "#d47c59", "bg": null, "bold": true}, "warning": {"fg": "#ffd75f", "bg": null, "bold": true}, "success": {"fg": "#a4ac64", "bg": null, "bold": true}, "vertical-border": {"fg": "#58574e", "bg": null}};
-let LOCKED=new Set(["kw", "bg", "p", "bi", "pp", "fnd", "ty", "con", "str", "var", "cm", "doc", "cmd", "num", "ui:mode-line", "ui:mode-line-inactive", "ui:link", "ui:hl-line", "ui:warning", "ui:success", "ui:error", "ui:line-number-current-line", "ui:minibuffer-prompt", "ui:show-paren-mismatch", "ui:show-paren-match", "ui:vertical-border", "ui:line-number", "ui:fringe", "ui:region"]); // syntax categories whose element↔color is decided (dropdown disabled, skipped by clear-unlocked)
+const SAMPLES={"Elisp": [[["cmd", ";;"], ["cm", " cache.el"]], [["punc", "("], ["kw", "require"], ["p", " "], ["con", "'cl-lib"], ["punc", ")"]], [], [["punc", "("], ["kw", "defvar"], ["p", " "], ["var", "cache--tbl"], ["p", " "], ["punc", "("], ["fnc", "make-hash-table"], ["p", " "], ["con", ":test"], ["p", " "], ["con", "'equal"], ["punc", "))"]], [["p", " "], ["doc", "\"Memo table.\")"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-get"], ["p", " "], ["punc", "("], ["var", "key"], ["punc", ")"]], [["p", " "], ["doc", "\"Return cached value for KEY.\""]], [["p", " "], ["punc", "("], ["kw", "or"], ["p", " "], ["punc", "("], ["bi", "gethash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "v"], ["p", " "], ["punc", "("], ["fnc", "compute"], ["p", " "], ["var", "key"], ["p", " "], ["num", "42"], ["punc", "))) "]], [["p", " "], ["punc", "("], ["fnc", "puthash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "v"], ["p", " "], ["var", "cache--tbl"], ["punc", ") "], ["var", "v"], ["punc", "))))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-clear"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Empty the memo table.\""]], [["p", " "], ["punc", "("], ["kw", "interactive"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "clrhash"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "message"], ["p", " "], ["str", "\"cleared"], ["esc", "\\n"], ["str", "\""], ["punc", "))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-keys"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Return all keys.\""]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "acc"], ["p", " "], ["con", "nil"], ["punc", "))"]], [["p", " "], ["punc", "("], ["fnc", "maphash"], ["p", " "], ["punc", "("], ["kw", "lambda"], ["p", " "], ["punc", "("], ["var", "k"], ["p", " "], ["var", "_v"], ["punc", ")"], ["p", " "], ["punc", "("], ["fnc", "push"], ["p", " "], ["var", "k"], ["p", " "], ["var", "acc"], ["punc", "))"]], [["p", " "], ["var", "cache--tbl"], ["punc", ")"], ["p", " "], ["var", "acc"], ["punc", "))"]], [], [["punc", "("], ["kw", "provide"], ["p", " "], ["con", "'cache"], ["punc", ")"]]], "Go": [[["cmd", "//"], ["cm", " queue.go"]], [["kw", "package"], ["p", " "], ["var", "main"]], [], [["kw", "import"], ["p", " "], ["str", "\"fmt\""]], [], [["kw", "const"], ["p", " "], ["con", "MaxItems"], ["p", " "], ["op", "="], ["p", " "], ["num", "100"]], [], [["kw", "type"], ["p", " "], ["ty", "Order"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "ID"], ["p", " "], ["ty", "int"]], [["p", " "], ["prop", "Name"], ["p", " "], ["ty", "string"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["punc", "("], ["var", "q"], ["p", " "], ["op", "*"], ["ty", "Queue"], ["punc", ")"], ["p", " "], ["fnd", "Push"], ["punc", "("], ["var", "o"], ["p", " "], ["op", "*"], ["ty", "Order"], ["punc", ")"], ["p", " "], ["ty", "error"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " reject nil"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "nil"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "return"], ["p", " "], ["fnc", "fmt.Errorf"], ["punc", "("], ["str", "\"nil"], ["esc", "\\n"], ["str", "\""], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["p", " "], ["var", "q"], ["op", "."], ["prop", "items"], ["p", " "], ["op", "="], ["p", " "], ["bi", "append"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "items"], ["punc", ","], ["p", " "], ["var", "o"], ["punc", ")"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "nil"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["fnc", "fmt.Println"], ["punc", "("], ["op", "&"], ["ty", "Queue"], ["punc", "{}"], ["punc", ")"]], [["punc", "}"]]], "Python": [[["cmd", "#"], ["cm", " theme.py"]], [["kw", "from"], ["p", " "], ["var", "dataclasses"], ["p", " "], ["kw", "import"], ["p", " "], ["var", "dataclass"], ["punc", ","], ["p", " "], ["var", "field"]], [], [["con", "DEFAULT_PORT"], ["op", ":"], ["p", " "], ["ty", "int"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"]], [["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["var", "re"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "r\"#[0-9a-f]{6}\""], ["punc", ")"]], [], [["dec", "@dataclass"]], [["kw", "class"], ["p", " "], ["ty", "Theme"], ["op", ":"]], [["p", " "], ["doc", "\"\"\"A color theme.\"\"\""]], [["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""]], [["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["ty", "dict"], ["p", " "], ["op", "="], ["p", " "], ["fnc", "field"], ["punc", "("], ["prop", "default_factory"], ["op", "="], ["ty", "dict"], ["punc", ")"]], [], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "|"], ["p", " "], ["con", "None"], ["op", ":"]], [["p", " "], ["cmd", "#"], ["cm", " fallback to none"]], [["p", " "], ["var", "v"], ["p", " "], ["op", "="], ["p", " "], ["var", "self"], ["op", "."], ["prop", "colors"], ["op", "."], ["fnc", "get"], ["punc", "("], ["var", "key"], ["punc", ","], ["p", " "], ["str", "\""], ["esc", "\\t"], ["str", "none\""], ["punc", ")"]], [["p", " "], ["kw", "if"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "v"], ["punc", ")"], ["p", " "], ["op", "=="], ["p", " "], ["num", "0"], ["op", ":"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "None"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "v"]], [], [["p", " "], ["dec", "@property"]], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "size"], ["punc", "("], ["var", "self"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "int"], ["op", ":"]], [["p", " "], ["kw", "return"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "self"], ["op", "."], ["prop", "colors"], ["punc", ")"]], [], [["var", "theme"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["punc", "("], ["str", "\"dupre\""], ["punc", ")"]], [["fnc", "print"], ["punc", "("], ["var", "theme"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"]]], "TypeScript": [[["cmd", "//"], ["cm", " orders.ts"]], [["kw", "import"], ["p", " "], ["punc", "{"], ["p", " "], ["ty", "Order"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "from"], ["p", " "], ["str", "\"./types\""]], [], [["kw", "export"], ["p", " "], ["kw", "interface"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "max"], ["op", ":"], ["p", " "], ["ty", "number"], ["punc", ";"]], [["p", " "], ["prop", "items"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", "[];"]], [["punc", "}"]], [], [["dec", "@Injectable"], ["punc", "()"]], [["kw", "export"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "OrderQueue"], ["p", " "], ["kw", "implements"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["prop", "re"], ["p", " "], ["op", "="], ["p", " "], ["re", "/^#[0-9a-f]{6}$/i"], ["punc", ";"]], [], [["p", " "], ["fnd", "push"], ["punc", "("], ["var", "o"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "boolean"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "==="], ["p", " "], ["con", "null"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "false"], ["punc", ";"]], [["p", " "], ["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["str", "`id "], ["punc", "${"], ["var", "o"], ["op", "."], ["prop", "id"], ["punc", "}"], ["esc", "\\n"], ["str", "`"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "true"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "const"], ["p", " "], ["con", "LIMIT"], ["op", ":"], ["p", " "], ["ty", "number"], ["p", " "], ["op", "="], ["p", " "], ["num", "50"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "q"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "OrderQueue"], ["punc", "()"], ["punc", ";"]], [["var", "q"], ["op", "."], ["fnd", "push"], ["punc", "("], ["punc", "{"], ["p", " "], ["prop", "id"], ["op", ":"], ["p", " "], ["num", "1"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "as"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["punc", ";"]], [["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "max"], ["punc", ")"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "cap"], ["p", " "], ["op", "="], ["p", " "], ["var", "Math"], ["op", "."], ["bi", "max"], ["punc", "("], ["con", "LIMIT"], ["punc", ","], ["p", " "], ["num", "0"], ["punc", ")"], ["punc", ";"]]], "Java": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["kw", "package"], ["p", " "], ["var", "com"], ["op", "."], ["var", "dupre"], ["punc", ";"]], [["kw", "import"], ["p", " "], ["var", "java"], ["op", "."], ["var", "util"], ["op", "."], ["var", "regex"], ["op", "."], ["ty", "Pattern"], ["punc", ";"]], [], [["dec", "@Deprecated"]], [["kw", "public"], ["p", " "], ["kw", "final"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "String"], ["p", " "], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "Pattern"], ["p", " "], ["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Pattern"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "\"#[0-9a-f]{6}\""], ["punc", ")"], ["punc", ";"]], [], [["p", " "], ["dec", "@Override"]], [["p", " "], ["kw", "public"], ["p", " "], ["ty", "String"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["ty", "String"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " fall back to null"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "isEmpty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "null"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "key"], ["op", "."], ["fnc", "strip"], ["punc", "("], ["punc", ")"], ["op", "+"], ["str", "\""], ["esc", "\\t"], ["str", "\""], ["punc", ";"]], [["p", " "], ["punc", "}"]], [], [["p", " "], ["kw", "public"], ["p", " "], ["kw", "static"], ["p", " "], ["ty", "void"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "String"], ["punc", "[]"], ["p", " "], ["var", "args"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "var"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "Theme"], ["punc", "()"], ["punc", ";"]], [["p", " "], ["ty", "System"], ["op", "."], ["prop", "out"], ["op", "."], ["fnc", "println"], ["punc", "("], ["var", "t"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]]], "C": [[["cmd", "/**"], ["doc", " Order queue. */"]], [["pp", "#include"], ["p", " "], ["str", "<stdio.h>"]], [["pp", "#include"], ["p", " "], ["str", "<stdlib.h>"]], [["pp", "#define"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["num", "8080"]], [], [["kw", "typedef"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "int"], ["p", " "], ["prop", "id"], ["punc", ";"]], [["p", " "], ["kw", "const"], ["p", " "], ["ty", "char"], ["p", " "], ["op", "*"], ["prop", "name"], ["punc", ";"]], [["punc", "}"], ["p", " "], ["ty", "Order"], ["punc", ";"]], [], [["cmd", "//"], ["cm", " returns -1 on null input"]], [["ty", "int"], ["p", " "], ["fnd", "push"], ["punc", "("], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "o"], ["punc", ")"], ["p", " "], ["dec", "__attribute__"], ["punc", "(("], ["dec", "nonnull"], ["punc", "))"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "NULL"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["num", "-1"], ["punc", ";"]], [["p", " "], ["fnc", "printf"], ["punc", "("], ["str", "\"id=%d"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "o"], ["op", "->"], ["prop", "id"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "void"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "Order"], ["p", " "], ["var", "o"], ["p", " "], ["op", "="], ["p", " "], ["punc", "{"], ["p", " "], ["op", "."], ["prop", "id"], ["p", " "], ["op", "="], ["p", " "], ["num", "1"], ["punc", ","], ["p", " "], ["op", "."], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "p2"], ["p", " "], ["op", "="], ["p", " "], ["bi", "malloc"], ["punc", "("], ["bi", "sizeof"], ["punc", "("], ["ty", "Order"], ["punc", "))"], ["punc", ";"]], [["p", " "], ["fnc", "push"], ["punc", "("], ["op", "&"], ["var", "o"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["bi", "free"], ["punc", "("], ["var", "p2"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "C++": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["pp", "#include"], ["p", " "], ["str", "<string>"]], [["pp", "#include"], ["p", " "], ["str", "<regex>"]], [["pp", "#pragma"], ["p", " "], ["pp", "once"]], [], [["kw", "namespace"], ["p", " "], ["var", "dupre"], ["p", " "], ["punc", "{"]], [], [["kw", "template"], ["op", "<"], ["kw", "typename"], ["p", " "], ["ty", "T"], ["op", ">"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["kw", "public"], ["op", ":"]], [["p", " "], ["kw", "static"], ["p", " "], ["kw", "constexpr"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX"], ["p", " "], ["op", "="], ["p", " "], ["num", "0x20"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["p", " "], ["prop", "name_"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [], [["p", " "], ["dec", "[[nodiscard]]"], ["p", " "], ["ty", "T"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["kw", "const"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["op", "&"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["kw", "const"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " validate against a hex pattern"]], [["p", " "], ["kw", "static"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "regex"], ["p", " "], ["var", "re"], ["punc", "("], ["re", "R\"(#[0-9a-f]{6})\""], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "empty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "nullptr"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["ty", "T"], ["punc", "{"], ["var", "key"], ["punc", "}"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"], ["punc", ";"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "auto"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "{}"], ["punc", ";"]], [["p", " "], ["bi", "static_cast"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "("], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "size"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["fnc", "printf"], ["punc", "("], ["str", "\"%s"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "c_str"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "Rust": [[["cmd", "//"], ["cm", " theme.rs"]], [["dec", "#![allow(dead_code)]"]], [["kw", "use"], ["p", " "], ["var", "std"], ["op", "::"], ["var", "fmt"], ["punc", ";"]], [], [["dec", "#[derive"], ["punc", "("], ["dec", "Debug"], ["punc", ","], ["p", " "], ["dec", "Clone"], ["punc", ")]"]], [["kw", "pub"], ["p", " "], ["kw", "trait"], ["p", " "], ["ty", "Theme"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["con", "NAME"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'static"], ["p", " "], ["ty", "str"], ["punc", ";"]], [["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Option"], ["op", "<"], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["op", ">"], ["punc", ";"]], [["punc", "}"]], [], [["kw", "pub"], ["p", " "], ["kw", "struct"], ["p", " "], ["ty", "Palette"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "pub"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ","]], [["p", " "], ["kw", "pub"], ["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["ty", "Vec"], ["op", "<"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ","], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["op", ">"], ["punc", ","]], [["punc", "}"]], [], [["kw", "impl"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["ty", "Theme"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["kw", "for"], ["p", " "], ["ty", "Palette"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["con", "NAME"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'static"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Option"], ["op", "<"], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "key"], ["op", "."], ["fnc", "is_empty"], ["punc", "()"], ["p", " "], ["punc", "{"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "None"], ["punc", ";"], ["p", " "], ["punc", "}"]], [["p", " "], ["var", "self"], ["op", "."], ["prop", "colors"], ["op", "."], ["fnc", "iter"], ["punc", "()"], ["op", "."], ["fnc", "find"], ["punc", "("], ["op", "|"], ["punc", "("], ["var", "k"], ["punc", ","], ["p", " "], ["var", "_"], ["punc", ")"], ["op", "|"], ["p", " "], ["op", "*"], ["var", "k"], ["p", " "], ["op", "=="], ["p", " "], ["var", "key"], ["punc", ")"], ["op", "."], ["fnc", "map"], ["punc", "("], ["op", "|"], ["punc", "("], ["var", "_"], ["punc", ","], ["p", " "], ["var", "v"], ["punc", ")"], ["op", "|"], ["p", " "], ["op", "*"], ["var", "v"], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "fn"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "let"], ["p", " "], ["var", "palette"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Palette"], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["str", "\"dupre\""], ["punc", ","], ["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["bi", "vec!"], ["punc", "["], ["punc", "("], ["str", "\"bg\""], ["punc", ","], ["p", " "], ["str", "\"#0d0b0a\""], ["punc", ")"], ["punc", "]"], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["bi", "println!"], ["punc", "("], ["str", "\"{:?}\""], ["punc", ","], ["p", " "], ["var", "palette"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["punc", "}"]]], "Zig": [[["cmd", "//"], ["cm", " theme.zig"]], [["kw", "const"], ["p", " "], ["var", "std"], ["p", " "], ["op", "="], ["p", " "], ["bi", "@import"], ["punc", "("], ["str", "\"std\""], ["punc", ")"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["ty", "Allocator"], ["p", " "], ["op", "="], ["p", " "], ["var", "std"], ["op", "."], ["var", "mem"], ["op", "."], ["ty", "Allocator"], ["punc", ";"]], [], [["kw", "pub"], ["p", " "], ["kw", "const"], ["p", " "], ["ty", "Theme"], ["p", " "], ["op", "="], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ","]], [["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "Color"], ["punc", ","]], [], [["p", " "], ["kw", "pub"], ["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "init"], ["punc", "("], ["var", "alloc"], ["op", ":"], ["p", " "], ["op", "*"], ["ty", "Allocator"], ["punc", ")"], ["p", " "], ["op", "!"], ["bi", "@This"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["var", "colors"], ["p", " "], ["op", "="], ["p", " "], ["kw", "try"], ["p", " "], ["var", "alloc"], ["op", "."], ["fnc", "alloc"], ["punc", "("], ["ty", "Color"], ["punc", ","], ["p", " "], ["num", "2"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["var", "colors"], ["punc", "["], ["num", "0"], ["punc", "]"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Color"], ["punc", "{"], ["p", " "], ["prop", ".name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"bg\""], ["punc", ","], ["p", " "], ["prop", ".hex"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"#0d0b0a\""], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["bi", "@This"], ["punc", "()"], ["punc", "{"], ["p", " "], ["prop", ".name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ","], ["p", " "], ["prop", ".colors"], ["p", " "], ["op", "="], ["p", " "], ["var", "colors"], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"], ["punc", ";"]], [], [["kw", "const"], ["p", " "], ["ty", "Color"], ["p", " "], ["op", "="], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ","], ["p", " "], ["prop", "hex"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["p", " "], ["punc", "}"], ["punc", ";"]], [], [["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["var", "theme"], ["op", ":"], ["p", " "], ["ty", "Theme"], ["punc", ","], ["p", " "], ["kw", "comptime"], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", ":"], ["num", "0"], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ")"], ["p", " "], ["op", "!"], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "inline"], ["p", " "], ["kw", "for"], ["p", " "], ["punc", "("], ["var", "theme"], ["op", "."], ["prop", "colors"], ["punc", ")"], ["p", " "], ["op", "|"], ["var", "color"], ["op", "|"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "std"], ["op", "."], ["var", "mem"], ["op", "."], ["fnc", "eql"], ["punc", "("], ["ty", "u8"], ["punc", ","], ["p", " "], ["var", "color"], ["op", "."], ["prop", "name"], ["punc", ","], ["p", " "], ["var", "key"], ["punc", ")"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["var", "color"], ["op", "."], ["prop", "hex"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "error.MissingColor"], ["punc", ";"]], [["punc", "}"]], [], [["kw", "test"], ["p", " "], ["str", "\"resolve bg\""], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "var"], ["p", " "], ["var", "arena"], ["p", " "], ["op", "="], ["p", " "], ["var", "std"], ["op", "."], ["var", "heap"], ["op", "."], ["ty", "ArenaAllocator"], ["op", "."], ["fnc", "init"], ["punc", "("], ["var", "std"], ["op", "."], ["var", "testing"], ["op", "."], ["prop", "allocator"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "defer"], ["p", " "], ["var", "arena"], ["op", "."], ["fnc", "deinit"], ["punc", "()"], ["punc", ";"]], [["p", " "], ["kw", "try"], ["p", " "], ["var", "std"], ["op", "."], ["var", "testing"], ["op", "."], ["fnc", "expectEqualStrings"], ["punc", "("], ["str", "\"#0d0b0a\""], ["punc", ","], ["p", " "], ["kw", "try"], ["p", " "], ["fnc", "resolve"], ["punc", "("], ["kw", "try"], ["p", " "], ["ty", "Theme"], ["op", "."], ["fnc", "init"], ["punc", "("], ["op", "&"], ["var", "arena"], ["op", "."], ["prop", "allocator"], ["punc", ")"], ["punc", ","], ["p", " "], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["punc", "}"]]], "Shell": [[["cmd", "#!"], ["cm", "/bin/bash"]], [["cmd", "#"], ["cm", " deploy.sh"]], [["bi", "set"], ["p", " "], ["op", "-"], ["var", "euo"], ["p", " "], ["var", "pipefail"]], [], [["var", "PORT"], ["op", "="], ["num", "8080"]], [["var", "NAME"], ["op", "="], ["str", "\"dupre\""]], [], [["fnd", "deploy"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "local"], ["p", " "], ["var", "target"], ["op", "="], ["str", "\"$1\""]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "[["], ["p", " "], ["op", "-z"], ["p", " "], ["str", "\"$target\""], ["p", " "], ["punc", "]]"], ["punc", ";"], ["p", " "], ["kw", "then"]], [["p", " "], ["bi", "echo"], ["p", " "], ["str", "\"no target\""]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "fi"]], [["p", " "], ["fnc", "rsync"], ["p", " "], ["op", "-az"], ["p", " "], ["str", "\"$NAME\""], ["p", " "], ["str", "\"$target\""]], [["punc", "}"]], [], [["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "for"], ["p", " "], ["var", "host"], ["p", " "], ["kw", "in"], ["p", " "], ["str", "\"$@\""], ["punc", ";"], ["p", " "], ["kw", "do"]], [["p", " "], ["fnc", "deploy"], ["p", " "], ["str", "\"$host\""], ["p", " "], ["op", "||"], ["p", " "], ["bi", "exit"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "done"]], [["p", " "], ["bi", "echo"], ["p", " "], ["op", "-e"], ["p", " "], ["str", "\"all done"], ["esc", "\\n"], ["str", "\""]], [["punc", "}"]], [], [["fnc", "main"], ["p", " "], ["str", "\"$@\""]]]}, CATS=[["bg", "bg (ground)", "Aa Bb 123"], ["p", "fg", "other / whitespace"], ["kw", "keyword", "class def if return"], ["bi", "builtin", "len echo printf"], ["pp", "preprocessor", "#include #define"], ["fnd", "function \u00b7 def", "resolve push"], ["fnc", "function \u00b7 call", "printf rsync get"], ["dec", "decorator", "@dataclass"], ["ty", "type / class", "int str Order Queue"], ["prop", "property / field", "id name items"], ["con", "constant", "None nil NULL true"], ["num", "number", "8080 100 -1"], ["str", "string", "\"dupre\" \"fmt\""], ["esc", "escape", "\\n \\t"], ["re", "regexp", "/^#[0-9a-f]+/"], ["doc", "docstring", "\"\"\"...\"\"\""], ["cm", "comment", "# reject nil"], ["cmd", "comment delim", "# // ;;"], ["var", "variable / use", "value key self"], ["op", "operator", ": = -> =="], ["punc", "punctuation", "{ } ( ) ;"]], UI_FACES=[["cursor", "cursor", "Aa|"], ["region", "region (selection)", "selected text"], ["hl-line", "hl-line (current line)", "current line"], ["highlight", "highlight", "hover"], ["mode-line", "mode-line", "status active"], ["mode-line-inactive", "mode-line-inactive", "status idle"], ["fringe", "fringe", "| |"], ["line-number", "line-number", " 42"], ["line-number-current-line", "line-number-current-line", "> 42"], ["minibuffer-prompt", "minibuffer-prompt", "M-x "], ["isearch", "isearch (match)", "match"], ["lazy-highlight", "lazy-highlight", "other match"], ["isearch-fail", "isearch-fail", "no match"], ["show-paren-match", "show-paren-match", "( )"], ["show-paren-mismatch", "show-paren-mismatch", ") ("], ["link", "link", "https://"], ["error", "error", "error!"], ["warning", "warning", "warning"], ["success", "success", "ok"], ["vertical-border", "vertical-border", "|"]], APPS={"org-mode": {"label": "org-mode", "preview": "org", "faces": [["org-document-title", "document title", {}], ["org-document-info", "document info", {}], ["org-document-info-keyword", "document info keyword", {}], ["org-level-1", "level 1", {}], ["org-level-2", "level 2", {}], ["org-level-3", "level 3", {}], ["org-level-4", "level 4", {}], ["org-level-5", "level 5", {}], ["org-level-6", "level 6", {}], ["org-level-7", "level 7", {}], ["org-level-8", "level 8", {}], ["org-headline-todo", "headline todo", {}], ["org-headline-done", "headline done", {}], ["org-todo", "todo", {}], ["org-done", "done", {}], ["org-priority", "priority", {}], ["org-tag", "tag", {}], ["org-tag-group", "tag group", {}], ["org-special-keyword", "special keyword", {}], ["org-drawer", "drawer", {}], ["org-property-value", "property value", {}], ["org-checkbox", "checkbox", {}], ["org-checkbox-statistics-todo", "checkbox statistics todo", {}], ["org-checkbox-statistics-done", "checkbox statistics done", {}], ["org-warning", "warning", {}], ["org-link", "link", {}], ["org-footnote", "footnote", {}], ["org-date", "date", {}], ["org-sexp-date", "sexp date", {}], ["org-date-selected", "date selected", {}], ["org-target", "target", {}], ["org-macro", "macro", {}], ["org-cite", "cite", {}], ["org-cite-key", "cite key", {}], ["org-block", "block", {}], ["org-block-begin-line", "block begin line", {}], ["org-block-end-line", "block end line", {}], ["org-code", "code", {}], ["org-verbatim", "verbatim", {}], ["org-inline-src-block", "inline src block", {}], ["org-quote", "quote", {}], ["org-verse", "verse", {}], ["org-latex-and-related", "latex and related", {}], ["org-table", "table", {}], ["org-table-header", "table header", {}], ["org-table-row", "table row", {}], ["org-formula", "formula", {}], ["org-column", "column", {}], ["org-column-title", "column title", {}], ["org-list-dt", "list dt", {}], ["org-meta-line", "meta line", {}], ["org-ellipsis", "ellipsis", {}], ["org-hide", "hide", {}], ["org-indent", "indent", {}], ["org-archived", "archived", {}], ["org-default", "default", {}], ["org-dispatcher-highlight", "dispatcher highlight", {}], ["org-agenda-structure", "agenda structure", {}], ["org-agenda-structure-secondary", "agenda structure secondary", {}], ["org-agenda-structure-filter", "agenda structure filter", {}], ["org-agenda-date", "agenda date", {}], ["org-agenda-date-today", "agenda date today", {}], ["org-agenda-date-weekend", "agenda date weekend", {}], ["org-agenda-date-weekend-today", "agenda date weekend today", {}], ["org-agenda-current-time", "agenda current time", {}], ["org-agenda-done", "agenda done", {}], ["org-agenda-dimmed-todo-face", "agenda dimmed todo", {}], ["org-agenda-calendar-event", "agenda calendar event", {}], ["org-agenda-calendar-sexp", "agenda calendar sexp", {}], ["org-agenda-calendar-daterange", "agenda calendar daterange", {}], ["org-agenda-diary", "agenda diary", {}], ["org-agenda-clocking", "agenda clocking", {}], ["org-agenda-column-dateline", "agenda column dateline", {}], ["org-agenda-restriction-lock", "agenda restriction lock", {}], ["org-agenda-filter-category", "agenda filter category", {}], ["org-agenda-filter-effort", "agenda filter effort", {}], ["org-agenda-filter-regexp", "agenda filter regexp", {}], ["org-agenda-filter-tags", "agenda filter tags", {}], ["org-scheduled", "scheduled", {}], ["org-scheduled-today", "scheduled today", {}], ["org-scheduled-previously", "scheduled previously", {}], ["org-upcoming-deadline", "upcoming deadline", {}], ["org-upcoming-distant-deadline", "upcoming distant deadline", {}], ["org-imminent-deadline", "imminent deadline", {}], ["org-time-grid", "time grid", {}], ["org-clock-overlay", "clock overlay", {}], ["org-mode-line-clock", "mode line clock", {}], ["org-mode-line-clock-overrun", "mode line clock overrun", {}]]}, "magit": {"label": "magit", "preview": "magit", "faces": [["magit-section-heading", "section heading", {}], ["magit-section-secondary-heading", "section secondary heading", {}], ["magit-section-heading-selection", "section heading selection", {}], ["magit-section-highlight", "section highlight", {}], ["magit-section-child-count", "section child count", {}], ["magit-diff-added", "diff added", {}], ["magit-diff-added-highlight", "diff added highlight", {}], ["magit-diff-removed", "diff removed", {}], ["magit-diff-removed-highlight", "diff removed highlight", {}], ["magit-diff-context", "diff context", {}], ["magit-diff-context-highlight", "diff context highlight", {}], ["magit-diff-file-heading", "diff file heading", {}], ["magit-diff-file-heading-highlight", "diff file heading highlight", {}], ["magit-diff-file-heading-selection", "diff file heading selection", {}], ["magit-diff-hunk-heading", "diff hunk heading", {}], ["magit-diff-hunk-heading-highlight", "diff hunk heading highlight", {}], ["magit-diff-hunk-heading-selection", "diff hunk heading selection", {}], ["magit-diff-hunk-region", "diff hunk region", {}], ["magit-diff-lines-heading", "diff lines heading", {}], ["magit-diff-lines-boundary", "diff lines boundary", {}], ["magit-diff-base", "diff base", {}], ["magit-diff-base-highlight", "diff base highlight", {}], ["magit-diff-our", "diff our", {}], ["magit-diff-our-highlight", "diff our highlight", {}], ["magit-diff-their", "diff their", {}], ["magit-diff-their-highlight", "diff their highlight", {}], ["magit-diff-conflict-heading", "diff conflict heading", {}], ["magit-diff-conflict-heading-highlight", "diff conflict heading highlight", {}], ["magit-diff-revision-summary", "diff revision summary", {}], ["magit-diff-revision-summary-highlight", "diff revision summary highlight", {}], ["magit-diff-whitespace-warning", "diff whitespace warning", {}], ["magit-diffstat-added", "diffstat added", {}], ["magit-diffstat-removed", "diffstat removed", {}], ["magit-branch-current", "branch current", {}], ["magit-branch-local", "branch local", {}], ["magit-branch-remote", "branch remote", {}], ["magit-branch-remote-head", "branch remote head", {}], ["magit-branch-upstream", "branch upstream", {}], ["magit-branch-warning", "branch warning", {}], ["magit-head", "head", {}], ["magit-tag", "tag", {}], ["magit-hash", "hash", {}], ["magit-filename", "filename", {}], ["magit-dimmed", "dimmed", {}], ["magit-keyword", "keyword", {}], ["magit-keyword-squash", "keyword squash", {}], ["magit-refname", "refname", {}], ["magit-refname-stash", "refname stash", {}], ["magit-refname-wip", "refname wip", {}], ["magit-refname-pullreq", "refname pullreq", {}], ["magit-log-author", "log author", {}], ["magit-log-date", "log date", {}], ["magit-log-graph", "log graph", {}], ["magit-header-line", "header line", {}], ["magit-header-line-key", "header line key", {}], ["magit-header-line-log-select", "header line log select", {}], ["magit-process-ok", "process ok", {}], ["magit-process-ng", "process ng", {}], ["magit-mode-line-process", "mode line process", {}], ["magit-mode-line-process-error", "mode line process error", {}], ["magit-bisect-good", "bisect good", {}], ["magit-bisect-bad", "bisect bad", {}], ["magit-bisect-skip", "bisect skip", {}], ["magit-blame-heading", "blame heading", {}], ["magit-blame-highlight", "blame highlight", {}], ["magit-blame-hash", "blame hash", {}], ["magit-blame-name", "blame name", {}], ["magit-blame-date", "blame date", {}], ["magit-blame-summary", "blame summary", {}], ["magit-blame-dimmed", "blame dimmed", {}], ["magit-blame-margin", "blame margin", {}], ["magit-cherry-equivalent", "cherry equivalent", {}], ["magit-cherry-unmatched", "cherry unmatched", {}], ["magit-signature-good", "signature good", {}], ["magit-signature-bad", "signature bad", {}], ["magit-signature-untrusted", "signature untrusted", {}], ["magit-signature-expired", "signature expired", {}], ["magit-signature-expired-key", "signature expired key", {}], ["magit-signature-revoked", "signature revoked", {}], ["magit-signature-error", "signature error", {}], ["magit-reflog-commit", "reflog commit", {}], ["magit-reflog-amend", "reflog amend", {}], ["magit-reflog-merge", "reflog merge", {}], ["magit-reflog-checkout", "reflog checkout", {}], ["magit-reflog-reset", "reflog reset", {}], ["magit-reflog-rebase", "reflog rebase", {}], ["magit-reflog-cherry-pick", "reflog cherry pick", {}], ["magit-reflog-remote", "reflog remote", {}], ["magit-reflog-other", "reflog other", {}], ["magit-sequence-pick", "sequence pick", {}], ["magit-sequence-stop", "sequence stop", {}], ["magit-sequence-part", "sequence part", {}], ["magit-sequence-head", "sequence head", {}], ["magit-sequence-drop", "sequence drop", {}], ["magit-sequence-done", "sequence done", {}], ["magit-sequence-onto", "sequence onto", {}], ["magit-sequence-exec", "sequence exec", {}], ["magit-left-margin", "left margin", {}], ["git-commit-comment-action", "git commit comment action", {}], ["git-commit-comment-branch-local", "git commit comment branch local", {}], ["git-commit-comment-branch-remote", "git commit comment branch remote", {}], ["git-commit-comment-detached", "git commit comment detached", {}], ["git-commit-comment-file", "git commit comment file", {}], ["git-commit-comment-heading", "git commit comment heading", {}], ["git-commit-keyword", "git commit keyword", {}], ["git-commit-nonempty-second-line", "git commit nonempty second line", {}], ["git-commit-overlong-summary", "git commit overlong summary", {}], ["git-commit-summary", "git commit summary", {}], ["git-commit-trailer-token", "git commit trailer token", {}], ["git-commit-trailer-value", "git commit trailer value", {}]]}, "elfeed": {"label": "elfeed", "preview": "elfeed", "faces": [["elfeed-search-date-face", "search date", {"fg": "#aaa"}], ["elfeed-search-title-face", "search title", {"fg": "#000"}], ["elfeed-search-unread-title-face", "search unread title", {"bold": true}], ["elfeed-search-feed-face", "search feed", {"fg": "#aa0"}], ["elfeed-search-tag-face", "search tag", {"fg": "#070"}], ["elfeed-search-unread-count-face", "search unread count", {"fg": "#000"}], ["elfeed-search-filter-face", "search filter", {"inherit": "mode-line-buffer-id"}], ["elfeed-search-last-update-face", "search last update", {}], ["elfeed-log-date-face", "log date", {"inherit": "font-lock-type-face"}], ["elfeed-log-error-level-face", "log error level", {"fg": "#ff0000"}], ["elfeed-log-warn-level-face", "log warn level", {"fg": "#daa520"}], ["elfeed-log-info-level-face", "log info level", {"fg": "#00bfff"}], ["elfeed-log-debug-level-face", "log debug level", {"fg": "#ee00ee"}]]}, "mu4e": {"label": "mu4e", "preview": "mu4e", "faces": [["mu4e-title-face", "title", {}], ["mu4e-context-face", "context", {}], ["mu4e-modeline-face", "modeline", {}], ["mu4e-ok-face", "ok", {}], ["mu4e-warning-face", "warning", {}], ["mu4e-header-title-face", "header title", {}], ["mu4e-header-key-face", "header key", {}], ["mu4e-header-value-face", "header value", {}], ["mu4e-header-face", "header", {}], ["mu4e-header-highlight-face", "header highlight", {}], ["mu4e-header-marks-face", "header marks", {}], ["mu4e-unread-face", "unread", {}], ["mu4e-flagged-face", "flagged", {}], ["mu4e-replied-face", "replied", {}], ["mu4e-forwarded-face", "forwarded", {}], ["mu4e-draft-face", "draft", {}], ["mu4e-trashed-face", "trashed", {}], ["mu4e-related-face", "related", {}], ["mu4e-contact-face", "contact", {}], ["mu4e-special-header-value-face", "special header value", {}], ["mu4e-url-number-face", "url number", {}], ["mu4e-link-face", "link", {}], ["mu4e-footer-face", "footer", {}], ["mu4e-region-code", "region code", {}], ["mu4e-system-face", "system", {}], ["mu4e-highlight-face", "highlight", {}], ["mu4e-compose-separator-face", "compose separator", {}]]}, "ghostel": {"label": "ghostel", "preview": "ghostel", "faces": [["ghostel-default", "default", {"inherit": "default"}], ["ghostel-fake-cursor", "fake cursor", {"box": {"style": "line", "width": 1, "color": null}}], ["ghostel-fake-cursor-box", "fake cursor box", {"inherit": "cursor"}], ["ghostel-color-black", "color black", {"inherit": "ansi-color-black"}], ["ghostel-color-red", "color red", {"inherit": "ansi-color-red"}], ["ghostel-color-green", "color green", {"inherit": "ansi-color-green"}], ["ghostel-color-yellow", "color yellow", {"inherit": "ansi-color-yellow"}], ["ghostel-color-blue", "color blue", {"inherit": "ansi-color-blue"}], ["ghostel-color-magenta", "color magenta", {"inherit": "ansi-color-magenta"}], ["ghostel-color-cyan", "color cyan", {"inherit": "ansi-color-cyan"}], ["ghostel-color-white", "color white", {"inherit": "ansi-color-white"}], ["ghostel-color-bright-black", "color bright black", {"inherit": "ansi-color-bright-black"}], ["ghostel-color-bright-red", "color bright red", {"inherit": "ansi-color-bright-red"}], ["ghostel-color-bright-green", "color bright green", {"inherit": "ansi-color-bright-green"}], ["ghostel-color-bright-yellow", "color bright yellow", {"inherit": "ansi-color-bright-yellow"}], ["ghostel-color-bright-blue", "color bright blue", {"inherit": "ansi-color-bright-blue"}], ["ghostel-color-bright-magenta", "color bright magenta", {"inherit": "ansi-color-bright-magenta"}], ["ghostel-color-bright-cyan", "color bright cyan", {"inherit": "ansi-color-bright-cyan"}], ["ghostel-color-bright-white", "color bright white", {"inherit": "ansi-color-bright-white"}]]}, "dashboard": {"label": "dashboard", "preview": "dashboard", "faces": [["dashboard-banner-logo-title", "banner logo title", {"inherit": "default"}], ["dashboard-text-banner", "text banner", {"inherit": "font-lock-keyword-face"}], ["dashboard-heading", "heading", {"inherit": "font-lock-keyword-face"}], ["dashboard-items-face", "items", {"inherit": "widget-button"}], ["dashboard-navigator", "navigator", {"inherit": "font-lock-keyword-face"}], ["dashboard-no-items-face", "no items", {"inherit": "widget-button"}], ["dashboard-footer-face", "footer", {"inherit": "font-lock-doc-face"}], ["dashboard-footer-icon-face", "footer icon", {"inherit": "dashboard-footer-face"}]]}, "lsp-mode": {"label": "lsp-mode", "preview": "lsp", "faces": [["lsp-signature-face", "signature", {}], ["lsp-signature-highlight-function-argument", "signature highlight function argument", {}], ["lsp-signature-posframe", "signature posframe", {}], ["lsp-face-highlight-read", "face highlight read", {}], ["lsp-face-highlight-write", "face highlight write", {}], ["lsp-face-highlight-textual", "face highlight textual", {}], ["lsp-face-rename", "face rename", {}], ["lsp-rename-placeholder-face", "rename placeholder", {}], ["lsp-inlay-hint-face", "inlay hint", {}], ["lsp-inlay-hint-parameter-face", "inlay hint parameter", {}], ["lsp-inlay-hint-type-face", "inlay hint type", {}], ["lsp-details-face", "details", {}], ["lsp-installation-buffer-face", "installation buffer", {}], ["lsp-installation-finished-buffer-face", "installation finished buffer", {}]]}, "git-gutter": {"label": "git-gutter", "preview": "gitgutter", "faces": [["git-gutter:added", "added", {"fg": "#00ff00", "bold": true, "inherit": "default"}], ["git-gutter:modified", "modified", {"fg": "#ff00ff", "bold": true, "inherit": "default"}], ["git-gutter:deleted", "deleted", {"fg": "#ff0000", "bold": true, "inherit": "default"}], ["git-gutter:unchanged", "unchanged", {"bg": "#ffff00", "inherit": "default"}], ["git-gutter:separator", "separator", {"fg": "#00ffff", "bold": true, "inherit": "default"}]]}, "flycheck": {"label": "flycheck", "preview": "flycheck", "faces": [["flycheck-error", "error", {"underline": true}], ["flycheck-warning", "warning", {"underline": true}], ["flycheck-info", "info", {"underline": true}], ["flycheck-fringe-error", "fringe error", {"inherit": "error"}], ["flycheck-fringe-warning", "fringe warning", {"inherit": "warning"}], ["flycheck-fringe-info", "fringe info", {"inherit": "success"}], ["flycheck-delimited-error", "delimited error", {}], ["flycheck-error-delimiter", "error delimiter", {}], ["flycheck-error-list-error", "error list error", {"inherit": "error"}], ["flycheck-error-list-warning", "error list warning", {"inherit": "warning"}], ["flycheck-error-list-info", "error list info", {"inherit": "success"}], ["flycheck-error-list-error-message", "error list error message", {}], ["flycheck-error-list-checker-name", "error list checker name", {"inherit": "font-lock-function-name-face"}], ["flycheck-error-list-column-number", "error list column number", {}], ["flycheck-error-list-line-number", "error list line number", {}], ["flycheck-error-list-filename", "error list filename", {"inherit": "mode-line-buffer-id"}], ["flycheck-error-list-id", "error list id", {"inherit": "font-lock-type-face"}], ["flycheck-error-list-id-with-explainer", "error list id with explainer", {"inherit": "flycheck-error-list-id", "box": {"style": "released", "width": 1, "color": null}}], ["flycheck-error-list-highlight", "error list highlight", {"bold": true}], ["flycheck-verify-select-checker", "verify select checker", {"box": {"style": "released", "width": 1, "color": null}}]]}, "dired": {"label": "dired", "preview": "dired", "faces": [["dired-header", "header", {}], ["dired-directory", "directory", {}], ["dired-symlink", "symlink", {}], ["dired-broken-symlink", "broken symlink", {}], ["dired-special", "special", {}], ["dired-set-id", "set id", {}], ["dired-perm-write", "perm write", {}], ["dired-mark", "mark", {}], ["dired-marked", "marked", {}], ["dired-flagged", "flagged", {}], ["dired-ignored", "ignored", {}], ["dired-warning", "warning", {}]]}, "dirvish": {"label": "dirvish", "preview": "dirvish", "faces": [["dirvish-inactive", "inactive", {"inherit": "shadow"}], ["dirvish-free-space", "free space", {"inherit": "font-lock-constant-face"}], ["dirvish-hl-line", "hl line", {"inherit": "highlight"}], ["dirvish-hl-line-inactive", "hl line inactive", {"inherit": "region"}], ["dirvish-file-modes", "file modes", {"fg": "#6b6b6b"}], ["dirvish-file-link-number", "file link number", {"inherit": "font-lock-constant-face"}], ["dirvish-file-user-id", "file user id", {"inherit": "font-lock-preprocessor-face"}], ["dirvish-file-group-id", "file group id", {"inherit": "dirvish-file-user-id"}], ["dirvish-file-size", "file size", {"underline": true, "inherit": "completions-annotations"}], ["dirvish-file-time", "file time", {"fg": "#979797"}], ["dirvish-file-inode-number", "file inode number", {"inherit": "dirvish-file-link-number"}], ["dirvish-file-device-number", "file device number", {"inherit": "dirvish-file-link-number"}], ["dirvish-subtree-guide", "subtree guide", {"bg": "unspecified", "underline": true, "inherit": "dired-ignored"}], ["dirvish-subtree-state", "subtree state", {"bg": "unspecified", "underline": true, "inherit": "dired-ignored"}], ["dirvish-collapse-dir-face", "collapse dir", {"inherit": "dired-directory"}], ["dirvish-collapse-empty-dir-face", "collapse empty dir", {"inherit": "shadow"}], ["dirvish-collapse-file-face", "collapse file", {"inherit": "default"}], ["dirvish-emerge-group-title", "emerge group title", {"inherit": "dired-ignored"}], ["dirvish-media-info-heading", "media info heading", {"inherit": ["dired-header", "bold"]}], ["dirvish-media-info-property-key", "media info property key", {"inherit": ["italic"]}], ["dirvish-narrow-match-face-0", "narrow match 0", {"fg": "#223fbf", "bold": true}], ["dirvish-narrow-match-face-1", "narrow match 1", {"fg": "#8f0075", "bold": true}], ["dirvish-narrow-match-face-2", "narrow match 2", {"fg": "#145a00", "bold": true}], ["dirvish-narrow-match-face-3", "narrow match 3", {"fg": "#804000", "bold": true}], ["dirvish-narrow-split", "narrow split", {"inherit": "font-lock-negation-char-face"}], ["dirvish-proc-running", "proc running", {"inherit": "warning"}], ["dirvish-proc-finished", "proc finished", {"inherit": "success"}], ["dirvish-proc-failed", "proc failed", {"inherit": "error"}], ["dirvish-git-commit-message-face", "git commit message", {"bg": "unspecified", "underline": true, "inherit": "dired-ignored"}], ["dirvish-vc-added-state", "vc added state", {"inherit": "vc-locally-added-state"}], ["dirvish-vc-edited-state", "vc edited state", {"inherit": "vc-edited-state"}], ["dirvish-vc-removed-state", "vc removed state", {"inherit": "vc-removed-state"}], ["dirvish-vc-conflict-state", "vc conflict state", {"inherit": "vc-conflict-state"}], ["dirvish-vc-locked-state", "vc locked state", {"inherit": "vc-locked-state"}], ["dirvish-vc-missing-state", "vc missing state", {"inherit": "vc-missing-state"}], ["dirvish-vc-needs-merge-face", "vc needs merge", {"bg": "#efcbcf"}], ["dirvish-vc-needs-update-state", "vc needs update state", {"inherit": "vc-needs-update-state"}], ["dirvish-vc-unregistered-face", "vc unregistered", {"inherit": "font-lock-constant-face"}]]}, "calibredb": {"label": "calibredb", "preview": "calibredb", "faces": [["calibredb-search-header-library-name-face", "search header library name", {}], ["calibredb-search-header-library-path-face", "search header library path", {}], ["calibredb-search-header-total-face", "search header total", {}], ["calibredb-search-header-filter-face", "search header filter", {}], ["calibredb-search-header-sort-face", "search header sort", {}], ["calibredb-search-header-highlight-face", "search header highlight", {}], ["calibredb-id-face", "id", {}], ["calibredb-title-face", "title", {}], ["calibredb-author-face", "author", {}], ["calibredb-format-face", "format", {}], ["calibredb-size-face", "size", {}], ["calibredb-tag-face", "tag", {}], ["calibredb-date-face", "date", {}], ["calibredb-mark-face", "mark", {}], ["calibredb-series-face", "series", {}], ["calibredb-publisher-face", "publisher", {}], ["calibredb-pubdate-face", "pubdate", {}], ["calibredb-language-face", "language", {}], ["calibredb-comment-face", "comment", {}], ["calibredb-archive-face", "archive", {}], ["calibredb-favorite-face", "favorite", {}], ["calibredb-file-face", "file", {}], ["calibredb-ids-face", "ids", {}], ["calibredb-highlight-face", "highlight", {}], ["calibredb-current-page-button-face", "current page button", {}], ["calibredb-mouse-face", "mouse", {}], ["calibredb-title-detailed-view-face", "title detailed view", {}], ["calibredb-edit-annotation-header-title-face", "edit annotation header title", {}]]}, "erc": {"label": "erc", "preview": "erc", "faces": [["erc-header-line", "header line", {}], ["erc-timestamp-face", "timestamp", {}], ["erc-notice-face", "notice", {}], ["erc-default-face", "default", {}], ["erc-current-nick-face", "current nick", {}], ["erc-my-nick-face", "my nick", {}], ["erc-my-nick-prefix-face", "my nick prefix", {}], ["erc-nick-default-face", "nick default", {}], ["erc-nick-prefix-face", "nick prefix", {}], ["erc-button-nick-default-face", "button nick default", {}], ["erc-nick-msg-face", "nick msg", {}], ["erc-direct-msg-face", "direct msg", {}], ["erc-action-face", "action", {}], ["erc-keyword-face", "keyword", {}], ["erc-pal-face", "pal", {}], ["erc-fool-face", "fool", {}], ["erc-dangerous-host-face", "dangerous host", {}], ["erc-error-face", "error", {}], ["erc-input-face", "input", {}], ["erc-prompt-face", "prompt", {}], ["erc-command-indicator-face", "command indicator", {}], ["erc-information", "information", {}], ["erc-button", "button", {}], ["erc-bold-face", "bold", {}], ["erc-italic-face", "italic", {}], ["erc-underline-face", "underline", {}], ["erc-inverse-face", "inverse", {}], ["erc-spoiler-face", "spoiler", {}], ["erc-fill-wrap-merge-indicator-face", "fill wrap merge indicator", {}], ["erc-keep-place-indicator-arrow", "keep place indicator arrow", {}], ["erc-keep-place-indicator-line", "keep place indicator line", {}]]}, "org-drill": {"label": "org-drill", "preview": "orgdrill", "faces": [["org-drill-hidden-cloze-face", "hidden cloze", {}], ["org-drill-visible-cloze-face", "visible cloze", {}], ["org-drill-visible-cloze-hint-face", "visible cloze hint", {}]]}, "org-noter": {"label": "org-noter", "preview": "orgnoter", "faces": [["org-noter-notes-exist-face", "notes exist", {}], ["org-noter-no-notes-exist-face", "no notes exist", {}]]}, "signel": {"label": "signel", "preview": "signel", "faces": [["signel-timestamp-face", "timestamp", {}], ["signel-my-msg-face", "my msg", {}], ["signel-other-msg-face", "other msg", {}], ["signel-error-face", "error", {}]]}, "pearl": {"label": "pearl", "preview": "pearl", "faces": [["pearl-preamble-summary", "preamble summary", {}], ["pearl-editable-comment", "editable comment", {}], ["pearl-readonly-comment", "readonly comment", {}], ["pearl-modified-highlight", "modified highlight", {}], ["pearl-modified-local", "modified local", {}], ["pearl-modified-unknown", "modified unknown", {}]]}, "slack": {"label": "slack", "preview": "slack", "faces": [["slack-room-info-title-face", "room info title", {}], ["slack-room-info-title-room-name-face", "room info title room name", {}], ["slack-room-info-section-title-face", "room info section title", {}], ["slack-room-info-section-label-face", "room info section label", {}], ["slack-room-unread-face", "room unread", {}], ["slack-message-output-header", "message output header", {}], ["slack-message-output-text", "message output text", {}], ["slack-message-output-reaction", "message output reaction", {}], ["slack-message-output-reaction-pressed", "message output reaction pressed", {}], ["slack-message-deleted-face", "message deleted", {}], ["slack-new-message-marker-face", "new message marker", {}], ["slack-all-thread-buffer-thread-header-face", "all thread buffer thread header", {}], ["slack-message-mention-face", "message mention", {}], ["slack-message-mention-me-face", "message mention me", {}], ["slack-message-mention-keyword-face", "message mention keyword", {}], ["slack-channel-button-face", "channel button", {}], ["slack-mrkdwn-bold-face", "mrkdwn bold", {}], ["slack-mrkdwn-italic-face", "mrkdwn italic", {}], ["slack-mrkdwn-code-face", "mrkdwn code", {}], ["slack-mrkdwn-code-block-face", "mrkdwn code block", {}], ["slack-mrkdwn-strike-face", "mrkdwn strike", {}], ["slack-mrkdwn-blockquote-face", "mrkdwn blockquote", {}], ["slack-mrkdwn-list-face", "mrkdwn list", {}], ["slack-attachment-header", "attachment header", {}], ["slack-attachment-footer", "attachment footer", {}], ["slack-attachment-pad", "attachment pad", {}], ["slack-attachment-field-title", "attachment field title", {}], ["slack-message-attachment-preview-header-face", "message attachment preview header", {}], ["slack-preview-face", "preview", {}], ["slack-block-highlight-source-overlay-face", "block highlight source overlay", {}], ["slack-message-action-face", "message action", {}], ["slack-message-action-primary-face", "message action primary", {}], ["slack-message-action-danger-face", "message action danger", {}], ["slack-button-block-element-face", "button block element", {}], ["slack-button-primary-block-element-face", "button primary block element", {}], ["slack-button-danger-block-element-face", "button danger block element", {}], ["slack-select-block-element-face", "select block element", {}], ["slack-overflow-block-element-face", "overflow block element", {}], ["slack-date-picker-block-element-face", "date picker block element", {}], ["slack-dialog-title-face", "dialog title", {}], ["slack-dialog-element-label-face", "dialog element label", {}], ["slack-dialog-element-hint-face", "dialog element hint", {}], ["slack-dialog-element-placeholder-face", "dialog element placeholder", {}], ["slack-dialog-element-error-face", "dialog element error", {}], ["slack-dialog-submit-button-face", "dialog submit button", {}], ["slack-dialog-cancel-button-face", "dialog cancel button", {}], ["slack-dialog-select-element-input-face", "dialog select element input", {}], ["slack-user-active-face", "user active", {}], ["slack-user-dnd-face", "user dnd", {}], ["slack-user-profile-header-face", "user profile header", {}], ["slack-user-profile-property-name-face", "user profile property name", {}], ["slack-profile-image-face", "profile image", {}], ["slack-search-result-message-header-face", "search result message header", {}], ["slack-search-result-message-username-face", "search result message username", {}], ["slack-modeline-has-unreads-face", "modeline has unreads", {}], ["slack-modeline-channel-has-unreads-face", "modeline channel has unreads", {}], ["slack-modeline-thread-has-unreads-face", "modeline thread has unreads", {}]]}, "telega": {"label": "telega", "preview": "telega", "faces": [["telega-root-heading", "root heading", {}], ["telega-tracking", "tracking", {}], ["telega-unread-unmuted-modeline", "unread unmuted modeline", {}], ["telega-username", "username", {}], ["telega-user-online-status", "user online status", {}], ["telega-user-non-online-status", "user non online status", {}], ["telega-secret-title", "secret title", {}], ["telega-contact-birthdays-today", "contact birthdays today", {}], ["telega-muted-count", "muted count", {}], ["telega-unmuted-count", "unmuted count", {}], ["telega-mention-count", "mention count", {}], ["telega-has-chatbuf-brackets", "has chatbuf brackets", {}], ["telega-delim-face", "delim", {}], ["telega-shadow", "shadow", {}], ["telega-link", "link", {}], ["telega-blue", "blue", {}], ["telega-red", "red", {}], ["telega-msg-heading", "msg heading", {}], ["telega-msg-user-title", "msg user title", {}], ["telega-msg-self-title", "msg self title", {}], ["telega-msg-deleted", "msg deleted", {}], ["telega-msg-sponsored", "msg sponsored", {}], ["telega-msg-inline-reply", "msg inline reply", {}], ["telega-msg-inline-forward", "msg inline forward", {}], ["telega-msg-inline-other", "msg inline other", {}], ["telega-entity-type-bold", "entity type bold", {}], ["telega-entity-type-italic", "entity type italic", {}], ["telega-entity-type-underline", "entity type underline", {}], ["telega-entity-type-strikethrough", "entity type strikethrough", {}], ["telega-entity-type-code", "entity type code", {}], ["telega-entity-type-pre", "entity type pre", {}], ["telega-entity-type-blockquote", "entity type blockquote", {}], ["telega-entity-type-mention", "entity type mention", {}], ["telega-entity-type-hashtag", "entity type hashtag", {}], ["telega-entity-type-cashtag", "entity type cashtag", {}], ["telega-entity-type-botcommand", "entity type botcommand", {}], ["telega-entity-type-texturl", "entity type texturl", {}], ["telega-entity-type-spoiler", "entity type spoiler", {}], ["telega-reaction", "reaction", {}], ["telega-reaction-chosen", "reaction chosen", {}], ["telega-reaction-paid", "reaction paid", {}], ["telega-reaction-paid-chosen", "reaction paid chosen", {}], ["telega-highlight-text-face", "highlight text", {}], ["telega-button-highlight", "button highlight", {}], ["telega-chat-prompt", "chat prompt", {}], ["telega-chat-prompt-aux", "chat prompt aux", {}], ["telega-chat-input-attachment", "chat input attachment", {}], ["telega-topic-button", "topic button", {}], ["telega-filter-active", "filter active", {}], ["telega-filter-button-active", "filter button active", {}], ["telega-filter-button-inactive", "filter button inactive", {}], ["telega-checklist-stats-done", "checklist stats done", {}], ["telega-checklist-stats-todo", "checklist stats todo", {}], ["telega-box-button", "box button", {}], ["telega-box-button-active", "box button active", {}], ["telega-box-button-default-active", "box button default active", {}], ["telega-box-button-default-passive", "box button default passive", {}], ["telega-box-button-primary-active", "box button primary active", {}], ["telega-box-button-primary-passive", "box button primary passive", {}], ["telega-box-button-success-active", "box button success active", {}], ["telega-box-button-success-passive", "box button success passive", {}], ["telega-box-button-danger-active", "box button danger active", {}], ["telega-box-button-danger-passive", "box button danger passive", {}], ["telega-box-button-ui-active", "box button ui active", {}], ["telega-box-button-ui-passive", "box button ui passive", {}], ["telega-box-button2-active", "box button2 active", {}], ["telega-box-button2-passive", "box button2 passive", {}], ["telega-box-button2-white-foreground", "box button2 white foreground", {}], ["telega-describe-item-title", "describe item title", {}], ["telega-describe-section-title", "describe section title", {}], ["telega-describe-subsection-title", "describe subsection title", {}], ["telega-enckey-00", "enckey 00", {}], ["telega-enckey-01", "enckey 01", {}], ["telega-enckey-10", "enckey 10", {}], ["telega-enckey-11", "enckey 11", {}], ["telega-palette-builtin-blue", "palette builtin blue", {}], ["telega-palette-builtin-green", "palette builtin green", {}], ["telega-palette-builtin-orange", "palette builtin orange", {}], ["telega-palette-builtin-purple", "palette builtin purple", {}], ["telega-webpage-title", "webpage title", {}], ["telega-webpage-subtitle", "webpage subtitle", {}], ["telega-webpage-header", "webpage header", {}], ["telega-webpage-subheader", "webpage subheader", {}], ["telega-webpage-outline", "webpage outline", {}], ["telega-webpage-fixed", "webpage fixed", {}], ["telega-webpage-preformatted", "webpage preformatted", {}], ["telega-webpage-marked", "webpage marked", {}], ["telega-webpage-strike-through", "webpage strike through", {}], ["telega-webpage-chat-link", "webpage chat link", {}], ["telega-link-preview-sitename", "link preview sitename", {}], ["telega-link-preview-title", "link preview title", {}]]}, "shr": {"label": "shr (HTML: nov/eww/mail)", "preview": "shr", "faces": [["shr-h1", "h1", {}], ["shr-h2", "h2", {}], ["shr-h3", "h3", {}], ["shr-h4", "h4", {}], ["shr-h5", "h5", {}], ["shr-h6", "h6", {}], ["shr-text", "text", {}], ["shr-link", "link", {}], ["shr-selected-link", "selected link", {}], ["shr-code", "code", {}], ["shr-mark", "mark", {}], ["shr-strike-through", "strike through", {}], ["shr-sup", "sup", {}], ["shr-abbreviation", "abbreviation", {}], ["shr-sliced-image", "sliced image", {}]]}, "2048-game": {"label": "2048-game", "preview": "generic", "faces": [["twentyfortyeight-face-1024", "twentyfortyeight 1024", {"fg": "#000000", "bg": "#ffd700"}], ["twentyfortyeight-face-128", "twentyfortyeight 128", {"fg": "#ffffff", "bg": "#8b0000"}], ["twentyfortyeight-face-16", "twentyfortyeight 16", {"fg": "#000000", "bg": "#ffa500"}], ["twentyfortyeight-face-2", "twentyfortyeight 2", {"fg": "#000000", "bg": "#f0e68c"}], ["twentyfortyeight-face-2048", "twentyfortyeight 2048", {"fg": "#000000", "bg": "#ffff00"}], ["twentyfortyeight-face-256", "twentyfortyeight 256", {"fg": "#ffffff", "bg": "#8b008b"}], ["twentyfortyeight-face-32", "twentyfortyeight 32", {"fg": "#000000", "bg": "#ff4500"}], ["twentyfortyeight-face-4", "twentyfortyeight 4", {"fg": "#000000", "bg": "#deb887"}], ["twentyfortyeight-face-512", "twentyfortyeight 512", {"fg": "#000000", "bg": "#ff00ff"}], ["twentyfortyeight-face-64", "twentyfortyeight 64", {"fg": "#ffffff", "bg": "#b22222"}], ["twentyfortyeight-face-8", "twentyfortyeight 8", {"fg": "#000000", "bg": "#cd8500"}]]}, "alert": {"label": "alert", "preview": "generic", "faces": [["alert-high-face", "high", {"fg": "#ff8c00", "bold": true}], ["alert-low-face", "low", {"fg": "#00008b"}], ["alert-moderate-face", "moderate", {"fg": "#ffd700", "bold": true}], ["alert-normal-face", "normal", {}], ["alert-trivial-face", "trivial", {"fg": "#9400d3"}], ["alert-urgent-face", "urgent", {"fg": "#ff0000", "bold": true}]]}, "all-the-icons": {"label": "all-the-icons", "preview": "generic", "faces": [["all-the-icons-blue", "blue", {"fg": "#6a9fb5"}], ["all-the-icons-blue-alt", "blue alt", {"fg": "#2188b6"}], ["all-the-icons-cyan", "cyan", {"fg": "#75b5aa"}], ["all-the-icons-cyan-alt", "cyan alt", {"fg": "#0595bd"}], ["all-the-icons-dblue", "dblue", {"fg": "#446674"}], ["all-the-icons-dcyan", "dcyan", {"fg": "#48746d"}], ["all-the-icons-dgreen", "dgreen", {"fg": "#6d8143"}], ["all-the-icons-dmaroon", "dmaroon", {"fg": "#72584b"}], ["all-the-icons-dorange", "dorange", {"fg": "#915b2d"}], ["all-the-icons-dpink", "dpink", {"fg": "#7e5d5f"}], ["all-the-icons-dpurple", "dpurple", {"fg": "#694863"}], ["all-the-icons-dred", "dred", {"fg": "#843031"}], ["all-the-icons-dsilver", "dsilver", {"fg": "#838484"}], ["all-the-icons-dyellow", "dyellow", {"fg": "#b48d56"}], ["all-the-icons-green", "green", {"fg": "#90a959"}], ["all-the-icons-lblue", "lblue", {"fg": "#677174"}], ["all-the-icons-lcyan", "lcyan", {"fg": "#2c7d6e"}], ["all-the-icons-lgreen", "lgreen", {"fg": "#3d6837"}], ["all-the-icons-lmaroon", "lmaroon", {"fg": "#ce7a4e"}], ["all-the-icons-lorange", "lorange", {"fg": "#ffa500"}], ["all-the-icons-lpink", "lpink", {"fg": "#ff505b"}], ["all-the-icons-lpurple", "lpurple", {"fg": "#e69dd6"}], ["all-the-icons-lred", "lred", {"fg": "#eb595a"}], ["all-the-icons-lsilver", "lsilver", {"fg": "#7f7869"}], ["all-the-icons-lyellow", "lyellow", {"fg": "#ff9300"}], ["all-the-icons-maroon", "maroon", {"fg": "#8f5536"}], ["all-the-icons-orange", "orange", {"fg": "#d4843e"}], ["all-the-icons-pink", "pink", {"fg": "#fc505b"}], ["all-the-icons-purple", "purple", {"fg": "#68295b"}], ["all-the-icons-purple-alt", "purple alt", {"fg": "#5d54e1"}], ["all-the-icons-red", "red", {"fg": "#ac4142"}], ["all-the-icons-red-alt", "red alt", {"fg": "#843031"}], ["all-the-icons-silver", "silver", {"fg": "#716e68"}], ["all-the-icons-yellow", "yellow", {"fg": "#ffcc0e"}]]}, "company": {"label": "company", "preview": "generic", "faces": [["company-echo", "echo", {}], ["company-echo-common", "echo common", {"fg": "#8b1a1a"}], ["company-preview", "preview", {"inherit": ["company-tooltip-selection", "company-tooltip"]}], ["company-preview-common", "preview common", {"inherit": "company-tooltip-common-selection"}], ["company-preview-search", "preview search", {"inherit": "company-tooltip-common-selection"}], ["company-tooltip", "tooltip", {"fg": "#000000", "bg": "#fff8dc"}], ["company-tooltip-annotation", "tooltip annotation", {"fg": "#8b1a1a"}], ["company-tooltip-annotation-selection", "tooltip annotation selection", {"inherit": "company-tooltip-annotation"}], ["company-tooltip-common", "tooltip common", {"fg": "#8b0000"}], ["company-tooltip-common-selection", "tooltip common selection", {"inherit": "company-tooltip-common"}], ["company-tooltip-deprecated", "tooltip deprecated", {"strike": true}], ["company-tooltip-mouse", "tooltip mouse", {"inherit": "highlight"}], ["company-tooltip-quick-access", "tooltip quick access", {"inherit": "company-tooltip-annotation"}], ["company-tooltip-quick-access-selection", "tooltip quick access selection", {"inherit": "company-tooltip-annotation-selection"}], ["company-tooltip-scrollbar-thumb", "tooltip scrollbar thumb", {"bg": "#cd5c5c"}], ["company-tooltip-scrollbar-track", "tooltip scrollbar track", {"bg": "#f5deb3"}], ["company-tooltip-search", "tooltip search", {"inherit": "highlight"}], ["company-tooltip-search-selection", "tooltip search selection", {"inherit": "highlight"}], ["company-tooltip-selection", "tooltip selection", {"bg": "#add8e6"}]]}, "company-box": {"label": "company-box", "preview": "generic", "faces": [["company-box-annotation", "annotation", {}], ["company-box-background", "background", {}], ["company-box-candidate", "candidate", {}], ["company-box-numbers", "numbers", {}], ["company-box-scrollbar", "scrollbar", {}], ["company-box-selection", "selection", {}]]}, "consult": {"label": "consult", "preview": "generic", "faces": [["consult-async-failed", "async failed", {"inherit": "error"}], ["consult-async-finished", "async finished", {"inherit": "success"}], ["consult-async-running", "async running", {"inherit": "consult-narrow-indicator"}], ["consult-async-split", "async split", {"inherit": "font-lock-negation-char-face"}], ["consult-bookmark", "bookmark", {"inherit": "font-lock-constant-face"}], ["consult-buffer", "buffer", {}], ["consult-file", "file", {"inherit": "font-lock-function-name-face"}], ["consult-grep-context", "grep context", {"inherit": "shadow"}], ["consult-help", "help", {"inherit": "shadow"}], ["consult-highlight-mark", "highlight mark", {"inherit": "consult-highlight-match"}], ["consult-highlight-match", "highlight match", {"inherit": "match"}], ["consult-key", "key", {"inherit": "font-lock-keyword-face"}], ["consult-line-number", "line number", {"inherit": "consult-key"}], ["consult-line-number-prefix", "line number prefix", {"inherit": "line-number"}], ["consult-line-number-wrapped", "line number wrapped", {"inherit": "font-lock-warning-face"}], ["consult-narrow-indicator", "narrow indicator", {"inherit": "warning"}], ["consult-preview-insertion", "preview insertion", {"inherit": "region"}], ["consult-preview-line", "preview line", {"inherit": "consult-preview-insertion"}], ["consult-preview-match", "preview match", {"inherit": "isearch"}], ["consult-separator", "separator", {"fg": "#ccc"}]]}, "embark": {"label": "embark", "preview": "generic", "faces": [["embark-collect-annotation", "collect annotation", {"inherit": "completions-annotations"}], ["embark-collect-candidate", "collect candidate", {"inherit": "default"}], ["embark-collect-group-separator", "collect group separator", {"strike": true, "inherit": "shadow"}], ["embark-collect-group-title", "collect group title", {"italic": true, "inherit": "shadow"}], ["embark-keybinding", "keybinding", {"inherit": "success"}], ["embark-keybinding-repeat", "keybinding repeat", {"inherit": "font-lock-builtin-face"}], ["embark-keymap", "keymap", {"italic": true}], ["embark-selected", "selected", {"inherit": "match"}], ["embark-target", "target", {"inherit": "highlight"}], ["embark-verbose-indicator-documentation", "verbose indicator documentation", {"inherit": "completions-annotations"}], ["embark-verbose-indicator-shadowed", "verbose indicator shadowed", {"inherit": "shadow"}], ["embark-verbose-indicator-title", "verbose indicator title", {"bold": true, "height": 1.1}]]}, "emms": {"label": "emms", "preview": "generic", "faces": [["emms-browser-album-face", "browser album", {}], ["emms-browser-albumartist-face", "browser albumartist", {}], ["emms-browser-artist-face", "browser artist", {}], ["emms-browser-composer-face", "browser composer", {}], ["emms-browser-performer-face", "browser performer", {}], ["emms-browser-track-face", "browser track", {}], ["emms-browser-year/genre-face", "browser year/genre", {}], ["emms-metaplaylist-mode-current-face", "metaplaylist mode current", {"fg": "#ffffff", "bg": "#cd0000"}], ["emms-metaplaylist-mode-face", "metaplaylist mode", {"fg": "#cd0000"}], ["emms-playlist-selected-face", "playlist selected", {"fg": "#ffffff", "bg": "#0000cd"}], ["emms-playlist-track-face", "playlist track", {"fg": "#0000ff"}]]}, "flyspell-correct": {"label": "flyspell-correct", "preview": "generic", "faces": [["flyspell-correct-highlight-face", "highlight", {"inherit": "isearch"}]]}, "highlight-indent-guides": {"label": "highlight-indent-guides", "preview": "generic", "faces": [["highlight-indent-guides-character-face", "character", {}], ["highlight-indent-guides-even-face", "even", {}], ["highlight-indent-guides-odd-face", "odd", {}], ["highlight-indent-guides-stack-character-face", "stack character", {}], ["highlight-indent-guides-stack-even-face", "stack even", {}], ["highlight-indent-guides-stack-odd-face", "stack odd", {}], ["highlight-indent-guides-top-character-face", "top character", {}], ["highlight-indent-guides-top-even-face", "top even", {}], ["highlight-indent-guides-top-odd-face", "top odd", {}]]}, "hl-todo": {"label": "hl-todo", "preview": "generic", "faces": [["hl-todo", "hl todo", {"fg": "#cc9393", "bold": true}], ["hl-todo-flymake-type", "flymake type", {"inherit": "font-lock-keyword-face"}]]}, "json-mode": {"label": "json-mode", "preview": "generic", "faces": [["json-mode-object-name-face", "object name", {"inherit": "font-lock-variable-name-face"}]]}, "llama": {"label": "llama", "preview": "generic", "faces": [["llama-##-macro", "## macro", {"inherit": "font-lock-function-call-face"}], ["llama-deleted-argument", "deleted argument", {"box": {"style": "line", "width": 1, "color": "#ff0000"}}], ["llama-llama-macro", "llama macro", {"inherit": "font-lock-keyword-face"}], ["llama-mandatory-argument", "mandatory argument", {"inherit": "font-lock-variable-use-face"}], ["llama-optional-argument", "optional argument", {"inherit": "font-lock-type-face"}]]}, "lv": {"label": "lv", "preview": "generic", "faces": [["lv-separator", "separator", {"bg": "#cccccc"}]]}, "magit-section": {"label": "magit-section", "preview": "generic", "faces": [["magit-left-margin", "magit left margin", {}], ["magit-section-child-count", "child count", {}], ["magit-section-heading", "heading", {}], ["magit-section-heading-selection", "heading selection", {}], ["magit-section-highlight", "highlight", {}], ["magit-section-secondary-heading", "secondary heading", {}]]}, "malyon": {"label": "malyon", "preview": "generic", "faces": [["malyon-face-bold", "face bold", {"inherit": "bold"}], ["malyon-face-error", "face error", {"inherit": "error"}], ["malyon-face-italic", "face italic", {"inherit": "italic"}], ["malyon-face-plain", "face plain", {"inherit": "default"}], ["malyon-face-reverse", "face reverse", {"inherit": "default"}]]}, "marginalia": {"label": "marginalia", "preview": "generic", "faces": [["marginalia-archive", "archive", {"inherit": "warning"}], ["marginalia-char", "char", {"inherit": "marginalia-key"}], ["marginalia-date", "date", {"inherit": "marginalia-key"}], ["marginalia-documentation", "documentation", {"inherit": "completions-annotations"}], ["marginalia-file-name", "file name", {"inherit": "marginalia-documentation"}], ["marginalia-file-owner", "file owner", {"inherit": "font-lock-preprocessor-face"}], ["marginalia-file-priv-dir", "file priv dir", {"inherit": "font-lock-keyword-face"}], ["marginalia-file-priv-exec", "file priv exec", {"inherit": "font-lock-function-name-face"}], ["marginalia-file-priv-link", "file priv link", {"inherit": "font-lock-keyword-face"}], ["marginalia-file-priv-no", "file priv no", {"inherit": "shadow"}], ["marginalia-file-priv-other", "file priv other", {"inherit": "font-lock-constant-face"}], ["marginalia-file-priv-rare", "file priv rare", {"inherit": "font-lock-variable-name-face"}], ["marginalia-file-priv-read", "file priv read", {"inherit": "font-lock-type-face"}], ["marginalia-file-priv-write", "file priv write", {"inherit": "font-lock-builtin-face"}], ["marginalia-function", "function", {"inherit": "font-lock-function-name-face"}], ["marginalia-installed", "installed", {"inherit": "success"}], ["marginalia-key", "key", {"inherit": "font-lock-keyword-face"}], ["marginalia-lighter", "lighter", {"inherit": "marginalia-size"}], ["marginalia-list", "list", {"inherit": "font-lock-constant-face"}], ["marginalia-mode", "mode", {"inherit": "marginalia-key"}], ["marginalia-modified", "modified", {"inherit": "font-lock-negation-char-face"}], ["marginalia-null", "null", {"inherit": "font-lock-comment-face"}], ["marginalia-number", "number", {"inherit": "font-lock-constant-face"}], ["marginalia-off", "off", {"inherit": "error"}], ["marginalia-on", "on", {"inherit": "success"}], ["marginalia-size", "size", {"inherit": "marginalia-number"}], ["marginalia-string", "string", {"inherit": "font-lock-string-face"}], ["marginalia-symbol", "symbol", {"inherit": "font-lock-type-face"}], ["marginalia-true", "true", {"inherit": "font-lock-builtin-face"}], ["marginalia-type", "type", {"inherit": "marginalia-key"}], ["marginalia-value", "value", {"inherit": "marginalia-key"}], ["marginalia-version", "version", {"inherit": "marginalia-number"}]]}, "markdown-mode": {"label": "markdown-mode", "preview": "generic", "faces": [["markdown-blockquote-face", "markdown blockquote", {"inherit": "font-lock-doc-face"}], ["markdown-bold-face", "markdown bold", {"inherit": "bold"}], ["markdown-code-face", "markdown code", {"inherit": "fixed-pitch"}], ["markdown-comment-face", "markdown comment", {"inherit": "font-lock-comment-face"}], ["markdown-footnote-marker-face", "markdown footnote marker", {"inherit": "markdown-markup-face"}], ["markdown-footnote-text-face", "markdown footnote text", {"inherit": "font-lock-comment-face"}], ["markdown-gfm-checkbox-face", "markdown gfm checkbox", {"inherit": "font-lock-builtin-face"}], ["markdown-header-delimiter-face", "markdown header delimiter", {"inherit": "markdown-markup-face"}], ["markdown-header-face", "markdown header", {"bold": true, "inherit": ["font-lock-function-name-face"]}], ["markdown-header-face-1", "markdown header 1", {"inherit": "markdown-header-face"}], ["markdown-header-face-2", "markdown header 2", {"inherit": "markdown-header-face"}], ["markdown-header-face-3", "markdown header 3", {"inherit": "markdown-header-face"}], ["markdown-header-face-4", "markdown header 4", {"inherit": "markdown-header-face"}], ["markdown-header-face-5", "markdown header 5", {"inherit": "markdown-header-face"}], ["markdown-header-face-6", "markdown header 6", {"inherit": "markdown-header-face"}], ["markdown-header-rule-face", "markdown header rule", {"inherit": "markdown-markup-face"}], ["markdown-highlight-face", "markdown highlight", {"inherit": "highlight"}], ["markdown-highlighting-face", "markdown highlighting", {"fg": "#000000", "bg": "#ffff00"}], ["markdown-hr-face", "markdown hr", {"inherit": "markdown-markup-face"}], ["markdown-html-attr-name-face", "markdown html attr name", {"inherit": "font-lock-variable-name-face"}], ["markdown-html-attr-value-face", "markdown html attr value", {"inherit": "font-lock-string-face"}], ["markdown-html-entity-face", "markdown html entity", {"inherit": "font-lock-variable-name-face"}], ["markdown-html-tag-delimiter-face", "markdown html tag delimiter", {"inherit": "markdown-markup-face"}], ["markdown-html-tag-name-face", "markdown html tag name", {"inherit": "font-lock-type-face"}], ["markdown-inline-code-face", "markdown inline code", {"inherit": ["markdown-code-face", "font-lock-constant-face"]}], ["markdown-italic-face", "markdown italic", {"inherit": "italic"}], ["markdown-language-info-face", "markdown language info", {"inherit": "font-lock-string-face"}], ["markdown-language-keyword-face", "markdown language keyword", {"inherit": "font-lock-type-face"}], ["markdown-line-break-face", "markdown line break", {"underline": true, "inherit": "font-lock-constant-face"}], ["markdown-link-face", "markdown link", {"inherit": "link"}], ["markdown-link-title-face", "markdown link title", {"inherit": "font-lock-comment-face"}], ["markdown-list-face", "markdown list", {"inherit": "markdown-markup-face"}], ["markdown-markup-face", "markdown markup", {"inherit": "shadow"}], ["markdown-math-face", "markdown math", {"inherit": "font-lock-string-face"}], ["markdown-metadata-key-face", "markdown metadata key", {"inherit": "font-lock-variable-name-face"}], ["markdown-metadata-value-face", "markdown metadata value", {"inherit": "font-lock-string-face"}], ["markdown-missing-link-face", "markdown missing link", {"inherit": "font-lock-warning-face"}], ["markdown-plain-url-face", "markdown plain url", {"inherit": "markdown-link-face"}], ["markdown-pre-face", "markdown pre", {"inherit": ["markdown-code-face", "font-lock-constant-face"]}], ["markdown-reference-face", "markdown reference", {"inherit": "markdown-markup-face"}], ["markdown-strike-through-face", "markdown strike through", {"strike": true}], ["markdown-table-face", "markdown table", {"inherit": ["markdown-code-face"]}], ["markdown-url-face", "markdown url", {"inherit": "font-lock-string-face"}]]}, "nerd-icons": {"label": "nerd-icons", "preview": "generic", "faces": [["nerd-icons-blue", "blue", {"fg": "#6a9fb5"}], ["nerd-icons-blue-alt", "blue alt", {"fg": "#2188b6"}], ["nerd-icons-cyan", "cyan", {"fg": "#75b5aa"}], ["nerd-icons-cyan-alt", "cyan alt", {"fg": "#0595bd"}], ["nerd-icons-dblue", "dblue", {"fg": "#446674"}], ["nerd-icons-dcyan", "dcyan", {"fg": "#48746d"}], ["nerd-icons-dgreen", "dgreen", {"fg": "#6d8143"}], ["nerd-icons-dmaroon", "dmaroon", {"fg": "#72584b"}], ["nerd-icons-dorange", "dorange", {"fg": "#915b2d"}], ["nerd-icons-dpink", "dpink", {"fg": "#7e5d5f"}], ["nerd-icons-dpurple", "dpurple", {"fg": "#694863"}], ["nerd-icons-dred", "dred", {"fg": "#843031"}], ["nerd-icons-dsilver", "dsilver", {"fg": "#838484"}], ["nerd-icons-dyellow", "dyellow", {"fg": "#b48d56"}], ["nerd-icons-green", "green", {"fg": "#90a959"}], ["nerd-icons-lblue", "lblue", {"fg": "#677174"}], ["nerd-icons-lcyan", "lcyan", {"fg": "#2c7d6e"}], ["nerd-icons-lgreen", "lgreen", {"fg": "#3d6837"}], ["nerd-icons-lmaroon", "lmaroon", {"fg": "#ce7a4e"}], ["nerd-icons-lorange", "lorange", {"fg": "#ffa500"}], ["nerd-icons-lpink", "lpink", {"fg": "#ff505b"}], ["nerd-icons-lpurple", "lpurple", {"fg": "#e69dd6"}], ["nerd-icons-lred", "lred", {"fg": "#eb595a"}], ["nerd-icons-lsilver", "lsilver", {"fg": "#7f7869"}], ["nerd-icons-lyellow", "lyellow", {"fg": "#ff9300"}], ["nerd-icons-maroon", "maroon", {"fg": "#8f5536"}], ["nerd-icons-orange", "orange", {"fg": "#d4843e"}], ["nerd-icons-pink", "pink", {"fg": "#fc505b"}], ["nerd-icons-purple", "purple", {"fg": "#68295b"}], ["nerd-icons-purple-alt", "purple alt", {"fg": "#5d54e1"}], ["nerd-icons-red", "red", {"fg": "#ac4142"}], ["nerd-icons-red-alt", "red alt", {"fg": "#843031"}], ["nerd-icons-silver", "silver", {"fg": "#716e68"}], ["nerd-icons-yellow", "yellow", {"fg": "#ffcc0e"}]]}, "nerd-icons-completion": {"label": "nerd-icons-completion", "preview": "generic", "faces": [["nerd-icons-completion-dir-face", "dir", {}]]}, "orderless": {"label": "orderless", "preview": "generic", "faces": [["orderless-match-face-0", "match 0", {"fg": "#223fbf", "bold": true}], ["orderless-match-face-1", "match 1", {"fg": "#8f0075", "bold": true}], ["orderless-match-face-2", "match 2", {"fg": "#145a00", "bold": true}], ["orderless-match-face-3", "match 3", {"fg": "#804000", "bold": true}]]}, "org-roam": {"label": "org-roam", "preview": "generic", "faces": [["org-roam-dailies-calendar-note", "dailies calendar note", {}], ["org-roam-dim", "dim", {}], ["org-roam-header-line", "header line", {}], ["org-roam-olp", "olp", {}], ["org-roam-preview-heading", "preview heading", {}], ["org-roam-preview-heading-highlight", "preview heading highlight", {}], ["org-roam-preview-heading-selection", "preview heading selection", {}], ["org-roam-preview-region", "preview region", {}], ["org-roam-title", "title", {}]]}, "org-superstar": {"label": "org-superstar", "preview": "generic", "faces": [["org-superstar-first", "first", {"inherit": "org-warning"}], ["org-superstar-header-bullet", "header bullet", {}], ["org-superstar-item", "item", {"inherit": "default"}], ["org-superstar-leading", "leading", {"fg": "#bebebe", "inherit": "default"}]]}, "prescient": {"label": "prescient", "preview": "generic", "faces": [["prescient-primary-highlight", "primary highlight", {"bold": true}], ["prescient-secondary-highlight", "secondary highlight", {"underline": true, "inherit": "prescient-primary-highlight"}]]}, "rainbow-delimiters": {"label": "rainbow-delimiters", "preview": "generic", "faces": [["rainbow-delimiters-base-error-face", "base error", {"fg": "#88090b", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-base-face", "base", {"inherit": "unspecified"}], ["rainbow-delimiters-depth-1-face", "depth 1", {"fg": "#707183", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-2-face", "depth 2", {"fg": "#7388d6", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-3-face", "depth 3", {"fg": "#909183", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-4-face", "depth 4", {"fg": "#709870", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-5-face", "depth 5", {"fg": "#907373", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-6-face", "depth 6", {"fg": "#6276ba", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-7-face", "depth 7", {"fg": "#858580", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-8-face", "depth 8", {"fg": "#80a880", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-9-face", "depth 9", {"fg": "#887070", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-mismatched-face", "mismatched", {"inherit": "rainbow-delimiters-unmatched-face"}], ["rainbow-delimiters-unmatched-face", "unmatched", {"inherit": "rainbow-delimiters-base-error-face"}]]}, "symbol-overlay": {"label": "symbol-overlay", "preview": "generic", "faces": [["symbol-overlay-default-face", "default", {"inherit": "highlight"}], ["symbol-overlay-face-1", "face 1", {"fg": "#000000", "bg": "#1e90ff"}], ["symbol-overlay-face-2", "face 2", {"fg": "#000000", "bg": "#ff69b4"}], ["symbol-overlay-face-3", "face 3", {"fg": "#000000", "bg": "#ffff00"}], ["symbol-overlay-face-4", "face 4", {"fg": "#000000", "bg": "#da70d6"}], ["symbol-overlay-face-5", "face 5", {"fg": "#000000", "bg": "#ff0000"}], ["symbol-overlay-face-6", "face 6", {"fg": "#000000", "bg": "#fa8072"}], ["symbol-overlay-face-7", "face 7", {"fg": "#000000", "bg": "#00ff7f"}], ["symbol-overlay-face-8", "face 8", {"fg": "#000000", "bg": "#40e0d0"}]]}, "tmr": {"label": "tmr", "preview": "generic", "faces": [["tmr-description", "description", {"inherit": "bold"}], ["tmr-duration", "duration", {}], ["tmr-end-time", "end time", {"inherit": "error"}], ["tmr-finished", "finished", {"inherit": "error"}], ["tmr-is-acknowledged", "is acknowledged", {"inherit": "success"}], ["tmr-must-be-acknowledged", "must be acknowledged", {"inherit": "warning"}], ["tmr-start-time", "start time", {"inherit": "success"}], ["tmr-tabulated-acknowledgement", "tabulated acknowledgement", {"inherit": "bold"}], ["tmr-tabulated-description", "tabulated description", {"inherit": "font-lock-doc-face"}], ["tmr-tabulated-end-time", "tabulated end time", {"fg": "#800040"}], ["tmr-tabulated-remaining-time", "tabulated remaining time", {"fg": "#603f00"}], ["tmr-tabulated-start-time", "tabulated start time", {"fg": "#004476"}]]}, "transient": {"label": "transient", "preview": "generic", "faces": [["transient-active-infix", "active infix", {"inherit": "highlight"}], ["transient-argument", "argument", {"bold": true, "inherit": "font-lock-string-face"}], ["transient-delimiter", "delimiter", {"inherit": "shadow"}], ["transient-disabled-suffix", "disabled suffix", {"fg": "#000000", "bg": "#ff0000", "bold": true}], ["transient-enabled-suffix", "enabled suffix", {"fg": "#000000", "bg": "#00ff00", "bold": true}], ["transient-heading", "heading", {"inherit": "font-lock-keyword-face"}], ["transient-higher-level", "higher level", {"box": {"style": "line", "width": 1, "color": "grey60"}}], ["transient-inactive-argument", "inactive argument", {"inherit": "shadow"}], ["transient-inactive-value", "inactive value", {"inherit": "shadow"}], ["transient-inapt-argument", "inapt argument", {"bold": true, "inherit": "shadow"}], ["transient-inapt-suffix", "inapt suffix", {"italic": true, "inherit": "shadow"}], ["transient-key", "key", {"inherit": "font-lock-builtin-face"}], ["transient-key-exit", "key exit", {"fg": "#aa2222", "inherit": "transient-key"}], ["transient-key-noop", "key noop", {"fg": "#cccccc", "inherit": "transient-key"}], ["transient-key-recurse", "key recurse", {"fg": "#2266ff", "inherit": "transient-key"}], ["transient-key-return", "key return", {"fg": "#aaaa11", "inherit": "transient-key"}], ["transient-key-stack", "key stack", {"fg": "#dd4488", "inherit": "transient-key"}], ["transient-key-stay", "key stay", {"fg": "#22aa22", "inherit": "transient-key"}], ["transient-mismatched-key", "mismatched key", {"box": {"style": "line", "width": 1, "color": "#ff00ff"}}], ["transient-nonstandard-key", "nonstandard key", {"box": {"style": "line", "width": 1, "color": "#00ffff"}}], ["transient-unreachable", "unreachable", {"inherit": "shadow"}], ["transient-unreachable-key", "unreachable key", {"inherit": ["shadow", "transient-key"]}], ["transient-value", "value", {"bold": true, "inherit": "font-lock-string-face"}]]}, "vertico": {"label": "vertico", "preview": "generic", "faces": [["vertico-current", "current", {"inherit": "highlight"}], ["vertico-group-separator", "group separator", {"strike": true, "inherit": "vertico-group-title"}], ["vertico-group-title", "group title", {"italic": true, "inherit": "shadow"}], ["vertico-multiline", "multiline", {"inherit": "shadow"}]]}, "web-mode": {"label": "web-mode", "preview": "generic", "faces": [["web-mode-annotation-face", "annotation", {"inherit": "web-mode-comment-face"}], ["web-mode-annotation-html-face", "annotation html", {"italic": true, "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-tag-face", "annotation tag", {"underline": true, "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-type-face", "annotation type", {"bold": true, "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-value-face", "annotation value", {"italic": true, "inherit": "web-mode-annotation-face"}], ["web-mode-block-attr-name-face", "block attr name", {"fg": "#8fbc8f"}], ["web-mode-block-attr-value-face", "block attr value", {"fg": "#5f9ea0"}], ["web-mode-block-comment-face", "block comment", {"inherit": "web-mode-comment-face"}], ["web-mode-block-control-face", "block control", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-block-delimiter-face", "block delimiter", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-block-face", "block", {"bg": "#ffffe0"}], ["web-mode-block-string-face", "block string", {"inherit": "web-mode-string-face"}], ["web-mode-bold-face", "bold", {"bold": true}], ["web-mode-builtin-face", "builtin", {"inherit": "font-lock-builtin-face"}], ["web-mode-comment-face", "comment", {"inherit": "font-lock-comment-face"}], ["web-mode-comment-keyword-face", "comment keyword", {"bold": true}], ["web-mode-constant-face", "constant", {"inherit": "font-lock-constant-face"}], ["web-mode-css-at-rule-face", "css at rule", {"inherit": "font-lock-constant-face"}], ["web-mode-css-color-face", "css color", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-comment-face", "css comment", {"inherit": "web-mode-comment-face"}], ["web-mode-css-function-face", "css function", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-priority-face", "css priority", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-property-name-face", "css property name", {"inherit": "font-lock-variable-name-face"}], ["web-mode-css-pseudo-class-face", "css pseudo class", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-selector-class-face", "css selector class", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-selector-face", "css selector", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-selector-tag-face", "css selector tag", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-string-face", "css string", {"inherit": "web-mode-string-face"}], ["web-mode-css-variable-face", "css variable", {"italic": true, "inherit": "web-mode-variable-name-face"}], ["web-mode-current-column-highlight-face", "current column highlight", {"bg": "#3e3c36"}], ["web-mode-current-element-highlight-face", "current element highlight", {"fg": "#ffffff", "bg": "#000000"}], ["web-mode-doctype-face", "doctype", {"fg": "#bebebe"}], ["web-mode-error-face", "error", {"bg": "#ff0000"}], ["web-mode-filter-face", "filter", {"inherit": "font-lock-function-name-face"}], ["web-mode-folded-face", "folded", {"underline": true}], ["web-mode-function-call-face", "function call", {"inherit": "font-lock-function-name-face"}], ["web-mode-function-name-face", "function name", {"inherit": "font-lock-function-name-face"}], ["web-mode-html-attr-custom-face", "html attr custom", {"inherit": "web-mode-html-attr-name-face"}], ["web-mode-html-attr-engine-face", "html attr engine", {"inherit": "web-mode-block-delimiter-face"}], ["web-mode-html-attr-equal-face", "html attr equal", {"inherit": "web-mode-html-attr-name-face"}], ["web-mode-html-attr-name-face", "html attr name", {"fg": "#8b8989"}], ["web-mode-html-attr-value-face", "html attr value", {"inherit": "font-lock-string-face"}], ["web-mode-html-entity-face", "html entity", {"italic": true}], ["web-mode-html-tag-bracket-face", "html tag bracket", {"fg": "#242424"}], ["web-mode-html-tag-custom-face", "html tag custom", {"inherit": "web-mode-html-tag-face"}], ["web-mode-html-tag-face", "html tag", {"fg": "#8b8989"}], ["web-mode-html-tag-namespaced-face", "html tag namespaced", {"inherit": "web-mode-block-control-face"}], ["web-mode-html-tag-unclosed-face", "html tag unclosed", {"underline": true, "inherit": "web-mode-html-tag-face"}], ["web-mode-inlay-face", "inlay", {"bg": "#ffffe0"}], ["web-mode-interpolate-color1-face", "interpolate color1", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color2-face", "interpolate color2", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color3-face", "interpolate color3", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color4-face", "interpolate color4", {"inherit": "web-mode-string-face"}], ["web-mode-italic-face", "italic", {"italic": true}], ["web-mode-javascript-comment-face", "javascript comment", {"inherit": "web-mode-comment-face"}], ["web-mode-javascript-string-face", "javascript string", {"inherit": "web-mode-string-face"}], ["web-mode-json-comment-face", "json comment", {"inherit": "web-mode-comment-face"}], ["web-mode-json-context-face", "json context", {"fg": "#cd69c9"}], ["web-mode-json-key-face", "json key", {"fg": "#dda0dd"}], ["web-mode-json-string-face", "json string", {"inherit": "web-mode-string-face"}], ["web-mode-jsx-depth-1-face", "jsx depth 1", {"bg": "#000053"}], ["web-mode-jsx-depth-2-face", "jsx depth 2", {"bg": "#001970"}], ["web-mode-jsx-depth-3-face", "jsx depth 3", {"bg": "#002984"}], ["web-mode-jsx-depth-4-face", "jsx depth 4", {"bg": "#49599a"}], ["web-mode-jsx-depth-5-face", "jsx depth 5", {"bg": "#9499b7"}], ["web-mode-keyword-face", "keyword", {"inherit": "font-lock-keyword-face"}], ["web-mode-param-name-face", "param name", {"fg": "#cdc9c9"}], ["web-mode-part-comment-face", "part comment", {"inherit": "web-mode-comment-face"}], ["web-mode-part-face", "part", {"inherit": "web-mode-block-face"}], ["web-mode-part-string-face", "part string", {"inherit": "web-mode-string-face"}], ["web-mode-preprocessor-face", "preprocessor", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-script-face", "script", {"inherit": "web-mode-part-face"}], ["web-mode-sql-keyword-face", "sql keyword", {"bold": true, "italic": true}], ["web-mode-string-face", "string", {"inherit": "font-lock-string-face"}], ["web-mode-style-face", "style", {"inherit": "web-mode-part-face"}], ["web-mode-symbol-face", "symbol", {"fg": "#eeb422"}], ["web-mode-type-face", "type", {"inherit": "font-lock-type-face"}], ["web-mode-underline-face", "underline", {"underline": true}], ["web-mode-variable-name-face", "variable name", {"inherit": "font-lock-variable-name-face"}], ["web-mode-warning-face", "warning", {"inherit": "font-lock-warning-face"}], ["web-mode-whitespace-face", "whitespace", {"bg": "#68228b"}]]}, "yasnippet": {"label": "yasnippet", "preview": "generic", "faces": [["yas--field-debug-face", "yas field debug", {}], ["yas-field-highlight-face", "yas field highlight", {"inherit": "region"}]]}};
+let MAP={"kw": "#d3d3d3", "bi": "#d3d3d3", "pp": "#d3d3d3", "fnd": "#0000ff", "fnc": "#0000ff", "dec": "", "ty": "#e5e5e5", "prop": "#e5e5e5", "con": "#d3d3d3", "num": "#000000", "esc": "#000000", "str": "#696969", "re": "#696969", "doc": "#696969", "cm": "#696969", "cmd": "#696969", "var": "#e5e5e5", "op": "#000000", "punc": "#000000", "p": "#000000", "bg": "#ffffff"}, PALETTE=[["#ffffff", "bg", "ground"], ["#000000", "fg", "ground"], ["#d3d3d3", "lightgray", "lightgray"], ["#0000ff", "blue1", "blue"], ["#e5e5e5", "gray90", "gray"], ["#696969", "dimgray", "dimgray"], ["#eedc82", "lightgoldenrod2", "lightgoldenrod"], ["#b4eeb4", "darkseagreen2", "darkseagreen"], ["#bfbfbf", "grey75", "grey"], ["#333333", "grey20", "grey"], ["#f2f2f2", "grey95", "grey"], ["#ff00ff", "magenta", "magenta"], ["#b0e2ff", "lightskyblue1", "lightskyblue"], ["#cd00cd", "magenta3", "magenta"], ["#afeeee", "paleturquoise", "paleturquoise"], ["#ffc1c1", "rosybrown1", "rosybrown"], ["#40e0d0", "turquoise", "turquoise"], ["#a020f0", "purple", "purple"], ["#3a5fcd", "royalblue3", "royalblue"], ["#ff0000", "red", "red"], ["#ff8c00", "dark-orange", "dark-orange"], ["#228b22", "forestgreen", "forestgreen"], ["#aaa", "color-22", "color-22"], ["#000", "color-23", "color-23"], ["#aa0", "color-24", "color-24"], ["#070", "color-25", "color-25"], ["#daa520", "goldenrod", "goldenrod"], ["#00bfff", "deep-sky-blue", "deep-sky-blue"], ["#ee00ee", "magenta2", "magenta"], ["#00ff00", "green", "green"], ["#ffff00", "yellow", "yellow"], ["#00ffff", "cyan", "cyan"], ["#6b6b6b", "color-32", "color-32"], ["#979797", "color-33", "color-33"], ["unspecified", "color-34", "color-34"], ["#223fbf", "color-35", "color-35"], ["#8f0075", "color-36", "color-36"], ["#145a00", "color-37", "color-37"], ["#804000", "color-38", "color-38"], ["#efcbcf", "color-39", "color-39"], ["#ffd700", "gold", "gold"], ["#8b0000", "darkred", "darkred"], ["#ffa500", "orange", "orange"], ["#f0e68c", "khaki", "khaki"], ["#8b008b", "dark-magenta", "dark-magenta"], ["#ff4500", "orange-red", "orange-red"], ["#deb887", "burlywood", "burlywood"], ["#b22222", "firebrick", "firebrick"], ["#cd8500", "orange3", "orange"], ["#00008b", "dark-blue", "dark-blue"], ["#9400d3", "dark-violet", "dark-violet"], ["#6a9fb5", "color-51", "color-51"], ["#2188b6", "color-52", "color-52"], ["#75b5aa", "color-53", "color-53"], ["#0595bd", "color-54", "color-54"], ["#446674", "color-55", "color-55"], ["#48746d", "color-56", "color-56"], ["#6d8143", "color-57", "color-57"], ["#72584b", "color-58", "color-58"], ["#915b2d", "color-59", "color-59"], ["#7e5d5f", "color-60", "color-60"], ["#694863", "color-61", "color-61"], ["#843031", "color-62", "color-62"], ["#838484", "color-63", "color-63"], ["#b48d56", "color-64", "color-64"], ["#90a959", "color-65", "color-65"], ["#677174", "color-66", "color-66"], ["#2c7d6e", "color-67", "color-67"], ["#3d6837", "color-68", "color-68"], ["#ce7a4e", "color-69", "color-69"], ["#ff505b", "color-70", "color-70"], ["#e69dd6", "color-71", "color-71"], ["#eb595a", "color-72", "color-72"], ["#7f7869", "color-73", "color-73"], ["#ff9300", "color-74", "color-74"], ["#8f5536", "color-75", "color-75"], ["#d4843e", "color-76", "color-76"], ["#fc505b", "color-77", "color-77"], ["#68295b", "color-78", "color-78"], ["#5d54e1", "color-79", "color-79"], ["#ac4142", "color-80", "color-80"], ["#716e68", "color-81", "color-81"], ["#ffcc0e", "color-82", "color-82"], ["#8b1a1a", "firebrick4", "firebrick"], ["#fff8dc", "cornsilk", "cornsilk"], ["#cd5c5c", "indian-red", "indian-red"], ["#f5deb3", "wheat", "wheat"], ["#add8e6", "light-blue", "light-blue"], ["#ccc", "color-88", "color-88"], ["#cd0000", "red3", "red"], ["#0000cd", "blue3", "blue"], ["#cc9393", "color-91", "color-91"], ["#cccccc", "grey80", "grey"], ["#bebebe", "gray", "gray"], ["#88090b", "color-94", "color-94"], ["#707183", "color-95", "color-95"], ["#7388d6", "color-96", "color-96"], ["#909183", "color-97", "color-97"], ["#709870", "color-98", "color-98"], ["#907373", "color-99", "color-99"], ["#6276ba", "color-100", "color-100"], ["#858580", "color-101", "color-101"], ["#80a880", "color-102", "color-102"], ["#887070", "color-103", "color-103"], ["#1e90ff", "dodger-blue", "dodger-blue"], ["#ff69b4", "hot-pink", "hot-pink"], ["#da70d6", "orchid", "orchid"], ["#fa8072", "salmon", "salmon"], ["#00ff7f", "spring-green", "spring-green"], ["#800040", "color-109", "color-109"], ["#603f00", "color-110", "color-110"], ["#004476", "color-111", "color-111"], ["grey60", "color-112", "color-112"], ["#aa2222", "color-113", "color-113"], ["#2266ff", "color-114", "color-114"], ["#aaaa11", "color-115", "color-115"], ["#dd4488", "color-116", "color-116"], ["#22aa22", "color-117", "color-117"], ["#8fbc8f", "color-118", "color-118"], ["#5f9ea0", "color-119", "color-119"], ["#ffffe0", "lightyellow1", "lightyellow"], ["#3e3c36", "color-121", "color-121"], ["#8b8989", "snow4", "snow"], ["#242424", "grey14", "grey"], ["#cd69c9", "orchid3", "orchid"], ["#dda0dd", "plum", "plum"], ["#000053", "color-126", "color-126"], ["#001970", "color-127", "color-127"], ["#002984", "color-128", "color-128"], ["#49599a", "color-129", "color-129"], ["#9499b7", "color-130", "color-130"], ["#cdc9c9", "snow3", "snow"], ["#eeb422", "goldenrod2", "goldenrod"], ["#68228b", "darkorchid4", "darkorchid"]], SYNTAX={"kw": {"fg": "#d3d3d3", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "bi": {"fg": "#d3d3d3", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "pp": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-builtin-face"}, "fnd": {"fg": "#0000ff", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "fnc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-function-name-face"}, "dec": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "ty": {"fg": "#e5e5e5", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "prop": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-variable-name-face"}, "con": {"fg": "#d3d3d3", "bg": null, "bold": true, "italic": false, "underline": true, "strike": false, "box": null}, "num": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "esc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-regexp-grouping-backslash"}, "str": {"fg": "#696969", "bg": null, "bold": false, "italic": true, "underline": false, "strike": false, "box": null}, "re": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-string-face"}, "doc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-string-face"}, "cm": {"fg": "#696969", "bg": null, "bold": true, "italic": true, "underline": false, "strike": false, "box": null}, "cmd": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-comment-face"}, "var": {"fg": "#e5e5e5", "bg": null, "bold": true, "italic": true, "underline": false, "strike": false, "box": null}, "op": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "punc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "p": {"fg": "#000000", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "bg": {"fg": "#ffffff", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}}, UIMAP={"cursor": {"fg": null, "bg": "#000000", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "region": {"fg": null, "bg": "#eedc82", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "hl-line": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "highlight"}, "highlight": {"fg": null, "bg": "#b4eeb4", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "mode-line": {"fg": "#000000", "bg": "#bfbfbf", "bold": false, "italic": false, "underline": false, "strike": false, "box": {"style": "released", "width": 1, "color": null}}, "mode-line-inactive": {"fg": "#333333", "bg": "#e5e5e5", "bold": false, "italic": false, "underline": false, "strike": false, "box": {"style": "line", "width": 1, "color": "#bfbfbf"}, "inherit": "mode-line"}, "fringe": {"fg": null, "bg": "#f2f2f2", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "line-number": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": ["shadow", "default"]}, "line-number-current-line": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "line-number"}, "minibuffer-prompt": {"fg": "#ff00ff", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "isearch": {"fg": "#b0e2ff", "bg": "#cd00cd", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "lazy-highlight": {"fg": null, "bg": "#afeeee", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "isearch-fail": {"fg": null, "bg": "#ffc1c1", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "show-paren-match": {"fg": null, "bg": "#40e0d0", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "show-paren-mismatch": {"fg": "#ffffff", "bg": "#a020f0", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "link": {"fg": "#3a5fcd", "bg": null, "bold": false, "italic": false, "underline": true, "strike": false, "box": null}, "error": {"fg": "#ff0000", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "warning": {"fg": "#ff8c00", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "success": {"fg": "#228b22", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "vertical-border": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}};
+let LOCKED=new Set([]); // rows whose choice is decided (controls disabled, skipped by erase/reset batch actions)
const DELTAE_MIN=0.02; // OKLab ΔE below this = colors too close to tell apart (perceptual-metrics spec)
+const DEFAULT_UIMAP=JSON.parse(JSON.stringify(UIMAP));
+function syntaxBlank(k){return {fg:MAP[k]||null,bg:null,bold:false,italic:false,underline:false,strike:false,box:null};}
+function syncSyntaxCache(k){const s=SYNTAX[k]||syntaxBlank(k);MAP[k]=s.fg||'';}
+function syncAllSyntaxCache(){CATS.forEach(c=>syncSyntaxCache(c[0]));}
+function syncSyntaxFromCache(){CATS.forEach(c=>{const k=c[0];syntaxFace(k).fg=MAP[k]||null;});}
+function syntaxFace(k){if(!SYNTAX[k])SYNTAX[k]=syntaxBlank(k);return SYNTAX[k];}
+function setSyntaxFg(k,hex){syntaxFace(k).fg=hex||null;syncSyntaxCache(k);}
+syncAllSyntaxCache();
+const DEFAULT_SYNTAX=JSON.parse(JSON.stringify(SYNTAX));
// --- tier-3 package faces: pure state helpers (Phase 1) ---
// Thin wrappers over the pure logic in app-core.js (inlined further down),
// passing the live module state. packagesForExport / mergePackagesInto live in
@@ -426,14 +462,20 @@ function reliefColors(bgHex) {
// Resolve a palette name (or a raw #hex) to a hex; null when the name is unknown.
function nameToHex(n,palette){if(!n)return null;if(/^#/.test(n))return n;const p=palette.find(p=>p[1]===n);return p?p[0]:null;}
+function normalizePkgFace(d,source,palette){
+ d=d||{};
+ const resolve=(v)=>palette?nameToHex(v,palette):v;
+ return {fg:resolve(d.fg)??null,bg:resolve(d.bg)??null,bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit??null,height:d.height||1,box:d.box??null,source:source||d.source||'user'};
+}
+
// Seed the package-face map from the app inventory's per-face defaults.
-function buildPkgmap(apps,palette){const m={};for(const app in apps){m[app]={};for(const row of apps[app].faces){const face=row[0],d=row[2]||{};m[app][face]={fg:nameToHex(d.fg,palette),bg:nameToHex(d.bg,palette),bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit||null,height:d.height||1,box:d.box||null,source:'default'};}}return m;}
+function buildPkgmap(apps,palette){const m={};for(const app in apps){m[app]={};for(const row of apps[app].faces){m[app][row[0]]=normalizePkgFace(row[2],'default',palette);}}return m;}
// The package faces worth exporting (anything seeded or user-touched), trimmed.
function packagesForExport(map){const out={};for(const app in map){const faces={};for(const face in map[app]){const f=map[app][face];if(f.source==='default'||f.source==='user'||f.source==='cleared'){const o={fg:f.fg,bg:f.bg,bold:f.bold,italic:f.italic,underline:!!f.underline,strike:!!f.strike,inherit:f.inherit,source:f.source};if(f.height&&f.height!==1)o.height=f.height;if(f.box)o.box=f.box;faces[face]=o;}}if(Object.keys(faces).length)out[app]=faces;}return out;}
// Merge an imported package block into a face map, filling missing fields.
-function mergePackagesInto(map,pkgs){if(!pkgs)return;for(const app in pkgs){if(!map[app])map[app]={};for(const face in pkgs[app]){const f=pkgs[app][face]||{};map[app][face]={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,box:f.box??null,source:f.source||'user'};}}}
+function mergePackagesInto(map,pkgs){if(!pkgs)return;for(const app in pkgs){if(!map[app])map[app]={};for(const face in pkgs[app]){const f=pkgs[app][face]||{};map[app][face]=normalizePkgFace(f,f.source||'user');}}}
// Effective fg/bg for a package face, following its inherit chain. seen guards
// against an inherit cycle (returns null rather than recursing forever).
@@ -441,7 +483,7 @@ function effResolve(map,app,face,attr,seen){seen=seen||{};const f=map[app]&&map[
// Standard swatch-dropdown option list: a default entry, then the palette. When
// cur is set but no longer in the palette, surface it as a "(gone)" entry first.
-function optList(cur,palette){const have=cur===''||palette.some(p=>p[0]===cur);return [['','— default —'],...(have?palette:[[cur,'(gone) '+cur],...palette])];}
+function optList(cur,palette){const have=cur===''||palette.some(p=>p[0]===cur);return [['','— default —'],...(have?palette:[[cur,'(gone)'],...palette])];}
// Turn a theme name into a safe filename slug: collapse runs of disallowed
// characters to a single dash, trim leading/trailing dashes, fall back to 'theme'.
@@ -533,97 +575,138 @@ function lMax(hue,chroma,fgSet,target){
return {L:loL,status:at(loL).clamped?'clamp':'ok'};
}
-// --- color families (color-families spec, Phase 1) ---------------------------
-// Families are a display grouping derived from the hex every render — never from
-// names — so renaming a color can't move it. The flat palette stays the editable
-// truth; these pure functions group it, regenerate a family's ramp, and plan the
+// --- color columns -----------------------------------------------------------
+// Columns are structural, not inferred by color. Generated ramp entries are named
+// base-1/base/base+1 and remain in that base column regardless of their hex. A
+// manually-added color starts as its own singleton column. The flat palette stays
+// the editable truth; these pure functions group it, regenerate a ramp, and plan
// assignment re-point across a regenerate.
function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));}
-function nameOfHex(palette,hex){const p=palette.find(p=>p[0].toLowerCase()===hex.toLowerCase());return p?p[1]:null;}
-function hueDist(a,b){const d=Math.abs(a-b);return Math.min(d,360-d);}
+function isReservedGroundLikeName(name){return /^(bg|fg)(?:[-_+].+|\d.*)$/i.test(name||'');}
+function isPureEndpointHex(hex){const h=(hex||'').toLowerCase();return h==='#ffffff'||h==='#000000';}
+function interpOklabHex(a,b,t,offset){
+ const lab={L:a.L+(b.L-a.L)*t,a:a.a+(b.a-a.a)*t,b:a.b+(b.b-a.b)*t};
+ const lrgb=oklab2lrgb(lab.L,lab.a,lab.b);
+ return {hex:lrgb2hex(lrgb),offset,clamped:!inGamut(lrgb)};
+}
+function columnStem(name){name=name||'color';if(/^color-\d+$/.test(name))return name;name=name.replace(/[+-]\d+$/,'');return name.replace(/\d+$/,'')||'color';}
+function columnOffset(name){const m=(name||'').match(/([+-]\d+)$/);return m?parseInt(m[1],10):0;}
+function legacyColumnStem(name){return isReservedGroundLikeName(name)?name:columnStem(name);}
+function legacyColumnOffset(name){return isReservedGroundLikeName(name)?0:columnOffset(name);}
+function columnIdOf(entry){return (entry&&entry[2])||legacyColumnStem(entry&&entry[1]);}
+function groundRoleOfEntry(entry,ground){
+ if(!entry)return null;
+ const [hex,name]=entry,col=entry[2],n=(name||'').toLowerCase(),h=(hex||'').toLowerCase();
+ const bg=(ground&&ground.bg||'').toLowerCase(),fg=(ground&&ground.fg||'').toLowerCase();
+ if(/^ground[+-]\d+$/i.test(name||''))return 'step';
+ if(col==='ground'){
+ if(bg&&h===bg)return 'bg';
+ if(fg&&h===fg)return 'fg';
+ return 'step';
+ }
+ if(bg&&h===bg&&(n==='bg'||n==='ground'))return 'bg';
+ if(fg&&h===fg&&n==='fg')return 'fg';
+ return null;
+}
+function nameOfGroundRole(palette,ground,role){
+ const found=palette.find(entry=>groundRoleOfEntry(entry,ground)===role);
+ return found?found[1]:null;
+}
+
+function normalizePaletteEntryCore(entry){
+ const hex=entry&&entry[0],name=(entry&&entry[1])||'color';
+ return [hex,name,(entry&&entry[2])||columnIdOf(entry)];
+}
+
+function groundColumnMembersFromPalette(palette,ground){
+ const byRole={bg:null,fg:null,steps:[]};
+ for(const entry of palette){
+ const role=groundRoleOfEntry(entry,ground);
+ if(role==='bg'||role==='fg')byRole[role]={hex:entry[0],name:entry[1]};
+ else if(role==='step')byRole.steps.push({hex:entry[0],name:entry[1]});
+ }
+ const stepIndex=m=>{const x=(m.name||'').match(/^ground[+-](\d+)$/i);return x?parseInt(x[1],10):Infinity;};
+ byRole.steps.sort((a,b)=>stepIndex(a)-stepIndex(b));
+ return [byRole.bg||{hex:ground&&ground.bg,name:'bg'},...byRole.steps,byRole.fg||{hex:ground&&ground.fg,name:'fg'}].filter(m=>m.hex);
+}
+
+function clearPalettePlan(palette,ground){
+ const normalized=palette.map(normalizePaletteEntryCore),removed=[],keep=[];
+ normalized.filter(entry=>!groundRoleOfEntry(entry,ground)).forEach(([hex,name])=>{if(name)removed.push({hex,name});});
+ const addEndpoint=(role,hex,name)=>{
+ const found=normalized.find(entry=>groundRoleOfEntry(entry,ground)===role);
+ if(found)keep.push(found);else if(hex)keep.push([hex,name,'ground']);
+ };
+ addEndpoint('bg',ground&&ground.bg,'bg');
+ addEndpoint('fg',ground&&ground.fg,'fg');
+ return {palette:keep,removed};
+}
-// A color reads as neutral below this chroma. Lightness-scaled (the Munsell
-// insight): the mid-tones need more chroma to read as a hue. Floored at both ends
-// rather than tapering to zero, so pale warm grays stay neutral (and pure white,
-// C=0 at L=1, doesn't evade a zero threshold) while pale chromatic tints stay
-// colored. Tuned on real palettes (Codex + Fable color-sorting reviews).
-function neutralThreshold(L){
- if(L<=0.2)return 0.020;
- if(L<0.6)return 0.020+0.015*(L-0.2)/0.4;
- if(L<0.85)return 0.035-0.017*(L-0.6)/0.25;
- return 0.018;
-}
-// Lightness-conditioned compatibility of two chromatic colors (Fable's LCCL):
-// hue must match tightly at equal lightness and may drift across a lightness gap,
-// because a tonal ramp drifts in hue with lightness by design. The low-chroma noise
-// term widens the hue tolerance where hue is ill-defined (pale tints). A chroma
-// clause keeps a vivid accent out of a soft family at the same lightness. <=1 is
-// compatible. Source: ~/color-sorting-fable.org.
-function pairRatio(a,b){
- const dL=Math.abs(a.L-b.L),dH=hueDist(a.H,b.H);
- const noise=Math.min(45,Math.atan(0.015/Math.max(Math.min(a.C,b.C),1e-6))*180/Math.PI);
- return Math.max(dH/(12+60*dL+noise),Math.abs(a.C-b.C)/(0.08+0.3*dL));
-}
-// Complete-linkage agglomerative clustering on pairRatio: greedily merge the two
-// clusters whose worst cross-pair is most compatible, stopping when no merge has
-// every cross-pair compatible. Complete linkage makes single-linkage chaining
-// structurally impossible — two ramps can't fuse through their converging pale
-// ends because their mid-lightness members stay far apart.
-function clusterChromatic(ms){
- let cl=ms.map(m=>[m]);
- const cd=(A,B)=>Math.max(...A.flatMap(a=>B.map(b=>pairRatio(a,b))));
- for(;;){
- let best=null;
- for(let i=0;i<cl.length;i++)for(let j=i+1;j<cl.length;j++){const d=cd(cl[i],cl[j]);if(!best||d<best.d)best={d,i,j};}
- if(!best||best.d>1)break;
- cl[best.i]=cl[best.i].concat(cl[best.j]);cl.splice(best.j,1);
+function deletePaletteColumnPlan(palette,ground,columnId){
+ const normalized=palette.map(normalizePaletteEntryCore),removed=[],keep=[];
+ for(const entry of normalized){
+ if(groundRoleOfEntry(entry,ground)||columnIdOf(entry)!==columnId)keep.push(entry);
+ else removed.push({hex:entry[0],name:entry[1]});
}
- return cl;
-}
-// A family from its members: base is the most-saturated member (tie toward
-// mid-lightness), the anchor for a generated ramp.
-function makeFamily(ms,neutral){
- let base=ms[0];
- for(const m of ms)if(m.C>base.C||(m.C===base.C&&Math.abs(m.L-0.5)<Math.abs(base.L-0.5)))base=m;
- return {base:base.hex,neutral:!!neutral,members:ms.map(m=>({hex:m.hex,name:m.name}))};
-}
-// Group a flat palette into the ground strip plus families. ground is {bg,fg}:
-// those two hexes form the pinned ground strip even when absent from the palette,
-// and a palette chip at a ground hex is not duplicated into a family. Near-neutrals
-// (chroma below the lightness-scaled threshold) form one neutral family; the rest
-// cluster by lightness-conditioned complete linkage (clusterChromatic).
-function familiesFromPalette(palette,ground){
+ return {palette:keep,removed};
+}
+
+function areAllLocked(keys,locked){
+ const has=k=>locked instanceof Set?locked.has(k):Array.isArray(locked)&&locked.includes(k);
+ return !!(keys&&keys.length)&&keys.every(has);
+}
+function lockToggleLabel(keys,locked){return areAllLocked(keys,locked)?'unlock all':'lock all';}
+function toggleLockSet(keys,locked){
+ const next=new Set(locked||[]),all=areAllLocked(keys,next);
+ (keys||[]).forEach(k=>all?next.delete(k):next.add(k));
+ return next;
+}
+
+// Group a flat palette into the ground strip plus structural columns. ground is
+// {bg,fg}; those endpoint hexes form the pinned ground column even when absent
+// from the palette, and ground+N entries are reserved for that column. Everything
+// else groups by its stable column id, not by OKLCH hue/chroma or display name.
+// Legacy two-field entries fall back to their generated-name stem until edited.
+function columnsFromPalette(palette,ground){
const bg=ground&&ground.bg,fg=ground&&ground.fg;
- const gset=new Set([bg,fg].filter(Boolean).map(h=>h.toLowerCase()));
const groundStrip=[];
- if(bg)groundStrip.push({hex:bg,role:'bg',name:nameOfHex(palette,bg)});
- if(fg)groundStrip.push({hex:fg,role:'fg',name:nameOfHex(palette,fg)});
- const neutrals=[],chromatic=[];
- for(const [hex,name] of palette){
- if(gset.has(hex.toLowerCase()))continue;
- const c=oklchOf(hex),m={hex,name,L:c.L,C:c.C,H:c.H};
- (c.C<neutralThreshold(c.L)?neutrals:chromatic).push(m);
+ if(bg)groundStrip.push({hex:bg,role:'bg',name:nameOfGroundRole(palette,ground,'bg')});
+ if(fg)groundStrip.push({hex:fg,role:'fg',name:nameOfGroundRole(palette,ground,'fg')});
+ const byColumn=new Map(),columns=[];
+ for(const entry of palette){
+ const [hex,name]=entry;
+ if(groundRoleOfEntry(entry,ground))continue;
+ const column=columnIdOf(entry),offset=entry[2]?columnOffset(name):legacyColumnOffset(name);
+ if(!byColumn.has(column))byColumn.set(column,{column,members:[]});
+ byColumn.get(column).members.push({hex,name,offset,column});
}
- const families=[];
- if(neutrals.length)families.push(makeFamily(neutrals,true));
- for(const cl of clusterChromatic(chromatic))families.push(makeFamily(cl,false));
- return {ground:groundStrip,families};
-}
-// Regenerate a family's members as a symmetric ramp around the base: n=0 is the
-// base alone (without ramp()'s 1-4 clamp), n>=1 is base plus ramp() steps, sorted
-// by offset. {members:[{hex,offset,clamped}]} or {members:[],error:'bad-hex'}.
-function regenFamily(baseHex,n,opts){
+ for(const f of byColumn.values()){
+ const base=(f.members.find(m=>m.offset===0)||f.members[0]).hex;
+ columns.push({base,column:f.column,stem:f.column,members:f.members.map(m=>({hex:m.hex,name:m.name,column:m.column}))});
+ }
+ return {ground:groundStrip,columns};
+}
+// Regenerate a column's members as a symmetric span around the base: n=0 is the
+// base alone, n>=1 divides the OKLab intervals black..base and base..white into
+// n interior steps per side. Pure black/white endpoint duplicates and rounded
+// base duplicates are skipped. {members:[{hex,offset,clamped}]} or
+// {members:[],error:'bad-hex'}.
+function regenColumn(baseHex,n,opts){
const hex=typeof baseHex==='string'?normHex(baseHex):null;
if(!hex)return {members:[],error:'bad-hex'};
- const k=Math.min(4,Math.max(0,Math.round(n||0)));
+ const k=Math.min(8,Math.max(0,Math.round(n||0)));
if(k===0)return {members:[{hex,offset:0,clamped:false}]};
- const r=ramp(hex,Object.assign({},opts,{n:k}));
- if(r.error)return {members:[],error:r.error};
- const members=[...r.steps,{hex,offset:0,clamped:false}].sort((a,b)=>a.offset-b.offset);
+ const base=srgb2oklab(hex),black=srgb2oklab('#000000'),white=srgb2oklab('#ffffff'),steps=[];
+ for(let i=1;i<=k;i++){
+ const dark=interpOklabHex(black,base,i/(k+1),i-k-1);
+ const light=interpOklabHex(base,white,i/(k+1),i);
+ steps.push(dark,light);
+ }
+ const members=[...steps.filter(s=>!isPureEndpointHex(s.hex)&&s.hex.toLowerCase()!==hex),{hex,offset:0,clamped:false}].sort((a,b)=>a.offset-b.offset);
return {members};
}
-// Rank a family's current member hexes by lightness and give each a signed offset
+// Rank a column's current member hexes by lightness and give each a signed offset
// from the base (the matching hex, or the nearest by lightness if the base isn't
// present). Lets a regenerate match old positions to new ramp offsets.
function rankByLightness(memberHexes,baseHex){
@@ -646,22 +729,45 @@ function stepRepointPlan(oldRanked,newMembers){
return {map,removed};
}
-// Order a family's members dark to light by OKLCH lightness.
-function sortFamilyMembers(fam){return Object.assign({},fam,{members:[...fam.members].sort((a,b)=>oklchOf(a.hex).L-oklchOf(b.hex).L)});}
-// Order families for display: neutrals first (by base lightness), then chromatic
-// by base hue, ties broken by base lightness then base hex. Each family's members
-// are lightness-sorted. Display-only — the stored palette order is untouched.
-function sortFamilies(families){
- const keyed=families.map(f=>{const c=oklchOf(f.base);return {f,neutral:!!f.neutral,H:c.H,L:c.L,base:f.base};});
- keyed.sort((a,b)=>{
- if(a.neutral!==b.neutral)return a.neutral?-1:1;
- if(a.neutral&&b.neutral)return a.L-b.L;
- const ah=Math.round(a.H),bh=Math.round(b.H); // a hue hair shouldn't outrank lightness
- if(ah!==bh)return ah-bh;
- if(a.L!==b.L)return a.L-b.L;
- return a.base.toLowerCase()<b.base.toLowerCase()?-1:a.base.toLowerCase()>b.base.toLowerCase()?1:0;
- });
- return keyed.map(k=>sortFamilyMembers(k.f));
+// Preserve structural order. Generated ramps are inserted in offset order, and
+// columns are emitted in first-seen palette order. No color sorting happens here.
+function sortColumnMembers(column){return Object.assign({},column,{members:[...column.members]});}
+function sortColumns(columns){return columns.map(sortColumnMembers);}
+function lightestFirstMembers(members){return [...members].sort((a,b)=>oklchOf(b.hex).L-oklchOf(a.hex).L);}
+
+// Dropdown order for color selection mirrors the visual palette organization:
+// bg/fg first, then structural columns in display order. Within each group,
+// choices run lightest-to-darkest. Stored palette order stays untouched; this is
+// selection-only organization.
+function paletteOptionList(cur,palette,ground){
+ const have=cur===''||palette.some(p=>p[0]===cur)||[ground&&ground.bg,ground&&ground.fg].filter(Boolean).includes(cur);
+ const out=[['','— default —']],seen=new Set();
+ if(!have)out.push([cur,'(gone)']);
+ const add=(hex,name)=>{if(!hex)return;const key=hex.toLowerCase()+'|'+(name||'');if(seen.has(key))return;seen.add(key);out.push([hex,name||hex]);};
+ const grouped=columnsFromPalette(palette,ground||{});
+ const groundMembers=grouped.ground.map(g=>({hex:g.hex,name:g.name||g.role}))
+ .concat(palette.filter(entry=>groundRoleOfEntry(entry,ground)==='step').map(([hex,name])=>({hex,name})));
+ groundMembers.forEach(m=>add(m.hex,m.name));
+ sortColumns(grouped.columns).forEach(f=>lightestFirstMembers(f.members).forEach(m=>add(m.hex,m.name)));
+ return out;
+}
+function spanNeighborHex(cur,palette,ground,dir){
+ if(!cur)return null;
+ const wanted=(cur||'').toLowerCase(),groups=[],byLight=(a,b)=>oklchOf(a.hex).L-oklchOf(b.hex).L;
+ const addGroup=members=>{
+ const seen=new Set(),g=[];
+ members.filter(m=>m&&m.hex).sort(byLight).forEach(m=>{const h=m.hex.toLowerCase();if(!seen.has(h)){seen.add(h);g.push(m);}});
+ if(g.length)groups.push(g);
+ };
+ addGroup(groundColumnMembersFromPalette(palette,ground||{}));
+ sortColumns(columnsFromPalette(palette,ground||{}).columns).forEach(f=>addGroup(f.members));
+ for(const g of groups){
+ const i=g.findIndex(m=>(m.hex||'').toLowerCase()===wanted);
+ if(i<0)continue;
+ const next=g[i+(dir>0?1:-1)];
+ return next?next.hex:null;
+ }
+ return null;
}
// Pure color/UI-boundary helpers (normHex, ratingColor, textOn), inlined from
// app-util.js. textOn uses rl from the colormath core above.
@@ -696,8 +802,7 @@ function renderCode(){
const lang=document.getElementById('langsel').value;let html='';
for(const line of SAMPLES[lang]){
if(line.length===0){html+='\n';continue;}
- for(const [k,t] of line){const c=effFg(MAP[k])||'#cdced1';const w=BOLD[k]?'bold':'normal';const s=ITALIC[k]?'italic':'normal';
- html+=`<span data-k="${k}" style="color:${c};font-weight:${w};font-style:${s}">${esc(t)}</span>`;}
+ for(const [k,t] of line)html+=`<span data-k="${k}" style="${syntaxStyle(k)}">${esc(t)}</span>`;
html+='\n';}
const cp=document.getElementById('codepre');cp.innerHTML=html;
cp.onclick=(e)=>{const s=e.target.closest('[data-k]');if(s)flashAssign(s.dataset.k);};
@@ -709,13 +814,25 @@ function renderCode(){
let _ddPop=null;
function closeColorDropdown(){if(_ddPop){_ddPop.remove();_ddPop=null;}}
document.addEventListener('pointerdown',e=>{if(_ddPop&&!e.target.closest('.cdd')&&!e.target.closest('.cddpop'))closeColorDropdown();});
-function mkColorDropdown(options,cur,onPick){
- const t=document.createElement('div');t.className='cdd';t.tabIndex=0;
+function mkColorDropdown(options,cur,onPick,opts={}){
+ const wrap=document.createElement('div');wrap.className='cstep';
+ const left=document.createElement('button'),right=document.createElement('button');
+ left.className='cstepbtn';right.className='cstepbtn';left.type=right.type='button';
+ left.textContent='‹';right.textContent='›';left.title='move to next darker color in this column';right.title='move to next lighter color in this column';
+ const t=document.createElement('div');t.className='cdd'+(opts.compact?' compact':'');t.tabIndex=0;
const nameOf=h=>{const o=options.find(p=>p[0]===h);return o?o[1]:(h||'none');};
- function paint(){t.style.background=cur||'#161412';t.style.color=cur?textOn(cur):'#b4b1a2';t.dataset.val=cur||'';
- t.innerHTML=`<span class="cddsw" style="background:${cur||'transparent'}"></span>${esc(nameOf(cur))}`;}
+ function step(dir){if(wrap.dataset.locked==='1')return;const next=spanNeighborHex(cur,PALETTE,{bg:MAP['bg'],fg:MAP['p']},dir);if(!next)return;cur=next;paint();onPick(next);}
+ function paintStepButtons(){
+ const locked=wrap.dataset.locked==='1';
+ left.disabled=locked||!spanNeighborHex(cur,PALETTE,{bg:MAP['bg'],fg:MAP['p']},-1);
+ right.disabled=locked||!spanNeighborHex(cur,PALETTE,{bg:MAP['bg'],fg:MAP['p']},1);
+ }
+ function paint(){const nm=nameOf(cur),ttl=cur?(nm+' '+cur):nm;t.style.background=cur||'#161412';t.style.color=cur?textOn(cur):'#b4b1a2';t.dataset.val=cur||'';t.title=ttl;t.classList.toggle('is-default',!cur);
+ t.innerHTML=opts.compact?`<span class="cddsw" style="background:${cur||'transparent'}"></span>`:`<span class="cddsw" style="background:${cur||'transparent'}"></span>${esc(nm)}`;paintStepButtons();}
paint();
- t.onclick=(e)=>{e.stopPropagation();if(t.dataset.locked==='1')return;if(_ddPop){closeColorDropdown();return;}
+ left.onclick=e=>{e.stopPropagation();step(-1);};
+ right.onclick=e=>{e.stopPropagation();step(1);};
+ t.onclick=(e)=>{e.stopPropagation();if(wrap.dataset.locked==='1')return;if(_ddPop){closeColorDropdown();return;}
const pop=document.createElement('div');pop.className='cddpop';
for(const [hex,name] of options){const row=document.createElement('div');row.className='cddrow'+(hex===cur?' sel':'');
row.innerHTML=`<span class="cddsw" style="background:${hex||'transparent'}"></span><span class="cddnm">${esc(name)}</span><span class="cddhx">${hex||''}</span>`;
@@ -728,11 +845,15 @@ function mkColorDropdown(options,cur,onPick){
if(r.bottom+ph>window.innerHeight-6)pop.style.top=Math.max(6,r.top-ph-2)+'px';
_ddPop=pop;};
t.setValue=h=>{cur=h;paint();};
- return t;}
+ wrap.setValue=h=>{cur=h;paint();};
+ wrap.syncLocked=paintStepButtons;
+ wrap.appendChild(left);wrap.appendChild(t);wrap.appendChild(right);paintStepButtons();
+ return wrap;}
// Standard option list for a swatch dropdown: a "default" entry, then the
-// palette. If cur is set but no longer in the palette, surface it as a "(gone)"
-// entry so the row still shows what it points at. Shared by all three tiers.
-function ddList(cur){return optList(cur,PALETTE);}
+// palette in the same ground/column order as the palette panel. If cur is set
+// but no longer in the palette, surface it as a "(gone)" entry so the row still
+// shows what it points at. Shared by all three tiers.
+function ddList(cur){return paletteOptionList(cur,PALETTE,{bg:MAP['bg'],fg:MAP['p']});}
// Shared lock toggle for any table row. lockKey is namespaced per tier (bare
// syntax kind, 'ui:'+face, 'pkg:'+app+':'+face). els are the row's editable
// controls — native selects/buttons/inputs are disabled; the custom swatch
@@ -744,8 +865,8 @@ function mkLockCell(lockKey,els){
lk.title=on?'locked — click to unlock':'click to lock this decision';
(els||[]).forEach(el=>{if(!el)return;
if(el.tagName==='SELECT'||el.tagName==='BUTTON'||el.tagName==='INPUT')el.disabled=on;
- else{el.dataset.locked=on?'1':'';el.classList.toggle('locked',on);}});}
- lk.onclick=()=>{LOCKED.has(lockKey)?LOCKED.delete(lockKey):LOCKED.add(lockKey);paint();};
+ else{el.dataset.locked=on?'1':'';el.classList.toggle('locked',on);if(el.syncLocked)el.syncLocked();}});}
+ lk.onclick=()=>{LOCKED.has(lockKey)?LOCKED.delete(lockKey):LOCKED.add(lockKey);paint();updateLockToggles();};
paint();td.appendChild(lk);return td;}
// B/I/U/S style buttons shared by the UI and package tables. isOn(attr) reads the
// current state of an attribute, onToggle(attr) flips it and repaints. Returns
@@ -755,69 +876,163 @@ function mkStyleButtons(isOn,onToggle){
const b=document.createElement('button');b.className='sbtn'+(isOn(at)?' on':'');b.textContent='a';
b.style.fontWeight=at==='bold'?'bold':'normal';b.style.fontStyle=at==='italic'?'italic':'normal';
b.style.textDecoration=at==='underline'?'underline':at==='strike'?'line-through':'none';b.title=at;
- b.onclick=()=>onToggle(at);return b;});}
-// Reset every unlocked row in a tier to its default. keyFn maps a row entry to
+ b.onclick=()=>{onToggle(at);b.classList.toggle('on',!!isOn(at));};return b;});}
+// Apply a batch action to every editable row in a tier. keyFn maps a row entry to
// its lock key, or null to skip the row entirely (syntax bg and the default fg);
// resetFn does the actual clearing. Locked rows are left untouched.
function clearUnlockedRows(items,keyFn,resetFn){
for(const it of items){const k=keyFn(it);if(k===null)continue;if(!LOCKED.has(k))resetFn(it);}
}
+function rebuildColorTables(){
+ buildTable();buildUITable();if(document.getElementById('pkgbody'))buildPkgTable();
+}
+function refreshPaletteState(opts={}){
+ renderPalette();rebuildColorTables();
+ if(opts.pkgPreview)buildPkgPreview();
+ if(opts.code!==false)renderCode();
+ if(opts.ground!==false)applyGround();
+ if(opts.covered)repaintCovered();
+}
+function syntaxLockKeys(){return CATS.map(c=>c[0]);}
+function uiLockKeys(){return UI_FACES.map(f=>'ui:'+f[0]);}
+function pkgLockKeys(){const app=curApp();return APPS[app].faces.map(f=>'pkg:'+app+':'+f[0]);}
+function tierLockKeys(tier){return tier==='syntax'?syntaxLockKeys():tier==='ui'?uiLockKeys():pkgLockKeys();}
+function updateLockToggle(tier){
+ const ids={syntax:'syntaxlocktoggle',ui:'uilocktoggle',pkg:'pkglocktoggle'},b=document.getElementById(ids[tier]);if(!b)return;
+ b.textContent=lockToggleLabel(tierLockKeys(tier),LOCKED);
+}
+function updateLockToggles(){updateLockToggle('syntax');updateLockToggle('ui');updateLockToggle('pkg');}
+function toggleAllLocks(tier){
+ const all=areAllLocked(tierLockKeys(tier),LOCKED);
+ LOCKED=toggleLockSet(tierLockKeys(tier),LOCKED);
+ if(tier==='syntax')buildTable();else if(tier==='ui')buildUITable();else buildPkgTable();
+ updateLockToggles();
+ notify((all?'unlocked ':'locked ')+(tier==='pkg'?'package':tier)+' rows',false);
+}
function clearUnlocked(){
- clearUnlockedRows(CATS,c=>(c[0]==='bg'||c[0]==='p')?null:c[0],c=>{MAP[c[0]]='';});
- buildTable();renderCode();notify('cleared unlocked elements to default',false);
+ clearUnlockedRows(CATS,c=>(c[0]==='bg'||c[0]==='p')?null:c[0],c=>{SYNTAX[c[0]]=syntaxBlank(c[0]);SYNTAX[c[0]].fg=null;syncSyntaxCache(c[0]);});
+ buildTable();renderCode();notify('erased editable syntax elements',false);
+}
+function resetUnlocked(){
+ clearUnlockedRows(CATS,c=>c[0],c=>{const k=c[0];SYNTAX[k]=JSON.parse(JSON.stringify(DEFAULT_SYNTAX[k]||syntaxBlank(k)));syncSyntaxCache(k);});
+ rebuildColorTables();buildPkgPreview();renderCode();applyGround();repaintCovered();
+ notify('reset editable syntax elements to captured defaults',false);
}
function clearUnlockedUI(){
- clearUnlockedRows(UI_FACES,f=>'ui:'+f[0],f=>{UIMAP[f[0]]={fg:null,bg:null,bold:false,italic:false,underline:false,strike:false};});
- buildUITable();buildMockFrame();notify('cleared unlocked UI faces to default',false);
+ clearUnlockedRows(UI_FACES,f=>'ui:'+f[0],f=>{UIMAP[f[0]]=uiFaceBlank();});
+ buildUITable();buildMockFrame();notify('erased editable UI faces',false);
+}
+function resetUnlockedUI(){
+ clearUnlockedRows(UI_FACES,f=>'ui:'+f[0],f=>{UIMAP[f[0]]=JSON.parse(JSON.stringify(DEFAULT_UIMAP[f[0]]||uiFaceBlank()));});
+ buildUITable();buildMockFrame();notify('reset editable UI faces to captured defaults',false);
}
function clearUnlockedPkg(){
const app=curApp();
- clearUnlockedRows(APPS[app].faces,f=>'pkg:'+app+':'+f[0],f=>{PKGMAP[app][f[0]]={fg:null,bg:null,bold:false,italic:false,underline:false,strike:false,inherit:null,height:1,source:'cleared'};});
- pkgChanged();notify('cleared unlocked '+app+' faces to default',false);
+ clearUnlockedRows(APPS[app].faces,f=>'pkg:'+app+':'+f[0],f=>{PKGMAP[app][f[0]]=normalizePkgFace({source:'cleared'},'cleared');});
+ pkgChanged();notify('erased editable '+app+' faces',false);
}
function buildTable(){
const tb=document.getElementById('legbody');tb.innerHTML='';
for(const [kind,label,ex] of CATS){
const tr=document.createElement('tr');tr.dataset.kind=kind;
- const cur=MAP[kind]||'';const list=ddList(cur);
+ const sf=syntaxFace(kind),cur=sf.fg||'',list=ddList(cur);
const exTd=document.createElement('td');exTd.className='ex';exTd.textContent=ex;
const crTd=document.createElement('td');crTd.style.whiteSpace='nowrap';crTd.style.fontSize='10pt';
- function styleEx(){exTd.style.color=(kind==='bg'?MAP['p']:effFg(MAP[kind]));exTd.style.background=MAP['bg'];exTd.style.fontWeight=BOLD[kind]?'bold':'normal';exTd.style.fontStyle=ITALIC[kind]?'italic':'normal';}
- function styleCr(){const r=contrast((kind==='bg'?MAP['p']:effFg(MAP[kind])),MAP['bg']);crTd.innerHTML=crHtml(r);}
- const dd=mkColorDropdown(list,cur,(hex)=>{MAP[kind]=hex;styleEx();styleCr();renderCode();if(kind==='bg'||kind==='p'){applyGround();buildTable();buildPkgTable();buildPkgPreview();}repaintCovered();});
+ function rowFg(){return kind==='bg'?MAP['p']:effFg(syntaxFace(kind).fg);}
+ function rowBg(){return syntaxFace(kind).bg||MAP['bg'];}
+ function styleEx(){const s=syntaxFace(kind);exTd.style.color=rowFg();exTd.style.background=rowBg();exTd.style.fontWeight=s.bold?'bold':'normal';exTd.style.fontStyle=s.italic?'italic':'normal';exTd.style.textDecoration=(s.underline?'underline ':'')+(s.strike?'line-through':'')||'none';exTd.style.boxShadow=boxCss(s.box,rowBg());}
+ function styleCr(){const r=contrast(rowFg(),rowBg());crTd.innerHTML=crHtml(r);}
+ const dd=mkColorDropdown(list,cur,(hex)=>{const s=syntaxFace(kind);s.fg=hex||null;syncSyntaxCache(kind);styleEx();styleCr();renderCode();if(kind==='bg'||kind==='p'){applyGround();buildTable();buildPkgTable();buildPkgPreview();}repaintCovered();},{compact:true});
+ const bgd=mkColorDropdown(ddList(sf.bg||''),sf.bg||'',hex=>{const s=syntaxFace(kind);s.bg=hex||null;styleEx();styleCr();renderCode();repaintCovered();},{compact:true});
styleEx();styleCr();
- const lkTd=mkLockCell(kind,[dd]);
- // style buttons
const stTd=document.createElement('td');
- if(kind!=='bg'){const defs=[['B','a','bold'],['I','a','italic']];
- const btns={};
- defs.forEach(([id,ch,mode])=>{const b=document.createElement('button');b.className='sbtn';b.style.fontWeight=mode==='bold'?'bold':'normal';b.style.fontStyle=mode==='italic'?'italic':'normal';b.textContent=ch;
- b.onclick=()=>{if(mode==='bold'){BOLD[kind]=!BOLD[kind];}else{ITALIC[kind]=!ITALIC[kind];}refresh();renderCode();styleEx();};
- btns[mode]=b;stTd.appendChild(b);});
- function refresh(){btns.bold.classList.toggle('on',!!BOLD[kind]);btns.italic.classList.toggle('on',!!ITALIC[kind]);}
- refresh();}
+ const stBtns=mkStyleButtons(at=>syntaxFace(kind)[at],at=>{const s=syntaxFace(kind);s[at]=!s[at];styleEx();renderCode();});
+ stBtns.forEach(b=>stTd.appendChild(b));
const c0=document.createElement('td');c0.appendChild(dd);
+ const cB=document.createElement('td');cB.appendChild(bgd);
+ const cX=document.createElement('td');const boxCtl=mkBoxControl(()=>syntaxFace(kind).box,b=>{syntaxFace(kind).box=b;styleEx();renderCode();},{compact:true});cX.appendChild(boxCtl);
+ const lkTd=mkLockCell(kind,[dd,bgd,...stBtns,boxCtl]);
const c2=document.createElement('td');c2.className='cat';c2.textContent=label;c2.style.cursor='pointer';c2.title='flash this category in the code';c2.onclick=()=>flashTokens(kind);
- tr.appendChild(c2);tr.appendChild(lkTd);tr.appendChild(c0);tr.appendChild(stTd);tr.appendChild(crTd);tr.appendChild(exTd);
+ tr.appendChild(c2);tr.appendChild(lkTd);tr.appendChild(c0);tr.appendChild(cB);tr.appendChild(stTd);tr.appendChild(cX);tr.appendChild(crTd);tr.appendChild(exTd);
tb.appendChild(tr);}
+ updateLockToggle('syntax');
+}
+function clearPalette(){
+ normalizePalette();
+ const plan=clearPalettePlan(PALETTE,{bg:MAP['bg'],fg:MAP['p']});
+ plan.removed.forEach(({hex,name})=>rememberGone(hex,name));
+ PALETTE=plan.palette;selectedIdx=null;
+ refreshPaletteState();
+ notify('cleared palette to bg and fg',false);
}
let selectedIdx=null;
// When a named palette color is deleted, remember its hex keyed by name so that
// recreating a color with the same name can re-bind the assignments still pointing
// at the old (now "(gone)") hex. Consumed once per name; cleared on import.
let lastGone={};
-// Re-point every assignment — syntax map, UI faces, package faces — from one hex
+// Re-point every assignment — syntax faces, UI faces, package faces — from one hex
// to another. Used when a palette color's value is edited and when a deleted name
// is recreated.
+function repointFaceFields(face,oldHex,newHex){
+ if(face.fg===oldHex)face.fg=newHex;
+ if(face.bg===oldHex)face.bg=newHex;
+ if(face.box&&face.box.color===oldHex)face.box.color=newHex;
+}
function repointHex(oldHex,newHex){
if(oldHex===newHex)return;
- for(const k in MAP){if(MAP[k]===oldHex)MAP[k]=newHex;}
- for(const f in UIMAP){if(UIMAP[f].fg===oldHex)UIMAP[f].fg=newHex;if(UIMAP[f].bg===oldHex)UIMAP[f].bg=newHex;}
- for(const ap in PKGMAP)for(const fc in PKGMAP[ap]){const o=PKGMAP[ap][fc];if(o.fg===oldHex)o.fg=newHex;if(o.bg===oldHex)o.bg=newHex;}
+ for(const k in SYNTAX){repointFaceFields(SYNTAX[k],oldHex,newHex);syncSyntaxCache(k);}
+ for(const f in UIMAP)repointFaceFields(UIMAP[f],oldHex,newHex);
+ for(const ap in PKGMAP)for(const fc in PKGMAP[ap])repointFaceFields(PKGMAP[ap][fc],oldHex,newHex);
}
// On adding a color, if its name matches a recently-deleted one, re-bind the
// stranded assignments to the new hex. Returns true when a heal context existed.
function healGone(name,newHex){const k=name.toLowerCase();if(!(k in lastGone))return false;const g=lastGone[k];delete lastGone[k];repointHex(g,newHex);return true;}
+function rememberGone(hex,name){if(name)lastGone[name.toLowerCase()]=hex;}
+function normalizePaletteEntry(entry){
+ const hex=entry&&entry[0],name=(entry&&entry[1])||'color';
+ return [hex,name,(entry&&entry[2])||columnIdOf(entry)];
+}
+function ensureGroundEndpoints(){
+ const ground={bg:MAP['bg'],fg:MAP['p']};
+ if(ground.bg&&!PALETTE.some(entry=>groundRoleOfEntry(entry,ground)==='bg'))PALETTE.unshift([ground.bg,'bg','ground']);
+ if(ground.fg&&!PALETTE.some(entry=>groundRoleOfEntry(entry,ground)==='fg'))PALETTE.push([ground.fg,'fg','ground']);
+}
+function normalizePalette(){PALETTE=PALETTE.map(normalizePaletteEntry);ensureGroundEndpoints();}
+// The ground column is explicit: bg pins the top endpoint, fg pins the bottom
+// endpoint, and generated ground+N steps live between them.
+function groundColumnMembers(){
+ return groundColumnMembersFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']});
+}
+function groundSpanCount(){return PALETTE.filter(entry=>groundRoleOfEntry(entry,{bg:MAP['bg'],fg:MAP['p']})==='step').length;}
+function groundSpanControl(){
+ const d=document.createElement('div');d.className='fcount';
+ d.innerHTML=`<span title="number of ground colors between bg and fg">span <input type="number" min="0" max="8" value="${groundSpanCount()}"></span>`;
+ d.querySelector('input').onchange=(e)=>setGroundSpan(Math.max(0,Math.min(8,parseInt(e.target.value,10)||0)));
+ return d;
+}
+function setGroundSpan(n){
+ const old=PALETTE.filter(entry=>groundRoleOfEntry(entry,{bg:MAP['bg'],fg:MAP['p']})==='step');
+ const bg=srgb2oklab(MAP['bg']),fg=srgb2oklab(MAP['p']);
+ const entries=[];
+ let step=1;
+ for(let i=1;i<=n;i++){
+ const t=i/(n+1);
+ const lab={L:bg.L+(fg.L-bg.L)*t,a:bg.a+(fg.a-bg.a)*t,b:bg.b+(fg.b-bg.b)*t};
+ const hex=lrgb2hex(oklab2lrgb(lab.L,lab.a,lab.b));
+ if(hex.toLowerCase()==='#ffffff'||hex.toLowerCase()==='#000000')continue;
+ entries.push([hex,'ground+'+(step++),'ground']);
+ }
+ for(const [oldHex,oldName] of old){
+ const next=entries.find(([,name])=>name===oldName);
+ if(next&&next[0].toLowerCase()!==oldHex.toLowerCase())repointHex(oldHex,next[0]);
+ }
+ for(let i=PALETTE.length-1;i>=0;i--)if(groundRoleOfEntry(PALETTE[i],{bg:MAP['bg'],fg:MAP['p']})==='step')PALETTE.splice(i,1);
+ let at=PALETTE.findIndex(entry=>groundRoleOfEntry(entry,{bg:MAP['bg'],fg:MAP['p']})==='bg');
+ if(at<0)at=0; else at+=1;
+ PALETTE.splice(Math.min(at,PALETTE.length),0,...entries);
+ selectedIdx=null;refreshPaletteState();
+ notify('set ground span to '+n,false);
+}
// 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.
@@ -833,82 +1048,156 @@ function renderPaletteWarnings(warnings,overflow){
// Families sort deterministically, so the old move-arrow / drag reordering is gone.
function paletteChip(i,nearest){
const [hex,name]=PALETTE[i],tc=textOn(hex),nde=nearest[i];
- const locked=(hex===MAP['bg']||hex===MAP['p']);
+ const role=groundRoleOfEntry(PALETTE[i],{bg:MAP['bg'],fg:MAP['p']});
+ const locked=(role==='bg'||role==='fg');
const d=document.createElement('div');d.className='pchip'+(i===selectedIdx?' sel':'');d.style.background=hex;
+ d.dataset.paletteIndex=String(i);
d.title=name+' '+hex+(nde===Infinity||nde===undefined?'':' — nearest ΔE '+nde.toFixed(3));
- const rm=locked?`<span class="lock" title="${hex===MAP['bg']?'background':'foreground'} — can't remove" style="color:${tc}">&#128274;</span>`:`<button class="rm" title="remove" style="color:${tc}">×</button>`;
- d.innerHTML=`${rm}<input class="nm" value="${name}" style="color:${tc}"><div class="hx" style="color:${tc}">${hex}</div>`;
- if(!locked)d.querySelector('.rm').onclick=(e)=>{e.stopPropagation();if(name)lastGone[name.toLowerCase()]=hex;PALETTE.splice(i,1);if(selectedIdx===i)selectedIdx=null;renderPalette();buildTable();buildUITable();};
- d.querySelector('.nm').onchange=(e)=>{PALETTE[i][1]=e.target.value;buildTable();buildUITable();};
- d.onclick=(e)=>{if(e.target.closest('.rm')||e.target.closest('.nm'))return;selectColor(i);};
+ const rm=locked?`<span class="lock" title="${role==='bg'?'background':'foreground'} — can't remove" style="color:${tc}">&#128274;</span>`:`<button class="rm" title="remove" style="color:${tc}">×</button>`;
+ d.innerHTML=`${rm}<input class="nm" value="${name}" readonly style="color:${tc}"><div class="hx" style="color:${tc}">${hex}</div>`;
+ if(!locked)d.querySelector('.rm').onclick=(e)=>{e.stopPropagation();rememberGone(hex,name);PALETTE.splice(i,1);if(selectedIdx===i)selectedIdx=null;refreshPaletteState({code:false,ground:false});};
+ const nm=d.querySelector('.nm');
+ const finishNameEdit=()=>{nm.readOnly=true;nm.classList.remove('editing');};
+ nm.onclick=(e)=>{e.preventDefault();e.stopPropagation();selectColor(i);};
+ nm.ondblclick=(e)=>{e.preventDefault();e.stopPropagation();nm.readOnly=false;nm.classList.add('editing');nm.focus();nm.setSelectionRange(0,0);};
+ nm.onblur=finishNameEdit;
+ nm.onkeydown=(e)=>{if(e.key==='Enter'){e.preventDefault();nm.blur();}else if(e.key==='Escape'){e.preventDefault();nm.value=PALETTE[i][1];nm.blur();}};
+ nm.onchange=(e)=>{PALETTE[i][1]=e.target.value;buildTable();buildUITable();};
+ d.onclick=(e)=>{if(e.target.closest('.rm'))return;selectColor(i);};
return d;
}
-// Render the palette as hue families: the pinned ground strip, then hue-sorted
-// family strips, each dark to light. Grouping is derived from the hex by
-// familiesFromPalette every render, so renaming a color never moves it. The flat
-// PALETTE stays the editable truth; chips keep their per-chip controls.
+function setChipPreviewColor(i,hex){
+ const chip=document.querySelector('#pals .pchip[data-palette-index="'+i+'"]');if(!chip)return;
+ const tc=textOn(hex);chip.style.background=hex;
+ chip.querySelectorAll('.nm,.hx,.rm,.lock').forEach(e=>e.style.color=tc);
+}
+function previewSelectedChip(hex){if(selectedIdx===null)return;setChipPreviewColor(selectedIdx,hex);}
+function restoreSelectedChip(){if(selectedIdx===null||!PALETTE[selectedIdx])return;setChipPreviewColor(selectedIdx,PALETTE[selectedIdx][0]);}
+function paletteIndexByHexName(hex,name){
+ for(let i=0;i<PALETTE.length;i++)if(PALETTE[i][0]===hex&&PALETTE[i][1]===name)return i;
+ return -1;
+}
+function selectColumnBase(f){
+ const baseMember=f.members.find(m=>m.hex.toLowerCase()===f.base.toLowerCase())||f.members[0];
+ const i=paletteIndexByHexName(baseMember.hex,baseMember.name);
+ if(i>=0)selectColor(i);
+}
+function isGroundEntry(entry){
+ return !!groundRoleOfEntry(entry,{bg:MAP['bg'],fg:MAP['p']});
+}
+function moveColumn(columnId,dir){
+ normalizePalette();
+ const columns=sortColumns(columnsFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']}).columns);
+ const pos=columns.findIndex(f=>f.column===columnId);
+ const next=columns[pos+dir];
+ if(pos<0||!next)return;
+ const moving=[],rest=[];
+ PALETTE.forEach(entry=>{
+ if(!isGroundEntry(entry)&&columnIdOf(entry)===columnId)moving.push(entry);
+ else rest.push(entry);
+ });
+ const nextPositions=[];
+ rest.forEach((entry,i)=>{if(!isGroundEntry(entry)&&columnIdOf(entry)===next.column)nextPositions.push(i);});
+ if(!nextPositions.length)return;
+ const at=dir<0?nextPositions[0]:nextPositions[nextPositions.length-1]+1;
+ PALETTE=rest.slice(0,at).concat(moving,rest.slice(at));
+ selectedIdx=null;refreshPaletteState();
+ notify('moved "'+columnId+'" '+(dir<0?'left':'right'),false);
+}
+function deleteColumn(columnId,label){
+ normalizePalette();
+ const plan=deletePaletteColumnPlan(PALETTE,{bg:MAP['bg'],fg:MAP['p']},columnId);
+ if(!plan.removed.length){notify('nothing to delete in "'+(label||columnId)+'"',true);return;}
+ const title=label||columnId;
+ if(!confirm('Delete color column "'+title+'"?\n\nThis removes '+plan.removed.length+' palette color(s). Existing face assignments will stay on their old hex values and show as "(gone)".'))return;
+ plan.removed.forEach(({hex,name})=>rememberGone(hex,name));
+ PALETTE=plan.palette;selectedIdx=null;
+ refreshPaletteState();
+ notify('deleted column "'+title+'" — '+plan.removed.length+' color(s) now show "(gone)" where used',false);
+}
+function columnHeader(f,position,count){
+ const h=document.createElement('div');h.className='fhead';
+ const label=(f.members.find(m=>m.hex.toLowerCase()===f.base.toLowerCase())||{}).name||f.column||f.base;
+ h.innerHTML=`<button class="cmove left" title="move column left" ${position===0?'disabled':''}>&#8249;</button><button class="ctitle" title="select base color"></button><button class="cmove right" title="move column right" ${position===count-1?'disabled':''}>&#8250;</button><button class="cdel" title="delete column with confirmation">×</button>`;
+ h.querySelector('.ctitle').textContent=label;
+ h.querySelector('.ctitle').onclick=()=>selectColumnBase(f);
+ h.querySelector('.left').onclick=(e)=>{e.stopPropagation();moveColumn(f.column,-1);};
+ h.querySelector('.right').onclick=(e)=>{e.stopPropagation();moveColumn(f.column,1);};
+ h.querySelector('.cdel').onclick=(e)=>{e.stopPropagation();deleteColumn(f.column,label);};
+ return h;
+}
+// Render the palette as structural color columns: pinned ground column, then
+// first-seen palette columns. Grouping uses the stable column id stored on each
+// palette entry, so renaming a color never moves it.
function renderPalette(){
+ normalizePalette();
const p=document.getElementById('pals');p.innerHTML='';
const {warnings,overflow,nearest}=paletteWarnings(PALETTE,DELTAE_MIN,5);
- const {ground,families}=familiesFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']});
+ const {ground,columns}=columnsFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']});
const used=new Set();
const idxOf=(hex,name)=>{for(let i=0;i<PALETTE.length;i++)if(!used.has(i)&&PALETTE[i][0]===hex&&PALETTE[i][1]===name){used.add(i);return i;}return -1;};
const strip=(cls)=>{const s=document.createElement('div');s.className='fstrip'+(cls||'');p.appendChild(s);return s;};
- const gs=strip(' ground');gs.dataset.family='ground';
- ground.forEach(g=>{
- const i=PALETTE.findIndex((pp,k)=>!used.has(k)&&pp[0]===g.hex);
- if(i>=0){used.add(i);gs.appendChild(paletteChip(i,nearest));}
- else{const tc=textOn(g.hex),sw=document.createElement('div');sw.className='pchip';sw.style.background=g.hex;sw.title=(g.role||'')+' '+g.hex;
- sw.innerHTML=`<input class="nm" value="${g.role||''}" disabled style="color:${tc}"><div class="hx" style="color:${tc}">${g.hex}</div>`;gs.appendChild(sw);}
- });
- // The too-similar warning stays on the full flat palette: a generated ramp's
- // steps are a stepL apart (well above the warning's ΔE threshold), so they never
- // trigger it, and any pair that does is a genuine near-duplicate worth flagging.
- sortFamilies(families).forEach(f=>{
- const s=strip(f.neutral?' neutral':'');s.dataset.family=f.base;
+ if(ground.length){
+ const gs=strip(' ground');gs.dataset.column='ground';
+ const gh=document.createElement('div');gh.className='fhead';gh.textContent='ground';gs.appendChild(gh);
+ gs.appendChild(groundSpanControl());
+ groundColumnMembers().forEach(m=>{
+ const i=idxOf(m.hex,m.name);
+ if(i>=0)gs.appendChild(paletteChip(i,nearest));
+ else{const tc=textOn(m.hex),sw=document.createElement('div');sw.className='pchip';sw.style.background=m.hex;sw.title=(m.name||'ground')+' '+m.hex;
+ sw.innerHTML=`<input class="nm" value="${m.name||'ground'}" disabled style="color:${tc}"><div class="hx" style="color:${tc}">${m.hex}</div>`;gs.appendChild(sw);}
+ });
+ }
+ // The too-similar warning stays on the full flat palette, so large spans can
+ // still expose genuinely hard-to-distinguish neighboring colors.
+ const ordered=sortColumns(columns);
+ ordered.forEach((f,pos)=>{
+ const s=strip('');s.dataset.column=f.column||f.base;
+ s.appendChild(columnHeader(f,pos,ordered.length));
+ s.appendChild(columnCountControl(f));
f.members.forEach(m=>{const i=idxOf(m.hex,m.name);if(i>=0)s.appendChild(paletteChip(i,nearest));});
- if(!f.neutral)s.appendChild(familyCountControl(f));
});
renderPaletteWarnings(warnings,overflow);
buildUITable();if(document.getElementById('pkgbody'))buildPkgTable();
}
-// The per-family count control under a chromatic strip. Its value is the family's
-// current per-side reach; setting N regenerates the family as base ±N.
-function familyCountControl(f){
+// The per-column count control under a chromatic strip. Its value is the column's
+// current per-side reach; setting N regenerates the column as base ±N.
+function columnCountControl(f){
const per=Math.max(0,...rankByLightness(f.members.map(m=>m.hex),f.base).map(m=>Math.abs(m.offset)));
const d=document.createElement('div');d.className='fcount';
- d.innerHTML=`<span title="generate a symmetric ramp of N steps each side of this family's base — this replaces the family">&#177; <input type="number" min="0" max="4" value="${per}"></span>`;
- d.querySelector('input').onchange=(e)=>setFamilyCount(f.base,Math.max(0,Math.min(4,parseInt(e.target.value,10)||0)));
+ d.innerHTML=`<span title="set the column span: N generated steps on each side of the base — this replaces the column">span &#177; <input type="number" min="0" max="8" value="${per}"></span>`;
+ d.querySelector('input').onchange=(e)=>setColumnCount(f.base,Math.max(0,Math.min(8,parseInt(e.target.value,10)||0)));
return d;
}
-// Regenerate a family as a symmetric base ±N ramp, replacing its current members.
+// Regenerate a column as a symmetric base ±N span, replacing its current members.
// References to a surviving position (matched by signed lightness rank) follow the
// new hex; references to a position removed by lowering N leave their old hex,
// which is no longer in the palette and so renders as "(gone)".
// Replace oldHexes in the palette with a fresh base ±n ramp, repointing surviving
// references and leaving removed ones on their now-gone hex. Returns the removed
// count, or null on a bad base. Shared by the count control and the base edit.
-function regenFamilyInPlace(oldHexes,baseHex,baseName,n){
- const r=regenFamily(baseHex,n,{});
+function regenColumnInPlace(oldHexes,baseHex,baseName,n,columnId){
+ const r=regenColumn(baseHex,n,{});
if(r.error){notify('cannot regenerate from '+baseHex,true);return null;}
const plan=stepRepointPlan(rankByLightness(oldHexes,baseHex),r.members);
const oldSet=new Set(oldHexes.map(h=>h.toLowerCase()));
let at=PALETTE.length;
for(let i=0;i<PALETTE.length;i++)if(oldSet.has(PALETTE[i][0].toLowerCase())){at=i;break;}
for(let i=PALETTE.length-1;i>=0;i--)if(oldSet.has(PALETTE[i][0].toLowerCase()))PALETTE.splice(i,1);
- const entries=r.members.map(m=>[m.hex,m.offset===0?baseName:baseName+(m.offset>0?'+'+m.offset:String(m.offset))]);
+ const col=columnId||columnStem(baseName);
+ const entries=r.members.map(m=>[m.hex,m.offset===0?baseName:baseName+(m.offset>0?'+'+m.offset:String(m.offset)),col]);
PALETTE.splice(Math.min(at,PALETTE.length),0,...entries);
for(const [o,nw] of plan.map)repointHex(o,nw);
return plan.removed.length;
}
-function setFamilyCount(baseHex,n){
- const {families}=familiesFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']});
- const fam=families.find(f=>f.base.toLowerCase()===baseHex.toLowerCase());
- if(!fam)return;
- const baseName=(fam.members.find(m=>m.hex.toLowerCase()===baseHex.toLowerCase())||{}).name||'color';
- const removed=regenFamilyInPlace(fam.members.map(m=>m.hex),baseHex,baseName,n);
+function setColumnCount(baseHex,n){
+ const {columns}=columnsFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']});
+ const column=columns.find(f=>f.base.toLowerCase()===baseHex.toLowerCase());
+ if(!column)return;
+ const baseName=(column.members.find(m=>m.hex.toLowerCase()===baseHex.toLowerCase())||{}).name||'color';
+ const removed=regenColumnInPlace(column.members.map(m=>m.hex),baseHex,baseName,n,column.column);
if(removed===null)return;
- selectedIdx=null;renderPalette();buildTable();buildUITable();renderCode();applyGround();
+ selectedIdx=null;refreshPaletteState();
notify('regenerated "'+baseName+'" to ±'+n+(removed?(' — '+removed+' removed step(s) show "(gone)" where used'):''),false);
}
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);}
@@ -916,25 +1205,30 @@ function applyEdit(){if(selectedIdx!==null)updateColor();else addColor();}
function selectColor(i){selectedIdx=i;const [hex,name]=PALETTE[i];setHex(hex);document.getElementById('newname').value=name;renderPalette();notify('editing "'+name+'" — change the value, then Enter (or Update selected) to save',false);}
function updateColor(){
if(selectedIdx===null){notify('click a palette color to select it first',true);return;}
- const i=selectedIdx,oldHex=PALETTE[i][0];
+ const i=selectedIdx,oldHex=PALETTE[i][0],oldRole=groundRoleOfEntry(PALETTE[i],{bg:MAP['bg'],fg:MAP['p']});
const newHex=curHex();
const newName=(document.getElementById('newname').value.trim())||PALETTE[i][1];
if(PALETTE.some((p,j)=>j!==i&&p[1].toLowerCase()===newName.toLowerCase())){notify('another color is already named "'+newName+'" — names must be unique',true);return;}
- // If the edited color is a family base with a ramp, recolor the whole family: regenerate from the new base at the same count.
- const fams=familiesFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']}).families;
- const fam=fams.find(f=>!f.neutral&&f.base.toLowerCase()===oldHex.toLowerCase());
- const count=fam?Math.max(0,...rankByLightness(fam.members.map(m=>m.hex),fam.base).map(m=>Math.abs(m.offset))):0;
- PALETTE[i]=[newHex,newName];
- repointHex(oldHex,newHex);
- if(fam&&count>0){
- const oldHexes=fam.members.map(m=>m.hex.toLowerCase()===oldHex.toLowerCase()?newHex:m.hex);
- regenFamilyInPlace(oldHexes,newHex,newName,count);
- closePicker();selectedIdx=null;renderPalette();buildTable();buildUITable();renderCode();applyGround();notify('recolored "'+newName+'" family from the new base',false);return;
+ const isGroundEdit=oldRole==='bg'||oldRole==='fg';
+ // If the edited color is a column base with a ramp, recolor the whole column: regenerate from the new base at the same count.
+ const columns=columnsFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']}).columns;
+ const column=isGroundEdit?null:columns.find(f=>f.base.toLowerCase()===oldHex.toLowerCase());
+ const count=column?Math.max(0,...rankByLightness(column.members.map(m=>m.hex),column.base).map(m=>Math.abs(m.offset))):0;
+ const columnId=isGroundEdit?'ground':(PALETTE[i][2]||columnStem(PALETTE[i][1]));
+ PALETTE[i]=[newHex,newName,columnId];
+ const duplicateOldHex=PALETTE.some((p,j)=>j!==i&&p[0].toLowerCase()===oldHex.toLowerCase());
+ if(isGroundEdit)repointHex(oldHex,newHex);
+ else if(!duplicateOldHex&&oldHex!==MAP['bg']&&oldHex!==MAP['p'])repointHex(oldHex,newHex);
+ if(column&&count>0){
+ const oldHexes=column.members.map(m=>m.hex.toLowerCase()===oldHex.toLowerCase()?newHex:m.hex);
+ regenColumnInPlace(oldHexes,newHex,newName,count,column.column||columnId);
+ closePicker();selectedIdx=null;refreshPaletteState();notify('recolored "'+newName+'" column from the new base',false);return;
}
- closePicker();renderPalette();buildTable();buildUITable();renderCode();applyGround();notify('updated "'+newName+'"',false);
+ closePicker();refreshPaletteState();notify('updated "'+newName+'"',false);
}
-function curHex(){return normHex(document.getElementById('newhexstr').value)||'#888888';}
-let pkH=0,pkS=0,pkV=0.5,pickerOn=false;
+const DEFAULT_PICKER_HEX='#67809c';
+let [pkH,pkS,pkV]=rgb2hsv(...hex2rgb(DEFAULT_PICKER_HEX)),pickerOn=false;
+function curHex(){return normHex(document.getElementById('newhexstr').value)||DEFAULT_PICKER_HEX;}
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
@@ -987,28 +1281,29 @@ function paintPicker(){const sv=document.getElementById('sv');if(!sv)return;
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);if(pkModel==='oklch')oklchInputsFromHex(hex);}
+function previewPickerHex(hex){if(pickerOn&&selectedIdx!==null)previewSelectedChip(hex);}
+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);previewPickerHex(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);previewPickerHex(h);}
+function pkSet(){const hex=rgb2hex(...hsv2rgb(pkH,pkS,pkV));document.getElementById('newhexstr').value=hex;document.getElementById('swatch').style.background=hex;paintPicker();pkReadout(hex);previewPickerHex(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 oklchInputsFromHex(hex){const lch=oklab2oklch(srgb2oklab(normHex(hex)||DEFAULT_PICKER_HEX));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);
+ [pkH,pkS,pkV]=rgb2hsv(...hex2rgb(hex));paintPicker();pkReadout(hex);previewPickerHex(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();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 openPicker(){pickerOn=true;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(curHex()));buildPkChips();document.getElementById('picker').style.display='block';setPkModel(pkModel);paintPicker();pkReadout(curHex());previewPickerHex(curHex());setTimeout(()=>document.addEventListener('pointerdown',pkOutside),0);}
+function closePicker(){if(!pickerOn)return;restoreSelectedChip();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();
@@ -1026,66 +1321,67 @@ function initPicker(){const sw=document.getElementById('swatch');if(!sw)return;s
function addColor(){const h=curHex();const name=document.getElementById('newname').value.trim();
if(!name){notify('name the color before adding it',true);return;}
if(PALETTE.some(p=>p[1].toLowerCase()===name.toLowerCase())){notify('a color named "'+name+'" already exists — select it and use Update selected to change its value',true);return;}
- PALETTE.push([h,name]);const healed=healGone(name,h);document.getElementById('newname').value='';selectedIdx=null;closePicker();
- renderPalette();buildTable();buildUITable();
- if(healed){renderCode();applyGround();if(document.getElementById('pkgbody'))buildPkgTable();buildPkgPreview();}
- notify(healed?('added "'+name+'" and reconnected its assignments'):('added "'+name+'"'),false);}
+ PALETTE.push([h,name,columnIdOf([h,name])]);const healed=healGone(name,h);document.getElementById('newname').value='';selectedIdx=null;closePicker();
+ refreshPaletteState({code:healed,ground:healed,pkgPreview:healed});
+ notify(healed?('added "'+name+'" and reconnected its face references'):('added "'+name+'"'),false);}
function themeName(){return (document.getElementById('themename').value||'theme').trim()||'theme';}
function fileSlug(){return slugify(themeName());}
-function exportObj(){const a={};CATS.forEach(c=>a[c[0]]=MAP[c[0]]);const o={name:themeName(),palette:PALETTE,assignments:a,bold:Object.keys(BOLD).filter(k=>BOLD[k]),italic:Object.keys(ITALIC).filter(k=>ITALIC[k]),ui:UIMAP};if(LOCKED.size)o.locks=[...LOCKED];const pk=packagesForExport(PKGMAP);if(Object.keys(pk).length)o.packages=pk;return o;}
+function exportObj(){normalizePalette();const o={name:themeName(),palette:PALETTE,syntax:SYNTAX,ui:UIMAP};if(LOCKED.size)o.locks=[...LOCKED];const pk=packagesForExport(PKGMAP);if(Object.keys(pk).length)o.packages=pk;return o;}
function exportState(){const t=document.getElementById('export');t.value=JSON.stringify(exportObj(),null,1);t.style.display='block';t.focus();t.select();}
function toggleJSON(){const t=document.getElementById('export'),b=document.getElementById('jsonbtn');if(t.style.display==='block'){t.style.display='none';b.textContent='show';}else{exportState();b.textContent='hide';}}
-function updateTitle(){const n=document.getElementById('themename').value.trim();document.getElementById('pagetitle').textContent=(n||'Untitled')+': theme';const sb=document.getElementById('savebtn');if(sb){sb.style.display=n||fileHandle?'':'none';sb.title=fileHandle?'overwrite the imported/saved file':'choose where to save';}}
-let fileHandle=null;
+function updateTitle(){const n=document.getElementById('themename').value.trim();document.getElementById('pagetitle').textContent=(n||'Untitled')+': theme';}
function exportTheme(){const blob=new Blob([JSON.stringify(exportObj(),null,1)],{type:'application/json'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=fileSlug()+'.json';a.click();}
-async function saveTheme(){const data=JSON.stringify(exportObj(),null,1);
- if(!window.showSaveFilePicker){exportTheme();notify('saved via download (browser has no Save-File support)',false);return;}
- try{if(!fileHandle)fileHandle=await window.showSaveFilePicker({suggestedName:fileSlug()+'.json',types:[{description:'theme JSON',accept:{'application/json':['.json']}}]});
- const w=await fileHandle.createWritable();await w.write(data);await w.close();notify('saved "'+themeName()+'"',false);updateTitle();
- }catch(e){if(e&&e.name!=='AbortError')notify('save failed: '+e.message,true);}}
-function applyImported(text){const d=JSON.parse(text);lastGone={};if(d.name)document.getElementById('themename').value=d.name;if(d.palette)PALETTE=d.palette;if(d.assignments)Object.assign(MAP,d.assignments);
- BOLD={};(d.bold||[]).forEach(k=>BOLD[k]=true);ITALIC={};(d.italic||[]).forEach(k=>ITALIC[k]=true);
+function applyImported(text){const d=JSON.parse(text);lastGone={};if(d.name)document.getElementById('themename').value=d.name;if(d.palette)PALETTE=d.palette.map(normalizePaletteEntry);
+ if(!d.syntax)throw new Error('theme JSON is missing syntax; convert older files first');
+ SYNTAX={};CATS.forEach(c=>{const k=c[0];SYNTAX[k]=Object.assign(syntaxBlank(k),d.syntax[k]||{});});syncAllSyntaxCache();
LOCKED=new Set(d.locks||[]);
if(d.ui)Object.assign(UIMAP,d.ui);
PKGMAP=seedPkgmap();if(d.packages)mergePackagesInto(PKGMAP,d.packages);
- renderPalette();buildTable();buildUITable();buildPkgTable();buildPkgPreview();renderCode();applyGround();updateTitle();}
-// File-input fallback (no File System Access API): no writable handle, so save still prompts.
+ refreshPaletteState({pkgPreview:true});updateTitle();}
function importFile(ev){const f=ev.target.files[0];if(!f)return;const r=new FileReader();
- r.onload=()=>{try{applyImported(r.result);fileHandle=null;updateTitle();}catch(e){alert('bad theme file: '+e.message);}};
+ r.onload=()=>{try{applyImported(r.result);updateTitle();}catch(e){alert('bad theme file: '+e.message);}};
r.readAsText(f);ev.target.value='';}
-// Preferred import: keep the file handle so a later save overwrites the same file.
async function importTheme(){
if(!window.showOpenFilePicker){const fi=document.getElementById('fileinput');if(fi)fi.click();return;}
try{const [h]=await window.showOpenFilePicker({types:[{description:'theme JSON',accept:{'application/json':['.json']}}]});
- const file=await h.getFile();applyImported(await file.text());fileHandle=h;updateTitle();
- notify('imported "'+(themeName()||file.name)+'" — save now overwrites it',false);
+ const file=await h.getFile();applyImported(await file.text());updateTitle();
+ notify('imported "'+(themeName()||file.name)+'"',false);
}catch(e){if(e&&e.name!=='AbortError')notify('import failed: '+e.message,true);}}
// The blanket covers only the code panes and syntax example cells. UI-face
// preview cells also carry .ex, but a face with its own bg must keep it, so
// those rows repaint through paintUI (which also re-rates the contrast cell
// against the new ground for faces without their own bg).
-function applyGround(){document.querySelectorAll('pre').forEach(p=>p.style.background=MAP['bg']);document.querySelectorAll('#legbody .ex').forEach(e=>e.style.background=MAP['bg']);UI_FACES.forEach(([f])=>{if(document.getElementById('uiprev-'+f))paintUI(f);});}
+function applyGround(){document.querySelectorAll('pre').forEach(p=>p.style.background=MAP['bg']);UI_FACES.forEach(([f])=>{if(document.getElementById('uiprev-'+f))paintUI(f);});}
function uf(f){return UIMAP[f]||{};}
function udeco(o){return `font-weight:${o.bold?'bold':'normal'};font-style:${o.italic?'italic':'normal'};text-decoration:${(o.underline?'underline ':'')+(o.strike?'line-through':'')||'none'}`;}
// A face's :box, rendered as an inset box-shadow (no layout shift). Returns the
// box-shadow VALUE (or '' for no box). 'line' is a flat border in the box color
// (or the face's own color when unset); 'released'/'pressed' are the 3D button
-// styles Emacs draws, derived from the background so they read on any color.
+// styles Emacs draws, derived from explicit box color when set, otherwise the
+// background so they read on any color.
function boxCss(b,bg){if(!b||!b.style)return '';const w=b.width||1;
if(b.style==='released'||b.style==='pressed'){
- // Emacs derives the 3D edges from the face's background (reliefColors,
- // ported from xterm.c); the translucent pair is only the no-bg fallback.
- const r=bg?reliefColors(bg):{hl:null,sh:null};
+ // Emacs derives the 3D edges from a base color (reliefColors, ported from
+ // xterm.c); the translucent pair is only the no-color fallback.
+ const r=(b.color||bg)?reliefColors(b.color||bg):{hl:null,sh:null};
const hl=r.hl||'#ffffff33',sh=r.sh||'#00000066';
const [a,z]=b.style==='released'?[hl,sh]:[sh,hl];
return `inset ${w}px ${w}px 0 ${a},inset -${w}px -${w}px 0 ${z}`;}
return `inset 0 0 0 ${w}px ${b.color||'currentColor'}`;}
-// The per-row box control: none / line / raised / pressed. get()/set() read and
-// write the face's box object (null = no box).
-function mkBoxSelect(get,set){const s=document.createElement('select');s.className='chip';s.style.cssText='width:84px;font:10pt monospace';
+function syntaxStyle(k){const s=syntaxFace(k),fg=(k==='bg'?MAP['p']:effFg(s.fg)),bg=s.bg||null,dec=(s.underline?'underline ':'')+(s.strike?'line-through':''),
+ bx=boxCss(s.box,bg||MAP['bg']);
+ return `color:${fg};${bg?'background:'+bg+';':''}font-weight:${s.bold?'bold':'normal'};font-style:${s.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'}${bx?';box-shadow:'+bx:''}`;}
+// The per-row box control: none / line / raised / pressed plus optional line
+// color. get()/set() read and write the face's box object (null = no box).
+function mkBoxControl(get,set,opts={}){const wrap=document.createElement('div');wrap.className='boxctl';
+ const s=document.createElement('select');s.className='chip';s.style.cssText='width:84px;font:10pt monospace';
[['','no box'],['line','line'],['released','raised'],['pressed','pressed']].forEach(([v,l])=>{const o=document.createElement('option');o.value=v;o.textContent=l;s.appendChild(o);});
- const cur=get();s.value=cur&&cur.style?cur.style:'';
- s.onchange=()=>set(s.value?{style:s.value,width:1,color:null}:null);return s;}
+ const dd=mkColorDropdown(ddList((get()&&get().color)||''),(get()&&get().color)||'',h=>{const cur=get();if(!cur)return;set(Object.assign({},cur,{color:h||null}));},{compact:!!opts.compact});
+ function paint(){const cur=get();s.value=cur&&cur.style?cur.style:'';dd.setValue(cur&&cur.color?cur.color:'');
+ const off=!cur||!cur.style||wrap.dataset.locked==='1';dd.dataset.locked=off?'1':'';dd.classList.toggle('locked',off);if(dd.syncLocked)dd.syncLocked();}
+ s.onchange=()=>{const cur=get();set(s.value?{style:s.value,width:cur&&cur.width||1,color:cur&&cur.color||null}:null);paint();};
+ wrap.syncLocked=()=>{const locked=wrap.dataset.locked==='1';s.disabled=locked;paint();};
+ wrap.append(s,dd);paint();return wrap;}
function flashRow(tr){if(!tr)return;tr.scrollIntoView({block:'center',behavior:'smooth'});tr.classList.remove('flash');void tr.offsetWidth;tr.classList.add('flash');}
function flashEl(el){if(!el)return;el.scrollIntoView({block:'nearest',inline:'nearest',behavior:'smooth'});el.classList.remove('flashtok');void el.offsetWidth;el.classList.add('flashtok');}
// Flash every matching element but scroll only the first into view, so a face
@@ -1097,7 +1393,10 @@ function flashUi(f){flashRow(document.querySelector(`#uibody tr[data-face="${f}"
function flashUiPreview(f){const sp=document.querySelectorAll(`#mockframe [data-face="${f}"]`);if(sp.length){flashEls(sp);return;}const cell=document.getElementById('uiprev-'+f);if(cell)flashEl(cell);}
function flashPkg(f){flashRow(document.querySelector(`#pkgbody tr[data-face="${f}"]`));}
function flashPkgPreview(f){const sp=document.querySelectorAll(`#pkgpreview [data-face="${f}"]`);if(sp.length){flashEls(sp);return;}const row=document.querySelector(`#pkgbody tr[data-face="${f}"]`);if(row)flashEl(row.querySelector('.cat'));}
-function mockSpan(k,t){return `<span data-k="${k}" style="color:${effFg(MAP[k])};font-weight:${BOLD[k]?'bold':'normal'};font-style:${ITALIC[k]?'italic':'normal'}">${esc(t)}</span>`;}
+function mockSpan(k,t){return `<span data-k="${k}" style="${syntaxStyle(k)}">${esc(t)}</span>`;}
+function uiCss(o,fgv,bgv,opts={}){const fg=fgv===undefined?effFg(o.fg):fgv,bg=bgv===undefined?o.bg:bgv,dec=(o.underline?'underline ':'')+(o.strike?'line-through':''),
+ bx=boxCss(o.box,bg||MAP['bg']);
+ return `color:${fg};${bg&&!opts.noBg?'background:'+bg+';':''}font-weight:${o.bold?'bold':'normal'};font-style:${o.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'}${bx?';box-shadow:'+bx:''}`;}
function syncMockHeight(){const t=document.getElementById('uitable'),m=document.getElementById('mockframe');if(!t||!m)return;const lb=m.previousElementSibling,lbh=lb?lb.getBoundingClientRect().height+10:30;m.style.height=Math.max(t.getBoundingClientRect().height-lbh,220)+'px';}
function buildMockFrame(){
const fr=document.getElementById('mockframe');if(!fr)return;
@@ -1112,7 +1411,7 @@ function buildMockFrame(){
{t:[['p',' '],['punc','('],['kw','setq'],['p',' '],['var','count'],['p',' '],['num','42'],['punc',')']],region:1},
{t:[['p',' '],['punc','('],['kw','if'],['p',' '],['punc','('],['op','>'],['p',' '],['var','count'],['p',' '],['num','0'],['punc',')']],match:1},
{t:[['p',' '],['punc','('],['kw','setq'],['p',' '],['var','total'],['p',' '],['punc','('],['op','+'],['p',' '],['var','total'],['p',' '],['var','count'],['punc','))']],hl:1},
- {t:[['p',' '],['punc','('],['fnc','process'],['p',' '],['var','items'],['punc',')']],cont:1},
+ {t:[['p',' '],['punc','('],['fnc','process'],['p',' '],['var','items'],['punc',')']],cont:1,high:1},
{t:[['p',' '],['punc','('],['fnc','cl-incf'],['p',' '],['var','count'],['punc',')']],lazy:1},
{t:[['p',' '],['punc','('],['kw','setq'],['p',' '],['var','done'],['p',' '],['con','t'],['punc',')']],paren:1},
{t:[['p',' '],['punc','('],['fnc','oops'],['p',' '],['var','nested'],['punc','))']],mismatch:1}
@@ -1124,14 +1423,14 @@ function buildMockFrame(){
const inner=face.fg
? `<span style="color:${face.fg}">${tokens.map(([,t])=>esc(t)).join('')}</span>`
: tokens.map(([k,t])=>mockSpan(k,t)).join('');
- return `<span data-face="${dface}" style="background:${face.bg||'transparent'};${udeco(face)}">${inner}</span>`;
+ return `<span data-face="${dface}" style="${uiCss(face,face.fg||'inherit',face.bg||'transparent')}">${inner}</span>`;
};
- // Emacs box cursor: it sits on the character at point, drawn in the frame
- // background over the cursor color (the cursor face's foreground is ignored).
+ // Emacs box cursor: it sits on the character at point, drawn in the configured
+ // cursor background, with the glyph in the configured cursor foreground.
// Falls back to a trailing block only if the line has no glyph (point at EOL).
const withCursor=(tokens)=>{
let out='',placed=false;
- const cell=ch=>`<span data-face="cursor" style="background:${cur.bg||fg};color:${bg}">${esc(ch)}</span>`;
+ const cell=ch=>`<span data-face="cursor" style="${uiCss(cur,cur.fg||bg,cur.bg||fg)}">${esc(ch)}</span>`;
for(const [k,t] of tokens){
const m=placed?-1:t.search(/\S/);
if(m>=0){
@@ -1148,25 +1447,25 @@ function buildMockFrame(){
lines.forEach((L,i)=>{
const isc=L.cur;
const nFg=isc?(lnc.fg||fg):(ln.fg||fg), nBg=isc?(lnc.bg||'transparent'):(ln.bg||'transparent');
- const rowBg=isc?(hl.bg||'transparent'):'transparent';
+ const rowFace=isc?hl:null,rowStyle=rowFace?uiCss(rowFace,rowFace.fg||'inherit',rowFace.bg||'transparent'):'background:transparent';
let cd;
if(isc)cd=withCursor(L.t);
else if(L.region)cd=overlay(L.t,reg,'region');
- else if(L.hl)cd=overlay(L.t,hil,'highlight');
+ else if(L.high)cd=overlay(L.t,hil,'highlight');
else if(L.match)cd=overlay(L.t,isr,'isearch');
else if(L.lazy)cd=overlay(L.t,laz,'lazy-highlight');
- else if(L.paren)cd=L.t.map(([k,t],j)=>j===L.t.length-1?`<span data-face="show-paren-match" style="background:${par.bg||'transparent'};color:${par.fg||MAP[k]||fg};${udeco(par)}">${esc(t)}</span>`:mockSpan(k,t)).join('');
- else if(L.mismatch)cd=L.t.map(([k,t],j)=>{if(j!==L.t.length-1)return mockSpan(k,t);const head=t.slice(0,-1),bad=t.slice(-1);return (head?mockSpan(k,head):'')+`<span data-face="show-paren-mismatch" style="background:${parx.bg||'transparent'};color:${parx.fg||MAP[k]||fg};${udeco(parx)}">${esc(bad)}</span>`;}).join('');
+ else if(L.hl)cd=overlay(L.t,hl,'hl-line');
+ else if(L.paren)cd=L.t.map(([k,t],j)=>j===L.t.length-1?`<span data-face="show-paren-match" style="${uiCss(par,par.fg||syntaxFace(k).fg||fg,par.bg||'transparent')}">${esc(t)}</span>`:mockSpan(k,t)).join('');
+ else if(L.mismatch)cd=L.t.map(([k,t],j)=>{if(j!==L.t.length-1)return mockSpan(k,t);const head=t.slice(0,-1),bad=t.slice(-1);return (head?mockSpan(k,head):'')+`<span data-face="show-paren-mismatch" style="${uiCss(parx,parx.fg||syntaxFace(k).fg||fg,parx.bg||'transparent')}">${esc(bad)}</span>`;}).join('');
else cd=L.t.map(([k,t])=>mockSpan(k,t)).join('');
const nFace=isc?'line-number-current-line':'line-number';
- buf+=`<div class="ln" style="background:${rowBg}"><span class="fr" data-face="fringe" style="background:${frng.bg||bg};color:${frng.fg||fg};text-align:center;font-size:10px;overflow:hidden" title="fringe">${L.cont?'&#8618;':''}</span><span class="num" data-face="${nFace}" style="color:${nFg};background:${nBg};${udeco(isc?lnc:ln)}">${i+1}</span><span class="cd">${cd||'&nbsp;'}</span></div>`;
+ buf+=`<div class="ln" ${rowFace?'data-face="hl-line" ':''}style="${rowStyle}"><span class="fr" data-face="fringe" style="${uiCss(frng,frng.fg||fg,frng.bg||bg)};text-align:center;font-size:10px;overflow:hidden" title="fringe">${L.cont?'&#8618;':''}</span><span class="num" data-face="${nFace}" style="${uiCss(isc?lnc:ln,nFg,nBg)}">${i+1}</span><span class="cd">${cd||'&nbsp;'}</span></div>`;
});
let html=`<div class="mbuf" style="display:flex;background:${bg}"><div style="flex:1;min-width:0">${buf}</div><div data-face="vertical-border" title="vertical-border" style="width:3px;flex:0 0 auto;background:${vb.fg||vb.bg||'#2f343a'}"></div></div>`;
- const mlbx=boxCss(ml.box,ml.bg||bg),mlibx=boxCss(mli.box,mli.bg||bg);
- html+=`<div class="bar" data-face="mode-line" style="background:${ml.bg||fg};color:${ml.fg||bg};${udeco(ml)}${mlbx?';box-shadow:'+mlbx:''}"> init.el (Emacs Lisp) L5 git:main </div>`;
- html+=`<div class="bar" data-face="mode-line-inactive" style="background:${mli.bg||bg};color:${mli.fg||fg};${udeco(mli)}${mlibx?';box-shadow:'+mlibx:''}"> *Messages* (Fundamental) </div>`;
- html+=`<div class="echo" style="color:${fg}"><span data-face="minibuffer-prompt" style="color:${mb.fg||fg};${udeco(mb)}">I-search:</span> count <span data-face="isearch-fail" style="color:${isf.fg||fg};background:${isf.bg||'transparent'};${udeco(isf)}">zzz [no match]</span></div>`;
- html+=`<div class="echo"><span data-face="link" style="color:${lnk.fg||fg};${udeco(lnk)}">https://gnu.org</span> <span data-face="error" style="color:${err.fg||fg};${udeco(err)}">error</span> <span data-face="warning" style="color:${wrn.fg||fg};${udeco(wrn)}">warning</span> <span data-face="success" style="color:${suc.fg||fg};${udeco(suc)}">ok</span></div>`;
+ html+=`<div class="bar" data-face="mode-line" style="${uiCss(ml,ml.fg||bg,ml.bg||fg)}"> init.el (Emacs Lisp) L5 git:main </div>`;
+ html+=`<div class="bar" data-face="mode-line-inactive" style="${uiCss(mli,mli.fg||fg,mli.bg||bg)}"> *Messages* (Fundamental) </div>`;
+ html+=`<div class="echo" style="color:${fg}"><span data-face="minibuffer-prompt" style="${uiCss(mb,mb.fg||fg,mb.bg||null)}">I-search:</span> count <span data-face="isearch-fail" style="${uiCss(isf,isf.fg||fg,isf.bg||'transparent')}">zzz [no match]</span></div>`;
+ html+=`<div class="echo"><span data-face="link" style="${uiCss(lnk,lnk.fg||fg,lnk.bg||null)}">https://gnu.org</span> <span data-face="error" style="${uiCss(err,err.fg||fg,err.bg||null)}">error</span> <span data-face="warning" style="${uiCss(wrn,wrn.fg||fg,wrn.bg||null)}">warning</span> <span data-face="success" style="${uiCss(suc,suc.fg||fg,suc.bg||null)}">ok</span></div>`;
fr.innerHTML=html;fr.style.background=bg;fr.style.color=fg;
fr.onclick=(e)=>{const u=e.target.closest('[data-face]');if(u){flashUi(u.dataset.face);return;}const k=e.target.closest('[data-k]');if(k)flashAssign(k.dataset.k);};
}
@@ -1174,9 +1473,10 @@ function buildMockFrame(){
// native <select> rendered swatch colors unreliably on Linux Chrome, so it is
// gone. '' (the default entry) maps back to null in the stored model.
function uiSelect(face,attr){const cur=UIMAP[face][attr]||'';
- return mkColorDropdown(ddList(cur),cur,h=>{UIMAP[face][attr]=h||null;paintUI(face);buildMockFrame();});}
+ return mkColorDropdown(ddList(cur),cur,h=>{UIMAP[face][attr]=h||null;paintUI(face);buildMockFrame();},{compact:true});}
const BASE_INHERITS=['fixed-pitch','variable-pitch','default','link','bold','italic','shadow'];
-function seedFace(d){return {fg:pname(d.fg),bg:pname(d.bg),bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit||null,height:d.height||1,box:d.box||null,source:'default'};}
+function uiFaceBlank(){return {fg:null,bg:null,bold:false,italic:false,underline:false,strike:false};}
+function seedFace(d){return normalizePkgFace({fg:pname(d.fg),bg:pname(d.bg),bold:d.bold,italic:d.italic,underline:d.underline,strike:d.strike,inherit:d.inherit,height:d.height,box:d.box},'default');}
function curApp(){const s=document.getElementById('appsel');return s&&s.value?s.value:Object.keys(APPS)[0];}
function pkgEffFg(app,face,seen){return effResolve(PKGMAP,app,face,'fg',seen);}
function pkgEffBg(app,face,seen){return effResolve(PKGMAP,app,face,'bg',seen);}
@@ -1190,8 +1490,8 @@ function buildPkgTable(){
if(flt&&!(face.toLowerCase().includes(flt)||label.toLowerCase().includes(flt)))continue;
const f=PKGMAP[app][face],tr=document.createElement('tr');tr.dataset.face=face;
const c0=document.createElement('td');c0.className='cat';c0.textContent=label;c0.title=face;c0.style.cursor='pointer';c0.onclick=()=>flashPkgPreview(face);
- const fgd=mkColorDropdown(ddList(f.fg||''),f.fg||'',h=>{f.fg=h||null;f.source='user';pkgChanged();}),
- bgd=mkColorDropdown(ddList(f.bg||''),f.bg||'',h=>{f.bg=h||null;f.source='user';pkgChanged();});
+ const fgd=mkColorDropdown(ddList(f.fg||''),f.fg||'',h=>{f.fg=h||null;f.source='user';pkgChanged();},{compact:true}),
+ bgd=mkColorDropdown(ddList(f.bg||''),f.bg||'',h=>{f.bg=h||null;f.source='user';pkgChanged();},{compact:true});
const cf=document.createElement('td');cf.appendChild(fgd);
const cb=document.createElement('td');cb.appendChild(bgd);
const cw=document.createElement('td');
@@ -1200,12 +1500,13 @@ function buildPkgTable(){
const ci=document.createElement('td');const isel=document.createElement('select');isel.className='chip';isel.style.cssText='width:150px;font:10pt monospace';inh.forEach(o=>{const op=document.createElement('option');op.value=o;op.textContent=o||'— none —';isel.appendChild(op);});isel.value=f.inherit||'';isel.onchange=()=>{f.inherit=isel.value||null;f.source='user';pkgChanged();};ci.appendChild(isel);
const ch=document.createElement('td');const hin=document.createElement('input');hin.type='number';hin.min='0.8';hin.max='2.5';hin.step='0.05';hin.value=f.height||1;hin.className='hstep';hin.onchange=()=>{f.height=parseFloat(hin.value)||1;f.source='user';pkgChanged();};ch.appendChild(hin);
const cc=document.createElement('td');cc.style.fontSize='10pt';cc.style.whiteSpace='nowrap';const efg=effFg(pkgEffFg(app,face)),ebg=effBg(pkgEffBg(app,face)),r=contrast(efg,ebg);cc.innerHTML=crHtml(r);
- const cx=document.createElement('td');const boxSel=mkBoxSelect(()=>f.box,b=>{f.box=b;f.source='user';pkgChanged();});cx.appendChild(boxSel);
+ const cx=document.createElement('td');const boxCtl=mkBoxControl(()=>f.box,b=>{f.box=b;f.source='user';pkgChanged();},{compact:true});cx.appendChild(boxCtl);
const cr=document.createElement('td');const rb=document.createElement('button');rb.className='sbtn';rb.textContent='↺';rb.title='reset to default';rb.onclick=()=>{PKGMAP[app][face]=seedFace(def);pkgChanged();};cr.appendChild(rb);
- const cL=mkLockCell('pkg:'+app+':'+face,[fgd,bgd,...pkBtns,isel,hin,boxSel,rb]);
+ const cL=mkLockCell('pkg:'+app+':'+face,[fgd,bgd,...pkBtns,isel,hin,boxCtl,rb]);
tr.append(c0,cL,cf,cb,cw,cc,ci,ch,cx,cr);tb.appendChild(tr);
}
applyTableSort('pkgbody');
+ updateLockToggle('pkg');
}
function ofs(app,face){const f=PKGMAP[app][face]||{},fg=effFg(pkgEffFg(app,face)),bg=pkgEffBg(app,face);const dec=(f.underline?'underline ':'')+(f.strike?'line-through':'');const bx=boxCss(f.box,bg||MAP['bg']);return `color:${fg};${bg?'background:'+bg+';':''}font-weight:${f.bold?'bold':'normal'};font-style:${f.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'};font-size:${(f.height||1)}em${bx?';box-shadow:'+bx:''}`;}
function os(app,face,txt){return `<span data-face="${face}" style="${ofs(app,face)}">${txt}</span>`;}
@@ -1224,7 +1525,7 @@ function renderOrgPreview(){const a='org-mode',L=[];
L.push(' '+os(a,'org-checkbox','[X]')+' done item '+os(a,'org-checkbox-statistics-done','[2/2]'));
L.push(' '+os(a,'org-checkbox','[ ]')+' open item '+os(a,'org-checkbox-statistics-todo','[0/3]')+' '+os(a,'org-warning','(!)'));
L.push(os(a,'org-level-2','** ')+os(a,'org-done','DONE')+os(a,'org-headline-done',' Ship the tool'));
- L.push(os(a,'org-level-3','*** ')+os(a,'org-headline-todo','Heading three'));
+ L.push(os(a,'org-level-3','*** ')+os(a,'org-todo','TODO')+os(a,'org-headline-todo',' Heading three'));
L.push(os(a,'org-level-4','**** four')+' / '+os(a,'org-level-5','***** five')+' / '+os(a,'org-level-6','****** six')+' / '+os(a,'org-level-7','******* seven')+' / '+os(a,'org-level-8','******** eight'));
L.push(' Inline '+os(a,'org-code','=code=')+', '+os(a,'org-verbatim','~verbatim~')+', '+os(a,'org-inline-src-block','src_py{1+1}')+',');
L.push(' a '+os(a,'org-link','[[https://gnu.org][link]]')+', a '+os(a,'org-target','&lt;&lt;target&gt;&gt;')+', a '+os(a,'org-macro','{{{macro}}}')+',');
@@ -1380,7 +1681,7 @@ function renderGitGutterPreview(){const a='git-gutter',L=[];
return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
function renderFlycheckPreview(){const a='flycheck',L=[];
L.push(os(a,'flycheck-fringe-error','E')+os(a,'flycheck-fringe-warning','W')+os(a,'flycheck-fringe-info','I')+' x = '+os(a,'flycheck-error','undefined_name')+'('+os(a,'flycheck-warning','unused_arg')+') '+os(a,'flycheck-info','# note'));
- L.push(' '+os(a,'flycheck-delimited-error','[')+os(a,'flycheck-error-delimiter','err')+os(a,'flycheck-delimited-error',']'));
+ L.push(' '+os(a,'flycheck-error-delimiter','[')+os(a,'flycheck-delimited-error','err')+os(a,'flycheck-error-delimiter',']'));
L.push('');
L.push(os(a,'flycheck-error-list-checker-name','pyright')+' '+os(a,'flycheck-verify-select-checker','(selected checker)'));
L.push(os(a,'flycheck-error-list-filename','main.py')+':'+os(a,'flycheck-error-list-line-number','12')+':'+os(a,'flycheck-error-list-column-number','4')+' '+os(a,'flycheck-error-list-error','error')+' '+os(a,'flycheck-error-list-error-message','undefined name x')+' '+os(a,'flycheck-error-list-id','[E0602]'));
@@ -1425,8 +1726,8 @@ function renderCalibredbPreview(){const a='calibredb',L=[];
function renderErcPreview(){const a='erc',L=[];
L.push(os(a,'erc-header-line',' #emacs on Libera.Chat 18 users '));
L.push(os(a,'erc-timestamp-face','[10:24]')+' '+os(a,'erc-notice-face','*** alice has joined #emacs'));
- L.push(os(a,'erc-timestamp-face','[10:25]')+' &lt;'+os(a,'erc-my-nick-prefix-face','@')+os(a,'erc-my-nick-face','craig')+'&gt; '+os(a,'erc-default-face','hello everyone'));
- L.push(os(a,'erc-timestamp-face','[10:25]')+' &lt;'+os(a,'erc-nick-prefix-face','+')+os(a,'erc-nick-default-face','bob')+'&gt; '+os(a,'erc-input-face','hi craig, see ')+os(a,'erc-button','this link')+os(a,'erc-input-face',' cc ')+os(a,'erc-button-nick-default-face','@alice'));
+ L.push(os(a,'erc-timestamp-face','[10:25]')+' &lt;'+os(a,'erc-my-nick-prefix-face','@')+os(a,'erc-my-nick-face','craig')+'&gt; '+os(a,'erc-input-face','hello everyone'));
+ L.push(os(a,'erc-timestamp-face','[10:25]')+' &lt;'+os(a,'erc-nick-prefix-face','+')+os(a,'erc-nick-default-face','bob')+'&gt; '+os(a,'erc-default-face','hi craig, see ')+os(a,'erc-button','this link')+os(a,'erc-default-face',' cc ')+os(a,'erc-button-nick-default-face','@alice'));
L.push(os(a,'erc-timestamp-face','[10:26]')+' '+os(a,'erc-action-face','* craig waves')+' '+os(a,'erc-keyword-face','emacs')+' '+os(a,'erc-pal-face','&lt;friend&gt;')+' '+os(a,'erc-fool-face','&lt;troll&gt;')+' '+os(a,'erc-dangerous-host-face','&lt;bad@host&gt;'));
L.push(os(a,'erc-timestamp-face','[10:27]')+' '+os(a,'erc-direct-msg-face','(DM)')+' &lt;'+os(a,'erc-nick-msg-face','bob')+'&gt; psst '+os(a,'erc-current-nick-face','craig')+' '+os(a,'erc-information','-info-'));
L.push(os(a,'erc-error-face','*** ERROR: connection reset'));
@@ -1504,9 +1805,23 @@ function renderTelegaPreview(){const a='telega',L=[];
L.push(os(a,'telega-link-preview-sitename','example.com')+' '+os(a,'telega-link-preview-title','Link preview title'));
L.push('Webpage '+os(a,'telega-webpage-title','Title')+' '+os(a,'telega-webpage-subtitle','Subtitle')+' '+os(a,'telega-webpage-header','Header')+' '+os(a,'telega-webpage-subheader','Subheader')+' '+os(a,'telega-webpage-outline','outline')+' '+os(a,'telega-webpage-fixed','fixed')+' '+os(a,'telega-webpage-preformatted','pre')+' '+os(a,'telega-webpage-marked','marked')+' '+os(a,'telega-webpage-strike-through','strike')+' '+os(a,'telega-webpage-chat-link','chat-link'));
return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-function genericPreview(app){let h='<div style="padding:10px 14px;font:12pt/1.8 monospace">';for(const [face,label,def] of APPS[app].faces){const f=PKGMAP[app][face],efg=effFg(pkgEffFg(app,face)),ebg=pkgEffBg(app,face);h+=`<div data-face="${face}" style="color:${efg};${ebg?'background:'+ebg+';':''}font-weight:${f.bold?'bold':'normal'};font-style:${f.italic?'italic':'normal'};font-size:${(f.height||1)}em">${esc(label)}</div>`;}return h+'</div>';}
-function buildPkgPreview(){const app=curApp(),p=document.getElementById('pkgpreview');if(!p)return;const pv=APPS[app].preview;const bespoke=['org','magit','elfeed','ghostel','dashboard','mu4e','lsp','gitgutter','flycheck','dired','dirvish','calibredb','erc','orgdrill','orgnoter','signel','pearl','slack','telega','shr'].includes(pv);p.innerHTML=pv==='org'?renderOrgPreview():pv==='magit'?renderMagitPreview():pv==='elfeed'?renderElfeedPreview():pv==='ghostel'?renderGhostelPreview():pv==='dashboard'?renderDashboardPreview():pv==='mu4e'?renderMu4ePreview():pv==='lsp'?renderLspPreview():pv==='gitgutter'?renderGitGutterPreview():pv==='flycheck'?renderFlycheckPreview():pv==='dired'?renderDiredPreview():pv==='dirvish'?renderDirvishPreview():pv==='calibredb'?renderCalibredbPreview():pv==='erc'?renderErcPreview():pv==='orgdrill'?renderOrgdrillPreview():pv==='orgnoter'?renderOrgnoterPreview():pv==='signel'?renderSignelPreview():pv==='pearl'?renderPearlPreview():pv==='slack'?renderSlackPreview():pv==='telega'?renderTelegaPreview():pv==='shr'?renderShrPreview():genericPreview(app);p.style.background=MAP['bg'];p.onclick=(e)=>{const u=e.target.closest('[data-face]');if(u)flashPkg(u.dataset.face);};const lbl=document.getElementById('pkgprevlabel');if(lbl)lbl.textContent=bespoke?(APPS[app].label+' preview'):'preview (generic — face names in their own colors)';}
-function resetApp(){const app=curApp();PKGMAP[app]={};for(const [face,label,d] of APPS[app].faces)PKGMAP[app][face]=seedFace(d);pkgChanged();}
+function genericPreview(app){let h='<div style="padding:10px 14px;font:12pt/1.8 monospace">';for(const [face,label] of APPS[app].faces)h+=`<div data-face="${face}" style="${ofs(app,face)}">${esc(label)}</div>`;return h+'</div>';}
+const PACKAGE_PREVIEWS={
+ org:renderOrgPreview,magit:renderMagitPreview,elfeed:renderElfeedPreview,ghostel:renderGhostelPreview,
+ dashboard:renderDashboardPreview,mu4e:renderMu4ePreview,lsp:renderLspPreview,gitgutter:renderGitGutterPreview,
+ flycheck:renderFlycheckPreview,dired:renderDiredPreview,dirvish:renderDirvishPreview,calibredb:renderCalibredbPreview,
+ erc:renderErcPreview,orgdrill:renderOrgdrillPreview,orgnoter:renderOrgnoterPreview,signel:renderSignelPreview,
+ pearl:renderPearlPreview,slack:renderSlackPreview,telega:renderTelegaPreview,shr:renderShrPreview
+};
+function buildPkgPreview(){
+ const app=curApp(),p=document.getElementById('pkgpreview');if(!p)return;
+ const renderer=PACKAGE_PREVIEWS[APPS[app].preview];
+ p.innerHTML=renderer?renderer():genericPreview(app);
+ p.style.background=MAP['bg'];
+ p.onclick=(e)=>{const u=e.target.closest('[data-face]');if(u)flashPkg(u.dataset.face);};
+ const lbl=document.getElementById('pkgprevlabel');if(lbl)lbl.textContent=renderer?(APPS[app].label+' preview'):'preview (generic — face names in their own colors)';
+}
+function resetApp(){const app=curApp();for(const [face,label,d] of APPS[app].faces)if(!LOCKED.has('pkg:'+app+':'+face))PKGMAP[app][face]=seedFace(d);pkgChanged();notify('reset editable '+app+' faces to package defaults',false);}
function syncPkgHeight(){const t=document.getElementById('pkgtable'),m=document.getElementById('pkgpreview');if(!t||!m)return;const lb=m.previousElementSibling,lbh=lb?lb.getBoundingClientRect().height+10:30;m.style.height=Math.max(t.getBoundingClientRect().height-lbh,220)+'px';}
// --- worst-case readout for the covered overlay faces (spec Phase 4) ---------
// Default WCAG target for the worst-case verdict (AA). AAA is selectable.
@@ -1514,7 +1829,7 @@ let WORST_TARGET=4.5;
// The live v1 foreground set for a covered overlay face: the syntax-token colors
// (every assignable category except the ground) plus the default foreground.
function fgSetForFace(face){
- const syntaxAssignments=CATS.filter(c=>c[0]!=='bg'&&c[0]!=='p').map(c=>({role:c[0],hex:effFg(MAP[c[0]])}));
+ const syntaxAssignments=CATS.filter(c=>c[0]!=='bg'&&c[0]!=='p').map(c=>({role:c[0],hex:effFg(syntaxFace(c[0]).fg)}));
return fgSetFor(face,{covered:COVERED_FACES,syntaxAssignments,defaultFg:MAP['p']});
}
// The worst-case contrast cell for a covered face: the floor over its foreground
@@ -1546,11 +1861,12 @@ function buildUITable(){
stBtns.forEach(b=>cS.appendChild(b));
const cC=document.createElement('td');cC.id='uicr-'+face;cC.style.whiteSpace='nowrap';cC.style.fontSize='10pt';
const cP=document.createElement('td');cP.className='ex';cP.id='uiprev-'+face;cP.textContent=ex;cP.style.padding='4px 10px';cP.style.borderRadius='4px';
- const cX=document.createElement('td');const boxSel=mkBoxSelect(()=>UIMAP[face].box,b=>{UIMAP[face].box=b;paintUI(face);buildMockFrame();});cX.appendChild(boxSel);
- const cL=mkLockCell('ui:'+face,[fgSel,bgSel,...stBtns,boxSel]);
+ const cX=document.createElement('td');const boxCtl=mkBoxControl(()=>UIMAP[face].box,b=>{UIMAP[face].box=b;paintUI(face);buildMockFrame();},{compact:true});cX.appendChild(boxCtl);
+ const cL=mkLockCell('ui:'+face,[fgSel,bgSel,...stBtns,boxCtl]);
tr.appendChild(c0);tr.appendChild(cL);tr.appendChild(cF);tr.appendChild(cB);tr.appendChild(cS);tr.appendChild(cC);tr.appendChild(cP);tr.appendChild(cX);tb.appendChild(tr);paintUI(face);
}
applyTableSort('uibody');
+ updateLockToggle('ui');
}
// Generic header-click sort, shared by all three tables. Reads a swatch
// dropdown's value, a select value, a numeric input, or cell text (numeric when
@@ -1561,7 +1877,11 @@ let tableSort={};
function cellVal(td){if(!td)return '';const dd=td.querySelector('.cdd');if(dd)return (dd.dataset.val||'').toLowerCase();const s=td.querySelector('select');if(s)return s.value.toLowerCase();const i=td.querySelector('input');if(i)return parseFloat(i.value)||0;const t=td.innerText.trim();const n=parseFloat(t);return (!isNaN(n)&&/^[-\d.]/.test(t))?n:t.toLowerCase();}
function srtTable(tbId,col){tableSort[tbId]={col,asc:!(tableSort[tbId]&&tableSort[tbId].col===col&&tableSort[tbId].asc)};applyTableSort(tbId);}
function applyTableSort(tbId){const s=tableSort[tbId];if(!s)return;const tb=document.getElementById(tbId);if(!tb)return;const dir=s.asc?1:-1;const r=[...tb.rows];r.sort((a,b)=>{const x=cellVal(a.cells[s.col]),y=cellVal(b.cells[s.col]);return ((typeof x==='number'&&typeof y==='number')?x-y:(x<y?-1:x>y?1:0))*dir;});r.forEach(x=>tb.appendChild(x));}
-buildLangSel();buildAppSel();renderPalette();buildTable();buildUITable();renderCode();applyGround();updateTitle();initPicker();buildPkgTable();buildPkgPreview();syncMockHeight();syncPkgHeight();
+function initApp(){
+ buildLangSel();buildAppSel();renderPalette();rebuildColorTables();renderCode();applyGround();
+ updateTitle();initPicker();buildPkgPreview();syncMockHeight();syncPkgHeight();
+}
+initApp();
addEventListener('resize',()=>{syncMockHeight();syncPkgHeight();});
// Phase-1 self-test (open with #selftest): seed -> export -> import -> compare.
function pkgSelftest(){
@@ -1586,32 +1906,69 @@ function pkgSelftest(){
}
if(location.hash==='#selftest')pkgSelftest();
// Lock-mechanism gate (open with #locktest): two behaviors the refactor must
-// preserve, across all three tiers. (1) Locking a row disables its control via
-// the shared mkLockCell — syntax uses a swatch div (data-locked), UI a native
-// select (.disabled). (2) clear-unlocked wipes unlocked rows to default but
-// leaves locked rows (syntax bare-kind, ui:, pkg: keys) untouched.
+// preserve, across all three tiers. (1) Locking a row disables its controls via
+// the shared mkLockCell. (2) reset/erase batch actions update editable rows but
+// leave locked rows (syntax bare-kind, ui:, pkg: keys) untouched.
if(location.hash==='#locktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
LOCKED.clear();buildTable();
{const k=CATS.map(c=>c[0]).filter(k=>k!=='bg'&&k!=='p')[0];
- const tr=document.querySelector('#legbody tr[data-kind="'+k+'"]'),dd=tr.querySelector('.cdd'),lb=tr.querySelector('.lockbtn');
- A(dd.dataset.locked!=='1','syntax-dd-starts-unlocked');lb.click();
- A(dd.dataset.locked==='1'&&dd.classList.contains('locked'),'syntax-lock-disables-dd');lb.click();
- A(dd.dataset.locked!=='1','syntax-unlock-reenables-dd');}
+ const tr=document.querySelector('#legbody tr[data-kind="'+k+'"]'),step=tr.querySelector('.cstep'),dd=tr.querySelector('.cdd'),lb=tr.querySelector('.lockbtn');
+ A(step.dataset.locked!=='1','syntax-dd-starts-unlocked');lb.click();
+ A(step.dataset.locked==='1'&&step.classList.contains('locked')&&step.querySelector('.cstepbtn').disabled,'syntax-lock-disables-dd');lb.click();
+ A(step.dataset.locked!=='1'&&!step.classList.contains('locked'),'syntax-unlock-reenables-dd');}
LOCKED.clear();buildUITable();
{const f=UI_FACES[0][0];
- const tr=document.querySelector('#uibody tr[data-face="'+f+'"]'),dd=tr.querySelector('.cdd'),lb=tr.querySelector('.lockbtn');
- A(dd.dataset.locked!=='1','ui-dd-starts-unlocked');lb.click();
- A(dd.dataset.locked==='1'&&dd.classList.contains('locked'),'ui-lock-disables-dd');lb.click();
- A(dd.dataset.locked!=='1','ui-unlock-reenables-dd');}
+ const tr=document.querySelector('#uibody tr[data-face="'+f+'"]'),step=tr.querySelector('.cstep'),dd=tr.querySelector('.cdd'),lb=tr.querySelector('.lockbtn');
+ A(step.dataset.locked!=='1','ui-dd-starts-unlocked');lb.click();
+ A(step.dataset.locked==='1'&&step.classList.contains('locked')&&step.querySelector('.cstepbtn').disabled,'ui-lock-disables-dd');lb.click();
+ A(step.dataset.locked!=='1'&&!step.classList.contains('locked'),'ui-unlock-reenables-dd');}
+ {UIMAP['region'].fg=null;UIMAP['region'].bg='#888888';buildUITable();
+ const tr=document.querySelector('#uibody tr[data-face="region"]'),fg=tr.cells[2].querySelector('.cdd'),bg=tr.cells[3].querySelector('.cdd');
+ A(fg.classList.contains('is-default'),'compact default color button has default outline class');
+ A(!bg.classList.contains('is-default'),'compact assigned color button does not have default outline class');}
+ {PALETTE=[['#000000','bg','ground'],['#ffffff','fg','ground'],['#222222','gray-dark','gray'],['#888888','gray-mid','gray'],['#dddddd','gray-light','gray']];setSyntaxFg('bg','#000000');setSyntaxFg('p','#ffffff');setSyntaxFg('kw','#888888');LOCKED.clear();buildTable();
+ const tr=document.querySelector('#legbody tr[data-kind="kw"]'),btns=tr.querySelectorAll('.cstepbtn');btns[1].click();
+ A(MAP['kw']==='#dddddd'&&tr.querySelector('.cdd').dataset.val==='#dddddd','syntax right arrow steps to lighter color');btns[0].click();
+ A(MAP['kw']==='#888888','syntax left arrow steps to darker color');}
+ {UIMAP['region'].bg='#888888';LOCKED.clear();buildUITable();const tr=document.querySelector('#uibody tr[data-face="region"]'),btns=tr.cells[3].querySelectorAll('.cstepbtn');btns[1].click();
+ A(UIMAP['region'].bg==='#dddddd','ui right arrow steps to lighter color');btns[0].click();
+ A(UIMAP['region'].bg==='#888888','ui left arrow steps to darker color');}
+ {const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].fg='#888888';LOCKED.clear();buildPkgTable();const tr=document.querySelector('#pkgbody tr[data-face="'+face+'"]'),btns=tr.cells[2].querySelectorAll('.cstepbtn');btns[1].click();
+ A(PKGMAP[app][face].fg==='#dddddd','pkg right arrow steps to lighter color');btns[0].click();
+ A(PKGMAP[app][face].fg==='#888888','pkg left arrow steps to darker color');}
+ {const ks=CATS.map(c=>c[0]).filter(k=>k!=='bg'&&k!=='p'),k1=ks[0],k2=ks[1];
+ setSyntaxFg(k1,'#111111');setSyntaxFg(k2,'#222222');LOCKED.clear();LOCKED.add(k1);clearUnlocked();
+ A(MAP[k1]==='#111111','syntax-erase-keeps-locked');A(MAP[k2]==='','syntax-erase-wipes-unlocked');}
{const ks=CATS.map(c=>c[0]).filter(k=>k!=='bg'&&k!=='p'),k1=ks[0],k2=ks[1];
- MAP[k1]='#111111';MAP[k2]='#222222';LOCKED.clear();LOCKED.add(k1);clearUnlocked();
- A(MAP[k1]==='#111111','syntax-clear-keeps-locked');A(MAP[k2]==='','syntax-clear-wipes-unlocked');}
+ setSyntaxFg(k1,'#111111');setSyntaxFg(k2,'#222222');LOCKED.clear();LOCKED.add(k1);resetUnlocked();
+ A(MAP[k1]==='#111111','syntax-reset-keeps-locked');A(MAP[k2]===DEFAULT_SYNTAX[k2].fg,'syntax-reset-restores-unlocked-default');}
{const f1=UI_FACES[0][0],f2=UI_FACES[1][0];
UIMAP[f1].fg='#111111';UIMAP[f2].fg='#222222';LOCKED.clear();LOCKED.add('ui:'+f1);clearUnlockedUI();
- A(UIMAP[f1].fg==='#111111','ui-clear-keeps-locked');A(UIMAP[f2].fg===null,'ui-clear-wipes-unlocked');}
+ A(UIMAP[f1].fg==='#111111','ui-erase-keeps-locked');A(UIMAP[f2].fg===null,'ui-erase-wipes-unlocked');}
+ {const f1=UI_FACES[0][0],f2=UI_FACES[1][0];
+ UIMAP[f1].fg='#111111';UIMAP[f2].fg='#222222';LOCKED.clear();LOCKED.add('ui:'+f1);resetUnlockedUI();
+ A(UIMAP[f1].fg==='#111111','ui-reset-keeps-locked');A(JSON.stringify(UIMAP[f2])===JSON.stringify(DEFAULT_UIMAP[f2]),'ui-reset-restores-unlocked-default');}
{const app=curApp(),pf=APPS[app].faces.map(r=>r[0]),p1=pf[0],p2=pf[1];
PKGMAP[app][p1].fg='#111111';PKGMAP[app][p2].fg='#222222';LOCKED.clear();LOCKED.add('pkg:'+app+':'+p1);clearUnlockedPkg();
- A(PKGMAP[app][p1].fg==='#111111','pkg-clear-keeps-locked');A(PKGMAP[app][p2].fg===null,'pkg-clear-wipes-unlocked');}
+ A(PKGMAP[app][p1].fg==='#111111','pkg-erase-keeps-locked');A(PKGMAP[app][p2].fg===null,'pkg-erase-wipes-unlocked');}
+ {const app=curApp(),rows=APPS[app].faces,p1=rows[0][0],p2=rows[1][0],d2=rows[1][2];
+ PKGMAP[app][p1].fg='#111111';PKGMAP[app][p2]=normalizePkgFace({fg:'#222222',bg:'#333333',bold:true,source:'user'},'user');
+ LOCKED.clear();LOCKED.add('pkg:'+app+':'+p1);resetApp();
+ A(PKGMAP[app][p1].fg==='#111111','pkg-reset-keeps-locked');
+ A(JSON.stringify(PKGMAP[app][p2])===JSON.stringify(seedFace(d2)),'pkg-reset-restores-unlocked-default');}
+ {LOCKED.clear();buildTable();const b=document.getElementById('syntaxlocktoggle');A(b&&b.textContent==='lock all','syntax toggle starts as lock all');b.click();
+ A(syntaxLockKeys().every(k=>LOCKED.has(k))&&b.textContent==='unlock all','syntax lock-all locks every syntax row and flips label');b.click();
+ A(syntaxLockKeys().every(k=>!LOCKED.has(k))&&b.textContent==='lock all','syntax unlock-all clears every syntax lock and flips label');}
+ {LOCKED.clear();buildUITable();const b=document.getElementById('uilocktoggle');A(b&&b.textContent==='lock all','ui toggle starts as lock all');b.click();
+ A(uiLockKeys().every(k=>LOCKED.has(k))&&b.textContent==='unlock all','ui lock-all locks every UI row and flips label');b.click();
+ A(uiLockKeys().every(k=>!LOCKED.has(k))&&b.textContent==='lock all','ui unlock-all clears every UI lock and flips label');}
+ {LOCKED.clear();buildPkgTable();const b=document.getElementById('pkglocktoggle');A(b&&b.textContent==='lock all','pkg toggle starts as lock all');b.click();
+ A(pkgLockKeys().every(k=>LOCKED.has(k))&&b.textContent==='unlock all','pkg lock-all locks every current package row and flips label');b.click();
+ A(pkgLockKeys().every(k=>!LOCKED.has(k))&&b.textContent==='lock all','pkg unlock-all clears every current package lock and flips label');}
+ {LOCKED.clear();const app=curApp(),faces=APPS[app].faces.map(r=>r[0]),filter=document.getElementById('pkgfilter');
+ if(filter&&faces.length>1){filter.value=faces[0];buildPkgTable();const b=document.getElementById('pkglocktoggle');b.click();
+ A(faces.every(face=>LOCKED.has('pkg:'+app+':'+face)),'pkg lock-all covers the whole package even when filtered');
+ filter.value='';buildPkgTable();}}
document.title='LOCKTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='locktest';d.textContent='LOCKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
// Sort gate (open with #sorttest): all three tables now share srtTable/cellVal.
@@ -1641,14 +1998,42 @@ if(location.hash==='#mocktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c
A(Q('[data-face="region"] [data-k]'),'region-keeps-token-colors');
const curCell=Q('[data-face="cursor"]');
A(curCell&&curCell.textContent.trim().length===1,'cursor-on-glyph');
+ UIMAP['cursor']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false,box:null};buildMockFrame();
+ const curStyled=Q('[data-face="cursor"]'),curSt=curStyled&&curStyled.getAttribute('style')||'';
+ A(curSt.includes('#112233')&&curSt.includes('#aabbcc'),'cursor preview honors fg and bg: '+curSt);
+ UIMAP['hl-line']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false,box:null};buildMockFrame();
+ const hlStyled=Q('[data-face="hl-line"]'),hlSt=hlStyled&&hlStyled.getAttribute('style')||'';
+ A(hlSt.includes('#112233')&&hlSt.includes('#aabbcc'),'hl-line preview honors fg and bg: '+hlSt);
+ UIMAP['link']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:true,strike:false,box:null};buildMockFrame();
+ const linkStyled=Q('[data-face="link"]'),linkSt=linkStyled&&linkStyled.getAttribute('style')||'';
+ A(linkSt.includes('#112233')&&linkSt.includes('#aabbcc'),'inline UI face preview honors fg and bg: '+linkSt);
+ const missing=UI_FACES.map(f=>f[0]).filter(f=>!Q('[data-face="'+f+'"]'));
+ A(missing.length===0,'all UI faces are represented in live buffer preview: '+missing.join(','));
+ buildTable();buildUITable();buildPkgTable();
+ [['#legbody tr[data-kind="kw"]',5],['#uibody tr[data-face="mode-line"]',7],['#pkgbody tr',8]].forEach(([sel,idx])=>{
+ const cell=document.querySelector(sel)?.cells[idx],ctl=cell&&cell.querySelector('.boxctl');
+ A(cell&&ctl&&ctl.getBoundingClientRect().width<=cell.getBoundingClientRect().width,'box control fits its table cell for '+sel);
+ });
const laz=Q('[data-face="lazy-highlight"]');
- A(laz&&/underline/.test(laz.getAttribute('style')||''),'overlay-honors-style');
+ A(laz&&/background:\s*(?!transparent)/.test(laz.getAttribute('style')||''),'overlay-honors-background-style');
A([...document.querySelectorAll('#mockframe .fr')].some(e=>e.textContent.trim()),'fringe-indicator-present');
const mlbar=Q('[data-face="mode-line"]');
A(mlbar&&/box-shadow/.test(mlbar.getAttribute('style')||''),'mode-line-box');
UIMAP['line-number-current-line'].bold=true;buildMockFrame();
const curNum=Q('[data-face="line-number-current-line"]');
A(curNum&&/font-weight:\s*bold/.test(curNum.getAttribute('style')||''),'line-number-honors-weight');
+ UIMAP['region'].bold=false;buildUITable();
+ const uiBold=[...document.querySelectorAll('#uibody tr')].find(r=>r.dataset.face==='region').querySelector('.sbtn[title="bold"]');
+ A(uiBold&&!uiBold.classList.contains('on'),'ui style button starts off when model is false');
+ uiBold.click();
+ A(uiBold.classList.contains('on')&&UIMAP['region'].bold===true,'ui style button visual state turns on with model');
+ uiBold.click();
+ A(!uiBold.classList.contains('on')&&UIMAP['region'].bold===false,'ui style button visual state turns off with model');
+ const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].bold=false;buildPkgTable();
+ const pkgBtn=()=>document.querySelector('#pkgbody tr[data-face="'+face+'"] .sbtn[title="bold"]');
+ A(pkgBtn()&&!pkgBtn().classList.contains('on'),'pkg style button starts off when model is false');
+ pkgBtn().click();
+ A(pkgBtn()&&pkgBtn().classList.contains('on')&&PKGMAP[app][face].bold===true,'pkg style button visual state turns on after rebuild');
document.title='MOCKTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='mocktest';d.textContent='MOCKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
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();}}
@@ -1714,7 +2099,8 @@ if(location.hash==='#readouttest'){const hex='#67809c';document.getElementById('
// out-of-scope face keeps the single-pair readout, and an empty set reads "no fg set".
if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
const saveMAP=Object.assign({},MAP),saveUI=JSON.parse(JSON.stringify(UIMAP));
- MAP['p']='#f0fef0';MAP['kw']='#67809c';MAP['str']='#a3b18a';MAP['bg']='#000000';
+ CATS.forEach(c=>{if(c[0]!=='bg'&&c[0]!=='p')setSyntaxFg(c[0],'');});
+ setSyntaxFg('p','#f0fef0');setSyntaxFg('kw','#67809c');setSyntaxFg('str','#a3b18a');setSyntaxFg('bg','#000000');
UIMAP['region']={fg:null,bg:'#202830',bold:false,italic:false,underline:false,strike:false};
buildUITable();
const cell=document.getElementById('uicr-region');
@@ -1727,7 +2113,7 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i
const ml=document.getElementById('uicr-mode-line');
A(worstCellHtml('mode-line')===null,'mode-line is out of scope (single-pair)');
A(ml&&/^\d/.test(ml.textContent.trim()),'mode-line cell is a numeric ratio: '+(ml&&ml.textContent));
- MAP['p']='';CATS.forEach(c=>{if(c[0]!=='bg')MAP[c[0]]='';});buildUITable();
+ setSyntaxFg('p','');CATS.forEach(c=>{if(c[0]!=='bg')setSyntaxFg(c[0],'');});buildUITable();
const empty=document.getElementById('uicr-region');
A(empty&&empty.textContent.trim()==='no fg set','empty set reads the no-set message: '+(empty&&empty.textContent));
// A two-color face (own fg AND own bg) rates its own pair, never the ground bg.
@@ -1744,7 +2130,7 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i
// two-color ratio alone, and must re-rate a ground-dependent face's cell.
UIMAP['fringe']={fg:'#ddeeff',bg:null,bold:false,italic:false,underline:false,strike:false};
buildUITable();
- MAP['bg']='#440000';applyGround();
+ setSyntaxFg('bg','#440000');applyGround();
const pv=document.getElementById('uiprev-mode-line');
A(pv&&pv.style.background==='rgb(170, 187, 204)','ground change keeps a face own preview bg: got '+(pv&&pv.style.background));
const twoAfter=document.getElementById('uicr-mode-line');
@@ -1765,14 +2151,14 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i
A(prow&&pf&&Math.abs(parseFloat(pf.textContent)-pfWant)<0.06,'default-fg change re-rates a p-fallback face: got '+(pf&&pf.textContent.trim())+' want '+pfWant.toFixed(1));
}else A(false,'syntax table has a p row with a dropdown');
if(pLocked){LOCKED.add('p');buildTable();}
- for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();applyGround();
+ for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();applyGround();
document.title='CONTRASTTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='contrasttest';d.textContent='CONTRASTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
// Bevel gate (open with #beveltest): released/pressed boxes derive their
// highlight and shadow from the face's effective bg per Emacs's relief
// algorithm, and pressed draws the shadow edge first.
if(location.hash==='#beveltest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
- const saveUI=JSON.parse(JSON.stringify(UIMAP));
+ const saveUI=JSON.parse(JSON.stringify(UIMAP)),saveP=PALETTE.slice(),savePK=JSON.parse(JSON.stringify(PKGMAP));
UIMAP['mode-line']={fg:'#d8dee9',bg:'#30343c',bold:false,italic:false,underline:false,strike:false,box:{style:'released',width:1,color:null}};
buildUITable();
const pv=document.getElementById('uiprev-mode-line');
@@ -1784,14 +2170,45 @@ if(location.hash==='#beveltest'){let ok=true;const notes=[];const A=(c,n)=>{if(!
A(bs2&&bs2.includes('rgb(15, 17, 22)')&&bs2.includes('rgb(113, 118, 127)')&&bs2.indexOf('rgb(15, 17, 22)')<bs2.indexOf('rgb(113, 118, 127)'),'pressed swaps the pair (shadow edge first): '+bs2);
UIMAP['mode-line'].box={style:'line',width:1,color:'#ff0000'};paintUI('mode-line');
A(pv&&pv.style.boxShadow.includes('rgb(255, 0, 0)'),'line style keeps its explicit color: '+(pv&&pv.style.boxShadow));
- for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();
+ UIMAP['mode-line'].box={style:'released',width:1,color:'#ff0000'};paintUI('mode-line');
+ const bs3=pv&&pv.style.boxShadow;
+ A(bs3&&bs3.includes('rgb(255, 42, 42)')&&bs3.includes('rgb(143, 0, 0)'),'released style derives relief from explicit box color: '+bs3);
+ PALETTE=[['#ff0000','red','red'],['#30343c','slate','slate']];
+ buildUITable();
+ const mlrow=document.querySelector('#uibody tr[data-face="mode-line"]'),boxCell=mlrow&&mlrow.cells[7],boxSel=boxCell&&boxCell.querySelector('select'),boxDd=boxCell&&boxCell.querySelector('.cdd');
+ if(boxSel&&boxDd){boxSel.value='line';boxSel.dispatchEvent(new Event('change',{bubbles:true}));boxDd.click();const redRow=[...document.querySelectorAll('.cddpop .cddrow')].find(r=>r.textContent.includes('red'));if(redRow)redRow.click();}
+ A(UIMAP['mode-line'].box&&UIMAP['mode-line'].box.color==='#ff0000','UI box color dropdown writes box.color');
+ const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].box={style:'line',width:1,color:null};buildPkgTable();
+ const prow=document.querySelector('#pkgbody tr[data-face="'+face+'"]'),pbox=prow&&prow.cells[8],pdd=pbox&&pbox.querySelector('.cdd');
+ if(pdd){pdd.click();const redRow=[...document.querySelectorAll('.cddpop .cddrow')].find(r=>r.textContent.includes('red'));if(redRow)redRow.click();}
+ A(PKGMAP[app][face].box&&PKGMAP[app][face].box.color==='#ff0000','package box color dropdown writes box.color');
+ PALETTE=saveP;PKGMAP=savePK;for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();buildPkgTable();
document.title='BEVELTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='beveltest';d.textContent='BEVELTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
+// Preview-link gate (open with #previewlinktest): known bespoke-preview face
+// mappings stay wired to the face that Emacs actually uses.
+if(location.hash==='#previewlinktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
+ const box=document.createElement('div');
+ box.innerHTML=renderOrgPreview();
+ const headline=[...box.querySelectorAll('[data-face="org-headline-todo"]')].find(e=>e.textContent.includes('Heading three'));
+ A(!!headline&&headline.previousElementSibling&&headline.previousElementSibling.dataset.face==='org-todo','org headline-todo follows a TODO keyword span');
+ box.innerHTML=renderFlycheckPreview();
+ const delim=[...box.querySelectorAll('[data-face="flycheck-error-delimiter"]')].map(e=>e.textContent).join('');
+ const enclosed=[...box.querySelectorAll('[data-face="flycheck-delimited-error"]')].map(e=>e.textContent).join('');
+ A(delim==='[]','flycheck delimiters use flycheck-error-delimiter');
+ A(enclosed==='err','flycheck enclosed text uses flycheck-delimited-error');
+ box.innerHTML=renderErcPreview();
+ const own=[...box.querySelectorAll('[data-face="erc-input-face"]')].some(e=>e.textContent.includes('hello everyone'));
+ const bob=[...box.querySelectorAll('[data-face="erc-default-face"]')].some(e=>e.textContent.includes('hi craig'));
+ A(own,'erc own sent message uses erc-input-face');
+ A(bob,'erc remote message uses erc-default-face');
+ document.title='PREVIEWLINKTEST '+(ok?'PASS':'FAIL');
+ const d=document.createElement('div');d.id='previewlinktest';d.textContent='PREVIEWLINKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
// Safe-lightness gate (open with #safetest): the OKLCH picker shades the unsafe
// lightness band for a selected covered face and hides it when no face is selected.
if(location.hash==='#safetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
const saveMAP=Object.assign({},MAP);
- MAP['p']='#f0fef0';MAP['kw']='#67809c';MAP['bg']='#000000';
+ setSyntaxFg('p','#f0fef0');setSyntaxFg('kw','#67809c');setSyntaxFg('bg','#000000');
document.getElementById('newhexstr').value='#202830';openPicker();setPkModel('oklch');
setSafeFace('region');
const band=document.getElementById('svsafe');
@@ -1799,89 +2216,174 @@ if(location.hash==='#safetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c
A(band&&parseFloat(band.style.height)>0,'safe band has a positive height: '+(band&&band.style.height));
setSafeFace('');
A(band&&band.style.display==='none','safe band hidden when no face is selected');
- for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);
+ for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);syncSyntaxFromCache();
setPkModel('hsv');closePicker();
document.title='SAFETEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='safetest';d.textContent='SAFETEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
// Gone-rebind gate (open with #healtest): deleting a named color then recreating
-// the name re-points the assignments stranded on the old hex to the new color.
+// the name re-points face references stranded on the old hex to the new color.
if(location.hash==='#healtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),savePK=JSON.parse(JSON.stringify(PKGMAP)),saveG=Object.assign({},lastGone),saveSel=selectedIdx;
- PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue']];MAP['kw']='#67809c';lastGone={};selectedIdx=null;renderPalette();buildTable();
+ PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue']];setSyntaxFg('kw','#67809c');lastGone={};selectedIdx=null;renderPalette();buildTable();
const blue=[...document.querySelectorAll('#pals .pchip')].find(c=>c.querySelector('.nm')&&c.querySelector('.nm').value==='blue');
A(!!(blue&&blue.querySelector('.rm')),'blue chip has a remove button');
if(blue&&blue.querySelector('.rm'))blue.querySelector('.rm').click();
A(!PALETTE.some(p=>p[1]==='blue'),'blue was deleted');
A(lastGone['blue']==='#67809c','delete recorded the gone name->hex');
document.getElementById('newhexstr').value='#5a7a9a';document.getElementById('newname').value='blue';selectedIdx=null;addColor();
- A(MAP['kw']==='#5a7a9a','assignment re-bound to the recreated name, got '+MAP['kw']);
+ A(MAP['kw']==='#5a7a9a','face reference re-bound to the recreated name, got '+MAP['kw']);
A(!('blue' in lastGone),'heal consumed the gone entry');
- PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);PKGMAP=savePK;lastGone=saveG;selectedIdx=saveSel;
+ PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);PKGMAP=savePK;lastGone=saveG;selectedIdx=saveSel;
renderPalette();buildTable();buildUITable();if(document.getElementById('pkgbody'))buildPkgTable();
document.title='HEALTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='healtest';d.textContent='HEALTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
-// Family-strip gate (open with #familytest): the palette renders as the pinned
-// ground strip plus hue families, chips keep their controls, and renaming a color
-// to anything leaves it in the same strip (grouping is by hex, not name).
-if(location.hash==='#familytest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
- const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveSel=selectedIdx;
- MAP['bg']='#0d0b0a';MAP['p']='#f0fef0';
+// Column-strip gate (open with #columntest): the palette renders as a pinned
+// ground column plus structural columns, chips keep their controls, and renaming
+// a color leaves it in the same strip because the column id is stable.
+if(location.hash==='#columntest'||location.hash==='#familytest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
+ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveG=Object.assign({},lastGone),saveSel=selectedIdx;
+ setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0');
PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg'],['#c0402a','red'],['#3a6ea5','blue'],['#808080','gray']];selectedIdx=null;renderPalette();
const strips=[...document.querySelectorAll('#pals .fstrip')];
- A(strips.length&&strips[0].classList.contains('ground'),'ground strip is pinned first');
- A(strips[0].querySelectorAll('.pchip').length===2,'ground strip carries bg + fg');
- A(strips.length>=4,'ground + neutral + red + blue strips, got '+strips.length);
+ A(strips.length&&strips[0].dataset.column==='ground','ground column is pinned first');
+ A(strips[0].querySelectorAll('.pchip').length===2,'ground column carries bg + fg endpoints');
+ A(!!strips[0].querySelector('.fhead + .fcount + .pchip'),'span control sits between header and tiles for ground');
+ A(strips.length>=4,'ground + red + blue + gray columns, got '+strips.length);
+ PALETTE=[['#3a6ea5','blue','blue']];setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0');selectedIdx=null;renderPalette();
+ const fgChip=[...document.querySelectorAll('#pals .fstrip[data-column="ground"] .pchip')].find(c=>c.querySelector('.nm')&&c.querySelector('.nm').value==='fg');
+ A(!!fgChip&&!fgChip.querySelector('.nm').disabled,'missing fg endpoint is normalized into a selectable real chip');
+ if(fgChip)fgChip.click();
+ A(selectedIdx!==null&&PALETTE[selectedIdx]&&PALETTE[selectedIdx][1]==='fg'&&document.getElementById('newhexstr').value.toLowerCase()==='#f0fef0','clicking normalized fg selects it and updates the color editor');
+ PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg'],['#c0402a','red'],['#3a6ea5','blue'],['#808080','gray']];selectedIdx=null;renderPalette();
+ const resetStrips=[...document.querySelectorAll('#pals .fstrip')];
+ const blueHead=resetStrips.find(s=>s.dataset.column==='blue')&&resetStrips.find(s=>s.dataset.column==='blue').querySelector('.ctitle');
+ A(!!blueHead,'normal column header has a selectable title');
+ if(blueHead)blueHead.click();
+ A(selectedIdx!==null&&PALETTE[selectedIdx][1]==='blue'&&document.getElementById('newhexstr').value.toLowerCase()==='#3a6ea5','clicking a column title selects its base color');
+ const blueRight=resetStrips.find(s=>s.dataset.column==='blue')&&resetStrips.find(s=>s.dataset.column==='blue').querySelector('.cmove.right');
+ if(blueRight)blueRight.click();
+ const moved=[...document.querySelectorAll('#pals .fstrip')].map(s=>s.dataset.column);
+ A(moved.indexOf('blue')>moved.indexOf('gray'),'right arrow moves a color column after its neighbor');
+ A(!document.querySelector('#pals .fstrip[data-column="ground"] .cdel'),'ground column has no delete button');
const redChip=[...document.querySelectorAll('#pals .pchip')].find(c=>c.querySelector('.nm')&&c.querySelector('.nm').value==='red');
- A(!!redChip&&!!redChip.querySelector('.rm')&&!!redChip.querySelector('.nm'),'a family chip keeps remove + rename controls');
- const redFamily=redChip&&redChip.closest('.fstrip').dataset.family;
+ A(!!redChip&&!!redChip.querySelector('.rm')&&!!redChip.querySelector('.nm'),'a column chip keeps remove + rename controls');
+ if(redChip){
+ const redName=redChip.querySelector('.nm');selectedIdx=null;redName.click();
+ A(selectedIdx!==null&&PALETTE[selectedIdx][1]==='red','single-clicking a tile name selects the whole tile');
+ const chipHex=chip=>rgb2hex(...getComputedStyle(chip).backgroundColor.match(/\d+/g).slice(0,3).map(Number));
+ openPicker();setHex('#00ff00');
+ A(chipHex(redChip)==='#00ff00','picker edits preview on the selected palette chip');
+ closePicker();
+ A(chipHex(redChip)==='#c0402a'&&PALETTE[selectedIdx][0]==='#c0402a','closing picker restores selected chip without mutating palette');
+ A(redName.readOnly===true&&!redName.classList.contains('editing'),'single-clicking a tile name does not enter name edit mode');
+ redName.dispatchEvent(new MouseEvent('dblclick',{bubbles:true,cancelable:true}));
+ A(redName.readOnly===false&&redName.classList.contains('editing'),'double-clicking a tile name enters edit mode');
+ A(redName.selectionStart===0&&redName.selectionEnd===0,'double-clicking places the cursor at the beginning of the name');
+ redName.blur();
+ }
+ const redColumn=redChip&&redChip.closest('.fstrip').dataset.column;
const ri=PALETTE.findIndex(p=>p[1]==='red');PALETTE[ri][1]='zztop-absurd';renderPalette();
const renamed=[...document.querySelectorAll('#pals .pchip')].find(c=>c.querySelector('.nm')&&c.querySelector('.nm').value==='zztop-absurd');
- A(!!renamed&&renamed.closest('.fstrip').dataset.family===redFamily,'a renamed color stays in the same strip');
- PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);selectedIdx=saveSel;renderPalette();
- document.title='FAMILYTEST '+(ok?'PASS':'FAIL');
- const d=document.createElement('div');d.id='familytest';d.textContent='FAMILYTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
-// Count-control gate (open with #counttest): the per-family count regenerates the
-// family — count up adds symmetric steps, count down drops the extremes, a
+ A(!!renamed&&renamed.closest('.fstrip').dataset.column===redColumn,'a renamed color stays in the same strip');
+ PALETTE=[['#0d0b0a','bg','ground'],['#f0fef0','fg','ground'],['#0d0b0a','bg2'],['#0d0b0a','bg-alt']];setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0');selectedIdx=null;renderPalette();
+ const bg2Chip=[...document.querySelectorAll('#pals .pchip')].find(c=>c.querySelector('.nm')&&c.querySelector('.nm').value==='bg2');
+ A(!!bg2Chip&&bg2Chip.closest('.fstrip').dataset.column==='bg2'&&!!bg2Chip.querySelector('.rm')&&!bg2Chip.querySelector('.lock'),'same-hex bg2 remains a normal removable color column chip');
+ if(bg2Chip){bg2Chip.click();document.getElementById('newhexstr').value='#101820';document.getElementById('newname').value='bg2';updateColor();}
+ A(MAP['bg']==='#0d0b0a','editing same-hex bg2 does not repoint the real bg assignment');
+ A(PALETTE.some(p=>p[1]==='bg2'&&p[0]==='#101820'),'editing same-hex bg2 updates only that palette tile');
+ PALETTE=[['#0d0b0a','bg','ground'],['#f0fef0','fg','ground'],['#c0402a','red','red'],['#3a6ea5','blue','blue'],['#92acc2','blue+1','blue'],['#808080','gray','gray']];
+ setSyntaxFg('kw','#92acc2');lastGone={};selectedIdx=PALETTE.findIndex(p=>p[1]==='blue+1');renderPalette();
+ const del=document.querySelector('#pals .fstrip[data-column="blue"] .cdel');
+ A(!!del,'normal column has a delete button');
+ const beforeDelete=PALETTE.map(p=>p.join('|')).join('||'),oldConfirm=window.confirm;
+ window.confirm=()=>false;
+ if(del)del.click();
+ A(PALETTE.map(p=>p.join('|')).join('||')===beforeDelete,'canceling column delete leaves the palette unchanged');
+ window.confirm=()=>true;
+ if(del)del.click();
+ window.confirm=oldConfirm;
+ A(!PALETTE.some(p=>p[2]==='blue'),'column delete removes every entry with the stable column id');
+ A(PALETTE.some(p=>p[1]==='red')&&PALETTE.some(p=>p[1]==='gray'),'column delete leaves neighboring columns alone');
+ A(PALETTE.some(p=>groundRoleOfEntry(p,{bg:MAP['bg'],fg:MAP['p']})==='bg')&&PALETTE.some(p=>groundRoleOfEntry(p,{bg:MAP['bg'],fg:MAP['p']})==='fg'),'column delete leaves ground entries alone');
+ A(MAP['kw']==='#92acc2','column delete leaves face references on removed hexes');
+ buildTable();
+ const goneTitle=document.querySelector('#legbody tr[data-kind="kw"] .cdd')?.title||'';
+ A(goneTitle==='(gone) #92acc2','gone color hover has one hex value: '+goneTitle);
+ A(lastGone['blue']==='#3a6ea5'&&lastGone['blue+1']==='#92acc2','column delete records every removed name for recovery');
+ A(selectedIdx===null,'column delete clears selected color');
+ PALETTE=[['#0d0b0a','bg','ground'],['#f0fef0','fg','ground'],['#c0402a','red','red'],['#3a6ea5','blue','blue'],['#92acc2','blue+1','blue']];
+ setSyntaxFg('kw','#3a6ea5');selectedIdx=2;clearPalette();
+ A(PALETTE.length===2&&PALETTE.every(p=>groundRoleOfEntry(p,{bg:MAP['bg'],fg:MAP['p']})),'clear palette leaves only bg and fg tiles');
+ A(!PALETTE.some(p=>p[1]==='red'||p[1]==='blue'||p[1]==='blue+1'),'clear palette removes normal color columns and spans');
+ A(MAP['kw']==='#3a6ea5','clear palette leaves existing face references on gone hexes');
+ A(lastGone['blue']==='#3a6ea5'&&lastGone['blue+1']==='#92acc2','clear palette records removed names for recovery');
+ A(selectedIdx===null,'clear palette clears selected color');
+ PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();lastGone=saveG;selectedIdx=saveSel;renderPalette();
+ document.title='COLUMNTEST '+(ok?'PASS':'FAIL');
+ const d=document.createElement('div');d.id='columntest';d.textContent='COLUMNTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
+// Count-control gate (open with #counttest): the per-column count regenerates the
+// column — count up adds symmetric steps, count down drops the extremes, a
// reference to a surviving step follows the new hex, a reference to a removed step
// is left on its old (now-gone) hex.
if(location.hash==='#counttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),saveSel=selectedIdx;
- MAP['bg']='#000000';MAP['p']='#f0fef0';
- PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg']];
- regenFamily('#67809c',2).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)]));
- const innerOld=regenFamily('#67809c',2).members.find(m=>m.offset===1).hex; // survives a count change
- const outerOld=regenFamily('#67809c',2).members.find(m=>m.offset===2).hex; // dropped on count-down
+ setSyntaxFg('bg','#204060');setSyntaxFg('p','#f0fef0');
+ PALETTE=[['#204060','bg'],['#f0fef0','fg']];
+ setGroundSpan(2);
+ A(MAP['bg']==='#204060'&&MAP['p']==='#f0fef0','spanning ground keeps bg/fg assignments on endpoints');
+ A(PALETTE.some(p=>p[1]==='ground+1')&&PALETTE.some(p=>p[1]==='ground+2'),'spanning ground adds interior ground+N entries');
+ A(document.querySelector('#pals .fstrip[data-column="ground"] .fhead + .fcount + .pchip'),'ground span control renders before tiles');
+ setSyntaxFg('bg','#ffffff');setSyntaxFg('p','#000000');
+ PALETTE=[['#ffffff','bg'],['#bbbbbb','ground+1','ground'],['#777777','ground+2','ground'],['#000000','fg']];
+ renderPalette();
+ const groundNames=[...document.querySelectorAll('#pals .fstrip[data-column="ground"] .pchip .nm')].map(e=>e.value);
+ A(groundNames.join('|')==='bg|ground+1|ground+2|fg','ground column order is bg, ground steps, fg even when bg is lighter: '+groundNames.join('|'));
+ setSyntaxFg('bg','#204060');setSyntaxFg('p','#f0fef0');
+ setGroundSpan(1);
+ A(!PALETTE.some(p=>p[1]==='ground+2'),'lowering ground span removes dropped interior steps');
+ PALETTE=[['#204060','bg'],['#f0fef0','fg'],['#e0e0e0','near-white','near-white']];
+ setColumnCount('#e0e0e0',4);
+ A(!PALETTE.some(p=>p[0].toLowerCase()==='#ffffff'&&p[1]!=='fg'),'spanning a near-white base skips generated pure-white tiles');
+ PALETTE=[['#204060','bg'],['#f0fef0','fg'],['#101010','near-black','near-black']];
+ setColumnCount('#101010',4);
+ A(!PALETTE.some(p=>p[0].toLowerCase()==='#000000'&&p[1]!=='bg'),'spanning a near-black base skips generated pure-black tiles');
+ PALETTE=[['#204060','bg'],['#f0fef0','fg']];
+ regenColumn('#67809c',2).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)]));
+ const innerOld=regenColumn('#67809c',2).members.find(m=>m.offset===1).hex; // survives a count change
+ const outerOld=regenColumn('#67809c',2).members.find(m=>m.offset===2).hex; // dropped on count-down
UIMAP['region']={fg:null,bg:innerOld,bold:false,italic:false,underline:false,strike:false};
UIMAP['highlight']={fg:null,bg:outerOld,bold:false,italic:false,underline:false,strike:false};
selectedIdx=null;renderPalette();
- setFamilyCount('#67809c',1);
+ const blueSpanInput=document.querySelector('#pals .fstrip[data-column="blue"] .fcount input');
+ A(blueSpanInput&&blueSpanInput.max==='8','normal column span control allows up to 8 per side');
+ setColumnCount('#67809c',1);
const palHexes=new Set(PALETTE.map(p=>p[0].toLowerCase()));
A(!palHexes.has(outerOld.toLowerCase()),'outer step removed from palette on count down');
A(UIMAP['highlight'].bg.toLowerCase()===outerOld.toLowerCase(),'a removed-step reference stays on its old (gone) hex');
- const newInner=regenFamily('#67809c',1).members.find(m=>m.offset===1).hex;
+ const newInner=regenColumn('#67809c',1).members.find(m=>m.offset===1).hex;
A(UIMAP['region'].bg.toLowerCase()===newInner.toLowerCase(),'a surviving-step reference followed the regenerate, got '+UIMAP['region'].bg);
- setFamilyCount('#67809c',3);
- const want3=regenFamily('#67809c',3).members.map(m=>m.hex.toLowerCase());
+ setColumnCount('#67809c',3);
+ const want3=regenColumn('#67809c',3).members.map(m=>m.hex.toLowerCase());
const have=new Set(PALETTE.map(p=>p[0].toLowerCase()));
- A(want3.every(h=>have.has(h)),'count up to 3 adds all 7 ramp colors to the palette');
- PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette();
+ A(want3.every(h=>have.has(h)),'count up to 3 adds all 7 span colors to the palette');
+ PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette();
document.title='COUNTTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='counttest';d.textContent='COUNTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
-// Base-edit + ground-edit gate (open with #baseedittest): editing a family base
-// recolors the whole family at the same count and references follow; editing a
+// Base-edit + ground-edit gate (open with #baseedittest): editing a column base
+// recolors the whole column at the same count and references follow; editing a
// ground swatch writes the bg/fg assignment.
if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),saveSel=selectedIdx;
- MAP['bg']='#0d0b0a';MAP['p']='#f0fef0';
+ setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0');
PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg']];
- regenFamily('#67809c',2).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)]));
+ regenColumn('#67809c',2).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)]));
UIMAP['region']={fg:null,bg:'#67809c',bold:false,italic:false,underline:false,strike:false};
renderPalette();buildUITable();
selectedIdx=PALETTE.findIndex(p=>p[0].toLowerCase()==='#67809c');
document.getElementById('newhexstr').value='#3a8a8a';document.getElementById('newname').value='teal';
updateColor();
- const fam=familiesFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']}).families.find(f=>!f.neutral);
- A(fam&&fam.members.some(m=>m.hex.toLowerCase()==='#3a8a8a'),'family base recolored to the new hex');
+ const column=columnsFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']}).columns[0];
+ A(column&&column.members.some(m=>m.hex.toLowerCase()==='#3a8a8a'),'column base recolored to the new hex');
A(fam&&fam.members.length===5,'count preserved (±2 → 5 members), got '+(fam&&fam.members.length));
A(!new Set(PALETTE.map(p=>p[0].toLowerCase())).has('#67809c'),'old base removed from palette');
A(UIMAP['region'].bg.toLowerCase()==='#3a8a8a','a reference to the base followed to the new base hex');
@@ -1890,18 +2392,39 @@ if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{i
document.getElementById('newhexstr').value='#101010';document.getElementById('newname').value='ground';
updateColor();
A(MAP['bg'].toLowerCase()==='#101010','editing the bg swatch wrote the bg assignment, got '+MAP['bg']);
- PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette();
+ // fg edit: even when a normal column shares the old fg hex, editing fg must not regenerate that column as fg-*.
+ setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#e0e0e0');
+ PALETTE=[['#0d0b0a','bg','ground'],['#e0e0e0','fg','ground'],['#c0c0c0','silver-1','silver'],['#e0e0e0','silver','silver'],['#f4f4f4','silver+1','silver']];
+ selectedIdx=PALETTE.findIndex(p=>p[1]==='fg');
+ document.getElementById('newhexstr').value='#d8d8d8';document.getElementById('newname').value='fg';
+ updateColor();
+ A(MAP['p'].toLowerCase()==='#d8d8d8','editing the fg swatch wrote the fg assignment, got '+MAP['p']);
+ A(PALETTE.some(p=>p[1]==='silver'&&p[2]==='silver'),'editing fg does not rename a same-hex normal column base');
+ A(!PALETTE.some(p=>/^fg[+-]\d+$/.test(p[1])),'editing fg does not generate fg span tiles from a same-hex normal column');
+ A(PALETTE.find(p=>p[1]==='fg')[2]==='ground','editing fg preserves the ground column id');
+ PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette();
document.title='BASEEDITTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='baseedittest';d.textContent='BASEEDITTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
-// Round-trip gate (open with #roundtriptest): export stays a flat palette and
-// import needs no family reconstruction, so export → import → export is identical.
+// Round-trip gate (open with #roundtriptest): export stays a flat palette with
+// stable column ids, and import does not need color-derived column reconstruction.
if(location.hash==='#roundtriptest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}};
+ const stable=o=>Array.isArray(o)?o.map(stable):(o&&typeof o==='object'?Object.fromEntries(Object.keys(o).sort().map(k=>[k,stable(o[k])])):o);
+ const diff=(a,b,p='')=>{if(JSON.stringify(a)===JSON.stringify(b))return '';if(typeof a!==typeof b||!a||!b||typeof a!=='object')return p+': '+JSON.stringify(a)+' != '+JSON.stringify(b);
+ const ks=[...new Set([...Object.keys(a),...Object.keys(b)])].sort();for(const k of ks){const d=diff(a[k],b[k],p?p+'.'+k:k);if(d)return d;}return p;};
+ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveL=new Set(LOCKED);
+ PALETTE=[['#ffffff','bg','ground'],['#000000','fg','ground'],['#224466','blue','blue'],['#446688','renamed-blue','blue']];
+ setSyntaxFg('bg','#ffffff');setSyntaxFg('p','#000000');
+ LOCKED=new Set(['kw','ui:region','pkg:'+curApp()+':'+APPS[curApp()].faces[0][0]]);
const before=JSON.stringify(exportObj());
applyImported(before);
const after=JSON.stringify(exportObj());
- A(before===after,'export → import → export is byte-identical');
+ const bObj=stable(JSON.parse(before)),aObj=stable(JSON.parse(after));
+ A(JSON.stringify(bObj)===JSON.stringify(aObj),'export → import → export is semantically stable: '+diff(bObj,aObj));
const obj=JSON.parse(after);
- A(Array.isArray(obj.palette)&&obj.palette.every(e=>Array.isArray(e)&&e.length===2),'exported palette is still a flat [hex,name] list');
+ A(Array.isArray(obj.palette)&&obj.palette.every(e=>Array.isArray(e)&&e.length>=3&&typeof e[2]==='string'),'exported palette carries flat [hex,name,columnId] entries');
+ A(obj.palette.some(e=>e[1]==='renamed-blue'&&e[2]==='blue'),'renamed color keeps its stable column id through export/import');
+ A(obj.locks&&obj.locks.includes('kw')&&obj.locks.includes('ui:region'),'lock state survives export/import');
+ PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();LOCKED=saveL;
document.title='ROUNDTRIPTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='roundtriptest';d.textContent='ROUNDTRIPTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
-</script> \ No newline at end of file
+</script>