* feat(typography): establish three-font contract Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: OpenCode:gpt-5.3-codex-spark Assisted-by: Claude Code:claude-opus-4-8 Assisted-by: Codex:gpt-5.3-codex-spark * fix(terminal): refit after live font changes Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: OpenCode:gpt-5.3-codex-spark Assisted-by: Claude Code:claude-opus-4-8 * docs(typography): preserve global serif guardrail Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: Claude Code:claude-opus-4-8 * fix(typography): enforce font tokens in rendered editors Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: Codex:gpt-5.3-codex-spark * fix(terminal): resync after stylesheet font changes Observe live extension stylesheet changes and completed stylesheet loads so open terminals refresh font metrics and backend dimensions. Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: Codex:gpt-5.3-codex-spark Assisted-by: Greptile:undisclosed * test(typography): remove dynamic harness execution Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: Codex:gpt-5.3-codex-spark Assisted-by: nesquena-hermes:undisclosed * test(typography): skip missing Playwright browser Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: Codex:gpt-5.6-luna Assisted-by: nesquena-hermes:undisclosed * fix(terminal): refit after web fonts load Assisted-by: Hermes Agent:gpt-5.6-sol Assisted-by: Codex:gpt-5.6-luna Assisted-by: Greptile:undisclosed --------- Co-authored-by: nesquena-hermes <nesquena+hermes@gmail.com>
73 lines
3.9 KiB
Python
73 lines
3.9 KiB
Python
"""Graphite skin registration and neutral workbench palette."""
|
|
|
|
from pathlib import Path
|
|
|
|
REPO = Path(__file__).parent.parent
|
|
CSS = (REPO / "static" / "style.css").read_text(encoding="utf-8")
|
|
BOOT_JS = (REPO / "static" / "boot.js").read_text(encoding="utf-8")
|
|
CONFIG_PY = (REPO / "api" / "config.py").read_text(encoding="utf-8")
|
|
INDEX_HTML = (REPO / "static" / "index.html").read_text(encoding="utf-8")
|
|
I18N_JS = (REPO / "static" / "i18n.js").read_text(encoding="utf-8")
|
|
|
|
|
|
def test_graphite_skin_is_registered_end_to_end():
|
|
assert "{name:'Graphite'" in BOOT_JS
|
|
assert "graphite:1" in INDEX_HTML
|
|
assert '"graphite"' in CONFIG_PY
|
|
assert "/graphite/" in I18N_JS
|
|
|
|
|
|
def test_graphite_skin_defines_light_and_dark_palettes():
|
|
assert ':root[data-skin="graphite"]{' in CSS
|
|
assert ':root.dark[data-skin="graphite"]{' in CSS
|
|
for token in ("--bg:#FFFFFF", "--sidebar:#F3F3F3", "--accent:#303030", "--gold:#303030"):
|
|
assert token in CSS, f"Graphite light token missing: {token}"
|
|
for token in ("--bg:#151614", "--sidebar:#242624", "--accent:#D7D6CE", "--gold:#D7D6CE"):
|
|
assert token in CSS, f"Graphite dark token missing: {token}"
|
|
|
|
|
|
def test_graphite_skin_uses_neutral_accent_not_green_brand_chrome():
|
|
assert "{name:'Graphite', colors:['#FFFFFF','#D6D6D6','#242424']}" in BOOT_JS
|
|
assert "--accent:#10A37F" not in CSS
|
|
assert "--accent:#0F8F70" not in CSS
|
|
|
|
|
|
def test_graphite_light_skin_avoids_olive_tinted_surfaces():
|
|
for token in ("#F5F5F2", "#E9E9E4", "#ECECE6", "#E7E7DF", "#D6D6CC", "#B8B8AE"):
|
|
assert token not in CSS
|
|
assert token not in BOOT_JS
|
|
|
|
|
|
def test_graphite_skin_tunes_workbench_chrome():
|
|
assert ':root[data-skin="graphite"] .composer-box' in CSS
|
|
assert "box-shadow:0 1px 2px rgba(0,0,0,0.07)" in CSS
|
|
assert ':root[data-skin="graphite"] .workspace-panel-edge-toggle' in CSS
|
|
assert ':root[data-skin="graphite"] .scroll-to-bottom-btn' in CSS
|
|
assert ':root[data-skin="graphite"] .session-item{border-radius:8px;font-size:12.5px;' in CSS
|
|
assert ':root[data-skin="graphite"] .session-meta{font-size:10.5px;' in CSS
|
|
assert ':root[data-skin="graphite"] .session-item.active' in CSS
|
|
assert ':root[data-skin="graphite"] .session-item.active{position:relative;padding:10px 12px 10px 18px;' in CSS
|
|
assert ':root[data-skin="graphite"] .session-item.active.streaming' in CSS
|
|
assert ':root[data-skin="graphite"] .session-item.active.menu-open{padding-right:40px;}' in CSS
|
|
assert ':root[data-skin="graphite"] .session-item.active:hover .session-time:not(.is-hidden)' in CSS
|
|
assert ':root[data-skin="graphite"] .session-item.active .session-lineage-count' in CSS
|
|
assert ':root[data-skin="graphite"] #mainSettings .theme-pick-btn.active' in CSS
|
|
assert ':root[data-skin="graphite"] .msg-row[data-role="user"] .msg-body' in CSS
|
|
|
|
|
|
def test_graphite_skin_keeps_code_block_frame_continuous():
|
|
assert ':root[data-skin="graphite"] .pre-header{background:var(--code-bg);border-color:var(--border-muted);border-bottom:0;}' in CSS
|
|
assert ':root[data-skin="graphite"] .pre-header+pre{border-color:var(--border-muted);border-top:1px solid var(--border-muted);margin-top:0;}' in CSS
|
|
|
|
|
|
def test_graphite_skin_uses_native_ui_and_mono_font_stacks():
|
|
assert '--font-ui:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif' in CSS
|
|
assert '--font-mono:ui-monospace,"SFMono-Regular","SF Mono",Menlo,Consolas,"Liberation Mono",monospace' in CSS
|
|
assert "font-weight:430" in CSS
|
|
assert "-webkit-font-smoothing:antialiased" in CSS
|
|
assert ':root[data-skin="graphite"] textarea#msg' in CSS
|
|
assert ':root[data-skin="graphite"] textarea#msg{font-family:var(--font-ui)!important;font-size:14px;' in CSS
|
|
assert ':root[data-skin="graphite"] .msg-body{font-family:var(--font-conversation);font-size:13px;font-weight:430;' in CSS
|
|
assert ':root[data-skin="graphite"][data-font-size="large"] .msg-body{font-size:15px;' in CSS
|
|
assert ':root[data-skin="graphite"] .tool-card-name' in CSS
|