icon button

This commit is contained in:
Max S 2024-07-18 19:18:55 +02:00
parent 157e858762
commit 9aa4dc8b27
5 changed files with 145 additions and 4 deletions

View File

@ -0,0 +1,98 @@
@import "@Themes/constants.scss";
.root {
cursor: pointer;
border-radius: var(--button-icon-button-radius, 8px);
svg {
width: 24px;
min-width: 24px;
stroke: var(--button-icon-button-default-default);
}
&:hover {
svg {
stroke: var(--button-icon-button-default-hovered);
}
}
&.neutral {
background: var(--button-icon-button-neutral-default);
svg {
stroke: var(--button-icon-button-default-default);
}
&:hover {
background: var(--button-icon-button-neutral-hovered);
svg {
stroke: var(--button-icon-button-default-hovered);
}
}
}
&.primary {
background: var(--button-icon-button-primary-default);
svg {
stroke: var(--button-icon-button-primary-contrast);
}
&:hover {
background: var(--button-icon-button-primary-hovered);
}
}
&.error {
background: var(--button-icon-button-error-default);
svg {
stroke: var(--button-icon-button-error-contrast);
}
&:hover {
background: var(--button-icon-button-error-hovered);
}
}
&.success {
background: var(--button-icon-button-success-default);
svg {
stroke: var(--button-icon-button-success-contrast);
}
&:hover {
background: var(--button-icon-button-success-hovered);
}
}
&.warning {
background: var(--button-icon-button-warning-default);
svg {
stroke: var(--button-icon-button-warning-contrast);
}
&:hover {
background: var(--button-icon-button-warning-hovered);
}
}
&.info {
background: var(--button-icon-button-info-default);
svg {
stroke: var(--button-icon-button-info-contrast);
}
&:hover {
background: var(--button-icon-button-info-hovered);
}
}
&.disabled {
cursor: default;
opacity: var(--opacity-disabled, 0.3);
}
}

View File

@ -0,0 +1,32 @@
import classNames from "classnames";
import React from "react";
import classes from "./classes.module.scss";
export enum EIconButtonVariant {
DEFAULT = "default",
NEUTRAL = "neutral",
PRIMARY = "primary",
ERROR = "error",
SUCCESS = "success",
WARNING = "warning",
INFO = "info",
}
type IProps = {
icon: React.ReactNode;
onClick?: React.MouseEventHandler<HTMLSpanElement> | undefined;
variant?: EIconButtonVariant;
disabled?: boolean;
className?: string;
};
export default function IconButton(props: IProps) {
const { icon, onClick, className, variant = EIconButtonVariant.DEFAULT, disabled = false } = props;
return (
<span onClick={onClick} className={classNames(classes["root"], className, classes[variant], disabled && classes["disabled"])}>
{icon}
</span>
);
}

View File

@ -5,6 +5,7 @@ import React from "react";
import Typography, { ETypo } from "../Typography"; import Typography, { ETypo } from "../Typography";
import { XMarkIcon } from "@heroicons/react/24/outline"; import { XMarkIcon } from "@heroicons/react/24/outline";
import IconButton, { EIconButtonVariant } from "../IconButton";
type IProps = { type IProps = {
className?: string; className?: string;
@ -45,7 +46,7 @@ export default function Modal(props: IProps) {
)}> )}>
<div className={classes["header"]}> <div className={classes["header"]}>
{title && <Typography typo={ETypo.TITLE_H4}> {title}</Typography>} {title && <Typography typo={ETypo.TITLE_H4}> {title}</Typography>}
<XMarkIcon width={24} onClick={onClose} /> <IconButton variant={EIconButtonVariant.NEUTRAL} onClick={onClose} icon={<XMarkIcon/>}/>
</div> </div>
<div className={classNames(classes["children"], className)}>{children}</div> <div className={classNames(classes["children"], className)}>{children}</div>

View File

@ -6,13 +6,13 @@ import Tag, { ETagColor, ETagVariant } from "@Front/Components/DesignSystem/Tag"
import Typography, { ETypo } from "@Front/Components/DesignSystem/Typography"; import Typography, { ETypo } from "@Front/Components/DesignSystem/Typography";
import Tabs from "@Front/Components/Elements/Tabs"; import Tabs from "@Front/Components/Elements/Tabs";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import { ArrowLongLeftIcon, ArrowLongRightIcon } from "@heroicons/react/24/outline"; import { ArrowLongLeftIcon, ArrowLongRightIcon, XMarkIcon } from "@heroicons/react/24/outline";
import { useCallback, useMemo, useState } from "react"; import { useCallback, useMemo, useState } from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import useOpenable from "@Front/Hooks/useOpenable"; import useOpenable from "@Front/Hooks/useOpenable";
import Modal from "@Front/Components/DesignSystem/Modal"; import Modal from "@Front/Components/DesignSystem/Modal";
import Confirm from "@Front/Components/DesignSystem/OldModal/Confirm"; import IconButton, { EIconButtonVariant } from "@Front/Components/DesignSystem/IconButton";
export default function DesignSystem() { export default function DesignSystem() {
const { isOpen, open, close } = useOpenable(); const { isOpen, open, close } = useOpenable();
@ -281,6 +281,16 @@ export default function DesignSystem() {
Info Info
</Button> </Button>
</div> </div>
<div className={classes["rows"]}>
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.DEFAULT} />
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.NEUTRAL} />
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.PRIMARY} />
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.ERROR} />
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.SUCCESS} />
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.WARNING} />
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.INFO} />
<IconButton icon={<XMarkIcon />} variant={EIconButtonVariant.INFO} disabled />
</div>
</div> </div>
</div> </div>
</DefaultTemplate> </DefaultTemplate>

View File

@ -565,7 +565,7 @@
--modal-spacing: var(--spacing-md); --modal-spacing: var(--spacing-md);
--navigation-radius: var(--radius-none); --navigation-radius: var(--radius-none);
--notification-radius: var(--radius-minimal); --notification-radius: var(--radius-minimal);
--opacity-disabled: 1.875rem; --opacity-disabled: 0.3;
--radius-none: 0px; --radius-none: 0px;
--radius-minimal: var(--radius-md); --radius-minimal: var(--radius-md);
--radius-rounded: var(--radius-lg); --radius-rounded: var(--radius-lg);