@cratis/components 4.22.1 → 4.23.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.
Files changed (153) hide show
  1. package/compat-manifest.json +11 -11
  2. package/dist/esm/MarkdownEditor/CaretPosition.d.ts +12 -0
  3. package/dist/esm/MarkdownEditor/CaretPosition.d.ts.map +1 -0
  4. package/dist/esm/MarkdownEditor/CaretPosition.js +4 -0
  5. package/dist/esm/MarkdownEditor/CaretPosition.js.map +1 -0
  6. package/dist/esm/MarkdownEditor/MarkdownCompletion.d.ts +63 -0
  7. package/dist/esm/MarkdownEditor/MarkdownCompletion.d.ts.map +1 -0
  8. package/dist/esm/MarkdownEditor/MarkdownCompletion.js +4 -0
  9. package/dist/esm/MarkdownEditor/MarkdownCompletion.js.map +1 -0
  10. package/dist/esm/MarkdownEditor/MarkdownCompletionContext.d.ts +11 -0
  11. package/dist/esm/MarkdownEditor/MarkdownCompletionContext.d.ts.map +1 -0
  12. package/dist/esm/MarkdownEditor/MarkdownCompletionContext.js +4 -0
  13. package/dist/esm/MarkdownEditor/MarkdownCompletionContext.js.map +1 -0
  14. package/dist/esm/MarkdownEditor/MarkdownCompletionMatch.d.ts +17 -0
  15. package/dist/esm/MarkdownEditor/MarkdownCompletionMatch.d.ts.map +1 -0
  16. package/dist/esm/MarkdownEditor/MarkdownCompletionMatch.js +4 -0
  17. package/dist/esm/MarkdownEditor/MarkdownCompletionMatch.js.map +1 -0
  18. package/dist/esm/MarkdownEditor/MarkdownEditor.d.ts +86 -0
  19. package/dist/esm/MarkdownEditor/MarkdownEditor.d.ts.map +1 -0
  20. package/dist/esm/MarkdownEditor/MarkdownEditor.js +100 -0
  21. package/dist/esm/MarkdownEditor/MarkdownEditor.js.map +1 -0
  22. package/dist/esm/MarkdownEditor/MarkdownEditorLabels.d.ts +47 -0
  23. package/dist/esm/MarkdownEditor/MarkdownEditorLabels.d.ts.map +1 -0
  24. package/dist/esm/MarkdownEditor/MarkdownEditorLabels.js +4 -0
  25. package/dist/esm/MarkdownEditor/MarkdownEditorLabels.js.map +1 -0
  26. package/dist/esm/MarkdownEditor/MarkdownEditorMode.d.ts +11 -0
  27. package/dist/esm/MarkdownEditor/MarkdownEditorMode.d.ts.map +1 -0
  28. package/dist/esm/MarkdownEditor/MarkdownEditorMode.js +8 -0
  29. package/dist/esm/MarkdownEditor/MarkdownEditorMode.js.map +1 -0
  30. package/dist/esm/MarkdownEditor/MarkdownEditorParts.d.ts +33 -0
  31. package/dist/esm/MarkdownEditor/MarkdownEditorParts.d.ts.map +1 -0
  32. package/dist/esm/MarkdownEditor/MarkdownEditorParts.js +4 -0
  33. package/dist/esm/MarkdownEditor/MarkdownEditorParts.js.map +1 -0
  34. package/dist/esm/MarkdownEditor/MarkdownFormat.d.ts +29 -0
  35. package/dist/esm/MarkdownEditor/MarkdownFormat.d.ts.map +1 -0
  36. package/dist/esm/MarkdownEditor/MarkdownFormat.js +17 -0
  37. package/dist/esm/MarkdownEditor/MarkdownFormat.js.map +1 -0
  38. package/dist/esm/MarkdownEditor/MarkdownLineBlock.d.ts +12 -0
  39. package/dist/esm/MarkdownEditor/MarkdownLineBlock.d.ts.map +1 -0
  40. package/dist/esm/MarkdownEditor/MarkdownLineBlock.js +4 -0
  41. package/dist/esm/MarkdownEditor/MarkdownLineBlock.js.map +1 -0
  42. package/dist/esm/MarkdownEditor/MarkdownModeToggle.d.ts +22 -0
  43. package/dist/esm/MarkdownEditor/MarkdownModeToggle.d.ts.map +1 -0
  44. package/dist/esm/MarkdownEditor/MarkdownModeToggle.js +14 -0
  45. package/dist/esm/MarkdownEditor/MarkdownModeToggle.js.map +1 -0
  46. package/dist/esm/MarkdownEditor/MarkdownSuggestion.d.ts +18 -0
  47. package/dist/esm/MarkdownEditor/MarkdownSuggestion.d.ts.map +1 -0
  48. package/dist/esm/MarkdownEditor/MarkdownSuggestion.js +4 -0
  49. package/dist/esm/MarkdownEditor/MarkdownSuggestion.js.map +1 -0
  50. package/dist/esm/MarkdownEditor/MarkdownSuggestionList.d.ts +41 -0
  51. package/dist/esm/MarkdownEditor/MarkdownSuggestionList.d.ts.map +1 -0
  52. package/dist/esm/MarkdownEditor/MarkdownSuggestionList.js +19 -0
  53. package/dist/esm/MarkdownEditor/MarkdownSuggestionList.js.map +1 -0
  54. package/dist/esm/MarkdownEditor/MarkdownTextEdit.d.ts +12 -0
  55. package/dist/esm/MarkdownEditor/MarkdownTextEdit.d.ts.map +1 -0
  56. package/dist/esm/MarkdownEditor/MarkdownTextEdit.js +4 -0
  57. package/dist/esm/MarkdownEditor/MarkdownTextEdit.js.map +1 -0
  58. package/dist/esm/MarkdownEditor/MarkdownToolbar.d.ts +23 -0
  59. package/dist/esm/MarkdownEditor/MarkdownToolbar.d.ts.map +1 -0
  60. package/dist/esm/MarkdownEditor/MarkdownToolbar.js +43 -0
  61. package/dist/esm/MarkdownEditor/MarkdownToolbar.js.map +1 -0
  62. package/dist/esm/MarkdownEditor/MarkdownWritingArea.d.ts +37 -0
  63. package/dist/esm/MarkdownEditor/MarkdownWritingArea.d.ts.map +1 -0
  64. package/dist/esm/MarkdownEditor/MarkdownWritingArea.js +65 -0
  65. package/dist/esm/MarkdownEditor/MarkdownWritingArea.js.map +1 -0
  66. package/dist/esm/MarkdownEditor/applyMarkdownFormat.d.ts +13 -0
  67. package/dist/esm/MarkdownEditor/applyMarkdownFormat.d.ts.map +1 -0
  68. package/dist/esm/MarkdownEditor/applyMarkdownFormat.js +42 -0
  69. package/dist/esm/MarkdownEditor/applyMarkdownFormat.js.map +1 -0
  70. package/dist/esm/MarkdownEditor/caretPositionIn.d.ts +13 -0
  71. package/dist/esm/MarkdownEditor/caretPositionIn.d.ts.map +1 -0
  72. package/dist/esm/MarkdownEditor/caretPositionIn.js +54 -0
  73. package/dist/esm/MarkdownEditor/caretPositionIn.js.map +1 -0
  74. package/dist/esm/MarkdownEditor/defaultMarkdownEditorLabels.d.ts +4 -0
  75. package/dist/esm/MarkdownEditor/defaultMarkdownEditorLabels.d.ts.map +1 -0
  76. package/dist/esm/MarkdownEditor/defaultMarkdownEditorLabels.js +23 -0
  77. package/dist/esm/MarkdownEditor/defaultMarkdownEditorLabels.js.map +1 -0
  78. package/dist/esm/MarkdownEditor/defaultMarkdownFormats.d.ts +7 -0
  79. package/dist/esm/MarkdownEditor/defaultMarkdownFormats.d.ts.map +1 -0
  80. package/dist/esm/MarkdownEditor/defaultMarkdownFormats.js +10 -0
  81. package/dist/esm/MarkdownEditor/defaultMarkdownFormats.js.map +1 -0
  82. package/dist/esm/MarkdownEditor/filesIn.d.ts +7 -0
  83. package/dist/esm/MarkdownEditor/filesIn.d.ts.map +1 -0
  84. package/dist/esm/MarkdownEditor/filesIn.js +7 -0
  85. package/dist/esm/MarkdownEditor/filesIn.js.map +1 -0
  86. package/dist/esm/MarkdownEditor/findCompletionMatch.d.ts +12 -0
  87. package/dist/esm/MarkdownEditor/findCompletionMatch.d.ts.map +1 -0
  88. package/dist/esm/MarkdownEditor/findCompletionMatch.js +42 -0
  89. package/dist/esm/MarkdownEditor/findCompletionMatch.js.map +1 -0
  90. package/dist/esm/MarkdownEditor/formatIcons.d.ts +5 -0
  91. package/dist/esm/MarkdownEditor/formatIcons.d.ts.map +1 -0
  92. package/dist/esm/MarkdownEditor/formatIcons.js +20 -0
  93. package/dist/esm/MarkdownEditor/formatIcons.js.map +1 -0
  94. package/dist/esm/MarkdownEditor/formatShortcuts.d.ts +4 -0
  95. package/dist/esm/MarkdownEditor/formatShortcuts.d.ts.map +1 -0
  96. package/dist/esm/MarkdownEditor/formatShortcuts.js +10 -0
  97. package/dist/esm/MarkdownEditor/formatShortcuts.js.map +1 -0
  98. package/dist/esm/MarkdownEditor/index.d.ts +14 -0
  99. package/dist/esm/MarkdownEditor/index.d.ts.map +1 -0
  100. package/dist/esm/MarkdownEditor/index.js +7 -0
  101. package/dist/esm/MarkdownEditor/index.js.map +1 -0
  102. package/dist/esm/MarkdownEditor/insertLink.d.ts +12 -0
  103. package/dist/esm/MarkdownEditor/insertLink.d.ts.map +1 -0
  104. package/dist/esm/MarkdownEditor/insertLink.js +26 -0
  105. package/dist/esm/MarkdownEditor/insertLink.js.map +1 -0
  106. package/dist/esm/MarkdownEditor/lineBlockAround.d.ts +11 -0
  107. package/dist/esm/MarkdownEditor/lineBlockAround.d.ts.map +1 -0
  108. package/dist/esm/MarkdownEditor/lineBlockAround.js +14 -0
  109. package/dist/esm/MarkdownEditor/lineBlockAround.js.map +1 -0
  110. package/dist/esm/MarkdownEditor/nextMarkdownEditorMode.d.ts +8 -0
  111. package/dist/esm/MarkdownEditor/nextMarkdownEditorMode.d.ts.map +1 -0
  112. package/dist/esm/MarkdownEditor/nextMarkdownEditorMode.js +6 -0
  113. package/dist/esm/MarkdownEditor/nextMarkdownEditorMode.js.map +1 -0
  114. package/dist/esm/MarkdownEditor/replacePlaceholder.d.ts +14 -0
  115. package/dist/esm/MarkdownEditor/replacePlaceholder.d.ts.map +1 -0
  116. package/dist/esm/MarkdownEditor/replacePlaceholder.js +4 -0
  117. package/dist/esm/MarkdownEditor/replacePlaceholder.js.map +1 -0
  118. package/dist/esm/MarkdownEditor/replaceRange.d.ts +12 -0
  119. package/dist/esm/MarkdownEditor/replaceRange.d.ts.map +1 -0
  120. package/dist/esm/MarkdownEditor/replaceRange.js +11 -0
  121. package/dist/esm/MarkdownEditor/replaceRange.js.map +1 -0
  122. package/dist/esm/MarkdownEditor/toggleCodeBlock.d.ts +11 -0
  123. package/dist/esm/MarkdownEditor/toggleCodeBlock.d.ts.map +1 -0
  124. package/dist/esm/MarkdownEditor/toggleCodeBlock.js +30 -0
  125. package/dist/esm/MarkdownEditor/toggleCodeBlock.js.map +1 -0
  126. package/dist/esm/MarkdownEditor/toggleInlineMarker.d.ts +13 -0
  127. package/dist/esm/MarkdownEditor/toggleInlineMarker.d.ts.map +1 -0
  128. package/dist/esm/MarkdownEditor/toggleInlineMarker.js +29 -0
  129. package/dist/esm/MarkdownEditor/toggleInlineMarker.js.map +1 -0
  130. package/dist/esm/MarkdownEditor/toggleLinePrefix.d.ts +14 -0
  131. package/dist/esm/MarkdownEditor/toggleLinePrefix.d.ts.map +1 -0
  132. package/dist/esm/MarkdownEditor/toggleLinePrefix.js +24 -0
  133. package/dist/esm/MarkdownEditor/toggleLinePrefix.js.map +1 -0
  134. package/dist/esm/MarkdownEditor/uploadPlaceholderFor.d.ts +11 -0
  135. package/dist/esm/MarkdownEditor/uploadPlaceholderFor.d.ts.map +1 -0
  136. package/dist/esm/MarkdownEditor/uploadPlaceholderFor.js +4 -0
  137. package/dist/esm/MarkdownEditor/uploadPlaceholderFor.js.map +1 -0
  138. package/dist/esm/MarkdownEditor/useMarkdownCompletion.d.ts +44 -0
  139. package/dist/esm/MarkdownEditor/useMarkdownCompletion.d.ts.map +1 -0
  140. package/dist/esm/MarkdownEditor/useMarkdownCompletion.js +92 -0
  141. package/dist/esm/MarkdownEditor/useMarkdownCompletion.js.map +1 -0
  142. package/dist/esm/MarkdownEditor/useMarkdownUploads.d.ts +38 -0
  143. package/dist/esm/MarkdownEditor/useMarkdownUploads.d.ts.map +1 -0
  144. package/dist/esm/MarkdownEditor/useMarkdownUploads.js +55 -0
  145. package/dist/esm/MarkdownEditor/useMarkdownUploads.js.map +1 -0
  146. package/dist/esm/styles.MarkdownEditor.css +229 -0
  147. package/dist/esm/styles.base.css +2 -0
  148. package/dist/esm/styles.css +228 -0
  149. package/dist/esm/types/parts.d.ts +12 -0
  150. package/dist/esm/types/parts.d.ts.map +1 -1
  151. package/dist/esm/types/parts.js +12 -0
  152. package/dist/esm/types/parts.js.map +1 -1
  153. package/package.json +6 -1
@@ -0,0 +1,42 @@
1
+ import { MarkdownFormat } from './MarkdownFormat.js';
2
+ import { insertLink } from './insertLink.js';
3
+ import { toggleCodeBlock } from './toggleCodeBlock.js';
4
+ import { toggleInlineMarker } from './toggleInlineMarker.js';
5
+ import { toggleLinePrefix } from './toggleLinePrefix.js';
6
+
7
+ const heading = /^#{1,6} /u;
8
+ const quote = /^> ?/u;
9
+ const bullet = /^[-*+] (?!\[[ xX]\] )/u;
10
+ const numbered = /^\d+\. /u;
11
+ const task = /^[-*+] \[[ xX]\] /u;
12
+ const applyMarkdownFormat = (value, selectionStart, selectionEnd, format) => {
13
+ const start = Math.min(selectionStart, selectionEnd);
14
+ const end = Math.max(selectionStart, selectionEnd);
15
+ switch (format) {
16
+ case MarkdownFormat.Bold:
17
+ return toggleInlineMarker(value, start, end, '**');
18
+ case MarkdownFormat.Italic:
19
+ return toggleInlineMarker(value, start, end, '_');
20
+ case MarkdownFormat.Strikethrough:
21
+ return toggleInlineMarker(value, start, end, '~~');
22
+ case MarkdownFormat.Code:
23
+ return toggleInlineMarker(value, start, end, '`');
24
+ case MarkdownFormat.CodeBlock:
25
+ return toggleCodeBlock(value, start, end);
26
+ case MarkdownFormat.Link:
27
+ return insertLink(value, start, end);
28
+ case MarkdownFormat.Heading:
29
+ return toggleLinePrefix(value, start, end, () => '## ', heading);
30
+ case MarkdownFormat.Quote:
31
+ return toggleLinePrefix(value, start, end, () => '> ', quote);
32
+ case MarkdownFormat.BulletList:
33
+ return toggleLinePrefix(value, start, end, () => '- ', bullet);
34
+ case MarkdownFormat.NumberedList:
35
+ return toggleLinePrefix(value, start, end, lineIndex => `${lineIndex + 1}. `, numbered);
36
+ case MarkdownFormat.TaskList:
37
+ return toggleLinePrefix(value, start, end, () => '- [ ] ', task);
38
+ }
39
+ };
40
+
41
+ export { applyMarkdownFormat };
42
+ //# sourceMappingURL=applyMarkdownFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyMarkdownFormat.js","sources":["../../../MarkdownEditor/applyMarkdownFormat.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { MarkdownFormat } from './MarkdownFormat';\nimport type { MarkdownTextEdit } from './MarkdownTextEdit';\nimport { insertLink } from './insertLink';\nimport { toggleCodeBlock } from './toggleCodeBlock';\nimport { toggleInlineMarker } from './toggleInlineMarker';\nimport { toggleLinePrefix } from './toggleLinePrefix';\n\nconst heading = /^#{1,6} /u;\nconst quote = /^> ?/u;\nconst bullet = /^[-*+] (?!\\[[ xX]\\] )/u;\nconst numbered = /^\\d+\\. /u;\nconst task = /^[-*+] \\[[ xX]\\] /u;\n\n/**\n * Applies a toolbar format to the selection in a piece of markdown. Every format is a toggle: applying\n * it where it is already applied takes it off.\n * @param value The markdown being edited.\n * @param selectionStart Where the selection starts.\n * @param selectionEnd Where the selection ends.\n * @param format The {@link MarkdownFormat} to apply.\n * @returns The edited markdown and the selection the writing area should show afterwards.\n */\nexport const applyMarkdownFormat = (\n value: string,\n selectionStart: number,\n selectionEnd: number,\n format: MarkdownFormat,\n): MarkdownTextEdit => {\n const start = Math.min(selectionStart, selectionEnd);\n const end = Math.max(selectionStart, selectionEnd);\n\n switch (format) {\n case MarkdownFormat.Bold:\n return toggleInlineMarker(value, start, end, '**');\n case MarkdownFormat.Italic:\n return toggleInlineMarker(value, start, end, '_');\n case MarkdownFormat.Strikethrough:\n return toggleInlineMarker(value, start, end, '~~');\n case MarkdownFormat.Code:\n return toggleInlineMarker(value, start, end, '`');\n case MarkdownFormat.CodeBlock:\n return toggleCodeBlock(value, start, end);\n case MarkdownFormat.Link:\n return insertLink(value, start, end);\n case MarkdownFormat.Heading:\n return toggleLinePrefix(value, start, end, () => '## ', heading);\n case MarkdownFormat.Quote:\n return toggleLinePrefix(value, start, end, () => '> ', quote);\n case MarkdownFormat.BulletList:\n return toggleLinePrefix(value, start, end, () => '- ', bullet);\n case MarkdownFormat.NumberedList:\n return toggleLinePrefix(value, start, end, lineIndex => `${lineIndex + 1}. `, numbered);\n case MarkdownFormat.TaskList:\n return toggleLinePrefix(value, start, end, () => '- [ ] ', task);\n }\n};\n"],"names":[],"mappings":";;;;;;AAUA,MAAM,OAAO,GAAG,WAAW;AAC3B,MAAM,KAAK,GAAG,OAAO;AACrB,MAAM,MAAM,GAAG,wBAAwB;AACvC,MAAM,QAAQ,GAAG,UAAU;AAC3B,MAAM,IAAI,GAAG,oBAAoB;AAW1B,MAAM,mBAAmB,GAAG,CAC/B,KAAa,EACb,cAAsB,EACtB,YAAoB,EACpB,MAAsB,KACJ;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC;IAElD,QAAQ,MAAM;QACV,KAAK,cAAc,CAAC,IAAI;YACpB,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC;QACtD,KAAK,cAAc,CAAC,MAAM;YACtB,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;QACrD,KAAK,cAAc,CAAC,aAAa;YAC7B,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC;QACtD,KAAK,cAAc,CAAC,IAAI;YACpB,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;QACrD,KAAK,cAAc,CAAC,SAAS;YACzB,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;QAC7C,KAAK,cAAc,CAAC,IAAI;YACpB,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;QACxC,KAAK,cAAc,CAAC,OAAO;AACvB,YAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;QACpE,KAAK,cAAc,CAAC,KAAK;AACrB,YAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,CAAC;QACjE,KAAK,cAAc,CAAC,UAAU;AAC1B,YAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC;QAClE,KAAK,cAAc,CAAC,YAAY;YAC5B,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,IAAI,CAAA,EAAG,SAAS,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC3F,KAAK,cAAc,CAAC,QAAQ;AACxB,YAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,CAAC;;AAE5E;;"}
@@ -0,0 +1,13 @@
1
+ import type { CaretPosition } from './CaretPosition.js';
2
+ /**
3
+ * Measures where the caret of a textarea is on screen.
4
+ *
5
+ * A textarea exposes no caret coordinates, and counting lines fails on wrapped lines, proportional
6
+ * fonts and scrolling. So an invisible element takes the textarea's typography and box, holds the
7
+ * text up to the caret, and a zero-width marker after it is measured instead.
8
+ * @param textarea The textarea to measure in.
9
+ * @param caret The caret position within its value.
10
+ * @returns The caret's {@link CaretPosition}.
11
+ */
12
+ export declare const caretPositionIn: (textarea: HTMLTextAreaElement, caret: number) => CaretPosition;
13
+ //# sourceMappingURL=caretPositionIn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caretPositionIn.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/caretPositionIn.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAiB,CAAC;AA4BrD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,aAAc,mBAAmB,SAAS,MAAM,KAAG,aA6B9E,CAAC"}
@@ -0,0 +1,54 @@
1
+ const copiedStyles = [
2
+ 'boxSizing',
3
+ 'width',
4
+ 'height',
5
+ 'paddingTop',
6
+ 'paddingRight',
7
+ 'paddingBottom',
8
+ 'paddingLeft',
9
+ 'borderTopWidth',
10
+ 'borderRightWidth',
11
+ 'borderBottomWidth',
12
+ 'borderLeftWidth',
13
+ 'borderStyle',
14
+ 'fontFamily',
15
+ 'fontSize',
16
+ 'fontStyle',
17
+ 'fontWeight',
18
+ 'fontVariant',
19
+ 'letterSpacing',
20
+ 'lineHeight',
21
+ 'textTransform',
22
+ 'textIndent',
23
+ 'tabSize',
24
+ 'wordSpacing',
25
+ ];
26
+ const caretPositionIn = (textarea, caret) => {
27
+ const computed = window.getComputedStyle(textarea);
28
+ const bounds = textarea.getBoundingClientRect();
29
+ const mirror = document.createElement('div');
30
+ const marker = document.createElement('span');
31
+ for (const property of copiedStyles) {
32
+ mirror.style[property] = computed[property];
33
+ }
34
+ mirror.style.position = 'fixed';
35
+ mirror.style.visibility = 'hidden';
36
+ mirror.style.pointerEvents = 'none';
37
+ mirror.style.overflow = 'hidden';
38
+ mirror.style.whiteSpace = 'pre-wrap';
39
+ mirror.style.overflowWrap = 'break-word';
40
+ mirror.style.left = `${bounds.left}px`;
41
+ mirror.style.top = `${bounds.top}px`;
42
+ mirror.textContent = textarea.value.slice(0, caret);
43
+ marker.textContent = '\u200b';
44
+ mirror.append(marker);
45
+ document.body.append(mirror);
46
+ mirror.scrollTop = textarea.scrollTop;
47
+ mirror.scrollLeft = textarea.scrollLeft;
48
+ const markerBounds = marker.getBoundingClientRect();
49
+ mirror.remove();
50
+ return { left: markerBounds.left, top: markerBounds.top, bottom: markerBounds.bottom };
51
+ };
52
+
53
+ export { caretPositionIn };
54
+ //# sourceMappingURL=caretPositionIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caretPositionIn.js","sources":["../../../MarkdownEditor/caretPositionIn.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { CaretPosition } from './CaretPosition';\n\nconst copiedStyles = [\n 'boxSizing',\n 'width',\n 'height',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n 'fontFamily',\n 'fontSize',\n 'fontStyle',\n 'fontWeight',\n 'fontVariant',\n 'letterSpacing',\n 'lineHeight',\n 'textTransform',\n 'textIndent',\n 'tabSize',\n 'wordSpacing',\n] as const;\n\n/**\n * Measures where the caret of a textarea is on screen.\n *\n * A textarea exposes no caret coordinates, and counting lines fails on wrapped lines, proportional\n * fonts and scrolling. So an invisible element takes the textarea's typography and box, holds the\n * text up to the caret, and a zero-width marker after it is measured instead.\n * @param textarea The textarea to measure in.\n * @param caret The caret position within its value.\n * @returns The caret's {@link CaretPosition}.\n */\nexport const caretPositionIn = (textarea: HTMLTextAreaElement, caret: number): CaretPosition => {\n const computed = window.getComputedStyle(textarea);\n const bounds = textarea.getBoundingClientRect();\n const mirror = document.createElement('div');\n const marker = document.createElement('span');\n\n for (const property of copiedStyles) {\n mirror.style[property] = computed[property];\n }\n mirror.style.position = 'fixed';\n mirror.style.visibility = 'hidden';\n mirror.style.pointerEvents = 'none';\n mirror.style.overflow = 'hidden';\n mirror.style.whiteSpace = 'pre-wrap';\n mirror.style.overflowWrap = 'break-word';\n mirror.style.left = `${bounds.left}px`;\n mirror.style.top = `${bounds.top}px`;\n\n mirror.textContent = textarea.value.slice(0, caret);\n marker.textContent = '\\u200b';\n mirror.append(marker);\n document.body.append(mirror);\n mirror.scrollTop = textarea.scrollTop;\n mirror.scrollLeft = textarea.scrollLeft;\n\n const markerBounds = marker.getBoundingClientRect();\n mirror.remove();\n\n return { left: markerBounds.left, top: markerBounds.top, bottom: markerBounds.bottom };\n};\n"],"names":[],"mappings":"AAKA,MAAM,YAAY,GAAG;IACjB,WAAW;IACX,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,cAAc;IACd,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,aAAa;IACb,YAAY;IACZ,UAAU;IACV,WAAW;IACX,YAAY;IACZ,aAAa;IACb,eAAe;IACf,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,SAAS;IACT,aAAa;CACP;MAYG,eAAe,GAAG,CAAC,QAA6B,EAAE,KAAa,KAAmB;IAC3F,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAClD,IAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,qBAAqB,EAAE;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAE7C,IAAA,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE;QACjC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC/C;AACA,IAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAC/B,IAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AAClC,IAAA,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AACnC,IAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AAChC,IAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU;AACpC,IAAA,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY;IACxC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA,EAAA,CAAI;IACtC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA,EAAA,CAAI;AAEpC,IAAA,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AACnD,IAAA,MAAM,CAAC,WAAW,GAAG,QAAQ;AAC7B,IAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAC5B,IAAA,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS;AACrC,IAAA,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;AAEvC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,qBAAqB,EAAE;IACnD,MAAM,CAAC,MAAM,EAAE;AAEf,IAAA,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE;AAC1F;;"}
@@ -0,0 +1,4 @@
1
+ import type { MarkdownEditorLabels } from './MarkdownEditorLabels.js';
2
+ /** The English labels a {@link MarkdownEditor} falls back to for every label the host leaves unset. */
3
+ export declare const defaultMarkdownEditorLabels: Required<MarkdownEditorLabels>;
4
+ //# sourceMappingURL=defaultMarkdownEditorLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultMarkdownEditorLabels.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/defaultMarkdownEditorLabels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAAwB,CAAC;AAEnE,uGAAuG;AACvG,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,oBAAoB,CAmBtE,CAAC"}
@@ -0,0 +1,23 @@
1
+ const defaultMarkdownEditorLabels = {
2
+ editor: 'Markdown',
3
+ toolbar: 'Formatting',
4
+ bold: 'Bold',
5
+ italic: 'Italic',
6
+ strikethrough: 'Strikethrough',
7
+ heading: 'Heading',
8
+ quote: 'Quote',
9
+ code: 'Code',
10
+ codeBlock: 'Code block',
11
+ link: 'Link',
12
+ bulletList: 'Bulleted list',
13
+ numberedList: 'Numbered list',
14
+ taskList: 'Task list',
15
+ showPreview: 'Show preview',
16
+ showMarkdown: 'Show markdown',
17
+ emptyPreview: 'Nothing to preview',
18
+ suggestions: 'Suggestions',
19
+ uploading: fileNames => `Uploading ${fileNames.join(', ')}…`,
20
+ };
21
+
22
+ export { defaultMarkdownEditorLabels };
23
+ //# sourceMappingURL=defaultMarkdownEditorLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultMarkdownEditorLabels.js","sources":["../../../MarkdownEditor/defaultMarkdownEditorLabels.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { MarkdownEditorLabels } from './MarkdownEditorLabels';\n\n/** The English labels a {@link MarkdownEditor} falls back to for every label the host leaves unset. */\nexport const defaultMarkdownEditorLabels: Required<MarkdownEditorLabels> = {\n editor: 'Markdown',\n toolbar: 'Formatting',\n bold: 'Bold',\n italic: 'Italic',\n strikethrough: 'Strikethrough',\n heading: 'Heading',\n quote: 'Quote',\n code: 'Code',\n codeBlock: 'Code block',\n link: 'Link',\n bulletList: 'Bulleted list',\n numberedList: 'Numbered list',\n taskList: 'Task list',\n showPreview: 'Show preview',\n showMarkdown: 'Show markdown',\n emptyPreview: 'Nothing to preview',\n suggestions: 'Suggestions',\n uploading: fileNames => `Uploading ${fileNames.join(', ')}…`,\n};\n"],"names":[],"mappings":"AAMO,MAAM,2BAA2B,GAAmC;AACvE,IAAA,MAAM,EAAE,UAAU;AAClB,IAAA,OAAO,EAAE,YAAY;AACrB,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,aAAa,EAAE,eAAe;AAC9B,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,WAAW,EAAE,cAAc;AAC3B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,YAAY,EAAE,oBAAoB;AAClC,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,SAAS,EAAE,SAAS,IAAI,CAAA,UAAA,EAAa,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;;;"}
@@ -0,0 +1,7 @@
1
+ import { MarkdownFormat } from './MarkdownFormat.js';
2
+ /**
3
+ * The toolbar a {@link MarkdownEditor} shows when the host does not choose one: text styles, then
4
+ * blocks and links, then lists. Each inner list is a group, drawn with a separator between groups.
5
+ */
6
+ export declare const defaultMarkdownFormats: readonly (readonly MarkdownFormat[])[];
7
+ //# sourceMappingURL=defaultMarkdownFormats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultMarkdownFormats.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/defaultMarkdownFormats.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,cAAc,EAAE,CAAC,EAIxE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { MarkdownFormat } from './MarkdownFormat.js';
2
+
3
+ const defaultMarkdownFormats = [
4
+ [MarkdownFormat.Heading, MarkdownFormat.Bold, MarkdownFormat.Italic, MarkdownFormat.Strikethrough],
5
+ [MarkdownFormat.Quote, MarkdownFormat.Code, MarkdownFormat.CodeBlock, MarkdownFormat.Link],
6
+ [MarkdownFormat.BulletList, MarkdownFormat.NumberedList, MarkdownFormat.TaskList],
7
+ ];
8
+
9
+ export { defaultMarkdownFormats };
10
+ //# sourceMappingURL=defaultMarkdownFormats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultMarkdownFormats.js","sources":["../../../MarkdownEditor/defaultMarkdownFormats.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { MarkdownFormat } from './MarkdownFormat';\n\n/**\n * The toolbar a {@link MarkdownEditor} shows when the host does not choose one: text styles, then\n * blocks and links, then lists. Each inner list is a group, drawn with a separator between groups.\n */\nexport const defaultMarkdownFormats: readonly (readonly MarkdownFormat[])[] = [\n [MarkdownFormat.Heading, MarkdownFormat.Bold, MarkdownFormat.Italic, MarkdownFormat.Strikethrough],\n [MarkdownFormat.Quote, MarkdownFormat.Code, MarkdownFormat.CodeBlock, MarkdownFormat.Link],\n [MarkdownFormat.BulletList, MarkdownFormat.NumberedList, MarkdownFormat.TaskList],\n];\n"],"names":[],"mappings":";;AASO,MAAM,sBAAsB,GAA2C;AAC1E,IAAA,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC;AAClG,IAAA,CAAC,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC;IAC1F,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,QAAQ,CAAC;;;"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Picks the files out of a paste or drop payload, ignoring everything that is not a file.
3
+ * @param items The items pasted or dropped.
4
+ * @returns The files among them, in order.
5
+ */
6
+ export declare const filesIn: (items: DataTransferItemList) => File[];
7
+ //# sourceMappingURL=filesIn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesIn.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/filesIn.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,OAAO,UAAW,oBAAoB,KAAG,IAAI,EAIJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ const filesIn = (items) => Array.from(items)
2
+ .filter(item => item.kind === 'file')
3
+ .map(item => item.getAsFile())
4
+ .filter((file) => file !== null);
5
+
6
+ export { filesIn };
7
+ //# sourceMappingURL=filesIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesIn.js","sources":["../../../MarkdownEditor/filesIn.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/**\n * Picks the files out of a paste or drop payload, ignoring everything that is not a file.\n * @param items The items pasted or dropped.\n * @returns The files among them, in order.\n */\nexport const filesIn = (items: DataTransferItemList): File[] =>\n Array.from(items)\n .filter(item => item.kind === 'file')\n .map(item => item.getAsFile())\n .filter((file): file is File => file !== null);\n"],"names":[],"mappings":"AAQO,MAAM,OAAO,GAAG,CAAC,KAA2B,KAC/C,KAAK,CAAC,IAAI,CAAC,KAAK;KACX,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;KACnC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;KAC5B,MAAM,CAAC,CAAC,IAAI,KAAmB,IAAI,KAAK,IAAI;;"}
@@ -0,0 +1,12 @@
1
+ import type { MarkdownCompletion } from './MarkdownCompletion.js';
2
+ import type { MarkdownCompletionMatch } from './MarkdownCompletionMatch.js';
3
+ /**
4
+ * Finds the completion being typed at the caret. When several triggers match, the one that starts
5
+ * closest to the caret wins, because that is the one being typed.
6
+ * @param value The markdown being edited.
7
+ * @param caret The caret position.
8
+ * @param completions The configured completions.
9
+ * @returns The match, or undefined when the caret is not completing anything.
10
+ */
11
+ export declare const findCompletionMatch: (value: string, caret: number, completions: readonly MarkdownCompletion[]) => MarkdownCompletionMatch | undefined;
12
+ //# sourceMappingURL=findCompletionMatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findCompletionMatch.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/findCompletionMatch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA2B,CAAC;AA2BzE;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,UACrB,MAAM,SACN,MAAM,eACA,SAAS,kBAAkB,EAAE,KAC3C,uBAAuB,GAAG,SAsB5B,CAAC"}
@@ -0,0 +1,42 @@
1
+ const whitespace = /\s/u;
2
+ const matchStringTrigger = (line, completion, trigger) => {
3
+ const triggerIndex = line.lastIndexOf(trigger);
4
+ if (triggerIndex === -1)
5
+ return undefined;
6
+ if (triggerIndex > 0 && !whitespace.test(line[triggerIndex - 1]))
7
+ return undefined;
8
+ const typed = line.slice(triggerIndex + trigger.length);
9
+ if (!completion.allowSpaces && whitespace.test(typed))
10
+ return undefined;
11
+ return { start: triggerIndex, query: completion.allowSpaces ? typed.trimStart() : typed };
12
+ };
13
+ const matchPatternTrigger = (line, trigger) => {
14
+ const pattern = new RegExp(trigger.source, trigger.flags.replace(/[gy]/gu, ''));
15
+ const match = pattern.exec(line);
16
+ if (!match || match.index + match[0].length !== line.length)
17
+ return undefined;
18
+ return { start: match.index, query: match.groups?.query ?? match[1] ?? match[0] };
19
+ };
20
+ const findCompletionMatch = (value, caret, completions) => {
21
+ const beforeCaret = value.slice(0, caret);
22
+ const lineStart = beforeCaret.lastIndexOf('\n') + 1;
23
+ const line = beforeCaret.slice(lineStart);
24
+ let best;
25
+ completions.forEach((completion, completionIndex) => {
26
+ const found = typeof completion.trigger === 'string'
27
+ ? completion.trigger.length > 0
28
+ ? matchStringTrigger(line, completion, completion.trigger)
29
+ : undefined
30
+ : matchPatternTrigger(line, completion.trigger);
31
+ if (!found || found.query.length < (completion.minimumQueryLength ?? 0))
32
+ return;
33
+ const start = lineStart + found.start;
34
+ if (!best || start > best.start) {
35
+ best = { completion, completionIndex, start, end: caret, query: found.query };
36
+ }
37
+ });
38
+ return best;
39
+ };
40
+
41
+ export { findCompletionMatch };
42
+ //# sourceMappingURL=findCompletionMatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findCompletionMatch.js","sources":["../../../MarkdownEditor/findCompletionMatch.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { MarkdownCompletion } from './MarkdownCompletion';\nimport type { MarkdownCompletionMatch } from './MarkdownCompletionMatch';\n\ninterface TriggerMatch {\n start: number;\n query: string;\n}\n\nconst whitespace = /\\s/u;\n\nconst matchStringTrigger = (line: string, completion: MarkdownCompletion, trigger: string): TriggerMatch | undefined => {\n const triggerIndex = line.lastIndexOf(trigger);\n if (triggerIndex === -1) return undefined;\n if (triggerIndex > 0 && !whitespace.test(line[triggerIndex - 1])) return undefined;\n\n const typed = line.slice(triggerIndex + trigger.length);\n if (!completion.allowSpaces && whitespace.test(typed)) return undefined;\n\n return { start: triggerIndex, query: completion.allowSpaces ? typed.trimStart() : typed };\n};\n\nconst matchPatternTrigger = (line: string, trigger: RegExp): TriggerMatch | undefined => {\n const pattern = new RegExp(trigger.source, trigger.flags.replace(/[gy]/gu, ''));\n const match = pattern.exec(line);\n if (!match || match.index + match[0].length !== line.length) return undefined;\n return { start: match.index, query: match.groups?.query ?? match[1] ?? match[0] };\n};\n\n/**\n * Finds the completion being typed at the caret. When several triggers match, the one that starts\n * closest to the caret wins, because that is the one being typed.\n * @param value The markdown being edited.\n * @param caret The caret position.\n * @param completions The configured completions.\n * @returns The match, or undefined when the caret is not completing anything.\n */\nexport const findCompletionMatch = (\n value: string,\n caret: number,\n completions: readonly MarkdownCompletion[],\n): MarkdownCompletionMatch | undefined => {\n const beforeCaret = value.slice(0, caret);\n const lineStart = beforeCaret.lastIndexOf('\\n') + 1;\n const line = beforeCaret.slice(lineStart);\n let best: MarkdownCompletionMatch | undefined;\n\n completions.forEach((completion, completionIndex) => {\n const found =\n typeof completion.trigger === 'string'\n ? completion.trigger.length > 0\n ? matchStringTrigger(line, completion, completion.trigger)\n : undefined\n : matchPatternTrigger(line, completion.trigger);\n if (!found || found.query.length < (completion.minimumQueryLength ?? 0)) return;\n\n const start = lineStart + found.start;\n if (!best || start > best.start) {\n best = { completion, completionIndex, start, end: caret, query: found.query };\n }\n });\n\n return best;\n};\n"],"names":[],"mappings":"AAWA,MAAM,UAAU,GAAG,KAAK;AAExB,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,UAA8B,EAAE,OAAe,KAA8B;IACnH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAC9C,IAAI,YAAY,KAAK,EAAE;AAAE,QAAA,OAAO,SAAS;AACzC,IAAA,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,SAAS;AAElF,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,SAAS;IAEvE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,EAAE;AAC7F,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,OAAe,KAA8B;IACpF,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,IAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,SAAS;IAC7E,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;AACrF,CAAC;AAUM,MAAM,mBAAmB,GAAG,CAC/B,KAAa,EACb,KAAa,EACb,WAA0C,KACL;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;AACzC,IAAA,IAAI,IAAyC;IAE7C,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,eAAe,KAAI;AAChD,QAAA,MAAM,KAAK,GACP,OAAO,UAAU,CAAC,OAAO,KAAK;AAC1B,cAAE,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG;kBACxB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO;AACzD,kBAAE;cACJ,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC;AACvD,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,kBAAkB,IAAI,CAAC,CAAC;YAAE;AAEzE,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC,KAAK;QACrC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC7B,YAAA,IAAI,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;QACjF;AACJ,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,IAAI;AACf;;"}
@@ -0,0 +1,5 @@
1
+ import type { ReactNode } from 'react';
2
+ import { MarkdownFormat } from './MarkdownFormat.js';
3
+ /** The glyph drawn on each formatting button. */
4
+ export declare const formatIcons: Record<MarkdownFormat, ReactNode>;
5
+ //# sourceMappingURL=formatIcons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatIcons.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/formatIcons.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAcvC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AAElD,iDAAiD;AACjD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE,SAAS,CAYzD,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { FaListCheck, FaListOl, FaListUl, FaLink, FaFileCode, FaCode, FaQuoteRight, FaStrikethrough, FaItalic, FaBold, FaHeading } from 'react-icons/fa6';
3
+ import { MarkdownFormat } from './MarkdownFormat.js';
4
+
5
+ const formatIcons = {
6
+ [MarkdownFormat.Heading]: jsx(FaHeading, {}),
7
+ [MarkdownFormat.Bold]: jsx(FaBold, {}),
8
+ [MarkdownFormat.Italic]: jsx(FaItalic, {}),
9
+ [MarkdownFormat.Strikethrough]: jsx(FaStrikethrough, {}),
10
+ [MarkdownFormat.Quote]: jsx(FaQuoteRight, {}),
11
+ [MarkdownFormat.Code]: jsx(FaCode, {}),
12
+ [MarkdownFormat.CodeBlock]: jsx(FaFileCode, {}),
13
+ [MarkdownFormat.Link]: jsx(FaLink, {}),
14
+ [MarkdownFormat.BulletList]: jsx(FaListUl, {}),
15
+ [MarkdownFormat.NumberedList]: jsx(FaListOl, {}),
16
+ [MarkdownFormat.TaskList]: jsx(FaListCheck, {}),
17
+ };
18
+
19
+ export { formatIcons };
20
+ //# sourceMappingURL=formatIcons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatIcons.js","sources":["../../../MarkdownEditor/formatIcons.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\nimport {\n FaBold,\n FaCode,\n FaFileCode,\n FaHeading,\n FaItalic,\n FaLink,\n FaListCheck,\n FaListOl,\n FaListUl,\n FaQuoteRight,\n FaStrikethrough,\n} from 'react-icons/fa6';\nimport { MarkdownFormat } from './MarkdownFormat';\n\n/** The glyph drawn on each formatting button. */\nexport const formatIcons: Record<MarkdownFormat, ReactNode> = {\n [MarkdownFormat.Heading]: <FaHeading />,\n [MarkdownFormat.Bold]: <FaBold />,\n [MarkdownFormat.Italic]: <FaItalic />,\n [MarkdownFormat.Strikethrough]: <FaStrikethrough />,\n [MarkdownFormat.Quote]: <FaQuoteRight />,\n [MarkdownFormat.Code]: <FaCode />,\n [MarkdownFormat.CodeBlock]: <FaFileCode />,\n [MarkdownFormat.Link]: <FaLink />,\n [MarkdownFormat.BulletList]: <FaListUl />,\n [MarkdownFormat.NumberedList]: <FaListOl />,\n [MarkdownFormat.TaskList]: <FaListCheck />,\n};\n"],"names":["_jsx"],"mappings":";;;;AAoBO,MAAM,WAAW,GAAsC;AAC1D,IAAA,CAAC,cAAc,CAAC,OAAO,GAAGA,GAAA,CAAC,SAAS,EAAA,EAAA,CAAG;AACvC,IAAA,CAAC,cAAc,CAAC,IAAI,GAAGA,GAAA,CAAC,MAAM,EAAA,EAAA,CAAG;AACjC,IAAA,CAAC,cAAc,CAAC,MAAM,GAAGA,GAAA,CAAC,QAAQ,EAAA,EAAA,CAAG;AACrC,IAAA,CAAC,cAAc,CAAC,aAAa,GAAGA,GAAA,CAAC,eAAe,EAAA,EAAA,CAAG;AACnD,IAAA,CAAC,cAAc,CAAC,KAAK,GAAGA,GAAA,CAAC,YAAY,EAAA,EAAA,CAAG;AACxC,IAAA,CAAC,cAAc,CAAC,IAAI,GAAGA,GAAA,CAAC,MAAM,EAAA,EAAA,CAAG;AACjC,IAAA,CAAC,cAAc,CAAC,SAAS,GAAGA,GAAA,CAAC,UAAU,EAAA,EAAA,CAAG;AAC1C,IAAA,CAAC,cAAc,CAAC,IAAI,GAAGA,GAAA,CAAC,MAAM,EAAA,EAAA,CAAG;AACjC,IAAA,CAAC,cAAc,CAAC,UAAU,GAAGA,GAAA,CAAC,QAAQ,EAAA,EAAA,CAAG;AACzC,IAAA,CAAC,cAAc,CAAC,YAAY,GAAGA,GAAA,CAAC,QAAQ,EAAA,EAAA,CAAG;AAC3C,IAAA,CAAC,cAAc,CAAC,QAAQ,GAAGA,GAAA,CAAC,WAAW,EAAA,EAAA,CAAG;;;"}
@@ -0,0 +1,4 @@
1
+ import { MarkdownFormat } from './MarkdownFormat.js';
2
+ /** The formats reachable with Control (Command on macOS) and a letter, keyed by the lowercase letter. */
3
+ export declare const formatShortcuts: ReadonlyMap<string, MarkdownFormat>;
4
+ //# sourceMappingURL=formatShortcuts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatShortcuts.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/formatShortcuts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AAElD,yGAAyG;AACzG,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAI9D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { MarkdownFormat } from './MarkdownFormat.js';
2
+
3
+ const formatShortcuts = new Map([
4
+ ['b', MarkdownFormat.Bold],
5
+ ['i', MarkdownFormat.Italic],
6
+ ['k', MarkdownFormat.Link],
7
+ ]);
8
+
9
+ export { formatShortcuts };
10
+ //# sourceMappingURL=formatShortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatShortcuts.js","sources":["../../../MarkdownEditor/formatShortcuts.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { MarkdownFormat } from './MarkdownFormat';\n\n/** The formats reachable with Control (Command on macOS) and a letter, keyed by the lowercase letter. */\nexport const formatShortcuts: ReadonlyMap<string, MarkdownFormat> = new Map([\n ['b', MarkdownFormat.Bold],\n ['i', MarkdownFormat.Italic],\n ['k', MarkdownFormat.Link],\n]);\n"],"names":[],"mappings":";;AAMO,MAAM,eAAe,GAAwC,IAAI,GAAG,CAAC;AACxE,IAAA,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC;AAC1B,IAAA,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC;AAC5B,IAAA,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC;AAC7B,CAAA;;"}
@@ -0,0 +1,14 @@
1
+ export { MarkdownEditor } from './MarkdownEditor.js';
2
+ export type { MarkdownEditorProps } from './MarkdownEditor.js';
3
+ export type { MarkdownEditorParts, MarkdownEditorPartAttributes } from './MarkdownEditorParts.js';
4
+ export type { MarkdownEditorLabels } from './MarkdownEditorLabels.js';
5
+ export { MarkdownEditorMode } from './MarkdownEditorMode.js';
6
+ export { MarkdownFormat } from './MarkdownFormat.js';
7
+ export type { MarkdownCompletion } from './MarkdownCompletion.js';
8
+ export type { MarkdownCompletionContext } from './MarkdownCompletionContext.js';
9
+ export type { MarkdownSuggestion } from './MarkdownSuggestion.js';
10
+ export type { MarkdownTextEdit } from './MarkdownTextEdit.js';
11
+ export { applyMarkdownFormat } from './applyMarkdownFormat.js';
12
+ export { defaultMarkdownFormats } from './defaultMarkdownFormats.js';
13
+ export { defaultMarkdownEditorLabels } from './defaultMarkdownEditorLabels.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAkB,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,0BAAuB,CAAC;AAC/F,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAAwB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAC/D,YAAY,EAAE,yBAAyB,EAAE,MAAM,gCAA6B,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAAuB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA0B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAA+B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { MarkdownEditor } from './MarkdownEditor.js';
2
+ export { MarkdownEditorMode } from './MarkdownEditorMode.js';
3
+ export { MarkdownFormat } from './MarkdownFormat.js';
4
+ export { applyMarkdownFormat } from './applyMarkdownFormat.js';
5
+ export { defaultMarkdownFormats } from './defaultMarkdownFormats.js';
6
+ export { defaultMarkdownEditorLabels } from './defaultMarkdownEditorLabels.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,12 @@
1
+ import type { MarkdownTextEdit } from './MarkdownTextEdit.js';
2
+ /**
3
+ * Turns the selection into a markdown link and selects the part still to be written: the address when
4
+ * text was selected, the link text when an address was selected, and the link text of an empty link
5
+ * when nothing was.
6
+ * @param value The markdown being edited.
7
+ * @param start Where the selection starts.
8
+ * @param end Where the selection ends.
9
+ * @returns The edited markdown and the selection after it.
10
+ */
11
+ export declare const insertLink: (value: string, start: number, end: number) => MarkdownTextEdit;
12
+ //# sourceMappingURL=insertLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertLink.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/insertLink.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAoB,CAAC;AAM3D;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,UAAW,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,gBAqBtE,CAAC"}
@@ -0,0 +1,26 @@
1
+ const addressPlaceholder = 'url';
2
+ const textPlaceholder = 'text';
3
+ const looksLikeAnAddress = /^(https?:\/\/|mailto:)\S+$/iu;
4
+ const insertLink = (value, start, end) => {
5
+ const selected = value.slice(start, end);
6
+ const before = value.slice(0, start);
7
+ const after = value.slice(end);
8
+ if (looksLikeAnAddress.test(selected)) {
9
+ return {
10
+ value: `${before}[${textPlaceholder}](${selected})${after}`,
11
+ selectionStart: start + 1,
12
+ selectionEnd: start + 1 + textPlaceholder.length,
13
+ };
14
+ }
15
+ const text = selected.length > 0 ? selected : textPlaceholder;
16
+ const link = `[${text}](${addressPlaceholder})`;
17
+ const addressStart = start + text.length + 3;
18
+ return {
19
+ value: `${before}${link}${after}`,
20
+ selectionStart: selected.length > 0 ? addressStart : start + 1,
21
+ selectionEnd: selected.length > 0 ? addressStart + addressPlaceholder.length : start + 1 + text.length,
22
+ };
23
+ };
24
+
25
+ export { insertLink };
26
+ //# sourceMappingURL=insertLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertLink.js","sources":["../../../MarkdownEditor/insertLink.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { MarkdownTextEdit } from './MarkdownTextEdit';\n\nconst addressPlaceholder = 'url';\nconst textPlaceholder = 'text';\nconst looksLikeAnAddress = /^(https?:\\/\\/|mailto:)\\S+$/iu;\n\n/**\n * Turns the selection into a markdown link and selects the part still to be written: the address when\n * text was selected, the link text when an address was selected, and the link text of an empty link\n * when nothing was.\n * @param value The markdown being edited.\n * @param start Where the selection starts.\n * @param end Where the selection ends.\n * @returns The edited markdown and the selection after it.\n */\nexport const insertLink = (value: string, start: number, end: number): MarkdownTextEdit => {\n const selected = value.slice(start, end);\n const before = value.slice(0, start);\n const after = value.slice(end);\n\n if (looksLikeAnAddress.test(selected)) {\n return {\n value: `${before}[${textPlaceholder}](${selected})${after}`,\n selectionStart: start + 1,\n selectionEnd: start + 1 + textPlaceholder.length,\n };\n }\n\n const text = selected.length > 0 ? selected : textPlaceholder;\n const link = `[${text}](${addressPlaceholder})`;\n const addressStart = start + text.length + 3;\n return {\n value: `${before}${link}${after}`,\n selectionStart: selected.length > 0 ? addressStart : start + 1,\n selectionEnd: selected.length > 0 ? addressStart + addressPlaceholder.length : start + 1 + text.length,\n };\n};\n"],"names":[],"mappings":"AAKA,MAAM,kBAAkB,GAAG,KAAK;AAChC,MAAM,eAAe,GAAG,MAAM;AAC9B,MAAM,kBAAkB,GAAG,8BAA8B;AAWlD,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,KAAsB;IACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAE9B,IAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACnC,OAAO;YACH,KAAK,EAAE,GAAG,MAAM,CAAA,CAAA,EAAI,eAAe,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;YAC3D,cAAc,EAAE,KAAK,GAAG,CAAC;AACzB,YAAA,YAAY,EAAE,KAAK,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM;SACnD;IACL;AAEA,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,eAAe;AAC7D,IAAA,MAAM,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,kBAAkB,GAAG;IAC/C,MAAM,YAAY,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;IAC5C,OAAO;AACH,QAAA,KAAK,EAAE,CAAA,EAAG,MAAM,GAAG,IAAI,CAAA,EAAG,KAAK,CAAA,CAAE;AACjC,QAAA,cAAc,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,GAAG,KAAK,GAAG,CAAC;QAC9D,YAAY,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,GAAG,kBAAkB,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;KACzG;AACL;;"}
@@ -0,0 +1,11 @@
1
+ import type { MarkdownLineBlock } from './MarkdownLineBlock.js';
2
+ /**
3
+ * Finds the whole lines a selection touches. A selection that ends right at the start of a line -
4
+ * what selecting whole lines with the keyboard produces - does not count that line as touched.
5
+ * @param value The markdown being edited.
6
+ * @param start Where the selection starts.
7
+ * @param end Where the selection ends.
8
+ * @returns The touched lines and where they sit in the markdown.
9
+ */
10
+ export declare const lineBlockAround: (value: string, start: number, end: number) => MarkdownLineBlock;
11
+ //# sourceMappingURL=lineBlockAround.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineBlockAround.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/lineBlockAround.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAE7D;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,iBAU3E,CAAC"}
@@ -0,0 +1,14 @@
1
+ const lineBlockAround = (value, start, end) => {
2
+ const effectiveEnd = end > start && value[end - 1] === '\n' ? end - 1 : end;
3
+ const blockStart = value.lastIndexOf('\n', start - 1) + 1;
4
+ const lineBreakAfter = value.indexOf('\n', effectiveEnd);
5
+ const blockEnd = lineBreakAfter === -1 ? value.length : lineBreakAfter;
6
+ return {
7
+ start: blockStart,
8
+ end: blockEnd,
9
+ lines: value.slice(blockStart, blockEnd).split('\n'),
10
+ };
11
+ };
12
+
13
+ export { lineBlockAround };
14
+ //# sourceMappingURL=lineBlockAround.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineBlockAround.js","sources":["../../../MarkdownEditor/lineBlockAround.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { MarkdownLineBlock } from './MarkdownLineBlock';\n\n/**\n * Finds the whole lines a selection touches. A selection that ends right at the start of a line -\n * what selecting whole lines with the keyboard produces - does not count that line as touched.\n * @param value The markdown being edited.\n * @param start Where the selection starts.\n * @param end Where the selection ends.\n * @returns The touched lines and where they sit in the markdown.\n */\nexport const lineBlockAround = (value: string, start: number, end: number): MarkdownLineBlock => {\n const effectiveEnd = end > start && value[end - 1] === '\\n' ? end - 1 : end;\n const blockStart = value.lastIndexOf('\\n', start - 1) + 1;\n const lineBreakAfter = value.indexOf('\\n', effectiveEnd);\n const blockEnd = lineBreakAfter === -1 ? value.length : lineBreakAfter;\n return {\n start: blockStart,\n end: blockEnd,\n lines: value.slice(blockStart, blockEnd).split('\\n'),\n };\n};\n"],"names":[],"mappings":"AAaO,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,KAAuB;IAC5F,MAAM,YAAY,GAAG,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG;AAC3E,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;IACzD,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;AACxD,IAAA,MAAM,QAAQ,GAAG,cAAc,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,cAAc;IACtE,OAAO;AACH,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;KACvD;AACL;;"}
@@ -0,0 +1,8 @@
1
+ import { MarkdownEditorMode } from './MarkdownEditorMode.js';
2
+ /**
3
+ * Works out the mode the mode toggle moves to from the one being shown.
4
+ * @param mode The {@link MarkdownEditorMode} currently on screen.
5
+ * @returns The mode to show next.
6
+ */
7
+ export declare const nextMarkdownEditorMode: (mode: MarkdownEditorMode) => MarkdownEditorMode;
8
+ //# sourceMappingURL=nextMarkdownEditorMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextMarkdownEditorMode.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/nextMarkdownEditorMode.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,SAAU,kBAAkB,KAAG,kBAC6B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { MarkdownEditorMode } from './MarkdownEditorMode.js';
2
+
3
+ const nextMarkdownEditorMode = (mode) => mode === MarkdownEditorMode.Preview ? MarkdownEditorMode.Write : MarkdownEditorMode.Preview;
4
+
5
+ export { nextMarkdownEditorMode };
6
+ //# sourceMappingURL=nextMarkdownEditorMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextMarkdownEditorMode.js","sources":["../../../MarkdownEditor/nextMarkdownEditorMode.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { MarkdownEditorMode } from './MarkdownEditorMode';\n\n/**\n * Works out the mode the mode toggle moves to from the one being shown.\n * @param mode The {@link MarkdownEditorMode} currently on screen.\n * @returns The mode to show next.\n */\nexport const nextMarkdownEditorMode = (mode: MarkdownEditorMode): MarkdownEditorMode =>\n mode === MarkdownEditorMode.Preview ? MarkdownEditorMode.Write : MarkdownEditorMode.Preview;\n"],"names":[],"mappings":";;AAUO,MAAM,sBAAsB,GAAG,CAAC,IAAwB,KAC3D,IAAI,KAAK,kBAAkB,CAAC,OAAO,GAAG,kBAAkB,CAAC,KAAK,GAAG,kBAAkB,CAAC;;"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Replaces an upload placeholder with what it stood for, wherever it ended up.
3
+ *
4
+ * By value rather than by remembered position: the caret moves and other uploads finish while this one
5
+ * is in flight, so the offset the placeholder went in at is stale by the time it comes back. A
6
+ * placeholder that is no longer there - deleted while uploading - leaves the markdown untouched rather
7
+ * than putting the result somewhere arbitrary.
8
+ * @param value The markdown as it is now.
9
+ * @param placeholder The placeholder that was inserted.
10
+ * @param replacement What to put in its place - empty to drop it, as on a failed upload.
11
+ * @returns The markdown with the placeholder resolved.
12
+ */
13
+ export declare const replacePlaceholder: (value: string, placeholder: string, replacement: string) => string;
14
+ //# sourceMappingURL=replacePlaceholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replacePlaceholder.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/replacePlaceholder.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,UAAW,MAAM,eAAe,MAAM,eAAe,MAAM,KAAG,MACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ const replacePlaceholder = (value, placeholder, replacement) => value.includes(placeholder) ? value.replace(placeholder, () => replacement) : value;
2
+
3
+ export { replacePlaceholder };
4
+ //# sourceMappingURL=replacePlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replacePlaceholder.js","sources":["../../../MarkdownEditor/replacePlaceholder.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/**\n * Replaces an upload placeholder with what it stood for, wherever it ended up.\n *\n * By value rather than by remembered position: the caret moves and other uploads finish while this one\n * is in flight, so the offset the placeholder went in at is stale by the time it comes back. A\n * placeholder that is no longer there - deleted while uploading - leaves the markdown untouched rather\n * than putting the result somewhere arbitrary.\n * @param value The markdown as it is now.\n * @param placeholder The placeholder that was inserted.\n * @param replacement What to put in its place - empty to drop it, as on a failed upload.\n * @returns The markdown with the placeholder resolved.\n */\nexport const replacePlaceholder = (value: string, placeholder: string, replacement: string): string =>\n value.includes(placeholder) ? value.replace(placeholder, () => replacement) : value;\n"],"names":[],"mappings":"AAeO,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,WAAmB,EAAE,WAAmB,KACtF,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,WAAW,CAAC,GAAG;;"}
@@ -0,0 +1,12 @@
1
+ import type { MarkdownTextEdit } from './MarkdownTextEdit.js';
2
+ /**
3
+ * Replaces the text between two positions, leaving the caret right after what was put in.
4
+ * An empty range (`start === end`) is a plain insert at the caret.
5
+ * @param value The markdown being edited.
6
+ * @param start Where the replaced range starts.
7
+ * @param end Where the replaced range ends.
8
+ * @param text The text to put in its place.
9
+ * @returns The edited markdown and the caret position after it.
10
+ */
11
+ export declare const replaceRange: (value: string, start: number, end: number, text: string) => MarkdownTextEdit;
12
+ //# sourceMappingURL=replaceRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replaceRange.d.ts","sourceRoot":"","sources":["../../../MarkdownEditor/replaceRange.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAoB,CAAC;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,UAAW,MAAM,SAAS,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAG,gBAOtF,CAAC"}
@@ -0,0 +1,11 @@
1
+ const replaceRange = (value, start, end, text) => {
2
+ const caret = start + text.length;
3
+ return {
4
+ value: `${value.slice(0, start)}${text}${value.slice(end)}`,
5
+ selectionStart: caret,
6
+ selectionEnd: caret,
7
+ };
8
+ };
9
+
10
+ export { replaceRange };
11
+ //# sourceMappingURL=replaceRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replaceRange.js","sources":["../../../MarkdownEditor/replaceRange.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { MarkdownTextEdit } from './MarkdownTextEdit';\n\n/**\n * Replaces the text between two positions, leaving the caret right after what was put in.\n * An empty range (`start === end`) is a plain insert at the caret.\n * @param value The markdown being edited.\n * @param start Where the replaced range starts.\n * @param end Where the replaced range ends.\n * @param text The text to put in its place.\n * @returns The edited markdown and the caret position after it.\n */\nexport const replaceRange = (value: string, start: number, end: number, text: string): MarkdownTextEdit => {\n const caret = start + text.length;\n return {\n value: `${value.slice(0, start)}${text}${value.slice(end)}`,\n selectionStart: caret,\n selectionEnd: caret,\n };\n};\n"],"names":[],"mappings":"AAcO,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,EAAE,IAAY,KAAsB;AACtG,IAAA,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM;IACjC,OAAO;AACH,QAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,EAAG,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAE;AAC3D,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,YAAY,EAAE,KAAK;KACtB;AACL;;"}