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({