From 538d6830a0022b49b99695095d85e567b0c86e71 Mon Sep 17 00:00:00 2001 From: crupest Date: Sun, 30 Jul 2023 23:47:53 +0800 Subject: ... --- .../src/pages/timeline/ConnectionStatusBadge.css | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 FrontEnd/src/pages/timeline/ConnectionStatusBadge.css (limited to 'FrontEnd/src/pages/timeline/ConnectionStatusBadge.css') diff --git a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css new file mode 100644 index 00000000..7fe83b9b --- /dev/null +++ b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css @@ -0,0 +1,36 @@ +.connection-status-badge { + font-size: 0.8em; + border-radius: 5px; + padding: 0.1em 1em; + background-color: #eaf2ff; +} +.connection-status-badge::before { + width: 10px; + height: 10px; + border-radius: 50%; + display: inline-block; + content: ""; + margin-right: 0.6em; +} +.connection-status-badge.success { + color: #006100; +} +.connection-status-badge.success::before { + background-color: #006100; +} + +.connection-status-badge.warning { + color: #e4a700; +} + +.connection-status-badge.warning::before { + background-color: #e4a700; +} + +.connection-status-badge.danger { + color: #fd1616; +} + +.connection-status-badge.danger::before { + background-color: #fd1616; +} -- cgit v1.2.3 From bac55126dc853662bfb9dcdb6ba9e1616c73e660 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 15 Aug 2023 17:29:33 +0800 Subject: ... --- FrontEnd/src/pages/timeline/ConnectionStatusBadge.css | 12 +++++++----- FrontEnd/src/pages/timeline/Timeline.css | 4 +++- FrontEnd/src/pages/timeline/Timeline.tsx | 2 +- FrontEnd/src/pages/timeline/TimelineCard.css | 5 +++-- FrontEnd/src/pages/timeline/TimelineCard.tsx | 1 + FrontEnd/src/pages/timeline/TimelinePostCreateView.css | 4 +++- FrontEnd/src/views/common/Card.css | 8 ++++++-- FrontEnd/src/views/common/Card.tsx | 9 ++++++++- FrontEnd/src/views/common/button/Button.css | 2 +- FrontEnd/src/views/common/button/LoadingButton.css | 8 +------- FrontEnd/src/views/common/menu/Menu.css | 8 ++++---- FrontEnd/src/views/common/menu/Menu.tsx | 6 ++++-- FrontEnd/src/views/common/menu/PopupMenu.css | 4 ++-- FrontEnd/src/views/common/menu/PopupMenu.tsx | 8 +++++++- FrontEnd/src/views/common/theme.css | 4 +--- 15 files changed, 52 insertions(+), 33 deletions(-) (limited to 'FrontEnd/src/pages/timeline/ConnectionStatusBadge.css') diff --git a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css index 7fe83b9b..fc01484e 100644 --- a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css +++ b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css @@ -2,8 +2,8 @@ font-size: 0.8em; border-radius: 5px; padding: 0.1em 1em; - background-color: #eaf2ff; } + .connection-status-badge::before { width: 10px; height: 10px; @@ -12,11 +12,13 @@ content: ""; margin-right: 0.6em; } + .connection-status-badge.success { - color: #006100; + color: var(--cru-create-color); } + .connection-status-badge.success::before { - background-color: #006100; + background-color: var(--cru-create-color); } .connection-status-badge.warning { @@ -28,9 +30,9 @@ } .connection-status-badge.danger { - color: #fd1616; + color: var(--cru-danger-color); } .connection-status-badge.danger::before { - background-color: #fd1616; + background-color: var(--cru-danger-color); } diff --git a/FrontEnd/src/pages/timeline/Timeline.css b/FrontEnd/src/pages/timeline/Timeline.css index ba5f7b04..656374e9 100644 --- a/FrontEnd/src/pages/timeline/Timeline.css +++ b/FrontEnd/src/pages/timeline/Timeline.css @@ -1,5 +1,6 @@ -.timeline { +.timeline-container { --timeline-shadow-color: #00000080; + --timeline-card-shadow: 2px 1px 10px -2px var(--timeline-shadow-color); --timeline-post-line-color: #eadd2c; --timeline-post-line-shadow: 2px 1px 10px -1px var(--timeline-shadow-color); --timeline-post-card-background-color: hsl(0, 0%, 100%); @@ -18,6 +19,7 @@ z-index: 0; position: relative; width: 100%; + padding-top: 10px; } @keyframes timeline-line-node { diff --git a/FrontEnd/src/pages/timeline/Timeline.tsx b/FrontEnd/src/pages/timeline/Timeline.tsx index 3c9d73bf..73e621c1 100644 --- a/FrontEnd/src/pages/timeline/Timeline.tsx +++ b/FrontEnd/src/pages/timeline/Timeline.tsx @@ -156,7 +156,7 @@ export function Timeline(props: TimelineProps) { return
Error.
; } return ( -
+
{timeline && ( { containerRef?: Ref; color?: ThemeColor; + noBackground?: boolean; } export default function Card({ color, + noBackground, className, children, containerRef, @@ -19,7 +21,12 @@ export default function Card({ return (
{children} diff --git a/FrontEnd/src/views/common/button/Button.css b/FrontEnd/src/views/common/button/Button.css index b5a4e2f5..da13c47b 100644 --- a/FrontEnd/src/views/common/button/Button.css +++ b/FrontEnd/src/views/common/button/Button.css @@ -57,7 +57,7 @@ border-color: var(--cru-button-active-color); } -.cru-button.outline:not(.cru-loading-button):disabled { +.cru-button.outline:disabled { color: var(--cru-button-disabled-color); border-color: var(--cru-button-disabled-color); cursor: auto; diff --git a/FrontEnd/src/views/common/button/LoadingButton.css b/FrontEnd/src/views/common/button/LoadingButton.css index 0a7e4a3a..63e8948b 100644 --- a/FrontEnd/src/views/common/button/LoadingButton.css +++ b/FrontEnd/src/views/common/button/LoadingButton.css @@ -3,12 +3,6 @@ align-items: center; } -.cru-loading-button:disabled { - color: var(--cru-surface-on-color); - border-color: var(--cru-surface-on-color); - cursor: not-allowed; -} - .cru-loading-button-spinner { margin-left: 0.5em; -} \ No newline at end of file +} diff --git a/FrontEnd/src/views/common/menu/Menu.css b/FrontEnd/src/views/common/menu/Menu.css index db0b7432..9b0f55bf 100644 --- a/FrontEnd/src/views/common/menu/Menu.css +++ b/FrontEnd/src/views/common/menu/Menu.css @@ -7,12 +7,12 @@ padding: 0.5em 1.5em; cursor: pointer; transition: all 0.5s; - color: var(--cru-key-color); + color: var(--cru-button-normal-color); } .cru-menu-item:hover { - color: var(--cru-key-on-color); - background-color: var(--cru-key-color); + color: white; + background-color: var(--cru-button-normal-color); } .cru-menu-item-icon { @@ -21,5 +21,5 @@ .cru-menu-divider { border-width: 0; - border-top: 1px solid var(--cru-key-color); + border-top: 1px solid var(--cru-button-normal-color); } \ No newline at end of file diff --git a/FrontEnd/src/views/common/menu/Menu.tsx b/FrontEnd/src/views/common/menu/Menu.tsx index a9ebfedf..65cd55b4 100644 --- a/FrontEnd/src/views/common/menu/Menu.tsx +++ b/FrontEnd/src/views/common/menu/Menu.tsx @@ -21,6 +21,7 @@ export type MenuItem = export type MenuItems = MenuItem[]; export type MenuProps = { + color?: ThemeColor; items: MenuItems; onItemClicked?: () => void; className?: string; @@ -28,6 +29,7 @@ export type MenuProps = { }; export default function Menu({ + color, items, onItemClicked, className, @@ -37,7 +39,7 @@ export default function Menu({ return (
{items.map((item, index) => { @@ -48,7 +50,7 @@ export default function Menu({ return (
{ onClick(); onItemClicked?.(); diff --git a/FrontEnd/src/views/common/menu/PopupMenu.css b/FrontEnd/src/views/common/menu/PopupMenu.css index 38171ffd..b8dfe265 100644 --- a/FrontEnd/src/views/common/menu/PopupMenu.css +++ b/FrontEnd/src/views/common/menu/PopupMenu.css @@ -1,6 +1,6 @@ .cru-popup-menu-menu-container { z-index: 1040; border-radius: 5px; - border: var(--cru-primary-color) 1px solid; - background-color: var(--cru-surface-color); + border: var(--cru-button-normal-color) 1px solid; + background-color: var(--cru-background-color); } diff --git a/FrontEnd/src/views/common/menu/PopupMenu.tsx b/FrontEnd/src/views/common/menu/PopupMenu.tsx index 7ac12755..035f5602 100644 --- a/FrontEnd/src/views/common/menu/PopupMenu.tsx +++ b/FrontEnd/src/views/common/menu/PopupMenu.tsx @@ -7,9 +7,12 @@ import { useClickOutside } from "@/utilities/hooks"; import Menu, { MenuItems } from "./Menu"; +import { ThemeColor } from "../common"; + import "./PopupMenu.css"; export interface PopupMenuProps { + color?: ThemeColor; items: MenuItems; children?: ReactNode; containerClassName?: string; @@ -17,6 +20,7 @@ export interface PopupMenuProps { } export default function PopupMenu({ + color, items, children, containerClassName, @@ -48,7 +52,9 @@ export default function PopupMenu({ createPortal(
diff --git a/FrontEnd/src/views/common/theme.css b/FrontEnd/src/views/common/theme.css index c8819b19..f672d7a8 100644 --- a/FrontEnd/src/views/common/theme.css +++ b/FrontEnd/src/views/common/theme.css @@ -6,8 +6,6 @@ --cru-border-radius: 4px; --cru-card-border-radius: 4px; - - --cru-secondary-text-color: var(--cru-surface-on-color); } /* theme colors */ @@ -55,7 +53,7 @@ --cru-button-danger-hover-color: hsl(0, 100%, 60%); --cru-button-danger-focus-color: hsl(0, 100%, 60%); --cru-button-danger-active-color: hsl(0, 100%, 70%); - --cru-button-disabled-color: hsl(0, 0, 80%); + --cru-button-disabled-color: hsl(0, 0%, 50%); /* push button colors */ --cru-push-button-text-color: #ffffff; --cru-push-button-disabled-text-color: hsl(0, 0, 80%); -- cgit v1.2.3 From 40b4871c3f7bfe04f332ae7fb687fd7d9ae34734 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 14 Sep 2023 23:47:16 +0800 Subject: ... --- .../src/pages/timeline/ConnectionStatusBadge.css | 2 +- .../src/pages/timeline/ConnectionStatusBadge.tsx | 21 +- FrontEnd/src/pages/timeline/MarkdownPostEdit.css | 34 --- FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx | 216 ---------------- FrontEnd/src/pages/timeline/Timeline.tsx | 2 +- .../src/pages/timeline/TimelinePostCreateView.css | 54 ---- .../src/pages/timeline/TimelinePostCreateView.tsx | 272 --------------------- .../timeline/TimelinePropertyChangeDialog.tsx | 16 +- FrontEnd/src/pages/timeline/edit/ImagePostEdit.css | 4 + FrontEnd/src/pages/timeline/edit/ImagePostEdit.tsx | 36 +++ .../src/pages/timeline/edit/MarkdownPostEdit.css | 34 +++ .../src/pages/timeline/edit/MarkdownPostEdit.tsx | 216 ++++++++++++++++ .../src/pages/timeline/edit/PlainTextPostEdit.css | 18 ++ .../src/pages/timeline/edit/PlainTextPostEdit.tsx | 26 ++ .../pages/timeline/edit/TimelinePostCreateView.css | 33 +++ .../pages/timeline/edit/TimelinePostCreateView.tsx | 200 +++++++++++++++ 16 files changed, 583 insertions(+), 601 deletions(-) delete mode 100644 FrontEnd/src/pages/timeline/MarkdownPostEdit.css delete mode 100644 FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx delete mode 100644 FrontEnd/src/pages/timeline/TimelinePostCreateView.css delete mode 100644 FrontEnd/src/pages/timeline/TimelinePostCreateView.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/ImagePostEdit.css create mode 100644 FrontEnd/src/pages/timeline/edit/ImagePostEdit.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/MarkdownPostEdit.css create mode 100644 FrontEnd/src/pages/timeline/edit/MarkdownPostEdit.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/PlainTextPostEdit.css create mode 100644 FrontEnd/src/pages/timeline/edit/PlainTextPostEdit.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/TimelinePostCreateView.css create mode 100644 FrontEnd/src/pages/timeline/edit/TimelinePostCreateView.tsx (limited to 'FrontEnd/src/pages/timeline/ConnectionStatusBadge.css') diff --git a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css index fc01484e..f2f8df66 100644 --- a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css +++ b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css @@ -22,7 +22,7 @@ } .connection-status-badge.warning { - color: #e4a700; + color: #e4a700; /* TODO: Warning color */ } .connection-status-badge.warning::before { diff --git a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx index 2b820454..63990878 100644 --- a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx +++ b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx @@ -1,14 +1,13 @@ -import * as React from "react"; -import classnames from "classnames"; +import classNames from "classnames"; import { HubConnectionState } from "@microsoft/signalr"; -import { useTranslation } from "react-i18next"; + +import { useC }from '~/src/components/common'; import "./ConnectionStatusBadge.css"; -export interface ConnectionStatusBadgeProps { +interface ConnectionStatusBadgeProps { status: HubConnectionState; className?: string; - style?: React.CSSProperties; } const classNameMap: Record = { @@ -19,23 +18,19 @@ const classNameMap: Record = { Reconnecting: "warning", }; -const ConnectionStatusBadge: React.FC = (props) => { - const { status, className, style } = props; - - const { t } = useTranslation(); +export default function ConnectionStatusBadge({status, className}: ConnectionStatusBadgeProps) { + const c = useC(); return (
- {t(`connectionState.${status}`)} + {c(`connectionState.${status}`)}
); }; -export default ConnectionStatusBadge; diff --git a/FrontEnd/src/pages/timeline/MarkdownPostEdit.css b/FrontEnd/src/pages/timeline/MarkdownPostEdit.css deleted file mode 100644 index 33a77943..00000000 --- a/FrontEnd/src/pages/timeline/MarkdownPostEdit.css +++ /dev/null @@ -1,34 +0,0 @@ -.timeline-markdown-post-edit-page { - overflow: auto; - max-height: 300px; -} - -.timeline-post-create-markdown-edit-area { - border: 1px solid var(--cru-clickable-primary-normal-color); - border-top: none; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - padding: 0.6em; -} - -.timeline-post-create-markdown-edit-area:hover { - border: 1px solid var(--cru-clickable-primary-normal-color); - border-top: none; -} - -.timeline-markdown-post-edit-image-container { - position: relative; - text-align: center; - margin-bottom: 1em; -} - -.timeline-markdown-post-edit-image { - max-width: 100%; - max-height: 200px; -} - -.timeline-markdown-post-edit-image-delete-button { - position: absolute; - right: 10px; - top: 2px; -} diff --git a/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx b/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx deleted file mode 100644 index d10d3f2d..00000000 --- a/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import * as React from "react"; -import classnames from "classnames"; -import { useTranslation } from "react-i18next"; - -import { - getHttpTimelineClient, - HttpTimelinePostInfo, -} from "~src/http/timeline"; - -import TimelinePostBuilder from "~src/services/TimelinePostBuilder"; - -import FlatButton from "~src/components/button/FlatButton"; -import { TabPages } from "~src/components/tab"; -import ConfirmDialog from "~src/components/dialog/ConfirmDialog"; -import Spinner from "~src/components/Spinner"; -import IconButton from "~src/components/button/IconButton"; -import { DialogProvider, useDialog } from "~src/components/dialog"; - -import "./MarkdownPostEdit.css"; - -export interface MarkdownPostEditProps { - owner: string; - timeline: string; - onPosted: (post: HttpTimelinePostInfo) => void; - onPostError: () => void; - onClose: () => void; - className?: string; -} - -const MarkdownPostEdit: React.FC = ({ - owner: ownerUsername, - timeline: timelineName, - onPosted, - onClose, - onPostError, - className, -}) => { - const { t } = useTranslation(); - - const [canLeave, setCanLeave] = React.useState(true); - - const [process, setProcess] = React.useState(false); - - const { controller, switchDialog } = useDialog({ - "leave-confirm": ( - - ), - }); - - const [text, _setText] = React.useState(""); - const [images, _setImages] = React.useState<{ file: File; url: string }[]>( - [], - ); - const [previewHtml, _setPreviewHtml] = React.useState(""); - - const _builder = React.useRef(null); - - const getBuilder = (): TimelinePostBuilder => { - if (_builder.current == null) { - const builder = new TimelinePostBuilder(() => { - setCanLeave(builder.isEmpty); - _setText(builder.text); - _setImages(builder.images); - _setPreviewHtml(builder.renderHtml()); - }); - _builder.current = builder; - } - return _builder.current; - }; - - const canSend = text.length > 0; - - React.useEffect(() => { - return () => { - getBuilder().dispose(); - }; - }, []); - - React.useEffect(() => { - window.onbeforeunload = (): unknown => { - if (!canLeave) { - return t("timeline.confirmLeave"); - } - }; - - return () => { - window.onbeforeunload = null; - }; - }, [canLeave, t]); - - const send = async (): Promise => { - setProcess(true); - try { - const dataList = await getBuilder().build(); - const post = await getHttpTimelineClient().postPost( - ownerUsername, - timelineName, - { - dataList, - }, - ); - onPosted(post); - onClose(); - } catch (e) { - setProcess(false); - onPostError(); - } - }; - - return ( - <> - - ) : ( -
- { - if (canLeave) { - onClose(); - } else { - switchDialog("leave-confirm"); - } - }} - /> - {canSend && ( - void send()} /> - )} -
- ) - } - pages={[ - { - name: "text", - text: "edit", - page: ( -