From d0b23ea6160690020ba742e913418fa34c12626a Mon Sep 17 00:00:00 2001 From: ciregenz Date: Tue, 9 Jun 2026 14:55:08 -0700 Subject: [PATCH] [eric] frontend: polish subscription + pro cards (hover lift, hover-reveal disconnect) --- .../subscription/OpenSwarmProCard.tsx | 24 +++++---- .../subscription/SubscriptionCard.tsx | 54 +++++++++++-------- 2 files changed, 47 insertions(+), 31 deletions(-) diff --git a/frontend/src/app/pages/Settings/sections/subscription/OpenSwarmProCard.tsx b/frontend/src/app/pages/Settings/sections/subscription/OpenSwarmProCard.tsx index f65c5f65..46f9ec42 100644 --- a/frontend/src/app/pages/Settings/sections/subscription/OpenSwarmProCard.tsx +++ b/frontend/src/app/pages/Settings/sections/subscription/OpenSwarmProCard.tsx @@ -105,7 +105,7 @@ const OpenSwarmProCard: React.FC = () => { desc: 'Your subscription ended. Pick a plan to get back in.', cta: 'Resubscribe', title: 'Resubscribe to OpenSwarm Pro', - subtitle: 'Keep using Claude Sonnet, Opus, and Haiku without a Claude account.', + subtitle: 'Keep using the latest Claude models without a Claude account.', currentPlan: lastPlan, }; } @@ -119,7 +119,7 @@ const OpenSwarmProCard: React.FC = () => { }; } return { - desc: 'Claude Sonnet, Opus, and Haiku. No Claude account needed.', + desc: 'The latest Claude models. No Claude account needed.', cta: 'Subscribe', title: 'Choose your plan', subtitle: 'One subscription, we handle everything behind the scenes. Cancel anytime.', @@ -129,22 +129,26 @@ const OpenSwarmProCard: React.FC = () => { return ( <> - - - + + + - - + + OpenSwarm Pro - - + + RECOMMENDED - + {copy.desc} diff --git a/frontend/src/app/pages/Settings/sections/subscription/SubscriptionCard.tsx b/frontend/src/app/pages/Settings/sections/subscription/SubscriptionCard.tsx index 1096264a..0ff5b837 100644 --- a/frontend/src/app/pages/Settings/sections/subscription/SubscriptionCard.tsx +++ b/frontend/src/app/pages/Settings/sections/subscription/SubscriptionCard.tsx @@ -9,59 +9,71 @@ import type { SubscriptionProvider } from './subscriptionProviders'; const SubscriptionCard: React.FC<{ provider: SubscriptionProvider; connected: boolean; onConnect: () => void; onDisconnect: () => void; connecting: boolean; userCode?: string; disconnecting?: boolean }> = ({ provider, connected, onConnect, onDisconnect, connecting, userCode, disconnecting }) => { const c = useClaudeTokens(); const isPreview = (provider as any).preview; + const dotColor = connected ? c.status.success : connecting ? c.accent.primary : c.border.medium; + return ( - - + + - + {provider.name} - + {connecting ? 'Waiting for authorization...' : provider.desc} + {isPreview ? ( - + Coming soon ) : connected ? ( disconnecting ? ( ) : ( - - Disconnect - + + + Connected + + + Disconnect + + ) ) : connecting && userCode ? ( - + Enter code: - {userCode} + {userCode} ) : connecting ? ( - + Connecting... ) : ( - )}