diff --git a/docusaurus.config.js b/docusaurus.config.js index 3288ffc7371..69c8864bda8 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -371,6 +371,12 @@ module.exports = { versions: VERSIONS_JSON, }, ], + [ + 'docusaurus-plugin-copy-page-button', + { + injectButton: false, + }, + ], ], customFields: {}, themes: [], diff --git a/package-lock.json b/package-lock.json index 1f0faeaf2c9..dff1b185d42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "clsx": "^1.1.1", "concurrently": "^6.2.0", "crowdin": "^3.5.0", + "docusaurus-plugin-copy-page-button": "^0.6.1", "docusaurus-plugin-module-alias": "^0.0.2", "docusaurus-plugin-sass": "^0.2.6", "fs-extra": "^9.1.0", @@ -8031,6 +8032,19 @@ "node": ">=6" } }, + "node_modules/docusaurus-plugin-copy-page-button": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-copy-page-button/-/docusaurus-plugin-copy-page-button-0.6.1.tgz", + "integrity": "sha512-84LUG23owdGlUx5rgg7lcyuuxFZ+84u9u+adYjFZ1E5lM+g6bkduOGcZXLUqbI0R2Ve2RjG0OPv2KaL01tGW4w==", + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/core": "^3.0.0", + "react": "^18.0.0 || ^19.0.0" + } + }, "node_modules/docusaurus-plugin-module-alias": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/docusaurus-plugin-module-alias/-/docusaurus-plugin-module-alias-0.0.2.tgz", diff --git a/package.json b/package.json index 6fd279bd2af..e66666b70e9 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "clsx": "^1.1.1", "concurrently": "^6.2.0", "crowdin": "^3.5.0", + "docusaurus-plugin-copy-page-button": "^0.6.1", "docusaurus-plugin-module-alias": "^0.0.2", "docusaurus-plugin-sass": "^0.2.6", "fs-extra": "^9.1.0", diff --git a/src/theme/DocItem/Layout/index.tsx b/src/theme/DocItem/Layout/index.tsx index 218f71d0fc6..5962da2e4db 100644 --- a/src/theme/DocItem/Layout/index.tsx +++ b/src/theme/DocItem/Layout/index.tsx @@ -13,6 +13,7 @@ import React 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/react'; import DocItemPaginator from '@theme/DocItem/Paginator'; import DocVersionBanner from '@theme/DocVersionBanner'; import DocVersionBadge from '@theme/DocVersionBadge'; @@ -23,6 +24,7 @@ import DocItemContent from '@theme/DocItem/Content'; import ContentVisibility from '@theme/ContentVisibility'; import type {Props} from '@theme/DocItem/Layout'; import styles from '@docusaurus/theme-classic/lib/theme/DocItem/Layout/styles.module.css'; +import copyPageStyles from './styles.module.css'; // CUSTOM CODE import DocDemo from '@components/global/DocDemo'; @@ -86,6 +88,15 @@ export default function DocItemLayout({children, ...props}: Props): JSX.Element
{docTOC.mobile} +
+ +
{children}
diff --git a/src/theme/DocItem/Layout/styles.module.css b/src/theme/DocItem/Layout/styles.module.css new file mode 100644 index 00000000000..d005101a2e1 --- /dev/null +++ b/src/theme/DocItem/Layout/styles.module.css @@ -0,0 +1,21 @@ +.copyPageArticleAction { + display: flex; + justify-content: flex-end; + min-height: 37px; + margin-bottom: 1rem; +} + +.copyPageContainer { + display: inline-block; +} + +.copyPageButton, +.copyPageDropdown { + font-family: var(--ifm-font-family-base); +} + +@media (min-width: 997px) { + .copyPageArticleAction { + display: none; + } +} diff --git a/src/theme/DocSidebar/index.tsx b/src/theme/DocSidebar/index.tsx index 5267a996e0e..c3c3eca2d9c 100644 --- a/src/theme/DocSidebar/index.tsx +++ b/src/theme/DocSidebar/index.tsx @@ -8,10 +8,12 @@ import React, { useEffect } from 'react'; import { useLocation } from '@docusaurus/router'; +import CopyPageButton from 'docusaurus-plugin-copy-page-button/react'; import DocSidebar from '@theme-original/DocSidebar'; import type { Props } from '@theme/DocSidebar'; import Logo from '@theme-original/Logo'; +import styles from './styles.module.css'; export default function DocSidebarWrapper(props: Props): JSX.Element { const location = useLocation(); @@ -28,6 +30,15 @@ export default function DocSidebarWrapper(props: Props): JSX.Element { return ( <> +
+ +
); diff --git a/src/theme/DocSidebar/styles.module.css b/src/theme/DocSidebar/styles.module.css new file mode 100644 index 00000000000..ace251f1511 --- /dev/null +++ b/src/theme/DocSidebar/styles.module.css @@ -0,0 +1,18 @@ +.copyPageAction { + padding: 0 var(--sidebar-spacing-horizontal) 1rem; +} + +.copyPageContainer { + display: block; + width: 100%; +} + +.copyPageButton { + width: 100%; + justify-content: space-between; + font-family: var(--ifm-font-family-base); +} + +.copyPageDropdown { + font-family: var(--ifm-font-family-base); +}