workspace/ files existed on disk but were not included in previous incremental commit, causing git to record them as deleted. Re-adding all workspace card components, AgentWorkspace, ActivityTimeline, and WorkspaceCardRenderer to properly track them. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
"use client";
|
|
import { Search, ExternalLink } from "lucide-react";
|
|
|
|
interface SearchResult {
|
|
title: string;
|
|
url: string;
|
|
snippet: string;
|
|
}
|
|
|
|
interface SearchResultCardProps {
|
|
query: string;
|
|
total: number;
|
|
results: SearchResult[];
|
|
}
|
|
|
|
export function SearchResultCard({ query, total, results }: SearchResultCardProps) {
|
|
return (
|
|
<div className="rounded-xl border border-[var(--gem-border)] bg-[var(--gem-surface)] p-4">
|
|
<div className="flex items-center gap-2 mb-3">
|
|
<Search size={15} className="text-[var(--gem-blue,#4285f4)]" />
|
|
<span className="text-sm font-medium text-[var(--gem-text)]">网络搜索</span>
|
|
<span className="ml-auto text-xs text-[var(--gem-text-muted)] bg-[var(--gem-surface-2)] px-2 py-0.5 rounded-full">
|
|
{total} 条来源
|
|
</span>
|
|
</div>
|
|
{query && (
|
|
<p className="text-xs text-[var(--gem-text-muted)] mb-3">查询:{query}</p>
|
|
)}
|
|
<div className="space-y-3">
|
|
{results.map((r, i) => (
|
|
<div key={i} className="border-t border-[var(--gem-border)] pt-2 first:border-0 first:pt-0">
|
|
<div className="flex items-start gap-1">
|
|
<a
|
|
href={r.url}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-xs font-medium text-[var(--gem-blue,#4285f4)] hover:underline flex-1 leading-snug"
|
|
>
|
|
{r.title}
|
|
</a>
|
|
<ExternalLink size={10} className="text-[var(--gem-text-muted)] flex-shrink-0 mt-0.5" />
|
|
</div>
|
|
{r.url && (
|
|
<p className="text-[10px] text-[var(--gem-text-muted)] truncate mt-0.5">{r.url}</p>
|
|
)}
|
|
{r.snippet && (
|
|
<p className="text-xs text-[var(--gem-text-muted)] mt-1 leading-relaxed line-clamp-2">{r.snippet}</p>
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|