@squiz/formatted-text-editor 1.21.1-alpha.2 → 1.21.1-alpha.20
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/demo/App.tsx +45 -10
- package/demo/index.scss +11 -10
- package/lib/Editor/Editor.js +38 -6
- package/lib/Editor/EditorContext.d.ts +10 -0
- package/lib/Editor/EditorContext.js +15 -0
- package/lib/EditorToolbar/FloatingToolbar.js +11 -5
- 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 +82 -0
- package/lib/EditorToolbar/Tools/Image/ImageButton.d.ts +5 -0
- package/lib/EditorToolbar/Tools/Image/ImageButton.js +76 -0
- package/lib/EditorToolbar/Tools/Image/ImageModal.d.ts +8 -0
- package/lib/EditorToolbar/Tools/Image/ImageModal.js +16 -0
- package/lib/EditorToolbar/Tools/Italic/ItalicButton.js +2 -2
- package/lib/EditorToolbar/Tools/Link/Form/LinkForm.d.ts +14 -5
- package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +67 -15
- package/lib/EditorToolbar/Tools/Link/LinkButton.js +13 -10
- package/lib/EditorToolbar/Tools/Link/LinkModal.js +12 -5
- package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.js +2 -9
- 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/CommandsExtension/CommandsExtension.d.ts +20 -0
- package/lib/Extensions/CommandsExtension/CommandsExtension.js +52 -0
- package/lib/Extensions/Extensions.d.ts +7 -4
- package/lib/Extensions/Extensions.js +32 -19
- package/lib/Extensions/ImageExtension/ImageExtension.d.ts +10 -0
- package/lib/Extensions/ImageExtension/ImageExtension.js +92 -0
- package/lib/Extensions/LinkExtension/AssetLinkExtension.d.ts +26 -0
- package/lib/Extensions/LinkExtension/AssetLinkExtension.js +102 -0
- package/lib/Extensions/LinkExtension/LinkExtension.d.ts +21 -12
- package/lib/Extensions/LinkExtension/LinkExtension.js +63 -65
- package/lib/Extensions/LinkExtension/common.d.ts +7 -0
- package/lib/Extensions/LinkExtension/common.js +14 -0
- package/lib/Extensions/PreformattedExtension/PreformattedExtension.d.ts +1 -1
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.js +1 -0
- package/lib/hooks/useExpandedSelection.d.ts +23 -0
- package/lib/hooks/useExpandedSelection.js +37 -0
- package/lib/index.css +157 -75
- package/lib/index.d.ts +5 -2
- package/lib/index.js +9 -3
- package/lib/types.d.ts +3 -0
- package/lib/types.js +2 -0
- package/lib/ui/Button/Button.d.ts +11 -0
- package/lib/ui/{ToolbarButton/ToolbarButton.js → Button/Button.js} +6 -3
- package/lib/ui/Fields/Input/Input.d.ts +5 -0
- package/lib/ui/{Inputs/Text/TextInput.js → Fields/Input/Input.js} +10 -5
- package/lib/ui/Modal/Modal.js +2 -1
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.d.ts +9 -0
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.js +165 -0
- package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.d.ts +9 -0
- package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.js +129 -0
- package/lib/utils/undefinedIfEmpty.d.ts +1 -0
- package/lib/utils/undefinedIfEmpty.js +7 -0
- package/package.json +9 -4
- package/src/Editor/Editor.spec.tsx +78 -18
- package/src/Editor/Editor.tsx +20 -7
- package/src/Editor/EditorContext.spec.tsx +26 -0
- package/src/Editor/EditorContext.ts +19 -0
- package/src/Editor/_editor.scss +16 -53
- package/src/EditorToolbar/FloatingToolbar.spec.tsx +2 -3
- package/src/EditorToolbar/FloatingToolbar.tsx +18 -6
- 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 +77 -0
- package/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx +90 -0
- package/src/EditorToolbar/Tools/Image/ImageButton.spec.tsx +135 -0
- package/src/EditorToolbar/Tools/Image/ImageButton.tsx +71 -0
- package/src/EditorToolbar/Tools/Image/ImageModal.spec.tsx +83 -0
- package/src/EditorToolbar/Tools/Image/ImageModal.tsx +24 -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.spec.tsx +37 -9
- package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +97 -27
- package/src/EditorToolbar/Tools/Link/LinkButton.spec.tsx +104 -26
- package/src/EditorToolbar/Tools/Link/LinkButton.tsx +19 -13
- package/src/EditorToolbar/Tools/Link/LinkModal.tsx +13 -6
- package/src/EditorToolbar/Tools/Link/RemoveLinkButton.spec.tsx +26 -26
- package/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx +4 -12
- 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.spec.tsx +22 -1
- package/src/EditorToolbar/Tools/Undo/UndoButton.tsx +2 -2
- package/src/EditorToolbar/_floating-toolbar.scss +5 -0
- package/src/EditorToolbar/_toolbar.scss +11 -5
- package/src/Extensions/CommandsExtension/CommandsExtension.ts +54 -0
- package/src/Extensions/Extensions.ts +32 -17
- package/src/Extensions/ImageExtension/ImageExtension.ts +112 -0
- package/src/Extensions/LinkExtension/AssetLinkExtension.spec.ts +104 -0
- package/src/Extensions/LinkExtension/AssetLinkExtension.ts +128 -0
- package/src/Extensions/LinkExtension/LinkExtension.spec.ts +68 -0
- package/src/Extensions/LinkExtension/LinkExtension.ts +88 -82
- package/src/Extensions/LinkExtension/common.ts +10 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useExpandedSelection.ts +44 -0
- package/src/index.scss +2 -2
- package/src/index.ts +5 -2
- package/src/types.ts +5 -0
- package/src/ui/Button/Button.spec.tsx +44 -0
- package/src/ui/Button/Button.tsx +29 -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/Fields/Input/Input.tsx +34 -0
- package/src/ui/Modal/Modal.tsx +2 -1
- package/src/ui/ToolbarDropdown/_toolbar-dropdown.scss +1 -1
- package/src/ui/_forms.scss +14 -0
- package/src/ui/_typography.scss +46 -0
- package/src/utils/converters/mocks/squizNodeJson.mock.ts +252 -0
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.spec.ts +480 -0
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts +202 -0
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.spec.ts +329 -0
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts +151 -0
- package/src/utils/undefinedIfEmpty.spec.ts +12 -0
- package/src/utils/undefinedIfEmpty.ts +3 -0
- package/tailwind.config.cjs +3 -0
- package/tests/renderWithEditor.tsx +28 -15
- package/lib/FormattedTextEditor.d.ts +0 -2
- package/lib/FormattedTextEditor.js +0 -7
- package/lib/ui/Inputs/Text/TextInput.d.ts +0 -4
- package/lib/ui/ToolbarButton/ToolbarButton.d.ts +0 -10
- package/src/Editor/Editor.mock.tsx +0 -43
- package/src/FormattedTextEditor.spec.tsx +0 -10
- package/src/FormattedTextEditor.tsx +0 -3
- package/src/ui/Inputs/Text/TextInput.tsx +0 -20
- 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
@@ -29,25 +29,28 @@ 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
|
+
const Extensions_1 = require("../../../Extensions/Extensions");
|
35
36
|
const LinkButton = ({ inPopover = false }) => {
|
36
37
|
const [showModal, setShowModal] = (0, react_1.useState)(false);
|
37
|
-
const {
|
38
|
+
const { updateLink, updateAssetLink } = (0, react_2.useCommands)();
|
38
39
|
const active = (0, react_2.useActive)();
|
40
|
+
// If the image tool is active, disable the link tool as they shouldn't work at the same time
|
41
|
+
const disabled = active.image();
|
39
42
|
const handleClick = () => {
|
40
43
|
if (!showModal) {
|
41
|
-
|
42
|
-
// form element are uncontrolled, let the event loop run to
|
43
|
-
// update the selected text in state before showing the modal.
|
44
|
-
requestAnimationFrame(() => {
|
45
|
-
setShowModal(true);
|
46
|
-
});
|
44
|
+
setShowModal(true);
|
47
45
|
}
|
48
46
|
};
|
49
47
|
const handleSubmit = (data) => {
|
50
|
-
|
48
|
+
if (data.linkType === Extensions_1.MarkName.AssetLink) {
|
49
|
+
updateAssetLink({ text: data.text, attrs: data.assetLink, range: data.range });
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
updateLink({ text: data.text, attrs: data.link, range: data.range });
|
53
|
+
}
|
51
54
|
setShowModal(false);
|
52
55
|
};
|
53
56
|
if (!inPopover) {
|
@@ -56,7 +59,7 @@ const LinkButton = ({ inPopover = false }) => {
|
|
56
59
|
(0, react_2.useExtensionEvent)(LinkExtension_1.LinkExtension, 'onShortcut', (0, react_1.useCallback)(() => handleClick(), []));
|
57
60
|
}
|
58
61
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
59
|
-
react_1.default.createElement(
|
62
|
+
react_1.default.createElement(Button_1.default, { handleOnClick: handleClick, isActive: active.link() || active.assetLink(), icon: react_1.default.createElement(InsertLinkRounded_1.default, null), label: "Link (cmd+K)", isDisabled: disabled }),
|
60
63
|
showModal && react_1.default.createElement(LinkModal_1.default, { onCancel: () => setShowModal(false), onSubmit: handleSubmit })));
|
61
64
|
};
|
62
65
|
exports.default = LinkButton;
|
@@ -3,17 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
const
|
7
|
-
const LinkForm_1 = __importDefault(require("./Form/LinkForm"));
|
6
|
+
const LinkForm_1 = require("./Form/LinkForm");
|
8
7
|
const react_1 = __importDefault(require("react"));
|
9
8
|
const react_2 = require("@remirror/react");
|
10
9
|
const FormModal_1 = __importDefault(require("../../../ui/Modal/FormModal"));
|
10
|
+
const hooks_1 = require("../../../hooks");
|
11
|
+
const Extensions_1 = require("../../../Extensions/Extensions");
|
11
12
|
const LinkModal = ({ onCancel, onSubmit }) => {
|
12
13
|
const { helpers, view: { state }, } = (0, react_2.useRemirrorContext)();
|
13
|
-
const selection = (0,
|
14
|
-
const currentLink = (0, remirror_1.getMarkRanges)(selection, 'link')[0];
|
14
|
+
const { selection, marks } = (0, hooks_1.useExpandedSelection)([Extensions_1.MarkName.Link, Extensions_1.MarkName.AssetLink]);
|
15
15
|
const selectedText = helpers.getTextBetween(selection.from, selection.to, state.doc);
|
16
|
+
const data = {
|
17
|
+
linkType: marks[0]?.type?.name === Extensions_1.MarkName.AssetLink ? Extensions_1.MarkName.AssetLink : Extensions_1.MarkName.Link,
|
18
|
+
text: selectedText,
|
19
|
+
link: marks.find((mark) => mark.type.name === 'link')?.attrs || {},
|
20
|
+
assetLink: marks.find((mark) => mark.type.name === Extensions_1.MarkName.AssetLink)?.attrs || {},
|
21
|
+
range: { from: selection.from, to: selection.to },
|
22
|
+
};
|
16
23
|
return (react_1.default.createElement(FormModal_1.default, { title: "Link", onCancel: onCancel },
|
17
|
-
react_1.default.createElement(LinkForm_1.
|
24
|
+
react_1.default.createElement(LinkForm_1.LinkForm, { data: data, onSubmit: onSubmit })));
|
18
25
|
};
|
19
26
|
exports.default = LinkModal;
|
@@ -5,17 +5,10 @@ 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
|
-
const { commands } = (0, react_2.useRemirrorContext)({ autoUpdate: true });
|
12
11
|
const chain = (0, react_2.useChainedCommands)();
|
13
|
-
|
14
|
-
const handleClick = () => {
|
15
|
-
if (enabled) {
|
16
|
-
chain.removeLink().focus().run();
|
17
|
-
}
|
18
|
-
};
|
19
|
-
return (react_1.default.createElement(ToolbarButton_1.default, { handleOnClick: handleClick, isActive: false, isDisabled: !enabled, icon: react_1.default.createElement(LinkOff_1.default, null), label: "Remove link" }));
|
12
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: () => chain.removeLink().removeAssetLink().focus().run(), isActive: false, icon: react_1.default.createElement(LinkOff_1.default, null), label: "Remove link" }));
|
20
13
|
};
|
21
14
|
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;
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { PlainExtension } from '@remirror/core';
|
2
|
+
import { CommandFunction, FromToProps, MarkType } from 'remirror';
|
3
|
+
import { Attrs } from 'prosemirror-model';
|
4
|
+
export declare class CommandsExtension extends PlainExtension {
|
5
|
+
get name(): string;
|
6
|
+
/**
|
7
|
+
* Updates the attributes of a specific mark for the current selection.
|
8
|
+
* Optionally, if text is provided it will replace the current selection.
|
9
|
+
* The cursor will be place at the end of the selection after changes.
|
10
|
+
*
|
11
|
+
* @param {object} options
|
12
|
+
*/
|
13
|
+
updateMark(options: {
|
14
|
+
mark: MarkType;
|
15
|
+
attrs?: Attrs;
|
16
|
+
text?: string;
|
17
|
+
removeMark?: boolean;
|
18
|
+
range: FromToProps;
|
19
|
+
}): CommandFunction;
|
20
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
9
|
+
exports.CommandsExtension = void 0;
|
10
|
+
const core_1 = require("@remirror/core");
|
11
|
+
const remirror_1 = require("remirror");
|
12
|
+
class CommandsExtension extends core_1.PlainExtension {
|
13
|
+
get name() {
|
14
|
+
return 'squizCommands';
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* Updates the attributes of a specific mark for the current selection.
|
18
|
+
* Optionally, if text is provided it will replace the current selection.
|
19
|
+
* The cursor will be place at the end of the selection after changes.
|
20
|
+
*
|
21
|
+
* @param {object} options
|
22
|
+
*/
|
23
|
+
updateMark(options) {
|
24
|
+
return (props) => {
|
25
|
+
const { tr, dispatch, view } = props;
|
26
|
+
const { mark, attrs, text, removeMark, range } = options;
|
27
|
+
const selectedText = tr.doc.textBetween(range.from, range.to);
|
28
|
+
if (text !== undefined && text !== selectedText) {
|
29
|
+
// update the text in the editor if it was updated, update the range to cover the length of the new text.
|
30
|
+
tr.insertText(text, range.from, range.to);
|
31
|
+
range.to = range.from + text.length;
|
32
|
+
}
|
33
|
+
// apply the link, or remove it if no URL was provided.
|
34
|
+
if (removeMark) {
|
35
|
+
tr.removeMark(range.from, range.to, mark);
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
tr.addMark(range.from, range.to, mark.create(attrs));
|
39
|
+
}
|
40
|
+
// move the cursor to the end of the link and re-focus the editor.
|
41
|
+
tr.setSelection((0, remirror_1.getTextSelection)({ from: range.to, to: range.to }, tr.doc));
|
42
|
+
// apply the transaction.
|
43
|
+
dispatch?.(tr);
|
44
|
+
view?.focus();
|
45
|
+
return true;
|
46
|
+
};
|
47
|
+
}
|
48
|
+
}
|
49
|
+
__decorate([
|
50
|
+
(0, remirror_1.command)()
|
51
|
+
], CommandsExtension.prototype, "updateMark", null);
|
52
|
+
exports.CommandsExtension = CommandsExtension;
|
@@ -1,4 +1,7 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
1
|
+
import { Extension } from '@remirror/core';
|
2
|
+
import { EditorContextOptions } from '../Editor/EditorContext';
|
3
|
+
export declare enum MarkName {
|
4
|
+
Link = "link",
|
5
|
+
AssetLink = "assetLink"
|
6
|
+
}
|
7
|
+
export declare const createExtensions: (context: EditorContextOptions) => () => Extension[];
|
@@ -1,24 +1,37 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.createExtensions = exports.MarkName = void 0;
|
4
4
|
const extensions_1 = require("remirror/extensions");
|
5
5
|
const PreformattedExtension_1 = require("./PreformattedExtension/PreformattedExtension");
|
6
|
+
const AssetLinkExtension_1 = require("./LinkExtension/AssetLinkExtension");
|
6
7
|
const LinkExtension_1 = require("./LinkExtension/LinkExtension");
|
7
|
-
const
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
8
|
+
const ImageExtension_1 = require("./ImageExtension/ImageExtension");
|
9
|
+
const CommandsExtension_1 = require("./CommandsExtension/CommandsExtension");
|
10
|
+
var MarkName;
|
11
|
+
(function (MarkName) {
|
12
|
+
MarkName["Link"] = "link";
|
13
|
+
MarkName["AssetLink"] = "assetLink";
|
14
|
+
})(MarkName = exports.MarkName || (exports.MarkName = {}));
|
15
|
+
const createExtensions = (context) => {
|
16
|
+
return () => {
|
17
|
+
return [
|
18
|
+
new CommandsExtension_1.CommandsExtension(),
|
19
|
+
new extensions_1.BoldExtension(),
|
20
|
+
new extensions_1.HeadingExtension(),
|
21
|
+
new extensions_1.ItalicExtension(),
|
22
|
+
new extensions_1.NodeFormattingExtension({ indents: [] }),
|
23
|
+
new extensions_1.ParagraphExtension(),
|
24
|
+
new PreformattedExtension_1.PreformattedExtension(),
|
25
|
+
new extensions_1.UnderlineExtension(),
|
26
|
+
new extensions_1.HistoryExtension(),
|
27
|
+
new ImageExtension_1.ImageExtension(),
|
28
|
+
new ImageExtension_1.ImageExtension({ preferPastedTextContent: false }),
|
29
|
+
new LinkExtension_1.LinkExtension(),
|
30
|
+
new AssetLinkExtension_1.AssetLinkExtension({
|
31
|
+
matrixIdentifier: context.matrix.matrixIdentifier,
|
32
|
+
matrixDomain: context.matrix.matrixDomain,
|
33
|
+
}),
|
34
|
+
];
|
35
|
+
};
|
36
|
+
};
|
37
|
+
exports.createExtensions = createExtensions;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { ImageExtension as RemirrorImageExtension } from 'remirror/extensions';
|
2
|
+
import { PasteRule } from 'prosemirror-paste-rules';
|
3
|
+
import { ApplySchemaAttributes, NodeSpecOverride, NodeExtensionSpec, PrimitiveSelection } from '@remirror/core';
|
4
|
+
import { ImageAttributes } from '@remirror/extension-image/dist-types/image-extension';
|
5
|
+
import { CommandFunction } from '@remirror/pm';
|
6
|
+
export declare class ImageExtension extends RemirrorImageExtension {
|
7
|
+
createPasteRules(): PasteRule[];
|
8
|
+
createNodeSpec(extra: ApplySchemaAttributes, override: NodeSpecOverride): NodeExtensionSpec;
|
9
|
+
insertImage(attributes: ImageAttributes, selection?: PrimitiveSelection): CommandFunction;
|
10
|
+
}
|
@@ -0,0 +1,92 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ImageExtension = void 0;
|
4
|
+
const extensions_1 = require("remirror/extensions");
|
5
|
+
const core_1 = require("@remirror/core");
|
6
|
+
/**
|
7
|
+
* Get the width and the height of the image.
|
8
|
+
*/
|
9
|
+
function getDimensions(element) {
|
10
|
+
let { width, height } = element.style;
|
11
|
+
width = width || element.getAttribute('width') || '';
|
12
|
+
height = height || element.getAttribute('height') || '';
|
13
|
+
return { width, height };
|
14
|
+
}
|
15
|
+
/**
|
16
|
+
* Retrieve attributes from the dom for the image extension.
|
17
|
+
*/
|
18
|
+
function getImageAttributes({ element, parse }) {
|
19
|
+
const { width, height } = getDimensions(element);
|
20
|
+
return {
|
21
|
+
...parse(element),
|
22
|
+
alt: element.getAttribute('alt') ?? '',
|
23
|
+
height: Number.parseInt(height || '0', 10) || null,
|
24
|
+
src: element.getAttribute('src') ?? null,
|
25
|
+
title: element.getAttribute('title') ?? '',
|
26
|
+
width: Number.parseInt(width || '0', 10) || null,
|
27
|
+
fileName: element.getAttribute('data-file-name') ?? null,
|
28
|
+
};
|
29
|
+
}
|
30
|
+
class ImageExtension extends extensions_1.ImageExtension {
|
31
|
+
createPasteRules() {
|
32
|
+
return [
|
33
|
+
{
|
34
|
+
type: 'file',
|
35
|
+
regexp: /image/i,
|
36
|
+
fileHandler: () => {
|
37
|
+
return false;
|
38
|
+
},
|
39
|
+
},
|
40
|
+
];
|
41
|
+
}
|
42
|
+
createNodeSpec(extra, override) {
|
43
|
+
const { preferPastedTextContent } = this.options;
|
44
|
+
return {
|
45
|
+
inline: true,
|
46
|
+
draggable: true,
|
47
|
+
selectable: true,
|
48
|
+
...override,
|
49
|
+
attrs: {
|
50
|
+
...extra.defaults(),
|
51
|
+
alt: { default: '' },
|
52
|
+
crop: { default: null },
|
53
|
+
height: { default: null },
|
54
|
+
width: { default: null },
|
55
|
+
rotate: { default: null },
|
56
|
+
src: { default: null },
|
57
|
+
title: { default: '' },
|
58
|
+
fileName: { default: null },
|
59
|
+
resizable: { default: false },
|
60
|
+
},
|
61
|
+
parseDOM: [
|
62
|
+
{
|
63
|
+
tag: 'img[src]',
|
64
|
+
getAttrs: (element) => {
|
65
|
+
if ((0, core_1.isElementDomNode)(element)) {
|
66
|
+
const attrs = getImageAttributes({ element, parse: extra.parse });
|
67
|
+
if (preferPastedTextContent && attrs.src?.startsWith('file:///')) {
|
68
|
+
return false;
|
69
|
+
}
|
70
|
+
return attrs;
|
71
|
+
}
|
72
|
+
return {};
|
73
|
+
},
|
74
|
+
},
|
75
|
+
...(override.parseDOM ?? []),
|
76
|
+
],
|
77
|
+
toDOM: (node) => {
|
78
|
+
const attrs = (0, core_1.omitExtraAttributes)(node.attrs, extra);
|
79
|
+
return ['img', { ...extra.dom(node), ...attrs }];
|
80
|
+
},
|
81
|
+
};
|
82
|
+
}
|
83
|
+
insertImage(attributes, selection) {
|
84
|
+
return ({ tr, dispatch }) => {
|
85
|
+
const { from, to } = (0, core_1.getTextSelection)(selection ?? tr.selection, tr.doc);
|
86
|
+
const node = this.type.create(attributes);
|
87
|
+
dispatch?.(tr.replaceRangeWith(from, to, node));
|
88
|
+
return true;
|
89
|
+
};
|
90
|
+
}
|
91
|
+
}
|
92
|
+
exports.ImageExtension = ImageExtension;
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { ApplySchemaAttributes, FromToProps, MarkExtensionSpec, MarkSpecOverride } from 'remirror';
|
2
|
+
import { CommandFunction, MarkExtension } from '@remirror/core';
|
3
|
+
import { LinkTarget } from './common';
|
4
|
+
export type AssetLinkAttributes = {
|
5
|
+
matrixAssetId: string;
|
6
|
+
matrixIdentifier: string;
|
7
|
+
matrixDomain: string;
|
8
|
+
target: LinkTarget;
|
9
|
+
};
|
10
|
+
export type AssetLinkOptions = {
|
11
|
+
matrixIdentifier?: string;
|
12
|
+
matrixDomain?: string;
|
13
|
+
defaultTarget?: LinkTarget;
|
14
|
+
supportedTargets?: LinkTarget[];
|
15
|
+
};
|
16
|
+
export type UpdateAssetLinkProps = {
|
17
|
+
text: string;
|
18
|
+
attrs: Partial<AssetLinkAttributes>;
|
19
|
+
range: FromToProps;
|
20
|
+
};
|
21
|
+
export declare class AssetLinkExtension extends MarkExtension<AssetLinkOptions> {
|
22
|
+
get name(): string;
|
23
|
+
createMarkSpec(extra: ApplySchemaAttributes, override: MarkSpecOverride): MarkExtensionSpec;
|
24
|
+
updateAssetLink({ text, attrs, range }: UpdateAssetLinkProps): CommandFunction;
|
25
|
+
removeAssetLink(): CommandFunction;
|
26
|
+
}
|
@@ -0,0 +1,102 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
9
|
+
exports.AssetLinkExtension = void 0;
|
10
|
+
const remirror_1 = require("remirror");
|
11
|
+
const core_1 = require("@remirror/core");
|
12
|
+
const common_1 = require("./common");
|
13
|
+
const CommandsExtension_1 = require("../CommandsExtension/CommandsExtension");
|
14
|
+
const Extensions_1 = require("../Extensions");
|
15
|
+
let AssetLinkExtension = class AssetLinkExtension extends core_1.MarkExtension {
|
16
|
+
get name() {
|
17
|
+
return Extensions_1.MarkName.AssetLink;
|
18
|
+
}
|
19
|
+
createMarkSpec(extra, override) {
|
20
|
+
return {
|
21
|
+
inclusive: false,
|
22
|
+
excludes: 'link',
|
23
|
+
...override,
|
24
|
+
attrs: {
|
25
|
+
...extra.defaults(),
|
26
|
+
matrixAssetId: {},
|
27
|
+
matrixIdentifier: { default: this.options.matrixIdentifier },
|
28
|
+
matrixDomain: { default: this.options.matrixDomain },
|
29
|
+
target: { default: this.options.defaultTarget },
|
30
|
+
},
|
31
|
+
parseDOM: [
|
32
|
+
{
|
33
|
+
tag: 'a[data-matrix-asset-id]',
|
34
|
+
getAttrs: (node) => {
|
35
|
+
if (!(0, remirror_1.isElementDomNode)(node)) {
|
36
|
+
return false;
|
37
|
+
}
|
38
|
+
const matrixAssetId = node.getAttribute('data-matrix-asset-id');
|
39
|
+
const matrixIdentifier = node.getAttribute('data-matrix-identifier');
|
40
|
+
const matrixDomain = node.getAttribute('data-matrix-domain');
|
41
|
+
if (!matrixAssetId || !matrixIdentifier || !matrixDomain) {
|
42
|
+
return false;
|
43
|
+
}
|
44
|
+
return {
|
45
|
+
...extra.parse(node),
|
46
|
+
matrixAssetId,
|
47
|
+
matrixIdentifier,
|
48
|
+
matrixDomain,
|
49
|
+
target: (0, common_1.validateTarget)(node.getAttribute('target'), this.options.supportedTargets, this.options.defaultTarget),
|
50
|
+
};
|
51
|
+
},
|
52
|
+
},
|
53
|
+
],
|
54
|
+
toDOM: (node) => {
|
55
|
+
const { matrixAssetId, matrixIdentifier, matrixDomain, target, ...rest } = (0, core_1.omitExtraAttributes)(node.attrs, extra);
|
56
|
+
const rel = 'noopener noreferrer nofollow';
|
57
|
+
const attrs = {
|
58
|
+
...extra.dom(node),
|
59
|
+
...rest,
|
60
|
+
rel,
|
61
|
+
// TODO: this won't be acceptable if/when we get to rendering outside of Matrix.
|
62
|
+
href: `/?a=${matrixAssetId}`,
|
63
|
+
target: (0, common_1.validateTarget)(target, this.options.supportedTargets, this.options.defaultTarget),
|
64
|
+
'data-matrix-asset-id': matrixAssetId,
|
65
|
+
'data-matrix-identifier': matrixIdentifier,
|
66
|
+
'data-matrix-domain': matrixDomain,
|
67
|
+
};
|
68
|
+
return ['a', attrs, 0];
|
69
|
+
},
|
70
|
+
};
|
71
|
+
}
|
72
|
+
updateAssetLink({ text, attrs, range }) {
|
73
|
+
return this.store.getExtension(CommandsExtension_1.CommandsExtension).updateMark({
|
74
|
+
attrs,
|
75
|
+
text,
|
76
|
+
range,
|
77
|
+
mark: this.type,
|
78
|
+
removeMark: !attrs.matrixAssetId,
|
79
|
+
});
|
80
|
+
}
|
81
|
+
removeAssetLink() {
|
82
|
+
return (0, core_1.removeMark)({ type: this.type });
|
83
|
+
}
|
84
|
+
};
|
85
|
+
__decorate([
|
86
|
+
(0, core_1.command)()
|
87
|
+
], AssetLinkExtension.prototype, "updateAssetLink", null);
|
88
|
+
__decorate([
|
89
|
+
(0, core_1.command)()
|
90
|
+
], AssetLinkExtension.prototype, "removeAssetLink", null);
|
91
|
+
AssetLinkExtension = __decorate([
|
92
|
+
(0, core_1.extension)({
|
93
|
+
defaultOptions: {
|
94
|
+
matrixIdentifier: '',
|
95
|
+
matrixDomain: '',
|
96
|
+
defaultTarget: common_1.LinkTarget.Self,
|
97
|
+
supportedTargets: [common_1.LinkTarget.Self, common_1.LinkTarget.Blank],
|
98
|
+
},
|
99
|
+
defaultPriority: remirror_1.ExtensionPriority.High,
|
100
|
+
})
|
101
|
+
], AssetLinkExtension);
|
102
|
+
exports.AssetLinkExtension = AssetLinkExtension;
|
@@ -1,16 +1,25 @@
|
|
1
|
-
import { ApplySchemaAttributes, MarkExtensionSpec, MarkSpecOverride } from 'remirror';
|
2
|
-
import { KeyBindingProps } from '@remirror/core';
|
3
|
-
import {
|
4
|
-
|
5
|
-
|
6
|
-
text: string;
|
7
|
-
};
|
8
|
-
export type LinkAttributes = RemirrorLinkAttributes & {
|
1
|
+
import { ApplySchemaAttributes, FromToProps, MarkExtensionSpec, MarkSpecOverride } from 'remirror';
|
2
|
+
import { CommandFunction, Handler, KeyBindingProps, MarkExtension } from '@remirror/core';
|
3
|
+
import { LinkTarget } from './common';
|
4
|
+
export type LinkAttributes = {
|
5
|
+
href: string;
|
9
6
|
title?: string;
|
7
|
+
target: LinkTarget;
|
8
|
+
};
|
9
|
+
export type LinkOptions = {
|
10
|
+
defaultTarget?: LinkTarget;
|
11
|
+
supportedTargets?: LinkTarget[];
|
12
|
+
onShortcut?: Handler<() => void>;
|
13
|
+
};
|
14
|
+
export type UpdateLinkProps = {
|
15
|
+
text: string;
|
16
|
+
attrs: Partial<LinkAttributes>;
|
17
|
+
range: FromToProps;
|
10
18
|
};
|
11
|
-
export declare class LinkExtension extends
|
19
|
+
export declare class LinkExtension extends MarkExtension<LinkOptions> {
|
20
|
+
get name(): string;
|
12
21
|
createMarkSpec(extra: ApplySchemaAttributes, override: MarkSpecOverride): MarkExtensionSpec;
|
13
|
-
shortcut(
|
14
|
-
|
15
|
-
|
22
|
+
shortcut(_: KeyBindingProps): boolean;
|
23
|
+
updateLink({ text, attrs, range }: UpdateLinkProps): CommandFunction;
|
24
|
+
removeLink(): CommandFunction;
|
16
25
|
}
|