From 1d62f72e87d014c0e37815050be51d469f62badf Mon Sep 17 00:00:00 2001
From: port <108868128+portdeveloper@users.noreply.github.com>
Date: Sat, 16 May 2026 13:12:47 +0000
Subject: [PATCH 1/5] add docusaurus-plugin-copy-page-button
---
website/docusaurus.config.ts | 1 +
website/package.json | 1 +
2 files changed, 2 insertions(+)
diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts
index 52512b4cdfc..c4dd2e99419 100644
--- a/website/docusaurus.config.ts
+++ b/website/docusaurus.config.ts
@@ -221,6 +221,7 @@ const config: Config = {
],
plugins: [
'docusaurus-plugin-sass',
+ 'docusaurus-plugin-copy-page-button',
function disableExpensiveBundlerOptimizationPlugin() {
return {
name: 'disable-expensive-bundler-optimizations',
diff --git a/website/package.json b/website/package.json
index 8fa6cc9b9b6..7c09d8defdf 100644
--- a/website/package.json
+++ b/website/package.json
@@ -56,6 +56,7 @@
"@docusaurus/plugin-pwa": "3.10.1",
"@docusaurus/preset-classic": "3.10.1",
"@docusaurus/theme-mermaid": "3.10.1",
+ "docusaurus-plugin-copy-page-button": "^0.5.1",
"docusaurus-plugin-sass": "^0.2.6",
"react": "^19.2.6",
"react-dom": "^19.2.6",
From 7b5dfd10f0a9fb47ea839966596ad1d4c68868f4 Mon Sep 17 00:00:00 2001
From: port <108868128+portdeveloper@users.noreply.github.com>
Date: Sat, 16 May 2026 14:37:35 +0000
Subject: [PATCH 2/5] bump docusaurus-plugin-copy-page-button to 0.5.2
includes fixes for @Simek's feedback (no-ToC fallback, layout shift, font, first-render race)
---
website/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/website/package.json b/website/package.json
index 7c09d8defdf..2cdafba9559 100644
--- a/website/package.json
+++ b/website/package.json
@@ -56,7 +56,7 @@
"@docusaurus/plugin-pwa": "3.10.1",
"@docusaurus/preset-classic": "3.10.1",
"@docusaurus/theme-mermaid": "3.10.1",
- "docusaurus-plugin-copy-page-button": "^0.5.1",
+ "docusaurus-plugin-copy-page-button": "^0.5.2",
"docusaurus-plugin-sass": "^0.2.6",
"react": "^19.2.6",
"react-dom": "^19.2.6",
From 5c51def1667a1fea0a7c9e52cf269d841c05827e Mon Sep 17 00:00:00 2001
From: port <108868128+portdeveloper@users.noreply.github.com>
Date: Thu, 21 May 2026 09:52:58 +0000
Subject: [PATCH 3/5] Fix copy page button rendering
---
website/docusaurus.config.ts | 1 -
website/src/theme/DocItem/Layout/index.tsx | 101 ++++++++++++++++++
.../theme/DocItem/Layout/styles.module.css | 54 ++++++++++
.../docusaurus-plugin-copy-page-button.d.ts | 31 ++++++
4 files changed, 186 insertions(+), 1 deletion(-)
create mode 100644 website/src/theme/DocItem/Layout/index.tsx
create mode 100644 website/src/theme/DocItem/Layout/styles.module.css
create mode 100644 website/src/types/docusaurus-plugin-copy-page-button.d.ts
diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts
index c4dd2e99419..52512b4cdfc 100644
--- a/website/docusaurus.config.ts
+++ b/website/docusaurus.config.ts
@@ -221,7 +221,6 @@ const config: Config = {
],
plugins: [
'docusaurus-plugin-sass',
- 'docusaurus-plugin-copy-page-button',
function disableExpensiveBundlerOptimizationPlugin() {
return {
name: 'disable-expensive-bundler-optimizations',
diff --git a/website/src/theme/DocItem/Layout/index.tsx b/website/src/theme/DocItem/Layout/index.tsx
new file mode 100644
index 00000000000..3287c634f50
--- /dev/null
+++ b/website/src/theme/DocItem/Layout/index.tsx
@@ -0,0 +1,101 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import React, {type ReactNode} from 'react';
+import clsx from 'clsx';
+import {useWindowSize} from '@docusaurus/theme-common';
+import {useDoc} from '@docusaurus/plugin-content-docs/client';
+import CopyPageButton from 'docusaurus-plugin-copy-page-button/src/CopyPageButton';
+import DocItemPaginator from '@theme/DocItem/Paginator';
+import DocVersionBanner from '@theme/DocVersionBanner';
+import DocVersionBadge from '@theme/DocVersionBadge';
+import DocItemFooter from '@theme/DocItem/Footer';
+import DocItemTOCMobile from '@theme/DocItem/TOC/Mobile';
+import DocItemTOCDesktop from '@theme/DocItem/TOC/Desktop';
+import DocItemContent from '@theme/DocItem/Content';
+import DocBreadcrumbs from '@theme/DocBreadcrumbs';
+import ContentVisibility from '@theme/ContentVisibility';
+import type {Props} from '@theme/DocItem/Layout';
+
+import styles from './styles.module.css';
+
+function DocItemCopyPageButton({className}: {className?: string}) {
+ return (
+
+
+
+ );
+}
+
+/**
+ * Decide if the toc should be rendered, on mobile or desktop viewports
+ */
+function useDocTOC() {
+ const {frontMatter, toc} = useDoc();
+ const windowSize = useWindowSize();
+
+ const hidden = frontMatter.hide_table_of_contents;
+ const canRender = !hidden && toc.length > 0;
+
+ const mobile = canRender ? : undefined;
+
+ const desktop =
+ canRender && (windowSize === 'desktop' || windowSize === 'ssr') ? (
+
+ ) : undefined;
+
+ return {
+ canRender,
+ hidden,
+ mobile,
+ desktop,
+ };
+}
+
+export default function DocItemLayout({children}: Props): ReactNode {
+ const docTOC = useDocTOC();
+ const {metadata} = useDoc();
+ return (
+
+
+
+
+
+
+
+
+ {docTOC.mobile}
+
+ {children}
+
+
+
+
+
+ {docTOC.desktop && (
+
+
+ {docTOC.desktop}
+
+ )}
+
+ );
+}
diff --git a/website/src/theme/DocItem/Layout/styles.module.css b/website/src/theme/DocItem/Layout/styles.module.css
new file mode 100644
index 00000000000..e05435eb804
--- /dev/null
+++ b/website/src/theme/DocItem/Layout/styles.module.css
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+.docItemContainer header + *,
+.docItemContainer article > *:first-child {
+ margin-top: 0;
+}
+
+.copyPageAction {
+ display: flex;
+}
+
+.copyPageArticleAction {
+ justify-content: flex-end;
+ min-height: 37px;
+ margin-bottom: 1rem;
+}
+
+.copyPageAsideAction {
+ display: none;
+ margin-bottom: 1rem;
+}
+
+.copyPageButtonContainer {
+ display: inline-block;
+}
+
+.copyPageButton {
+ font-family: var(--ifm-font-family-base);
+}
+
+.copyPageDropdown {
+ font-family: var(--ifm-font-family-base);
+}
+
+@media (min-width: 997px) {
+ .docItemCol {
+ max-width: 75% !important;
+ }
+
+ .copyPageArticleActionWithToc {
+ display: none;
+ }
+
+ .copyPageAsideAction {
+ display: flex;
+ justify-content: flex-start;
+ min-height: 37px;
+ }
+}
diff --git a/website/src/types/docusaurus-plugin-copy-page-button.d.ts b/website/src/types/docusaurus-plugin-copy-page-button.d.ts
new file mode 100644
index 00000000000..fb3f7c5bb01
--- /dev/null
+++ b/website/src/types/docusaurus-plugin-copy-page-button.d.ts
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+declare module 'docusaurus-plugin-copy-page-button/src/CopyPageButton' {
+ import type {ComponentType, CSSProperties} from 'react';
+
+ type StyleConfig = {
+ className?: string;
+ style?: CSSProperties;
+ };
+
+ type CustomStyles = {
+ container?: StyleConfig;
+ button?: StyleConfig;
+ dropdown?: StyleConfig;
+ dropdownItem?: StyleConfig;
+ };
+
+ type CopyPageButtonProps = {
+ customStyles?: CustomStyles;
+ enabledActions?: Array<'copy' | 'view' | 'chatgpt' | 'claude' | 'gemini'>;
+ generateMarkdownRoutes?: boolean;
+ };
+
+ const CopyPageButton: ComponentType;
+ export default CopyPageButton;
+}
From 2dee0d08ce38003588b353f41b1396be5b55d03e Mon Sep 17 00:00:00 2001
From: port <108868128+portdeveloper@users.noreply.github.com>
Date: Thu, 21 May 2026 19:09:53 +0000
Subject: [PATCH 4/5] Use public copy page button entrypoint
---
website/package.json | 2 +-
website/src/theme/DocItem/Layout/index.tsx | 2 +-
.../docusaurus-plugin-copy-page-button.d.ts | 31 -------------------
yarn.lock | 5 +++
4 files changed, 7 insertions(+), 33 deletions(-)
delete mode 100644 website/src/types/docusaurus-plugin-copy-page-button.d.ts
diff --git a/website/package.json b/website/package.json
index 2cdafba9559..9dc7feb150c 100644
--- a/website/package.json
+++ b/website/package.json
@@ -56,7 +56,7 @@
"@docusaurus/plugin-pwa": "3.10.1",
"@docusaurus/preset-classic": "3.10.1",
"@docusaurus/theme-mermaid": "3.10.1",
- "docusaurus-plugin-copy-page-button": "^0.5.2",
+ "docusaurus-plugin-copy-page-button": "^0.6.1",
"docusaurus-plugin-sass": "^0.2.6",
"react": "^19.2.6",
"react-dom": "^19.2.6",
diff --git a/website/src/theme/DocItem/Layout/index.tsx b/website/src/theme/DocItem/Layout/index.tsx
index 3287c634f50..2c5813cf73a 100644
--- a/website/src/theme/DocItem/Layout/index.tsx
+++ b/website/src/theme/DocItem/Layout/index.tsx
@@ -9,7 +9,7 @@ import React, {type ReactNode} from 'react';
import clsx from 'clsx';
import {useWindowSize} from '@docusaurus/theme-common';
import {useDoc} from '@docusaurus/plugin-content-docs/client';
-import CopyPageButton from 'docusaurus-plugin-copy-page-button/src/CopyPageButton';
+import CopyPageButton from 'docusaurus-plugin-copy-page-button/react';
import DocItemPaginator from '@theme/DocItem/Paginator';
import DocVersionBanner from '@theme/DocVersionBanner';
import DocVersionBadge from '@theme/DocVersionBadge';
diff --git a/website/src/types/docusaurus-plugin-copy-page-button.d.ts b/website/src/types/docusaurus-plugin-copy-page-button.d.ts
deleted file mode 100644
index fb3f7c5bb01..00000000000
--- a/website/src/types/docusaurus-plugin-copy-page-button.d.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright (c) Meta Platforms, Inc. and affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-declare module 'docusaurus-plugin-copy-page-button/src/CopyPageButton' {
- import type {ComponentType, CSSProperties} from 'react';
-
- type StyleConfig = {
- className?: string;
- style?: CSSProperties;
- };
-
- type CustomStyles = {
- container?: StyleConfig;
- button?: StyleConfig;
- dropdown?: StyleConfig;
- dropdownItem?: StyleConfig;
- };
-
- type CopyPageButtonProps = {
- customStyles?: CustomStyles;
- enabledActions?: Array<'copy' | 'view' | 'chatgpt' | 'claude' | 'gemini'>;
- generateMarkdownRoutes?: boolean;
- };
-
- const CopyPageButton: ComponentType;
- export default CopyPageButton;
-}
diff --git a/yarn.lock b/yarn.lock
index 738f759956d..5a8b8b0b0a0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7307,6 +7307,11 @@ doctrine@^2.1.0:
dependencies:
esutils "^2.0.2"
+docusaurus-plugin-copy-page-button@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/docusaurus-plugin-copy-page-button/-/docusaurus-plugin-copy-page-button-0.6.1.tgz#901bc9fed88eb8afda5838c634e81a69d312db54"
+ integrity sha512-84LUG23owdGlUx5rgg7lcyuuxFZ+84u9u+adYjFZ1E5lM+g6bkduOGcZXLUqbI0R2Ve2RjG0OPv2KaL01tGW4w==
+
docusaurus-plugin-sass@^0.2.6:
version "0.2.6"
resolved "https://registry.yarnpkg.com/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.6.tgz#b4930a1fe1cc7bcead639bb1bee38bce0ffd073d"
From 22f4b29f6f458a5573fa48e781115c0fe29c3076 Mon Sep 17 00:00:00 2001
From: port <108868128+portdeveloper@users.noreply.github.com>
Date: Fri, 22 May 2026 10:49:14 +0000
Subject: [PATCH 5/5] Bump copy page button to 0.6.2
---
website/package.json | 2 +-
yarn.lock | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/website/package.json b/website/package.json
index 9dc7feb150c..2244be833f7 100644
--- a/website/package.json
+++ b/website/package.json
@@ -56,7 +56,7 @@
"@docusaurus/plugin-pwa": "3.10.1",
"@docusaurus/preset-classic": "3.10.1",
"@docusaurus/theme-mermaid": "3.10.1",
- "docusaurus-plugin-copy-page-button": "^0.6.1",
+ "docusaurus-plugin-copy-page-button": "^0.6.2",
"docusaurus-plugin-sass": "^0.2.6",
"react": "^19.2.6",
"react-dom": "^19.2.6",
diff --git a/yarn.lock b/yarn.lock
index f71014e0f12..0deadd945da 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7236,10 +7236,10 @@ doctrine@^2.1.0:
dependencies:
esutils "^2.0.2"
-docusaurus-plugin-copy-page-button@^0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/docusaurus-plugin-copy-page-button/-/docusaurus-plugin-copy-page-button-0.6.1.tgz#901bc9fed88eb8afda5838c634e81a69d312db54"
- integrity sha512-84LUG23owdGlUx5rgg7lcyuuxFZ+84u9u+adYjFZ1E5lM+g6bkduOGcZXLUqbI0R2Ve2RjG0OPv2KaL01tGW4w==
+docusaurus-plugin-copy-page-button@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/docusaurus-plugin-copy-page-button/-/docusaurus-plugin-copy-page-button-0.6.2.tgz#fee47fa75f77ab634d90694c47e832ce9dadcc6c"
+ integrity sha512-RbldmCJ6FEYx515ptp1Ei9WwQAQyK6ty5UaHVaSlOyBfh/Nm+wu+6y3g/V7sVejBrMCxpGLnAuIJn3h8nqdjcQ==
docusaurus-plugin-sass@^0.2.6:
version "0.2.6"