@kedataindo/docflow-plugins 0.0.88 → 0.0.89

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.cjs CHANGED
@@ -47,10 +47,18 @@ __export(index_exports, {
47
47
  LocationChipNode: () => LocationChipNode,
48
48
  PageBreak: () => PageBreak,
49
49
  PeopleChipNode: () => PeopleChipNode,
50
+ SUGGESTION_DELETE: () => SUGGESTION_DELETE,
51
+ SUGGESTION_FORMAT: () => SUGGESTION_FORMAT,
52
+ SUGGESTION_INSERT: () => SUGGESTION_INSERT,
50
53
  SlashMenuExtension: () => SlashMenuExtension,
54
+ SuggestionDeleteMark: () => SuggestionDeleteMark,
55
+ SuggestionFormatMark: () => SuggestionFormatMark,
56
+ SuggestionInsertMark: () => SuggestionInsertMark,
51
57
  TocEntryNode: () => TocEntryNode,
52
58
  TocNode: () => TocNode,
53
59
  TocPageNumNode: () => TocPageNumNode,
60
+ acceptAllSuggestions: () => acceptAllSuggestions,
61
+ acceptSuggestion: () => acceptSuggestion,
54
62
  aiPlugin: () => aiPlugin,
55
63
  aiPluginKey: () => aiPluginKey,
56
64
  alignmentPlugin: () => alignmentPlugin,
@@ -67,6 +75,7 @@ __export(index_exports, {
67
75
  formattingPlugin: () => formattingPlugin,
68
76
  getAIPreview: () => getAIPreview,
69
77
  getCitationEngine: () => getCitationEngine,
78
+ getSuggestions: () => getSuggestions,
70
79
  headingsPlugin: () => headingsPlugin,
71
80
  highlightPlugin: () => highlightPlugin,
72
81
  imagePlugin: () => imagePlugin,
@@ -80,10 +89,15 @@ __export(index_exports, {
80
89
  placeholderPlugin: () => placeholderPlugin,
81
90
  regenerateToc: () => regenerateToc,
82
91
  registerSlashCommands: () => registerSlashCommands,
92
+ rejectAllSuggestions: () => rejectAllSuggestions,
93
+ rejectSuggestion: () => rejectSuggestion,
83
94
  sanitizeCiteprocHtml: () => sanitizeCiteprocHtml,
95
+ setDocumentMode: () => setDocumentMode,
96
+ setSuggestionAuthor: () => setSuggestionAuthor,
84
97
  slashMenuPlugin: () => slashMenuPlugin,
85
98
  slashState: () => slashState,
86
99
  smartElementsPlugin: () => smartElementsPlugin,
100
+ suggestChangesPlugin: () => suggestChangesPlugin,
87
101
  tablePageSplitPlugin: () => tablePageSplitPlugin,
88
102
  tablePlugin: () => tablePlugin,
89
103
  textColorPlugin: () => textColorPlugin,
@@ -2883,9 +2897,394 @@ var commentPlugin = {
2883
2897
  commands: {}
2884
2898
  };
2885
2899
 
2886
- // src/smartElements.ts
2900
+ // src/suggestChanges.ts
2887
2901
  var import_core11 = require("@tiptap/core");
2902
+ var import_state3 = require("@tiptap/pm/state");
2903
+ var import_transform2 = require("@tiptap/pm/transform");
2888
2904
  var import_docflow_core19 = require("@kedataindo/docflow-core");
2905
+ var SUGGESTION_INSERT = "suggestionInsert";
2906
+ var SUGGESTION_DELETE = "suggestionDelete";
2907
+ var SUGGESTION_FORMAT = "suggestionFormat";
2908
+ var FORMAT_MARKS = /* @__PURE__ */ new Set(["bold", "italic", "underline", "strike", "highlight"]);
2909
+ var SUGGEST_APPLIED_META = "suggestChanges:applied";
2910
+ var suggestChangesKey = new import_state3.PluginKey("suggestChanges");
2911
+ var suggestionAttributes = () => ({
2912
+ suggestionId: {
2913
+ default: null,
2914
+ parseHTML: (el) => el.getAttribute("data-suggestion-id"),
2915
+ renderHTML: (attrs) => attrs.suggestionId ? { "data-suggestion-id": attrs.suggestionId } : {}
2916
+ },
2917
+ authorId: {
2918
+ default: null,
2919
+ parseHTML: (el) => el.getAttribute("data-suggestion-author"),
2920
+ renderHTML: (attrs) => attrs.authorId ? { "data-suggestion-author": attrs.authorId } : {}
2921
+ },
2922
+ authorName: { default: null },
2923
+ createdAt: { default: null }
2924
+ });
2925
+ var SuggestionInsertMark = import_core11.Mark.create({
2926
+ name: SUGGESTION_INSERT,
2927
+ addAttributes() {
2928
+ return suggestionAttributes();
2929
+ },
2930
+ parseHTML() {
2931
+ return [{ tag: 'span[data-suggestion="insert"]' }];
2932
+ },
2933
+ renderHTML({ HTMLAttributes }) {
2934
+ return [
2935
+ "span",
2936
+ (0, import_core11.mergeAttributes)(HTMLAttributes, {
2937
+ "data-suggestion": "insert",
2938
+ class: "docflow-suggestion docflow-suggestion--insert"
2939
+ }),
2940
+ 0
2941
+ ];
2942
+ }
2943
+ });
2944
+ var SuggestionDeleteMark = import_core11.Mark.create({
2945
+ name: SUGGESTION_DELETE,
2946
+ addAttributes() {
2947
+ return suggestionAttributes();
2948
+ },
2949
+ parseHTML() {
2950
+ return [{ tag: 'span[data-suggestion="delete"]' }];
2951
+ },
2952
+ renderHTML({ HTMLAttributes }) {
2953
+ return [
2954
+ "span",
2955
+ (0, import_core11.mergeAttributes)(HTMLAttributes, {
2956
+ "data-suggestion": "delete",
2957
+ class: "docflow-suggestion docflow-suggestion--delete"
2958
+ }),
2959
+ 0
2960
+ ];
2961
+ }
2962
+ });
2963
+ var SuggestionFormatMark = import_core11.Mark.create({
2964
+ name: SUGGESTION_FORMAT,
2965
+ addAttributes() {
2966
+ return {
2967
+ ...suggestionAttributes(),
2968
+ format: {
2969
+ default: null,
2970
+ parseHTML: (el) => el.getAttribute("data-suggestion-format"),
2971
+ renderHTML: (attrs) => attrs.format ? { "data-suggestion-format": attrs.format } : {}
2972
+ },
2973
+ delta: { default: "add" }
2974
+ };
2975
+ },
2976
+ parseHTML() {
2977
+ return [{ tag: 'span[data-suggestion="format"]' }];
2978
+ },
2979
+ renderHTML({ HTMLAttributes }) {
2980
+ return [
2981
+ "span",
2982
+ (0, import_core11.mergeAttributes)(HTMLAttributes, {
2983
+ "data-suggestion": "format",
2984
+ class: "docflow-suggestion docflow-suggestion--format"
2985
+ }),
2986
+ 0
2987
+ ];
2988
+ }
2989
+ });
2990
+ var suggestionSeq = 0;
2991
+ var newSuggestionId = () => {
2992
+ suggestionSeq += 1;
2993
+ return `sug-${Date.now().toString(36)}-${suggestionSeq.toString(36)}`;
2994
+ };
2995
+ var adjacentRunId = (editorState, pos, markName) => {
2996
+ if (pos <= 0) return null;
2997
+ const before = editorState.doc.resolve(pos).nodeBefore;
2998
+ if (!before || !before.isText) return null;
2999
+ const mark = before.marks.find((m) => m.type.name === markName);
3000
+ return mark?.attrs.suggestionId ?? null;
3001
+ };
3002
+ var markAttrs = (id, author) => ({
3003
+ suggestionId: id,
3004
+ authorId: author.id ?? null,
3005
+ authorName: author.name ?? null,
3006
+ createdAt: Date.now()
3007
+ });
3008
+ var collectRanges = (doc, markName, id) => {
3009
+ const out = [];
3010
+ doc.descendants((node, pos) => {
3011
+ if (!node.isText || node.marks.length === 0) return;
3012
+ for (const mark of node.marks) {
3013
+ if (mark.type.name !== markName) continue;
3014
+ if (id && mark.attrs.suggestionId !== id) continue;
3015
+ out.push({ from: pos, to: pos + node.nodeSize, attrs: mark.attrs });
3016
+ }
3017
+ });
3018
+ return out;
3019
+ };
3020
+ var SuggestChanges = import_core11.Extension.create({
3021
+ name: "suggestChanges",
3022
+ addStorage() {
3023
+ return { suggestions: [] };
3024
+ },
3025
+ addProseMirrorPlugins() {
3026
+ const editor = this.editor;
3027
+ const syncStorage = () => {
3028
+ const storage = editor.storage.suggestChanges;
3029
+ if (storage) storage.suggestions = getSuggestions(editor);
3030
+ };
3031
+ return [
3032
+ new import_state3.Plugin({
3033
+ key: suggestChangesKey,
3034
+ state: {
3035
+ init: () => ({ mode: "editing", author: {} }),
3036
+ apply: (tr, value) => {
3037
+ const meta = tr.getMeta(suggestChangesKey);
3038
+ if (!meta) return value;
3039
+ return {
3040
+ mode: meta.mode ?? value.mode,
3041
+ author: meta.author ?? value.author
3042
+ };
3043
+ }
3044
+ },
3045
+ view: () => {
3046
+ syncStorage();
3047
+ return { update: syncStorage };
3048
+ },
3049
+ appendTransaction: (transactions, _oldState, newState) => {
3050
+ if (transactions.some((tr2) => tr2.getMeta(SUGGEST_APPLIED_META))) return null;
3051
+ const current = suggestChangesKey.getState(newState);
3052
+ if (current?.mode !== "suggesting") return null;
3053
+ const formatMark = newState.schema.marks[SUGGESTION_FORMAT];
3054
+ if (!formatMark) return null;
3055
+ const changes = [];
3056
+ for (const tr2 of transactions) {
3057
+ for (const step of tr2.steps) {
3058
+ if (step instanceof import_transform2.AddMarkStep || step instanceof import_transform2.RemoveMarkStep) {
3059
+ if (!FORMAT_MARKS.has(step.mark.type.name)) continue;
3060
+ changes.push({ from: step.from, to: step.to, name: step.mark.type.name, add: step instanceof import_transform2.AddMarkStep });
3061
+ }
3062
+ }
3063
+ }
3064
+ if (changes.length === 0) return null;
3065
+ const tr = newState.tr;
3066
+ for (const change of changes) {
3067
+ const target = newState.schema.marks[change.name];
3068
+ if (!target) continue;
3069
+ if (change.add) tr.removeMark(change.from, change.to, target);
3070
+ else tr.addMark(change.from, change.to, target.create());
3071
+ tr.addMark(
3072
+ change.from,
3073
+ change.to,
3074
+ formatMark.create({ ...markAttrs(newSuggestionId(), current.author), format: change.name, delta: change.add ? "add" : "remove" })
3075
+ );
3076
+ }
3077
+ tr.setMeta(SUGGEST_APPLIED_META, true);
3078
+ return tr;
3079
+ },
3080
+ props: {
3081
+ handleTextInput: (view, from, to, text) => {
3082
+ const current = suggestChangesKey.getState(view.state);
3083
+ if (current?.mode !== "suggesting" || !text) return false;
3084
+ const insert = view.state.schema.marks[SUGGESTION_INSERT];
3085
+ const del = view.state.schema.marks[SUGGESTION_DELETE];
3086
+ if (!insert || !del) return false;
3087
+ const id = adjacentRunId(view.state, from, SUGGESTION_INSERT) ?? newSuggestionId();
3088
+ const tr = view.state.tr;
3089
+ if (to > from) tr.addMark(from, to, del.create(markAttrs(id, current.author)));
3090
+ const insertAt = to;
3091
+ tr.insertText(text, insertAt, insertAt);
3092
+ tr.addMark(insertAt, insertAt + text.length, insert.create(markAttrs(id, current.author)));
3093
+ view.dispatch(tr);
3094
+ return true;
3095
+ },
3096
+ handleKeyDown: (view, event) => {
3097
+ const current = suggestChangesKey.getState(view.state);
3098
+ if (current?.mode !== "suggesting") return false;
3099
+ if (event.key !== "Backspace" && event.key !== "Delete") return false;
3100
+ const del = view.state.schema.marks[SUGGESTION_DELETE];
3101
+ if (!del) return false;
3102
+ const { selection, doc } = view.state;
3103
+ let from;
3104
+ let to;
3105
+ if (!selection.empty) {
3106
+ from = selection.from;
3107
+ to = selection.to;
3108
+ } else if (event.key === "Backspace") {
3109
+ if (selection.from <= 1) return false;
3110
+ from = selection.from - 1;
3111
+ to = selection.from;
3112
+ } else {
3113
+ if (selection.to >= doc.content.size - 1) return false;
3114
+ from = selection.to;
3115
+ to = selection.to + 1;
3116
+ }
3117
+ const id = adjacentRunId(view.state, from, SUGGESTION_DELETE) ?? newSuggestionId();
3118
+ const tr = view.state.tr.addMark(from, to, del.create(markAttrs(id, current.author)));
3119
+ if (event.key === "Backspace" && selection.empty) {
3120
+ tr.setSelection(import_state3.TextSelection.create(tr.doc, from));
3121
+ }
3122
+ view.dispatch(tr);
3123
+ return true;
3124
+ },
3125
+ handlePaste: (view, _event, slice) => {
3126
+ const current = suggestChangesKey.getState(view.state);
3127
+ if (current?.mode !== "suggesting") return false;
3128
+ const insert = view.state.schema.marks[SUGGESTION_INSERT];
3129
+ const del = view.state.schema.marks[SUGGESTION_DELETE];
3130
+ if (!insert || !del) return false;
3131
+ const { from, to } = view.state.selection;
3132
+ const id = adjacentRunId(view.state, from, SUGGESTION_INSERT) ?? newSuggestionId();
3133
+ const tr = view.state.tr;
3134
+ if (to > from) tr.addMark(from, to, del.create(markAttrs(id, current.author)));
3135
+ const insertAt = to;
3136
+ tr.insert(insertAt, slice.content);
3137
+ tr.addMark(insertAt, insertAt + slice.content.size, insert.create(markAttrs(id, current.author)));
3138
+ view.dispatch(tr);
3139
+ return true;
3140
+ }
3141
+ }
3142
+ })
3143
+ ];
3144
+ },
3145
+ addCommands() {
3146
+ return {
3147
+ setDocumentMode: (mode) => ({ state, dispatch }) => {
3148
+ if (!dispatch) return false;
3149
+ dispatch(state.tr.setMeta(suggestChangesKey, { mode }));
3150
+ return true;
3151
+ },
3152
+ setSuggestionAuthor: (author) => ({ state, dispatch }) => {
3153
+ if (!dispatch) return false;
3154
+ dispatch(state.tr.setMeta(suggestChangesKey, { author }));
3155
+ return true;
3156
+ },
3157
+ acceptSuggestion: (id) => ({ state, dispatch }) => {
3158
+ const tr = buildResolveTr(state, true, id);
3159
+ if (!tr || !dispatch) return false;
3160
+ dispatch(tr);
3161
+ return true;
3162
+ },
3163
+ rejectSuggestion: (id) => ({ state, dispatch }) => {
3164
+ const tr = buildResolveTr(state, false, id);
3165
+ if (!tr || !dispatch) return false;
3166
+ dispatch(tr);
3167
+ return true;
3168
+ },
3169
+ acceptAllSuggestions: () => ({ state, dispatch }) => {
3170
+ const tr = buildResolveTr(state, true);
3171
+ if (!tr || !dispatch) return false;
3172
+ dispatch(tr);
3173
+ return true;
3174
+ },
3175
+ rejectAllSuggestions: () => ({ state, dispatch }) => {
3176
+ const tr = buildResolveTr(state, false);
3177
+ if (!tr || !dispatch) return false;
3178
+ dispatch(tr);
3179
+ return true;
3180
+ }
3181
+ };
3182
+ }
3183
+ });
3184
+ function editorDispatch(editor, meta) {
3185
+ editor.view.dispatch(editor.state.tr.setMeta(suggestChangesKey, meta));
3186
+ }
3187
+ function setDocumentMode(editor, mode) {
3188
+ editorDispatch(editor, { mode });
3189
+ return true;
3190
+ }
3191
+ function setSuggestionAuthor(editor, author) {
3192
+ editorDispatch(editor, { author });
3193
+ return true;
3194
+ }
3195
+ function getSuggestions(editor) {
3196
+ const byId = /* @__PURE__ */ new Map();
3197
+ const scan = (markName, type) => {
3198
+ editor.state.doc.descendants((node, pos) => {
3199
+ if (!node.isText) return;
3200
+ for (const mark of node.marks) {
3201
+ if (mark.type.name !== markName) continue;
3202
+ const id = mark.attrs.suggestionId;
3203
+ const existing = byId.get(id);
3204
+ if (existing) {
3205
+ existing.from = Math.min(existing.from, pos);
3206
+ existing.to = Math.max(existing.to, pos + node.nodeSize);
3207
+ } else {
3208
+ byId.set(id, {
3209
+ id,
3210
+ type,
3211
+ authorId: mark.attrs.authorId ?? null,
3212
+ authorName: mark.attrs.authorName ?? null,
3213
+ from: pos,
3214
+ to: pos + node.nodeSize,
3215
+ ...type === "format" ? {
3216
+ format: mark.attrs.format ?? void 0,
3217
+ delta: mark.attrs.delta ?? void 0
3218
+ } : {}
3219
+ });
3220
+ }
3221
+ }
3222
+ });
3223
+ };
3224
+ scan(SUGGESTION_INSERT, "insert");
3225
+ scan(SUGGESTION_DELETE, "delete");
3226
+ scan(SUGGESTION_FORMAT, "format");
3227
+ return [...byId.values()].sort((a, b) => a.from - b.from);
3228
+ }
3229
+ function buildResolveTr(state, accept, id) {
3230
+ const { schema } = state;
3231
+ const insertMark = schema.marks[SUGGESTION_INSERT];
3232
+ const deleteMark = schema.marks[SUGGESTION_DELETE];
3233
+ const formatMark = schema.marks[SUGGESTION_FORMAT];
3234
+ if (!insertMark || !deleteMark) return null;
3235
+ const insertRanges = collectRanges(state.doc, SUGGESTION_INSERT, id);
3236
+ const deleteRanges = collectRanges(state.doc, SUGGESTION_DELETE, id);
3237
+ const formatRanges = formatMark ? collectRanges(state.doc, SUGGESTION_FORMAT, id) : [];
3238
+ if (insertRanges.length === 0 && deleteRanges.length === 0 && formatRanges.length === 0) return null;
3239
+ const tr = state.tr;
3240
+ for (const range of formatRanges) {
3241
+ if (accept) {
3242
+ const target = schema.marks[range.attrs.format];
3243
+ if (target) {
3244
+ if (range.attrs.delta === "remove") tr.removeMark(range.from, range.to, target);
3245
+ else tr.addMark(range.from, range.to, target.create());
3246
+ }
3247
+ }
3248
+ if (formatMark) tr.removeMark(range.from, range.to, formatMark);
3249
+ }
3250
+ const rangesToUnmark = accept ? insertRanges : deleteRanges;
3251
+ const markToRemove = accept ? insertMark : deleteMark;
3252
+ const rangesToDelete = accept ? deleteRanges : insertRanges;
3253
+ for (const range of rangesToUnmark) {
3254
+ tr.removeMark(range.from, range.to, markToRemove);
3255
+ }
3256
+ for (const range of [...rangesToDelete].sort((a, b) => b.from - a.from)) {
3257
+ tr.delete(range.from, range.to);
3258
+ }
3259
+ tr.setMeta(SUGGEST_APPLIED_META, true);
3260
+ return tr.docChanged ? tr : null;
3261
+ }
3262
+ function resolveSuggestions(editor, accept, id) {
3263
+ const tr = buildResolveTr(editor.state, accept, id);
3264
+ if (!tr) return false;
3265
+ editor.view.dispatch(tr);
3266
+ return true;
3267
+ }
3268
+ var acceptSuggestion = (editor, id) => resolveSuggestions(editor, true, id);
3269
+ var rejectSuggestion = (editor, id) => resolveSuggestions(editor, false, id);
3270
+ var acceptAllSuggestions = (editor) => resolveSuggestions(editor, true);
3271
+ var rejectAllSuggestions = (editor) => resolveSuggestions(editor, false);
3272
+ var suggestChangesPlugin = (0, import_docflow_core19.definePlugin)({
3273
+ id: "suggestChanges",
3274
+ tiptapExtensions: [SuggestionInsertMark, SuggestionDeleteMark, SuggestionFormatMark, SuggestChanges],
3275
+ commands: {
3276
+ setDocumentMode: (editor, ...args) => setDocumentMode(editor, args[0]),
3277
+ setSuggestionAuthor: (editor, ...args) => setSuggestionAuthor(editor, args[0] ?? {}),
3278
+ acceptSuggestion: (editor, ...args) => acceptSuggestion(editor, args[0]),
3279
+ rejectSuggestion: (editor, ...args) => rejectSuggestion(editor, args[0]),
3280
+ acceptAllSuggestions: (editor) => acceptAllSuggestions(editor),
3281
+ rejectAllSuggestions: (editor) => rejectAllSuggestions(editor)
3282
+ }
3283
+ });
3284
+
3285
+ // src/smartElements.ts
3286
+ var import_core12 = require("@tiptap/core");
3287
+ var import_docflow_core20 = require("@kedataindo/docflow-core");
2889
3288
  function todayISO() {
2890
3289
  return (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
2891
3290
  }
@@ -2902,7 +3301,7 @@ var DEFAULT_STATUSES = ["To Do", "In Progress", "Review", "Approved"];
2902
3301
  function slugify(s) {
2903
3302
  return s.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
2904
3303
  }
2905
- var DateChipNode = import_core11.Node.create({
3304
+ var DateChipNode = import_core12.Node.create({
2906
3305
  name: "dateChip",
2907
3306
  group: "inline",
2908
3307
  inline: true,
@@ -2922,7 +3321,7 @@ var DateChipNode = import_core11.Node.create({
2922
3321
  return [{ tag: 'span[data-node-type="date-chip"]' }];
2923
3322
  },
2924
3323
  renderHTML({ node, HTMLAttributes }) {
2925
- return ["span", (0, import_core11.mergeAttributes)(HTMLAttributes, {
3324
+ return ["span", (0, import_core12.mergeAttributes)(HTMLAttributes, {
2926
3325
  "data-node-type": "date-chip",
2927
3326
  class: "docs-chip docs-chip--date"
2928
3327
  }), formatDate(node.attrs.date)];
@@ -2975,7 +3374,7 @@ var DateChipNode = import_core11.Node.create({
2975
3374
  };
2976
3375
  }
2977
3376
  });
2978
- var PeopleChipNode = import_core11.Node.create({
3377
+ var PeopleChipNode = import_core12.Node.create({
2979
3378
  name: "peopleChip",
2980
3379
  group: "inline",
2981
3380
  inline: true,
@@ -3000,7 +3399,7 @@ var PeopleChipNode = import_core11.Node.create({
3000
3399
  return [{ tag: 'span[data-node-type="people-chip"]' }];
3001
3400
  },
3002
3401
  renderHTML({ node, HTMLAttributes }) {
3003
- return ["span", (0, import_core11.mergeAttributes)(HTMLAttributes, {
3402
+ return ["span", (0, import_core12.mergeAttributes)(HTMLAttributes, {
3004
3403
  "data-node-type": "people-chip",
3005
3404
  class: "docs-chip docs-chip--people"
3006
3405
  }), `@${node.attrs.name || "user"}`];
@@ -3037,7 +3436,7 @@ var PeopleChipNode = import_core11.Node.create({
3037
3436
  };
3038
3437
  }
3039
3438
  });
3040
- var FileChipNode = import_core11.Node.create({
3439
+ var FileChipNode = import_core12.Node.create({
3041
3440
  name: "fileChip",
3042
3441
  group: "inline",
3043
3442
  inline: true,
@@ -3062,7 +3461,7 @@ var FileChipNode = import_core11.Node.create({
3062
3461
  return [{ tag: 'span[data-node-type="file-chip"]' }];
3063
3462
  },
3064
3463
  renderHTML({ node, HTMLAttributes }) {
3065
- return ["span", (0, import_core11.mergeAttributes)(HTMLAttributes, {
3464
+ return ["span", (0, import_core12.mergeAttributes)(HTMLAttributes, {
3066
3465
  "data-node-type": "file-chip",
3067
3466
  class: "docs-chip docs-chip--file"
3068
3467
  }), node.attrs.name || "file"];
@@ -3099,7 +3498,7 @@ var FileChipNode = import_core11.Node.create({
3099
3498
  };
3100
3499
  }
3101
3500
  });
3102
- var DropdownChipNode = import_core11.Node.create({
3501
+ var DropdownChipNode = import_core12.Node.create({
3103
3502
  name: "dropdownChip",
3104
3503
  group: "inline",
3105
3504
  inline: true,
@@ -3130,7 +3529,7 @@ var DropdownChipNode = import_core11.Node.create({
3130
3529
  return [{ tag: 'span[data-node-type="dropdown-chip"]' }];
3131
3530
  },
3132
3531
  renderHTML({ node, HTMLAttributes }) {
3133
- return ["span", (0, import_core11.mergeAttributes)(HTMLAttributes, {
3532
+ return ["span", (0, import_core12.mergeAttributes)(HTMLAttributes, {
3134
3533
  "data-node-type": "dropdown-chip",
3135
3534
  class: "docs-chip docs-chip--dropdown"
3136
3535
  }), node.attrs.selected || ""];
@@ -3182,7 +3581,7 @@ var DropdownChipNode = import_core11.Node.create({
3182
3581
  };
3183
3582
  }
3184
3583
  });
3185
- var LocationChipNode = import_core11.Node.create({
3584
+ var LocationChipNode = import_core12.Node.create({
3186
3585
  name: "locationChip",
3187
3586
  group: "inline",
3188
3587
  inline: true,
@@ -3218,7 +3617,7 @@ var LocationChipNode = import_core11.Node.create({
3218
3617
  return [{ tag: 'span[data-node-type="location-chip"]' }];
3219
3618
  },
3220
3619
  renderHTML({ node, HTMLAttributes }) {
3221
- return ["span", (0, import_core11.mergeAttributes)(HTMLAttributes, {
3620
+ return ["span", (0, import_core12.mergeAttributes)(HTMLAttributes, {
3222
3621
  "data-node-type": "location-chip",
3223
3622
  class: "docs-chip docs-chip--location"
3224
3623
  }), node.attrs.label || ""];
@@ -3255,7 +3654,7 @@ var LocationChipNode = import_core11.Node.create({
3255
3654
  };
3256
3655
  }
3257
3656
  });
3258
- var smartElementsPlugin = (0, import_docflow_core19.definePlugin)({
3657
+ var smartElementsPlugin = (0, import_docflow_core20.definePlugin)({
3259
3658
  id: "smart-elements",
3260
3659
  tiptapExtensions: [
3261
3660
  DateChipNode,
@@ -3314,10 +3713,10 @@ var smartElementsPlugin = (0, import_docflow_core19.definePlugin)({
3314
3713
  });
3315
3714
 
3316
3715
  // src/tablePageSplit.ts
3317
- var import_docflow_core20 = require("@kedataindo/docflow-core");
3318
- var import_core12 = require("@tiptap/core");
3319
- var import_state3 = require("@tiptap/pm/state");
3320
- var PLUGIN_KEY = new import_state3.PluginKey("docflow/table-page-split");
3716
+ var import_docflow_core21 = require("@kedataindo/docflow-core");
3717
+ var import_core13 = require("@tiptap/core");
3718
+ var import_state4 = require("@tiptap/pm/state");
3719
+ var PLUGIN_KEY = new import_state4.PluginKey("docflow/table-page-split");
3321
3720
  var SPLIT_MARK = "head";
3322
3721
  var MAX_SPLIT_DEPTH = 16;
3323
3722
  function readPageContentHeightPx(view, editor) {
@@ -3494,7 +3893,7 @@ function runSplitPass(view, editor) {
3494
3893
  tr.setMeta(PLUGIN_KEY, { splitAtRow: -1 });
3495
3894
  v.dispatch(tr);
3496
3895
  }
3497
- var TablePageSplitExtension = import_core12.Extension.create({
3896
+ var TablePageSplitExtension = import_core13.Extension.create({
3498
3897
  name: "tablePageSplit",
3499
3898
  addProseMirrorPlugins() {
3500
3899
  let viewRef = null;
@@ -3502,7 +3901,7 @@ var TablePageSplitExtension = import_core12.Extension.create({
3502
3901
  const ext = this;
3503
3902
  const editorRef = ext.editor ?? null;
3504
3903
  return [
3505
- new import_state3.Plugin({
3904
+ new import_state4.Plugin({
3506
3905
  key: PLUGIN_KEY,
3507
3906
  view(_editorView) {
3508
3907
  viewRef = _editorView;
@@ -3534,15 +3933,15 @@ var TablePageSplitExtension = import_core12.Extension.create({
3534
3933
  ];
3535
3934
  }
3536
3935
  });
3537
- var tablePageSplitPlugin = (0, import_docflow_core20.definePlugin)({
3936
+ var tablePageSplitPlugin = (0, import_docflow_core21.definePlugin)({
3538
3937
  id: "tablePageSplit",
3539
3938
  tiptapExtensions: [TablePageSplitExtension]
3540
3939
  });
3541
3940
 
3542
3941
  // src/slashMenu.ts
3543
- var import_core13 = require("@tiptap/core");
3544
- var import_state4 = require("@tiptap/pm/state");
3545
- var import_docflow_core21 = require("@kedataindo/docflow-core");
3942
+ var import_core14 = require("@tiptap/core");
3943
+ var import_state5 = require("@tiptap/pm/state");
3944
+ var import_docflow_core22 = require("@kedataindo/docflow-core");
3546
3945
  var slashState = {
3547
3946
  open: false,
3548
3947
  query: "",
@@ -3596,12 +3995,12 @@ function getRegisteredCommands() {
3596
3995
  return true;
3597
3996
  });
3598
3997
  }
3599
- var SlashMenuExtension = import_core13.Extension.create({
3998
+ var SlashMenuExtension = import_core14.Extension.create({
3600
3999
  name: "slashMenu",
3601
4000
  addProseMirrorPlugins() {
3602
4001
  return [
3603
- new import_state4.Plugin({
3604
- key: new import_state4.PluginKey("slashMenu"),
4002
+ new import_state5.Plugin({
4003
+ key: new import_state5.PluginKey("slashMenu"),
3605
4004
  props: {
3606
4005
  handleTextInput(view, from, _to, text) {
3607
4006
  if (text === "/") {
@@ -3687,7 +4086,7 @@ var SlashMenuExtension = import_core13.Extension.create({
3687
4086
  ];
3688
4087
  }
3689
4088
  });
3690
- var slashMenuPlugin = (0, import_docflow_core21.definePlugin)({
4089
+ var slashMenuPlugin = (0, import_docflow_core22.definePlugin)({
3691
4090
  id: "slash-menu",
3692
4091
  tiptapExtensions: [SlashMenuExtension],
3693
4092
  hooks: {
@@ -3720,6 +4119,7 @@ var defaultPlugins = [
3720
4119
  citationPlugin,
3721
4120
  aiPlugin,
3722
4121
  commentPlugin,
4122
+ suggestChangesPlugin,
3723
4123
  smartElementsPlugin
3724
4124
  ];
3725
4125
  // Annotate the CommonJS export names for ESM import in node:
@@ -3741,10 +4141,18 @@ var defaultPlugins = [
3741
4141
  LocationChipNode,
3742
4142
  PageBreak,
3743
4143
  PeopleChipNode,
4144
+ SUGGESTION_DELETE,
4145
+ SUGGESTION_FORMAT,
4146
+ SUGGESTION_INSERT,
3744
4147
  SlashMenuExtension,
4148
+ SuggestionDeleteMark,
4149
+ SuggestionFormatMark,
4150
+ SuggestionInsertMark,
3745
4151
  TocEntryNode,
3746
4152
  TocNode,
3747
4153
  TocPageNumNode,
4154
+ acceptAllSuggestions,
4155
+ acceptSuggestion,
3748
4156
  aiPlugin,
3749
4157
  aiPluginKey,
3750
4158
  alignmentPlugin,
@@ -3761,6 +4169,7 @@ var defaultPlugins = [
3761
4169
  formattingPlugin,
3762
4170
  getAIPreview,
3763
4171
  getCitationEngine,
4172
+ getSuggestions,
3764
4173
  headingsPlugin,
3765
4174
  highlightPlugin,
3766
4175
  imagePlugin,
@@ -3774,10 +4183,15 @@ var defaultPlugins = [
3774
4183
  placeholderPlugin,
3775
4184
  regenerateToc,
3776
4185
  registerSlashCommands,
4186
+ rejectAllSuggestions,
4187
+ rejectSuggestion,
3777
4188
  sanitizeCiteprocHtml,
4189
+ setDocumentMode,
4190
+ setSuggestionAuthor,
3778
4191
  slashMenuPlugin,
3779
4192
  slashState,
3780
4193
  smartElementsPlugin,
4194
+ suggestChangesPlugin,
3781
4195
  tablePageSplitPlugin,
3782
4196
  tablePlugin,
3783
4197
  textColorPlugin,