@sia.soul/sia-react-ui 0.1.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/README.md +37 -0
- package/THIRD_PARTY_NOTICES.md +12 -0
- package/dist/Select-CJJ5LQap.d.cts +44 -0
- package/dist/Select-CJJ5LQap.d.ts +44 -0
- package/dist/chart.cjs +7523 -0
- package/dist/chart.css +1036 -0
- package/dist/chart.d.cts +2061 -0
- package/dist/chart.d.ts +2061 -0
- package/dist/chart.js +120 -0
- package/dist/chunk-34TTF4Y7.js +812 -0
- package/dist/chunk-6VXOLMKZ.js +381 -0
- package/dist/chunk-DZ45HRVP.js +583 -0
- package/dist/chunk-I342FGQY.js +7344 -0
- package/dist/chunk-JKZGAZMB.js +318 -0
- package/dist/chunk-MBS2HXLZ.js +59 -0
- package/dist/chunk-NZAT2RUM.js +60 -0
- package/dist/chunk-OMA75YLM.js +298 -0
- package/dist/chunk-ULEGTKXR.js +2138 -0
- package/dist/chunk-YCVXUMGP.js +945 -0
- package/dist/core-BeiAQiDY.d.ts +1076 -0
- package/dist/core-DRICIs2n.d.cts +1076 -0
- package/dist/core.cjs +3353 -0
- package/dist/core.css +8734 -0
- package/dist/core.d.cts +3 -0
- package/dist/core.d.ts +3 -0
- package/dist/core.js +45 -0
- package/dist/index.cjs +19658 -0
- package/dist/index.css +9762 -0
- package/dist/index.d.cts +1222 -0
- package/dist/index.d.ts +1222 -0
- package/dist/index.js +6843 -0
- package/dist/markdown-editor.cjs +417 -0
- package/dist/markdown-editor.d.cts +28 -0
- package/dist/markdown-editor.d.ts +28 -0
- package/dist/markdown-editor.js +6 -0
- package/dist/rich-text-editor.cjs +1853 -0
- package/dist/rich-text-editor.d.cts +27 -0
- package/dist/rich-text-editor.d.ts +27 -0
- package/dist/rich-text-editor.js +11 -0
- package/dist/select-date-range-BDWdo7qt.d.ts +84 -0
- package/dist/select-date-range-DWik3ADr.d.cts +84 -0
- package/dist/select-date-range.cjs +2074 -0
- package/dist/select-date-range.d.cts +3 -0
- package/dist/select-date-range.d.ts +3 -0
- package/dist/select-date-range.js +8 -0
- package/package.json +129 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
// src/components/MarkdownEditor.tsx
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import "vditor/dist/index.css";
|
|
4
|
+
|
|
5
|
+
// src/components/markdownPaste.ts
|
|
6
|
+
function isLikelyMarkdown(value) {
|
|
7
|
+
const text = value.trim();
|
|
8
|
+
if (!text) return false;
|
|
9
|
+
const blockMarkdown = [
|
|
10
|
+
/(^|\n)[ \t]{0,3}#{1,6}[ \t]+\S/,
|
|
11
|
+
/(^|\n)[ \t]{0,3}(?:[-+*]|\d+[.)])[ \t]+\S/,
|
|
12
|
+
/(^|\n)[ \t]{0,3}>[ \t]+\S/,
|
|
13
|
+
/(^|\n)[ \t]{0,3}(?:```|~~~)/,
|
|
14
|
+
/(^|\n)[ \t]{0,3}[-+*][ \t]+\[[ xX]\][ \t]+\S/,
|
|
15
|
+
/(^|\n)[ \t]{0,3}(?:[-*_][ \t]*){3,}(?:\n|$)/,
|
|
16
|
+
/(^|\n)[^\n]*\|[^\n]*\n[ \t]*\|?[ \t]*:?-{3,}/
|
|
17
|
+
];
|
|
18
|
+
if (blockMarkdown.some((pattern) => pattern.test(text))) return true;
|
|
19
|
+
return /!\[[^\]]*\]\([^\n)]+\)|\[[^\]]+\]\([^\n)]+\)|\*\*[^\n*]+\*\*|__[^\n_]+__|~~[^\n~]+~~/.test(text);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// src/components/vditorZhCn.ts
|
|
23
|
+
var VDITOR_ZH_CN = {
|
|
24
|
+
alignCenter: "\u5C45\u4E2D",
|
|
25
|
+
alignLeft: "\u5C45\u5DE6",
|
|
26
|
+
alignRight: "\u5C45\u53F3",
|
|
27
|
+
alternateText: "\u66FF\u4EE3\u6587\u672C",
|
|
28
|
+
bold: "\u7C97\u4F53",
|
|
29
|
+
both: "\u7F16\u8F91 & \u9884\u89C8",
|
|
30
|
+
cancelUpload: "\u53D6\u6D88\u4E0A\u4F20",
|
|
31
|
+
check: "\u4EFB\u52A1\u5217\u8868",
|
|
32
|
+
close: "\u5173\u95ED",
|
|
33
|
+
code: "\u4EE3\u7801\u5757",
|
|
34
|
+
"code-theme": "\u4EE3\u7801\u5757\u4E3B\u9898\u9884\u89C8",
|
|
35
|
+
column: "\u5217",
|
|
36
|
+
comment: "\u8BC4\u8BBA",
|
|
37
|
+
confirm: "\u786E\u5B9A",
|
|
38
|
+
"content-theme": "\u5185\u5BB9\u4E3B\u9898\u9884\u89C8",
|
|
39
|
+
copied: "\u5DF2\u590D\u5236",
|
|
40
|
+
copy: "\u590D\u5236",
|
|
41
|
+
"delete-column": "\u5220\u9664\u5217",
|
|
42
|
+
"delete-row": "\u5220\u9664\u884C",
|
|
43
|
+
devtools: "\u5F00\u53D1\u8005\u5DE5\u5177",
|
|
44
|
+
down: "\u4E0B",
|
|
45
|
+
downloadTip: "\u8BE5\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u4E0B\u8F7D\u529F\u80FD",
|
|
46
|
+
edit: "\u7F16\u8F91",
|
|
47
|
+
"edit-mode": "\u5207\u6362\u7F16\u8F91\u6A21\u5F0F",
|
|
48
|
+
emoji: "\u8868\u60C5",
|
|
49
|
+
export: "\u5BFC\u51FA",
|
|
50
|
+
fileTypeError: "\u6587\u4EF6\u7C7B\u578B\u4E0D\u5141\u8BB8\u4E0A\u4F20\uFF0C\u8BF7\u538B\u7F29\u540E\u518D\u8BD5",
|
|
51
|
+
footnoteRef: "\u811A\u6CE8\u6807\u8BC6",
|
|
52
|
+
fullscreen: "\u5168\u5C4F\u5207\u6362",
|
|
53
|
+
generate: "\u751F\u6210\u4E2D",
|
|
54
|
+
headings: "\u6807\u9898",
|
|
55
|
+
heading1: "\u4E00\u7EA7\u6807\u9898",
|
|
56
|
+
heading2: "\u4E8C\u7EA7\u6807\u9898",
|
|
57
|
+
heading3: "\u4E09\u7EA7\u6807\u9898",
|
|
58
|
+
heading4: "\u56DB\u7EA7\u6807\u9898",
|
|
59
|
+
heading5: "\u4E94\u7EA7\u6807\u9898",
|
|
60
|
+
heading6: "\u516D\u7EA7\u6807\u9898",
|
|
61
|
+
help: "\u5E2E\u52A9",
|
|
62
|
+
imageURL: "\u56FE\u7247\u5730\u5740",
|
|
63
|
+
indent: "\u5217\u8868\u7F29\u8FDB",
|
|
64
|
+
info: "\u5173\u4E8E",
|
|
65
|
+
"inline-code": "\u884C\u5185\u4EE3\u7801",
|
|
66
|
+
"insert-after": "\u672B\u5C3E\u63D2\u5165\u884C",
|
|
67
|
+
"insert-before": "\u8D77\u59CB\u63D2\u5165\u884C",
|
|
68
|
+
insertColumnLeft: "\u5728\u5DE6\u8FB9\u63D2\u5165\u4E00\u5217",
|
|
69
|
+
insertColumnRight: "\u5728\u53F3\u8FB9\u63D2\u5165\u4E00\u5217",
|
|
70
|
+
insertRowAbove: "\u5728\u4E0A\u65B9\u63D2\u5165\u4E00\u884C",
|
|
71
|
+
insertRowBelow: "\u5728\u4E0B\u65B9\u63D2\u5165\u4E00\u884C",
|
|
72
|
+
instantRendering: "\u5373\u65F6\u6E32\u67D3",
|
|
73
|
+
italic: "\u659C\u4F53",
|
|
74
|
+
language: "\u8BED\u8A00",
|
|
75
|
+
line: "\u5206\u9694\u7EBF",
|
|
76
|
+
link: "\u94FE\u63A5",
|
|
77
|
+
linkRef: "\u5F15\u7528\u6807\u8BC6",
|
|
78
|
+
list: "\u65E0\u5E8F\u5217\u8868",
|
|
79
|
+
more: "\u66F4\u591A",
|
|
80
|
+
nameEmpty: "\u6587\u4EF6\u540D\u4E0D\u80FD\u4E3A\u7A7A",
|
|
81
|
+
"ordered-list": "\u6709\u5E8F\u5217\u8868",
|
|
82
|
+
outdent: "\u5217\u8868\u53CD\u5411\u7F29\u8FDB",
|
|
83
|
+
outline: "\u5927\u7EB2",
|
|
84
|
+
over: "\u8D85\u8FC7",
|
|
85
|
+
performanceTip: "\u5B9E\u65F6\u9884\u89C8\u9700 ${x}ms\uFF0C\u53EF\u70B9\u51FB\u7F16\u8F91 & \u9884\u89C8\u6309\u94AE\u8FDB\u884C\u5173\u95ED",
|
|
86
|
+
preview: "\u9884\u89C8",
|
|
87
|
+
quote: "\u5F15\u7528",
|
|
88
|
+
record: "\u5F00\u59CB\u5F55\u97F3/\u7ED3\u675F\u5F55\u97F3",
|
|
89
|
+
"record-tip": "\u8BE5\u8BBE\u5907\u4E0D\u652F\u6301\u5F55\u97F3\u529F\u80FD",
|
|
90
|
+
recording: "\u5F55\u97F3\u4E2D...",
|
|
91
|
+
redo: "\u91CD\u505A",
|
|
92
|
+
remove: "\u5220\u9664",
|
|
93
|
+
row: "\u884C",
|
|
94
|
+
spin: "\u65CB\u8F6C",
|
|
95
|
+
splitView: "\u5206\u5C4F\u9884\u89C8",
|
|
96
|
+
strike: "\u5220\u9664\u7EBF",
|
|
97
|
+
table: "\u8868\u683C",
|
|
98
|
+
textIsNotEmpty: "\u6587\u672C\uFF08\u4E0D\u80FD\u4E3A\u7A7A\uFF09",
|
|
99
|
+
title: "\u6807\u9898",
|
|
100
|
+
tooltipText: "\u63D0\u793A\u6587\u672C",
|
|
101
|
+
undo: "\u64A4\u9500",
|
|
102
|
+
up: "\u4E0A",
|
|
103
|
+
update: "\u66F4\u65B0",
|
|
104
|
+
upload: "\u4E0A\u4F20\u56FE\u7247\u6216\u6587\u4EF6",
|
|
105
|
+
uploadError: "\u4E0A\u4F20\u9519\u8BEF",
|
|
106
|
+
uploading: "\u4E0A\u4F20\u4E2D...",
|
|
107
|
+
wysiwyg: "\u6240\u89C1\u5373\u6240\u5F97"
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// src/components/MarkdownEditor.tsx
|
|
111
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
112
|
+
var vditorLoaders = /* @__PURE__ */ new Map();
|
|
113
|
+
var BASE_TOOLBAR = [
|
|
114
|
+
"headings",
|
|
115
|
+
"bold",
|
|
116
|
+
"italic",
|
|
117
|
+
"strike",
|
|
118
|
+
"link",
|
|
119
|
+
"|",
|
|
120
|
+
"list",
|
|
121
|
+
"ordered-list",
|
|
122
|
+
"check",
|
|
123
|
+
"outdent",
|
|
124
|
+
"indent",
|
|
125
|
+
"|",
|
|
126
|
+
"quote",
|
|
127
|
+
"line",
|
|
128
|
+
"code",
|
|
129
|
+
"inline-code",
|
|
130
|
+
"table",
|
|
131
|
+
"|",
|
|
132
|
+
"undo",
|
|
133
|
+
"redo",
|
|
134
|
+
"|",
|
|
135
|
+
"edit-mode",
|
|
136
|
+
"both",
|
|
137
|
+
"preview",
|
|
138
|
+
"outline",
|
|
139
|
+
"fullscreen"
|
|
140
|
+
];
|
|
141
|
+
function escapeMarkdownAlt(value) {
|
|
142
|
+
return value.replace(/[\[\]\\]/g, "\\$&");
|
|
143
|
+
}
|
|
144
|
+
function applyEditorAriaLabel(element, label) {
|
|
145
|
+
element.querySelectorAll(".vditor-wysiwyg, .vditor-ir, .vditor-sv").forEach((editor) => {
|
|
146
|
+
editor.setAttribute("aria-label", label);
|
|
147
|
+
editor.setAttribute("role", "textbox");
|
|
148
|
+
editor.setAttribute("aria-multiline", "true");
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function loadVditor(assetBaseUrl) {
|
|
152
|
+
if (typeof window === "undefined") {
|
|
153
|
+
return Promise.reject(new Error("Vditor \u53EA\u80FD\u5728\u6D4F\u89C8\u5668\u4E2D\u52A0\u8F7D"));
|
|
154
|
+
}
|
|
155
|
+
if (window.Vditor) return Promise.resolve(window.Vditor);
|
|
156
|
+
if (!assetBaseUrl) {
|
|
157
|
+
const bundledKey = "__sia_bundled_vditor__";
|
|
158
|
+
const bundledPending = vditorLoaders.get(bundledKey);
|
|
159
|
+
if (bundledPending) return bundledPending;
|
|
160
|
+
const bundledLoader = Promise.all([
|
|
161
|
+
// Vditor normally requests its Markdown engine from a CDN at runtime.
|
|
162
|
+
// @ts-ignore The bundled script installs window.Lute as a side effect.
|
|
163
|
+
import("vditor/dist/js/lute/lute.min.js"),
|
|
164
|
+
// Vditor also loads its SVG sprite from the CDN unless it already exists.
|
|
165
|
+
// @ts-ignore The side-effect module injects the Ant Design icon sprite.
|
|
166
|
+
import("vditor/dist/js/icons/ant.js"),
|
|
167
|
+
import("vditor")
|
|
168
|
+
]).then(([, , { default: Vditor }]) => {
|
|
169
|
+
if (!document.getElementById("vditorLuteScript")) {
|
|
170
|
+
const bundledLuteMarker = document.createElement("script");
|
|
171
|
+
bundledLuteMarker.id = "vditorLuteScript";
|
|
172
|
+
bundledLuteMarker.dataset.siaBundled = "true";
|
|
173
|
+
document.head.append(bundledLuteMarker);
|
|
174
|
+
}
|
|
175
|
+
if (!document.getElementById("vditorIconScript")) {
|
|
176
|
+
const bundledIconMarker = document.createElement("script");
|
|
177
|
+
bundledIconMarker.id = "vditorIconScript";
|
|
178
|
+
bundledIconMarker.dataset.siaBundled = "true";
|
|
179
|
+
document.head.append(bundledIconMarker);
|
|
180
|
+
}
|
|
181
|
+
window.Vditor = Vditor;
|
|
182
|
+
return Vditor;
|
|
183
|
+
});
|
|
184
|
+
vditorLoaders.set(bundledKey, bundledLoader);
|
|
185
|
+
return bundledLoader;
|
|
186
|
+
}
|
|
187
|
+
const baseUrl = assetBaseUrl.replace(/\/$/, "");
|
|
188
|
+
const scriptUrl = `${baseUrl}/dist/index.min.js`;
|
|
189
|
+
const pending = vditorLoaders.get(scriptUrl);
|
|
190
|
+
if (pending) return pending;
|
|
191
|
+
const loader = new Promise((resolve, reject) => {
|
|
192
|
+
const existing = document.querySelector(`script[data-sia-vditor="${scriptUrl}"]`);
|
|
193
|
+
const script = existing ?? document.createElement("script");
|
|
194
|
+
const handleLoad = () => {
|
|
195
|
+
if (window.Vditor) resolve(window.Vditor);
|
|
196
|
+
else reject(new Error("Vditor \u811A\u672C\u5DF2\u52A0\u8F7D\uFF0C\u4F46\u672A\u627E\u5230\u5168\u5C40\u6784\u9020\u5668"));
|
|
197
|
+
};
|
|
198
|
+
const handleError = () => reject(new Error(`Vditor \u811A\u672C\u52A0\u8F7D\u5931\u8D25\uFF1A${scriptUrl}`));
|
|
199
|
+
script.addEventListener("load", handleLoad, { once: true });
|
|
200
|
+
script.addEventListener("error", handleError, { once: true });
|
|
201
|
+
if (!existing) {
|
|
202
|
+
script.src = scriptUrl;
|
|
203
|
+
script.async = true;
|
|
204
|
+
script.dataset.siaVditor = scriptUrl;
|
|
205
|
+
document.head.append(script);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
vditorLoaders.set(scriptUrl, loader);
|
|
209
|
+
return loader;
|
|
210
|
+
}
|
|
211
|
+
function MarkdownEditor({
|
|
212
|
+
value,
|
|
213
|
+
defaultValue = "",
|
|
214
|
+
onChange,
|
|
215
|
+
mode = "wysiwyg",
|
|
216
|
+
placeholder = "\u8BF7\u8F93\u5165 Markdown \u6B63\u6587",
|
|
217
|
+
minHeight = 320,
|
|
218
|
+
disabled = false,
|
|
219
|
+
ariaLabel = "Markdown \u7F16\u8F91\u5668",
|
|
220
|
+
assetBaseUrl,
|
|
221
|
+
saveShortcut,
|
|
222
|
+
onUploadImage,
|
|
223
|
+
smartMarkdownPaste = true,
|
|
224
|
+
className,
|
|
225
|
+
style,
|
|
226
|
+
...props
|
|
227
|
+
}) {
|
|
228
|
+
const mountRef = useRef(null);
|
|
229
|
+
const editorRef = useRef(null);
|
|
230
|
+
const onChangeRef = useRef(onChange);
|
|
231
|
+
const saveShortcutRef = useRef(saveShortcut);
|
|
232
|
+
const uploadImageRef = useRef(onUploadImage);
|
|
233
|
+
const disabledRef = useRef(disabled);
|
|
234
|
+
const smartMarkdownPasteRef = useRef(smartMarkdownPaste);
|
|
235
|
+
const valueRef = useRef(value ?? defaultValue);
|
|
236
|
+
const lastEmittedValueRef = useRef(value ?? defaultValue);
|
|
237
|
+
const [ready, setReady] = useState(false);
|
|
238
|
+
const [loadError, setLoadError] = useState("");
|
|
239
|
+
const hasImageUpload = Boolean(onUploadImage);
|
|
240
|
+
onChangeRef.current = onChange;
|
|
241
|
+
saveShortcutRef.current = saveShortcut;
|
|
242
|
+
uploadImageRef.current = onUploadImage;
|
|
243
|
+
disabledRef.current = disabled;
|
|
244
|
+
smartMarkdownPasteRef.current = smartMarkdownPaste;
|
|
245
|
+
valueRef.current = value ?? valueRef.current;
|
|
246
|
+
useEffect(() => {
|
|
247
|
+
const mount = mountRef.current;
|
|
248
|
+
if (!mount) return;
|
|
249
|
+
let disposed = false;
|
|
250
|
+
let createdEditor = null;
|
|
251
|
+
let editorInitialized = false;
|
|
252
|
+
let removeSmartMarkdownPaste = () => {
|
|
253
|
+
};
|
|
254
|
+
setLoadError("");
|
|
255
|
+
void loadVditor(assetBaseUrl).then((Vditor) => {
|
|
256
|
+
if (disposed) return;
|
|
257
|
+
const toolbar = hasImageUpload ? [...BASE_TOOLBAR.slice(0, 17), "upload", ...BASE_TOOLBAR.slice(17)] : [...BASE_TOOLBAR];
|
|
258
|
+
createdEditor = new Vditor(mount, {
|
|
259
|
+
value: valueRef.current,
|
|
260
|
+
mode,
|
|
261
|
+
lang: "zh_CN",
|
|
262
|
+
i18n: VDITOR_ZH_CN,
|
|
263
|
+
icon: "ant",
|
|
264
|
+
width: "100%",
|
|
265
|
+
height: "100%",
|
|
266
|
+
minHeight: typeof minHeight === "number" ? minHeight : void 0,
|
|
267
|
+
placeholder,
|
|
268
|
+
cdn: assetBaseUrl,
|
|
269
|
+
cache: { enable: false },
|
|
270
|
+
toolbar,
|
|
271
|
+
toolbarConfig: { pin: true },
|
|
272
|
+
counter: { enable: true, type: "text" },
|
|
273
|
+
outline: { enable: false, position: "right" },
|
|
274
|
+
preview: {
|
|
275
|
+
mode: "both",
|
|
276
|
+
delay: 180,
|
|
277
|
+
actions: []
|
|
278
|
+
},
|
|
279
|
+
...hasImageUpload ? { upload: {
|
|
280
|
+
accept: "image/*",
|
|
281
|
+
handler: async (files) => {
|
|
282
|
+
const imageFiles = Array.from(files).filter(
|
|
283
|
+
(file) => file.type.startsWith("image/")
|
|
284
|
+
);
|
|
285
|
+
if (imageFiles.length === 0 || !uploadImageRef.current) return null;
|
|
286
|
+
const images = await Promise.all(
|
|
287
|
+
imageFiles.map(async (file) => ({
|
|
288
|
+
name: file.name,
|
|
289
|
+
url: await uploadImageRef.current(file)
|
|
290
|
+
}))
|
|
291
|
+
);
|
|
292
|
+
editorRef.current?.insertValue(
|
|
293
|
+
images.map(({ name, url }) => ``).join("\n")
|
|
294
|
+
);
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
} } : {},
|
|
298
|
+
input: (markdown) => {
|
|
299
|
+
lastEmittedValueRef.current = markdown;
|
|
300
|
+
onChangeRef.current?.(markdown);
|
|
301
|
+
},
|
|
302
|
+
keydown: (event) => {
|
|
303
|
+
if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "s") {
|
|
304
|
+
event.preventDefault();
|
|
305
|
+
event.stopPropagation();
|
|
306
|
+
saveShortcutRef.current?.();
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
after: () => {
|
|
310
|
+
editorInitialized = true;
|
|
311
|
+
if (disposed || !createdEditor) {
|
|
312
|
+
createdEditor?.destroy();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
editorRef.current = createdEditor;
|
|
316
|
+
applyEditorAriaLabel(mount, ariaLabel);
|
|
317
|
+
const handleSmartMarkdownPaste = (event) => {
|
|
318
|
+
if (!smartMarkdownPasteRef.current || disabledRef.current) return;
|
|
319
|
+
const target = event.target;
|
|
320
|
+
if (!(target instanceof Element) || !target.closest(".vditor-wysiwyg, .vditor-ir")) return;
|
|
321
|
+
const clipboard = event.clipboardData;
|
|
322
|
+
const explicitMarkdown = clipboard?.getData("text/markdown") ?? "";
|
|
323
|
+
const markdown = explicitMarkdown || clipboard?.getData("text/plain") || "";
|
|
324
|
+
if (!clipboard || !explicitMarkdown && !isLikelyMarkdown(markdown)) return;
|
|
325
|
+
event.preventDefault();
|
|
326
|
+
event.stopPropagation();
|
|
327
|
+
editorRef.current?.insertMD(markdown);
|
|
328
|
+
};
|
|
329
|
+
mount.addEventListener("paste", handleSmartMarkdownPaste, true);
|
|
330
|
+
removeSmartMarkdownPaste = () => mount.removeEventListener("paste", handleSmartMarkdownPaste, true);
|
|
331
|
+
if (disabledRef.current) createdEditor.disabled();
|
|
332
|
+
setReady(true);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}).catch((error) => {
|
|
336
|
+
if (disposed) return;
|
|
337
|
+
setLoadError(error instanceof Error ? error.message : "\u7F16\u8F91\u5668\u52A0\u8F7D\u5931\u8D25");
|
|
338
|
+
});
|
|
339
|
+
return () => {
|
|
340
|
+
disposed = true;
|
|
341
|
+
setReady(false);
|
|
342
|
+
removeSmartMarkdownPaste();
|
|
343
|
+
if (editorRef.current === createdEditor) editorRef.current = null;
|
|
344
|
+
if (editorInitialized) createdEditor?.destroy();
|
|
345
|
+
};
|
|
346
|
+
}, [ariaLabel, assetBaseUrl, hasImageUpload, minHeight, mode, placeholder]);
|
|
347
|
+
useEffect(() => {
|
|
348
|
+
const editor = editorRef.current;
|
|
349
|
+
if (!editor || value === void 0) return;
|
|
350
|
+
if (value === lastEmittedValueRef.current || editor.getValue() === value) return;
|
|
351
|
+
lastEmittedValueRef.current = value;
|
|
352
|
+
editor.setValue(value, true);
|
|
353
|
+
}, [ready, value]);
|
|
354
|
+
useEffect(() => {
|
|
355
|
+
const editor = editorRef.current;
|
|
356
|
+
if (!editor) return;
|
|
357
|
+
if (disabled) editor.disabled();
|
|
358
|
+
else editor.enable();
|
|
359
|
+
}, [disabled, ready]);
|
|
360
|
+
const editorStyle = {
|
|
361
|
+
...style,
|
|
362
|
+
"--sia-markdown-editor-min-height": typeof minHeight === "number" ? `${minHeight}px` : minHeight
|
|
363
|
+
};
|
|
364
|
+
return /* @__PURE__ */ jsxs(
|
|
365
|
+
"div",
|
|
366
|
+
{
|
|
367
|
+
className: ["sia-markdown-editor", className].filter(Boolean).join(" "),
|
|
368
|
+
style: editorStyle,
|
|
369
|
+
"data-ready": ready ? "true" : "false",
|
|
370
|
+
...props,
|
|
371
|
+
children: [
|
|
372
|
+
/* @__PURE__ */ jsx("div", { ref: mountRef, className: "sia-markdown-editor__mount" }),
|
|
373
|
+
!ready ? /* @__PURE__ */ jsx("div", { className: "sia-markdown-editor__loading", "aria-live": "polite", children: loadError || "\u6B63\u5728\u52A0\u8F7D\u7F16\u8F91\u5668\u2026" }) : null
|
|
374
|
+
]
|
|
375
|
+
}
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export {
|
|
380
|
+
MarkdownEditor
|
|
381
|
+
};
|