aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/views/common/button
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-07-01 20:38:28 +0800
committerGitHub <noreply@github.com>2021-07-01 20:38:28 +0800
commiteb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c (patch)
tree5afe2d654a51c8712aa30a419f6edfa19fe1a234 /FrontEnd/src/views/common/button
parent825aac426d87180e62530321320fbb012efbd897 (diff)
parentb456334cedad566bf2c4c66481ec928dc59eda7d (diff)
downloadtimeline-eb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c.tar.gz
timeline-eb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c.tar.bz2
timeline-eb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c.zip
Merge pull request #649 from crupest/drop-bootstrap
Drop bootstrap!!!
Diffstat (limited to 'FrontEnd/src/views/common/button')
-rw-r--r--FrontEnd/src/views/common/button/Button.css51
-rw-r--r--FrontEnd/src/views/common/button/Button.tsx33
-rw-r--r--FrontEnd/src/views/common/button/FlatButton.css38
-rw-r--r--FrontEnd/src/views/common/button/FlatButton.tsx31
-rw-r--r--FrontEnd/src/views/common/button/LoadingButton.tsx28
-rw-r--r--FrontEnd/src/views/common/button/TextButton.css36
-rw-r--r--FrontEnd/src/views/common/button/TextButton.tsx41
-rw-r--r--FrontEnd/src/views/common/button/common.ts35
8 files changed, 155 insertions, 138 deletions
diff --git a/FrontEnd/src/views/common/button/Button.css b/FrontEnd/src/views/common/button/Button.css
new file mode 100644
index 00000000..c34176f6
--- /dev/null
+++ b/FrontEnd/src/views/common/button/Button.css
@@ -0,0 +1,51 @@
+.cru-button:not(.outline) {
+ color: var(--cru-theme-t-color);
+ cursor: pointer;
+ padding: 0.2em 0.5em;
+ border-radius: 0.2em;
+ border: none;
+ transition: all 0.5s;
+ background-color: var(--cru-theme-color);
+}
+
+.cru-button:not(.outline):hover {
+ background-color: var(--cru-theme-f1-color);
+}
+
+.cru-button:not(.outline):active {
+ background-color: var(--cru-theme-f2-color);
+}
+
+.cru-button:not(.outline):disabled {
+ background-color: var(--cru-disable-color);
+ cursor: auto;
+}
+
+.cru-button.outline {
+ color: var(--cru-theme-color);
+ border: var(--cru-theme-color) 1px solid;
+ cursor: pointer;
+ padding: 0.2em 0.5em;
+ border-radius: 0.2em;
+ transition: all 0.6s;
+ background-color: white;
+}
+
+.cru-button.outline:hover {
+ color: var(--cru-theme-f1-color);
+ border-color: var(--cru-theme-f1-color);
+ background-color: var(--cru-background-color);
+}
+
+.cru-button.outline:active {
+ color: var(--cru-theme-f2-color);
+ border-color: var(--cru-theme-f2-color);
+ background-color: var(--cru-background-1-color);
+}
+
+.cru-button.outline:disabled {
+ color: var(--cru-disable-color);
+ border-color: var(--cru-disable-color);
+ background-color: white;
+ cursor: auto;
+}
diff --git a/FrontEnd/src/views/common/button/Button.tsx b/FrontEnd/src/views/common/button/Button.tsx
new file mode 100644
index 00000000..a39ef8a7
--- /dev/null
+++ b/FrontEnd/src/views/common/button/Button.tsx
@@ -0,0 +1,33 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+
+import { calculateProps, CommonButtonProps } from "./common";
+
+import "./Button.css";
+
+function _Button(
+ props: CommonButtonProps & {
+ outline?: boolean;
+ customButtonClassName?: string;
+ },
+ ref: React.ForwardedRef<HTMLButtonElement>
+): React.ReactElement | null {
+ const { t } = useTranslation();
+
+ const { customButtonClassName, outline, ...otherProps } = props;
+
+ const { newProps, children } = calculateProps(
+ otherProps,
+ customButtonClassName ?? "cru-button" + (outline ? " outline" : ""),
+ t
+ );
+
+ return (
+ <button ref={ref} {...newProps}>
+ {children}
+ </button>
+ );
+}
+
+const Button = React.forwardRef(_Button);
+export default Button;
diff --git a/FrontEnd/src/views/common/button/FlatButton.css b/FrontEnd/src/views/common/button/FlatButton.css
index 522563b9..f0d33153 100644
--- a/FrontEnd/src/views/common/button/FlatButton.css
+++ b/FrontEnd/src/views/common/button/FlatButton.css
@@ -5,44 +5,14 @@
border: none;
background-color: transparent;
transition: all 0.6s;
-}
-
-.cru-flat-button:hover:not(.disabled) {
- background-color: #e9ecef;
+ color: var(--cru-theme-color);
}
.cru-flat-button.disabled {
+ color: var(--cru-theme-l1-color);
cursor: default;
}
-.cru-flat-button.primary {
- color: var(--tl-primary-color);
-}
-
-.cru-flat-button.primary.disabled {
- color: var(--tl-primary-lighter-color);
-}
-
-.cru-flat-button.secondary {
- color: var(--tl-secondary-color);
-}
-
-.cru-flat-button.secondary.disabled {
- color: var(--tl-secondary-lighter-color);
-}
-
-.cru-flat-button.success {
- color: var(--tl-success-color);
-}
-
-.cru-flat-button.success.disabled {
- color: var(--tl-success-lighter-color);
-}
-
-.cru-flat-button.danger {
- color: var(--tl-danger-color);
-}
-
-.cru-flat-button.danger.disabled {
- color: var(--tl-danger-ligher-color);
+.cru-flat-button:hover:not(.disabled) {
+ background-color: #e9ecef;
}
diff --git a/FrontEnd/src/views/common/button/FlatButton.tsx b/FrontEnd/src/views/common/button/FlatButton.tsx
index 6351971a..266ea908 100644
--- a/FrontEnd/src/views/common/button/FlatButton.tsx
+++ b/FrontEnd/src/views/common/button/FlatButton.tsx
@@ -1,39 +1,16 @@
import React from "react";
-import { useTranslation } from "react-i18next";
-import classNames from "classnames";
-import { convertI18nText, I18nText } from "@/common";
-import { PaletteColorType } from "@/palette";
+import { CommonButtonProps } from "./common";
+import Button from "./Button";
import "./FlatButton.css";
function _FlatButton(
- {
- text,
- color,
- onClick,
- className,
- style,
- }: {
- text: I18nText;
- color?: PaletteColorType;
- onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
- className?: string;
- style?: React.CSSProperties;
- },
+ props: CommonButtonProps,
ref: React.ForwardedRef<HTMLButtonElement>
): React.ReactElement | null {
- const { t } = useTranslation();
-
return (
- <button
- ref={ref}
- className={classNames("cru-flat-button", color ?? "primary", className)}
- onClick={onClick}
- style={style}
- >
- {convertI18nText(text, t)}
- </button>
+ <Button ref={ref} customButtonClassName="cru-flat-button" {...props} />
);
}
diff --git a/FrontEnd/src/views/common/button/LoadingButton.tsx b/FrontEnd/src/views/common/button/LoadingButton.tsx
new file mode 100644
index 00000000..a7e34f91
--- /dev/null
+++ b/FrontEnd/src/views/common/button/LoadingButton.tsx
@@ -0,0 +1,28 @@
+import React from "react";
+
+import { CommonButtonProps } from "./common";
+import Button from "./Button";
+import Spinner from "../Spinner";
+
+const LoadingButton: React.FC<{ loading?: boolean } & CommonButtonProps> = ({
+ loading,
+ disabled,
+ color,
+ ...otherProps
+}) => {
+ return (
+ <Button
+ color={color}
+ outline
+ disabled={disabled || loading}
+ {...otherProps}
+ >
+ {otherProps.children}
+ {loading ? (
+ <Spinner className="cru-align-text-bottom ms-1" color={color} />
+ ) : null}
+ </Button>
+ );
+};
+
+export default LoadingButton;
diff --git a/FrontEnd/src/views/common/button/TextButton.css b/FrontEnd/src/views/common/button/TextButton.css
deleted file mode 100644
index dc5abaaa..00000000
--- a/FrontEnd/src/views/common/button/TextButton.css
+++ /dev/null
@@ -1,36 +0,0 @@
-.cru-text-button {
- background: transparent;
- border: none;
-}
-
-.cru-text-button.primary {
- color: var(--tl-primary-color);
-}
-
-.cru-text-button.primary:hover {
- color: var(--tl-primary-lighter-color);
-}
-
-.cru-text-button.secondary {
- color: var(--tl-secondary-color);
-}
-
-.cru-text-button.secondary:hover {
- color: var(--tl-secondary-lighter-color);
-}
-
-.cru-text-button.success {
- color: var(--tl-success-color);
-}
-
-.cru-text-button.success:hover {
- color: var(--tl-success-lighter-color);
-}
-
-.cru-text-button.danger {
- color: var(--tl-danger-color);
-}
-
-.cru-text-button.danger:hover {
- color: var(--tl-danger-lighter-color);
-}
diff --git a/FrontEnd/src/views/common/button/TextButton.tsx b/FrontEnd/src/views/common/button/TextButton.tsx
deleted file mode 100644
index 1a2bac94..00000000
--- a/FrontEnd/src/views/common/button/TextButton.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import React from "react";
-import { useTranslation } from "react-i18next";
-import classNames from "classnames";
-
-import { convertI18nText, I18nText } from "@/common";
-import { PaletteColorType } from "@/palette";
-
-import "./TextButton.css";
-
-function _TextButton(
- {
- text,
- color,
- onClick,
- className,
- style,
- }: {
- text: I18nText;
- color?: PaletteColorType;
- onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
- className?: string;
- style?: React.CSSProperties;
- },
- ref: React.ForwardedRef<HTMLButtonElement>
-): React.ReactElement | null {
- const { t } = useTranslation();
-
- return (
- <button
- ref={ref}
- className={classNames("cru-text-button", color ?? "primary", className)}
- onClick={onClick}
- style={style}
- >
- {convertI18nText(text, t)}
- </button>
- );
-}
-
-const TextButton = React.forwardRef(_TextButton);
-export default TextButton;
diff --git a/FrontEnd/src/views/common/button/common.ts b/FrontEnd/src/views/common/button/common.ts
new file mode 100644
index 00000000..0d84bae0
--- /dev/null
+++ b/FrontEnd/src/views/common/button/common.ts
@@ -0,0 +1,35 @@
+import React from "react";
+import classNames from "classnames";
+import { TFunction } from "i18next";
+
+import { convertI18nText, I18nText } from "@/common";
+import { PaletteColorType } from "@/palette";
+
+export type CommonButtonProps = {
+ text?: I18nText;
+ color?: PaletteColorType;
+} & React.ButtonHTMLAttributes<HTMLButtonElement>;
+
+export function calculateProps(
+ props: CommonButtonProps,
+ buttonClassName: string,
+ t: TFunction
+): {
+ children: React.ReactNode;
+ newProps: React.ButtonHTMLAttributes<HTMLButtonElement>;
+} {
+ const { text, color, className, children, ...otherProps } = props;
+ const newProps = {
+ className: classNames(
+ buttonClassName,
+ color != null ? "cru-" + color : "cru-primary",
+ className
+ ),
+ ...otherProps,
+ };
+
+ return {
+ children: text != null ? convertI18nText(text, t) : children,
+ newProps: newProps,
+ };
+}