tiptap-extension-code-block-shiki 0.5.0 → 0.6.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.
@@ -0,0 +1,1459 @@
1
+ import { Plugin as P, PluginKey as N, Selection as O, TextSelection as b, NodeSelection as ce } from "@tiptap/pm/state";
2
+ import { DecorationSet as Se, Decoration as ee } from "@tiptap/pm/view";
3
+ import "@tiptap/pm/keymap";
4
+ import { Fragment as L, Slice as be, DOMParser as Me } from "@tiptap/pm/model";
5
+ import { liftTarget as Ae, joinPoint as le, canSplit as R, ReplaceStep as Te, ReplaceAroundStep as Ce, canJoin as de } from "@tiptap/pm/transform";
6
+ import { createParagraphNear as Ee, deleteSelection as Be, exitCode as ve, joinUp as $e, joinDown as Ie, joinBackward as Pe, joinForward as Ne, joinTextblockBackward as Oe, joinTextblockForward as je, lift as Fe, liftEmptyBlock as Le, newlineInCode as Re, selectNodeBackward as De, selectNodeForward as ze, selectParentNode as We, selectTextblockEnd as He, selectTextblockStart as Ke, setBlockType as te, wrapIn as Ve } from "@tiptap/pm/commands";
7
+ import { liftListItem as _e, sinkListItem as Je, wrapInList as Ue } from "@tiptap/pm/schema-list";
8
+ import { bundledThemes as ue, bundledLanguages as fe, createHighlighter as Ge } from "shiki";
9
+ function pe(e) {
10
+ const { state: t, transaction: n } = e;
11
+ let { selection: o } = n, { doc: r } = n, { storedMarks: s } = n;
12
+ return {
13
+ ...t,
14
+ apply: t.apply.bind(t),
15
+ applyTransaction: t.applyTransaction.bind(t),
16
+ plugins: t.plugins,
17
+ schema: t.schema,
18
+ reconfigure: t.reconfigure.bind(t),
19
+ toJSON: t.toJSON.bind(t),
20
+ get storedMarks() {
21
+ return s;
22
+ },
23
+ get selection() {
24
+ return o;
25
+ },
26
+ get doc() {
27
+ return r;
28
+ },
29
+ get tr() {
30
+ return o = n.selection, r = n.doc, s = n.storedMarks, n;
31
+ }
32
+ };
33
+ }
34
+ class qe {
35
+ constructor(t) {
36
+ this.editor = t.editor, this.rawCommands = this.editor.extensionManager.commands, this.customState = t.state;
37
+ }
38
+ get hasCustomState() {
39
+ return !!this.customState;
40
+ }
41
+ get state() {
42
+ return this.customState || this.editor.state;
43
+ }
44
+ get commands() {
45
+ const { rawCommands: t, editor: n, state: o } = this, { view: r } = n, { tr: s } = o, a = this.buildProps(s);
46
+ return Object.fromEntries(Object.entries(t).map(([i, c]) => [i, (...u) => {
47
+ const l = c(...u)(a);
48
+ return !s.getMeta("preventDispatch") && !this.hasCustomState && r.dispatch(s), l;
49
+ }]));
50
+ }
51
+ get chain() {
52
+ return () => this.createChain();
53
+ }
54
+ get can() {
55
+ return () => this.createCan();
56
+ }
57
+ createChain(t, n = !0) {
58
+ const { rawCommands: o, editor: r, state: s } = this, { view: a } = r, i = [], c = !!t, d = t || s.tr, u = () => (!c && n && !d.getMeta("preventDispatch") && !this.hasCustomState && a.dispatch(d), i.every((f) => f === !0)), l = {
59
+ ...Object.fromEntries(Object.entries(o).map(([f, p]) => [f, (...h) => {
60
+ const g = this.buildProps(d, n), k = p(...h)(g);
61
+ return i.push(k), l;
62
+ }])),
63
+ run: u
64
+ };
65
+ return l;
66
+ }
67
+ createCan(t) {
68
+ const { rawCommands: n, state: o } = this, r = !1, s = t || o.tr, a = this.buildProps(s, r);
69
+ return {
70
+ ...Object.fromEntries(Object.entries(n).map(([c, d]) => [c, (...u) => d(...u)({ ...a, dispatch: void 0 })])),
71
+ chain: () => this.createChain(s, r)
72
+ };
73
+ }
74
+ buildProps(t, n = !0) {
75
+ const { rawCommands: o, editor: r, state: s } = this, { view: a } = r, i = {
76
+ tr: t,
77
+ editor: r,
78
+ view: a,
79
+ state: pe({
80
+ state: s,
81
+ transaction: t
82
+ }),
83
+ dispatch: n ? () => {
84
+ } : void 0,
85
+ chain: () => this.createChain(t, n),
86
+ can: () => this.createCan(t),
87
+ get commands() {
88
+ return Object.fromEntries(Object.entries(o).map(([c, d]) => [c, (...u) => d(...u)(i)]));
89
+ }
90
+ };
91
+ return i;
92
+ }
93
+ }
94
+ function w(e, t, n) {
95
+ return e.config[t] === void 0 && e.parent ? w(e.parent, t, n) : typeof e.config[t] == "function" ? e.config[t].bind({
96
+ ...n,
97
+ parent: e.parent ? w(e.parent, t, n) : null
98
+ }) : e.config[t];
99
+ }
100
+ function Qe(e) {
101
+ const t = e.filter((r) => r.type === "extension"), n = e.filter((r) => r.type === "node"), o = e.filter((r) => r.type === "mark");
102
+ return {
103
+ baseExtensions: t,
104
+ nodeExtensions: n,
105
+ markExtensions: o
106
+ };
107
+ }
108
+ function y(e, t) {
109
+ if (typeof e == "string") {
110
+ if (!t.nodes[e])
111
+ throw Error(`There is no node type named '${e}'. Maybe you forgot to add the extension?`);
112
+ return t.nodes[e];
113
+ }
114
+ return e;
115
+ }
116
+ function Xe(...e) {
117
+ return e.filter((t) => !!t).reduce((t, n) => {
118
+ const o = { ...t };
119
+ return Object.entries(n).forEach(([r, s]) => {
120
+ if (!o[r]) {
121
+ o[r] = s;
122
+ return;
123
+ }
124
+ if (r === "class") {
125
+ const i = s ? s.split(" ") : [], c = o[r] ? o[r].split(" ") : [], d = i.filter((u) => !c.includes(u));
126
+ o[r] = [...c, ...d].join(" ");
127
+ } else
128
+ r === "style" ? o[r] = [o[r], s].join("; ") : o[r] = s;
129
+ }), o;
130
+ }, {});
131
+ }
132
+ function Ye(e) {
133
+ return typeof e == "function";
134
+ }
135
+ function x(e, t = void 0, ...n) {
136
+ return Ye(e) ? t ? e.bind(t)(...n) : e(...n) : e;
137
+ }
138
+ function Ze(e) {
139
+ return Object.prototype.toString.call(e) === "[object RegExp]";
140
+ }
141
+ class et {
142
+ constructor(t) {
143
+ this.find = t.find, this.handler = t.handler;
144
+ }
145
+ }
146
+ function tt(e) {
147
+ return Object.prototype.toString.call(e).slice(8, -1);
148
+ }
149
+ function V(e) {
150
+ return tt(e) !== "Object" ? !1 : e.constructor === Object && Object.getPrototypeOf(e) === Object.prototype;
151
+ }
152
+ function Q(e, t) {
153
+ const n = { ...e };
154
+ return V(e) && V(t) && Object.keys(t).forEach((o) => {
155
+ V(t[o]) ? o in e ? n[o] = Q(e[o], t[o]) : Object.assign(n, { [o]: t[o] }) : Object.assign(n, { [o]: t[o] });
156
+ }), n;
157
+ }
158
+ class C {
159
+ constructor(t = {}) {
160
+ this.type = "extension", this.name = "extension", this.parent = null, this.child = null, this.config = {
161
+ name: this.name,
162
+ defaultOptions: {}
163
+ }, this.config = {
164
+ ...this.config,
165
+ ...t
166
+ }, this.name = this.config.name, t.defaultOptions && Object.keys(t.defaultOptions).length > 0 && console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`), this.options = this.config.defaultOptions, this.config.addOptions && (this.options = x(w(this, "addOptions", {
167
+ name: this.name
168
+ }))), this.storage = x(w(this, "addStorage", {
169
+ name: this.name,
170
+ options: this.options
171
+ })) || {};
172
+ }
173
+ static create(t = {}) {
174
+ return new C(t);
175
+ }
176
+ configure(t = {}) {
177
+ const n = this.extend();
178
+ return n.options = Q(this.options, t), n.storage = x(w(n, "addStorage", {
179
+ name: n.name,
180
+ options: n.options
181
+ })), n;
182
+ }
183
+ extend(t = {}) {
184
+ const n = new C({ ...this.config, ...t });
185
+ return n.parent = this, this.child = n, n.name = t.name ? t.name : n.parent.name, t.defaultOptions && console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`), n.options = x(w(n, "addOptions", {
186
+ name: n.name
187
+ })), n.storage = x(w(n, "addStorage", {
188
+ name: n.name,
189
+ options: n.options
190
+ })), n;
191
+ }
192
+ }
193
+ function nt(e, t, n) {
194
+ const { from: o, to: r } = t, { blockSeparator: s = `
195
+
196
+ `, textSerializers: a = {} } = n || {};
197
+ let i = "", c = !0;
198
+ return e.nodesBetween(o, r, (d, u, l, f) => {
199
+ var p;
200
+ const m = a == null ? void 0 : a[d.type.name];
201
+ if (m)
202
+ return d.isBlock && !c && (i += s, c = !0), l && (i += m({
203
+ node: d,
204
+ pos: u,
205
+ parent: l,
206
+ index: f,
207
+ range: t
208
+ })), !1;
209
+ d.isText ? (i += (p = d == null ? void 0 : d.text) === null || p === void 0 ? void 0 : p.slice(Math.max(o, u) - u, r - u), c = !1) : d.isBlock && !c && (i += s, c = !0);
210
+ }), i;
211
+ }
212
+ function ot(e) {
213
+ return Object.fromEntries(Object.entries(e.nodes).filter(([, t]) => t.spec.toText).map(([t, n]) => [t, n.spec.toText]));
214
+ }
215
+ C.create({
216
+ name: "clipboardTextSerializer",
217
+ addOptions() {
218
+ return {
219
+ blockSeparator: void 0
220
+ };
221
+ },
222
+ addProseMirrorPlugins() {
223
+ return [
224
+ new P({
225
+ key: new N("clipboardTextSerializer"),
226
+ props: {
227
+ clipboardTextSerializer: () => {
228
+ const { editor: e } = this, { state: t, schema: n } = e, { doc: o, selection: r } = t, { ranges: s } = r, a = Math.min(...s.map((u) => u.$from.pos)), i = Math.max(...s.map((u) => u.$to.pos)), c = ot(n);
229
+ return nt(o, { from: a, to: i }, {
230
+ ...this.options.blockSeparator !== void 0 ? { blockSeparator: this.options.blockSeparator } : {},
231
+ textSerializers: c
232
+ });
233
+ }
234
+ }
235
+ })
236
+ ];
237
+ }
238
+ });
239
+ const rt = () => ({ editor: e, view: t }) => (requestAnimationFrame(() => {
240
+ var n;
241
+ e.isDestroyed || (t.dom.blur(), (n = window == null ? void 0 : window.getSelection()) === null || n === void 0 || n.removeAllRanges());
242
+ }), !0), st = (e = !1) => ({ commands: t }) => t.setContent("", e), it = () => ({ state: e, tr: t, dispatch: n }) => {
243
+ const { selection: o } = t, { ranges: r } = o;
244
+ return n && r.forEach(({ $from: s, $to: a }) => {
245
+ e.doc.nodesBetween(s.pos, a.pos, (i, c) => {
246
+ if (i.type.isText)
247
+ return;
248
+ const { doc: d, mapping: u } = t, l = d.resolve(u.map(c)), f = d.resolve(u.map(c + i.nodeSize)), p = l.blockRange(f);
249
+ if (!p)
250
+ return;
251
+ const m = Ae(p);
252
+ if (i.type.isTextblock) {
253
+ const { defaultType: h } = l.parent.contentMatchAt(l.index());
254
+ t.setNodeMarkup(p.start, h);
255
+ }
256
+ (m || m === 0) && t.lift(p, m);
257
+ });
258
+ }), !0;
259
+ }, at = (e) => (t) => e(t), ct = () => ({ state: e, dispatch: t }) => Ee(e, t), lt = (e, t) => ({ editor: n, tr: o }) => {
260
+ const { state: r } = n, s = r.doc.slice(e.from, e.to);
261
+ o.deleteRange(e.from, e.to);
262
+ const a = o.mapping.map(t);
263
+ return o.insert(a, s.content), o.setSelection(new b(o.doc.resolve(a - 1))), !0;
264
+ }, dt = () => ({ tr: e, dispatch: t }) => {
265
+ const { selection: n } = e, o = n.$anchor.node();
266
+ if (o.content.size > 0)
267
+ return !1;
268
+ const r = e.selection.$anchor;
269
+ for (let s = r.depth; s > 0; s -= 1)
270
+ if (r.node(s).type === o.type) {
271
+ if (t) {
272
+ const i = r.before(s), c = r.after(s);
273
+ e.delete(i, c).scrollIntoView();
274
+ }
275
+ return !0;
276
+ }
277
+ return !1;
278
+ }, ut = (e) => ({ tr: t, state: n, dispatch: o }) => {
279
+ const r = y(e, n.schema), s = t.selection.$anchor;
280
+ for (let a = s.depth; a > 0; a -= 1)
281
+ if (s.node(a).type === r) {
282
+ if (o) {
283
+ const c = s.before(a), d = s.after(a);
284
+ t.delete(c, d).scrollIntoView();
285
+ }
286
+ return !0;
287
+ }
288
+ return !1;
289
+ }, ft = (e) => ({ tr: t, dispatch: n }) => {
290
+ const { from: o, to: r } = e;
291
+ return n && t.delete(o, r), !0;
292
+ }, pt = () => ({ state: e, dispatch: t }) => Be(e, t), mt = () => ({ commands: e }) => e.keyboardShortcut("Enter"), ht = () => ({ state: e, dispatch: t }) => ve(e, t);
293
+ function z(e, t, n = { strict: !0 }) {
294
+ const o = Object.keys(t);
295
+ return o.length ? o.every((r) => n.strict ? t[r] === e[r] : Ze(t[r]) ? t[r].test(e[r]) : t[r] === e[r]) : !0;
296
+ }
297
+ function q(e, t, n = {}) {
298
+ return e.find((o) => o.type === t && z(o.attrs, n));
299
+ }
300
+ function gt(e, t, n = {}) {
301
+ return !!q(e, t, n);
302
+ }
303
+ function me(e, t, n = {}) {
304
+ if (!e || !t)
305
+ return;
306
+ let o = e.parent.childAfter(e.parentOffset);
307
+ if (e.parentOffset === o.offset && o.offset !== 0 && (o = e.parent.childBefore(e.parentOffset)), !o.node)
308
+ return;
309
+ const r = q([...o.node.marks], t, n);
310
+ if (!r)
311
+ return;
312
+ let s = o.index, a = e.start() + o.offset, i = s + 1, c = a + o.node.nodeSize;
313
+ for (q([...o.node.marks], t, n); s > 0 && r.isInSet(e.parent.child(s - 1).marks); )
314
+ s -= 1, a -= e.parent.child(s).nodeSize;
315
+ for (; i < e.parent.childCount && gt([...e.parent.child(i).marks], t, n); )
316
+ c += e.parent.child(i).nodeSize, i += 1;
317
+ return {
318
+ from: a,
319
+ to: c
320
+ };
321
+ }
322
+ function $(e, t) {
323
+ if (typeof e == "string") {
324
+ if (!t.marks[e])
325
+ throw Error(`There is no mark type named '${e}'. Maybe you forgot to add the extension?`);
326
+ return t.marks[e];
327
+ }
328
+ return e;
329
+ }
330
+ const kt = (e, t = {}) => ({ tr: n, state: o, dispatch: r }) => {
331
+ const s = $(e, o.schema), { doc: a, selection: i } = n, { $from: c, from: d, to: u } = i;
332
+ if (r) {
333
+ const l = me(c, s, t);
334
+ if (l && l.from <= d && l.to >= u) {
335
+ const f = b.create(a, l.from, l.to);
336
+ n.setSelection(f);
337
+ }
338
+ }
339
+ return !0;
340
+ }, yt = (e) => (t) => {
341
+ const n = typeof e == "function" ? e(t) : e;
342
+ for (let o = 0; o < n.length; o += 1)
343
+ if (n[o](t))
344
+ return !0;
345
+ return !1;
346
+ };
347
+ function he(e) {
348
+ return e instanceof b;
349
+ }
350
+ function I(e = 0, t = 0, n = 0) {
351
+ return Math.min(Math.max(e, t), n);
352
+ }
353
+ function wt(e, t = null) {
354
+ if (!t)
355
+ return null;
356
+ const n = O.atStart(e), o = O.atEnd(e);
357
+ if (t === "start" || t === !0)
358
+ return n;
359
+ if (t === "end")
360
+ return o;
361
+ const r = n.from, s = o.to;
362
+ return t === "all" ? b.create(e, I(0, r, s), I(e.content.size, r, s)) : b.create(e, I(t, r, s), I(t, r, s));
363
+ }
364
+ function X() {
365
+ return [
366
+ "iPad Simulator",
367
+ "iPhone Simulator",
368
+ "iPod Simulator",
369
+ "iPad",
370
+ "iPhone",
371
+ "iPod"
372
+ ].includes(navigator.platform) || navigator.userAgent.includes("Mac") && "ontouchend" in document;
373
+ }
374
+ const xt = (e = null, t = {}) => ({ editor: n, view: o, tr: r, dispatch: s }) => {
375
+ t = {
376
+ scrollIntoView: !0,
377
+ ...t
378
+ };
379
+ const a = () => {
380
+ X() && o.dom.focus(), requestAnimationFrame(() => {
381
+ n.isDestroyed || (o.focus(), t != null && t.scrollIntoView && n.commands.scrollIntoView());
382
+ });
383
+ };
384
+ if (o.hasFocus() && e === null || e === !1)
385
+ return !0;
386
+ if (s && e === null && !he(n.state.selection))
387
+ return a(), !0;
388
+ const i = wt(r.doc, e) || n.state.selection, c = n.state.selection.eq(i);
389
+ return s && (c || r.setSelection(i), c && r.storedMarks && r.setStoredMarks(r.storedMarks), a()), !0;
390
+ }, St = (e, t) => (n) => e.every((o, r) => t(o, { ...n, index: r })), bt = (e, t) => ({ tr: n, commands: o }) => o.insertContentAt({ from: n.selection.from, to: n.selection.to }, e, t), ge = (e) => {
391
+ const t = e.childNodes;
392
+ for (let n = t.length - 1; n >= 0; n -= 1) {
393
+ const o = t[n];
394
+ o.nodeType === 3 && o.nodeValue && /^(\n\s\s|\n)$/.test(o.nodeValue) ? e.removeChild(o) : o.nodeType === 1 && ge(o);
395
+ }
396
+ return e;
397
+ };
398
+ function ne(e) {
399
+ const t = `<body>${e}</body>`, n = new window.DOMParser().parseFromString(t, "text/html").body;
400
+ return ge(n);
401
+ }
402
+ function W(e, t, n) {
403
+ if (n = {
404
+ slice: !0,
405
+ parseOptions: {},
406
+ ...n
407
+ }, typeof e == "object" && e !== null)
408
+ try {
409
+ return Array.isArray(e) && e.length > 0 ? L.fromArray(e.map((o) => t.nodeFromJSON(o))) : t.nodeFromJSON(e);
410
+ } catch (o) {
411
+ return console.warn("[tiptap warn]: Invalid content.", "Passed value:", e, "Error:", o), W("", t, n);
412
+ }
413
+ if (typeof e == "string") {
414
+ const o = Me.fromSchema(t);
415
+ return n.slice ? o.parseSlice(ne(e), n.parseOptions).content : o.parse(ne(e), n.parseOptions);
416
+ }
417
+ return W("", t, n);
418
+ }
419
+ function Mt(e, t, n) {
420
+ const o = e.steps.length - 1;
421
+ if (o < t)
422
+ return;
423
+ const r = e.steps[o];
424
+ if (!(r instanceof Te || r instanceof Ce))
425
+ return;
426
+ const s = e.mapping.maps[o];
427
+ let a = 0;
428
+ s.forEach((i, c, d, u) => {
429
+ a === 0 && (a = u);
430
+ }), e.setSelection(O.near(e.doc.resolve(a), n));
431
+ }
432
+ const At = (e) => e.toString().startsWith("<"), Tt = (e, t, n) => ({ tr: o, dispatch: r, editor: s }) => {
433
+ if (r) {
434
+ n = {
435
+ parseOptions: {},
436
+ updateSelection: !0,
437
+ applyInputRules: !1,
438
+ applyPasteRules: !1,
439
+ ...n
440
+ };
441
+ const a = W(t, s.schema, {
442
+ parseOptions: {
443
+ preserveWhitespace: "full",
444
+ ...n.parseOptions
445
+ }
446
+ });
447
+ if (a.toString() === "<>")
448
+ return !0;
449
+ let { from: i, to: c } = typeof e == "number" ? { from: e, to: e } : { from: e.from, to: e.to }, d = !0, u = !0;
450
+ if ((At(a) ? a : [a]).forEach((p) => {
451
+ p.check(), d = d ? p.isText && p.marks.length === 0 : !1, u = u ? p.isBlock : !1;
452
+ }), i === c && u) {
453
+ const { parent: p } = o.doc.resolve(i);
454
+ p.isTextblock && !p.type.spec.code && !p.childCount && (i -= 1, c += 1);
455
+ }
456
+ let f;
457
+ d ? (Array.isArray(t) ? f = t.map((p) => p.text || "").join("") : typeof t == "object" && t && t.text ? f = t.text : f = t, o.insertText(f, i, c)) : (f = a, o.replaceWith(i, c, f)), n.updateSelection && Mt(o, o.steps.length - 1, -1), n.applyInputRules && o.setMeta("applyInputRules", { from: i, text: f }), n.applyPasteRules && o.setMeta("applyPasteRules", { from: i, text: f });
458
+ }
459
+ return !0;
460
+ }, Ct = () => ({ state: e, dispatch: t }) => $e(e, t), Et = () => ({ state: e, dispatch: t }) => Ie(e, t), Bt = () => ({ state: e, dispatch: t }) => Pe(e, t), vt = () => ({ state: e, dispatch: t }) => Ne(e, t), $t = () => ({ tr: e, state: t, dispatch: n }) => {
461
+ try {
462
+ const o = le(t.doc, t.selection.$from.pos, -1);
463
+ return o == null ? !1 : (e.join(o, 2), n && n(e), !0);
464
+ } catch {
465
+ return !1;
466
+ }
467
+ }, It = () => ({ state: e, dispatch: t, tr: n }) => {
468
+ try {
469
+ const o = le(e.doc, e.selection.$from.pos, 1);
470
+ return o == null ? !1 : (n.join(o, 2), t && t(n), !0);
471
+ } catch {
472
+ return !1;
473
+ }
474
+ }, Pt = () => ({ state: e, dispatch: t }) => Oe(e, t), Nt = () => ({ state: e, dispatch: t }) => je(e, t);
475
+ function ke() {
476
+ return typeof navigator < "u" ? /Mac/.test(navigator.platform) : !1;
477
+ }
478
+ function Ot(e) {
479
+ const t = e.split(/-(?!$)/);
480
+ let n = t[t.length - 1];
481
+ n === "Space" && (n = " ");
482
+ let o, r, s, a;
483
+ for (let i = 0; i < t.length - 1; i += 1) {
484
+ const c = t[i];
485
+ if (/^(cmd|meta|m)$/i.test(c))
486
+ a = !0;
487
+ else if (/^a(lt)?$/i.test(c))
488
+ o = !0;
489
+ else if (/^(c|ctrl|control)$/i.test(c))
490
+ r = !0;
491
+ else if (/^s(hift)?$/i.test(c))
492
+ s = !0;
493
+ else if (/^mod$/i.test(c))
494
+ X() || ke() ? a = !0 : r = !0;
495
+ else
496
+ throw new Error(`Unrecognized modifier name: ${c}`);
497
+ }
498
+ return o && (n = `Alt-${n}`), r && (n = `Ctrl-${n}`), a && (n = `Meta-${n}`), s && (n = `Shift-${n}`), n;
499
+ }
500
+ const jt = (e) => ({ editor: t, view: n, tr: o, dispatch: r }) => {
501
+ const s = Ot(e).split(/-(?!$)/), a = s.find((d) => !["Alt", "Ctrl", "Meta", "Shift"].includes(d)), i = new KeyboardEvent("keydown", {
502
+ key: a === "Space" ? " " : a,
503
+ altKey: s.includes("Alt"),
504
+ ctrlKey: s.includes("Ctrl"),
505
+ metaKey: s.includes("Meta"),
506
+ shiftKey: s.includes("Shift"),
507
+ bubbles: !0,
508
+ cancelable: !0
509
+ }), c = t.captureTransaction(() => {
510
+ n.someProp("handleKeyDown", (d) => d(n, i));
511
+ });
512
+ return c == null || c.steps.forEach((d) => {
513
+ const u = d.map(o.mapping);
514
+ u && r && o.maybeStep(u);
515
+ }), !0;
516
+ };
517
+ function Y(e, t, n = {}) {
518
+ const { from: o, to: r, empty: s } = e.selection, a = t ? y(t, e.schema) : null, i = [];
519
+ e.doc.nodesBetween(o, r, (l, f) => {
520
+ if (l.isText)
521
+ return;
522
+ const p = Math.max(o, f), m = Math.min(r, f + l.nodeSize);
523
+ i.push({
524
+ node: l,
525
+ from: p,
526
+ to: m
527
+ });
528
+ });
529
+ const c = r - o, d = i.filter((l) => a ? a.name === l.node.type.name : !0).filter((l) => z(l.node.attrs, n, { strict: !1 }));
530
+ return s ? !!d.length : d.reduce((l, f) => l + f.to - f.from, 0) >= c;
531
+ }
532
+ const Ft = (e, t = {}) => ({ state: n, dispatch: o }) => {
533
+ const r = y(e, n.schema);
534
+ return Y(n, r, t) ? Fe(n, o) : !1;
535
+ }, Lt = () => ({ state: e, dispatch: t }) => Le(e, t), Rt = (e) => ({ state: t, dispatch: n }) => {
536
+ const o = y(e, t.schema);
537
+ return _e(o)(t, n);
538
+ }, Dt = () => ({ state: e, dispatch: t }) => Re(e, t);
539
+ function ye(e, t) {
540
+ return t.nodes[e] ? "node" : t.marks[e] ? "mark" : null;
541
+ }
542
+ function oe(e, t) {
543
+ const n = typeof t == "string" ? [t] : t;
544
+ return Object.keys(e).reduce((o, r) => (n.includes(r) || (o[r] = e[r]), o), {});
545
+ }
546
+ const zt = (e, t) => ({ tr: n, state: o, dispatch: r }) => {
547
+ let s = null, a = null;
548
+ const i = ye(typeof e == "string" ? e : e.name, o.schema);
549
+ return i ? (i === "node" && (s = y(e, o.schema)), i === "mark" && (a = $(e, o.schema)), r && n.selection.ranges.forEach((c) => {
550
+ o.doc.nodesBetween(c.$from.pos, c.$to.pos, (d, u) => {
551
+ s && s === d.type && n.setNodeMarkup(u, void 0, oe(d.attrs, t)), a && d.marks.length && d.marks.forEach((l) => {
552
+ a === l.type && n.addMark(u, u + d.nodeSize, a.create(oe(l.attrs, t)));
553
+ });
554
+ });
555
+ }), !0) : !1;
556
+ }, Wt = () => ({ tr: e, dispatch: t }) => (t && e.scrollIntoView(), !0), Ht = () => ({ tr: e, commands: t }) => t.setTextSelection({
557
+ from: 0,
558
+ to: e.doc.content.size
559
+ }), Kt = () => ({ state: e, dispatch: t }) => De(e, t), Vt = () => ({ state: e, dispatch: t }) => ze(e, t), _t = () => ({ state: e, dispatch: t }) => We(e, t), Jt = () => ({ state: e, dispatch: t }) => He(e, t), Ut = () => ({ state: e, dispatch: t }) => Ke(e, t);
560
+ function Gt(e, t, n = {}) {
561
+ return W(e, t, { slice: !1, parseOptions: n });
562
+ }
563
+ const qt = (e, t = !1, n = {}) => ({ tr: o, editor: r, dispatch: s }) => {
564
+ const { doc: a } = o, i = Gt(e, r.schema, n);
565
+ return s && o.replaceWith(0, a.content.size, i).setMeta("preventUpdate", !t), !0;
566
+ };
567
+ function Qt(e, t) {
568
+ const n = $(t, e.schema), { from: o, to: r, empty: s } = e.selection, a = [];
569
+ s ? (e.storedMarks && a.push(...e.storedMarks), a.push(...e.selection.$head.marks())) : e.doc.nodesBetween(o, r, (c) => {
570
+ a.push(...c.marks);
571
+ });
572
+ const i = a.find((c) => c.type.name === n.name);
573
+ return i ? { ...i.attrs } : {};
574
+ }
575
+ function Xt(e) {
576
+ for (let t = 0; t < e.edgeCount; t += 1) {
577
+ const { type: n } = e.edge(t);
578
+ if (n.isTextblock && !n.hasRequiredAttrs())
579
+ return n;
580
+ }
581
+ return null;
582
+ }
583
+ function F(e, t) {
584
+ const n = [];
585
+ return e.descendants((o, r) => {
586
+ t(o) && n.push({
587
+ node: o,
588
+ pos: r
589
+ });
590
+ }), n;
591
+ }
592
+ function Yt(e, t) {
593
+ for (let n = e.depth; n > 0; n -= 1) {
594
+ const o = e.node(n);
595
+ if (t(o))
596
+ return {
597
+ pos: n > 0 ? e.before(n) : 0,
598
+ start: e.start(n),
599
+ depth: n,
600
+ node: o
601
+ };
602
+ }
603
+ }
604
+ function Z(e) {
605
+ return (t) => Yt(t.$from, e);
606
+ }
607
+ function D(e, t, n) {
608
+ return Object.fromEntries(Object.entries(n).filter(([o]) => {
609
+ const r = e.find((s) => s.type === t && s.name === o);
610
+ return r ? r.attribute.keepOnSplit : !1;
611
+ }));
612
+ }
613
+ function Zt(e, t, n = {}) {
614
+ const { empty: o, ranges: r } = e.selection, s = t ? $(t, e.schema) : null;
615
+ if (o)
616
+ return !!(e.storedMarks || e.selection.$from.marks()).filter((l) => s ? s.name === l.type.name : !0).find((l) => z(l.attrs, n, { strict: !1 }));
617
+ let a = 0;
618
+ const i = [];
619
+ if (r.forEach(({ $from: l, $to: f }) => {
620
+ const p = l.pos, m = f.pos;
621
+ e.doc.nodesBetween(p, m, (h, g) => {
622
+ if (!h.isText && !h.marks.length)
623
+ return;
624
+ const k = Math.max(p, g), E = Math.min(m, g + h.nodeSize), M = E - k;
625
+ a += M, i.push(...h.marks.map((B) => ({
626
+ mark: B,
627
+ from: k,
628
+ to: E
629
+ })));
630
+ });
631
+ }), a === 0)
632
+ return !1;
633
+ const c = i.filter((l) => s ? s.name === l.mark.type.name : !0).filter((l) => z(l.mark.attrs, n, { strict: !1 })).reduce((l, f) => l + f.to - f.from, 0), d = i.filter((l) => s ? l.mark.type !== s && l.mark.type.excludes(s) : !0).reduce((l, f) => l + f.to - f.from, 0);
634
+ return (c > 0 ? c + d : c) >= a;
635
+ }
636
+ function re(e, t) {
637
+ const { nodeExtensions: n } = Qe(t), o = n.find((a) => a.name === e);
638
+ if (!o)
639
+ return !1;
640
+ const r = {
641
+ name: o.name,
642
+ options: o.options,
643
+ storage: o.storage
644
+ }, s = x(w(o, "group", r));
645
+ return typeof s != "string" ? !1 : s.split(" ").includes("list");
646
+ }
647
+ function en(e, t, n) {
648
+ var o;
649
+ const { selection: r } = t;
650
+ let s = null;
651
+ if (he(r) && (s = r.$cursor), s) {
652
+ const i = (o = e.storedMarks) !== null && o !== void 0 ? o : s.marks();
653
+ return !!n.isInSet(i) || !i.some((c) => c.type.excludes(n));
654
+ }
655
+ const { ranges: a } = r;
656
+ return a.some(({ $from: i, $to: c }) => {
657
+ let d = i.depth === 0 ? e.doc.inlineContent && e.doc.type.allowsMarkType(n) : !1;
658
+ return e.doc.nodesBetween(i.pos, c.pos, (u, l, f) => {
659
+ if (d)
660
+ return !1;
661
+ if (u.isInline) {
662
+ const p = !f || f.type.allowsMarkType(n), m = !!n.isInSet(u.marks) || !u.marks.some((h) => h.type.excludes(n));
663
+ d = p && m;
664
+ }
665
+ return !d;
666
+ }), d;
667
+ });
668
+ }
669
+ const tn = (e, t = {}) => ({ tr: n, state: o, dispatch: r }) => {
670
+ const { selection: s } = n, { empty: a, ranges: i } = s, c = $(e, o.schema);
671
+ if (r)
672
+ if (a) {
673
+ const d = Qt(o, c);
674
+ n.addStoredMark(c.create({
675
+ ...d,
676
+ ...t
677
+ }));
678
+ } else
679
+ i.forEach((d) => {
680
+ const u = d.$from.pos, l = d.$to.pos;
681
+ o.doc.nodesBetween(u, l, (f, p) => {
682
+ const m = Math.max(p, u), h = Math.min(p + f.nodeSize, l);
683
+ f.marks.find((k) => k.type === c) ? f.marks.forEach((k) => {
684
+ c === k.type && n.addMark(m, h, c.create({
685
+ ...k.attrs,
686
+ ...t
687
+ }));
688
+ }) : n.addMark(m, h, c.create(t));
689
+ });
690
+ });
691
+ return en(o, n, c);
692
+ }, nn = (e, t) => ({ tr: n }) => (n.setMeta(e, t), !0), on = (e, t = {}) => ({ state: n, dispatch: o, chain: r }) => {
693
+ const s = y(e, n.schema);
694
+ return s.isTextblock ? r().command(({ commands: a }) => te(s, t)(n) ? !0 : a.clearNodes()).command(({ state: a }) => te(s, t)(a, o)).run() : (console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'), !1);
695
+ }, rn = (e) => ({ tr: t, dispatch: n }) => {
696
+ if (n) {
697
+ const { doc: o } = t, r = I(e, 0, o.content.size), s = ce.create(o, r);
698
+ t.setSelection(s);
699
+ }
700
+ return !0;
701
+ }, sn = (e) => ({ tr: t, dispatch: n }) => {
702
+ if (n) {
703
+ const { doc: o } = t, { from: r, to: s } = typeof e == "number" ? { from: e, to: e } : e, a = b.atStart(o).from, i = b.atEnd(o).to, c = I(r, a, i), d = I(s, a, i), u = b.create(o, c, d);
704
+ t.setSelection(u);
705
+ }
706
+ return !0;
707
+ }, an = (e) => ({ state: t, dispatch: n }) => {
708
+ const o = y(e, t.schema);
709
+ return Je(o)(t, n);
710
+ };
711
+ function se(e, t) {
712
+ const n = e.storedMarks || e.selection.$to.parentOffset && e.selection.$from.marks();
713
+ if (n) {
714
+ const o = n.filter((r) => t == null ? void 0 : t.includes(r.type.name));
715
+ e.tr.ensureMarks(o);
716
+ }
717
+ }
718
+ const cn = ({ keepMarks: e = !0 } = {}) => ({ tr: t, state: n, dispatch: o, editor: r }) => {
719
+ const { selection: s, doc: a } = t, { $from: i, $to: c } = s, d = r.extensionManager.attributes, u = D(d, i.node().type.name, i.node().attrs);
720
+ if (s instanceof ce && s.node.isBlock)
721
+ return !i.parentOffset || !R(a, i.pos) ? !1 : (o && (e && se(n, r.extensionManager.splittableMarks), t.split(i.pos).scrollIntoView()), !0);
722
+ if (!i.parent.isBlock)
723
+ return !1;
724
+ if (o) {
725
+ const l = c.parentOffset === c.parent.content.size;
726
+ s instanceof b && t.deleteSelection();
727
+ const f = i.depth === 0 ? void 0 : Xt(i.node(-1).contentMatchAt(i.indexAfter(-1)));
728
+ let p = l && f ? [
729
+ {
730
+ type: f,
731
+ attrs: u
732
+ }
733
+ ] : void 0, m = R(t.doc, t.mapping.map(i.pos), 1, p);
734
+ if (!p && !m && R(t.doc, t.mapping.map(i.pos), 1, f ? [{ type: f }] : void 0) && (m = !0, p = f ? [
735
+ {
736
+ type: f,
737
+ attrs: u
738
+ }
739
+ ] : void 0), m && (t.split(t.mapping.map(i.pos), 1, p), f && !l && !i.parentOffset && i.parent.type !== f)) {
740
+ const h = t.mapping.map(i.before()), g = t.doc.resolve(h);
741
+ i.node(-1).canReplaceWith(g.index(), g.index() + 1, f) && t.setNodeMarkup(t.mapping.map(i.before()), f);
742
+ }
743
+ e && se(n, r.extensionManager.splittableMarks), t.scrollIntoView();
744
+ }
745
+ return !0;
746
+ }, ln = (e) => ({ tr: t, state: n, dispatch: o, editor: r }) => {
747
+ var s;
748
+ const a = y(e, n.schema), { $from: i, $to: c } = n.selection, d = n.selection.node;
749
+ if (d && d.isBlock || i.depth < 2 || !i.sameParent(c))
750
+ return !1;
751
+ const u = i.node(-1);
752
+ if (u.type !== a)
753
+ return !1;
754
+ const l = r.extensionManager.attributes;
755
+ if (i.parent.content.size === 0 && i.node(-1).childCount === i.indexAfter(-1)) {
756
+ if (i.depth === 2 || i.node(-3).type !== a || i.index(-2) !== i.node(-2).childCount - 1)
757
+ return !1;
758
+ if (o) {
759
+ let g = L.empty;
760
+ const k = i.index(-1) ? 1 : i.index(-2) ? 2 : 3;
761
+ for (let v = i.depth - k; v >= i.depth - 3; v -= 1)
762
+ g = L.from(i.node(v).copy(g));
763
+ const E = i.indexAfter(-1) < i.node(-2).childCount ? 1 : i.indexAfter(-2) < i.node(-3).childCount ? 2 : 3, M = D(l, i.node().type.name, i.node().attrs), B = ((s = a.contentMatch.defaultType) === null || s === void 0 ? void 0 : s.createAndFill(M)) || void 0;
764
+ g = g.append(L.from(a.createAndFill(null, B) || void 0));
765
+ const S = i.before(i.depth - (k - 1));
766
+ t.replace(S, i.after(-E), new be(g, 4 - k, 0));
767
+ let T = -1;
768
+ t.doc.nodesBetween(S, t.doc.content.size, (v, K) => {
769
+ if (T > -1)
770
+ return !1;
771
+ v.isTextblock && v.content.size === 0 && (T = K + 1);
772
+ }), T > -1 && t.setSelection(b.near(t.doc.resolve(T))), t.scrollIntoView();
773
+ }
774
+ return !0;
775
+ }
776
+ const f = c.pos === i.end() ? u.contentMatchAt(0).defaultType : null, p = D(l, u.type.name, u.attrs), m = D(l, i.node().type.name, i.node().attrs);
777
+ t.delete(i.pos, c.pos);
778
+ const h = f ? [
779
+ { type: a, attrs: p },
780
+ { type: f, attrs: m }
781
+ ] : [{ type: a, attrs: p }];
782
+ if (!R(t.doc, i.pos, 2))
783
+ return !1;
784
+ if (o) {
785
+ const { selection: g, storedMarks: k } = n, { splittableMarks: E } = r.extensionManager, M = k || g.$to.parentOffset && g.$from.marks();
786
+ if (t.split(i.pos, 2, h).scrollIntoView(), !M || !o)
787
+ return !0;
788
+ const B = M.filter((S) => E.includes(S.type.name));
789
+ t.ensureMarks(B);
790
+ }
791
+ return !0;
792
+ }, _ = (e, t) => {
793
+ const n = Z((a) => a.type === t)(e.selection);
794
+ if (!n)
795
+ return !0;
796
+ const o = e.doc.resolve(Math.max(0, n.pos - 1)).before(n.depth);
797
+ if (o === void 0)
798
+ return !0;
799
+ const r = e.doc.nodeAt(o);
800
+ return n.node.type === (r == null ? void 0 : r.type) && de(e.doc, n.pos) && e.join(n.pos), !0;
801
+ }, J = (e, t) => {
802
+ const n = Z((a) => a.type === t)(e.selection);
803
+ if (!n)
804
+ return !0;
805
+ const o = e.doc.resolve(n.start).after(n.depth);
806
+ if (o === void 0)
807
+ return !0;
808
+ const r = e.doc.nodeAt(o);
809
+ return n.node.type === (r == null ? void 0 : r.type) && de(e.doc, o) && e.join(o), !0;
810
+ }, dn = (e, t, n, o = {}) => ({ editor: r, tr: s, state: a, dispatch: i, chain: c, commands: d, can: u }) => {
811
+ const { extensions: l, splittableMarks: f } = r.extensionManager, p = y(e, a.schema), m = y(t, a.schema), { selection: h, storedMarks: g } = a, { $from: k, $to: E } = h, M = k.blockRange(E), B = g || h.$to.parentOffset && h.$from.marks();
812
+ if (!M)
813
+ return !1;
814
+ const S = Z((T) => re(T.type.name, l))(h);
815
+ if (M.depth >= 1 && S && M.depth - S.depth <= 1) {
816
+ if (S.node.type === p)
817
+ return d.liftListItem(m);
818
+ if (re(S.node.type.name, l) && p.validContent(S.node.content) && i)
819
+ return c().command(() => (s.setNodeMarkup(S.pos, p), !0)).command(() => _(s, p)).command(() => J(s, p)).run();
820
+ }
821
+ return !n || !B || !i ? c().command(() => u().wrapInList(p, o) ? !0 : d.clearNodes()).wrapInList(p, o).command(() => _(s, p)).command(() => J(s, p)).run() : c().command(() => {
822
+ const T = u().wrapInList(p, o), v = B.filter((K) => f.includes(K.type.name));
823
+ return s.ensureMarks(v), T ? !0 : d.clearNodes();
824
+ }).wrapInList(p, o).command(() => _(s, p)).command(() => J(s, p)).run();
825
+ }, un = (e, t = {}, n = {}) => ({ state: o, commands: r }) => {
826
+ const { extendEmptyMarkRange: s = !1 } = n, a = $(e, o.schema);
827
+ return Zt(o, a, t) ? r.unsetMark(a, { extendEmptyMarkRange: s }) : r.setMark(a, t);
828
+ }, fn = (e, t, n = {}) => ({ state: o, commands: r }) => {
829
+ const s = y(e, o.schema), a = y(t, o.schema);
830
+ return Y(o, s, n) ? r.setNode(a) : r.setNode(s, n);
831
+ }, pn = (e, t = {}) => ({ state: n, commands: o }) => {
832
+ const r = y(e, n.schema);
833
+ return Y(n, r, t) ? o.lift(r) : o.wrapIn(r, t);
834
+ }, mn = () => ({ state: e, dispatch: t }) => {
835
+ const n = e.plugins;
836
+ for (let o = 0; o < n.length; o += 1) {
837
+ const r = n[o];
838
+ let s;
839
+ if (r.spec.isInputRules && (s = r.getState(e))) {
840
+ if (t) {
841
+ const a = e.tr, i = s.transform;
842
+ for (let c = i.steps.length - 1; c >= 0; c -= 1)
843
+ a.step(i.steps[c].invert(i.docs[c]));
844
+ if (s.text) {
845
+ const c = a.doc.resolve(s.from).marks();
846
+ a.replaceWith(s.from, s.to, e.schema.text(s.text, c));
847
+ } else
848
+ a.delete(s.from, s.to);
849
+ }
850
+ return !0;
851
+ }
852
+ }
853
+ return !1;
854
+ }, hn = () => ({ tr: e, dispatch: t }) => {
855
+ const { selection: n } = e, { empty: o, ranges: r } = n;
856
+ return o || t && r.forEach((s) => {
857
+ e.removeMark(s.$from.pos, s.$to.pos);
858
+ }), !0;
859
+ }, gn = (e, t = {}) => ({ tr: n, state: o, dispatch: r }) => {
860
+ var s;
861
+ const { extendEmptyMarkRange: a = !1 } = t, { selection: i } = n, c = $(e, o.schema), { $from: d, empty: u, ranges: l } = i;
862
+ if (!r)
863
+ return !0;
864
+ if (u && a) {
865
+ let { from: f, to: p } = i;
866
+ const m = (s = d.marks().find((g) => g.type === c)) === null || s === void 0 ? void 0 : s.attrs, h = me(d, c, m);
867
+ h && (f = h.from, p = h.to), n.removeMark(f, p, c);
868
+ } else
869
+ l.forEach((f) => {
870
+ n.removeMark(f.$from.pos, f.$to.pos, c);
871
+ });
872
+ return n.removeStoredMark(c), !0;
873
+ }, kn = (e, t = {}) => ({ tr: n, state: o, dispatch: r }) => {
874
+ let s = null, a = null;
875
+ const i = ye(typeof e == "string" ? e : e.name, o.schema);
876
+ return i ? (i === "node" && (s = y(e, o.schema)), i === "mark" && (a = $(e, o.schema)), r && n.selection.ranges.forEach((c) => {
877
+ const d = c.$from.pos, u = c.$to.pos;
878
+ o.doc.nodesBetween(d, u, (l, f) => {
879
+ s && s === l.type && n.setNodeMarkup(f, void 0, {
880
+ ...l.attrs,
881
+ ...t
882
+ }), a && l.marks.length && l.marks.forEach((p) => {
883
+ if (a === p.type) {
884
+ const m = Math.max(f, d), h = Math.min(f + l.nodeSize, u);
885
+ n.addMark(m, h, a.create({
886
+ ...p.attrs,
887
+ ...t
888
+ }));
889
+ }
890
+ });
891
+ });
892
+ }), !0) : !1;
893
+ }, yn = (e, t = {}) => ({ state: n, dispatch: o }) => {
894
+ const r = y(e, n.schema);
895
+ return Ve(r, t)(n, o);
896
+ }, wn = (e, t = {}) => ({ state: n, dispatch: o }) => {
897
+ const r = y(e, n.schema);
898
+ return Ue(r, t)(n, o);
899
+ };
900
+ var xn = /* @__PURE__ */ Object.freeze({
901
+ __proto__: null,
902
+ blur: rt,
903
+ clearContent: st,
904
+ clearNodes: it,
905
+ command: at,
906
+ createParagraphNear: ct,
907
+ cut: lt,
908
+ deleteCurrentNode: dt,
909
+ deleteNode: ut,
910
+ deleteRange: ft,
911
+ deleteSelection: pt,
912
+ enter: mt,
913
+ exitCode: ht,
914
+ extendMarkRange: kt,
915
+ first: yt,
916
+ focus: xt,
917
+ forEach: St,
918
+ insertContent: bt,
919
+ insertContentAt: Tt,
920
+ joinUp: Ct,
921
+ joinDown: Et,
922
+ joinBackward: Bt,
923
+ joinForward: vt,
924
+ joinItemBackward: $t,
925
+ joinItemForward: It,
926
+ joinTextblockBackward: Pt,
927
+ joinTextblockForward: Nt,
928
+ keyboardShortcut: jt,
929
+ lift: Ft,
930
+ liftEmptyBlock: Lt,
931
+ liftListItem: Rt,
932
+ newlineInCode: Dt,
933
+ resetAttributes: zt,
934
+ scrollIntoView: Wt,
935
+ selectAll: Ht,
936
+ selectNodeBackward: Kt,
937
+ selectNodeForward: Vt,
938
+ selectParentNode: _t,
939
+ selectTextblockEnd: Jt,
940
+ selectTextblockStart: Ut,
941
+ setContent: qt,
942
+ setMark: tn,
943
+ setMeta: nn,
944
+ setNode: on,
945
+ setNodeSelection: rn,
946
+ setTextSelection: sn,
947
+ sinkListItem: an,
948
+ splitBlock: cn,
949
+ splitListItem: ln,
950
+ toggleList: dn,
951
+ toggleMark: un,
952
+ toggleNode: fn,
953
+ toggleWrap: pn,
954
+ undoInputRule: mn,
955
+ unsetAllMarks: hn,
956
+ unsetMark: gn,
957
+ updateAttributes: kn,
958
+ wrapIn: yn,
959
+ wrapInList: wn
960
+ });
961
+ C.create({
962
+ name: "commands",
963
+ addCommands() {
964
+ return {
965
+ ...xn
966
+ };
967
+ }
968
+ });
969
+ C.create({
970
+ name: "editable",
971
+ addProseMirrorPlugins() {
972
+ return [
973
+ new P({
974
+ key: new N("editable"),
975
+ props: {
976
+ editable: () => this.editor.options.editable
977
+ }
978
+ })
979
+ ];
980
+ }
981
+ });
982
+ C.create({
983
+ name: "focusEvents",
984
+ addProseMirrorPlugins() {
985
+ const { editor: e } = this;
986
+ return [
987
+ new P({
988
+ key: new N("focusEvents"),
989
+ props: {
990
+ handleDOMEvents: {
991
+ focus: (t, n) => {
992
+ e.isFocused = !0;
993
+ const o = e.state.tr.setMeta("focus", { event: n }).setMeta("addToHistory", !1);
994
+ return t.dispatch(o), !1;
995
+ },
996
+ blur: (t, n) => {
997
+ e.isFocused = !1;
998
+ const o = e.state.tr.setMeta("blur", { event: n }).setMeta("addToHistory", !1);
999
+ return t.dispatch(o), !1;
1000
+ }
1001
+ }
1002
+ }
1003
+ })
1004
+ ];
1005
+ }
1006
+ });
1007
+ C.create({
1008
+ name: "keymap",
1009
+ addKeyboardShortcuts() {
1010
+ const e = () => this.editor.commands.first(({ commands: a }) => [
1011
+ () => a.undoInputRule(),
1012
+ // maybe convert first text block node to default node
1013
+ () => a.command(({ tr: i }) => {
1014
+ const { selection: c, doc: d } = i, { empty: u, $anchor: l } = c, { pos: f, parent: p } = l, m = l.parent.isTextblock && f > 0 ? i.doc.resolve(f - 1) : l, h = m.parent.type.spec.isolating, g = l.pos - l.parentOffset, k = h && m.parent.childCount === 1 ? g === l.pos : O.atStart(d).from === f;
1015
+ return !u || !k || !p.type.isTextblock || p.textContent.length ? !1 : a.clearNodes();
1016
+ }),
1017
+ () => a.deleteSelection(),
1018
+ () => a.joinBackward(),
1019
+ () => a.selectNodeBackward()
1020
+ ]), t = () => this.editor.commands.first(({ commands: a }) => [
1021
+ () => a.deleteSelection(),
1022
+ () => a.deleteCurrentNode(),
1023
+ () => a.joinForward(),
1024
+ () => a.selectNodeForward()
1025
+ ]), o = {
1026
+ Enter: () => this.editor.commands.first(({ commands: a }) => [
1027
+ () => a.newlineInCode(),
1028
+ () => a.createParagraphNear(),
1029
+ () => a.liftEmptyBlock(),
1030
+ () => a.splitBlock()
1031
+ ]),
1032
+ "Mod-Enter": () => this.editor.commands.exitCode(),
1033
+ Backspace: e,
1034
+ "Mod-Backspace": e,
1035
+ "Shift-Backspace": e,
1036
+ Delete: t,
1037
+ "Mod-Delete": t,
1038
+ "Mod-a": () => this.editor.commands.selectAll()
1039
+ }, r = {
1040
+ ...o
1041
+ }, s = {
1042
+ ...o,
1043
+ "Ctrl-h": e,
1044
+ "Alt-Backspace": e,
1045
+ "Ctrl-d": t,
1046
+ "Ctrl-Alt-Backspace": t,
1047
+ "Alt-Delete": t,
1048
+ "Alt-d": t,
1049
+ "Ctrl-a": () => this.editor.commands.selectTextblockStart(),
1050
+ "Ctrl-e": () => this.editor.commands.selectTextblockEnd()
1051
+ };
1052
+ return X() || ke() ? s : r;
1053
+ },
1054
+ addProseMirrorPlugins() {
1055
+ return [
1056
+ // With this plugin we check if the whole document was selected and deleted.
1057
+ // In this case we will additionally call `clearNodes()` to convert e.g. a heading
1058
+ // to a paragraph if necessary.
1059
+ // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well
1060
+ // with many other commands.
1061
+ new P({
1062
+ key: new N("clearDocument"),
1063
+ appendTransaction: (e, t, n) => {
1064
+ if (!(e.some((m) => m.docChanged) && !t.doc.eq(n.doc)))
1065
+ return;
1066
+ const { empty: r, from: s, to: a } = t.selection, i = O.atStart(t.doc).from, c = O.atEnd(t.doc).to;
1067
+ if (r || !(s === i && a === c) || !(n.doc.textBetween(0, n.doc.content.size, " ", " ").length === 0))
1068
+ return;
1069
+ const l = n.tr, f = pe({
1070
+ state: n,
1071
+ transaction: l
1072
+ }), { commands: p } = new qe({
1073
+ editor: this.editor,
1074
+ state: f
1075
+ });
1076
+ if (p.clearNodes(), !!l.steps.length)
1077
+ return l;
1078
+ }
1079
+ })
1080
+ ];
1081
+ }
1082
+ });
1083
+ C.create({
1084
+ name: "tabindex",
1085
+ addProseMirrorPlugins() {
1086
+ return [
1087
+ new P({
1088
+ key: new N("tabindex"),
1089
+ props: {
1090
+ attributes: this.editor.isEditable ? { tabindex: "0" } : {}
1091
+ }
1092
+ })
1093
+ ];
1094
+ }
1095
+ });
1096
+ function ie(e) {
1097
+ return new et({
1098
+ find: e.find,
1099
+ handler: ({ state: t, range: n, match: o }) => {
1100
+ const r = t.doc.resolve(n.from), s = x(e.getAttributes, void 0, o) || {};
1101
+ if (!r.node(-1).canReplaceWith(r.index(-1), r.indexAfter(-1), e.type))
1102
+ return null;
1103
+ t.tr.delete(n.from, n.to).setBlockType(n.from, n.from, e.type, s);
1104
+ }
1105
+ });
1106
+ }
1107
+ class H {
1108
+ constructor(t = {}) {
1109
+ this.type = "node", this.name = "node", this.parent = null, this.child = null, this.config = {
1110
+ name: this.name,
1111
+ defaultOptions: {}
1112
+ }, this.config = {
1113
+ ...this.config,
1114
+ ...t
1115
+ }, this.name = this.config.name, t.defaultOptions && Object.keys(t.defaultOptions).length > 0 && console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`), this.options = this.config.defaultOptions, this.config.addOptions && (this.options = x(w(this, "addOptions", {
1116
+ name: this.name
1117
+ }))), this.storage = x(w(this, "addStorage", {
1118
+ name: this.name,
1119
+ options: this.options
1120
+ })) || {};
1121
+ }
1122
+ static create(t = {}) {
1123
+ return new H(t);
1124
+ }
1125
+ configure(t = {}) {
1126
+ const n = this.extend();
1127
+ return n.options = Q(this.options, t), n.storage = x(w(n, "addStorage", {
1128
+ name: n.name,
1129
+ options: n.options
1130
+ })), n;
1131
+ }
1132
+ extend(t = {}) {
1133
+ const n = new H({ ...this.config, ...t });
1134
+ return n.parent = this, this.child = n, n.name = t.name ? t.name : n.parent.name, t.defaultOptions && console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`), n.options = x(w(n, "addOptions", {
1135
+ name: n.name
1136
+ })), n.storage = x(w(n, "addStorage", {
1137
+ name: n.name,
1138
+ options: n.options
1139
+ })), n;
1140
+ }
1141
+ }
1142
+ const Sn = /^```([a-z]+)?[\s\n]$/, bn = /^~~~([a-z]+)?[\s\n]$/, Mn = H.create({
1143
+ name: "codeBlock",
1144
+ addOptions() {
1145
+ return {
1146
+ languageClassPrefix: "language-",
1147
+ exitOnTripleEnter: !0,
1148
+ exitOnArrowDown: !0,
1149
+ HTMLAttributes: {}
1150
+ };
1151
+ },
1152
+ content: "text*",
1153
+ marks: "",
1154
+ group: "block",
1155
+ code: !0,
1156
+ defining: !0,
1157
+ addAttributes() {
1158
+ return {
1159
+ language: {
1160
+ default: null,
1161
+ parseHTML: (e) => {
1162
+ var t;
1163
+ const { languageClassPrefix: n } = this.options, s = [...((t = e.firstElementChild) === null || t === void 0 ? void 0 : t.classList) || []].filter((a) => a.startsWith(n)).map((a) => a.replace(n, ""))[0];
1164
+ return s || null;
1165
+ },
1166
+ rendered: !1
1167
+ }
1168
+ };
1169
+ },
1170
+ parseHTML() {
1171
+ return [
1172
+ {
1173
+ tag: "pre",
1174
+ preserveWhitespace: "full"
1175
+ }
1176
+ ];
1177
+ },
1178
+ renderHTML({ node: e, HTMLAttributes: t }) {
1179
+ return [
1180
+ "pre",
1181
+ Xe(this.options.HTMLAttributes, t),
1182
+ [
1183
+ "code",
1184
+ {
1185
+ class: e.attrs.language ? this.options.languageClassPrefix + e.attrs.language : null
1186
+ },
1187
+ 0
1188
+ ]
1189
+ ];
1190
+ },
1191
+ addCommands() {
1192
+ return {
1193
+ setCodeBlock: (e) => ({ commands: t }) => t.setNode(this.name, e),
1194
+ toggleCodeBlock: (e) => ({ commands: t }) => t.toggleNode(this.name, "paragraph", e)
1195
+ };
1196
+ },
1197
+ addKeyboardShortcuts() {
1198
+ return {
1199
+ "Mod-Alt-c": () => this.editor.commands.toggleCodeBlock(),
1200
+ // remove code block when at start of document or code block is empty
1201
+ Backspace: () => {
1202
+ const { empty: e, $anchor: t } = this.editor.state.selection, n = t.pos === 1;
1203
+ return !e || t.parent.type.name !== this.name ? !1 : n || !t.parent.textContent.length ? this.editor.commands.clearNodes() : !1;
1204
+ },
1205
+ // exit node on triple enter
1206
+ Enter: ({ editor: e }) => {
1207
+ if (!this.options.exitOnTripleEnter)
1208
+ return !1;
1209
+ const { state: t } = e, { selection: n } = t, { $from: o, empty: r } = n;
1210
+ if (!r || o.parent.type !== this.type)
1211
+ return !1;
1212
+ const s = o.parentOffset === o.parent.nodeSize - 2, a = o.parent.textContent.endsWith(`
1213
+
1214
+ `);
1215
+ return !s || !a ? !1 : e.chain().command(({ tr: i }) => (i.delete(o.pos - 2, o.pos), !0)).exitCode().run();
1216
+ },
1217
+ // exit node on arrow down
1218
+ ArrowDown: ({ editor: e }) => {
1219
+ if (!this.options.exitOnArrowDown)
1220
+ return !1;
1221
+ const { state: t } = e, { selection: n, doc: o } = t, { $from: r, empty: s } = n;
1222
+ if (!s || r.parent.type !== this.type || !(r.parentOffset === r.parent.nodeSize - 2))
1223
+ return !1;
1224
+ const i = r.after();
1225
+ return i === void 0 || o.nodeAt(i) ? !1 : e.commands.exitCode();
1226
+ }
1227
+ };
1228
+ },
1229
+ addInputRules() {
1230
+ return [
1231
+ ie({
1232
+ find: Sn,
1233
+ type: this.type,
1234
+ getAttributes: (e) => ({
1235
+ language: e[1]
1236
+ })
1237
+ }),
1238
+ ie({
1239
+ find: bn,
1240
+ type: this.type,
1241
+ getAttributes: (e) => ({
1242
+ language: e[1]
1243
+ })
1244
+ })
1245
+ ];
1246
+ },
1247
+ addProseMirrorPlugins() {
1248
+ return [
1249
+ // this plugin creates a code block for pasted content from VS Code
1250
+ // we can also detect the copied code language
1251
+ new P({
1252
+ key: new N("codeBlockVSCodeHandler"),
1253
+ props: {
1254
+ handlePaste: (e, t) => {
1255
+ if (!t.clipboardData || this.editor.isActive(this.type.name))
1256
+ return !1;
1257
+ const n = t.clipboardData.getData("text/plain"), o = t.clipboardData.getData("vscode-editor-data"), r = o ? JSON.parse(o) : void 0, s = r == null ? void 0 : r.mode;
1258
+ if (!n || !s)
1259
+ return !1;
1260
+ const { tr: a } = e.state;
1261
+ return a.replaceSelectionWith(this.type.create({ language: s })), a.setSelection(b.near(a.doc.resolve(Math.max(0, a.selection.from - 2)))), a.insertText(n.replace(/\r\n?/g, `
1262
+ `)), a.setMeta("paste", !0), e.dispatch(a), !0;
1263
+ }
1264
+ }
1265
+ })
1266
+ ];
1267
+ }
1268
+ });
1269
+ let A, j;
1270
+ const U = /* @__PURE__ */ new Set(), G = /* @__PURE__ */ new Set();
1271
+ function An() {
1272
+ return A;
1273
+ }
1274
+ function Tn(e) {
1275
+ if (!A && !j) {
1276
+ const t = e.themes.filter(
1277
+ (o) => !!o && o in ue
1278
+ ), n = e.languages.filter(
1279
+ (o) => !!o && o in fe
1280
+ );
1281
+ return j = Ge({ themes: t, langs: n }).then((o) => {
1282
+ A = o;
1283
+ }), j;
1284
+ }
1285
+ if (j)
1286
+ return j;
1287
+ }
1288
+ async function we(e) {
1289
+ return A && !A.getLoadedThemes().includes(e) && !G.has(e) && e in ue ? (G.add(e), await A.loadTheme(e), G.delete(e), !0) : !1;
1290
+ }
1291
+ async function xe(e) {
1292
+ return A && !A.getLoadedLanguages().includes(e) && !U.has(e) && e in fe ? (U.add(e), await A.loadLanguage(e), U.delete(e), !0) : !1;
1293
+ }
1294
+ async function Cn({
1295
+ doc: e,
1296
+ name: t,
1297
+ defaultTheme: n,
1298
+ defaultLanguage: o
1299
+ }) {
1300
+ const r = F(e, (i) => i.type.name === t), s = [
1301
+ ...r.map((i) => i.node.attrs.theme),
1302
+ n
1303
+ ], a = [
1304
+ ...r.map((i) => i.node.attrs.language),
1305
+ o
1306
+ ];
1307
+ A ? await Promise.all([
1308
+ ...s.flatMap((i) => we(i)),
1309
+ ...a.flatMap((i) => !!i && xe(i))
1310
+ ]) : await Tn({ languages: a, themes: s });
1311
+ }
1312
+ function ae({
1313
+ doc: e,
1314
+ name: t,
1315
+ defaultTheme: n,
1316
+ defaultLanguage: o
1317
+ }) {
1318
+ const r = [];
1319
+ return F(e, (a) => a.type.name === t).forEach((a) => {
1320
+ let i = a.pos + 1, c = a.node.attrs.language || o, d = a.node.attrs.theme || n;
1321
+ const u = An();
1322
+ if (!u)
1323
+ return;
1324
+ u.getLoadedLanguages().includes(c) || (c = "plaintext");
1325
+ const l = u.getLoadedThemes().includes(d) ? d : u.getLoadedThemes()[0], f = u.getTheme(l);
1326
+ r.push(
1327
+ ee.node(a.pos, a.pos + a.node.nodeSize, {
1328
+ style: `background-color: ${f.bg}`
1329
+ })
1330
+ );
1331
+ const p = u.codeToTokensBase(a.node.textContent, {
1332
+ lang: c,
1333
+ theme: l
1334
+ });
1335
+ for (const m of p) {
1336
+ for (const h of m) {
1337
+ const g = i + h.content.length, k = ee.inline(i, g, {
1338
+ style: `color: ${h.color}`
1339
+ });
1340
+ r.push(k), i = g;
1341
+ }
1342
+ i += 1;
1343
+ }
1344
+ }), Se.create(e, r);
1345
+ }
1346
+ function En({
1347
+ name: e,
1348
+ defaultLanguage: t,
1349
+ defaultTheme: n
1350
+ }) {
1351
+ const o = new P({
1352
+ key: new N("shiki"),
1353
+ view(r) {
1354
+ class s {
1355
+ constructor() {
1356
+ this.initDecorations();
1357
+ }
1358
+ update() {
1359
+ this.checkUndecoratedBlocks();
1360
+ }
1361
+ destroy() {
1362
+ }
1363
+ // Initialize shiki async, and then highlight initial document
1364
+ async initDecorations() {
1365
+ const i = r.state.doc;
1366
+ await Cn({ doc: i, name: e, defaultLanguage: t, defaultTheme: n });
1367
+ const c = r.state.tr.setMeta("shikiPluginForceDecoration", !0);
1368
+ r.dispatch(c);
1369
+ }
1370
+ // When new codeblocks were added and they have missing themes or
1371
+ // languages, load those and then add code decorations once again.
1372
+ async checkUndecoratedBlocks() {
1373
+ const i = F(
1374
+ r.state.doc,
1375
+ (u) => u.type.name === e
1376
+ );
1377
+ if ((await Promise.all(
1378
+ i.flatMap((u) => [
1379
+ we(u.node.attrs.theme),
1380
+ xe(u.node.attrs.language)
1381
+ ])
1382
+ )).includes(!0)) {
1383
+ const u = r.state.tr.setMeta("shikiPluginForceDecoration", !0);
1384
+ r.dispatch(u);
1385
+ }
1386
+ }
1387
+ }
1388
+ return new s();
1389
+ },
1390
+ state: {
1391
+ init: (r, { doc: s }) => ae({
1392
+ doc: s,
1393
+ name: e,
1394
+ defaultLanguage: t,
1395
+ defaultTheme: n
1396
+ }),
1397
+ apply: (r, s, a, i) => {
1398
+ const c = a.selection.$head.parent.type.name, d = i.selection.$head.parent.type.name, u = F(
1399
+ a.doc,
1400
+ (p) => p.type.name === e
1401
+ ), l = F(
1402
+ i.doc,
1403
+ (p) => p.type.name === e
1404
+ ), f = r.docChanged && // Apply decorations if:
1405
+ // selection includes named node,
1406
+ ([c, d].includes(e) || // OR transaction adds/removes named node,
1407
+ l.length !== u.length || // OR transaction has changes that completely encapsulte a node
1408
+ // (for example, a transaction that affects the entire document).
1409
+ // Such transactions can happen during collab syncing via y-prosemirror, for example.
1410
+ r.steps.some((p) => (
1411
+ // @ts-ignore
1412
+ p.from !== void 0 && // @ts-ignore
1413
+ p.to !== void 0 && u.some((m) => (
1414
+ // @ts-ignore
1415
+ m.pos >= p.from && // @ts-ignore
1416
+ m.pos + m.node.nodeSize <= p.to
1417
+ ))
1418
+ )));
1419
+ return r.getMeta("shikiPluginForceDecoration") || f ? ae({
1420
+ doc: r.doc,
1421
+ name: e,
1422
+ defaultLanguage: t,
1423
+ defaultTheme: n
1424
+ }) : s.map(r.mapping, r.doc);
1425
+ }
1426
+ },
1427
+ props: {
1428
+ decorations(r) {
1429
+ return o.getState(r);
1430
+ }
1431
+ }
1432
+ });
1433
+ return o;
1434
+ }
1435
+ const Fn = Mn.extend({
1436
+ addOptions() {
1437
+ var e;
1438
+ return {
1439
+ ...(e = this.parent) == null ? void 0 : e.call(this),
1440
+ defaultLanguage: null,
1441
+ defaultTheme: "github-dark"
1442
+ };
1443
+ },
1444
+ addProseMirrorPlugins() {
1445
+ var e;
1446
+ return [
1447
+ ...((e = this.parent) == null ? void 0 : e.call(this)) || [],
1448
+ En({
1449
+ name: this.name,
1450
+ defaultLanguage: this.options.defaultLanguage,
1451
+ defaultTheme: this.options.defaultTheme
1452
+ })
1453
+ ];
1454
+ }
1455
+ });
1456
+ export {
1457
+ Fn as CodeBlockShiki,
1458
+ Fn as default
1459
+ };