fix(FN-2646): restore quick chat render toggle visibility

- Remove generic btn btn-icon classes from quick chat render toggles so component-specific visibility styles apply
- Increase toggle icon size and adjust default muted color for clearer eye/eye-off affordance in assistant messages
- Add explicit focus-visible ring styling for keyboard accessibility on the render toggle control
- Extend QuickChatFAB regression coverage to assert class usage, SVG icon presence, and plain/rendered toggle state transitions
This commit is contained in:
Fusion
2026-04-27 00:02:35 -07:00
committed by gsxdsm
parent 6e336ffccc
commit 1159a6de22
3 changed files with 16 additions and 5 deletions

View File

@@ -293,11 +293,12 @@
justify-content: center;
opacity: 0;
transition: opacity var(--transition-fast);
color: var(--text-tertiary);
color: var(--text-muted);
background: transparent;
border: none;
border-radius: var(--radius-sm);
cursor: pointer;
outline: none;
}
.quick-chat-panel-message--received:hover .quick-chat-message-render-toggle,
@@ -315,6 +316,11 @@
color: var(--text);
}
.quick-chat-message-render-toggle:focus-visible {
outline: none;
box-shadow: var(--focus-ring-strong);
}
.quick-chat-panel-input {
display: flex;
align-items: center;

View File

@@ -1349,12 +1349,12 @@ export function QuickChatFAB({
{renderAssistantMessageContent(message.content, forcePlain)}
<button
type="button"
className={`btn btn-icon quick-chat-message-render-toggle${forcePlain ? " quick-chat-message-render-toggle--plain" : ""}`}
className={`quick-chat-message-render-toggle${forcePlain ? " quick-chat-message-render-toggle--plain" : ""}`}
data-testid="quick-chat-message-render-toggle"
aria-label={forcePlain ? "Show rendered markdown" : "Show plain text"}
onClick={() => toggleMessageRenderMode(message.id)}
>
{forcePlain ? <EyeOff size={12} /> : <Eye size={12} />}
{forcePlain ? <EyeOff size={14} /> : <Eye size={14} />}
</button>
</>
)}
@@ -1375,12 +1375,12 @@ export function QuickChatFAB({
</div>
<button
type="button"
className={`btn btn-icon quick-chat-message-render-toggle${plainTextMessageIds.has("__streaming__") ? " quick-chat-message-render-toggle--plain" : ""}`}
className={`quick-chat-message-render-toggle${plainTextMessageIds.has("__streaming__") ? " quick-chat-message-render-toggle--plain" : ""}`}
data-testid="quick-chat-message-render-toggle"
aria-label={plainTextMessageIds.has("__streaming__") ? "Show rendered markdown" : "Show plain text"}
onClick={() => toggleMessageRenderMode("__streaming__")}
>
{plainTextMessageIds.has("__streaming__") ? <EyeOff size={12} /> : <Eye size={12} />}
{plainTextMessageIds.has("__streaming__") ? <EyeOff size={14} /> : <Eye size={14} />}
</button>
</>
) : (

View File

@@ -248,16 +248,21 @@ describe("QuickChatFAB", () => {
const toggles = screen.getAllByTestId("quick-chat-message-render-toggle");
expect(toggles).toHaveLength(2);
expect(toggles[0]).not.toHaveClass("btn");
expect(toggles[0]).not.toHaveClass("btn-icon");
expect(toggles[0].querySelector("svg")).toBeInTheDocument();
expect(within(firstAssistantBubble).getByText("Bold", { selector: "strong" })).toBeInTheDocument();
expect(within(secondAssistantBubble).getByText("Bold", { selector: "strong" })).toBeInTheDocument();
fireEvent.click(toggles[0]);
expect(toggles[0]).toHaveClass("quick-chat-message-render-toggle--plain");
expect(within(firstAssistantBubble).getByText(/\*\*Bold\*\* one/)).toBeInTheDocument();
expect(within(firstAssistantBubble).queryByText("Bold", { selector: "strong" })).toBeNull();
expect(within(secondAssistantBubble).getByText("Bold", { selector: "strong" })).toBeInTheDocument();
fireEvent.click(toggles[0]);
expect(toggles[0]).not.toHaveClass("quick-chat-message-render-toggle--plain");
expect(within(firstAssistantBubble).getByText("Bold", { selector: "strong" })).toBeInTheDocument();
expect(within(userBubble).getByText(/\*\*User\*\* plain/)).toBeInTheDocument();
});