Skip to content

Commit fc269d6

Browse files
authored
Add copy-to-clipboard button and improve repo link text (#65)
Add CopyMarkdownButton component to kernel detail pages for easy markdown copying. Change 'View on GitHub' to 'View Official Repo on GitHub' for clarity. Buttons positioned side-by-side below kernel header.
1 parent 1455f30 commit fc269d6

2 files changed

Lines changed: 60 additions & 12 deletions

File tree

site/app/kernel/[name]/page.tsx

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import { TooltipProvider } from '@/components/ui/tooltip';
44
import { Header } from '@/components/Header';
55
import { TierBreakdown } from '@/components/TierBreakdown';
66
import { FailureSummary } from '@/components/FailureSummary';
7+
import { CopyMarkdownButton } from '@/components/CopyMarkdownButton';
78
import { getConformanceData, getAllKernelNames, getKernelReport } from '@/lib/data';
89
import { getKernelMetadata } from '@/lib/kernel-metadata';
10+
import { renderKernelDetailMarkdown } from '@/lib/markdown-renderers';
911
import { getPassedCount, getTotalCount, hasStartupError } from '@/types/report';
1012
import { notFound } from 'next/navigation';
1113

@@ -56,6 +58,7 @@ export default async function KernelPage({ params }: KernelPageProps) {
5658
}
5759

5860
const metadata = getKernelMetadata(report.kernel_name);
61+
const markdownContent = renderKernelDetailMarkdown(report);
5962

6063
return (
6164
<TooltipProvider>
@@ -75,18 +78,21 @@ export default async function KernelPage({ params }: KernelPageProps) {
7578
<p className="text-ctp-subtext0">
7679
{report.implementation} ({report.language}) • Protocol {report.protocol_version}
7780
</p>
78-
{metadata?.repository && (
79-
<a
80-
href={metadata.repository}
81-
target="_blank"
82-
rel="noopener noreferrer"
83-
className="inline-flex items-center gap-1.5 text-sm text-ctp-blue hover:text-ctp-sapphire transition-colors mt-2"
84-
>
85-
<Github className="h-4 w-4" />
86-
View on GitHub
87-
<ExternalLink className="h-3 w-3" />
88-
</a>
89-
)}
81+
<div className="flex items-center gap-4 mt-2">
82+
{metadata?.repository && (
83+
<a
84+
href={metadata.repository}
85+
target="_blank"
86+
rel="noopener noreferrer"
87+
className="inline-flex items-center gap-1.5 text-sm text-ctp-blue hover:text-ctp-sapphire transition-colors"
88+
>
89+
<Github className="h-4 w-4" />
90+
View Official Repo on GitHub
91+
<ExternalLink className="h-3 w-3" />
92+
</a>
93+
)}
94+
<CopyMarkdownButton content={markdownContent} />
95+
</div>
9096
</div>
9197

9298
<FailureSummary report={report} />
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
'use client';
2+
3+
import { useState } from 'react';
4+
import { Copy, Check } from 'lucide-react';
5+
6+
interface CopyMarkdownButtonProps {
7+
content: string;
8+
}
9+
10+
export function CopyMarkdownButton({ content }: CopyMarkdownButtonProps) {
11+
const [copied, setCopied] = useState(false);
12+
13+
const handleCopy = async () => {
14+
try {
15+
await navigator.clipboard.writeText(content);
16+
setCopied(true);
17+
setTimeout(() => setCopied(false), 2000);
18+
} catch (err) {
19+
console.error('Failed to copy:', err);
20+
}
21+
};
22+
23+
return (
24+
<button
25+
onClick={handleCopy}
26+
className="inline-flex items-center gap-1.5 text-sm text-ctp-subtext0 hover:text-ctp-text transition-colors"
27+
title="Copy as Markdown"
28+
>
29+
{copied ? (
30+
<>
31+
<Check className="h-4 w-4 text-ctp-green" />
32+
<span className="text-ctp-green">Copied!</span>
33+
</>
34+
) : (
35+
<>
36+
<Copy className="h-4 w-4" />
37+
<span>Copy as Markdown</span>
38+
</>
39+
)}
40+
</button>
41+
);
42+
}

0 commit comments

Comments
 (0)