@squiz/formatted-text-editor 1.21.1-alpha.9 → 1.22.0
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 +38 -10
- package/demo/index.scss +2 -7
- package/jest.config.ts +0 -2
- package/lib/Editor/Editor.js +45 -7
- package/lib/Editor/EditorContext.d.ts +15 -0
- package/lib/Editor/EditorContext.js +15 -0
- package/lib/EditorToolbar/FloatingToolbar.js +11 -5
- package/lib/EditorToolbar/Tools/Image/Form/ImageForm.d.ts +9 -8
- package/lib/EditorToolbar/Tools/Image/Form/ImageForm.js +91 -23
- package/lib/EditorToolbar/Tools/Image/ImageButton.d.ts +4 -1
- package/lib/EditorToolbar/Tools/Image/ImageButton.js +22 -14
- package/lib/EditorToolbar/Tools/Image/ImageModal.js +9 -5
- package/lib/EditorToolbar/Tools/Link/Form/LinkForm.d.ts +14 -5
- package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +66 -14
- package/lib/EditorToolbar/Tools/Link/LinkButton.js +21 -13
- package/lib/EditorToolbar/Tools/Link/LinkModal.js +12 -5
- package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.js +1 -8
- package/lib/Extensions/CommandsExtension/CommandsExtension.d.ts +20 -0
- package/lib/Extensions/CommandsExtension/CommandsExtension.js +52 -0
- package/lib/Extensions/Extensions.d.ts +11 -1
- package/lib/Extensions/Extensions.js +42 -20
- package/lib/Extensions/ImageExtension/AssetImageExtension.d.ts +17 -0
- package/lib/Extensions/ImageExtension/AssetImageExtension.js +92 -0
- package/lib/Extensions/ImageExtension/ImageExtension.d.ts +4 -0
- package/lib/Extensions/ImageExtension/ImageExtension.js +11 -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 +19 -12
- package/lib/Extensions/LinkExtension/LinkExtension.js +56 -66
- package/lib/Extensions/LinkExtension/common.d.ts +7 -0
- package/lib/Extensions/LinkExtension/common.js +14 -0
- package/lib/Extensions/PreformattedExtension/PreformattedExtension.js +6 -2
- 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 +58 -26
- package/lib/index.d.ts +3 -2
- package/lib/index.js +5 -3
- package/lib/types.d.ts +3 -0
- package/lib/types.js +2 -0
- package/lib/ui/Button/Button.d.ts +2 -1
- package/lib/ui/Button/Button.js +4 -5
- package/lib/ui/Fields/Input/Input.d.ts +1 -0
- package/lib/ui/Fields/Input/Input.js +9 -3
- package/lib/ui/Modal/Modal.js +5 -3
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.d.ts +1 -2
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.js +118 -104
- package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.js +102 -69
- package/lib/utils/resolveMatrixAssetUrl.d.ts +1 -0
- package/lib/utils/resolveMatrixAssetUrl.js +10 -0
- package/lib/utils/undefinedIfEmpty.d.ts +1 -0
- package/lib/utils/undefinedIfEmpty.js +7 -0
- package/package.json +8 -4
- package/src/Editor/Editor.spec.tsx +78 -18
- package/src/Editor/Editor.tsx +28 -9
- package/src/Editor/EditorContext.spec.tsx +26 -0
- package/src/Editor/EditorContext.ts +26 -0
- package/src/Editor/_editor.scss +20 -4
- package/src/EditorToolbar/FloatingToolbar.spec.tsx +26 -7
- package/src/EditorToolbar/FloatingToolbar.tsx +15 -6
- package/src/EditorToolbar/Tools/Image/Form/ImageForm.spec.tsx +81 -6
- package/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx +167 -47
- package/src/EditorToolbar/Tools/Image/ImageButton.spec.tsx +250 -2
- package/src/EditorToolbar/Tools/Image/ImageButton.tsx +29 -16
- package/src/EditorToolbar/Tools/Image/ImageModal.spec.tsx +59 -20
- package/src/EditorToolbar/Tools/Image/ImageModal.tsx +12 -10
- package/src/EditorToolbar/Tools/Link/Form/LinkForm.spec.tsx +37 -9
- package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +96 -26
- package/src/EditorToolbar/Tools/Link/LinkButton.spec.tsx +137 -26
- package/src/EditorToolbar/Tools/Link/LinkButton.tsx +28 -19
- package/src/EditorToolbar/Tools/Link/LinkModal.tsx +13 -6
- package/src/EditorToolbar/Tools/Link/RemoveLinkButton.spec.tsx +27 -26
- package/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx +2 -10
- package/src/EditorToolbar/Tools/Undo/UndoButton.spec.tsx +22 -1
- package/src/EditorToolbar/_floating-toolbar.scss +4 -5
- package/src/EditorToolbar/_toolbar.scss +1 -1
- package/src/Extensions/CommandsExtension/CommandsExtension.ts +54 -0
- package/src/Extensions/Extensions.ts +42 -19
- package/src/Extensions/ImageExtension/AssetImageExtension.spec.ts +76 -0
- package/src/Extensions/ImageExtension/AssetImageExtension.ts +111 -0
- package/src/Extensions/ImageExtension/ImageExtension.ts +17 -1
- 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 +71 -85
- package/src/Extensions/LinkExtension/common.ts +10 -0
- package/src/Extensions/PreformattedExtension/PreformattedExtension.spec.ts +41 -0
- package/src/Extensions/PreformattedExtension/PreformattedExtension.ts +6 -2
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useExpandedSelection.ts +44 -0
- package/src/index.ts +3 -2
- package/src/types.ts +5 -0
- package/src/ui/Button/Button.tsx +10 -6
- package/src/ui/Button/_button.scss +1 -1
- package/src/ui/Fields/Input/Input.spec.tsx +7 -1
- package/src/ui/Fields/Input/Input.tsx +23 -4
- package/src/ui/Modal/Modal.spec.tsx +15 -0
- package/src/ui/Modal/Modal.tsx +8 -4
- package/src/ui/ToolbarDropdown/_toolbar-dropdown.scss +1 -1
- package/src/ui/_forms.scss +14 -0
- package/src/utils/converters/mocks/squizNodeJson.mock.ts +196 -0
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.spec.ts +41 -6
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts +132 -111
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.spec.ts +68 -34
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts +115 -79
- package/src/utils/resolveMatrixAssetUrl.spec.ts +26 -0
- package/src/utils/resolveMatrixAssetUrl.ts +7 -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 +26 -13
- package/tsconfig.json +1 -1
- package/lib/FormattedTextEditor.d.ts +0 -2
- package/lib/FormattedTextEditor.js +0 -7
- package/lib/utils/converters/validNodeTypes.d.ts +0 -2
- package/lib/utils/converters/validNodeTypes.js +0 -21
- package/src/Editor/Editor.mock.tsx +0 -43
- package/src/FormattedTextEditor.spec.tsx +0 -10
- package/src/FormattedTextEditor.tsx +0 -3
- package/src/utils/converters/validNodeTypes.spec.ts +0 -33
- package/src/utils/converters/validNodeTypes.ts +0 -21
- /package/tests/{select.tsx → select.ts} +0 -0
@@ -1,16 +1,23 @@
|
|
1
|
-
import { ApplySchemaAttributes, MarkExtensionSpec, MarkSpecOverride } from 'remirror';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
|
5
|
-
|
6
|
-
text: string;
|
7
|
-
};
|
8
|
-
export type LinkAttributes = RemirrorLinkAttributes & {
|
1
|
+
import { ApplySchemaAttributes, FromToProps, MarkExtensionSpec, MarkSpecOverride } from 'remirror';
|
2
|
+
import { CommandFunction, 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
|
+
};
|
13
|
+
export type UpdateLinkProps = {
|
14
|
+
text: string;
|
15
|
+
attrs: Partial<LinkAttributes>;
|
16
|
+
range: FromToProps;
|
10
17
|
};
|
11
|
-
export declare class LinkExtension extends
|
18
|
+
export declare class LinkExtension extends MarkExtension<LinkOptions> {
|
19
|
+
get name(): string;
|
12
20
|
createMarkSpec(extra: ApplySchemaAttributes, override: MarkSpecOverride): MarkExtensionSpec;
|
13
|
-
|
14
|
-
|
15
|
-
updateLink(options: UpdateLinkOptions): CommandFunction;
|
21
|
+
updateLink({ text, attrs, range }: UpdateLinkProps): CommandFunction;
|
22
|
+
removeLink(): CommandFunction;
|
16
23
|
}
|
@@ -1,18 +1,31 @@
|
|
1
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
|
+
};
|
2
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
9
|
exports.LinkExtension = void 0;
|
4
10
|
const remirror_1 = require("remirror");
|
5
11
|
const core_1 = require("@remirror/core");
|
6
|
-
const
|
7
|
-
|
12
|
+
const common_1 = require("./common");
|
13
|
+
const CommandsExtension_1 = require("../CommandsExtension/CommandsExtension");
|
14
|
+
const Extensions_1 = require("../Extensions");
|
15
|
+
let LinkExtension = class LinkExtension extends core_1.MarkExtension {
|
16
|
+
get name() {
|
17
|
+
return Extensions_1.MarkName.Link;
|
18
|
+
}
|
8
19
|
createMarkSpec(extra, override) {
|
9
|
-
const spec = super.createMarkSpec(extra, override);
|
10
20
|
return {
|
11
|
-
|
12
|
-
excludes:
|
21
|
+
inclusive: false,
|
22
|
+
excludes: Extensions_1.MarkName.AssetLink,
|
23
|
+
...override,
|
13
24
|
attrs: {
|
14
|
-
...
|
25
|
+
...extra.defaults(),
|
26
|
+
href: {},
|
15
27
|
title: { default: undefined },
|
28
|
+
target: { default: this.options.defaultTarget },
|
16
29
|
},
|
17
30
|
parseDOM: [
|
18
31
|
{
|
@@ -23,75 +36,52 @@ class LinkExtension extends extensions_1.LinkExtension {
|
|
23
36
|
}
|
24
37
|
return {
|
25
38
|
...extra.parse(node),
|
26
|
-
auto: false,
|
27
39
|
href: node.getAttribute('href'),
|
28
|
-
target: node.getAttribute('target'),
|
29
40
|
title: node.getAttribute('title'),
|
41
|
+
target: (0, common_1.validateTarget)(node.getAttribute('target'), this.options.supportedTargets, this.options.defaultTarget),
|
30
42
|
};
|
31
43
|
},
|
32
44
|
},
|
33
45
|
],
|
46
|
+
toDOM: (node) => {
|
47
|
+
const { target, ...rest } = (0, core_1.omitExtraAttributes)(node.attrs, extra);
|
48
|
+
const rel = 'noopener noreferrer nofollow';
|
49
|
+
const attrs = {
|
50
|
+
...extra.dom(node),
|
51
|
+
...rest,
|
52
|
+
rel,
|
53
|
+
target: (0, common_1.validateTarget)(target, this.options.supportedTargets, this.options.defaultTarget),
|
54
|
+
};
|
55
|
+
return ['a', attrs, 0];
|
56
|
+
},
|
34
57
|
};
|
35
58
|
}
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
selectedText,
|
44
|
-
from,
|
45
|
-
to,
|
59
|
+
updateLink({ text, attrs, range }) {
|
60
|
+
return this.store.getExtension(CommandsExtension_1.CommandsExtension).updateMark({
|
61
|
+
attrs,
|
62
|
+
text,
|
63
|
+
range,
|
64
|
+
mark: this.type,
|
65
|
+
removeMark: !attrs.href,
|
46
66
|
});
|
47
|
-
return true;
|
48
67
|
}
|
49
|
-
|
50
|
-
|
51
|
-
// the select text is widened to include the link but retains non-link selected text as well.
|
52
|
-
return (props) => {
|
53
|
-
const { tr } = props;
|
54
|
-
const ranges = (0, remirror_1.getMarkRanges)(tr.selection, this.type);
|
55
|
-
if (ranges.length === 0) {
|
56
|
-
return false;
|
57
|
-
}
|
58
|
-
// work out the start position of the first link and end position of the last link in the selection.
|
59
|
-
const from = Math.min(tr.selection.from, ...ranges.map((range) => range.from));
|
60
|
-
const to = Math.max(tr.selection.to, ...ranges.map((range) => range.to));
|
61
|
-
// don't need to widen the selection, return early.
|
62
|
-
if (tr.selection.from === from && tr.selection.to === to) {
|
63
|
-
return false;
|
64
|
-
}
|
65
|
-
// widen the selection to make sure the full link is included.
|
66
|
-
this.store.commands.selectText.original({ from, to })(props);
|
67
|
-
return true;
|
68
|
-
};
|
69
|
-
}
|
70
|
-
updateLink(options) {
|
71
|
-
const { text, ...attrs } = options;
|
72
|
-
return (props) => {
|
73
|
-
const { tr, dispatch, view } = props;
|
74
|
-
const range = { from: tr.selection.from, to: tr.selection.to };
|
75
|
-
const selectedText = tr.doc.textBetween(range.from, range.to);
|
76
|
-
if (text !== selectedText) {
|
77
|
-
// update the text in the editor if it was updated, update the range to cover the length of the new text.
|
78
|
-
tr.insertText(text);
|
79
|
-
range.to = range.from + text.length;
|
80
|
-
}
|
81
|
-
// apply the link, or remove it if no URL was provided.
|
82
|
-
if (attrs.href.length > 0) {
|
83
|
-
tr.addMark(range.from, range.to, this.type.create(attrs));
|
84
|
-
}
|
85
|
-
else {
|
86
|
-
tr.removeMark(range.from, range.to, this.type);
|
87
|
-
}
|
88
|
-
// move the cursor to the end of the link and re-focus the editor.
|
89
|
-
tr.setSelection((0, core_1.getTextSelection)({ from: range.to, to: range.to }, tr.doc));
|
90
|
-
// apply the transaction.
|
91
|
-
dispatch?.(tr);
|
92
|
-
view?.focus();
|
93
|
-
return true;
|
94
|
-
};
|
68
|
+
removeLink() {
|
69
|
+
return (0, core_1.removeMark)({ type: this.type });
|
95
70
|
}
|
96
|
-
}
|
71
|
+
};
|
72
|
+
__decorate([
|
73
|
+
(0, core_1.command)()
|
74
|
+
], LinkExtension.prototype, "updateLink", null);
|
75
|
+
__decorate([
|
76
|
+
(0, core_1.command)()
|
77
|
+
], LinkExtension.prototype, "removeLink", null);
|
78
|
+
LinkExtension = __decorate([
|
79
|
+
(0, core_1.extension)({
|
80
|
+
defaultOptions: {
|
81
|
+
defaultTarget: common_1.LinkTarget.Self,
|
82
|
+
supportedTargets: [common_1.LinkTarget.Self, common_1.LinkTarget.Blank],
|
83
|
+
},
|
84
|
+
defaultPriority: remirror_1.ExtensionPriority.Medium,
|
85
|
+
})
|
86
|
+
], LinkExtension);
|
97
87
|
exports.LinkExtension = LinkExtension;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.validateTarget = exports.LinkTarget = void 0;
|
4
|
+
var LinkTarget;
|
5
|
+
(function (LinkTarget) {
|
6
|
+
LinkTarget["Self"] = "_self";
|
7
|
+
LinkTarget["Blank"] = "_blank";
|
8
|
+
LinkTarget["Parent"] = "_parent";
|
9
|
+
LinkTarget["Top"] = "_top";
|
10
|
+
})(LinkTarget = exports.LinkTarget || (exports.LinkTarget = {}));
|
11
|
+
const validateTarget = (target, supportedTargets, defaultTarget) => {
|
12
|
+
return supportedTargets.includes(target) ? target : defaultTarget;
|
13
|
+
};
|
14
|
+
exports.validateTarget = validateTarget;
|
@@ -24,9 +24,13 @@ let PreformattedExtension = class PreformattedExtension extends core_1.NodeExten
|
|
24
24
|
attrs: {
|
25
25
|
...extra.defaults(),
|
26
26
|
},
|
27
|
-
parseDOM: [
|
27
|
+
parseDOM: [
|
28
|
+
{
|
29
|
+
tag: 'pre',
|
30
|
+
},
|
31
|
+
],
|
28
32
|
toDOM: (node) => {
|
29
|
-
return [
|
33
|
+
return ['pre', extra.dom(node), 0];
|
30
34
|
},
|
31
35
|
};
|
32
36
|
}
|
package/lib/hooks/index.d.ts
CHANGED
package/lib/hooks/index.js
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
import { Selection } from '@remirror/core';
|
2
|
+
import { Mark, MarkType } from 'remirror';
|
3
|
+
export type ExpandedSelection = {
|
4
|
+
selection: Selection;
|
5
|
+
marks: Mark[];
|
6
|
+
};
|
7
|
+
/**
|
8
|
+
* Returns a single range that is either:
|
9
|
+
* 1. The current selection if the current selection does not contain any of the indicated marks.
|
10
|
+
* 2. An expanded version of the current selection if the range contains any of the indicated marks.
|
11
|
+
*
|
12
|
+
* For example, given the content:
|
13
|
+
*
|
14
|
+
* <strong>Bold</strong> regular <u>underline</u> <u>more underline</u>
|
15
|
+
*
|
16
|
+
* If the marks passed in are 'bold' and 'underline' and the text "old regular under" is selected
|
17
|
+
* the returned range will be "Bold regular underline".
|
18
|
+
*
|
19
|
+
* @param {(MarkType|string)[]} markTypes
|
20
|
+
*
|
21
|
+
* @return {ExpandedSelection}
|
22
|
+
*/
|
23
|
+
export declare const useExpandedSelection: (markTypes: (MarkType | string)[]) => ExpandedSelection;
|
@@ -0,0 +1,37 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useExpandedSelection = void 0;
|
4
|
+
const remirror_1 = require("remirror");
|
5
|
+
const react_1 = require("@remirror/react");
|
6
|
+
/**
|
7
|
+
* Returns a single range that is either:
|
8
|
+
* 1. The current selection if the current selection does not contain any of the indicated marks.
|
9
|
+
* 2. An expanded version of the current selection if the range contains any of the indicated marks.
|
10
|
+
*
|
11
|
+
* For example, given the content:
|
12
|
+
*
|
13
|
+
* <strong>Bold</strong> regular <u>underline</u> <u>more underline</u>
|
14
|
+
*
|
15
|
+
* If the marks passed in are 'bold' and 'underline' and the text "old regular under" is selected
|
16
|
+
* the returned range will be "Bold regular underline".
|
17
|
+
*
|
18
|
+
* @param {(MarkType|string)[]} markTypes
|
19
|
+
*
|
20
|
+
* @return {ExpandedSelection}
|
21
|
+
*/
|
22
|
+
const useExpandedSelection = (markTypes) => {
|
23
|
+
const { doc, selection } = (0, react_1.useEditorState)();
|
24
|
+
const ranges = [];
|
25
|
+
markTypes.forEach((markType) => {
|
26
|
+
ranges.push(...(0, remirror_1.getMarkRanges)(selection, markType));
|
27
|
+
});
|
28
|
+
if (ranges.length === 0) {
|
29
|
+
return { selection, marks: [] };
|
30
|
+
}
|
31
|
+
// work out the start position of the first link and end position of the last link in the selection.
|
32
|
+
const from = Math.min(selection.from, ...ranges.map((range) => range.from));
|
33
|
+
const to = Math.max(selection.to, ...ranges.map((range) => range.to));
|
34
|
+
const marks = ranges.map((range) => range.mark);
|
35
|
+
return { selection: (0, remirror_1.getTextSelection)({ from, to }, doc), marks };
|
36
|
+
};
|
37
|
+
exports.useExpandedSelection = useExpandedSelection;
|
package/lib/index.css
CHANGED
@@ -388,6 +388,10 @@
|
|
388
388
|
margin-top: 1.5rem !important;
|
389
389
|
margin-bottom: 1.5rem !important;
|
390
390
|
}
|
391
|
+
.squiz-fte-scope .my-auto {
|
392
|
+
margin-top: auto !important;
|
393
|
+
margin-bottom: auto !important;
|
394
|
+
}
|
391
395
|
.squiz-fte-scope .-mr-3 {
|
392
396
|
margin-right: -0.75rem !important;
|
393
397
|
}
|
@@ -444,9 +448,6 @@
|
|
444
448
|
.squiz-fte-scope .flex-row {
|
445
449
|
flex-direction: row !important;
|
446
450
|
}
|
447
|
-
.squiz-fte-scope .items-end {
|
448
|
-
align-items: flex-end !important;
|
449
|
-
}
|
450
451
|
.squiz-fte-scope .items-center {
|
451
452
|
align-items: center !important;
|
452
453
|
}
|
@@ -576,9 +577,6 @@
|
|
576
577
|
--tw-blur: blur(8px) !important;
|
577
578
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
|
578
579
|
}
|
579
|
-
.squiz-fte-scope .filter {
|
580
|
-
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
|
581
|
-
}
|
582
580
|
.squiz-fte-scope a {
|
583
581
|
--tw-text-opacity: 1;
|
584
582
|
color: rgb(7 116 210 / var(--tw-text-opacity));
|
@@ -665,10 +663,24 @@
|
|
665
663
|
.squiz-fte-scope .squiz-fte-form-control:active {
|
666
664
|
box-shadow: none;
|
667
665
|
}
|
666
|
+
.squiz-fte-scope .squiz-fte-invalid-form-field .squiz-fte-form-control {
|
667
|
+
--tw-border-opacity: 1;
|
668
|
+
border-color: rgb(215 35 33 / var(--tw-border-opacity));
|
669
|
+
background-repeat: no-repeat;
|
670
|
+
padding-right: 2rem;
|
671
|
+
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0ibm9uZSIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiPjxwYXRoIGQ9Ik00LjQ3IDIxaDE1LjA2YzEuNTQgMCAyLjUtMS42NyAxLjczLTNMMTMuNzMgNC45OWMtLjc3LTEuMzMtMi42OS0xLjMzLTMuNDYgMEwyLjc0IDE4Yy0uNzcgMS4zMy4xOSAzIDEuNzMgM3pNMTIgMTRjLS41NSAwLTEtLjQ1LTEtMXYtMmMwLS41NS40NS0xIDEtMXMxIC40NSAxIDF2MmMwIC41NS0uNDUgMS0xIDF6bTEgNGgtMnYtMmgydjJ6IiBjbGFzcz0ic2VsZWN0ZWQiIGZpbGw9IiNkNzIzMjEiLz48L2c+PC9zdmc+);
|
672
|
+
background-position: top 0.25rem right 0.25rem;
|
673
|
+
background-size: 1.5rem;
|
674
|
+
}
|
675
|
+
.squiz-fte-scope .squiz-fte-form-error {
|
676
|
+
--tw-text-opacity: 1;
|
677
|
+
color: rgb(215 35 33 / var(--tw-text-opacity));
|
678
|
+
font-size: 13px;
|
679
|
+
line-height: 1.23;
|
680
|
+
padding-top: 0.25rem;
|
681
|
+
}
|
668
682
|
.squiz-fte-scope .formatted-text-editor {
|
669
683
|
font-family: "Open Sans" !important;
|
670
|
-
}
|
671
|
-
.squiz-fte-scope .formatted-text-editor.editor-wrapper {
|
672
684
|
border-radius: 4px;
|
673
685
|
border-width: 2px;
|
674
686
|
border-style: solid;
|
@@ -695,6 +707,7 @@
|
|
695
707
|
var(--tw-ring-shadow, 0 0 #0000),
|
696
708
|
var(--tw-shadow);
|
697
709
|
overflow: auto;
|
710
|
+
min-height: 15vh;
|
698
711
|
}
|
699
712
|
.squiz-fte-scope .formatted-text-editor .remirror-editor:active,
|
700
713
|
.squiz-fte-scope .formatted-text-editor .remirror-editor:focus {
|
@@ -703,6 +716,14 @@
|
|
703
716
|
.squiz-fte-scope .formatted-text-editor .remirror-editor p {
|
704
717
|
display: block;
|
705
718
|
}
|
719
|
+
.squiz-fte-scope .formatted-text-editor--is-disabled .remirror-editor {
|
720
|
+
cursor: not-allowed;
|
721
|
+
--tw-bg-opacity: 1;
|
722
|
+
background-color: rgb(224 224 224 / var(--tw-bg-opacity));
|
723
|
+
}
|
724
|
+
.squiz-fte-scope .formatted-text-editor--is-disabled .remirror-is-empty:first-of-type::before {
|
725
|
+
display: none;
|
726
|
+
}
|
706
727
|
.squiz-fte-scope .formatted-text-editor .remirror-is-empty:first-of-type::before {
|
707
728
|
position: absolute;
|
708
729
|
pointer-events: none;
|
@@ -712,7 +733,17 @@
|
|
712
733
|
--tw-text-opacity: 1;
|
713
734
|
color: rgb(148 148 148 / var(--tw-text-opacity));
|
714
735
|
}
|
715
|
-
.squiz-fte-scope .editor-
|
736
|
+
.squiz-fte-scope .formatted-text-editor .ProseMirror-selectednode {
|
737
|
+
border-width: 2px;
|
738
|
+
border-style: solid;
|
739
|
+
--tw-border-opacity: 1;
|
740
|
+
border-color: rgb(7 116 210 / var(--tw-border-opacity));
|
741
|
+
}
|
742
|
+
.squiz-fte-scope .formatted-text-editor img {
|
743
|
+
display: inline;
|
744
|
+
}
|
745
|
+
.squiz-fte-scope .editor-toolbar,
|
746
|
+
.squiz-fte-scope__floating-popover {
|
716
747
|
border-bottom-width: 2px;
|
717
748
|
border-style: solid;
|
718
749
|
--tw-border-opacity: 1;
|
@@ -723,10 +754,12 @@
|
|
723
754
|
display: flex;
|
724
755
|
justify-items: center;
|
725
756
|
}
|
726
|
-
.squiz-fte-scope .editor-toolbar > *:not(:first-child, .editor-divider)
|
757
|
+
.squiz-fte-scope .editor-toolbar > *:not(:first-child, .editor-divider),
|
758
|
+
.squiz-fte-scope .squiz-fte-scope__floating-popover > *:not(:first-child, .editor-divider) {
|
727
759
|
margin: 0 0 0 2px;
|
728
760
|
}
|
729
|
-
.squiz-fte-scope .editor-toolbar .editor-divider
|
761
|
+
.squiz-fte-scope .editor-toolbar .editor-divider,
|
762
|
+
.squiz-fte-scope .squiz-fte-scope__floating-popover .editor-divider {
|
730
763
|
margin-top: -0.25rem;
|
731
764
|
margin-bottom: -0.25rem;
|
732
765
|
margin-left: 0.25rem;
|
@@ -735,10 +768,13 @@
|
|
735
768
|
margin-right: 2px;
|
736
769
|
height: auto;
|
737
770
|
}
|
738
|
-
.squiz-fte-scope .editor-toolbar .squiz-fte-btn
|
771
|
+
.squiz-fte-scope .editor-toolbar .squiz-fte-btn,
|
772
|
+
.squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-btn {
|
739
773
|
padding: 0.25rem;
|
774
|
+
font-weight: 700;
|
740
775
|
}
|
741
|
-
.squiz-fte-scope .editor-toolbar .squiz-fte-btn ~ .squiz-fte-btn
|
776
|
+
.squiz-fte-scope .editor-toolbar .squiz-fte-btn ~ .squiz-fte-btn,
|
777
|
+
.squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-btn ~ .squiz-fte-btn {
|
742
778
|
margin-left: 2px;
|
743
779
|
}
|
744
780
|
.squiz-fte-scope__floating-popover {
|
@@ -757,17 +793,15 @@
|
|
757
793
|
var(--tw-ring-shadow, 0 0 #0000),
|
758
794
|
var(--tw-shadow);
|
759
795
|
}
|
760
|
-
.squiz-fte-scope .squiz-fte-scope__floating-popover .
|
761
|
-
|
762
|
-
|
763
|
-
.squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-btn ~ .squiz-fte-btn {
|
764
|
-
margin-left: 2px;
|
796
|
+
.squiz-fte-scope .squiz-fte-scope__floating-popover .editor-divider {
|
797
|
+
margin-top: 0px;
|
798
|
+
margin-bottom: 0px;
|
765
799
|
}
|
766
800
|
.squiz-fte-scope .squiz-fte-btn {
|
767
801
|
border-radius: 4px;
|
768
802
|
--tw-bg-opacity: 1;
|
769
803
|
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
|
770
|
-
font-weight:
|
804
|
+
font-weight: 700;
|
771
805
|
--tw-text-opacity: 1;
|
772
806
|
color: rgb(112 112 112 / var(--tw-text-opacity));
|
773
807
|
transition-property: all;
|
@@ -810,6 +844,7 @@
|
|
810
844
|
.squiz-fte-scope .toolbar-dropdown__button {
|
811
845
|
display: flex;
|
812
846
|
align-items: center;
|
847
|
+
border-radius: 4px;
|
813
848
|
font-family:
|
814
849
|
Open Sans,
|
815
850
|
Arial,
|
@@ -926,15 +961,12 @@
|
|
926
961
|
font-size: 0.875rem;
|
927
962
|
font-weight: 700;
|
928
963
|
}
|
929
|
-
.squiz-fte-scope .editor-toolbar .squiz-fte-modal-footer__button
|
930
|
-
padding: 0.25rem;
|
931
|
-
}
|
932
|
-
.squiz-fte-scope .editor-toolbar .squiz-fte-modal-footer__button ~ .squiz-fte-btn {
|
933
|
-
margin-left: 2px;
|
934
|
-
}
|
964
|
+
.squiz-fte-scope .editor-toolbar .squiz-fte-modal-footer__button,
|
935
965
|
.squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-modal-footer__button {
|
936
966
|
padding: 0.25rem;
|
967
|
+
font-weight: 700;
|
937
968
|
}
|
969
|
+
.squiz-fte-scope .editor-toolbar .squiz-fte-modal-footer__button ~ .squiz-fte-btn,
|
938
970
|
.squiz-fte-scope .squiz-fte-scope__floating-popover .squiz-fte-modal-footer__button ~ .squiz-fte-btn {
|
939
971
|
margin-left: 2px;
|
940
972
|
}
|
@@ -942,7 +974,7 @@
|
|
942
974
|
border-radius: 4px;
|
943
975
|
--tw-bg-opacity: 1;
|
944
976
|
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
|
945
|
-
font-weight:
|
977
|
+
font-weight: 700;
|
946
978
|
--tw-text-opacity: 1;
|
947
979
|
color: rgb(112 112 112 / var(--tw-text-opacity));
|
948
980
|
transition-property: all;
|
package/lib/index.d.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
import
|
1
|
+
import Editor from './Editor/Editor';
|
2
|
+
import { EditorContext } from './Editor/EditorContext';
|
2
3
|
import { remirrorNodeToSquizNode } from './utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode';
|
3
4
|
import { squizNodeToRemirrorNode } from './utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode';
|
4
|
-
export {
|
5
|
+
export { Editor, EditorContext, remirrorNodeToSquizNode, squizNodeToRemirrorNode };
|
package/lib/index.js
CHANGED
@@ -3,9 +3,11 @@ 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
|
-
exports.squizNodeToRemirrorNode = exports.remirrorNodeToSquizNode = exports.
|
7
|
-
const
|
8
|
-
exports.
|
6
|
+
exports.squizNodeToRemirrorNode = exports.remirrorNodeToSquizNode = exports.EditorContext = exports.Editor = void 0;
|
7
|
+
const Editor_1 = __importDefault(require("./Editor/Editor"));
|
8
|
+
exports.Editor = Editor_1.default;
|
9
|
+
const EditorContext_1 = require("./Editor/EditorContext");
|
10
|
+
Object.defineProperty(exports, "EditorContext", { enumerable: true, get: function () { return EditorContext_1.EditorContext; } });
|
9
11
|
const remirrorNodeToSquizNode_1 = require("./utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode");
|
10
12
|
Object.defineProperty(exports, "remirrorNodeToSquizNode", { enumerable: true, get: function () { return remirrorNodeToSquizNode_1.remirrorNodeToSquizNode; } });
|
11
13
|
const squizNodeToRemirrorNode_1 = require("./utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode");
|
package/lib/types.d.ts
ADDED
package/lib/types.js
ADDED
@@ -6,6 +6,7 @@ type ButtonProps = {
|
|
6
6
|
label: string;
|
7
7
|
text?: string;
|
8
8
|
icon?: ReactElement;
|
9
|
+
className?: string;
|
9
10
|
};
|
10
|
-
declare const Button: ({ handleOnClick, isDisabled, isActive, label, text, icon }: ButtonProps) => JSX.Element;
|
11
|
+
declare const Button: ({ handleOnClick, isDisabled, isActive, label, text, icon, className }: ButtonProps) => JSX.Element;
|
11
12
|
export default Button;
|
package/lib/ui/Button/Button.js
CHANGED
@@ -5,10 +5,9 @@ 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 clsx_1 = __importDefault(require("clsx"));
|
8
|
-
const Button = ({ handleOnClick, isDisabled, isActive, label, text, icon }) => {
|
9
|
-
return (react_1.default.createElement("button", { "aria-label": label, title: label, type: "button", onClick: handleOnClick, disabled: isDisabled, className: (0, clsx_1.default)('squiz-fte-btn', isActive && 'squiz-fte-btn--is-active', icon && ' squiz-fte-btn--is-icon') },
|
10
|
-
react_1.default.createElement(
|
11
|
-
|
12
|
-
icon && icon)));
|
8
|
+
const Button = ({ handleOnClick, isDisabled, isActive, label, text, icon, className }) => {
|
9
|
+
return (react_1.default.createElement("button", { "aria-label": label, title: label, type: "button", onClick: handleOnClick, disabled: isDisabled, className: (0, clsx_1.default)('squiz-fte-btn', isActive && 'squiz-fte-btn--is-active', icon && ' squiz-fte-btn--is-icon', className) },
|
10
|
+
text && react_1.default.createElement("span", null, text),
|
11
|
+
icon && icon));
|
13
12
|
};
|
14
13
|
exports.default = Button;
|
@@ -22,12 +22,18 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
22
22
|
__setModuleDefault(result, mod);
|
23
23
|
return result;
|
24
24
|
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
25
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
29
|
exports.Input = void 0;
|
27
30
|
const react_1 = __importStar(require("react"));
|
28
|
-
const
|
29
|
-
|
31
|
+
const clsx_1 = __importDefault(require("clsx"));
|
32
|
+
const InputInternal = ({ name, label, type = 'text', error, required, ...rest }, ref) => {
|
33
|
+
return (react_1.default.createElement("div", { className: (0, clsx_1.default)(error && 'squiz-fte-invalid-form-field') },
|
30
34
|
label && (react_1.default.createElement("label", { htmlFor: name, className: "squiz-fte-form-label" }, label)),
|
31
|
-
react_1.default.createElement("
|
35
|
+
required && (react_1.default.createElement("span", { className: "text-gray-600", "aria-label": "Required field" }, "*")),
|
36
|
+
react_1.default.createElement("input", { ref: ref, id: name, name: name, type: type, "aria-invalid": !!error, className: "squiz-fte-form-control", ...rest }),
|
37
|
+
error && react_1.default.createElement("div", { className: "squiz-fte-form-error" }, error)));
|
32
38
|
};
|
33
39
|
exports.Input = (0, react_1.forwardRef)(InputInternal);
|
package/lib/ui/Modal/Modal.js
CHANGED
@@ -30,7 +30,9 @@ const react_1 = __importStar(require("react"));
|
|
30
30
|
const react_dom_1 = require("react-dom");
|
31
31
|
const CloseRounded_1 = __importDefault(require("@mui/icons-material/CloseRounded"));
|
32
32
|
const base_1 = require("@mui/base");
|
33
|
+
const clsx_1 = __importDefault(require("clsx"));
|
33
34
|
const Modal = ({ children, title, onCancel, onSubmit, className }, ref) => {
|
35
|
+
const content = (0, react_1.useRef)(null);
|
34
36
|
const container = (0, react_1.useMemo)(() => {
|
35
37
|
const element = document.createElement('div');
|
36
38
|
element.classList.add('squiz-fte-scope');
|
@@ -51,7 +53,7 @@ const Modal = ({ children, title, onCancel, onSubmit, className }, ref) => {
|
|
51
53
|
}, []);
|
52
54
|
// add/remove the modal container from the DOM and focus on the first input
|
53
55
|
(0, react_1.useEffect)(() => {
|
54
|
-
const firstInput =
|
56
|
+
const firstInput = content.current?.querySelector('input:not([type=hidden]), button');
|
55
57
|
document.body.appendChild(container);
|
56
58
|
firstInput?.focus();
|
57
59
|
return () => {
|
@@ -60,14 +62,14 @@ const Modal = ({ children, title, onCancel, onSubmit, className }, ref) => {
|
|
60
62
|
}, [container]);
|
61
63
|
return (0, react_dom_1.createPortal)(react_1.default.createElement(react_1.default.Fragment, null,
|
62
64
|
react_1.default.createElement(base_1.FocusTrap, { open: true },
|
63
|
-
react_1.default.createElement("div", { ref: ref, className:
|
65
|
+
react_1.default.createElement("div", { ref: ref, className: (0, clsx_1.default)('squiz-fte-modal-wrapper', className), tabIndex: -1 },
|
64
66
|
react_1.default.createElement("div", { className: "w-modal-sm my-6 mx-auto" },
|
65
67
|
react_1.default.createElement("div", { className: "squiz-fte-modal" },
|
66
68
|
react_1.default.createElement("div", { className: "squiz-fte-modal-header p-6 pb-2" },
|
67
69
|
react_1.default.createElement("h2", { className: "font-semibold text-gray-900 text-heading-2" }, title),
|
68
70
|
react_1.default.createElement("button", { type: "button", className: "ml-auto -mr-3 -mt-3 bg-transparent border-0 text-gray-600 font-semibold outline-none focus:outline-none hover:text-color-gray-800", onClick: onCancel, "aria-label": "Close" },
|
69
71
|
react_1.default.createElement(CloseRounded_1.default, null))),
|
70
|
-
react_1.default.createElement("div", { className: "squiz-fte-modal-content" }, children),
|
72
|
+
react_1.default.createElement("div", { className: "squiz-fte-modal-content", ref: content }, children),
|
71
73
|
react_1.default.createElement("div", { className: "squiz-fte-modal-footer p-6 pt-3" },
|
72
74
|
react_1.default.createElement("button", { className: "squiz-fte-modal-footer__button bg-gray-200 text-gray-700 mr-2 hover:bg-gray-300", type: "button", onClick: onCancel, "aria-label": "Cancel" }, "Cancel"),
|
73
75
|
onSubmit && (react_1.default.createElement("button", { className: "squiz-fte-modal-footer__button bg-blue-300 text-white hover:bg-blue-400", type: "button", onClick: onSubmit, "aria-label": "Apply" }, "Apply"))))))),
|
@@ -1,10 +1,9 @@
|
|
1
1
|
import { ProsemirrorNode } from 'remirror';
|
2
2
|
import { FORMATTED_TEXT_MODELS as FormattedTextModels } from '@squiz/dx-json-schema-lib';
|
3
|
-
export declare const resolveNodeTag: (node: ProsemirrorNode) => string
|
3
|
+
export declare const resolveNodeTag: (node: ProsemirrorNode) => string;
|
4
4
|
/**
|
5
5
|
* Converts Remirror node JSON structure to Squiz component JSON structure.
|
6
6
|
* @param {ProsemirrorNode} node Remirror node to convert to component.
|
7
|
-
* @export
|
8
7
|
* @returns {FormattedText} The converted Squiz component JSON.
|
9
8
|
*/
|
10
9
|
export declare const remirrorNodeToSquizNode: (node: ProsemirrorNode) => FormattedTextModels.v1.FormattedText;
|