@jvs-milkdown/components 1.2.13 → 1.2.14
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/lib/diff-block/config.d.ts +10 -0
- package/lib/diff-block/config.d.ts.map +1 -0
- package/lib/diff-block/index.d.ts +7 -0
- package/lib/diff-block/index.d.ts.map +1 -0
- package/lib/diff-block/index.js +296 -0
- package/lib/diff-block/index.js.map +1 -0
- package/lib/diff-block/remark-plugin.d.ts +2 -0
- package/lib/diff-block/remark-plugin.d.ts.map +1 -0
- package/lib/diff-block/schema.d.ts +3 -0
- package/lib/diff-block/schema.d.ts.map +1 -0
- package/lib/diff-block/view/index.d.ts +3 -0
- package/lib/diff-block/view/index.d.ts.map +1 -0
- package/lib/diff-block/view/node-view.d.ts +25 -0
- package/lib/diff-block/view/node-view.d.ts.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +294 -2
- package/lib/index.js.map +1 -1
- package/lib/table-block/index.js +2 -2
- package/lib/table-block/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -10
- package/src/diff-block/config.ts +42 -0
- package/src/diff-block/index.ts +19 -0
- package/src/diff-block/remark-plugin.ts +59 -0
- package/src/diff-block/schema.ts +86 -0
- package/src/diff-block/view/index.ts +22 -0
- package/src/diff-block/view/node-view.ts +154 -0
- package/src/index.ts +1 -0
- package/src/table-block/view/component.tsx +2 -2
package/lib/index.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
2
|
import DOMPurify from 'dompurify';
|
|
3
|
-
import { h } from 'vue';
|
|
3
|
+
import { h, ref, watchEffect } from 'vue';
|
|
4
|
+
import { $ctx, $nodeSchema, $view, $remark } from '@jvs-milkdown/utils';
|
|
5
|
+
import { expectDomTypeError } from '@jvs-milkdown/exception';
|
|
6
|
+
import { unifiedMergeView } from '@codemirror/merge';
|
|
7
|
+
import { Compartment, EditorState } from '@codemirror/state';
|
|
8
|
+
import { EditorView, drawSelection } from '@codemirror/view';
|
|
9
|
+
import { visit } from 'unist-util-visit';
|
|
4
10
|
|
|
5
11
|
function keepAlive(..._args) {
|
|
6
12
|
}
|
|
@@ -31,5 +37,291 @@ Icon.props = {
|
|
|
31
37
|
}
|
|
32
38
|
};
|
|
33
39
|
|
|
34
|
-
|
|
40
|
+
var __defProp = Object.defineProperty;
|
|
41
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
42
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
43
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
44
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
45
|
+
var __spreadValues = (a, b) => {
|
|
46
|
+
for (var prop in b || (b = {}))
|
|
47
|
+
if (__hasOwnProp.call(b, prop))
|
|
48
|
+
__defNormalProp(a, prop, b[prop]);
|
|
49
|
+
if (__getOwnPropSymbols)
|
|
50
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
51
|
+
if (__propIsEnum.call(b, prop))
|
|
52
|
+
__defNormalProp(a, prop, b[prop]);
|
|
53
|
+
}
|
|
54
|
+
return a;
|
|
55
|
+
};
|
|
56
|
+
function withMeta(plugin, meta) {
|
|
57
|
+
Object.assign(plugin, {
|
|
58
|
+
meta: __spreadValues({
|
|
59
|
+
package: "@jvs-milkdown/components"
|
|
60
|
+
}, meta)
|
|
61
|
+
});
|
|
62
|
+
return plugin;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const defaultConfig = {
|
|
66
|
+
extensions: [],
|
|
67
|
+
languages: [
|
|
68
|
+
"text",
|
|
69
|
+
"typescript",
|
|
70
|
+
"javascript",
|
|
71
|
+
"html",
|
|
72
|
+
"css",
|
|
73
|
+
"json",
|
|
74
|
+
"markdown"
|
|
75
|
+
],
|
|
76
|
+
renderLanguage: (language, selected) => {
|
|
77
|
+
const span = document.createElement("span");
|
|
78
|
+
span.className = "milkdown-diff-block-language";
|
|
79
|
+
span.textContent = language;
|
|
80
|
+
if (selected) {
|
|
81
|
+
span.classList.add("selected");
|
|
82
|
+
}
|
|
83
|
+
return span;
|
|
84
|
+
},
|
|
85
|
+
theme: "dark"
|
|
86
|
+
};
|
|
87
|
+
const diffBlockConfig = $ctx(defaultConfig, "diffBlockConfig");
|
|
88
|
+
withMeta(diffBlockConfig, {
|
|
89
|
+
displayName: "Ctx<diffBlockConfig>",
|
|
90
|
+
group: "DiffBlock"
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const DIFF_BLOCK_DATA_TYPE = "diff-block";
|
|
94
|
+
const diffBlockSchema = $nodeSchema("diff_block", () => {
|
|
95
|
+
return {
|
|
96
|
+
content: "text*",
|
|
97
|
+
marks: "",
|
|
98
|
+
group: "block",
|
|
99
|
+
selectable: true,
|
|
100
|
+
isolating: true,
|
|
101
|
+
code: true,
|
|
102
|
+
attrs: {
|
|
103
|
+
originalText: { default: "" },
|
|
104
|
+
modifiedText: { default: "" },
|
|
105
|
+
language: { default: "text" }
|
|
106
|
+
},
|
|
107
|
+
parseDOM: [
|
|
108
|
+
{
|
|
109
|
+
tag: `div[data-type="${DIFF_BLOCK_DATA_TYPE}"]`,
|
|
110
|
+
preserveWhitespace: "full",
|
|
111
|
+
getAttrs: (dom) => {
|
|
112
|
+
if (!(dom instanceof HTMLElement)) throw expectDomTypeError(dom);
|
|
113
|
+
return {
|
|
114
|
+
originalText: dom.getAttribute("data-original-text") || "",
|
|
115
|
+
modifiedText: dom.getAttribute("data-modified-text") || "",
|
|
116
|
+
language: dom.getAttribute("data-language") || "text"
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
toDOM: (node) => {
|
|
122
|
+
return [
|
|
123
|
+
"div",
|
|
124
|
+
{
|
|
125
|
+
"data-type": DIFF_BLOCK_DATA_TYPE,
|
|
126
|
+
"data-original-text": node.attrs.originalText,
|
|
127
|
+
"data-modified-text": node.attrs.modifiedText,
|
|
128
|
+
"data-language": node.attrs.language,
|
|
129
|
+
class: "milkdown-diff-block"
|
|
130
|
+
},
|
|
131
|
+
["code", { spellcheck: "false" }, 0]
|
|
132
|
+
];
|
|
133
|
+
},
|
|
134
|
+
parseMarkdown: {
|
|
135
|
+
match: ({ type }) => type === "diff_block",
|
|
136
|
+
runner: (state, node, type) => {
|
|
137
|
+
const originalText = node.originalText;
|
|
138
|
+
const modifiedText = node.modifiedText;
|
|
139
|
+
const language = node.language;
|
|
140
|
+
state.addNode(type, {
|
|
141
|
+
originalText: originalText || "",
|
|
142
|
+
modifiedText: modifiedText || "",
|
|
143
|
+
language: language || "text"
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
toMarkdown: {
|
|
148
|
+
match: (node) => node.type.name === "diff_block",
|
|
149
|
+
runner: (state, node) => {
|
|
150
|
+
state.addNode("code", void 0, void 0, {
|
|
151
|
+
lang: "diff_block",
|
|
152
|
+
value: JSON.stringify(
|
|
153
|
+
{
|
|
154
|
+
originalText: node.attrs.originalText,
|
|
155
|
+
modifiedText: node.attrs.modifiedText,
|
|
156
|
+
language: node.attrs.language
|
|
157
|
+
},
|
|
158
|
+
null,
|
|
159
|
+
2
|
|
160
|
+
)
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
withMeta(diffBlockSchema.node, {
|
|
167
|
+
displayName: "NodeSchema<diff_block>",
|
|
168
|
+
group: "DiffBlock"
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
class DiffBlockNodeView {
|
|
172
|
+
constructor(node, view, getPos, config) {
|
|
173
|
+
this.node = node;
|
|
174
|
+
this.view = view;
|
|
175
|
+
this.getPos = getPos;
|
|
176
|
+
this.config = config;
|
|
177
|
+
this.selected = ref(false);
|
|
178
|
+
this.updating = false;
|
|
179
|
+
this.forwardUpdate = (update) => {
|
|
180
|
+
if (this.updating) return;
|
|
181
|
+
if (!update.docChanged) return;
|
|
182
|
+
const pos = this.getPos();
|
|
183
|
+
if (pos == null) return;
|
|
184
|
+
const newText = update.state.doc.toString();
|
|
185
|
+
const tr = this.view.state.tr.setNodeAttribute(pos, "modifiedText", newText);
|
|
186
|
+
this.view.dispatch(tr);
|
|
187
|
+
};
|
|
188
|
+
this.readOnlyConf = new Compartment();
|
|
189
|
+
this.cm = new EditorView({
|
|
190
|
+
doc: this.node.attrs.modifiedText || "",
|
|
191
|
+
root: this.view.root,
|
|
192
|
+
extensions: [
|
|
193
|
+
this.readOnlyConf.of(EditorState.readOnly.of(true)),
|
|
194
|
+
drawSelection(),
|
|
195
|
+
unifiedMergeView({
|
|
196
|
+
original: this.node.attrs.originalText || "",
|
|
197
|
+
mergeControls: true
|
|
198
|
+
}),
|
|
199
|
+
EditorView.updateListener.of(this.forwardUpdate),
|
|
200
|
+
...config.extensions
|
|
201
|
+
]
|
|
202
|
+
});
|
|
203
|
+
this.dom = document.createElement("div");
|
|
204
|
+
this.dom.className = "milkdown-diff-block";
|
|
205
|
+
this.dom.appendChild(this.cm.dom);
|
|
206
|
+
this.disposeSelectedWatcher = watchEffect(() => {
|
|
207
|
+
const isSelected = this.selected.value;
|
|
208
|
+
if (isSelected) {
|
|
209
|
+
this.dom.classList.add("selected");
|
|
210
|
+
} else {
|
|
211
|
+
this.dom.classList.remove("selected");
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
setSelection(anchor, head) {
|
|
216
|
+
if (!this.cm.dom.isConnected) return;
|
|
217
|
+
this.cm.focus();
|
|
218
|
+
this.updating = true;
|
|
219
|
+
this.cm.dispatch({ selection: { anchor, head } });
|
|
220
|
+
this.updating = false;
|
|
221
|
+
}
|
|
222
|
+
update(node) {
|
|
223
|
+
if (node.type !== this.node.type) return false;
|
|
224
|
+
if (this.updating) return true;
|
|
225
|
+
this.node = node;
|
|
226
|
+
const modifiedText = node.attrs.modifiedText || "";
|
|
227
|
+
const change = computeChange(this.cm.state.doc.toString(), modifiedText);
|
|
228
|
+
if (change) {
|
|
229
|
+
this.updating = true;
|
|
230
|
+
this.cm.dispatch({
|
|
231
|
+
changes: { from: change.from, to: change.to, insert: change.text }
|
|
232
|
+
});
|
|
233
|
+
this.updating = false;
|
|
234
|
+
}
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
selectNode() {
|
|
238
|
+
this.selected.value = true;
|
|
239
|
+
this.cm.focus();
|
|
240
|
+
}
|
|
241
|
+
deselectNode() {
|
|
242
|
+
this.selected.value = false;
|
|
243
|
+
}
|
|
244
|
+
stopEvent() {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
destroy() {
|
|
248
|
+
this.cm.destroy();
|
|
249
|
+
this.disposeSelectedWatcher();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function computeChange(oldVal, newVal) {
|
|
253
|
+
if (oldVal === newVal) return null;
|
|
254
|
+
let start = 0;
|
|
255
|
+
let oldEnd = oldVal.length;
|
|
256
|
+
let newEnd = newVal.length;
|
|
257
|
+
while (start < oldEnd && oldVal.charCodeAt(start) === newVal.charCodeAt(start))
|
|
258
|
+
++start;
|
|
259
|
+
while (oldEnd > start && newEnd > start && oldVal.charCodeAt(oldEnd - 1) === newVal.charCodeAt(newEnd - 1)) {
|
|
260
|
+
oldEnd--;
|
|
261
|
+
newEnd--;
|
|
262
|
+
}
|
|
263
|
+
return { from: start, to: oldEnd, text: newVal.slice(start, newEnd) };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const diffBlockView = $view(
|
|
267
|
+
diffBlockSchema.node,
|
|
268
|
+
(ctx) => {
|
|
269
|
+
const config = ctx.get(diffBlockConfig.key);
|
|
270
|
+
return (node, view, getPos) => new DiffBlockNodeView(node, view, getPos, config);
|
|
271
|
+
}
|
|
272
|
+
);
|
|
273
|
+
withMeta(diffBlockView, {
|
|
274
|
+
displayName: "NodeView<diff_block>",
|
|
275
|
+
group: "DiffBlock"
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
function visitDiffBlock(ast) {
|
|
279
|
+
return visit(
|
|
280
|
+
ast,
|
|
281
|
+
"code",
|
|
282
|
+
(node, index, parent) => {
|
|
283
|
+
if (node.lang !== "diff_block") return;
|
|
284
|
+
let originalText = "";
|
|
285
|
+
let modifiedText = node.value || "";
|
|
286
|
+
let language = "text";
|
|
287
|
+
try {
|
|
288
|
+
if (modifiedText.startsWith("{")) {
|
|
289
|
+
const parsed = JSON.parse(modifiedText);
|
|
290
|
+
originalText = parsed.originalText || "";
|
|
291
|
+
modifiedText = parsed.modifiedText || "";
|
|
292
|
+
language = parsed.language || "text";
|
|
293
|
+
}
|
|
294
|
+
} catch (e) {
|
|
295
|
+
}
|
|
296
|
+
const newNode = {
|
|
297
|
+
type: "diff_block",
|
|
298
|
+
originalText,
|
|
299
|
+
modifiedText,
|
|
300
|
+
language
|
|
301
|
+
};
|
|
302
|
+
parent.children.splice(index, 1, newNode);
|
|
303
|
+
}
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
const remarkDiffBlockPlugin = $remark(
|
|
307
|
+
"remark-diff-block",
|
|
308
|
+
() => () => visitDiffBlock
|
|
309
|
+
);
|
|
310
|
+
withMeta(remarkDiffBlockPlugin.plugin, {
|
|
311
|
+
displayName: "Remark<remarkDiffBlock>",
|
|
312
|
+
group: "DiffBlock"
|
|
313
|
+
});
|
|
314
|
+
withMeta(remarkDiffBlockPlugin.options, {
|
|
315
|
+
displayName: "RemarkConfig<remarkDiffBlock>",
|
|
316
|
+
group: "DiffBlock"
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
const diffBlock = [
|
|
320
|
+
diffBlockConfig,
|
|
321
|
+
remarkDiffBlockPlugin,
|
|
322
|
+
diffBlockSchema,
|
|
323
|
+
diffBlockView
|
|
324
|
+
].flat();
|
|
325
|
+
|
|
326
|
+
export { DIFF_BLOCK_DATA_TYPE, Icon, defaultConfig, diffBlock, diffBlockConfig, diffBlockSchema, diffBlockView, remarkDiffBlockPlugin };
|
|
35
327
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/__internal__/keep-alive.ts","../src/__internal__/components/icon.tsx"],"sourcesContent":["// Prevent tree-shaking from removing Vue's `h` and `Fragment`,\n// which are required at runtime for TSX to work.\nexport function keepAlive(..._args: unknown[]) {}\n","import clsx from 'clsx'\nimport DOMPurify from 'dompurify'\nimport { h } from 'vue'\n\nimport { keepAlive } from '../keep-alive'\n\nkeepAlive(h)\n\ntype IconProps = {\n icon?: string | null\n class?: string\n onClick?: (event: PointerEvent) => void\n}\n\nexport function Icon({ icon, class: className, onClick }: IconProps) {\n return (\n <span\n class={clsx('milkdown-icon', className)}\n onPointerdown={onClick}\n innerHTML={icon ? DOMPurify.sanitize(icon.trim()) : undefined}\n />\n )\n}\n\nIcon.props = {\n icon: {\n type: String,\n required: false,\n },\n class: {\n type: String,\n required: false,\n },\n onClick: {\n type: Function,\n required: false,\n },\n}\n"],"names":[],"mappings":";;;;AAEO,SAAS,aAAa,KAAA,EAAkB;AAAC;;ACIhD,SAAA,CAAU,CAAC,CAAA;AAQJ,SAAS,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,SAAQ,EAAc;AACnE,EAAA,uBACE,CAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA,CAAK,eAAA,EAAiB,SAAS,CAAA;AAAA,MACtC,aAAA,EAAe,OAAA;AAAA,MACf,WAAW,IAAA,GAAO,SAAA,CAAU,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,GAAI;AAAA;AAAA,GACtD;AAEJ;AAEA,IAAA,CAAK,KAAA,GAAQ;AAAA,EACX,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/__internal__/keep-alive.ts","../src/__internal__/components/icon.tsx","../src/__internal__/meta.ts","../src/diff-block/config.ts","../src/diff-block/schema.ts","../src/diff-block/view/node-view.ts","../src/diff-block/view/index.ts","../src/diff-block/remark-plugin.ts","../src/diff-block/index.ts"],"sourcesContent":["// Prevent tree-shaking from removing Vue's `h` and `Fragment`,\n// which are required at runtime for TSX to work.\nexport function keepAlive(..._args: unknown[]) {}\n","import clsx from 'clsx'\nimport DOMPurify from 'dompurify'\nimport { h } from 'vue'\n\nimport { keepAlive } from '../keep-alive'\n\nkeepAlive(h)\n\ntype IconProps = {\n icon?: string | null\n class?: string\n onClick?: (event: PointerEvent) => void\n}\n\nexport function Icon({ icon, class: className, onClick }: IconProps) {\n return (\n <span\n class={clsx('milkdown-icon', className)}\n onPointerdown={onClick}\n innerHTML={icon ? DOMPurify.sanitize(icon.trim()) : undefined}\n />\n )\n}\n\nIcon.props = {\n icon: {\n type: String,\n required: false,\n },\n class: {\n type: String,\n required: false,\n },\n onClick: {\n type: Function,\n required: false,\n },\n}\n","import type { Meta, MilkdownPlugin } from '@jvs-milkdown/ctx'\n\nexport function withMeta<T extends MilkdownPlugin>(\n plugin: T,\n meta: Partial<Meta> & Pick<Meta, 'displayName'>\n): T {\n Object.assign(plugin, {\n meta: {\n package: '@jvs-milkdown/components',\n ...meta,\n },\n })\n\n return plugin\n}\n","import type { Extension } from '@codemirror/state'\n\nimport { $ctx } from '@jvs-milkdown/utils'\n\nimport { withMeta } from '../__internal__/meta'\n\nexport interface DiffBlockConfig {\n extensions: Extension[]\n languages: Array<string>\n renderLanguage: (language: string, selected: boolean) => HTMLElement\n theme: string\n}\n\nexport const defaultConfig: DiffBlockConfig = {\n extensions: [],\n languages: [\n 'text',\n 'typescript',\n 'javascript',\n 'html',\n 'css',\n 'json',\n 'markdown',\n ],\n renderLanguage: (language, selected) => {\n const span = document.createElement('span')\n span.className = 'milkdown-diff-block-language'\n span.textContent = language\n if (selected) {\n span.classList.add('selected')\n }\n return span\n },\n theme: 'dark',\n}\n\nexport const diffBlockConfig = $ctx(defaultConfig, 'diffBlockConfig')\n\nwithMeta(diffBlockConfig, {\n displayName: 'Ctx<diffBlockConfig>',\n group: 'DiffBlock',\n})\n","import { expectDomTypeError } from '@jvs-milkdown/exception'\nimport { $nodeSchema } from '@jvs-milkdown/utils'\n\nimport { withMeta } from '../__internal__/meta'\n\nexport const DIFF_BLOCK_DATA_TYPE = 'diff-block'\n\nexport const diffBlockSchema = $nodeSchema('diff_block', () => {\n return {\n content: 'text*',\n marks: '',\n group: 'block',\n selectable: true,\n isolating: true,\n code: true,\n attrs: {\n originalText: { default: '' },\n modifiedText: { default: '' },\n language: { default: 'text' },\n },\n parseDOM: [\n {\n tag: `div[data-type=\"${DIFF_BLOCK_DATA_TYPE}\"]`,\n preserveWhitespace: 'full',\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement)) throw expectDomTypeError(dom)\n\n return {\n originalText: dom.getAttribute('data-original-text') || '',\n modifiedText: dom.getAttribute('data-modified-text') || '',\n language: dom.getAttribute('data-language') || 'text',\n }\n },\n },\n ],\n toDOM: (node) => {\n return [\n 'div',\n {\n 'data-type': DIFF_BLOCK_DATA_TYPE,\n 'data-original-text': node.attrs.originalText,\n 'data-modified-text': node.attrs.modifiedText,\n 'data-language': node.attrs.language,\n class: 'milkdown-diff-block',\n },\n ['code', { spellcheck: 'false' }, 0],\n ]\n },\n parseMarkdown: {\n match: ({ type }) => type === 'diff_block',\n runner: (state, node, type) => {\n const originalText = (node as any).originalText as string\n const modifiedText = (node as any).modifiedText as string\n const language = (node as any).language as string\n\n state.addNode(type, {\n originalText: originalText || '',\n modifiedText: modifiedText || '',\n language: language || 'text',\n })\n },\n },\n toMarkdown: {\n match: (node) => node.type.name === 'diff_block',\n runner: (state, node) => {\n state.addNode('code', undefined, undefined, {\n lang: 'diff_block',\n value: JSON.stringify(\n {\n originalText: node.attrs.originalText,\n modifiedText: node.attrs.modifiedText,\n language: node.attrs.language,\n },\n null,\n 2\n ),\n })\n },\n },\n }\n})\n\nwithMeta(diffBlockSchema.node, {\n displayName: 'NodeSchema<diff_block>',\n group: 'DiffBlock',\n})\n","import type { Node } from '@jvs-milkdown/prose/model'\nimport type { EditorView, NodeView } from '@jvs-milkdown/prose/view'\n\nimport { unifiedMergeView } from '@codemirror/merge'\nimport { Compartment, EditorState } from '@codemirror/state'\nimport {\n EditorView as CodeMirror,\n type ViewUpdate,\n drawSelection,\n} from '@codemirror/view'\nimport { ref, watchEffect, type WatchHandle } from 'vue'\n\nimport type { DiffBlockConfig } from '../config'\n\nexport class DiffBlockNodeView implements NodeView {\n dom: HTMLElement\n cm: CodeMirror\n\n selected = ref(false)\n\n private updating = false\n private disposeSelectedWatcher: WatchHandle\n\n private readonly readOnlyConf: Compartment\n\n constructor(\n public node: Node,\n public view: EditorView,\n public getPos: () => number | undefined,\n public config: DiffBlockConfig\n ) {\n this.readOnlyConf = new Compartment()\n\n this.cm = new CodeMirror({\n doc: this.node.attrs.modifiedText || '',\n root: this.view.root,\n extensions: [\n this.readOnlyConf.of(EditorState.readOnly.of(true)),\n drawSelection(),\n unifiedMergeView({\n original: this.node.attrs.originalText || '',\n mergeControls: true,\n }),\n CodeMirror.updateListener.of(this.forwardUpdate),\n ...config.extensions,\n ],\n })\n\n this.dom = document.createElement('div')\n this.dom.className = 'milkdown-diff-block'\n this.dom.appendChild(this.cm.dom)\n\n this.disposeSelectedWatcher = watchEffect(() => {\n const isSelected = this.selected.value\n if (isSelected) {\n this.dom.classList.add('selected')\n } else {\n this.dom.classList.remove('selected')\n }\n })\n }\n\n private forwardUpdate = (update: ViewUpdate) => {\n if (this.updating) return\n if (!update.docChanged) return\n\n // If the doc changed via CodeMirror merge controls (accept/reject),\n // sync it back to ProseMirror's modifiedText attribute.\n const pos = this.getPos()\n if (pos == null) return\n\n const newText = update.state.doc.toString()\n const tr = this.view.state.tr.setNodeAttribute(pos, 'modifiedText', newText)\n this.view.dispatch(tr)\n }\n\n setSelection(anchor: number, head: number) {\n if (!this.cm.dom.isConnected) return\n\n this.cm.focus()\n this.updating = true\n this.cm.dispatch({ selection: { anchor, head } })\n this.updating = false\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false\n\n if (this.updating) return true\n\n this.node = node\n\n const modifiedText = node.attrs.modifiedText || ''\n\n // Reconfigure unifiedMergeView with the current original text if needed\n // (We might need to recreate it if originalText changes, but typically it doesn't change from outside)\n\n const change = computeChange(this.cm.state.doc.toString(), modifiedText)\n if (change) {\n this.updating = true\n this.cm.dispatch({\n changes: { from: change.from, to: change.to, insert: change.text },\n })\n this.updating = false\n }\n return true\n }\n\n selectNode() {\n this.selected.value = true\n this.cm.focus()\n }\n\n deselectNode() {\n this.selected.value = false\n }\n\n stopEvent() {\n return true\n }\n\n destroy() {\n this.cm.destroy()\n this.disposeSelectedWatcher()\n }\n}\n\nfunction computeChange(\n oldVal: string,\n newVal: string\n): { from: number; to: number; text: string } | null {\n if (oldVal === newVal) return null\n\n let start = 0\n let oldEnd = oldVal.length\n let newEnd = newVal.length\n\n while (\n start < oldEnd &&\n oldVal.charCodeAt(start) === newVal.charCodeAt(start)\n )\n ++start\n\n while (\n oldEnd > start &&\n newEnd > start &&\n oldVal.charCodeAt(oldEnd - 1) === newVal.charCodeAt(newEnd - 1)\n ) {\n oldEnd--\n newEnd--\n }\n\n return { from: start, to: oldEnd, text: newVal.slice(start, newEnd) }\n}\n","import type { NodeViewConstructor } from '@jvs-milkdown/prose/view'\n\nimport { $view } from '@jvs-milkdown/utils'\n\nimport { withMeta } from '../../__internal__/meta'\nimport { diffBlockConfig } from '../config'\nimport { diffBlockSchema } from '../schema'\nimport { DiffBlockNodeView } from './node-view'\n\nexport const diffBlockView = $view(\n diffBlockSchema.node,\n (ctx): NodeViewConstructor => {\n const config = ctx.get(diffBlockConfig.key)\n return (node, view, getPos) =>\n new DiffBlockNodeView(node, view, getPos, config)\n }\n)\n\nwithMeta(diffBlockView, {\n displayName: 'NodeView<diff_block>',\n group: 'DiffBlock',\n})\n","import type { Node } from '@jvs-milkdown/transformer'\n\nimport { $remark } from '@jvs-milkdown/utils'\nimport { visit } from 'unist-util-visit'\n\nimport { withMeta } from '../__internal__/meta'\n\nfunction visitDiffBlock(ast: Node) {\n return visit(\n ast,\n 'code',\n (\n node: Node & { lang?: string; value?: string },\n index: number,\n parent: Node & { children: Node[] }\n ) => {\n if (node.lang !== 'diff_block') return\n\n let originalText = ''\n let modifiedText = node.value || ''\n let language = 'text'\n\n try {\n if (modifiedText.startsWith('{')) {\n const parsed = JSON.parse(modifiedText)\n originalText = parsed.originalText || ''\n modifiedText = parsed.modifiedText || ''\n language = parsed.language || 'text'\n }\n } catch {\n // fallback\n }\n\n const newNode = {\n type: 'diff_block',\n originalText,\n modifiedText,\n language,\n }\n\n parent.children.splice(index, 1, newNode as any)\n }\n )\n}\n\nexport const remarkDiffBlockPlugin = $remark(\n 'remark-diff-block',\n () => () => visitDiffBlock\n)\n\nwithMeta(remarkDiffBlockPlugin.plugin, {\n displayName: 'Remark<remarkDiffBlock>',\n group: 'DiffBlock',\n})\n\nwithMeta(remarkDiffBlockPlugin.options, {\n displayName: 'RemarkConfig<remarkDiffBlock>',\n group: 'DiffBlock',\n})\n","import type { MilkdownPlugin } from '@jvs-milkdown/ctx'\n\nimport { diffBlockConfig } from './config'\nimport { diffBlockSchema } from './schema'\nimport { diffBlockView } from './view'\n\nexport * from './config'\nexport * from './schema'\nexport * from './view'\nexport * from './remark-plugin'\n\nimport { remarkDiffBlockPlugin } from './remark-plugin'\n\nexport const diffBlock: MilkdownPlugin[] = [\n diffBlockConfig,\n remarkDiffBlockPlugin,\n diffBlockSchema,\n diffBlockView,\n].flat()\n"],"names":["CodeMirror"],"mappings":";;;;;;;;;;AAEO,SAAS,aAAa,KAAA,EAAkB;AAAC;;ACIhD,SAAA,CAAU,CAAC,CAAA;AAQJ,SAAS,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,SAAQ,EAAc;AACnE,EAAA,uBACE,CAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA,CAAK,eAAA,EAAiB,SAAS,CAAA;AAAA,MACtC,aAAA,EAAe,OAAA;AAAA,MACf,WAAW,IAAA,GAAO,SAAA,CAAU,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,GAAI;AAAA;AAAA,GACtD;AAEJ;AAEA,IAAA,CAAK,KAAA,GAAQ;AAAA,EACX,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAA;;;;;;;;;;;;;;;;;;ACnCO,SAAS,QAAA,CACd,QACA,IAAA,EACG;AACH,EAAA,MAAA,CAAO,OAAO,MAAA,EAAQ;AAAA,IACpB,IAAA,EAAM,cAAA,CAAA;AAAA,MACJ,OAAA,EAAS;AAAA,KAAA,EACN,IAAA;AAAA,GAEN,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;ACDO,MAAM,aAAA,GAAiC;AAAA,EAC5C,YAAY,EAAC;AAAA,EACb,SAAA,EAAW;AAAA,IACT,MAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,cAAA,EAAgB,CAAC,QAAA,EAAU,QAAA,KAAa;AACtC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,8BAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA;AACnB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,UAAU,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,KAAA,EAAO;AACT;AAEO,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,EAAe,iBAAiB;AAEpE,QAAA,CAAS,eAAA,EAAiB;AAAA,EACxB,WAAA,EAAa,sBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;ACpCM,MAAM,oBAAA,GAAuB;AAE7B,MAAM,eAAA,GAAkB,WAAA,CAAY,YAAA,EAAc,MAAM;AAC7D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,EAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,YAAA,EAAc,EAAE,OAAA,EAAS,EAAA,EAAG;AAAA,MAC5B,YAAA,EAAc,EAAE,OAAA,EAAS,EAAA,EAAG;AAAA,MAC5B,QAAA,EAAU,EAAE,OAAA,EAAS,MAAA;AAAO,KAC9B;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,GAAA,EAAK,kBAAkB,oBAAoB,CAAA,EAAA,CAAA;AAAA,QAC3C,kBAAA,EAAoB,MAAA;AAAA,QACpB,QAAA,EAAU,CAAC,GAAA,KAAQ;AACjB,UAAA,IAAI,EAAE,GAAA,YAAe,WAAA,CAAA,EAAc,MAAM,mBAAmB,GAAG,CAAA;AAE/D,UAAA,OAAO;AAAA,YACL,YAAA,EAAc,GAAA,CAAI,YAAA,CAAa,oBAAoB,CAAA,IAAK,EAAA;AAAA,YACxD,YAAA,EAAc,GAAA,CAAI,YAAA,CAAa,oBAAoB,CAAA,IAAK,EAAA;AAAA,YACxD,QAAA,EAAU,GAAA,CAAI,YAAA,CAAa,eAAe,CAAA,IAAK;AAAA,WACjD;AAAA,QACF;AAAA;AACF,KACF;AAAA,IACA,KAAA,EAAO,CAAC,IAAA,KAAS;AACf,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA;AAAA,UACE,WAAA,EAAa,oBAAA;AAAA,UACb,oBAAA,EAAsB,KAAK,KAAA,CAAM,YAAA;AAAA,UACjC,oBAAA,EAAsB,KAAK,KAAA,CAAM,YAAA;AAAA,UACjC,eAAA,EAAiB,KAAK,KAAA,CAAM,QAAA;AAAA,UAC5B,KAAA,EAAO;AAAA,SACT;AAAA,QACA,CAAC,MAAA,EAAQ,EAAE,UAAA,EAAY,OAAA,IAAW,CAAC;AAAA,OACrC;AAAA,IACF,CAAA;AAAA,IACA,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,CAAC,EAAE,IAAA,OAAW,IAAA,KAAS,YAAA;AAAA,MAC9B,MAAA,EAAQ,CAAC,KAAA,EAAO,IAAA,EAAM,IAAA,KAAS;AAC7B,QAAA,MAAM,eAAgB,IAAA,CAAa,YAAA;AACnC,QAAA,MAAM,eAAgB,IAAA,CAAa,YAAA;AACnC,QAAA,MAAM,WAAY,IAAA,CAAa,QAAA;AAE/B,QAAA,KAAA,CAAM,QAAQ,IAAA,EAAM;AAAA,UAClB,cAAc,YAAA,IAAgB,EAAA;AAAA,UAC9B,cAAc,YAAA,IAAgB,EAAA;AAAA,UAC9B,UAAU,QAAA,IAAY;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,EAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAK,IAAA,KAAS,YAAA;AAAA,MACpC,MAAA,EAAQ,CAAC,KAAA,EAAO,IAAA,KAAS;AACvB,QAAA,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,MAAA,EAAW,MAAA,EAAW;AAAA,UAC1C,IAAA,EAAM,YAAA;AAAA,UACN,OAAO,IAAA,CAAK,SAAA;AAAA,YACV;AAAA,cACE,YAAA,EAAc,KAAK,KAAA,CAAM,YAAA;AAAA,cACzB,YAAA,EAAc,KAAK,KAAA,CAAM,YAAA;AAAA,cACzB,QAAA,EAAU,KAAK,KAAA,CAAM;AAAA,aACvB;AAAA,YACA,IAAA;AAAA,YACA;AAAA;AACF,SACD,CAAA;AAAA,MACH;AAAA;AACF,GACF;AACF,CAAC;AAED,QAAA,CAAS,gBAAgB,IAAA,EAAM;AAAA,EAC7B,WAAA,EAAa,wBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;ACvEM,MAAM,iBAAA,CAAsC;AAAA,EAWjD,WAAA,CACS,IAAA,EACA,IAAA,EACA,MAAA,EACA,MAAA,EACP;AAJO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAXT,IAAA,IAAA,CAAA,QAAA,GAAW,IAAI,KAAK,CAAA;AAEpB,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AA0CnB,IAAA,IAAA,CAAQ,aAAA,GAAgB,CAAC,MAAA,KAAuB;AAC9C,MAAA,IAAI,KAAK,QAAA,EAAU;AACnB,MAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AAIxB,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,EAAO;AACxB,MAAA,IAAI,OAAO,IAAA,EAAM;AAEjB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAC1C,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,gBAAA,CAAiB,GAAA,EAAK,gBAAgB,OAAO,CAAA;AAC3E,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,IACvB,CAAA;AA3CE,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,WAAA,EAAY;AAEpC,IAAA,IAAA,CAAK,EAAA,GAAK,IAAIA,UAAA,CAAW;AAAA,MACvB,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,EAAA;AAAA,MACrC,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,MAChB,UAAA,EAAY;AAAA,QACV,KAAK,YAAA,CAAa,EAAA,CAAG,YAAY,QAAA,CAAS,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,QAClD,aAAA,EAAc;AAAA,QACd,gBAAA,CAAiB;AAAA,UACf,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,EAAA;AAAA,UAC1C,aAAA,EAAe;AAAA,SAChB,CAAA;AAAA,QACDA,UAAA,CAAW,cAAA,CAAe,EAAA,CAAG,IAAA,CAAK,aAAa,CAAA;AAAA,QAC/C,GAAG,MAAA,CAAO;AAAA;AACZ,KACD,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,IAAA,CAAK,IAAI,SAAA,GAAY,qBAAA;AACrB,IAAA,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,EAAA,CAAG,GAAG,CAAA;AAEhC,IAAA,IAAA,CAAK,sBAAA,GAAyB,YAAY,MAAM;AAC9C,MAAA,MAAM,UAAA,GAAa,KAAK,QAAA,CAAS,KAAA;AACjC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,MACtC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAgBA,YAAA,CAAa,QAAgB,IAAA,EAAc;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,WAAA,EAAa;AAE9B,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,EAAA,CAAG,SAAS,EAAE,SAAA,EAAW,EAAE,MAAA,EAAQ,IAAA,IAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AAAA,EAEA,OAAO,IAAA,EAAY;AACjB,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,MAAM,OAAO,KAAA;AAEzC,IAAA,IAAI,IAAA,CAAK,UAAU,OAAO,IAAA;AAE1B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAEZ,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,EAAA;AAKhD,IAAA,MAAM,MAAA,GAAS,cAAc,IAAA,CAAK,EAAA,CAAG,MAAM,GAAA,CAAI,QAAA,IAAY,YAAY,CAAA;AACvE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,IAAA,CAAK,GAAG,QAAA,CAAS;AAAA,QACf,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,IAAI,MAAA,CAAO,EAAA,EAAI,MAAA,EAAQ,MAAA,CAAO,IAAA;AAAK,OAClE,CAAA;AACD,MAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,IAClB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,IAAA,CAAK,SAAS,KAAA,GAAQ,IAAA;AACtB,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,EAChB;AAAA,EAEA,YAAA,GAAe;AACb,IAAA,IAAA,CAAK,SAAS,KAAA,GAAQ,KAAA;AAAA,EACxB;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAU;AACR,IAAA,IAAA,CAAK,GAAG,OAAA,EAAQ;AAChB,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAAA,EAC9B;AACF;AAEA,SAAS,aAAA,CACP,QACA,MAAA,EACmD;AACnD,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,IAAA;AAE9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,SAAS,MAAA,CAAO,MAAA;AACpB,EAAA,IAAI,SAAS,MAAA,CAAO,MAAA;AAEpB,EAAA,OACE,KAAA,GAAQ,UACR,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,KAAM,MAAA,CAAO,WAAW,KAAK,CAAA;AAEpD,IAAA,EAAE,KAAA;AAEJ,EAAA,OACE,MAAA,GAAS,KAAA,IACT,MAAA,GAAS,KAAA,IACT,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,KAAM,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,EAC9D;AACA,IAAA,MAAA,EAAA;AACA,IAAA,MAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA,EAAE;AACtE;;AChJO,MAAM,aAAA,GAAgB,KAAA;AAAA,EAC3B,eAAA,CAAgB,IAAA;AAAA,EAChB,CAAC,GAAA,KAA6B;AAC5B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,eAAA,CAAgB,GAAG,CAAA;AAC1C,IAAA,OAAO,CAAC,MAAM,IAAA,EAAM,MAAA,KAClB,IAAI,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpD;AACF;AAEA,QAAA,CAAS,aAAA,EAAe;AAAA,EACtB,WAAA,EAAa,sBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;ACdD,SAAS,eAAe,GAAA,EAAW;AACjC,EAAA,OAAO,KAAA;AAAA,IACL,GAAA;AAAA,IACA,MAAA;AAAA,IACA,CACE,IAAA,EACA,KAAA,EACA,MAAA,KACG;AACH,MAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAEhC,MAAA,IAAI,YAAA,GAAe,EAAA;AACnB,MAAA,IAAI,YAAA,GAAe,KAAK,KAAA,IAAS,EAAA;AACjC,MAAA,IAAI,QAAA,GAAW,MAAA;AAEf,MAAA,IAAI;AACF,QAAA,IAAI,YAAA,CAAa,UAAA,CAAW,GAAG,CAAA,EAAG;AAChC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AACtC,UAAA,YAAA,GAAe,OAAO,YAAA,IAAgB,EAAA;AACtC,UAAA,YAAA,GAAe,OAAO,YAAA,IAAgB,EAAA;AACtC,UAAA,QAAA,GAAW,OAAO,QAAA,IAAY,MAAA;AAAA,QAChC;AAAA,MACF,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,MAER;AAEA,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,IAAA,EAAM,YAAA;AAAA,QACN,YAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,OAAc,CAAA;AAAA,IACjD;AAAA,GACF;AACF;AAEO,MAAM,qBAAA,GAAwB,OAAA;AAAA,EACnC,mBAAA;AAAA,EACA,MAAM,MAAM;AACd;AAEA,QAAA,CAAS,sBAAsB,MAAA,EAAQ;AAAA,EACrC,WAAA,EAAa,yBAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;AAED,QAAA,CAAS,sBAAsB,OAAA,EAAS;AAAA,EACtC,WAAA,EAAa,+BAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAC,CAAA;;AC7CM,MAAM,SAAA,GAA8B;AAAA,EACzC,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,CAAE,IAAA;;;;"}
|
package/lib/table-block/index.js
CHANGED
|
@@ -1076,11 +1076,11 @@ const TableBlock = defineComponent({
|
|
|
1076
1076
|
let shouldUpdate = false;
|
|
1077
1077
|
for (const mut of mutations) {
|
|
1078
1078
|
if (mut.type === "childList") {
|
|
1079
|
-
for (const node2 of mut.addedNodes) {
|
|
1079
|
+
for (const node2 of Array.from(mut.addedNodes)) {
|
|
1080
1080
|
if (node2 instanceof HTMLElement && ["TR", "TD", "TH", "TBODY"].includes(node2.nodeName))
|
|
1081
1081
|
shouldUpdate = true;
|
|
1082
1082
|
}
|
|
1083
|
-
for (const node2 of mut.removedNodes) {
|
|
1083
|
+
for (const node2 of Array.from(mut.removedNodes)) {
|
|
1084
1084
|
if (node2 instanceof HTMLElement && ["TR", "TD", "TH", "TBODY"].includes(node2.nodeName))
|
|
1085
1085
|
shouldUpdate = true;
|
|
1086
1086
|
}
|