@multiplatform.one/rich-text 7.7.6 → 7.8.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/dist/cjs/RichEditor.native.js +18 -7
- package/dist/cjs/RichEditor.native.js.map +1 -1
- package/dist/cjs/RichTextEditor/index.cjs +2 -0
- package/dist/cjs/RichTextEditor/index.native.js +2 -0
- package/dist/cjs/RichTextEditor/index.native.js.map +1 -1
- package/dist/cjs/editor/TentapEditor.native.js +29 -39
- package/dist/cjs/editor/TentapEditor.native.js.map +1 -1
- package/dist/cjs/editor/TiptapEditor.cjs +6 -2
- package/dist/cjs/editor/TiptapEditor.native.js +8 -4
- package/dist/cjs/editor/TiptapEditor.native.js.map +1 -1
- package/dist/cjs/editor/blockAnchor.cjs +3 -2
- package/dist/cjs/editor/blockAnchor.native.js +4 -2
- package/dist/cjs/editor/blockAnchor.native.js.map +1 -1
- package/dist/cjs/editor/nativeEditorCSS.cjs +30 -0
- package/dist/cjs/editor/nativeEditorCSS.native.js +33 -0
- package/dist/cjs/editor/nativeEditorCSS.native.js.map +1 -0
- package/dist/cjs/toolbar/HeadingPicker.cjs +7 -0
- package/dist/cjs/toolbar/HeadingPicker.native.js +13 -17
- package/dist/cjs/toolbar/HeadingPicker.native.js.map +1 -1
- package/dist/cjs/toolbar/ListPicker.cjs +7 -0
- package/dist/cjs/toolbar/ListPicker.native.js +12 -11
- package/dist/cjs/toolbar/ListPicker.native.js.map +1 -1
- package/dist/cjs/toolbar/MoreDropdown.cjs +7 -0
- package/dist/cjs/toolbar/MoreDropdown.native.js +12 -11
- package/dist/cjs/toolbar/MoreDropdown.native.js.map +1 -1
- package/dist/esm/RichEditor.native.js +19 -8
- package/dist/esm/RichEditor.native.js.map +1 -1
- package/dist/esm/RichTextEditor/index.mjs +2 -0
- package/dist/esm/RichTextEditor/index.mjs.map +1 -1
- package/dist/esm/RichTextEditor/index.native.js +2 -0
- package/dist/esm/RichTextEditor/index.native.js.map +1 -1
- package/dist/esm/editor/TentapEditor.native.js +29 -39
- package/dist/esm/editor/TentapEditor.native.js.map +1 -1
- package/dist/esm/editor/TiptapEditor.mjs +6 -2
- package/dist/esm/editor/TiptapEditor.mjs.map +1 -1
- package/dist/esm/editor/TiptapEditor.native.js +8 -4
- package/dist/esm/editor/TiptapEditor.native.js.map +1 -1
- package/dist/esm/editor/blockAnchor.mjs +3 -2
- package/dist/esm/editor/blockAnchor.mjs.map +1 -1
- package/dist/esm/editor/blockAnchor.native.js +4 -2
- package/dist/esm/editor/blockAnchor.native.js.map +1 -1
- package/dist/esm/editor/nativeEditorCSS.mjs +5 -0
- package/dist/esm/editor/nativeEditorCSS.mjs.map +1 -0
- package/dist/esm/editor/nativeEditorCSS.native.js +5 -0
- package/dist/esm/editor/nativeEditorCSS.native.js.map +1 -0
- package/dist/esm/toolbar/HeadingPicker.mjs +7 -0
- package/dist/esm/toolbar/HeadingPicker.mjs.map +1 -1
- package/dist/esm/toolbar/HeadingPicker.native.js +13 -17
- package/dist/esm/toolbar/HeadingPicker.native.js.map +1 -1
- package/dist/esm/toolbar/ListPicker.mjs +7 -0
- package/dist/esm/toolbar/ListPicker.mjs.map +1 -1
- package/dist/esm/toolbar/ListPicker.native.js +12 -11
- package/dist/esm/toolbar/ListPicker.native.js.map +1 -1
- package/dist/esm/toolbar/MoreDropdown.mjs +7 -0
- package/dist/esm/toolbar/MoreDropdown.mjs.map +1 -1
- package/dist/esm/toolbar/MoreDropdown.native.js +12 -11
- package/dist/esm/toolbar/MoreDropdown.native.js.map +1 -1
- package/dist/jsx/RichEditor.native.js +18 -7
- package/dist/jsx/RichEditor.native.js.map +1 -1
- package/dist/jsx/RichTextEditor/index.mjs +2 -0
- package/dist/jsx/RichTextEditor/index.mjs.map +1 -1
- package/dist/jsx/RichTextEditor/index.native.js +2 -0
- package/dist/jsx/RichTextEditor/index.native.js.map +1 -1
- package/dist/jsx/editor/TentapEditor.native.js +29 -39
- package/dist/jsx/editor/TentapEditor.native.js.map +1 -1
- package/dist/jsx/editor/TiptapEditor.mjs +6 -2
- package/dist/jsx/editor/TiptapEditor.mjs.map +1 -1
- package/dist/jsx/editor/TiptapEditor.native.js +8 -4
- package/dist/jsx/editor/TiptapEditor.native.js.map +1 -1
- package/dist/jsx/editor/blockAnchor.mjs +3 -2
- package/dist/jsx/editor/blockAnchor.mjs.map +1 -1
- package/dist/jsx/editor/blockAnchor.native.js +4 -2
- package/dist/jsx/editor/blockAnchor.native.js.map +1 -1
- package/dist/jsx/editor/nativeEditorCSS.mjs +5 -0
- package/dist/jsx/editor/nativeEditorCSS.mjs.map +1 -0
- package/dist/jsx/editor/nativeEditorCSS.native.js +33 -0
- package/dist/jsx/editor/nativeEditorCSS.native.js.map +1 -0
- package/dist/jsx/toolbar/HeadingPicker.mjs +7 -0
- package/dist/jsx/toolbar/HeadingPicker.mjs.map +1 -1
- package/dist/jsx/toolbar/HeadingPicker.native.js +13 -17
- package/dist/jsx/toolbar/HeadingPicker.native.js.map +1 -1
- package/dist/jsx/toolbar/ListPicker.mjs +7 -0
- package/dist/jsx/toolbar/ListPicker.mjs.map +1 -1
- package/dist/jsx/toolbar/ListPicker.native.js +12 -11
- package/dist/jsx/toolbar/ListPicker.native.js.map +1 -1
- package/dist/jsx/toolbar/MoreDropdown.mjs +7 -0
- package/dist/jsx/toolbar/MoreDropdown.mjs.map +1 -1
- package/dist/jsx/toolbar/MoreDropdown.native.js +12 -11
- package/dist/jsx/toolbar/MoreDropdown.native.js.map +1 -1
- package/package.json +10 -8
- package/src/RichEditor.native.spec.tsx +158 -0
- package/src/RichEditor.native.tsx +28 -7
- package/src/RichTextEditor/index.tsx +4 -2
- package/src/RichTextEditor/richTextEditor.spec.tsx +40 -6
- package/src/editor/SlashCommands.spec.tsx +3 -1
- package/src/editor/TentapEditor.native.spec.tsx +120 -0
- package/src/editor/TentapEditor.native.tsx +40 -54
- package/src/editor/TiptapEditor.tsx +2 -2
- package/src/editor/blockAnchor.ts +3 -2
- package/src/editor/nativeEditorCSS.spec.ts +75 -0
- package/src/editor/nativeEditorCSS.ts +4 -0
- package/src/integration.spec.tsx +0 -23
- package/src/richEditor.spec.tsx +0 -23
- package/src/toolbar/HeadingPicker.tsx +14 -15
- package/src/toolbar/ListPicker.tsx +13 -9
- package/src/toolbar/MoreDropdown.tsx +13 -9
- package/src/toolbar/bubbleToolbar.spec.tsx +2 -1
- package/src/toolbar/fixedToolbarStories.spec.tsx +4 -2
- package/src/toolbar/statusBarStories.spec.tsx +4 -2
- package/src/toolbar/toolbarButtonStories.spec.tsx +4 -2
- package/src/toolbar/toolbarGroupStories.spec.tsx +4 -2
- package/types/RichEditor.native.d.ts.map +1 -1
- package/types/RichTextEditor/index.d.ts +1 -1
- package/types/RichTextEditor/index.d.ts.map +1 -1
- package/types/editor/TentapEditor.native.d.ts.map +1 -1
- package/types/editor/blockAnchor.d.ts.map +1 -1
- package/types/editor/nativeEditorCSS.d.ts +3 -0
- package/types/editor/nativeEditorCSS.d.ts.map +1 -0
- package/types/toolbar/HeadingPicker.d.ts.map +1 -1
- package/types/toolbar/ListPicker.d.ts.map +1 -1
- package/types/toolbar/MoreDropdown.d.ts.map +1 -1
|
@@ -447,10 +447,10 @@ export const TiptapEditor = memo(
|
|
|
447
447
|
getHTML: () => editor?.getHTML() || "",
|
|
448
448
|
getJSON: () => editor?.getJSON() || null,
|
|
449
449
|
getMarkdown: () => htmlToMarkdown(editor?.getHTML() || ""),
|
|
450
|
-
setHTML: (html: string) => editor?.commands.setContent(html),
|
|
451
|
-
setJSON: (json: any) => editor?.commands.setContent(json),
|
|
452
450
|
// External value sync (not a user edit): emitUpdate false so the
|
|
453
451
|
// host's own set does not echo back through onChange.
|
|
452
|
+
setHTML: (html: string) => editor?.commands.setContent(html, { emitUpdate: false }),
|
|
453
|
+
setJSON: (json: any) => editor?.commands.setContent(json, { emitUpdate: false }),
|
|
454
454
|
setMarkdown: (markdown: string) =>
|
|
455
455
|
editor?.commands.setContent(markdownToHtml(markdown), { emitUpdate: false }),
|
|
456
456
|
focus: () => editor?.commands.focus(),
|
|
@@ -32,9 +32,10 @@ export function getBlockVirtualElement(
|
|
|
32
32
|
if ($from.node(depth).type.name !== nodeTypeName) continue;
|
|
33
33
|
const dom = editor.view.nodeDOM($from.before(depth));
|
|
34
34
|
if (dom instanceof HTMLElement) {
|
|
35
|
+
const block = dom.querySelector<HTMLElement>(":scope > table") ?? dom;
|
|
35
36
|
return {
|
|
36
|
-
getBoundingClientRect: () =>
|
|
37
|
-
contextElement:
|
|
37
|
+
getBoundingClientRect: () => block.getBoundingClientRect(),
|
|
38
|
+
contextElement: block,
|
|
38
39
|
};
|
|
39
40
|
}
|
|
40
41
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { runInNewContext } from "node:vm";
|
|
5
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
6
|
+
import { getEditorCSS } from "./editorStyles";
|
|
7
|
+
import { escapeNativeEditorCSS } from "./nativeEditorCSS";
|
|
8
|
+
|
|
9
|
+
// Execute the installed transport instead of copying its template-literal
|
|
10
|
+
// serializer. Only its unused native platform import needs a test stub.
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
const upstreamExports: Record<string, any> = {};
|
|
13
|
+
runInNewContext(
|
|
14
|
+
readFileSync(
|
|
15
|
+
path.join(
|
|
16
|
+
path.dirname(require.resolve("@10play/tentap-editor/package.json")),
|
|
17
|
+
"lib/commonjs/RichText/utils.js",
|
|
18
|
+
),
|
|
19
|
+
"utf8",
|
|
20
|
+
),
|
|
21
|
+
{ exports: upstreamExports, require: () => ({ Platform: { OS: "ios" } }) },
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
function injectCSS(css: string, tag: string) {
|
|
25
|
+
const context = { document, cssContent: "" };
|
|
26
|
+
runInNewContext(upstreamExports.getStyleSheetCSS(escapeNativeEditorCSS(css), tag), context);
|
|
27
|
+
return context.cssContent;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
document.head.querySelectorAll("style[data-tag]").forEach((node) => node.remove());
|
|
32
|
+
document.body.innerHTML = "";
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe("native editor CSS transport", () => {
|
|
36
|
+
it("delivers the full content stylesheet and its typing inset", () => {
|
|
37
|
+
const css = getEditorCSS({
|
|
38
|
+
bodyFontFamily: "system-ui, sans-serif",
|
|
39
|
+
fullscreen: true,
|
|
40
|
+
motionMs: 0,
|
|
41
|
+
});
|
|
42
|
+
expect(injectCSS(css, "content")).toBe(css);
|
|
43
|
+
const editor = document.createElement("div");
|
|
44
|
+
editor.className = "ProseMirror";
|
|
45
|
+
document.body.append(editor);
|
|
46
|
+
expect(getComputedStyle(editor).paddingLeft).toBe("16px");
|
|
47
|
+
expect(getComputedStyle(editor).paddingRight).toBe("12px");
|
|
48
|
+
expect(getComputedStyle(editor).fontFamily).toBe("system-ui, sans-serif");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("preserves CSS escapes and literal template syntax without executing it", () => {
|
|
52
|
+
const css = String.raw`.ProseMirror::before { content: "\25B8 \` \${document.body.textContent = "executed"}"; }`;
|
|
53
|
+
expect(injectCSS(css, "content")).toBe(css);
|
|
54
|
+
expect(document.body.textContent).toBe("");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it.each([
|
|
58
|
+
'.ProseMirror::before { content: "`"; }',
|
|
59
|
+
".ProseMirror::before { content: \"${document.body.textContent = 'executed'}\"; }",
|
|
60
|
+
])("keeps raw template characters literal: %s", (css) => {
|
|
61
|
+
expect(injectCSS(css, "content")).toBe(css);
|
|
62
|
+
expect(document.body.textContent).toBe("");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("replaces a tagged stylesheet without changing document contents", () => {
|
|
66
|
+
document.body.innerHTML = '<div class="ProseMirror">Saved <strong>text</strong></div>';
|
|
67
|
+
injectCSS(".ProseMirror { padding: 2px; }", "content");
|
|
68
|
+
const next = getEditorCSS({ bodyFontFamily: "Georgia, serif" });
|
|
69
|
+
expect(injectCSS(next, "content")).toBe(next);
|
|
70
|
+
expect(document.querySelectorAll('style[data-tag="content"]')).toHaveLength(1);
|
|
71
|
+
expect(document.body.innerHTML).toBe(
|
|
72
|
+
'<div class="ProseMirror">Saved <strong>text</strong></div>',
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
});
|
package/src/integration.spec.tsx
CHANGED
|
@@ -149,29 +149,6 @@ vi.mock("@multiplatform.one/components", async (importOriginal) => ({
|
|
|
149
149
|
Tooltip: ({ children }: any) => children,
|
|
150
150
|
}));
|
|
151
151
|
|
|
152
|
-
vi.mock("@multiplatform.one/theme", async (importOriginal) => ({
|
|
153
|
-
...(await importOriginal<Record<string, unknown>>()),
|
|
154
|
-
useResolvedKnobs: () => ({
|
|
155
|
-
knobProps: {
|
|
156
|
-
body: {},
|
|
157
|
-
borderRadius: { borderRadius: "$3", borderWidth: 1 },
|
|
158
|
-
elevation: undefined,
|
|
159
|
-
sizeToken: "$4",
|
|
160
|
-
outlined: false,
|
|
161
|
-
inputBackground: "$color2",
|
|
162
|
-
textAccentColor: "$color",
|
|
163
|
-
transition: undefined,
|
|
164
|
-
heading: {},
|
|
165
|
-
},
|
|
166
|
-
control: {
|
|
167
|
-
hoverKnobProps: undefined,
|
|
168
|
-
pressKnobProps: undefined,
|
|
169
|
-
focusKnobProps: undefined,
|
|
170
|
-
focusVisibleKnobProps: undefined,
|
|
171
|
-
},
|
|
172
|
-
}),
|
|
173
|
-
}));
|
|
174
|
-
|
|
175
152
|
vi.mock("@tiptap/react/menus", () => ({
|
|
176
153
|
BubbleMenu: ({ children }: any) => <div data-testid="bubble-menu">{children}</div>,
|
|
177
154
|
}));
|
package/src/richEditor.spec.tsx
CHANGED
|
@@ -32,29 +32,6 @@ vi.mock("@multiplatform.one/components", async (importOriginal) => ({
|
|
|
32
32
|
Tooltip: ({ children }: any) => children,
|
|
33
33
|
}));
|
|
34
34
|
|
|
35
|
-
vi.mock("@multiplatform.one/theme", async (importOriginal) => ({
|
|
36
|
-
...(await importOriginal<Record<string, unknown>>()),
|
|
37
|
-
useResolvedKnobs: (_options?: any) => ({
|
|
38
|
-
knobProps: {
|
|
39
|
-
body: {},
|
|
40
|
-
borderRadius: { borderRadius: "$3", borderWidth: 1 },
|
|
41
|
-
elevation: undefined,
|
|
42
|
-
sizeToken: "$4",
|
|
43
|
-
outlined: false,
|
|
44
|
-
inputBackground: "$color2",
|
|
45
|
-
textAccentColor: "$color",
|
|
46
|
-
transition: undefined,
|
|
47
|
-
heading: {},
|
|
48
|
-
},
|
|
49
|
-
control: {
|
|
50
|
-
hoverKnobProps: undefined,
|
|
51
|
-
pressKnobProps: undefined,
|
|
52
|
-
focusKnobProps: undefined,
|
|
53
|
-
focusVisibleKnobProps: undefined,
|
|
54
|
-
},
|
|
55
|
-
}),
|
|
56
|
-
}));
|
|
57
|
-
|
|
58
35
|
vi.mock("@tiptap/react/menus", () => ({
|
|
59
36
|
BubbleMenu: ({ children }: any) => <div data-testid="bubble-menu">{children}</div>,
|
|
60
37
|
}));
|
|
@@ -136,21 +136,20 @@ export function HeadingPicker({ editorRef, state, disabled }: HeadingPickerProps
|
|
|
136
136
|
<Text fontWeight="600">{getActiveHeadingLabel(state)}</Text>
|
|
137
137
|
</ToolbarDropdownButton>
|
|
138
138
|
</DropdownMenu.Trigger>
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
<DropdownMenu.Content minWidth={200}>
|
|
139
|
+
<DropdownMenu.Content
|
|
140
|
+
minWidth={200}
|
|
141
|
+
// Toolbar menus must not steal focus back to the trigger on
|
|
142
|
+
// select-close: the user expects to keep typing, so focus returns
|
|
143
|
+
// to the editor. Escape still restores the trigger via the menu's
|
|
144
|
+
// own close().
|
|
145
|
+
onCloseAutoFocus={(event) => {
|
|
146
|
+
if (selectedRef.current) {
|
|
147
|
+
event.preventDefault();
|
|
148
|
+
selectedRef.current = false;
|
|
149
|
+
editorRef.current?.focus();
|
|
150
|
+
}
|
|
151
|
+
}}
|
|
152
|
+
>
|
|
154
153
|
{HEADING_OPTIONS.map((option) => {
|
|
155
154
|
const description = option.description();
|
|
156
155
|
return (
|
|
@@ -86,15 +86,19 @@ export function ListPicker({ editorRef, state, disabled }: ListPickerProps) {
|
|
|
86
86
|
<ActiveIcon />
|
|
87
87
|
</ToolbarDropdownButton>
|
|
88
88
|
</DropdownMenu.Trigger>
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
89
|
+
<DropdownMenu.Content
|
|
90
|
+
minWidth={150}
|
|
91
|
+
// Toolbar menus must not steal focus back to the trigger on
|
|
92
|
+
// select-close: focus returns to the editor so typing continues.
|
|
93
|
+
// Escape still restores the trigger via the menu's own close().
|
|
94
|
+
onCloseAutoFocus={(event) => {
|
|
95
|
+
if (selectedRef.current) {
|
|
96
|
+
event.preventDefault();
|
|
97
|
+
selectedRef.current = false;
|
|
98
|
+
editorRef.current?.focus();
|
|
99
|
+
}
|
|
100
|
+
}}
|
|
101
|
+
>
|
|
98
102
|
{LIST_OPTIONS.map((option) => {
|
|
99
103
|
const Icon = option.icon;
|
|
100
104
|
const label = option.label();
|
|
@@ -170,15 +170,19 @@ export function MoreDropdown({
|
|
|
170
170
|
<MoreIcon />
|
|
171
171
|
</ToolbarButton>
|
|
172
172
|
</DropdownMenu.Trigger>
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
173
|
+
<DropdownMenu.Content
|
|
174
|
+
minWidth={200}
|
|
175
|
+
// Toolbar menus must not steal focus back to the trigger on
|
|
176
|
+
// select-close: focus returns to the editor so typing continues.
|
|
177
|
+
// Escape still restores the trigger via the menu's own close().
|
|
178
|
+
onCloseAutoFocus={(event) => {
|
|
179
|
+
if (selectedRef.current) {
|
|
180
|
+
event.preventDefault();
|
|
181
|
+
selectedRef.current = false;
|
|
182
|
+
editorRef.current?.focus();
|
|
183
|
+
}
|
|
184
|
+
}}
|
|
185
|
+
>
|
|
182
186
|
{inlineItems.length > 0 && (
|
|
183
187
|
<>
|
|
184
188
|
<ItemSection items={inlineItems} state={state} onSelect={handleSelect} />
|
|
@@ -17,7 +17,8 @@ vi.mock("@multiplatform.one/forms", async (importOriginal) => ({
|
|
|
17
17
|
),
|
|
18
18
|
}));
|
|
19
19
|
|
|
20
|
-
vi.mock("@multiplatform.one/components", () => ({
|
|
20
|
+
vi.mock("@multiplatform.one/components", async (importOriginal) => ({
|
|
21
|
+
...(await importOriginal<Record<string, unknown>>()),
|
|
21
22
|
Tooltip: ({ children }: any) => children,
|
|
22
23
|
}));
|
|
23
24
|
|
|
@@ -65,13 +65,15 @@ type FixedToolbarStoryArgs = import("./FixedToolbar.stories").FixedToolbarStoryA
|
|
|
65
65
|
|
|
66
66
|
type StoryLike = {
|
|
67
67
|
args?: Partial<FixedToolbarStoryArgs>;
|
|
68
|
-
render?:
|
|
68
|
+
render?: unknown;
|
|
69
69
|
};
|
|
70
70
|
|
|
71
71
|
/** Resolve a story the way Storybook does: meta args, story args, story render. */
|
|
72
72
|
function mount(story: StoryLike) {
|
|
73
73
|
const args = { ...(meta.args as FixedToolbarStoryArgs), ...story.args };
|
|
74
|
-
const render = story.render ??
|
|
74
|
+
const render = (story.render ?? meta.render) as
|
|
75
|
+
| ((args: FixedToolbarStoryArgs) => React.ReactElement)
|
|
76
|
+
| undefined;
|
|
75
77
|
if (!render) throw new Error("story has no render");
|
|
76
78
|
const Story = () => render(args);
|
|
77
79
|
const Decorator = meta.decorators?.[0] as
|
|
@@ -11,13 +11,15 @@ import type { StatusBarStoryArgs } from "./StatusBar.stories";
|
|
|
11
11
|
|
|
12
12
|
type StoryLike = {
|
|
13
13
|
args?: Partial<StatusBarStoryArgs>;
|
|
14
|
-
render?:
|
|
14
|
+
render?: unknown;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
/** Resolve a story the way Storybook does: meta args, story args, story render. */
|
|
18
18
|
function mount(story: StoryLike) {
|
|
19
19
|
const args = { ...(meta.args as StatusBarStoryArgs), ...story.args };
|
|
20
|
-
const render = story.render ??
|
|
20
|
+
const render = (story.render ?? meta.render) as
|
|
21
|
+
| ((args: StatusBarStoryArgs) => React.ReactElement)
|
|
22
|
+
| undefined;
|
|
21
23
|
if (!render) throw new Error("story has no render");
|
|
22
24
|
const Story = () => render(args);
|
|
23
25
|
const Decorator = meta.decorators?.[0] as
|
|
@@ -38,13 +38,15 @@ type ToolbarButtonStoryArgs = import("./ToolbarButton.stories").ToolbarButtonSto
|
|
|
38
38
|
|
|
39
39
|
type StoryLike = {
|
|
40
40
|
args?: Partial<ToolbarButtonStoryArgs>;
|
|
41
|
-
render?:
|
|
41
|
+
render?: unknown;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
/** Resolve a story the way Storybook does: meta args, story args, story render. */
|
|
45
45
|
function mount(story: StoryLike) {
|
|
46
46
|
const args = { ...(meta.args as ToolbarButtonStoryArgs), ...story.args };
|
|
47
|
-
const render = story.render ??
|
|
47
|
+
const render = (story.render ?? meta.render) as
|
|
48
|
+
| ((args: ToolbarButtonStoryArgs) => React.ReactElement)
|
|
49
|
+
| undefined;
|
|
48
50
|
if (!render) throw new Error("story has no render");
|
|
49
51
|
const Story = () => render(args);
|
|
50
52
|
const Decorator = meta.decorators?.[0] as
|
|
@@ -31,13 +31,15 @@ type ToolbarGroupStoryArgs = import("./ToolbarGroup.stories").ToolbarGroupStoryA
|
|
|
31
31
|
|
|
32
32
|
type StoryLike = {
|
|
33
33
|
args?: Partial<ToolbarGroupStoryArgs>;
|
|
34
|
-
render?:
|
|
34
|
+
render?: unknown;
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
/** Resolve a story the way Storybook does: meta args, story args, story render. */
|
|
38
38
|
function mount(story: StoryLike) {
|
|
39
39
|
const args = { ...(meta.args as ToolbarGroupStoryArgs), ...story.args };
|
|
40
|
-
const render = story.render ??
|
|
40
|
+
const render = (story.render ?? meta.render) as
|
|
41
|
+
| ((args: ToolbarGroupStoryArgs) => React.ReactElement)
|
|
42
|
+
| undefined;
|
|
41
43
|
if (!render) throw new Error("story has no render");
|
|
42
44
|
const Story = () => render(args);
|
|
43
45
|
const Decorator = meta.decorators?.[0] as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichEditor.native.d.ts","sourceRoot":"","sources":["../src/RichEditor.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAWH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"RichEditor.native.d.ts","sourceRoot":"","sources":["../src/RichEditor.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAWH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAU1C,OAAO,KAAK,EAAe,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI3F,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAUtD,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,gCAAgC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAMD,8EAA8E;AAC9E,iBAAS,mBAAmB,SAE3B;AAghBD,eAAO,MAAM,UAAU;;;;CAIrB,CAAC"}
|
|
@@ -19,7 +19,7 @@ import type { EditorCapabilities, RichTextMentionOptions, ToolbarSection } from
|
|
|
19
19
|
* Tiptap's default empty paragraph as empty values.
|
|
20
20
|
*/
|
|
21
21
|
export declare function richTextIsEmpty(v: unknown): boolean;
|
|
22
|
-
export type RichTextEditorProps<TParentData = any, TName extends DeepKeys<TParentData> = any, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = Omit<FormFieldProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children" | "field"> & Partial<Omit<FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children">> & {
|
|
22
|
+
export type RichTextEditorProps<TParentData = any, TName extends DeepKeys<TParentData> = any, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = Omit<FormFieldProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children" | "field" | "onChange"> & Partial<Omit<FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children" | "onChange">> & {
|
|
23
23
|
value?: string;
|
|
24
24
|
defaultValue?: string;
|
|
25
25
|
onChange?: (value: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtD,OAAO,EAQL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,kBAAkB,EAElB,sBAAsB,EACtB,cAAc,EACf,MAAM,UAAU,CAAC;AAQlB;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAEnD;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/RichTextEditor/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TentapEditor.native.d.ts","sourceRoot":"","sources":["../../src/editor/TentapEditor.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0BH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"TentapEditor.native.d.ts","sourceRoot":"","sources":["../../src/editor/TentapEditor.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0BH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAsB9E,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,eAAO,MAAM,YAAY,6GA6QxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockAnchor.d.ts","sourceRoot":"","sources":["../../src/editor/blockAnchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,UAAU,mBAAmB;IAC3B,qBAAqB,EAAE,MAAM,OAAO,CAAC;IACrC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,mBAAmB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"blockAnchor.d.ts","sourceRoot":"","sources":["../../src/editor/blockAnchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,UAAU,mBAAmB;IAC3B,qBAAqB,EAAE,MAAM,OAAO,CAAC;IACrC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,mBAAmB,GAAG,IAAI,CAc5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeEditorCSS.d.ts","sourceRoot":"","sources":["../../src/editor/nativeEditorCSS.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadingPicker.d.ts","sourceRoot":"","sources":["../../src/toolbar/HeadingPicker.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ1E,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACjD,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoGD,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"HeadingPicker.d.ts","sourceRoot":"","sources":["../../src/toolbar/HeadingPicker.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ1E,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACjD,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoGD,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAsD/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListPicker.d.ts","sourceRoot":"","sources":["../../src/toolbar/ListPicker.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAS1E,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACjD,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiDD,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"ListPicker.d.ts","sourceRoot":"","sources":["../../src/toolbar/ListPicker.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAS1E,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACjD,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiDD,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAqDzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MoreDropdown.d.ts","sourceRoot":"","sources":["../../src/toolbar/MoreDropdown.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,kBAAkB,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgB9F,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACjD,KAAK,EAAE,WAAW,CAAC;IACnB,wEAAwE;IACxE,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAwGD,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,YAAqB,EACrB,QAAQ,GACT,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MoreDropdown.d.ts","sourceRoot":"","sources":["../../src/toolbar/MoreDropdown.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,kBAAkB,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgB9F,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACjD,KAAK,EAAE,WAAW,CAAC;IACnB,wEAAwE;IACxE,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAwGD,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,YAAqB,EACrB,QAAQ,GACT,EAAE,iBAAiB,2CA6DnB"}
|