@expensify/react-native-live-markdown 0.1.332 → 0.1.334

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/README.md CHANGED
@@ -211,10 +211,11 @@ Currently, `react-native-live-markdown` supports only [ExpensiMark](https://gith
211
211
 
212
212
  ### `react-native-worklets` compatibility
213
213
 
214
- | | 0.6.x | 0.7.x | 0.8.x | 0.9.x |
215
- |:-----------------:|:-----:|:-----:|:-----:|:-----:|
216
- | 0.1.321+ | ❌ | ✅ | ✅ | ✅ |
217
- | 0.1.308 – 0.1.320 | ✅ | ❌ | ❌ | ❌ |
214
+ | | 0.6.x | 0.7.x | 0.8.x | 0.9.x | 0.10.2+ |
215
+ |:-----------------:|:-----:|:-----:|:-----:|:-----:|:-------:|
216
+ | 0.1.333+ | ❌ | ✅ | ✅ | ✅ | ✅ |
217
+ | 0.1.321 – 0.1.332 | ❌ | ✅ | ✅ | ✅ | ❌ |
218
+ | 0.1.308 – 0.1.320 | ✅ | ❌ | ❌ | ❌ | ❌ |
218
219
 
219
220
 
220
221
  ## License
@@ -10,6 +10,18 @@ exports.scrollIntoView = scrollIntoView;
10
10
  exports.setCursorPosition = setCursorPosition;
11
11
  var _blockUtils = require("./blockUtils.js");
12
12
  var _treeUtils = require("./treeUtils.js");
13
+ function getMaxRangeOffset(node) {
14
+ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length;
15
+ }
16
+
17
+ /**
18
+ * Range offsets are applied to the real DOM node, not the parsed markdown tree.
19
+ * When the tree is temporarily stale, clamp to the DOM node's bounds so cursor
20
+ * restoration lands at the nearest valid position instead of throwing.
21
+ */
22
+ function getClampedRangeOffset(node, offset) {
23
+ return Math.max(0, Math.min(offset, getMaxRangeOffset(node)));
24
+ }
13
25
  function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) {
14
26
  // We don't want to move the cursor if the target is not focused
15
27
  if (!target.tree || target !== document.activeElement) {
@@ -32,13 +44,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto
32
44
  range.setStartBefore(startTreeNode.element);
33
45
  } else {
34
46
  const startElement = startTreeNode.element;
35
- range.setStart(startElement.childNodes[0] || startElement, start - startTreeNode.start);
47
+ const startNode = startElement.childNodes[0] || startElement;
48
+ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start));
36
49
  }
37
50
  if (endTreeNode.type === 'br') {
38
51
  range.setEndBefore(endTreeNode.element);
39
52
  } else {
40
53
  const endElement = endTreeNode.element;
41
- range.setEnd(endElement.childNodes[0] || endElement, (end || start) - endTreeNode.start);
54
+ const endNode = endElement.childNodes[0] || endElement;
55
+ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start));
42
56
  }
43
57
  if (!end) {
44
58
  range.collapse(true);
@@ -1 +1 @@
1
- {"version":3,"names":["_blockUtils","require","_treeUtils","setCursorPosition","target","startIndex","endIndex","shouldScrollIntoView","tree","document","activeElement","start","Math","max","min","length","end","range","createRange","selectNodeContents","startTreeNode","getTreeNodeByIndex","endTreeNode","console","error","type","setStartBefore","element","startElement","setStart","childNodes","setEndBefore","endElement","setEnd","collapse","selection","window","getSelection","setBaseAndExtent","startContainer","startOffset","endContainer","endOffset","scrollIntoView","node","scrollTargetElement","targetElement","isChildOfMultilineMarkdownElement","orderIndex","Number","split","currentLine","nodeName","addRange","span","createElement","textContent","insertNode","block","remove","caretRect","getBoundingClientRect","targetRect","top","height","scrollTop","moveCursorToEnd","getCurrentCursorPosition","getHTMLElement","Text","parentElement","rangeCount","getRangeAt","findHTMLElementInTree","parentNode","value","removeSelection","removeAllRanges"],"sourceRoot":"../../../../src","sources":["web/utils/cursorUtils.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_blockUtils","require","_treeUtils","getMaxRangeOffset","node","nodeType","Node","TEXT_NODE","textContent","length","childNodes","getClampedRangeOffset","offset","Math","max","min","setCursorPosition","target","startIndex","endIndex","shouldScrollIntoView","tree","document","activeElement","start","end","range","createRange","selectNodeContents","startTreeNode","getTreeNodeByIndex","endTreeNode","console","error","type","setStartBefore","element","startElement","startNode","setStart","setEndBefore","endElement","endNode","setEnd","collapse","selection","window","getSelection","setBaseAndExtent","startContainer","startOffset","endContainer","endOffset","scrollIntoView","scrollTargetElement","targetElement","isChildOfMultilineMarkdownElement","orderIndex","Number","split","currentLine","nodeName","addRange","span","createElement","insertNode","block","remove","caretRect","getBoundingClientRect","targetRect","top","height","scrollTop","moveCursorToEnd","getCurrentCursorPosition","getHTMLElement","Text","parentElement","rangeCount","getRangeAt","findHTMLElementInTree","parentNode","value","removeSelection","removeAllRanges"],"sourceRoot":"../../../../src","sources":["web/utils/cursorUtils.ts"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,18 @@
2
2
 
3
3
  import { isChildOfMultilineMarkdownElement } from "./blockUtils.js";
4
4
  import { findHTMLElementInTree, getTreeNodeByIndex } from "./treeUtils.js";
5
+ function getMaxRangeOffset(node) {
6
+ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length;
7
+ }
8
+
9
+ /**
10
+ * Range offsets are applied to the real DOM node, not the parsed markdown tree.
11
+ * When the tree is temporarily stale, clamp to the DOM node's bounds so cursor
12
+ * restoration lands at the nearest valid position instead of throwing.
13
+ */
14
+ function getClampedRangeOffset(node, offset) {
15
+ return Math.max(0, Math.min(offset, getMaxRangeOffset(node)));
16
+ }
5
17
  function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) {
6
18
  // We don't want to move the cursor if the target is not focused
7
19
  if (!target.tree || target !== document.activeElement) {
@@ -24,13 +36,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto
24
36
  range.setStartBefore(startTreeNode.element);
25
37
  } else {
26
38
  const startElement = startTreeNode.element;
27
- range.setStart(startElement.childNodes[0] || startElement, start - startTreeNode.start);
39
+ const startNode = startElement.childNodes[0] || startElement;
40
+ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start));
28
41
  }
29
42
  if (endTreeNode.type === 'br') {
30
43
  range.setEndBefore(endTreeNode.element);
31
44
  } else {
32
45
  const endElement = endTreeNode.element;
33
- range.setEnd(endElement.childNodes[0] || endElement, (end || start) - endTreeNode.start);
46
+ const endNode = endElement.childNodes[0] || endElement;
47
+ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start));
34
48
  }
35
49
  if (!end) {
36
50
  range.collapse(true);
@@ -1 +1 @@
1
- {"version":3,"names":["isChildOfMultilineMarkdownElement","findHTMLElementInTree","getTreeNodeByIndex","setCursorPosition","target","startIndex","endIndex","shouldScrollIntoView","tree","document","activeElement","start","Math","max","min","length","end","range","createRange","selectNodeContents","startTreeNode","endTreeNode","console","error","type","setStartBefore","element","startElement","setStart","childNodes","setEndBefore","endElement","setEnd","collapse","selection","window","getSelection","setBaseAndExtent","startContainer","startOffset","endContainer","endOffset","scrollIntoView","node","scrollTargetElement","targetElement","orderIndex","Number","split","currentLine","nodeName","addRange","span","createElement","textContent","insertNode","block","remove","caretRect","getBoundingClientRect","targetRect","top","height","scrollTop","moveCursorToEnd","getCurrentCursorPosition","getHTMLElement","Text","parentElement","rangeCount","getRangeAt","parentNode","value","removeSelection","removeAllRanges"],"sourceRoot":"../../../../src","sources":["web/utils/cursorUtils.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["isChildOfMultilineMarkdownElement","findHTMLElementInTree","getTreeNodeByIndex","getMaxRangeOffset","node","nodeType","Node","TEXT_NODE","textContent","length","childNodes","getClampedRangeOffset","offset","Math","max","min","setCursorPosition","target","startIndex","endIndex","shouldScrollIntoView","tree","document","activeElement","start","end","range","createRange","selectNodeContents","startTreeNode","endTreeNode","console","error","type","setStartBefore","element","startElement","startNode","setStart","setEndBefore","endElement","endNode","setEnd","collapse","selection","window","getSelection","setBaseAndExtent","startContainer","startOffset","endContainer","endOffset","scrollIntoView","scrollTargetElement","targetElement","orderIndex","Number","split","currentLine","nodeName","addRange","span","createElement","insertNode","block","remove","caretRect","getBoundingClientRect","targetRect","top","height","scrollTop","moveCursorToEnd","getCurrentCursorPosition","getHTMLElement","Text","parentElement","rangeCount","getRangeAt","parentNode","value","removeSelection","removeAllRanges"],"sourceRoot":"../../../../src","sources":["web/utils/cursorUtils.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"cursorUtils.d.ts","sourceRoot":"","sources":["../../../../../src/web/utils/cursorUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,6BAA6B,CAAC;AAG1E,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAE1C,iBAAS,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAW,EAAE,oBAAoB,UAAQ,QAgD5I;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAQ,QA0CvE;AAED,iBAAS,eAAe,CAAC,MAAM,EAAE,WAAW,QAQ3C;AAED,iBAAS,wBAAwB,CAAC,MAAM,EAAE,wBAAwB;;;SAiCjE;AAED,iBAAS,eAAe,SAKvB;AAED,OAAO,EAAC,wBAAwB,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAC,CAAC"}
1
+ {"version":3,"file":"cursorUtils.d.ts","sourceRoot":"","sources":["../../../../../src/web/utils/cursorUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,6BAA6B,CAAC;AAG1E,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAe1C,iBAAS,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAW,EAAE,oBAAoB,UAAQ,QAkD5I;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAQ,QA0CvE;AAED,iBAAS,eAAe,CAAC,MAAM,EAAE,WAAW,QAQ3C;AAED,iBAAS,wBAAwB,CAAC,MAAM,EAAE,wBAAwB;;;SAiCjE;AAED,iBAAS,eAAe,SAKvB;AAED,OAAO,EAAC,wBAAwB,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expensify/react-native-live-markdown",
3
- "version": "0.1.332",
3
+ "version": "0.1.334",
4
4
  "description": "Drop-in replacement for React Native's TextInput component with Markdown formatting.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -103,7 +103,7 @@
103
103
  "react-native": "0.85.3",
104
104
  "react-native-builder-bob": "^0.30.2",
105
105
  "react-native-web": "^0.20.0",
106
- "react-native-worklets": "0.9.1",
106
+ "react-native-worklets": "0.10.2",
107
107
  "release-it": "^15.0.0",
108
108
  "turbo": "^1.10.7",
109
109
  "typescript": "^5.8.3"
@@ -3,6 +3,19 @@ import {isChildOfMultilineMarkdownElement} from './blockUtils';
3
3
  import {findHTMLElementInTree, getTreeNodeByIndex} from './treeUtils';
4
4
  import type {TreeNode} from './treeUtils';
5
5
 
6
+ function getMaxRangeOffset(node: ChildNode): number {
7
+ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length;
8
+ }
9
+
10
+ /**
11
+ * Range offsets are applied to the real DOM node, not the parsed markdown tree.
12
+ * When the tree is temporarily stale, clamp to the DOM node's bounds so cursor
13
+ * restoration lands at the nearest valid position instead of throwing.
14
+ */
15
+ function getClampedRangeOffset(node: ChildNode, offset: number): number {
16
+ return Math.max(0, Math.min(offset, getMaxRangeOffset(node)));
17
+ }
18
+
6
19
  function setCursorPosition(target: MarkdownTextInputElement, startIndex: number, endIndex: number | null = null, shouldScrollIntoView = false) {
7
20
  // We don't want to move the cursor if the target is not focused
8
21
  if (!target.tree || target !== document.activeElement) {
@@ -29,14 +42,16 @@ function setCursorPosition(target: MarkdownTextInputElement, startIndex: number,
29
42
  range.setStartBefore(startTreeNode.element);
30
43
  } else {
31
44
  const startElement = startTreeNode.element;
32
- range.setStart((startElement.childNodes[0] || startElement) as ChildNode, start - startTreeNode.start);
45
+ const startNode = (startElement.childNodes[0] || startElement) as ChildNode;
46
+ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start));
33
47
  }
34
48
 
35
49
  if (endTreeNode.type === 'br') {
36
50
  range.setEndBefore(endTreeNode.element);
37
51
  } else {
38
52
  const endElement = endTreeNode.element;
39
- range.setEnd((endElement.childNodes[0] || endElement) as ChildNode, (end || start) - endTreeNode.start);
53
+ const endNode = (endElement.childNodes[0] || endElement) as ChildNode;
54
+ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start));
40
55
  }
41
56
 
42
57
  if (!end) {