Skip to content

Commit f87de97

Browse files
committed
feat: better card design
1 parent ba3370f commit f87de97

2 files changed

Lines changed: 15 additions & 9 deletions

File tree

components/integration-grid.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@ const INTEGRATION_META: Record<string, IntegrationMeta> = {
2828
agno: { icon: <Container />, tag: 'Agent Framework' },
2929
'ai-sdk': { icon: <Container />, tag: 'Agent Framework' },
3030
'browser-use': { icon: <BrowserUseIcon />, tag: 'Browser Agent' },
31-
'claude-agent-sdk': { icon: <ClaudeIcon />, tag: 'Agent Framework' },
3231
'claude-code': { icon: <ClaudeIcon />, tag: 'Coding Agent' },
3332
'claude-computer-use': { icon: <ClaudeIcon />, tag: 'Computer Use' },
3433
codex: { icon: <OpenAIIcon />, tag: 'Coding Agent' },
3534
crewai: { icon: <Cloud />, tag: 'Multi-Agent' },
3635
'gemini-computer-use': { icon: <GeminiIcon />, tag: 'Computer Use' },
3736
'hermes-agent': { icon: <BashIcon />, tag: 'Coding Agent' },
38-
langgraph: { icon: <Container />, tag: 'Agent Framework' },
3937
magnitude: { icon: <Container />, tag: 'Browser Agent' },
4038
notte: { icon: <Container />, tag: 'Browser Agent' },
4139
'openai-agents-sdk': { icon: <OpenAIIcon />, tag: 'Agent Framework' },
@@ -44,7 +42,6 @@ const INTEGRATION_META: Record<string, IntegrationMeta> = {
4442
'pi-agent': { icon: <BashIcon />, tag: 'Coding Agent' },
4543
playwright: { icon: <PlaywrightIcon />, tag: 'Browser Library' },
4644
puppeteer: { icon: <PuppeteerIcon />, tag: 'Browser Library' },
47-
'pydantic-ai': { icon: <Container />, tag: 'Agent Framework' },
4845
replit: { icon: <Cloud />, tag: 'Platform' },
4946
selenium: { icon: <SeleniumIcon />, tag: 'Browser Library' },
5047
'stackblitz-bolt.new': { icon: <Cloud />, tag: 'Platform' },

components/recipe-quickstart.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,16 @@ export function RecipeQuickstart({ slug }: Props) {
2424
const command = `steel forge ${slug}`;
2525
const [copied, setCopied] = useState(false);
2626

27-
const onCopy = () => {
28-
void navigator.clipboard.writeText(command);
29-
setCopied(true);
30-
setTimeout(() => setCopied(false), 1500);
27+
const onCopy = async () => {
28+
try {
29+
await navigator.clipboard.writeText(command);
30+
setCopied(true);
31+
setTimeout(() => setCopied(false), 1500);
32+
} catch {
33+
// Clipboard unavailable (insecure context, denied permission, ...).
34+
// The command text stays selectable, so users can still copy by hand.
35+
// Don't flip the state — that would lie about success.
36+
}
3137
};
3238

3339
return (
@@ -45,9 +51,9 @@ export function RecipeQuickstart({ slug }: Props) {
4551
type="button"
4652
onClick={onCopy}
4753
aria-label={copied ? 'Copied' : 'Copy command'}
48-
className="group flex cursor-pointer items-center justify-between gap-4 rounded-md bg-neutral-100 px-4 py-3 text-left font-mono transition-colors hover:bg-neutral-200 dark:bg-neutral-700 dark:hover:bg-neutral-600"
54+
className="group flex cursor-pointer items-center justify-between gap-4 rounded-md bg-neutral-100 px-4 py-3 text-left font-mono transition-colors hover:bg-neutral-200 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none dark:bg-neutral-700 dark:hover:bg-neutral-600"
4955
>
50-
<span className="text-sm text-foreground">
56+
<span className="min-w-0 truncate text-sm text-foreground">
5157
<span className="mr-2 text-muted-foreground">$</span>
5258
{command}
5359
</span>
@@ -61,6 +67,9 @@ export function RecipeQuickstart({ slug }: Props) {
6167
<Copy className="h-4 w-4 -scale-x-100" />
6268
)}
6369
</span>
70+
<span aria-live="polite" className="sr-only">
71+
{copied ? 'Copied' : ''}
72+
</span>
6473
</button>
6574
<p className="text-xs text-muted-foreground">
6675
Scaffolds a starter project locally. Requires the{' '}

0 commit comments

Comments
 (0)