@pixerate/editor 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -636,8 +636,8 @@ var TemplateSuggestions = Extension2.create({
636
636
  });
637
637
 
638
638
  // src/extensions/loading-node.ts
639
- import { Node, mergeAttributes } from "@tiptap/core";
640
- var LoadingNode = Node.create({
639
+ import { Node as Node2, mergeAttributes } from "@tiptap/core";
640
+ var LoadingNode = Node2.create({
641
641
  name: "loadingNode",
642
642
  group: "inline",
643
643
  inline: true,
@@ -809,7 +809,10 @@ var FontSize = Extension5.create({
809
809
  });
810
810
 
811
811
  // src/extensions/rich-text-preset.ts
812
- import { wrappingInputRule, markInputRule } from "@tiptap/core";
812
+ import {
813
+ wrappingInputRule,
814
+ markInputRule
815
+ } from "@tiptap/core";
813
816
  import * as _StarterKit from "@tiptap/starter-kit";
814
817
  import * as _Color from "@tiptap/extension-color";
815
818
  import * as _Highlight from "@tiptap/extension-highlight";
@@ -870,20 +873,1033 @@ function createMentionExtension(options = {}) {
870
873
  });
871
874
  }
872
875
 
873
- // src/extensions/rich-text-preset.ts
876
+ // ../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/dist/tiptap-markdown.es.js
877
+ import { Extension as Extension6, Mark as Mark2, getHTMLFromFragment, Node as Node$1, extensions } from "@tiptap/core";
878
+ import { MarkdownSerializerState as MarkdownSerializerState$1, defaultMarkdownSerializer } from "prosemirror-markdown";
879
+ import markdownit from "markdown-it";
880
+ import { Fragment, DOMParser } from "@tiptap/pm/model";
881
+ import taskListPlugin from "markdown-it-task-lists";
882
+ import { Plugin as Plugin4, PluginKey } from "@tiptap/pm/state";
883
+ var __defProp = Object.defineProperty;
884
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
885
+ var __publicField = (obj, key, value) => {
886
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
887
+ return value;
888
+ };
889
+ var MarkdownTightLists = Extension6.create({
890
+ name: "markdownTightLists",
891
+ addOptions: () => ({
892
+ tight: true,
893
+ tightClass: "tight",
894
+ listTypes: ["bulletList", "orderedList"]
895
+ }),
896
+ addGlobalAttributes() {
897
+ return [{
898
+ types: this.options.listTypes,
899
+ attributes: {
900
+ tight: {
901
+ default: this.options.tight,
902
+ parseHTML: (element) => element.getAttribute("data-tight") === "true" || !element.querySelector("p"),
903
+ renderHTML: (attributes) => ({
904
+ class: attributes.tight ? this.options.tightClass : null,
905
+ "data-tight": attributes.tight ? "true" : null
906
+ })
907
+ }
908
+ }
909
+ }];
910
+ },
911
+ addCommands() {
912
+ var _this = this;
913
+ return {
914
+ toggleTight: function() {
915
+ let tight = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
916
+ return (_ref) => {
917
+ let {
918
+ editor,
919
+ commands
920
+ } = _ref;
921
+ function toggleTight(name) {
922
+ if (!editor.isActive(name)) {
923
+ return false;
924
+ }
925
+ const attrs = editor.getAttributes(name);
926
+ return commands.updateAttributes(name, {
927
+ tight: tight !== null && tight !== void 0 ? tight : !(attrs !== null && attrs !== void 0 && attrs.tight)
928
+ });
929
+ }
930
+ return _this.options.listTypes.some((name) => toggleTight(name));
931
+ };
932
+ }
933
+ };
934
+ }
935
+ });
936
+ var md = markdownit();
937
+ function scanDelims(text, pos) {
938
+ md.inline.State.prototype.scanDelims.call({
939
+ src: text,
940
+ posMax: text.length
941
+ });
942
+ const state = new md.inline.State(text, null, null, []);
943
+ return state.scanDelims(pos, true);
944
+ }
945
+ function shiftDelim(text, delim, start, offset) {
946
+ let res = text.substring(0, start) + text.substring(start + delim.length);
947
+ res = res.substring(0, start + offset) + delim + res.substring(start + offset);
948
+ return res;
949
+ }
950
+ function trimStart(text, delim, from, to) {
951
+ let pos = from, res = text;
952
+ while (pos < to) {
953
+ if (scanDelims(res, pos).can_open) {
954
+ break;
955
+ }
956
+ res = shiftDelim(res, delim, pos, 1);
957
+ pos++;
958
+ }
959
+ return {
960
+ text: res,
961
+ from: pos,
962
+ to
963
+ };
964
+ }
965
+ function trimEnd(text, delim, from, to) {
966
+ let pos = to, res = text;
967
+ while (pos > from) {
968
+ if (scanDelims(res, pos).can_close) {
969
+ break;
970
+ }
971
+ res = shiftDelim(res, delim, pos, -1);
972
+ pos--;
973
+ }
974
+ return {
975
+ text: res,
976
+ from,
977
+ to: pos
978
+ };
979
+ }
980
+ function trimInline(text, delim, from, to) {
981
+ let state = {
982
+ text,
983
+ from,
984
+ to
985
+ };
986
+ state = trimStart(state.text, delim, state.from, state.to);
987
+ state = trimEnd(state.text, delim, state.from, state.to);
988
+ if (state.to - state.from < delim.length + 1) {
989
+ state.text = state.text.substring(0, state.from) + state.text.substring(state.to + delim.length);
990
+ }
991
+ return state.text;
992
+ }
993
+ var MarkdownSerializerState = class extends MarkdownSerializerState$1 {
994
+ constructor(nodes, marks, options) {
995
+ super(nodes, marks, options !== null && options !== void 0 ? options : {});
996
+ __publicField(this, "inTable", false);
997
+ this.inlines = [];
998
+ }
999
+ render(node, parent, index) {
1000
+ super.render(node, parent, index);
1001
+ const top = this.inlines[this.inlines.length - 1];
1002
+ if (top !== null && top !== void 0 && top.start && top !== null && top !== void 0 && top.end) {
1003
+ const {
1004
+ delimiter,
1005
+ start,
1006
+ end
1007
+ } = this.normalizeInline(top);
1008
+ this.out = trimInline(this.out, delimiter, start, end);
1009
+ this.inlines.pop();
1010
+ }
1011
+ }
1012
+ markString(mark, open, parent, index) {
1013
+ const info = this.marks[mark.type.name];
1014
+ if (info.expelEnclosingWhitespace) {
1015
+ if (open) {
1016
+ this.inlines.push({
1017
+ start: this.out.length,
1018
+ delimiter: info.open
1019
+ });
1020
+ } else {
1021
+ const top = this.inlines.pop();
1022
+ this.inlines.push({
1023
+ ...top,
1024
+ end: this.out.length
1025
+ });
1026
+ }
1027
+ }
1028
+ return super.markString(mark, open, parent, index);
1029
+ }
1030
+ normalizeInline(inline) {
1031
+ let {
1032
+ start,
1033
+ end
1034
+ } = inline;
1035
+ while (this.out.charAt(start).match(/\s/)) {
1036
+ start++;
1037
+ }
1038
+ return {
1039
+ ...inline,
1040
+ start
1041
+ };
1042
+ }
1043
+ };
1044
+ var HTMLMark = Mark2.create({
1045
+ name: "markdownHTMLMark",
1046
+ /**
1047
+ * @return {{markdown: MarkdownMarkSpec}}
1048
+ */
1049
+ addStorage() {
1050
+ return {
1051
+ markdown: {
1052
+ serialize: {
1053
+ open(state, mark) {
1054
+ var _getMarkTags$, _getMarkTags;
1055
+ if (!this.editor.storage.markdown.options.html) {
1056
+ console.warn(`Tiptap Markdown: "${mark.type.name}" mark is only available in html mode`);
1057
+ return "";
1058
+ }
1059
+ return (_getMarkTags$ = (_getMarkTags = getMarkTags(mark)) === null || _getMarkTags === void 0 ? void 0 : _getMarkTags[0]) !== null && _getMarkTags$ !== void 0 ? _getMarkTags$ : "";
1060
+ },
1061
+ close(state, mark) {
1062
+ var _getMarkTags$2, _getMarkTags2;
1063
+ if (!this.editor.storage.markdown.options.html) {
1064
+ return "";
1065
+ }
1066
+ return (_getMarkTags$2 = (_getMarkTags2 = getMarkTags(mark)) === null || _getMarkTags2 === void 0 ? void 0 : _getMarkTags2[1]) !== null && _getMarkTags$2 !== void 0 ? _getMarkTags$2 : "";
1067
+ }
1068
+ },
1069
+ parse: {
1070
+ // handled by markdown-it
1071
+ }
1072
+ }
1073
+ };
1074
+ }
1075
+ });
1076
+ function getMarkTags(mark) {
1077
+ const schema = mark.type.schema;
1078
+ const node = schema.text(" ", [mark]);
1079
+ const html = getHTMLFromFragment(Fragment.from(node), schema);
1080
+ const match = html.match(/^(<.*?>) (<\/.*?>)$/);
1081
+ return match ? [match[1], match[2]] : null;
1082
+ }
1083
+ function elementFromString(value) {
1084
+ const wrappedValue = `<body>${value}</body>`;
1085
+ return new window.DOMParser().parseFromString(wrappedValue, "text/html").body;
1086
+ }
1087
+ function escapeHTML(value) {
1088
+ return value === null || value === void 0 ? void 0 : value.replace(/</g, "&lt;").replace(/>/g, "&gt;");
1089
+ }
1090
+ function extractElement(node) {
1091
+ const parent = node.parentElement;
1092
+ const prepend = parent.cloneNode();
1093
+ while (parent.firstChild && parent.firstChild !== node) {
1094
+ prepend.appendChild(parent.firstChild);
1095
+ }
1096
+ if (prepend.childNodes.length > 0) {
1097
+ parent.parentElement.insertBefore(prepend, parent);
1098
+ }
1099
+ parent.parentElement.insertBefore(node, parent);
1100
+ if (parent.childNodes.length === 0) {
1101
+ parent.remove();
1102
+ }
1103
+ }
1104
+ function unwrapElement(node) {
1105
+ const parent = node.parentNode;
1106
+ while (node.firstChild)
1107
+ parent.insertBefore(node.firstChild, node);
1108
+ parent.removeChild(node);
1109
+ }
1110
+ var HTMLNode = Node$1.create({
1111
+ name: "markdownHTMLNode",
1112
+ addStorage() {
1113
+ return {
1114
+ markdown: {
1115
+ serialize(state, node, parent) {
1116
+ if (this.editor.storage.markdown.options.html) {
1117
+ state.write(serializeHTML(node, parent));
1118
+ } else {
1119
+ console.warn(`Tiptap Markdown: "${node.type.name}" node is only available in html mode`);
1120
+ state.write(`[${node.type.name}]`);
1121
+ }
1122
+ if (node.isBlock) {
1123
+ state.closeBlock(node);
1124
+ }
1125
+ },
1126
+ parse: {
1127
+ // handled by markdown-it
1128
+ }
1129
+ }
1130
+ };
1131
+ }
1132
+ });
1133
+ function serializeHTML(node, parent) {
1134
+ const schema = node.type.schema;
1135
+ const html = getHTMLFromFragment(Fragment.from(node), schema);
1136
+ if (node.isBlock && (parent instanceof Fragment || parent.type.name === schema.topNodeType.name)) {
1137
+ return formatBlock(html);
1138
+ }
1139
+ return html;
1140
+ }
1141
+ function formatBlock(html) {
1142
+ const dom = elementFromString(html);
1143
+ const element = dom.firstElementChild;
1144
+ element.innerHTML = element.innerHTML.trim() ? `
1145
+ ${element.innerHTML}
1146
+ ` : `
1147
+ `;
1148
+ return element.outerHTML;
1149
+ }
1150
+ var Blockquote = Node$1.create({
1151
+ name: "blockquote"
1152
+ });
1153
+ var Blockquote$1 = Blockquote.extend({
1154
+ /**
1155
+ * @return {{markdown: MarkdownNodeSpec}}
1156
+ */
1157
+ addStorage() {
1158
+ return {
1159
+ markdown: {
1160
+ serialize: defaultMarkdownSerializer.nodes.blockquote,
1161
+ parse: {
1162
+ // handled by markdown-it
1163
+ }
1164
+ }
1165
+ };
1166
+ }
1167
+ });
1168
+ var BulletList = Node$1.create({
1169
+ name: "bulletList"
1170
+ });
1171
+ var BulletList$1 = BulletList.extend({
1172
+ /**
1173
+ * @return {{markdown: MarkdownNodeSpec}}
1174
+ */
1175
+ addStorage() {
1176
+ return {
1177
+ markdown: {
1178
+ serialize(state, node) {
1179
+ return state.renderList(node, " ", () => (this.editor.storage.markdown.options.bulletListMarker || "-") + " ");
1180
+ },
1181
+ parse: {
1182
+ // handled by markdown-it
1183
+ }
1184
+ }
1185
+ };
1186
+ }
1187
+ });
1188
+ var CodeBlock = Node$1.create({
1189
+ name: "codeBlock"
1190
+ });
1191
+ var CodeBlock$1 = CodeBlock.extend({
1192
+ /**
1193
+ * @return {{markdown: MarkdownNodeSpec}}
1194
+ */
1195
+ addStorage() {
1196
+ return {
1197
+ markdown: {
1198
+ serialize(state, node) {
1199
+ state.write("```" + (node.attrs.language || "") + "\n");
1200
+ state.text(node.textContent, false);
1201
+ state.ensureNewLine();
1202
+ state.write("```");
1203
+ state.closeBlock(node);
1204
+ },
1205
+ parse: {
1206
+ setup(markdownit2) {
1207
+ var _this$options$languag;
1208
+ markdownit2.set({
1209
+ langPrefix: (_this$options$languag = this.options.languageClassPrefix) !== null && _this$options$languag !== void 0 ? _this$options$languag : "language-"
1210
+ });
1211
+ },
1212
+ updateDOM(element) {
1213
+ element.innerHTML = element.innerHTML.replace(/\n<\/code><\/pre>/g, "</code></pre>");
1214
+ }
1215
+ }
1216
+ }
1217
+ };
1218
+ }
1219
+ });
1220
+ var HardBreak = Node$1.create({
1221
+ name: "hardBreak"
1222
+ });
1223
+ var HardBreak$1 = HardBreak.extend({
1224
+ /**
1225
+ * @return {{markdown: MarkdownNodeSpec}}
1226
+ */
1227
+ addStorage() {
1228
+ return {
1229
+ markdown: {
1230
+ serialize(state, node, parent, index) {
1231
+ for (let i = index + 1; i < parent.childCount; i++)
1232
+ if (parent.child(i).type != node.type) {
1233
+ state.write(state.inTable ? HTMLNode.storage.markdown.serialize.call(this, state, node, parent) : "\\\n");
1234
+ return;
1235
+ }
1236
+ },
1237
+ parse: {
1238
+ // handled by markdown-it
1239
+ }
1240
+ }
1241
+ };
1242
+ }
1243
+ });
1244
+ var Heading = Node$1.create({
1245
+ name: "heading"
1246
+ });
1247
+ var Heading$1 = Heading.extend({
1248
+ /**
1249
+ * @return {{markdown: MarkdownNodeSpec}}
1250
+ */
1251
+ addStorage() {
1252
+ return {
1253
+ markdown: {
1254
+ serialize: defaultMarkdownSerializer.nodes.heading,
1255
+ parse: {
1256
+ // handled by markdown-it
1257
+ }
1258
+ }
1259
+ };
1260
+ }
1261
+ });
1262
+ var HorizontalRule = Node$1.create({
1263
+ name: "horizontalRule"
1264
+ });
1265
+ var HorizontalRule$1 = HorizontalRule.extend({
1266
+ /**
1267
+ * @return {{markdown: MarkdownNodeSpec}}
1268
+ */
1269
+ addStorage() {
1270
+ return {
1271
+ markdown: {
1272
+ serialize: defaultMarkdownSerializer.nodes.horizontal_rule,
1273
+ parse: {
1274
+ // handled by markdown-it
1275
+ }
1276
+ }
1277
+ };
1278
+ }
1279
+ });
1280
+ var Image = Node$1.create({
1281
+ name: "image"
1282
+ });
1283
+ var Image$1 = Image.extend({
1284
+ /**
1285
+ * @return {{markdown: MarkdownNodeSpec}}
1286
+ */
1287
+ addStorage() {
1288
+ return {
1289
+ markdown: {
1290
+ serialize: defaultMarkdownSerializer.nodes.image,
1291
+ parse: {
1292
+ // handled by markdown-it
1293
+ }
1294
+ }
1295
+ };
1296
+ }
1297
+ });
1298
+ var ListItem = Node$1.create({
1299
+ name: "listItem"
1300
+ });
1301
+ var ListItem$1 = ListItem.extend({
1302
+ /**
1303
+ * @return {{markdown: MarkdownNodeSpec}}
1304
+ */
1305
+ addStorage() {
1306
+ return {
1307
+ markdown: {
1308
+ serialize: defaultMarkdownSerializer.nodes.list_item,
1309
+ parse: {
1310
+ // handled by markdown-it
1311
+ }
1312
+ }
1313
+ };
1314
+ }
1315
+ });
1316
+ var OrderedList = Node$1.create({
1317
+ name: "orderedList"
1318
+ });
1319
+ function findIndexOfAdjacentNode(node, parent, index) {
1320
+ let i = 0;
1321
+ for (; index - i > 0; i++) {
1322
+ if (parent.child(index - i - 1).type.name !== node.type.name) {
1323
+ break;
1324
+ }
1325
+ }
1326
+ return i;
1327
+ }
1328
+ var OrderedList$1 = OrderedList.extend({
1329
+ /**
1330
+ * @return {{markdown: MarkdownNodeSpec}}
1331
+ */
1332
+ addStorage() {
1333
+ return {
1334
+ markdown: {
1335
+ serialize(state, node, parent, index) {
1336
+ const start = node.attrs.start || 1;
1337
+ const maxW = String(start + node.childCount - 1).length;
1338
+ const space = state.repeat(" ", maxW + 2);
1339
+ const adjacentIndex = findIndexOfAdjacentNode(node, parent, index);
1340
+ const separator = adjacentIndex % 2 ? ") " : ". ";
1341
+ state.renderList(node, space, (i) => {
1342
+ const nStr = String(start + i);
1343
+ return state.repeat(" ", maxW - nStr.length) + nStr + separator;
1344
+ });
1345
+ },
1346
+ parse: {
1347
+ // handled by markdown-it
1348
+ }
1349
+ }
1350
+ };
1351
+ }
1352
+ });
1353
+ var Paragraph = Node$1.create({
1354
+ name: "paragraph"
1355
+ });
1356
+ var Paragraph$1 = Paragraph.extend({
1357
+ /**
1358
+ * @return {{markdown: MarkdownNodeSpec}}
1359
+ */
1360
+ addStorage() {
1361
+ return {
1362
+ markdown: {
1363
+ serialize: defaultMarkdownSerializer.nodes.paragraph,
1364
+ parse: {
1365
+ // handled by markdown-it
1366
+ }
1367
+ }
1368
+ };
1369
+ }
1370
+ });
1371
+ function childNodes(node) {
1372
+ var _node$content$content, _node$content;
1373
+ return (_node$content$content = node === null || node === void 0 || (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.content) !== null && _node$content$content !== void 0 ? _node$content$content : [];
1374
+ }
1375
+ var Table = Node$1.create({
1376
+ name: "table"
1377
+ });
1378
+ var Table$1 = Table.extend({
1379
+ /**
1380
+ * @return {{markdown: MarkdownNodeSpec}}
1381
+ */
1382
+ addStorage() {
1383
+ return {
1384
+ markdown: {
1385
+ serialize(state, node, parent) {
1386
+ if (!isMarkdownSerializable(node)) {
1387
+ HTMLNode.storage.markdown.serialize.call(this, state, node, parent);
1388
+ return;
1389
+ }
1390
+ state.inTable = true;
1391
+ node.forEach((row, p, i) => {
1392
+ state.write("| ");
1393
+ row.forEach((col, p2, j) => {
1394
+ if (j) {
1395
+ state.write(" | ");
1396
+ }
1397
+ const cellContent = col.firstChild;
1398
+ if (cellContent.textContent.trim()) {
1399
+ state.renderInline(cellContent);
1400
+ }
1401
+ });
1402
+ state.write(" |");
1403
+ state.ensureNewLine();
1404
+ if (!i) {
1405
+ const delimiterRow = Array.from({
1406
+ length: row.childCount
1407
+ }).map(() => "---").join(" | ");
1408
+ state.write(`| ${delimiterRow} |`);
1409
+ state.ensureNewLine();
1410
+ }
1411
+ });
1412
+ state.closeBlock(node);
1413
+ state.inTable = false;
1414
+ },
1415
+ parse: {
1416
+ // handled by markdown-it
1417
+ }
1418
+ }
1419
+ };
1420
+ }
1421
+ });
1422
+ function hasSpan(node) {
1423
+ return node.attrs.colspan > 1 || node.attrs.rowspan > 1;
1424
+ }
1425
+ function isMarkdownSerializable(node) {
1426
+ const rows = childNodes(node);
1427
+ const firstRow = rows[0];
1428
+ const bodyRows = rows.slice(1);
1429
+ if (childNodes(firstRow).some((cell) => cell.type.name !== "tableHeader" || hasSpan(cell) || cell.childCount > 1)) {
1430
+ return false;
1431
+ }
1432
+ if (bodyRows.some((row) => childNodes(row).some((cell) => cell.type.name === "tableHeader" || hasSpan(cell) || cell.childCount > 1))) {
1433
+ return false;
1434
+ }
1435
+ return true;
1436
+ }
1437
+ var TaskItem = Node$1.create({
1438
+ name: "taskItem"
1439
+ });
1440
+ var TaskItem$1 = TaskItem.extend({
1441
+ /**
1442
+ * @return {{markdown: MarkdownNodeSpec}}
1443
+ */
1444
+ addStorage() {
1445
+ return {
1446
+ markdown: {
1447
+ serialize(state, node) {
1448
+ const check = node.attrs.checked ? "[x]" : "[ ]";
1449
+ state.write(`${check} `);
1450
+ state.renderContent(node);
1451
+ },
1452
+ parse: {
1453
+ updateDOM(element) {
1454
+ [...element.querySelectorAll(".task-list-item")].forEach((item) => {
1455
+ const input = item.querySelector("input");
1456
+ item.setAttribute("data-type", "taskItem");
1457
+ if (input) {
1458
+ item.setAttribute("data-checked", input.checked);
1459
+ input.remove();
1460
+ }
1461
+ });
1462
+ }
1463
+ }
1464
+ }
1465
+ };
1466
+ }
1467
+ });
1468
+ var TaskList = Node$1.create({
1469
+ name: "taskList"
1470
+ });
1471
+ var TaskList$1 = TaskList.extend({
1472
+ /**
1473
+ * @return {{markdown: MarkdownNodeSpec}}
1474
+ */
1475
+ addStorage() {
1476
+ return {
1477
+ markdown: {
1478
+ serialize: BulletList$1.storage.markdown.serialize,
1479
+ parse: {
1480
+ setup(markdownit2) {
1481
+ markdownit2.use(taskListPlugin);
1482
+ },
1483
+ updateDOM(element) {
1484
+ [...element.querySelectorAll(".contains-task-list")].forEach((list) => {
1485
+ list.setAttribute("data-type", "taskList");
1486
+ });
1487
+ }
1488
+ }
1489
+ }
1490
+ };
1491
+ }
1492
+ });
1493
+ var Text = Node$1.create({
1494
+ name: "text"
1495
+ });
1496
+ var Text$1 = Text.extend({
1497
+ /**
1498
+ * @return {{markdown: MarkdownNodeSpec}}
1499
+ */
1500
+ addStorage() {
1501
+ return {
1502
+ markdown: {
1503
+ serialize(state, node) {
1504
+ state.text(escapeHTML(node.text));
1505
+ },
1506
+ parse: {
1507
+ // handled by markdown-it
1508
+ }
1509
+ }
1510
+ };
1511
+ }
1512
+ });
1513
+ var Bold = Mark2.create({
1514
+ name: "bold"
1515
+ });
1516
+ var Bold$1 = Bold.extend({
1517
+ /**
1518
+ * @return {{markdown: MarkdownMarkSpec}}
1519
+ */
1520
+ addStorage() {
1521
+ return {
1522
+ markdown: {
1523
+ serialize: defaultMarkdownSerializer.marks.strong,
1524
+ parse: {
1525
+ // handled by markdown-it
1526
+ }
1527
+ }
1528
+ };
1529
+ }
1530
+ });
1531
+ var Code = Mark2.create({
1532
+ name: "code"
1533
+ });
1534
+ var Code$1 = Code.extend({
1535
+ /**
1536
+ * @return {{markdown: MarkdownMarkSpec}}
1537
+ */
1538
+ addStorage() {
1539
+ return {
1540
+ markdown: {
1541
+ serialize: defaultMarkdownSerializer.marks.code,
1542
+ parse: {
1543
+ // handled by markdown-it
1544
+ }
1545
+ }
1546
+ };
1547
+ }
1548
+ });
1549
+ var Italic = Mark2.create({
1550
+ name: "italic"
1551
+ });
1552
+ var Italic$1 = Italic.extend({
1553
+ /**
1554
+ * @return {{markdown: MarkdownMarkSpec}}
1555
+ */
1556
+ addStorage() {
1557
+ return {
1558
+ markdown: {
1559
+ serialize: defaultMarkdownSerializer.marks.em,
1560
+ parse: {
1561
+ // handled by markdown-it
1562
+ }
1563
+ }
1564
+ };
1565
+ }
1566
+ });
1567
+ var Link = Mark2.create({
1568
+ name: "link"
1569
+ });
1570
+ var Link$1 = Link.extend({
1571
+ /**
1572
+ * @return {{markdown: MarkdownMarkSpec}}
1573
+ */
1574
+ addStorage() {
1575
+ return {
1576
+ markdown: {
1577
+ serialize: defaultMarkdownSerializer.marks.link,
1578
+ parse: {
1579
+ // handled by markdown-it
1580
+ }
1581
+ }
1582
+ };
1583
+ }
1584
+ });
1585
+ var Strike = Mark2.create({
1586
+ name: "strike"
1587
+ });
1588
+ var Strike$1 = Strike.extend({
1589
+ /**
1590
+ * @return {{markdown: MarkdownMarkSpec}}
1591
+ */
1592
+ addStorage() {
1593
+ return {
1594
+ markdown: {
1595
+ serialize: {
1596
+ open: "~~",
1597
+ close: "~~",
1598
+ expelEnclosingWhitespace: true
1599
+ },
1600
+ parse: {
1601
+ // handled by markdown-it
1602
+ }
1603
+ }
1604
+ };
1605
+ }
1606
+ });
1607
+ var markdownExtensions = [Blockquote$1, BulletList$1, CodeBlock$1, HardBreak$1, Heading$1, HorizontalRule$1, HTMLNode, Image$1, ListItem$1, OrderedList$1, Paragraph$1, Table$1, TaskItem$1, TaskList$1, Text$1, Bold$1, Code$1, HTMLMark, Italic$1, Link$1, Strike$1];
1608
+ function getMarkdownSpec(extension) {
1609
+ var _extension$storage, _markdownExtensions$f;
1610
+ const markdownSpec = (_extension$storage = extension.storage) === null || _extension$storage === void 0 ? void 0 : _extension$storage.markdown;
1611
+ const defaultMarkdownSpec = (_markdownExtensions$f = markdownExtensions.find((e) => e.name === extension.name)) === null || _markdownExtensions$f === void 0 ? void 0 : _markdownExtensions$f.storage.markdown;
1612
+ if (markdownSpec || defaultMarkdownSpec) {
1613
+ return {
1614
+ ...defaultMarkdownSpec,
1615
+ ...markdownSpec
1616
+ };
1617
+ }
1618
+ return null;
1619
+ }
1620
+ var MarkdownSerializer = class {
1621
+ constructor(editor) {
1622
+ __publicField(this, "editor", null);
1623
+ this.editor = editor;
1624
+ }
1625
+ serialize(content) {
1626
+ const state = new MarkdownSerializerState(this.nodes, this.marks, {
1627
+ hardBreakNodeName: HardBreak$1.name
1628
+ });
1629
+ state.renderContent(content);
1630
+ return state.out;
1631
+ }
1632
+ get nodes() {
1633
+ var _this$editor$extensio;
1634
+ return {
1635
+ ...Object.fromEntries(Object.keys(this.editor.schema.nodes).map((name) => [name, this.serializeNode(HTMLNode)])),
1636
+ ...Object.fromEntries((_this$editor$extensio = this.editor.extensionManager.extensions.filter((extension) => extension.type === "node" && this.serializeNode(extension)).map((extension) => [extension.name, this.serializeNode(extension)])) !== null && _this$editor$extensio !== void 0 ? _this$editor$extensio : [])
1637
+ };
1638
+ }
1639
+ get marks() {
1640
+ var _this$editor$extensio2;
1641
+ return {
1642
+ ...Object.fromEntries(Object.keys(this.editor.schema.marks).map((name) => [name, this.serializeMark(HTMLMark)])),
1643
+ ...Object.fromEntries((_this$editor$extensio2 = this.editor.extensionManager.extensions.filter((extension) => extension.type === "mark" && this.serializeMark(extension)).map((extension) => [extension.name, this.serializeMark(extension)])) !== null && _this$editor$extensio2 !== void 0 ? _this$editor$extensio2 : [])
1644
+ };
1645
+ }
1646
+ serializeNode(node) {
1647
+ var _getMarkdownSpec;
1648
+ return (_getMarkdownSpec = getMarkdownSpec(node)) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.serialize) === null || _getMarkdownSpec === void 0 ? void 0 : _getMarkdownSpec.bind({
1649
+ editor: this.editor,
1650
+ options: node.options
1651
+ });
1652
+ }
1653
+ serializeMark(mark) {
1654
+ var _getMarkdownSpec2;
1655
+ const serialize = (_getMarkdownSpec2 = getMarkdownSpec(mark)) === null || _getMarkdownSpec2 === void 0 ? void 0 : _getMarkdownSpec2.serialize;
1656
+ return serialize ? {
1657
+ ...serialize,
1658
+ open: typeof serialize.open === "function" ? serialize.open.bind({
1659
+ editor: this.editor,
1660
+ options: mark.options
1661
+ }) : serialize.open,
1662
+ close: typeof serialize.close === "function" ? serialize.close.bind({
1663
+ editor: this.editor,
1664
+ options: mark.options
1665
+ }) : serialize.close
1666
+ } : null;
1667
+ }
1668
+ };
1669
+ var MarkdownParser = class {
1670
+ constructor(editor, _ref) {
1671
+ __publicField(this, "editor", null);
1672
+ __publicField(this, "md", null);
1673
+ let {
1674
+ html,
1675
+ linkify,
1676
+ breaks
1677
+ } = _ref;
1678
+ this.editor = editor;
1679
+ this.md = this.withPatchedRenderer(markdownit({
1680
+ html,
1681
+ linkify,
1682
+ breaks
1683
+ }));
1684
+ }
1685
+ parse(content) {
1686
+ let {
1687
+ inline
1688
+ } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
1689
+ if (typeof content === "string") {
1690
+ this.editor.extensionManager.extensions.forEach((extension) => {
1691
+ var _getMarkdownSpec;
1692
+ return (_getMarkdownSpec = getMarkdownSpec(extension)) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.parse) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.setup) === null || _getMarkdownSpec === void 0 ? void 0 : _getMarkdownSpec.call({
1693
+ editor: this.editor,
1694
+ options: extension.options
1695
+ }, this.md);
1696
+ });
1697
+ const renderedHTML = this.md.render(content);
1698
+ const element = elementFromString(renderedHTML);
1699
+ this.editor.extensionManager.extensions.forEach((extension) => {
1700
+ var _getMarkdownSpec2;
1701
+ return (_getMarkdownSpec2 = getMarkdownSpec(extension)) === null || _getMarkdownSpec2 === void 0 || (_getMarkdownSpec2 = _getMarkdownSpec2.parse) === null || _getMarkdownSpec2 === void 0 || (_getMarkdownSpec2 = _getMarkdownSpec2.updateDOM) === null || _getMarkdownSpec2 === void 0 ? void 0 : _getMarkdownSpec2.call({
1702
+ editor: this.editor,
1703
+ options: extension.options
1704
+ }, element);
1705
+ });
1706
+ this.normalizeDOM(element, {
1707
+ inline,
1708
+ content
1709
+ });
1710
+ return element.innerHTML;
1711
+ }
1712
+ return content;
1713
+ }
1714
+ normalizeDOM(node, _ref2) {
1715
+ let {
1716
+ inline,
1717
+ content
1718
+ } = _ref2;
1719
+ this.normalizeBlocks(node);
1720
+ node.querySelectorAll("*").forEach((el) => {
1721
+ var _el$nextSibling;
1722
+ if (((_el$nextSibling = el.nextSibling) === null || _el$nextSibling === void 0 ? void 0 : _el$nextSibling.nodeType) === Node.TEXT_NODE && !el.closest("pre")) {
1723
+ el.nextSibling.textContent = el.nextSibling.textContent.replace(/^\n/, "");
1724
+ }
1725
+ });
1726
+ if (inline) {
1727
+ this.normalizeInline(node, content);
1728
+ }
1729
+ return node;
1730
+ }
1731
+ normalizeBlocks(node) {
1732
+ const blocks = Object.values(this.editor.schema.nodes).filter((node2) => node2.isBlock);
1733
+ const selector = blocks.map((block) => {
1734
+ var _block$spec$parseDOM;
1735
+ return (_block$spec$parseDOM = block.spec.parseDOM) === null || _block$spec$parseDOM === void 0 ? void 0 : _block$spec$parseDOM.map((spec) => spec.tag);
1736
+ }).flat().filter(Boolean).join(",");
1737
+ if (!selector) {
1738
+ return;
1739
+ }
1740
+ [...node.querySelectorAll(selector)].forEach((el) => {
1741
+ if (el.parentElement.matches("p")) {
1742
+ extractElement(el);
1743
+ }
1744
+ });
1745
+ }
1746
+ normalizeInline(node, content) {
1747
+ var _node$firstElementChi;
1748
+ if ((_node$firstElementChi = node.firstElementChild) !== null && _node$firstElementChi !== void 0 && _node$firstElementChi.matches("p")) {
1749
+ var _content$match$, _content$match, _content$match$2, _content$match2;
1750
+ const firstParagraph = node.firstElementChild;
1751
+ const {
1752
+ nextElementSibling
1753
+ } = firstParagraph;
1754
+ const startSpaces = (_content$match$ = (_content$match = content.match(/^\s+/)) === null || _content$match === void 0 ? void 0 : _content$match[0]) !== null && _content$match$ !== void 0 ? _content$match$ : "";
1755
+ const endSpaces = !nextElementSibling ? (_content$match$2 = (_content$match2 = content.match(/\s+$/)) === null || _content$match2 === void 0 ? void 0 : _content$match2[0]) !== null && _content$match$2 !== void 0 ? _content$match$2 : "" : "";
1756
+ if (content.match(/^\n\n/)) {
1757
+ firstParagraph.innerHTML = `${firstParagraph.innerHTML}${endSpaces}`;
1758
+ return;
1759
+ }
1760
+ unwrapElement(firstParagraph);
1761
+ node.innerHTML = `${startSpaces}${node.innerHTML}${endSpaces}`;
1762
+ }
1763
+ }
1764
+ /**
1765
+ * @param {markdownit} md
1766
+ */
1767
+ withPatchedRenderer(md22) {
1768
+ const withoutNewLine = (renderer) => function() {
1769
+ const rendered = renderer(...arguments);
1770
+ if (rendered === "\n") {
1771
+ return rendered;
1772
+ }
1773
+ if (rendered[rendered.length - 1] === "\n") {
1774
+ return rendered.slice(0, -1);
1775
+ }
1776
+ return rendered;
1777
+ };
1778
+ md22.renderer.rules.hardbreak = withoutNewLine(md22.renderer.rules.hardbreak);
1779
+ md22.renderer.rules.softbreak = withoutNewLine(md22.renderer.rules.softbreak);
1780
+ md22.renderer.rules.fence = withoutNewLine(md22.renderer.rules.fence);
1781
+ md22.renderer.rules.code_block = withoutNewLine(md22.renderer.rules.code_block);
1782
+ md22.renderer.renderToken = withoutNewLine(md22.renderer.renderToken.bind(md22.renderer));
1783
+ return md22;
1784
+ }
1785
+ };
1786
+ var MarkdownClipboard = Extension6.create({
1787
+ name: "markdownClipboard",
1788
+ addOptions() {
1789
+ return {
1790
+ transformPastedText: false,
1791
+ transformCopiedText: false
1792
+ };
1793
+ },
1794
+ addProseMirrorPlugins() {
1795
+ return [new Plugin4({
1796
+ key: new PluginKey("markdownClipboard"),
1797
+ props: {
1798
+ clipboardTextParser: (text, context, plainText) => {
1799
+ if (plainText || !this.options.transformPastedText) {
1800
+ return null;
1801
+ }
1802
+ const parsed = this.editor.storage.markdown.parser.parse(text, {
1803
+ inline: true
1804
+ });
1805
+ return DOMParser.fromSchema(this.editor.schema).parseSlice(elementFromString(parsed), {
1806
+ preserveWhitespace: true,
1807
+ context
1808
+ });
1809
+ },
1810
+ /**
1811
+ * @param {import('prosemirror-model').Slice} slice
1812
+ */
1813
+ clipboardTextSerializer: (slice) => {
1814
+ if (!this.options.transformCopiedText) {
1815
+ return null;
1816
+ }
1817
+ return this.editor.storage.markdown.serializer.serialize(slice.content);
1818
+ }
1819
+ }
1820
+ })];
1821
+ }
1822
+ });
1823
+ var Markdown = Extension6.create({
1824
+ name: "markdown",
1825
+ priority: 50,
1826
+ addOptions() {
1827
+ return {
1828
+ html: true,
1829
+ tightLists: true,
1830
+ tightListClass: "tight",
1831
+ bulletListMarker: "-",
1832
+ linkify: false,
1833
+ breaks: false,
1834
+ transformPastedText: false,
1835
+ transformCopiedText: false
1836
+ };
1837
+ },
1838
+ addCommands() {
1839
+ const commands = extensions.Commands.config.addCommands();
1840
+ return {
1841
+ setContent: (content, emitUpdate, parseOptions) => (props) => {
1842
+ return commands.setContent(props.editor.storage.markdown.parser.parse(content), emitUpdate, parseOptions)(props);
1843
+ },
1844
+ insertContentAt: (range, content, options) => (props) => {
1845
+ return commands.insertContentAt(range, props.editor.storage.markdown.parser.parse(content, {
1846
+ inline: true
1847
+ }), options)(props);
1848
+ }
1849
+ };
1850
+ },
1851
+ onBeforeCreate() {
1852
+ this.editor.storage.markdown = {
1853
+ options: {
1854
+ ...this.options
1855
+ },
1856
+ parser: new MarkdownParser(this.editor, this.options),
1857
+ serializer: new MarkdownSerializer(this.editor),
1858
+ getMarkdown: () => {
1859
+ return this.editor.storage.markdown.serializer.serialize(this.editor.state.doc);
1860
+ }
1861
+ };
1862
+ this.editor.options.initialContent = this.editor.options.content;
1863
+ this.editor.options.content = this.editor.storage.markdown.parser.parse(this.editor.options.content);
1864
+ },
1865
+ onCreate() {
1866
+ this.editor.options.content = this.editor.options.initialContent;
1867
+ delete this.editor.options.initialContent;
1868
+ },
1869
+ addStorage() {
1870
+ return {
1871
+ /// storage will be defined in onBeforeCreate() to prevent initial object overriding
1872
+ };
1873
+ },
1874
+ addExtensions() {
1875
+ return [MarkdownTightLists.configure({
1876
+ tight: this.options.tightLists,
1877
+ tightClass: this.options.tightListClass
1878
+ }), MarkdownClipboard.configure({
1879
+ transformPastedText: this.options.transformPastedText,
1880
+ transformCopiedText: this.options.transformCopiedText
1881
+ })];
1882
+ }
1883
+ });
1884
+
1885
+ // src/extensions/markdown.ts
874
1886
  var resolveExt = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
875
- var StarterKit = resolveExt(_StarterKit, "StarterKit");
876
- var Color = resolveExt(_Color, "Color");
877
- var Highlight = resolveExt(_Highlight, "Highlight");
878
- var Link = resolveExt(_Link, "Link");
879
- var TaskList = resolveExt(_TaskList, "TaskList");
880
- var TaskItem = resolveExt(_TaskItem, "TaskItem");
881
- var TextAlign = resolveExt(_TextAlign, "TextAlign");
882
- var TextStyle = resolveExt(_TextStyle, "TextStyle");
883
- var Typography = resolveExt(_Typography, "Typography");
884
- var Underline = resolveExt(_Underline, "Underline");
885
- var Placeholder = resolveExt(_Placeholder, "Placeholder");
886
- var CharacterCount = resolveExt(_CharacterCount, "CharacterCount");
1887
+ var Markdown2 = resolveExt(Markdown, "Markdown");
1888
+
1889
+ // src/extensions/rich-text-preset.ts
1890
+ var resolveExt2 = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
1891
+ var StarterKit = resolveExt2(_StarterKit, "StarterKit");
1892
+ var Color = resolveExt2(_Color, "Color");
1893
+ var Highlight = resolveExt2(_Highlight, "Highlight");
1894
+ var Link2 = resolveExt2(_Link, "Link");
1895
+ var TaskList2 = resolveExt2(_TaskList, "TaskList");
1896
+ var TaskItem2 = resolveExt2(_TaskItem, "TaskItem");
1897
+ var TextAlign = resolveExt2(_TextAlign, "TextAlign");
1898
+ var TextStyle = resolveExt2(_TextStyle, "TextStyle");
1899
+ var Typography = resolveExt2(_Typography, "Typography");
1900
+ var Underline = resolveExt2(_Underline, "Underline");
1901
+ var Placeholder = resolveExt2(_Placeholder, "Placeholder");
1902
+ var CharacterCount = resolveExt2(_CharacterCount, "CharacterCount");
887
1903
  function createRichTextPreset(options = {}) {
888
1904
  const {
889
1905
  placeholder = "Start typing...",
@@ -893,7 +1909,7 @@ function createRichTextPreset(options = {}) {
893
1909
  enableColorHighlighter = true,
894
1910
  headingLevels = [1, 2, 3, 4]
895
1911
  } = options;
896
- const extensions = [
1912
+ const extensions2 = [
897
1913
  StarterKit.configure({
898
1914
  orderedList: {
899
1915
  HTMLAttributes: {
@@ -920,7 +1936,7 @@ function createRichTextPreset(options = {}) {
920
1936
  TextAlign.configure({
921
1937
  types: ["heading", "paragraph"]
922
1938
  }),
923
- Link.extend({
1939
+ Link2.extend({
924
1940
  addInputRules() {
925
1941
  return [
926
1942
  markInputRule({
@@ -942,8 +1958,8 @@ function createRichTextPreset(options = {}) {
942
1958
  class: "text-blue-500 underline underline-offset-2"
943
1959
  }
944
1960
  }),
945
- TaskList,
946
- TaskItem.extend({
1961
+ TaskList2,
1962
+ TaskItem2.extend({
947
1963
  addInputRules() {
948
1964
  return [
949
1965
  wrappingInputRule({
@@ -965,21 +1981,21 @@ function createRichTextPreset(options = {}) {
965
1981
  })
966
1982
  ];
967
1983
  if (characterLimit) {
968
- extensions.push(
1984
+ extensions2.push(
969
1985
  CharacterCount.configure({
970
1986
  limit: characterLimit
971
1987
  })
972
1988
  );
973
1989
  }
974
1990
  if (enableSmilies) {
975
- extensions.push(SmilieReplacer);
1991
+ extensions2.push(SmilieReplacer);
976
1992
  }
977
1993
  if (enableColorHighlighter) {
978
- extensions.push(ColorHighlighter);
1994
+ extensions2.push(ColorHighlighter);
979
1995
  }
980
1996
  if (options.mention) {
981
1997
  const mentionConfig = typeof options.mention === "object" ? options.mention : {};
982
- extensions.push(
1998
+ extensions2.push(
983
1999
  Mention.configure({
984
2000
  HTMLAttributes: {
985
2001
  class: "pixerate-mention-node",
@@ -989,7 +2005,23 @@ function createRichTextPreset(options = {}) {
989
2005
  })
990
2006
  );
991
2007
  }
992
- return extensions;
2008
+ if (options.markdown) {
2009
+ const markdownConfig = typeof options.markdown === "object" ? options.markdown : {};
2010
+ extensions2.push(
2011
+ Markdown2.configure({
2012
+ html: true,
2013
+ tightLists: true,
2014
+ tightListClass: "tight",
2015
+ bulletListMarker: "-",
2016
+ linkify: true,
2017
+ breaks: true,
2018
+ transformPastedText: true,
2019
+ transformCopiedText: true,
2020
+ ...markdownConfig
2021
+ })
2022
+ );
2023
+ }
2024
+ return extensions2;
993
2025
  }
994
2026
 
995
2027
  // src/serializers/plain-text.ts
@@ -1120,13 +2152,35 @@ function extractMentionsFromDoc(docOrEditor) {
1120
2152
  return mentions;
1121
2153
  }
1122
2154
 
2155
+ // src/serializers/markdown.ts
2156
+ import MarkdownIt from "markdown-it";
2157
+ import taskLists from "markdown-it-task-lists";
2158
+ var md2 = new MarkdownIt({
2159
+ html: true,
2160
+ linkify: true,
2161
+ breaks: true
2162
+ }).use(taskLists);
2163
+ function markdownToTipTapHtml(markdown) {
2164
+ if (!markdown) return "<p></p>";
2165
+ return md2.render(markdown);
2166
+ }
2167
+ function getEditorMarkdown(editor) {
2168
+ if (!editor) return "";
2169
+ if (typeof editor.storage?.markdown?.getMarkdown === "function") {
2170
+ return editor.storage.markdown.getMarkdown();
2171
+ }
2172
+ return getEditorText(editor);
2173
+ }
2174
+
1123
2175
  // src/controller.ts
1124
2176
  import { Editor } from "@tiptap/core";
1125
- import { Slice, Fragment, Node as ProsemirrorNode } from "@tiptap/pm/model";
2177
+ import { Slice, Fragment as Fragment2, Node as ProsemirrorNode } from "@tiptap/pm/model";
1126
2178
  var EditorController = class {
1127
2179
  editor;
1128
2180
  plainTextMode;
2181
+ markdownMode;
1129
2182
  onPlainTextChange;
2183
+ onMarkdownChange;
1130
2184
  onTokensChange;
1131
2185
  onSelectionChange;
1132
2186
  constructor(options = {}) {
@@ -1134,21 +2188,25 @@ var EditorController = class {
1134
2188
  element,
1135
2189
  content,
1136
2190
  plainTextMode = false,
1137
- extensions = [],
2191
+ markdownMode = false,
2192
+ extensions: extensions2 = [],
1138
2193
  onPlainTextChange,
2194
+ onMarkdownChange,
1139
2195
  onTokensChange,
1140
2196
  onSelectionChange,
1141
2197
  ...editorOptions
1142
2198
  } = options;
1143
2199
  this.plainTextMode = plainTextMode;
2200
+ this.markdownMode = markdownMode;
1144
2201
  this.onPlainTextChange = onPlainTextChange;
2202
+ this.onMarkdownChange = onMarkdownChange;
1145
2203
  this.onTokensChange = onTokensChange;
1146
2204
  this.onSelectionChange = onSelectionChange;
1147
- const initialContent = plainTextMode && typeof content === "string" ? plainTextToTipTapHtml(content) : content;
2205
+ const initialContent = plainTextMode && typeof content === "string" ? plainTextToTipTapHtml(content) : markdownMode && typeof content === "string" ? markdownToTipTapHtml(content) : content;
1148
2206
  this.editor = new Editor({
1149
2207
  element: element || void 0,
1150
2208
  content: initialContent,
1151
- extensions,
2209
+ extensions: extensions2,
1152
2210
  ...editorOptions,
1153
2211
  onUpdate: (props) => {
1154
2212
  editorOptions.onUpdate?.(props);
@@ -1183,7 +2241,7 @@ var EditorController = class {
1183
2241
  } catch {
1184
2242
  }
1185
2243
  });
1186
- return Slice.maxOpen(Fragment.fromArray(nodes));
2244
+ return Slice.maxOpen(Fragment2.fromArray(nodes));
1187
2245
  }
1188
2246
  }
1189
2247
  });
@@ -1197,6 +2255,10 @@ var EditorController = class {
1197
2255
  this.onTokensChange(tokens);
1198
2256
  }
1199
2257
  }
2258
+ if (this.markdownMode || this.onMarkdownChange) {
2259
+ const markdown = this.getMarkdown();
2260
+ this.onMarkdownChange?.(markdown);
2261
+ }
1200
2262
  }
1201
2263
  handleSelectionUpdate() {
1202
2264
  if (this.onSelectionChange) {
@@ -1211,6 +2273,17 @@ var EditorController = class {
1211
2273
  const html = plainTextToTipTapHtml(text);
1212
2274
  this.editor.commands.setContent(html, emitUpdate);
1213
2275
  }
2276
+ getMarkdown() {
2277
+ return getEditorMarkdown(this.editor);
2278
+ }
2279
+ setMarkdown(markdown, emitUpdate = true) {
2280
+ if (this.editor.storage?.markdown?.parser) {
2281
+ this.editor.commands.setContent(markdown, emitUpdate);
2282
+ } else {
2283
+ const html = markdownToTipTapHtml(markdown);
2284
+ this.editor.commands.setContent(html, emitUpdate);
2285
+ }
2286
+ }
1214
2287
  insertText(text) {
1215
2288
  this.editor.commands.insertContent(text);
1216
2289
  }
@@ -2422,6 +3495,24 @@ var SpreadsheetController = class {
2422
3495
  this.notifyChange();
2423
3496
  }
2424
3497
  }
3498
+ autoFitColumnWidth(colId, customWidth) {
3499
+ if (customWidth !== void 0) {
3500
+ this.setColumnWidth(colId, customWidth);
3501
+ return;
3502
+ }
3503
+ const col = this.document.columns.find((c) => c.id === colId);
3504
+ if (!col) return;
3505
+ let maxLen = (col.title || "").length + (col.key ? col.key.length + 3 : 0);
3506
+ for (const row of this.document.rows) {
3507
+ const cell = this.getCell(row.id, col.id);
3508
+ const valStr = cell.value != null ? String(cell.value) : "";
3509
+ if (valStr.length > maxLen) {
3510
+ maxLen = valStr.length;
3511
+ }
3512
+ }
3513
+ const estimatedWidth = Math.min(600, Math.max(50, Math.ceil(maxLen * 8.5 + 32)));
3514
+ this.setColumnWidth(colId, estimatedWidth);
3515
+ }
2425
3516
  // --- Clipboard TSV/CSV ---
2426
3517
  exportToTsv() {
2427
3518
  return this.document.rows.map(
@@ -2495,6 +3586,7 @@ export {
2495
3586
  GradientText,
2496
3587
  INSTRUCTION_REGEX,
2497
3588
  LoadingNode,
3589
+ Markdown2 as Markdown,
2498
3590
  Mention,
2499
3591
  SlashCommands,
2500
3592
  SmilieReplacer,
@@ -2513,6 +3605,7 @@ export {
2513
3605
  extractTemplateNames,
2514
3606
  extractVariableNames,
2515
3607
  findHexColors,
3608
+ getEditorMarkdown,
2516
3609
  getEditorText,
2517
3610
  getLatestVersion,
2518
3611
  htmlToPlainText,
@@ -2520,6 +3613,7 @@ export {
2520
3613
  instructionRegex,
2521
3614
  mapRawOffsetToResolved,
2522
3615
  mapResolvedOffsetToRaw,
3616
+ markdownToTipTapHtml,
2523
3617
  parseCellReference,
2524
3618
  parseFormula,
2525
3619
  parseRange,