@squiz/formatted-text-editor 1.21.1-alpha.1 → 1.21.1-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +7 -0
- package/demo/App.tsx +18 -4
- package/demo/index.scss +16 -10
- package/lib/EditorToolbar/FloatingToolbar.js +1 -1
- package/lib/EditorToolbar/Toolbar.js +3 -1
- package/lib/EditorToolbar/Tools/Bold/BoldButton.js +2 -2
- package/lib/EditorToolbar/Tools/Image/Form/ImageForm.d.ts +17 -0
- package/lib/EditorToolbar/Tools/Image/Form/ImageForm.js +84 -0
- package/lib/EditorToolbar/Tools/Image/ImageButton.d.ts +2 -0
- package/lib/EditorToolbar/Tools/Image/ImageButton.js +67 -0
- package/lib/EditorToolbar/Tools/Image/ImageModal.d.ts +8 -0
- package/lib/EditorToolbar/Tools/Image/ImageModal.js +19 -0
- package/lib/EditorToolbar/Tools/Italic/ItalicButton.js +2 -2
- package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +5 -5
- package/lib/EditorToolbar/Tools/Link/LinkButton.js +2 -2
- package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.js +2 -2
- package/lib/EditorToolbar/Tools/Redo/RedoButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/Underline/UnderlineButton.js +2 -2
- package/lib/EditorToolbar/Tools/Undo/UndoButton.js +2 -2
- package/lib/Extensions/Extensions.d.ts +2 -4
- package/lib/Extensions/Extensions.js +3 -1
- package/lib/Extensions/ImageExtension/ImageExtension.d.ts +3 -0
- package/lib/Extensions/ImageExtension/ImageExtension.js +7 -0
- package/lib/Extensions/LinkExtension/LinkExtension.js +6 -4
- package/lib/Extensions/PreformattedExtension/PreformattedExtension.d.ts +1 -1
- package/lib/index.css +133 -76
- package/lib/index.d.ts +3 -1
- package/lib/index.js +5 -1
- package/lib/ui/Button/Button.d.ts +11 -0
- package/lib/ui/Button/Button.js +14 -0
- package/lib/ui/Fields/Input/Input.d.ts +4 -0
- package/lib/ui/{Inputs/Text/TextInput.js → Fields/Input/Input.js} +4 -4
- package/lib/ui/Modal/Modal.js +1 -1
- package/lib/ui/ToolbarDropdown/ToolbarDropdown.js +1 -1
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.d.ts +10 -0
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.js +160 -0
- package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.d.ts +9 -0
- package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.js +105 -0
- package/lib/utils/converters/validNodeTypes.d.ts +2 -0
- package/lib/utils/converters/validNodeTypes.js +21 -0
- package/package.json +6 -3
- package/src/Editor/_editor.scss +2 -49
- package/src/EditorToolbar/FloatingToolbar.tsx +1 -1
- package/src/EditorToolbar/Toolbar.tsx +2 -0
- package/src/EditorToolbar/Tools/Bold/BoldButton.spec.tsx +1 -1
- package/src/EditorToolbar/Tools/Bold/BoldButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Image/Form/ImageForm.spec.tsx +23 -0
- package/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx +92 -0
- package/src/EditorToolbar/Tools/Image/ImageButton.spec.tsx +79 -0
- package/src/EditorToolbar/Tools/Image/ImageButton.tsx +57 -0
- package/src/EditorToolbar/Tools/Image/ImageModal.spec.tsx +83 -0
- package/src/EditorToolbar/Tools/Image/ImageModal.tsx +29 -0
- package/src/EditorToolbar/Tools/Italic/ItalicButton.spec.tsx +1 -1
- package/src/EditorToolbar/Tools/Italic/ItalicButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +5 -5
- package/src/EditorToolbar/Tools/Link/LinkButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Redo/RedoButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Underline/Underline.spec.tsx +1 -1
- package/src/EditorToolbar/Tools/Underline/UnderlineButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Undo/UndoButton.tsx +2 -2
- package/src/EditorToolbar/_floating-toolbar.scss +6 -0
- package/src/EditorToolbar/_toolbar.scss +8 -2
- package/src/Extensions/Extensions.ts +5 -2
- package/src/Extensions/ImageExtension/ImageExtension.ts +3 -0
- package/src/Extensions/LinkExtension/LinkExtension.ts +8 -5
- package/src/index.scss +2 -2
- package/src/index.ts +3 -1
- package/src/ui/Button/Button.spec.tsx +44 -0
- package/src/ui/Button/Button.tsx +31 -0
- package/src/ui/{_buttons.scss → Button/_button.scss} +19 -1
- package/src/ui/{Inputs/Text/TextInput.spec.tsx → Fields/Input/Input.spec.tsx} +8 -8
- package/src/ui/{Inputs/Text/TextInput.tsx → Fields/Input/Input.tsx} +4 -4
- package/src/ui/Modal/Modal.tsx +1 -0
- package/src/ui/ToolbarDropdown/ToolbarDropdown.spec.tsx +4 -2
- package/src/ui/ToolbarDropdown/ToolbarDropdown.tsx +1 -1
- package/src/ui/_typography.scss +46 -0
- package/src/utils/converters/mocks/squizNodeJson.mock.ts +75 -0
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.spec.ts +445 -0
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts +191 -0
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.spec.ts +307 -0
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts +123 -0
- package/src/utils/converters/validNodeTypes.spec.ts +33 -0
- package/src/utils/converters/validNodeTypes.ts +21 -0
- package/tests/renderWithEditor.tsx +2 -2
- package/lib/ui/Inputs/Text/TextInput.d.ts +0 -4
- package/lib/ui/ToolbarButton/ToolbarButton.d.ts +0 -10
- package/lib/ui/ToolbarButton/ToolbarButton.js +0 -10
- package/src/ui/ToolbarButton/ToolbarButton.tsx +0 -26
- package/src/ui/ToolbarButton/_toolbar-button.scss +0 -17
- /package/lib/ui/{Inputs → Fields}/Select/Select.d.ts +0 -0
- /package/lib/ui/{Inputs → Fields}/Select/Select.js +0 -0
- /package/src/ui/{Inputs → Fields}/Select/Select.spec.tsx +0 -0
- /package/src/ui/{Inputs → Fields}/Select/Select.tsx +0 -0
package/.eslintrc.json
CHANGED
@@ -30,5 +30,12 @@
|
|
30
30
|
"extensions": [".js", ".jsx", ".ts", ".tsx"]
|
31
31
|
}
|
32
32
|
}
|
33
|
+
},
|
34
|
+
"rules": {
|
35
|
+
// The rules below are listed in the order they appear on the eslint-plugin-react rules page.
|
36
|
+
|
37
|
+
// React
|
38
|
+
// https://github.com/yannickcr/eslint-plugin-react#list-of-supported-rules
|
39
|
+
"react/button-has-type": "error"
|
33
40
|
}
|
34
41
|
}
|
package/demo/App.tsx
CHANGED
@@ -1,13 +1,24 @@
|
|
1
1
|
import React, { useState } from 'react';
|
2
2
|
import FormattedTextEditor from '../src/FormattedTextEditor';
|
3
3
|
import { RemirrorEventListener, Extension } from '@remirror/core';
|
4
|
+
import { remirrorNodeToSquizNode } from '../src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode';
|
5
|
+
import { squizNodeToRemirrorNode } from '../src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode';
|
6
|
+
import ReactDiffViewer from 'react-diff-viewer-continued';
|
4
7
|
|
5
8
|
function App() {
|
6
|
-
const [doc, setDoc] = useState(
|
9
|
+
const [doc, setDoc] = useState('');
|
10
|
+
const [squizDoc, setSquizDoc] = useState('');
|
11
|
+
const [reconvertedDoc, setReconvertedDoc] = useState('');
|
7
12
|
const [editable, setEditable] = useState(true);
|
13
|
+
|
8
14
|
const handleEditorChange: RemirrorEventListener<Extension> = (parameter) => {
|
9
15
|
if (doc !== parameter.state.doc) {
|
10
|
-
|
16
|
+
const newSquizDoc = remirrorNodeToSquizNode(parameter.state.doc);
|
17
|
+
const newReconvertedDoc = parameter.state.schema.nodeFromJSON(squizNodeToRemirrorNode(newSquizDoc));
|
18
|
+
|
19
|
+
setDoc(JSON.stringify(parameter.state.doc, null, 2));
|
20
|
+
setSquizDoc(JSON.stringify(newSquizDoc, null, 2));
|
21
|
+
setReconvertedDoc(JSON.stringify(newReconvertedDoc, null, 2));
|
11
22
|
}
|
12
23
|
};
|
13
24
|
|
@@ -24,13 +35,16 @@ function App() {
|
|
24
35
|
<div className="page-section">
|
25
36
|
<FormattedTextEditor
|
26
37
|
editable={editable}
|
27
|
-
content={`<p>Hello <a href="https://www.google.com"><strong>Mr Bean</strong></a>, nice to <a href="https://www.google.com">meet you</a
|
38
|
+
content={`<p>Hello <a href="https://www.google.com"><strong>Mr Bean</strong></a>, nice to <a href="https://www.google.com">meet you</a>.<img src="https://media2.giphy.com/media/3o6ozsIxg5legYvggo/giphy.gif" height="150" width="200"/></p>`}
|
28
39
|
onChange={handleEditorChange}
|
29
40
|
/>
|
30
41
|
</div>
|
31
42
|
<h1>Document</h1>
|
32
43
|
<div className="page-section">
|
33
|
-
<
|
44
|
+
<div className="code-section">
|
45
|
+
<ReactDiffViewer oldValue={doc} newValue={reconvertedDoc} splitView={false} showDiffOnly={false} />
|
46
|
+
<ReactDiffViewer oldValue={squizDoc} newValue={squizDoc} splitView={false} showDiffOnly={false} />
|
47
|
+
</div>
|
34
48
|
</div>
|
35
49
|
</div>
|
36
50
|
);
|
package/demo/index.scss
CHANGED
@@ -22,19 +22,25 @@ h1 {
|
|
22
22
|
align-items: center;
|
23
23
|
}
|
24
24
|
|
25
|
-
code {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
font-size: 0.8rem;
|
31
|
-
height: 40vh;
|
32
|
-
max-height: 40vh;
|
25
|
+
.code-section {
|
26
|
+
display: flex;
|
27
|
+
flex-direction: row;
|
28
|
+
gap: 8px;
|
29
|
+
height: 35vh;
|
33
30
|
overflow: scroll;
|
34
31
|
}
|
35
32
|
|
36
33
|
.remirror-editor {
|
37
|
-
height:
|
38
|
-
max-height:
|
34
|
+
height: 35vh;
|
35
|
+
max-height: 35vh;
|
39
36
|
overflow: scroll;
|
40
37
|
}
|
38
|
+
|
39
|
+
.squiz-fte-modal-footer__button {
|
40
|
+
margin-top: 1rem;
|
41
|
+
}
|
42
|
+
|
43
|
+
.mock-buttons {
|
44
|
+
display: flex;
|
45
|
+
gap: 0.5rem;
|
46
|
+
}
|
@@ -54,7 +54,7 @@ const FloatingToolbar = () => {
|
|
54
54
|
}
|
55
55
|
else if (!data.marks?.link.isActive) {
|
56
56
|
// if none of the selected text is a link show the option to create a link.
|
57
|
-
buttons.push(react_1.default.createElement(react_components_1.VerticalDivider, { key: "link-divider", className: "
|
57
|
+
buttons.push(react_1.default.createElement(react_components_1.VerticalDivider, { key: "link-divider", className: "editor-divider" }), react_1.default.createElement(LinkButton_1.default, { key: "add-link", inPopover: true }));
|
58
58
|
}
|
59
59
|
return (react_1.default.createElement(react_2.FloatingToolbar, { className: "squiz-fte-scope squiz-fte-scope__floating-popover", positioner: positioner }, buttons));
|
60
60
|
};
|
@@ -15,6 +15,7 @@ const RedoButton_1 = __importDefault(require("./Tools/Redo/RedoButton"));
|
|
15
15
|
const TextTypeDropdown_1 = __importDefault(require("./Tools/TextType/TextTypeDropdown"));
|
16
16
|
const hooks_1 = require("../hooks");
|
17
17
|
const LinkButton_1 = __importDefault(require("./Tools/Link/LinkButton"));
|
18
|
+
const ImageButton_1 = __importDefault(require("./Tools/Image/ImageButton"));
|
18
19
|
const Toolbar = () => {
|
19
20
|
const extensionNames = (0, hooks_1.useExtensionNames)();
|
20
21
|
return (react_1.default.createElement(react_components_1.Toolbar, { className: "remirror-toolbar editor-toolbar" },
|
@@ -27,6 +28,7 @@ const Toolbar = () => {
|
|
27
28
|
extensionNames.italic && react_1.default.createElement(ItalicButton_1.default, null),
|
28
29
|
extensionNames.underline && react_1.default.createElement(UnderlineButton_1.default, null),
|
29
30
|
extensionNames.nodeFormatting && react_1.default.createElement(TextAlignButtons_1.default, null),
|
30
|
-
extensionNames.link && react_1.default.createElement(LinkButton_1.default, null)
|
31
|
+
extensionNames.link && react_1.default.createElement(LinkButton_1.default, null),
|
32
|
+
extensionNames.image && react_1.default.createElement(ImageButton_1.default, null)));
|
31
33
|
};
|
32
34
|
exports.Toolbar = Toolbar;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const FormatBoldRounded_1 = __importDefault(require("@mui/icons-material/FormatBoldRounded"));
|
10
10
|
const BoldButton = () => {
|
11
11
|
const { toggleBold } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const BoldButton = () => {
|
|
17
17
|
chain.toggleBold().focus().run();
|
18
18
|
}
|
19
19
|
};
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active.bold(), icon: react_1.default.createElement(FormatBoldRounded_1.default, null), label: "Bold (cmd+B)" }));
|
21
21
|
};
|
22
22
|
exports.default = BoldButton;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { ReactElement } from 'react';
|
2
|
+
import { SubmitHandler } from 'react-hook-form';
|
3
|
+
import { ImageAttributes } from '@remirror/extension-image/dist-types/image-extension';
|
4
|
+
export type UpdateImageOptions = ImageAttributes & {
|
5
|
+
src: string;
|
6
|
+
alt: string;
|
7
|
+
width: number;
|
8
|
+
height: number;
|
9
|
+
};
|
10
|
+
export type ImageFormData = Pick<UpdateImageOptions, 'src' | 'alt' | 'width' | 'height'>;
|
11
|
+
export type FormProps = {
|
12
|
+
data: Partial<ImageFormData>;
|
13
|
+
onSubmit: SubmitHandler<ImageFormData>;
|
14
|
+
};
|
15
|
+
export type Dimensions = 'width' | 'height';
|
16
|
+
declare const ImageForm: ({ data, onSubmit }: FormProps) => ReactElement;
|
17
|
+
export default ImageForm;
|
@@ -0,0 +1,84 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
+
const react_1 = __importStar(require("react"));
|
30
|
+
const Input_1 = require("../../../../ui/Fields/Input/Input");
|
31
|
+
const react_hook_form_1 = require("react-hook-form");
|
32
|
+
const react_image_size_1 = require("react-image-size");
|
33
|
+
const Button_1 = __importDefault(require("../../../../ui/Button/Button"));
|
34
|
+
const LinkOff_1 = __importDefault(require("@mui/icons-material/LinkOff"));
|
35
|
+
const InsertLinkRounded_1 = __importDefault(require("@mui/icons-material/InsertLinkRounded"));
|
36
|
+
const ImageForm = ({ data, onSubmit }) => {
|
37
|
+
const { register, handleSubmit, setValue } = (0, react_hook_form_1.useForm)({
|
38
|
+
defaultValues: data,
|
39
|
+
});
|
40
|
+
const [aspectRatioFromWidth, setAspectRatioFromWidth] = (0, react_1.useState)(9 / 16);
|
41
|
+
const [aspectRatioFromHeight, setAspectRatioFromHeight] = (0, react_1.useState)(16 / 9);
|
42
|
+
const [aspectRatioLocked, setAspectRatioLocked] = (0, react_1.useState)(true);
|
43
|
+
const setDimensionsFromURL = (e) => {
|
44
|
+
// get the new url, calculate the width and height and set those fields
|
45
|
+
(0, react_image_size_1.getImageSize)(e.target.value)
|
46
|
+
.then(({ width, height }) => {
|
47
|
+
setValue('width', width);
|
48
|
+
setValue('height', height);
|
49
|
+
setAspectRatioFromWidth(height / width);
|
50
|
+
setAspectRatioFromHeight(width / height);
|
51
|
+
})
|
52
|
+
.catch((errorMessage) => {
|
53
|
+
// TODO: we will use this when we add validation in a follow-up ticket
|
54
|
+
console.log(errorMessage);
|
55
|
+
});
|
56
|
+
};
|
57
|
+
const calculateDimensions = () => {
|
58
|
+
if (aspectRatioLocked) {
|
59
|
+
const currentTarget = event?.target;
|
60
|
+
const type = currentTarget.name;
|
61
|
+
const currentValue = currentTarget.value;
|
62
|
+
const otherValue = type === 'width' ? 'height' : 'width';
|
63
|
+
const aspectRatio = type === 'width' ? aspectRatioFromWidth : aspectRatioFromHeight;
|
64
|
+
const newValue = Math.round(aspectRatio * Number(currentValue) * 100) / 100;
|
65
|
+
setValue(otherValue, newValue);
|
66
|
+
}
|
67
|
+
};
|
68
|
+
const toggleAspectRatio = () => {
|
69
|
+
setAspectRatioLocked(!aspectRatioLocked);
|
70
|
+
};
|
71
|
+
return (react_1.default.createElement("form", { className: "squiz-fte-form", onSubmit: handleSubmit(onSubmit) },
|
72
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
73
|
+
react_1.default.createElement(Input_1.Input, { label: "Source", ...register('src'), onBlur: setDimensionsFromURL })),
|
74
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
75
|
+
react_1.default.createElement(Input_1.Input, { label: "Alternative description", ...register('alt') })),
|
76
|
+
react_1.default.createElement("div", { className: "flex flex-row items-end" },
|
77
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
78
|
+
react_1.default.createElement(Input_1.Input, { label: "Width", ...register('width'), type: "number", name: "width", onChange: calculateDimensions })),
|
79
|
+
react_1.default.createElement("div", { className: "flex mx-1 mb-2" },
|
80
|
+
react_1.default.createElement(Button_1.default, { handleOnClick: toggleAspectRatio, isActive: false, icon: aspectRatioLocked ? react_1.default.createElement(InsertLinkRounded_1.default, null) : react_1.default.createElement(LinkOff_1.default, null), label: "Constrain properties", isDisabled: false })),
|
81
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
82
|
+
react_1.default.createElement(Input_1.Input, { label: "Height", ...register('height'), type: "number", name: "height", onChange: calculateDimensions })))));
|
83
|
+
};
|
84
|
+
exports.default = ImageForm;
|
@@ -0,0 +1,67 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
+
const react_1 = __importStar(require("react"));
|
30
|
+
const ImageRounded_1 = __importDefault(require("@mui/icons-material/ImageRounded"));
|
31
|
+
const ImageModal_1 = __importDefault(require("./ImageModal"));
|
32
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
33
|
+
const react_2 = require("@remirror/react");
|
34
|
+
const ImageButton = () => {
|
35
|
+
const [showModal, setShowModal] = (0, react_1.useState)(false);
|
36
|
+
const { insertImage } = (0, react_2.useCommands)();
|
37
|
+
const active = showModal;
|
38
|
+
const handleClick = () => {
|
39
|
+
if (!showModal) {
|
40
|
+
// form element are uncontrolled, let the event loop run to
|
41
|
+
// update the selected text in state before showing the modal.
|
42
|
+
requestAnimationFrame(() => {
|
43
|
+
setShowModal(true);
|
44
|
+
});
|
45
|
+
}
|
46
|
+
};
|
47
|
+
const insertImageFromData = (data) => {
|
48
|
+
const { src, alt, width, height } = data;
|
49
|
+
if (src) {
|
50
|
+
insertImage({ src, alt, width, height });
|
51
|
+
}
|
52
|
+
};
|
53
|
+
const handleSubmit = (data) => {
|
54
|
+
insertImageFromData(data);
|
55
|
+
setShowModal(false);
|
56
|
+
};
|
57
|
+
const handleShortcut = (0, react_1.useCallback)(() => {
|
58
|
+
handleClick();
|
59
|
+
// Prevent other key handlers being run
|
60
|
+
return true;
|
61
|
+
}, []);
|
62
|
+
(0, react_2.useKeymap)('Mod-l', handleShortcut);
|
63
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
64
|
+
react_1.default.createElement(Button_1.default, { handleOnClick: handleClick, isActive: active, icon: react_1.default.createElement(ImageRounded_1.default, null), label: "Image (cmd+L)", isDisabled: false }),
|
65
|
+
showModal && react_1.default.createElement(ImageModal_1.default, { onCancel: () => setShowModal(false), onSubmit: handleSubmit })));
|
66
|
+
};
|
67
|
+
exports.default = ImageButton;
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { ImageFormData } from './Form/ImageForm';
|
2
|
+
import { SubmitHandler } from 'react-hook-form';
|
3
|
+
type ImageModalProps = {
|
4
|
+
onCancel: () => void;
|
5
|
+
onSubmit: SubmitHandler<ImageFormData>;
|
6
|
+
};
|
7
|
+
declare const ImageModal: ({ onCancel, onSubmit }: ImageModalProps) => JSX.Element;
|
8
|
+
export default ImageModal;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const remirror_1 = require("remirror");
|
7
|
+
const ImageForm_1 = __importDefault(require("./Form/ImageForm"));
|
8
|
+
const react_1 = __importDefault(require("react"));
|
9
|
+
const react_2 = require("@remirror/react");
|
10
|
+
const FormModal_1 = __importDefault(require("../../../ui/Modal/FormModal"));
|
11
|
+
const ImageModal = ({ onCancel, onSubmit }) => {
|
12
|
+
const { helpers, view: { state }, } = (0, react_2.useRemirrorContext)();
|
13
|
+
const selection = (0, react_2.useCurrentSelection)();
|
14
|
+
const currentImage = (0, remirror_1.getMarkRanges)(selection, 'image')[0];
|
15
|
+
const selectedImage = helpers.getTextBetween(selection.from, selection.to, state.doc);
|
16
|
+
return (react_1.default.createElement(FormModal_1.default, { title: "Image", onCancel: onCancel },
|
17
|
+
react_1.default.createElement(ImageForm_1.default, { data: { ...currentImage?.mark.attrs, src: selectedImage }, onSubmit: onSubmit })));
|
18
|
+
};
|
19
|
+
exports.default = ImageModal;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const FormatItalicRounded_1 = __importDefault(require("@mui/icons-material/FormatItalicRounded"));
|
10
10
|
const ItalicButton = () => {
|
11
11
|
const { toggleItalic } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const ItalicButton = () => {
|
|
17
17
|
chain.toggleItalic().focus().run();
|
18
18
|
}
|
19
19
|
};
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active.italic(), icon: react_1.default.createElement(FormatItalicRounded_1.default, null), label: "Italic (cmd+I)" }));
|
21
21
|
};
|
22
22
|
exports.default = ItalicButton;
|
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
|
-
const
|
8
|
-
const Select_1 = require("../../../../ui/
|
7
|
+
const Input_1 = require("../../../../ui/Fields/Input/Input");
|
8
|
+
const Select_1 = require("../../../../ui/Fields/Select/Select");
|
9
9
|
const react_hook_form_1 = require("react-hook-form");
|
10
10
|
const selectOptions = {
|
11
11
|
_self: { label: 'Current window' },
|
@@ -17,11 +17,11 @@ const LinkForm = ({ data, onSubmit }) => {
|
|
17
17
|
});
|
18
18
|
return (react_1.default.createElement("form", { className: "squiz-fte-form", onSubmit: handleSubmit(onSubmit) },
|
19
19
|
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
20
|
-
react_1.default.createElement(
|
20
|
+
react_1.default.createElement(Input_1.Input, { label: "URL", ...register('href') })),
|
21
21
|
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
22
|
-
react_1.default.createElement(
|
22
|
+
react_1.default.createElement(Input_1.Input, { label: "Text", ...register('text') })),
|
23
23
|
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
24
|
-
react_1.default.createElement(
|
24
|
+
react_1.default.createElement(Input_1.Input, { label: "Title", ...register('title') })),
|
25
25
|
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-0" },
|
26
26
|
react_1.default.createElement(Select_1.Select, { name: "target", label: "Target", value: data.target || '_self', options: selectOptions, onChange: (value) => setValue('target', value) }))));
|
27
27
|
};
|
@@ -29,7 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
const react_1 = __importStar(require("react"));
|
30
30
|
const InsertLinkRounded_1 = __importDefault(require("@mui/icons-material/InsertLinkRounded"));
|
31
31
|
const LinkModal_1 = __importDefault(require("./LinkModal"));
|
32
|
-
const
|
32
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
33
33
|
const react_2 = require("@remirror/react");
|
34
34
|
const LinkExtension_1 = require("../../../Extensions/LinkExtension/LinkExtension");
|
35
35
|
const LinkButton = ({ inPopover = false }) => {
|
@@ -56,7 +56,7 @@ const LinkButton = ({ inPopover = false }) => {
|
|
56
56
|
(0, react_2.useExtensionEvent)(LinkExtension_1.LinkExtension, 'onShortcut', (0, react_1.useCallback)(() => handleClick(), []));
|
57
57
|
}
|
58
58
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
59
|
-
react_1.default.createElement(
|
59
|
+
react_1.default.createElement(Button_1.default, { handleOnClick: handleClick, isActive: active.link(), icon: react_1.default.createElement(InsertLinkRounded_1.default, null), label: "Link (cmd+K)" }),
|
60
60
|
showModal && react_1.default.createElement(LinkModal_1.default, { onCancel: () => setShowModal(false), onSubmit: handleSubmit })));
|
61
61
|
};
|
62
62
|
exports.default = LinkButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const LinkOff_1 = __importDefault(require("@mui/icons-material/LinkOff"));
|
10
10
|
const RemoveLinkButton = () => {
|
11
11
|
const { commands } = (0, react_2.useRemirrorContext)({ autoUpdate: true });
|
@@ -16,6 +16,6 @@ const RemoveLinkButton = () => {
|
|
16
16
|
chain.removeLink().focus().run();
|
17
17
|
}
|
18
18
|
};
|
19
|
-
return (react_1.default.createElement(
|
19
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleClick, isActive: false, isDisabled: !enabled, icon: react_1.default.createElement(LinkOff_1.default, null), label: "Remove link" }));
|
20
20
|
};
|
21
21
|
exports.default = RemoveLinkButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const RedoRounded_1 = __importDefault(require("@mui/icons-material/RedoRounded"));
|
10
10
|
const RedoButton = () => {
|
11
11
|
const { redo } = (0, react_2.useCommands)();
|
@@ -16,6 +16,6 @@ const RedoButton = () => {
|
|
16
16
|
}
|
17
17
|
};
|
18
18
|
const enabled = redoDepth() > 0;
|
19
|
-
return (react_1.default.createElement(
|
19
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: false, icon: react_1.default.createElement(RedoRounded_1.default, null), label: "Redo (shift+cmd+Z)" }));
|
20
20
|
};
|
21
21
|
exports.default = RedoButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../../ui/Button/Button"));
|
9
9
|
const FormatAlignCenter_1 = __importDefault(require("@mui/icons-material/FormatAlignCenter"));
|
10
10
|
const CenterAlignButton = () => {
|
11
11
|
const { centerAlign } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const CenterAlignButton = () => {
|
|
17
17
|
};
|
18
18
|
const active = centerAlign.active?.() || false;
|
19
19
|
const enabled = centerAlign.enabled();
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active, icon: react_1.default.createElement(FormatAlignCenter_1.default, null), label: "Align center" }));
|
21
21
|
};
|
22
22
|
exports.default = CenterAlignButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../../ui/Button/Button"));
|
9
9
|
const FormatAlignJustify_1 = __importDefault(require("@mui/icons-material/FormatAlignJustify"));
|
10
10
|
const JustifyAlignButton = () => {
|
11
11
|
const { justifyAlign } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const JustifyAlignButton = () => {
|
|
17
17
|
};
|
18
18
|
const active = justifyAlign.active?.() || false;
|
19
19
|
const enabled = justifyAlign.enabled();
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active, icon: react_1.default.createElement(FormatAlignJustify_1.default, null), label: "Justify" }));
|
21
21
|
};
|
22
22
|
exports.default = JustifyAlignButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../../ui/Button/Button"));
|
9
9
|
const FormatAlignLeft_1 = __importDefault(require("@mui/icons-material/FormatAlignLeft"));
|
10
10
|
const LeftAlignButton = () => {
|
11
11
|
const { leftAlign } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const LeftAlignButton = () => {
|
|
17
17
|
};
|
18
18
|
const active = leftAlign.active?.() || false;
|
19
19
|
const enabled = leftAlign.enabled();
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active, icon: react_1.default.createElement(FormatAlignLeft_1.default, null), label: "Align left" }));
|
21
21
|
};
|
22
22
|
exports.default = LeftAlignButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../../ui/Button/Button"));
|
9
9
|
const FormatAlignRight_1 = __importDefault(require("@mui/icons-material/FormatAlignRight"));
|
10
10
|
const RightAlignButton = () => {
|
11
11
|
const { rightAlign } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const RightAlignButton = () => {
|
|
17
17
|
};
|
18
18
|
const active = rightAlign.active?.() || false;
|
19
19
|
const enabled = rightAlign.enabled();
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active, icon: react_1.default.createElement(FormatAlignRight_1.default, null), label: "Align right" }));
|
21
21
|
};
|
22
22
|
exports.default = RightAlignButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const FormatUnderlinedRounded_1 = __importDefault(require("@mui/icons-material/FormatUnderlinedRounded"));
|
10
10
|
const UnderlineButton = () => {
|
11
11
|
const { toggleUnderline } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const UnderlineButton = () => {
|
|
17
17
|
chain.toggleUnderline().focus().run();
|
18
18
|
}
|
19
19
|
};
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active.underline(), icon: react_1.default.createElement(FormatUnderlinedRounded_1.default, null), label: "Underline (cmd+U)" }));
|
21
21
|
};
|
22
22
|
exports.default = UnderlineButton;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const UndoRounded_1 = __importDefault(require("@mui/icons-material/UndoRounded"));
|
10
10
|
const UndoButton = () => {
|
11
11
|
const { undo } = (0, react_2.useCommands)();
|
@@ -16,6 +16,6 @@ const UndoButton = () => {
|
|
16
16
|
}
|
17
17
|
};
|
18
18
|
const enabled = undoDepth() > 0;
|
19
|
-
return (react_1.default.createElement(
|
19
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: false, icon: react_1.default.createElement(UndoRounded_1.default, null), label: "Undo (cmd+Z)" }));
|
20
20
|
};
|
21
21
|
exports.default = UndoButton;
|
@@ -1,4 +1,2 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
import { LinkExtension } from './LinkExtension/LinkExtension';
|
4
|
-
export declare const Extensions: () => (BoldExtension | HistoryExtension | HeadingExtension | ItalicExtension | NodeFormattingExtension | ParagraphExtension | UnderlineExtension | LinkExtension | PreformattedExtension)[];
|
1
|
+
import { Extension } from '@remirror/core';
|
2
|
+
export declare const Extensions: () => Extension[];
|
@@ -4,15 +4,17 @@ exports.Extensions = void 0;
|
|
4
4
|
const extensions_1 = require("remirror/extensions");
|
5
5
|
const PreformattedExtension_1 = require("./PreformattedExtension/PreformattedExtension");
|
6
6
|
const LinkExtension_1 = require("./LinkExtension/LinkExtension");
|
7
|
+
const ImageExtension_1 = require("./ImageExtension/ImageExtension");
|
7
8
|
const Extensions = () => [
|
8
9
|
new extensions_1.BoldExtension(),
|
9
10
|
new extensions_1.HeadingExtension(),
|
10
11
|
new extensions_1.ItalicExtension(),
|
11
|
-
new extensions_1.NodeFormattingExtension(),
|
12
|
+
new extensions_1.NodeFormattingExtension({ indents: [] }),
|
12
13
|
new extensions_1.ParagraphExtension(),
|
13
14
|
new PreformattedExtension_1.PreformattedExtension(),
|
14
15
|
new extensions_1.UnderlineExtension(),
|
15
16
|
new extensions_1.HistoryExtension(),
|
17
|
+
new ImageExtension_1.ImageExtension(),
|
16
18
|
new LinkExtension_1.LinkExtension({
|
17
19
|
supportedTargets: [
|
18
20
|
// '_self' is the browser default and will be used when encountering a link with a
|
@@ -0,0 +1,7 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ImageExtension = void 0;
|
4
|
+
const extensions_1 = require("remirror/extensions");
|
5
|
+
class ImageExtension extends extensions_1.ImageExtension {
|
6
|
+
}
|
7
|
+
exports.ImageExtension = ImageExtension;
|
@@ -75,18 +75,20 @@ class LinkExtension extends extensions_1.LinkExtension {
|
|
75
75
|
const selectedText = tr.doc.textBetween(range.from, range.to);
|
76
76
|
if (text !== selectedText) {
|
77
77
|
// update the text in the editor if it was updated, update the range to cover the length of the new text.
|
78
|
-
|
78
|
+
tr.insertText(text);
|
79
79
|
range.to = range.from + text.length;
|
80
80
|
}
|
81
81
|
// apply the link, or remove it if no URL was provided.
|
82
82
|
if (attrs.href.length > 0) {
|
83
|
-
(
|
83
|
+
tr.addMark(range.from, range.to, this.type.create(attrs));
|
84
84
|
}
|
85
85
|
else {
|
86
|
-
(
|
86
|
+
tr.removeMark(range.from, range.to, this.type);
|
87
87
|
}
|
88
88
|
// move the cursor to the end of the link and re-focus the editor.
|
89
|
-
|
89
|
+
tr.setSelection((0, core_1.getTextSelection)({ from: range.to, to: range.to }, tr.doc));
|
90
|
+
// apply the transaction.
|
91
|
+
dispatch?.(tr);
|
90
92
|
view?.focus();
|
91
93
|
return true;
|
92
94
|
};
|