✔️ style: Anchor the Applied Steer Receipt and Name Tool Calls in Its Interrupt Copy (#15450)

* ✔️ style: Anchor the Applied Steer Receipt at the Row's Trailing Edge

* 💬 style: Say Tool Calls Are Not Interrupted Either
This commit is contained in:
Danny Avila 2026-09-01 00:53:24 -04:00 • committed by GitHub
parent 1ff4a44b61
commit 09722f4b16
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 21 additions and 4 deletions

View file

@ -155,9 +155,13 @@ const SteerPart = memo(function SteerPart({
</div>
</CollapsibleText>
</div>
<div className="mt-1 flex min-h-8 items-center justify-end text-text-secondary">
{/* The receipt trails the timestamp so the always-visible checks sit
* flush under the bubble's bottom-right corner. Leading them would
* park them wherever the hover-revealed time happens to end, and that
* width changes as the relative string ticks. */}
<div className="mt-1 flex min-h-8 items-center justify-end gap-2 text-text-secondary">
<MessageTimestamp value={timestamp} className="ml-0" />
<SteerReceipt state="applied" live={isSubmitting} animateIn={animateIn} />
<MessageTimestamp value={timestamp} />
</div>
</div>
{otherFiles.length > 0 && (

View file

@ -17,7 +17,7 @@ jest.mock('~/Providers', () => ({
jest.mock('~/components/Chat/Messages/ui/MessageTimestamp', () => ({
__esModule: true,
default: () => null,
default: () => <time data-testid="steer-timestamp" />,
}));
jest.mock('~/components/Chat/Messages/Content/MarkdownLite', () => ({
@ -119,6 +119,19 @@ describe('SteerPart author label', () => {
const receipt = screen.getByTestId('steer-receipt');
expect(receipt.className).not.toContain('opacity-0');
});
it('anchors the receipt after the timestamp, at the trailing edge of the row', () => {
renderPart();
// The timestamp is the hover-revealed half of the row and its width changes
// as the relative string ticks; leading the checks with it would park the
// one always-visible mark at a moving offset from the bubble's corner.
const row = screen.getByTestId('steer-receipt').parentElement;
const children = Array.from(row?.children ?? []);
expect(children.map((child) => child.getAttribute('data-testid'))).toEqual([
'steer-timestamp',
'steer-receipt',
]);
});
});
describe('SteerPart presentation', () => {

View file

@ -2196,7 +2196,7 @@
"com_ui_steer_failed": "Steering failed",
"com_ui_steer_in_flight": "Steering",
"com_ui_steer_in_flight_preempt": "Interrupting",
"com_ui_steer_interrupting_info": "Interrupt requested. The response will stop at the next safe point, then your message takes over. Reasoning is not interrupted. To interrupt reasoning, stop the response instead.",
"com_ui_steer_interrupting_info": "Interrupt requested. The response will stop at the next safe point, then your message takes over. Reasoning and tool calls are not interrupted. To interrupt them, stop the response instead.",
"com_ui_steer_interrupts_default": "Steering interrupts generation",
"com_ui_steer_interrupts_default_info": "When on, Enter stops the response at the next safe point instead of waiting for the agent's next tool step. Either way the partial answer is kept and the response continues.",
"com_ui_steer_interrupts_enable_info": "Switches the during-run default to steering and stops the response at the next safe point. The partial answer is kept and the response continues.",