diff --git a/packages/ui/src/assets/provider-logos/claude-code.svg b/packages/ui/src/assets/provider-logos/claude-code.svg
deleted file mode 100644
index 9a454303..00000000
--- a/packages/ui/src/assets/provider-logos/claude-code.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/packages/ui/src/assets/provider-logos/opencode.svg b/packages/ui/src/assets/provider-logos/opencode.svg
deleted file mode 100644
index 16a0e9ef..00000000
--- a/packages/ui/src/assets/provider-logos/opencode.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/packages/ui/src/components/icon/sprite.ts b/packages/ui/src/components/icon/sprite.ts
index b93478e6..769b58cd 100644
--- a/packages/ui/src/components/icon/sprite.ts
+++ b/packages/ui/src/components/icon/sprite.ts
@@ -51,7 +51,6 @@ export const iconSpriteData = {
"checkbox-blank-circle-fill": ``,
"checkbox-circle": ``,
"checkbox-multiple": ``,
- "claude-code": ``,
"clipboard": ``,
"close": ``,
"close-circle": ``,
@@ -63,12 +62,11 @@ export const iconSpriteData = {
"code-sslash": ``,
"collapse-vertical": ``,
"command": ``,
- "command-code": ``,
"compass-3": ``,
"computer": ``,
"contract-up-down": ``,
"corner-down-left": ``,
- "cursor": ``,
+ "cursor": ``,
"database-2": ``,
"delete-bin": ``,
"discord-fill": ``,
diff --git a/packages/ui/src/components/sections/integrations/IntegrationCard.test.tsx b/packages/ui/src/components/sections/integrations/IntegrationCard.test.tsx
deleted file mode 100644
index cc9f9aa2..00000000
--- a/packages/ui/src/components/sections/integrations/IntegrationCard.test.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import { describe, expect, test } from 'bun:test';
-import React from 'react';
-
-const integrationCards = await import('./Integration' + 'Card').catch(() => ({}));
-
-type IntegrationCardComponent = (props: {
- open: boolean;
- onOpenChange: (open: boolean) => void;
- header: React.ReactNode;
- headerAction?: React.ReactNode;
- children: React.ReactNode;
-}) => React.ReactElement;
-
-const IntegrationCard = (
- integrationCards as unknown as {
- IntegrationCard?: IntegrationCardComponent;
- }
-).IntegrationCard;
-
-describe('IntegrationCard', () => {
- test('keeps header controls outside the expansion button', () => {
- expect(typeof IntegrationCard).toBe('function');
- if (!IntegrationCard) return;
-
- const onOpenChange = () => undefined;
- const toggle = ;
- const card = IntegrationCard({
- open: false,
- onOpenChange,
- header: Integration,
- headerAction: toggle,
- children:
Details
,
- });
-
- const cardProps = card.props as {
- open: boolean;
- onOpenChange: (open: boolean) => void;
- children: React.ReactElement;
- };
- expect(cardProps.open).toBe(false);
- expect(cardProps.onOpenChange).toBe(onOpenChange);
-
- const surface = cardProps.children as React.ReactElement<{ children: React.ReactNode }>;
- const headerRow = React.Children.toArray(surface.props.children)[0] as React.ReactElement<{
- children: React.ReactNode;
- }>;
- const headerChildren = React.Children.toArray(headerRow.props.children) as React.ReactElement<{
- children?: React.ReactNode;
- }>[];
-
- expect(headerChildren[0]?.type).toBe('button');
- expect(headerChildren[1]?.props.children).toBe(toggle);
- });
-});
diff --git a/packages/ui/src/components/sections/integrations/IntegrationCard.tsx b/packages/ui/src/components/sections/integrations/IntegrationCard.tsx
deleted file mode 100644
index c1440e12..00000000
--- a/packages/ui/src/components/sections/integrations/IntegrationCard.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import React from 'react';
-import { Icon } from '@/components/icon/Icon';
-import { Collapsible, CollapsibleContent } from '@/components/ui/collapsible';
-import { cn } from '@/lib/utils';
-
-interface IntegrationCardProps {
- open: boolean;
- onOpenChange: (open: boolean) => void;
- header: React.ReactNode;
- headerAction?: React.ReactNode;
- children: React.ReactNode;
- className?: string;
- contentClassName?: string;
- settingsItem?: string;
-}
-
-/**
- * Shared chrome for an integration summary and its on-demand configuration.
- * Header actions sit beside—not inside—the expansion button so their native
- * controls preserve their own keyboard and click behavior.
- */
-export const IntegrationCard: React.FC = ({
- open,
- onOpenChange,
- header,
- headerAction,
- children,
- className,
- contentClassName,
- settingsItem,
-}) => {
- return (
-
-
-
-
- {headerAction ?
{headerAction}
: null}
-
-
- {children}
-
-
-
- );
-};
diff --git a/packages/ui/src/components/sections/integrations/ThirdPartyIntegrationsSection.tsx b/packages/ui/src/components/sections/integrations/ThirdPartyIntegrationsSection.tsx
index e69e086e..02066ed3 100644
--- a/packages/ui/src/components/sections/integrations/ThirdPartyIntegrationsSection.tsx
+++ b/packages/ui/src/components/sections/integrations/ThirdPartyIntegrationsSection.tsx
@@ -12,6 +12,7 @@ import {
import { toast } from '@/components/ui';
import { Icon } from '@/components/icon/Icon';
import { SettingsSection } from '@/components/sections/shared/SettingsSection';
+import { Collapsible, CollapsibleContent } from '@/components/ui/collapsible';
import { useI18n } from '@/lib/i18n';
import { openExternalUrl } from '@/lib/url';
import { cn } from '@/lib/utils';
@@ -27,7 +28,6 @@ import {
THIRD_PARTY_PLUGINS,
type ThirdPartyPluginDefinition,
} from './thirdPartyPlugins';
-import { IntegrationCard } from './IntegrationCard';
type PendingAction = 'install' | 'update' | 'setup' | 'remove';
@@ -296,16 +296,26 @@ export const ThirdPartyIntegrationsSection: React.FC setPluginOpen(plugin.id, open)}
- settingsItem={`integrations.third-party.${plugin.id}`}
- header={(
-
+ open={open}
+ onOpenChange={(nextOpen) => setPluginOpen(plugin.id, nextOpen)}
+ >
+
+