@globalpayments/vega 2.73.0 → 2.75.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/dist/cjs/{app-globals-cc162173.js → app-globals-35614ce8.js} +8 -8
  2. package/dist/cjs/{child-nodes-event-prevent-slimmer-536d29fc.js → child-nodes-event-prevent-slimmer-aca87dac.js} +1 -1
  3. package/dist/cjs/click-outside-only-to-dismiss-strategy-407f6d1e.js +32 -0
  4. package/dist/cjs/{code-block-823cd481.js → code-block-c1d2e6a8.js} +3 -3
  5. package/dist/cjs/{component-value-history-controller-slimmer.abstract-e2e0c6f3.js → component-value-history-controller-slimmer.abstract-787c67dc.js} +4 -4
  6. package/dist/cjs/{date-required-rule-99cca681.js → date-required-rule-30ee62d0.js} +1 -1
  7. package/dist/cjs/{design-token-11656685.js → design-token-bb39e07e.js} +2 -2
  8. package/dist/cjs/{dom-node-subject-observer-factory-1c8f7880.js → dom-node-subject-observer-factory-b5e71bf6.js} +4 -0
  9. package/dist/cjs/{dto-renderer-manager-bd2bd447.js → dto-renderer-manager-03e1a038.js} +218 -27
  10. package/dist/cjs/{element-appender-slimmer-12f40b8b.js → element-appender-slimmer-daa8b9f5.js} +160 -36
  11. package/dist/cjs/{event-emit-slimmer-6a591353.js → event-emit-slimmer-2dacabbd.js} +2 -2
  12. package/dist/cjs/{form-field-controller-slimmer-6e3e14fd.js → form-field-controller-slimmer-aef2fb1e.js} +2 -2
  13. package/dist/cjs/{function-extension-78ec27e0.js → function-extension-cfbbc57e.js} +5 -5
  14. package/dist/cjs/{image-annotation-action-7408a4b3.js → image-annotation-action-3fa501b7.js} +3 -3
  15. package/dist/cjs/{index-638a0f0d.js → index-95fca64f.js} +1 -1
  16. package/dist/cjs/index.cjs.js +15 -15
  17. package/dist/cjs/{inject-keyboard-manager-a6101379.js → inject-keyboard-manager-d21b4387.js} +1 -1
  18. package/dist/cjs/{internal-vega-event-manager-d587a33c.js → internal-vega-event-manager-6befeb34.js} +13 -2
  19. package/dist/cjs/{keyboard-manager-d8adb0ed.js → keyboard-manager-3dea6b28.js} +1 -1
  20. package/dist/cjs/{keyboard-manager-slimmer-15e65357.js → keyboard-manager-slimmer-0d45f944.js} +1 -1
  21. package/dist/cjs/{language-extension-716015a5.js → language-extension-8c4a56ff.js} +2 -2
  22. package/dist/cjs/loader.cjs.js +11 -11
  23. package/dist/cjs/{month-view-generator-706c5477.js → month-view-generator-49cc5fc2.js} +1 -1
  24. package/dist/cjs/{public-rules-2950f1fc.js → public-rules-dc2a8d62.js} +7 -7
  25. package/dist/cjs/{range-c3c48132.js → range-79b668e7.js} +1 -1
  26. package/dist/cjs/{responsive-format-facade-96c5f598.js → responsive-format-facade-d5dba942.js} +4 -4
  27. package/dist/cjs/{rich-text-editor-required-rule-4aab05a3.js → rich-text-editor-required-rule-ba312af9.js} +1 -1
  28. package/dist/cjs/sanitize-fb222510.js +131 -0
  29. package/dist/cjs/{string-format-strategy.abstract-a8264fca.js → string-format-strategy.abstract-63514c60.js} +1 -1
  30. package/dist/cjs/{string-input-formatter-slimmer-338bbd73.js → string-input-formatter-slimmer-f3e0bbc7.js} +3 -3
  31. package/dist/cjs/{string-mask-strategy-4e7d3780.js → string-mask-strategy-d23ac21a.js} +2 -2
  32. package/dist/cjs/{style-formatter-9c42d41b.js → style-formatter-49693da7.js} +2 -2
  33. package/dist/cjs/{sub-state-notify-slimmer-1efa69c4.js → sub-state-notify-slimmer-468e19aa.js} +1 -1
  34. package/dist/cjs/{sub-state-observer-slimmer-6afa62f5.js → sub-state-observer-slimmer-5d0b8ac3.js} +1 -1
  35. package/dist/cjs/{time-required-rule-9d39a620.js → time-required-rule-c96ecdc9.js} +1 -1
  36. package/dist/cjs/{type-guard-69d2cf01.js → type-guard-a0f026d8.js} +12 -0
  37. package/dist/cjs/{valid-credit-card-number-rule-9f40d1d9.js → valid-credit-card-number-rule-c854bed9.js} +1 -1
  38. package/dist/cjs/vega-accordion.cjs.entry.js +9 -9
  39. package/dist/cjs/vega-app-header-button.cjs.entry.js +10 -10
  40. package/dist/cjs/vega-banner.cjs.entry.js +3 -3
  41. package/dist/cjs/vega-box.cjs.entry.js +9 -9
  42. package/dist/cjs/vega-breadcrumb.cjs.entry.js +4 -4
  43. package/dist/cjs/vega-button-circle.cjs.entry.js +10 -10
  44. package/dist/cjs/vega-button-group_2.cjs.entry.js +6 -6
  45. package/dist/cjs/vega-button-link.cjs.entry.js +4 -4
  46. package/dist/cjs/vega-button.cjs.entry.js +9 -9
  47. package/dist/cjs/vega-calendar_4.cjs.entry.js +8 -8
  48. package/dist/cjs/vega-card.cjs.entry.js +8 -8
  49. package/dist/cjs/vega-carousel.cjs.entry.js +8 -8
  50. package/dist/cjs/vega-checkbox_2.cjs.entry.js +6 -6
  51. package/dist/cjs/vega-chip.cjs.entry.js +10 -10
  52. package/dist/cjs/vega-code-block.cjs.entry.js +10 -10
  53. package/dist/cjs/vega-color-picker.cjs.entry.js +5 -5
  54. package/dist/cjs/vega-combo-box.cjs.entry.js +11 -10
  55. package/dist/cjs/vega-date-picker_2.cjs.entry.js +389 -342
  56. package/dist/cjs/vega-dialog_2.cjs.entry.js +10 -10
  57. package/dist/cjs/vega-divider.cjs.entry.js +8 -8
  58. package/dist/cjs/vega-dropdown_5.cjs.entry.js +49 -21
  59. package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
  60. package/dist/cjs/vega-field-label.cjs.entry.js +3 -3
  61. package/dist/cjs/vega-file-uploader.cjs.entry.js +5 -5
  62. package/dist/cjs/vega-flag-icon.cjs.entry.js +8 -8
  63. package/dist/cjs/vega-flex.cjs.entry.js +9 -9
  64. package/dist/cjs/vega-font.cjs.entry.js +8 -8
  65. package/dist/cjs/vega-form.cjs.entry.js +8 -8
  66. package/dist/cjs/vega-grid.cjs.entry.js +8 -8
  67. package/dist/cjs/vega-icon.cjs.entry.js +8 -8
  68. package/dist/cjs/vega-image-uploader.cjs.entry.js +11 -11
  69. package/dist/cjs/vega-input-credit-card.cjs.entry.js +10 -10
  70. package/dist/cjs/vega-input-numeric.cjs.entry.js +10 -10
  71. package/dist/cjs/vega-input-passcode.cjs.entry.js +9 -9
  72. package/dist/cjs/vega-input-phone-number.cjs.entry.js +11 -11
  73. package/dist/cjs/vega-input-range.cjs.entry.js +6 -6
  74. package/dist/cjs/vega-input-select.cjs.entry.js +187 -54
  75. package/dist/cjs/vega-input.cjs.entry.js +339 -98
  76. package/dist/cjs/vega-item-toggle.cjs.entry.js +3 -3
  77. package/dist/cjs/vega-left-nav_5.cjs.entry.js +11 -11
  78. package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +7 -7
  79. package/dist/cjs/vega-page-notification_2.cjs.entry.js +1 -1
  80. package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +3 -3
  81. package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +1 -1
  82. package/dist/cjs/vega-pagination.cjs.entry.js +9 -9
  83. package/dist/cjs/vega-popover_2.cjs.entry.js +12 -12
  84. package/dist/cjs/vega-progress-tracker_2.cjs.entry.js +10 -10
  85. package/dist/cjs/vega-radio_2.cjs.entry.js +9 -9
  86. package/dist/cjs/vega-rich-text-content.cjs.entry.js +7 -7
  87. package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +87 -27
  88. package/dist/cjs/vega-segment-control.cjs.entry.js +3 -3
  89. package/dist/cjs/vega-selection-chip_2.cjs.entry.js +12 -12
  90. package/dist/cjs/vega-selection-tile_2.cjs.entry.js +7 -7
  91. package/dist/cjs/vega-sidenav_3.cjs.entry.js +10 -10
  92. package/dist/cjs/vega-signature-capture.cjs.entry.js +11 -11
  93. package/dist/cjs/vega-stepper.cjs.entry.js +6 -6
  94. package/dist/cjs/vega-tab-group_2.cjs.entry.js +4 -4
  95. package/dist/cjs/vega-table_11.cjs.entry.js +11 -11
  96. package/dist/cjs/vega-textarea.cjs.entry.js +6 -6
  97. package/dist/cjs/vega-time-picker_2.cjs.entry.js +18 -17
  98. package/dist/cjs/vega-toggle-switch.cjs.entry.js +5 -5
  99. package/dist/cjs/vega-tooltip_2.cjs.entry.js +10 -10
  100. package/dist/cjs/vega.cjs.js +11 -11
  101. package/dist/collection/components/vega-app-header-button/vega-app-header-button.js +1 -1
  102. package/dist/collection/components/vega-button-group/vega-button-group-item/vega-button-group-item.js +1 -1
  103. package/dist/collection/components/vega-calendar/vega-calendar.js +1 -1
  104. package/dist/collection/components/vega-combo-box/slimmers/renderers/vega-combo-box-dropdown-renderer.js +2 -1
  105. package/dist/collection/components/vega-date-picker/assets/icons.js +4 -1
  106. package/dist/collection/components/vega-date-picker/slimmers/controllers/vega-date-picker-calendar-open-state-controller.js +2 -1
  107. package/dist/collection/components/vega-date-picker/slimmers/renderers/vega-date-picker-calendar-renderer.js +2 -2
  108. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-header-render.js +109 -0
  109. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-renderer.js +4 -0
  110. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-year-month-switcher-renderer.js +42 -70
  111. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-month-item-renderer.js +12 -56
  112. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/vega-date-picker-calendar.css +435 -108
  113. package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/vega-date-picker-calendar.js +5 -0
  114. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-search-controller.js +5 -1
  115. package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-source-controller.js +7 -0
  116. package/dist/collection/components/vega-dropdown/slimmers/renderers/vega-dropdown-list-renderer.js +6 -3
  117. package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.js +3 -2
  118. package/dist/collection/components/vega-dropdown/vega-dropdown.js +50 -4
  119. package/dist/collection/components/vega-field-label/vega-field-label.js +1 -1
  120. package/dist/collection/components/vega-input/slimmers/controllers/vega-input-render-mode-controller.js +51 -0
  121. package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-renderer.js +6 -0
  122. package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-suggestions-renderer.js +142 -0
  123. package/dist/collection/components/vega-input/slimmers/renderers/vega-input-renderer.js +12 -1
  124. package/dist/collection/components/vega-input/vega-input.js +200 -3
  125. package/dist/collection/components/vega-input-select/slimmers/controllers/vega-input-select-item-controller.js +89 -0
  126. package/dist/collection/components/vega-input-select/slimmers/controllers/vega-input-select-source-controller.js +4 -0
  127. package/dist/collection/components/vega-input-select/slimmers/controllers/vega-input-select-value-controller.js +4 -0
  128. package/dist/collection/components/vega-input-select/slimmers/renderers/vega-input-select-dropdown-renderer.js +38 -13
  129. package/dist/collection/components/vega-input-select/vega-input-select.js +27 -7
  130. package/dist/collection/components/vega-rich-text-editor/dto/annotations/plain-text-annotation.js +1 -1
  131. package/dist/collection/components/vega-rich-text-editor/dto/blocks/html-block.js +16 -0
  132. package/dist/collection/components/vega-rich-text-editor/dto/content-state.js +21 -24
  133. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/extension-controller.js +1 -1
  134. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner-processor.interface.js +1 -0
  135. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner.js +59 -0
  136. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/index.js +4 -0
  137. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-after-opening-tag-processor.js +21 -0
  138. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-before-closing-tag-processor.js +21 -0
  139. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-between-tags-processor.js +77 -0
  140. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/value-controller.js +6 -2
  141. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.js +6 -0
  142. package/dist/collection/components/vega-rich-text-editor/test/dto/blocks/html-block.test.js +39 -0
  143. package/dist/collection/components/vega-rich-text-editor/test/dto/content-state.test.js +171 -1
  144. package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/html-content-cleaner.test.js +186 -0
  145. package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-after-opening-tag-processor.test.js +22 -0
  146. package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-before-closing-tag-processor.test.js +22 -0
  147. package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-between-tags-processor.test.js +26 -0
  148. package/dist/collection/components/vega-selection-chip/vega-selection-chip.js +1 -1
  149. package/dist/collection/components/vega-time-picker/slimmers/controllers/vega-time-picker-range-dropdown-controller.js +2 -1
  150. package/dist/collection/components/vega-time-picker/slimmers/controllers/vega-time-picker-single-dropdown-controller.js +2 -1
  151. package/dist/collection/constants/ui.js +2 -0
  152. package/dist/collection/helpers/code-format/code-formatter.js +57 -7
  153. package/dist/collection/helpers/code-format/test/code-formatter.test.js +48 -0
  154. package/dist/collection/helpers/event-manager/event-id/component-event-id-map.js +13 -2
  155. package/dist/collection/helpers/event-manager/event-id/vega-event-id.js +2 -0
  156. package/dist/collection/helpers/event-manager/test/component-event-id-map.test.js +3 -1
  157. package/dist/collection/helpers/event-manager/test/vega-event-manager.test.js +3 -1
  158. package/dist/collection/helpers/slimmers/element-appender/element-appender-slimmer.js +60 -32
  159. package/dist/collection/helpers/slimmers/element-appender/test/element-appender-slimmer.test.js +3 -2
  160. package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/click-outside-only-to-dismiss-strategy.js +28 -0
  161. package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/click-trigger-strategy.js +33 -0
  162. package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/hover-trigger-strategy.js +42 -0
  163. package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/none-trigger-strategy.js +22 -0
  164. package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/trigger-strategy.interface.js +1 -0
  165. package/dist/collection/types/test/type-guard.test.js +8 -1
  166. package/dist/collection/types/type-guard.js +11 -0
  167. package/dist/collection/utils/sanitize.js +126 -0
  168. package/dist/collection/utils/test/sanitize.test.js +65 -0
  169. package/dist/esm/{app-globals-949d2e18.js → app-globals-2ac60ff5.js} +8 -8
  170. package/dist/esm/{child-nodes-event-prevent-slimmer-e6f98de5.js → child-nodes-event-prevent-slimmer-e662bee2.js} +1 -1
  171. package/dist/esm/click-outside-only-to-dismiss-strategy-3d286c1b.js +30 -0
  172. package/dist/esm/{code-block-666674d7.js → code-block-8ee34ab6.js} +3 -3
  173. package/dist/esm/{component-value-history-controller-slimmer.abstract-171dda08.js → component-value-history-controller-slimmer.abstract-a61bf821.js} +4 -4
  174. package/dist/esm/{date-required-rule-a9980386.js → date-required-rule-47ecc28f.js} +1 -1
  175. package/dist/esm/{design-token-9b510e59.js → design-token-007efbaa.js} +2 -2
  176. package/dist/esm/{dom-node-subject-observer-factory-1aaa1159.js → dom-node-subject-observer-factory-064ee2b2.js} +3 -1
  177. package/dist/esm/{dto-renderer-manager-49ae5d56.js → dto-renderer-manager-ee1a5864.js} +218 -27
  178. package/dist/esm/{element-appender-slimmer-b9890dcb.js → element-appender-slimmer-35e26b5a.js} +160 -36
  179. package/dist/esm/{event-emit-slimmer-2d791d0e.js → event-emit-slimmer-09827cec.js} +2 -2
  180. package/dist/esm/{form-field-controller-slimmer-257928c1.js → form-field-controller-slimmer-5d9dc384.js} +2 -2
  181. package/dist/esm/{function-extension-8b06c6f8.js → function-extension-e8c0e43e.js} +5 -5
  182. package/dist/esm/{image-annotation-action-b3eea6a2.js → image-annotation-action-285d432e.js} +3 -3
  183. package/dist/esm/{index-0d487fae.js → index-51a7da7f.js} +1 -1
  184. package/dist/esm/index.js +15 -15
  185. package/dist/esm/{inject-keyboard-manager-9241968c.js → inject-keyboard-manager-83d76ff5.js} +1 -1
  186. package/dist/esm/{internal-vega-event-manager-fdee2a0a.js → internal-vega-event-manager-efb6786e.js} +13 -2
  187. package/dist/esm/{keyboard-manager-89acac79.js → keyboard-manager-c92808d8.js} +1 -1
  188. package/dist/esm/{keyboard-manager-slimmer-e303cb7d.js → keyboard-manager-slimmer-79c78ce8.js} +1 -1
  189. package/dist/esm/{language-extension-b3f836d4.js → language-extension-29bf8acd.js} +2 -2
  190. package/dist/esm/loader.js +11 -11
  191. package/dist/esm/{month-view-generator-4bec99fd.js → month-view-generator-16192182.js} +1 -1
  192. package/dist/esm/{public-rules-b164e40e.js → public-rules-724873f5.js} +7 -7
  193. package/dist/esm/{range-9cc1422b.js → range-5257c062.js} +1 -1
  194. package/dist/esm/{responsive-format-facade-94897ae8.js → responsive-format-facade-28ee2dbd.js} +4 -4
  195. package/dist/esm/{rich-text-editor-required-rule-2131f21c.js → rich-text-editor-required-rule-873e2e67.js} +1 -1
  196. package/dist/esm/sanitize-fd0cb40d.js +129 -0
  197. package/dist/esm/{string-format-strategy.abstract-75540c16.js → string-format-strategy.abstract-fc60db79.js} +1 -1
  198. package/dist/esm/{string-input-formatter-slimmer-3a42d9b8.js → string-input-formatter-slimmer-ee32b1fd.js} +3 -3
  199. package/dist/esm/{string-mask-strategy-4a18ed1a.js → string-mask-strategy-0b0accaa.js} +2 -2
  200. package/dist/esm/{style-formatter-bb5aec96.js → style-formatter-314b37f3.js} +2 -2
  201. package/dist/esm/{sub-state-notify-slimmer-71b9bbd5.js → sub-state-notify-slimmer-4453047a.js} +1 -1
  202. package/dist/esm/{sub-state-observer-slimmer-41a1b380.js → sub-state-observer-slimmer-202ec7dc.js} +1 -1
  203. package/dist/esm/{time-required-rule-8ec1faf5.js → time-required-rule-5fa43804.js} +1 -1
  204. package/dist/esm/{type-guard-b48aec98.js → type-guard-c65a227d.js} +12 -1
  205. package/dist/esm/{valid-credit-card-number-rule-96eaf9b1.js → valid-credit-card-number-rule-666c415d.js} +1 -1
  206. package/dist/esm/vega-accordion.entry.js +9 -9
  207. package/dist/esm/vega-app-header-button.entry.js +10 -10
  208. package/dist/esm/vega-banner.entry.js +3 -3
  209. package/dist/esm/vega-box.entry.js +9 -9
  210. package/dist/esm/vega-breadcrumb.entry.js +4 -4
  211. package/dist/esm/vega-button-circle.entry.js +10 -10
  212. package/dist/esm/vega-button-group_2.entry.js +6 -6
  213. package/dist/esm/vega-button-link.entry.js +4 -4
  214. package/dist/esm/vega-button.entry.js +9 -9
  215. package/dist/esm/vega-calendar_4.entry.js +8 -8
  216. package/dist/esm/vega-card.entry.js +8 -8
  217. package/dist/esm/vega-carousel.entry.js +8 -8
  218. package/dist/esm/vega-checkbox_2.entry.js +6 -6
  219. package/dist/esm/vega-chip.entry.js +10 -10
  220. package/dist/esm/vega-code-block.entry.js +10 -10
  221. package/dist/esm/vega-color-picker.entry.js +5 -5
  222. package/dist/esm/vega-combo-box.entry.js +11 -10
  223. package/dist/esm/vega-date-picker_2.entry.js +389 -342
  224. package/dist/esm/vega-dialog_2.entry.js +10 -10
  225. package/dist/esm/vega-divider.entry.js +8 -8
  226. package/dist/esm/vega-dropdown_5.entry.js +49 -21
  227. package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
  228. package/dist/esm/vega-field-label.entry.js +3 -3
  229. package/dist/esm/vega-file-uploader.entry.js +5 -5
  230. package/dist/esm/vega-flag-icon.entry.js +8 -8
  231. package/dist/esm/vega-flex.entry.js +9 -9
  232. package/dist/esm/vega-font.entry.js +8 -8
  233. package/dist/esm/vega-form.entry.js +8 -8
  234. package/dist/esm/vega-grid.entry.js +8 -8
  235. package/dist/esm/vega-icon.entry.js +8 -8
  236. package/dist/esm/vega-image-uploader.entry.js +11 -11
  237. package/dist/esm/vega-input-credit-card.entry.js +10 -10
  238. package/dist/esm/vega-input-numeric.entry.js +10 -10
  239. package/dist/esm/vega-input-passcode.entry.js +9 -9
  240. package/dist/esm/vega-input-phone-number.entry.js +11 -11
  241. package/dist/esm/vega-input-range.entry.js +6 -6
  242. package/dist/esm/vega-input-select.entry.js +187 -54
  243. package/dist/esm/vega-input.entry.js +340 -99
  244. package/dist/esm/vega-item-toggle.entry.js +3 -3
  245. package/dist/esm/vega-left-nav_5.entry.js +11 -11
  246. package/dist/esm/vega-loader-wrapper_2.entry.js +7 -7
  247. package/dist/esm/vega-page-notification_2.entry.js +1 -1
  248. package/dist/esm/vega-pagination-page-selector-mobile.entry.js +3 -3
  249. package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +1 -1
  250. package/dist/esm/vega-pagination.entry.js +9 -9
  251. package/dist/esm/vega-popover_2.entry.js +12 -12
  252. package/dist/esm/vega-progress-tracker_2.entry.js +10 -10
  253. package/dist/esm/vega-radio_2.entry.js +9 -9
  254. package/dist/esm/vega-rich-text-content.entry.js +7 -7
  255. package/dist/esm/vega-rich-text-editor_4.entry.js +87 -27
  256. package/dist/esm/vega-segment-control.entry.js +3 -3
  257. package/dist/esm/vega-selection-chip_2.entry.js +12 -12
  258. package/dist/esm/vega-selection-tile_2.entry.js +7 -7
  259. package/dist/esm/vega-sidenav_3.entry.js +10 -10
  260. package/dist/esm/vega-signature-capture.entry.js +11 -11
  261. package/dist/esm/vega-stepper.entry.js +6 -6
  262. package/dist/esm/vega-tab-group_2.entry.js +4 -4
  263. package/dist/esm/vega-table_11.entry.js +11 -11
  264. package/dist/esm/vega-textarea.entry.js +6 -6
  265. package/dist/esm/vega-time-picker_2.entry.js +18 -17
  266. package/dist/esm/vega-toggle-switch.entry.js +5 -5
  267. package/dist/esm/vega-tooltip_2.entry.js +10 -10
  268. package/dist/esm/vega.js +11 -11
  269. package/dist/sri/vega-sri-manifest.json +326 -318
  270. package/dist/types/components/vega-date-picker/assets/icons.d.ts +1 -1
  271. package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-header-render.d.ts +20 -0
  272. package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-renderer.d.ts +1 -0
  273. package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-year-month-switcher-renderer.d.ts +4 -11
  274. package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-month-item-renderer.d.ts +4 -9
  275. package/dist/types/components/vega-date-picker/vega-date-picker-calendar/vega-date-picker-calendar.d.ts +2 -0
  276. package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-source-controller.d.ts +2 -0
  277. package/dist/types/components/vega-dropdown/slimmers/renderers/vega-dropdown-list-renderer.d.ts +1 -0
  278. package/dist/types/components/vega-dropdown/vega-dropdown.d.ts +14 -2
  279. package/dist/types/components/vega-input/slimmers/controllers/vega-input-render-mode-controller.d.ts +27 -0
  280. package/dist/types/components/vega-input/slimmers/renderers/vega-input-input-renderer.d.ts +1 -0
  281. package/dist/types/components/vega-input/slimmers/renderers/vega-input-input-suggestions-renderer.d.ts +40 -0
  282. package/dist/types/components/vega-input/slimmers/renderers/vega-input-renderer.d.ts +3 -0
  283. package/dist/types/components/vega-input/types.d.ts +4 -0
  284. package/dist/types/components/vega-input/vega-input.d.ts +55 -1
  285. package/dist/types/components/vega-input-select/slimmers/controllers/vega-input-select-item-controller.d.ts +29 -0
  286. package/dist/types/components/vega-input-select/slimmers/controllers/vega-input-select-source-controller.d.ts +1 -0
  287. package/dist/types/components/vega-input-select/slimmers/controllers/vega-input-select-value-controller.d.ts +1 -0
  288. package/dist/types/components/vega-input-select/slimmers/renderers/vega-input-select-dropdown-renderer.d.ts +1 -1
  289. package/dist/types/components/vega-input-select/types.d.ts +5 -0
  290. package/dist/types/components/vega-input-select/vega-input-select.d.ts +12 -4
  291. package/dist/types/components/vega-rich-text-editor/dto/blocks/html-block.d.ts +10 -0
  292. package/dist/types/components/vega-rich-text-editor/dto/content-state.d.ts +8 -1
  293. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner-processor.interface.d.ts +13 -0
  294. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner.d.ts +35 -0
  295. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/index.d.ts +4 -0
  296. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-after-opening-tag-processor.d.ts +19 -0
  297. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-before-closing-tag-processor.d.ts +19 -0
  298. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-between-tags-processor.d.ts +59 -0
  299. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/value-controller.d.ts +1 -0
  300. package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.d.ts +1 -0
  301. package/dist/types/components/vega-rich-text-editor/test/html-cleaner/html-content-cleaner.test.d.ts +1 -0
  302. package/dist/types/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-after-opening-tag-processor.test.d.ts +1 -0
  303. package/dist/types/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-before-closing-tag-processor.test.d.ts +1 -0
  304. package/dist/types/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-between-tags-processor.test.d.ts +1 -0
  305. package/dist/types/components.d.ts +65 -11
  306. package/dist/types/constants/ui.d.ts +1 -1
  307. package/dist/types/helpers/code-format/code-formatter.d.ts +14 -0
  308. package/dist/types/helpers/event-manager/event-id/vega-event-id.d.ts +2 -0
  309. package/dist/types/helpers/slimmers/element-appender/element-appender-slimmer.d.ts +4 -9
  310. package/dist/types/helpers/slimmers/element-appender/trigger-strategies/click-outside-only-to-dismiss-strategy.d.ts +21 -0
  311. package/dist/types/helpers/slimmers/element-appender/trigger-strategies/click-trigger-strategy.d.ts +21 -0
  312. package/dist/types/helpers/slimmers/element-appender/trigger-strategies/hover-trigger-strategy.d.ts +22 -0
  313. package/dist/types/helpers/slimmers/element-appender/trigger-strategies/none-trigger-strategy.d.ts +18 -0
  314. package/dist/types/helpers/slimmers/element-appender/trigger-strategies/trigger-strategy.interface.d.ts +37 -0
  315. package/dist/types/types/components.type.d.ts +3 -0
  316. package/dist/types/types/type-guard.d.ts +8 -0
  317. package/dist/types/types/ui.type.d.ts +9 -0
  318. package/dist/types/utils/sanitize.d.ts +71 -0
  319. package/dist/types/utils/test/sanitize.test.d.ts +1 -0
  320. package/dist/vega/index.esm.js +1 -1
  321. package/dist/vega/{p-44bc9ea9.entry.js → p-011b94b1.entry.js} +1 -1
  322. package/dist/vega/{p-6e701542.entry.js → p-012753b5.entry.js} +1 -1
  323. package/dist/vega/{p-db62b038.entry.js → p-024331ce.entry.js} +1 -1
  324. package/dist/vega/{p-74a77cad.js → p-0575d22e.js} +1 -1
  325. package/dist/vega/{p-42a283b5.entry.js → p-08a90cc6.entry.js} +1 -1
  326. package/dist/vega/{p-d01fe83d.entry.js → p-0ede1fea.entry.js} +1 -1
  327. package/dist/vega/{p-8fba7f9a.js → p-1298b126.js} +1 -1
  328. package/dist/vega/{p-9b673fd4.entry.js → p-17c55205.entry.js} +1 -1
  329. package/dist/vega/{p-161b9c5b.js → p-1f83cebf.js} +1 -1
  330. package/dist/vega/p-3353b3d7.js +1 -0
  331. package/dist/vega/p-365b1b35.entry.js +1 -0
  332. package/dist/vega/{p-f3831dc9.entry.js → p-3ae9ee3d.entry.js} +1 -1
  333. package/dist/vega/p-3af92370.entry.js +1 -0
  334. package/dist/vega/{p-59fa3f68.js → p-3bf66be2.js} +1 -1
  335. package/dist/vega/{p-6e84e451.entry.js → p-3c5a28e4.entry.js} +1 -1
  336. package/dist/vega/p-3e5f362f.js +1 -0
  337. package/dist/vega/{p-c0036e71.js → p-430be941.js} +1 -1
  338. package/dist/vega/p-43f585f7.entry.js +1 -0
  339. package/dist/vega/{p-75d91ee9.entry.js → p-45296fd4.entry.js} +1 -1
  340. package/dist/vega/p-476a173a.js +1 -0
  341. package/dist/vega/p-491618a6.entry.js +1 -0
  342. package/dist/vega/p-4a537391.entry.js +1 -0
  343. package/dist/vega/p-4aa893ef.entry.js +1 -0
  344. package/dist/vega/{p-2b20a215.entry.js → p-4c47e8bb.entry.js} +1 -1
  345. package/dist/vega/{p-7f86b3c8.js → p-4da75f2b.js} +1 -1
  346. package/dist/vega/{p-82dbff54.entry.js → p-509eb52e.entry.js} +1 -1
  347. package/dist/vega/{p-adc615a4.entry.js → p-5110ba73.entry.js} +1 -1
  348. package/dist/vega/{p-38ed3d59.entry.js → p-556f9a21.entry.js} +1 -1
  349. package/dist/vega/{p-70b2906a.entry.js → p-55b54ba0.entry.js} +1 -1
  350. package/dist/vega/{p-94cf46ca.entry.js → p-5ea2e43c.entry.js} +1 -1
  351. package/dist/vega/{p-5f09868d.entry.js → p-5efc6fe1.entry.js} +1 -1
  352. package/dist/vega/p-5f377954.js +1 -1
  353. package/dist/vega/{p-de70aac1.js → p-60851f9d.js} +1 -1
  354. package/dist/vega/{p-03e16a05.entry.js → p-64cd1931.entry.js} +1 -1
  355. package/dist/vega/{p-f2c8c363.js → p-66fa700b.js} +1 -1
  356. package/dist/vega/{p-623c3911.entry.js → p-67fcf6f2.entry.js} +1 -1
  357. package/dist/vega/{p-e88f2dc3.js → p-68df4288.js} +1 -1
  358. package/dist/vega/{p-2971b17a.js → p-691ba1ae.js} +1 -1
  359. package/dist/vega/{p-676eaf3f.entry.js → p-6a2205a1.entry.js} +1 -1
  360. package/dist/vega/{p-b007d0d5.entry.js → p-6a4277df.entry.js} +1 -1
  361. package/dist/vega/{p-30e7544c.js → p-6e136980.js} +1 -1
  362. package/dist/vega/{p-bf61d136.js → p-6f8be8ea.js} +1 -1
  363. package/dist/vega/{p-f427d88c.entry.js → p-6fa8e231.entry.js} +1 -1
  364. package/dist/vega/p-7045e84c.entry.js +1 -0
  365. package/dist/vega/{p-3566ad76.js → p-7288f8c4.js} +1 -1
  366. package/dist/vega/{p-9dfe2bbc.js → p-749f96a4.js} +1 -1
  367. package/dist/vega/{p-5be29f14.js → p-77edf50c.js} +1 -1
  368. package/dist/vega/{p-114c6df8.entry.js → p-7aaece55.entry.js} +1 -1
  369. package/dist/vega/{p-40561fa0.entry.js → p-7ec6a104.entry.js} +1 -1
  370. package/dist/vega/{p-9fb71d8c.entry.js → p-81134e9e.entry.js} +1 -1
  371. package/dist/vega/p-8187878e.js +1 -0
  372. package/dist/vega/p-89d685a8.js +1 -0
  373. package/dist/vega/{p-2ae5ad30.entry.js → p-8c0eb12f.entry.js} +1 -1
  374. package/dist/vega/p-8d0ca805.js +1 -0
  375. package/dist/vega/{p-0ba0f83d.entry.js → p-8d701832.entry.js} +1 -1
  376. package/dist/vega/{p-f6cd7a08.entry.js → p-8e42a14c.entry.js} +1 -1
  377. package/dist/vega/{p-a3c4fa30.entry.js → p-8ed0faa2.entry.js} +1 -1
  378. package/dist/vega/{p-a8dad05d.js → p-920719ad.js} +1 -1
  379. package/dist/vega/{p-a58bdbad.entry.js → p-94394df7.entry.js} +1 -1
  380. package/dist/vega/p-99aa554b.entry.js +1 -0
  381. package/dist/vega/{p-7be3aefc.entry.js → p-9a2446f1.entry.js} +1 -1
  382. package/dist/vega/{p-a4ec6575.js → p-a2aeb646.js} +1 -1
  383. package/dist/vega/{p-a125cfec.entry.js → p-a475d525.entry.js} +1 -1
  384. package/dist/vega/{p-2409a475.entry.js → p-a530797f.entry.js} +1 -1
  385. package/dist/vega/{p-be0b67b8.entry.js → p-a85ad369.entry.js} +1 -1
  386. package/dist/vega/p-ac5e9955.entry.js +1 -0
  387. package/dist/vega/{p-ce2ffff7.js → p-aedf7146.js} +1 -1
  388. package/dist/vega/p-b1f869fb.js +1 -0
  389. package/dist/vega/p-b4ea3fad.js +1 -0
  390. package/dist/vega/{p-d991fb11.js → p-badad9ed.js} +1 -1
  391. package/dist/vega/{p-c7194674.entry.js → p-bb4a558d.entry.js} +1 -1
  392. package/dist/vega/{p-4957f07a.entry.js → p-bb8339ed.entry.js} +1 -1
  393. package/dist/vega/{p-6b9d2996.entry.js → p-be930e85.entry.js} +1 -1
  394. package/dist/vega/{p-398220f5.entry.js → p-bf2bd6d0.entry.js} +1 -1
  395. package/dist/vega/{p-dd72ad9e.js → p-c2488ed6.js} +1 -1
  396. package/dist/vega/{p-ead1da57.entry.js → p-c379a5a5.entry.js} +1 -1
  397. package/dist/vega/{p-184d8443.js → p-c9b6b5a9.js} +1 -1
  398. package/dist/vega/{p-9d8e2939.entry.js → p-ca3472c1.entry.js} +1 -1
  399. package/dist/vega/{p-2e0deef6.js → p-cc43bffb.js} +1 -1
  400. package/dist/vega/{p-721b2981.entry.js → p-cf5b80f9.entry.js} +1 -1
  401. package/dist/vega/{p-d1d0f08a.js → p-d0e31633.js} +1 -1
  402. package/dist/vega/{p-21e7808a.entry.js → p-db60a38e.entry.js} +1 -1
  403. package/dist/vega/{p-6c1ef2ed.js → p-dd11f735.js} +1 -1
  404. package/dist/vega/{p-3d85411d.js → p-e16b3adf.js} +1 -1
  405. package/dist/vega/{p-1e019406.js → p-e93545fd.js} +1 -1
  406. package/dist/vega/{p-a5d4d168.entry.js → p-e9c4fd24.entry.js} +1 -1
  407. package/dist/vega/{p-7a8c4cf8.entry.js → p-eb60cfe1.entry.js} +1 -1
  408. package/dist/vega/{p-7b337fd4.entry.js → p-ec192283.entry.js} +1 -1
  409. package/dist/vega/{p-3938880f.entry.js → p-f2a3a1ec.entry.js} +1 -1
  410. package/dist/vega/{p-c2ac6b47.entry.js → p-f2cdd212.entry.js} +1 -1
  411. package/dist/vega/{p-c7f292dd.entry.js → p-f3c3ff26.entry.js} +1 -1
  412. package/dist/vega/{p-2bc4f7d9.entry.js → p-f4c05b4a.entry.js} +1 -1
  413. package/dist/vega/{p-7f9acdf7.entry.js → p-f52a0155.entry.js} +1 -1
  414. package/dist/vega/{p-e39aa2ea.entry.js → p-f8641214.entry.js} +1 -1
  415. package/dist/vega/{p-0ad59141.entry.js → p-f89443aa.entry.js} +1 -1
  416. package/dist/vega/{p-96797fee.entry.js → p-f8f7cf48.entry.js} +1 -1
  417. package/dist/vega/p-fe12eff6.js +1 -0
  418. package/dist/vega/vega.esm.js +1 -1
  419. package/package.json +1 -1
  420. package/dist/vega/p-1faef917.entry.js +0 -1
  421. package/dist/vega/p-207cfa6a.js +0 -1
  422. package/dist/vega/p-21cba83b.entry.js +0 -1
  423. package/dist/vega/p-2f592078.entry.js +0 -1
  424. package/dist/vega/p-3162a7fd.entry.js +0 -1
  425. package/dist/vega/p-524ffc12.entry.js +0 -1
  426. package/dist/vega/p-697eb0e1.js +0 -1
  427. package/dist/vega/p-76e6c13a.js +0 -1
  428. package/dist/vega/p-79a544d6.js +0 -1
  429. package/dist/vega/p-8bd496b4.js +0 -1
  430. package/dist/vega/p-9a83a6b0.js +0 -1
  431. package/dist/vega/p-aab0deab.js +0 -1
  432. package/dist/vega/p-b406a846.entry.js +0 -1
  433. package/dist/vega/p-bd60c72e.entry.js +0 -1
  434. package/dist/vega/p-c4700277.entry.js +0 -1
  435. package/dist/vega/p-f38a4be2.entry.js +0 -1
@@ -21,6 +21,7 @@ import { VegaInternalRichTextEditorFlushChanges } from '../../../helpers/event-m
21
21
  import './setup';
22
22
  import { StylePreservator } from '../../../helpers/csp/styles-preservator';
23
23
  import { LogUtility } from '../../../utils/log';
24
+ import { HTMLContentCleaner } from '../slimmers/controllers/html-cleaner';
24
25
  /**
25
26
  * Class representing the content state of the rich text editor.
26
27
  */
@@ -53,22 +54,27 @@ export class VegaRTEContent {
53
54
  /**
54
55
  * Create an empty content state
55
56
  *
57
+ * @param {VegaRTETransformOptions} options - Optional transformation options.
56
58
  * @returns {VegaRTEContent} An empty content state
57
59
  */
58
- static createEmptyContent() {
60
+ static createEmptyContent(options = { autoMatchFormat: true }) {
59
61
  return VegaRTEContent.fromJSON([
60
62
  {
61
63
  id: generateUUID(),
62
64
  type: 'paragraph',
65
+ annotations: {
66
+ internalWrapper: !options.autoMatchFormat,
67
+ },
63
68
  nodes: [
64
69
  {
65
70
  id: generateUUID(),
71
+ annotations: { plainText: !options.autoMatchFormat },
66
72
  type: 'text',
67
73
  text: '',
68
74
  },
69
75
  ],
70
76
  },
71
- ]);
77
+ ], options);
72
78
  }
73
79
  /**
74
80
  * Converts HTML content to a VegaRTEContent instance.
@@ -78,28 +84,8 @@ export class VegaRTEContent {
78
84
  * @returns {VegaRTEContent} The converted content state.
79
85
  */
80
86
  static fromHtml(html, options = { autoMatchFormat: true, skipCustomAnnotations: false }) {
81
- /**
82
- * remove redundant spaces between tags, for example:
83
- * case1:
84
- * '<p>\n\t <span>test</span>\n\t </p>' will be formatted into '<p><span>test</span></p>'
85
- * '<p>
86
- * test
87
- * </p>' will be formatted into '<p>test</p>'
88
- *
89
- * case2:
90
- * <h1>
91
- * _test&*....
92
- * </h1> will be formatted into <h1>_test&*....</h1>
93
- *
94
- * The blank space between individual tags should be preserved:
95
- * <span> </span>
96
- */
97
- const formattedHtml = html
98
- .replace(/>\s+<\/?/g, (match) => {
99
- return match.endsWith('</') ? match : '><';
100
- })
101
- .replace(/(>)[\n\t]+(?=[a-zA-Z0-9_\W])/g, '$1')
102
- .replace(/([a-zA-Z0-9_\W])[\n\t]+(?=<)/g, '$1');
87
+ const cleaner = new HTMLContentCleaner();
88
+ const formattedHtml = cleaner.clean(html);
103
89
  const context = StylePreservator.preserve(formattedHtml);
104
90
  const safeHtml = context.getProcessedHtml();
105
91
  const body = new DOMParser().parseFromString(safeHtml, 'text/html').body;
@@ -141,8 +127,19 @@ export class VegaRTEContent {
141
127
  if (options) {
142
128
  LogUtility.warn(`The 'options' parameter in toHtml method is deprecated and will be removed in the future.`);
143
129
  }
130
+ if (this.isEmpty()) {
131
+ return '';
132
+ }
144
133
  return this.children.map((block) => block.toHtml()).join('');
145
134
  }
135
+ /**
136
+ * Checks if the content state is empty.
137
+ *
138
+ * @returns {boolean} True if the content state is empty, false otherwise.
139
+ */
140
+ isEmpty() {
141
+ return this.children.length === 0 || (this.children.length === 1 && !this.children[0].isNotEmpty());
142
+ }
146
143
  /**
147
144
  * Internal method to add the block item, remove the block item
148
145
  *
@@ -90,7 +90,7 @@ __decorate([
90
90
  MapToComponentField()
91
91
  ], RTEExtensionController.prototype, "selectionController", void 0);
92
92
  __decorate([
93
- MapToComponentMethod('connectedCallback')
93
+ MapToComponentMethod('componentDidLoad')
94
94
  ], RTEExtensionController.prototype, "initialExtensionContext", null);
95
95
  __decorate([
96
96
  MapToComponentMethod('watchExtensions')
@@ -0,0 +1,59 @@
1
+ import { RemoveWhitespaceBetweenTagsProcessor } from './processors/remove-whitespace-between-tags-processor';
2
+ import { RemoveWhitespaceAfterOpeningTagProcessor } from './processors/remove-whitespace-after-opening-tag-processor';
3
+ import { RemoveWhitespaceBeforeClosingTagProcessor } from './processors/remove-whitespace-before-closing-tag-processor';
4
+ /**
5
+ * Main HTML content cleaner that orchestrates multiple cleaning processors.
6
+ *
7
+ * This class implements a chain of responsibility pattern where each processor
8
+ * handles a specific aspect of HTML cleaning. The processors are applied in sequence
9
+ * and the entire chain is repeated until no more changes occur.
10
+ *
11
+ * Processors (in order):
12
+ * 1. RemoveWhitespaceBetweenTagsProcessor - Removes whitespace between non-matching tags
13
+ * 2. RemoveWhitespaceAfterOpeningTagProcessor - Removes \n and \t after opening tags
14
+ * 3. RemoveWhitespaceBeforeClosingTagProcessor - Removes \n and \t before closing tags
15
+ */
16
+ export class HTMLContentCleaner {
17
+ constructor() {
18
+ this.processors = [
19
+ new RemoveWhitespaceBetweenTagsProcessor(),
20
+ new RemoveWhitespaceAfterOpeningTagProcessor(),
21
+ new RemoveWhitespaceBeforeClosingTagProcessor(),
22
+ ];
23
+ }
24
+ /**
25
+ * Cleans HTML by applying all processors in the chain repeatedly until no changes occur.
26
+ *
27
+ * The cleaning process:
28
+ * 1. Applies each processor in sequence
29
+ * 2. Compares the result with the input
30
+ * 3. If changes were made, repeats the process
31
+ * 4. Returns the final cleaned HTML
32
+ *
33
+ * Examples of transformations:
34
+ * - `<p>\n\t <span>test</span>\n\t </p>` → `<p><span>test</span></p>`
35
+ * - `<p>\n\tHello</p>` → `<p>Hello</p>`
36
+ * - `<p>Hello\n\t</p>` → `<p>Hello</p>`
37
+ * - `<span> </span>` → `<span> </span>` (preserved - matching tags)
38
+ * - `<p>Hello World</p>` → `<p>Hello World</p>` (preserved - regular spaces)
39
+ *
40
+ * @param {string} html - The HTML string to clean.
41
+ * @returns {string} The cleaned HTML string.
42
+ */
43
+ clean(html) {
44
+ if (!html || html.trim().length === 0) {
45
+ return html;
46
+ }
47
+ let result = html;
48
+ let previousResult;
49
+ // Keep processing until no more changes occur
50
+ do {
51
+ previousResult = result;
52
+ // Apply each processor in the chain
53
+ for (const processor of this.processors) {
54
+ result = processor.process(result);
55
+ }
56
+ } while (result !== previousResult);
57
+ return result;
58
+ }
59
+ }
@@ -0,0 +1,4 @@
1
+ export { HTMLContentCleaner } from './html-content-cleaner';
2
+ export { RemoveWhitespaceBetweenTagsProcessor } from './processors/remove-whitespace-between-tags-processor';
3
+ export { RemoveWhitespaceAfterOpeningTagProcessor } from './processors/remove-whitespace-after-opening-tag-processor';
4
+ export { RemoveWhitespaceBeforeClosingTagProcessor } from './processors/remove-whitespace-before-closing-tag-processor';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Removes `\n` and `\t` characters after opening tags (before text content).
3
+ *
4
+ * Transforms patterns like `>[\n\t]+(text)` to `>(text)`.
5
+ *
6
+ * Examples:
7
+ * - `<p>\n\tHello` → `<p>Hello`
8
+ * - `<div>\n\n\tWorld` → `<div>World`
9
+ */
10
+ export class RemoveWhitespaceAfterOpeningTagProcessor {
11
+ /**
12
+ * Process the HTML string to remove `\n` and `\t` after opening tags.
13
+ *
14
+ * @param {string} html - The HTML string to process.
15
+ * @returns {string} The processed HTML string.
16
+ */
17
+ process(html) {
18
+ // Pattern: `>[\n\t]+(text)` → `>(text)`
19
+ return html.replace(/(>)[\n\t]+(?=.)/g, '$1');
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Removes `\n` and `\t` characters before closing tags (after text content).
3
+ *
4
+ * Transforms patterns like `(text)[\n\t]+<` to `(text)<`.
5
+ *
6
+ * Examples:
7
+ * - `World\n\t</p>` → `World</p>`
8
+ * - `Hello\n</div>` → `Hello</div>`
9
+ */
10
+ export class RemoveWhitespaceBeforeClosingTagProcessor {
11
+ /**
12
+ * Process the HTML string to remove `\n` and `\t` before closing tags.
13
+ *
14
+ * @param {string} html - The HTML string to process.
15
+ * @returns {string} The processed HTML string.
16
+ */
17
+ process(html) {
18
+ // Pattern: `(text)[\n\t]+<` → `(text)<`
19
+ return html.replace(/(.?)[\n\t]+(?=<)/g, '$1');
20
+ }
21
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Removes whitespace between tags, except preserves ALL whitespace between matching opening/closing tag pairs.
3
+ *
4
+ * This processor scans for patterns of `<tag>(whitespace)<tag>` and:
5
+ * - If the first tag is an opening tag and the second tag is its matching closing tag (e.g., `<span> </span>`),
6
+ * preserves ALL the whitespace between them (including spaces, tabs, newlines)
7
+ * - Otherwise, removes all the whitespace between the tags
8
+ *
9
+ * Examples:
10
+ * - `</p>\n\t<div>` → `</p><div>` (different tags: closing p, opening div - whitespace removed)
11
+ * - `<div>\n\t<span>` → `<div><span>` (different tags: opening div, opening span - whitespace removed)
12
+ * - `<span> </span>` → `<span> </span>` (matching tags: opening span, closing span - space preserved)
13
+ * - `<span> </span>` → `<span> </span>` (matching tags - multiple spaces preserved)
14
+ * - `<span>\n\t</span>` → `<span>\n\t</span>` (matching tags - \n\t preserved)
15
+ * - `<code> </code>` → `<code> </code>` (matching tags - space preserved)
16
+ * - `</div> <p>` → `</div><p>` (different tags: closing div, opening p - whitespace removed)
17
+ */
18
+ export class RemoveWhitespaceBetweenTagsProcessor {
19
+ /**
20
+ * Process the HTML string to remove whitespace between non-matching tags.
21
+ *
22
+ * @param {string} html - The HTML string to process.
23
+ * @returns {string} The processed HTML string.
24
+ */
25
+ process(html) {
26
+ return html.replace(/(<[^>]+>)(\s+)(<[^>]+>)/g, (_match, tag1, whitespace, tag2) => {
27
+ const openingTagName = this.extractOpeningTagName(tag1);
28
+ const closingTagName = this.extractClosingTagName(tag2);
29
+ // Preserve all whitespace if tags match (e.g., <span> </span>)
30
+ if (openingTagName && closingTagName && openingTagName === closingTagName) {
31
+ return `${tag1}${whitespace}${tag2}`;
32
+ }
33
+ // Remove whitespace for non-matching tags
34
+ return `${tag1}${tag2}`;
35
+ });
36
+ }
37
+ /**
38
+ * Extracts the tag name from an opening HTML tag.
39
+ *
40
+ * Supports standard HTML tags (div, span, h1, etc.) and custom elements with hyphens (my-component).
41
+ *
42
+ * Examples:
43
+ * - `<span>` → `span`
44
+ * - `<div class="test">` → `div`
45
+ * - `<my-component id="123">` → `my-component`
46
+ * - `</span>` → `null` (not an opening tag)
47
+ *
48
+ * @param {string} tag - The tag string to extract from (e.g., '<span>', '<div class="test">').
49
+ * @returns {string | null} The tag name or null if not an opening tag.
50
+ * @private
51
+ */
52
+ extractOpeningTagName(tag) {
53
+ // Pattern: <(tag name) where tag name starts with letter, followed by letters/numbers/hyphens
54
+ const match = tag.match(/<(\w[\w-]*)/);
55
+ return match ? match[1] : null;
56
+ }
57
+ /**
58
+ * Extracts the tag name from a closing HTML tag.
59
+ *
60
+ * Supports standard HTML tags (div, span, h1, etc.) and custom elements with hyphens (my-component).
61
+ *
62
+ * Examples:
63
+ * - `</span>` → `span`
64
+ * - `</div>` → `div`
65
+ * - `</my-component>` → `my-component`
66
+ * - `<span>` → `null` (not a closing tag)
67
+ *
68
+ * @param {string} tag - The tag string to extract from (e.g., '</span>', '</div>').
69
+ * @returns {string | null} The tag name or null if not a closing tag.
70
+ * @private
71
+ */
72
+ extractClosingTagName(tag) {
73
+ // Pattern: </(tag name) where tag name starts with letter, followed by letters/numbers/hyphens
74
+ const match = tag.match(/<\/(\w[\w-]*)/);
75
+ return match ? match[1] : null;
76
+ }
77
+ }
@@ -50,11 +50,12 @@ export class ValueController extends VegaSlimmer {
50
50
  * Watches the value of the editor and updates the internal value.
51
51
  */
52
52
  watchValueUpdate() {
53
+ const autoMatchFormat = this.sourceEditConfig.autoMatchFormat;
53
54
  if (this.value && !(this.value instanceof VegaRTEContent)) {
54
- this.value = VegaRTEContent.fromJSON(this.value);
55
+ this.value = VegaRTEContent.fromJSON(this.value, { autoMatchFormat });
55
56
  }
56
57
  else if (!this.value || this.value.children.length === 0) {
57
- this.value = VegaRTEContent.createEmptyContent();
58
+ this.value = VegaRTEContent.createEmptyContent({ autoMatchFormat });
58
59
  }
59
60
  else {
60
61
  this.changeEventEmitter.emit(this.value);
@@ -114,6 +115,9 @@ __decorate([
114
115
  __decorate([
115
116
  MapToComponentField()
116
117
  ], ValueController.prototype, "selectionController", void 0);
118
+ __decorate([
119
+ MapToComponentField()
120
+ ], ValueController.prototype, "sourceEditConfig", void 0);
117
121
  __decorate([
118
122
  MapToComponentMethod('connectedCallback')
119
123
  ], ValueController.prototype, "connectedCallback", null);
@@ -37,6 +37,9 @@ export class SourceEditToolbarButtonSlimmer extends ToolbarButtonSlimmer {
37
37
  }
38
38
  async saveSourceCode() {
39
39
  const sourceViewValue = this.vegaRichTextEditorRenderer.getSourceCode();
40
+ if (!sourceViewValue && this.value.isEmpty()) {
41
+ return;
42
+ }
40
43
  if (typeof sourceViewValue === 'string') {
41
44
  await this.valueController.flushChanges(VegaRTEContent.fromHtml(sourceViewValue, {
42
45
  autoMatchFormat: this.sourceEditConfig.autoMatchFormat,
@@ -62,3 +65,6 @@ __decorate([
62
65
  __decorate([
63
66
  MapToComponentField()
64
67
  ], SourceEditToolbarButtonSlimmer.prototype, "sourceEditConfig", void 0);
68
+ __decorate([
69
+ MapToComponentField()
70
+ ], SourceEditToolbarButtonSlimmer.prototype, "value", void 0);
@@ -39,6 +39,45 @@ describe('HTMLBlock', () => {
39
39
  ],
40
40
  }, { autoMatchFormat: false }).toHtml()).toMatchSnapshot();
41
41
  });
42
+ it('toHtml should handle self-closing hr tag correctly', () => {
43
+ const hrBlock = RTEHtmlBlock.from({
44
+ id: 'hr-1',
45
+ type: 'html-block',
46
+ htmlTag: 'hr',
47
+ children: [],
48
+ }, { autoMatchFormat: false });
49
+ expect(hrBlock.toHtml()).toBe('<hr>');
50
+ });
51
+ it('toHtml should handle self-closing hr tag with attributes correctly', () => {
52
+ const hrBlock = RTEHtmlBlock.from({
53
+ id: 'hr-1',
54
+ type: 'html-block',
55
+ htmlTag: 'hr',
56
+ annotations: { customClass: ['divider'] },
57
+ children: [],
58
+ }, { autoMatchFormat: false });
59
+ expect(hrBlock.toHtml()).toBe('<hr class="divider">');
60
+ });
61
+ it('toHtml should handle self-closing input tag correctly', () => {
62
+ const inputBlock = RTEHtmlBlock.from({
63
+ id: 'input-1',
64
+ type: 'html-block',
65
+ htmlTag: 'input',
66
+ annotations: { customAttribute: { type: 'text', placeholder: 'Enter text' } },
67
+ children: [],
68
+ }, { autoMatchFormat: false });
69
+ expect(inputBlock.toHtml()).toBe('<input type="text" placeholder="Enter text">');
70
+ });
71
+ it('toHtml should handle self-closing col tag correctly', () => {
72
+ const colBlock = RTEHtmlBlock.from({
73
+ id: 'col-1',
74
+ type: 'html-block',
75
+ htmlTag: 'col',
76
+ annotations: { customAttribute: { span: '2' } },
77
+ children: [],
78
+ }, { autoMatchFormat: false });
79
+ expect(colBlock.toHtml()).toBe('<col span="2">');
80
+ });
42
81
  });
43
82
  describe('public methods', () => {
44
83
  let htmlBlock;
@@ -1,4 +1,5 @@
1
1
  import { VegaRTEContent } from '../../dto/content-state';
2
+ import { HTMLContentCleaner } from '../../slimmers/controllers/html-cleaner';
2
3
  import { RTETextBlock } from '../../dto/blocks/text-block';
3
4
  import { RTEImageBlock } from '../../dto/blocks/image-block';
4
5
  import { RTEListBlock } from '../../dto/blocks/list-block';
@@ -2613,7 +2614,7 @@ describe('content state', () => {
2613
2614
  </footer>
2614
2615
  </article>
2615
2616
  <address>ADDRESS: 123 Main St, City, Country</address>
2616
- <blockquote cite="https://example.com">BLOCKQUOTE: “This is a quoted text.”ote>
2617
+ <blockquote cite="https://example.com">BLOCKQUOTE: “This is a quoted text.”</blockquote>
2617
2618
  <details>
2618
2619
  <summary>DETAILS / SUMMARY Example</summary>
2619
2620
  <p>Extra information shown when expanded.</p>
@@ -2797,6 +2798,11 @@ Line 1
2797
2798
  const paragraph = content.children[0];
2798
2799
  expect(paragraph.children[1].text).toEqual(' ');
2799
2800
  });
2801
+ it('should convert empty value as expect', async () => {
2802
+ const emptyContent = VegaRTEContent.fromHtml('', { autoMatchFormat: false });
2803
+ expect(emptyContent.toHtml()).toEqual('');
2804
+ expect(emptyContent.toJSON()).toEqual([]);
2805
+ });
2800
2806
  });
2801
2807
  describe('fromJSON', () => {
2802
2808
  it('should translate the paragraph as expect JSON', () => {
@@ -2950,4 +2956,168 @@ Line 1
2950
2956
  });
2951
2957
  });
2952
2958
  });
2959
+ describe('cleanHtmlWhitespace', () => {
2960
+ const cleaner = new HTMLContentCleaner();
2961
+ const cleanHtmlWhitespace = (html) => {
2962
+ return cleaner.clean(html);
2963
+ };
2964
+ it('should inline a table by removing all whitespace between tags', () => {
2965
+ const input = `<table style="width: 400px; border-collapse: collapse;"> <thead> <tr> ` +
2966
+ `<th style="padding: 12px; text-align: left; font-weight: bold;">Header 1</th> ` +
2967
+ `<th style="padding: 12px; text-align: left; font-weight: bold;">Header 2</th> ` +
2968
+ `<th style="padding: 12px; text-align: left; font-weight: bold;">Header 3</th> ` +
2969
+ `</tr> </thead> <tbody> <tr> <td style="padding: 12px;">Cell 1-1</td> ` +
2970
+ `<td style="padding: 12px;">Cell 1-2</td> <td style="padding: 12px;">Cell 1-3</td> ` +
2971
+ `</tr> <tr> <td style="padding: 12px;">Cell 2-1</td> <td style="padding: 12px;">Cell 2-2</td> ` +
2972
+ `<td style="padding: 12px;">Cell 2-3</td> </tr> <tr> <td style="padding: 12px;">Cell 3-1</td> ` +
2973
+ `<td style="padding: 12px;">Cell 3-2</td> <td style="padding: 12px;">Cell 3-3</td> ` +
2974
+ `</tr> </tbody> </table>`;
2975
+ const expected = `<table style="width: 400px; border-collapse: collapse;"><thead><tr>` +
2976
+ `<th style="padding: 12px; text-align: left; font-weight: bold;">Header 1</th>` +
2977
+ `<th style="padding: 12px; text-align: left; font-weight: bold;">Header 2</th>` +
2978
+ `<th style="padding: 12px; text-align: left; font-weight: bold;">Header 3</th>` +
2979
+ `</tr></thead><tbody><tr>` +
2980
+ `<td style="padding: 12px;">Cell 1-1</td>` +
2981
+ `<td style="padding: 12px;">Cell 1-2</td>` +
2982
+ `<td style="padding: 12px;">Cell 1-3</td>` +
2983
+ `</tr><tr>` +
2984
+ `<td style="padding: 12px;">Cell 2-1</td>` +
2985
+ `<td style="padding: 12px;">Cell 2-2</td>` +
2986
+ `<td style="padding: 12px;">Cell 2-3</td>` +
2987
+ `</tr><tr>` +
2988
+ `<td style="padding: 12px;">Cell 3-1</td>` +
2989
+ `<td style="padding: 12px;">Cell 3-2</td>` +
2990
+ `<td style="padding: 12px;">Cell 3-3</td>` +
2991
+ `</tr></tbody></table>`;
2992
+ expect(cleanHtmlWhitespace(input)).toBe(expected);
2993
+ });
2994
+ it('should remove \\n\\t after opening tag and before closing tag', () => {
2995
+ const input = '<p>\n\t <span>test</span>\n\t </p>';
2996
+ expect(cleanHtmlWhitespace(input)).toBe('<p><span>test</span></p>');
2997
+ });
2998
+ it('should remove all \\n and \\t characters', () => {
2999
+ const input = '<p>\n\ttest\n</p>';
3000
+ expect(cleanHtmlWhitespace(input)).toBe('<p>test</p>');
3001
+ });
3002
+ it('should preserve space between matching tags', () => {
3003
+ const input = '<span> </span>';
3004
+ expect(cleanHtmlWhitespace(input)).toBe('<span> </span>');
3005
+ });
3006
+ it('should preserve space with text between matching tags', () => {
3007
+ const input = '<span> test </span>';
3008
+ expect(cleanHtmlWhitespace(input)).toBe('<span> test </span>');
3009
+ });
3010
+ it('should preserve multiple spaces between matching tags', () => {
3011
+ const input = '<span> </span>';
3012
+ expect(cleanHtmlWhitespace(input)).toBe('<span> </span>');
3013
+ });
3014
+ it('should remove whitespace between opening tags', () => {
3015
+ const input = '<div>\n\t<p></p></div>';
3016
+ expect(cleanHtmlWhitespace(input)).toBe('<div><p></p></div>');
3017
+ });
3018
+ it('should remove \\n\\t after opening tag but preserve regular spaces', () => {
3019
+ const input = '<p>\n\t Hello</p>';
3020
+ expect(cleanHtmlWhitespace(input)).toBe('<p> Hello</p>');
3021
+ });
3022
+ it('should remove whitespace between multiple closing tags', () => {
3023
+ const input = '<table><tbody><tr></tr> </tbody> </table>';
3024
+ expect(cleanHtmlWhitespace(input)).toBe('<table><tbody><tr></tr></tbody></table>');
3025
+ });
3026
+ it('should remove whitespace between multiple opening tags', () => {
3027
+ const input = '<div> <span></span></div>';
3028
+ expect(cleanHtmlWhitespace(input)).toBe('<div><span></span></div>');
3029
+ });
3030
+ it('should handle complex nested structure', () => {
3031
+ const input = '<div>\n\t<p>\n\t\t<span>Hello</span>\n\t</p>\n</div>';
3032
+ expect(cleanHtmlWhitespace(input)).toBe('<div><p><span>Hello</span></p></div>');
3033
+ });
3034
+ it('should preserve regular spaces within text content', () => {
3035
+ const input = '<p>Hello World</p>';
3036
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello World</p>');
3037
+ });
3038
+ it('should preserve multiple spaces in text content', () => {
3039
+ const input = '<p>Hello World</p>';
3040
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello World</p>');
3041
+ });
3042
+ it('should not remove \\n between words in text content', () => {
3043
+ const input = '<p>Hello\nWorld</p>';
3044
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello\nWorld</p>');
3045
+ });
3046
+ it('should not remove \\n between words with space in text content', () => {
3047
+ const input = '<p>Hello\n World</p>';
3048
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello\n World</p>');
3049
+ });
3050
+ it('should remove newline after img tag', () => {
3051
+ const input = '<div><img id="image-id" class="img-class" style="vertical-align: bottom; width: 25%; padding: 20px" alt="test alt" src="data:image/svg+xml;base64,xxx=" data-size="sm">\n</div>';
3052
+ const expected = '<div><img id="image-id" class="img-class" style="vertical-align: bottom; width: 25%; padding: 20px" alt="test alt" src="data:image/svg+xml;base64,xxx=" data-size="sm"></div>';
3053
+ expect(cleanHtmlWhitespace(input)).toBe(expected);
3054
+ });
3055
+ it('should handle 4-level deep nesting', () => {
3056
+ const input = '<div>\n\t<section>\n\t\t<article>\n\t\t\t<p>Text</p>\n\t\t</article>\n\t</section>\n</div>';
3057
+ expect(cleanHtmlWhitespace(input)).toBe('<div><section><article><p>Text</p></article></section></div>');
3058
+ });
3059
+ it('should handle 5-level deep nesting', () => {
3060
+ const input = '<div>\n\t<section>\n\t\t<article>\n\t\t\t<main>\n\t\t\t\t<p>Text</p>\n\t\t\t</main>\n\t\t</article>\n\t</section>\n</div>';
3061
+ expect(cleanHtmlWhitespace(input)).toBe('<div><section><article><main><p>Text</p></main></article></section></div>');
3062
+ });
3063
+ it('should handle 6-level deep nesting', () => {
3064
+ const input = '<div>\n\t<section>\n\t\t<article>\n\t\t\t<main>\n\t\t\t\t<aside>\n\t\t\t\t\t<p>Text</p>\n\t\t\t\t</aside>\n\t\t\t</main>\n\t\t</article>\n\t</section>\n</div>';
3065
+ expect(cleanHtmlWhitespace(input)).toBe('<div><section><article><main><aside><p>Text</p></aside></main></article></section></div>');
3066
+ });
3067
+ it('should remove whitespace after br and hr tags', () => {
3068
+ const input1 = '<div><br>\n</div>';
3069
+ expect(cleanHtmlWhitespace(input1)).toBe('<div><br></div>');
3070
+ const input2 = '<div><hr>\n\t</div>';
3071
+ expect(cleanHtmlWhitespace(input2)).toBe('<div><hr></div>');
3072
+ const input3 = '<div><input type="text">\n</div>';
3073
+ expect(cleanHtmlWhitespace(input3)).toBe('<div><input type="text"></div>');
3074
+ });
3075
+ it('should remove multiple consecutive \\n characters', () => {
3076
+ const input = '<p>\n\n\n\nHello</p>';
3077
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
3078
+ });
3079
+ it('should remove multiple consecutive \\t characters', () => {
3080
+ const input = '<p>\t\t\tHello</p>';
3081
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
3082
+ });
3083
+ it('should preserve empty matching tags', () => {
3084
+ const input = '<span></span>';
3085
+ expect(cleanHtmlWhitespace(input)).toBe('<span></span>');
3086
+ });
3087
+ it('should handle mixed spaces, tabs, and newlines', () => {
3088
+ const input = '<div> \n\t <p>Text</p> \n\t </div>';
3089
+ expect(cleanHtmlWhitespace(input)).toBe('<div><p>Text</p></div>');
3090
+ });
3091
+ it('should preserve spaces in attribute values', () => {
3092
+ const input = '<p class="my custom class">Text</p>';
3093
+ expect(cleanHtmlWhitespace(input)).toBe('<p class="my custom class">Text</p>');
3094
+ });
3095
+ it('should remove newlines after br tags', () => {
3096
+ const input = '<p>Line 1<br>\nLine 2</p>';
3097
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Line 1<br>Line 2</p>');
3098
+ });
3099
+ it('should preserve spaces in code blocks between matching tags', () => {
3100
+ const input = '<code> const x = 1; </code>';
3101
+ expect(cleanHtmlWhitespace(input)).toBe('<code> const x = 1; </code>');
3102
+ });
3103
+ it('should handle empty string', () => {
3104
+ expect(cleanHtmlWhitespace('')).toBe('');
3105
+ });
3106
+ it('should preserve plain text without tags', () => {
3107
+ const input = 'Hello World';
3108
+ expect(cleanHtmlWhitespace(input)).toBe('Hello World');
3109
+ });
3110
+ it('should remove whitespace between different inline elements', () => {
3111
+ const input = '<span>text</span>\n\t<strong>bold</strong>';
3112
+ expect(cleanHtmlWhitespace(input)).toBe('<span>text</span><strong>bold</strong>');
3113
+ });
3114
+ it('should remove \\t\\n combination', () => {
3115
+ const input = '<p>\t\nHello</p>';
3116
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
3117
+ });
3118
+ it('should remove complex \\n\\t\\n patterns', () => {
3119
+ const input = '<p>\n\t\n\t\nHello</p>';
3120
+ expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
3121
+ });
3122
+ });
2953
3123
  });