From 997ddb89ef92c5cd022602f0fba9309fe4c5c019 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Tue, 4 Aug 2026 21:25:25 -0700 Subject: [PATCH 1/2] fix(web): clear main branch lint warnings --- apps/web/src/components/ChatMarkdown.tsx | 4 +++ apps/web/src/components/CommandPalette.tsx | 27 +++++++++---------- .../components/settings/FontFamilyPicker.tsx | 1 - .../settings/SettingsFontPreviews.tsx | 4 +-- .../components/settings/SettingsPanels.tsx | 1 - .../components/sidebar/SidebarUpdatePill.tsx | 4 +-- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/apps/web/src/components/ChatMarkdown.tsx b/apps/web/src/components/ChatMarkdown.tsx index 45d0554bd01..1335e6bb05b 100644 --- a/apps/web/src/components/ChatMarkdown.tsx +++ b/apps/web/src/components/ChatMarkdown.tsx @@ -1363,6 +1363,9 @@ function ChatMarkdown({ }, [createAssetUrl, openPreview, preparedConnection, threadRef], ); + /* eslint-disable react/no-unstable-nested-components -- ReactMarkdown requires component + * renderers that close over this message's metadata. useMemo keeps them stable until that + * metadata changes. */ const markdownComponents = useMemo(() => { const fileLinkChip = ( fileLinkMeta: MarkdownFileLinkMeta, @@ -1593,6 +1596,7 @@ function ChatMarkdown({ text, threadRef, ]); + /* eslint-enable react/no-unstable-nested-components */ return (
+ ); +} + function getLocalFileManagerName(platform: string): string { if (isMacPlatform(platform)) { return "Finder"; @@ -924,13 +935,7 @@ function OpenCommandPaletteDialog(props: { group?.memberProjects.flatMap((member) => [member.title, member.workspaceRoot]) ?? [] ); }, - icon: (project) => ( - - ), + icon: projectFavicon, runProject: openProjectFromSearch, }), [openProjectFromSearch, pickerProjects, projectGroupByTargetKey], @@ -948,13 +953,7 @@ function OpenCommandPaletteDialog(props: { group?.memberProjects.flatMap((member) => [member.title, member.workspaceRoot]) ?? [] ); }, - icon: (project) => ( - - ), + icon: projectFavicon, runProject: async (project) => { const group = projectGroupByTargetKey.get(`${project.environmentId}:${project.id}`); const contextualRefBelongsToGroup = diff --git a/apps/web/src/components/settings/FontFamilyPicker.tsx b/apps/web/src/components/settings/FontFamilyPicker.tsx index aaa5d8c605a..6cc28567cb2 100644 --- a/apps/web/src/components/settings/FontFamilyPicker.tsx +++ b/apps/web/src/components/settings/FontFamilyPicker.tsx @@ -129,7 +129,6 @@ export function FontFamilyPicker({ if (initialOpen) setOpen(true); // The prop is only meaningful at mount - the control just swapped in // under an active focus - so later changes are deliberately ignored. - // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const listRef = useRef(null); const enumeration = useFontEnumeration(); diff --git a/apps/web/src/components/settings/SettingsFontPreviews.tsx b/apps/web/src/components/settings/SettingsFontPreviews.tsx index 7190ec69313..9b719d8a576 100644 --- a/apps/web/src/components/settings/SettingsFontPreviews.tsx +++ b/apps/web/src/components/settings/SettingsFontPreviews.tsx @@ -113,8 +113,8 @@ export function CodeFontPreview() { if (htmlByFile === null) return null; return (
- {htmlByFile.map((html, index) => ( - + {htmlByFile.map((html) => ( + ))}
); diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index c08e4126796..e3e0a22a0c3 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -116,7 +116,6 @@ import { isMonospaceFamily, resolveDefaultFamilyLabel, } from "../../appearanceFonts"; -import { DEFAULT_TERMINAL_FONT_FAMILY } from "~/terminal/ghostty/surface"; import { CodeFontPreview, PromptFontPreview, TerminalFontPreview } from "./SettingsFontPreviews"; import { discoverInstalledFonts, FontFamilyPicker, useFontEnumeration } from "./FontFamilyPicker"; import { diff --git a/apps/web/src/components/sidebar/SidebarUpdatePill.tsx b/apps/web/src/components/sidebar/SidebarUpdatePill.tsx index fb95dc11a4c..c5c35ad4d35 100644 --- a/apps/web/src/components/sidebar/SidebarUpdatePill.tsx +++ b/apps/web/src/components/sidebar/SidebarUpdatePill.tsx @@ -44,8 +44,8 @@ function SidebarUpdateReleaseNotesTooltip({ {index === 0 ? "What's changed" : `Changes in ${releaseNote.version}`}
    - {releaseNote.items.map((item, itemIndex) => ( -
  • + {releaseNote.items.map((item) => ( +
  • {item}
  • ))} From b10ac9dd4b24c6f8ab32ef5761da3e10ff002a87 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Tue, 4 Aug 2026 21:27:55 -0700 Subject: [PATCH 2/2] fix(web): keep release note keys unique --- .../src/components/sidebar/SidebarUpdatePill.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/sidebar/SidebarUpdatePill.tsx b/apps/web/src/components/sidebar/SidebarUpdatePill.tsx index c5c35ad4d35..06a0e714a6e 100644 --- a/apps/web/src/components/sidebar/SidebarUpdatePill.tsx +++ b/apps/web/src/components/sidebar/SidebarUpdatePill.tsx @@ -19,6 +19,15 @@ import { Alert, AlertDescription, AlertTitle } from "../ui/alert"; import { Separator } from "../ui/separator"; import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; +function keyReleaseNoteItems(items: ReadonlyArray) { + const occurrences = new Map(); + return items.map((item) => { + const occurrence = occurrences.get(item) ?? 0; + occurrences.set(item, occurrence + 1); + return { item, key: JSON.stringify([item, occurrence]) }; + }); +} + function SidebarUpdateReleaseNotesTooltip({ state, tooltip, @@ -44,8 +53,8 @@ function SidebarUpdateReleaseNotesTooltip({ {index === 0 ? "What's changed" : `Changes in ${releaseNote.version}`}
      - {releaseNote.items.map((item) => ( -
    • + {keyReleaseNoteItems(releaseNote.items).map(({ item, key }) => ( +
    • {item}
    • ))}