From 5b0330fdfb7dcc93f9c1e133cbf062a9e2b17cbf Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Tue, 14 Jul 2026 15:25:27 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=AC=20feat:=20Explain=20Steering=20&?= =?UTF-8?q?=20Queuing=20at=20Every=20User-Facing=20Surface=20(#14260)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 💬 feat: Explain Steering & Queuing at Every User-Facing Surface Adds localized info affordances so users understand what steer / queue / interrupt do wherever the feature appears, using the app's existing norms (InfoHoverCard in Settings, TooltipAnchor in the composer, inline descriptions in menus). - Settings → Chat: an InfoHoverCard "?" beside the during-run action toggle explaining steer vs queue (matches every neighboring setting) - During-run send button: the hover action list gains a header and a one-line description under each action (steer / queue / interrupt), turning the menu into a self-explaining card - "Turn on steering / queueing" overflow entry: a description sub-line explaining the mode the user would switch to (the label alone doesn't say what steering/queueing means) - Steered in-thread message: a subtle "Steered" badge with a tooltip clarifying why a user message appears inside the assistant response - New English keys only (others automated) * 🔤 style: Sort SteerPart imports (repo import-order) * 🎐 refactor: Subtle "?" Info Affordances for Steering (Feedback) Reworked the info UI toward the app's "?" InfoHoverCard norm and away from always-on text / a loud badge: - Steered message: replaced the amber "Steered" pill with a subtle "?" InfoHoverCard in the header (the norm; muted, hover-reveals why a user message appears inside the response) - During-run send button: reverted the per-action description lines — the hovercard is already a hover-reveal affordance, so it stays a clean action list (labels + shortcuts) - "Turn on steering/queueing" overflow entry: reverted the description sub-line back to a clean menu item - Settings → Chat "While generating, Enter will…": keeps its "?" InfoHoverCard (the canonical, discoverable explanation) - Pruned the 5 now-unused i18n keys; kept com_nav_info_during_run_action and com_ui_steered_info --- .../components/Chat/Messages/Content/Parts/SteerPart.tsx | 5 ++++- .../Messages/Content/Parts/__tests__/SteerPart.test.tsx | 7 +++++++ .../components/Nav/SettingsTabs/Chat/DuringRunAction.tsx | 3 ++- client/src/locales/en/translation.json | 2 ++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/client/src/components/Chat/Messages/Content/Parts/SteerPart.tsx b/client/src/components/Chat/Messages/Content/Parts/SteerPart.tsx index 92937e792a..299837ef93 100644 --- a/client/src/components/Chat/Messages/Content/Parts/SteerPart.tsx +++ b/client/src/components/Chat/Messages/Content/Parts/SteerPart.tsx @@ -2,6 +2,7 @@ import { memo, useMemo, useState, useCallback } from 'react'; import { X } from 'lucide-react'; import { useAtomValue } from 'jotai'; import { useRecoilValue } from 'recoil'; +import { InfoHoverCard, ESide } from '@librechat/client'; import type { TFile, TMessage } from 'librechat-data-provider'; import type { TMessageIcon } from '~/common'; import FilePreviewDialog from '~/components/Chat/Messages/Content/FilePreviewDialog'; @@ -101,8 +102,10 @@ const SteerPart = memo(function SteerPart({
-

+

{label} + {/* Subtle "?" explaining why a user message appears inside the response. */} + {onCancel != null && (