Path: blob/master/src/packages/frontend/editors/slate/edit-bar/marks-bar.tsx
1698 views
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import { Button, Tooltip } from "antd";6import React, { CSSProperties } from "react";78import { Icon, IconName } from "@cocalc/frontend/components";9import { COLORS } from "@cocalc/util/theme";10import { SlateEditor } from "../editable-markdown";11import { formatAction } from "../format";12import ColorButton from "./color-button";13import FontFamily from "./font-family";14import FontSize from "./font-size";15import Heading from "./heading";16import Insert from "./insert";17import CodeButton from "./code";18import LinkButton from "./link";19import { Marks } from "./marks";2021export const BUTTON_STYLE = {22color: COLORS.GRAY_M,23height: "24px",24borderLeft: "1px solid lightgray",25borderRight: "1px solid lightgray",26borderTop: "none",27borderBottom: "none",28padding: "0 10px",29} as CSSProperties;3031interface MarkButtonProps {32mark: IconName;33active: boolean;34editor: SlateEditor;35}3637const MarkButton: React.FC<MarkButtonProps> = ({ mark, active, editor }) => {38return (39<Tooltip title={TITLES[mark]} mouseEnterDelay={1}>40<Button41type="text"42style={{43...BUTTON_STYLE,44backgroundColor: active ? "#ccc" : undefined,45}}46onClick={() => formatAction(editor, mark, [])}47>48<Icon name={mark} />49</Button>50</Tooltip>51);52};5354interface MarksBarProps {55marks: Marks;56editor: SlateEditor;57}5859const MARKS: IconName[] = [60"bold",61"italic",62"underline",63"strikethrough",64"code",65/*"sup",66"sub",*/67];6869const TITLES = {70bold: "Bold (shortcut: **foo**␣)",71italic: "Italics (shortcut: *foo*␣)",72underline: "Underline (shortcut: _foo_␣)",73strikethrough: "Strikethrough (shortcut: ~foo~␣)",74code: "Code (shortcut: `foo`␣)",75sup: "Superscript",76sub: "Subscript",77};7879export const MarksBar: React.FC<MarksBarProps> = (props: MarksBarProps) => {80const { marks, editor } = props;81const v: React.JSX.Element[] = [];82v.push(<Insert key="insert" editor={editor} />);83for (const mark of MARKS) {84v.push(85<MarkButton86key={mark}87mark={mark}88active={marks[mark] ?? false}89editor={editor}90/>91);92}93v.push(<CodeButton key={"code2"} editor={editor} />);94v.push(<LinkButton key={"link"} editor={editor} />);95v.push(<FontSize key={"size"} editor={editor} size={getSizeMark(marks)} />);96v.push(<Heading key="heading" editor={editor} />);97v.push(98<ColorButton key={"color"} editor={editor} color={getColorMark(marks)} />99);100v.push(<FontFamily key={"font"} editor={editor} font={getFontMark(marks)} />);101return (102<div style={{ paddingRight: "10px", flex: 1, whiteSpace: "nowrap" }}>103{v}104</div>105);106};107108function getColorMark(marks): string | undefined {109for (const key in marks) {110if (key.startsWith("color:") && marks[key]) {111return key.slice("color:".length);112}113}114}115116function getFontMark(marks): string | undefined {117for (const key in marks) {118if (key.startsWith("font-family:") && marks[key]) {119return key.slice("font-family:".length);120}121}122}123124function getSizeMark(marks): string | undefined {125for (const key in marks) {126if (key.startsWith("font-size:") && marks[key]) {127return key.slice("font-size:".length);128}129}130}131132133