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"