From 27f4742882bf57080d4e5a50eab8f71daaab8c28 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Thu, 20 Aug 2026 06:33:19 -0700 Subject: [PATCH 1/2] Replace lucide-react with Phosphor (bold) across web + UI packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner ruling: Phosphor (@phosphor-icons/react) is now the one icon library, bold is the only weight, and the Sparkle/Sparkles glyph is banned outright — every former sparkle spot now carries a glyph that means something specific to what it marks (Lightning for Skills, Cpu for the model-routing header). - New @corbits/icons package: the curated Phosphor re-export every app/package imports glyphs through, plus BoldIconProvider (an IconContext wrapper mounted once at apps/web's root) so weight stays bold everywhere without repeating the prop at each call site. Extraction-ready for corbitsdev/react-ui per its own header comment. - Every lucide-react import across apps/web and packages/{api-query, artifact-ui,bench-ui,chat-ui,plugins-ui,settings-ui,tasks-ui} now routes through @corbits/icons; lucide-react dropped from every package.json and the lockfile. - eslint.config.ts: no-restricted-imports bans lucide-react and @phosphor-icons/react outside packages/icons/src; no-restricted-syntax bans importing Sparkle/Sparkles from anywhere. Glyph mapping (lucide -> Phosphor, bold): ArrowDown -> ArrowDown, ArrowDownUp -> ArrowsDownUp, ArrowLeft -> ArrowLeft, ArrowUp -> ArrowUp, Bell -> Bell, Blocks -> SquaresFour, Bot -> Robot, Cable -> Plugs, ChartColumn -> ChartBar, ChevronDown -> CaretDown, ChevronLeft -> CaretLeft, ChevronRight -> CaretRight, CircleAlert -> WarningCircle, Clock -> Clock, Compass -> Compass, Copy -> Copy, Cpu -> Cpu, ExternalLink -> ArrowSquareOut, FileQuestion -> FileDashed, FileStack -> Stack, FileText -> FileText, GitBranch -> GitBranch, GitPullRequest -> GitPullRequest, Hash -> Hash, KeyRound -> Key, Library -> FolderOpen (Files nav), Link -> LinkSimple, List -> ListBullets, Loader2 -> CircleNotch, Lock -> Lock, LogOut -> SignOut, LucideIcon (type) -> Icon, Maximize2 -> ArrowsOut, MessageSquare -> ChatCircle, MessageSquarePlus -> ChatCircleDots, Mic -> Microphone, Minimize2 -> ArrowsIn, MoreHorizontal -> DotsThree, Paperclip -> Paperclip, Pencil -> PencilSimple, Pin -> PushPin, PinOff -> PushPinSlash, PlayCircle -> PlayCircle, Plug -> PuzzlePiece (Plugins nav + MCP servers), Plus -> Plus, Repeat -> Repeat, Reply -> ArrowBendUpLeft, RotateCw -> ArrowClockwise, Search -> MagnifyingGlass, Send -> PaperPlaneRight, Shield -> Shield, SlidersHorizontal -> SlidersHorizontal, SmilePlus -> Smiley, Sparkles (Skills nav/empty states/skill icon) -> Lightning, Sparkles (default-model routing header) -> Cpu, Star -> Star, SunMoon -> MoonStars, TriangleAlert -> Warning, User -> User, UserPlus -> UserPlus, UserRound -> UserCircle, Users -> Users, Workflow -> FlowArrow, X -> X Verified: tsc + bun test clean on every touched package (api-query, artifact-ui, bench-ui, chat-ui, icons, plugins-ui, settings-ui, tasks-ui, apps/web — 578 web tests, 940+ across packages), check:ui-vocabulary, check:react-ui-drift, and apps/web's production build all pass. Confirmed the new eslint rules reject a lucide-react import, a direct @phosphor-icons/react import, and a Sparkle import. --- apps/web/package.json | 10 +- apps/web/src/app.tsx | 103 +++++----- apps/web/src/pages/agents-page.tsx | 8 +- apps/web/src/pages/home-page.tsx | 8 +- apps/web/src/pages/insights-page.tsx | 10 +- apps/web/src/pages/library-page.tsx | 16 +- apps/web/src/pages/new-workbench-picker.tsx | 4 +- apps/web/src/pages/not-found-page.tsx | 2 +- apps/web/src/pages/onboarding-page.tsx | 6 +- apps/web/src/pages/plugins-page.tsx | 11 +- .../web/src/pages/provisioning-error-page.tsx | 4 +- apps/web/src/pages/routines-page.tsx | 6 +- apps/web/src/pages/skills-page.tsx | 6 +- apps/web/src/pages/workbench-timeline.tsx | 2 +- apps/web/src/routes.tsx | 42 ++--- apps/web/src/shell/canvas-column.tsx | 20 +- apps/web/src/shell/context-menu/items.tsx | 36 ++-- apps/web/src/shell/provider-health-banner.tsx | 7 +- apps/web/src/shell/routine-panel.tsx | 2 +- apps/web/src/shell/sidebar.tsx | 38 ++-- apps/web/src/shell/workbench-list.tsx | 8 +- apps/web/vite.config.ts | 2 +- bun.lock | 33 +++- eslint.config.ts | 46 +++++ packages/api-query/package.json | 2 +- packages/api-query/src/query-view.tsx | 4 +- packages/artifact-ui/package.json | 2 +- .../artifact-ui/src/artifact-renderer.tsx | 4 +- packages/bench-ui/package.json | 2 +- packages/bench-ui/src/bench-switcher.tsx | 4 +- packages/bench-ui/src/members-panel.tsx | 2 +- packages/chat-ui/package.json | 2 +- packages/chat-ui/src/artifact-chip.tsx | 4 +- packages/chat-ui/src/blocks/block-card.tsx | 4 +- packages/chat-ui/src/chat-workspace.tsx | 24 +-- packages/chat-ui/src/composer.tsx | 8 +- packages/chat-ui/src/invite-agent-dialog.tsx | 4 +- packages/chat-ui/src/pinned-strip.tsx | 4 +- packages/chat-ui/src/timeline.tsx | 36 ++-- .../src/workbench-settings/agents-section.tsx | 8 +- .../workbench-settings/members-section.tsx | 2 +- packages/icons/LICENSE | 176 ++++++++++++++++++ packages/icons/README.md | 24 +++ packages/icons/package.json | 25 +++ packages/icons/src/index.test.tsx | 15 ++ packages/icons/src/index.tsx | 94 ++++++++++ packages/icons/tsconfig.json | 9 + packages/plugins-ui/package.json | 2 +- .../plugins-ui/src/mcp-servers-section.tsx | 4 +- packages/plugins-ui/src/plugin-card.tsx | 2 +- packages/plugins-ui/src/plugin-logo.tsx | 4 +- packages/plugins-ui/src/plugin-meta.ts | 22 +-- packages/plugins-ui/src/plugins-gallery.tsx | 6 +- packages/plugins-ui/src/skill-card.tsx | 4 +- packages/settings-ui/package.json | 2 +- packages/settings-ui/src/access-policy.tsx | 2 +- packages/settings-ui/src/account-section.tsx | 4 +- .../settings-ui/src/connections-section.tsx | 8 +- .../settings-ui/src/credentials-section.tsx | 4 +- packages/settings-ui/src/section-registry.tsx | 14 +- packages/settings-ui/src/shell.tsx | 4 +- .../settings-ui/src/webhook-secret-panel.tsx | 2 +- .../test/section-registry.test.tsx | 6 +- packages/settings-ui/test/shell.test.tsx | 2 +- packages/tasks-ui/package.json | 2 +- .../tasks-ui/src/agent-selection-strategy.tsx | 2 +- 66 files changed, 701 insertions(+), 284 deletions(-) create mode 100644 packages/icons/LICENSE create mode 100644 packages/icons/README.md create mode 100644 packages/icons/package.json create mode 100644 packages/icons/src/index.test.tsx create mode 100644 packages/icons/src/index.tsx create mode 100644 packages/icons/tsconfig.json diff --git a/apps/web/package.json b/apps/web/package.json index 20cd99b1c..6f7c99913 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -31,20 +31,20 @@ "@corbits/plugins-ui": "workspace:*", "@corbits/preferences": "workspace:*", "@corbits/presence": "workspace:*", + "@corbits/react-ui": "github:corbitsdev/react-ui#82f454605630fc2c73c9fc7488d29a5cdf852e9d", "@corbits/routines": "workspace:*", - "@corbits/workflow-catalog": "workspace:*", "@corbits/settings-ui": "workspace:*", "@corbits/shell-layout": "workspace:*", "@corbits/tasks-ui": "workspace:*", - "@corbits/react-ui": "github:corbitsdev/react-ui#82f454605630fc2c73c9fc7488d29a5cdf852e9d", + "@corbits/workflow-catalog": "workspace:*", + "@corbits/icons": "workspace:*", "@intx/types": "workspace:*", - "@workbench/connections": "workspace:*", - "@workbench/hub-client": "workspace:*", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-slot": "^1.2.3", "@tanstack/react-query": "catalog:", + "@workbench/connections": "workspace:*", + "@workbench/hub-client": "workspace:*", "arktype": "catalog:", - "lucide-react": "^1.27.0", "react": "^19.2.0", "react-dom": "^19.2.0", "yjs": "^13.6.32" diff --git a/apps/web/src/app.tsx b/apps/web/src/app.tsx index aa0521f58..87a7651d8 100644 --- a/apps/web/src/app.tsx +++ b/apps/web/src/app.tsx @@ -5,8 +5,9 @@ import { BootScreen, Button, CorbitsMark, EmptyState } from "@corbits/react-ui"; import { QueryClientProvider } from "@tanstack/react-query"; -import { CircleAlert } from "lucide-react"; +import { BoldIconProvider, WarningCircle } from "@corbits/icons"; import { useEffect, useMemo } from "react"; +import { Toaster } from "sonner"; import { AuthScreen } from "./auth-screen"; import { BenchProvider } from "./bench-context"; @@ -160,56 +161,60 @@ export function App({ readonly provisioningErrorRefId?: string | undefined; readonly onRetryProvisioning?: () => void; }) { - if (session.kind === "signed-in" && provisioningError) { - return ( - - ); - } - switch (session.kind) { - case "loading": - return ( -
- } /> -
- ); - case "signed-out": - if (path !== LOGIN_PATH) { - return ; - } - return ; - case "error": - return ( -
- } - title="Connection lost" - description={session.message} - action={ - - } - /> -
- ); - case "signed-in": - if (path === LOGIN_PATH) { - return ; - } - if (path === ONBOARDING_PATH) { - return ; - } + return {renderApp()}; + + function renderApp() { + if (session.kind === "signed-in" && provisioningError) { return ( - ); + } + switch (session.kind) { + case "loading": + return ( +
+ } /> +
+ ); + case "signed-out": + if (path !== LOGIN_PATH) { + return ; + } + return ; + case "error": + return ( +
+ } + title="Connection lost" + description={session.message} + action={ + + } + /> +
+ ); + case "signed-in": + if (path === LOGIN_PATH) { + return ; + } + if (path === ONBOARDING_PATH) { + return ; + } + return ( + + ); + } } } diff --git a/apps/web/src/pages/agents-page.tsx b/apps/web/src/pages/agents-page.tsx index f1ed64675..35e562984 100644 --- a/apps/web/src/pages/agents-page.tsx +++ b/apps/web/src/pages/agents-page.tsx @@ -22,7 +22,7 @@ import { TableRow, } from "@corbits/react-ui"; import type { BadgeTone } from "@corbits/react-ui"; -import { Bot } from "lucide-react"; +import { Robot } from "@corbits/icons"; import { useEffect, useState } from "react"; import { useQueryClient } from "@tanstack/react-query"; @@ -186,7 +186,7 @@ export function AgentsPage({ onClick={() => onCreateOpenChange(true)} aria-label="Create an agent" > - Create + Create ) : null } @@ -196,7 +196,7 @@ export function AgentsPage({ {definitions.length === 0 ? ( } + icon={} title="No agents yet" description="Create an agent — a name, a system prompt, and optionally a model — and it appears here and in the sidebar, ready to start a workbench." /> @@ -291,7 +291,7 @@ export function AgentsRoute({ } + icon={} title="Select a workbench" description="Pick a workbench from the switcher to see the agents it can start." /> diff --git a/apps/web/src/pages/home-page.tsx b/apps/web/src/pages/home-page.tsx index 0aa7ec9db..258e16aea 100644 --- a/apps/web/src/pages/home-page.tsx +++ b/apps/web/src/pages/home-page.tsx @@ -9,7 +9,7 @@ // `/w/:workbenchId`. Deep links to other pages are unchanged. import { BootScreen, Button, EmptyState, PageShell } from "@corbits/react-ui"; -import { CircleAlert } from "lucide-react"; +import { WarningCircle } from "@corbits/icons"; import { useEffect, useState } from "react"; import { listAllWorkbenches } from "@corbits/chat-ui"; @@ -79,7 +79,7 @@ export function HomeRoute() { return ( } + icon={} title="Couldn't load your workbenches" description={memberships.message} action={ @@ -96,7 +96,7 @@ export function HomeRoute() { return ( } + icon={} title="No workbench selected" description="Pick a workbench from the switcher, then Myra will open here." /> @@ -108,7 +108,7 @@ export function HomeRoute() { return ( } + icon={} title="Couldn't open Myra" description={state.message} action={ diff --git a/apps/web/src/pages/insights-page.tsx b/apps/web/src/pages/insights-page.tsx index 7ae416d6a..34e640525 100644 --- a/apps/web/src/pages/insights-page.tsx +++ b/apps/web/src/pages/insights-page.tsx @@ -24,7 +24,7 @@ import { TraceWaterfall, type TraceSpan, } from "@corbits/react-ui"; -import { ChartColumn } from "lucide-react"; +import { ChartBar } from "@corbits/icons"; import type * as React from "react"; import { useEffect, useMemo, useState } from "react"; @@ -827,7 +827,7 @@ export function InsightsRunsHistory({ ) : groups.length === 0 ? ( } + icon={} title="No purpose runs yet" description="When a routine or purpose workflow fires, it shows up here." /> @@ -1333,7 +1333,7 @@ export function InsightsPage({ } + icon={} title="Couldn't load insights" description={usageError} /> @@ -1485,7 +1485,7 @@ function InsightsWorkbenchPage({ } + icon={} title="Workbench not found" description="This conversation may have been deleted, or you may not have access to it." /> @@ -1499,7 +1499,7 @@ function InsightsWorkbenchPage({ } + icon={} title="No insights for this conversation yet" description="This conversation predates per-workbench insights." /> diff --git a/apps/web/src/pages/library-page.tsx b/apps/web/src/pages/library-page.tsx index 6c7d03a30..e5ca67a3b 100644 --- a/apps/web/src/pages/library-page.tsx +++ b/apps/web/src/pages/library-page.tsx @@ -33,7 +33,7 @@ import { } from "@corbits/artifact-ui"; import type { ArtifactSort, ArtifactSummary } from "@corbits/artifact-ui"; import { useQueryClient } from "@tanstack/react-query"; -import { ArrowDownUp, ExternalLink, FileStack, X } from "lucide-react"; +import { ArrowsDownUp, ArrowSquareOut, Stack, X } from "@corbits/icons"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { describeApiError, @@ -183,7 +183,7 @@ function PreviewPane({ {previewSrc !== undefined ? ( @@ -357,7 +357,7 @@ export function LibraryPage({ aria-label={SORT_LABEL[sort]} title={SORT_LABEL[sort]} > - + @@ -380,13 +380,13 @@ export function LibraryPage({ {artifacts.length === 0 ? ( } + icon={} title="No artifacts yet" description="Upload a file or wait for agents and workflows to produce artifacts — they land here as soon as they exist." /> ) : visible.length === 0 ? ( } + icon={} title="Nothing matches" description={`No artifact matches "${activeQuery}".`} /> @@ -485,7 +485,7 @@ export function LibraryRoute({ path }: { readonly path: string }) { } + icon={} title="Select a workbench" description="Pick a workbench from the switcher to browse the artifacts it owns." /> @@ -500,7 +500,7 @@ export function LibraryRoute({ path }: { readonly path: string }) { } + icon={} title="Files not configured" description="Files isn't set up yet. Ask your workbench admin to finish setup." /> @@ -520,7 +520,7 @@ export function LibraryRoute({ path }: { readonly path: string }) { ) : ( } + icon={} title="Couldn't load artifacts" description={describeApiError( { status: page.status }, diff --git a/apps/web/src/pages/new-workbench-picker.tsx b/apps/web/src/pages/new-workbench-picker.tsx index a270c5e81..6f2d94926 100644 --- a/apps/web/src/pages/new-workbench-picker.tsx +++ b/apps/web/src/pages/new-workbench-picker.tsx @@ -9,7 +9,7 @@ // next slice). import { Button, toast } from "@corbits/react-ui"; -import { GitPullRequest, MessageSquare, Plus } from "lucide-react"; +import { ChatCircle, GitPullRequest, Plus } from "@corbits/icons"; import { useState } from "react"; import { useBench } from "../bench-context"; @@ -24,7 +24,7 @@ import { const ROW_ICON: Record = { "code-review": GitPullRequest, - blank: MessageSquare, + blank: ChatCircle, }; function ctaLabel(selected: boolean): string { diff --git a/apps/web/src/pages/not-found-page.tsx b/apps/web/src/pages/not-found-page.tsx index 1559d1354..ba6caafdb 100644 --- a/apps/web/src/pages/not-found-page.tsx +++ b/apps/web/src/pages/not-found-page.tsx @@ -1,5 +1,5 @@ import { Button, EmptyState, PageShell } from "@corbits/react-ui"; -import { Compass } from "lucide-react"; +import { Compass } from "@corbits/icons"; import { Link } from "../navigation"; diff --git a/apps/web/src/pages/onboarding-page.tsx b/apps/web/src/pages/onboarding-page.tsx index 5f5fdc658..9676ab45a 100644 --- a/apps/web/src/pages/onboarding-page.tsx +++ b/apps/web/src/pages/onboarding-page.tsx @@ -28,7 +28,7 @@ // a third step. import { Button, EmptyState, Input, ProviderMark } from "@corbits/react-ui"; -import { CircleAlert, KeyRound } from "lucide-react"; +import { Key, WarningCircle } from "@corbits/icons"; import { useCallback, useEffect, useState } from "react"; import type { FormEvent } from "react"; import { OLLAMA_PLACEHOLDER_SECRET } from "@workbench/hub-client/credential-test"; @@ -397,7 +397,7 @@ export function OnboardingPage({ user }: { readonly user: SessionUser }) {

Couldn't set up your workbench

} + icon={} title="Couldn't set up your workbench" description={ state.refId === undefined ? ( @@ -552,7 +552,7 @@ export function OnboardingPage({ user }: { readonly user: SessionUser }) { )} {error !== null && ( } + icon={} title="That key didn't work" description={ errorRefId === undefined ? ( diff --git a/apps/web/src/pages/plugins-page.tsx b/apps/web/src/pages/plugins-page.tsx index 0688e3baa..a6b16e477 100644 --- a/apps/web/src/pages/plugins-page.tsx +++ b/apps/web/src/pages/plugins-page.tsx @@ -27,7 +27,7 @@ import { } from "@corbits/plugins-ui"; import type { ResolvedPlugin } from "@workbench/connections/plugins"; import { listPluginsForTenant } from "@workbench/connections/plugins"; -import { Blocks, Plus, TriangleAlert } from "lucide-react"; +import { Plus, SquaresFour, Warning } from "@corbits/icons"; import { useCallback, useEffect, useState } from "react"; import { useBench } from "../bench-context"; @@ -156,7 +156,7 @@ export function PluginsRoute({ } + icon={} title="Select a workbench" description="Pick a workbench from the switcher to see its plugins." /> @@ -173,7 +173,7 @@ export function PluginsRoute({ } + icon={} title="Couldn't load the plugins gallery" description={ pluginsState.status === "error" @@ -228,10 +228,7 @@ export function PluginsRoute({ {connectDeepLinkNotFound ? (
- +

Couldn't find that connection — pick it below.

diff --git a/apps/web/src/pages/provisioning-error-page.tsx b/apps/web/src/pages/provisioning-error-page.tsx index 1e71b058d..ffed077d2 100644 --- a/apps/web/src/pages/provisioning-error-page.tsx +++ b/apps/web/src/pages/provisioning-error-page.tsx @@ -4,7 +4,7 @@ // whole shell rather than a toast a user could miss or dismiss past. import { Button, EmptyState, PageShell } from "@corbits/react-ui"; -import { CircleAlert } from "lucide-react"; +import { WarningCircle } from "@corbits/icons"; export function ProvisioningErrorPage({ message, @@ -18,7 +18,7 @@ export function ProvisioningErrorPage({ return ( } + icon={} title="Couldn't set up your workbench" description={ refId === undefined ? ( diff --git a/apps/web/src/pages/routines-page.tsx b/apps/web/src/pages/routines-page.tsx index 553451e68..c130b9ad9 100644 --- a/apps/web/src/pages/routines-page.tsx +++ b/apps/web/src/pages/routines-page.tsx @@ -34,7 +34,7 @@ import { classifyBenchMembership, listWorkbenchTenantIds, } from "@corbits/bench-ui"; -import { ChevronDown, ChevronRight, Clock } from "lucide-react"; +import { CaretDown, CaretRight, Clock } from "@corbits/icons"; import { Fragment, useMemo, useState } from "react"; import type { KeyboardEvent } from "react"; import { useQueries, useQuery, useQueryClient } from "@tanstack/react-query"; @@ -395,9 +395,9 @@ export function GlobalRoutinesList({ onClick={() => onToggleExpanded(row.routine.id)} > {expanded ? ( - + ) : ( - + )} diff --git a/apps/web/src/pages/skills-page.tsx b/apps/web/src/pages/skills-page.tsx index 420c46afa..dcd5e3565 100644 --- a/apps/web/src/pages/skills-page.tsx +++ b/apps/web/src/pages/skills-page.tsx @@ -30,7 +30,7 @@ import { TableRow, formatRelativeTime, } from "@corbits/react-ui"; -import { Plus, Sparkles } from "lucide-react"; +import { Lightning, Plus } from "@corbits/icons"; import { useCallback, useEffect, useState } from "react"; import { consumePendingNewSkill } from "../command-palette-actions"; @@ -381,7 +381,7 @@ export function SkillsPage({ return (
} + icon={} title="No skills yet" description="A skill is a named, reusable capability — instructions, tools, and guardrails packaged together — that an agent can pin. Write one in this workbench and publish it into the registry." actions={[ @@ -422,7 +422,7 @@ export function SkillsPage({ {filtered.length === 0 ? ( } + icon={} title="No matching skills" description={`Nothing matches “${query.trim()}”.`} /> diff --git a/apps/web/src/pages/workbench-timeline.tsx b/apps/web/src/pages/workbench-timeline.tsx index 73ab62da5..9cc19a4ae 100644 --- a/apps/web/src/pages/workbench-timeline.tsx +++ b/apps/web/src/pages/workbench-timeline.tsx @@ -14,7 +14,7 @@ import { } from "@corbits/react-ui"; import { listMessages, listThreads } from "@corbits/chat-ui"; import { listTasks } from "@corbits/tasks-ui"; -import { Clock } from "lucide-react"; +import { Clock } from "@corbits/icons"; import { useMemo, useState } from "react"; import { useAPIQuery, NeedsYouSchema } from "../api"; diff --git a/apps/web/src/routes.tsx b/apps/web/src/routes.tsx index 89400b0ec..10ccecc87 100644 --- a/apps/web/src/routes.tsx +++ b/apps/web/src/routes.tsx @@ -19,15 +19,15 @@ // redirect to `/`. import { - Blocks, - Bot, - ChartColumn, - Library, - MessageSquare, - Sparkles, + ChatCircle, + ChartBar, + FlowArrow, + FolderOpen, + Lightning, + Robot, SlidersHorizontal, - Workflow, -} from "lucide-react"; + SquaresFour, +} from "@corbits/icons"; import { lazy, useEffect, type ReactElement, type ReactNode } from "react"; import { WORKBENCH_PATH_PREFIX, isWorkbenchPath } from "./workbench-path"; @@ -154,20 +154,20 @@ export const APP_ROUTES: readonly AppRoute[] = [ { path: "/", label: "New Workbench", - icon: , + icon: , render: () => , hasStageTopBar: false, }, { path: NEW_WORKBENCH_PATH, label: "New workbench", - icon: , + icon: , render: () => , }, { path: WORKBENCH_PATH_PREFIX, label: "Workbenches", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), @@ -175,7 +175,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ { path: "/inbox", label: "Inbox", - icon: , + icon: , render: (_path: string, navigate: (to: string) => void) => ( ), @@ -183,7 +183,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ { path: "/routines", label: "Routines", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), @@ -194,14 +194,14 @@ export const APP_ROUTES: readonly AppRoute[] = [ // (`library-page.tsx`, `libraryArtifactIdFromPath`, …) keeps its name. path: "/files", label: "Files", - icon: , + icon: , render: (path: string) => , }, { // Old `/library` links and bookmarks (CL-6353's rename) land here. path: "/library", label: "Files", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), @@ -209,7 +209,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ { path: "/agents", label: "Agents", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), @@ -219,7 +219,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ // entry keeps old `/settings/agents[/:id]` links routable. path: "/settings/agents", label: "Agents", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), @@ -227,7 +227,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ { path: "/skills", label: "Skills", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), @@ -237,7 +237,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ // entry keeps old `/settings/skills[/:id]` links routable. path: "/settings/skills", label: "Skills", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), @@ -245,7 +245,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ { path: "/insights", label: "Insights", - icon: , + icon: , render: (path: string) => , }, { @@ -255,7 +255,7 @@ export const APP_ROUTES: readonly AppRoute[] = [ // NAV_ROUTES below. path: "/plugins", label: "Plugins", - icon: , + icon: , render: (path: string, navigate: (to: string) => void) => ( ), diff --git a/apps/web/src/shell/canvas-column.tsx b/apps/web/src/shell/canvas-column.tsx index 9e0642677..f73221494 100644 --- a/apps/web/src/shell/canvas-column.tsx +++ b/apps/web/src/shell/canvas-column.tsx @@ -40,13 +40,13 @@ import { } from "@corbits/artifact-ui"; import type { ProfileSubject, SharedWorkbenchSummary } from "@corbits/chat-ui"; import { - ChevronLeft, - ExternalLink, - Maximize2, - Minimize2, - UserRound, + ArrowsIn, + ArrowsOut, + ArrowSquareOut, + CaretLeft, + UserCircle, X, -} from "lucide-react"; +} from "@corbits/icons"; import { useEffect, useState } from "react"; import type { ReactNode } from "react"; import type * as Y from "yjs"; @@ -155,7 +155,7 @@ export function CanvasColumn({ ) : ( } + icon={} title="Nothing open" description="Profiles and artifacts open here when you need them." /> @@ -265,7 +265,7 @@ export function CanvasPaneHeader({ aria-label="Back" title="Back" > - + ) : null} {title !== undefined ? ( @@ -277,7 +277,7 @@ export function CanvasPaneHeader({ {previewSrc !== undefined ? ( @@ -290,7 +290,7 @@ export function CanvasPaneHeader({ aria-label={focus === true ? "Exit focus" : "Focus"} title={focus === true ? "Exit focus" : "Focus"} > - {focus === true ? : } + {focus === true ? : } ) : null} {onClose !== undefined ? ( diff --git a/apps/web/src/shell/context-menu/items.tsx b/apps/web/src/shell/context-menu/items.tsx index a427a30af..d8b69335f 100644 --- a/apps/web/src/shell/context-menu/items.tsx +++ b/apps/web/src/shell/context-menu/items.tsx @@ -11,19 +11,19 @@ import type { ProfileSubject } from "@corbits/chat-ui"; import { contextMenuItem, contextMenuSeparator } from "@corbits/context-menu"; import type { ContextMenu, ContextMenuEntry } from "@corbits/context-menu"; import { - ExternalLink, + ArrowSquareOut, Hash, - Link as LinkIcon, - LogOut, - Pencil, - Pin, - PinOff, + LinkSimple as LinkIcon, + MagnifyingGlass, + MoonStars, + PencilSimple, PlayCircle, - Search, + PushPin, + PushPinSlash, + SignOut, SlidersHorizontal, - SunMoon, - UserRound, -} from "lucide-react"; + UserCircle, +} from "@corbits/icons"; import { toast } from "@corbits/react-ui"; import { workbenchPath } from "../../workbench-path"; @@ -59,7 +59,7 @@ function workbenchMenu( contextMenuItem({ id: "rename", label: "Rename conversation", - icon: , + icon: , onSelect: () => requestWorkbenchRename(target.id), }), ]; @@ -69,7 +69,7 @@ function workbenchMenu( contextMenuItem({ id: "pin", label: target.pinned ? "Unpin conversation" : "Pin conversation", - icon: target.pinned ? : , + icon: target.pinned ? : , onSelect: () => { void patchWorkbenchSettings(tenantId, target.id, { "chat/pinned": !target.pinned, @@ -110,7 +110,7 @@ function profileMenu( contextMenuItem({ id: "open-profile", label: "Open profile", - icon: , + icon: , onSelect: () => actions.openProfile(subject), }), ], @@ -126,7 +126,7 @@ function routineMenu( contextMenuItem({ id: "open", label: "Open routine", - icon: , + icon: , onSelect: () => actions.navigate(path), }), ]; @@ -168,7 +168,7 @@ function insightsRunMenu( contextMenuItem({ id: "open", label: "Open run", - icon: , + icon: , onSelect: () => actions.navigate(path), }), contextMenuItem({ @@ -195,7 +195,7 @@ function accountMenu(actions: ShellContextMenuActions): ContextMenu { contextMenuItem({ id: "sign-out", label: "Sign out", - icon: , + icon: , onSelect: () => actions.signOut(), }), ], @@ -209,7 +209,7 @@ function shellMenu(actions: ShellContextMenuActions): ContextMenu { contextMenuItem({ id: "search", label: "Search…", - icon: , + icon: , onSelect: () => requestOpenCommandPalette(), }), contextMenuItem({ @@ -222,7 +222,7 @@ function shellMenu(actions: ShellContextMenuActions): ContextMenu { contextMenuItem({ id: "theme", label: "Toggle theme", - icon: , + icon: , onSelect: () => actions.cycleTheme(), }), ], diff --git a/apps/web/src/shell/provider-health-banner.tsx b/apps/web/src/shell/provider-health-banner.tsx index ffd77017a..06efdc7e4 100644 --- a/apps/web/src/shell/provider-health-banner.tsx +++ b/apps/web/src/shell/provider-health-banner.tsx @@ -9,7 +9,7 @@ import { Button } from "@corbits/react-ui"; import { connectorDescriptors } from "@workbench/connections/registry"; import type { ClassifiedInferenceFailureCategory } from "@workbench/connections/provider-health"; -import { TriangleAlert, X } from "lucide-react"; +import { Warning, X } from "@corbits/icons"; import { useEffect, useState } from "react"; import { useNavigate } from "../navigation"; @@ -105,10 +105,7 @@ export function ProviderHealthBanner() { className="provider-health-banner" role={isOpen ? "alert" : undefined} > - +

Your {bannerMessage(cachedBanner)}

diff --git a/apps/web/src/shell/routine-panel.tsx b/apps/web/src/shell/routine-panel.tsx index 3806f36a4..e173bcc30 100644 --- a/apps/web/src/shell/routine-panel.tsx +++ b/apps/web/src/shell/routine-panel.tsx @@ -44,7 +44,7 @@ import { toast, } from "@corbits/react-ui"; import { listWorkbenchAgents } from "@corbits/chat-ui"; -import { Clock, X } from "lucide-react"; +import { Clock, X } from "@corbits/icons"; import { useBench } from "../bench-context"; import { useNavigate } from "../navigation"; diff --git a/apps/web/src/shell/sidebar.tsx b/apps/web/src/shell/sidebar.tsx index 66b88eba9..b964f788b 100644 --- a/apps/web/src/shell/sidebar.tsx +++ b/apps/web/src/shell/sidebar.tsx @@ -32,18 +32,18 @@ import { SidebarPanelFooter, } from "@corbits/react-ui"; import { - Bot, - ChartColumn, - ChevronRight, - Library, - LogOut, - MessageSquarePlus, - Plug, + CaretRight, + ChartBar, + ChatCircleDots, + FolderOpen, + Lightning, Plus, + PuzzlePiece, + Robot, + SignOut, + Repeat, SlidersHorizontal, - Sparkles, - Workflow, -} from "lucide-react"; +} from "@corbits/icons"; import { useMemo } from "react"; import { @@ -97,7 +97,7 @@ function WeeklyUsageMenuItem({ Weekly usage {summary} - + ); @@ -155,7 +155,7 @@ export function Sidebar({ aria-current={matchesRoute("/routines", path) ? "page" : undefined} onClick={() => onNavigate("/routines")} > - + Routines @@ -234,7 +234,7 @@ export function Sidebar({ - Send Feedback + Send Feedback @@ -242,7 +242,7 @@ export function Sidebar({ onSelect={onSignOut} className="text-destructive data-[highlighted]:bg-destructive/10 data-[highlighted]:text-destructive" > - Log out + Log out diff --git a/apps/web/src/shell/workbench-list.tsx b/apps/web/src/shell/workbench-list.tsx index 6645cebb9..ae3bfa511 100644 --- a/apps/web/src/shell/workbench-list.tsx +++ b/apps/web/src/shell/workbench-list.tsx @@ -26,7 +26,7 @@ import { import type { Workbench } from "@corbits/chat-ui"; import { WorkingTaskRow } from "@corbits/tasks-ui"; import { useQueryClient } from "@tanstack/react-query"; -import { Hash, MessageSquare, MoreHorizontal, Search } from "lucide-react"; +import { ChatCircle, DotsThree, Hash, MagnifyingGlass } from "@corbits/icons"; import { useEffect, useState } from "react"; import type { KeyboardEvent } from "react"; @@ -325,7 +325,7 @@ function WorkbenchRow({ className="chat-sidebar-row-menu-trigger" aria-label={CHAT_STRINGS.rowMenuLabel} > - + @@ -417,7 +417,7 @@ export function WorkbenchList({
{workingGroup}
diff --git a/packages/chat-ui/src/blocks/block-card.tsx b/packages/chat-ui/src/blocks/block-card.tsx index b1d035001..a3f105a85 100644 --- a/packages/chat-ui/src/blocks/block-card.tsx +++ b/packages/chat-ui/src/blocks/block-card.tsx @@ -2,7 +2,7 @@ // its pulse-dot header and the risk badge. Kept free of chat state and chat // strings so they can lift into @corbits/react-ui unchanged. -import { TriangleAlert } from "lucide-react"; +import { Warning } from "@corbits/icons"; import type { ReactNode } from "react"; export function BlockCard({ @@ -34,7 +34,7 @@ export function RiskBadge({ }) { return ( -