feat(ui): dark tech theme — emoji-free chrome, subtle animated CSS background, WCAG AA dark palette
This commit is contained in:
@@ -70,6 +70,38 @@ def test_styles_and_js_served(client) -> None:
|
||||
assert client.get("/assets/app.js").status_code == 200
|
||||
|
||||
|
||||
# Emoji code points banned from UI chrome (phase 08): the pictograph
|
||||
# blocks, VS-16/ZWJ, plus the exact glyphs the old light theme used
|
||||
# (🧠 🧑 👋 📂 ⚠).
|
||||
_EMOJI_GLYPHS = "\U0001F9E0\U0001F9D1\U0001F44B\U0001F4C2\u26A0"
|
||||
|
||||
|
||||
def _find_emoji(text: str) -> list[str]:
|
||||
hits: list[str] = []
|
||||
for ch in text:
|
||||
cp = ord(ch)
|
||||
if (
|
||||
0x1F300 <= cp <= 0x1FAFF
|
||||
or 0x2600 <= cp <= 0x27BF
|
||||
or 0x2B00 <= cp <= 0x2BFF
|
||||
or cp in (0xFE0F, 0x200D)
|
||||
or ch in _EMOJI_GLYPHS
|
||||
):
|
||||
hits.append(ch)
|
||||
return hits
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"path", ["/", "/sources.html", "/assets/app.js", "/assets/styles.css"]
|
||||
)
|
||||
def test_ui_chrome_has_no_emoji(client, path: str) -> None:
|
||||
"""Permanent regression guard (phase 08): the UI chrome — both pages,
|
||||
the JS that renders it, and the stylesheet — is emoji-free."""
|
||||
r = client.get(path)
|
||||
assert r.status_code == 200
|
||||
assert _find_emoji(r.text) == [], f"emoji found in {path}: {_find_emoji(r.text)!r}"
|
||||
|
||||
|
||||
def test_chat_requires_message(client) -> None:
|
||||
r = client.post("/api/chat", json={"message": ""})
|
||||
assert r.status_code == 422
|
||||
|
||||
Reference in New Issue
Block a user