This commit is contained in:
Chris Tate
2026-01-13 02:38:11 -06:00
parent 400dc8b850
commit c6d5f9bca1
3 changed files with 45 additions and 21 deletions
+3 -16
View File
@@ -54,28 +54,15 @@ agent-browser close`} />
<ol>
<li><strong>Rust CLI</strong> - Parses commands, communicates with daemon</li>
<li><strong>Node.js Daemon</strong> - Manages Playwright browser instance</li>
<li><strong>Fallback</strong> - Uses Node.js directly if native binary unavailable</li>
</ol>
<p>
Daemon starts automatically and persists between commands.
</p>
<h2>Platforms</h2>
<table>
<thead>
<tr>
<th>Platform</th>
<th>Binary</th>
</tr>
</thead>
<tbody>
<tr><td>macOS ARM64</td><td>Native Rust</td></tr>
<tr><td>macOS x64</td><td>Native Rust</td></tr>
<tr><td>Linux ARM64</td><td>Native Rust</td></tr>
<tr><td>Linux x64</td><td>Native Rust</td></tr>
<tr><td>Windows x64</td><td>Native Rust</td></tr>
</tbody>
</table>
<p>
Native Rust binaries for macOS (ARM64, x64), Linux (ARM64, x64), and Windows (x64).
</p>
</div>
</div>
);
+7 -5
View File
@@ -1,4 +1,5 @@
import { codeToHtml } from "shiki";
import { CopyButton } from "./copy-button";
interface CodeBlockProps {
code: string;
@@ -6,15 +7,16 @@ interface CodeBlockProps {
}
export async function CodeBlock({ code, lang = "bash" }: CodeBlockProps) {
const html = await codeToHtml(code.trim(), {
const trimmedCode = code.trim();
const html = await codeToHtml(trimmedCode, {
lang,
theme: "github-dark-default",
});
return (
<div
className="code-block"
dangerouslySetInnerHTML={{ __html: html }}
/>
<div className="code-block relative group">
<CopyButton code={trimmedCode} />
<div dangerouslySetInnerHTML={{ __html: html }} />
</div>
);
}
+35
View File
@@ -0,0 +1,35 @@
"use client";
import { useState } from "react";
interface CopyButtonProps {
code: string;
}
export function CopyButton({ code }: CopyButtonProps) {
const [copied, setCopied] = useState(false);
const handleCopy = async () => {
await navigator.clipboard.writeText(code);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
};
return (
<button
onClick={handleCopy}
className="absolute top-2 right-2 p-1.5 rounded text-[#666] hover:text-[#999] hover:bg-[#333] opacity-0 group-hover:opacity-100 transition-all"
aria-label="Copy code"
>
{copied ? (
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M5 13l4 4L19 7" />
</svg>
) : (
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
</svg>
)}
</button>
);
}