@globalpayments/vega 2.98.0 → 2.99.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 (447) hide show
  1. package/dist/cjs/{action-color-accessibility-validator-24498816.js → action-color-accessibility-validator-b8a9ef0f.js} +2 -2
  2. package/dist/cjs/{app-globals-b3f05631.js → app-globals-a306dce6.js} +10 -10
  3. package/dist/cjs/{code-block-d78c2b2c.js → code-block-ea1f5eb3.js} +43 -6
  4. package/dist/cjs/{component-global-style-slimmer-93c5fb50.js → component-global-style-slimmer-ba588eb4.js} +1 -1
  5. package/dist/cjs/{component-value-history-controller-slimmer.abstract-beb00fea.js → component-value-history-controller-slimmer.abstract-7071b064.js} +24 -5
  6. package/dist/cjs/{content-state-78a620a9.js → content-state-8d07d530.js} +60 -8
  7. package/dist/cjs/{dark-mode-style-controller-32d4054a.js → dark-mode-style-controller-f3da3342.js} +2 -2
  8. package/dist/cjs/{date-required-rule-5250f26d.js → date-required-rule-c0c498ad.js} +1 -1
  9. package/dist/cjs/{design-token-74674ee7.js → design-token-58bf7fe8.js} +3 -3
  10. package/dist/cjs/{element-appender-slimmer-597e9e48.js → element-appender-slimmer-a0269315.js} +2 -2
  11. package/dist/cjs/{form-field-controller-slimmer-a743be34.js → form-field-controller-slimmer-f73f200e.js} +2 -2
  12. package/dist/cjs/{image-annotation-action-85c4bd83.js → image-annotation-action-2a28038e.js} +3 -3
  13. package/dist/cjs/{image-extension-260fa69c.js → image-extension-9659708b.js} +2 -2
  14. package/dist/cjs/{index-592b4052.js → index-5d1adcd1.js} +86 -0
  15. package/dist/cjs/index.cjs.js +19 -19
  16. package/dist/cjs/{inject-keyboard-manager-6a6f5c9f.js → inject-keyboard-manager-4fa45f9c.js} +1 -1
  17. package/dist/cjs/{internal-calendar-period-factory-dfcdd3f6.js → internal-calendar-period-factory-6196bc80.js} +1 -1
  18. package/dist/cjs/{internal-translation-controller-1dac2df8.js → internal-translation-controller-51f7f865.js} +2 -0
  19. package/dist/cjs/{keyboard-manager-c56033b1.js → keyboard-manager-482fe257.js} +1 -1
  20. package/dist/cjs/{keyboard-manager-slimmer-7043a106.js → keyboard-manager-slimmer-a19430dd.js} +1 -1
  21. package/dist/cjs/{link-extension-220ff6a9.js → link-extension-11340e1c.js} +26 -7
  22. package/dist/cjs/loader.cjs.js +13 -13
  23. package/dist/cjs/{month-view-generator-7b704a80.js → month-view-generator-1a534451.js} +1 -1
  24. package/dist/cjs/{public-rules-5657bce4.js → public-rules-6c77b545.js} +9 -9
  25. package/dist/cjs/{range-c5afd53a.js → range-22ddd452.js} +1 -1
  26. package/dist/cjs/{responsive-format-facade-493d1763.js → responsive-format-facade-74e6d791.js} +1 -1
  27. package/dist/cjs/{rich-text-editor-required-rule-385c1b61.js → rich-text-editor-required-rule-09d1093a.js} +1 -1
  28. package/dist/cjs/{split-cell-operation-873d5db7.js → split-cell-operation-11bfb305.js} +14 -4
  29. package/dist/cjs/{state-border-formatter-711c7aaa.js → state-border-formatter-bf4f9f1c.js} +1 -1
  30. package/dist/cjs/{string-format-strategy.abstract-b61bdcbd.js → string-format-strategy.abstract-bf37b14c.js} +1 -1
  31. package/dist/cjs/{string-input-formatter-slimmer-ef65cca7.js → string-input-formatter-slimmer-ffeb18a6.js} +1 -1
  32. package/dist/cjs/{string-mask-strategy-ad3fa0ac.js → string-mask-strategy-7f394726.js} +2 -2
  33. package/dist/cjs/{style-formatter-8f711cb0.js → style-formatter-4ac63910.js} +2 -2
  34. package/dist/cjs/{time-required-rule-87417359.js → time-required-rule-e2a50003.js} +1 -1
  35. package/dist/cjs/{token-extension-78b5a026.js → token-extension-4686cb3b.js} +2920 -157
  36. package/dist/cjs/{translation-slimmer-77c7f37d.js → translation-slimmer-e4997f8f.js} +1 -1
  37. package/dist/cjs/{type-guard-a57ef3ac.js → type-guard-b8d7bb3f.js} +1 -1
  38. package/dist/cjs/{valid-credit-card-number-rule-4c0a3040.js → valid-credit-card-number-rule-f5a6f009.js} +1 -1
  39. package/dist/cjs/vega-accordion.cjs.entry.js +6 -6
  40. package/dist/cjs/vega-app-footer.cjs.entry.js +2 -2
  41. package/dist/cjs/vega-app-header-button.cjs.entry.js +5 -5
  42. package/dist/cjs/vega-box.cjs.entry.js +7 -7
  43. package/dist/cjs/vega-brand-logo.cjs.entry.js +2 -2
  44. package/dist/cjs/vega-breadcrumb.cjs.entry.js +2 -2
  45. package/dist/cjs/vega-button-circle.cjs.entry.js +6 -6
  46. package/dist/cjs/vega-button-link.cjs.entry.js +1 -1
  47. package/dist/cjs/vega-button.cjs.entry.js +4 -4
  48. package/dist/cjs/vega-calendar_5.cjs.entry.js +21 -10
  49. package/dist/cjs/vega-card.cjs.entry.js +5 -5
  50. package/dist/cjs/vega-carousel.cjs.entry.js +3 -3
  51. package/dist/cjs/vega-checkbox_2.cjs.entry.js +3 -3
  52. package/dist/cjs/vega-chip.cjs.entry.js +5 -5
  53. package/dist/cjs/vega-code-block.cjs.entry.js +11 -11
  54. package/dist/cjs/vega-color-picker.cjs.entry.js +3 -3
  55. package/dist/cjs/vega-color-swatch-picker.cjs.entry.js +4 -4
  56. package/dist/cjs/vega-color-swatch.cjs.entry.js +2 -2
  57. package/dist/cjs/vega-combo-box.cjs.entry.js +9 -9
  58. package/dist/cjs/vega-counter-badge.cjs.entry.js +2 -2
  59. package/dist/cjs/vega-date-picker_2.cjs.entry.js +14 -14
  60. package/dist/cjs/vega-dialog_2.cjs.entry.js +5 -5
  61. package/dist/cjs/vega-divider.cjs.entry.js +5 -5
  62. package/dist/cjs/vega-dropdown_5.cjs.entry.js +23 -14
  63. package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
  64. package/dist/cjs/vega-field-label.cjs.entry.js +3 -3
  65. package/dist/cjs/vega-file-uploader.cjs.entry.js +4 -4
  66. package/dist/cjs/vega-flag-icon.cjs.entry.js +5 -5
  67. package/dist/cjs/vega-flex.cjs.entry.js +6 -6
  68. package/dist/cjs/vega-font.cjs.entry.js +5 -5
  69. package/dist/cjs/vega-form.cjs.entry.js +2 -2
  70. package/dist/cjs/vega-grid.cjs.entry.js +5 -5
  71. package/dist/cjs/vega-icon.cjs.entry.js +6 -6
  72. package/dist/cjs/vega-image-uploader.cjs.entry.js +7 -7
  73. package/dist/cjs/vega-input-credit-card.cjs.entry.js +7 -7
  74. package/dist/cjs/vega-input-numeric.cjs.entry.js +6 -6
  75. package/dist/cjs/vega-input-passcode.cjs.entry.js +6 -6
  76. package/dist/cjs/vega-input-phone-number.cjs.entry.js +5 -5
  77. package/dist/cjs/vega-input-range.cjs.entry.js +4 -4
  78. package/dist/cjs/vega-input-select.cjs.entry.js +6 -6
  79. package/dist/cjs/vega-input.cjs.entry.js +7 -7
  80. package/dist/cjs/vega-left-nav_5.cjs.entry.js +10 -10
  81. package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +3 -3
  82. package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +2 -2
  83. package/dist/cjs/vega-pagination.cjs.entry.js +4 -4
  84. package/dist/cjs/vega-popover_2.cjs.entry.js +8 -8
  85. package/dist/cjs/vega-progress-tracker_2.cjs.entry.js +3 -3
  86. package/dist/cjs/vega-radio_2.cjs.entry.js +6 -6
  87. package/dist/cjs/vega-rich-text-content.cjs.entry.js +39 -11
  88. package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +79 -22
  89. package/dist/cjs/vega-rich-text-find-replace-panel.cjs.entry.js +1 -1
  90. package/dist/cjs/vega-rich-text-special-characters-panel.cjs.entry.js +5 -5
  91. package/dist/cjs/vega-rich-text-table-properties_3.cjs.entry.js +10 -10
  92. package/dist/cjs/vega-selection-chip_2.cjs.entry.js +5 -5
  93. package/dist/cjs/vega-selection-tile_2.cjs.entry.js +3 -3
  94. package/dist/cjs/vega-sidenav_3.cjs.entry.js +3 -3
  95. package/dist/cjs/vega-signature-capture.cjs.entry.js +8 -8
  96. package/dist/cjs/vega-stepper.cjs.entry.js +3 -3
  97. package/dist/cjs/vega-tab-group_2.cjs.entry.js +21 -8
  98. package/dist/cjs/vega-table_11.cjs.entry.js +81 -45
  99. package/dist/cjs/vega-textarea.cjs.entry.js +3 -3
  100. package/dist/cjs/vega-time-picker_2.cjs.entry.js +10 -10
  101. package/dist/cjs/vega-toggle-switch.cjs.entry.js +3 -3
  102. package/dist/cjs/vega-tooltip_2.cjs.entry.js +6 -6
  103. package/dist/cjs/vega.cjs.js +13 -13
  104. package/dist/collection/components/vega-calendar/slimmers/common/renderers/vega-calendar-event-item-renderer.js +5 -2
  105. package/dist/collection/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.js +9 -1
  106. package/dist/collection/components/vega-counter-badge/vega-counter-badge.js +2 -2
  107. package/dist/collection/components/vega-dropdown/vega-dropdown-group/slimmers/renderers/vega-dropdown-group-renderer.js +6 -4
  108. package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.js +10 -2
  109. package/dist/collection/components/vega-field-label/vega-field-label.css +1 -0
  110. package/dist/collection/components/vega-rich-text-editor/constants/constant.js +16 -0
  111. package/dist/collection/components/vega-rich-text-editor/dto/annotations/text-style-default-styles.js +2 -1
  112. package/dist/collection/components/vega-rich-text-editor/dto/blocks/block.abstract.js +11 -0
  113. package/dist/collection/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy-registry.js +2 -1
  114. package/dist/collection/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy.abstract.js +5 -2
  115. package/dist/collection/components/vega-rich-text-editor/dto/filter-styles-strategies/text-node/title-heading-node-filter-styles-strategy.js +36 -2
  116. package/dist/collection/components/vega-rich-text-editor/dto/renderers/blocks/block-text-nodes-renderer.abstract.js +20 -3
  117. package/dist/collection/components/vega-rich-text-editor/dto/renderers/nodes/text-node-renderer.js +12 -0
  118. package/dist/collection/components/vega-rich-text-editor/extensions/block-boundary-registry.js +34 -0
  119. package/dist/collection/components/vega-rich-text-editor/extensions/extension.abstract.js +20 -0
  120. package/dist/collection/components/vega-rich-text-editor/extensions/functions/action-handler-strategies/insert-function-block-strategy.js +3 -2
  121. package/dist/collection/components/vega-rich-text-editor/extensions/functions/constants.js +8 -0
  122. package/dist/collection/components/vega-rich-text-editor/extensions/functions/dto/function-block.js +14 -3
  123. package/dist/collection/components/vega-rich-text-editor/extensions/functions/dto/logic-control-block.js +2 -1
  124. package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-containing-function-block-strategy.js +19 -0
  125. package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-to-function-block-strategy.js +9 -5
  126. package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-to-function-content-strategy.js +3 -3
  127. package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-to-logic-control-block-strategy.js +4 -2
  128. package/dist/collection/components/vega-rich-text-editor/extensions/functions/function-extension.js +18 -0
  129. package/dist/collection/components/vega-rich-text-editor/extensions/functions/renderers/function-block-renderer.js +5 -2
  130. package/dist/collection/components/vega-rich-text-editor/extensions/functions/renderers/logic-control-block-renderer.js +2 -1
  131. package/dist/collection/components/vega-rich-text-editor/extensions/functions/utils.js +36 -0
  132. package/dist/collection/components/vega-rich-text-editor/extensions/languages/language-extension.js +1 -0
  133. package/dist/collection/components/vega-rich-text-editor/extensions/paste/action-handler-strategies/image-replace-src-strategy.js +21 -0
  134. package/dist/collection/components/vega-rich-text-editor/extensions/paste/actions/image-replace-src-action.js +13 -0
  135. package/dist/collection/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/paste-image-parser.js +295 -0
  136. package/dist/collection/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/pending-image-registry.js +116 -0
  137. package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-chooser-ui.js +13 -4
  138. package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-extension.js +70 -7
  139. package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/default-paste-strategy.js +38 -0
  140. package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/paste-processing-strategy.abstract.js +55 -0
  141. package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/paste-strategy-selector.js +59 -0
  142. package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/word-paste-strategy.js +416 -0
  143. package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-code-block-transformer.js +106 -0
  144. package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-image-transformer.js +198 -0
  145. package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-list-transformer.js +591 -0
  146. package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-paragraph-transformer.js +112 -0
  147. package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-table-transformer.js +551 -0
  148. package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-transformer.js +7 -0
  149. package/dist/collection/components/vega-rich-text-editor/extensions/table/dto/table-block.js +10 -0
  150. package/dist/collection/components/vega-rich-text-editor/extensions/tokens/span-to-token-node-strategy.js +4 -2
  151. package/dist/collection/components/vega-rich-text-editor/extensions/tokens/token-node.js +44 -0
  152. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/extension-controller.js +2 -0
  153. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/annotation-handler/text-style-annotation-handler.js +7 -4
  154. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/continue-inline-to-rte-text-block-strategy.js +17 -0
  155. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/insert-paste-handler.js +18 -4
  156. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/selection-controller.js +21 -2
  157. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.js +7 -0
  158. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/vega-rich-text-editor-source-view-renderer.js +5 -2
  159. package/dist/collection/components/vega-tab-group/slimmers/vega-tab-group/renderers/vega-tab-group-tab-list-renderer.js +14 -7
  160. package/dist/collection/components/vega-tab-group/vega-tab-group.css +6 -0
  161. package/dist/collection/components/vega-tab-group/vega-tab-group.js +5 -0
  162. package/dist/collection/components/vega-table/slimmers/controllers/vega-table-body-col-span-controller.js +31 -1
  163. package/dist/collection/components/vega-table/slimmers/renderers/vega-table-body-col-span-resolver.js +18 -11
  164. package/dist/collection/helpers/translation/locales/en.js +2 -0
  165. package/dist/collection/utils/sanitize/index.js +3 -2
  166. package/dist/collection/utils/sanitize/strategies/index.js +1 -0
  167. package/dist/collection/utils/sanitize/strategies/label-sanitize-strategy.js +14 -0
  168. package/dist/collection/utils/sanitize/strategies/plain-text-sanitize-strategy.js +70 -0
  169. package/dist/esm/{action-color-accessibility-validator-ce55cb07.js → action-color-accessibility-validator-08877515.js} +2 -2
  170. package/dist/esm/{app-globals-95c7110a.js → app-globals-c59364c2.js} +10 -10
  171. package/dist/esm/{code-block-9c513169.js → code-block-e6443949.js} +39 -7
  172. package/dist/esm/{component-global-style-slimmer-ac703085.js → component-global-style-slimmer-7d60a04a.js} +1 -1
  173. package/dist/esm/{component-value-history-controller-slimmer.abstract-9cef2a2a.js → component-value-history-controller-slimmer.abstract-ee393213.js} +24 -5
  174. package/dist/esm/{content-state-25c81c08.js → content-state-43cdacff.js} +60 -9
  175. package/dist/esm/{dark-mode-style-controller-ca5afd2d.js → dark-mode-style-controller-352f15ff.js} +2 -2
  176. package/dist/esm/{date-required-rule-85334d0c.js → date-required-rule-b5b67498.js} +1 -1
  177. package/dist/esm/{design-token-10ff79b5.js → design-token-8319bb59.js} +3 -3
  178. package/dist/esm/{element-appender-slimmer-8a06ecdd.js → element-appender-slimmer-c81d1fe3.js} +2 -2
  179. package/dist/esm/{form-field-controller-slimmer-68fc5380.js → form-field-controller-slimmer-511b7ac5.js} +2 -2
  180. package/dist/esm/{image-annotation-action-d7f2aecc.js → image-annotation-action-d7cb80aa.js} +3 -3
  181. package/dist/esm/{image-extension-fbd1ed6e.js → image-extension-9b8abd0d.js} +2 -2
  182. package/dist/esm/{index-3b327f29.js → index-35451d12.js} +86 -1
  183. package/dist/esm/index.js +19 -19
  184. package/dist/esm/{inject-keyboard-manager-ea1aad5b.js → inject-keyboard-manager-dd368d56.js} +1 -1
  185. package/dist/esm/{internal-calendar-period-factory-7b294fb6.js → internal-calendar-period-factory-d58f35c6.js} +1 -1
  186. package/dist/esm/{internal-translation-controller-fac22598.js → internal-translation-controller-b33430c6.js} +2 -0
  187. package/dist/esm/{keyboard-manager-50da85d7.js → keyboard-manager-b4a0d97d.js} +1 -1
  188. package/dist/esm/{keyboard-manager-slimmer-1f7c8bfb.js → keyboard-manager-slimmer-0517fc70.js} +1 -1
  189. package/dist/esm/{link-extension-e8ee103e.js → link-extension-230bae8d.js} +26 -7
  190. package/dist/esm/loader.js +13 -13
  191. package/dist/esm/{month-view-generator-a1a9a4ec.js → month-view-generator-f470caac.js} +1 -1
  192. package/dist/esm/{public-rules-49de79c7.js → public-rules-28ef32d3.js} +9 -9
  193. package/dist/esm/{range-b678c693.js → range-efad2578.js} +1 -1
  194. package/dist/esm/{responsive-format-facade-f19b601c.js → responsive-format-facade-dec87e46.js} +1 -1
  195. package/dist/esm/{rich-text-editor-required-rule-578e0958.js → rich-text-editor-required-rule-a697e5bd.js} +1 -1
  196. package/dist/esm/{split-cell-operation-1c8e7585.js → split-cell-operation-89b91a38.js} +14 -4
  197. package/dist/esm/{state-border-formatter-bfda33aa.js → state-border-formatter-1e900a2f.js} +1 -1
  198. package/dist/esm/{string-format-strategy.abstract-1f4ff1b3.js → string-format-strategy.abstract-d0ce3f65.js} +1 -1
  199. package/dist/esm/{string-input-formatter-slimmer-0006a107.js → string-input-formatter-slimmer-6546cfc7.js} +1 -1
  200. package/dist/esm/{string-mask-strategy-bbbcdbef.js → string-mask-strategy-dd13ae21.js} +2 -2
  201. package/dist/esm/{style-formatter-e9adc8f4.js → style-formatter-057d7120.js} +2 -2
  202. package/dist/esm/{time-required-rule-1ce2d0a0.js → time-required-rule-73753a54.js} +1 -1
  203. package/dist/esm/{token-extension-f2d009e3.js → token-extension-74a0eeb1.js} +2918 -155
  204. package/dist/esm/{translation-slimmer-ee0f0e76.js → translation-slimmer-ef970ffc.js} +1 -1
  205. package/dist/esm/{type-guard-f2624334.js → type-guard-6fc96870.js} +1 -1
  206. package/dist/esm/{valid-credit-card-number-rule-60212b1d.js → valid-credit-card-number-rule-b54a31e7.js} +1 -1
  207. package/dist/esm/vega-accordion.entry.js +6 -6
  208. package/dist/esm/vega-app-footer.entry.js +2 -2
  209. package/dist/esm/vega-app-header-button.entry.js +5 -5
  210. package/dist/esm/vega-box.entry.js +7 -7
  211. package/dist/esm/vega-brand-logo.entry.js +2 -2
  212. package/dist/esm/vega-breadcrumb.entry.js +2 -2
  213. package/dist/esm/vega-button-circle.entry.js +6 -6
  214. package/dist/esm/vega-button-link.entry.js +1 -1
  215. package/dist/esm/vega-button.entry.js +4 -4
  216. package/dist/esm/vega-calendar_5.entry.js +21 -10
  217. package/dist/esm/vega-card.entry.js +5 -5
  218. package/dist/esm/vega-carousel.entry.js +3 -3
  219. package/dist/esm/vega-checkbox_2.entry.js +3 -3
  220. package/dist/esm/vega-chip.entry.js +5 -5
  221. package/dist/esm/vega-code-block.entry.js +11 -11
  222. package/dist/esm/vega-color-picker.entry.js +3 -3
  223. package/dist/esm/vega-color-swatch-picker.entry.js +4 -4
  224. package/dist/esm/vega-color-swatch.entry.js +2 -2
  225. package/dist/esm/vega-combo-box.entry.js +9 -9
  226. package/dist/esm/vega-counter-badge.entry.js +2 -2
  227. package/dist/esm/vega-date-picker_2.entry.js +14 -14
  228. package/dist/esm/vega-dialog_2.entry.js +5 -5
  229. package/dist/esm/vega-divider.entry.js +5 -5
  230. package/dist/esm/vega-dropdown_5.entry.js +23 -14
  231. package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
  232. package/dist/esm/vega-field-label.entry.js +3 -3
  233. package/dist/esm/vega-file-uploader.entry.js +4 -4
  234. package/dist/esm/vega-flag-icon.entry.js +5 -5
  235. package/dist/esm/vega-flex.entry.js +6 -6
  236. package/dist/esm/vega-font.entry.js +5 -5
  237. package/dist/esm/vega-form.entry.js +2 -2
  238. package/dist/esm/vega-grid.entry.js +5 -5
  239. package/dist/esm/vega-icon.entry.js +6 -6
  240. package/dist/esm/vega-image-uploader.entry.js +7 -7
  241. package/dist/esm/vega-input-credit-card.entry.js +7 -7
  242. package/dist/esm/vega-input-numeric.entry.js +6 -6
  243. package/dist/esm/vega-input-passcode.entry.js +6 -6
  244. package/dist/esm/vega-input-phone-number.entry.js +5 -5
  245. package/dist/esm/vega-input-range.entry.js +4 -4
  246. package/dist/esm/vega-input-select.entry.js +6 -6
  247. package/dist/esm/vega-input.entry.js +7 -7
  248. package/dist/esm/vega-left-nav_5.entry.js +10 -10
  249. package/dist/esm/vega-loader-wrapper_2.entry.js +3 -3
  250. package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +2 -2
  251. package/dist/esm/vega-pagination.entry.js +4 -4
  252. package/dist/esm/vega-popover_2.entry.js +8 -8
  253. package/dist/esm/vega-progress-tracker_2.entry.js +3 -3
  254. package/dist/esm/vega-radio_2.entry.js +6 -6
  255. package/dist/esm/vega-rich-text-content.entry.js +39 -11
  256. package/dist/esm/vega-rich-text-editor_4.entry.js +79 -22
  257. package/dist/esm/vega-rich-text-find-replace-panel.entry.js +1 -1
  258. package/dist/esm/vega-rich-text-special-characters-panel.entry.js +5 -5
  259. package/dist/esm/vega-rich-text-table-properties_3.entry.js +10 -10
  260. package/dist/esm/vega-selection-chip_2.entry.js +5 -5
  261. package/dist/esm/vega-selection-tile_2.entry.js +3 -3
  262. package/dist/esm/vega-sidenav_3.entry.js +3 -3
  263. package/dist/esm/vega-signature-capture.entry.js +8 -8
  264. package/dist/esm/vega-stepper.entry.js +3 -3
  265. package/dist/esm/vega-tab-group_2.entry.js +21 -8
  266. package/dist/esm/vega-table_11.entry.js +53 -17
  267. package/dist/esm/vega-textarea.entry.js +3 -3
  268. package/dist/esm/vega-time-picker_2.entry.js +10 -10
  269. package/dist/esm/vega-toggle-switch.entry.js +3 -3
  270. package/dist/esm/vega-tooltip_2.entry.js +6 -6
  271. package/dist/esm/vega.js +13 -13
  272. package/dist/sri/vega-sri-manifest.json +349 -349
  273. package/dist/types/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.d.ts +2 -0
  274. package/dist/types/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.d.ts +1 -0
  275. package/dist/types/components/vega-rich-text-editor/constants/constant.d.ts +16 -0
  276. package/dist/types/components/vega-rich-text-editor/dto/annotations/text-style-default-styles.d.ts +1 -0
  277. package/dist/types/components/vega-rich-text-editor/dto/blocks/block.abstract.d.ts +9 -0
  278. package/dist/types/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy-registry.d.ts +1 -0
  279. package/dist/types/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy.abstract.d.ts +3 -2
  280. package/dist/types/components/vega-rich-text-editor/dto/filter-styles-strategies/text-node/title-heading-node-filter-styles-strategy.d.ts +25 -3
  281. package/dist/types/components/vega-rich-text-editor/dto/renderers/blocks/block-text-nodes-renderer.abstract.d.ts +7 -0
  282. package/dist/types/components/vega-rich-text-editor/dto/renderers/nodes/text-node-renderer.d.ts +11 -0
  283. package/dist/types/components/vega-rich-text-editor/extensions/block-boundary-registry.d.ts +21 -0
  284. package/dist/types/components/vega-rich-text-editor/extensions/extension.abstract.d.ts +15 -0
  285. package/dist/types/components/vega-rich-text-editor/extensions/functions/constants.d.ts +4 -0
  286. package/dist/types/components/vega-rich-text-editor/extensions/functions/dto/function-block.d.ts +7 -0
  287. package/dist/types/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-containing-function-block-strategy.d.ts +8 -0
  288. package/dist/types/components/vega-rich-text-editor/extensions/functions/function-extension.d.ts +6 -0
  289. package/dist/types/components/vega-rich-text-editor/extensions/functions/utils.d.ts +29 -0
  290. package/dist/types/components/vega-rich-text-editor/extensions/paste/action-handler-strategies/image-replace-src-strategy.d.ts +12 -0
  291. package/dist/types/components/vega-rich-text-editor/extensions/paste/actions/image-replace-src-action.d.ts +11 -0
  292. package/dist/types/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/paste-image-parser.d.ts +136 -0
  293. package/dist/types/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/pending-image-registry.d.ts +68 -0
  294. package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-chooser-ui.d.ts +9 -4
  295. package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-extension.d.ts +39 -2
  296. package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/default-paste-strategy.d.ts +29 -0
  297. package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/paste-processing-strategy.abstract.d.ts +61 -0
  298. package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/paste-strategy-selector.d.ts +45 -0
  299. package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/word-paste-strategy.d.ts +186 -0
  300. package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-code-block-transformer.d.ts +51 -0
  301. package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-image-transformer.d.ts +86 -0
  302. package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-list-transformer.d.ts +271 -0
  303. package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-paragraph-transformer.d.ts +25 -0
  304. package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-table-transformer.d.ts +240 -0
  305. package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-transformer.d.ts +36 -0
  306. package/dist/types/components/vega-rich-text-editor/extensions/table/dto/table-block.d.ts +8 -0
  307. package/dist/types/components/vega-rich-text-editor/extensions/tokens/span-to-token-node-strategy.d.ts +2 -2
  308. package/dist/types/components/vega-rich-text-editor/extensions/tokens/token-node.d.ts +19 -1
  309. package/dist/types/components/vega-rich-text-editor/interface.d.ts +10 -0
  310. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/annotation-handler/text-style-annotation-handler.d.ts +4 -1
  311. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/continue-inline-to-rte-text-block-strategy.d.ts +8 -0
  312. package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.d.ts +1 -0
  313. package/dist/types/components/vega-tab-group/slimmers/vega-tab-group/renderers/vega-tab-group-tab-list-renderer.d.ts +1 -0
  314. package/dist/types/components/vega-tab-group/types.d.ts +3 -1
  315. package/dist/types/components/vega-tab-group/vega-tab-group.d.ts +2 -0
  316. package/dist/types/components/vega-table/interface.d.ts +4 -4
  317. package/dist/types/components/vega-table/slimmers/controllers/vega-table-body-col-span-controller.d.ts +16 -0
  318. package/dist/types/components/vega-table/slimmers/renderers/vega-table-body-col-span-resolver.d.ts +8 -10
  319. package/dist/types/helpers/translation/interface.d.ts +3 -1
  320. package/dist/types/types/public-api.d.ts +1 -0
  321. package/dist/types/utils/sanitize/index.d.ts +3 -2
  322. package/dist/types/utils/sanitize/strategies/index.d.ts +1 -0
  323. package/dist/types/utils/sanitize/strategies/label-sanitize-strategy.d.ts +9 -0
  324. package/dist/types/utils/sanitize/strategies/plain-text-sanitize-strategy.d.ts +36 -0
  325. package/dist/vega/index.esm.js +1 -1
  326. package/dist/vega/{p-0cbf09f7.entry.js → p-024db952.entry.js} +1 -1
  327. package/dist/vega/p-0b2c4c0b.js +1 -0
  328. package/dist/vega/{p-c2277448.entry.js → p-0ca3b4bf.entry.js} +1 -1
  329. package/dist/vega/{p-6f537797.entry.js → p-1a37d63c.entry.js} +1 -1
  330. package/dist/vega/{p-b622c455.js → p-1fa22fda.js} +1 -1
  331. package/dist/vega/{p-d609c3fd.js → p-2044eba9.js} +1 -1
  332. package/dist/vega/{p-56db3323.js → p-22edd3cc.js} +1 -1
  333. package/dist/vega/{p-5f96e741.entry.js → p-23c1f378.entry.js} +1 -1
  334. package/dist/vega/{p-6c95a6a3.js → p-2529820e.js} +1 -1
  335. package/dist/vega/{p-8d96f0e8.entry.js → p-2af1d8b8.entry.js} +1 -1
  336. package/dist/vega/{p-17c69503.entry.js → p-2f89ee14.entry.js} +1 -1
  337. package/dist/vega/{p-2bb5a232.js → p-3091b105.js} +1 -1
  338. package/dist/vega/{p-52c69f9e.entry.js → p-328ebbdb.entry.js} +1 -1
  339. package/dist/vega/p-35628af4.js +1 -0
  340. package/dist/vega/{p-9abf7d0a.entry.js → p-35d37477.entry.js} +1 -1
  341. package/dist/vega/{p-8c56d74d.entry.js → p-3a230d4b.entry.js} +1 -1
  342. package/dist/vega/{p-4bfe3258.entry.js → p-3c152bad.entry.js} +1 -1
  343. package/dist/vega/p-3c559c8b.js +1 -0
  344. package/dist/vega/{p-d470fce2.entry.js → p-3c8421d5.entry.js} +1 -1
  345. package/dist/vega/{p-7dcd2850.entry.js → p-4022412e.entry.js} +1 -1
  346. package/dist/vega/{p-c70748f7.entry.js → p-433b1395.entry.js} +1 -1
  347. package/dist/vega/{p-b98ead05.entry.js → p-4370b954.entry.js} +1 -1
  348. package/dist/vega/p-444e24c6.js +1 -0
  349. package/dist/vega/p-4473d8b1.js +3 -0
  350. package/dist/vega/{p-a484e32d.entry.js → p-44999c88.entry.js} +1 -1
  351. package/dist/vega/{p-f29ea345.entry.js → p-47a48329.entry.js} +1 -1
  352. package/dist/vega/{p-0cf3b5c1.entry.js → p-49d7cfed.entry.js} +1 -1
  353. package/dist/vega/{p-92528dc9.entry.js → p-4afd6715.entry.js} +1 -1
  354. package/dist/vega/{p-461100b8.entry.js → p-4f6aaac5.entry.js} +1 -1
  355. package/dist/vega/p-50eda925.js +1 -0
  356. package/dist/vega/{p-ae2abdfa.js → p-5110c84f.js} +1 -1
  357. package/dist/vega/{p-2a245138.entry.js → p-5147c30d.entry.js} +1 -1
  358. package/dist/vega/{p-874e5624.js → p-52878ea9.js} +1 -1
  359. package/dist/vega/{p-b00ec194.entry.js → p-55dc3053.entry.js} +1 -1
  360. package/dist/vega/p-5af312f8.js +1 -0
  361. package/dist/vega/{p-3e09aeed.js → p-5b3c8a56.js} +1 -1
  362. package/dist/vega/{p-2acf9b42.entry.js → p-5e9e04f3.entry.js} +1 -1
  363. package/dist/vega/p-5f377954.js +1 -1
  364. package/dist/vega/p-6493f13a.entry.js +1 -0
  365. package/dist/vega/{p-56598858.entry.js → p-6659c910.entry.js} +1 -1
  366. package/dist/vega/{p-95c18f79.entry.js → p-66728dd4.entry.js} +1 -1
  367. package/dist/vega/{p-4cbfc01e.entry.js → p-66a785d0.entry.js} +1 -1
  368. package/dist/vega/{p-36d9e782.entry.js → p-66fe8b4e.entry.js} +1 -1
  369. package/dist/vega/p-67e88cd7.entry.js +1 -0
  370. package/dist/vega/{p-456f678b.js → p-691bdc20.js} +1 -1
  371. package/dist/vega/{p-94975537.entry.js → p-6d6b4495.entry.js} +1 -1
  372. package/dist/vega/p-7754b10f.entry.js +1 -0
  373. package/dist/vega/{p-085d1647.entry.js → p-77fb3971.entry.js} +1 -1
  374. package/dist/vega/{p-544ce391.entry.js → p-7977352b.entry.js} +1 -1
  375. package/dist/vega/{p-a91927eb.entry.js → p-7b133734.entry.js} +1 -1
  376. package/dist/vega/p-7b84a943.entry.js +1 -0
  377. package/dist/vega/{p-02d3ce79.entry.js → p-840444c9.entry.js} +1 -1
  378. package/dist/vega/{p-3737b9e2.entry.js → p-860e76f5.entry.js} +1 -1
  379. package/dist/vega/{p-72fd17a1.entry.js → p-867cc602.entry.js} +1 -1
  380. package/dist/vega/p-8d2a9012.js +1 -0
  381. package/dist/vega/{p-7e8fdac4.js → p-8d4be607.js} +1 -1
  382. package/dist/vega/p-8d77c7cf.js +1 -0
  383. package/dist/vega/{p-4fd0cf01.js → p-8f3b93db.js} +1 -1
  384. package/dist/vega/{p-56417ec5.entry.js → p-944e284d.entry.js} +1 -1
  385. package/dist/vega/{p-6fd4f2c6.js → p-94b54a95.js} +1 -1
  386. package/dist/vega/p-9c2b3279.js +1 -0
  387. package/dist/vega/{p-ca3c1317.entry.js → p-9c5289dc.entry.js} +1 -1
  388. package/dist/vega/{p-810c9c29.js → p-9c9b0629.js} +1 -1
  389. package/dist/vega/{p-585e4f1c.entry.js → p-9c9ff871.entry.js} +1 -1
  390. package/dist/vega/{p-2f07d719.entry.js → p-9d90e271.entry.js} +1 -1
  391. package/dist/vega/{p-d319ebb5.js → p-9e9f49f4.js} +1 -1
  392. package/dist/vega/{p-dcd3e3a7.js → p-a1f220ca.js} +1 -1
  393. package/dist/vega/{p-035e2f05.entry.js → p-a4360b7e.entry.js} +1 -1
  394. package/dist/vega/{p-6d4518d7.entry.js → p-a7517760.entry.js} +1 -1
  395. package/dist/vega/{p-c5fb8a69.entry.js → p-aa433430.entry.js} +1 -1
  396. package/dist/vega/{p-1cff027b.entry.js → p-aa914dbd.entry.js} +1 -1
  397. package/dist/vega/{p-72ab5cd5.entry.js → p-b12de1bf.entry.js} +1 -1
  398. package/dist/vega/p-b21cc390.entry.js +1 -0
  399. package/dist/vega/{p-dbb4b1d1.js → p-b3c4943b.js} +1 -1
  400. package/dist/vega/{p-1aedbfd2.entry.js → p-ba6881da.entry.js} +1 -1
  401. package/dist/vega/{p-9834d5d4.entry.js → p-bd7725f7.entry.js} +1 -1
  402. package/dist/vega/{p-a090b2be.js → p-c348eaf5.js} +1 -1
  403. package/dist/vega/{p-ccbe3f1b.entry.js → p-c8ad7207.entry.js} +1 -1
  404. package/dist/vega/{p-b3733762.entry.js → p-c8fb3aac.entry.js} +1 -1
  405. package/dist/vega/p-cc569b54.js +1 -0
  406. package/dist/vega/{p-c98c2f5f.entry.js → p-ccbed811.entry.js} +1 -1
  407. package/dist/vega/{p-da867019.entry.js → p-ce82d6bb.entry.js} +1 -1
  408. package/dist/vega/{p-a81ad3bd.js → p-cede3535.js} +1 -1
  409. package/dist/vega/p-d35a31a5.entry.js +1 -0
  410. package/dist/vega/{p-ac94ba1b.entry.js → p-d4d90ce2.entry.js} +1 -1
  411. package/dist/vega/{p-cb81126a.entry.js → p-d6023dc0.entry.js} +1 -1
  412. package/dist/vega/{p-a8174ad8.entry.js → p-d62e618a.entry.js} +1 -1
  413. package/dist/vega/{p-1ea9ad9a.js → p-dd0bd78b.js} +1 -1
  414. package/dist/vega/{p-36d2df7a.entry.js → p-ded1ecc1.entry.js} +1 -1
  415. package/dist/vega/p-df63c2fb.entry.js +1 -0
  416. package/dist/vega/{p-c6d775b8.entry.js → p-e1a65e06.entry.js} +1 -1
  417. package/dist/vega/{p-39c5054b.js → p-e1c82ca9.js} +1 -1
  418. package/dist/vega/{p-f6c0e9e7.entry.js → p-e469ba27.entry.js} +1 -1
  419. package/dist/vega/{p-373541fa.js → p-e4c5cb4f.js} +1 -1
  420. package/dist/vega/{p-ec64cc59.entry.js → p-f0a0fc77.entry.js} +1 -1
  421. package/dist/vega/{p-12e8a1b2.js → p-f13b39d8.js} +1 -1
  422. package/dist/vega/{p-4e065ef7.entry.js → p-f2384411.entry.js} +1 -1
  423. package/dist/vega/{p-8d2501b2.js → p-f9a3805d.js} +1 -1
  424. package/dist/vega/{p-1e0a8fd3.js → p-fa5cd8b1.js} +1 -1
  425. package/dist/vega/{p-2c2e8615.js → p-fcb6b499.js} +1 -1
  426. package/dist/vega/vega.esm.js +1 -1
  427. package/package.json +1 -1
  428. package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-constants.js +0 -6
  429. package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-constants.d.ts +0 -6
  430. package/dist/vega/p-03eeadc1.entry.js +0 -1
  431. package/dist/vega/p-0eb29065.js +0 -3
  432. package/dist/vega/p-10d30c03.js +0 -1
  433. package/dist/vega/p-1250b1ab.entry.js +0 -1
  434. package/dist/vega/p-1abd3c17.js +0 -1
  435. package/dist/vega/p-2d158cbd.js +0 -1
  436. package/dist/vega/p-3d0b4074.js +0 -1
  437. package/dist/vega/p-56493601.js +0 -1
  438. package/dist/vega/p-571ec00b.js +0 -1
  439. package/dist/vega/p-5b1f5e4a.entry.js +0 -1
  440. package/dist/vega/p-6234852e.entry.js +0 -1
  441. package/dist/vega/p-781b7a54.js +0 -1
  442. package/dist/vega/p-cd69aeae.js +0 -1
  443. package/dist/vega/p-cfe268a8.entry.js +0 -1
  444. package/dist/vega/p-de8f0d98.js +0 -1
  445. package/dist/vega/p-f0e828d8.js +0 -1
  446. package/dist/vega/p-f62c5a20.entry.js +0 -1
  447. package/dist/vega/p-fa65956c.entry.js +0 -1
@@ -0,0 +1,416 @@
1
+ import { StylePreservator } from '../../../../../helpers/csp/styles-preservator';
2
+ import { AbstractPasteProcessingStrategy, RTEPasteMode, PasteProcessingStrategyPriority, } from './paste-processing-strategy.abstract';
3
+ import { WORD_SANITIZE_ALL_TAGS_KEY, } from '../word-paste-transformers/word-structure-transformer';
4
+ import { WordParagraphRoleTransformer } from '../word-paste-transformers/word-structure-paragraph-transformer';
5
+ import { WordListRoleTransformer } from '../word-paste-transformers/word-structure-list-transformer';
6
+ import { WordImageTransformer } from '../word-paste-transformers/word-structure-image-transformer';
7
+ import { WordTableTransformer } from '../word-paste-transformers/word-structure-table-transformer';
8
+ import { WordCodeBlockTransformer } from '../word-paste-transformers/word-structure-code-block-transformer';
9
+ /**
10
+ * Default Word transformers. Sanitizer allowlist is aggregated from these
11
+ * transformer contracts so adding a new transformer automatically extends the
12
+ * allowlist surface.
13
+ */
14
+ export const WORD_STRUCTURE_TRANSFORMERS = [
15
+ new WordTableTransformer(),
16
+ new WordListRoleTransformer(),
17
+ new WordImageTransformer(),
18
+ new WordCodeBlockTransformer(),
19
+ new WordParagraphRoleTransformer(),
20
+ ];
21
+ /**
22
+ * Aggregates the sanitizer allowlist from each transformer's declared contract
23
+ * (tags, attributes, style prefixes), removing duplicates and normalizing case
24
+ * so the strategy allowlist can never drift from the transformers that depend on
25
+ * it.
26
+ *
27
+ * @param {WordStructureTransformer[]} transformers Registered structure transformers.
28
+ * @returns {WordSanitizeConfig} Combined sanitizer configuration.
29
+ */
30
+ function buildWordSanitizeConfig(transformers) {
31
+ const tags = new Set();
32
+ const stylePrefixes = new Set();
33
+ const attributesMap = new Map();
34
+ transformers.forEach((transformer) => {
35
+ transformer.getAllowedTags().forEach((tag) => {
36
+ tags.add(tag.toUpperCase());
37
+ });
38
+ transformer.getAllowedStyles().forEach((prefix) => {
39
+ stylePrefixes.add(prefix.toLowerCase());
40
+ });
41
+ transformer.getAllowedAttributes().forEach((attrs, tagName) => {
42
+ const normalizedTagName = tagName === WORD_SANITIZE_ALL_TAGS_KEY ? tagName : tagName.toUpperCase();
43
+ if (!attributesMap.has(normalizedTagName)) {
44
+ attributesMap.set(normalizedTagName, new Set());
45
+ }
46
+ const attrSet = attributesMap.get(normalizedTagName);
47
+ attrs.forEach((attr) => {
48
+ attrSet.add(attr.toLowerCase());
49
+ });
50
+ });
51
+ });
52
+ const allowedAttributes = {};
53
+ attributesMap.forEach((attrs, tagName) => {
54
+ allowedAttributes[tagName] = Array.from(attrs);
55
+ });
56
+ return {
57
+ allowedTags: Array.from(tags),
58
+ allowedAttributes,
59
+ allowedStylePrefixes: Array.from(stylePrefixes),
60
+ };
61
+ }
62
+ /**
63
+ * Default sanitizer allowlist aggregated from
64
+ * {@link WORD_STRUCTURE_TRANSFORMERS}. Exported so tests and callers can still
65
+ * provide stable overrides.
66
+ */
67
+ export const WORD_SANITIZE_CONFIG = buildWordSanitizeConfig(WORD_STRUCTURE_TRANSFORMERS);
68
+ /**
69
+ * Attribute name that carries inline styles after {@link StylePreservator} has
70
+ * renamed `style` to `data-style`. All sanitization runs against this name so
71
+ * the styles survive the CSP-sensitive `DOMParser` boundary.
72
+ */
73
+ const PRESERVED_STYLE_ATTR = 'data-style';
74
+ /**
75
+ * Block tag that can represent an intentional blank line pasted from Word
76
+ * (an "empty" paragraph whose only content is a non-breaking space). Headings
77
+ * are excluded — an empty heading is treated as noise, not an intentional
78
+ * blank line.
79
+ */
80
+ const BLANK_LINE_ELIGIBLE_TAGS = 'p';
81
+ /**
82
+ * Zero-width space used to keep an intentional blank line alive. Unlike a
83
+ * non-breaking space, it is not stripped by `String.prototype.trim()`, so the
84
+ * downstream empty-block removal keeps the paragraph while it still renders as
85
+ * blank.
86
+ */
87
+ const ZERO_WIDTH_SPACE = '\u200B';
88
+ /**
89
+ * Style values the RTE cannot resolve, so any declaration whose value contains
90
+ * one of them is dropped during sanitization. These ride on allowed properties
91
+ * (`color`, `border`, `background`, …), so the prefix allowlist alone cannot
92
+ * remove them. Add legacy Word keywords here to filter them everywhere.
93
+ */
94
+ // eslint-disable-next-line spellcheck/spell-checker
95
+ const INVALID_STYLE_VALUES = ['windowtext'];
96
+ /**
97
+ * Pre processes raw Word/Office clipboard HTML into clean, RTE-friendly HTML.
98
+ *
99
+ * The pipeline mirrors the two-phase design of the source Word cleaner:
100
+ * 1. Structure fixing — maps Word paragraph styles onto RTE text styles and
101
+ * drops Word list marker artifacts.
102
+ * 2. Dynamic allowlist sanitizing — recursively strips disallowed tags,
103
+ * attributes and inline style declarations while keeping inner content.
104
+ */
105
+ export class WordPasteProcessingStrategy extends AbstractPasteProcessingStrategy {
106
+ /**
107
+ * Downstream paste mode marker for Word-specific processing.
108
+ *
109
+ * @returns {RTEPasteMode} `word` so downstream handlers preserve Word annotations.
110
+ */
111
+ get type() {
112
+ return RTEPasteMode.WORD;
113
+ }
114
+ /**
115
+ * Detects whether raw clipboard HTML originated from Microsoft Word / Office.
116
+ *
117
+ * Used to auto-route a normal "rich text" paste through the Word cleaning
118
+ * pipeline when the source is actually Word, so users get correct formatting
119
+ * without having to explicitly pick the Word paste option.
120
+ *
121
+ * @param {string} html Raw `text/html` clipboard payload.
122
+ * @returns {boolean} `true` when the HTML carries Word/Office signatures.
123
+ */
124
+ canHandle(html) {
125
+ if (!html) {
126
+ return false;
127
+ }
128
+ return WordPasteProcessingStrategy.WORD_SIGNATURE_PATTERNS.some((pattern) => pattern.test(html));
129
+ }
130
+ /**
131
+ * Returns the priority of this strategy relative to others; higher values run first.
132
+ *
133
+ * @returns {number} The priority value.
134
+ */
135
+ get priority() {
136
+ return PasteProcessingStrategyPriority.WORD;
137
+ }
138
+ /**
139
+ * Whether this strategy extracts pasted images and produces local previews.
140
+ *
141
+ * @returns {boolean} Always `true`; Word paste swaps `file://` images to previews.
142
+ */
143
+ get supportsImageProcessing() {
144
+ return true;
145
+ }
146
+ /**
147
+ * Cleans raw Word clipboard HTML so it can flow through the normal RTE paste
148
+ * pipeline.
149
+ *
150
+ * @param {string} html Raw `text/html` clipboard payload from Word.
151
+ * @param {WordSanitizeConfig} [config] Optional allowlist override.
152
+ * @returns {string} Sanitized HTML string.
153
+ */
154
+ process(html, config = WORD_SANITIZE_CONFIG) {
155
+ if (!html) {
156
+ return '';
157
+ }
158
+ const withoutComments = this.stripWordComments(html);
159
+ // Preserve inline styles across the DOMParser boundary to avoid
160
+ // style-src-attr CSP violations (styles become data-style attributes).
161
+ const preservedHtml = StylePreservator.preserve(withoutComments).getProcessedHtml();
162
+ const parsedDoc = new DOMParser().parseFromString(preservedHtml, 'text/html');
163
+ const container = parsedDoc.body;
164
+ this.fixWordStructure(container);
165
+ // Sanitize each top-level child instead of the <body> itself so the body
166
+ // container is never unwrapped away.
167
+ Array.from(container.childNodes).forEach((child) => {
168
+ this.sanitizeNode(child, config);
169
+ });
170
+ // Collapse the source line wraps Word inserts inside text so a single
171
+ // logical line does not paste as multiple lines.
172
+ this.collapseInsignificantWhitespace(container);
173
+ // Drop the whitespace Word inserts directly between block elements so it
174
+ // does not paste as empty lines.
175
+ this.removeInterBlockWhitespace(container);
176
+ // Keep intentional blank lines (Word empty paragraphs) from being dropped by
177
+ // the downstream empty-block removal.
178
+ this.preserveWordEmptyLines(container);
179
+ return this.restoreStyleAttributeName(container.innerHTML);
180
+ }
181
+ /**
182
+ * Removes Office XML comments and down-level conditional markup that would
183
+ * otherwise confuse `DOMParser`.
184
+ *
185
+ * @param {string} html Raw HTML string.
186
+ * @returns {string} HTML without Word comment blocks.
187
+ */
188
+ stripWordComments(html) {
189
+ return html.replace(/<!--[\s\S]*?-->/g, '').replace(/<!\[[\s\S]*?\]>/g, '');
190
+ }
191
+ /**
192
+ * First phase: repairs Word-specific structure so it aligns with RTE text
193
+ * styles before the allowlist pass runs.
194
+ *
195
+ * @param {HTMLElement} root Parsed body element.
196
+ */
197
+ fixWordStructure(root) {
198
+ WordPasteProcessingStrategy.STRUCTURE_TRANSFORMERS.forEach((transformer) => {
199
+ transformer.apply(root);
200
+ });
201
+ }
202
+ /**
203
+ * Removes the whitespace-only text nodes Word emits directly between block
204
+ * elements (the `\n\n` at the top level of the fragment). After the allowlist
205
+ * pass, disallowed containers are already unwrapped, so any remaining
206
+ * top-level text node that is pure whitespace is an inter-block artifact.
207
+ * Whitespace inside inline/text elements is left untouched.
208
+ *
209
+ * @param {HTMLElement} root Parsed body element.
210
+ */
211
+ removeInterBlockWhitespace(root) {
212
+ Array.from(root.childNodes).forEach((node) => {
213
+ if (node.nodeType === Node.TEXT_NODE && node.textContent.trim() === '') {
214
+ root.removeChild(node);
215
+ }
216
+ });
217
+ }
218
+ /**
219
+ * Collapses insignificant ASCII whitespace inside text nodes the way a
220
+ * browser would when rendering. Word wraps long runs of text across multiple
221
+ * source lines, so a single logical line such as "Number list 1" arrives as
222
+ * "Number\nlist 1"; without normalization the newline surfaces as a spurious
223
+ * line break in the editor. Non-breaking spaces (`\u00A0`) are left untouched
224
+ * so intentional Word spacing and blank lines survive.
225
+ *
226
+ * @param {Node} node Node whose text descendants are normalized in place.
227
+ */
228
+ collapseInsignificantWhitespace(node) {
229
+ // Code blocks preserve their original whitespace, so skip the whole subtree.
230
+ if (WordCodeBlockTransformer.isCodeBlock(node)) {
231
+ return;
232
+ }
233
+ if (node.nodeType === Node.TEXT_NODE) {
234
+ const original = node.textContent;
235
+ const collapsed = original.replace(/[ \t\r\n\f]+/g, ' ');
236
+ if (collapsed !== original) {
237
+ node.textContent = collapsed;
238
+ }
239
+ return;
240
+ }
241
+ Array.from(node.childNodes).forEach((child) => {
242
+ this.collapseInsignificantWhitespace(child);
243
+ });
244
+ }
245
+ /**
246
+ * Preserves intentional blank lines authored in Word (empty paragraphs whose
247
+ * only content is a non-breaking space). The downstream paste pipeline drops
248
+ * any block whose text content trims to empty, and `trim()` also removes a
249
+ * non-breaking space; replacing the content with a zero-width space keeps the
250
+ * blank line because it survives `trim()` while still rendering as empty.
251
+ *
252
+ * @param {HTMLElement} root Parsed body element.
253
+ */
254
+ preserveWordEmptyLines(root) {
255
+ Array.from(root.querySelectorAll(BLANK_LINE_ELIGIBLE_TAGS)).forEach((block) => {
256
+ // Word paragraphs that host an image also carry a trailing
257
+ // `<o:p>&nbsp;</o:p>` whose non-breaking space would misidentify the
258
+ // paragraph as an empty line and wipe the image out.
259
+ if (block.querySelector('img')) {
260
+ return;
261
+ }
262
+ const text = block.textContent;
263
+ const hasRealText = text.replace(/[\s\u200B]+/g, '') !== '';
264
+ // Only an "empty" block that carries a non-breaking space is treated as
265
+ // an intentional Word blank line.
266
+ if (!hasRealText && /\u00A0/.test(text)) {
267
+ block.textContent = ZERO_WIDTH_SPACE;
268
+ }
269
+ });
270
+ }
271
+ /**
272
+ * Second phase: recursively enforces the dynamic allowlist on a node tree.
273
+ *
274
+ * @param {Node} node Node to sanitize in place.
275
+ * @param {WordSanitizeConfig} config Active allowlist configuration.
276
+ */
277
+ sanitizeNode(node, config) {
278
+ if (node.nodeType === Node.TEXT_NODE) {
279
+ return;
280
+ }
281
+ if (node.nodeType !== Node.ELEMENT_NODE) {
282
+ this.removeSelf(node);
283
+ return;
284
+ }
285
+ const element = node;
286
+ const tagName = element.tagName.toUpperCase();
287
+ // Sanitize children first (reverse order keeps indices stable while nodes
288
+ // may be removed or unwrapped).
289
+ const children = Array.from(element.childNodes);
290
+ for (let i = children.length - 1; i >= 0; i--) {
291
+ this.sanitizeNode(children[i], config);
292
+ }
293
+ // Tag-level filter: unwrap disallowed elements but keep their content.
294
+ if (!config.allowedTags.includes(tagName)) {
295
+ while (element.firstChild) {
296
+ if (element.parentNode && typeof element.parentNode.insertBefore === 'function') {
297
+ element.parentNode.insertBefore(element.firstChild, element);
298
+ }
299
+ }
300
+ this.removeSelf(element);
301
+ return;
302
+ }
303
+ this.sanitizeAttributes(element, tagName, config);
304
+ }
305
+ /**
306
+ * Removes disallowed attributes and filters style declarations.
307
+ *
308
+ * @param {Element} element Element being sanitized.
309
+ * @param {string} tagName Upper-case tag name.
310
+ * @param {WordSanitizeConfig} config Active sanitize configuration.
311
+ */
312
+ sanitizeAttributes(element, tagName, config) {
313
+ const commonAttrs = config.allowedAttributes[WORD_SANITIZE_ALL_TAGS_KEY] || [];
314
+ const tagAttrs = config.allowedAttributes[tagName] || [];
315
+ const allowedAttrs = new Set([...commonAttrs, ...tagAttrs]);
316
+ Array.from(element.attributes).forEach((attr) => {
317
+ const attrName = attr.name.toLowerCase();
318
+ const isStyle = attrName === PRESERVED_STYLE_ATTR;
319
+ const normalizedName = isStyle ? 'style' : attrName;
320
+ if (!allowedAttrs.has(normalizedName)) {
321
+ element.removeAttribute(attr.name);
322
+ return;
323
+ }
324
+ if (isStyle) {
325
+ this.sanitizeStyleAttribute(element, attr.name, config);
326
+ }
327
+ });
328
+ }
329
+ /**
330
+ * Filters CSS declarations inside a preserved style attribute: keeps only
331
+ * properties matching a prefix in {@link WordSanitizeConfig.allowedStylePrefixes};
332
+ * all others (including `mso-*` Word artifacts) are stripped.
333
+ *
334
+ * @param {Element} element Element owning the style attribute.
335
+ * @param {string} attrName Preserved style attribute name.
336
+ * @param {WordSanitizeConfig} config Active sanitize configuration.
337
+ */
338
+ sanitizeStyleAttribute(element, attrName, config) {
339
+ const rawStyle = element.getAttribute(attrName) || '';
340
+ // Delegate CSS parsing to the browser engine via a temporary element so
341
+ // that edge cases (values containing semicolons, multi-value shorthand,
342
+ // etc.) are handled correctly without a hand-rolled parser.
343
+ const tempEl = element.ownerDocument.createElement('span');
344
+ tempEl.setAttribute('style', rawStyle);
345
+ const parsedStyle = tempEl.style;
346
+ const cleanDeclarations = [];
347
+ for (let i = 0; i < parsedStyle.length; i++) {
348
+ const key = parsedStyle[i];
349
+ // Keep only properties whose name starts with an allowed prefix.
350
+ const isAllowed = config.allowedStylePrefixes.some((prefix) => key === prefix || key.startsWith(`${prefix}-`));
351
+ const value = parsedStyle.getPropertyValue(key);
352
+ // Drop declarations carrying a value the RTE cannot resolve (e.g. Word's
353
+ // legacy `windowText` system color), even on otherwise allowed properties.
354
+ const lowerCaseValue = value.toLowerCase();
355
+ const hasInvalidValue = INVALID_STYLE_VALUES.some((invalid) => lowerCaseValue.includes(invalid));
356
+ if (isAllowed && !hasInvalidValue) {
357
+ cleanDeclarations.push(`${key}: ${value}`);
358
+ }
359
+ }
360
+ const cleanStyle = cleanDeclarations.join('; ');
361
+ if (cleanStyle) {
362
+ element.setAttribute(attrName, cleanStyle);
363
+ }
364
+ else {
365
+ element.removeAttribute(attrName);
366
+ }
367
+ }
368
+ /**
369
+ * Converts preserved `data-style` attributes back to `style` in the final
370
+ * HTML string so downstream paste handling receives standard markup.
371
+ *
372
+ * @param {string} html Serialized sanitized HTML.
373
+ * @returns {string} HTML with `style` attributes restored.
374
+ */
375
+ restoreStyleAttributeName(html) {
376
+ return html.replace(/\sdata-style=/g, ' style=');
377
+ }
378
+ /**
379
+ * Removes the element from its parent node if it has one.
380
+ *
381
+ * @param {Node | Element} elementToBeRemoved The element to be removed from the DOM.
382
+ */
383
+ removeSelf(elementToBeRemoved) {
384
+ if (elementToBeRemoved.parentNode &&
385
+ typeof elementToBeRemoved.parentNode.removeChild === 'function') {
386
+ elementToBeRemoved.parentNode.removeChild(elementToBeRemoved);
387
+ }
388
+ }
389
+ }
390
+ /**
391
+ * Ordered list of structure transformers applied in Phase 1 before allowlist
392
+ * sanitization. To add support for a new node type (table, image, list…),
393
+ * create a class that implements {@link WordStructureTransformer} and append
394
+ * it here — no other changes to the pipeline are needed.
395
+ */
396
+ WordPasteProcessingStrategy.STRUCTURE_TRANSFORMERS = [
397
+ ...WORD_STRUCTURE_TRANSFORMERS,
398
+ ];
399
+ /**
400
+ * Signatures that identify clipboard HTML produced by Microsoft Word / Office.
401
+ * Any single match is enough to treat the payload as Word content because
402
+ * these markers do not appear in ordinary web or plain rich-text clipboards.
403
+ */
404
+ WordPasteProcessingStrategy.WORD_SIGNATURE_PATTERNS = [
405
+ // <meta name=Generator content="Microsoft Word ...">
406
+ /content=["']?Microsoft\s+Word/i,
407
+ // eslint-disable-next-line spellcheck/spell-checker
408
+ // Office namespace declarations (urn:schemas-microsoft-com:office:word).
409
+ /urn:schemas-microsoft-com:office/i,
410
+ // Word paragraph/character style classes (MsoNormal, MsoTitle, MsoListParagraph…).
411
+ /class=["']?Mso[A-Za-z]/i,
412
+ // Word-only inline style properties.
413
+ /mso-[a-z-]+\s*:/i,
414
+ // Office XML paragraph marker elements (<o:p></o:p>).
415
+ /<\/?o:p>/i,
416
+ ];
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Attribute that the RTE code-block parser uses to recognize code content.
3
+ */
4
+ const CODE_LANGUAGE_ATTR = 'data-language';
5
+ /**
6
+ * Default language applied when pasted code has no language metadata.
7
+ */
8
+ const DEFAULT_CODE_LANGUAGE = 'plainText';
9
+ /**
10
+ * Matches language hints encoded as CSS classes (for example `language-js`).
11
+ */
12
+ const LANGUAGE_CLASS_PATTERN = /(?:^|\s)(?:language|lang)-([a-z0-9+_.-]+)(?:\s|$)/i;
13
+ /**
14
+ * Removes Word-only class artifacts from code elements while preserving other
15
+ * classes. Kept as defense-in-depth: even though the shared sanitizer allowlist
16
+ * generally strips `Mso*` classes, this transformer normalizes the `<pre>`
17
+ * class list before language resolution so a stray `MsoPlainText` can never
18
+ * leak into `LANGUAGE_CLASS_PATTERN` matching.
19
+ */
20
+ const WORD_CLASS_NAME_PATTERN = /^mso[a-z0-9_-]*$/i;
21
+ /**
22
+ * Normalizes pasted `<pre>` nodes so they can be parsed as RTE code blocks.
23
+ *
24
+ * The RTE recognizes a code block only when `data-language` is present on
25
+ * `<pre>`. Word-exported snippets commonly use plain `<pre>` with no
26
+ * language metadata, so this transformer adds a default language and copies any
27
+ * detectable language hint from nested code markup when available.
28
+ */
29
+ export class WordCodeBlockTransformer {
30
+ /**
31
+ * Determines whether a node is a code block whose whitespace must be preserved.
32
+ *
33
+ * @param {Node} node Node to inspect.
34
+ * @returns {boolean} `true` when the node is a `<pre>` element.
35
+ */
36
+ static isCodeBlock(node) {
37
+ return node.nodeType === Node.ELEMENT_NODE && node.tagName.toUpperCase() === 'PRE';
38
+ }
39
+ /** @inheritDoc */
40
+ apply(root) {
41
+ Array.from(root.querySelectorAll('pre')).forEach((preElement) => {
42
+ this.stripWordClassArtifacts(preElement);
43
+ if (!preElement.hasAttribute(CODE_LANGUAGE_ATTR)) {
44
+ preElement.setAttribute(CODE_LANGUAGE_ATTR, this.resolveLanguage(preElement));
45
+ }
46
+ });
47
+ }
48
+ /** @inheritDoc */
49
+ getAllowedTags() {
50
+ return ['PRE'];
51
+ }
52
+ /** @inheritDoc */
53
+ getAllowedAttributes() {
54
+ return new Map([['PRE', [CODE_LANGUAGE_ATTR]]]);
55
+ }
56
+ /** @inheritDoc */
57
+ getAllowedStyles() {
58
+ return [];
59
+ }
60
+ /**
61
+ * Resolves code language metadata from `<pre>` class hints, falling back to
62
+ * {@link DEFAULT_CODE_LANGUAGE}.
63
+ *
64
+ * `apply()` only invokes this method when the `<pre>` has no
65
+ * `data-language` attribute, so class-based inference is the only source
66
+ * this method needs to consult.
67
+ *
68
+ * @param {HTMLElement} preElement Source `<pre>` element.
69
+ * @returns {string} Resolved language id or `plainText` fallback.
70
+ */
71
+ resolveLanguage(preElement) {
72
+ const classLanguage = this.resolveLanguageFromClassName(preElement).trim();
73
+ return classLanguage !== '' ? classLanguage : DEFAULT_CODE_LANGUAGE;
74
+ }
75
+ /**
76
+ * Extracts a language id from class names like `language-js` or `lang-ts`.
77
+ *
78
+ * @param {HTMLElement} preElement Source `<pre>` element.
79
+ * @returns {string} Extracted language id or empty string.
80
+ */
81
+ resolveLanguageFromClassName(preElement) {
82
+ const className = preElement.getAttribute('class') || '';
83
+ const match = LANGUAGE_CLASS_PATTERN.exec(className);
84
+ return match ? match[1] : '';
85
+ }
86
+ /**
87
+ * Removes Word-only `Mso*` class names and keeps any non-Word classes.
88
+ *
89
+ * @param {HTMLElement} preElement Source `<pre>` element.
90
+ */
91
+ stripWordClassArtifacts(preElement) {
92
+ const className = preElement.getAttribute('class') || '';
93
+ if (!className) {
94
+ return;
95
+ }
96
+ const filteredClasses = className
97
+ .split(/\s+/)
98
+ .map((name) => name.trim())
99
+ .filter((name) => name !== '' && !WORD_CLASS_NAME_PATTERN.test(name));
100
+ if (filteredClasses.length === 0) {
101
+ preElement.removeAttribute('class');
102
+ return;
103
+ }
104
+ preElement.setAttribute('class', filteredClasses.join(' '));
105
+ }
106
+ }