From 7f2005b1d50e2a1324e1d2e8f9060e90d3390599 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Wed, 10 Dec 2025 13:21:48 -0800 Subject: [PATCH 1/2] refactor(desktop): replace lucide-react with react-icons/lu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrate all lucide-react icon imports to use react-icons/lu equivalents to consolidate on a single icon library (react-icons). This reduces bundle size by removing the lucide-react dependency. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- apps/desktop/package.json | 1 - .../main/components/StartView/ActionCard.tsx | 4 ++-- .../main/components/StartView/index.tsx | 10 ++++----- .../WorkspaceHoverCard/WorkspaceHoverCard.tsx | 8 +++---- .../components/ChecksList/ChecksList.tsx | 6 +++--- .../components/CheckItemRow/CheckItemRow.tsx | 12 +++++------ .../ChecksSummary/ChecksSummary.tsx | 8 +++---- .../TabsContent/TabContentContextMenu.tsx | 21 ++++++++++++------- 8 files changed, 38 insertions(+), 32 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 84d403d0fd0..654612486d6 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -64,7 +64,6 @@ "line-column-path": "^3.0.0", "lodash": "^4.17.21", "lowdb": "^7.0.1", - "lucide-react": "^0.555.0", "nanoid": "^5.1.6", "node-pty": "1.1.0-beta30", "react": "^19.1.1", diff --git a/apps/desktop/src/renderer/screens/main/components/StartView/ActionCard.tsx b/apps/desktop/src/renderer/screens/main/components/StartView/ActionCard.tsx index 0510eb65dc5..5eac448c346 100644 --- a/apps/desktop/src/renderer/screens/main/components/StartView/ActionCard.tsx +++ b/apps/desktop/src/renderer/screens/main/components/StartView/ActionCard.tsx @@ -1,7 +1,7 @@ -import type { LucideIcon } from "lucide-react"; +import type { IconType } from "react-icons"; interface ActionCardProps { - icon: LucideIcon; + icon: IconType; label: string; onClick?: () => void; disabled?: boolean; diff --git a/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx b/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx index 7a5fb446413..9ac5ca82d96 100644 --- a/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx +++ b/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx @@ -1,5 +1,5 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; -import { ChevronUp, FolderGit, FolderOpen, X } from "lucide-react"; +import { LuChevronUp, LuFolderGit, LuFolderOpen, LuX } from "react-icons/lu"; import { useState } from "react"; import { HiExclamationTriangle } from "react-icons/hi2"; import { trpc } from "renderer/lib/trpc"; @@ -152,7 +152,7 @@ export function StartView() { className="flex-shrink-0 p-0.5 rounded hover:bg-accent/50 transition-colors" aria-label="Dismiss error" > - + @@ -163,14 +163,14 @@ export function StartView() { {/* Action Cards */}
{ setError(null); @@ -200,7 +200,7 @@ export function StartView() { {showAllProjects ? ( <> Show less - + ) : ( <>View all ({recentProjects.length}) diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx index f725aa2f8f4..a983fd984cd 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx @@ -1,6 +1,6 @@ import { Button } from "@superset/ui/button"; import { formatDistanceToNow } from "date-fns"; -import { ExternalLink, LoaderCircle, TriangleAlert } from "lucide-react"; +import { LuExternalLink, LuLoaderCircle, LuTriangleAlert } from "react-icons/lu"; import { FaGithub } from "react-icons/fa"; import { trpc } from "renderer/lib/trpc"; import { ChecksList } from "./components/ChecksList"; @@ -55,7 +55,7 @@ export function WorkspaceHoverCardContent({ className={`flex items-center gap-1 font-mono break-all hover:underline ${hasCustomAlias ? "text-xs" : "text-sm"}`} > {worktreeName} - + ) : ( - + Behind main, needs rebase
)} @@ -84,7 +84,7 @@ export function WorkspaceHoverCardContent({ {/* PR Section */} {isLoadingGithub ? (
- + Loading PR...
) : pr ? ( diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx index fcf726cb48d..0d6d7dc55ef 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx @@ -1,4 +1,4 @@ -import { ChevronDown, ChevronRight } from "lucide-react"; +import { LuChevronDown, LuChevronRight } from "react-icons/lu"; import type { CheckItem } from "main/lib/db/schemas"; import { useState } from "react"; import { CheckItemRow } from "./components/CheckItemRow"; @@ -25,9 +25,9 @@ export function ChecksList({ checks }: ChecksListProps) { className="flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors" > {expanded ? ( - + ) : ( - + )} {expanded ? "Hide checks" : "Show checks"} diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx index 6962dae4a2d..bb8675c43e8 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx @@ -1,4 +1,4 @@ -import { Check, LoaderCircle, Minus, X } from "lucide-react"; +import { LuCheck, LuLoaderCircle, LuMinus, LuX } from "react-icons/lu"; import type { CheckItem } from "main/lib/db/schemas"; interface CheckItemRowProps { @@ -7,11 +7,11 @@ interface CheckItemRowProps { export function CheckItemRow({ check }: CheckItemRowProps) { const statusConfig = { - success: { icon: Check, className: "text-emerald-500" }, - failure: { icon: X, className: "text-destructive-foreground" }, - pending: { icon: LoaderCircle, className: "text-amber-500" }, - skipped: { icon: Minus, className: "text-muted-foreground" }, - cancelled: { icon: Minus, className: "text-muted-foreground" }, + success: { icon: LuCheck, className: "text-emerald-500" }, + failure: { icon: LuX, className: "text-destructive-foreground" }, + pending: { icon: LuLoaderCircle, className: "text-amber-500" }, + skipped: { icon: LuMinus, className: "text-muted-foreground" }, + cancelled: { icon: LuMinus, className: "text-muted-foreground" }, }; const { icon: Icon, className } = statusConfig[check.status]; diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx index aa1b0447300..cb37085eae4 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx @@ -1,4 +1,4 @@ -import { Check, LoaderCircle, X } from "lucide-react"; +import { LuCheck, LuLoaderCircle, LuX } from "react-icons/lu"; import type { CheckItem } from "main/lib/db/schemas"; interface ChecksSummaryProps { @@ -16,15 +16,15 @@ export function ChecksSummary({ checks, status }: ChecksSummaryProps) { const config = { success: { - icon: Check, + icon: LuCheck, className: "text-emerald-500", }, failure: { - icon: X, + icon: LuX, className: "text-destructive-foreground", }, pending: { - icon: LoaderCircle, + icon: LuLoaderCircle, className: "text-amber-500", }, }; diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx index 92b8a4956fb..68136df2e04 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx @@ -9,7 +9,14 @@ import { ContextMenuSubTrigger, ContextMenuTrigger, } from "@superset/ui/context-menu"; -import { Columns2, Eraser, MoveRight, Plus, Rows2, X } from "lucide-react"; +import { + LuColumns2, + LuEraser, + LuMoveRight, + LuPlus, + LuRows2, + LuX, +} from "react-icons/lu"; import type { ReactNode } from "react"; import type { Tab } from "renderer/stores/tabs/types"; @@ -44,22 +51,22 @@ export function TabContentContextMenu({ {children} - + Split Horizontally - + Split Vertically - + Clear Terminal ⌘K - + Move to Tab @@ -73,14 +80,14 @@ export function TabContentContextMenu({ ))} {targetTabs.length > 0 && } - + New Tab - + Close Terminal From a6c7158e1ae5ad5139e5f78b4da04a7b387afec2 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Wed, 10 Dec 2025 13:27:25 -0800 Subject: [PATCH 2/2] lint --- .../renderer/screens/main/components/StartView/index.tsx | 2 +- .../WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx | 6 +++++- .../WorkspaceHoverCard/components/ChecksList/ChecksList.tsx | 2 +- .../ChecksList/components/CheckItemRow/CheckItemRow.tsx | 2 +- .../components/ChecksSummary/ChecksSummary.tsx | 2 +- .../ContentView/TabsContent/TabContentContextMenu.tsx | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx b/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx index 9ac5ca82d96..1b7800789bc 100644 --- a/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx +++ b/apps/desktop/src/renderer/screens/main/components/StartView/index.tsx @@ -1,7 +1,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; -import { LuChevronUp, LuFolderGit, LuFolderOpen, LuX } from "react-icons/lu"; import { useState } from "react"; import { HiExclamationTriangle } from "react-icons/hi2"; +import { LuChevronUp, LuFolderGit, LuFolderOpen, LuX } from "react-icons/lu"; import { trpc } from "renderer/lib/trpc"; import { useOpenNew } from "renderer/react-query/projects"; import { useCreateWorkspace } from "renderer/react-query/workspaces"; diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx index a983fd984cd..9d6874045f6 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/WorkspaceHoverCard.tsx @@ -1,7 +1,11 @@ import { Button } from "@superset/ui/button"; import { formatDistanceToNow } from "date-fns"; -import { LuExternalLink, LuLoaderCircle, LuTriangleAlert } from "react-icons/lu"; import { FaGithub } from "react-icons/fa"; +import { + LuExternalLink, + LuLoaderCircle, + LuTriangleAlert, +} from "react-icons/lu"; import { trpc } from "renderer/lib/trpc"; import { ChecksList } from "./components/ChecksList"; import { ChecksSummary } from "./components/ChecksSummary"; diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx index 0d6d7dc55ef..16e5f2c2d8d 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/ChecksList.tsx @@ -1,6 +1,6 @@ -import { LuChevronDown, LuChevronRight } from "react-icons/lu"; import type { CheckItem } from "main/lib/db/schemas"; import { useState } from "react"; +import { LuChevronDown, LuChevronRight } from "react-icons/lu"; import { CheckItemRow } from "./components/CheckItemRow"; interface ChecksListProps { diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx index bb8675c43e8..401db80f455 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksList/components/CheckItemRow/CheckItemRow.tsx @@ -1,5 +1,5 @@ -import { LuCheck, LuLoaderCircle, LuMinus, LuX } from "react-icons/lu"; import type { CheckItem } from "main/lib/db/schemas"; +import { LuCheck, LuLoaderCircle, LuMinus, LuX } from "react-icons/lu"; interface CheckItemRowProps { check: CheckItem; diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx index cb37085eae4..14238bb0d73 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WorkspaceTabs/WorkspaceHoverCard/components/ChecksSummary/ChecksSummary.tsx @@ -1,5 +1,5 @@ -import { LuCheck, LuLoaderCircle, LuX } from "react-icons/lu"; import type { CheckItem } from "main/lib/db/schemas"; +import { LuCheck, LuLoaderCircle, LuX } from "react-icons/lu"; interface ChecksSummaryProps { checks: CheckItem[]; diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx index 68136df2e04..72af551ee4f 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabContentContextMenu.tsx @@ -9,6 +9,7 @@ import { ContextMenuSubTrigger, ContextMenuTrigger, } from "@superset/ui/context-menu"; +import type { ReactNode } from "react"; import { LuColumns2, LuEraser, @@ -17,7 +18,6 @@ import { LuRows2, LuX, } from "react-icons/lu"; -import type { ReactNode } from "react"; import type { Tab } from "renderer/stores/tabs/types"; interface TabContentContextMenuProps {