diff --git a/static/style.css b/static/style.css index c1d685c2..7a594b90 100644 --- a/static/style.css +++ b/static/style.css @@ -1847,9 +1847,10 @@ .msg-row:hover .msg-actions{opacity:1;} .msg-action-btn{background:none;border:none;color:var(--muted);cursor:pointer;font-size:13px;padding:2px 5px;border-radius:5px;transition:color .12s,background .12s;line-height:1;} .msg-action-btn:hover{color:var(--accent-text);background:var(--accent-bg);} -.selected-text-reply-btn{position:fixed;z-index:1200;display:inline-flex;align-items:center;gap:6px;padding:7px 11px;border:1px solid var(--accent-bg-strong);border-radius:999px;background:var(--surface);color:var(--accent-text);box-shadow:0 8px 24px rgba(0,0,0,.22);font-size:12px;font-weight:600;line-height:1;cursor:pointer;opacity:0;pointer-events:none;transform:translateY(4px);transition:opacity .12s ease,transform .12s ease,background .12s ease,border-color .12s ease;} +.selected-text-reply-btn{position:fixed;z-index:1200;display:inline-flex;align-items:center;gap:6px;padding:7px 11px;border:2px solid var(--accent);border-radius:999px;background:var(--bg);color:var(--text);box-shadow:0 8px 24px rgba(0,0,0,.26),0 0 0 1px var(--surface);font-size:12px;font-weight:700;line-height:1;cursor:pointer;opacity:0;pointer-events:none;transform:translateY(4px);transition:opacity .12s ease,transform .12s ease,background .12s ease,border-color .12s ease;} .selected-text-reply-btn.visible{opacity:1;pointer-events:auto;transform:translateY(0);} -.selected-text-reply-btn:hover,.selected-text-reply-btn:focus-visible{background:var(--accent-bg);border-color:var(--accent);outline:none;} +.selected-text-reply-btn:hover{background:var(--accent-bg);border-color:var(--accent-hover);} +.selected-text-reply-btn:focus-visible{background:var(--accent-bg);border-color:var(--accent-hover);outline:2px solid var(--focus-ring);outline-offset:2px;} /* TTS speaker button: hidden by default, shown when TTS is enabled. * Use body-class selector instead of JS inline-style so the rule survives * subsequent renderMd() passes and is not subject to inline-style cascade diff --git a/tests/test_issue2481_selected_text_reply.py b/tests/test_issue2481_selected_text_reply.py index 47924cb7..ee7b273b 100644 --- a/tests/test_issue2481_selected_text_reply.py +++ b/tests/test_issue2481_selected_text_reply.py @@ -10,12 +10,17 @@ def read(rel: str) -> str: def _locale_blocks(src: str) -> dict[str, str]: - matches = list(re.finditer(r"\n ([a-z]{2}(?:-[A-Z]{2})?): \{", src)) + matches = list( + re.finditer( + r"\n (?:(['\"])([A-Za-z][A-Za-z0-9-]*)\1|([A-Za-z][A-Za-z0-9-]*)): \{", + src, + ) + ) blocks: dict[str, str] = {} for idx, match in enumerate(matches): start = match.end() end = matches[idx + 1].start() if idx + 1 < len(matches) else src.rfind("\n};") - blocks[match.group(1)] = src[start:end] + blocks[match.group(2) or match.group(3)] = src[start:end] return blocks @@ -67,9 +72,14 @@ def test_selected_text_reply_styles_and_i18n_exist_for_all_locales(): assert "position:fixed" in css assert "pointer-events:none" in css assert "pointer-events:auto" in css + assert "border:2px solid var(--accent)" in css + assert "background:var(--bg)" in css + assert "color:var(--text)" in css + assert "outline:2px solid var(--focus-ring)" in css blocks = _locale_blocks(i18n) assert blocks, "No locale blocks found" + assert "zh-Hant" in blocks, "Locale parser must include quoted script locales" required = { "selected_text_reply", "selected_text_reply_title",