@primeui/texteditor-core 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +1 -0
  3. package/dist/chunk-22B454VC.mjs +83 -0
  4. package/dist/chunk-22B454VC.mjs.map +1 -0
  5. package/dist/chunk-3RKMABZR.mjs +320 -0
  6. package/dist/chunk-3RKMABZR.mjs.map +1 -0
  7. package/dist/chunk-6GY64GPU.mjs +18 -0
  8. package/dist/chunk-6GY64GPU.mjs.map +1 -0
  9. package/dist/chunk-6YDCG63C.mjs +833 -0
  10. package/dist/chunk-6YDCG63C.mjs.map +1 -0
  11. package/dist/chunk-6ZN5XRH2.mjs +45 -0
  12. package/dist/chunk-6ZN5XRH2.mjs.map +1 -0
  13. package/dist/chunk-72T5I4O4.mjs +76 -0
  14. package/dist/chunk-72T5I4O4.mjs.map +1 -0
  15. package/dist/chunk-7QCHSEN2.mjs +16 -0
  16. package/dist/chunk-7QCHSEN2.mjs.map +1 -0
  17. package/dist/chunk-AJOKUIQD.mjs +33 -0
  18. package/dist/chunk-AJOKUIQD.mjs.map +1 -0
  19. package/dist/chunk-AUTGNC2Q.mjs +197 -0
  20. package/dist/chunk-AUTGNC2Q.mjs.map +1 -0
  21. package/dist/chunk-CRAB2MFE.mjs +19 -0
  22. package/dist/chunk-CRAB2MFE.mjs.map +1 -0
  23. package/dist/chunk-DXPG5XMX.mjs +18 -0
  24. package/dist/chunk-DXPG5XMX.mjs.map +1 -0
  25. package/dist/chunk-E2KXUP3F.mjs +9 -0
  26. package/dist/chunk-E2KXUP3F.mjs.map +1 -0
  27. package/dist/chunk-EA2YI7LA.mjs +23 -0
  28. package/dist/chunk-EA2YI7LA.mjs.map +1 -0
  29. package/dist/chunk-F7BJWPT6.mjs +401 -0
  30. package/dist/chunk-F7BJWPT6.mjs.map +1 -0
  31. package/dist/chunk-FFCQLWS5.mjs +32 -0
  32. package/dist/chunk-FFCQLWS5.mjs.map +1 -0
  33. package/dist/chunk-GG56GLXC.mjs +42 -0
  34. package/dist/chunk-GG56GLXC.mjs.map +1 -0
  35. package/dist/chunk-GGPBV4BM.mjs +37 -0
  36. package/dist/chunk-GGPBV4BM.mjs.map +1 -0
  37. package/dist/chunk-H3RFOYCT.mjs +27 -0
  38. package/dist/chunk-H3RFOYCT.mjs.map +1 -0
  39. package/dist/chunk-IUQKSDKG.mjs +23 -0
  40. package/dist/chunk-IUQKSDKG.mjs.map +1 -0
  41. package/dist/chunk-J5LGTIGS.mjs +9 -0
  42. package/dist/chunk-J5LGTIGS.mjs.map +1 -0
  43. package/dist/chunk-KNZAMA6H.mjs +198 -0
  44. package/dist/chunk-KNZAMA6H.mjs.map +1 -0
  45. package/dist/chunk-MNKMKFLQ.mjs +27 -0
  46. package/dist/chunk-MNKMKFLQ.mjs.map +1 -0
  47. package/dist/chunk-MWT5PK3Z.mjs +52 -0
  48. package/dist/chunk-MWT5PK3Z.mjs.map +1 -0
  49. package/dist/chunk-NWRVBNBW.mjs +65 -0
  50. package/dist/chunk-NWRVBNBW.mjs.map +1 -0
  51. package/dist/chunk-OGEMGWLR.mjs +180 -0
  52. package/dist/chunk-OGEMGWLR.mjs.map +1 -0
  53. package/dist/chunk-PRFYR67X.mjs +60 -0
  54. package/dist/chunk-PRFYR67X.mjs.map +1 -0
  55. package/dist/chunk-PT2O4RV7.mjs +143 -0
  56. package/dist/chunk-PT2O4RV7.mjs.map +1 -0
  57. package/dist/chunk-PT5V6UYE.mjs +10 -0
  58. package/dist/chunk-PT5V6UYE.mjs.map +1 -0
  59. package/dist/chunk-RH45QRSV.mjs +26 -0
  60. package/dist/chunk-RH45QRSV.mjs.map +1 -0
  61. package/dist/chunk-RQ2HHNI6.mjs +55 -0
  62. package/dist/chunk-RQ2HHNI6.mjs.map +1 -0
  63. package/dist/chunk-TB7ZSSR2.mjs +6 -0
  64. package/dist/chunk-TB7ZSSR2.mjs.map +1 -0
  65. package/dist/chunk-TBQVZVKA.mjs +1891 -0
  66. package/dist/chunk-TBQVZVKA.mjs.map +1 -0
  67. package/dist/chunk-VWGQMUPD.mjs +182 -0
  68. package/dist/chunk-VWGQMUPD.mjs.map +1 -0
  69. package/dist/chunk-XKY2VYPW.mjs +26 -0
  70. package/dist/chunk-XKY2VYPW.mjs.map +1 -0
  71. package/dist/chunk-XSVIGDQR.mjs +22 -0
  72. package/dist/chunk-XSVIGDQR.mjs.map +1 -0
  73. package/dist/chunk-YHMP6AN3.mjs +231 -0
  74. package/dist/chunk-YHMP6AN3.mjs.map +1 -0
  75. package/dist/commands/index.d.mts +13 -0
  76. package/dist/commands/index.mjs +13 -0
  77. package/dist/commands/index.mjs.map +1 -0
  78. package/dist/createTextEditor.d.mts +7 -0
  79. package/dist/createTextEditor.mjs +31 -0
  80. package/dist/createTextEditor.mjs.map +1 -0
  81. package/dist/index.d.mts +17 -0
  82. package/dist/index.mjs +45 -0
  83. package/dist/index.mjs.map +1 -0
  84. package/dist/plugins/columnWidthPin.d.mts +5 -0
  85. package/dist/plugins/columnWidthPin.mjs +4 -0
  86. package/dist/plugins/columnWidthPin.mjs.map +1 -0
  87. package/dist/plugins/contextToolbar.d.mts +9 -0
  88. package/dist/plugins/contextToolbar.mjs +5 -0
  89. package/dist/plugins/contextToolbar.mjs.map +1 -0
  90. package/dist/plugins/defineTextEditorPlugin.d.mts +20 -0
  91. package/dist/plugins/defineTextEditorPlugin.mjs +4 -0
  92. package/dist/plugins/defineTextEditorPlugin.mjs.map +1 -0
  93. package/dist/plugins/inputRules.d.mts +14 -0
  94. package/dist/plugins/inputRules.mjs +8 -0
  95. package/dist/plugins/inputRules.mjs.map +1 -0
  96. package/dist/plugins/keymap.d.mts +16 -0
  97. package/dist/plugins/keymap.mjs +6 -0
  98. package/dist/plugins/keymap.mjs.map +1 -0
  99. package/dist/plugins/mention.d.mts +24 -0
  100. package/dist/plugins/mention.mjs +5 -0
  101. package/dist/plugins/mention.mjs.map +1 -0
  102. package/dist/plugins/mentionController.d.mts +16 -0
  103. package/dist/plugins/mentionController.mjs +4 -0
  104. package/dist/plugins/mentionController.mjs.map +1 -0
  105. package/dist/plugins/placeholder.d.mts +9 -0
  106. package/dist/plugins/placeholder.mjs +5 -0
  107. package/dist/plugins/placeholder.mjs.map +1 -0
  108. package/dist/plugins/registry.d.mts +7 -0
  109. package/dist/plugins/registry.mjs +4 -0
  110. package/dist/plugins/registry.mjs.map +1 -0
  111. package/dist/plugins/selectionHighlight.d.mts +14 -0
  112. package/dist/plugins/selectionHighlight.mjs +5 -0
  113. package/dist/plugins/selectionHighlight.mjs.map +1 -0
  114. package/dist/plugins/slashCommands.d.mts +28 -0
  115. package/dist/plugins/slashCommands.mjs +5 -0
  116. package/dist/plugins/slashCommands.mjs.map +1 -0
  117. package/dist/plugins/tableOverlay.d.mts +15 -0
  118. package/dist/plugins/tableOverlay.mjs +6 -0
  119. package/dist/plugins/tableOverlay.mjs.map +1 -0
  120. package/dist/plugins/trailingNode.d.mts +6 -0
  121. package/dist/plugins/trailingNode.mjs +4 -0
  122. package/dist/plugins/trailingNode.mjs.map +1 -0
  123. package/dist/position-DbkbTrFL.d.mts +50 -0
  124. package/dist/schema/index.d.mts +89 -0
  125. package/dist/schema/index.mjs +8 -0
  126. package/dist/schema/index.mjs.map +1 -0
  127. package/dist/serialization/index.d.mts +8 -0
  128. package/dist/serialization/index.mjs +5 -0
  129. package/dist/serialization/index.mjs.map +1 -0
  130. package/dist/texteditor.classes.d.mts +34 -0
  131. package/dist/texteditor.classes.mjs +4 -0
  132. package/dist/texteditor.classes.mjs.map +1 -0
  133. package/dist/texteditor.constants.d.mts +36 -0
  134. package/dist/texteditor.constants.mjs +4 -0
  135. package/dist/texteditor.constants.mjs.map +1 -0
  136. package/dist/texteditor.props.d.mts +5 -0
  137. package/dist/texteditor.props.mjs +4 -0
  138. package/dist/texteditor.props.mjs.map +1 -0
  139. package/dist/texteditor.refs.d.mts +5 -0
  140. package/dist/texteditor.refs.mjs +4 -0
  141. package/dist/texteditor.refs.mjs.map +1 -0
  142. package/dist/texteditor.state.d.mts +5 -0
  143. package/dist/texteditor.state.mjs +4 -0
  144. package/dist/texteditor.state.mjs.map +1 -0
  145. package/dist/ui/focus.d.mts +5 -0
  146. package/dist/ui/focus.mjs +4 -0
  147. package/dist/ui/focus.mjs.map +1 -0
  148. package/dist/ui/index.d.mts +6 -0
  149. package/dist/ui/index.mjs +9 -0
  150. package/dist/ui/index.mjs.map +1 -0
  151. package/dist/ui/keyboard.d.mts +4 -0
  152. package/dist/ui/keyboard.mjs +4 -0
  153. package/dist/ui/keyboard.mjs.map +1 -0
  154. package/dist/ui/menu.d.mts +10 -0
  155. package/dist/ui/menu.mjs +4 -0
  156. package/dist/ui/menu.mjs.map +1 -0
  157. package/dist/ui/positioning.d.mts +30 -0
  158. package/dist/ui/positioning.mjs +5 -0
  159. package/dist/ui/positioning.mjs.map +1 -0
  160. package/dist/ui/scroll.d.mts +6 -0
  161. package/dist/ui/scroll.mjs +4 -0
  162. package/dist/ui/scroll.mjs.map +1 -0
  163. package/dist/utils/index.d.mts +18 -0
  164. package/dist/utils/index.mjs +18 -0
  165. package/dist/utils/index.mjs.map +1 -0
  166. package/package.json +73 -0
@@ -0,0 +1,19 @@
1
+ // src/ui/keyboard.ts
2
+ function computeArrowNavIndex(currentIdx, itemCount, dir) {
3
+ if (itemCount === 0) return -1;
4
+ if (dir === "down") {
5
+ return currentIdx < 0 ? 0 : (currentIdx + 1) % itemCount;
6
+ }
7
+ return currentIdx < 0 ? itemCount - 1 : (currentIdx - 1 + itemCount) % itemCount;
8
+ }
9
+ function computeFocusTrapTarget(itemCount, focusedIdx, shift) {
10
+ if (itemCount === 0) return -1;
11
+ if (shift) {
12
+ return focusedIdx <= 0 ? itemCount - 1 : focusedIdx - 1;
13
+ }
14
+ return focusedIdx === -1 || focusedIdx === itemCount - 1 ? 0 : focusedIdx + 1;
15
+ }
16
+
17
+ export { computeArrowNavIndex, computeFocusTrapTarget };
18
+ //# sourceMappingURL=chunk-CRAB2MFE.mjs.map
19
+ //# sourceMappingURL=chunk-CRAB2MFE.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,18 @@
1
+ // src/ui/scroll.ts
2
+ function computeEdgeScrollSpeed(clientY, rect, threshold, maxSpeed) {
3
+ const fromTop = clientY - rect.top;
4
+ const fromBottom = rect.bottom - clientY;
5
+ if (fromTop < threshold) {
6
+ const ratio = Math.max(0, Math.min(1, (threshold - fromTop) / threshold));
7
+ return -Math.ceil(ratio * maxSpeed);
8
+ }
9
+ if (fromBottom < threshold) {
10
+ const ratio = Math.max(0, Math.min(1, (threshold - fromBottom) / threshold));
11
+ return Math.ceil(ratio * maxSpeed);
12
+ }
13
+ return 0;
14
+ }
15
+
16
+ export { computeEdgeScrollSpeed };
17
+ //# sourceMappingURL=chunk-DXPG5XMX.mjs.map
18
+ //# sourceMappingURL=chunk-DXPG5XMX.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,9 @@
1
+ // src/texteditor.refs.ts
2
+ var defaultTextEditorRefs = {
3
+ element: void 0,
4
+ fileInputElement: void 0
5
+ };
6
+
7
+ export { defaultTextEditorRefs };
8
+ //# sourceMappingURL=chunk-E2KXUP3F.mjs.map
9
+ //# sourceMappingURL=chunk-E2KXUP3F.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,23 @@
1
+ import { PluginKey, Plugin } from 'prosemirror-state';
2
+
3
+ // src/plugins/trailingNode.ts
4
+ var trailingNodeKey = new PluginKey("trailingNode");
5
+ function createTrailingNodePlugin(schema) {
6
+ const paragraphType = schema.nodes.paragraph;
7
+ return new Plugin({
8
+ key: trailingNodeKey,
9
+ appendTransaction(transactions, _oldState, newState) {
10
+ if (!transactions.some((tr) => tr.docChanged)) return null;
11
+ const { doc } = newState;
12
+ const lastNode = doc.lastChild;
13
+ if (!lastNode || lastNode.type !== paragraphType) {
14
+ return newState.tr.insert(doc.content.size, paragraphType.create());
15
+ }
16
+ return null;
17
+ }
18
+ });
19
+ }
20
+
21
+ export { createTrailingNodePlugin };
22
+ //# sourceMappingURL=chunk-EA2YI7LA.mjs.map
23
+ //# sourceMappingURL=chunk-EA2YI7LA.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,401 @@
1
+ import { sanitizeCssValue } from './chunk-7QCHSEN2.mjs';
2
+ import { sanitizeImageUrl, sanitizeTextAttr } from './chunk-MNKMKFLQ.mjs';
3
+ import { textEditorClasses } from './chunk-GG56GLXC.mjs';
4
+ import { __export } from './chunk-J5LGTIGS.mjs';
5
+
6
+ // src/schema/nodes.ts
7
+ var nodes_exports = {};
8
+ __export(nodes_exports, {
9
+ blockquote: () => blockquote,
10
+ bullet_list: () => bullet_list,
11
+ check_list: () => check_list,
12
+ check_list_item: () => check_list_item,
13
+ code_block: () => code_block,
14
+ doc: () => doc,
15
+ document_upload_placeholder: () => document_upload_placeholder,
16
+ hard_break: () => hard_break,
17
+ heading: () => heading,
18
+ horizontal_rule: () => horizontal_rule,
19
+ image: () => image,
20
+ image_upload_placeholder: () => image_upload_placeholder,
21
+ list_item: () => list_item,
22
+ mention: () => mention,
23
+ ordered_list: () => ordered_list,
24
+ paragraph: () => paragraph,
25
+ parseDimension: () => parseDimension,
26
+ table: () => table,
27
+ table_cell: () => table_cell,
28
+ table_header: () => table_header,
29
+ table_row: () => table_row,
30
+ text: () => text
31
+ });
32
+ function stripMarkupFromJson(value) {
33
+ if (typeof value === "string") return value.replace(/[<>]/g, "");
34
+ if (Array.isArray(value)) return value.map(stripMarkupFromJson);
35
+ if (value && typeof value === "object") {
36
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, stripMarkupFromJson(v)]));
37
+ }
38
+ return value;
39
+ }
40
+ function parseColwidth(raw) {
41
+ if (!raw) return null;
42
+ const widths = raw.split(",").map(Number).filter(Number.isFinite);
43
+ return widths.length > 0 ? widths : null;
44
+ }
45
+ var MENTION_DATA_MAX_LENGTH = 64 * 1024;
46
+ function parseDimension(raw) {
47
+ if (!raw) return null;
48
+ const n = Number(raw);
49
+ return Number.isFinite(n) && n >= 0 ? String(n) : null;
50
+ }
51
+ var doc = {
52
+ content: "block+"
53
+ };
54
+ var text = {
55
+ group: "inline"
56
+ };
57
+ var paragraph = {
58
+ content: "inline*",
59
+ group: "block",
60
+ attrs: {
61
+ textAlign: { default: null }
62
+ },
63
+ parseDOM: [
64
+ {
65
+ tag: "p",
66
+ getAttrs(node) {
67
+ return { textAlign: node.style.textAlign || null };
68
+ }
69
+ }
70
+ ],
71
+ toDOM(node) {
72
+ const attrs = {};
73
+ const align = ["left", "center", "right", "justify"].includes(node.attrs.textAlign) ? node.attrs.textAlign : null;
74
+ if (align) attrs.style = `text-align: ${align}`;
75
+ return ["p", attrs, 0];
76
+ }
77
+ };
78
+ var heading = {
79
+ content: "inline*",
80
+ group: "block",
81
+ attrs: {
82
+ level: { default: 1 },
83
+ textAlign: { default: null }
84
+ },
85
+ defining: true,
86
+ parseDOM: [1, 2, 3, 4, 5, 6].map((level) => ({
87
+ tag: `h${level}`,
88
+ attrs: { level },
89
+ getAttrs(node) {
90
+ return { level, textAlign: node.style.textAlign || null };
91
+ }
92
+ })),
93
+ toDOM(node) {
94
+ const attrs = {};
95
+ const align = ["left", "center", "right", "justify"].includes(node.attrs.textAlign) ? node.attrs.textAlign : null;
96
+ if (align) attrs.style = `text-align: ${align}`;
97
+ return [`h${node.attrs.level}`, attrs, 0];
98
+ }
99
+ };
100
+ var blockquote = {
101
+ content: "block+",
102
+ group: "block",
103
+ defining: true,
104
+ parseDOM: [{ tag: "blockquote" }],
105
+ toDOM() {
106
+ return ["blockquote", 0];
107
+ }
108
+ };
109
+ var code_block = {
110
+ content: "text*",
111
+ marks: "",
112
+ group: "block",
113
+ code: true,
114
+ defining: true,
115
+ attrs: { language: { default: null } },
116
+ parseDOM: [
117
+ {
118
+ tag: "pre",
119
+ preserveWhitespace: "full",
120
+ getAttrs(node) {
121
+ const el = node;
122
+ const code = el.querySelector("code") ?? el;
123
+ const cls = code.getAttribute("class") || el.getAttribute("class") || "";
124
+ const match = cls.match(/language-([\w-]+)/);
125
+ return { language: match ? match[1] : el.getAttribute("data-language") || null };
126
+ }
127
+ }
128
+ ],
129
+ toDOM(node) {
130
+ const lang = node.attrs.language;
131
+ return lang ? ["pre", { "data-language": lang }, ["code", { class: `language-${lang}` }, 0]] : ["pre", ["code", 0]];
132
+ }
133
+ };
134
+ var horizontal_rule = {
135
+ group: "block",
136
+ parseDOM: [{ tag: "hr" }],
137
+ toDOM() {
138
+ return ["hr"];
139
+ }
140
+ };
141
+ var hard_break = {
142
+ inline: true,
143
+ group: "inline",
144
+ selectable: false,
145
+ parseDOM: [{ tag: "br" }],
146
+ toDOM() {
147
+ return ["br"];
148
+ }
149
+ };
150
+ var image = {
151
+ inline: true,
152
+ group: "inline",
153
+ draggable: true,
154
+ attrs: {
155
+ src: {},
156
+ alt: { default: null },
157
+ width: { default: null },
158
+ height: { default: null }
159
+ },
160
+ parseDOM: [
161
+ {
162
+ tag: "img[src]",
163
+ getAttrs(node) {
164
+ const el = node;
165
+ const src = sanitizeImageUrl(el.getAttribute("src"));
166
+ if (src == null) return false;
167
+ return {
168
+ src,
169
+ alt: sanitizeTextAttr(el.getAttribute("alt")),
170
+ width: parseDimension(el.getAttribute("width")),
171
+ height: parseDimension(el.getAttribute("height"))
172
+ };
173
+ }
174
+ }
175
+ ],
176
+ toDOM(node) {
177
+ const src = sanitizeImageUrl(node.attrs.src);
178
+ const attrs = { src: src ?? "" };
179
+ if (node.attrs.alt) attrs.alt = node.attrs.alt;
180
+ if (node.attrs.width) attrs.width = node.attrs.width;
181
+ if (node.attrs.height) attrs.height = node.attrs.height;
182
+ return ["img", attrs];
183
+ }
184
+ };
185
+ var mention = {
186
+ inline: true,
187
+ group: "inline",
188
+ atom: true,
189
+ attrs: {
190
+ id: { default: null },
191
+ label: {},
192
+ data: { default: null }
193
+ },
194
+ parseDOM: [
195
+ {
196
+ tag: "span[data-p-mention]",
197
+ getAttrs(node) {
198
+ const el = node;
199
+ const rawData = el.getAttribute("data-p-mention-data");
200
+ let data = null;
201
+ if (rawData && rawData.length <= MENTION_DATA_MAX_LENGTH) {
202
+ try {
203
+ data = stripMarkupFromJson(JSON.parse(rawData));
204
+ } catch {
205
+ data = null;
206
+ }
207
+ }
208
+ return {
209
+ id: sanitizeTextAttr(el.getAttribute("data-p-mention-id")),
210
+ label: sanitizeTextAttr(el.textContent),
211
+ data
212
+ };
213
+ }
214
+ }
215
+ ],
216
+ toDOM(node) {
217
+ const attrs = { class: textEditorClasses.mention, "data-p-mention": "", "data-p-mention-id": node.attrs.id || "" };
218
+ if (node.attrs.data != null) attrs["data-p-mention-data"] = JSON.stringify(node.attrs.data);
219
+ return ["span", attrs, node.attrs.label];
220
+ }
221
+ };
222
+ var image_upload_placeholder = {
223
+ group: "block",
224
+ atom: true,
225
+ selectable: false,
226
+ parseDOM: [{ tag: "div[data-p-image-upload]" }],
227
+ toDOM() {
228
+ return ["div", { "data-p-image-upload": "", class: textEditorClasses.imageUploadPlaceholder }];
229
+ }
230
+ };
231
+ var document_upload_placeholder = {
232
+ group: "block",
233
+ atom: true,
234
+ selectable: false,
235
+ parseDOM: [{ tag: "div[data-p-document-upload]" }],
236
+ toDOM() {
237
+ return ["div", { "data-p-document-upload": "", class: textEditorClasses.documentUploadPlaceholder }];
238
+ }
239
+ };
240
+ var bullet_list = {
241
+ content: "list_item+",
242
+ group: "block",
243
+ parseDOM: [{ tag: "ul", getAttrs: (node) => !node.hasAttribute("data-p-checked-list") && null }],
244
+ toDOM() {
245
+ return ["ul", 0];
246
+ }
247
+ };
248
+ var ordered_list = {
249
+ content: "list_item+",
250
+ group: "block",
251
+ attrs: { start: { default: 1 } },
252
+ parseDOM: [
253
+ {
254
+ tag: "ol",
255
+ getAttrs(node) {
256
+ return { start: node.start || 1 };
257
+ }
258
+ }
259
+ ],
260
+ toDOM(node) {
261
+ return node.attrs.start === 1 ? ["ol", 0] : ["ol", { start: node.attrs.start }, 0];
262
+ }
263
+ };
264
+ var list_item = {
265
+ content: "paragraph block*",
266
+ parseDOM: [{ tag: "li", getAttrs: (node) => !node.hasAttribute("data-p-checked") && null }],
267
+ toDOM() {
268
+ return ["li", 0];
269
+ },
270
+ defining: true
271
+ };
272
+ var check_list = {
273
+ content: "check_list_item+",
274
+ group: "block",
275
+ parseDOM: [{ tag: "ul[data-p-checked-list]" }],
276
+ toDOM() {
277
+ return ["ul", { "data-p-checked-list": "" }, 0];
278
+ }
279
+ };
280
+ var check_list_item = {
281
+ content: "paragraph block*",
282
+ attrs: {
283
+ checked: { default: false }
284
+ },
285
+ parseDOM: [
286
+ {
287
+ tag: "li[data-p-checked]",
288
+ getAttrs(node) {
289
+ return { checked: node.getAttribute("data-p-checked") === "true" };
290
+ }
291
+ }
292
+ ],
293
+ toDOM(node) {
294
+ return ["li", { "data-p-checked": node.attrs.checked ? "true" : "false" }, 0];
295
+ }
296
+ };
297
+ var table = {
298
+ content: "table_row+",
299
+ group: "block",
300
+ tableRole: "table",
301
+ isolating: true,
302
+ parseDOM: [{ tag: "table" }],
303
+ toDOM(node) {
304
+ const cols = [];
305
+ const firstRow = node.firstChild;
306
+ if (firstRow) {
307
+ firstRow.forEach((cell) => {
308
+ const span = cell.attrs.colspan ?? 1;
309
+ const widths = cell.attrs.colwidth;
310
+ for (let i = 0; i < span; i++) {
311
+ const w = widths?.[i];
312
+ cols.push(w ? ["col", { style: `width: ${w}px` }] : ["col", {}]);
313
+ }
314
+ });
315
+ }
316
+ return cols.length ? ["table", ["colgroup", ...cols], ["tbody", 0]] : ["table", ["tbody", 0]];
317
+ }
318
+ };
319
+ var table_row = {
320
+ content: "(table_cell | table_header)*",
321
+ tableRole: "row",
322
+ parseDOM: [{ tag: "tr" }],
323
+ toDOM() {
324
+ return ["tr", 0];
325
+ }
326
+ };
327
+ var table_cell = {
328
+ content: "block+",
329
+ attrs: {
330
+ colspan: { default: 1 },
331
+ rowspan: { default: 1 },
332
+ colwidth: { default: null },
333
+ backgroundColor: { default: null }
334
+ },
335
+ tableRole: "cell",
336
+ isolating: true,
337
+ parseDOM: [
338
+ {
339
+ tag: "td",
340
+ getAttrs(node) {
341
+ const el = node;
342
+ return {
343
+ colspan: el.colSpan || 1,
344
+ rowspan: el.rowSpan || 1,
345
+ colwidth: parseColwidth(el.getAttribute("data-colwidth")),
346
+ backgroundColor: sanitizeCssValue(el.style.backgroundColor)
347
+ };
348
+ }
349
+ }
350
+ ],
351
+ toDOM(node) {
352
+ const attrs = {};
353
+ if (node.attrs.colspan !== 1) attrs.colspan = node.attrs.colspan;
354
+ if (node.attrs.rowspan !== 1) attrs.rowspan = node.attrs.rowspan;
355
+ if (node.attrs.colwidth) attrs["data-colwidth"] = node.attrs.colwidth.join(",");
356
+ const bg = sanitizeCssValue(node.attrs.backgroundColor);
357
+ if (bg) attrs.style = `background-color: ${bg}`;
358
+ return ["td", attrs, 0];
359
+ }
360
+ };
361
+ var table_header = {
362
+ content: "block+",
363
+ attrs: {
364
+ colspan: { default: 1 },
365
+ rowspan: { default: 1 },
366
+ colwidth: { default: null },
367
+ backgroundColor: { default: null },
368
+ scope: { default: "col" }
369
+ },
370
+ tableRole: "header_cell",
371
+ isolating: true,
372
+ parseDOM: [
373
+ {
374
+ tag: "th",
375
+ getAttrs(node) {
376
+ const el = node;
377
+ const rawScope = el.getAttribute("scope");
378
+ return {
379
+ colspan: el.colSpan || 1,
380
+ rowspan: el.rowSpan || 1,
381
+ colwidth: parseColwidth(el.getAttribute("data-colwidth")),
382
+ backgroundColor: sanitizeCssValue(el.style.backgroundColor),
383
+ scope: rawScope === "row" || rawScope === "col" ? rawScope : "col"
384
+ };
385
+ }
386
+ }
387
+ ],
388
+ toDOM(node) {
389
+ const attrs = { scope: node.attrs.scope === "row" ? "row" : "col" };
390
+ if (node.attrs.colspan !== 1) attrs.colspan = node.attrs.colspan;
391
+ if (node.attrs.rowspan !== 1) attrs.rowspan = node.attrs.rowspan;
392
+ if (node.attrs.colwidth) attrs["data-colwidth"] = node.attrs.colwidth.join(",");
393
+ const bg = sanitizeCssValue(node.attrs.backgroundColor);
394
+ if (bg) attrs.style = `background-color: ${bg}`;
395
+ return ["th", attrs, 0];
396
+ }
397
+ };
398
+
399
+ export { blockquote, bullet_list, check_list, check_list_item, code_block, doc, document_upload_placeholder, hard_break, heading, horizontal_rule, image, image_upload_placeholder, list_item, mention, nodes_exports, ordered_list, paragraph, parseDimension, table, table_cell, table_header, table_row, text };
400
+ //# sourceMappingURL=chunk-F7BJWPT6.mjs.map
401
+ //# sourceMappingURL=chunk-F7BJWPT6.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,32 @@
1
+ // src/ui/positioning.ts
2
+ function computePopoverPosition(anchor, popoverSize, viewport, opts) {
3
+ let top = anchor.bottom + opts.margin;
4
+ if (top + popoverSize.height > viewport.height - opts.margin) {
5
+ top = anchor.top - popoverSize.height - opts.margin;
6
+ }
7
+ if (top < opts.margin) top = opts.margin;
8
+ const physicalLeft = opts.isRtl ? anchor.left - popoverSize.width : anchor.left;
9
+ const left = clampWidth(physicalLeft, popoverSize.width, opts.margin, viewport.width);
10
+ return { top, left };
11
+ }
12
+ function computeSubmenuPosition(trigger, popoverSize, viewport, opts) {
13
+ let top = trigger.top;
14
+ if (top + popoverSize.height > viewport.height - opts.margin) {
15
+ top = viewport.height - popoverSize.height - opts.margin;
16
+ }
17
+ if (top < opts.margin) top = opts.margin;
18
+ const endLeft = opts.isRtl ? trigger.left - popoverSize.width - opts.margin : trigger.right + opts.margin;
19
+ const startLeft = opts.isRtl ? trigger.right + opts.margin : trigger.left - popoverSize.width - opts.margin;
20
+ const overflowsEnd = endLeft + popoverSize.width > viewport.width - opts.margin || endLeft < opts.margin;
21
+ const left = overflowsEnd ? startLeft : endLeft;
22
+ return { top, left };
23
+ }
24
+ function clampWidth(left, elWidth, margin, viewportWidth) {
25
+ if (left < margin) return margin;
26
+ if (left + elWidth > viewportWidth - margin) return viewportWidth - elWidth - margin;
27
+ return left;
28
+ }
29
+
30
+ export { computePopoverPosition, computeSubmenuPosition };
31
+ //# sourceMappingURL=chunk-FFCQLWS5.mjs.map
32
+ //# sourceMappingURL=chunk-FFCQLWS5.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,42 @@
1
+ // src/texteditor.classes.ts
2
+ var textEditorClasses = {
3
+ root: "p-text-editor",
4
+ toolbar: "p-text-editor-toolbar",
5
+ body: "p-text-editor-body",
6
+ content: "p-text-editor-content",
7
+ // Block mode
8
+ block: "p-text-editor-block",
9
+ blockContent: "p-text-editor-block-content",
10
+ blockControls: "p-text-editor-block-controls",
11
+ blockDropIndicator: "p-text-editor-block-drop-indicator",
12
+ blockPlaceholder: "p-text-editor-block-placeholder",
13
+ // Navigator
14
+ navigator: "p-text-editor-navigator",
15
+ navigatorBar: "p-text-editor-navigator-bar",
16
+ navigatorPopover: "p-text-editor-navigator-popover",
17
+ // Overlays
18
+ contextToolbar: "p-text-editor-context-toolbar",
19
+ popoverMenu: "p-text-editor-popover-menu",
20
+ popoverSubmenu: "p-text-editor-popover-submenu",
21
+ placeholder: "p-text-editor-placeholder",
22
+ // Table
23
+ tableSelectionOutline: "p-text-editor-table-selection-outline",
24
+ tableTrigger: "p-text-editor-table-trigger",
25
+ tableTriggerCell: "p-text-editor-table-trigger-cell",
26
+ tableTriggerCol: "p-text-editor-table-trigger-col",
27
+ tableTriggerRow: "p-text-editor-table-trigger-row",
28
+ tableAdd: "p-text-editor-table-add",
29
+ tableAddCol: "p-text-editor-table-add-col",
30
+ tableAddRow: "p-text-editor-table-add-row",
31
+ // Inline decorations
32
+ mentionTyping: "p-text-editor-mention-typing",
33
+ mention: "p-text-editor-mention",
34
+ slashTyping: "p-text-editor-slash-typing",
35
+ selection: "p-text-editor-selection",
36
+ imageUploadPlaceholder: "p-text-editor-image-upload-placeholder",
37
+ documentUploadPlaceholder: "p-text-editor-document-upload-placeholder"
38
+ };
39
+
40
+ export { textEditorClasses };
41
+ //# sourceMappingURL=chunk-GG56GLXC.mjs.map
42
+ //# sourceMappingURL=chunk-GG56GLXC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/texteditor.classes.ts"],"names":[],"mappings":";AAAO,IAAM,iBAAA,GAAoB;AAAA,EAC7B,IAAA,EAAM,eAAA;AAAA,EACN,OAAA,EAAS,uBAAA;AAAA,EACT,IAAA,EAAM,oBAAA;AAAA,EACN,OAAA,EAAS,uBAAA;AAAA;AAAA,EAGT,KAAA,EAAO,qBAAA;AAAA,EACP,YAAA,EAAc,6BAAA;AAAA,EACd,aAAA,EAAe,8BAAA;AAAA,EACf,kBAAA,EAAoB,oCAAA;AAAA,EACpB,gBAAA,EAAkB,iCAAA;AAAA;AAAA,EAGlB,SAAA,EAAW,yBAAA;AAAA,EACX,YAAA,EAAc,6BAAA;AAAA,EACd,gBAAA,EAAkB,iCAAA;AAAA;AAAA,EAGlB,cAAA,EAAgB,+BAAA;AAAA,EAChB,WAAA,EAAa,4BAAA;AAAA,EACb,cAAA,EAAgB,+BAAA;AAAA,EAChB,WAAA,EAAa,2BAAA;AAAA;AAAA,EAGb,qBAAA,EAAuB,uCAAA;AAAA,EACvB,YAAA,EAAc,6BAAA;AAAA,EACd,gBAAA,EAAkB,kCAAA;AAAA,EAClB,eAAA,EAAiB,iCAAA;AAAA,EACjB,eAAA,EAAiB,iCAAA;AAAA,EACjB,QAAA,EAAU,yBAAA;AAAA,EACV,WAAA,EAAa,6BAAA;AAAA,EACb,WAAA,EAAa,6BAAA;AAAA;AAAA,EAGb,aAAA,EAAe,8BAAA;AAAA,EACf,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,4BAAA;AAAA,EACb,SAAA,EAAW,yBAAA;AAAA,EACX,sBAAA,EAAwB,wCAAA;AAAA,EACxB,yBAAA,EAA2B;AAC/B","file":"chunk-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"]}