@pega/cosmos-react-rte 9.0.0-build.9.8 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/lib/components/DynamicContentEditor/DynamicContentEditor.d.ts +4 -2
  2. package/lib/components/DynamicContentEditor/DynamicContentEditor.d.ts.map +1 -1
  3. package/lib/components/DynamicContentEditor/DynamicContentEditor.js +64 -59
  4. package/lib/components/DynamicContentEditor/DynamicContentEditor.js.map +1 -1
  5. package/lib/components/Editor/Editor.context.d.ts +6 -6
  6. package/lib/components/Editor/Editor.context.d.ts.map +1 -1
  7. package/lib/components/Editor/Editor.context.js +1 -1
  8. package/lib/components/Editor/Editor.context.js.map +1 -1
  9. package/lib/components/Editor/Editor.d.ts +1 -10
  10. package/lib/components/Editor/Editor.d.ts.map +1 -1
  11. package/lib/components/Editor/Editor.js +301 -490
  12. package/lib/components/Editor/Editor.js.map +1 -1
  13. package/lib/components/Editor/Editor.styles.d.ts +37 -7
  14. package/lib/components/Editor/Editor.styles.d.ts.map +1 -1
  15. package/lib/components/Editor/Editor.styles.js +60 -30
  16. package/lib/components/Editor/Editor.styles.js.map +1 -1
  17. package/lib/components/Editor/Editor.test-ids.d.ts +2 -1
  18. package/lib/components/Editor/Editor.test-ids.d.ts.map +1 -1
  19. package/lib/components/Editor/Editor.test-ids.js +2 -0
  20. package/lib/components/Editor/Editor.test-ids.js.map +1 -1
  21. package/lib/components/Editor/Editor.types.d.ts +34 -14
  22. package/lib/components/Editor/Editor.types.d.ts.map +1 -1
  23. package/lib/components/Editor/Editor.types.js.map +1 -1
  24. package/lib/components/Editor/IframeTiptapEditor.d.ts +30 -0
  25. package/lib/components/Editor/IframeTiptapEditor.d.ts.map +1 -0
  26. package/lib/components/Editor/IframeTiptapEditor.js +695 -0
  27. package/lib/components/Editor/IframeTiptapEditor.js.map +1 -0
  28. package/lib/components/Editor/ImageActionButtons.d.ts +20 -0
  29. package/lib/components/Editor/ImageActionButtons.d.ts.map +1 -0
  30. package/lib/components/Editor/ImageActionButtons.js +84 -0
  31. package/lib/components/Editor/ImageActionButtons.js.map +1 -0
  32. package/lib/components/Editor/ImageEditDialog.d.ts +17 -0
  33. package/lib/components/Editor/ImageEditDialog.d.ts.map +1 -0
  34. package/lib/components/Editor/ImageEditDialog.js +90 -0
  35. package/lib/components/Editor/ImageEditDialog.js.map +1 -0
  36. package/lib/components/Editor/TableCellMenu.d.ts +35 -0
  37. package/lib/components/Editor/TableCellMenu.d.ts.map +1 -0
  38. package/lib/components/Editor/TableCellMenu.js +120 -0
  39. package/lib/components/Editor/TableCellMenu.js.map +1 -0
  40. package/lib/components/Editor/Toolbar/AIRewriteButton.d.ts +17 -0
  41. package/lib/components/Editor/Toolbar/AIRewriteButton.d.ts.map +1 -0
  42. package/lib/components/Editor/Toolbar/AIRewriteButton.js +79 -0
  43. package/lib/components/Editor/Toolbar/AIRewriteButton.js.map +1 -0
  44. package/lib/components/Editor/Toolbar/AlignmentSelect.d.ts +8 -0
  45. package/lib/components/Editor/Toolbar/AlignmentSelect.d.ts.map +1 -0
  46. package/lib/components/Editor/Toolbar/AlignmentSelect.js +137 -0
  47. package/lib/components/Editor/Toolbar/AlignmentSelect.js.map +1 -0
  48. package/lib/components/Editor/Toolbar/AnchorButton.d.ts +3 -4
  49. package/lib/components/Editor/Toolbar/AnchorButton.d.ts.map +1 -1
  50. package/lib/components/Editor/Toolbar/AnchorButton.js +156 -82
  51. package/lib/components/Editor/Toolbar/AnchorButton.js.map +1 -1
  52. package/lib/components/Editor/Toolbar/ColorPickerButton.d.ts +9 -0
  53. package/lib/components/Editor/Toolbar/ColorPickerButton.d.ts.map +1 -0
  54. package/lib/components/Editor/Toolbar/ColorPickerButton.js +190 -0
  55. package/lib/components/Editor/Toolbar/ColorPickerButton.js.map +1 -0
  56. package/lib/components/Editor/Toolbar/FontFamilySelect.d.ts +8 -0
  57. package/lib/components/Editor/Toolbar/FontFamilySelect.d.ts.map +1 -0
  58. package/lib/components/Editor/Toolbar/FontFamilySelect.js +150 -0
  59. package/lib/components/Editor/Toolbar/FontFamilySelect.js.map +1 -0
  60. package/lib/components/Editor/Toolbar/FontSizeSelect.d.ts +8 -0
  61. package/lib/components/Editor/Toolbar/FontSizeSelect.d.ts.map +1 -0
  62. package/lib/components/Editor/Toolbar/FontSizeSelect.js +145 -0
  63. package/lib/components/Editor/Toolbar/FontSizeSelect.js.map +1 -0
  64. package/lib/components/Editor/Toolbar/ImageButton.d.ts +5 -5
  65. package/lib/components/Editor/Toolbar/ImageButton.d.ts.map +1 -1
  66. package/lib/components/Editor/Toolbar/ImageButton.js +131 -18
  67. package/lib/components/Editor/Toolbar/ImageButton.js.map +1 -1
  68. package/lib/components/Editor/Toolbar/SourceCodeButton.d.ts +8 -0
  69. package/lib/components/Editor/Toolbar/SourceCodeButton.d.ts.map +1 -0
  70. package/lib/components/Editor/Toolbar/SourceCodeButton.js +49 -0
  71. package/lib/components/Editor/Toolbar/SourceCodeButton.js.map +1 -0
  72. package/lib/components/Editor/Toolbar/TableButton.d.ts +8 -0
  73. package/lib/components/Editor/Toolbar/TableButton.d.ts.map +1 -0
  74. package/lib/components/Editor/Toolbar/TableButton.js +291 -0
  75. package/lib/components/Editor/Toolbar/TableButton.js.map +1 -0
  76. package/lib/components/Editor/Toolbar/TextSelect.d.ts +4 -5
  77. package/lib/components/Editor/Toolbar/TextSelect.d.ts.map +1 -1
  78. package/lib/components/Editor/Toolbar/TextSelect.js +61 -30
  79. package/lib/components/Editor/Toolbar/TextSelect.js.map +1 -1
  80. package/lib/components/Editor/Toolbar/Toolbar.d.ts +17 -6
  81. package/lib/components/Editor/Toolbar/Toolbar.d.ts.map +1 -1
  82. package/lib/components/Editor/Toolbar/Toolbar.js +169 -47
  83. package/lib/components/Editor/Toolbar/Toolbar.js.map +1 -1
  84. package/lib/components/Editor/Toolbar/Toolbar.test-ids.d.ts +2 -2
  85. package/lib/components/Editor/Toolbar/Toolbar.test-ids.d.ts.map +1 -1
  86. package/lib/components/Editor/Toolbar/Toolbar.test-ids.js +17 -1
  87. package/lib/components/Editor/Toolbar/Toolbar.test-ids.js.map +1 -1
  88. package/lib/components/Editor/Toolbar/WordCount.d.ts +8 -0
  89. package/lib/components/Editor/Toolbar/WordCount.d.ts.map +1 -0
  90. package/lib/components/Editor/Toolbar/WordCount.js +31 -0
  91. package/lib/components/Editor/Toolbar/WordCount.js.map +1 -0
  92. package/lib/components/Editor/extensions/FontSize.d.ts +21 -0
  93. package/lib/components/Editor/extensions/FontSize.d.ts.map +1 -0
  94. package/lib/components/Editor/extensions/FontSize.js +42 -0
  95. package/lib/components/Editor/extensions/FontSize.js.map +1 -0
  96. package/lib/components/Editor/extensions/PreserveDiv.d.ts +13 -0
  97. package/lib/components/Editor/extensions/PreserveDiv.d.ts.map +1 -0
  98. package/lib/components/Editor/extensions/PreserveDiv.js +73 -0
  99. package/lib/components/Editor/extensions/PreserveDiv.js.map +1 -0
  100. package/lib/components/Editor/extensions/TableCellSelection.d.ts +4 -0
  101. package/lib/components/Editor/extensions/TableCellSelection.d.ts.map +1 -0
  102. package/lib/components/Editor/extensions/TableCellSelection.js +53 -0
  103. package/lib/components/Editor/extensions/TableCellSelection.js.map +1 -0
  104. package/lib/components/Editor/extensions/TextIndent.d.ts +22 -0
  105. package/lib/components/Editor/extensions/TextIndent.d.ts.map +1 -0
  106. package/lib/components/Editor/extensions/TextIndent.js +137 -0
  107. package/lib/components/Editor/extensions/TextIndent.js.map +1 -0
  108. package/lib/components/Editor/hooks/useCloseOnEditorClick.d.ts +5 -0
  109. package/lib/components/Editor/hooks/useCloseOnEditorClick.d.ts.map +1 -0
  110. package/lib/components/Editor/hooks/useCloseOnEditorClick.js +18 -0
  111. package/lib/components/Editor/hooks/useCloseOnEditorClick.js.map +1 -0
  112. package/lib/components/Editor/hooks/useEscapeKey.d.ts +4 -0
  113. package/lib/components/Editor/hooks/useEscapeKey.d.ts.map +1 -0
  114. package/lib/components/Editor/hooks/useEscapeKey.js +24 -0
  115. package/lib/components/Editor/hooks/useEscapeKey.js.map +1 -0
  116. package/lib/components/Editor/hooks/useIframeSetup.d.ts +54 -0
  117. package/lib/components/Editor/hooks/useIframeSetup.d.ts.map +1 -0
  118. package/lib/components/Editor/hooks/useIframeSetup.js +284 -0
  119. package/lib/components/Editor/hooks/useIframeSetup.js.map +1 -0
  120. package/lib/components/Editor/hooks/useImageActions.d.ts +19 -0
  121. package/lib/components/Editor/hooks/useImageActions.d.ts.map +1 -0
  122. package/lib/components/Editor/hooks/useImageActions.js +198 -0
  123. package/lib/components/Editor/hooks/useImageActions.js.map +1 -0
  124. package/lib/components/Editor/hooks/useTableCellMenu.d.ts +22 -0
  125. package/lib/components/Editor/hooks/useTableCellMenu.d.ts.map +1 -0
  126. package/lib/components/Editor/hooks/useTableCellMenu.js +120 -0
  127. package/lib/components/Editor/hooks/useTableCellMenu.js.map +1 -0
  128. package/lib/components/Editor/iframeContentStyles.d.ts +10 -0
  129. package/lib/components/Editor/iframeContentStyles.d.ts.map +1 -0
  130. package/lib/components/Editor/iframeContentStyles.js +162 -0
  131. package/lib/components/Editor/iframeContentStyles.js.map +1 -0
  132. package/lib/components/Editor/index.d.ts +2 -0
  133. package/lib/components/Editor/index.d.ts.map +1 -1
  134. package/lib/components/Editor/index.js +1 -0
  135. package/lib/components/Editor/index.js.map +1 -1
  136. package/lib/components/Editor/sanitize.d.ts +3 -0
  137. package/lib/components/Editor/sanitize.d.ts.map +1 -0
  138. package/lib/components/Editor/sanitize.js +11 -0
  139. package/lib/components/Editor/sanitize.js.map +1 -0
  140. package/lib/components/Editor/utils/htmlPlaceholder.d.ts +69 -0
  141. package/lib/components/Editor/utils/htmlPlaceholder.d.ts.map +1 -0
  142. package/lib/components/Editor/utils/htmlPlaceholder.js +154 -0
  143. package/lib/components/Editor/utils/htmlPlaceholder.js.map +1 -0
  144. package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts +6 -4
  145. package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts.map +1 -1
  146. package/lib/components/RichTextEditor/DecoratorComponents/Table.js +10 -8
  147. package/lib/components/RichTextEditor/DecoratorComponents/Table.js.map +1 -1
  148. package/lib/components/RichTextEditor/RichTextEditor.d.ts.map +1 -1
  149. package/lib/components/RichTextEditor/RichTextEditor.js +15 -2
  150. package/lib/components/RichTextEditor/RichTextEditor.js.map +1 -1
  151. package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts +5 -5
  152. package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts.map +1 -1
  153. package/lib/components/RichTextEditor/RichTextEditor.styles.js +3 -5
  154. package/lib/components/RichTextEditor/RichTextEditor.styles.js.map +1 -1
  155. package/lib/components/RichTextEditor/RichTextEditor.types.d.ts +5 -0
  156. package/lib/components/RichTextEditor/RichTextEditor.types.d.ts.map +1 -1
  157. package/lib/components/RichTextEditor/RichTextEditor.types.js.map +1 -1
  158. package/lib/components/RichTextEditor/RichTextViewer.d.ts.map +1 -1
  159. package/lib/components/RichTextEditor/RichTextViewer.js +9 -2
  160. package/lib/components/RichTextEditor/RichTextViewer.js.map +1 -1
  161. package/lib/components/RichTextEditor/Toolbar/Toolbar.js +1 -1
  162. package/lib/components/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  163. package/lib/components/RichTextEditor/Toolbar/Toolbar.types.d.ts +4 -4
  164. package/lib/components/RichTextEditor/Toolbar/Toolbar.types.d.ts.map +1 -1
  165. package/lib/components/RichTextEditor/Toolbar/Toolbar.types.js.map +1 -1
  166. package/lib/components/RichTextEditor/Toolbar/ToolbarButton.d.ts.map +1 -1
  167. package/lib/components/RichTextEditor/Toolbar/ToolbarButton.js +41 -26
  168. package/lib/components/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  169. package/lib/components/RichTextEditor/utils/htmlConverter.d.ts +2 -0
  170. package/lib/components/RichTextEditor/utils/htmlConverter.d.ts.map +1 -1
  171. package/lib/components/RichTextEditor/utils/htmlConverter.js +12 -0
  172. package/lib/components/RichTextEditor/utils/htmlConverter.js.map +1 -1
  173. package/lib/components/RichTextEditor/utils/interactionRenderer.d.ts.map +1 -1
  174. package/lib/components/RichTextEditor/utils/interactionRenderer.js +20 -19
  175. package/lib/components/RichTextEditor/utils/interactionRenderer.js.map +1 -1
  176. package/lib/components/RichTextEditor/utils/markdownConverter.d.ts.map +1 -1
  177. package/lib/components/RichTextEditor/utils/markdownConverter.js +131 -30
  178. package/lib/components/RichTextEditor/utils/markdownConverter.js.map +1 -1
  179. package/lib/components/RichTextEditor/utils/renderers.d.ts +5 -3
  180. package/lib/components/RichTextEditor/utils/renderers.d.ts.map +1 -1
  181. package/lib/components/RichTextEditor/utils/renderers.js +62 -34
  182. package/lib/components/RichTextEditor/utils/renderers.js.map +1 -1
  183. package/lib/components/RichTextEditor/utils/slateConverter.d.ts +4 -3
  184. package/lib/components/RichTextEditor/utils/slateConverter.d.ts.map +1 -1
  185. package/lib/components/RichTextEditor/utils/slateConverter.js +86 -38
  186. package/lib/components/RichTextEditor/utils/slateConverter.js.map +1 -1
  187. package/package.json +30 -8
  188. package/lib/components/Editor/ImageEditor.d.ts +0 -10
  189. package/lib/components/Editor/ImageEditor.d.ts.map +0 -1
  190. package/lib/components/Editor/ImageEditor.js +0 -292
  191. package/lib/components/Editor/ImageEditor.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IframeTiptapEditor.js","sourceRoot":"","sources":["../../../src/components/Editor/IframeTiptapEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,IAAI,MAAM,wBAAwB,CAAC;AAC1C,OAAO,KAAK,MAAM,yBAAyB,CAAC;AAC5C,OAAO,UAAU,MAAM,8BAA8B,CAAC;AACtD,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,UAAU,MAAM,+BAA+B,CAAC;AACvD,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,QAAQ,MAAM,6BAA6B,CAAC;AACnD,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,WAAW,MAAM,2CAA2C,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAGxE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,kBAAkB,MAAM,iCAAiC,CAAC;AACjE,OAAO,YAAY,MAAM,YAAY,CAAC;AAEtC,oFAAoF;AACpF,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC;IAC5C,aAAa;QACX,OAAO;YACL,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,KAAK,EAAE;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;gBACnD,UAAU,EAAE,UAAU,CAAC,EAAE;oBACvB,IAAI,CAAC,UAAU,CAAC,KAAK;wBAAE,OAAO,EAAE,CAAC;oBACjC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrC,CAAC;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,0EAA0E;AAC1E,MAAM,yBAAyB,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7C,aAAa;QACX,OAAO;YACL,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,oBAAoB,EAAE;gBACpB,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,oBAAoB,CAAC;gBAChE,UAAU,EAAE,UAAU,CAAC,EAAE;oBACvB,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;wBAAE,OAAO,EAAE,CAAC;oBACjD,OAAO,EAAE,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACpE,CAAC;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,0FAA0F;AAC1F,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC;IAC1C,aAAa;QACX,OAAO;YACL,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,KAAK,EAAE;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;gBACnD,UAAU,EAAE,UAAU,CAAC,EAAE;oBACvB,IAAI,CAAC,UAAU,CAAC,KAAK;wBAAE,OAAO,EAAE,CAAC;oBACjC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrC,CAAC;aACF;YACD,KAAK,EAAE;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;gBACnD,UAAU,EAAE,UAAU,CAAC,EAAE;oBACvB,IAAI,CAAC,UAAU,CAAC,KAAK;wBAAE,OAAO,EAAE,CAAC;oBACjC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrC,CAAC;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,4DAA4D;AAC5D,MAAM,aAAa,GAAG,CAAC,MAAoB,EAAW,EAAE;IACtD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE5B,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjF,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;IAE7B,gEAAgE;IAChE,gGAAgG;IAChG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;IAEhD,IAAI,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAEpC,wDAAwD;IACxD,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3B,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvE,MAAM;QACR,CAAC;QACD,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,WAAW,KAAK,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;IAE5D,OAAO,gBAAgB,IAAI,WAAW,CAAC;AACzC,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,eAAe,GAAG,CAAC,MAAoB,EAAW,EAAE;IACxD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE5B,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjF,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;IAE7B,wDAAwD;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,KAAK,WAAW,CAAC;IAEpD,IAAI,CAAC,kBAAkB;QAAE,OAAO,KAAK,CAAC;IAEtC,yDAAyD;IACzD,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3B,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvE,MAAM;QACR,CAAC;QACD,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAElC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,WAAW,KAAK,CAAC,CAAC;IAEvC,OAAO,kBAAkB,IAAI,YAAY,CAAC;AAC5C,CAAC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,uBAAuB,GAAG,SAAS,CAAC,MAAM,CAG7C;IACD,IAAI,EAAE,yBAAyB;IAE/B,UAAU;QACR,OAAO;YACL,gBAAgB,EAAE,SAAS;YAC3B,uBAAuB,EAAE,SAAS;SACnC,CAAC;IACJ,CAAC;IAED,oBAAoB;QAClB,OAAO;YACL,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE;YACxD,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE;YAC5D,qDAAqD;YACrD,GAAG,EAAE,GAAG,EAAE;gBACR,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,0EAA0E;oBAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC,CAAC,+BAA+B;gBAC9C,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,WAAW,EAAE,GAAG,EAAE;gBAChB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;oBACxC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,UAAU,EAAE,GAAG,EAAE;gBACf,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBAChE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBAChC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;oBACzE,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;oBACvC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,oBAAoB;IAE1B,UAAU;QACR,OAAO;YACL,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;IAED,oBAAoB;QAClB,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACxB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACzB,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;YAE5B,iCAAiC;YACjC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAEjF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,6BAA6B;YAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;YAC7B,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3B,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAClC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACvE,MAAM;gBACR,CAAC;gBACD,SAAS,IAAI,CAAC,CAAC;YACjB,CAAC;YAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAEhD,wEAAwE;YACxE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,yDAAyD;YACzD,IAAI,UAAU,GAAG,SAAS,CAAC;YAC3B,OAAO,UAAU,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC/B,MAAM;gBACR,CAAC;gBACD,UAAU,IAAI,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAElD,qDAAqD;YACrD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,4CAA4C;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,wDAAwD;YACxD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;gBAC7C,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;YAC/B,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC;YAElC,mDAAmD;YACnD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC7B,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,YAAY;SACrB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAIH,MAAM,cAAc,GAAG,KAAK,EAAE,GAAW,EAAE,IAAY,EAAwB,EAAE;IAC/E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AA2BF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,MAAM,EACN,MAAM,EACN,SAAS,EACT,UAAU,GAAG,IAAI,EACjB,cAAc,GAAG,EAAE,EACnB,WAAW,EACX,YAAY,EACZ,aAAa,GAAG,KAAK,EACrB,YAAY,GAAG,IAAI,EACnB,kBAAkB,GAAG,KAAK,EAC1B,eAAe,EACf,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,KAAK,EACd,gBAAgB,EAChB,uBAAuB,EACC,EAAE,EAAE;IAC5B,mFAAmF;IACnF,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACrD,mBAAmB,CAAC,OAAO,GAAG,gBAAgB,CAAC;IAE/C,MAAM,0BAA0B,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACnE,0BAA0B,CAAC,OAAO,GAAG,uBAAuB,CAAC;IAE7D,wDAAwD;IACxD,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC7D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAChE,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,IAAI,EAAE,CAAC;gBACT,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,mDAAmD;IACnD,MAAM,yBAAyB,GAAG,OAAO,CAAC,GAAG,EAAE;QAC7C,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,SAA0B,EAAE,EAAE;YACvD,OAAO,IAAI,CAAC,MAAM,CAAC;gBACjB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,OAAO,EAAE,4BAA4B;gBAE9C,aAAa;oBACX,MAAM,KAAK,GAAsC,EAAE,CAAC;oBACpD,IAAI,SAAS,CAAC,mBAAmB,EAAE,CAAC;wBAClC,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;4BACrD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;wBAClC,CAAC,CAAC,CAAC;oBACL,CAAC;oBACD,sCAAsC;oBACtC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACrC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACvC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACtC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC3C,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACxC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACtC,oCAAoC;oBACpC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC1C,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC5C,KAAK,CAAC,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACjD,KAAK,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC/B,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,SAAS;oBACP,OAAO;wBACL;4BACE,GAAG,EAAE,SAAS,CAAC,IAAI;4BACnB,QAAQ,EAAE,CAAC,IAA0B,EAAE,EAAE;gCACvC,IAAI,OAAO,IAAI,KAAK,QAAQ;oCAAE,OAAO,IAAI,CAAC;gCAC1C,MAAM,KAAK,GAAkC,EAAE,CAAC;gCAChD,mCAAmC;gCACnC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oCACzC,IACE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;wCAC7B,IAAI,CAAC,IAAI,KAAK,MAAM;wCACpB,SAAS,CAAC,mBAAmB,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAClD,CAAC;wCACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;oCAChC,CAAC;gCACH,CAAC,CAAC,CAAC;gCACH,OAAO,KAAK,CAAC;4BACf,CAAC;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,UAAU,CAAC,EACT,cAAc,EACd,IAAI,EAIL;oBACC,iCAAiC;oBACjC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;oBAC3C,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;gBACvD,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,SAAS,CAAC;QACvB,UAAU,EAAE;YACV,UAAU,CAAC,SAAS,CAAC;gBACnB,qEAAqE;gBACrE,IAAI,EAAE,KAAK;gBACX,gFAAgF;gBAChF,UAAU,EAAE,KAAK;gBACjB,qFAAqF;gBACrF,SAAS,EAAE,KAAK;gBAChB,oDAAoD;gBACpD,GAAG,CAAC,WAAW,EAAE,YAAY,KAAK,KAAK,IAAI;oBACzC,UAAU,EAAE,KAAK;iBAClB,CAAC;aACH,CAAC;YACF,mBAAmB;YACnB,kBAAkB;YAClB,WAAW,CAAC,SAAS,CAAC;gBACpB,WAAW,EAAE,WAAW,IAAI,EAAE;aAC/B,CAAC;YACF,UAAU,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;aAChC,CAAC;YACF,wEAAwE;YACxE,mFAAmF;YACnF,IAAI,CAAC,SAAS,CAAC;gBACb,WAAW,EAAE,KAAK;gBAClB,QAAQ,EAAE,YAAY;gBACtB,WAAW,EAAE,YAAY;gBACzB,cAAc,EAAE;oBACd,MAAM,EAAE,QAAQ;oBAChB,GAAG,EAAE,qBAAqB;iBAC3B;aACF,CAAC;YACF,wEAAwE;YACxE,+FAA+F;YAC/F,yBAAyB,CAAC,SAAS,CAAC;gBAClC,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;aAClB,CAAC;YACF,6BAA6B;YAC7B,SAAS;YACT,SAAS;YACT,WAAW;YACX,SAAS;YACT,KAAK;YACL,SAAS,CAAC,SAAS,CAAC;gBAClB,UAAU,EAAE,IAAI;aACjB,CAAC;YACF,UAAU;YACV,QAAQ;YACR,YAAY;YACZ,SAAS,CAAC,SAAS,CAAC;gBAClB,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;aAChC,CAAC;YACF,mBAAmB;YACnB,KAAK,CAAC,SAAS,CAAC;gBACd,SAAS,EAAE,IAAI;aAChB,CAAC;YACF,QAAQ;YACR,WAAW;YACX,SAAS;YACT,kBAAkB;YAClB,kBAAkB;YAClB,uBAAuB,CAAC,SAAS,CAAC;gBAChC,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE;gBACvD,uBAAuB,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,OAAO,EAAE,EAAE;aACtE,CAAC;YACF,WAAW;YACX,WAAW;YACX,GAAG,yBAAyB;SAC7B;QACD,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAChC,WAAW,EAAE;YACX,UAAU,EAAE;gBACV,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;aAC1C;YACD,eAAe,EAAE;gBACf,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACxB,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;oBACnB,OAAO,KAAK,CAAC,CAAC,kCAAkC;gBAClD,CAAC;gBACD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtB,oDAAoD;oBACpD,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;wBACjD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC/B,CAAC;wBACF,IAAI,YAAY,EAAE,CAAC;4BACjB,KAAK,CAAC,cAAc,EAAE,CAAC;4BACvB,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;oBACD,0CAA0C;oBAC1C,IACE,KAAK,CAAC,aAAa,EAAE,KAAK;wBAC1B,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;wBACpC,eAAe,EACf,CAAC;wBACD,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAClE,CAAC;oBACD,OAAO,KAAK,CAAC,CAAC,0BAA0B;gBAC1C,CAAC;gBACD,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACrB,qDAAqD;oBACrD,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;wBAChD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC/B,CAAC;wBACF,IAAI,YAAY,EAAE,CAAC;4BACjB,KAAK,CAAC,cAAc,EAAE,CAAC;4BACvB,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC;aACF;YACD,6CAA6C;YAC7C,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC3B,mDAAmD;gBACnD,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;oBAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;oBACxD,IAAI,IAAI,EAAE,CAAC;wBACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBAChD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,IAAI,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;gBACxD,MAAM,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE7E,gEAAgE;gBAChE,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE5C,+DAA+D;gBAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,mDAAmD;oBACnD,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;wBACrB,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,2CAA2C;wBAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC;wBACvE,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;wBACrD,IAAI,aAAa,EAAE,CAAC;4BAClB,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC;wBAClE,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,2EAA2E;oBAC3E,MAAM,UAAU,GAAG,2BAA2B,CAAC;oBAC/C,IAAI,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;wBACzC,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC9C,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,+EAA+E;gBAC/E,IAAI,CAAC,CAAC,aAAa,IAAI,kBAAkB,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBACtE,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;oBACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAC9C,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;oBAChC,IAAI,CAAC,QAAQ,CACX,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CACtC,IAAI,EACJ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAClD,CACF,CACF,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,mEAAmE;gBACnE,IAAI,WAAW,EAAE,eAAe,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAC5D,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;oBACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAC9C,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;oBAChC,IAAI,CAAC,QAAQ,CACX,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CACtC,IAAI,EACJ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAClD,CACF,CACF,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,mEAAmE;gBACnE,kFAAkF;gBAClF,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;gBACzC,IACE,aAAa;oBACb,kBAAkB,KAAK,KAAK;oBAC5B,CAAC,qBAAqB;oBACtB,KAAK;oBACL,KAAK,CAAC,MAAM,GAAG,CAAC,EAChB,CAAC;oBACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAEpF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1B,KAAK,CAAC,cAAc,EAAE,CAAC;wBAEvB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;4BACxB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;4BAE1B,mDAAmD;4BACnD,MAAM,YAAY,GAAG,4BAA4B,KAAK,kCAAkC,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,IAAI,6CAA6C,CAAC;4BAEvK,+BAA+B;4BAC/B,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;4BACrD,IAAI,aAAa,EAAE,CAAC;gCAClB,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC;4BAClE,CAAC;4BAED,gFAAgF;4BAChF,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACzC,CAAC,CAAC,CAAC;wBAEH,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,yEAAyE;gBACzE,IAAI,aAAa,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBACnC,KAAK,CAAC,cAAc,EAAE,CAAC;oBAEvB,MAAM,UAAU,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC;oBAC3E,MAAM,OAAO,GAAmB,EAAE,CAAC;oBAEnC,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBACjD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;wBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;wBACtB,MAAM,IAAI,GAAG,eAAe,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,QAAQ,IAAI,cAAc,CAAC;wBAElF,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;wBAEvC,mDAAmD;wBACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;wBACrD,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;wBACxC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;wBACzC,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;wBACvC,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;wBAC5C,QAAQ,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;wBAElD,MAAM,cAAc,GAAG,QAAQ,QAAQ,CAAC,SAAS,OAAO,CAAC;wBACzD,MAAM,YAAY,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC;wBAEvF,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;oBAClC,CAAC,CAAC,CAAC;oBAEH,2BAA2B;oBAC3B,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC;oBAC1C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;oBAE5C,4CAA4C;oBAC5C,UAAU,CAAC,GAAG,EAAE;wBACd,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;wBACrD,IAAI,aAAa,EAAE,CAAC;4BAClB,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC;wBAClE,CAAC;oBACH,CAAC,EAAE,CAAC,CAAC,CAAC;oBAEN,gCAAgC;oBAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBACvC,iDAAiD;oBACnD,CAAC,CAAC,CAAC;oBAEH,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,OAAO,KAAK,CAAC;YACf,CAAC;YACD,sDAAsD;YACtD,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;gBACzC,iEAAiE;gBACjE,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC;gBACxC,IAAI,CAAC,aAAa,IAAI,kBAAkB,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACnF,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEpF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,KAAK,CAAC,cAAc,EAAE,CAAC;gBAEvB,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;gBAClD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,iDAAiD;gBACjD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClF,IAAI,WAAW,EAAE,CAAC;oBAChB,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACxD,CAAC;gBAED,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACxB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;oBAE1B,mDAAmD;oBACnD,MAAM,YAAY,GAAG,4BAA4B,KAAK,kCAAkC,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,IAAI,6CAA6C,CAAC;oBAEvK,+BAA+B;oBAC/B,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC;oBAE7D,gFAAgF;oBAChF,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;gBAEH,OAAO,IAAI,CAAC;YACd,CAAC;SACF;QACD,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE;YACtC,oEAAoE;YACpE,wEAAwE;YACxE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;YACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACjD,IAAI,SAAS,CAAC,KAAK,IAAI,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACzE,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;gBAClF,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBACzC,gFAAgF;oBAChF,OAAO;gBACT,CAAC;YACH,CAAC;YACD,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QACD,MAAM,EAAE,GAAG,EAAE;YACX,MAAM,EAAE,EAAE,CAAC;QACb,CAAC;KACF,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YACrB,wCAAwC;YACxC,IAAI,WAAW,EAAE,oBAAoB,EAAE,CAAC;gBACtC,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,CAAC,MAAM,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAElC,mBAAmB,CACjB,SAAS,EACT,GAAG,EAAE,CAAC,CAAC;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE;QAC1C,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC3C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QACtC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;QACjD,UAAU,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE;QACvE,wBAAwB,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE;QACpE,UAAU,EAAE,CAAC,IAAY,EAAE,YAAqB,KAAK,EAAE,EAAE;YACvD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;QACvB,WAAW,EAAE,CAAC,QAAiB,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;KAClE,CAAC,EACF,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;AAC3C,CAAC,CAAC","sourcesContent":["import { useEditor, EditorContent } from '@tiptap/react';\nimport { Extension, Node } from '@tiptap/core';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Link from '@tiptap/extension-link';\nimport Image from '@tiptap/extension-image';\nimport Blockquote from '@tiptap/extension-blockquote';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Underline from '@tiptap/extension-underline';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport { Color } from '@tiptap/extension-color';\nimport Highlight from '@tiptap/extension-highlight';\nimport FontFamily from '@tiptap/extension-font-family';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Table } from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport OfficePaste from '@intevation/tiptap-extension-office-paste';\nimport { useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport type { MutableRefObject } from 'react';\n\nimport { createUID } from '@pega/cosmos-react-core';\n\nimport type { EditorProps, CustomComponent } from './Editor.types';\nimport type { IframeEditorHandle } from './hooks/useIframeSetup';\nimport { TextIndent } from './extensions/TextIndent';\nimport { PreserveDiv } from './extensions/PreserveDiv';\nimport { FontSize } from './extensions/FontSize';\nimport TableCellSelection from './extensions/TableCellSelection';\nimport sanitizeHtml from './sanitize';\n\n// Extend Blockquote to preserve inline styles (e.g., border-left from email chains)\nconst BlockquoteWithStyle = Blockquote.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n style: {\n default: null,\n parseHTML: element => element.getAttribute('style'),\n renderHTML: attributes => {\n if (!attributes.style) return {};\n return { style: attributes.style };\n }\n }\n };\n }\n});\n\n// Extend Image to preserve custom attribute data-attachment-id in img tag\nconst ImageWithDataAttachmentId = Image.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n 'data-attachment-id': {\n default: null,\n parseHTML: element => element.getAttribute('data-attachment-id'),\n renderHTML: attributes => {\n if (!attributes['data-attachment-id']) return {};\n return { 'data-attachment-id': attributes['data-attachment-id'] };\n }\n }\n };\n }\n});\n\n// Extend Paragraph to preserve class and style attributes (e.g., pega-email-reply-header)\nconst ParagraphWithStyle = Paragraph.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n class: {\n default: null,\n parseHTML: element => element.getAttribute('class'),\n renderHTML: attributes => {\n if (!attributes.class) return {};\n return { class: attributes.class };\n }\n },\n style: {\n default: null,\n parseHTML: element => element.getAttribute('style'),\n renderHTML: attributes => {\n if (!attributes.style) return {};\n return { style: attributes.style };\n }\n }\n };\n }\n});\n\n// Helper to check if cursor is at end of table cell content\nconst isAtEndOfCell = (editor: TiptapEditor): boolean => {\n const { state } = editor;\n const { selection } = state;\n\n if (!selection.empty) return false;\n\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n if (!isInTable) return false;\n\n const $pos = selection.$from;\n\n // Check if there's any content after the cursor within the cell\n // by checking if we're at the end of the parent (paragraph) and it's the last child of the cell\n const parentEnd = $pos.end($pos.depth);\n const atEndOfParagraph = $pos.pos === parentEnd;\n\n if (!atEndOfParagraph) return false;\n\n // Check if this paragraph is the last block in the cell\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) return false;\n\n const cellNode = $pos.node(cellDepth);\n const indexInCell = $pos.index(cellDepth);\n const isLastBlock = indexInCell === cellNode.childCount - 1;\n\n return atEndOfParagraph && isLastBlock;\n};\n\n// Helper to check if cursor is at start of table cell content\nconst isAtStartOfCell = (editor: TiptapEditor): boolean => {\n const { state } = editor;\n const { selection } = state;\n\n if (!selection.empty) return false;\n\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n if (!isInTable) return false;\n\n const $pos = selection.$from;\n\n // Check if we're at the start of the parent (paragraph)\n const parentStart = $pos.start($pos.depth);\n const atStartOfParagraph = $pos.pos === parentStart;\n\n if (!atStartOfParagraph) return false;\n\n // Check if this paragraph is the first block in the cell\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) return false;\n\n const indexInCell = $pos.index(cellDepth);\n const isFirstBlock = indexInCell === 0;\n\n return atStartOfParagraph && isFirstBlock;\n};\n\n// Custom keyboard shortcuts that match the toolbar tooltips\nconst CustomKeyboardShortcuts = Extension.create<{\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n}>({\n name: 'customKeyboardShortcuts',\n\n addOptions() {\n return {\n onFocusTableMenu: undefined,\n onFocusPreviousCellMenu: undefined\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-x': () => this.editor.commands.toggleStrike(),\n 'Mod-Shift-l': () => this.editor.commands.toggleBulletList(),\n // Override Tab in tables to prevent auto-adding rows\n Tab: () => {\n if (this.editor.isActive('table')) {\n // Just navigate, don't add rows - goToNextCell returns false at last cell\n this.editor.commands.goToNextCell();\n return true; // Consume the event either way\n }\n return false;\n },\n 'Shift-Tab': () => {\n if (this.editor.isActive('table')) {\n this.editor.commands.goToPreviousCell();\n return true;\n }\n return false;\n },\n ArrowRight: () => {\n if (isAtEndOfCell(this.editor) && this.options.onFocusTableMenu) {\n this.options.onFocusTableMenu();\n return true;\n }\n return false;\n },\n ArrowLeft: () => {\n if (isAtStartOfCell(this.editor) && this.options.onFocusPreviousCellMenu) {\n this.options.onFocusPreviousCellMenu();\n return true;\n }\n return false;\n }\n };\n }\n});\n\n// Extension to delete empty table on repeated delete/backspace in empty cell\nconst TableDeleteOnEmpty = Extension.create({\n name: 'tableDeleteOnEmpty',\n\n addStorage() {\n return {\n deleteCount: 0,\n lastDeleteTime: 0\n };\n },\n\n addKeyboardShortcuts() {\n const handleDelete = () => {\n const { editor } = this;\n const { state } = editor;\n const { selection } = state;\n\n // Check if we're in a table cell\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n\n if (!isInTable) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Find the current cell node\n const $pos = selection.$from;\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n const cellNode = $pos.node(cellDepth);\n const cellContent = cellNode.textContent.trim();\n\n // If cell has content, reset counter and let default behavior handle it\n if (cellContent.length > 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Find the table node and check if entire table is empty\n let tableDepth = cellDepth;\n while (tableDepth > 0) {\n const node = $pos.node(tableDepth);\n if (node.type.name === 'table') {\n break;\n }\n tableDepth -= 1;\n }\n\n if (tableDepth === 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n const tableNode = $pos.node(tableDepth);\n const tableContent = tableNode.textContent.trim();\n\n // Only allow table deletion if entire table is empty\n if (tableContent.length > 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Table is empty - increment delete counter\n const now = Date.now();\n // Reset counter if more than 1 second since last delete\n if (now - this.storage.lastDeleteTime > 1000) {\n this.storage.deleteCount = 0;\n }\n\n this.storage.deleteCount += 1;\n this.storage.lastDeleteTime = now;\n\n // After 3 deletes in empty table, delete the table\n if (this.storage.deleteCount >= 3) {\n this.storage.deleteCount = 0;\n editor.chain().focus().deleteTable().run();\n return true;\n }\n\n return false;\n };\n\n return {\n Backspace: handleDelete,\n Delete: handleDelete\n };\n }\n});\n\ntype ImageInfoArray = { id: string; url: string; name: string }[];\n\nconst getFileFromUrl = async (url: string, name: string): Promise<File | null> => {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n return null;\n }\n const data = await response.blob();\n return new File([data], name, {\n type: data.type\n });\n } catch {\n return null;\n }\n};\n\nexport interface IframeTiptapEditorProps {\n placeholder?: string;\n defaultValue?: string;\n disabled?: boolean;\n readOnly?: boolean;\n onChange?: (editor: TiptapEditor) => void;\n onKeyDown?: (event?: KeyboardEvent) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onInit?: (editor: TiptapEditor) => void;\n onImageAdded?: (image: File, id: string, altText?: string) => void;\n imagesEnabled?: boolean;\n linksEnabled?: boolean;\n imageInsertionMode?: 'file' | 'url' | 'all';\n pastedImagesRef?: MutableRefObject<File[]>;\n editorId?: string;\n editorRef: MutableRefObject<IframeEditorHandle | null>;\n spellcheck?: boolean;\n customElements?: CustomComponent[];\n initOptions?: EditorProps['initOptions'];\n secure?: boolean;\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n}\n\n// Component that renders inside the iframe\nexport const IframeTiptapEditor = ({\n placeholder,\n defaultValue,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onInit,\n editorRef,\n spellcheck = true,\n customElements = [],\n initOptions,\n onImageAdded,\n imagesEnabled = false,\n linksEnabled = true,\n imageInsertionMode = 'all',\n pastedImagesRef,\n editorId = '',\n secure = false,\n onFocusTableMenu,\n onFocusPreviousCellMenu\n}: IframeTiptapEditorProps) => {\n // Keep callbacks in refs so the extension always has access to the latest callback\n const onFocusTableMenuRef = useRef(onFocusTableMenu);\n onFocusTableMenuRef.current = onFocusTableMenu;\n\n const onFocusPreviousCellMenuRef = useRef(onFocusPreviousCellMenu);\n onFocusPreviousCellMenuRef.current = onFocusPreviousCellMenu;\n\n // Process pasted image URLs and convert to File objects\n const processPastedImgUrls = async (infoArr: ImageInfoArray) => {\n const files = await Promise.all(\n infoArr.map(({ id: imgId, url }) => getFileFromUrl(url, imgId))\n );\n files.forEach((file, i) => {\n if (file) {\n onImageAdded?.(file, infoArr[i].id);\n }\n });\n };\n\n // Generate Tiptap extensions for custom components\n const customComponentExtensions = useMemo(() => {\n return customElements.map((component: CustomComponent) => {\n return Node.create({\n name: component.name,\n group: 'inline',\n inline: true,\n atom: true,\n content: 'text*', // Allow text content inside\n\n addAttributes() {\n const attrs: Record<string, { default: null }> = {};\n if (component.extensionAttributes) {\n component.extensionAttributes.forEach((attr: string) => {\n attrs[attr] = { default: null };\n });\n }\n // Add common attributes for pega-file\n attrs['data-id'] = { default: null };\n attrs['data-name'] = { default: null };\n attrs['data-url'] = { default: null };\n attrs['data-progress'] = { default: null };\n attrs['data-error'] = { default: null };\n attrs['data-alt'] = { default: null };\n // Add attributes for pega-reference\n attrs['data-rule-id'] = { default: null };\n attrs['data-rule-type'] = { default: null };\n attrs['data-rule-namespace'] = { default: null };\n attrs.role = { default: null };\n return attrs;\n },\n\n parseHTML() {\n return [\n {\n tag: component.name,\n getAttrs: (node: HTMLElement | string) => {\n if (typeof node === 'string') return null;\n const attrs: Record<string, string | null> = {};\n // Get all data attributes and role\n Array.from(node.attributes).forEach(attr => {\n if (\n attr.name.startsWith('data-') ||\n attr.name === 'role' ||\n component.extensionAttributes?.includes(attr.name)\n ) {\n attrs[attr.name] = attr.value;\n }\n });\n return attrs;\n }\n }\n ];\n },\n\n renderHTML({\n HTMLAttributes,\n node\n }: {\n HTMLAttributes: Record<string, string | null>;\n node: ProseMirrorNode;\n }) {\n // Get text content from the node\n const textContent = node.textContent || '';\n return [component.name, HTMLAttributes, textContent];\n }\n });\n });\n }, [customElements]);\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n // Exclude link from StarterKit since we're configuring it separately\n link: false,\n // Exclude blockquote so we can use our extended version with style preservation\n blockquote: false,\n // Exclude paragraph so we can use our extended version with class/style preservation\n paragraph: false,\n // Disable text patterns if specified in initOptions\n ...(initOptions?.textPatterns === false && {\n typography: false\n })\n }),\n BlockquoteWithStyle,\n ParagraphWithStyle,\n Placeholder.configure({\n placeholder: placeholder ?? ''\n }),\n TextIndent.configure({\n types: ['paragraph', 'heading']\n }),\n // Link extension is always loaded to preserve existing links in content\n // When linksEnabled is false, autolink is disabled to prevent auto-converting URLs\n Link.configure({\n openOnClick: false,\n autolink: linksEnabled,\n linkOnPaste: linksEnabled,\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer'\n }\n }),\n // Image extension is always loaded to render existing images in content\n // The imagesEnabled flag controls whether NEW images can be inserted (via paste/drop handlers)\n ImageWithDataAttachmentId.configure({\n inline: true,\n allowBase64: true\n }),\n // Text formatting extensions\n Underline,\n Subscript,\n Superscript,\n TextStyle,\n Color,\n Highlight.configure({\n multicolor: true\n }),\n FontFamily,\n FontSize,\n // Alignment\n TextAlign.configure({\n types: ['heading', 'paragraph']\n }),\n // Table extensions\n Table.configure({\n resizable: true\n }),\n TableRow,\n TableHeader,\n TableCell,\n TableDeleteOnEmpty,\n TableCellSelection,\n CustomKeyboardShortcuts.configure({\n onFocusTableMenu: () => onFocusTableMenuRef.current?.(),\n onFocusPreviousCellMenu: () => onFocusPreviousCellMenuRef.current?.()\n }),\n PreserveDiv,\n OfficePaste,\n ...customComponentExtensions\n ],\n content: defaultValue,\n editable: !disabled && !readOnly,\n editorProps: {\n attributes: {\n class: 'ProseMirror',\n spellcheck: spellcheck ? 'true' : 'false'\n },\n handleDOMEvents: {\n keydown: (_view, event) => {\n onKeyDown?.(event);\n return false; // Allow other handlers to process\n },\n paste: (_view, event) => {\n // Block pasted image files when images are disabled\n if (!imagesEnabled && event.clipboardData?.files) {\n const hasImageFile = Array.from(event.clipboardData.files).some(file =>\n file.type.startsWith('image/')\n );\n if (hasImageFile) {\n event.preventDefault();\n return true;\n }\n }\n // Track pasted files for later processing\n if (\n event.clipboardData?.files &&\n event.clipboardData.files.length > 0 &&\n pastedImagesRef\n ) {\n pastedImagesRef.current = Array.from(event.clipboardData.files);\n }\n return false; // Let handlePaste process\n },\n drop: (_view, event) => {\n // Block dropped image files when images are disabled\n if (!imagesEnabled && event.dataTransfer?.files) {\n const hasImageFile = Array.from(event.dataTransfer.files).some(file =>\n file.type.startsWith('image/')\n );\n if (hasImageFile) {\n event.preventDefault();\n return true;\n }\n }\n return false;\n }\n },\n // Handle paste behavior based on initOptions\n handlePaste: (view, event) => {\n // If pasteAsText is enabled, convert to plain text\n if (initOptions?.pasteAsText) {\n event.preventDefault();\n const text = event.clipboardData?.getData('text/plain');\n if (text) {\n view.dispatch(view.state.tr.insertText(text));\n }\n return true;\n }\n\n let html = event.clipboardData?.getData('text/html');\n const text = event.clipboardData?.getData('text/plain');\n const shouldPreferTextPaste = Boolean(text?.trim()) || Boolean(html?.trim());\n\n // If secure mode is enabled, sanitize pasted HTML content first\n if (secure && html) {\n html = sanitizeHtml(html);\n }\n\n const isImg = html && html.includes('<img');\n const hasLinks = html && /<a\\s/i.test(html);\n\n // If links are disabled, handle paste to prevent link creation\n if (!linksEnabled) {\n // Check if pasting HTML with <a> tags - strip them\n if (hasLinks && html) {\n event.preventDefault();\n // Replace <a> tags with their text content\n const strippedHtml = html.replace(/<a\\s[^>]*>([\\s\\S]*?)<\\/a>/gi, '$1');\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(strippedHtml).run();\n }\n return true;\n }\n\n // Check if pasting plain text that looks like a URL - insert as plain text\n const urlPattern = /^(https?:\\/\\/|www\\.)\\S+$/i;\n if (text && urlPattern.test(text.trim())) {\n event.preventDefault();\n view.dispatch(view.state.tr.insertText(text));\n return true;\n }\n }\n\n // If images are disabled or mode is url-only, strip images from pasted content\n if ((!imagesEnabled || imageInsertionMode === 'url') && isImg && html) {\n event.preventDefault();\n const cleanedHtml = html.replace(/<img[^>]*\\/?>/g, '');\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = cleanedHtml;\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.paragraph.create(\n null,\n view.state.schema.text(tempDiv.textContent || '')\n )\n )\n );\n return true;\n }\n\n // If pasteDataImages is disabled, strip images from pasted content\n if (initOptions?.pasteDataImages === false && isImg && html) {\n event.preventDefault();\n const cleanedHtml = html.replace(/<img[^>]*>/g, '');\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = cleanedHtml;\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.paragraph.create(\n null,\n view.state.schema.text(tempDiv.textContent || '')\n )\n )\n );\n return true;\n }\n\n // Handle raw image file pasting (e.g., screenshot, file from disk)\n // Prioritize raw files over HTML with blob URLs since blob URLs may fail to fetch\n const files = event.clipboardData?.files;\n if (\n imagesEnabled &&\n imageInsertionMode !== 'url' &&\n !shouldPreferTextPaste &&\n files &&\n files.length > 0\n ) {\n const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'));\n\n if (imageFiles.length > 0) {\n event.preventDefault();\n\n imageFiles.forEach(file => {\n const imgId = createUID();\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${file.name}' data-alt='${file.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(pegaFileHtml).run();\n }\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(file, imgId, file.name);\n });\n\n return true;\n }\n }\n\n // Process pasted images from HTML (fallback when no raw files available)\n if (imagesEnabled && isImg && html) {\n event.preventDefault();\n\n const pastedHtml = new DOMParser().parseFromString(html, 'text/html').body;\n const imgInfo: ImageInfoArray = [];\n\n pastedHtml.querySelectorAll('img').forEach(imgEl => {\n const imgId = createUID();\n const url = imgEl.src;\n const name = pastedImagesRef?.current.shift()?.name || editorId || 'pasted-image';\n\n imgInfo.push({ id: imgId, url, name });\n\n // Create pega-file element to show upload progress\n const uploadEl = document.createElement('pega-file');\n uploadEl.setAttribute('data-id', imgId);\n uploadEl.setAttribute('data-name', name);\n uploadEl.setAttribute('data-url', url);\n uploadEl.setAttribute('data-progress', '0');\n uploadEl.setAttribute('contenteditable', 'false');\n\n const uploadElString = `<br/>${uploadEl.outerHTML}<br/>`;\n const uploadElHtml = new DOMParser().parseFromString(uploadElString, 'text/html').body;\n\n imgEl.replaceWith(uploadElHtml);\n });\n\n // Insert the modified HTML\n const modifiedHtml = pastedHtml.innerHTML;\n view.dispatch(view.state.tr.insertText(''));\n\n // Use setTimeout to ensure the DOM is ready\n setTimeout(() => {\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(modifiedHtml).run();\n }\n }, 0);\n\n // Process the pasted image URLs\n processPastedImgUrls(imgInfo).catch(() => {\n // Errors are handled inside processPastedImgUrls\n });\n\n return true;\n }\n\n return false;\n },\n // Handle drag-and-drop of image files from the system\n handleDrop: (view, event, _slice, moved) => {\n // Only handle drops from outside the editor (not internal moves)\n if (moved) {\n return false;\n }\n\n const files = event.dataTransfer?.files;\n if (!imagesEnabled || imageInsertionMode === 'url' || !files || files.length === 0) {\n return false;\n }\n\n const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'));\n\n if (imageFiles.length === 0) {\n return false;\n }\n\n event.preventDefault();\n\n const dropEditor = editorRef.current?.getEditor();\n if (!dropEditor) {\n return false;\n }\n\n // Set cursor position to where the drop occurred\n const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (coordinates) {\n dropEditor.commands.setTextSelection(coordinates.pos);\n }\n\n imageFiles.forEach(file => {\n const imgId = createUID();\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${file.name}' data-alt='${file.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n dropEditor.chain().focus().insertContent(pegaFileHtml).run();\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(file, imgId, file.name);\n });\n\n return true;\n }\n },\n onUpdate: ({ editor: currentEditor }) => {\n // Clear stored link mark if cursor is not inside actual linked text\n // This prevents link styling from persisting after deleting linked text\n const { selection, storedMarks } = currentEditor.state;\n const linkMark = currentEditor.schema.marks.link;\n if (selection.empty && storedMarks?.some(mark => mark.type === linkMark)) {\n const hasLinkInDoc = selection.$from.marks().some(mark => mark.type === linkMark);\n if (!hasLinkInDoc) {\n currentEditor.commands.unsetMark('link');\n // Return early - onChange will fire on the subsequent update with cleaned state\n return;\n }\n }\n onChange?.(currentEditor);\n },\n onFocus: () => {\n onFocus?.();\n },\n onBlur: () => {\n onBlur?.();\n }\n });\n\n useEffect(() => {\n if (editor && onInit) {\n // Call initInstanceCallback if provided\n if (initOptions?.initInstanceCallback) {\n initOptions.initInstanceCallback(editor);\n }\n\n onInit(editor);\n }\n }, [editor, onInit, initOptions]);\n\n useImperativeHandle(\n editorRef,\n () => ({\n focus: () => editor?.chain().focus().run(),\n getPlainText: () => editor?.getText() ?? '',\n getRichText: () => (editor ? JSON.stringify(editor.getJSON()) : ''),\n getHtml: () => editor?.getHTML() ?? '',\n clear: () => editor?.chain().clearContent().run(),\n insertText: (text: string) => editor?.chain().insertContent(text).run(),\n setCursorLocationToStart: () => editor?.chain().focus('start').run(),\n insertHtml: (html: string, overwrite: boolean = false) => {\n if (overwrite) {\n editor?.chain().setContent(html).run();\n } else {\n editor?.chain().insertContent(html).run();\n }\n },\n getEditor: () => editor,\n setEditable: (editable: boolean) => editor?.setEditable(editable)\n }),\n [editor]\n );\n\n return <EditorContent editor={editor} />;\n};\n"]}
@@ -0,0 +1,20 @@
1
+ import type { RefObject } from 'react';
2
+ export interface ImagePosition {
3
+ top: number;
4
+ left: number;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ interface ImageActionButtonsProps {
9
+ position: ImagePosition | null;
10
+ containerRef: RefObject<HTMLElement>;
11
+ onEdit: (editButtonRef: HTMLButtonElement) => void;
12
+ onDelete: () => void;
13
+ onMouseEnter?: () => void;
14
+ onMouseLeave?: () => void;
15
+ editLabel: string;
16
+ deleteLabel: string;
17
+ }
18
+ declare const ImageActionButtons: import("react").ForwardRefExoticComponent<ImageActionButtonsProps & import("react").RefAttributes<HTMLButtonElement>>;
19
+ export default ImageActionButtons;
20
+ //# sourceMappingURL=ImageActionButtons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageActionButtons.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/ImageActionButtons.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,OAAO,CAAC;AAgBnD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,aAAa,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AA2CD,QAAA,MAAM,kBAAkB,uHA8FvB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import styled from 'styled-components';
4
+ import { Icon, registerIcon, defaultThemeProp, Tooltip, useElement, useTheme } from '@pega/cosmos-react-core';
5
+ import * as pencilIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/pencil.icon';
6
+ import * as trashIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/trash.icon';
7
+ registerIcon(pencilIcon, trashIcon);
8
+ const ActionsContainer = styled.div(({ theme, $visible, $top, $left }) => ({
9
+ position: 'absolute',
10
+ display: $visible ? 'flex' : 'none',
11
+ gap: `calc(0.25 * ${theme.base.spacing})`,
12
+ zIndex: theme.base['z-index'].popover,
13
+ backgroundColor: theme.base.palette['primary-background'],
14
+ borderRadius: theme.base['border-radius'],
15
+ boxShadow: theme.base.shadow.low,
16
+ padding: `calc(0.25 * ${theme.base.spacing})`,
17
+ top: `${$top}rem`,
18
+ left: `${$left}rem`,
19
+ transform: 'translateX(-100%)'
20
+ }));
21
+ ActionsContainer.defaultProps = defaultThemeProp;
22
+ const ActionButton = styled.button(({ theme }) => ({
23
+ display: 'flex',
24
+ alignItems: 'center',
25
+ justifyContent: 'center',
26
+ width: `calc(3 * ${theme.base.spacing})`,
27
+ height: `calc(3 * ${theme.base.spacing})`,
28
+ padding: 0,
29
+ border: 'none',
30
+ borderRadius: `calc(0.25 * ${theme.base['border-radius']})`,
31
+ backgroundColor: 'transparent',
32
+ color: theme.base.palette['foreground-color'],
33
+ cursor: 'pointer',
34
+ '&:hover': {
35
+ backgroundColor: theme.base.palette['secondary-background']
36
+ },
37
+ '&:focus': {
38
+ outline: 'none',
39
+ boxShadow: theme.base.shadow.focus
40
+ }
41
+ }));
42
+ ActionButton.defaultProps = defaultThemeProp;
43
+ const ImageActionButtons = forwardRef(function ImageActionButtons({ position, containerRef, onEdit, onDelete, onMouseEnter, onMouseLeave, editLabel, deleteLabel }, ref) {
44
+ const [editEl, setEditEl] = useElement();
45
+ const [deleteEl, setDeleteEl] = useElement();
46
+ const theme = useTheme();
47
+ if (!position || !containerRef.current) {
48
+ return null;
49
+ }
50
+ // Calculate position relative to the container
51
+ const containerRect = containerRef.current.getBoundingClientRect();
52
+ // Use theme spacing (parse rem value and convert to pixels for calculation)
53
+ const spacingRem = parseFloat(theme.base.spacing) || 1;
54
+ const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
55
+ const padding = spacingRem * rootFontSize * 0.5; // Half of base spacing
56
+ // Position at top-right of the image (convert to rem for output)
57
+ const top = (position.top - containerRect.top + padding) / rootFontSize;
58
+ const left = (position.left - containerRect.left + position.width - padding) / rootFontSize;
59
+ const handleEditClick = (e) => {
60
+ e.preventDefault();
61
+ e.stopPropagation();
62
+ if (editEl) {
63
+ onEdit(editEl);
64
+ }
65
+ };
66
+ const handleDeleteClick = (e) => {
67
+ e.preventDefault();
68
+ e.stopPropagation();
69
+ onDelete();
70
+ };
71
+ // Combine refs for edit button
72
+ const setEditRef = (el) => {
73
+ setEditEl(el);
74
+ if (typeof ref === 'function') {
75
+ ref(el);
76
+ }
77
+ else if (ref) {
78
+ ref.current = el;
79
+ }
80
+ };
81
+ return (_jsxs(ActionsContainer, { "$visible": !!position, "$top": top, "$left": left, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, children: [_jsx(ActionButton, { ref: setEditRef, onClick: handleEditClick, "aria-label": editLabel, type: 'button', children: _jsx(Icon, { name: 'pencil' }) }), editEl && (_jsx(Tooltip, { target: editEl, showDelay: 'none', hideDelay: 'none', children: editLabel })), _jsx(ActionButton, { ref: setDeleteEl, onClick: handleDeleteClick, "aria-label": deleteLabel, type: 'button', children: _jsx(Icon, { name: 'trash' }) }), deleteEl && (_jsx(Tooltip, { target: deleteEl, showDelay: 'none', hideDelay: 'none', children: deleteLabel }))] }));
82
+ });
83
+ export default ImageActionButtons;
84
+ //# sourceMappingURL=ImageActionButtons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageActionButtons.js","sourceRoot":"","sources":["../../../src/components/Editor/ImageActionButtons.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef } from 'react';\nimport type { RefObject, MouseEvent } from 'react';\nimport styled from 'styled-components';\n\nimport {\n Icon,\n registerIcon,\n defaultThemeProp,\n Tooltip,\n useElement,\n useTheme\n} from '@pega/cosmos-react-core';\nimport * as pencilIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/pencil.icon';\nimport * as trashIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/trash.icon';\n\nregisterIcon(pencilIcon, trashIcon);\n\nexport interface ImagePosition {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\ninterface ImageActionButtonsProps {\n position: ImagePosition | null;\n containerRef: RefObject<HTMLElement>;\n onEdit: (editButtonRef: HTMLButtonElement) => void;\n onDelete: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n editLabel: string;\n deleteLabel: string;\n}\n\nconst ActionsContainer = styled.div<{ $visible: boolean; $top: number; $left: number }>(\n ({ theme, $visible, $top, $left }) => ({\n position: 'absolute',\n display: $visible ? 'flex' : 'none',\n gap: `calc(0.25 * ${theme.base.spacing})`,\n zIndex: theme.base['z-index'].popover,\n backgroundColor: theme.base.palette['primary-background'],\n borderRadius: theme.base['border-radius'],\n boxShadow: theme.base.shadow.low,\n padding: `calc(0.25 * ${theme.base.spacing})`,\n top: `${$top}rem`,\n left: `${$left}rem`,\n transform: 'translateX(-100%)'\n })\n);\n\nActionsContainer.defaultProps = defaultThemeProp;\n\nconst ActionButton = styled.button(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: `calc(3 * ${theme.base.spacing})`,\n height: `calc(3 * ${theme.base.spacing})`,\n padding: 0,\n border: 'none',\n borderRadius: `calc(0.25 * ${theme.base['border-radius']})`,\n backgroundColor: 'transparent',\n color: theme.base.palette['foreground-color'],\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: theme.base.palette['secondary-background']\n },\n '&:focus': {\n outline: 'none',\n boxShadow: theme.base.shadow.focus\n }\n}));\n\nActionButton.defaultProps = defaultThemeProp;\n\nconst ImageActionButtons = forwardRef<HTMLButtonElement, ImageActionButtonsProps>(\n function ImageActionButtons(\n {\n position,\n containerRef,\n onEdit,\n onDelete,\n onMouseEnter,\n onMouseLeave,\n editLabel,\n deleteLabel\n },\n ref\n ) {\n const [editEl, setEditEl] = useElement<HTMLButtonElement>();\n const [deleteEl, setDeleteEl] = useElement<HTMLButtonElement>();\n const theme = useTheme();\n\n if (!position || !containerRef.current) {\n return null;\n }\n\n // Calculate position relative to the container\n const containerRect = containerRef.current.getBoundingClientRect();\n // Use theme spacing (parse rem value and convert to pixels for calculation)\n const spacingRem = parseFloat(theme.base.spacing) || 1;\n const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n const padding = spacingRem * rootFontSize * 0.5; // Half of base spacing\n\n // Position at top-right of the image (convert to rem for output)\n const top = (position.top - containerRect.top + padding) / rootFontSize;\n const left = (position.left - containerRect.left + position.width - padding) / rootFontSize;\n\n const handleEditClick = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (editEl) {\n onEdit(editEl);\n }\n };\n\n const handleDeleteClick = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete();\n };\n\n // Combine refs for edit button\n const setEditRef = (el: HTMLButtonElement | null) => {\n setEditEl(el);\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref) {\n ref.current = el;\n }\n };\n\n return (\n <ActionsContainer\n $visible={!!position}\n $top={top}\n $left={left}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <ActionButton\n ref={setEditRef}\n onClick={handleEditClick}\n aria-label={editLabel}\n type='button'\n >\n <Icon name='pencil' />\n </ActionButton>\n {editEl && (\n <Tooltip target={editEl} showDelay='none' hideDelay='none'>\n {editLabel}\n </Tooltip>\n )}\n <ActionButton\n ref={setDeleteEl}\n onClick={handleDeleteClick}\n aria-label={deleteLabel}\n type='button'\n >\n <Icon name='trash' />\n </ActionButton>\n {deleteEl && (\n <Tooltip target={deleteEl} showDelay='none' hideDelay='none'>\n {deleteLabel}\n </Tooltip>\n )}\n </ActionsContainer>\n );\n }\n);\n\nexport default ImageActionButtons;\n"]}
@@ -0,0 +1,17 @@
1
+ interface ImageEditDialogProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ onSave: (attrs: ImageAttributes) => void;
5
+ initialAttributes: ImageAttributes;
6
+ target?: HTMLElement | null;
7
+ }
8
+ export interface ImageAttributes {
9
+ src: string;
10
+ alt?: string;
11
+ width?: number;
12
+ height?: number;
13
+ actionUrl?: string;
14
+ }
15
+ export declare function ImageEditDialog({ isOpen, onClose, onSave, initialAttributes, target }: ImageEditDialogProps): import("react/jsx-runtime").JSX.Element | null;
16
+ export {};
17
+ //# sourceMappingURL=ImageEditDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageEditDialog.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/ImageEditDialog.tsx"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACzC,iBAAiB,EAAE,eAAe,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,OAAO,EACP,MAAM,EACN,iBAAiB,EACjB,MAAM,EACP,EAAE,oBAAoB,kDAyItB"}
@@ -0,0 +1,90 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useRef } from 'react';
3
+ import { Flex, Input, NumberInput, Checkbox, useI18n } from '@pega/cosmos-react-core';
4
+ import { StyledFormDialog } from './Editor.styles';
5
+ export function ImageEditDialog({ isOpen, onClose, onSave, initialAttributes, target }) {
6
+ const t = useI18n();
7
+ const popoverRef = useRef(null);
8
+ const [alt, setAlt] = useState(initialAttributes.alt || '');
9
+ const [width, setWidth] = useState(initialAttributes.width?.toString() || '');
10
+ const [height, setHeight] = useState(initialAttributes.height?.toString() || '');
11
+ const [actionUrl, setActionUrl] = useState(initialAttributes.actionUrl || '');
12
+ const [customSize, setCustomSize] = useState(false);
13
+ const [aspectRatio, setAspectRatio] = useState(0);
14
+ const [incorrectUrl, setIncorrectUrl] = useState(false);
15
+ useEffect(() => {
16
+ if (isOpen) {
17
+ setAlt(initialAttributes.alt || '');
18
+ setWidth(initialAttributes.width?.toString() || '');
19
+ setHeight(initialAttributes.height?.toString() || '');
20
+ setActionUrl(initialAttributes.actionUrl || '');
21
+ setCustomSize(false); // Always unchecked by default
22
+ // Calculate aspect ratio from initial dimensions
23
+ if (initialAttributes.width && initialAttributes.height) {
24
+ setAspectRatio(initialAttributes.width / initialAttributes.height);
25
+ }
26
+ setIncorrectUrl(false);
27
+ }
28
+ }, [isOpen, initialAttributes]);
29
+ const onHeightChange = (incomingValue) => {
30
+ const inputHeight = parseInt(incomingValue, 10);
31
+ if (Number.isNaN(inputHeight)) {
32
+ setHeight('');
33
+ return;
34
+ }
35
+ setHeight(inputHeight.toString());
36
+ if (aspectRatio) {
37
+ setWidth(Math.floor(inputHeight * aspectRatio).toString());
38
+ }
39
+ };
40
+ const onWidthChange = (incomingValue) => {
41
+ const inputWidth = parseInt(incomingValue, 10);
42
+ if (Number.isNaN(inputWidth)) {
43
+ setWidth('');
44
+ return;
45
+ }
46
+ setWidth(inputWidth.toString());
47
+ if (aspectRatio) {
48
+ setHeight(Math.floor(inputWidth / aspectRatio).toString());
49
+ }
50
+ };
51
+ const handleSave = () => {
52
+ if (incorrectUrl)
53
+ return;
54
+ const parsedWidth = parseFloat(width);
55
+ const parsedHeight = parseFloat(height);
56
+ const attrs = {
57
+ src: initialAttributes.src,
58
+ alt: alt.trim() || undefined,
59
+ width: customSize && Number.isFinite(parsedWidth) ? parsedWidth : undefined,
60
+ height: customSize && Number.isFinite(parsedHeight) ? parsedHeight : undefined,
61
+ actionUrl: actionUrl.trim() || undefined
62
+ };
63
+ onSave(attrs);
64
+ onClose();
65
+ };
66
+ const handleCancel = () => {
67
+ onClose();
68
+ };
69
+ if (!isOpen || !target) {
70
+ return null;
71
+ }
72
+ return (_jsx(StyledFormDialog, { heading: t('rte_edit_image'), onSubmit: handleSave, onCancel: handleCancel, onDismiss: onClose, target: target, ref: popoverRef, children: _jsxs(Flex, { container: { direction: 'column', gap: 2 }, children: [_jsx(Input, { label: t('description'), value: alt, onChange: (e) => setAlt(e.target.value), info: t('rte_image_description_info') }), _jsx(Input, { label: t('rte_action_url'), value: actionUrl, info: incorrectUrl ? t('rte_invalid_url') : '', status: incorrectUrl ? 'error' : undefined, onChange: e => {
73
+ const actionUrlInput = e.target.value;
74
+ setActionUrl(actionUrlInput);
75
+ if (actionUrlInput === '') {
76
+ setIncorrectUrl(false);
77
+ return;
78
+ }
79
+ try {
80
+ const newUrl = new URL(actionUrlInput);
81
+ setIncorrectUrl(!['http:', 'https:'].includes(newUrl.protocol));
82
+ }
83
+ catch {
84
+ setIncorrectUrl(true);
85
+ }
86
+ } }), _jsx(Checkbox, { checked: customSize, label: t('rte_image_custom_size'), onChange: (e) => {
87
+ setCustomSize(e.target.checked);
88
+ } }), customSize && (_jsxs(_Fragment, { children: [_jsx(NumberInput, { label: t('rte_width_in_pixels'), value: Math.floor(Math.max(parseFloat(width) || 1, 1)).toString(), onChange: onWidthChange }), _jsx(NumberInput, { label: t('rte_height_in_pixels'), value: Math.floor(Math.max(parseFloat(height) || 1, 1)).toString(), onChange: onHeightChange })] }))] }) }));
89
+ }
90
+ //# sourceMappingURL=ImageEditDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageEditDialog.js","sourceRoot":"","sources":["../../../src/components/Editor/ImageEditDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useRef } from 'react';\nimport type { ChangeEvent } from 'react';\n\nimport { Flex, Input, NumberInput, Checkbox, useI18n } from '@pega/cosmos-react-core';\n\nimport { StyledFormDialog } from './Editor.styles';\n\ninterface ImageEditDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (attrs: ImageAttributes) => void;\n initialAttributes: ImageAttributes;\n target?: HTMLElement | null;\n}\n\nexport interface ImageAttributes {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n actionUrl?: string;\n}\n\nexport function ImageEditDialog({\n isOpen,\n onClose,\n onSave,\n initialAttributes,\n target\n}: ImageEditDialogProps) {\n const t = useI18n();\n const popoverRef = useRef(null);\n const [alt, setAlt] = useState(initialAttributes.alt || '');\n const [width, setWidth] = useState(initialAttributes.width?.toString() || '');\n const [height, setHeight] = useState(initialAttributes.height?.toString() || '');\n const [actionUrl, setActionUrl] = useState(initialAttributes.actionUrl || '');\n const [customSize, setCustomSize] = useState(false);\n const [aspectRatio, setAspectRatio] = useState(0);\n const [incorrectUrl, setIncorrectUrl] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setAlt(initialAttributes.alt || '');\n setWidth(initialAttributes.width?.toString() || '');\n setHeight(initialAttributes.height?.toString() || '');\n setActionUrl(initialAttributes.actionUrl || '');\n setCustomSize(false); // Always unchecked by default\n\n // Calculate aspect ratio from initial dimensions\n if (initialAttributes.width && initialAttributes.height) {\n setAspectRatio(initialAttributes.width / initialAttributes.height);\n }\n setIncorrectUrl(false);\n }\n }, [isOpen, initialAttributes]);\n\n const onHeightChange = (incomingValue: string) => {\n const inputHeight = parseInt(incomingValue, 10);\n if (Number.isNaN(inputHeight)) {\n setHeight('');\n return;\n }\n setHeight(inputHeight.toString());\n if (aspectRatio) {\n setWidth(Math.floor(inputHeight * aspectRatio).toString());\n }\n };\n\n const onWidthChange = (incomingValue: string) => {\n const inputWidth = parseInt(incomingValue, 10);\n if (Number.isNaN(inputWidth)) {\n setWidth('');\n return;\n }\n setWidth(inputWidth.toString());\n if (aspectRatio) {\n setHeight(Math.floor(inputWidth / aspectRatio).toString());\n }\n };\n\n const handleSave = () => {\n if (incorrectUrl) return;\n\n const parsedWidth = parseFloat(width);\n const parsedHeight = parseFloat(height);\n\n const attrs: ImageAttributes = {\n src: initialAttributes.src,\n alt: alt.trim() || undefined,\n width: customSize && Number.isFinite(parsedWidth) ? parsedWidth : undefined,\n height: customSize && Number.isFinite(parsedHeight) ? parsedHeight : undefined,\n actionUrl: actionUrl.trim() || undefined\n };\n\n onSave(attrs);\n onClose();\n };\n\n const handleCancel = () => {\n onClose();\n };\n\n if (!isOpen || !target) {\n return null;\n }\n\n return (\n <StyledFormDialog\n heading={t('rte_edit_image')}\n onSubmit={handleSave}\n onCancel={handleCancel}\n onDismiss={onClose}\n target={target}\n ref={popoverRef}\n >\n <Flex container={{ direction: 'column', gap: 2 }}>\n <Input\n label={t('description')}\n value={alt}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setAlt(e.target.value)}\n info={t('rte_image_description_info')}\n />\n <Input\n label={t('rte_action_url')}\n value={actionUrl}\n info={incorrectUrl ? t('rte_invalid_url') : ''}\n status={incorrectUrl ? 'error' : undefined}\n onChange={e => {\n const actionUrlInput = e.target.value;\n setActionUrl(actionUrlInput);\n if (actionUrlInput === '') {\n setIncorrectUrl(false);\n return;\n }\n try {\n const newUrl = new URL(actionUrlInput);\n setIncorrectUrl(!['http:', 'https:'].includes(newUrl.protocol));\n } catch {\n setIncorrectUrl(true);\n }\n }}\n />\n <Checkbox\n checked={customSize}\n label={t('rte_image_custom_size')}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n setCustomSize(e.target.checked);\n }}\n />\n {customSize && (\n <>\n <NumberInput\n label={t('rte_width_in_pixels')}\n value={Math.floor(Math.max(parseFloat(width) || 1, 1)).toString()}\n onChange={onWidthChange}\n />\n <NumberInput\n label={t('rte_height_in_pixels')}\n value={Math.floor(Math.max(parseFloat(height) || 1, 1)).toString()}\n onChange={onHeightChange}\n />\n </>\n )}\n </Flex>\n </StyledFormDialog>\n );\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import type { RefObject } from 'react';
2
+ export interface CellPosition {
3
+ top: number;
4
+ left: number;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ interface TableCellMenuProps {
9
+ position: CellPosition | null;
10
+ containerRef: RefObject<HTMLElement>;
11
+ onAddRowBelow: () => void;
12
+ onAddRowAbove: () => void;
13
+ onAddColumnAfter: () => void;
14
+ onAddColumnBefore: () => void;
15
+ onDeleteRow: () => void;
16
+ onDeleteColumn: () => void;
17
+ onDeleteTable: () => void;
18
+ onGoToNextCell?: () => void;
19
+ onReturnToCell?: () => void;
20
+ onMouseEnter?: () => void;
21
+ onMouseLeave?: () => void;
22
+ labels: {
23
+ tableOptions: string;
24
+ addRowBelow: string;
25
+ addRowAbove: string;
26
+ addColumnAfter: string;
27
+ addColumnBefore: string;
28
+ deleteRow: string;
29
+ deleteColumn: string;
30
+ deleteTable: string;
31
+ };
32
+ }
33
+ declare const TableCellMenu: import("react").ForwardRefExoticComponent<TableCellMenuProps & import("react").RefAttributes<HTMLButtonElement>>;
34
+ export default TableCellMenu;
35
+ //# sourceMappingURL=TableCellMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableCellMenu.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/TableCellMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAA6B,MAAM,OAAO,CAAC;AAUlE,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,MAAM,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAiCD,QAAA,MAAM,aAAa,kHAuIjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef, useState, useRef, useCallback } from 'react';
3
+ import styled, { css } from 'styled-components';
4
+ import { MenuButton, registerIcon, defaultThemeProp, useTheme } from '@pega/cosmos-react-core';
5
+ import * as moreIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/more.icon';
6
+ import useCloseOnEditorClick from './hooks/useCloseOnEditorClick';
7
+ registerIcon(moreIcon);
8
+ const MENU_BUTTON_SPACING_MULTIPLIER = 3.5;
9
+ const StyledTableCellMenuButton = styled(MenuButton)(({ theme, $visible, $top, $left }) => css `
10
+ position: absolute;
11
+ display: ${$visible ? 'inline-flex' : 'none'};
12
+ z-index: ${theme.base['z-index'].popover};
13
+ top: ${$top}rem;
14
+ left: ${$left}rem;
15
+ transform: translateY(-50%);
16
+
17
+ &&& {
18
+ min-width: 1.5rem;
19
+ min-height: 1.5rem;
20
+ padding: 0;
21
+ }
22
+
23
+ &&&:hover,
24
+ &&&:focus {
25
+ box-shadow: none;
26
+ background-color: ${theme.base.palette['primary-background']};
27
+ }
28
+ `);
29
+ StyledTableCellMenuButton.defaultProps = defaultThemeProp;
30
+ const TableCellMenu = forwardRef(function TableCellMenu({ position, containerRef, onAddRowBelow, onAddRowAbove, onAddColumnAfter, onAddColumnBefore, onDeleteRow, onDeleteColumn, onDeleteTable, onGoToNextCell, onReturnToCell, onMouseEnter, onMouseLeave, labels }, ref) {
31
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
32
+ const buttonRef = useRef(null);
33
+ const theme = useTheme();
34
+ const handleEditorClick = useCallback(() => {
35
+ buttonRef.current?.blur();
36
+ setIsMenuOpen(false);
37
+ }, []);
38
+ useCloseOnEditorClick(isMenuOpen, handleEditorClick);
39
+ if (!position || !containerRef.current) {
40
+ return null;
41
+ }
42
+ const containerRect = containerRef.current.getBoundingClientRect();
43
+ const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
44
+ const baseSpacing = parseFloat(theme.base.spacing) || 1;
45
+ const buttonWidthRem = MENU_BUTTON_SPACING_MULTIPLIER * baseSpacing;
46
+ const top = (position.top - containerRect.top + position.height / 2) / rootFontSize;
47
+ const left = (position.left - containerRect.left + position.width) / rootFontSize - buttonWidthRem;
48
+ const handleButtonMouseDown = (e) => {
49
+ e.preventDefault();
50
+ e.stopPropagation();
51
+ };
52
+ const handleButtonClick = () => {
53
+ setIsMenuOpen(prev => !prev);
54
+ };
55
+ const handleButtonKeyDown = (e) => {
56
+ if (!isMenuOpen) {
57
+ if (e.key === 'ArrowRight') {
58
+ e.preventDefault();
59
+ onGoToNextCell?.();
60
+ }
61
+ else if (e.key === 'ArrowLeft') {
62
+ e.preventDefault();
63
+ onReturnToCell?.();
64
+ }
65
+ }
66
+ };
67
+ const setRefs = (el) => {
68
+ buttonRef.current = el;
69
+ if (typeof ref === 'function') {
70
+ ref(el);
71
+ }
72
+ else if (ref) {
73
+ ref.current = el;
74
+ }
75
+ };
76
+ const handleMenuItemClick = (id) => {
77
+ setIsMenuOpen(false);
78
+ switch (id) {
79
+ case 'add-row-below':
80
+ onAddRowBelow();
81
+ break;
82
+ case 'add-row-above':
83
+ onAddRowAbove();
84
+ break;
85
+ case 'add-column-after':
86
+ onAddColumnAfter();
87
+ break;
88
+ case 'add-column-before':
89
+ onAddColumnBefore();
90
+ break;
91
+ case 'delete-row':
92
+ onDeleteRow();
93
+ break;
94
+ case 'delete-column':
95
+ onDeleteColumn();
96
+ break;
97
+ case 'delete-table':
98
+ onDeleteTable();
99
+ break;
100
+ default:
101
+ break;
102
+ }
103
+ };
104
+ // Key based on position forces remount when cell changes, closing any open menu
105
+ const menuKey = `${position.top}-${position.left}`;
106
+ return (_jsx(StyledTableCellMenuButton, { ref: setRefs, "$visible": !!position, "$top": top, "$left": left, text: labels.tableOptions, variant: 'simple', icon: 'more', iconOnly: true, onMouseDown: handleButtonMouseDown, onClick: handleButtonClick, onKeyDown: handleButtonKeyDown, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, popover: { placement: 'bottom-end' }, menu: {
107
+ items: [
108
+ { id: 'add-row-below', primary: labels.addRowBelow },
109
+ { id: 'add-row-above', primary: labels.addRowAbove },
110
+ { id: 'add-column-after', primary: labels.addColumnAfter },
111
+ { id: 'add-column-before', primary: labels.addColumnBefore },
112
+ { id: 'delete-row', primary: labels.deleteRow },
113
+ { id: 'delete-column', primary: labels.deleteColumn },
114
+ { id: 'delete-table', primary: labels.deleteTable }
115
+ ],
116
+ onItemClick: handleMenuItemClick
117
+ } }, menuKey));
118
+ });
119
+ export default TableCellMenu;
120
+ //# sourceMappingURL=TableCellMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableCellMenu.js","sourceRoot":"","sources":["../../../src/components/Editor/TableCellMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useState, useRef, useCallback } from 'react';\nimport type { RefObject, MouseEvent, KeyboardEvent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { MenuButton, registerIcon, defaultThemeProp, useTheme } from '@pega/cosmos-react-core';\nimport * as moreIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/more.icon';\n\nimport useCloseOnEditorClick from './hooks/useCloseOnEditorClick';\n\nregisterIcon(moreIcon);\n\nexport interface CellPosition {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\ninterface TableCellMenuProps {\n position: CellPosition | null;\n containerRef: RefObject<HTMLElement>;\n onAddRowBelow: () => void;\n onAddRowAbove: () => void;\n onAddColumnAfter: () => void;\n onAddColumnBefore: () => void;\n onDeleteRow: () => void;\n onDeleteColumn: () => void;\n onDeleteTable: () => void;\n onGoToNextCell?: () => void;\n onReturnToCell?: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n labels: {\n tableOptions: string;\n addRowBelow: string;\n addRowAbove: string;\n addColumnAfter: string;\n addColumnBefore: string;\n deleteRow: string;\n deleteColumn: string;\n deleteTable: string;\n };\n}\n\nconst MENU_BUTTON_SPACING_MULTIPLIER = 3.5;\n\nconst StyledTableCellMenuButton = styled(MenuButton)<{\n $visible: boolean;\n $top: number;\n $left: number;\n}>(\n ({ theme, $visible, $top, $left }) => css`\n position: absolute;\n display: ${$visible ? 'inline-flex' : 'none'};\n z-index: ${theme.base['z-index'].popover};\n top: ${$top}rem;\n left: ${$left}rem;\n transform: translateY(-50%);\n\n &&& {\n min-width: 1.5rem;\n min-height: 1.5rem;\n padding: 0;\n }\n\n &&&:hover,\n &&&:focus {\n box-shadow: none;\n background-color: ${theme.base.palette['primary-background']};\n }\n `\n);\n\nStyledTableCellMenuButton.defaultProps = defaultThemeProp;\n\nconst TableCellMenu = forwardRef<HTMLButtonElement, TableCellMenuProps>(function TableCellMenu(\n {\n position,\n containerRef,\n onAddRowBelow,\n onAddRowAbove,\n onAddColumnAfter,\n onAddColumnBefore,\n onDeleteRow,\n onDeleteColumn,\n onDeleteTable,\n onGoToNextCell,\n onReturnToCell,\n onMouseEnter,\n onMouseLeave,\n labels\n },\n ref\n) {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const theme = useTheme();\n\n const handleEditorClick = useCallback(() => {\n buttonRef.current?.blur();\n setIsMenuOpen(false);\n }, []);\n useCloseOnEditorClick(isMenuOpen, handleEditorClick);\n\n if (!position || !containerRef.current) {\n return null;\n }\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n const baseSpacing = parseFloat(theme.base.spacing) || 1;\n const buttonWidthRem = MENU_BUTTON_SPACING_MULTIPLIER * baseSpacing;\n\n const top = (position.top - containerRect.top + position.height / 2) / rootFontSize;\n const left =\n (position.left - containerRect.left + position.width) / rootFontSize - buttonWidthRem;\n\n const handleButtonMouseDown = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleButtonClick = () => {\n setIsMenuOpen(prev => !prev);\n };\n\n const handleButtonKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n if (!isMenuOpen) {\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n onGoToNextCell?.();\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n onReturnToCell?.();\n }\n }\n };\n\n const setRefs = (el: HTMLButtonElement | null) => {\n buttonRef.current = el;\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref) {\n ref.current = el;\n }\n };\n\n const handleMenuItemClick = (id: string) => {\n setIsMenuOpen(false);\n switch (id) {\n case 'add-row-below':\n onAddRowBelow();\n break;\n case 'add-row-above':\n onAddRowAbove();\n break;\n case 'add-column-after':\n onAddColumnAfter();\n break;\n case 'add-column-before':\n onAddColumnBefore();\n break;\n case 'delete-row':\n onDeleteRow();\n break;\n case 'delete-column':\n onDeleteColumn();\n break;\n case 'delete-table':\n onDeleteTable();\n break;\n default:\n break;\n }\n };\n\n // Key based on position forces remount when cell changes, closing any open menu\n const menuKey = `${position.top}-${position.left}`;\n\n return (\n <StyledTableCellMenuButton\n key={menuKey}\n ref={setRefs}\n $visible={!!position}\n $top={top}\n $left={left}\n text={labels.tableOptions}\n variant='simple'\n icon='more'\n iconOnly\n onMouseDown={handleButtonMouseDown}\n onClick={handleButtonClick}\n onKeyDown={handleButtonKeyDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n popover={{ placement: 'bottom-end' }}\n menu={{\n items: [\n { id: 'add-row-below', primary: labels.addRowBelow },\n { id: 'add-row-above', primary: labels.addRowAbove },\n { id: 'add-column-after', primary: labels.addColumnAfter },\n { id: 'add-column-before', primary: labels.addColumnBefore },\n { id: 'delete-row', primary: labels.deleteRow },\n { id: 'delete-column', primary: labels.deleteColumn },\n { id: 'delete-table', primary: labels.deleteTable }\n ],\n onItemClick: handleMenuItemClick\n }}\n />\n );\n});\n\nexport default TableCellMenu;\n"]}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { Editor as TiptapEditor } from '@tiptap/core';
3
+ import type { AIAction } from '@pega/cosmos-react-core';
4
+ export interface AIRewriteButtonProps {
5
+ editor: TiptapEditor;
6
+ onRewriteClick: (originalText: string, rewriteAction: AIAction, additionalInstructions: string, onSuccess: (rewrittenText: string) => void) => void;
7
+ renderSuggestionEditor?: (props: {
8
+ defaultValue?: string;
9
+ disabled: boolean;
10
+ readOnly: boolean;
11
+ onGetContent: (getContent: () => string) => void;
12
+ onContentChange: (hasContent: boolean) => void;
13
+ }) => ReactNode;
14
+ }
15
+ declare const AIRewriteButton: ({ editor, onRewriteClick, renderSuggestionEditor }: AIRewriteButtonProps) => import("react/jsx-runtime").JSX.Element;
16
+ export default AIRewriteButton;
17
+ //# sourceMappingURL=AIRewriteButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIRewriteButton.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/AIRewriteButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAG3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AASxD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,CACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,QAAQ,EACvB,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,KACvC,IAAI,CAAC;IACV,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;QACjD,eAAe,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;KAChD,KAAK,SAAS,CAAC;CACjB;AAED,QAAA,MAAM,eAAe,GAAI,oDAItB,oBAAoB,4CA8GtB,CAAC;AAEF,eAAe,eAAe,CAAC"}