File size: 1,558 Bytes
853f6aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import * as React from "react";

import styles from "./button.module.scss";
import { CSSProperties } from "react";
import clsx from "clsx";

export type ButtonType = "primary" | "danger" | null;

export function IconButton(props: {

  onClick?: () => void;

  icon?: JSX.Element;

  type?: ButtonType;

  text?: string;

  bordered?: boolean;

  shadow?: boolean;

  className?: string;

  title?: string;

  disabled?: boolean;

  tabIndex?: number;

  autoFocus?: boolean;

  style?: CSSProperties;

  aria?: string;

}) {
  return (
    <button

      className={clsx(

        "clickable",

        styles["icon-button"],

        {

          [styles.border]: props.bordered,

          [styles.shadow]: props.shadow,

        },

        styles[props.type ?? ""],

        props.className,

      )}

      onClick={props.onClick}

      title={props.title}

      disabled={props.disabled}

      role="button"

      tabIndex={props.tabIndex}

      autoFocus={props.autoFocus}

      style={props.style}

      aria-label={props.aria}

    >

      {props.icon && (

        <div

          aria-label={props.text || props.title}

          className={clsx(styles["icon-button-icon"], {

            "no-dark": props.type === "primary",

          })}

        >

          {props.icon}

        </div>

      )}



      {props.text && (

        <div

          aria-label={props.text || props.title}

          className={styles["icon-button-text"]}

        >

          {props.text}

        </div>

      )}

    </button>
  );
}