updates
This commit is contained in:
+3
-16
@@ -54,28 +54,15 @@ agent-browser close`} />
|
|||||||
<ol>
|
<ol>
|
||||||
<li><strong>Rust CLI</strong> - Parses commands, communicates with daemon</li>
|
<li><strong>Rust CLI</strong> - Parses commands, communicates with daemon</li>
|
||||||
<li><strong>Node.js Daemon</strong> - Manages Playwright browser instance</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>
|
</ol>
|
||||||
<p>
|
<p>
|
||||||
Daemon starts automatically and persists between commands.
|
Daemon starts automatically and persists between commands.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>Platforms</h2>
|
<h2>Platforms</h2>
|
||||||
<table>
|
<p>
|
||||||
<thead>
|
Native Rust binaries for macOS (ARM64, x64), Linux (ARM64, x64), and Windows (x64).
|
||||||
<tr>
|
</p>
|
||||||
<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>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { codeToHtml } from "shiki";
|
import { codeToHtml } from "shiki";
|
||||||
|
import { CopyButton } from "./copy-button";
|
||||||
|
|
||||||
interface CodeBlockProps {
|
interface CodeBlockProps {
|
||||||
code: string;
|
code: string;
|
||||||
@@ -6,15 +7,16 @@ interface CodeBlockProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function CodeBlock({ code, lang = "bash" }: 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,
|
lang,
|
||||||
theme: "github-dark-default",
|
theme: "github-dark-default",
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div className="code-block relative group">
|
||||||
className="code-block"
|
<CopyButton code={trimmedCode} />
|
||||||
dangerouslySetInnerHTML={{ __html: html }}
|
<div dangerouslySetInnerHTML={{ __html: html }} />
|
||||||
/>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user