diff --git a/astro.config.mjs b/astro.config.mjs
index 1ab6cd27..5118c6a9 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -7,23 +7,26 @@ import { defineConfig } from "astro/config";
import astroInference from "astro-inference";
import pagefind from "astro-pagefind";
import baseConfig from "./astro.base.config.mjs";
+import { rehypeCodeCopy } from "./src/lib/rehype-code-copy.mjs";
import { remarkReadingTime } from "./src/lib/remark-reading-time.mjs";
+const markdownProcessor = () =>
+ unified({
+ remarkPlugins: [remarkReadingTime],
+ rehypePlugins: [rehypeCodeCopy],
+ });
+
// https://astro.build/config
export default defineConfig({
site: "https://fastify.dev",
base: baseConfig.base,
outDir: "./build",
markdown: {
- processor: unified({
- remarkPlugins: [remarkReadingTime],
- }),
+ processor: markdownProcessor(),
},
integrations: [
mdx({
- processor: unified({
- remarkPlugins: [remarkReadingTime],
- }),
+ processor: markdownProcessor(),
}),
sitemap(),
pagefind(),
diff --git a/src/assets/icons/check.svg b/src/assets/icons/check.svg
new file mode 100644
index 00000000..90a705f4
--- /dev/null
+++ b/src/assets/icons/check.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/assets/icons/copy.svg b/src/assets/icons/copy.svg
new file mode 100644
index 00000000..6ca50be3
--- /dev/null
+++ b/src/assets/icons/copy.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/components/CodeTabs.astro b/src/components/CodeTabs.astro
index 5edb2004..f3638e86 100644
--- a/src/components/CodeTabs.astro
+++ b/src/components/CodeTabs.astro
@@ -1,6 +1,6 @@
---
import { Code } from "astro:components";
-import Icon from "~/components/Icon.astro";
+import CopyButton from "~/components/CopyButton.astro";
interface Tab {
label: string;
@@ -14,90 +14,81 @@ interface Props {
}
const { tabs, title, id } = Astro.props;
---
-
-
-
- {tabs.map((tab, i) => (
-
- ))}
-
-
-
+
+
+
+ {tabs.map((tab, i) => (
+
+ ))}
+
+
+
- {tabs.map((tab, i) => (
-
- ))}
+ {tabs.map((tab, i) => (
+
+ ))}
diff --git a/src/components/CopyButton.astro b/src/components/CopyButton.astro
new file mode 100644
index 00000000..ab393d65
--- /dev/null
+++ b/src/components/CopyButton.astro
@@ -0,0 +1,56 @@
+---
+import CheckIcon from "~/assets/icons/check.svg";
+import CopyIcon from "~/assets/icons/copy.svg";
+
+interface Props {
+ text?: string;
+ textSelector?: string;
+ variant?: "icon-swap" | "label-swap";
+ copyLabel?: string;
+ copiedLabel?: string;
+ ariaLabel?: string;
+ class?: string;
+}
+
+const {
+ text,
+ textSelector,
+ variant = "icon-swap",
+ copyLabel = "Copy",
+ copiedLabel = "Copied",
+ ariaLabel = "Copy code",
+ class: className = "",
+} = Astro.props;
+---
+
+
diff --git a/src/components/DocsShell.astro b/src/components/DocsShell.astro
index 1fdc934f..dc1ad9b2 100644
--- a/src/components/DocsShell.astro
+++ b/src/components/DocsShell.astro
@@ -1,6 +1,7 @@
---
import { getCollection } from "astro:content";
import type { MarkdownHeading } from "astro";
+import CopyButton from "~/components/CopyButton.astro";
import DocsNav from "~/components/DocsNav.astro";
import Icon from "~/components/Icon.astro";
import TableOfContents from "~/components/TableOfContents.astro";
@@ -293,6 +294,13 @@ const markdownUrl = withBase(`/docs/${markdownSlug}.md`);
+
+
+
+
diff --git a/src/components/Icon.astro b/src/components/Icon.astro
index 42422743..71c1cec6 100644
--- a/src/components/Icon.astro
+++ b/src/components/Icon.astro
@@ -7,9 +7,7 @@ import {
AlertTriangle,
ArrowRight,
Braces,
- Check,
Clock,
- Copy,
ExternalLink,
FileText,
Heart,
@@ -45,8 +43,6 @@ const lucide: Record = {
search: Search,
sun: Sun,
moon: Moon,
- copy: Copy,
- check: Check,
external: ExternalLink,
menu: Menu,
close: X,
diff --git a/src/components/InstallCommand.astro b/src/components/InstallCommand.astro
index 90ccf789..00599834 100644
--- a/src/components/InstallCommand.astro
+++ b/src/components/InstallCommand.astro
@@ -1,41 +1,18 @@
---
-import Icon from "~/components/Icon.astro";
+import CopyButton from "~/components/CopyButton.astro";
interface Props {
command?: string;
}
const { command = "npm install fastify" } = Astro.props;
---
-
-
$
-
{command}
-
+
+ $
+ {command}
+
-
-
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
index 8cbf5da1..c9b8d905 100644
--- a/src/layouts/BaseLayout.astro
+++ b/src/layouts/BaseLayout.astro
@@ -79,9 +79,12 @@ const jsonLd = JSON.stringify({