@limetech/lime-elements 37.76.1 → 37.76.3

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/limel-prosemirror-adapter.cjs.entry.js +93 -117
  3. package/dist/cjs/limel-prosemirror-adapter.cjs.entry.js.map +1 -1
  4. package/dist/cjs/limel-text-editor.cjs.entry.js.map +1 -1
  5. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link-plugin.js +1 -1
  6. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link-plugin.js.map +1 -1
  7. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/append-transaction-handler.js +18 -0
  8. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/append-transaction-handler.js.map +1 -0
  9. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/detect-trigger-removal.js +26 -0
  10. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/detect-trigger-removal.js.map +1 -0
  11. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/get-trigger-event-detail.js +10 -0
  12. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/get-trigger-event-detail.js.map +1 -0
  13. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/monitor-triggered-text.js +11 -0
  14. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/monitor-triggered-text.js.map +1 -0
  15. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/send-trigger-event.js +10 -0
  16. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/send-trigger-event.js.map +1 -0
  17. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/text-input-handler.js +20 -0
  18. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/text-input-handler.js.map +1 -0
  19. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory.js +18 -123
  20. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory.js.map +1 -1
  21. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/inserter.js +6 -11
  22. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/inserter.js.map +1 -1
  23. package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js +1 -1
  24. package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js.map +1 -1
  25. package/dist/collection/components/text-editor/text-editor.js +1 -1
  26. package/dist/collection/components/text-editor/text-editor.js.map +1 -1
  27. package/dist/collection/components/text-editor/text-editor.types.js.map +1 -1
  28. package/dist/esm/limel-prosemirror-adapter.entry.js +93 -117
  29. package/dist/esm/limel-prosemirror-adapter.entry.js.map +1 -1
  30. package/dist/esm/limel-text-editor.entry.js.map +1 -1
  31. package/dist/lime-elements/lime-elements.esm.js +1 -1
  32. package/dist/lime-elements/{p-4c79b891.entry.js → p-1db8aa67.entry.js} +2 -2
  33. package/dist/lime-elements/p-1db8aa67.entry.js.map +1 -0
  34. package/dist/lime-elements/p-9fae6488.entry.js.map +1 -1
  35. package/dist/types/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/append-transaction-handler.d.ts +6 -0
  36. package/dist/types/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/detect-trigger-removal.d.ts +6 -0
  37. package/dist/types/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/get-trigger-event-detail.d.ts +5 -0
  38. package/dist/types/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/monitor-triggered-text.d.ts +5 -0
  39. package/dist/types/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/send-trigger-event.d.ts +5 -0
  40. package/dist/types/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/text-input-handler.d.ts +5 -0
  41. package/dist/types/components/text-editor/prosemirror-adapter/plugins/trigger/inserter.d.ts +2 -2
  42. package/dist/types/components/text-editor/text-editor.d.ts +1 -1
  43. package/dist/types/components/text-editor/text-editor.types.d.ts +11 -0
  44. package/dist/types/components.d.ts +4 -4
  45. package/package.json +6 -6
  46. package/dist/lime-elements/p-4c79b891.entry.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## [37.76.3](https://github.com/Lundalogik/lime-elements/compare/v37.76.2...v37.76.3) (2024-12-18)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+
7
+ * **text-editor:** avoid occasional null reference error ([26860c4](https://github.com/Lundalogik/lime-elements/commit/26860c4a7b6e27a2de5ba5ca6271216877656bdf))
8
+
9
+ ## [37.76.2](https://github.com/Lundalogik/lime-elements/compare/v37.76.1...v37.76.2) (2024-12-17)
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+
15
+ * **text-editor:** fix triggers not working on iOS and on text-editor inside form ([5e7eaa3](https://github.com/Lundalogik/lime-elements/commit/5e7eaa3fe4eb56801a6400a74389b6c55a317fc8)), closes [Lundalogik/crm-feature#4498](https://github.com/Lundalogik/crm-feature/issues/4498) [Lundalogik/limepkg-email#1273](https://github.com/Lundalogik/limepkg-email/issues/1273)
16
+
1
17
  ## [37.76.1](https://github.com/Lundalogik/lime-elements/compare/v37.76.0...v37.76.1) (2024-12-12)
2
18
 
3
19
 
@@ -25814,7 +25814,7 @@ const findEnd = (doc, pos, href) => {
25814
25814
  */
25815
25815
  const getLinkDataAtPosition = (view, event) => {
25816
25816
  const pos = view.posAtCoords({ left: event.clientX, top: event.clientY });
25817
- const node = view.state.doc.nodeAt(pos.pos);
25817
+ const node = view.state.doc.nodeAt(pos === null || pos === void 0 ? void 0 : pos.pos);
25818
25818
  if (!node) {
25819
25819
  return null;
25820
25820
  }
@@ -26135,15 +26135,14 @@ const createHtmlInserter = (view, contentConverter, startPos, dispatchTransactio
26135
26135
  };
26136
26136
  };
26137
26137
 
26138
- const inserterFactory = (view, contentConverter) => {
26139
- const startPos = getTriggerStartPosition(view);
26138
+ const inserterFactory = (view, contentConverter, trigger) => {
26140
26139
  return {
26141
- insert: createNodeAndTextInserter(view, startPos),
26142
- insertHtml: createHtmlInserter(view, contentConverter, startPos, dispatchTransaction),
26140
+ insert: createNodeAndTextInserter(view, trigger),
26141
+ insertHtml: createHtmlInserter(view, contentConverter, trigger.position, dispatchTransaction),
26143
26142
  stopTrigger: () => stopTriggerTransaction(view),
26144
26143
  };
26145
26144
  };
26146
- const createNodeAndTextInserter = (view, startPos) => (input) => {
26145
+ const createNodeAndTextInserter = (view, trigger) => (input) => {
26147
26146
  const schema = view.state.schema;
26148
26147
  let node;
26149
26148
  try {
@@ -26156,7 +26155,7 @@ const createNodeAndTextInserter = (view, startPos) => (input) => {
26156
26155
  }
26157
26156
  const spaceNode = schema.text(' ');
26158
26157
  const fragment = schema.nodes.doc.create(null, [node, spaceNode]);
26159
- dispatchTransaction(view, startPos, fragment);
26158
+ dispatchTransaction(view, trigger.position, fragment);
26160
26159
  };
26161
26160
  const stopTriggerTransaction = (view) => {
26162
26161
  const { state, dispatch } = view;
@@ -26166,8 +26165,8 @@ const stopTriggerTransaction = (view) => {
26166
26165
  };
26167
26166
  const dispatchTransaction = (view, startPos, fragment) => {
26168
26167
  const state = view.state;
26169
- const dispatch = view.dispatch;
26170
26168
  const fromPos = state.selection.$from.pos;
26169
+ const dispatch = view.dispatch;
26171
26170
  const transaction = state.tr.replaceWith(startPos, fromPos, fragment);
26172
26171
  transaction.setMeta('stopTrigger', true);
26173
26172
  dispatch(transaction);
@@ -26194,47 +26193,16 @@ const getCustomNode = (name, schema) => {
26194
26193
  }
26195
26194
  return customNode;
26196
26195
  };
26197
- const getTriggerStartPosition = (view) => {
26198
- var _a, _b, _c;
26199
- return (_c = (_b = (_a = view.state) === null || _a === void 0 ? void 0 : _a.selection) === null || _b === void 0 ? void 0 : _b.$from) === null || _c === void 0 ? void 0 : _c.pos;
26200
- };
26201
26196
 
26202
- const isTrigger = (key, validTriggers) => {
26203
- return key.length === 1 && validTriggers.includes(key);
26204
- };
26205
- const shouldTrigger = (state) => {
26206
- const { $from } = state.selection;
26207
- if ($from.pos === 1) {
26208
- return true;
26209
- }
26210
- // Getting the position immediately before the current selection
26211
- const prevPos = $from.pos - 1;
26212
- if (prevPos > 0) {
26213
- // allow trigger if the cursor is at the start of a new paragraph
26214
- if ($from.parentOffset === 0) {
26215
- return true;
26216
- }
26217
- const prevChar = state.doc.textBetween(prevPos, $from.pos);
26218
- return prevChar === ' ' || prevChar === '\n';
26219
- }
26220
- return false;
26221
- };
26222
- const stillHasTrigger = (state, activeTrigger, triggerPosition, triggerLength) => {
26223
- const cursorPosition = state.selection.$from.pos;
26224
- if (cursorPosition < triggerPosition ||
26225
- cursorPosition > triggerPosition + triggerLength + 1) {
26226
- return false;
26227
- }
26228
- return (state.doc.textBetween(triggerPosition, triggerPosition + 1) ===
26229
- activeTrigger);
26230
- };
26231
26197
  const getTriggerEventDetail = (view, contentConverter, trigger, value) => {
26232
- return {
26233
- trigger: trigger,
26234
- textEditor: inserterFactory(view, contentConverter),
26198
+ const returnValue = {
26199
+ trigger: trigger.character,
26200
+ textEditor: inserterFactory(view, contentConverter, trigger),
26235
26201
  value: value,
26236
26202
  };
26203
+ return returnValue;
26237
26204
  };
26205
+
26238
26206
  const sendTriggerEvent = (type, view, contentConverter, trigger, value) => {
26239
26207
  const event = new CustomEvent(type, {
26240
26208
  detail: getTriggerEventDetail(view, contentConverter, trigger, value),
@@ -26243,83 +26211,93 @@ const sendTriggerEvent = (type, view, contentConverter, trigger, value) => {
26243
26211
  });
26244
26212
  view.dom.dispatchEvent(event);
26245
26213
  };
26246
- const processTransactions = (text, transactions, oldState) => {
26247
- let textAdded = '';
26248
- let textRemoved = '';
26249
- transactions.forEach((transaction) => {
26250
- if (transaction.docChanged) {
26251
- transaction.steps.forEach((step) => {
26252
- if (step instanceof ReplaceStep ||
26253
- step instanceof ReplaceAroundStep) {
26254
- const slice = step.slice;
26255
- const fromPos = step.from;
26256
- const toPos = step.to;
26257
- if (slice === null || slice === void 0 ? void 0 : slice.size) {
26258
- // Text added
26259
- textAdded += slice.content.textBetween(0, slice.size);
26260
- }
26261
- else if (fromPos !== toPos) {
26262
- // Text removed
26263
- const removedText = oldState.doc.textBetween(fromPos, toPos);
26264
- textRemoved += removedText;
26265
- }
26214
+
26215
+ const getTextInputHandler = (contentConverter, triggerCharacters, updateActiveTrigger) => {
26216
+ return (view, _from, _to, text) => {
26217
+ if (!triggerCharacters.includes(text)) {
26218
+ return false;
26219
+ }
26220
+ const doc = view.state.doc;
26221
+ const precedingText = doc.textBetween(_from - 1, _from, '');
26222
+ if (/\s/.test(precedingText) || precedingText === '') {
26223
+ const trigger = {
26224
+ character: text,
26225
+ position: _from,
26226
+ };
26227
+ updateActiveTrigger(trigger);
26228
+ sendTriggerEvent('triggerStart', view, contentConverter, trigger, text);
26229
+ }
26230
+ return false;
26231
+ };
26232
+ };
26233
+
26234
+ const detectTriggerRemoval = (transaction, activeTrigger, resetActiveTrigger, contentConverter, view) => {
26235
+ if (!activeTrigger || activeTrigger.position < 1) {
26236
+ return false;
26237
+ }
26238
+ for (const step of transaction.steps) {
26239
+ if (step instanceof ReplaceStep) {
26240
+ const { from, to, slice } = step; // Access properties specific to ReplaceStep
26241
+ // Check if the step affects the trigger position
26242
+ if (from <= activeTrigger.position &&
26243
+ to >= activeTrigger.position) {
26244
+ const text = slice.content.textBetween(0, slice.content.size, '');
26245
+ // Check if the trigger character has been removed
26246
+ // `text` is the text after the step has been applied
26247
+ if (!text.includes(activeTrigger.character)) {
26248
+ resetActiveTrigger();
26249
+ sendTriggerEvent('triggerStop', view, contentConverter, activeTrigger, '');
26250
+ return true;
26266
26251
  }
26267
- });
26252
+ }
26268
26253
  }
26269
- });
26270
- if (textAdded) {
26271
- text += textAdded;
26272
26254
  }
26273
- else if (textRemoved) {
26274
- text = text.slice(0, -textRemoved.length);
26255
+ return false;
26256
+ };
26257
+
26258
+ const monitorTriggeredText = (doc, activeTrigger, cursorPosition, contentConverter, view) => {
26259
+ let newValue = '';
26260
+ if (cursorPosition > activeTrigger.position) {
26261
+ // Start extracting text after the trigger character
26262
+ newValue = doc.textBetween(activeTrigger.position + 1, cursorPosition, '');
26275
26263
  }
26276
- return text;
26264
+ sendTriggerEvent('triggerChange', view, contentConverter, activeTrigger, newValue);
26265
+ return newValue;
26266
+ };
26267
+
26268
+ const getAppendTransactionHandler = (getCurrentView, getActiveTrigger, resetActiveTrigger, contentConverter) => {
26269
+ return (transactions, _oldState, newState) => {
26270
+ const activeTrigger = getActiveTrigger();
26271
+ if (!activeTrigger) {
26272
+ return;
26273
+ }
26274
+ const triggerRemoved = detectTriggerRemoval(transactions[0], // Pass the first transaction
26275
+ activeTrigger, resetActiveTrigger, contentConverter, getCurrentView());
26276
+ if (triggerRemoved) {
26277
+ resetActiveTrigger();
26278
+ return;
26279
+ }
26280
+ monitorTriggeredText(newState.doc, activeTrigger, newState.selection.from, contentConverter, getCurrentView());
26281
+ };
26277
26282
  };
26283
+
26278
26284
  const createTriggerPlugin = (triggerCharacters, contentConverter) => {
26279
- let activeTrigger = null;
26280
- let triggerText = '';
26281
26285
  let pluginView = null;
26282
- let triggerPosition = null;
26283
- const stopTrigger = () => {
26284
- triggerText = '';
26285
- sendTriggerEvent('triggerStop', pluginView, contentConverter, activeTrigger, triggerText);
26286
- triggerPosition = null;
26287
- activeTrigger = null;
26286
+ let activeTrigger = null;
26287
+ const getCurrentView = () => {
26288
+ return pluginView;
26288
26289
  };
26289
- const handleKeyDown = (_, event) => {
26290
- if (event.key === 'Escape') {
26291
- stopTrigger();
26292
- return true;
26293
- }
26294
- return false;
26290
+ const getActiveTrigger = () => {
26291
+ return activeTrigger;
26295
26292
  };
26296
- const handleInput = (view, event) => {
26297
- const { state } = view;
26298
- if (event.inputType === 'insertText' &&
26299
- isTrigger(event.data, triggerCharacters) &&
26300
- shouldTrigger(state)) {
26301
- activeTrigger = event.data;
26302
- triggerText = '';
26303
- triggerPosition = state.selection.$from.pos - triggerText.length;
26304
- sendTriggerEvent('triggerStart', view, contentConverter, activeTrigger, triggerText);
26305
- return false;
26306
- }
26307
- return false;
26293
+ const resetActiveTrigger = () => {
26294
+ activeTrigger = null;
26308
26295
  };
26309
- const appendTransactions = (transactions, oldState, newState) => {
26310
- if (!activeTrigger || !triggerPosition || !pluginView) {
26311
- return;
26312
- }
26313
- if (!stillHasTrigger(newState, activeTrigger, triggerPosition, triggerText.length)) {
26314
- stopTrigger();
26315
- return;
26316
- }
26317
- const updatedText = processTransactions(triggerText, transactions, oldState);
26318
- if (updatedText !== triggerText) {
26319
- triggerText = updatedText;
26320
- sendTriggerEvent('triggerChange', pluginView, contentConverter, activeTrigger, triggerText.slice(1));
26321
- }
26296
+ const updateActiveTrigger = (trigger) => {
26297
+ activeTrigger = trigger;
26322
26298
  };
26299
+ const textInputHandler = getTextInputHandler(contentConverter, triggerCharacters, updateActiveTrigger);
26300
+ const appendTransactionHandler = getAppendTransactionHandler(getCurrentView, getActiveTrigger, resetActiveTrigger, contentConverter);
26323
26301
  return new Plugin({
26324
26302
  key: new PluginKey('triggerPlugin'),
26325
26303
  view: (view) => {
@@ -26332,18 +26310,16 @@ const createTriggerPlugin = (triggerCharacters, contentConverter) => {
26332
26310
  },
26333
26311
  apply: (transaction) => {
26334
26312
  if (transaction.getMeta('stopTrigger')) {
26335
- stopTrigger();
26313
+ sendTriggerEvent('triggerStop', pluginView, contentConverter, activeTrigger, '');
26314
+ resetActiveTrigger();
26336
26315
  }
26337
26316
  return {};
26338
26317
  },
26339
26318
  },
26340
26319
  props: {
26341
- handleKeyDown: handleKeyDown,
26342
- handleDOMEvents: {
26343
- input: handleInput,
26344
- },
26320
+ handleTextInput: textInputHandler,
26345
26321
  },
26346
- appendTransaction: appendTransactions,
26322
+ appendTransaction: appendTransactionHandler,
26347
26323
  });
26348
26324
  };
26349
26325
 
@@ -28029,8 +28005,8 @@ const ProsemirrorAdapter = class {
28029
28005
  plugins: [
28030
28006
  ...exampleSetup({ schema: this.schema, menuBar: false }),
28031
28007
  keymap(this.menuCommandFactory.buildKeymap()),
28032
- createLinkPlugin(this.handleNewLinkSelection),
28033
28008
  createTriggerPlugin(this.triggerCharacters, this.contentConverter),
28009
+ createLinkPlugin(this.handleNewLinkSelection),
28034
28010
  createImageRemoverPlugin(),
28035
28011
  createMenuStateTrackingPlugin(editorMenuTypesArray, this.menuCommandFactory, this.updateActiveActionBarItems),
28036
28012
  createActionBarInteractionPlugin(this.menuCommandFactory),