* refactor: ♻️ refactor isHosted && type clean up Change-Id: I4dfbad8a07607432801de78920ce42bf81e46498 * refactor: ♻️ code clean up Change-Id: I8f487a33d332a2acaff84397a97371b56ace28a1 * feat: 💄 lint Change-Id: I776b1a5e249bdb542f8e6da7cb2277821cf91094 * feat: ✨ ci type Change-Id: I486dde7bf60321238e9a394c40ad8cdb8bfc54c8 * feat: some code sugession Change-Id: I4761d057344b95a98e99068d312a42292977875b
83 lines
1.8 KiB
TypeScript
83 lines
1.8 KiB
TypeScript
import { ExpandedIcon, MoreIcon } from "outline-icons";
|
|
import * as React from "react";
|
|
import styled from "styled-components";
|
|
import Flex from "~/components/Flex";
|
|
|
|
export type SidebarButtonProps = {
|
|
title: React.ReactNode;
|
|
image: React.ReactNode;
|
|
minHeight?: number;
|
|
rounded?: boolean;
|
|
showDisclosure?: boolean;
|
|
showMoreMenu?: boolean;
|
|
onClick: React.MouseEventHandler<HTMLButtonElement>;
|
|
};
|
|
|
|
const SidebarButton = React.forwardRef<HTMLButtonElement, SidebarButtonProps>(
|
|
(
|
|
{
|
|
showDisclosure,
|
|
showMoreMenu,
|
|
image,
|
|
title,
|
|
minHeight = 0,
|
|
...rest
|
|
}: SidebarButtonProps,
|
|
ref
|
|
) => (
|
|
<Wrapper
|
|
justify="space-between"
|
|
align="center"
|
|
as="button"
|
|
minHeight={minHeight}
|
|
{...rest}
|
|
ref={ref}
|
|
>
|
|
<Title gap={4} align="center">
|
|
{image}
|
|
{title}
|
|
</Title>
|
|
{showDisclosure && <ExpandedIcon color="currentColor" />}
|
|
{showMoreMenu && <MoreIcon color="currentColor" />}
|
|
</Wrapper>
|
|
)
|
|
);
|
|
|
|
const Title = styled(Flex)`
|
|
color: ${(props) => props.theme.text};
|
|
flex-shrink: 1;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
`;
|
|
|
|
const Wrapper = styled(Flex)<{ minHeight: number }>`
|
|
padding: 8px 4px;
|
|
font-size: 15px;
|
|
font-weight: 500;
|
|
border-radius: 4px;
|
|
margin: 8px;
|
|
color: ${(props) => props.theme.textTertiary};
|
|
border: 0;
|
|
background: none;
|
|
flex-shrink: 0;
|
|
min-height: ${(props) => props.minHeight}px;
|
|
|
|
-webkit-appearance: none;
|
|
text-decoration: none;
|
|
text-align: left;
|
|
overflow: hidden;
|
|
user-select: none;
|
|
cursor: pointer;
|
|
|
|
&:active,
|
|
&:hover,
|
|
&[aria-expanded="true"] {
|
|
color: ${(props) => props.theme.sidebarText};
|
|
transition: background 100ms ease-in-out;
|
|
background: ${(props) => props.theme.sidebarActiveBackground};
|
|
}
|
|
`;
|
|
|
|
export default SidebarButton;
|