documentation-site/components/sidebar.jsx (68 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 { withStyle } from "baseui";
import {
Navigation,
StyledNavItem,
StyledNavLink,
} from "baseui/side-navigation";
import Link from "next/link";
import Routes from "../routes";
const CustomStyledNavItem = withStyle(
StyledNavItem,
({ $theme, $active, $hasItemId, $level }) => ({
paddingTop: $theme.sizing.scale200,
paddingBottom: $theme.sizing.scale200,
...($theme.name.startsWith("dark") && $active
? {
background: $theme.colors.backgroundSecondary,
}
: {}),
...(!$hasItemId || $level === 1
? {
textTransform: "uppercase",
...($level === 1
? $theme.typography.font350
: $theme.typography.font250),
}
: {}),
})
);
const removeSlash = (path) => path && path.replace(/\/$/, "");
const CustomNavItem = ({
item,
onSelect,
onClick,
onKeyDown,
...restProps
}) => <CustomStyledNavItem $hasItemId={!!item.itemId} {...restProps} />;
const CustomNavLink = (props) => {
return props.href ? (
<Link href={props.href} legacyBehavior>
<StyledNavLink {...props} />
</Link>
) : (
<StyledNavLink {...props} />
);
};
const activePredicate = (item, location) =>
(location && removeSlash(location) === removeSlash(item.itemId)) ||
(!location && item.itemId === "/");
function Sidebar({ path }) {
return (
<Navigation
activeItemId={path}
activePredicate={activePredicate}
items={Routes}
overrides={{
NavItem: CustomNavItem,
NavLink: CustomNavLink,
}}
/>
);
}
export default Sidebar;