@primeui/texteditor-core 0.0.1-alpha.1 → 1.0.0-rc.1

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 (141) hide show
  1. package/LICENSE.md +35 -0
  2. package/README.md +12 -0
  3. package/dist/{chunk-GG56GLXC.mjs → chunks/chunk-25Y5HLDY.mjs} +2 -2
  4. package/dist/chunks/chunk-25Y5HLDY.mjs.map +1 -0
  5. package/dist/{chunk-PT2O4RV7.mjs → chunks/chunk-4BI7WWVV.mjs} +6 -5
  6. package/dist/chunks/chunk-4BI7WWVV.mjs.map +1 -0
  7. package/dist/{chunk-72T5I4O4.mjs → chunks/chunk-4C4R23A3.mjs} +2 -2
  8. package/dist/chunks/chunk-4C4R23A3.mjs.map +1 -0
  9. package/dist/{chunk-PT5V6UYE.mjs → chunks/chunk-4NWX3EPS.mjs} +2 -2
  10. package/dist/chunks/chunk-4NWX3EPS.mjs.map +1 -0
  11. package/dist/{chunk-XKY2VYPW.mjs → chunks/chunk-75IVOL6Q.mjs} +2 -2
  12. package/dist/chunks/chunk-75IVOL6Q.mjs.map +1 -0
  13. package/dist/{chunk-7QCHSEN2.mjs → chunks/chunk-C2TRJCIH.mjs} +2 -2
  14. package/dist/chunks/chunk-C2TRJCIH.mjs.map +1 -0
  15. package/dist/{chunk-AJOKUIQD.mjs → chunks/chunk-C6CEVLOL.mjs} +2 -2
  16. package/dist/chunks/chunk-C6CEVLOL.mjs.map +1 -0
  17. package/dist/{chunk-H3RFOYCT.mjs → chunks/chunk-DAVC2Z22.mjs} +2 -2
  18. package/dist/chunks/chunk-DAVC2Z22.mjs.map +1 -0
  19. package/dist/{chunk-NWRVBNBW.mjs → chunks/chunk-F2THMQFM.mjs} +3 -3
  20. package/dist/chunks/chunk-F2THMQFM.mjs.map +1 -0
  21. package/dist/{chunk-TBQVZVKA.mjs → chunks/chunk-F4KBJIZJ.mjs} +43 -31
  22. package/dist/chunks/chunk-F4KBJIZJ.mjs.map +1 -0
  23. package/dist/{chunk-J5LGTIGS.mjs → chunks/chunk-FLGC65SR.mjs} +2 -2
  24. package/dist/{chunk-J5LGTIGS.mjs.map → chunks/chunk-FLGC65SR.mjs.map} +1 -1
  25. package/dist/{chunk-3RKMABZR.mjs → chunks/chunk-KA3KNPLZ.mjs} +4 -4
  26. package/dist/chunks/chunk-KA3KNPLZ.mjs.map +1 -0
  27. package/dist/{chunk-OGEMGWLR.mjs → chunks/chunk-LHZDU6AA.mjs} +5 -5
  28. package/dist/chunks/chunk-LHZDU6AA.mjs.map +1 -0
  29. package/dist/{chunk-PRFYR67X.mjs → chunks/chunk-LYB4TGKX.mjs} +2 -2
  30. package/dist/chunks/chunk-LYB4TGKX.mjs.map +1 -0
  31. package/dist/{chunk-MNKMKFLQ.mjs → chunks/chunk-MMU3VGMT.mjs} +3 -3
  32. package/dist/chunks/chunk-MMU3VGMT.mjs.map +1 -0
  33. package/dist/{chunk-6YDCG63C.mjs → chunks/chunk-MMY4F74E.mjs} +9 -9
  34. package/dist/chunks/chunk-MMY4F74E.mjs.map +1 -0
  35. package/dist/{chunk-6GY64GPU.mjs → chunks/chunk-MSPB65AH.mjs} +2 -2
  36. package/dist/chunks/chunk-MSPB65AH.mjs.map +1 -0
  37. package/dist/{chunk-KNZAMA6H.mjs → chunks/chunk-NZCWIEXE.mjs} +3 -3
  38. package/dist/chunks/chunk-NZCWIEXE.mjs.map +1 -0
  39. package/dist/{chunk-DXPG5XMX.mjs → chunks/chunk-P4N6CW2J.mjs} +2 -2
  40. package/dist/chunks/chunk-P4N6CW2J.mjs.map +1 -0
  41. package/dist/{chunk-FFCQLWS5.mjs → chunks/chunk-PRW2CBOO.mjs} +2 -2
  42. package/dist/chunks/chunk-PRW2CBOO.mjs.map +1 -0
  43. package/dist/{chunk-IUQKSDKG.mjs → chunks/chunk-PSOP5GNT.mjs} +3 -3
  44. package/dist/chunks/chunk-PSOP5GNT.mjs.map +1 -0
  45. package/dist/{chunk-RH45QRSV.mjs → chunks/chunk-Q7MBG5CT.mjs} +2 -2
  46. package/dist/chunks/chunk-Q7MBG5CT.mjs.map +1 -0
  47. package/dist/{chunk-AUTGNC2Q.mjs → chunks/chunk-QMEKZ64Z.mjs} +6 -6
  48. package/dist/chunks/chunk-QMEKZ64Z.mjs.map +1 -0
  49. package/dist/{chunk-YHMP6AN3.mjs → chunks/chunk-QZUFYVD5.mjs} +4 -4
  50. package/dist/chunks/chunk-QZUFYVD5.mjs.map +1 -0
  51. package/dist/{chunk-22B454VC.mjs → chunks/chunk-RE46J3VH.mjs} +2 -2
  52. package/dist/chunks/chunk-RE46J3VH.mjs.map +1 -0
  53. package/dist/{chunk-MWT5PK3Z.mjs → chunks/chunk-SFUE4QBU.mjs} +2 -2
  54. package/dist/chunks/chunk-SFUE4QBU.mjs.map +1 -0
  55. package/dist/{chunk-TB7ZSSR2.mjs → chunks/chunk-UHENKXGQ.mjs} +2 -2
  56. package/dist/chunks/chunk-UHENKXGQ.mjs.map +1 -0
  57. package/dist/{chunk-GGPBV4BM.mjs → chunks/chunk-UN74246B.mjs} +2 -2
  58. package/dist/chunks/chunk-UN74246B.mjs.map +1 -0
  59. package/dist/{chunk-6ZN5XRH2.mjs → chunks/chunk-UORFAHNO.mjs} +2 -2
  60. package/dist/chunks/chunk-UORFAHNO.mjs.map +1 -0
  61. package/dist/{chunk-E2KXUP3F.mjs → chunks/chunk-VXO6D7N5.mjs} +2 -2
  62. package/dist/chunks/chunk-VXO6D7N5.mjs.map +1 -0
  63. package/dist/{chunk-RQ2HHNI6.mjs → chunks/chunk-XO4UUELZ.mjs} +3 -3
  64. package/dist/chunks/chunk-XO4UUELZ.mjs.map +1 -0
  65. package/dist/{chunk-EA2YI7LA.mjs → chunks/chunk-XOMJOYJG.mjs} +2 -2
  66. package/dist/chunks/chunk-XOMJOYJG.mjs.map +1 -0
  67. package/dist/{chunk-VWGQMUPD.mjs → chunks/chunk-YXOJODMQ.mjs} +3 -3
  68. package/dist/chunks/chunk-YXOJODMQ.mjs.map +1 -0
  69. package/dist/{chunk-XSVIGDQR.mjs → chunks/chunk-Z7KBTB2P.mjs} +2 -2
  70. package/dist/chunks/chunk-Z7KBTB2P.mjs.map +1 -0
  71. package/dist/{chunk-F7BJWPT6.mjs → chunks/chunk-ZSXWDZMQ.mjs} +6 -6
  72. package/dist/chunks/chunk-ZSXWDZMQ.mjs.map +1 -0
  73. package/dist/{chunk-CRAB2MFE.mjs → chunks/chunk-ZUZABDZC.mjs} +2 -2
  74. package/dist/chunks/chunk-ZUZABDZC.mjs.map +1 -0
  75. package/dist/commands/index.mjs +11 -11
  76. package/dist/createTextEditor.mjs +29 -29
  77. package/dist/index.mjs +31 -31
  78. package/dist/plugins/columnWidthPin.mjs +2 -2
  79. package/dist/plugins/contextToolbar.mjs +3 -3
  80. package/dist/plugins/defineTextEditorPlugin.mjs +2 -2
  81. package/dist/plugins/inputRules.mjs +6 -6
  82. package/dist/plugins/keymap.mjs +4 -4
  83. package/dist/plugins/mention.mjs +4 -3
  84. package/dist/plugins/mentionController.mjs +2 -2
  85. package/dist/plugins/placeholder.mjs +3 -3
  86. package/dist/plugins/registry.mjs +2 -2
  87. package/dist/plugins/selectionHighlight.mjs +3 -3
  88. package/dist/plugins/slashCommands.mjs +3 -3
  89. package/dist/plugins/tableOverlay.mjs +4 -4
  90. package/dist/plugins/trailingNode.mjs +2 -2
  91. package/dist/schema/index.mjs +6 -6
  92. package/dist/serialization/index.mjs +3 -3
  93. package/dist/texteditor.classes.mjs +2 -2
  94. package/dist/texteditor.constants.mjs +2 -2
  95. package/dist/texteditor.props.mjs +2 -2
  96. package/dist/texteditor.refs.mjs +2 -2
  97. package/dist/texteditor.state.mjs +2 -2
  98. package/dist/ui/focus.mjs +2 -2
  99. package/dist/ui/index.mjs +7 -7
  100. package/dist/ui/keyboard.mjs +2 -2
  101. package/dist/ui/menu.mjs +2 -2
  102. package/dist/ui/positioning.mjs +3 -3
  103. package/dist/ui/scroll.mjs +2 -2
  104. package/dist/utils/index.mjs +4 -4
  105. package/package.json +6 -10
  106. package/LICENSE +0 -23
  107. package/dist/chunk-22B454VC.mjs.map +0 -1
  108. package/dist/chunk-3RKMABZR.mjs.map +0 -1
  109. package/dist/chunk-6GY64GPU.mjs.map +0 -1
  110. package/dist/chunk-6YDCG63C.mjs.map +0 -1
  111. package/dist/chunk-6ZN5XRH2.mjs.map +0 -1
  112. package/dist/chunk-72T5I4O4.mjs.map +0 -1
  113. package/dist/chunk-7QCHSEN2.mjs.map +0 -1
  114. package/dist/chunk-AJOKUIQD.mjs.map +0 -1
  115. package/dist/chunk-AUTGNC2Q.mjs.map +0 -1
  116. package/dist/chunk-CRAB2MFE.mjs.map +0 -1
  117. package/dist/chunk-DXPG5XMX.mjs.map +0 -1
  118. package/dist/chunk-E2KXUP3F.mjs.map +0 -1
  119. package/dist/chunk-EA2YI7LA.mjs.map +0 -1
  120. package/dist/chunk-F7BJWPT6.mjs.map +0 -1
  121. package/dist/chunk-FFCQLWS5.mjs.map +0 -1
  122. package/dist/chunk-GG56GLXC.mjs.map +0 -1
  123. package/dist/chunk-GGPBV4BM.mjs.map +0 -1
  124. package/dist/chunk-H3RFOYCT.mjs.map +0 -1
  125. package/dist/chunk-IUQKSDKG.mjs.map +0 -1
  126. package/dist/chunk-KNZAMA6H.mjs.map +0 -1
  127. package/dist/chunk-MNKMKFLQ.mjs.map +0 -1
  128. package/dist/chunk-MWT5PK3Z.mjs.map +0 -1
  129. package/dist/chunk-NWRVBNBW.mjs.map +0 -1
  130. package/dist/chunk-OGEMGWLR.mjs.map +0 -1
  131. package/dist/chunk-PRFYR67X.mjs.map +0 -1
  132. package/dist/chunk-PT2O4RV7.mjs.map +0 -1
  133. package/dist/chunk-PT5V6UYE.mjs.map +0 -1
  134. package/dist/chunk-RH45QRSV.mjs.map +0 -1
  135. package/dist/chunk-RQ2HHNI6.mjs.map +0 -1
  136. package/dist/chunk-TB7ZSSR2.mjs.map +0 -1
  137. package/dist/chunk-TBQVZVKA.mjs.map +0 -1
  138. package/dist/chunk-VWGQMUPD.mjs.map +0 -1
  139. package/dist/chunk-XKY2VYPW.mjs.map +0 -1
  140. package/dist/chunk-XSVIGDQR.mjs.map +0 -1
  141. package/dist/chunk-YHMP6AN3.mjs.map +0 -1
package/LICENSE.md ADDED
@@ -0,0 +1,35 @@
1
+ # PrimeUI Pro License
2
+
3
+ This package is a **PrimeUI Pro** component by PrimeTek Informatics — an advanced, framework-independent UI component.
4
+
5
+ PrimeUI Pro components are commercial software. They are not available under the MIT license or a free Community license. A valid commercial license is required.
6
+
7
+ ## How PrimeUI Pro May Be Used
8
+
9
+ This component may be used under either of the following:
10
+
11
+ ### Standalone Commercial License
12
+
13
+ Purchased individually, licensed per developer, perpetual, with one year of updates. The component is framework-independent and may be used with any UI library, including PrimeNG, PrimeReact, PrimeVue, or others.
14
+
15
+ ### Included with PrimeUI Commercial Suite
16
+
17
+ PrimeUI Commercial Suite license holders receive access to all PrimeUI Pro components released within their update period at no additional cost.
18
+
19
+ ## License Key
20
+
21
+ A valid license key is required to use this software. License verification is performed offline, with no telemetry and no remote connection. A missing, invalid, or expired key may cause the software to display a license notice.
22
+
23
+ ## Full Terms
24
+
25
+ The complete license terms, pricing, and renewal information are available at:
26
+
27
+ **https://primeui.dev/licenses/commercial**
28
+
29
+ ## Restrictions
30
+
31
+ This software is distributed as a compiled package. You may not reverse-engineer, decompile, or extract its source code, redistribute it as a component library or development tool, or remove its license mechanisms. Redistributing the component so that third parties can develop with it requires a separate OEM License. See the full terms for details.
32
+
33
+ ---
34
+
35
+ © 2026 PrimeTek Informatics. All rights reserved.
package/README.md CHANGED
@@ -1 +1,13 @@
1
1
  # PrimeUI TextEditor Core
2
+
3
+ `@primeui/texteditor-core` is the framework-agnostic rich text editor API for PrimeUI. It provides the ProseMirror-based document model, extension system, plugin registry, and toolbar API consumed by framework-specific text editor packages.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @primeui/texteditor-core
9
+ ```
10
+
11
+ ## License
12
+
13
+ Licensed under the [PrimeUI Pro License](https://primeui.dev/licenses/commercial) - Copyright (c) [PrimeTek Informatics](https://www.primetek.com.tr)
@@ -38,5 +38,5 @@ var textEditorClasses = {
38
38
  };
39
39
 
40
40
  export { textEditorClasses };
41
- //# sourceMappingURL=chunk-GG56GLXC.mjs.map
42
- //# sourceMappingURL=chunk-GG56GLXC.mjs.map
41
+ //# sourceMappingURL=chunk-25Y5HLDY.mjs.map
42
+ //# sourceMappingURL=chunk-25Y5HLDY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/texteditor.classes.ts"],"names":[],"mappings":";AAAO,IAAM,iBAAA,GAAoB;AAAA,EAC7B,IAAA,EAAM,eAAA;AAAA,EACN,OAAA,EAAS,uBAAA;AAAA,EACT,IAAA,EAAM,oBAAA;AAAA,EACN,OAAA,EAAS,uBAAA;AAAA;AAAA,EAGT,KAAA,EAAO,qBAAA;AAAA,EACP,YAAA,EAAc,6BAAA;AAAA,EACd,aAAA,EAAe,8BAAA;AAAA,EACf,kBAAA,EAAoB,oCAAA;AAAA,EACpB,gBAAA,EAAkB,iCAAA;AAAA;AAAA,EAGlB,SAAA,EAAW,yBAAA;AAAA,EACX,YAAA,EAAc,6BAAA;AAAA,EACd,gBAAA,EAAkB,iCAAA;AAAA;AAAA,EAGlB,cAAA,EAAgB,+BAAA;AAAA,EAChB,WAAA,EAAa,4BAAA;AAAA,EACb,cAAA,EAAgB,+BAAA;AAAA,EAChB,WAAA,EAAa,2BAAA;AAAA;AAAA,EAGb,qBAAA,EAAuB,uCAAA;AAAA,EACvB,YAAA,EAAc,6BAAA;AAAA,EACd,gBAAA,EAAkB,kCAAA;AAAA,EAClB,eAAA,EAAiB,iCAAA;AAAA,EACjB,eAAA,EAAiB,iCAAA;AAAA,EACjB,QAAA,EAAU,yBAAA;AAAA,EACV,WAAA,EAAa,6BAAA;AAAA,EACb,WAAA,EAAa,6BAAA;AAAA;AAAA,EAGb,aAAA,EAAe,8BAAA;AAAA,EACf,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,4BAAA;AAAA,EACb,SAAA,EAAW,yBAAA;AAAA,EACX,sBAAA,EAAwB,wCAAA;AAAA,EACxB,yBAAA,EAA2B;AAC/B","file":"chunk-25Y5HLDY.mjs","sourcesContent":["export const textEditorClasses = {\n root: 'p-text-editor',\n toolbar: 'p-text-editor-toolbar',\n body: 'p-text-editor-body',\n content: 'p-text-editor-content',\n\n // Block mode\n block: 'p-text-editor-block',\n blockContent: 'p-text-editor-block-content',\n blockControls: 'p-text-editor-block-controls',\n blockDropIndicator: 'p-text-editor-block-drop-indicator',\n blockPlaceholder: 'p-text-editor-block-placeholder',\n\n // Navigator\n navigator: 'p-text-editor-navigator',\n navigatorBar: 'p-text-editor-navigator-bar',\n navigatorPopover: 'p-text-editor-navigator-popover',\n\n // Overlays\n contextToolbar: 'p-text-editor-context-toolbar',\n popoverMenu: 'p-text-editor-popover-menu',\n popoverSubmenu: 'p-text-editor-popover-submenu',\n placeholder: 'p-text-editor-placeholder',\n\n // Table\n tableSelectionOutline: 'p-text-editor-table-selection-outline',\n tableTrigger: 'p-text-editor-table-trigger',\n tableTriggerCell: 'p-text-editor-table-trigger-cell',\n tableTriggerCol: 'p-text-editor-table-trigger-col',\n tableTriggerRow: 'p-text-editor-table-trigger-row',\n tableAdd: 'p-text-editor-table-add',\n tableAddCol: 'p-text-editor-table-add-col',\n tableAddRow: 'p-text-editor-table-add-row',\n\n // Inline decorations\n mentionTyping: 'p-text-editor-mention-typing',\n mention: 'p-text-editor-mention',\n slashTyping: 'p-text-editor-slash-typing',\n selection: 'p-text-editor-selection',\n imageUploadPlaceholder: 'p-text-editor-image-upload-placeholder',\n documentUploadPlaceholder: 'p-text-editor-document-upload-placeholder'\n};\n"]}
@@ -1,4 +1,5 @@
1
- import { textEditorClasses } from './chunk-GG56GLXC.mjs';
1
+ import { sanitizeTextAttr } from './chunk-MMU3VGMT.mjs';
2
+ import { textEditorClasses } from './chunk-25Y5HLDY.mjs';
2
3
  import { PluginKey, Plugin } from 'prosemirror-state';
3
4
  import { DecorationSet, Decoration } from 'prosemirror-view';
4
5
 
@@ -129,8 +130,8 @@ function insertMention(view, schema, data, options) {
129
130
  }
130
131
  const id = data && typeof data === "object" && "id" in data ? String(data.id) : null;
131
132
  const mentionNode = schema.nodes.mention.create({
132
- id,
133
- label,
133
+ id: sanitizeTextAttr(id),
134
+ label: sanitizeTextAttr(label) ?? "",
134
135
  data
135
136
  });
136
137
  const tr = view.state.tr.replaceWith(triggerPos, from, mentionNode).insertText("\xA0");
@@ -139,5 +140,5 @@ function insertMention(view, schema, data, options) {
139
140
  }
140
141
 
141
142
  export { createMentionPlugin, insertMention, mentionPluginKey };
142
- //# sourceMappingURL=chunk-PT2O4RV7.mjs.map
143
- //# sourceMappingURL=chunk-PT2O4RV7.mjs.map
143
+ //# sourceMappingURL=chunk-4BI7WWVV.mjs.map
144
+ //# sourceMappingURL=chunk-4BI7WWVV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugins/mention.ts"],"names":[],"mappings":"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","file":"chunk-4BI7WWVV.mjs","sourcesContent":["import type { CaretPosition } from '@primeui/texteditor-types';\nimport type { Node as PMNode, Schema } from 'prosemirror-model';\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { textEditorClasses as classes } from '../texteditor.classes';\nimport { sanitizeTextAttr } from '../utils/url';\n\nexport const mentionPluginKey = new PluginKey('mention');\n\nexport interface MentionUpdate {\n active: boolean;\n text: string;\n position: CaretPosition | null;\n}\n\ninterface MentionPluginCallbacks {\n onUpdate: (update: MentionUpdate) => void;\n}\n\nfunction getCaretCoords(view: EditorView, pos: number): CaretPosition {\n const coords = view.coordsAtPos(pos);\n\n return {\n top: coords.top,\n left: coords.left,\n bottom: coords.bottom,\n height: coords.bottom - coords.top,\n width: 0\n };\n}\n\n/**\n * Scan backwards from cursor to find '@' preceded by whitespace or start of block.\n * Returns the document position of '@' if found, or -1.\n */\nfunction findMentionTrigger(doc: PMNode, cursorPos: number): number {\n const $pos = doc.resolve(cursorPos);\n const parentOffset = $pos.parentOffset;\n const parentText = $pos.parent.textBetween(0, parentOffset, undefined, '\\ufffc');\n\n // Scan backwards from cursor to find '@'\n for (let i = parentText.length - 1; i >= 0; i--) {\n const char = parentText[i];\n\n // Found a space before finding '@' — no mention\n if (char === ' ' || char === '\\n' || char === '\\u00A0') return -1;\n\n if (char === '@') {\n // '@' must be at start of text or preceded by whitespace\n if (i === 0 || parentText[i - 1] === ' ' || parentText[i - 1] === '\\n' || parentText[i - 1] === '\\u00A0') {\n // Convert parent-relative offset to document position\n return $pos.start() + i;\n }\n\n return -1;\n }\n }\n\n return -1;\n}\n\nexport function createMentionPlugin(_schema: Schema, callbacks: MentionPluginCallbacks) {\n let activated = false;\n\n return new Plugin({\n key: mentionPluginKey,\n props: {\n handleDOMEvents: {\n keydown(view, event) {\n if (event.key === 'Escape' && activated) {\n activated = false;\n // Notify directly — the view.update hook early-returns on !activated and can't emit it.\n callbacks.onUpdate({ active: false, text: '', position: null });\n view.dispatch(view.state.tr);\n }\n\n return false;\n },\n blur(view) {\n if (activated) {\n activated = false;\n callbacks.onUpdate({ active: false, text: '', position: null });\n view.dispatch(view.state.tr);\n }\n\n return false;\n }\n },\n handleTextInput(_view, _from, _to, text) {\n if (text.endsWith('@')) {\n activated = true;\n }\n\n return false;\n },\n handleKeyDown(view, event) {\n if (event.key !== 'Backspace') return false;\n\n const { $from, empty } = view.state.selection;\n\n if (!empty) return false;\n\n const parent = $from.parent;\n const offset = $from.parentOffset;\n\n if (offset < 2) return false;\n\n // Check if character before cursor is whitespace\n const charBefore = parent.textBetween(offset - 1, offset, undefined, '\\ufffc');\n\n if (charBefore !== ' ' && charBefore !== '\\u00A0') return false;\n\n // Check if node before the whitespace is a mention\n const $beforeSpace = view.state.doc.resolve($from.pos - 1);\n const mentionNode = $beforeSpace.nodeBefore;\n\n if (!mentionNode || mentionNode.type.name !== 'mention') return false;\n\n // Delete both the whitespace and the mention in one operation\n const tr = view.state.tr.delete($from.pos - 1 - mentionNode.nodeSize, $from.pos);\n\n view.dispatch(tr);\n\n return true;\n },\n decorations(state) {\n if (!activated) return DecorationSet.empty;\n\n const { from } = state.selection;\n const triggerPos = findMentionTrigger(state.doc, from);\n\n if (triggerPos < 0) return DecorationSet.empty;\n\n const deco = Decoration.inline(triggerPos, from, {\n class: classes.mentionTyping,\n 'data-mention-query': 'true'\n });\n\n return DecorationSet.create(state.doc, [deco]);\n }\n },\n view() {\n return {\n update(view) {\n if (!activated) return;\n\n const { from, to } = view.state.selection;\n\n // Deactivate on range selection\n if (from !== to) {\n activated = false;\n callbacks.onUpdate({ active: false, text: '', position: null });\n\n return;\n }\n\n const triggerPos = findMentionTrigger(view.state.doc, from);\n\n if (triggerPos >= 0) {\n const text = from > triggerPos + 1 ? view.state.doc.textBetween(triggerPos + 1, from, undefined, '\\ufffc') : '';\n\n callbacks.onUpdate({\n active: true,\n text,\n position: getCaretCoords(view, triggerPos)\n });\n } else {\n activated = false;\n callbacks.onUpdate({ active: false, text: '', position: null });\n }\n }\n };\n }\n });\n}\n\n/**\n * Insert a mention node, replacing the '@query' text.\n */\nexport function insertMention(view: EditorView, schema: Schema, data: unknown, options?: { filterField?: string; template?: (data: unknown) => string }) {\n const { from } = view.state.selection;\n const triggerPos = findMentionTrigger(view.state.doc, from);\n\n if (triggerPos < 0) return;\n\n // Determine the label\n let label = '';\n\n if (options?.template) {\n label = options.template(data);\n } else if (options?.filterField && data && typeof data === 'object') {\n label = String((data as Record<string, unknown>)[options.filterField] || '');\n } else if (data && typeof data === 'object' && 'name' in data) {\n label = String((data as Record<string, unknown>).name || '');\n } else {\n label = String(data);\n }\n\n const id = data && typeof data === 'object' && 'id' in data ? String((data as Record<string, unknown>).id) : null;\n\n const mentionNode = schema.nodes.mention.create({\n id: sanitizeTextAttr(id),\n label: sanitizeTextAttr(label) ?? '',\n data\n });\n\n // Replace from '@' position to cursor\n const tr = view.state.tr.replaceWith(triggerPos, from, mentionNode).insertText('\\u00A0'); // Non-breaking space after mention\n\n view.dispatch(tr);\n view.focus();\n}\n"]}
@@ -72,5 +72,5 @@ function getSelectionPosition(view) {
72
72
  }
73
73
 
74
74
  export { getMarkAttrs, getParentNodeOfType, getSelectionPosition, isMarkActive, isNodeActive };
75
- //# sourceMappingURL=chunk-72T5I4O4.mjs.map
76
- //# sourceMappingURL=chunk-72T5I4O4.mjs.map
75
+ //# sourceMappingURL=chunk-4C4R23A3.mjs.map
76
+ //# sourceMappingURL=chunk-4C4R23A3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/state/selection.ts"],"names":[],"mappings":"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","file":"chunk-4C4R23A3.mjs","sourcesContent":["import type { EditorState } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport type { MarkType, NodeType } from 'prosemirror-model';\nimport type { CaretPosition } from '@primeui/texteditor-types';\n\nexport function isMarkActive(state: EditorState, markType: MarkType): boolean {\n const { from, $from, to, empty } = state.selection;\n\n if (empty) {\n if (state.storedMarks) return !!markType.isInSet(state.storedMarks);\n\n // At a boundary, $from.marks() reflects the char before the cursor, so a\n // cursor at the left edge of a code span misses it. Also check the mark\n // on the character immediately after the cursor.\n if (markType.isInSet($from.marks())) return true;\n\n const after = $from.nodeAfter;\n\n return !!(after && markType.isInSet(after.marks));\n }\n\n // Active only when the mark fully covers the selection.\n let hasText = false;\n let covered = true;\n\n state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return;\n hasText = true;\n if (!markType.isInSet(node.marks)) covered = false;\n });\n\n return hasText && covered;\n}\n\nexport function getMarkAttrs(state: EditorState, markType: MarkType): Record<string, unknown> | null {\n const { from, $from, to, empty } = state.selection;\n\n if (empty) {\n const mark = markType.isInSet(state.storedMarks || $from.marks()) || (!state.storedMarks && $from.nodeAfter ? markType.isInSet($from.nodeAfter.marks) : null);\n\n return mark ? mark.attrs : null;\n }\n\n // Report an attr only when uniform across the selection; mixed -> null.\n let seen = false;\n const merged: Record<string, unknown> = {};\n\n state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return;\n\n const attrs = (markType.isInSet(node.marks)?.attrs ?? {}) as Record<string, unknown>;\n const keys = new Set([...Object.keys(merged), ...Object.keys(attrs)]);\n\n if (!seen) {\n seen = true;\n Object.assign(merged, attrs);\n\n return;\n }\n\n for (const key of keys) {\n if (merged[key] !== attrs[key]) merged[key] = null;\n }\n });\n\n return seen ? merged : null;\n}\n\nexport function getParentNodeOfType(state: EditorState, nodeType: NodeType): { node: ReturnType<typeof state.doc.nodeAt>; pos: number; depth: number } | null {\n const { $from } = state.selection;\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n\n if (node.type === nodeType) {\n return { node, pos: $from.before(depth), depth };\n }\n }\n\n return null;\n}\n\nexport function isNodeActive(state: EditorState, nodeType: NodeType, attrs?: Record<string, unknown>): boolean {\n const result = getParentNodeOfType(state, nodeType);\n\n if (!result) return false;\n\n if (attrs) {\n return Object.entries(attrs).every(([key, val]) => result.node?.attrs[key] === val);\n }\n\n return true;\n}\n\nexport function getSelectionPosition(view: EditorView): CaretPosition | null {\n const { from, to } = view.state.selection;\n\n if (from === to) return null;\n\n const start = view.coordsAtPos(from);\n const end = view.coordsAtPos(to);\n\n return {\n top: Math.min(start.top, end.top),\n left: start.left,\n bottom: Math.max(start.bottom, end.bottom),\n height: Math.max(start.bottom, end.bottom) - Math.min(start.top, end.top),\n width: Math.abs(end.left - start.left)\n };\n}\n"]}
@@ -6,5 +6,5 @@ var defaultTextEditorState = {
6
6
  };
7
7
 
8
8
  export { defaultTextEditorState };
9
- //# sourceMappingURL=chunk-PT5V6UYE.mjs.map
10
- //# sourceMappingURL=chunk-PT5V6UYE.mjs.map
9
+ //# sourceMappingURL=chunk-4NWX3EPS.mjs.map
10
+ //# sourceMappingURL=chunk-4NWX3EPS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/texteditor.state.ts"],"names":[],"mappings":";AAEO,IAAM,sBAAA,GAA0C;AAAA,EACnD,WAAA,EAAa,IAAA;AAAA,EACb,gBAAA,EAAkB,KAAA;AAAA,EAClB,sBAAA,EAAwB;AAC5B","file":"chunk-4NWX3EPS.mjs","sourcesContent":["import type { TextEditorState } from '@primeui/texteditor-types';\n\nexport const defaultTextEditorState: TextEditorState = {\n formatState: null,\n isMentionEnabled: false,\n isSlashCommandsEnabled: false\n};\n"]}
@@ -22,5 +22,5 @@ function defineTextEditorPlugin(name, install, opts) {
22
22
  }
23
23
 
24
24
  export { defineTextEditorPlugin };
25
- //# sourceMappingURL=chunk-XKY2VYPW.mjs.map
26
- //# sourceMappingURL=chunk-XKY2VYPW.mjs.map
25
+ //# sourceMappingURL=chunk-75IVOL6Q.mjs.map
26
+ //# sourceMappingURL=chunk-75IVOL6Q.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugins/defineTextEditorPlugin.ts"],"names":["plugin"],"mappings":";;;AAoBO,SAAS,sBAAA,CAA2C,IAAA,EAAc,OAAA,EAAiF,IAAA,EAAgD;AACtM,EAAA,MAAM,MAAA,GAAS,YAAA,CAAmE,IAAA,EAAM,CAAC,GAAA,KAAQ;AAC7F,IAAA,MAAM,GAAA,GAAyC;AAAA,MAC3C,eAAA,EAAiB,MAAM,GAAA,CAAI,eAAA,EAAgB;AAAA,MAC3C,kBAAkB,CAAC,OAAA,EAAiB,WAAqB,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAAA,MAC7F,gBAAA,EAAkB,MAAM,GAAA,CAAI,gBAAA,EAAiB;AAAA,MAC7C,OAAA,EAAS,MAAM,GAAA,CAAI,OAAA,EAAQ;AAAA,MAC3B,QAAA,EAAU,MAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MAC7B,yBAAA,EAA2B,CAACA,OAAAA,KAAW,GAAA,CAAI,0BAA0BA,OAAM,CAAA;AAAA,MAC3E,UAAA,EAAY,CAAC,OAAA,KAAY,GAAA,CAAI,WAAW,OAAO,CAAA;AAAA,MAC/C,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,aAAa,GAAA,CAAI;AAAA,KACrB;AAEA,IAAA,OAAO,QAAQ,GAAG,CAAA;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,IAAI,IAAA,EAAM,MAAA,EAAS,MAAA,CAAwC,SAAS,IAAA,CAAK,MAAA;AACzE,EAAA,IAAI,IAAA,EAAM,kBAAA,EAAqB,MAAA,CAAkG,qBAAqB,IAAA,CAAK,kBAAA;AAE3J,EAAA,OAAO,MAAA;AACX","file":"chunk-75IVOL6Q.mjs","sourcesContent":["import { definePlugin } from '@primeui/core';\nimport type { TextEditorInstance, TextEditorPluginContext, TextEditorPluginExpose } from '@primeui/texteditor-types';\nimport type { Plugin as PMPlugin } from 'prosemirror-state';\nimport type { Schema } from 'prosemirror-model';\nimport type { SchemaExtension } from '../schema';\n\nexport interface TextEditorPluginDefineOptions<TOptions = unknown> {\n /** Nodes/marks contributed to the per-instance schema. */\n schema?: SchemaExtension;\n /**\n * ProseMirror plugins added to the INITIAL editor state (e.g. Yjs ySyncPlugin\n * for collaboration). Receives the assembled schema and the plugin's own\n * options, so config-dependent plugins (provider URL, awareness, limits) can\n * be built here rather than via the install-time registerProseMirrorPlugin.\n */\n prosemirrorPlugins?: (schema: Schema, options?: TOptions) => PMPlugin[];\n}\n\n// Defines a TextEditor plugin. `opts.schema` contributes nodes/marks; `opts.prosemirrorPlugins`\n// contributes ProseMirror plugins to the initial state (required for collaboration/Yjs).\nexport function defineTextEditorPlugin<TOptions = unknown>(name: string, install: (context: TextEditorPluginContext<TOptions>) => TextEditorPluginExpose, opts?: TextEditorPluginDefineOptions<TOptions>) {\n const plugin = definePlugin<TOptions, TextEditorPluginExpose, TextEditorInstance>(name, (ctx) => {\n const api: TextEditorPluginContext<TOptions> = {\n getSelectedText: () => ctx.getSelectedText(),\n replaceSelection: (content: string, asHtml?: boolean) => ctx.replaceSelection(content, asHtml),\n getEditorElement: () => ctx.getEditorElement(),\n getView: () => ctx.getView(),\n getState: () => ctx.getState(),\n registerProseMirrorPlugin: (plugin) => ctx.registerProseMirrorPlugin(plugin),\n runCommand: (command) => ctx.runCommand(command),\n options: ctx.options,\n onUnmounted: ctx.onUnmounted\n };\n\n return install(api);\n });\n\n if (opts?.schema) (plugin as { schema?: SchemaExtension }).schema = opts.schema;\n if (opts?.prosemirrorPlugins) (plugin as { prosemirrorPlugins?: TextEditorPluginDefineOptions<TOptions>['prosemirrorPlugins'] }).prosemirrorPlugins = opts.prosemirrorPlugins;\n\n return plugin;\n}\n"]}
@@ -12,5 +12,5 @@ function sanitizeCssValue(value) {
12
12
  }
13
13
 
14
14
  export { sanitizeCssValue };
15
- //# sourceMappingURL=chunk-7QCHSEN2.mjs.map
16
- //# sourceMappingURL=chunk-7QCHSEN2.mjs.map
15
+ //# sourceMappingURL=chunk-C2TRJCIH.mjs.map
16
+ //# sourceMappingURL=chunk-C2TRJCIH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/css.ts"],"names":[],"mappings":";AAEO,SAAS,iBAAiB,KAAA,EAAiD;AAC9E,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAE1B,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAErB,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,IAAA;AAIrB,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,MAAM,KAAA,GAAQ,EAAE,WAAA,EAAY;AAE5B,EAAA,IACI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IACrB,MAAM,QAAA,CAAS,YAAY,CAAA,IAC3B,KAAA,CAAM,SAAS,aAAa,CAAA,IAC5B,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,IACzB,KAAA,CAAM,QAAA,CAAS,cAAc,KAC7B,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IACxB,MAAM,QAAA,CAAS,IAAI,CAAA,IACnB,KAAA,CAAM,SAAS,GAAG,CAAA,IAClB,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EACpB;AACE,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,CAAA;AACX","file":"chunk-C2TRJCIH.mjs","sourcesContent":["// Rejects a CSS value that could inject extra declarations, trigger requests,\n// or break out of the style attribute / serialized markup (mXSS hardening).\nexport function sanitizeCssValue(value: string | null | undefined): string | null {\n if (value == null) return null;\n\n const v = value.trim();\n\n if (v === '') return null;\n\n // Markup/template breakout chars (angle brackets, backtick, backslash).\n // Quotes are allowed: they are legitimate CSS string delimiters (e.g. font-family).\n if (/[<>`\\\\]/.test(v)) return null;\n\n const lower = v.toLowerCase();\n\n if (\n lower.includes('url(') ||\n lower.includes('expression') ||\n lower.includes('javascript:') ||\n lower.includes('behavior') ||\n lower.includes('-moz-binding') ||\n lower.includes('@import') ||\n lower.includes('/*') ||\n lower.includes('}') ||\n lower.includes(';')\n ) {\n return null;\n }\n\n return v;\n}\n"]}
@@ -29,5 +29,5 @@ var defaultTextEditorProps = {
29
29
  };
30
30
 
31
31
  export { defaultTextEditorProps };
32
- //# sourceMappingURL=chunk-AJOKUIQD.mjs.map
33
- //# sourceMappingURL=chunk-AJOKUIQD.mjs.map
32
+ //# sourceMappingURL=chunk-C6CEVLOL.mjs.map
33
+ //# sourceMappingURL=chunk-C6CEVLOL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/texteditor.props.ts"],"names":[],"mappings":";AAEO,IAAM,sBAAA,GAA0C;AAAA,EACnD,KAAA,EAAO,IAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,WAAA,EAAa,IAAA;AAAA,EACb,SAAA,EAAW,MAAA;AAAA,EACX,cAAA,EAAgB,MAAA;AAAA,EAChB,gBAAA,EAAkB,IAAA;AAAA,EAClB,oBAAA,EAAsB,IAAA;AAAA,EACtB,iBAAA,EAAmB,MAAA;AAAA,EACnB,oBAAA,EAAsB,MAAA;AAAA,EACtB,iBAAA,EAAmB,IAAA;AAAA,EACnB,gBAAA,EAAkB,IAAA;AAAA,EAClB,oBAAA,EAAsB,IAAA;AAAA,EACtB,mBAAA,EAAqB,IAAA;AAAA,EACrB,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,KAAA;AAAA,EACV,mBAAA,EAAqB,IAAA;AAAA,EACrB,mBAAA,EAAqB,IAAA;AAAA,EACrB,uBAAA,EAAyB,IAAA;AAAA,EACzB,qBAAA,EAAuB,IAAA;AAAA,EACvB,aAAA,EAAe,MAAA;AAAA,EACf,kBAAA,EAAoB,MAAA;AAAA,EACpB,qBAAA,EAAuB,MAAA;AAAA,EACvB,cAAA,EAAgB,MAAA;AAAA,EAChB,kBAAA,EAAoB,MAAA;AAAA,EACpB,eAAA,EAAiB,MAAA;AAAA,EACjB,OAAA,EAAS;AACb","file":"chunk-C6CEVLOL.mjs","sourcesContent":["import type { TextEditorProps } from '@primeui/texteditor-types';\n\nexport const defaultTextEditorProps: TextEditorProps = {\n value: null,\n mode: null,\n placeholder: null,\n ariaLabel: undefined,\n ariaLabelledby: undefined,\n slashPlaceholder: null,\n checklistPlaceholder: null,\n allowedImageTypes: undefined,\n allowedDocumentTypes: undefined,\n imageMaxFileCount: null,\n imageMaxFileSize: null,\n documentMaxFileCount: null,\n documentMaxFileSize: null,\n navigator: false,\n markdown: false,\n valueChangeDebounce: null,\n minTableColumnWidth: null,\n defaultTableColumnWidth: null,\n defaultHighlightColor: null,\n uploadHandler: undefined,\n imageUploadHandler: undefined,\n documentUploadHandler: undefined,\n mentionHandler: undefined,\n mentionFilterField: undefined,\n mentionTemplate: undefined,\n plugins: undefined\n};\n"]}
@@ -23,5 +23,5 @@ var TEXT_EDITOR_ALLOWED_TYPES = {
23
23
  };
24
24
 
25
25
  export { TEXT_EDITOR_ALLOWED_TYPES, TEXT_EDITOR_FILE_SIZE };
26
- //# sourceMappingURL=chunk-H3RFOYCT.mjs.map
27
- //# sourceMappingURL=chunk-H3RFOYCT.mjs.map
26
+ //# sourceMappingURL=chunk-DAVC2Z22.mjs.map
27
+ //# sourceMappingURL=chunk-DAVC2Z22.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/texteditor.constants.ts"],"names":[],"mappings":";AAOA,IAAM,EAAA,GAAK,IAAA;AACX,IAAM,KAAK,EAAA,GAAK,IAAA;AAMT,IAAM,qBAAA,GAAwB;AAAA,EACjC,QAAQ,CAAA,GAAI,EAAA;AAAA,EACZ,QAAQ,CAAA,GAAI,EAAA;AAAA,EACZ,UAAU,CAAA,GAAI,EAAA;AAAA,EACd,SAAS,CAAA,GAAI,EAAA;AAAA,EACb,SAAS,CAAA,GAAI,EAAA;AAAA,EACb,QAAQ,CAAA,GAAI,EAAA;AAAA,EACZ,UAAU,CAAA,GAAI,EAAA;AAAA,EACd,UAAU,CAAA,GAAI,EAAA;AAAA,EACd,SAAS,CAAA,GAAI,EAAA;AAAA,EACb,QAAQ,EAAA,GAAK,EAAA;AAAA,EACb,gBAAgB,EAAA,GAAK,EAAA;AAAA,EACrB,UAAU,EAAA,GAAK;AACnB;AAMO,IAAM,yBAAA,GAA4B;AAAA,EACrC,UAAA,EAAY,SAAA;AAAA,EACZ,aAAA,EAAe,2CAAA;AAAA,EACf,gBAAA,EAAkB,sDAAA;AAAA,EAClB,kBAAA,EAAoB;AACxB","file":"chunk-DAVC2Z22.mjs","sourcesContent":["/**\n * Public, named constants — exported from `@primeui/texteditor-core` and\n * re-exported by every framework adapter. Demos and customer code should\n * use these instead of inline magic numbers so call sites stay readable\n * and the units of measure are obvious from the identifier.\n */\n\nconst KB = 1024;\nconst MB = KB * 1024;\n\n/**\n * File-size constants in bytes. Use these for `:maxFileSize` on\n * `<TextEditor.ImageUpload>` and `<TextEditor.DocumentUpload>`.\n */\nexport const TEXT_EDITOR_FILE_SIZE = {\n ONE_MB: 1 * MB,\n TWO_MB: 2 * MB,\n THREE_MB: 3 * MB,\n FOUR_MB: 4 * MB,\n FIVE_MB: 5 * MB,\n SIX_MB: 6 * MB,\n SEVEN_MB: 7 * MB,\n EIGHT_MB: 8 * MB,\n NINE_MB: 9 * MB,\n TEN_MB: 10 * MB,\n TWENTY_FIVE_MB: 25 * MB,\n FIFTY_MB: 50 * MB\n} as const;\n\n/**\n * Default upload allow-lists. Override these per-instance via\n * `:allowedTypes` when the application has stricter or laxer rules.\n */\nexport const TEXT_EDITOR_ALLOWED_TYPES = {\n IMAGES_ANY: 'image/*',\n IMAGES_COMMON: 'image/jpeg,image/png,image/gif,image/webp',\n DOCUMENTS_OFFICE: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.csv,.zip',\n DOCUMENTS_PDF_ONLY: '.pdf'\n} as const;\n"]}
@@ -1,4 +1,4 @@
1
- import { textEditorClasses } from './chunk-GG56GLXC.mjs';
1
+ import { textEditorClasses } from './chunk-25Y5HLDY.mjs';
2
2
  import { Plugin } from 'prosemirror-state';
3
3
  import { DecorationSet, Decoration } from 'prosemirror-view';
4
4
 
@@ -61,5 +61,5 @@ function createPlaceholderPlugin(options) {
61
61
  }
62
62
 
63
63
  export { createPlaceholderPlugin };
64
- //# sourceMappingURL=chunk-NWRVBNBW.mjs.map
65
- //# sourceMappingURL=chunk-NWRVBNBW.mjs.map
64
+ //# sourceMappingURL=chunk-F2THMQFM.mjs.map
65
+ //# sourceMappingURL=chunk-F2THMQFM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugins/placeholder.ts"],"names":[],"mappings":"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","file":"chunk-F2THMQFM.mjs","sourcesContent":["import { Plugin } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { textEditorClasses as classes } from '../texteditor.classes';\n\ninterface PlaceholderOptions {\n text: () => string | null | undefined;\n blockMode?: boolean;\n}\n\nexport function createPlaceholderPlugin(options: PlaceholderOptions) {\n return new Plugin({\n props: {\n decorations(state) {\n const text = options.text();\n\n if (!text) return DecorationSet.empty;\n\n const { doc, selection } = state;\n\n if (options.blockMode) {\n // Block mode: show placeholder widget inside the focused empty block\n const decorations: Decoration[] = [];\n const { $from } = selection;\n\n // Find the position inside the empty textblock to place the widget\n const addPlaceholderWidget = (insidePos: number) => {\n const widget = Decoration.widget(\n insidePos,\n () => {\n const span = document.createElement('span');\n\n span.className = classes.blockPlaceholder;\n span.textContent = text!;\n\n return span;\n },\n { side: -1 }\n );\n\n decorations.push(widget);\n };\n\n const compoundTypes = ['bullet_list', 'ordered_list', 'blockquote'];\n\n doc.forEach((node, pos) => {\n // Only show on the focused block\n const isFocused = $from.pos >= pos && $from.pos <= pos + node.nodeSize;\n\n if (!isFocused) return;\n\n if (node.isTextblock && node.content.size === 0) {\n // Direct textblock (paragraph, heading, code_block)\n addPlaceholderWidget(pos + 1);\n } else if (compoundTypes.includes(node.type.name) && node.firstChild) {\n // Lists/blockquote — find the innermost empty textblock\n let child = node.firstChild;\n let childPos = pos + 1;\n\n while (child && !child.isTextblock) {\n childPos += 1;\n child = child.firstChild!;\n }\n\n if (child?.isTextblock && child.content.size === 0) {\n addPlaceholderWidget(childPos + 1);\n }\n }\n });\n\n return decorations.length > 0 ? DecorationSet.create(doc, decorations) : DecorationSet.empty;\n }\n\n // Simple mode: only show when document is empty (single empty paragraph)\n if (doc.childCount > 1) return DecorationSet.empty;\n\n const firstChild = doc.firstChild;\n\n if (!firstChild || firstChild.type.name !== 'paragraph' || firstChild.content.size > 0) {\n return DecorationSet.empty;\n }\n\n const decoration = Decoration.node(0, firstChild.nodeSize, {\n class: classes.placeholder,\n 'data-placeholder': text\n });\n\n return DecorationSet.create(doc, [decoration]);\n }\n }\n });\n}\n"]}
@@ -1,25 +1,25 @@
1
- import { createMentionPlugin, insertMention } from './chunk-PT2O4RV7.mjs';
2
- import { createEditorKeymap, keymap, baseKeymap } from './chunk-YHMP6AN3.mjs';
3
- import { createMarkdownInputRules } from './chunk-OGEMGWLR.mjs';
4
- import { createContextToolbarPlugin } from './chunk-IUQKSDKG.mjs';
5
- import { createColumnWidthPinPlugin } from './chunk-MWT5PK3Z.mjs';
6
- import { createTrailingNodePlugin } from './chunk-EA2YI7LA.mjs';
7
- import { createTableOverlayPlugin } from './chunk-3RKMABZR.mjs';
8
- import { createSlashPlugin, executeSlashCommand } from './chunk-KNZAMA6H.mjs';
9
- import { addProseMirrorPlugin, removeProseMirrorPlugin } from './chunk-6GY64GPU.mjs';
10
- import { createPlaceholderPlugin } from './chunk-NWRVBNBW.mjs';
11
- import { createMentionController } from './chunk-GGPBV4BM.mjs';
12
- import { defaultTextEditorProps } from './chunk-AJOKUIQD.mjs';
13
- import { defaultTextEditorRefs } from './chunk-E2KXUP3F.mjs';
14
- import { defaultTextEditorState } from './chunk-PT5V6UYE.mjs';
15
- import { htmlExceedsMaxDepth, htmlToSlice, htmlToDoc, htmlToInertFragment } from './chunk-PRFYR67X.mjs';
16
- import { createEditorSchema } from './chunk-AUTGNC2Q.mjs';
17
- import { selectRow, selectColumn, createCommands, createTableCellCommands, createTableRowCommands, createTableColumnCommands } from './chunk-6YDCG63C.mjs';
18
- import { getSelectionPosition, getMarkAttrs, isNodeActive, isMarkActive } from './chunk-72T5I4O4.mjs';
19
- import { createSelectionHighlightPlugin, preserveSelection } from './chunk-RQ2HHNI6.mjs';
20
- import { docToHtml, withoutPlaceholders, nodeToHtml } from './chunk-6ZN5XRH2.mjs';
21
- import { sanitizeImageUrl, sanitizeUrl } from './chunk-MNKMKFLQ.mjs';
22
- import { textEditorClasses } from './chunk-GG56GLXC.mjs';
1
+ import { createMentionPlugin, insertMention } from './chunk-4BI7WWVV.mjs';
2
+ import { createEditorKeymap, keymap, baseKeymap } from './chunk-QZUFYVD5.mjs';
3
+ import { createMarkdownInputRules } from './chunk-LHZDU6AA.mjs';
4
+ import { createContextToolbarPlugin } from './chunk-PSOP5GNT.mjs';
5
+ import { createColumnWidthPinPlugin } from './chunk-SFUE4QBU.mjs';
6
+ import { createTrailingNodePlugin } from './chunk-XOMJOYJG.mjs';
7
+ import { createTableOverlayPlugin } from './chunk-KA3KNPLZ.mjs';
8
+ import { createSlashPlugin, executeSlashCommand } from './chunk-NZCWIEXE.mjs';
9
+ import { addProseMirrorPlugin, removeProseMirrorPlugin } from './chunk-MSPB65AH.mjs';
10
+ import { createPlaceholderPlugin } from './chunk-F2THMQFM.mjs';
11
+ import { createMentionController } from './chunk-UN74246B.mjs';
12
+ import { defaultTextEditorProps } from './chunk-C6CEVLOL.mjs';
13
+ import { defaultTextEditorRefs } from './chunk-VXO6D7N5.mjs';
14
+ import { defaultTextEditorState } from './chunk-4NWX3EPS.mjs';
15
+ import { htmlExceedsMaxDepth, htmlToSlice, htmlToDoc, htmlToInertFragment } from './chunk-LYB4TGKX.mjs';
16
+ import { createEditorSchema } from './chunk-QMEKZ64Z.mjs';
17
+ import { selectRow, selectColumn, createCommands, createTableCellCommands, createTableRowCommands, createTableColumnCommands } from './chunk-MMY4F74E.mjs';
18
+ import { getSelectionPosition, getMarkAttrs, isNodeActive, isMarkActive } from './chunk-4C4R23A3.mjs';
19
+ import { createSelectionHighlightPlugin, preserveSelection } from './chunk-XO4UUELZ.mjs';
20
+ import { docToHtml, withoutPlaceholders, nodeToHtml } from './chunk-UORFAHNO.mjs';
21
+ import { sanitizeImageUrl, sanitizeUrl } from './chunk-MMU3VGMT.mjs';
22
+ import { textEditorClasses } from './chunk-25Y5HLDY.mjs';
23
23
  import { defineComponent } from '@primeui/core';
24
24
  import { dropCursor } from 'prosemirror-dropcursor';
25
25
  import { gapCursor } from 'prosemirror-gapcursor';
@@ -217,22 +217,28 @@ function createBlockTableNodeView(node, view, getPos, options) {
217
217
  contentWrapper.className = textEditorClasses.blockContent;
218
218
  contentWrapper.appendChild(tableNV.dom);
219
219
  dom.appendChild(contentWrapper);
220
- dom.addEventListener("mouseenter", () => {
220
+ const onMouseEnter = () => {
221
221
  const pos = getPos();
222
222
  if (pos != null) options.onBlockHoverChange(posToBlockIndex(view.state.doc, pos), dom);
223
- });
224
- dom.addEventListener("mouseleave", (event) => {
223
+ };
224
+ const onMouseLeave = (event) => {
225
225
  const related = event.relatedTarget;
226
226
  if (related?.closest(`.${textEditorClasses.blockControls}`)) return;
227
227
  if (related?.closest(`.${textEditorClasses.block}`)) return;
228
228
  if (related?.closest(`.${textEditorClasses.popoverMenu}`)) return;
229
229
  options.onBlockHoverChange(-1, null);
230
- });
230
+ };
231
+ dom.addEventListener("mouseenter", onMouseEnter);
232
+ dom.addEventListener("mouseleave", onMouseLeave);
231
233
  return {
232
234
  dom,
233
235
  contentDOM: tableNV.contentDOM,
234
236
  update: tableNV.update?.bind(tableNV),
235
- ignoreMutation: tableNV.ignoreMutation?.bind(tableNV)
237
+ ignoreMutation: tableNV.ignoreMutation?.bind(tableNV),
238
+ destroy() {
239
+ dom.removeEventListener("mouseenter", onMouseEnter);
240
+ dom.removeEventListener("mouseleave", onMouseLeave);
241
+ }
236
242
  };
237
243
  }
238
244
 
@@ -246,7 +252,7 @@ function checkListItemNodeView(node, view, getPos) {
246
252
  checkbox.type = "checkbox";
247
253
  checkbox.checked = node.attrs.checked;
248
254
  checkbox.setAttribute("aria-label", node.textContent || "To-do item");
249
- checkbox.addEventListener("change", () => {
255
+ const onChange = () => {
250
256
  const pos = getPos();
251
257
  if (pos == null) return;
252
258
  const tr = view.state.tr.setNodeMarkup(pos, null, {
@@ -254,7 +260,8 @@ function checkListItemNodeView(node, view, getPos) {
254
260
  checked: checkbox.checked
255
261
  });
256
262
  view.dispatch(tr);
257
- });
263
+ };
264
+ checkbox.addEventListener("change", onChange);
258
265
  const span = document.createElement("span");
259
266
  label.appendChild(checkbox);
260
267
  label.appendChild(span);
@@ -270,6 +277,9 @@ function checkListItemNodeView(node, view, getPos) {
270
277
  checkbox.checked = updatedNode.attrs.checked;
271
278
  checkbox.setAttribute("aria-label", updatedNode.textContent || "To-do item");
272
279
  return true;
280
+ },
281
+ destroy() {
282
+ checkbox.removeEventListener("change", onChange);
273
283
  }
274
284
  };
275
285
  }
@@ -1564,6 +1574,8 @@ function useTextEditorLogic(instance) {
1564
1574
  onUnmounted(() => {
1565
1575
  flushValueChange();
1566
1576
  navigatorModule.cancel();
1577
+ uploadModule.dismissImageUpload();
1578
+ uploadModule.dismissDocumentUpload();
1567
1579
  pendingMouseUpRemover?.();
1568
1580
  pendingMouseUpRemover = null;
1569
1581
  if (view) {
@@ -1887,5 +1899,5 @@ var createTextEditor = defineComponent("TextEditor", ({ getCurrentInstance, defi
1887
1899
  });
1888
1900
 
1889
1901
  export { createTextEditor };
1890
- //# sourceMappingURL=chunk-TBQVZVKA.mjs.map
1891
- //# sourceMappingURL=chunk-TBQVZVKA.mjs.map
1902
+ //# sourceMappingURL=chunk-F4KBJIZJ.mjs.map
1903
+ //# sourceMappingURL=chunk-F4KBJIZJ.mjs.map