@globalpayments/vega 2.97.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.
- package/dist/cjs/{action-color-accessibility-validator-24498816.js → action-color-accessibility-validator-b8a9ef0f.js} +2 -2
- package/dist/cjs/{app-globals-3f57f7b9.js → app-globals-a306dce6.js} +10 -10
- package/dist/cjs/{aria-dialog-focusable-trap-slimmer-73b4c0cb.js → aria-dialog-focusable-trap-slimmer-62147489.js} +1 -1
- package/dist/cjs/{code-block-28a7732e.js → code-block-ea1f5eb3.js} +58 -14
- package/dist/cjs/{component-global-style-slimmer-93c5fb50.js → component-global-style-slimmer-ba588eb4.js} +1 -1
- package/dist/cjs/{component-value-history-controller-slimmer.abstract-50cdba6e.js → component-value-history-controller-slimmer.abstract-7071b064.js} +25 -6
- package/dist/cjs/constants-907d7d89.js +16 -0
- package/dist/cjs/{content-state-e2ab0f06.js → content-state-8d07d530.js} +61 -9
- package/dist/cjs/{dark-mode-style-controller-32d4054a.js → dark-mode-style-controller-f3da3342.js} +2 -2
- package/dist/cjs/{date-required-rule-5250f26d.js → date-required-rule-c0c498ad.js} +1 -1
- package/dist/cjs/{design-token-74674ee7.js → design-token-58bf7fe8.js} +3 -3
- package/dist/cjs/{element-appender-slimmer-ccb2e3c2.js → element-appender-slimmer-a0269315.js} +3 -3
- package/dist/cjs/{form-field-controller-slimmer-58621b5e.js → form-field-controller-slimmer-f73f200e.js} +4 -4
- package/dist/cjs/{image-annotation-action-b54dc669.js → image-annotation-action-2a28038e.js} +3 -3
- package/dist/cjs/{image-extension-1e3eeaa3.js → image-extension-9659708b.js} +2 -2
- package/dist/cjs/{index-592b4052.js → index-5d1adcd1.js} +86 -0
- package/dist/cjs/index.cjs.js +20 -20
- package/dist/cjs/{inject-keyboard-manager-6a6f5c9f.js → inject-keyboard-manager-4fa45f9c.js} +1 -1
- package/dist/cjs/{internal-calendar-period-factory-dfcdd3f6.js → internal-calendar-period-factory-6196bc80.js} +1 -1
- package/dist/cjs/{internal-translation-controller-1dac2df8.js → internal-translation-controller-51f7f865.js} +2 -0
- package/dist/cjs/{keyboard-manager-c56033b1.js → keyboard-manager-482fe257.js} +1 -1
- package/dist/cjs/{keyboard-manager-slimmer-7043a106.js → keyboard-manager-slimmer-a19430dd.js} +1 -1
- package/dist/cjs/{link-extension-71c27ff3.js → link-extension-11340e1c.js} +26 -7
- package/dist/cjs/loader.cjs.js +15 -15
- package/dist/cjs/{month-view-generator-7b704a80.js → month-view-generator-1a534451.js} +1 -1
- package/dist/cjs/{public-rules-55e34d2e.js → public-rules-6c77b545.js} +10 -10
- package/dist/cjs/{range-eebe0e3c.js → range-22ddd452.js} +1 -1
- package/dist/cjs/{responsive-format-facade-493d1763.js → responsive-format-facade-74e6d791.js} +1 -1
- package/dist/cjs/{rich-text-editor-required-rule-4fdee376.js → rich-text-editor-required-rule-09d1093a.js} +1 -1
- package/dist/cjs/{split-cell-operation-51097409.js → split-cell-operation-11bfb305.js} +14 -4
- package/dist/cjs/{state-border-formatter-711c7aaa.js → state-border-formatter-bf4f9f1c.js} +1 -1
- package/dist/cjs/{string-format-strategy.abstract-b61bdcbd.js → string-format-strategy.abstract-bf37b14c.js} +1 -1
- package/dist/cjs/{string-input-formatter-slimmer-18d45942.js → string-input-formatter-slimmer-ffeb18a6.js} +3 -3
- package/dist/cjs/{string-mask-strategy-ad3fa0ac.js → string-mask-strategy-7f394726.js} +2 -2
- package/dist/cjs/{style-formatter-8f711cb0.js → style-formatter-4ac63910.js} +2 -2
- package/dist/cjs/{sub-state-notify-slimmer-18891389.js → sub-state-notify-slimmer-e264a120.js} +1 -1
- package/dist/cjs/{sub-state-observer-slimmer-eee2f0ae.js → sub-state-observer-slimmer-6033b824.js} +1 -1
- package/dist/cjs/{time-required-rule-87417359.js → time-required-rule-e2a50003.js} +1 -1
- package/dist/cjs/{token-extension-608bbf7b.js → token-extension-4686cb3b.js} +2921 -158
- package/dist/cjs/{translation-slimmer-77c7f37d.js → translation-slimmer-e4997f8f.js} +1 -1
- package/dist/cjs/{type-guard-a57ef3ac.js → type-guard-b8d7bb3f.js} +1 -1
- package/dist/cjs/{valid-credit-card-number-rule-4c0a3040.js → valid-credit-card-number-rule-f5a6f009.js} +1 -1
- package/dist/cjs/vega-accordion.cjs.entry.js +6 -6
- package/dist/cjs/vega-app-footer.cjs.entry.js +2 -2
- package/dist/cjs/vega-app-header-button.cjs.entry.js +5 -5
- package/dist/cjs/vega-box.cjs.entry.js +7 -7
- package/dist/cjs/vega-brand-logo.cjs.entry.js +2 -2
- package/dist/cjs/vega-breadcrumb.cjs.entry.js +2 -2
- package/dist/cjs/vega-button-circle.cjs.entry.js +7 -7
- package/dist/cjs/vega-button-group_2.cjs.entry.js +3 -3
- package/dist/cjs/vega-button-link.cjs.entry.js +1 -1
- package/dist/cjs/vega-button.cjs.entry.js +5 -5
- package/dist/cjs/vega-calendar_5.cjs.entry.js +24 -13
- package/dist/cjs/vega-card.cjs.entry.js +5 -5
- package/dist/cjs/vega-carousel.cjs.entry.js +3 -3
- package/dist/cjs/vega-checkbox_2.cjs.entry.js +5 -5
- package/dist/cjs/vega-chip.cjs.entry.js +5 -5
- package/dist/cjs/vega-code-block.cjs.entry.js +16 -29
- package/dist/cjs/vega-color-picker.cjs.entry.js +5 -5
- package/dist/cjs/vega-color-swatch-picker.cjs.entry.js +6 -6
- package/dist/cjs/vega-color-swatch.cjs.entry.js +2 -2
- package/dist/cjs/vega-combo-box.cjs.entry.js +11 -11
- package/dist/cjs/vega-counter-badge.cjs.entry.js +2 -2
- package/dist/cjs/vega-date-picker_2.cjs.entry.js +18 -18
- package/dist/cjs/vega-dialog_2.cjs.entry.js +7 -7
- package/dist/cjs/vega-divider.cjs.entry.js +5 -5
- package/dist/cjs/vega-dropdown_5.cjs.entry.js +46 -31
- package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
- package/dist/cjs/vega-field-label.cjs.entry.js +3 -3
- package/dist/cjs/vega-file-uploader.cjs.entry.js +41 -8
- package/dist/cjs/vega-flag-icon.cjs.entry.js +5 -5
- package/dist/cjs/vega-flex.cjs.entry.js +6 -6
- package/dist/cjs/vega-font.cjs.entry.js +5 -5
- package/dist/cjs/vega-form.cjs.entry.js +5 -5
- package/dist/cjs/vega-grid.cjs.entry.js +5 -5
- package/dist/cjs/vega-icon.cjs.entry.js +6 -6
- package/dist/cjs/vega-image-uploader.cjs.entry.js +9 -9
- package/dist/cjs/vega-input-credit-card.cjs.entry.js +9 -9
- package/dist/cjs/vega-input-numeric.cjs.entry.js +9 -9
- package/dist/cjs/vega-input-passcode.cjs.entry.js +8 -8
- package/dist/cjs/vega-input-phone-number.cjs.entry.js +7 -7
- package/dist/cjs/vega-input-range.cjs.entry.js +6 -6
- package/dist/cjs/vega-input-select.cjs.entry.js +8 -8
- package/dist/cjs/vega-input.cjs.entry.js +17 -12
- package/dist/cjs/{vega-internal-event-id-ecc5b87a.js → vega-internal-event-id-f4d33037.js} +2 -0
- package/dist/cjs/vega-left-nav_5.cjs.entry.js +13 -13
- package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +3 -3
- package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +1 -1
- package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +3 -3
- package/dist/cjs/vega-pagination.cjs.entry.js +5 -5
- package/dist/cjs/vega-popover_2.cjs.entry.js +10 -10
- package/dist/cjs/vega-progress-tracker_2.cjs.entry.js +6 -6
- package/dist/cjs/vega-radio_2.cjs.entry.js +8 -8
- package/dist/cjs/vega-rich-text-content.cjs.entry.js +42 -14
- package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +83 -26
- package/dist/cjs/vega-rich-text-find-replace-panel.cjs.entry.js +1 -1
- package/dist/cjs/vega-rich-text-special-characters-panel.cjs.entry.js +5 -5
- package/dist/cjs/vega-rich-text-table-properties_3.cjs.entry.js +11 -11
- package/dist/cjs/vega-selection-chip_2.cjs.entry.js +8 -8
- package/dist/cjs/vega-selection-tile_2.cjs.entry.js +6 -6
- package/dist/cjs/vega-sidenav_3.cjs.entry.js +6 -6
- package/dist/cjs/vega-signature-capture.cjs.entry.js +10 -10
- package/dist/cjs/vega-stepper.cjs.entry.js +5 -5
- package/dist/cjs/vega-tab-group_2.cjs.entry.js +21 -8
- package/dist/cjs/vega-table_11.cjs.entry.js +1219 -489
- package/dist/cjs/vega-textarea.cjs.entry.js +5 -5
- package/dist/cjs/vega-time-picker_2.cjs.entry.js +12 -12
- package/dist/cjs/vega-toggle-switch.cjs.entry.js +5 -5
- package/dist/cjs/vega-tooltip_2.cjs.entry.js +7 -7
- package/dist/cjs/vega.cjs.js +15 -15
- package/dist/cjs/{wait-for-component-did-render-02ca4bee.js → wait-for-component-did-render-44d006ee.js} +1 -1
- package/dist/collection/components/vega-accordion/vega-accordion.js +2 -0
- package/dist/collection/components/vega-app-footer/vega-app-footer.js +2 -0
- package/dist/collection/components/vega-app-header-button/vega-app-header-button.js +2 -0
- package/dist/collection/components/vega-banner/vega-banner.js +2 -0
- package/dist/collection/components/vega-box/vega-box.js +2 -0
- package/dist/collection/components/vega-brand-logo/vega-brand-logo.js +2 -0
- package/dist/collection/components/vega-breadcrumb/vega-breadcrumb.js +2 -0
- package/dist/collection/components/vega-button/vega-button.js +2 -0
- package/dist/collection/components/vega-button-circle/vega-button-circle.js +2 -0
- package/dist/collection/components/vega-button-group/vega-button-group.js +2 -0
- package/dist/collection/components/vega-button-link/vega-button-link.js +2 -0
- package/dist/collection/components/vega-calendar/slimmers/common/renderers/vega-calendar-event-item-renderer.js +5 -2
- package/dist/collection/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.js +9 -1
- package/dist/collection/components/vega-calendar/vega-calendar.js +2 -0
- package/dist/collection/components/vega-card/vega-card.js +2 -0
- package/dist/collection/components/vega-carousel/vega-carousel.js +2 -0
- package/dist/collection/components/vega-checkbox/vega-checkbox.js +2 -0
- package/dist/collection/components/vega-chip/vega-chip.js +2 -0
- package/dist/collection/components/vega-code-block/slimmers/controllers/code-highlight-parser.abstract.js +4 -17
- package/dist/collection/components/vega-color-picker/vega-color-picker.js +2 -0
- package/dist/collection/components/vega-combo-box/vega-combo-box.js +2 -0
- package/dist/collection/components/vega-counter-badge/vega-counter-badge.js +4 -2
- package/dist/collection/components/vega-date-picker/vega-date-picker.js +2 -0
- package/dist/collection/components/vega-divider/vega-divider.js +2 -0
- package/dist/collection/components/vega-dropdown/constants.js +10 -0
- package/dist/collection/components/vega-dropdown/vega-dropdown-group/slimmers/renderers/vega-dropdown-group-renderer.js +6 -4
- package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.js +10 -2
- package/dist/collection/components/vega-dropdown/vega-dropdown.js +45 -14
- package/dist/collection/components/vega-field-error/vega-field-error.js +2 -0
- package/dist/collection/components/vega-field-label/vega-field-label.css +1 -0
- package/dist/collection/components/vega-file-uploader/slimmers/renderers/vega-file-uploader-file-list-renderer.js +22 -2
- package/dist/collection/components/vega-file-uploader/vega-file-uploader.js +63 -6
- package/dist/collection/components/vega-flag-icon/vega-flag-icon.js +2 -0
- package/dist/collection/components/vega-flex/vega-flex.js +2 -0
- package/dist/collection/components/vega-font/vega-font.js +2 -0
- package/dist/collection/components/vega-form/vega-form.js +2 -0
- package/dist/collection/components/vega-grid/vega-grid.js +2 -0
- package/dist/collection/components/vega-icon/vega-icon.js +2 -0
- package/dist/collection/components/vega-image-uploader/vega-image-uploader.js +2 -0
- package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-suggestions-renderer.js +7 -2
- package/dist/collection/components/vega-input/vega-input.js +2 -0
- package/dist/collection/components/vega-input-credit-card/vega-input-credit-card.js +2 -0
- package/dist/collection/components/vega-input-numeric/vega-input-numeric.js +2 -0
- package/dist/collection/components/vega-input-passcode/vega-input-passcode.js +2 -0
- package/dist/collection/components/vega-input-phone-number/vega-input-phone-number.js +2 -0
- package/dist/collection/components/vega-input-range/vega-input-range.js +2 -0
- package/dist/collection/components/vega-input-select/vega-input-select.js +2 -0
- package/dist/collection/components/vega-item-toggle/vega-item-toggle.js +2 -0
- package/dist/collection/components/vega-loading-indicator/vega-loading-indicator.js +2 -0
- package/dist/collection/components/vega-modal/vega-modal.js +2 -0
- package/dist/collection/components/vega-page-notification/vega-page-notification.js +2 -0
- package/dist/collection/components/vega-pagination/vega-pagination.js +2 -0
- package/dist/collection/components/vega-popover/vega-popover.js +2 -0
- package/dist/collection/components/vega-progress-tracker/vega-progress-tracker.js +2 -0
- package/dist/collection/components/vega-radio/vega-radio.js +2 -0
- package/dist/collection/components/vega-rich-text-editor/constants/constant.js +16 -0
- package/dist/collection/components/vega-rich-text-editor/dto/annotations/text-style-default-styles.js +2 -1
- package/dist/collection/components/vega-rich-text-editor/dto/blocks/block.abstract.js +11 -0
- package/dist/collection/components/vega-rich-text-editor/dto/blocks/text-block.js +3 -0
- package/dist/collection/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy-registry.js +2 -1
- package/dist/collection/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy.abstract.js +5 -2
- package/dist/collection/components/vega-rich-text-editor/dto/filter-styles-strategies/text-node/title-heading-node-filter-styles-strategy.js +36 -2
- package/dist/collection/components/vega-rich-text-editor/dto/nodes/code-block-node.js +2 -1
- package/dist/collection/components/vega-rich-text-editor/dto/renderers/blocks/block-text-nodes-renderer.abstract.js +20 -3
- package/dist/collection/components/vega-rich-text-editor/dto/renderers/nodes/text-node-renderer.js +12 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/block-boundary-registry.js +34 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/extension.abstract.js +20 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/action-handler-strategies/insert-function-block-strategy.js +3 -2
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/constants.js +8 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/dto/function-block.js +14 -3
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/dto/logic-control-block.js +2 -1
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-containing-function-block-strategy.js +19 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-to-function-block-strategy.js +9 -5
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-to-function-content-strategy.js +3 -3
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-to-logic-control-block-strategy.js +4 -2
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/function-extension.js +18 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/renderers/function-block-renderer.js +5 -2
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/renderers/logic-control-block-renderer.js +2 -1
- package/dist/collection/components/vega-rich-text-editor/extensions/functions/utils.js +36 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/languages/language-extension.js +1 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/action-handler-strategies/image-replace-src-strategy.js +21 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/actions/image-replace-src-action.js +13 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/paste-image-parser.js +295 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/pending-image-registry.js +116 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-chooser-ui.js +13 -4
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-extension.js +70 -7
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/default-paste-strategy.js +38 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/paste-processing-strategy.abstract.js +55 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/paste-strategy-selector.js +59 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/strategies/word-paste-strategy.js +416 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-code-block-transformer.js +106 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-image-transformer.js +198 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-list-transformer.js +591 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-paragraph-transformer.js +112 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-table-transformer.js +551 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-transformer.js +7 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/table/dto/table-block.js +10 -0
- package/dist/collection/components/vega-rich-text-editor/extensions/tokens/span-to-token-node-strategy.js +4 -2
- package/dist/collection/components/vega-rich-text-editor/extensions/tokens/token-node.js +44 -0
- package/dist/collection/components/vega-rich-text-editor/helpers/utils.js +10 -6
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/extension-controller.js +2 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/annotation-handler/text-style-annotation-handler.js +7 -4
- 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
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/insert-paste-handler.js +18 -4
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/selection-controller.js +21 -2
- package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.js +7 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/vega-rich-text-editor-source-view-renderer.js +5 -2
- package/dist/collection/components/vega-rich-text-editor/vega-rich-text-editor.js +2 -0
- package/dist/collection/components/vega-section-title/vega-section-title.js +2 -0
- package/dist/collection/components/vega-segment-control/vega-segment-control.js +2 -0
- package/dist/collection/components/vega-selection-chip/vega-selection-chip.js +2 -0
- package/dist/collection/components/vega-selection-tile/vega-selection-tile.js +2 -0
- package/dist/collection/components/vega-sidenav/vega-sidenav.js +2 -0
- package/dist/collection/components/vega-signature-capture/vega-signature-capture.js +2 -0
- package/dist/collection/components/vega-skeleton/vega-skeleton.js +2 -0
- package/dist/collection/components/vega-stepper/vega-stepper.js +2 -0
- package/dist/collection/components/vega-tab-group/slimmers/vega-tab-group/renderers/vega-tab-group-tab-list-renderer.js +14 -7
- package/dist/collection/components/vega-tab-group/vega-tab-group.css +6 -0
- package/dist/collection/components/vega-tab-group/vega-tab-group.js +7 -0
- package/dist/collection/components/vega-table/slimmers/controllers/vega-table-body-col-span-controller.js +31 -1
- package/dist/collection/components/vega-table/slimmers/controllers/vega-table-column-structure-model-controller.js +17 -7
- package/dist/collection/components/vega-table/slimmers/controllers/vega-table-head-template-structure-controller.js +440 -0
- package/dist/collection/components/vega-table/slimmers/controllers/vega-table-render-input-controller.js +11 -3
- package/dist/collection/components/vega-table/slimmers/renderers/vega-table-body-col-span-resolver.js +18 -11
- package/dist/collection/components/vega-table/slimmers/renderers/vega-table-pinned-renderer.js +207 -17
- package/dist/collection/components/vega-table/vega-table-foot/vega-table-foot.css +1 -0
- package/dist/collection/components/vega-table/vega-table-foot-cell/slimmers/renderers/vega-table-foot-cell-renderer.js +4 -1
- package/dist/collection/components/vega-table/vega-table-foot-cell/vega-table-foot-cell.css +15 -0
- package/dist/collection/components/vega-table/vega-table-foot-cell/vega-table-foot-cell.js +1 -1
- package/dist/collection/components/vega-table/vega-table-head-cell/slimmers/controllers/vega-table-head-cell-template-structure-controller.js +28 -0
- package/dist/collection/components/vega-table/vega-table-head-cell/vega-table-head-cell.css +1 -0
- package/dist/collection/components/vega-table/vega-table-head-cell/vega-table-head-cell.js +68 -4
- package/dist/collection/components/vega-table/vega-table.js +15 -0
- package/dist/collection/components/vega-textarea/vega-textarea.js +2 -0
- package/dist/collection/components/vega-time-picker/vega-time-picker.js +2 -0
- package/dist/collection/components/vega-toggle-switch/vega-toggle-switch.js +2 -0
- package/dist/collection/components/vega-tooltip/vega-tooltip.js +2 -0
- package/dist/collection/helpers/event-manager/event-id/vega-internal-event-id.js +1 -0
- package/dist/collection/helpers/translation/locales/en.js +2 -0
- package/dist/collection/utils/sanitize/index.js +3 -2
- package/dist/collection/utils/sanitize/strategies/index.js +1 -0
- package/dist/collection/utils/sanitize/strategies/label-sanitize-strategy.js +14 -0
- package/dist/collection/utils/sanitize/strategies/plain-text-sanitize-strategy.js +70 -0
- package/dist/esm/{action-color-accessibility-validator-ce55cb07.js → action-color-accessibility-validator-08877515.js} +2 -2
- package/dist/esm/{app-globals-d3991e53.js → app-globals-c59364c2.js} +10 -10
- package/dist/esm/{aria-dialog-focusable-trap-slimmer-9eae86c6.js → aria-dialog-focusable-trap-slimmer-f069f54d.js} +1 -1
- package/dist/esm/{code-block-8df86434.js → code-block-e6443949.js} +54 -15
- package/dist/esm/{component-global-style-slimmer-ac703085.js → component-global-style-slimmer-7d60a04a.js} +1 -1
- package/dist/esm/{component-value-history-controller-slimmer.abstract-e4b95997.js → component-value-history-controller-slimmer.abstract-ee393213.js} +25 -6
- package/dist/esm/constants-4725f97f.js +13 -0
- package/dist/esm/{content-state-c63fbeda.js → content-state-43cdacff.js} +61 -10
- package/dist/esm/{dark-mode-style-controller-ca5afd2d.js → dark-mode-style-controller-352f15ff.js} +2 -2
- package/dist/esm/{date-required-rule-85334d0c.js → date-required-rule-b5b67498.js} +1 -1
- package/dist/esm/{design-token-10ff79b5.js → design-token-8319bb59.js} +3 -3
- package/dist/esm/{element-appender-slimmer-24be8e94.js → element-appender-slimmer-c81d1fe3.js} +3 -3
- package/dist/esm/{form-field-controller-slimmer-d8628837.js → form-field-controller-slimmer-511b7ac5.js} +4 -4
- package/dist/esm/{image-annotation-action-fcceff95.js → image-annotation-action-d7cb80aa.js} +3 -3
- package/dist/esm/{image-extension-3280bdb0.js → image-extension-9b8abd0d.js} +2 -2
- package/dist/esm/{index-3b327f29.js → index-35451d12.js} +86 -1
- package/dist/esm/index.js +20 -20
- package/dist/esm/{inject-keyboard-manager-ea1aad5b.js → inject-keyboard-manager-dd368d56.js} +1 -1
- package/dist/esm/{internal-calendar-period-factory-7b294fb6.js → internal-calendar-period-factory-d58f35c6.js} +1 -1
- package/dist/esm/{internal-translation-controller-fac22598.js → internal-translation-controller-b33430c6.js} +2 -0
- package/dist/esm/{keyboard-manager-50da85d7.js → keyboard-manager-b4a0d97d.js} +1 -1
- package/dist/esm/{keyboard-manager-slimmer-1f7c8bfb.js → keyboard-manager-slimmer-0517fc70.js} +1 -1
- package/dist/esm/{link-extension-f92c06ef.js → link-extension-230bae8d.js} +26 -7
- package/dist/esm/loader.js +15 -15
- package/dist/esm/{month-view-generator-a1a9a4ec.js → month-view-generator-f470caac.js} +1 -1
- package/dist/esm/{public-rules-3695aaf7.js → public-rules-28ef32d3.js} +10 -10
- package/dist/esm/{range-717d552d.js → range-efad2578.js} +1 -1
- package/dist/esm/{responsive-format-facade-f19b601c.js → responsive-format-facade-dec87e46.js} +1 -1
- package/dist/esm/{rich-text-editor-required-rule-2e39264a.js → rich-text-editor-required-rule-a697e5bd.js} +1 -1
- package/dist/esm/{split-cell-operation-6c26af91.js → split-cell-operation-89b91a38.js} +14 -4
- package/dist/esm/{state-border-formatter-bfda33aa.js → state-border-formatter-1e900a2f.js} +1 -1
- package/dist/esm/{string-format-strategy.abstract-1f4ff1b3.js → string-format-strategy.abstract-d0ce3f65.js} +1 -1
- package/dist/esm/{string-input-formatter-slimmer-68b2af39.js → string-input-formatter-slimmer-6546cfc7.js} +3 -3
- package/dist/esm/{string-mask-strategy-bbbcdbef.js → string-mask-strategy-dd13ae21.js} +2 -2
- package/dist/esm/{style-formatter-e9adc8f4.js → style-formatter-057d7120.js} +2 -2
- package/dist/esm/{sub-state-notify-slimmer-0f72ce74.js → sub-state-notify-slimmer-23b7d0e8.js} +1 -1
- package/dist/esm/{sub-state-observer-slimmer-64532d94.js → sub-state-observer-slimmer-722f6b92.js} +1 -1
- package/dist/esm/{time-required-rule-1ce2d0a0.js → time-required-rule-73753a54.js} +1 -1
- package/dist/esm/{token-extension-5082a4d2.js → token-extension-74a0eeb1.js} +2919 -156
- package/dist/esm/{translation-slimmer-ee0f0e76.js → translation-slimmer-ef970ffc.js} +1 -1
- package/dist/esm/{type-guard-f2624334.js → type-guard-6fc96870.js} +1 -1
- package/dist/esm/{valid-credit-card-number-rule-60212b1d.js → valid-credit-card-number-rule-b54a31e7.js} +1 -1
- package/dist/esm/vega-accordion.entry.js +6 -6
- package/dist/esm/vega-app-footer.entry.js +2 -2
- package/dist/esm/vega-app-header-button.entry.js +5 -5
- package/dist/esm/vega-box.entry.js +7 -7
- package/dist/esm/vega-brand-logo.entry.js +2 -2
- package/dist/esm/vega-breadcrumb.entry.js +2 -2
- package/dist/esm/vega-button-circle.entry.js +7 -7
- package/dist/esm/vega-button-group_2.entry.js +3 -3
- package/dist/esm/vega-button-link.entry.js +1 -1
- package/dist/esm/vega-button.entry.js +5 -5
- package/dist/esm/vega-calendar_5.entry.js +24 -13
- package/dist/esm/vega-card.entry.js +5 -5
- package/dist/esm/vega-carousel.entry.js +3 -3
- package/dist/esm/vega-checkbox_2.entry.js +5 -5
- package/dist/esm/vega-chip.entry.js +5 -5
- package/dist/esm/vega-code-block.entry.js +16 -29
- package/dist/esm/vega-color-picker.entry.js +5 -5
- package/dist/esm/vega-color-swatch-picker.entry.js +6 -6
- package/dist/esm/vega-color-swatch.entry.js +2 -2
- package/dist/esm/vega-combo-box.entry.js +11 -11
- package/dist/esm/vega-counter-badge.entry.js +2 -2
- package/dist/esm/vega-date-picker_2.entry.js +18 -18
- package/dist/esm/vega-dialog_2.entry.js +7 -7
- package/dist/esm/vega-divider.entry.js +5 -5
- package/dist/esm/vega-dropdown_5.entry.js +42 -27
- package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
- package/dist/esm/vega-field-label.entry.js +3 -3
- package/dist/esm/vega-file-uploader.entry.js +41 -8
- package/dist/esm/vega-flag-icon.entry.js +5 -5
- package/dist/esm/vega-flex.entry.js +6 -6
- package/dist/esm/vega-font.entry.js +5 -5
- package/dist/esm/vega-form.entry.js +5 -5
- package/dist/esm/vega-grid.entry.js +5 -5
- package/dist/esm/vega-icon.entry.js +6 -6
- package/dist/esm/vega-image-uploader.entry.js +9 -9
- package/dist/esm/vega-input-credit-card.entry.js +9 -9
- package/dist/esm/vega-input-numeric.entry.js +9 -9
- package/dist/esm/vega-input-passcode.entry.js +8 -8
- package/dist/esm/vega-input-phone-number.entry.js +7 -7
- package/dist/esm/vega-input-range.entry.js +6 -6
- package/dist/esm/vega-input-select.entry.js +8 -8
- package/dist/esm/vega-input.entry.js +17 -12
- package/dist/esm/{vega-internal-event-id-827eb1ce.js → vega-internal-event-id-86fce049.js} +2 -1
- package/dist/esm/vega-left-nav_5.entry.js +13 -13
- package/dist/esm/vega-loader-wrapper_2.entry.js +3 -3
- package/dist/esm/vega-pagination-page-selector-mobile.entry.js +1 -1
- package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +3 -3
- package/dist/esm/vega-pagination.entry.js +5 -5
- package/dist/esm/vega-popover_2.entry.js +10 -10
- package/dist/esm/vega-progress-tracker_2.entry.js +6 -6
- package/dist/esm/vega-radio_2.entry.js +8 -8
- package/dist/esm/vega-rich-text-content.entry.js +42 -14
- package/dist/esm/vega-rich-text-editor_4.entry.js +83 -26
- package/dist/esm/vega-rich-text-find-replace-panel.entry.js +1 -1
- package/dist/esm/vega-rich-text-special-characters-panel.entry.js +5 -5
- package/dist/esm/vega-rich-text-table-properties_3.entry.js +11 -11
- package/dist/esm/vega-selection-chip_2.entry.js +8 -8
- package/dist/esm/vega-selection-tile_2.entry.js +6 -6
- package/dist/esm/vega-sidenav_3.entry.js +6 -6
- package/dist/esm/vega-signature-capture.entry.js +10 -10
- package/dist/esm/vega-stepper.entry.js +5 -5
- package/dist/esm/vega-tab-group_2.entry.js +21 -8
- package/dist/esm/vega-table_11.entry.js +1194 -464
- package/dist/esm/vega-textarea.entry.js +5 -5
- package/dist/esm/vega-time-picker_2.entry.js +12 -12
- package/dist/esm/vega-toggle-switch.entry.js +5 -5
- package/dist/esm/vega-tooltip_2.entry.js +7 -7
- package/dist/esm/vega.js +15 -15
- package/dist/esm/{wait-for-component-did-render-0c237cb8.js → wait-for-component-did-render-ff7062aa.js} +1 -1
- package/dist/sri/vega-sri-manifest.json +371 -367
- package/dist/types/components/vega-accordion/vega-accordion.d.ts +2 -0
- package/dist/types/components/vega-app-footer/vega-app-footer.d.ts +2 -0
- package/dist/types/components/vega-app-header-button/vega-app-header-button.d.ts +2 -0
- package/dist/types/components/vega-banner/vega-banner.d.ts +2 -0
- package/dist/types/components/vega-box/vega-box.d.ts +2 -0
- package/dist/types/components/vega-brand-logo/vega-brand-logo.d.ts +2 -0
- package/dist/types/components/vega-breadcrumb/vega-breadcrumb.d.ts +2 -0
- package/dist/types/components/vega-button/vega-button.d.ts +2 -0
- package/dist/types/components/vega-button-circle/vega-button-circle.d.ts +2 -0
- package/dist/types/components/vega-button-group/vega-button-group.d.ts +2 -0
- package/dist/types/components/vega-button-link/vega-button-link.d.ts +2 -0
- package/dist/types/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.d.ts +2 -0
- package/dist/types/components/vega-calendar/vega-calendar.d.ts +2 -0
- package/dist/types/components/vega-card/vega-card.d.ts +2 -0
- package/dist/types/components/vega-carousel/vega-carousel.d.ts +2 -0
- package/dist/types/components/vega-checkbox/vega-checkbox.d.ts +2 -0
- package/dist/types/components/vega-chip/vega-chip.d.ts +2 -0
- package/dist/types/components/vega-code-block/slimmers/controllers/code-highlight-parser.abstract.d.ts +2 -1
- package/dist/types/components/vega-color-picker/vega-color-picker.d.ts +2 -0
- package/dist/types/components/vega-combo-box/vega-combo-box.d.ts +2 -0
- package/dist/types/components/vega-counter-badge/vega-counter-badge.d.ts +2 -0
- package/dist/types/components/vega-date-picker/vega-date-picker.d.ts +2 -0
- package/dist/types/components/vega-divider/vega-divider.d.ts +2 -0
- package/dist/types/components/vega-dropdown/constants.d.ts +12 -0
- package/dist/types/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.d.ts +1 -0
- package/dist/types/components/vega-dropdown/vega-dropdown.d.ts +9 -0
- package/dist/types/components/vega-field-error/vega-field-error.d.ts +2 -0
- package/dist/types/components/vega-file-uploader/slimmers/renderers/vega-file-uploader-file-list-renderer.d.ts +10 -0
- package/dist/types/components/vega-file-uploader/types.d.ts +4 -0
- package/dist/types/components/vega-file-uploader/vega-file-uploader.d.ts +15 -0
- package/dist/types/components/vega-flag-icon/vega-flag-icon.d.ts +2 -0
- package/dist/types/components/vega-flex/vega-flex.d.ts +2 -0
- package/dist/types/components/vega-font/vega-font.d.ts +2 -0
- package/dist/types/components/vega-form/vega-form.d.ts +2 -0
- package/dist/types/components/vega-grid/vega-grid.d.ts +2 -0
- package/dist/types/components/vega-icon/vega-icon.d.ts +2 -0
- package/dist/types/components/vega-image-uploader/vega-image-uploader.d.ts +2 -0
- package/dist/types/components/vega-input/types.d.ts +11 -1
- package/dist/types/components/vega-input/vega-input.d.ts +2 -0
- package/dist/types/components/vega-input-credit-card/vega-input-credit-card.d.ts +2 -0
- package/dist/types/components/vega-input-numeric/vega-input-numeric.d.ts +2 -0
- package/dist/types/components/vega-input-passcode/vega-input-passcode.d.ts +2 -0
- package/dist/types/components/vega-input-phone-number/vega-input-phone-number.d.ts +2 -0
- package/dist/types/components/vega-input-range/vega-input-range.d.ts +2 -0
- package/dist/types/components/vega-input-select/vega-input-select.d.ts +2 -0
- package/dist/types/components/vega-item-toggle/vega-item-toggle.d.ts +2 -0
- package/dist/types/components/vega-loading-indicator/vega-loading-indicator.d.ts +2 -0
- package/dist/types/components/vega-modal/vega-modal.d.ts +2 -0
- package/dist/types/components/vega-page-notification/vega-page-notification.d.ts +2 -0
- package/dist/types/components/vega-pagination/vega-pagination.d.ts +2 -0
- package/dist/types/components/vega-popover/vega-popover.d.ts +2 -0
- package/dist/types/components/vega-progress-tracker/vega-progress-tracker.d.ts +2 -0
- package/dist/types/components/vega-radio/vega-radio.d.ts +2 -0
- package/dist/types/components/vega-rich-text-editor/constants/constant.d.ts +16 -0
- package/dist/types/components/vega-rich-text-editor/dto/annotations/text-style-default-styles.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/dto/blocks/block.abstract.d.ts +9 -0
- package/dist/types/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy-registry.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/dto/filter-styles-strategies/filter-styles-strategy.abstract.d.ts +3 -2
- package/dist/types/components/vega-rich-text-editor/dto/filter-styles-strategies/text-node/title-heading-node-filter-styles-strategy.d.ts +25 -3
- package/dist/types/components/vega-rich-text-editor/dto/renderers/blocks/block-text-nodes-renderer.abstract.d.ts +7 -0
- package/dist/types/components/vega-rich-text-editor/dto/renderers/nodes/text-node-renderer.d.ts +11 -0
- package/dist/types/components/vega-rich-text-editor/extensions/block-boundary-registry.d.ts +21 -0
- package/dist/types/components/vega-rich-text-editor/extensions/extension.abstract.d.ts +15 -0
- package/dist/types/components/vega-rich-text-editor/extensions/functions/constants.d.ts +4 -0
- package/dist/types/components/vega-rich-text-editor/extensions/functions/dto/function-block.d.ts +7 -0
- package/dist/types/components/vega-rich-text-editor/extensions/functions/element-to-dto-strategies/div-containing-function-block-strategy.d.ts +8 -0
- package/dist/types/components/vega-rich-text-editor/extensions/functions/function-extension.d.ts +6 -0
- package/dist/types/components/vega-rich-text-editor/extensions/functions/utils.d.ts +29 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/action-handler-strategies/image-replace-src-strategy.d.ts +12 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/actions/image-replace-src-action.d.ts +11 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/paste-image-parser.d.ts +136 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/parse-local-images-helper/pending-image-registry.d.ts +68 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-chooser-ui.d.ts +9 -4
- package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-extension.d.ts +39 -2
- package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/default-paste-strategy.d.ts +29 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/paste-processing-strategy.abstract.d.ts +61 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/paste-strategy-selector.d.ts +45 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/strategies/word-paste-strategy.d.ts +186 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-code-block-transformer.d.ts +51 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-image-transformer.d.ts +86 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-list-transformer.d.ts +271 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-paragraph-transformer.d.ts +25 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-table-transformer.d.ts +240 -0
- package/dist/types/components/vega-rich-text-editor/extensions/paste/word-paste-transformers/word-structure-transformer.d.ts +36 -0
- package/dist/types/components/vega-rich-text-editor/extensions/table/dto/table-block.d.ts +8 -0
- package/dist/types/components/vega-rich-text-editor/extensions/tokens/span-to-token-node-strategy.d.ts +2 -2
- package/dist/types/components/vega-rich-text-editor/extensions/tokens/token-node.d.ts +19 -1
- package/dist/types/components/vega-rich-text-editor/helpers/utils.d.ts +7 -0
- package/dist/types/components/vega-rich-text-editor/interface.d.ts +10 -0
- 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
- 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
- package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/vega-rich-text-editor.d.ts +2 -0
- package/dist/types/components/vega-section-title/vega-section-title.d.ts +2 -0
- package/dist/types/components/vega-segment-control/vega-segment-control.d.ts +2 -0
- package/dist/types/components/vega-selection-chip/vega-selection-chip.d.ts +2 -0
- package/dist/types/components/vega-selection-tile/vega-selection-tile.d.ts +2 -0
- package/dist/types/components/vega-sidenav/vega-sidenav.d.ts +2 -0
- package/dist/types/components/vega-signature-capture/vega-signature-capture.d.ts +2 -0
- package/dist/types/components/vega-skeleton/vega-skeleton.d.ts +2 -0
- package/dist/types/components/vega-stepper/vega-stepper.d.ts +2 -0
- package/dist/types/components/vega-tab-group/slimmers/vega-tab-group/renderers/vega-tab-group-tab-list-renderer.d.ts +1 -0
- package/dist/types/components/vega-tab-group/types.d.ts +3 -1
- package/dist/types/components/vega-tab-group/vega-tab-group.d.ts +4 -0
- package/dist/types/components/vega-table/interface.d.ts +4 -4
- package/dist/types/components/vega-table/slimmers/controllers/vega-table-body-col-span-controller.d.ts +16 -0
- package/dist/types/components/vega-table/slimmers/controllers/vega-table-column-structure-model-controller.d.ts +8 -4
- package/dist/types/components/vega-table/slimmers/controllers/vega-table-head-template-structure-controller.d.ts +168 -0
- package/dist/types/components/vega-table/slimmers/controllers/vega-table-render-input-controller.d.ts +8 -1
- package/dist/types/components/vega-table/slimmers/renderers/vega-table-body-col-span-resolver.d.ts +8 -10
- package/dist/types/components/vega-table/slimmers/renderers/vega-table-pinned-renderer.d.ts +76 -0
- package/dist/types/components/vega-table/vega-table-foot-cell/slimmers/renderers/vega-table-foot-cell-renderer.d.ts +1 -0
- package/dist/types/components/vega-table/vega-table-head-cell/slimmers/controllers/vega-table-head-cell-template-structure-controller.d.ts +12 -0
- package/dist/types/components/vega-table/vega-table-head-cell/vega-table-head-cell.d.ts +19 -0
- package/dist/types/components/vega-table/vega-table.d.ts +6 -0
- package/dist/types/components/vega-textarea/vega-textarea.d.ts +2 -0
- package/dist/types/components/vega-time-picker/vega-time-picker.d.ts +2 -0
- package/dist/types/components/vega-toggle-switch/vega-toggle-switch.d.ts +2 -0
- package/dist/types/components/vega-tooltip/vega-tooltip.d.ts +2 -0
- package/dist/types/components.d.ts +54 -0
- package/dist/types/helpers/event-manager/event-id/vega-internal-event-id.d.ts +1 -0
- package/dist/types/helpers/translation/interface.d.ts +3 -1
- package/dist/types/types/public-api.d.ts +1 -0
- package/dist/types/utils/sanitize/index.d.ts +3 -2
- package/dist/types/utils/sanitize/strategies/index.d.ts +1 -0
- package/dist/types/utils/sanitize/strategies/label-sanitize-strategy.d.ts +9 -0
- package/dist/types/utils/sanitize/strategies/plain-text-sanitize-strategy.d.ts +36 -0
- package/dist/vega/index.esm.js +1 -1
- package/dist/vega/{p-36c89520.entry.js → p-024db952.entry.js} +1 -1
- package/dist/vega/p-0b2c4c0b.js +1 -0
- package/dist/vega/{p-c2277448.entry.js → p-0ca3b4bf.entry.js} +1 -1
- package/dist/vega/{p-363ee8a5.entry.js → p-1a37d63c.entry.js} +1 -1
- package/dist/vega/{p-b622c455.js → p-1fa22fda.js} +1 -1
- package/dist/vega/{p-d609c3fd.js → p-2044eba9.js} +1 -1
- package/dist/vega/{p-e1029acc.js → p-22edd3cc.js} +1 -1
- package/dist/vega/{p-5f96e741.entry.js → p-23c1f378.entry.js} +1 -1
- package/dist/vega/{p-6c95a6a3.js → p-2529820e.js} +1 -1
- package/dist/vega/{p-8d96f0e8.entry.js → p-2af1d8b8.entry.js} +1 -1
- package/dist/vega/{p-4c3a08be.entry.js → p-2f89ee14.entry.js} +1 -1
- package/dist/vega/{p-2bb5a232.js → p-3091b105.js} +1 -1
- package/dist/vega/{p-3af5e87b.entry.js → p-328ebbdb.entry.js} +1 -1
- package/dist/vega/p-35628af4.js +1 -0
- package/dist/vega/{p-9abf7d0a.entry.js → p-35d37477.entry.js} +1 -1
- package/dist/vega/{p-26760c66.entry.js → p-3a230d4b.entry.js} +1 -1
- package/dist/vega/{p-040ea356.entry.js → p-3c152bad.entry.js} +1 -1
- package/dist/vega/p-3c559c8b.js +1 -0
- package/dist/vega/{p-e3fdb65c.entry.js → p-3c8421d5.entry.js} +1 -1
- package/dist/vega/{p-b594a11c.entry.js → p-4022412e.entry.js} +1 -1
- package/dist/vega/{p-046203cb.entry.js → p-433b1395.entry.js} +1 -1
- package/dist/vega/{p-b98ead05.entry.js → p-4370b954.entry.js} +1 -1
- package/dist/vega/p-444e24c6.js +1 -0
- package/dist/vega/p-4473d8b1.js +3 -0
- package/dist/vega/{p-a484e32d.entry.js → p-44999c88.entry.js} +1 -1
- package/dist/vega/{p-f29ea345.entry.js → p-47a48329.entry.js} +1 -1
- package/dist/vega/{p-0cf3b5c1.entry.js → p-49d7cfed.entry.js} +1 -1
- package/dist/vega/p-4a2fe3a4.js +1 -0
- package/dist/vega/{p-92528dc9.entry.js → p-4afd6715.entry.js} +1 -1
- package/dist/vega/{p-461100b8.entry.js → p-4f6aaac5.entry.js} +1 -1
- package/dist/vega/p-50eda925.js +1 -0
- package/dist/vega/{p-ae2abdfa.js → p-5110c84f.js} +1 -1
- package/dist/vega/{p-deaf037a.entry.js → p-5147c30d.entry.js} +1 -1
- package/dist/vega/{p-874e5624.js → p-52878ea9.js} +1 -1
- package/dist/vega/{p-b00ec194.entry.js → p-55dc3053.entry.js} +1 -1
- package/dist/vega/p-5af312f8.js +1 -0
- package/dist/vega/{p-3e09aeed.js → p-5b3c8a56.js} +1 -1
- package/dist/vega/{p-2acf9b42.entry.js → p-5e9e04f3.entry.js} +1 -1
- package/dist/vega/p-5f377954.js +1 -1
- package/dist/vega/p-6493f13a.entry.js +1 -0
- package/dist/vega/{p-8611465f.entry.js → p-6659c910.entry.js} +1 -1
- package/dist/vega/{p-9c4c474e.entry.js → p-66728dd4.entry.js} +1 -1
- package/dist/vega/{p-21f608e8.entry.js → p-66a785d0.entry.js} +1 -1
- package/dist/vega/{p-0499e65a.entry.js → p-66fe8b4e.entry.js} +1 -1
- package/dist/vega/p-67e88cd7.entry.js +1 -0
- package/dist/vega/p-67eaf77e.js +1 -0
- package/dist/vega/{p-456f678b.js → p-691bdc20.js} +1 -1
- package/dist/vega/{p-1132a74e.entry.js → p-6d6b4495.entry.js} +1 -1
- package/dist/vega/p-6db1b9ac.js +1 -0
- package/dist/vega/p-7754b10f.entry.js +1 -0
- package/dist/vega/{p-d2cbcf5e.entry.js → p-77fb3971.entry.js} +1 -1
- package/dist/vega/{p-e7e963ba.entry.js → p-7977352b.entry.js} +1 -1
- package/dist/vega/{p-a91927eb.entry.js → p-7b133734.entry.js} +1 -1
- package/dist/vega/p-7b84a943.entry.js +1 -0
- package/dist/vega/{p-a2bd621e.js → p-83ad8988.js} +1 -1
- package/dist/vega/{p-2eb8e167.entry.js → p-840444c9.entry.js} +1 -1
- package/dist/vega/{p-703ac992.entry.js → p-860e76f5.entry.js} +1 -1
- package/dist/vega/p-867cc602.entry.js +1 -0
- package/dist/vega/p-8d2a9012.js +1 -0
- package/dist/vega/{p-5e37b041.js → p-8d4be607.js} +1 -1
- package/dist/vega/p-8d77c7cf.js +1 -0
- package/dist/vega/{p-c29934ef.js → p-8f3b93db.js} +1 -1
- package/dist/vega/{p-56417ec5.entry.js → p-944e284d.entry.js} +1 -1
- package/dist/vega/{p-0809c651.js → p-94b54a95.js} +1 -1
- package/dist/vega/p-9c2b3279.js +1 -0
- package/dist/vega/{p-aeb50cad.entry.js → p-9c5289dc.entry.js} +1 -1
- package/dist/vega/{p-d25c1a48.js → p-9c9b0629.js} +1 -1
- package/dist/vega/{p-abbceebf.entry.js → p-9c9ff871.entry.js} +1 -1
- package/dist/vega/{p-a034dfc0.entry.js → p-9d90e271.entry.js} +1 -1
- package/dist/vega/{p-d319ebb5.js → p-9e9f49f4.js} +1 -1
- package/dist/vega/{p-dcd3e3a7.js → p-a1f220ca.js} +1 -1
- package/dist/vega/{p-3488a3f1.entry.js → p-a4360b7e.entry.js} +1 -1
- package/dist/vega/{p-2540fd1c.entry.js → p-a7517760.entry.js} +1 -1
- package/dist/vega/{p-8ed3b2b6.entry.js → p-aa433430.entry.js} +1 -1
- package/dist/vega/{p-c3646101.entry.js → p-aa914dbd.entry.js} +1 -1
- package/dist/vega/{p-72ab5cd5.entry.js → p-b12de1bf.entry.js} +1 -1
- package/dist/vega/p-b21cc390.entry.js +1 -0
- package/dist/vega/{p-dbb4b1d1.js → p-b3c4943b.js} +1 -1
- package/dist/vega/{p-98fc5821.entry.js → p-ba6881da.entry.js} +1 -1
- package/dist/vega/p-bd7725f7.entry.js +1 -0
- package/dist/vega/{p-dad7d2ac.js → p-c348eaf5.js} +1 -1
- package/dist/vega/{p-29e3eb12.js → p-c41a2d4a.js} +1 -1
- package/dist/vega/{p-ccbe3f1b.entry.js → p-c8ad7207.entry.js} +1 -1
- package/dist/vega/{p-b3733762.entry.js → p-c8fb3aac.entry.js} +1 -1
- package/dist/vega/p-cc569b54.js +1 -0
- package/dist/vega/{p-53fd3c41.entry.js → p-ccbed811.entry.js} +1 -1
- package/dist/vega/{p-8ff92914.entry.js → p-ce82d6bb.entry.js} +1 -1
- package/dist/vega/{p-f1078e63.js → p-cede3535.js} +1 -1
- package/dist/vega/{p-775ecfad.entry.js → p-cf4b3d40.entry.js} +1 -1
- package/dist/vega/p-d35a31a5.entry.js +1 -0
- package/dist/vega/{p-ac94ba1b.entry.js → p-d4d90ce2.entry.js} +1 -1
- package/dist/vega/{p-f5095035.entry.js → p-d6023dc0.entry.js} +1 -1
- package/dist/vega/{p-a8174ad8.entry.js → p-d62e618a.entry.js} +1 -1
- package/dist/vega/{p-3f183b52.js → p-daba4af1.js} +1 -1
- package/dist/vega/{p-1ea9ad9a.js → p-dd0bd78b.js} +1 -1
- package/dist/vega/{p-36d2df7a.entry.js → p-ded1ecc1.entry.js} +1 -1
- package/dist/vega/p-df63c2fb.entry.js +1 -0
- package/dist/vega/{p-d3413a78.entry.js → p-e1a65e06.entry.js} +1 -1
- package/dist/vega/{p-39c5054b.js → p-e1c82ca9.js} +1 -1
- package/dist/vega/{p-6b76b572.entry.js → p-e469ba27.entry.js} +1 -1
- package/dist/vega/{p-e9d09211.js → p-e4c5cb4f.js} +1 -1
- package/dist/vega/{p-ec64cc59.entry.js → p-f0a0fc77.entry.js} +1 -1
- package/dist/vega/{p-12e8a1b2.js → p-f13b39d8.js} +1 -1
- package/dist/vega/{p-21626b93.entry.js → p-f2384411.entry.js} +1 -1
- package/dist/vega/{p-09524fec.js → p-f9a3805d.js} +1 -1
- package/dist/vega/{p-1e0a8fd3.js → p-fa5cd8b1.js} +1 -1
- package/dist/vega/{p-56d19601.entry.js → p-fb9475ab.entry.js} +1 -1
- package/dist/vega/{p-2c2e8615.js → p-fcb6b499.js} +1 -1
- package/dist/vega/vega.esm.js +1 -1
- package/package.json +1 -1
- package/dist/collection/components/vega-rich-text-editor/extensions/paste/paste-constants.js +0 -6
- package/dist/types/components/vega-rich-text-editor/extensions/paste/paste-constants.d.ts +0 -6
- package/dist/vega/p-10d43a80.entry.js +0 -1
- package/dist/vega/p-1250b1ab.entry.js +0 -1
- package/dist/vega/p-1d5e05d9.js +0 -3
- package/dist/vega/p-2bb60f89.js +0 -1
- package/dist/vega/p-2d158cbd.js +0 -1
- package/dist/vega/p-2d7388c9.entry.js +0 -1
- package/dist/vega/p-2ff4ae1c.js +0 -1
- package/dist/vega/p-3980dfa8.entry.js +0 -1
- package/dist/vega/p-3a68b729.js +0 -1
- package/dist/vega/p-781b7a54.js +0 -1
- package/dist/vega/p-81d4dfcb.entry.js +0 -1
- package/dist/vega/p-88a6c89a.js +0 -1
- package/dist/vega/p-8e7932bc.js +0 -1
- package/dist/vega/p-9664e914.entry.js +0 -1
- package/dist/vega/p-9be02fa5.js +0 -1
- package/dist/vega/p-ca270da3.entry.js +0 -1
- package/dist/vega/p-cd69aeae.js +0 -1
- package/dist/vega/p-de8f0d98.js +0 -1
- package/dist/vega/p-e9b005df.js +0 -1
- package/dist/vega/p-f0e828d8.js +0 -1
- package/dist/vega/p-f95d8d10.entry.js +0 -1
- package/dist/vega/p-fa65956c.entry.js +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export var RTEPasteMode;
|
|
2
|
+
(function (RTEPasteMode) {
|
|
3
|
+
RTEPasteMode["RICH"] = "rich";
|
|
4
|
+
RTEPasteMode["WORD"] = "word";
|
|
5
|
+
})(RTEPasteMode || (RTEPasteMode = {}));
|
|
6
|
+
/**
|
|
7
|
+
* Priority scale shared by all paste processing strategies.
|
|
8
|
+
*/
|
|
9
|
+
export var PasteProcessingStrategyPriority;
|
|
10
|
+
(function (PasteProcessingStrategyPriority) {
|
|
11
|
+
/** Fallback strategy used only when no specialized strategy matches. */
|
|
12
|
+
PasteProcessingStrategyPriority[PasteProcessingStrategyPriority["DEFAULT_FALLBACK"] = -1] = "DEFAULT_FALLBACK";
|
|
13
|
+
/** Baseline priority for generic strategies. */
|
|
14
|
+
PasteProcessingStrategyPriority[PasteProcessingStrategyPriority["BASE"] = 0] = "BASE";
|
|
15
|
+
/** Word strategy priority so it outranks generic strategies. */
|
|
16
|
+
PasteProcessingStrategyPriority[PasteProcessingStrategyPriority["WORD"] = 10] = "WORD";
|
|
17
|
+
})(PasteProcessingStrategyPriority || (PasteProcessingStrategyPriority = {}));
|
|
18
|
+
/**
|
|
19
|
+
* Abstract base class for paste processing strategies.
|
|
20
|
+
*
|
|
21
|
+
* Each strategy implements detection logic (`canHandle`) and transformation
|
|
22
|
+
* logic (`process`) for a specific clipboard source (Word, Google Docs, etc.).
|
|
23
|
+
* The strategy selector chooses the highest-priority strategy that can handle
|
|
24
|
+
* the given HTML.
|
|
25
|
+
*/
|
|
26
|
+
export class AbstractPasteProcessingStrategy {
|
|
27
|
+
/**
|
|
28
|
+
* Downstream paste mode marker associated with this strategy.
|
|
29
|
+
*
|
|
30
|
+
* Defaults to regular rich-text paste unless a specialized strategy overrides it.
|
|
31
|
+
*
|
|
32
|
+
* @returns {RTEPasteMode} Paste mode marker for downstream handlers.
|
|
33
|
+
*/
|
|
34
|
+
get type() {
|
|
35
|
+
return RTEPasteMode.RICH;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Optional: Strategy priority when multiple strategies match.
|
|
39
|
+
* Higher numbers = higher priority. Default: 0.
|
|
40
|
+
*
|
|
41
|
+
* @returns {number} Strategy priority.
|
|
42
|
+
*/
|
|
43
|
+
get priority() {
|
|
44
|
+
return PasteProcessingStrategyPriority.BASE;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Whether pasted images from this source should be extracted into local
|
|
48
|
+
* previews by the paste extension after {@link process} runs.
|
|
49
|
+
*
|
|
50
|
+
* @returns {boolean} `false` unless a strategy opts into image processing.
|
|
51
|
+
*/
|
|
52
|
+
get supportsImageProcessing() {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { DefaultPasteProcessingStrategy } from './default-paste-strategy';
|
|
2
|
+
import { WordPasteProcessingStrategy } from './word-paste-strategy';
|
|
3
|
+
/**
|
|
4
|
+
* Centralized selector for paste processing strategies.
|
|
5
|
+
*
|
|
6
|
+
* Maintains a registry of available strategies and selects the highest-priority
|
|
7
|
+
* strategy that can handle the given clipboard HTML. Provides an extension
|
|
8
|
+
* point for adding support for new clipboard sources (e.g., Google Docs, Notion)
|
|
9
|
+
* without modifying the paste extension core logic.
|
|
10
|
+
*/
|
|
11
|
+
export class PasteStrategySelector {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.defaultStrategy = new DefaultPasteProcessingStrategy();
|
|
14
|
+
this.strategies = [
|
|
15
|
+
new WordPasteProcessingStrategy(),
|
|
16
|
+
this.defaultStrategy, // Fallback
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Select the appropriate strategy for the given HTML content.
|
|
21
|
+
* Returns the highest-priority strategy that can handle the content.
|
|
22
|
+
*
|
|
23
|
+
* @param {string} html Raw clipboard HTML.
|
|
24
|
+
* @returns {AbstractPasteProcessingStrategy} The selected strategy (always returns a strategy; default is the fallback).
|
|
25
|
+
*/
|
|
26
|
+
selectStrategy(html) {
|
|
27
|
+
return this.selectHighestPriorityStrategy(this.strategies.filter((strategy) => strategy.canHandle(html)));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Selects the highest-priority registered strategy for an explicitly chosen paste mode.
|
|
31
|
+
*
|
|
32
|
+
* Used when the user manually chooses a non-default mode from the paste chooser.
|
|
33
|
+
*
|
|
34
|
+
* @param {RTEPasteMode} type Explicit paste mode selected by the user.
|
|
35
|
+
* @returns {AbstractPasteProcessingStrategy} The matching strategy or the default fallback.
|
|
36
|
+
*/
|
|
37
|
+
selectStrategyByType(type) {
|
|
38
|
+
return this.selectHighestPriorityStrategy(this.strategies.filter((strategy) => strategy.type === type));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Register a new paste processing strategy.
|
|
42
|
+
* Useful for future extensions (e.g., GoogleDocsPasteStrategy).
|
|
43
|
+
*
|
|
44
|
+
* @param {AbstractPasteProcessingStrategy} strategy The strategy to register.
|
|
45
|
+
*/
|
|
46
|
+
registerStrategy(strategy) {
|
|
47
|
+
this.strategies.push(strategy);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns the highest-priority strategy from a candidate set or the default fallback.
|
|
51
|
+
*
|
|
52
|
+
* @param {AbstractPasteProcessingStrategy[]} strategies Candidate strategies.
|
|
53
|
+
* @returns {AbstractPasteProcessingStrategy} Selected strategy.
|
|
54
|
+
*/
|
|
55
|
+
selectHighestPriorityStrategy(strategies) {
|
|
56
|
+
const selectedStrategy = strategies.sort((a, b) => b.priority - a.priority)[0];
|
|
57
|
+
return selectedStrategy || this.defaultStrategy;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -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> </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
|
+
}
|