documentation-site/components/layout.jsx (176 lines of code) (raw):

/* Copyright (c) Uber Technologies, Inc. This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. */ // import * as React from "react"; import { Block } from "baseui/block"; import { useRouter } from "next/router"; import { Button, KIND, SIZE } from "baseui/button"; import TableOfContents from "./table-of-contents"; import { themedStyled } from "../pages/_app"; import Sidebar from "./sidebar"; import HeaderNavigation from "./header-navigation"; import Footer from "./footer"; import PencilIcon from "./pencil-icon"; import Routes from "../routes"; import DirectionContext from "../components/direction-context"; import SkipToContent from "./skip-to-content"; const GH_URL = "https://github.com/uber/baseweb/edit/master/documentation-site/pages"; function findByPath(o, path) { if (!path) return; if (o.itemId === path) { return o; } var result, p; for (p in o) { if (o[p] && typeof o[p] === "object") { result = findByPath(o[p], path); if (result) { return result; } } } return result; } const TOCWrapper = themedStyled("div", ({ $theme }) => ({ display: "none", "@media screen and (min-width: 1340px)": { display: "block", maxWidth: "16em", }, })); const SidebarWrapper = themedStyled( "nav", ({ $theme, $isOpen, $hideSideNavigation }) => ({ display: $isOpen ? "block" : "none", paddingTop: $theme.sizing.scale700, marginLeft: $theme.sizing.scale800, marginRight: $theme.sizing.scale800, [$theme.mediaQuery.medium]: { display: $hideSideNavigation ? "none" : "block", maxWidth: "16em", }, }) ); const ContentWrapper = themedStyled( "main", ({ $theme, $isSidebarOpen, $maxWidth }) => ({ position: "relative", boxSizing: "border-box", display: $isSidebarOpen ? "none" : "block", paddingLeft: $theme.sizing.scale800, paddingRight: $theme.sizing.scale800, width: "100%", outline: "none", maxWidth: $maxWidth ? $maxWidth : "40em", [$theme.mediaQuery.medium]: { display: "block", maxWidth: $maxWidth ? $maxWidth : "40em", }, }) ); const Layout = ({ toggleTheme, toggleDirection, children, hideSideNavigation, maxContentWidth, }) => { const [sidebarOpen, setSidebarOpen] = React.useState(false); const router = useRouter(); let path = router.pathname || ""; // strip the query string path = path.split("?")[0]; if (path && path.endsWith("/")) { path = path.slice(0, -1); } const route = findByPath(Routes, path); let isGitHubEditDisabled; let githubUrl; if (!path || !route) { isGitHubEditDisabled = true; } else { isGitHubEditDisabled = route.isGitHubEditDisabled; if (route.components) { githubUrl = `${GH_URL}${path}/index.mdx`; } else { githubUrl = `${GH_URL}${path}.mdx`; } } return ( <DirectionContext.Consumer> {(direction) => ( <React.Fragment> <SkipToContent /> <HeaderNavigation toggleSidebar={() => setSidebarOpen(!sidebarOpen)} toggleTheme={toggleTheme} toggleDirection={toggleDirection} /> <Block backgroundColor="backgroundPrimary" color="contentPrimary" marginTop="scale300" display="flex" paddingTop="scale400" justifyContent="center" > <SidebarWrapper aria-label="primary" $isOpen={sidebarOpen} $hideSideNavigation={!!hideSideNavigation} onClick={() => sidebarOpen && setSidebarOpen(false)} > <Sidebar path={path} /> </SidebarWrapper> <ContentWrapper id="docSearch-content" role="main" tabIndex="-1" $isSidebarOpen={sidebarOpen} $maxWidth={maxContentWidth} > {isGitHubEditDisabled ? null : ( <Block display={["none", "block"]} position="absolute" top="-10px" overrides={{ Block: { style: { [direction === "rtl" ? "left" : "right"]: 0, [direction === "rtl" ? "right" : "left"]: "auto", }, }, }} > <Button startEnhancer={() => ( <PencilIcon size={16} color="#666666" /> )} $as="a" href={githubUrl} target="_blank" size={SIZE.compact} kind={KIND.tertiary} > Edit this page </Button> </Block> )} {children} </ContentWrapper> <TOCWrapper> <TableOfContents content={React.Children.toArray(children)} /> </TOCWrapper> </Block> <Footer /> </React.Fragment> )} </DirectionContext.Consumer> ); }; export default Layout;