From ddce03a67708249eec129eb36744be460345bd75 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 15 Jun 2021 16:23:44 +0800 Subject: ... --- FrontEnd/src/views/common/button/FlatButton.css | 45 +++++++++++++++++++++++++ FrontEnd/src/views/common/button/FlatButton.tsx | 36 ++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 FrontEnd/src/views/common/button/FlatButton.css create mode 100644 FrontEnd/src/views/common/button/FlatButton.tsx (limited to 'FrontEnd/src/views/common/button') diff --git a/FrontEnd/src/views/common/button/FlatButton.css b/FrontEnd/src/views/common/button/FlatButton.css new file mode 100644 index 00000000..779e3562 --- /dev/null +++ b/FrontEnd/src/views/common/button/FlatButton.css @@ -0,0 +1,45 @@ +.cru-flat-button { + cursor: pointer; + padding: 0.2em 0.5em; + border-radius: 0.2em; +} + +.cru-flat-button:hover:not(.disabled) { + background-color: #e9ecef; +} + +.cru-flat-button.disabled { + 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); +} diff --git a/FrontEnd/src/views/common/button/FlatButton.tsx b/FrontEnd/src/views/common/button/FlatButton.tsx new file mode 100644 index 00000000..0727eb88 --- /dev/null +++ b/FrontEnd/src/views/common/button/FlatButton.tsx @@ -0,0 +1,36 @@ +import React from "react"; +import { useTranslation } from "react-i18next"; + +import { convertI18nText, I18nText } from "@/common"; +import { PaletteColorType } from "@/palette"; + +import "./FlatButton.css"; +import classNames from "classnames"; + +function _FlatButton( + { + text, + color, + onClick, + }: { + text: I18nText; + color?: PaletteColorType; + onClick?: () => void; + }, + ref: React.ForwardedRef +): React.ReactElement | null { + const { t } = useTranslation(); + + return ( + + ); +} + +const FlatButton = React.forwardRef(_FlatButton); +export default FlatButton; -- cgit v1.2.3 From 8c56e3fd388005bcb7aced75b73d7018511ceac8 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 15 Jun 2021 16:41:03 +0800 Subject: ... --- FrontEnd/src/index.css | 53 ------------------------- FrontEnd/src/palette.ts | 43 ++++++++++---------- FrontEnd/src/views/admin/UserAdmin.tsx | 20 +++++----- FrontEnd/src/views/center/TimelineBoard.tsx | 3 -- FrontEnd/src/views/common/button/FlatButton.tsx | 2 +- FrontEnd/src/views/common/button/TextButton.css | 36 +++++++++++++++++ FrontEnd/src/views/common/button/TextButton.tsx | 36 +++++++++++++++++ 7 files changed, 105 insertions(+), 88 deletions(-) create mode 100644 FrontEnd/src/views/common/button/TextButton.css create mode 100644 FrontEnd/src/views/common/button/TextButton.tsx (limited to 'FrontEnd/src/views/common/button') diff --git a/FrontEnd/src/index.css b/FrontEnd/src/index.css index ca0d4829..ff8c1866 100644 --- a/FrontEnd/src/index.css +++ b/FrontEnd/src/index.css @@ -81,59 +81,6 @@ textarea { color: #ffc107; } -.text-button { - background: transparent; - border: none; -} -.text-button.primary { - color: #0d6efd; -} -.text-button.primary:hover { - color: #599bfe; -} -.text-button.secondary { - color: #6c757d; -} -.text-button.secondary:hover { - color: #939ba2; -} -.text-button.success { - color: #198754; -} -.text-button.success:hover { - color: #25c87c; -} -.text-button.info { - color: #0dcaf0; -} -.text-button.info:hover { - color: #54dbf6; -} -.text-button.warning { - color: #ffc107; -} -.text-button.warning:hover { - color: #ffd454; -} -.text-button.danger { - color: #dc3545; -} -.text-button.danger:hover { - color: #e77681; -} -.text-button.light { - color: #f8f9fa; -} -.text-button.light:hover { - color: white; -} -.text-button.dark { - color: #212529; -} -.text-button.dark:hover { - color: #434b53; -} - .touch-action-none { touch-action: none; } diff --git a/FrontEnd/src/palette.ts b/FrontEnd/src/palette.ts index 11b3de85..6385df66 100644 --- a/FrontEnd/src/palette.ts +++ b/FrontEnd/src/palette.ts @@ -19,18 +19,19 @@ export interface PaletteColor { [key: string]: string; } -export interface Palette { - primary: PaletteColor; - primaryEnhance: PaletteColor; - secondary: PaletteColor; - textPrimary: PaletteColor; - textOnPrimary: PaletteColor; - danger: PaletteColor; - success: PaletteColor; - [key: string]: PaletteColor; -} +const paletteColorList = [ + "primary", + "primary-enhance", + "secondary", + "text-primary", + "text-on-primary", + "danger", + "success", +] as const; + +export type PaletteColorType = typeof paletteColorList[number]; -export type PaletteColorType = keyof Palette; +export type Palette = Record; export function generatePaletteColor(color: string): PaletteColor { const c = Color(color); @@ -60,26 +61,24 @@ export function generatePalette(options: { return { primary: generatePaletteColor(p.toString()), - primaryEnhance: generatePaletteColor(pe.toString()), + "primary-enhance": generatePaletteColor(pe.toString()), secondary: generatePaletteColor(s.toString()), - textPrimary: generatePaletteColor("#111111"), - textOnPrimary: generatePaletteColor(p.lightness() > 60 ? "black" : "white"), + "text-primary": generatePaletteColor("#111111"), + "text-on-primary": generatePaletteColor( + p.lightness() > 60 ? "black" : "white" + ), danger: generatePaletteColor("red"), success: generatePaletteColor("green"), }; } export function generatePaletteCSS(palette: Palette): string { - function toSnakeCase(s: string): string { - return s.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`); - } - const colors: [string, string][] = []; - for (const paletteColorName in palette) { - const paletteColor = palette[paletteColorName]; + for (const colorType of paletteColorList) { + const paletteColor = palette[colorType]; for (const variant in paletteColor) { - let key = `--tl-${toSnakeCase(paletteColorName)}`; - if (variant !== "color") key += `-${toSnakeCase(variant)}`; + let key = `--tl-${colorType}`; + if (variant !== "color") key += `-${variant}`; key += "-color"; colors.push([key, paletteColor[variant]]); } diff --git a/FrontEnd/src/views/admin/UserAdmin.tsx b/FrontEnd/src/views/admin/UserAdmin.tsx index 558d3aee..eb141520 100644 --- a/FrontEnd/src/views/admin/UserAdmin.tsx +++ b/FrontEnd/src/views/admin/UserAdmin.tsx @@ -14,6 +14,7 @@ import { UserPermission, } from "@/http/user"; import { Trans, useTranslation } from "react-i18next"; +import TextButton from "../common/button/TextButton"; interface DialogProps { open: boolean; @@ -230,15 +231,16 @@ const UserItem: React.FC = ({ user, on }) => { className={classnames("edit-mask", !editMaskVisible && "d-none")} onClick={() => setEditMaskVisible(false)} > - - - + + + ); diff --git a/FrontEnd/src/views/center/TimelineBoard.tsx b/FrontEnd/src/views/center/TimelineBoard.tsx index a6a60b3d..e0a2d80e 100644 --- a/FrontEnd/src/views/center/TimelineBoard.tsx +++ b/FrontEnd/src/views/center/TimelineBoard.tsx @@ -1,7 +1,6 @@ import React from "react"; import classnames from "classnames"; import { Link } from "react-router-dom"; -import { useTranslation } from "react-i18next"; import { Spinner } from "react-bootstrap"; import { HttpTimelineInfo } from "@/http/timeline"; @@ -220,8 +219,6 @@ interface TimelineBoardUIProps { const TimelineBoardUI: React.FC = (props) => { const { title, timelines, className, editHandler } = props; - const { t } = useTranslation(); - const editable = editHandler != null; const [editing, setEditing] = React.useState(false); diff --git a/FrontEnd/src/views/common/button/FlatButton.tsx b/FrontEnd/src/views/common/button/FlatButton.tsx index 0727eb88..24f47785 100644 --- a/FrontEnd/src/views/common/button/FlatButton.tsx +++ b/FrontEnd/src/views/common/button/FlatButton.tsx @@ -1,11 +1,11 @@ import React from "react"; import { useTranslation } from "react-i18next"; +import classNames from "classnames"; import { convertI18nText, I18nText } from "@/common"; import { PaletteColorType } from "@/palette"; import "./FlatButton.css"; -import classNames from "classnames"; function _FlatButton( { diff --git a/FrontEnd/src/views/common/button/TextButton.css b/FrontEnd/src/views/common/button/TextButton.css new file mode 100644 index 00000000..dc5abaaa --- /dev/null +++ b/FrontEnd/src/views/common/button/TextButton.css @@ -0,0 +1,36 @@ +.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 new file mode 100644 index 00000000..2014158a --- /dev/null +++ b/FrontEnd/src/views/common/button/TextButton.tsx @@ -0,0 +1,36 @@ +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, + }: { + text: I18nText; + color?: PaletteColorType; + onClick?: () => void; + }, + ref: React.ForwardedRef +): React.ReactElement | null { + const { t } = useTranslation(); + + return ( + + ); +} + +const TextButton = React.forwardRef(_TextButton); +export default TextButton; -- cgit v1.2.3 From 9b2de947e6d16fe8478a3e8316ae4a1136e50948 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 15 Jun 2021 16:46:07 +0800 Subject: ... --- FrontEnd/src/views/common/button/FlatButton.css | 3 +++ 1 file changed, 3 insertions(+) (limited to 'FrontEnd/src/views/common/button') diff --git a/FrontEnd/src/views/common/button/FlatButton.css b/FrontEnd/src/views/common/button/FlatButton.css index 779e3562..522563b9 100644 --- a/FrontEnd/src/views/common/button/FlatButton.css +++ b/FrontEnd/src/views/common/button/FlatButton.css @@ -2,6 +2,9 @@ cursor: pointer; padding: 0.2em 0.5em; border-radius: 0.2em; + border: none; + background-color: transparent; + transition: all 0.6s; } .cru-flat-button:hover:not(.disabled) { -- cgit v1.2.3 From 57a4aa9bc47d3d38f66819f01f41ab10e9673667 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 15 Jun 2021 16:46:12 +0800 Subject: ... --- FrontEnd/src/views/common/button/FlatButton.tsx | 7 ++++++- FrontEnd/src/views/common/button/TextButton.tsx | 7 ++++++- FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx | 13 +++++-------- 3 files changed, 17 insertions(+), 10 deletions(-) (limited to 'FrontEnd/src/views/common/button') diff --git a/FrontEnd/src/views/common/button/FlatButton.tsx b/FrontEnd/src/views/common/button/FlatButton.tsx index 24f47785..f5349765 100644 --- a/FrontEnd/src/views/common/button/FlatButton.tsx +++ b/FrontEnd/src/views/common/button/FlatButton.tsx @@ -12,10 +12,14 @@ function _FlatButton( text, color, onClick, + className, + style, }: { text: I18nText; color?: PaletteColorType; onClick?: () => void; + className?: string; + style?: React.CSSProperties; }, ref: React.ForwardedRef ): React.ReactElement | null { @@ -24,8 +28,9 @@ function _FlatButton( return ( diff --git a/FrontEnd/src/views/common/button/TextButton.tsx b/FrontEnd/src/views/common/button/TextButton.tsx index 2014158a..1e2b4873 100644 --- a/FrontEnd/src/views/common/button/TextButton.tsx +++ b/FrontEnd/src/views/common/button/TextButton.tsx @@ -12,10 +12,14 @@ function _TextButton( text, color, onClick, + className, + style, }: { text: I18nText; color?: PaletteColorType; onClick?: () => void; + className?: string; + style?: React.CSSProperties; }, ref: React.ForwardedRef ): React.ReactElement | null { @@ -24,8 +28,9 @@ function _TextButton( return ( diff --git a/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx b/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx index 685e17be..005da933 100644 --- a/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx +++ b/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx @@ -6,7 +6,7 @@ import { Prompt } from "react-router"; import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline"; -import FlatButton from "../common/FlatButton"; +import FlatButton from "../common/button/FlatButton"; import TabPages from "../common/TabPages"; import TimelinePostBuilder from "@/services/TimelinePostBuilder"; import ConfirmDialog from "../common/ConfirmDialog"; @@ -106,8 +106,9 @@ const MarkdownPostEdit: React.FC = ({ ) : ( <> { if (canLeave) { onClose(); @@ -115,12 +116,8 @@ const MarkdownPostEdit: React.FC = ({ setShowLeaveConfirmDialog(true); } }} - > - {t("operationDialog.cancel")} - - - {t("timeline.send")} - + /> + {canSend && } ) } -- cgit v1.2.3 From 0be1f595578153765d081cdb4478140da9cb8fc9 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 15 Jun 2021 17:14:04 +0800 Subject: ... --- FrontEnd/src/views/common/Card.css | 2 +- FrontEnd/src/views/common/button/FlatButton.tsx | 2 +- FrontEnd/src/views/common/button/TextButton.tsx | 2 +- .../src/views/timeline-common/TimelinePostView.tsx | 25 +++++++++++----------- FrontEnd/src/views/timeline-common/index.css | 8 ++++++- 5 files changed, 22 insertions(+), 17 deletions(-) (limited to 'FrontEnd/src/views/common/button') diff --git a/FrontEnd/src/views/common/Card.css b/FrontEnd/src/views/common/Card.css index daf4e12b..17c3c779 100644 --- a/FrontEnd/src/views/common/Card.css +++ b/FrontEnd/src/views/common/Card.css @@ -2,7 +2,7 @@ border: 1px solid; border-color: #e9ecef; border-radius: 8px; - background: #f8f9fa; + background: #fefeff; transition: all 0.3s; } diff --git a/FrontEnd/src/views/common/button/FlatButton.tsx b/FrontEnd/src/views/common/button/FlatButton.tsx index f5349765..6351971a 100644 --- a/FrontEnd/src/views/common/button/FlatButton.tsx +++ b/FrontEnd/src/views/common/button/FlatButton.tsx @@ -17,7 +17,7 @@ function _FlatButton( }: { text: I18nText; color?: PaletteColorType; - onClick?: () => void; + onClick?: (e: React.MouseEvent) => void; className?: string; style?: React.CSSProperties; }, diff --git a/FrontEnd/src/views/common/button/TextButton.tsx b/FrontEnd/src/views/common/button/TextButton.tsx index 1e2b4873..1a2bac94 100644 --- a/FrontEnd/src/views/common/button/TextButton.tsx +++ b/FrontEnd/src/views/common/button/TextButton.tsx @@ -17,7 +17,7 @@ function _TextButton( }: { text: I18nText; color?: PaletteColorType; - onClick?: () => void; + onClick?: (e: React.MouseEvent) => void; className?: string; style?: React.CSSProperties; }, diff --git a/FrontEnd/src/views/timeline-common/TimelinePostView.tsx b/FrontEnd/src/views/timeline-common/TimelinePostView.tsx index f7b81478..e9dd3443 100644 --- a/FrontEnd/src/views/timeline-common/TimelinePostView.tsx +++ b/FrontEnd/src/views/timeline-common/TimelinePostView.tsx @@ -8,6 +8,8 @@ import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline"; import { pushAlert } from "@/services/alert"; import UserAvatar from "../common/user/UserAvatar"; +import Card from "../common/Card"; +import FlatButton from "../common/button/FlatButton"; import TimelineLine from "./TimelineLine"; import TimelinePostContentView from "./TimelinePostContentView"; import TimelinePostDeleteConfirmDialog from "./TimelinePostDeleteConfirmDialog"; @@ -60,7 +62,7 @@ const TimelinePostView: React.FC = (props) => { style={style} > -
+ {post.editable ? ( = (props) => {
{operationMaskVisible ? (
{ setOperationMaskVisible(false); }} > - { setDialog("changeproperty"); e.stopPropagation(); }} - > - {t("changeProperty")} - - + { setDialog("delete"); e.stopPropagation(); }} - > - {t("delete")} - + />
) : null} - + {dialog === "delete" ? ( { diff --git a/FrontEnd/src/views/timeline-common/index.css b/FrontEnd/src/views/timeline-common/index.css index 89399961..f35a86c9 100644 --- a/FrontEnd/src/views/timeline-common/index.css +++ b/FrontEnd/src/views/timeline-common/index.css @@ -154,6 +154,7 @@ animation: 0.6s forwards; opacity: 0; } + @media (max-width: 575.98px) { .timeline-item-card { padding-left: 3em; @@ -205,9 +206,14 @@ max-height: 100px; } -.mask { +.timeline-post-item-options-mask { background: rgba(255, 255, 255, 0.8); z-index: 100; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; } .timeline-sync-state-badge { -- cgit v1.2.3