-
-
Notifications
You must be signed in to change notification settings - Fork 8.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(theme-classic): split theme footer into smaller components +…
… swizzle config (#6894) Co-authored-by: Joshua Chen <[email protected]>
- Loading branch information
Showing
14 changed files
with
416 additions
and
180 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
packages/docusaurus-theme-classic/src/theme/Footer/Copyright/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
/** | ||
* 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 from 'react'; | ||
import type {Props} from '@theme/Footer/Copyright'; | ||
|
||
export default function FooterCopyright({copyright}: Props): JSX.Element { | ||
return ( | ||
<div | ||
className="footer__copyright" | ||
// Developer provided the HTML, so assume it's safe. | ||
// eslint-disable-next-line react/no-danger | ||
dangerouslySetInnerHTML={{ | ||
__html: copyright, | ||
}} | ||
/> | ||
); | ||
} |
34 changes: 34 additions & 0 deletions
34
packages/docusaurus-theme-classic/src/theme/Footer/Layout/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
/** | ||
* 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 from 'react'; | ||
import clsx from 'clsx'; | ||
import type {Props} from '@theme/Footer/Layout'; | ||
|
||
export default function FooterLayout({ | ||
style, | ||
links, | ||
logo, | ||
copyright, | ||
}: Props): JSX.Element { | ||
return ( | ||
<footer | ||
className={clsx('footer', { | ||
'footer--dark': style === 'dark', | ||
})}> | ||
<div className="container container-fluid"> | ||
{links} | ||
{(logo || copyright) && ( | ||
<div className="footer__bottom text--center"> | ||
{logo && <div className="margin-bottom--sm">{logo}</div>} | ||
{copyright} | ||
</div> | ||
)} | ||
</div> | ||
</footer> | ||
); | ||
} |
38 changes: 38 additions & 0 deletions
38
packages/docusaurus-theme-classic/src/theme/Footer/LinkItem/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/** | ||
* 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 from 'react'; | ||
|
||
import Link from '@docusaurus/Link'; | ||
import useBaseUrl from '@docusaurus/useBaseUrl'; | ||
import isInternalUrl from '@docusaurus/isInternalUrl'; | ||
import IconExternalLink from '@theme/IconExternalLink'; | ||
import type {Props} from '@theme/Footer/LinkItem'; | ||
|
||
export default function FooterLinkItem({item}: Props): JSX.Element { | ||
const {to, href, label, prependBaseUrlToHref, ...props} = item; | ||
const toUrl = useBaseUrl(to); | ||
const normalizedHref = useBaseUrl(href, {forcePrependBaseUrl: true}); | ||
|
||
return ( | ||
<Link | ||
className="footer__link-item" | ||
{...(href | ||
? { | ||
href: prependBaseUrlToHref ? normalizedHref : href, | ||
} | ||
: { | ||
to: toUrl, | ||
})} | ||
{...props}> | ||
<span> | ||
{label} | ||
{href && !isInternalUrl(href) && <IconExternalLink />} | ||
</span> | ||
</Link> | ||
); | ||
} |
53 changes: 53 additions & 0 deletions
53
packages/docusaurus-theme-classic/src/theme/Footer/Links/MultiColumn/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
/** | ||
* 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 from 'react'; | ||
import type {Props} from '@theme/Footer/Links/MultiColumn'; | ||
import LinkItem from '@theme/Footer/LinkItem'; | ||
|
||
type ColumnType = Props['columns'][number]; | ||
type ColumnItemType = ColumnType['items'][number]; | ||
|
||
function ColumnLinkItem({item}: {item: ColumnItemType}) { | ||
return item.html ? ( | ||
<li | ||
className="footer__item" | ||
// Developer provided the HTML, so assume it's safe. | ||
// eslint-disable-next-line react/no-danger | ||
dangerouslySetInnerHTML={{ | ||
__html: item.html, | ||
}} | ||
/> | ||
) : ( | ||
<li key={item.href || item.to} className="footer__item"> | ||
<LinkItem item={item} /> | ||
</li> | ||
); | ||
} | ||
|
||
function Column({column}: {column: ColumnType}) { | ||
return ( | ||
<div className="col footer__col"> | ||
<div className="footer__title">{column.title}</div> | ||
<ul className="footer__items"> | ||
{column.items.map((item, i) => ( | ||
<ColumnLinkItem key={i} item={item} /> | ||
))} | ||
</ul> | ||
</div> | ||
); | ||
} | ||
|
||
export default function FooterLinksMultiColumn({columns}: Props): JSX.Element { | ||
return ( | ||
<div className="row footer__links"> | ||
{columns.map((column, i) => ( | ||
<Column key={i} column={column} /> | ||
))} | ||
</div> | ||
); | ||
} |
44 changes: 44 additions & 0 deletions
44
packages/docusaurus-theme-classic/src/theme/Footer/Links/Simple/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/** | ||
* 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 from 'react'; | ||
import type {Props} from '@theme/Footer/Links/Simple'; | ||
import LinkItem from '@theme/Footer/LinkItem'; | ||
|
||
function Separator() { | ||
return <span className="footer__link-separator">·</span>; | ||
} | ||
|
||
function SimpleLinkItem({item}: {item: Props['links'][number]}) { | ||
return item.html ? ( | ||
<span | ||
className="footer__link-item" | ||
// Developer provided the HTML, so assume it's safe. | ||
// eslint-disable-next-line react/no-danger | ||
dangerouslySetInnerHTML={{ | ||
__html: item.html, | ||
}} | ||
/> | ||
) : ( | ||
<LinkItem item={item} /> | ||
); | ||
} | ||
|
||
export default function FooterLinksSimple({links}: Props): JSX.Element { | ||
return ( | ||
<div className="footer__links text--center"> | ||
<div className="footer__links"> | ||
{links.map((item, i) => ( | ||
<React.Fragment key={i}> | ||
<SimpleLinkItem item={item} /> | ||
{links.length !== i + 1 && <Separator />} | ||
</React.Fragment> | ||
))} | ||
</div> | ||
</div> | ||
); | ||
} |
21 changes: 21 additions & 0 deletions
21
packages/docusaurus-theme-classic/src/theme/Footer/Links/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
/** | ||
* 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 from 'react'; | ||
|
||
import {isMultiColumnFooterLinks} from '@docusaurus/theme-common'; | ||
import type {Props} from '@theme/Footer/Links'; | ||
import FooterLinksMultiColumn from '@theme/Footer/Links/MultiColumn'; | ||
import FooterLinksSimple from '@theme/Footer/Links/Simple'; | ||
|
||
export default function FooterLinks({links}: Props): JSX.Element { | ||
return isMultiColumnFooterLinks(links) ? ( | ||
<FooterLinksMultiColumn columns={links} /> | ||
) : ( | ||
<FooterLinksSimple links={links} /> | ||
); | ||
} |
Oops, something went wrong.