mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-21 21:16:59 +02:00
refactor(v2): extract out into standalone components (#1017)
This commit is contained in:
parent
a364aa531c
commit
e3d57d244b
6 changed files with 99 additions and 69 deletions
|
@ -2,8 +2,11 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {Link} from 'react-router-dom';
|
import {Link} from 'react-router-dom';
|
||||||
import Helmet from 'react-helmet';
|
import Helmet from 'react-helmet';
|
||||||
import styles from './styles.css';
|
|
||||||
import Layout from '@theme/Layout'; // eslint-disable-line
|
import Layout from '@theme/Layout'; // eslint-disable-line
|
||||||
|
import DocsPaginator from '@theme/DocsPaginator'; // eslint-disable-line
|
||||||
|
|
||||||
|
import styles from './styles.css';
|
||||||
|
|
||||||
export default class Docs extends React.Component {
|
export default class Docs extends React.Component {
|
||||||
renderSidebar(metadata, docsSidebars, docsMetadatas) {
|
renderSidebar(metadata, docsSidebars, docsMetadatas) {
|
||||||
|
@ -62,22 +65,8 @@ export default class Docs extends React.Component {
|
||||||
{version && <meta name="docsearch:version" content={version} />}
|
{version && <meta name="docsearch:version" content={version} />}
|
||||||
</Helmet>
|
</Helmet>
|
||||||
<div>{this.renderSidebar(metadata, docsSidebars, docsMetadatas)}</div>
|
<div>{this.renderSidebar(metadata, docsSidebars, docsMetadatas)}</div>
|
||||||
<div>
|
|
||||||
{metadata.previous &&
|
|
||||||
docsMetadatas[metadata.previous] && (
|
|
||||||
<Link to={docsMetadatas[metadata.previous].permalink}>
|
|
||||||
<span>← {metadata.previous_title}</span>
|
|
||||||
</Link>
|
|
||||||
)}
|
|
||||||
{' ⚫️ '}
|
|
||||||
{metadata.next &&
|
|
||||||
docsMetadatas[metadata.next] && (
|
|
||||||
<Link to={docsMetadatas[metadata.next].permalink}>
|
|
||||||
<span>{metadata.next_title} →</span>
|
|
||||||
</Link>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div className={styles.mainContainer}>{this.props.children}</div>
|
<div className={styles.mainContainer}>{this.props.children}</div>
|
||||||
|
<DocsPaginator docsMetadatas={docsMetadatas} metadata={metadata} />
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
24
v2/lib/theme/DocsPaginator/index.js
Normal file
24
v2/lib/theme/DocsPaginator/index.js
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import React from 'react';
|
||||||
|
import {Link} from 'react-router-dom';
|
||||||
|
|
||||||
|
export default class DocsPaginator extends React.Component {
|
||||||
|
render() {
|
||||||
|
const {docsMetadatas, metadata} = this.props;
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{metadata.previous &&
|
||||||
|
docsMetadatas[metadata.previous] && (
|
||||||
|
<Link to={docsMetadatas[metadata.previous].permalink}>
|
||||||
|
<span>← {metadata.previous_title}</span>
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{metadata.next &&
|
||||||
|
docsMetadatas[metadata.next] && (
|
||||||
|
<Link to={docsMetadatas[metadata.next].permalink}>
|
||||||
|
<span>{metadata.next_title} →</span>
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
25
v2/lib/theme/Footer/index.js
Normal file
25
v2/lib/theme/Footer/index.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import React from 'react';
|
||||||
|
import {Link} from 'react-router-dom';
|
||||||
|
|
||||||
|
import styles from './styles.css';
|
||||||
|
|
||||||
|
function Footer(props) {
|
||||||
|
const {pagesMetadatas, docsMetadatas, location} = props;
|
||||||
|
const docsFlatMetadatas = Object.values(docsMetadatas);
|
||||||
|
const routeLinks = [...pagesMetadatas, ...docsFlatMetadatas].map(
|
||||||
|
data =>
|
||||||
|
data.permalink !== location.pathname && (
|
||||||
|
<li key={data.permalink}>
|
||||||
|
<Link to={data.permalink}>{data.permalink}</Link>
|
||||||
|
</li>
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.footer}>
|
||||||
|
<ul className={styles.routeLinks}>{routeLinks}</ul>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Footer;
|
39
v2/lib/theme/Footer/styles.css
Normal file
39
v2/lib/theme/Footer/styles.css
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
.footer {
|
||||||
|
color: #777;
|
||||||
|
margin-top: 30px;
|
||||||
|
padding: 10px 15px;
|
||||||
|
height: 20px;
|
||||||
|
text-align: center;
|
||||||
|
border-top: 1px solid #e6e6e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.routeLinks {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.routeLinks li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.routeLinks li a {
|
||||||
|
color: inherit;
|
||||||
|
margin: 3px;
|
||||||
|
padding: 3px 7px;
|
||||||
|
text-decoration: none;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.routeLinks li a.selected,
|
||||||
|
.routeLinks li a:hover {
|
||||||
|
border-color: rgba(175, 47, 47, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.routeLinks li a.selected {
|
||||||
|
border-color: rgba(175, 47, 47, 0.2);
|
||||||
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {Link} from 'react-router-dom';
|
import Footer from '@theme/Footer'; // eslint-disable-line
|
||||||
import styles from './styles.css';
|
|
||||||
|
|
||||||
/* eslint-disable react/prefer-stateless-function */
|
/* eslint-disable react/prefer-stateless-function */
|
||||||
export default class Layout extends React.Component {
|
export default class Layout extends React.Component {
|
||||||
|
@ -11,21 +10,14 @@ export default class Layout extends React.Component {
|
||||||
docsMetadatas = {},
|
docsMetadatas = {},
|
||||||
location,
|
location,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const docsFlatMetadatas = Object.values(docsMetadatas);
|
|
||||||
const routeLinks = [...pagesMetadatas, ...docsFlatMetadatas].map(
|
|
||||||
data =>
|
|
||||||
data.permalink !== location.pathname && (
|
|
||||||
<li key={data.permalink}>
|
|
||||||
<Link to={data.permalink}>{data.permalink}</Link>
|
|
||||||
</li>
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{children}
|
{children}
|
||||||
<div className={styles.footer}>
|
<Footer
|
||||||
<ul className={styles.routeLinks}>{routeLinks}</ul>
|
docsMetadatas={docsMetadatas}
|
||||||
</div>
|
location={location}
|
||||||
|
pagesMetadatas={pagesMetadatas}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
.footer {
|
|
||||||
color: #777;
|
|
||||||
margin-top: 30px;
|
|
||||||
padding: 10px 15px;
|
|
||||||
height: 20px;
|
|
||||||
text-align: center;
|
|
||||||
border-top: 1px solid #e6e6e6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.routeLinks {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.routeLinks li {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.routeLinks li a {
|
|
||||||
color: inherit;
|
|
||||||
margin: 3px;
|
|
||||||
padding: 3px 7px;
|
|
||||||
text-decoration: none;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.routeLinks li a.selected,
|
|
||||||
.routeLinks li a:hover {
|
|
||||||
border-color: rgba(175, 47, 47, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.routeLinks li a.selected {
|
|
||||||
border-color: rgba(175, 47, 47, 0.2);
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue