Skip to content

Commit ca035d8

Browse files
authored
feat(theme): add theme layout stable CSS classes (#10945)
1 parent c10a18d commit ca035d8

File tree

8 files changed

+83
-13
lines changed

8 files changed

+83
-13
lines changed

packages/docusaurus-theme-classic/src/theme/AnnouncementBar/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
*/
77

88
import React, {type ReactNode} from 'react';
9-
import {useThemeConfig} from '@docusaurus/theme-common';
9+
import clsx from 'clsx';
10+
import {ThemeClassNames, useThemeConfig} from '@docusaurus/theme-common';
1011
import {useAnnouncementBar} from '@docusaurus/theme-common/internal';
1112
import AnnouncementBarCloseButton from '@theme/AnnouncementBar/CloseButton';
1213
import AnnouncementBarContent from '@theme/AnnouncementBar/Content';
@@ -22,7 +23,10 @@ export default function AnnouncementBar(): ReactNode {
2223
const {backgroundColor, textColor, isCloseable} = announcementBar!;
2324
return (
2425
<div
25-
className={styles.announcementBar}
26+
className={clsx(
27+
ThemeClassNames.announcementBar.container,
28+
styles.announcementBar,
29+
)}
2630
style={{backgroundColor, color: textColor}}
2731
role="banner">
2832
{isCloseable && <div className={styles.announcementBarPlaceholder} />}

packages/docusaurus-theme-classic/src/theme/Footer/Layout/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import React, {type ReactNode} from 'react';
99
import clsx from 'clsx';
10+
import {ThemeClassNames} from '@docusaurus/theme-common';
1011
import type {Props} from '@theme/Footer/Layout';
1112

1213
export default function FooterLayout({
@@ -17,7 +18,7 @@ export default function FooterLayout({
1718
}: Props): ReactNode {
1819
return (
1920
<footer
20-
className={clsx('footer', {
21+
className={clsx(ThemeClassNames.layout.footer.container, 'footer', {
2122
'footer--dark': style === 'dark',
2223
})}>
2324
<div className="container container-fluid">

packages/docusaurus-theme-classic/src/theme/Footer/Links/MultiColumn/index.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import React, {type ReactNode} from 'react';
99
import clsx from 'clsx';
10+
import {ThemeClassNames} from '@docusaurus/theme-common';
1011
import LinkItem from '@theme/Footer/LinkItem';
1112
import type {Props} from '@theme/Footer/Links/MultiColumn';
1213

@@ -30,7 +31,12 @@ function ColumnLinkItem({item}: {item: ColumnItemType}) {
3031

3132
function Column({column}: {column: ColumnType}) {
3233
return (
33-
<div className={clsx('col footer__col', column.className)}>
34+
<div
35+
className={clsx(
36+
ThemeClassNames.layout.footer.column,
37+
'col footer__col',
38+
column.className,
39+
)}>
3440
<div className="footer__title">{column.title}</div>
3541
<ul className="footer__items clean-list">
3642
{column.items.map((item, i) => (

packages/docusaurus-theme-classic/src/theme/Layout/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export default function Layout(props: Props): ReactNode {
4848
<div
4949
id={SkipToContentFallbackId}
5050
className={clsx(
51+
ThemeClassNames.layout.main,
5152
ThemeClassNames.wrapper.main,
5253
styles.mainWrapper,
5354
wrapperClassName,

packages/docusaurus-theme-classic/src/theme/Navbar/Content/index.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
*/
77

88
import React, {type ReactNode} from 'react';
9-
import {useThemeConfig, ErrorCauseBoundary} from '@docusaurus/theme-common';
9+
import clsx from 'clsx';
10+
import {
11+
useThemeConfig,
12+
ErrorCauseBoundary,
13+
ThemeClassNames,
14+
} from '@docusaurus/theme-common';
1015
import {
1116
splitNavbarItems,
1217
useNavbarMobileSidebar,
@@ -55,8 +60,20 @@ function NavbarContentLayout({
5560
}) {
5661
return (
5762
<div className="navbar__inner">
58-
<div className="navbar__items">{left}</div>
59-
<div className="navbar__items navbar__items--right">{right}</div>
63+
<div
64+
className={clsx(
65+
ThemeClassNames.layout.navbar.containerLeft,
66+
'navbar__items',
67+
)}>
68+
{left}
69+
</div>
70+
<div
71+
className={clsx(
72+
ThemeClassNames.layout.navbar.containerRight,
73+
'navbar__items navbar__items--right',
74+
)}>
75+
{right}
76+
</div>
6077
</div>
6178
);
6279
}

packages/docusaurus-theme-classic/src/theme/Navbar/Layout/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import React, {type ComponentProps, type ReactNode} from 'react';
99
import clsx from 'clsx';
10-
import {useThemeConfig} from '@docusaurus/theme-common';
10+
import {ThemeClassNames, useThemeConfig} from '@docusaurus/theme-common';
1111
import {
1212
useHideableNavbar,
1313
useNavbarMobileSidebar,
@@ -43,6 +43,7 @@ export default function NavbarLayout({children}: Props): ReactNode {
4343
description: 'The ARIA label for the main navigation',
4444
})}
4545
className={clsx(
46+
ThemeClassNames.layout.navbar.container,
4647
'navbar',
4748
'navbar--fixed-top',
4849
hideOnScroll && [

packages/docusaurus-theme-classic/src/theme/Navbar/MobileSidebar/Layout/index.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,40 @@
88
import React, {type ReactNode} from 'react';
99
import clsx from 'clsx';
1010
import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal';
11+
import {ThemeClassNames} from '@docusaurus/theme-common';
1112
import type {Props} from '@theme/Navbar/MobileSidebar/Layout';
1213

14+
function NavbarMobileSidebarPanel({children}: {children: ReactNode}) {
15+
return (
16+
<div
17+
className={clsx(
18+
ThemeClassNames.layout.navbar.mobileSidebar.panel,
19+
'navbar-sidebar__item menu',
20+
)}>
21+
{children}
22+
</div>
23+
);
24+
}
25+
1326
export default function NavbarMobileSidebarLayout({
1427
header,
1528
primaryMenu,
1629
secondaryMenu,
1730
}: Props): ReactNode {
1831
const {shown: secondaryMenuShown} = useNavbarSecondaryMenu();
1932
return (
20-
<div className="navbar-sidebar">
33+
<div
34+
className={clsx(
35+
ThemeClassNames.layout.navbar.mobileSidebar.container,
36+
'navbar-sidebar',
37+
)}>
2138
{header}
2239
<div
2340
className={clsx('navbar-sidebar__items', {
2441
'navbar-sidebar__items--show-secondary': secondaryMenuShown,
2542
})}>
26-
<div className="navbar-sidebar__item menu">{primaryMenu}</div>
27-
<div className="navbar-sidebar__item menu">{secondaryMenu}</div>
43+
<NavbarMobileSidebarPanel>{primaryMenu}</NavbarMobileSidebarPanel>
44+
<NavbarMobileSidebarPanel>{secondaryMenu}</NavbarMobileSidebarPanel>
2845
</div>
2946
</div>
3047
);

packages/docusaurus-theme-common/src/utils/ThemeClassNames.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,18 @@ export const ThemeClassNames = {
2727

2828
mdxPage: 'mdx-page',
2929
},
30+
31+
// TODO Docusaurus v4: remove old classes?
3032
wrapper: {
31-
main: 'main-wrapper',
33+
main: 'main-wrapper', // replaced by theme-layout-main
3234
// TODO these wrapper class names are now quite useless
3335
// TODO do breaking change later in 3.0
3436
// we already add plugin name/id class on <html>: that's enough
3537
blogPages: 'blog-wrapper',
3638
docsPages: 'docs-wrapper',
3739
mdxPages: 'mdx-wrapper',
3840
},
41+
3942
common: {
4043
editThisPage: 'theme-edit-this-page',
4144
lastUpdated: 'theme-last-updated',
@@ -47,8 +50,28 @@ export const ThemeClassNames = {
4750

4851
admonitionType: (type: string) => `theme-admonition-${type}`,
4952
},
53+
54+
announcementBar: {
55+
container: 'theme-announcement-bar',
56+
},
57+
5058
layout: {
51-
// TODO add other stable classNames here
59+
navbar: {
60+
container: 'theme-layout-navbar',
61+
containerLeft: 'theme-layout-navbar-left',
62+
containerRight: 'theme-layout-navbar-right',
63+
mobileSidebar: {
64+
container: 'theme-layout-navbar-sidebar',
65+
panel: 'theme-layout-navbar-sidebar-panel',
66+
},
67+
},
68+
main: {
69+
container: 'theme-layout-main',
70+
},
71+
footer: {
72+
container: 'theme-layout-footer',
73+
column: 'theme-layout-footer-column',
74+
},
5275
},
5376

5477
/**

0 commit comments

Comments
 (0)