{
- const name = event.currentTarget;
- name.title = name.scrollWidth > name.clientWidth ? getDisplayModelName(model) : "";
- }}
+ onPointerEnter={titleWhenTruncated(getDisplayModelName(model))}
>
{getDisplayModelName(model)}
{/* The logo is decorative, so name the provider for screen readers. */}
@@ -81,7 +77,10 @@ export const ModelListRow = memo(function ModelListRow(props: {
{props.isSelected ?
: null}
{props.subProvider ? (
-
+
{props.subProvider}
) : null}
diff --git a/apps/web/src/components/chat/ProviderModelPicker.tsx b/apps/web/src/components/chat/ProviderModelPicker.tsx
index 2e47b4c2fe3b4..25dbcaeac16a0 100644
--- a/apps/web/src/components/chat/ProviderModelPicker.tsx
+++ b/apps/web/src/components/chat/ProviderModelPicker.tsx
@@ -9,7 +9,7 @@ import { createContext, memo, type ReactNode, useRef, useState } from "react";
import { Badge } from "../ui/badge";
import { Popover, PopoverPopup, PopoverTrigger } from "../ui/popover";
import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip";
-import { cn } from "~/lib/utils";
+import { cn, titleWhenTruncated } from "~/lib/utils";
import { ModelPickerContent, resolveModelPickerSelectedModel } from "./ModelPickerContent";
import { ChatGptSharingControl } from "./ChatGptSharingControl";
import { ProviderInstanceIcon } from "./ProviderInstanceIcon";
@@ -388,7 +388,17 @@ export const ProviderModelPicker = memo(function ProviderModelPicker(props: {
) : null}
{props.isComposerOwned ? (
-
{triggerText}
+ // The composer trigger has no hover tooltip; a cut-off name still shows in full.
+
+ {triggerText}
+
) : (
}>{triggerText}
diff --git a/apps/web/src/lib/utils.ts b/apps/web/src/lib/utils.ts
index 747af2d52dd35..220f2b0be8d99 100644
--- a/apps/web/src/lib/utils.ts
+++ b/apps/web/src/lib/utils.ts
@@ -20,6 +20,14 @@ export function cn(...inputs: CxOptions) {
export { isMacPlatform };
+/** `onPointerEnter` for a truncating element: shows `text` as its title only when it is cut off. */
+export function titleWhenTruncated(text: string) {
+ return (event: { currentTarget: HTMLElement }) => {
+ const element = event.currentTarget;
+ element.title = element.scrollWidth > element.clientWidth ? text : "";
+ };
+}
+
export function isWindowsPlatform(platform: string): boolean {
return /^win(dows)?/i.test(platform);
}