diff --git a/packages/docusaurus-plugin-content-showcase/src/client/index.ts b/packages/docusaurus-plugin-content-showcase/src/client/index.ts
index 065578ba69..823f0a6840 100644
--- a/packages/docusaurus-plugin-content-showcase/src/client/index.ts
+++ b/packages/docusaurus-plugin-content-showcase/src/client/index.ts
@@ -19,8 +19,6 @@ import type {
ShowcaseItem,
} from '@docusaurus/plugin-content-showcase';
-export const clientShowcase = 42;
-
export function filterUsers({
users,
tags,
diff --git a/packages/docusaurus-theme-classic/src/theme-classic.d.ts b/packages/docusaurus-theme-classic/src/theme-classic.d.ts
index ba9ed213db..d28dc02df0 100644
--- a/packages/docusaurus-theme-classic/src/theme-classic.d.ts
+++ b/packages/docusaurus-theme-classic/src/theme-classic.d.ts
@@ -280,13 +280,7 @@ declare module '@theme/Showcase/ShowcaseCard' {
}
declare module '@theme/Showcase/ShowcaseCards' {
- import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase';
-
- export interface Props {
- readonly users: ShowcaseItem[];
- }
-
- export default function ShowcaseCards(props: Props): JSX.Element;
+ export default function ShowcaseCards(): JSX.Element;
}
declare module '@theme/Showcase/ShowcaseTooltip' {
export interface Props {
@@ -318,13 +312,7 @@ declare module '@theme/Showcase/ShowcaseFilterToggle' {
}
declare module '@theme/Showcase/ShowcaseFilters' {
- import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase';
-
- export interface Props {
- readonly users: ShowcaseItem[];
- }
-
- export default function ShowcaseFilters(props: Props): JSX.Element;
+ export default function ShowcaseFilters(): JSX.Element;
}
declare module '@theme/Showcase/OperatorButton' {
diff --git a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx
index ccd0d64502..08d5cd663d 100644
--- a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx
@@ -12,10 +12,10 @@ import {
useFilteredUsers,
sortUsers,
} from '@docusaurus/plugin-content-showcase/client';
+import {useShowcase} from '@docusaurus/theme-common/internal';
import Heading from '@theme/Heading';
import FavoriteIcon from '@theme/Showcase/FavoriteIcon';
import ShowcaseCard from '@theme/Showcase/ShowcaseCard';
-import type {Props} from '@theme/Showcase/ShowcaseCards';
import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase';
import styles from './styles.module.css';
@@ -74,14 +74,16 @@ function NoResultSection() {
);
}
-export default function ShowcaseCards(props: Props): JSX.Element {
- const filteredUsers = useFilteredUsers(props.users);
+export default function ShowcaseCards(): JSX.Element {
+ const users = useShowcase().items;
+
+ const filteredUsers = useFilteredUsers(users);
if (filteredUsers.length === 0) {
return ;
}
- const sortedUsers = sortUsers(props.users);
+ const sortedUsers = sortUsers(users);
const favoriteUsers = sortedUsers.filter((user: ShowcaseItem) =>
user.tags.includes('favorite'),
diff --git a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx
index 19c9cd7ae8..d07971cae0 100644
--- a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx
@@ -14,12 +14,12 @@ import {
Tags,
TagList,
} from '@docusaurus/plugin-content-showcase/client';
+import {useShowcase} from '@docusaurus/theme-common/internal';
import FavoriteIcon from '@theme/Showcase/FavoriteIcon';
import Heading from '@theme/Heading';
import ShowcaseTagSelect from '@theme/Showcase/ShowcaseTagSelect';
import OperatorButton from '@theme/Showcase/OperatorButton';
import ClearAllButton from '@theme/Showcase/ClearAllButton';
-import type {Props} from '@theme/Showcase/ShowcaseFilters';
import type {TagType} from '@docusaurus/plugin-content-showcase';
import styles from './styles.module.css';
@@ -74,8 +74,9 @@ function ShowcaseTagList() {
);
}
-function HeadingText(props: Props) {
- const filteredUsers = useFilteredUsers(props.users);
+function HeadingText() {
+ const users = useShowcase().items;
+ const filteredUsers = useFilteredUsers(users);
const siteCountPlural = useSiteCountPlural();
return (
@@ -96,19 +97,19 @@ function HeadingButtons() {
);
}
-function HeadingRow(props: Props) {
+function HeadingRow() {
return (
-
+
);
}
-export default function ShowcaseFilters(props: Props): ReactNode {
+export default function ShowcaseFilters(): ReactNode {
return (
);
diff --git a/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx b/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx
index 0f2b304f88..5a25d69bf1 100644
--- a/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx
@@ -8,7 +8,7 @@
import Translate, {translate} from '@docusaurus/Translate';
import Link from '@docusaurus/Link';
-import {clientShowcase} from '@docusaurus/plugin-content-showcase/client';
+import {ShowcaseProvider} from '@docusaurus/theme-common/internal';
import Layout from '@theme/Layout';
import Heading from '@theme/Heading';
@@ -40,19 +40,19 @@ function ShowcaseHeader() {
export default function Showcase(props: Props): JSX.Element {
const users = props.content;
return (
-
- {/* eslint-disable-next-line @docusaurus/prefer-docusaurus-heading, @docusaurus/no-untranslated-text */}
- Client showcase API: {clientShowcase}
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/packages/docusaurus-theme-common/src/contexts/showcase.tsx b/packages/docusaurus-theme-common/src/contexts/showcase.tsx
new file mode 100644
index 0000000000..85ffe61c90
--- /dev/null
+++ b/packages/docusaurus-theme-common/src/contexts/showcase.tsx
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) Facebook, Inc. and its 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, {useMemo, type ReactNode, useContext} from 'react';
+import {ReactContextError} from '../utils/reactUtils';
+import type {ShowcaseItems} from '@docusaurus/plugin-content-showcase';
+
+const Context = React.createContext
(null);
+
+function useContextValue(content: ShowcaseItems): ShowcaseItems {
+ return useMemo(
+ () => ({
+ items: content.items,
+ }),
+ [content],
+ );
+}
+
+export function ShowcaseProvider({
+ children,
+ content,
+}: {
+ children: ReactNode;
+ content: ShowcaseItems;
+}): JSX.Element {
+ const contextValue = useContextValue(content);
+ return {children};
+}
+
+export function useShowcase(): ShowcaseItems {
+ const showcase = useContext(Context);
+ if (showcase === null) {
+ throw new ReactContextError('ShowcaseProvider');
+ }
+ return showcase;
+}
diff --git a/packages/docusaurus-theme-common/src/internal.ts b/packages/docusaurus-theme-common/src/internal.ts
index 31f081a621..e9382398ff 100644
--- a/packages/docusaurus-theme-common/src/internal.ts
+++ b/packages/docusaurus-theme-common/src/internal.ts
@@ -26,6 +26,7 @@ export {DocsVersionProvider, useDocsVersion} from './contexts/docsVersion';
export {DocsSidebarProvider, useDocsSidebar} from './contexts/docsSidebar';
export {DocProvider, useDoc, type DocContextValue} from './contexts/doc';
+export {ShowcaseProvider, useShowcase} from './contexts/showcase';
export {
BlogPostProvider,
useBlogPost,