Skip to content
Snippets Groups Projects
CategoryButton.tsx 3.76 KiB
Newer Older
insert's avatar
insert committed
import { ChevronRight, LinkExternal } from "@styled-icons/boxicons-regular";
insert's avatar
insert committed
import styled, { css } from "styled-components";

import { Children } from "../../../types/Preact";

insert's avatar
insert committed
interface BaseProps {
insert's avatar
insert committed
    readonly hover?: boolean;
    readonly account?: boolean;
insert's avatar
insert committed
    readonly disabled?: boolean;
insert's avatar
insert committed
    readonly largeDescription?: boolean;
}

const CategoryBase = styled.div<BaseProps>`
    /*height: 54px;*/
nizune's avatar
nizune committed
    padding: 9.8px 12px;
    border-radius: 6px;
    margin-bottom: 10px;
insert's avatar
insert committed
    color: var(--foreground);
    background: var(--secondary-header);
    gap: 12px;
    display: flex;
    align-items: center;
    flex-direction: row;

    > svg {
        flex-shrink: 0;
    }

insert's avatar
insert committed
    .content {
        display: flex;
        flex-grow: 1;
        flex-direction: column;
        font-weight: 600;
        font-size: 14px;

        .title {
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-line-clamp: 2;
            overflow: hidden;
        }

insert's avatar
insert committed
        .description {
insert's avatar
insert committed
            ${(props) =>
                props.largeDescription
                    ? css`
                          font-size: 14px;
                      `
                    : css`
                          font-size: 11px;
                      `}

insert's avatar
insert committed
            font-weight: 400;
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-line-clamp: 3;
            overflow: hidden;
insert's avatar
insert committed

            a:hover {
                text-decoration: underline;
            }
        }
    }

    ${(props) =>
insert's avatar
insert committed
        props.hover &&
insert's avatar
insert committed
        css`
            cursor: pointer;
            opacity: 1;
insert's avatar
insert committed
            transition: 0.1s ease background-color;

            &:hover {
                background: var(--secondary-background);
insert's avatar
insert committed
            }
        `}
insert's avatar
insert committed

    ${(props) =>
        props.disabled &&
        css`
insert's avatar
insert committed
            opacity: 0.4;
nizune's avatar
nizune committed
            /*.content,
insert's avatar
insert committed
            .action {
                color: var(--tertiary-foreground);
nizune's avatar
nizune committed
            }*/

            .action {
                font-size: 14px;
            }
        `}
    
    ${(props) =>
        props.account &&
        css`
            height: 54px;

            .content {
nizune's avatar
nizune committed
                text-overflow: ellipsis;
                overflow: hidden;
                white-space: nowrap;
                .title {
                    text-transform: uppercase;
                    font-size: 12px;
                    color: var(--secondary-foreground);
                }

                .description {
                    font-size: 15px;

                    text-overflow: ellipsis;
                    white-space: nowrap;
                    overflow: hidden;
                }
            }
insert's avatar
insert committed
interface Props extends BaseProps {
    icon?: Children;
    children?: Children;
insert's avatar
insert committed
    description?: Children;

    onClick?: () => void;
insert's avatar
insert committed
    action?: "chevron" | "external" | Children;
insert's avatar
insert committed
export default function CategoryButton({
    icon,
    children,
    description,
    account,
insert's avatar
insert committed
    disabled,
insert's avatar
insert committed
    onClick,
insert's avatar
insert committed
    hover,
insert's avatar
insert committed
    action,
}: Props) {
    return (
insert's avatar
insert committed
        <CategoryBase
insert's avatar
insert committed
            hover={hover || typeof onClick !== "undefined"}
insert's avatar
insert committed
            onClick={onClick}
            disabled={disabled}
            account={account}>
insert's avatar
insert committed
            {icon}
            <div class="content">
                <div className="title">{children}</div>
insert's avatar
insert committed

insert's avatar
insert committed
                <div className="description">{description}</div>
            </div>
            <div class="action">
                {typeof action === "string" ? (
insert's avatar
insert committed
                    action === "chevron" ? (
                        <ChevronRight size={24} />
                    ) : (
                        <LinkExternal size={20} />
insert's avatar
insert committed
                ) : (
                    action
                )}
            </div>
        </CategoryBase>
    );
insert's avatar
insert committed
}