@primeui/texteditor-core 0.0.1-alpha.1 → 1.0.0-beta.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/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 +3 -3
- 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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/state/selection.ts"],"names":[],"mappings":"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","file":"chunk-72T5I4O4.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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-7QCHSEN2.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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-AJOKUIQD.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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema/marks.ts","../src/schema/index.ts"],"names":[],"mappings":"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","file":"chunk-AUTGNC2Q.mjs","sourcesContent":["import type { MarkSpec } from 'prosemirror-model';\nimport { sanitizeUrl } from '../utils/url';\nimport { sanitizeCssValue } from '../utils/css';\n\nconst TARGETS = ['_blank', '_self', '_parent', '_top'];\nconst safeTarget = (t: string | null) => (t && TARGETS.includes(t) ? t : '_blank');\n\nexport const bold: MarkSpec = {\n parseDOM: [\n { tag: 'strong' },\n { tag: 'b', getAttrs: (node) => (node as HTMLElement).style.fontWeight !== 'normal' && null },\n { style: 'font-weight=bold' },\n { style: 'font-weight', getAttrs: (value) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value as string) && null }\n ],\n toDOM() {\n return ['strong', 0];\n }\n};\n\nexport const italic: MarkSpec = {\n parseDOM: [{ tag: 'i' }, { tag: 'em' }, { style: 'font-style=italic' }],\n toDOM() {\n return ['em', 0];\n }\n};\n\nexport const underline: MarkSpec = {\n parseDOM: [{ tag: 'u' }, { style: 'text-decoration=underline' }],\n toDOM() {\n return ['u', 0];\n }\n};\n\nexport const strikethrough: MarkSpec = {\n parseDOM: [{ tag: 's' }, { tag: 'del' }, { tag: 'strike' }, { style: 'text-decoration=line-through' }],\n toDOM() {\n return ['s', 0];\n }\n};\n\nexport const subscript: MarkSpec = {\n excludes: 'superscript',\n parseDOM: [{ tag: 'sub' }],\n toDOM() {\n return ['sub', 0];\n }\n};\n\nexport const superscript: MarkSpec = {\n excludes: 'subscript',\n parseDOM: [{ tag: 'sup' }],\n toDOM() {\n return ['sup', 0];\n }\n};\n\nexport const code: MarkSpec = {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', 0];\n }\n};\n\nexport const link: MarkSpec = {\n attrs: {\n href: {},\n target: { default: '_blank' }\n },\n inclusive: false,\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs(node) {\n const el = node as HTMLAnchorElement;\n const href = sanitizeUrl(el.getAttribute('href'));\n\n // Drop the link mark (keep the text) when the href is unsafe.\n if (href == null) return false;\n\n return { href, target: safeTarget(el.getAttribute('target')) };\n }\n }\n ],\n toDOM(mark) {\n const href = sanitizeUrl(mark.attrs.href);\n\n return ['a', href == null ? { rel: 'noopener noreferrer' } : { href, target: safeTarget(mark.attrs.target), rel: 'noopener noreferrer' }, 0];\n }\n};\n\nexport const textStyle: MarkSpec = {\n attrs: {\n fontFamily: { default: null },\n fontSize: { default: null },\n color: { default: null },\n backgroundColor: { default: null }\n },\n parseDOM: [\n {\n tag: 'span',\n getAttrs(node) {\n const el = node as HTMLElement;\n // Sanitize at parse time so a dirty CSS value never enters the model.\n const fontFamily = sanitizeCssValue(el.style.fontFamily);\n const fontSize = sanitizeCssValue(el.style.fontSize);\n const color = sanitizeCssValue(el.style.color);\n const backgroundColor = sanitizeCssValue(el.style.backgroundColor);\n\n if (!fontFamily && !fontSize && !color && !backgroundColor) return false;\n\n return { fontFamily, fontSize, color, backgroundColor };\n }\n }\n ],\n toDOM(mark) {\n const style: string[] = [];\n const fontFamily = sanitizeCssValue(mark.attrs.fontFamily);\n const fontSize = sanitizeCssValue(mark.attrs.fontSize);\n const color = sanitizeCssValue(mark.attrs.color);\n const backgroundColor = sanitizeCssValue(mark.attrs.backgroundColor);\n\n if (fontFamily) style.push(`font-family: ${fontFamily}`);\n if (fontSize) style.push(`font-size: ${fontSize}`);\n if (color) style.push(`color: ${color}`);\n if (backgroundColor) style.push(`background-color: ${backgroundColor}`);\n\n return ['span', { style: style.join('; ') }, 0];\n }\n};\n","import { Schema, type NodeSpec, type MarkSpec } from 'prosemirror-model';\nimport * as nodes from './nodes';\nimport * as marks from './marks';\n\nexport { nodes, marks };\n\n/**\n * Derive a NodeSpec from a base one with shallow `attrs` merge — lets a plugin\n * enrich an existing node (e.g. add `id` to `heading`) without copying its spec.\n */\nexport function extendNodeSpec(base: NodeSpec, override: Partial<NodeSpec>): NodeSpec {\n return {\n ...base,\n ...override,\n attrs: { ...base.attrs, ...override.attrs }\n };\n}\n\nexport const baseNodes: Record<string, NodeSpec> = {\n doc: nodes.doc,\n paragraph: nodes.paragraph,\n text: nodes.text,\n heading: nodes.heading,\n blockquote: nodes.blockquote,\n code_block: nodes.code_block,\n horizontal_rule: nodes.horizontal_rule,\n hard_break: nodes.hard_break,\n image: nodes.image,\n mention: nodes.mention,\n image_upload_placeholder: nodes.image_upload_placeholder,\n document_upload_placeholder: nodes.document_upload_placeholder,\n bullet_list: nodes.bullet_list,\n ordered_list: nodes.ordered_list,\n list_item: nodes.list_item,\n check_list: nodes.check_list,\n check_list_item: nodes.check_list_item,\n table: nodes.table,\n table_row: nodes.table_row,\n table_cell: nodes.table_cell,\n table_header: nodes.table_header\n};\n\nexport const baseMarks: Record<string, MarkSpec> = {\n bold: marks.bold,\n italic: marks.italic,\n underline: marks.underline,\n strikethrough: marks.strikethrough,\n subscript: marks.subscript,\n superscript: marks.superscript,\n code: marks.code,\n link: marks.link,\n textStyle: marks.textStyle\n};\n\nexport interface SchemaExtension {\n nodes?: Record<string, NodeSpec>;\n marks?: Record<string, MarkSpec>;\n}\n\n// Surface a silent node/mark name collision between extensions (a legitimate\n// override via extendNodeSpec is fine; two plugins clobbering the same name is a bug).\nfunction warnOnOverride(kind: 'node' | 'mark', existing: Record<string, unknown>, incoming?: Record<string, unknown>) {\n if (!incoming || typeof console === 'undefined') return;\n\n for (const name of Object.keys(incoming)) {\n if (name in existing) {\n // eslint-disable-next-line no-console\n console.warn(`[PrimeUI TextEditor] schema ${kind} \"${name}\" is being overridden by a plugin extension. If this is intentional (e.g. extendNodeSpec), ignore; otherwise two extensions may be colliding.`);\n }\n }\n}\n\n// Builds a Schema from the base specs plus any extension-contributed nodes/marks.\nexport function createEditorSchema(extensions?: SchemaExtension[]): Schema {\n if (!extensions || extensions.length === 0) return new Schema({ nodes: baseNodes, marks: baseMarks });\n\n const extNodes = { ...baseNodes };\n const extMarks = { ...baseMarks };\n\n for (const ext of extensions) {\n warnOnOverride('node', extNodes, ext.nodes);\n warnOnOverride('mark', extMarks, ext.marks);\n Object.assign(extNodes, ext.nodes);\n Object.assign(extMarks, ext.marks);\n }\n\n return new Schema({ nodes: extNodes, marks: extMarks });\n}\n\nlet _defaultSchema: Schema | null = null;\n\n// Lazily-built, memoized default schema. Lazy so importing this module has no\n// side effect (no eager `new Schema()`), keeping `sideEffects:false` honest.\nexport function getEditorSchema(): Schema {\n return (_defaultSchema ??= createEditorSchema());\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/keyboard.ts"],"names":[],"mappings":";AAAO,SAAS,oBAAA,CAAqB,UAAA,EAAoB,SAAA,EAAmB,GAAA,EAA4B;AACpG,EAAA,IAAI,SAAA,KAAc,GAAG,OAAO,EAAA;AAE5B,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,IAAA,OAAO,UAAA,GAAa,CAAA,GAAI,CAAA,GAAA,CAAK,UAAA,GAAa,CAAA,IAAK,SAAA;AAAA,EACnD;AAEA,EAAA,OAAO,aAAa,CAAA,GAAI,SAAA,GAAY,CAAA,GAAA,CAAK,UAAA,GAAa,IAAI,SAAA,IAAa,SAAA;AAC3E;AAEO,SAAS,sBAAA,CAAuB,SAAA,EAAmB,UAAA,EAAoB,KAAA,EAAwB;AAClG,EAAA,IAAI,SAAA,KAAc,GAAG,OAAO,EAAA;AAE5B,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,OAAO,UAAA,IAAc,CAAA,GAAI,SAAA,GAAY,CAAA,GAAI,UAAA,GAAa,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,eAAe,EAAA,IAAM,UAAA,KAAe,SAAA,GAAY,CAAA,GAAI,IAAI,UAAA,GAAa,CAAA;AAChF","file":"chunk-CRAB2MFE.mjs","sourcesContent":["export function computeArrowNavIndex(currentIdx: number, itemCount: number, dir: 'up' | 'down'): number {\n if (itemCount === 0) return -1;\n\n if (dir === 'down') {\n return currentIdx < 0 ? 0 : (currentIdx + 1) % itemCount;\n }\n\n return currentIdx < 0 ? itemCount - 1 : (currentIdx - 1 + itemCount) % itemCount;\n}\n\nexport function computeFocusTrapTarget(itemCount: number, focusedIdx: number, shift: boolean): number {\n if (itemCount === 0) return -1;\n\n if (shift) {\n return focusedIdx <= 0 ? itemCount - 1 : focusedIdx - 1;\n }\n\n return focusedIdx === -1 || focusedIdx === itemCount - 1 ? 0 : focusedIdx + 1;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/scroll.ts"],"names":[],"mappings":";AAAO,SAAS,sBAAA,CAAuB,OAAA,EAAiB,IAAA,EAAuC,SAAA,EAAmB,QAAA,EAA0B;AACxI,EAAA,MAAM,OAAA,GAAU,UAAU,IAAA,CAAK,GAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,GAAS,OAAA;AAEjC,EAAA,IAAI,UAAU,SAAA,EAAW;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,SAAA,GAAY,OAAA,IAAW,SAAS,CAAC,CAAA;AAExE,IAAA,OAAO,CAAC,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,QAAQ,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,aAAa,SAAA,EAAW;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,SAAA,GAAY,UAAA,IAAc,SAAS,CAAC,CAAA;AAE3E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,QAAQ,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,CAAA;AACX","file":"chunk-DXPG5XMX.mjs","sourcesContent":["export function computeEdgeScrollSpeed(clientY: number, rect: { top: number; bottom: number }, threshold: number, maxSpeed: number): number {\n const fromTop = clientY - rect.top;\n const fromBottom = rect.bottom - clientY;\n\n if (fromTop < threshold) {\n const ratio = Math.max(0, Math.min(1, (threshold - fromTop) / threshold));\n\n return -Math.ceil(ratio * maxSpeed);\n }\n\n if (fromBottom < threshold) {\n const ratio = Math.max(0, Math.min(1, (threshold - fromBottom) / threshold));\n\n return Math.ceil(ratio * maxSpeed);\n }\n\n return 0;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/texteditor.refs.ts"],"names":[],"mappings":";AAEO,IAAM,qBAAA,GAAwC;AAAA,EACjD,OAAA,EAAS,MAAA;AAAA,EACT,gBAAA,EAAkB;AACtB","file":"chunk-E2KXUP3F.mjs","sourcesContent":["import type { TextEditorRefs } from '@primeui/texteditor-types';\n\nexport const defaultTextEditorRefs: TextEditorRefs = {\n element: undefined,\n fileInputElement: undefined\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/trailingNode.ts"],"names":[],"mappings":";;;AAGA,IAAM,eAAA,GAAkB,IAAI,SAAA,CAAU,cAAc,CAAA;AAE7C,SAAS,yBAAyB,MAAA,EAAgB;AACrD,EAAA,MAAM,aAAA,GAAgB,OAAO,KAAA,CAAM,SAAA;AAEnC,EAAA,OAAO,IAAI,MAAA,CAAO;AAAA,IACd,GAAA,EAAK,eAAA;AAAA,IACL,iBAAA,CAAkB,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU;AACjD,MAAA,IAAI,CAAC,aAAa,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,UAAU,GAAG,OAAO,IAAA;AAEtD,MAAA,MAAM,EAAE,KAAI,GAAI,QAAA;AAChB,MAAA,MAAM,WAAW,GAAA,CAAI,SAAA;AAErB,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,aAAA,EAAe;AAC9C,QAAA,OAAO,QAAA,CAAS,GAAG,MAAA,CAAO,GAAA,CAAI,QAAQ,IAAA,EAAM,aAAA,CAAc,QAAQ,CAAA;AAAA,MACtE;AAEA,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,GACH,CAAA;AACL","file":"chunk-EA2YI7LA.mjs","sourcesContent":["import { Plugin, PluginKey } from 'prosemirror-state';\nimport type { Schema } from 'prosemirror-model';\n\nconst trailingNodeKey = new PluginKey('trailingNode');\n\nexport function createTrailingNodePlugin(schema: Schema) {\n const paragraphType = schema.nodes.paragraph;\n\n return new Plugin({\n key: trailingNodeKey,\n appendTransaction(transactions, _oldState, newState) {\n if (!transactions.some((tr) => tr.docChanged)) return null;\n\n const { doc } = newState;\n const lastNode = doc.lastChild;\n\n if (!lastNode || lastNode.type !== paragraphType) {\n return newState.tr.insert(doc.content.size, paragraphType.create());\n }\n\n return null;\n }\n });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema/nodes.ts"],"names":[],"mappings":"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","file":"chunk-F7BJWPT6.mjs","sourcesContent":["import type { DOMOutputSpec, NodeSpec } from 'prosemirror-model';\nimport { textEditorClasses as classes } from '../texteditor.classes';\nimport { sanitizeImageUrl, sanitizeTextAttr } from '../utils/url';\nimport { sanitizeCssValue } from '../utils/css';\n\n// Recursively strip <> from string values in parsed mention data.\nfunction stripMarkupFromJson(value: unknown): unknown {\n if (typeof value === 'string') return value.replace(/[<>]/g, '');\n if (Array.isArray(value)) return value.map(stripMarkupFromJson);\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.entries(value as Record<string, unknown>).map(([k, v]) => [k, stripMarkupFromJson(v)]));\n }\n\n return value;\n}\n\n// Parse data-colwidth into finite numbers only; null if none valid.\nfunction parseColwidth(raw: string | null): number[] | null {\n if (!raw) return null;\n\n const widths = raw.split(',').map(Number).filter(Number.isFinite);\n\n return widths.length > 0 ? widths : null;\n}\n\n// Upper bound on a mention's serialized data payload (defense against DoS).\nconst MENTION_DATA_MAX_LENGTH = 64 * 1024;\n\n// Parse an image width/height into a non-negative finite number string; null otherwise.\nexport function parseDimension(raw: string | null): string | null {\n if (!raw) return null;\n\n const n = Number(raw);\n\n return Number.isFinite(n) && n >= 0 ? String(n) : null;\n}\n\nexport const doc: NodeSpec = {\n content: 'block+'\n};\n\nexport const text: NodeSpec = {\n group: 'inline'\n};\n\nexport const paragraph: NodeSpec = {\n content: 'inline*',\n group: 'block',\n attrs: {\n textAlign: { default: null }\n },\n parseDOM: [\n {\n tag: 'p',\n getAttrs(node) {\n return { textAlign: (node as HTMLElement).style.textAlign || null };\n }\n }\n ],\n toDOM(node) {\n const attrs: Record<string, string> = {};\n\n const align = ['left', 'center', 'right', 'justify'].includes(node.attrs.textAlign) ? node.attrs.textAlign : null;\n\n if (align) attrs.style = `text-align: ${align}`;\n\n return ['p', attrs, 0];\n }\n};\n\nexport const heading: NodeSpec = {\n content: 'inline*',\n group: 'block',\n attrs: {\n level: { default: 1 },\n textAlign: { default: null }\n },\n defining: true,\n parseDOM: [1, 2, 3, 4, 5, 6].map((level) => ({\n tag: `h${level}`,\n attrs: { level },\n getAttrs(node) {\n return { level, textAlign: (node as HTMLElement).style.textAlign || null };\n }\n })),\n toDOM(node) {\n const attrs: Record<string, string> = {};\n\n const align = ['left', 'center', 'right', 'justify'].includes(node.attrs.textAlign) ? node.attrs.textAlign : null;\n\n if (align) attrs.style = `text-align: ${align}`;\n\n return [`h${node.attrs.level}`, attrs, 0];\n }\n};\n\nexport const blockquote: NodeSpec = {\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0];\n }\n};\n\nexport const code_block: NodeSpec = {\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n attrs: { language: { default: null } },\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs(node) {\n const el = node as HTMLElement;\n const code = el.querySelector('code') ?? el;\n const cls = code.getAttribute('class') || el.getAttribute('class') || '';\n const match = cls.match(/language-([\\w-]+)/);\n\n return { language: match ? match[1] : el.getAttribute('data-language') || null };\n }\n }\n ],\n toDOM(node) {\n const lang = node.attrs.language;\n\n return lang ? ['pre', { 'data-language': lang }, ['code', { class: `language-${lang}` }, 0]] : ['pre', ['code', 0]];\n }\n};\n\nexport const horizontal_rule: NodeSpec = {\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr'];\n }\n};\n\nexport const hard_break: NodeSpec = {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br'];\n }\n};\n\nexport const image: NodeSpec = {\n inline: true,\n group: 'inline',\n draggable: true,\n attrs: {\n src: {},\n alt: { default: null },\n width: { default: null },\n height: { default: null }\n },\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(node) {\n const el = node as HTMLImageElement;\n const src = sanitizeImageUrl(el.getAttribute('src'));\n\n if (src == null) return false;\n\n return {\n src,\n alt: sanitizeTextAttr(el.getAttribute('alt')),\n width: parseDimension(el.getAttribute('width')),\n height: parseDimension(el.getAttribute('height'))\n };\n }\n }\n ],\n toDOM(node) {\n const src = sanitizeImageUrl(node.attrs.src);\n const attrs: Record<string, string> = { src: src ?? '' };\n\n if (node.attrs.alt) attrs.alt = node.attrs.alt;\n if (node.attrs.width) attrs.width = node.attrs.width;\n if (node.attrs.height) attrs.height = node.attrs.height;\n\n return ['img', attrs];\n }\n};\n\nexport const mention: NodeSpec = {\n inline: true,\n group: 'inline',\n atom: true,\n attrs: {\n id: { default: null },\n label: {},\n data: { default: null }\n },\n parseDOM: [\n {\n tag: 'span[data-p-mention]',\n getAttrs(node) {\n const el = node as HTMLElement;\n const rawData = el.getAttribute('data-p-mention-data');\n let data: unknown = null;\n\n // Cap the payload so a hostile document can't DoS the parser with a huge JSON blob.\n if (rawData && rawData.length <= MENTION_DATA_MAX_LENGTH) {\n try {\n data = stripMarkupFromJson(JSON.parse(rawData));\n } catch {\n data = null;\n }\n }\n\n return {\n id: sanitizeTextAttr(el.getAttribute('data-p-mention-id')),\n label: sanitizeTextAttr(el.textContent),\n data\n };\n }\n }\n ],\n toDOM(node) {\n const attrs: Record<string, string> = { class: classes.mention, 'data-p-mention': '', 'data-p-mention-id': node.attrs.id || '' };\n\n if (node.attrs.data != null) attrs['data-p-mention-data'] = JSON.stringify(node.attrs.data);\n\n return ['span', attrs, node.attrs.label];\n }\n};\n\nexport const image_upload_placeholder: NodeSpec = {\n group: 'block',\n atom: true,\n selectable: false,\n parseDOM: [{ tag: 'div[data-p-image-upload]' }],\n toDOM() {\n return ['div', { 'data-p-image-upload': '', class: classes.imageUploadPlaceholder }];\n }\n};\n\nexport const document_upload_placeholder: NodeSpec = {\n group: 'block',\n atom: true,\n selectable: false,\n parseDOM: [{ tag: 'div[data-p-document-upload]' }],\n toDOM() {\n return ['div', { 'data-p-document-upload': '', class: classes.documentUploadPlaceholder }];\n }\n};\n\n// Lists\n\nexport const bullet_list: NodeSpec = {\n content: 'list_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul', getAttrs: (node) => !(node as HTMLElement).hasAttribute('data-p-checked-list') && null }],\n toDOM() {\n return ['ul', 0];\n }\n};\n\nexport const ordered_list: NodeSpec = {\n content: 'list_item+',\n group: 'block',\n attrs: { start: { default: 1 } },\n parseDOM: [\n {\n tag: 'ol',\n getAttrs(node) {\n return { start: (node as HTMLOListElement).start || 1 };\n }\n }\n ],\n toDOM(node) {\n return node.attrs.start === 1 ? ['ol', 0] : ['ol', { start: node.attrs.start }, 0];\n }\n};\n\nexport const list_item: NodeSpec = {\n content: 'paragraph block*',\n parseDOM: [{ tag: 'li', getAttrs: (node) => !(node as HTMLElement).hasAttribute('data-p-checked') && null }],\n toDOM() {\n return ['li', 0];\n },\n defining: true\n};\n\nexport const check_list: NodeSpec = {\n content: 'check_list_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul[data-p-checked-list]' }],\n toDOM() {\n return ['ul', { 'data-p-checked-list': '' }, 0];\n }\n};\n\nexport const check_list_item: NodeSpec = {\n content: 'paragraph block*',\n attrs: {\n checked: { default: false }\n },\n parseDOM: [\n {\n tag: 'li[data-p-checked]',\n getAttrs(node) {\n return { checked: (node as HTMLElement).getAttribute('data-p-checked') === 'true' };\n }\n }\n ],\n toDOM(node) {\n return ['li', { 'data-p-checked': node.attrs.checked ? 'true' : 'false' }, 0];\n }\n};\n\n// Tables\n\nexport const table: NodeSpec = {\n content: 'table_row+',\n group: 'block',\n tableRole: 'table',\n isolating: true,\n parseDOM: [{ tag: 'table' }],\n toDOM(node) {\n // Emit <colgroup> from the first row's widths so exported HTML keeps column sizes.\n const cols: DOMOutputSpec[] = [];\n const firstRow = node.firstChild;\n\n if (firstRow) {\n firstRow.forEach((cell) => {\n const span = cell.attrs.colspan ?? 1;\n const widths = cell.attrs.colwidth as number[] | null;\n\n for (let i = 0; i < span; i++) {\n const w = widths?.[i];\n\n cols.push(w ? ['col', { style: `width: ${w}px` }] : ['col', {}]);\n }\n });\n }\n\n return cols.length ? ['table', ['colgroup', ...cols], ['tbody', 0]] : ['table', ['tbody', 0]];\n }\n};\n\nexport const table_row: NodeSpec = {\n content: '(table_cell | table_header)*',\n tableRole: 'row',\n parseDOM: [{ tag: 'tr' }],\n toDOM() {\n return ['tr', 0];\n }\n};\n\nexport const table_cell: NodeSpec = {\n content: 'block+',\n attrs: {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n backgroundColor: { default: null }\n },\n tableRole: 'cell',\n isolating: true,\n parseDOM: [\n {\n tag: 'td',\n getAttrs(node) {\n const el = node as HTMLTableCellElement;\n\n return {\n colspan: el.colSpan || 1,\n rowspan: el.rowSpan || 1,\n colwidth: parseColwidth(el.getAttribute('data-colwidth')),\n backgroundColor: sanitizeCssValue(el.style.backgroundColor)\n };\n }\n }\n ],\n toDOM(node) {\n const attrs: Record<string, string | number> = {};\n\n if (node.attrs.colspan !== 1) attrs.colspan = node.attrs.colspan;\n if (node.attrs.rowspan !== 1) attrs.rowspan = node.attrs.rowspan;\n if (node.attrs.colwidth) attrs['data-colwidth'] = node.attrs.colwidth.join(',');\n const bg = sanitizeCssValue(node.attrs.backgroundColor);\n\n if (bg) attrs.style = `background-color: ${bg}`;\n\n return ['td', attrs, 0];\n }\n};\n\nexport const table_header: NodeSpec = {\n content: 'block+',\n attrs: {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n backgroundColor: { default: null },\n scope: { default: 'col' }\n },\n tableRole: 'header_cell',\n isolating: true,\n parseDOM: [\n {\n tag: 'th',\n getAttrs(node) {\n const el = node as HTMLTableCellElement;\n const rawScope = el.getAttribute('scope');\n\n return {\n colspan: el.colSpan || 1,\n rowspan: el.rowSpan || 1,\n colwidth: parseColwidth(el.getAttribute('data-colwidth')),\n backgroundColor: sanitizeCssValue(el.style.backgroundColor),\n scope: rawScope === 'row' || rawScope === 'col' ? rawScope : 'col'\n };\n }\n }\n ],\n toDOM(node) {\n const attrs: Record<string, string | number> = { scope: node.attrs.scope === 'row' ? 'row' : 'col' };\n\n if (node.attrs.colspan !== 1) attrs.colspan = node.attrs.colspan;\n if (node.attrs.rowspan !== 1) attrs.rowspan = node.attrs.rowspan;\n if (node.attrs.colwidth) attrs['data-colwidth'] = node.attrs.colwidth.join(',');\n const bg = sanitizeCssValue(node.attrs.backgroundColor);\n\n if (bg) attrs.style = `background-color: ${bg}`;\n\n return ['th', attrs, 0];\n }\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/positioning.ts"],"names":[],"mappings":";AAwBO,SAAS,sBAAA,CAAuB,MAAA,EAAoB,WAAA,EAAmB,QAAA,EAAoB,IAAA,EAA0D;AACxJ,EAAA,IAAI,GAAA,GAAM,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA;AAE/B,EAAA,IAAI,MAAM,WAAA,CAAY,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,KAAK,MAAA,EAAQ;AAC1D,IAAA,GAAA,GAAM,MAAA,CAAO,GAAA,GAAM,WAAA,CAAY,MAAA,GAAS,IAAA,CAAK,MAAA;AAAA,EACjD;AAEA,EAAA,IAAI,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,GAAA,GAAM,IAAA,CAAK,MAAA;AAElC,EAAA,MAAM,eAAe,IAAA,CAAK,KAAA,GAAQ,OAAO,IAAA,GAAO,WAAA,CAAY,QAAQ,MAAA,CAAO,IAAA;AAC3E,EAAA,MAAM,IAAA,GAAO,WAAW,YAAA,EAAc,WAAA,CAAY,OAAO,IAAA,CAAK,MAAA,EAAQ,SAAS,KAAK,CAAA;AAEpF,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACvB;AAEO,SAAS,sBAAA,CAAuB,OAAA,EAAqB,WAAA,EAAmB,QAAA,EAAoB,IAAA,EAA0D;AACzJ,EAAA,IAAI,MAAM,OAAA,CAAQ,GAAA;AAElB,EAAA,IAAI,MAAM,WAAA,CAAY,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,KAAK,MAAA,EAAQ;AAC1D,IAAA,GAAA,GAAM,QAAA,CAAS,MAAA,GAAS,WAAA,CAAY,MAAA,GAAS,IAAA,CAAK,MAAA;AAAA,EACtD;AAEA,EAAA,IAAI,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,GAAA,GAAM,IAAA,CAAK,MAAA;AAElC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,IAAA,GAAO,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,MAAA;AACnG,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,IAAA,GAAO,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,MAAA;AACrG,EAAA,MAAM,YAAA,GAAe,UAAU,WAAA,CAAY,KAAA,GAAQ,SAAS,KAAA,GAAQ,IAAA,CAAK,MAAA,IAAU,OAAA,GAAU,IAAA,CAAK,MAAA;AAClG,EAAA,MAAM,IAAA,GAAO,eAAe,SAAA,GAAY,OAAA;AAExC,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACvB;AAEA,SAAS,UAAA,CAAW,IAAA,EAAc,OAAA,EAAiB,MAAA,EAAgB,aAAA,EAA+B;AAC9F,EAAA,IAAI,IAAA,GAAO,QAAQ,OAAO,MAAA;AAC1B,EAAA,IAAI,OAAO,OAAA,GAAU,aAAA,GAAgB,MAAA,EAAQ,OAAO,gBAAgB,OAAA,GAAU,MAAA;AAE9E,EAAA,OAAO,IAAA;AACX","file":"chunk-FFCQLWS5.mjs","sourcesContent":["import { clampToViewport } from '../utils/position';\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Viewport {\n width: number;\n height: number;\n}\n\nexport interface AnchorRect {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\nexport interface PopoverPositionOpts {\n margin: number;\n isRtl: boolean;\n}\n\nexport function computePopoverPosition(anchor: AnchorRect, popoverSize: Size, viewport: Viewport, opts: PopoverPositionOpts): { top: number; left: number } {\n let top = anchor.bottom + opts.margin;\n\n if (top + popoverSize.height > viewport.height - opts.margin) {\n top = anchor.top - popoverSize.height - opts.margin;\n }\n\n if (top < opts.margin) top = opts.margin;\n\n const physicalLeft = opts.isRtl ? anchor.left - popoverSize.width : anchor.left;\n const left = clampWidth(physicalLeft, popoverSize.width, opts.margin, viewport.width);\n\n return { top, left };\n}\n\nexport function computeSubmenuPosition(trigger: AnchorRect, popoverSize: Size, viewport: Viewport, opts: PopoverPositionOpts): { top: number; left: number } {\n let top = trigger.top;\n\n if (top + popoverSize.height > viewport.height - opts.margin) {\n top = viewport.height - popoverSize.height - opts.margin;\n }\n\n if (top < opts.margin) top = opts.margin;\n\n const endLeft = opts.isRtl ? trigger.left - popoverSize.width - opts.margin : trigger.right + opts.margin;\n const startLeft = opts.isRtl ? trigger.right + opts.margin : trigger.left - popoverSize.width - opts.margin;\n const overflowsEnd = endLeft + popoverSize.width > viewport.width - opts.margin || endLeft < opts.margin;\n const left = overflowsEnd ? startLeft : endLeft;\n\n return { top, left };\n}\n\nfunction clampWidth(left: number, elWidth: number, margin: number, viewportWidth: number): number {\n if (left < margin) return margin;\n if (left + elWidth > viewportWidth - margin) return viewportWidth - elWidth - margin;\n\n return left;\n}\n\nexport { clampToViewport };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-GG56GLXC.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/mentionController.ts"],"names":[],"mappings":";AAaO,SAAS,wBAAwB,IAAA,EAAgC;AACpE,EAAA,IAAI,QAAmB,EAAC;AACxB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO;AAAA,IACH,MAAM,SAAS,MAAA,EAAsC;AACjD,MAAA,MAAM,IAAI,EAAE,KAAA;AAEZ,MAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAChB,QAAA,MAAA,GAAS,KAAA;AACT,QAAA,KAAA,GAAQ,EAAC;AACT,QAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAEhB,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAEhC,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,MAAM,OAAA,GAAU,MAAM,OAAA,EAAQ;AAE9B,UAAA,IAAI,MAAM,KAAA,EAAO;AAEjB,UAAA,KAAA,GAAQ,OAAA;AAAA,QACZ;AAEA,QAAA,MAAA,GAAS,IAAA;AAAA,MACb;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAClC,MAAA,MAAM,WAAW,MAAA,CAAO,IAAA,GAClB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AACnB,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,KAAA;AAE9C,QAAA,OAAO,MAAA,CAAQ,IAAA,CAAiC,KAAK,CAAA,IAAK,EAAE,CAAA,CACvD,WAAA,EAAY,CACZ,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,MAC3C,CAAC,CAAA,GACD,KAAA;AAEN,MAAA,IAAI,MAAM,KAAA,EAAO;AAEjB,MAAA,IAAA,CAAK,KAAK,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAAA,IAC5C;AAAA,GACJ;AACJ","file":"chunk-GGPBV4BM.mjs","sourcesContent":["export interface MentionUpdate {\n active: boolean;\n text: string;\n}\n\nexport interface MentionControllerOptions {\n getHandler: () => (() => unknown[] | Promise<unknown[]>) | undefined;\n getFilterField: () => string;\n emit: (update: MentionUpdate & { items?: unknown[] }) => void;\n}\n\n// Race-safe mention state machine: fetches items once per @-session, drops stale\n// fetches, and never leaves the list permanently empty after a superseded fetch.\nexport function createMentionController(opts: MentionControllerOptions) {\n let items: unknown[] = [];\n let active = false;\n let token = 0;\n\n return {\n async onUpdate(update: MentionUpdate): Promise<void> {\n const t = ++token;\n\n if (!update.active) {\n active = false;\n items = [];\n opts.emit(update);\n\n return;\n }\n\n if (!active) {\n const handler = opts.getHandler();\n\n if (handler) {\n const fetched = await handler();\n\n if (t !== token) return;\n\n items = fetched;\n }\n\n active = true;\n }\n\n const field = opts.getFilterField();\n const filtered = update.text\n ? items.filter((item) => {\n if (!item || typeof item !== 'object') return false;\n\n return String((item as Record<string, unknown>)[field] || '')\n .toLowerCase()\n .includes(update.text.toLowerCase());\n })\n : items;\n\n if (t !== token) return;\n\n opts.emit({ ...update, items: filtered });\n }\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-H3RFOYCT.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/contextToolbar.ts"],"names":[],"mappings":";;;AAQO,SAAS,2BAA2B,SAAA,EAAoC;AAC3E,EAAA,OAAO,IAAI,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,MACH,eAAA,EAAiB;AAAA,QACb,MAAM,IAAA,EAAM;AACR,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAEvC,UAAA,MAAM,QAAA,GAAW,qBAAqB,IAAI,CAAA;AAE1C,UAAA,IAAI,QAAA,EAAU;AACV,YAAA,SAAA,CAAU,UAAU,QAAQ,CAAA;AAAA,UAChC;AAEA,UAAA,OAAO,KAAA;AAAA,QACX;AAAA;AACJ;AACJ,GACH,CAAA;AACL","file":"chunk-IUQKSDKG.mjs","sourcesContent":["import { Plugin } from 'prosemirror-state';\nimport type { CaretPosition } from '@primeui/texteditor-types';\nimport { getSelectionPosition } from '../state/selection';\n\ninterface ContextToolbarCallbacks {\n onRequest: (position: CaretPosition) => void;\n}\n\nexport function createContextToolbarPlugin(callbacks: ContextToolbarCallbacks) {\n return new Plugin({\n props: {\n handleDOMEvents: {\n keyup(view) {\n if (view.state.selection.empty) return false;\n\n const position = getSelectionPosition(view);\n\n if (position) {\n callbacks.onRequest(position);\n }\n\n return false;\n }\n }\n }\n });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/slashCommands.ts"],"names":["topNode"],"mappings":"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","file":"chunk-KNZAMA6H.mjs","sourcesContent":["import type { CaretPosition } from '@primeui/texteditor-types';\nimport { Fragment, type Node as PMNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, TextSelection } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { textEditorClasses as classes } from '../texteditor.classes';\n\nexport const slashPluginKey = new PluginKey('slashCommands');\n\nexport interface SlashUpdate {\n active: boolean;\n text: string;\n position: CaretPosition | null;\n}\n\ninterface SlashPluginOptions {\n onUpdate: (update: SlashUpdate) => void;\n placeholder?: string;\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 findSlashTrigger(doc: PMNode, cursorPos: number): number {\n const $pos = doc.resolve(cursorPos);\n\n // Don't activate inside blockquotes or code blocks\n for (let depth = $pos.depth; depth > 0; depth--) {\n const name = $pos.node(depth).type.name;\n\n if (name === 'blockquote' || name === 'code_block') return -1;\n }\n\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 slash command\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 createSlashPlugin(callbacks: SlashPluginOptions) {\n let activated = false;\n\n return new Plugin({\n key: slashPluginKey,\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 decorations(state) {\n if (!activated) return DecorationSet.empty;\n\n const { from } = state.selection;\n const triggerPos = findSlashTrigger(state.doc, from);\n\n if (triggerPos < 0) return DecorationSet.empty;\n\n const hasFilterText = from > triggerPos + 1;\n const attrs: Record<string, string> = {\n class: classes.slashTyping,\n 'data-slash-query': 'true'\n };\n\n if (!hasFilterText && callbacks.placeholder) {\n attrs['data-placeholder'] = callbacks.placeholder;\n }\n\n const deco = Decoration.inline(triggerPos, from, attrs);\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 = findSlashTrigger(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 * Execute an inline slash command: remove the '/query' text and run the callback in place.\n * Does not create a new block — stays in the current block.\n */\nexport function executeSlashCommandInline(view: EditorView, callback: () => void) {\n const { from } = view.state.selection;\n const triggerPos = findSlashTrigger(view.state.doc, from);\n\n if (triggerPos < 0) return;\n\n const tr = view.state.tr.delete(triggerPos, from);\n\n view.dispatch(tr);\n view.focus();\n callback();\n}\n\n/**\n * Execute a slash command.\n * - Empty paragraph: delete '/query' and convert in place (Notion behavior).\n * - Any other case: create a new block after the current one and convert that.\n */\nexport function executeSlashCommand(view: EditorView, callback: () => void) {\n const { from } = view.state.selection;\n const triggerPos = findSlashTrigger(view.state.doc, from);\n\n if (triggerPos < 0) return;\n\n const $pos = view.state.doc.resolve(triggerPos);\n const topNode = $pos.node(1);\n const slashLength = from - triggerPos;\n const isEmptyParagraph = topNode.type.name === 'paragraph' && topNode.content.size === slashLength;\n\n if (isEmptyParagraph) {\n // Empty paragraph with only '/query' — delete and convert in place\n const tr = view.state.tr.delete(triggerPos, from);\n\n view.dispatch(tr);\n view.focus();\n callback();\n } else if ($pos.depth > 1) {\n // Nested block (list/blockquote) — split around the current item\n const topNode = $pos.node(1);\n const topPos = $pos.before(1);\n const topEnd = $pos.after(1);\n const itemIndex = $pos.index(1);\n const itemCount = topNode.childCount;\n const currentItem = topNode.child(itemIndex);\n const currentItemEmpty = currentItem.textContent.length === slashLength;\n\n const schema = view.state.schema;\n const tr = view.state.tr;\n const nodes: PMNode[] = [];\n\n // Items before (and including current if it has other content) → keep as a list\n const beforeCount = currentItemEmpty ? itemIndex : itemIndex + 1;\n\n if (beforeCount > 0) {\n const beforeItems: PMNode[] = [];\n\n for (let i = 0; i < beforeCount; i++) {\n const item = topNode.child(i);\n\n // The current (non-empty) item keeps its content but must shed the\n // trailing \"/query\" trigger text, which otherwise leaks into the list.\n if (i === itemIndex && !currentItemEmpty) {\n const firstChild = item.firstChild;\n\n if (firstChild && firstChild.isTextblock) {\n const trimmed = firstChild.cut(0, Math.max(0, firstChild.content.size - slashLength));\n const rest: PMNode[] = [];\n\n item.forEach((c, _o, ci) => {\n if (ci > 0) rest.push(c);\n });\n beforeItems.push(item.copy(Fragment.from([trimmed, ...rest])));\n\n continue;\n }\n }\n\n beforeItems.push(item);\n }\n\n nodes.push(topNode.type.create(topNode.attrs, beforeItems));\n }\n\n // New paragraph for the slash command\n const newParagraph = schema.nodes.paragraph.create();\n\n nodes.push(newParagraph);\n\n // Items after the current item → keep as a list\n const afterStart = currentItemEmpty ? itemIndex + 1 : itemIndex + 1;\n\n if (afterStart < itemCount) {\n const afterItems: PMNode[] = [];\n\n for (let i = afterStart; i < itemCount; i++) {\n afterItems.push(topNode.child(i));\n }\n\n nodes.push(topNode.type.create(topNode.attrs, afterItems));\n }\n\n // Replace the entire list with the split parts\n tr.replaceWith(topPos, topEnd, nodes);\n\n // Find the new paragraph position and place cursor there\n let cursorPos = topPos;\n\n if (beforeCount > 0) {\n cursorPos += nodes[0].nodeSize;\n }\n\n cursorPos += 1; // inside the new paragraph\n\n tr.setSelection(TextSelection.create(tr.doc, cursorPos));\n view.dispatch(tr);\n view.focus();\n callback();\n } else {\n // Top-level non-empty block — create a new block after\n const tr = view.state.tr.delete(triggerPos, from);\n const topBlockEnd = tr.mapping.map($pos.end(1));\n const paragraph = view.state.schema.nodes.paragraph.create();\n\n tr.insert(topBlockEnd + 1, paragraph);\n tr.setSelection(TextSelection.create(tr.doc, topBlockEnd + 2));\n view.dispatch(tr);\n view.focus();\n callback();\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/url.ts"],"names":[],"mappings":";AACO,SAAS,iBAAiB,KAAA,EAAiD;AAC9E,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAE1B,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACpC;AAGA,IAAM,iBAAiB,CAAC,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,QAAQ,MAAM,CAAA;AAGpE,IAAM,aAAA,GAAgB,IAAI,MAAA,CAAO,2CAAA,EAAwD,GAAG,CAAA;AAGrF,SAAS,YAAY,GAAA,EAA+C;AACvE,EAAA,IAAI,GAAA,IAAO,MAAM,OAAO,IAAA;AAExB,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAE9C,EAAA,IAAI,QAAA,KAAa,IAAI,OAAO,IAAA;AAE5B,EAAA,MAAM,WAAA,GAAc,wBAAA,CAAyB,IAAA,CAAK,QAAQ,CAAA;AAE1D,EAAA,IAAI,CAAC,aAAa,OAAO,QAAA;AAEzB,EAAA,MAAM,WAAW,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA,CAAE,aAAa,CAAA,CAAA,CAAA;AAEhD,EAAA,OAAO,cAAA,CAAe,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,GAAW,IAAA;AAC1D;AAGO,SAAS,iBAAiB,GAAA,EAA+C;AAC5E,EAAA,IAAI,GAAA,IAAO,MAAM,OAAO,IAAA;AAExB,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAI9C,EAAA,IAAI,oEAAA,CAAqE,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,QAAA;AAChG,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,IAAA;AAErC,EAAA,OAAO,YAAY,GAAG,CAAA;AAC1B","file":"chunk-MNKMKFLQ.mjs","sourcesContent":["// Strip <> from a free-text attribute (alt, mention label/id).\nexport function sanitizeTextAttr(value: string | null | undefined): string | null {\n if (value == null) return null;\n\n return value.replace(/[<>]/g, '');\n}\n\n// URL scheme allowlist shared by link getAttrs/toDOM and the link commands.\nconst SAFE_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'];\n\n// eslint-disable-next-line no-control-regex\nconst IGNORED_CHARS = new RegExp('[\\u0000-\\u0020\\u007f\\u200b-\\u200f\\u2028\\u2029\\ufeff]', 'g');\n\n// Returns a safe href, or null for a disallowed scheme. Relative/fragment URLs are allowed.\nexport function sanitizeUrl(url: string | null | undefined): string | null {\n if (url == null) return null;\n\n const stripped = url.replace(IGNORED_CHARS, '');\n\n if (stripped === '') return null;\n\n const schemeMatch = /^([a-z][a-z0-9+.-]*):/i.exec(stripped);\n\n if (!schemeMatch) return stripped;\n\n const protocol = `${schemeMatch[1].toLowerCase()}:`;\n\n return SAFE_PROTOCOLS.includes(protocol) ? stripped : null;\n}\n\n// Like sanitizeUrl but also allows data:image/* (raster only; svg excluded).\nexport function sanitizeImageUrl(url: string | null | undefined): string | null {\n if (url == null) return null;\n\n const stripped = url.replace(IGNORED_CHARS, '');\n\n // Allow only well-formed base64 raster data URIs; reject svg and any\n // malformed/foreign data:image body (e.g. data:image/png,<svg ...>).\n if (/^data:image\\/(png|jpe?g|gif|webp|avif|bmp);base64,[a-z0-9+/=\\s]+$/i.test(stripped)) return stripped;\n if (/^data:/i.test(stripped)) return null;\n\n return sanitizeUrl(url);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/columnWidthPin.ts"],"names":["tr"],"mappings":";;;;AAOO,SAAS,0BAAA,GAA6B;AACzC,EAAA,IAAI,IAAA,GAA0B,IAAA;AAE9B,EAAA,OAAO,IAAI,MAAA,CAAO;AAAA,IACd,KAAK,UAAA,EAAY;AACb,MAAA,IAAA,GAAO,UAAA;AAEP,MAAA,OAAO;AAAA,QACH,OAAA,GAAU;AACN,UAAA,IAAA,GAAO,IAAA;AAAA,QACX;AAAA,OACJ;AAAA,IACJ,CAAA;AAAA,IACA,iBAAA,CAAkB,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU;AAEjD,MAAA,MAAM,aAAA,GAAgB,aAAa,IAAA,CAAK,CAACA,QAAOA,GAAAA,CAAG,OAAA,CAAQ,uBAAuB,CAAA,EAAG,WAAW,CAAA;AAEhG,MAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,IAAA,EAAM,OAAO,IAAA;AAEpC,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,CAAE,KAAA;AAClD,MAAA,MAAM,KAAK,QAAA,CAAS,EAAA;AACpB,MAAA,IAAI,OAAA,GAAU,KAAA;AAEd,MAAA,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,KAAQ;AACpC,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW,OAAO,KAAA;AAEpC,QAAA,IAAI,SAAS,IAAA,EAAM,GAAA,EAAK,IAAA,EAAO,EAAE,GAAG,OAAA,GAAU,IAAA;AAE9C,QAAA,OAAO,KAAA;AAAA,MACX,CAAC,CAAA;AAED,MAAA,OAAO,UAAU,EAAA,GAAK,IAAA;AAAA,IAC1B;AAAA,GACH,CAAA;AACL;AAGA,SAAS,QAAA,CAAS,KAAA,EAAa,QAAA,EAAkB,IAAA,EAAkB,EAAA,EAA0B;AACzF,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAC9B,EAAA,MAAM,QAAQ,QAAA,GAAW,CAAA;AACzB,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,OAAO,GAAA,EAAA,EAAO;AACtC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAEjC,IAAA,IAAI,CAAC,IAAA,IAAA,CAAS,IAAA,CAAK,KAAA,CAAM,OAAA,IAAW,OAAO,CAAA,EAAG;AAC9C,IAAA,IAAI,KAAK,KAAA,CAAM,QAAA,IAAY,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,EAAG;AAEnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,OAAO,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAA,EAAK,qBAAA,EAAsB,CAAE,KAAA;AAE3C,IAAA,IAAI,KAAA,IAAS,QAAQ,CAAA,EAAG;AACpB,MAAA,EAAA,CAAG,gBAAA,CAAiB,QAAQ,OAAA,EAAS,UAAA,EAAY,CAAC,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AACpE,MAAA,OAAA,GAAU,IAAA;AAAA,IACd;AAAA,EACJ;AAEA,EAAA,OAAO,OAAA;AACX","file":"chunk-MWT5PK3Z.mjs","sourcesContent":["import type { Node } from 'prosemirror-model';\nimport { Plugin, type Transaction } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport { columnResizingPluginKey, TableMap, tableNodeTypes } from 'prosemirror-tables';\n\n// On resize start, pin every unsized column to its rendered width so only the\n// dragged column changes (otherwise unsized columns jump to defaultCellMinWidth).\nexport function createColumnWidthPinPlugin() {\n let view: EditorView | null = null;\n\n return new Plugin({\n view(editorView) {\n view = editorView;\n\n return {\n destroy() {\n view = null;\n }\n };\n },\n appendTransaction(transactions, _oldState, newState) {\n // The columnResizing plugin sets `setDragging` meta on mousedown.\n const startedResize = transactions.some((tr) => tr.getMeta(columnResizingPluginKey)?.setDragging);\n\n if (!startedResize || !view) return null;\n\n const tableType = tableNodeTypes(newState.schema).table;\n const tr = newState.tr;\n let changed = false;\n\n newState.doc.descendants((node, pos) => {\n if (node.type !== tableType) return false;\n\n if (pinTable(node, pos, view!, tr)) changed = true;\n\n return false; // tables don't nest\n });\n\n return changed ? tr : null;\n }\n });\n}\n\n/** Pin each unsized, single-column cell of a table to its rendered width. */\nfunction pinTable(table: Node, tablePos: number, view: EditorView, tr: Transaction): boolean {\n const map = TableMap.get(table);\n const start = tablePos + 1;\n let changed = false;\n\n for (let col = 0; col < map.width; col++) {\n const cellRel = map.map[col]; // first row's cell in this column\n const cell = table.nodeAt(cellRel);\n\n if (!cell || (cell.attrs.colspan ?? 1) !== 1) continue;\n if (cell.attrs.colwidth && cell.attrs.colwidth[0]) continue;\n\n const dom = view.nodeDOM(start + cellRel) as HTMLElement | null;\n const width = dom?.getBoundingClientRect().width;\n\n if (width && width > 0) {\n tr.setNodeAttribute(start + cellRel, 'colwidth', [Math.round(width)]);\n changed = true;\n }\n }\n\n return changed;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/placeholder.ts"],"names":[],"mappings":"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","file":"chunk-NWRVBNBW.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/inputRules.ts"],"names":[],"mappings":"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","file":"chunk-OGEMGWLR.mjs","sourcesContent":["import { InputRule, inputRules, textblockTypeInputRule, wrappingInputRule } from 'prosemirror-inputrules';\nimport type { MarkType, NodeType, Schema } from 'prosemirror-model';\nimport { clearTypographyMarks } from '../commands/blocks';\nimport { DEFAULT_HIGHLIGHT_COLOR } from '../commands/constants';\nimport { sanitizeImageUrl, sanitizeTextAttr, sanitizeUrl } from '../utils/url';\n\n// --- Block rules ---\n\n// Markdown \"# \" -> heading. Clears explicit font-size/font-family so the\n// heading owns its typography, matching the toolbar heading command.\nfunction headingRule(schema: Schema, nodeType: NodeType, maxLevel: number) {\n return new InputRule(new RegExp(`^(#{1,${maxLevel}})\\\\s$`), (state, match, start, end) => {\n const level = match[1].length;\n const $start = state.doc.resolve(start);\n\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType)) return null;\n\n const tr = state.tr.delete(start, end).setBlockType(start, start, nodeType, { level });\n const $pos = tr.doc.resolve(start);\n\n clearTypographyMarks(tr, schema, $pos.start(), $pos.end());\n\n return tr;\n });\n}\n\nfunction blockquoteRule(nodeType: NodeType) {\n return wrappingInputRule(/^>\\s$/, nodeType);\n}\n\nfunction bulletListRule(nodeType: NodeType) {\n return wrappingInputRule(/^[-*+]\\s$/, nodeType);\n}\n\nfunction orderedListRule(nodeType: NodeType) {\n return wrappingInputRule(\n /^(\\d+)\\.\\s$/,\n nodeType,\n (match) => ({ start: +match[1] }),\n (match, node) => node.childCount + node.attrs.start === +match[1]\n );\n}\n\nfunction checkListRule(nodeType: NodeType, itemType: NodeType, schema: Schema) {\n return new InputRule(/^\\[([xX ])?\\]\\s$/, (state, match, start, end) => {\n const checked = match[1] === 'x' || match[1] === 'X';\n const listItem = itemType.create({ checked }, schema.nodes.paragraph.create());\n const list = nodeType.create(null, listItem);\n\n return state.tr.replaceWith(start - 1, end, list);\n });\n}\n\nfunction codeBlockRule(nodeType: NodeType) {\n // ``` / ~~~ (or with a trailing lang) at the start of a line opens a code\n // block, capturing the optional language so it survives into serialization.\n return textblockTypeInputRule(/^(?:```|~~~)([\\w-]*)$/, nodeType, (match) => ({ language: match[1] || null }));\n}\n\nfunction horizontalRuleRule(nodeType: NodeType) {\n return new InputRule(/^---$/, (state, _match, start, end) => {\n return state.tr.replaceWith(start - 1, end, nodeType.create());\n });\n}\n\n// --- Inline mark rules ---\n\n/**\n * Creates an input rule that wraps text between delimiters with a mark.\n * Pattern must have two capture groups: (openingDelimiter)(content)\n * The closing delimiter is part of the regex but not captured.\n */\nfunction markInputRule(regexp: RegExp, markType: MarkType) {\n return new InputRule(regexp, (state, match, start, end) => {\n const [fullMatch, openDelim, content] = match;\n\n if (!content) return null;\n\n const textStart = start + fullMatch.indexOf(openDelim);\n const tr = state.tr;\n\n tr.replaceWith(textStart, end, state.schema.text(content, [markType.create()]));\n tr.removeStoredMark(markType);\n\n return tr;\n });\n}\n\n// Markdown autolink \"<https://...>\" -> clickable link over the URL.\nfunction autolinkRule(schema: Schema, markType: MarkType) {\n return new InputRule(/<((?:https?|mailto):[^>\\s]+)>$/, (state, match, start, end) => {\n const raw = match[1];\n const href = sanitizeUrl(raw);\n\n if (!href) return null;\n\n const tr = state.tr;\n\n tr.replaceWith(start, end, schema.text(raw, [markType.create({ href })]));\n tr.removeStoredMark(markType);\n\n return tr;\n });\n}\n\n// Markdown \"[text](url)\" -> linked text.\nfunction linkRule(schema: Schema, markType: MarkType) {\n return new InputRule(/(?:^|[^!])\\[([^\\]]+)\\]\\(([^)\\s]+)\\)$/, (state, match, start, end) => {\n const [fullMatch, text, rawHref] = match;\n const href = sanitizeUrl(rawHref);\n\n if (!text || !href) return null;\n\n // Skip the optional leading non-\"!\" char the regex consumed.\n const linkStart = start + fullMatch.indexOf('[');\n const tr = state.tr;\n\n tr.replaceWith(linkStart, end, schema.text(text, [markType.create({ href })]));\n tr.removeStoredMark(markType);\n\n return tr;\n });\n}\n\n// Markdown \"\" -> image.\nfunction imageRule(schema: Schema, nodeType: NodeType) {\n return new InputRule(/!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)$/, (state, match, start, end) => {\n const [, alt, rawSrc] = match;\n const src = sanitizeImageUrl(rawSrc);\n\n if (!src) return null;\n\n return state.tr.replaceWith(start, end, nodeType.create({ src, alt: sanitizeTextAttr(alt) || null }));\n });\n}\n\n// Markdown \"==text==\" -> highlighted text (default highlight color via textStyle).\nfunction highlightRule(schema: Schema) {\n return new InputRule(/(?:^|\\s)(==)([^=]+)==$/, (state, match, start, end) => {\n const [fullMatch, openDelim, content] = match;\n\n if (!content || !schema.marks.textStyle) return null;\n\n const textStart = start + fullMatch.indexOf(openDelim);\n\n return state.tr.replaceWith(textStart, end, state.schema.text(content, [schema.marks.textStyle.create({ backgroundColor: DEFAULT_HIGHLIGHT_COLOR })]));\n });\n}\n\n// Markdown \"***text***\" -> bold + italic.\nfunction boldItalicRule(schema: Schema, bold: MarkType, italic: MarkType) {\n return new InputRule(/(?:^|\\s)(\\*\\*\\*)([^*]+)\\*\\*\\*$/, (state, match, start, end) => {\n const [fullMatch, openDelim, content] = match;\n\n if (!content) return null;\n\n const textStart = start + fullMatch.indexOf(openDelim);\n const tr = state.tr;\n\n tr.replaceWith(textStart, end, state.schema.text(content, [bold.create(), italic.create()]));\n tr.removeStoredMark(bold);\n tr.removeStoredMark(italic);\n\n return tr;\n });\n}\n\n// Markdown table header \"| a | b |\" + trailing space -> table seeded with the\n// header cells. Requires at least two columns so a lone \"| x |\" in prose (a\n// single cell) doesn't prematurely convert; the inner pipe disambiguates intent.\nfunction tableRule(schema: Schema) {\n return new InputRule(/^\\|(.+\\|.+)\\|\\s$/, (state, match, start) => {\n if (!schema.nodes.table) return null;\n\n const labels = match[1].split('|').map((h) => h.trim());\n\n // Need genuine columns: at least two cells and no fully-empty header.\n if (labels.length < 2 || labels.every((l) => !l)) return null;\n\n const headerCells = labels.map((label) => schema.nodes.table_header.create(null, label ? schema.nodes.paragraph.create(null, schema.text(label)) : schema.nodes.paragraph.create()));\n const bodyCells = labels.map(() => schema.nodes.table_cell.create(null, schema.nodes.paragraph.create()));\n const rows = [schema.nodes.table_row.create(null, headerCells), schema.nodes.table_row.create(null, bodyCells)];\n const table = schema.nodes.table.create(null, rows);\n\n const $start = state.doc.resolve(start);\n\n return state.tr.replaceWith($start.before(), $start.after(), table);\n });\n}\n\n/**\n * Create all markdown input rules for the given schema.\n */\nexport function createMarkdownInputRules(schema: Schema) {\n const rules: InputRule[] = [];\n\n // Block rules\n if (schema.nodes.heading) {\n rules.push(headingRule(schema, schema.nodes.heading, 6));\n }\n\n if (schema.nodes.blockquote) {\n rules.push(blockquoteRule(schema.nodes.blockquote));\n }\n\n if (schema.nodes.bullet_list) {\n rules.push(bulletListRule(schema.nodes.bullet_list));\n }\n\n if (schema.nodes.ordered_list) {\n rules.push(orderedListRule(schema.nodes.ordered_list));\n }\n\n if (schema.nodes.check_list && schema.nodes.check_list_item) {\n rules.push(checkListRule(schema.nodes.check_list, schema.nodes.check_list_item, schema));\n }\n\n if (schema.nodes.code_block) {\n rules.push(codeBlockRule(schema.nodes.code_block));\n }\n\n if (schema.nodes.horizontal_rule) {\n rules.push(horizontalRuleRule(schema.nodes.horizontal_rule));\n }\n\n if (schema.nodes.table && schema.nodes.table_row && schema.nodes.table_header && schema.nodes.table_cell) {\n rules.push(tableRule(schema));\n }\n\n // Image before link: \"\" contains \"[alt](url)\", so the image rule\n // must win or the link rule would fire on the inner pattern.\n if (schema.nodes.image) {\n rules.push(imageRule(schema, schema.nodes.image));\n }\n\n if (schema.marks.link) {\n rules.push(linkRule(schema, schema.marks.link));\n rules.push(autolinkRule(schema, schema.marks.link));\n }\n\n if (schema.marks.textStyle) {\n rules.push(highlightRule(schema));\n }\n\n // Inline mark rules — *** (bold+italic) before ** before * to avoid conflicts.\n if (schema.marks.bold && schema.marks.italic) {\n rules.push(boldItalicRule(schema, schema.marks.bold, schema.marks.italic));\n }\n\n if (schema.marks.bold) {\n rules.push(markInputRule(/(?:^|\\s)(\\*\\*)(.+?)\\*\\*$/, schema.marks.bold));\n // __text__ -> bold; leading boundary keeps intra-word underscores intact.\n rules.push(markInputRule(/(?:^|\\s)(__)(.+?)__$/, schema.marks.bold));\n }\n\n if (schema.marks.italic) {\n rules.push(markInputRule(/(?:^|[^*])(\\*)([^*]+)\\*$/, schema.marks.italic));\n // _text_ -> italic; requires a boundary before \"_\" so foo_bar_baz stays plain.\n rules.push(markInputRule(/(?:^|\\s)(_)([^_]+)_$/, schema.marks.italic));\n }\n\n if (schema.marks.code) {\n rules.push(markInputRule(/(?:^|\\s)(`)([^`]+)`$/, schema.marks.code));\n }\n\n if (schema.marks.strikethrough) {\n rules.push(markInputRule(/(?:^|\\s)(~~)(.+?)~~$/, schema.marks.strikethrough));\n }\n\n return inputRules({ rules });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/serialization/htmlParser.ts"],"names":["ProseMirrorDOMParser"],"mappings":"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","file":"chunk-PRFYR67X.mjs","sourcesContent":["import { DOMParser as ProseMirrorDOMParser, Slice, type Schema } from 'prosemirror-model';\n\nconst parserCache = new WeakMap<Schema, ProseMirrorDOMParser>();\n\nfunction getParser(schema: Schema): ProseMirrorDOMParser {\n let parser = parserCache.get(schema);\n\n if (!parser) {\n parser = ProseMirrorDOMParser.fromSchema(schema);\n parserCache.set(schema, parser);\n }\n\n return parser;\n}\n\n// Maximum element nesting depth allowed in incoming HTML. Pathologically deep\n// input (thousands of nested nodes) overflows the parser/renderer call stack and\n// crashes the editor; reject it before it reaches ProseMirror.\nconst MAX_PARSE_DEPTH = 200;\n// Cheap pre-parse cap on total open tags. Parsing the DOM tree itself is the\n// expensive step (super-linear for huge/deep input), so reject obviously\n// oversized HTML by counting tags in the string before ever building a tree.\nconst MAX_PARSE_TAGS = 50000;\n\nfunction tagCountExceeds(html: string, max: number): boolean {\n let count = 0;\n let i = -1;\n\n while ((i = html.indexOf('<', i + 1)) !== -1) {\n const next = html.charCodeAt(i + 1);\n\n // Count element open tags only (skip '</', '<!', '<?').\n if (next !== 0x2f && next !== 0x21 && next !== 0x3f && ++count > max) return true;\n }\n\n return false;\n}\n\nfunction exceedsMaxDepth(root: ParentNode, max: number): boolean {\n // Iterative DFS (no recursion — recursion would overflow on the very input we guard against).\n const stack: Array<{ el: Element; depth: number }> = [];\n\n for (const child of Array.from(root.children)) stack.push({ el: child, depth: 1 });\n\n while (stack.length) {\n const { el, depth } = stack.pop()!;\n\n if (depth > max) return true;\n\n for (const child of Array.from(el.children)) stack.push({ el: child, depth: depth + 1 });\n }\n\n return false;\n}\n\n// True when an HTML string is too large or nests deeper than MAX_PARSE_DEPTH.\nexport function htmlExceedsMaxDepth(html: string): boolean {\n if (tagCountExceeds(html, MAX_PARSE_TAGS)) return true;\n\n const tpl = document.createElement('template');\n\n tpl.innerHTML = html;\n\n return exceedsMaxDepth(tpl.content, MAX_PARSE_DEPTH);\n}\n\n// Parse untrusted HTML into an INERT fragment. A <template>'s content document\n// is inert: <img>/<iframe> resources are never fetched and event handlers like\n// onerror never fire, so no side effect runs before ProseMirror strips bad attrs.\nexport function htmlToInertFragment(html: string): DocumentFragment {\n if (tagCountExceeds(html, MAX_PARSE_TAGS)) {\n throw new RangeError(`HTML exceeds the maximum of ${MAX_PARSE_TAGS} tags`);\n }\n\n const tpl = document.createElement('template');\n\n tpl.innerHTML = html;\n\n if (exceedsMaxDepth(tpl.content, MAX_PARSE_DEPTH)) {\n throw new RangeError(`HTML nesting depth exceeds the maximum of ${MAX_PARSE_DEPTH}`);\n }\n\n return tpl.content;\n}\n\nexport function htmlToDoc(html: string, schema: Schema) {\n return getParser(schema).parse(htmlToInertFragment(html));\n}\n\n/**\n * Parse HTML into a maximally-open {@link Slice}, suitable for\n * `tr.replaceSelection(slice)` at any cursor position.\n *\n * Unlike `htmlToDoc(...).content` — which yields closed block nodes and throws\n * `RangeError: Invalid content for node` when spliced into an inline position —\n * an open slice lets ProseMirror fit block OR inline content into the current\n * selection context.\n */\nexport function htmlToSlice(html: string, schema: Schema): Slice {\n return getParser(schema).parseSlice(htmlToInertFragment(html), { preserveWhitespace: true });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/mention.ts"],"names":[],"mappings":"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","file":"chunk-PT2O4RV7.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';\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,\n 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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-PT5V6UYE.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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/menu.ts"],"names":[],"mappings":";AAAA,IAAM,kBAAA,GAAqB,uFAAA;AAEpB,SAAS,oBAAoB,SAAA,EAAuC;AACvE,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAA8B,kBAAkB,CAAC,CAAA;AACjF;AAEO,SAAS,qBAAA,CAAsB,OAAsB,KAAA,EAAgE;AACxH,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,IAAA,CAAO,IAAA,CAAK,eAAe,EAAA,EAAI,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA;AAE3E,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA;AAEf,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,SACvB,WAAA,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,SAAS,WAAA,EAAY;AAClC;AAEO,SAAS,wBAAA,CAAyB,IAAA,EAA0B,QAAA,EAAkB,OAAA,EAA2C;AAC5H,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,GAAG,QAAQ,CAAA,QAAA,EAAW,EAAE,OAAA,CAAQ,KAAK,CAAA,CAAA;AAE7D,EAAA,OAAO,IAAA,CAAK,EAAA;AAChB","file":"chunk-RH45QRSV.mjs","sourcesContent":["const MENU_ITEM_SELECTOR = 'button:not([hidden]):not([disabled]), [role=\"menuitem\"]:not([hidden]):not([disabled])';\n\nexport function getVisibleMenuItems(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(MENU_ITEM_SELECTOR));\n}\n\nexport function filterMenuItemsByText(items: HTMLElement[], query: string): { visible: HTMLElement[]; hiddenCount: number } {\n const q = query.trim().toLowerCase();\n const visible: HTMLElement[] = [];\n let hiddenCount = 0;\n\n for (const item of items) {\n const match = q === '' || (item.textContent ?? '').toLowerCase().includes(q);\n\n item.hidden = !match;\n\n if (match) visible.push(item);\n else hiddenCount++;\n }\n\n return { visible, hiddenCount };\n}\n\nexport function assignActiveDescendantId(item: HTMLElement | null, idPrefix: string, counter: { value: number }): string | null {\n if (!item) return null;\n\n if (!item.id) item.id = `${idPrefix}-option-${++counter.value}`;\n\n return item.id;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/selectionHighlight.ts"],"names":["from","to"],"mappings":";;;;AAKO,IAAM,qBAAA,GAAwB,IAAI,SAAA,CAAU,oBAAoB;AASvE,IAAM,WAAA,GAA8B,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,IAAI,EAAA,EAAI,EAAA,EAAI,WAAA,EAAa,aAAA,CAAc,KAAA,EAAM;AAEjG,SAAS,8BAAA,GAAiC;AAC7C,EAAA,OAAO,IAAI,MAAA,CAAO;AAAA,IACd,GAAA,EAAK,qBAAA;AAAA,IACL,KAAA,EAAO;AAAA,MACH,IAAA,GAAuB;AACnB,QAAA,OAAO,WAAA;AAAA,MACX,CAAA;AAAA,MACA,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,QAAA,EAA0B;AACjD,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,qBAAqB,CAAA;AAE7C,QAAA,IAAI,MAAM,IAAA,EAAM;AACZ,UAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,EAAA,EAAAC,KAAG,GAAI,IAAA;AAErB,UAAA,IAAID,KAAAA,KAASC,KAAI,OAAO,WAAA;AAExB,UAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAOD,KAAAA,EAAMC,GAAAA,EAAI;AAAA,YACrC,OAAO,iBAAA,CAAQ;AAAA,WAClB,CAAA;AAED,UAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAAD,OAAM,EAAA,EAAAC,GAAAA,EAAI,WAAA,EAAa,aAAA,CAAc,OAAO,EAAA,CAAG,GAAA,EAAK,CAAC,IAAI,CAAC,CAAA,EAAE;AAAA,QACvF;AAEA,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AAGzB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,QAAA,CAAS,SAAA;AAE9B,QAAA,IAAI,SAAS,EAAA,EAAI;AACb,UAAA,OAAO,WAAA;AAAA,QACX;AAGA,QAAA,IAAI,GAAG,UAAA,EAAY;AACf,UAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AAC3C,UAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AAEvC,UAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,UAAA,EAAY,QAAA,EAAU;AAAA,YACjD,OAAO,iBAAA,CAAQ;AAAA,WAClB,CAAA;AAED,UAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,YAAY,EAAA,EAAI,QAAA,EAAU,WAAA,EAAa,aAAA,CAAc,OAAO,EAAA,CAAG,GAAA,EAAK,CAAC,IAAI,CAAC,CAAA,EAAE;AAAA,QAC7G;AAEA,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,KACJ;AAAA,IACA,KAAA,EAAO;AAAA,MACH,YAAY,KAAA,EAAO;AACf,QAAA,OAAO,qBAAA,CAAsB,QAAA,CAAS,KAAK,CAAA,EAAG,eAAe,aAAA,CAAc,KAAA;AAAA,MAC/E;AAAA;AACJ,GACH,CAAA;AACL;AAEO,SAAS,kBAAkB,IAAA,EAAkB;AAChD,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,KAAK,KAAA,CAAM,SAAA;AAEhC,EAAA,IAAI,SAAS,EAAA,EAAI;AAEjB,EAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,qBAAA,EAAuB,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AACxF","file":"chunk-RQ2HHNI6.mjs","sourcesContent":["import { Plugin, PluginKey } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { textEditorClasses as classes } from '../texteditor.classes';\n\nexport const selectionHighlightKey = new PluginKey('selectionHighlight');\n\ninterface HighlightState {\n active: boolean;\n from: number;\n to: number;\n decorations: DecorationSet;\n}\n\nconst EMPTY_STATE: HighlightState = { active: false, from: -1, to: -1, decorations: DecorationSet.empty };\n\nexport function createSelectionHighlightPlugin() {\n return new Plugin({\n key: selectionHighlightKey,\n state: {\n init(): HighlightState {\n return EMPTY_STATE;\n },\n apply(tr, prev, _oldState, newState): HighlightState {\n const meta = tr.getMeta(selectionHighlightKey);\n\n if (meta?.show) {\n const { from, to } = meta;\n\n if (from === to) return EMPTY_STATE;\n\n const deco = Decoration.inline(from, to, {\n class: classes.selection\n });\n\n return { active: true, from, to, decorations: DecorationSet.create(tr.doc, [deco]) };\n }\n\n if (!prev.active) return prev;\n\n // Auto-clear: if selection collapsed (user clicked), remove decoration\n const { from, to } = newState.selection;\n\n if (from === to) {\n return EMPTY_STATE;\n }\n\n // Remap on doc change\n if (tr.docChanged) {\n const mappedFrom = tr.mapping.map(prev.from);\n const mappedTo = tr.mapping.map(prev.to);\n\n const deco = Decoration.inline(mappedFrom, mappedTo, {\n class: classes.selection\n });\n\n return { active: true, from: mappedFrom, to: mappedTo, decorations: DecorationSet.create(tr.doc, [deco]) };\n }\n\n return prev;\n }\n },\n props: {\n decorations(state) {\n return selectionHighlightKey.getState(state)?.decorations ?? DecorationSet.empty;\n }\n }\n });\n}\n\nexport function preserveSelection(view: EditorView) {\n const { from, to } = view.state.selection;\n\n if (from === to) return;\n\n view.dispatch(view.state.tr.setMeta(selectionHighlightKey, { show: true, from, to }));\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/constants.ts"],"names":[],"mappings":";AAGO,IAAM,uBAAA,GAA0B","file":"chunk-TB7ZSSR2.mjs","sourcesContent":["// Default one-click highlight color (a soft yellow). The single source of truth\n// for the highlight command, keymap shortcut, and the \"==\" markdown input rule.\n// Overridable per-editor via the `defaultHighlightColor` prop.\nexport const DEFAULT_HIGHLIGHT_COLOR = 'rgba(242, 201, 76, 0.4)';\n"]}
|