@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.
- package/LICENSE.md +35 -0
- package/README.md +12 -0
- package/dist/{chunk-GG56GLXC.mjs → chunks/chunk-25Y5HLDY.mjs} +2 -2
- package/dist/chunks/chunk-25Y5HLDY.mjs.map +1 -0
- package/dist/{chunk-PT2O4RV7.mjs → chunks/chunk-4BI7WWVV.mjs} +6 -5
- package/dist/chunks/chunk-4BI7WWVV.mjs.map +1 -0
- package/dist/{chunk-72T5I4O4.mjs → chunks/chunk-4C4R23A3.mjs} +2 -2
- package/dist/chunks/chunk-4C4R23A3.mjs.map +1 -0
- package/dist/{chunk-PT5V6UYE.mjs → chunks/chunk-4NWX3EPS.mjs} +2 -2
- package/dist/chunks/chunk-4NWX3EPS.mjs.map +1 -0
- package/dist/{chunk-XKY2VYPW.mjs → chunks/chunk-75IVOL6Q.mjs} +2 -2
- package/dist/chunks/chunk-75IVOL6Q.mjs.map +1 -0
- package/dist/{chunk-7QCHSEN2.mjs → chunks/chunk-C2TRJCIH.mjs} +2 -2
- package/dist/chunks/chunk-C2TRJCIH.mjs.map +1 -0
- package/dist/{chunk-AJOKUIQD.mjs → chunks/chunk-C6CEVLOL.mjs} +2 -2
- package/dist/chunks/chunk-C6CEVLOL.mjs.map +1 -0
- package/dist/{chunk-H3RFOYCT.mjs → chunks/chunk-DAVC2Z22.mjs} +2 -2
- package/dist/chunks/chunk-DAVC2Z22.mjs.map +1 -0
- package/dist/{chunk-NWRVBNBW.mjs → chunks/chunk-F2THMQFM.mjs} +3 -3
- package/dist/chunks/chunk-F2THMQFM.mjs.map +1 -0
- package/dist/{chunk-TBQVZVKA.mjs → chunks/chunk-F4KBJIZJ.mjs} +43 -31
- package/dist/chunks/chunk-F4KBJIZJ.mjs.map +1 -0
- package/dist/{chunk-J5LGTIGS.mjs → chunks/chunk-FLGC65SR.mjs} +2 -2
- package/dist/{chunk-J5LGTIGS.mjs.map → chunks/chunk-FLGC65SR.mjs.map} +1 -1
- package/dist/{chunk-3RKMABZR.mjs → chunks/chunk-KA3KNPLZ.mjs} +4 -4
- package/dist/chunks/chunk-KA3KNPLZ.mjs.map +1 -0
- package/dist/{chunk-OGEMGWLR.mjs → chunks/chunk-LHZDU6AA.mjs} +5 -5
- package/dist/chunks/chunk-LHZDU6AA.mjs.map +1 -0
- package/dist/{chunk-PRFYR67X.mjs → chunks/chunk-LYB4TGKX.mjs} +2 -2
- package/dist/chunks/chunk-LYB4TGKX.mjs.map +1 -0
- package/dist/{chunk-MNKMKFLQ.mjs → chunks/chunk-MMU3VGMT.mjs} +3 -3
- package/dist/chunks/chunk-MMU3VGMT.mjs.map +1 -0
- package/dist/{chunk-6YDCG63C.mjs → chunks/chunk-MMY4F74E.mjs} +9 -9
- package/dist/chunks/chunk-MMY4F74E.mjs.map +1 -0
- package/dist/{chunk-6GY64GPU.mjs → chunks/chunk-MSPB65AH.mjs} +2 -2
- package/dist/chunks/chunk-MSPB65AH.mjs.map +1 -0
- package/dist/{chunk-KNZAMA6H.mjs → chunks/chunk-NZCWIEXE.mjs} +3 -3
- package/dist/chunks/chunk-NZCWIEXE.mjs.map +1 -0
- package/dist/{chunk-DXPG5XMX.mjs → chunks/chunk-P4N6CW2J.mjs} +2 -2
- package/dist/chunks/chunk-P4N6CW2J.mjs.map +1 -0
- package/dist/{chunk-FFCQLWS5.mjs → chunks/chunk-PRW2CBOO.mjs} +2 -2
- package/dist/chunks/chunk-PRW2CBOO.mjs.map +1 -0
- package/dist/{chunk-IUQKSDKG.mjs → chunks/chunk-PSOP5GNT.mjs} +3 -3
- package/dist/chunks/chunk-PSOP5GNT.mjs.map +1 -0
- package/dist/{chunk-RH45QRSV.mjs → chunks/chunk-Q7MBG5CT.mjs} +2 -2
- package/dist/chunks/chunk-Q7MBG5CT.mjs.map +1 -0
- package/dist/{chunk-AUTGNC2Q.mjs → chunks/chunk-QMEKZ64Z.mjs} +6 -6
- package/dist/chunks/chunk-QMEKZ64Z.mjs.map +1 -0
- package/dist/{chunk-YHMP6AN3.mjs → chunks/chunk-QZUFYVD5.mjs} +4 -4
- package/dist/chunks/chunk-QZUFYVD5.mjs.map +1 -0
- package/dist/{chunk-22B454VC.mjs → chunks/chunk-RE46J3VH.mjs} +2 -2
- package/dist/chunks/chunk-RE46J3VH.mjs.map +1 -0
- package/dist/{chunk-MWT5PK3Z.mjs → chunks/chunk-SFUE4QBU.mjs} +2 -2
- package/dist/chunks/chunk-SFUE4QBU.mjs.map +1 -0
- package/dist/{chunk-TB7ZSSR2.mjs → chunks/chunk-UHENKXGQ.mjs} +2 -2
- package/dist/chunks/chunk-UHENKXGQ.mjs.map +1 -0
- package/dist/{chunk-GGPBV4BM.mjs → chunks/chunk-UN74246B.mjs} +2 -2
- package/dist/chunks/chunk-UN74246B.mjs.map +1 -0
- package/dist/{chunk-6ZN5XRH2.mjs → chunks/chunk-UORFAHNO.mjs} +2 -2
- package/dist/chunks/chunk-UORFAHNO.mjs.map +1 -0
- package/dist/{chunk-E2KXUP3F.mjs → chunks/chunk-VXO6D7N5.mjs} +2 -2
- package/dist/chunks/chunk-VXO6D7N5.mjs.map +1 -0
- package/dist/{chunk-RQ2HHNI6.mjs → chunks/chunk-XO4UUELZ.mjs} +3 -3
- package/dist/chunks/chunk-XO4UUELZ.mjs.map +1 -0
- package/dist/{chunk-EA2YI7LA.mjs → chunks/chunk-XOMJOYJG.mjs} +2 -2
- package/dist/chunks/chunk-XOMJOYJG.mjs.map +1 -0
- package/dist/{chunk-VWGQMUPD.mjs → chunks/chunk-YXOJODMQ.mjs} +3 -3
- package/dist/chunks/chunk-YXOJODMQ.mjs.map +1 -0
- package/dist/{chunk-XSVIGDQR.mjs → chunks/chunk-Z7KBTB2P.mjs} +2 -2
- package/dist/chunks/chunk-Z7KBTB2P.mjs.map +1 -0
- package/dist/{chunk-F7BJWPT6.mjs → chunks/chunk-ZSXWDZMQ.mjs} +6 -6
- package/dist/chunks/chunk-ZSXWDZMQ.mjs.map +1 -0
- package/dist/{chunk-CRAB2MFE.mjs → chunks/chunk-ZUZABDZC.mjs} +2 -2
- package/dist/chunks/chunk-ZUZABDZC.mjs.map +1 -0
- package/dist/commands/index.mjs +11 -11
- package/dist/createTextEditor.mjs +29 -29
- package/dist/index.mjs +31 -31
- package/dist/plugins/columnWidthPin.mjs +2 -2
- package/dist/plugins/contextToolbar.mjs +3 -3
- package/dist/plugins/defineTextEditorPlugin.mjs +2 -2
- package/dist/plugins/inputRules.mjs +6 -6
- package/dist/plugins/keymap.mjs +4 -4
- package/dist/plugins/mention.mjs +4 -3
- package/dist/plugins/mentionController.mjs +2 -2
- package/dist/plugins/placeholder.mjs +3 -3
- package/dist/plugins/registry.mjs +2 -2
- package/dist/plugins/selectionHighlight.mjs +3 -3
- package/dist/plugins/slashCommands.mjs +3 -3
- package/dist/plugins/tableOverlay.mjs +4 -4
- package/dist/plugins/trailingNode.mjs +2 -2
- package/dist/schema/index.mjs +6 -6
- package/dist/serialization/index.mjs +3 -3
- package/dist/texteditor.classes.mjs +2 -2
- package/dist/texteditor.constants.mjs +2 -2
- package/dist/texteditor.props.mjs +2 -2
- package/dist/texteditor.refs.mjs +2 -2
- package/dist/texteditor.state.mjs +2 -2
- package/dist/ui/focus.mjs +2 -2
- package/dist/ui/index.mjs +7 -7
- package/dist/ui/keyboard.mjs +2 -2
- package/dist/ui/menu.mjs +2 -2
- package/dist/ui/positioning.mjs +3 -3
- package/dist/ui/scroll.mjs +2 -2
- package/dist/utils/index.mjs +4 -4
- package/package.json +6 -10
- package/LICENSE +0 -23
- package/dist/chunk-22B454VC.mjs.map +0 -1
- package/dist/chunk-3RKMABZR.mjs.map +0 -1
- package/dist/chunk-6GY64GPU.mjs.map +0 -1
- package/dist/chunk-6YDCG63C.mjs.map +0 -1
- package/dist/chunk-6ZN5XRH2.mjs.map +0 -1
- package/dist/chunk-72T5I4O4.mjs.map +0 -1
- package/dist/chunk-7QCHSEN2.mjs.map +0 -1
- package/dist/chunk-AJOKUIQD.mjs.map +0 -1
- package/dist/chunk-AUTGNC2Q.mjs.map +0 -1
- package/dist/chunk-CRAB2MFE.mjs.map +0 -1
- package/dist/chunk-DXPG5XMX.mjs.map +0 -1
- package/dist/chunk-E2KXUP3F.mjs.map +0 -1
- package/dist/chunk-EA2YI7LA.mjs.map +0 -1
- package/dist/chunk-F7BJWPT6.mjs.map +0 -1
- package/dist/chunk-FFCQLWS5.mjs.map +0 -1
- package/dist/chunk-GG56GLXC.mjs.map +0 -1
- package/dist/chunk-GGPBV4BM.mjs.map +0 -1
- package/dist/chunk-H3RFOYCT.mjs.map +0 -1
- package/dist/chunk-IUQKSDKG.mjs.map +0 -1
- package/dist/chunk-KNZAMA6H.mjs.map +0 -1
- package/dist/chunk-MNKMKFLQ.mjs.map +0 -1
- package/dist/chunk-MWT5PK3Z.mjs.map +0 -1
- package/dist/chunk-NWRVBNBW.mjs.map +0 -1
- package/dist/chunk-OGEMGWLR.mjs.map +0 -1
- package/dist/chunk-PRFYR67X.mjs.map +0 -1
- package/dist/chunk-PT2O4RV7.mjs.map +0 -1
- package/dist/chunk-PT5V6UYE.mjs.map +0 -1
- package/dist/chunk-RH45QRSV.mjs.map +0 -1
- package/dist/chunk-RQ2HHNI6.mjs.map +0 -1
- package/dist/chunk-TB7ZSSR2.mjs.map +0 -1
- package/dist/chunk-TBQVZVKA.mjs.map +0 -1
- package/dist/chunk-VWGQMUPD.mjs.map +0 -1
- package/dist/chunk-XKY2VYPW.mjs.map +0 -1
- package/dist/chunk-XSVIGDQR.mjs.map +0 -1
- 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)
|
|
@@ -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 {
|
|
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-
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|
|
@@ -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-
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|
|
@@ -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-
|
|
33
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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-
|
|
65
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
2
|
-
import { createEditorKeymap, keymap, baseKeymap } from './chunk-
|
|
3
|
-
import { createMarkdownInputRules } from './chunk-
|
|
4
|
-
import { createContextToolbarPlugin } from './chunk-
|
|
5
|
-
import { createColumnWidthPinPlugin } from './chunk-
|
|
6
|
-
import { createTrailingNodePlugin } from './chunk-
|
|
7
|
-
import { createTableOverlayPlugin } from './chunk-
|
|
8
|
-
import { createSlashPlugin, executeSlashCommand } from './chunk-
|
|
9
|
-
import { addProseMirrorPlugin, removeProseMirrorPlugin } from './chunk-
|
|
10
|
-
import { createPlaceholderPlugin } from './chunk-
|
|
11
|
-
import { createMentionController } from './chunk-
|
|
12
|
-
import { defaultTextEditorProps } from './chunk-
|
|
13
|
-
import { defaultTextEditorRefs } from './chunk-
|
|
14
|
-
import { defaultTextEditorState } from './chunk-
|
|
15
|
-
import { htmlExceedsMaxDepth, htmlToSlice, htmlToDoc, htmlToInertFragment } from './chunk-
|
|
16
|
-
import { createEditorSchema } from './chunk-
|
|
17
|
-
import { selectRow, selectColumn, createCommands, createTableCellCommands, createTableRowCommands, createTableColumnCommands } from './chunk-
|
|
18
|
-
import { getSelectionPosition, getMarkAttrs, isNodeActive, isMarkActive } from './chunk-
|
|
19
|
-
import { createSelectionHighlightPlugin, preserveSelection } from './chunk-
|
|
20
|
-
import { docToHtml, withoutPlaceholders, nodeToHtml } from './chunk-
|
|
21
|
-
import { sanitizeImageUrl, sanitizeUrl } from './chunk-
|
|
22
|
-
import { textEditorClasses } from './chunk-
|
|
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
|
-
|
|
220
|
+
const onMouseEnter = () => {
|
|
221
221
|
const pos = getPos();
|
|
222
222
|
if (pos != null) options.onBlockHoverChange(posToBlockIndex(view.state.doc, pos), dom);
|
|
223
|
-
}
|
|
224
|
-
|
|
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
|
-
|
|
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-
|
|
1891
|
-
//# sourceMappingURL=chunk-
|
|
1902
|
+
//# sourceMappingURL=chunk-F4KBJIZJ.mjs.map
|
|
1903
|
+
//# sourceMappingURL=chunk-F4KBJIZJ.mjs.map
|