{"version":3,"file":"sdcorejs-angular-components-document-builder.mjs","sources":["../../../projects/sdcorejs-angular/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.ts","../../../projects/sdcorejs-angular/components/document-builder/src/document-builder.config.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/heading/heading.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/variable/variable.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/table-custom/index.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/image-custom/image-custom.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/bookmark.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/image.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/utils.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/table.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/br.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/list.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/removexmlns.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/space.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/filters/parse.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/paste-handler/index.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/block-space/block-space.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.ts","../../../projects/sdcorejs-angular/components/document-builder/src/document-builder.utils.ts","../../../projects/sdcorejs-angular/components/document-builder/src/document-builder.component.ts","../../../projects/sdcorejs-angular/components/document-builder/src/document-builder.component.html","../../../projects/sdcorejs-angular/components/document-builder/sdcorejs-angular-components-document-builder.ts"],"sourcesContent":["import { Plugin, ButtonView } from 'ckeditor5';\nimport { DocumentBuilderI18n } from '../../../document-builder.model';\n\nexport class PageNumberPlugin extends Plugin {\n  init() {\n    const editor = this.editor;\n    // i18n nằm trong editor.config — plugin không có DI nên đọc qua config; Angular wrapper luôn truyền _i18n\n    const i18n = (editor.config as { get(key: string): unknown }).get('_i18n') as DocumentBuilderI18n | undefined;\n    // 1. Đăng ký nút \"Số trang hiện tại\"\n    editor.ui.componentFactory.add('pageNumber', locale => {\n      const view = new ButtonView(locale);\n\n      view.set({\n        label: i18n?.t('core.component.document-builder.page-number.current') ?? '',\n        icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H4V4h12v12zM6 6h2v2H6zm0 4h2v2H6zm0 4h2v2H6zm4-8h4v2h-4zm0 4h4v2h-4zm0 4h4v2h-4z\"/></svg>', // Icon đơn giản\n        tooltip: true,\n      });\n\n      // Khi bấm nút -> Chèn HTML đánh dấu\n      view.on('execute', () => {\n        editor.model.change(writer => {\n          const viewFragment = editor.data.processor.toView(\n            // Đây là HTML chuẩn để Word hiểu là số trang (dùng cho cách xuất MHTML/.doc)\n            // Hoặc là marker để Backend replace\n            '<span class=\"page-number-marker\" style=\"mso-field-code: PAGE; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[PAGE]</span> '\n          );\n          const modelFragment = editor.data.toModel(viewFragment);\n          editor.model.insertContent(modelFragment);\n        });\n      });\n      return view;\n    });\n\n    // 2. Đăng ký nút \"Tổng số trang\"\n    editor.ui.componentFactory.add('totalPages', locale => {\n      const view = new ButtonView(locale);\n\n      view.set({\n        label: i18n?.t('core.component.document-builder.page-number.total') ?? '',\n        icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/></svg>',\n        tooltip: true,\n      });\n\n      view.on('execute', () => {\n        editor.model.change(writer => {\n          const viewFragment = editor.data.processor.toView(\n            '<span class=\"total-page-marker\" style=\"mso-field-code: NUMPAGES; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[TOTAL]</span> '\n          );\n          const modelFragment = editor.data.toModel(viewFragment);\n          editor.model.insertContent(modelFragment);\n        });\n      });\n      return view;\n    });\n  }\n}\n","import { Component, Input, inject, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { DocumentBuilderI18n } from '../../document-builder.model';\n\nimport {\n  ClassicEditor,\n  EditorConfig,\n  Essentials,\n  Paragraph,\n  Bold,\n  Italic,\n  Underline,\n  FontSize,\n  FontColor,\n  FontBackgroundColor,\n  Alignment,\n  // Import Plugin tự viết\n  // PageNumberPlugin (nếu import từ file ngoài)\n} from 'ckeditor5';\nimport { PageNumberPlugin } from './plugins/page-number.plugin';\n\n@Component({\n  selector: 'sd-header-footer-builder',\n  standalone: true,\n  imports: [CommonModule, CKEditorModule],\n  template: `\n    <div class=\"header-footer-editor-wrapper\">\n      <ckeditor [editor]=\"Editor\" [config]=\"config\" (ready)=\"onReady($event)\"> </ckeditor>\n    </div>\n  `,\n  styles: [\n    `\n      /* Style tối giản cho vùng soạn thảo Header/Footer */\n      :host ::ng-deep .header-footer-editor-wrapper .ck-editor__editable_inline {\n        min-height: 100px; /* Header thường ngắn */\n        max-height: 200px;\n        padding: 10px 20px;\n        border: 1px solid #ddd;\n      }\n\n      /* Style hiển thị cho Placeholder số trang trong lúc soạn thảo */\n      :host ::ng-deep .page-number-marker,\n      :host ::ng-deep .total-page-marker {\n        font-size: 11px;\n        color: #555;\n        cursor: default;\n        user-select: none;\n      }\n    `,\n  ],\n})\nexport class SdHeaderFooterBuilder {\n  readonly #i18n = inject(I18nService);\n  #editor!: ClassicEditor;\n  Editor = ClassicEditor;\n\n  #model: string | undefined | null;\n  @Input() set model(value: string | undefined | null) {\n    if (this.#model !== value) {\n      this.#model = value;\n    }\n  }\n\n  readonly modelChange = output<string>();\n  readonly #editorI18n: DocumentBuilderI18n = {\n    t: (key, params) => this.#i18n.t(key, params),\n  };\n\n  config: EditorConfig & { _i18n?: DocumentBuilderI18n } = {\n    licenseKey: 'GPL', // Hoặc key thương mại nếu có\n    _i18n: this.#editorI18n,\n    // 1. PLUGIN RÚT GỌN (Bỏ Table, List, PageBreak...)\n    plugins: [\n      Essentials,\n      Paragraph,\n      Bold,\n      Italic,\n      Underline,\n      FontSize,\n      FontColor,\n      FontBackgroundColor,\n      Alignment,\n      PageNumberPlugin, // <--- Plugin số trang\n    ],\n    // 2. TOOLBAR ĐƠN GIẢN\n    toolbar: {\n      items: [\n        'undo',\n        'redo',\n        '|',\n        'fontSize',\n        'fontColor',\n        '|',\n        'bold',\n        'italic',\n        'underline',\n        '|',\n        'alignment', // Căn trái/phải/giữa (Quan trọng cho Header/Footer)\n        '|',\n        'pageNumber',\n        'totalPages', // <--- 2 nút mới\n      ],\n      shouldNotGroupWhenFull: true,\n    },\n    // Cấu hình alignment\n    alignment: {\n      options: ['left', 'center', 'right'],\n    },\n  };\n\n  onReady(editor: ClassicEditor): void {\n    this.#editor = editor;\n    this.#editor.setData(this.#model || '');\n    this.#editor.model.document.on('change:data', () => {\n      this.#model = this.#editor.getData();\n      this.modelChange.emit(this.#model);\n    });\n  }\n}\n","/**\n * Cấu hình màu cho Document Builder\n * Bảng màu tập trung và cấu hình cho việc lựa chọn màu nhất quán\n */\n\nimport { ColorPickerConfig, FontColorConfig, FontSizeConfig, HeadingConfig } from 'ckeditor5';\n\n/**\n * Trả về bảng màu chung được sử dụng trong tất cả tính năng của document builder\n * @returns Mảng các tùy chọn màu được định sẵn với giá trị hex và label\n */\nexport function getPresetColors(): FontColorConfig['colors'] {\n  return [\n    { color: '#000000', label: 'Black' },\n    { color: '#4D4D4D', label: 'Dim grey' },\n    { color: '#999999', label: 'Grey' },\n    { color: '#E6E6E6', label: 'Light grey' },\n    { color: '#FFFFFF', label: 'White' },\n    { color: '#E64D4D', label: 'Red' },\n    { color: '#E6994D', label: 'Orange' },\n    { color: '#E6E64D', label: 'Yellow' },\n    { color: '#99E64D', label: 'Light green' },\n    { color: '#4DE64D', label: 'Green' },\n    { color: '#4DE699', label: 'Aquamarine' },\n    { color: '#4DE6E6', label: 'Turquoise' },\n    { color: '#4D99E6', label: 'Light blue' },\n    { color: '#4D4DE6', label: 'Blue' },\n    { color: '#994DE6', label: 'Purple' },\n  ];\n}\n\n/**\n * Trả về cấu hình bộ chọn màu với định dạng hex\n * @returns Đối tượng cấu hình bộ chọn màu\n */\nexport function getColorPickerConfig(): ColorPickerConfig {\n  return {\n    format: 'hex',\n  };\n}\n\n/**\n * Trả về cấu hình kích thước font cho document builder\n * @returns Mảng các tùy chọn kích thước font được định sẵn\n */\nexport function getFontSizeOptions(): FontSizeConfig['options'] {\n  return [\n    {\n      title: '9',\n      model: '9pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '9pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '10',\n      model: '10pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '10pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '11',\n      model: '11pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '11pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '12',\n      model: '12pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '12pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '13',\n      model: '13pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '13pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '14',\n      model: '14pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '14pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '16',\n      model: '16pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '16pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '18',\n      model: '18pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '18pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '20',\n      model: '20pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '20pt' },\n        priority: 7,\n      },\n    },\n    {\n      title: '24',\n      model: '24pt',\n      view: {\n        name: 'span',\n        styles: { 'font-size': '24pt' },\n        priority: 7,\n      },\n    },\n  ];\n}\n\nexport function getHeadingOptions(): HeadingConfig['options'] {\n  return [\n    {\n      model: 'paragraph',\n      title: 'Paragraph',\n      class: 'ck-heading_paragraph',\n    },\n    {\n      model: 'heading1',\n      view: {\n        name: 'h1',\n        styles: { 'font-size': '24pt', 'font-weight': 'bold', 'line-height': '1.15' },\n      },\n      title: 'Heading 1',\n      class: 'ck-heading_heading1',\n    },\n    {\n      model: 'heading2',\n      view: {\n        name: 'h2',\n        styles: { 'font-size': '20pt', 'font-weight': 'bold', 'line-height': '1.15' },\n      },\n      title: 'Heading 2',\n      class: 'ck-heading_heading2',\n    },\n    {\n      model: 'heading3',\n      view: {\n        name: 'h3',\n        styles: { 'font-size': '16pt', 'font-weight': 'bold', 'line-height': '1.15' },\n      },\n      title: 'Heading 3',\n      class: 'ck-heading_heading3',\n    },\n  ];\n}\n","import { Plugin } from 'ckeditor5';\nimport { getHeadingOptions } from '../../document-builder.config';\n\nexport class HeadingPlugin extends Plugin {\n  static get pluginName() {\n    return 'HeadingPlugin';\n  }\n\n  init() {\n    const editor = this.editor;\n\n    editor.conversion.for('editingDowncast').markerToHighlight({\n      model: 'highlightMarker',\n      view: {\n        classes: 'ck-heading-highlight',\n      },\n    });\n\n    // Lấy default styles từ config\n    const headingOptions = getHeadingOptions();\n    const headingDefaults: Record<string, { fontSize: string; lineHeight: string }> = {};\n\n    headingOptions?.forEach((opt: any) => {\n      if (opt.model?.match(/^heading[1-3]$/)) {\n        headingDefaults[opt.model] = {\n          fontSize: opt.view?.styles?.['font-size'] || 'inherit',\n          lineHeight: opt.view?.styles?.['line-height'] || 'inherit',\n        };\n      }\n    });\n\n    // Downcast: Kiểm tra heading có styled text và set style inherit\n    const downcastConversion = editor.conversion.for('downcast');\n    Object.keys(headingDefaults).forEach(modelName => {\n      downcastConversion.add(dispatcher => {\n        dispatcher.on(`insert:${modelName}`, createHeadingHandler(editor, modelName, headingDefaults), { priority: 'low' });\n      });\n    });\n  }\n}\n\nfunction createHeadingHandler(editor: any, modelName: string, headingDefaults: Record<string, { fontSize: string; lineHeight: string }>) {\n  return (evt: any, data: any, conversionApi: any) => {\n    const element = data.item;\n    const viewElement = editor.editing.mapper.toViewElement(element);\n    if (!viewElement) return;\n\n    const children = Array.from(element.getChildren());\n    const hasStyledText = children.some((child: any) => {\n      if (child.is('$text')) {\n        const attrs = Array.from(child.getAttributes());\n        return attrs.length > 0;\n      }\n      return !child.is('$text');\n    });\n\n    editor.editing.view.change((writer: any) => {\n      if (children.length === 1 && hasStyledText) {\n        // Có styled text → bỏ style mặc định\n        writer.setStyle('font-size', 'inherit', viewElement);\n        writer.setStyle('line-height', 'inherit', viewElement);\n      } else {\n        // Không có styled text → set lại style mặc định từ config\n        const defaults = headingDefaults[modelName];\n        writer.setStyle('font-size', defaults.fontSize, viewElement);\n        writer.setStyle('line-height', defaults.lineHeight, viewElement);\n      }\n    });\n  };\n}\n","import { Config, Plugin, Widget, toWidget } from 'ckeditor5';\nimport { DocumentBuilderOption, SdDocumentBuilderVariable } from '../../document-builder.model';\nimport { resolveMaybeAsync } from '@sdcorejs/utils/models';\nimport { Utilities } from '@sdcorejs/utils/fns';\n\nexport class VariablePlugin extends Plugin {\n  // Tên plugin đăng ký với CKEditor — bắt buộc để tìm kiếm bằng string và ổn định trong build minified\n  static get pluginName() {\n    return 'VariablePlugin' as const;\n  }\n\n  static get requires() {\n    return [Widget];\n  }\n\n  init() {\n    const editor = this.editor;\n    const schema = editor.model.schema;\n    const conversion = editor.conversion;\n    const editingView = editor.editing.view;\n\n    // Cờ đánh dấu đang trong quá trình xử lý paste\n    let isPasting = false;\n    this.listenTo(\n      editingView.document,\n      'clipboardInput',\n      () => {\n        isPasting = true;\n        // Reset cờ sau khi quá trình paste (ngay trong cùng event loop/tick) hoàn tất\n        setTimeout(() => {\n          isPasting = false;\n        }, 0);\n      },\n      { priority: 'highest' }\n    );\n\n    // 1. Định nghĩa Schema (Model)\n    schema.register('variable', {\n      inheritAllFrom: '$inlineObject',\n      allowWhere: '$text',\n      isInline: true,\n      isObject: true,\n      allowAttributes: ['id', 'uuid', 'value', 'display', 'bindingValue'],\n    });\n\n    // 2. Model -> HTML\n    // model là string 'variable' → chỉ chạy khi element được TẠO MỚI (không reconvert khi attribute đổi)\n    // Luôn render trạng thái UNBOUND tại đây — binding state được xử lý riêng bởi converter bên dưới\n    conversion.for('downcast').elementToElement({\n      model: 'variable',\n      view: (modelItem, { writer: viewWriter }) => {\n        const id = modelItem.getAttribute('id') as string;\n        const uuid = modelItem.getAttribute('uuid') as string;\n        const display = modelItem.getAttribute('display') as string;\n        const value = modelItem.getAttribute('value') as string;\n\n        const widgetElement = viewWriter.createContainerElement('span', {\n          class: 'variable-widget',\n          'data-id': id,\n          'data-value': value,\n          'data-display': display,\n          'data-binding': 'false', // Luôn bắt đầu unbound — binding chỉ set qua bindValue()\n        });\n\n        const innerText = viewWriter.createText(`{{${display}}}`);\n        viewWriter.insert(viewWriter.createPositionAt(widgetElement, 0), innerText);\n        return toWidget(widgetElement, viewWriter);\n      },\n    });\n\n    // 2b. bindingValue → view\n    // - editingDowncast: HTML bind dùng createRawElement để hiển thị table/section trong editor.\n    // - dataDowncast (getData): CHỈ lưu data-binding-value (URI), không chèn block HTML vào <span> —\n    //   tránh HTML lưu dạng <p><span>…<table>… (invalid / upcast CKEditor lỗi null.start).\n    const applyBindingValueAttributeToView = (isDataPipeline: boolean) => {\n      return (evt: any, data: any, conversionApi: any) => {\n        if (!conversionApi.consumable.consume(data.item, evt.name)) return;\n\n        const viewWriter = conversionApi.writer;\n        const viewElement = conversionApi.mapper.toViewElement(data.item as any);\n        if (!viewElement) return;\n\n        const bindingValue = data.attributeNewValue as string | null | undefined;\n        const isBound = !!bindingValue;\n        const display = data.item.getAttribute('display') as string;\n\n        viewWriter.remove(viewWriter.createRangeIn(viewElement));\n\n        if (!isBound) {\n          viewWriter.setAttribute('data-binding', 'false', viewElement);\n          viewWriter.removeAttribute('data-binding-value', viewElement);\n          viewWriter.insert(viewWriter.createPositionAt(viewElement, 0), viewWriter.createText(`{{${display}}}`));\n          return;\n        }\n\n        const raw = bindingValue as string;\n        const isHtml = /<[a-z][\\s\\S]*>/i.test(raw);\n\n        if (isHtml) {\n          viewWriter.setAttribute('data-binding', 'html', viewElement);\n          viewWriter.setAttribute('data-binding-value', encodeURIComponent(raw), viewElement);\n          if (isDataPipeline) {\n            // Không nhét DOM con vào serialized HTML; upcast đọc binding từ data-binding-value.\n            return;\n          }\n          const htmlHost = viewWriter.createRawElement('span', { class: 'variable-html-content' }, (domElement: HTMLElement) => {\n            domElement.innerHTML = raw;\n          });\n          viewWriter.insert(viewWriter.createPositionAt(viewElement, 0), htmlHost);\n        } else {\n          viewWriter.setAttribute('data-binding', 'true', viewElement);\n          viewWriter.removeAttribute('data-binding-value', viewElement);\n          viewWriter.insert(viewWriter.createPositionAt(viewElement, 0), viewWriter.createText(raw));\n        }\n      };\n    };\n\n    conversion.for('dataDowncast').add(dispatcher => {\n      dispatcher.on('attribute:bindingValue:variable', applyBindingValueAttributeToView(true));\n    });\n    conversion.for('editingDowncast').add(dispatcher => {\n      dispatcher.on('attribute:bindingValue:variable', applyBindingValueAttributeToView(false));\n    });\n\n    // 3. HTML -> Model\n    conversion.for('upcast').elementToElement({\n      // NOTE: Chỉ khai báo các attribute CẦN THIẾT để nhận biết variable widget.\n      // - data-binding KHÔNG được đưa vào required attributes (HTML cũ không có sẽ không được nhận biết).\n      // - data-binding=\"true\" → đọc text child làm bindingValue (plain text).\n      // - data-binding=\"html\" → đọc data-binding-value (URI-encoded) làm bindingValue.\n      view: {\n        name: 'span',\n        classes: 'variable-widget ck-widget',\n        attributes: {\n          'data-id': true,\n          'data-value': true,\n          'data-display': true,\n          contenteditable: true,\n        },\n      },\n      model: (viewElement, { writer: modelWriter }) => {\n        const bindingMode = viewElement.getAttribute('data-binding');\n        let bindingValue: string | undefined;\n\n        if (bindingMode === 'html') {\n          const encoded = viewElement.getAttribute('data-binding-value');\n          if (encoded) {\n            try {\n              bindingValue = decodeURIComponent(encoded);\n            } catch {\n              bindingValue = undefined;\n            }\n          }\n        } else if (bindingMode === 'true') {\n          // Đọc text content làm bindingValue (bound value được lưu trực tiếp vào inner text)\n          for (const child of viewElement.getChildren()) {\n            if (child.is('$text')) {\n              bindingValue = (child as any).data as string;\n              break;\n            }\n          }\n        }\n\n        return modelWriter.createElement('variable', {\n          id: viewElement.getAttribute('data-id'),\n          // Fix trùng uuid: Nếu đang paste, TẠO MỚI uuid thay vì dùng uuid cũ từ HTML\n          uuid: isPasting ? Utilities.generateUuid() : (viewElement.getAttribute('data-uuid') ?? Utilities.generateUuid()),\n          value: viewElement.getAttribute('data-value'),\n          display: viewElement.getAttribute('data-display'),\n          ...(bindingValue ? { bindingValue } : {}),\n        });\n      },\n    });\n\n    // 4. Xử lý sự kiện Drop\n    this.listenTo(editingView.document, 'drop', async (evt, data) => {\n      const dataTransfer = (data as any).dataTransfer;\n      const jsonData = dataTransfer.getData('ck-variable');\n      if (!jsonData) return;\n\n      // data.dropRange là vị trí con chuột trên View khi thả\n      const viewRange = (data as any).dropRange;\n      const modelRange = editor.editing.mapper.toModelRange(viewRange);\n      evt.stop();\n\n      try {\n        let variable: SdDocumentBuilderVariable = JSON.parse(jsonData);\n        const config = editor.config as Config<DocumentBuilderOption>;\n        const getOption = config.get('getOption') as DocumentBuilderOption['getOption'];\n        const option = getOption?.();\n        if (option?.onDropVariable) {\n          // Bug 4 Fix (Q2-A): Xóa tham số dropIndex — không còn tryền giá trị hardcode 0\n          const result = await resolveMaybeAsync<boolean | SdDocumentBuilderVariable>(option.onDropVariable(variable));\n\n          // * Hỗ trợ dữ liệu có sẵn sẽ chỉ cần nhận vào boolean có cho phép thả hay không?\n          // i18n nằm trong editor.config — plugin không có DI nên đọc qua config; Angular wrapper luôn truyền _i18n\n          const i18n = (editor.config as Config<DocumentBuilderOption>).get('_i18n') as DocumentBuilderOption['_i18n'];\n          if (typeof result === 'boolean') {\n            if (!result) {\n              throw new Error(i18n?.t('core.component.document-builder.variable.not-allowed') ?? '');\n            }\n          } else {\n            // * Hỗ trợ dữ liệu lấy từ API (Kiểm tra xem result có đúng định dạng interface SdDocumentBuilderVariable hay không?)\n            if (this.#isSdDocumentBuilderVariableResult(result)) {\n              variable = result;\n            } else {\n              throw new Error(i18n?.t('core.component.document-builder.variable.invalid-data') ?? '');\n            }\n          }\n        }\n\n        let insertedUuid = '';\n        editor.model.change(writer => {\n          // 4.1. Chèn biến\n          insertedUuid = Utilities.generateUuid();\n          const variableElem = writer.createElement('variable', {\n            id: variable.id,\n            uuid: insertedUuid,\n            value: variable.value,\n            display: variable.display,\n          });\n\n          editor.model.insertContent(variableElem, modelRange);\n          // 4.2. Đặt con trỏ ra sau biến\n          writer.setSelection(variableElem, 'after');\n        });\n\n        // onAfterDropVariable: fires SAU model.change() → variable đã có trong model\n        // Consumer có thể gọi variable.all() tại đây và thấy biến mới nhất\n        option?.onAfterDropVariable?.({ ...variable, uuid: insertedUuid });\n      } catch (e) {\n        // Đặt con trỏ ngay tại vị trí lỗi\n        if (modelRange) {\n          editor.model.change(writer => {\n            writer.setSelection(modelRange);\n          });\n        }\n        console.error(e);\n      } finally {\n        // 5. Dọn dẹp drop-target dù thành công hay lỗi\n        editor.model.change(writer => {\n          for (const marker of editor.model.markers) {\n            if (marker.name.startsWith('drop-target')) {\n              writer.removeMarker(marker);\n            }\n          }\n        });\n      }\n    });\n\n    // -------------------------------------------------------------------------\n    // 5 & 6. Navigation (Arrow keys + Mouse) + Cursor spacing sau variable\n    // -------------------------------------------------------------------------\n\n    // Bug 1 Fix: isNavigating cần được reset sau mỗi lần change:range xử lý xong\n    // để tránh logic chèn \\u00A0 chạy lặp khi có selection change programmatic.\n    let isNavigating = false;\n\n    // Opt 1: Gộp arrow-key detection + Backspace/Delete handler vào 1 listener keydown\n    // Bug 3 Fix: Dùng this.listenTo() thay .on() để CKEditor tự cleanup khi plugin destroy\n    this.listenTo(\n      editingView.document,\n      'keydown',\n      (evt, data) => {\n        const keyCode = data.keyCode;\n\n        // --- Arrow key navigation detection (priority: high) ---\n        // Mã phím mũi tên: 37 (Left), 38 (Up), 39 (Right), 40 (Down)\n        const isArrowKey = keyCode >= 37 && keyCode <= 40;\n        if (isArrowKey) {\n          isNavigating = true;\n          return; // không xử lý thêm cho arrow key ở đây\n        }\n\n        // Reset flag nếu nhấn phím khác (không phải arrow, không phải Backspace/Delete)\n        const btnBackspace = keyCode === 8;\n        const btnDelete = keyCode === 46;\n        if (!btnBackspace && !btnDelete) {\n          isNavigating = false;\n          return;\n        }\n\n        // --- Opt 1: Backspace / Delete handler (đã gộp vào cùng listener) ---\n        // priority: highest — chạy trước mọi handler khác để bắt xóa variable 2 bước\n        const selection = editor.model.document.selection;\n        const model = editor.model;\n\n        // CASE 1: Nếu con trỏ đang nhấp nháy (Collapsed)\n        if (selection.isCollapsed) {\n          const position = selection.getFirstPosition();\n          // Với Backspace ta kiểm tra nodeBefore, với Delete ta kiểm tra nodeAfter\n          const targetNode = btnBackspace ? position?.nodeBefore : position?.nodeAfter;\n\n          if (targetNode && targetNode.is('element', 'variable')) {\n            data.preventDefault();\n            evt.stop();\n\n            model.change(writer => {\n              // Chọn bao quanh Variable đó (lần bấm tiếp theo sẽ xóa)\n              writer.setSelection(targetNode, 'on');\n            });\n            return;\n          }\n        }\n        // CASE 2: Nếu đang có một vùng chọn (đã được highlight từ lần bấm trước)\n        else {\n          const selectedElement = selection.getSelectedElement();\n\n          // Nếu phần tử đang được chọn chính là variable → xóa hẳn\n          if (selectedElement && selectedElement.is('element', 'variable')) {\n            data.preventDefault();\n            evt.stop();\n\n            model.change(writer => {\n              writer.remove(selectedElement);\n            });\n          }\n        }\n      },\n      // priority: highest — Backspace/Delete phải chạy trước CKEditor default để bắt 2-step deletion\n      { priority: 'highest' }\n    );\n\n    // Bug 3 Fix: mousedown cũng dùng this.listenTo() để tránh memory leak\n    this.listenTo(editingView.document, 'mousedown', () => {\n      isNavigating = true;\n    });\n\n    this.listenTo(editor.model.document.selection, 'change:range', () => {\n      // Nếu không phải là hành động click hoặc mũi tên thì thoát hàm.\n      if (!isNavigating) {\n        return;\n      }\n\n      // Bug 1 Fix: Reset ngay sau khi vào handler để tránh chạy lặp\n      // khi có thêm selection change programmatic (VD: writer.insertText bên dưới tự trigger lại)\n      isNavigating = false;\n\n      const model = editor.model;\n      const selection = model.document.selection;\n      if (!selection.isCollapsed) return;\n\n      const position = selection.getFirstPosition();\n      const nodeBefore = position?.nodeBefore;\n      if (!position) return;\n\n      // Kiểm tra: Node đứng trước con trỏ là variable\n      if (nodeBefore && nodeBefore.is('element', 'variable')) {\n        // Lấy node ngay sau variable để kiểm tra\n        const nextNode = nodeBefore.nextSibling;\n\n        // Logic: Nếu phía sau KHÔNG CÓ GÌ hoặc KHÔNG PHẢI LÀ TEXT → chèn \\u00A0 để có thể gõ tiếp\n        if (!nextNode || !nextNode.is('$text')) {\n          model.change(writer => {\n            writer.insertText('\\u00A0', nodeBefore, 'after');\n            // Lấy vị trí ngay sau variable (lúc này đang là đầu của text node mới)\n            const posAfterVariable = writer.createPositionAfter(nodeBefore);\n            // Dịch chuyển vị trí đó sang phải 1 đơn vị (bỏ qua ký tự vừa thêm)\n            const targetPos = posAfterVariable.getShiftedBy(1);\n            writer.setSelection(targetPos);\n          });\n        }\n      }\n    });\n\n    // -------------------------------------------------------------------------\n    // 8. Xử lý sự kiện Copy / Cut (Clipboard Output)\n    // -------------------------------------------------------------------------\n    // priority: low — chạy sau CKEditor để bổ sung text/plain fallback, không can thiệp HTML\n    this.listenTo(\n      editor.editing.view.document,\n      'clipboardOutput',\n      (evt, data) => {\n        const isCopyOrCut = data.method === 'copy' || data.method === 'cut';\n        if (!isCopyOrCut) return;\n\n        const dataTransfer = data.dataTransfer;\n        const content = data.content;\n\n        // Opt 3: Chỉ visit element nodes, bỏ qua các node không liên quan\n        let plainText = '';\n        const viewRange = editor.editing.view.createRangeIn(content);\n        for (const item of viewRange.getItems()) {\n          if (item.is('$text')) {\n            plainText += (item as any).data;\n          } else if (item.is('element', 'span') && item.hasClass('variable-widget')) {\n            const display = item.getAttribute('data-display');\n            if (display) plainText += `{{${display}}}`;\n          }\n        }\n\n        if (plainText) {\n          dataTransfer.setData('text/plain', plainText);\n        }\n\n        // HTML content giữ nguyên — CKEditor sẽ tự xử lý upcast khi paste lại\n      },\n      { priority: 'low' }\n    );\n\n    // -------------------------------------------------------------------------\n    // 9. Xử lý sự kiện Paste (Clipboard Input)\n    // -------------------------------------------------------------------------\n    // Nếu paste từ external source (chỉ có text, không có HTML variable)\n    // thì chuyển {{text}} thành variable widget\n    this.listenTo(\n      editor.editing.view.document,\n      'clipboardInput',\n      async (evt, data: any) => {\n        const dataTransfer = data.dataTransfer;\n\n        // Nếu có HTML chứa variable-widget thì để CKEditor xử lý (upcast converter)\n        // Việc chống trùng uuid (regenerate) đã được xử lý ở upcast converter dựa vào biến isPasting\n        const html = dataTransfer.getData('text/html');\n        if (html && html.includes('variable-widget')) {\n          return;\n        }\n\n        // Chỉ xử lý nếu chỉ có plain text với pattern {{text}}\n        const text = dataTransfer.getData('text/plain');\n        if (!text) return;\n\n        // Kiểm tra có chứa pattern {{text}} không\n        const variablePattern = /\\{\\{([^}]+)\\}\\}/g;\n        if (!variablePattern.test(text)) {\n          return;\n        }\n\n        // Reset lastIndex sau khi test\n        variablePattern.lastIndex = 0;\n\n        evt.stop();\n\n        // Bug 2 Fix (Q1-A): Lấy option để gọi onPasteVariable callback nếu có\n        const config = editor.config as Config<DocumentBuilderOption>;\n        const getOption = config.get('getOption') as DocumentBuilderOption['getOption'];\n        const option = getOption?.();\n\n        // Tách text thành các phần: normal text và variables\n        let lastIndex = 0;\n        let match;\n        const fragments: { type: 'text' | 'variable'; content: string; display?: string }[] = [];\n\n        while ((match = variablePattern.exec(text)) !== null) {\n          // Thêm text trước variable\n          if (match.index > lastIndex) {\n            fragments.push({ type: 'text', content: text.slice(lastIndex, match.index) });\n          }\n          fragments.push({ type: 'variable', content: match[0], display: match[1] });\n          lastIndex = match.index + match[0].length;\n        }\n\n        // Thêm text còn lại sau variable cuối cùng\n        if (lastIndex < text.length) {\n          fragments.push({ type: 'text', content: text.slice(lastIndex) });\n        }\n\n        // Bug 2 Fix: Resolve tất cả variable fragments trước khi thực hiện model.change\n        // Tránh async operation bên trong model.change (CKEditor không hỗ trợ async writer)\n\n        // Xây dựng lookup map từ variables đang có trong document (theo display name)\n        // Dùng để fallback khi không có onPasteVariable — giữ lại đầy đủ id/value của biến gốc\n        // khi copy-paste nội bộ bị mất HTML (chỉ còn plain text {{display}})\n        const existingVariableMap = this.#buildDisplayMap();\n\n        const resolvedFragments: { type: 'text' | 'variable'; content: string; variable?: SdDocumentBuilderVariable }[] = [];\n        for (const fragment of fragments) {\n          if (fragment.type === 'variable' && fragment.display) {\n            let resolved: SdDocumentBuilderVariable | null = null;\n\n            if (option?.onPasteVariable) {\n              try {\n                resolved = await resolveMaybeAsync<SdDocumentBuilderVariable | null>(option.onPasteVariable(fragment.display));\n              } catch (e) {\n                // @i18n-ignore — dev console warning\n                console.warn(`[VariablePlugin] onPasteVariable(\"${fragment.display}\") thất bại:`, e);\n              }\n            }\n\n            // Fallback 1: Tra cứu variable đang có trong document theo display name\n            // → Giữ lại đầy đủ id/value khi copy-paste nội bộ bị mất HTML\n            if (!resolved) {\n              resolved = existingVariableMap.get(fragment.display) ?? null;\n            }\n\n            // Fallback 2: Không tìm thấy → tạo variable sentinel với id = ''\n            // Consumer có thể filter qua variable.all() và nhận biết bằng id === ''\n            resolvedFragments.push({\n              type: 'variable',\n              content: fragment.content,\n              variable: resolved ?? {\n                id: '',\n                uuid: Utilities.generateUuid(),\n                value: fragment.display,\n                display: fragment.display,\n              },\n            });\n          } else {\n            resolvedFragments.push({ type: 'text', content: fragment.content });\n          }\n        }\n\n        // Chèn từng fragment vào document\n        editor.model.change(writer => {\n          const selection = editor.model.document.selection;\n          const position = selection.getFirstPosition();\n          if (!position) return;\n\n          let currentPosition = position;\n          for (const fragment of resolvedFragments) {\n            if (fragment.type === 'text' && fragment.content) {\n              const textNode = writer.createText(fragment.content);\n              writer.insert(textNode, currentPosition);\n              currentPosition = writer.createPositionAfter(textNode);\n            } else if (fragment.type === 'variable' && fragment.variable) {\n              const variableElem = writer.createElement('variable', {\n                id: fragment.variable.id,\n                uuid: Utilities.generateUuid(),\n                value: fragment.variable.value,\n                display: fragment.variable.display,\n              });\n              writer.insert(variableElem, currentPosition);\n              currentPosition = writer.createPositionAfter(variableElem);\n            }\n          }\n\n          // Đặt con trỏ sau nội dung vừa paste\n          writer.setSelection(currentPosition);\n        });\n      },\n      { priority: 'high' }\n    );\n  }\n\n  #isSdDocumentBuilderVariableResult = (obj: any): obj is SdDocumentBuilderVariable => {\n    return (\n      obj !== null &&\n      obj !== undefined &&\n      typeof obj === 'object' &&\n      !Array.isArray(obj) &&\n      typeof obj.id === 'string' &&\n      typeof obj.value === 'string' &&\n      typeof obj.display === 'string'\n    );\n  };\n\n  /**\n   * Quét tất cả variable elements trong document hiện tại, trả về Map<display, SdDocumentBuilderVariable>.\n   * Dùng làm fallback khi paste {{display}} mà không có onPasteVariable callback:\n   * nếu document đã có variable cùng display → tái sử dụng id/value của biến gốc.\n   * Nếu có nhiều variable cùng display → lấy cái đầu tiên tìm được.\n   */\n  #buildDisplayMap = (): Map<string, SdDocumentBuilderVariable> => {\n    const map = new Map<string, SdDocumentBuilderVariable>();\n    const root = this.editor.model.document.getRoot();\n    if (!root) return map;\n\n    const range = this.editor.model.createRangeIn(root);\n    for (const item of range.getItems()) {\n      if (item.is('element', 'variable')) {\n        const display = item.getAttribute('display') as string;\n        // Chỉ lưu lần đầu tiên gặp display này\n        if (display && !map.has(display)) {\n          map.set(display, {\n            id: item.getAttribute('id') as string,\n            uuid: item.getAttribute('uuid') as string,\n            value: item.getAttribute('value') as string,\n            display,\n          });\n        }\n      }\n    }\n\n    return map;\n  };\n\n  // =========================================================================\n  // PUBLIC API — Variable management\n  // =========================================================================\n\n  /**\n   * Lấy tất cả variables trong document.\n   * @returns Danh sách tất cả variables (bao gồm bindingValue nếu đã binding)\n   */\n  all<T = any>(): SdDocumentBuilderVariable<T>[] {\n    const model = this.editor.model;\n    const root = model.document.getRoot();\n    if (!root) return [];\n\n    const variables: SdDocumentBuilderVariable<T>[] = [];\n    try {\n      const range = model.createRangeIn(root);\n      for (const item of range.getItems()) {\n        if (item.is('element', 'variable')) {\n          variables.push({\n            id: item.getAttribute('id') as string,\n            uuid: item.getAttribute('uuid') as string,\n            value: item.getAttribute('value') as string,\n            display: item.getAttribute('display') as string,\n            bindingValue: item.getAttribute('bindingValue') as string | undefined,\n          });\n        }\n      }\n    } catch (e) {\n      console.error(e);\n      return [];\n    }\n    return variables;\n  }\n\n  /**\n   * Scroll tới vị trí của variable theo uuid.\n   * @param uuid - uuid của variable (FE tự sinh sau mỗi lần drop)\n   */\n  scroll(uuid: string): void {\n    const model = this.editor.model;\n    const root = model.document.getRoot();\n    if (!root) return;\n\n    let targetElement: any = null;\n    const range = model.createRangeIn(root);\n    for (const item of range.getItems()) {\n      if (item.is('element', 'variable') && item.getAttribute('uuid') === uuid) {\n        targetElement = item;\n        break;\n      }\n    }\n\n    if (targetElement) {\n      const viewElement = this.editor.editing.mapper.toViewElement(targetElement);\n      if (viewElement) {\n        const domElement = this.editor.editing.view.domConverter.viewToDom(viewElement);\n        if (domElement) {\n          (domElement as HTMLElement).scrollIntoView({ behavior: 'smooth', block: 'center' });\n          model.change(writer => {\n            writer.setSelection(targetElement, 'on');\n          });\n        }\n      }\n    } else {\n      // @i18n-ignore — dev console warning\n      console.warn(`Variable với uuid \"${uuid}\" không tìm thấy trong tài liệu.`);\n    }\n  }\n\n  /**\n   * Gán giá trị cho TẤT CẢ variable có cùng id trong document.\n   * Nếu value rỗng → tự động gọi clearValue(id).\n   * @param id    - id của variable definition\n   * @param value - giá trị binding cần hiển thị\n   * @returns số instance đã được cập nhật\n   */\n  bindValue(id: string, value: string): number {\n    if (!value) return this.clearValue(id);\n    const model = this.editor.model;\n    const root = model.document.getRoot();\n    if (!root) return 0;\n\n    let count = 0;\n    model.change(writer => {\n      const range = model.createRangeIn(root);\n      for (const item of range.getItems()) {\n        if (item.is('element', 'variable') && item.getAttribute('id') === id) {\n          writer.setAttribute('bindingValue', value, item);\n          count++;\n        }\n      }\n    });\n    return count;\n  }\n\n  /**\n   * Xóa binding value của TẤT CẢ variable có cùng id.\n   * @param id - id của variable definition\n   * @returns số instance đã được cập nhật\n   */\n  clearValue(id: string): number {\n    const model = this.editor.model;\n    const root = model.document.getRoot();\n    if (!root) return 0;\n\n    let count = 0;\n    model.change(writer => {\n      const range = model.createRangeIn(root);\n      for (const item of range.getItems()) {\n        if (item.is('element', 'variable') && item.getAttribute('id') === id && item.hasAttribute('bindingValue')) {\n          writer.removeAttribute('bindingValue', item);\n          count++;\n        }\n      }\n    });\n    return count;\n  }\n\n  /**\n   * Batch bind nhiều variables theo map { id → value }.\n   * Toàn bộ thực hiện trong 1 model.change() → 1 undo step duy nhất.\n   * @param map - { [id]: boundValue }\n   */\n  bindValues(map: Record<string, string>): void {\n    if (!Object.keys(map).length) return;\n    const model = this.editor.model;\n    const root = model.document.getRoot();\n    if (!root) return;\n\n    model.change(writer => {\n      const range = model.createRangeIn(root);\n      for (const item of range.getItems()) {\n        if (!item.is('element', 'variable')) continue;\n        const id = item.getAttribute('id') as string;\n        if (!(id in map)) continue;\n\n        const value = map[id];\n        if (value) {\n          writer.setAttribute('bindingValue', value, item);\n        } else if (item.hasAttribute('bindingValue')) {\n          writer.removeAttribute('bindingValue', item);\n        }\n      }\n    });\n  }\n\n  /**\n   * Batch clear binding của nhiều variables.\n   * @param ids - danh sách id cần clear; nếu không truyền/rỗng → clear TẤT CẢ\n   */\n  clearValues(ids?: string[]): void {\n    const model = this.editor.model;\n    const root = model.document.getRoot();\n    if (!root) return;\n\n    const idSet = ids?.length ? new Set(ids) : null;\n\n    model.change(writer => {\n      const range = model.createRangeIn(root);\n      for (const item of range.getItems()) {\n        if (!item.is('element', 'variable') || !item.hasAttribute('bindingValue')) continue;\n        const id = item.getAttribute('id') as string;\n        if (!idSet || idSet.has(id)) {\n          writer.removeAttribute('bindingValue', item);\n        }\n      }\n    });\n  }\n\n  /** Xóa toàn bộ binding values trong document. Shorthand của clearValues(). */\n  clearAllValues(): void {\n    this.clearValues();\n  }\n}\n\n/**\n * HTML từ getData() phiên bản cũ có thể chứa block (vd. table) bên trong `span.variable-widget[data-binding=\"html\"]`,\n * khiến setData/upcast CKEditor lỗi (unexpected-error, null.start). Gọi trước `setData` để giữ chỉ\n * `data-binding-value` và bỏ các node con.\n */\nexport function sanitizeVariableHtmlBoundSerializedHtml(html: string): string {\n  if (!html || !html.includes('variable-widget')) return html;\n  try {\n    const doc = new DOMParser().parseFromString(`<div id=\"__sd_var_sanitize_root__\">${html}</div>`, 'text/html');\n    const root = doc.getElementById('__sd_var_sanitize_root__');\n    if (!root) return html;\n    root.querySelectorAll('span.variable-widget').forEach(el => {\n      if (el.getAttribute('data-binding') !== 'html') return;\n      if (!el.hasAttribute('data-binding-value')) return;\n      el.replaceChildren();\n    });\n    return root.innerHTML;\n  } catch {\n    return html;\n  }\n}\n","import { Plugin } from 'ckeditor5';\n\nexport class TableCustom extends Plugin {\n  init() {\n    const editor = this.editor;\n\n    // Can thiệp vào quá trình convert từ View (HTML Paste) sang Model\n    editor.conversion.for('upcast').add(dispatcher => {\n      dispatcher.on(\n        'element:table',\n        (evt, data) => {\n          if (!data.modelRange) return;\n\n          for (const item of data.modelRange.getItems()) {\n            if (item.is('element', 'table')) {\n              editor.model.change(writer => {\n                this._applyTableDefaults(writer, item);\n                this._applyCellBorders(writer, item);\n              });\n            }\n          }\n        },\n        { priority: 'low' }\n      );\n\n      // Xử lý data-column-widths từ colgroup preservation\n      editor.conversion.for('upcast').attributeToAttribute({\n        view: 'data-column-widths',\n        model: 'tableColumnWidth',\n      });\n\n      // Xử lý border-style: none cho tableCell - phải explicit set 'none'\n      dispatcher.on(\n        'element:td',\n        (evt, data) => {\n          if (!data.modelRange || !data.viewItem) return;\n\n          const viewElement = data.viewItem;\n          const borderStyle = viewElement.getStyle('border-style') || this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));\n\n          // Nếu border-style là none hoặc border shorthand là none/0, explicit set 'none'\n          if (borderStyle === 'none' || borderStyle === 'hidden') {\n            for (const item of data.modelRange.getItems()) {\n              if (item.is('element', 'tableCell')) {\n                editor.model.change(writer => {\n                  writer.setAttribute('tableCellBorderStyle', 'none', item);\n                  // Khi border là none, set width về 0 để không có border\n                  writer.setAttribute('tableCellBorderWidth', '0pt', item);\n                });\n              }\n            }\n          }\n        },\n        { priority: 'high' }\n      );\n\n      dispatcher.on(\n        'element:th',\n        (evt, data) => {\n          if (!data.modelRange || !data.viewItem) return;\n\n          const viewElement = data.viewItem;\n          const borderStyle = viewElement.getStyle('border-style') || this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));\n\n          // Nếu border-style là none hoặc border shorthand là none/0, explicit set 'none'\n          if (borderStyle === 'none' || borderStyle === 'hidden') {\n            for (const item of data.modelRange.getItems()) {\n              if (item.is('element', 'tableCell')) {\n                editor.model.change(writer => {\n                  writer.setAttribute('tableCellBorderStyle', 'none', item);\n                  // Khi border là none, set width về 0 để không có border\n                  writer.setAttribute('tableCellBorderWidth', '0pt', item);\n                });\n              }\n            }\n          }\n        },\n        { priority: 'high' }\n      );\n    });\n\n    const findInnerTable = (viewElement: any): any => {\n      if (!viewElement) return null;\n      if (viewElement.name === 'table') return viewElement;\n\n      for (const child of viewElement.getChildren()) {\n        if (child.name === 'table') return child;\n        const found = findInnerTable(child);\n        if (found) return found;\n      }\n      return null;\n    };\n\n    editor.conversion.for('downcast').add(dispatcher => {\n      dispatcher.on('attribute:tableWidth:table', (evt, data, conversionApi) => {\n        const viewWriter = conversionApi.writer;\n        const viewElement = conversionApi.mapper.toViewElement(data.item);\n\n        if (!viewElement) return;\n\n        const innerTable = findInnerTable(viewElement);\n        if (!innerTable) return;\n\n        viewWriter.setStyle('border-collapse', 'collapse', innerTable);\n        viewWriter.setStyle('margin', '0', innerTable);\n        viewWriter.setStyle('width', '100%', innerTable);\n        viewWriter.setStyle('width', '100%', viewElement);\n      });\n\n      dispatcher.on('insert:table', (evt, data, conversionApi) => {\n        const viewWriter = conversionApi.writer;\n        const viewElement = conversionApi.mapper.toViewElement(data.item);\n\n        if (!viewElement) return;\n\n        const innerTable = findInnerTable(viewElement);\n        if (!innerTable) return;\n\n        viewWriter.setStyle('border-collapse', 'collapse', innerTable);\n        viewWriter.setStyle('margin', '0', innerTable);\n        viewWriter.setStyle('width', '100%', innerTable);\n        viewWriter.setStyle('width', '100%', viewElement);\n      });\n\n      // Downcast tableColumnWidth to colgroup\n      dispatcher.on('attribute:tableColumnWidth:table', (evt, data, conversionApi) => {\n        const viewWriter = conversionApi.writer;\n        const viewElement = conversionApi.mapper.toViewElement(data.item);\n\n        if (!viewElement) return;\n\n        const innerTable = findInnerTable(viewElement);\n        if (!innerTable) return;\n\n        const columnWidths = data.item.getAttribute('tableColumnWidth') as string;\n        if (!columnWidths) return;\n\n        // Remove existing colgroup if any\n        for (const child of innerTable.getChildren()) {\n          if (child.is('element', 'colgroup')) {\n            viewWriter.remove(child);\n            break;\n          }\n        }\n\n        // Create new colgroup with col elements\n        const colgroup = viewWriter.createContainerElement('colgroup');\n        const widths = columnWidths.split(',');\n\n        for (const width of widths) {\n          const col = viewWriter.createEmptyElement('col');\n          viewWriter.setAttribute('width', width.trim(), col);\n          viewWriter.setStyle('width', width.trim(), col);\n          viewWriter.insertChild(0, col, colgroup);\n        }\n\n        // Insert colgroup as first child of table\n        viewWriter.insertChild(0, colgroup, innerTable);\n      });\n    });\n\n    // Lắng nghe lệnh insertTable\n    const insertTableCommand = editor.commands.get('insertTable');\n    if (insertTableCommand) {\n      this.listenTo(insertTableCommand, 'execute', () => {\n        editor.model.change(writer => {\n          const position = editor.model.document.selection.getFirstPosition();\n          if (!position) return;\n\n          const tableElement = position.findAncestor('table');\n          if (tableElement) {\n            this._applyTableDefaults(writer, tableElement);\n            writer.setAttribute('tableBorderColor', '#000000', tableElement);\n            writer.setAttribute('tableBorderStyle', 'solid', tableElement);\n            writer.setAttribute('tableBorderWidth', '1pt', tableElement);\n            this._applyCellBorders(writer, tableElement);\n          }\n        });\n      });\n    }\n\n    // Listen for row/column commands\n    const tableCommands = [\n      'insertTableRowAbove',\n      'insertTableRowBelow',\n      'insertTableColumnLeft',\n      'insertTableColumnRight',\n      'resizeTableRow',\n      'resizeTableColumn',\n      'setTableColumnWidth',\n      'tableColumnWidth',\n    ];\n\n    tableCommands.forEach(cmdName => {\n      const cmd = editor.commands.get(cmdName);\n      if (cmd) {\n        this.listenTo(cmd, 'execute', () => {\n          editor.model.change(writer => {\n            const position = editor.model.document.selection.getFirstPosition();\n            if (!position) return;\n\n            const tableElement = position.findAncestor('table');\n            if (tableElement) {\n              this._applyTableDefaults(writer, tableElement);\n              this._applyCellBorders(writer, tableElement);\n            }\n          });\n        });\n      }\n    });\n\n    // Setup style preservation on model change\n    this._setupStylePreservationOnModelChange();\n  }\n\n  /**\n   * Parse border style from CSS shorthand (e.g., \"1px solid red\" or \"none\")\n   */\n  private _parseBorderStyleFromShorthand(borderValue: string | null | undefined): string | null {\n    if (!borderValue) return null;\n    const val = borderValue.toLowerCase().trim();\n    if (val === 'none' || val === '0') return 'none';\n\n    // Parse shorthand: width style color (e.g., \"1px solid red\")\n    const parts = val.split(/\\s+/);\n    for (const part of parts) {\n      if (['none', 'hidden', 'dotted', 'dashed', 'solid', 'double', 'groove', 'ridge', 'inset', 'outset'].includes(part)) {\n        return part;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Apply default table width\n   */\n  private _applyTableDefaults(writer: any, tableElement: any): void {\n    if (!tableElement) return;\n    writer.setAttribute('tableWidth', '100%', tableElement);\n  }\n\n  /**\n   * Apply default borders to all cells in a table\n   * Nếu cell đã có border rồi thì bỏ qua\n   */\n  private _applyCellBorders(writer: any, tableElement: any): void {\n    if (!tableElement) return;\n\n    // Lấy border info từ table để cell kế thừa\n    const tableBorderColor = tableElement.getAttribute('tableBorderColor');\n    const tableBorderStyle = tableElement.getAttribute('tableBorderStyle');\n    const tableBorderWidth = tableElement.getAttribute('tableBorderWidth');\n\n    for (const row of tableElement.getChildren()) {\n      for (const cell of row.getChildren()) {\n        // Nếu cell đã có border attribute nào rồi thì bỏ qua\n        if (\n          cell.hasAttribute('tableCellBorderStyle') ||\n          cell.hasAttribute('tableCellBorderColor') ||\n          cell.hasAttribute('tableCellBorderWidth')\n        ) {\n          continue;\n        }\n\n        // Áp dụng border từ table hoặc default\n        const inheritedStyle = tableBorderStyle || 'solid';\n        const inheritedColor = tableBorderColor || '#000000';\n        const inheritedWidth = tableBorderWidth || '1pt';\n\n        writer.setAttribute('tableCellBorderStyle', inheritedStyle, cell);\n        writer.setAttribute('tableCellBorderColor', inheritedColor, cell);\n        writer.setAttribute('tableCellBorderWidth', inheritedWidth, cell);\n\n        if (!cell.hasAttribute('tableCellPadding')) {\n          writer.setAttribute('tableCellPadding', '0.4em', cell);\n        }\n      }\n    }\n  }\n\n  /**\n   * Setup listener to preserve cell/table styles when model changes\n   */\n  private _setupStylePreservationOnModelChange(): void {\n    const editor = this.editor;\n\n    // Use listenTo for proper cleanup via destroy()\n    this.listenTo(editor.model.document, 'change', (evt: unknown, batch: any) => {\n      if (batch?.isLocal === false) return;\n\n      const changes = editor.model.document.differ.getChanges();\n      const tablesToFix = this._findTablesNeedingFix(changes);\n\n      if (tablesToFix.size > 0) {\n        editor.model.enqueueChange(() => {\n          editor.model.change(writer => {\n            for (const table of tablesToFix) {\n              this._applyTableDefaults(writer, table);\n              this._applyCellBorders(writer, table);\n            }\n          });\n        });\n      }\n    });\n  }\n\n  /**\n   * Find tables that need border fixes from model changes\n   */\n  private _findTablesNeedingFix(changes: any): Set<any> {\n    const tablesToFix = new Set<any>();\n\n    for (const change of changes) {\n      if (change.type === 'attribute') {\n        const attrKey = change.attributeKey;\n        if (attrKey && (attrKey.includes('table') || attrKey.includes('column') || attrKey.includes('width'))) {\n          const element = change.item;\n          if (element) {\n            const parentTable = this._findParentTable(element);\n            if (parentTable) tablesToFix.add(parentTable);\n          }\n        }\n      }\n\n      if (change.type === 'insert' && change.position) {\n        const tableElement = change.position.findAncestor?.('table') || change.position.parent?.findAncestor?.('table');\n        if (tableElement) tablesToFix.add(tableElement);\n      }\n    }\n\n    return tablesToFix;\n  }\n\n  /**\n   * Find parent table element\n   */\n  private _findParentTable(element: any): any {\n    if (!element) return null;\n    let parent = element;\n    while (parent && !parent.is?.('element', 'table')) {\n      parent = parent.parent;\n    }\n    return parent;\n  }\n\n  /**\n   * Cleanup listeners when plugin is destroyed\n   * Note: this.listenTo() listeners are automatically cleaned up by super.destroy()\n   */\n  override destroy(): void {\n    super.destroy();\n  }\n}\n","import { Plugin } from 'ckeditor5';\n\nexport class ImageUploadPlugin extends Plugin {\n  static get pluginName() {\n    return 'ImageUploadPlugin' as const;\n  }\n\n  init() {\n    const editor = this.editor;\n\n    editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {\n      return new Base64UploadAdapter(loader);\n    };\n  }\n}\n\nclass Base64UploadAdapter {\n  private loader: any;\n\n  constructor(loader: any) {\n    this.loader = loader;\n  }\n\n  /**\n   * Starts the upload process and converts the file to base64.\n   * @returns Promise that resolves with the base64 URL\n   */\n  upload(): Promise<{ default: string }> {\n    return this.loader.file.then((file: File) => {\n      return new Promise((resolve, reject) => {\n        const reader = new FileReader();\n\n        reader.onload = () => {\n          const base64Url = reader.result as string;\n          resolve({ default: base64Url });\n        };\n\n        reader.onerror = () => {\n          reject('Failed to convert image to base64');\n        };\n\n        reader.readAsDataURL(file);\n      });\n    });\n  }\n\n  /**\n   * Aborts the upload process.\n   */\n  abort(): void {\n    // For base64 conversion, there's nothing to abort\n    // This method is required by the UploadAdapter interface\n  }\n}\n","import { Plugin } from 'ckeditor5';\n\nexport class ImageCustomPlugin extends Plugin {\n  static get pluginName() {\n    return 'ImageCustomPlugin' as const;\n  }\n\n  init() {\n    const editor = this.editor;\n\n    // Thiết lập style mặc định là alignCenter khi chèn ảnh\n    editor.commands.get('imageUpload')?.on('execute', (evt, args) => {\n      // Đặt style mặc định sau khi ảnh được chèn\n      setTimeout(() => {\n        const selection = editor.model.document.selection;\n        const imageElement = selection.getSelectedElement();\n        if (imageElement && (imageElement.name === 'imageBlock' || imageElement.name === 'imageInline')) {\n          const currentStyle = imageElement.getAttribute('imageStyle');\n          // Chỉ đặt mặc định nếu chưa có style nào\n          if (!currentStyle) {\n            editor.model.change(writer => {\n              writer.setAttribute('imageStyle', 'alignCenter', imageElement);\n            });\n          }\n        }\n      }, 0);\n    });\n\n    // Downcast: Model -> View (HTML output)\n    // CKEditor 5 có 2 loại ảnh: imageBlock và imageInline\n    editor.conversion.for('downcast').add(dispatcher => {\n      // Xử lý ảnh block (được wrap trong figure)\n      dispatcher.on(\n        'insert:imageBlock',\n        (evt, data, conversionApi) => {\n          this.handleImageInsert(evt, data, conversionApi);\n        },\n        { priority: 'low' }\n      );\n\n      // Xử lý ảnh inline\n      dispatcher.on(\n        'insert:imageInline',\n        (evt, data, conversionApi) => {\n          this.handleImageInsert(evt, data, conversionApi);\n        },\n        { priority: 'low' }\n      );\n\n      // Xử lý thay đổi attribute cho cả 2 loại ảnh\n      ['imageBlock', 'imageInline'].forEach(imageType => {\n        // Xử lý thay đổi src\n        dispatcher.on(\n          `attribute:src:${imageType}`,\n          (evt, data, conversionApi) => {\n            this.handleImageAttributeChange(evt, data, conversionApi);\n          },\n          { priority: 'low' }\n        );\n\n        // Xử lý thay đổi width\n        dispatcher.on(\n          `attribute:width:${imageType}`,\n          (evt, data, conversionApi) => {\n            this.handleImageAttributeChange(evt, data, conversionApi);\n          },\n          { priority: 'low' }\n        );\n\n        // Xử lý thay đổi height\n        dispatcher.on(\n          `attribute:height:${imageType}`,\n          (evt, data, conversionApi) => {\n            this.handleImageAttributeChange(evt, data, conversionApi);\n          },\n          { priority: 'low' }\n        );\n\n        // Xử lý thay đổi imageStyle (căn chỉnh) - thêm float inline style\n        dispatcher.on(\n          `attribute:imageStyle:${imageType}`,\n          (evt, data, conversionApi) => {\n            this.handleImageStyleChange(evt, data, conversionApi);\n          },\n          { priority: 'low' }\n        );\n      });\n    });\n\n    // Xử lý upcast (HTML paste) - xóa aspect-ratio từ HTML đầu vào\n    editor.conversion.for('upcast').add(dispatcher => {\n      dispatcher.on(\n        'element:img',\n        (evt, data, conversionApi) => {\n          const viewItem = data.viewItem;\n          if (!viewItem) return;\n\n          // Kiểm tra viewItem có các method cần thiết\n          if (typeof viewItem.getStyle !== 'function') return;\n\n          // Xóa aspect-ratio từ inline styles nếu có\n          const hasAspectRatio = viewItem.getStyle('aspect-ratio');\n          if (hasAspectRatio && typeof viewItem.removeStyle === 'function') {\n            viewItem.removeStyle('aspect-ratio');\n          }\n\n          // Đặt custom styles nếu _styles map tồn tại\n          if (viewItem._styles && typeof viewItem._styles.set === 'function') {\n            viewItem._styles.set('margin', '0');\n            viewItem._styles.set('border', '0');\n            viewItem._styles.set('max-width', '100%');\n            viewItem._styles.set('height', 'auto');\n          }\n        },\n        { priority: 'high' }\n      );\n    });\n  }\n\n  /**\n   * Xử lý sự kiện chèn ảnh\n   */\n  private handleImageInsert(evt: any, data: any, conversionApi: any): void {\n    const viewWriter = conversionApi.writer;\n    const viewElement = conversionApi.mapper.toViewElement(data.item);\n\n    if (!viewElement) return;\n\n    // viewElement có thể là figure (cho block) hoặc img itself (cho inline)\n    // Tìm element img thực tế\n    const imgElement = this.findImgElement(viewElement);\n    if (!imgElement) return;\n\n    this.applyCustomStyles(viewWriter, imgElement);\n  }\n\n  /**\n   * Xử lý sự kiện thay đổi attribute ảnh\n   */\n  private handleImageAttributeChange(evt: any, data: any, conversionApi: any): void {\n    const viewWriter = conversionApi.writer;\n    const viewElement = conversionApi.mapper.toViewElement(data.item);\n\n    if (!viewElement) return;\n\n    const imgElement = this.findImgElement(viewElement);\n    if (!imgElement) return;\n\n    this.applyCustomStyles(viewWriter, imgElement);\n  }\n\n  /**\n   * Xử lý sự kiện thay đổi style ảnh - thêm float inline style cho căn chỉnh\n   */\n  private handleImageStyleChange(evt: any, data: any, conversionApi: any): void {\n    const viewWriter = conversionApi.writer;\n    const viewElement = conversionApi.mapper.toViewElement(data.item);\n\n    if (!viewElement) return;\n\n    // Tìm container ck-widget (element figure)\n    const widgetElement = this.findWidgetElement(viewElement);\n    if (!widgetElement) return;\n\n    // Lấy giá trị imageStyle (căn chỉnh)\n    const imageStyle = data.item.getAttribute('imageStyle') as string;\n\n    // Xóa các style hiện có trước\n    viewWriter.removeStyle('float', widgetElement);\n    viewWriter.removeStyle('margin', widgetElement);\n    viewWriter.removeStyle('text-align', widgetElement);\n\n    // Áp dụng style dựa trên căn chỉnh ảnh\n    // Các options đã cấu hình: ['inline', 'alignLeft', 'alignRight', 'alignCenter']\n    switch (imageStyle) {\n      case 'inline':\n        // Ảnh inline - không style đặc biệt, chỉ flow inline\n        break;\n      case 'alignLeft':\n        // Float trái\n        viewWriter.setStyle('float', 'left', widgetElement);\n        viewWriter.setStyle('margin', '0 16px 16px 0', widgetElement);\n        break;\n      case 'alignRight':\n        // Float phải\n        viewWriter.setStyle('float', 'right', widgetElement);\n        viewWriter.setStyle('margin', '0 0 16px 16px', widgetElement);\n        break;\n      case 'alignCenter':\n      case 'block':\n        // Căn giữa\n        viewWriter.setStyle('text-align', 'center', widgetElement);\n        viewWriter.setStyle('margin', '16px auto', widgetElement);\n        break;\n      default:\n        // Mặc định - căn giữa\n        viewWriter.setStyle('text-align', 'center', widgetElement);\n        viewWriter.setStyle('margin', '16px auto', widgetElement);\n        break;\n    }\n\n    // Áp dụng custom styles cơ bản cho element img\n    const imgElement = this.findImgElement(viewElement);\n    if (imgElement) {\n      this.applyCustomStyles(viewWriter, imgElement);\n    }\n  }\n\n  /**\n   * Áp dụng custom styles cho element ảnh\n   */\n  private applyCustomStyles(viewWriter: any, imgElement: any): void {\n    // Xóa aspect-ratio nếu tồn tại\n    if (imgElement.getStyle('aspect-ratio')) {\n      viewWriter.removeStyle('aspect-ratio', imgElement);\n    }\n\n    // Áp dụng custom styles\n    viewWriter.setStyle('margin', '0', imgElement);\n    viewWriter.setStyle('border', '0', imgElement);\n    viewWriter.setStyle('max-width', '100%', imgElement);\n    viewWriter.setStyle('height', 'auto', imgElement);\n  }\n\n  /**\n   * Tìm container ck-widget (element figure)\n   * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\n   */\n  private findWidgetElement(viewElement: any): any {\n    if (!viewElement) return null;\n\n    // Nếu đây là element figure itself\n    if (viewElement.name === 'figure') {\n      return viewElement;\n    }\n\n    // Cho ảnh inline, trả về element itself (span wrapper)\n    if (viewElement.name === 'span') {\n      return viewElement;\n    }\n\n    // Tìm ngược lên tree để tìm figure/ck-widget\n    let current = viewElement;\n    while (current) {\n      if (current.name === 'figure' || current.name === 'span') {\n        return current;\n      }\n      // Di chuyển lên parent\n      if (current.parent) {\n        current = current.parent;\n      } else {\n        break;\n      }\n    }\n\n    // Nếu không tìm thấy widget, trả về element gốc\n    return viewElement;\n  }\n\n  /**\n   * Tìm element img thực tế bên trong widget structure\n   * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\n   */\n  private findImgElement(viewElement: any): any {\n    if (!viewElement) return null;\n\n    // Nếu đây là element img itself\n    if (viewElement.name === 'img') {\n      return viewElement;\n    }\n\n    // Cho structure widget của CKEditor, tìm đệ quy\n    // Ảnh block: figure > span > img\n    // Ảnh thường được wrap trong một container\n    const queue = [viewElement];\n    while (queue.length > 0) {\n      const current = queue.shift();\n      if (!current) continue;\n\n      if (current.name === 'img') {\n        return current;\n      }\n\n      // Thêm children vào queue\n      if (current.getChildren) {\n        for (const child of current.getChildren()) {\n          queue.push(child);\n        }\n      }\n    }\n\n    return null;\n  }\n}\n","import { ButtonView, Plugin } from 'ckeditor5';\n// Icon khổ dọc (Mặc định cũ)\nconst ICON_PORTRAIT =\n  '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6V4h8v12z\"/></svg>';\n\n// Icon khổ ngang (Mới)\nconst ICON_LANDSCAPE =\n  '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 4H2C.9 4 0 4.9 0 6v8c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 10H2V6h16v8z\"/></svg>';\nexport class PageOrientation extends Plugin {\n  public static readonly pluginName = 'PageOrientation';\n\n  private _currentOrientation: 'PORTRAIT' | 'LANDSCAPE' = 'PORTRAIT';\n  private orientationChangeEmitter?: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void;\n  private buttonView?: ButtonView;\n\n  init() {\n    const editor = this.editor;\n    const componentFactory = editor.ui.componentFactory;\n\n    // Đăng ký nút tên là 'pageOrientation'\n    componentFactory.add('pageOrientation', locale => {\n      const view = new ButtonView(locale);\n      this.buttonView = view;\n\n      view.set({\n        // label: 'Xoay giấy (A4)',\n        icon: ICON_PORTRAIT,\n        // tooltip: true,\n        // withText: true,\n        class: 'btn-orientation', // Class để style nếu cần\n      });\n\n      // Xử lý khi bấm nút\n      view.on('execute', () => {\n        this.toggleOrientation();\n      });\n\n      return view;\n    });\n  }\n\n  /**\n   * Toggle between portrait and landscape orientation\n   */\n  toggleOrientation(): void {\n    const newOrientation = this._currentOrientation === 'PORTRAIT' ? 'LANDSCAPE' : 'PORTRAIT';\n    this.setOrientation(newOrientation);\n  }\n\n  /**\n   * Set orientation programmatically\n   */\n  setOrientation(orientation: 'PORTRAIT' | 'LANDSCAPE'): void {\n    const editor = this.editor;\n    const editingView = editor.editing.view;\n    const rootElement = editingView.document.getRoot();\n\n    editor.editing.view.change(writer => {\n      if (orientation === 'LANDSCAPE') {\n        writer.addClass('landscape', rootElement!);\n      } else {\n        writer.removeClass('landscape', rootElement!);\n      }\n    });\n\n    // Update button icon\n    if (this.buttonView) {\n      this.buttonView.icon = orientation === 'LANDSCAPE' ? ICON_LANDSCAPE : ICON_PORTRAIT;\n    }\n\n    this._currentOrientation = orientation;\n    this.orientationChangeEmitter?.(orientation);\n  }\n\n  /**\n   * Get current orientation\n   */\n  getOrientation(): 'PORTRAIT' | 'LANDSCAPE' {\n    return this._currentOrientation;\n  }\n\n  /**\n   * Register callback for orientation changes\n   */\n  onOrientationChange(callback: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void): void {\n    this.orientationChangeEmitter = callback;\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/bookmark\n */\n\nimport { type ViewUpcastWriter, type ViewDocumentFragment } from 'ckeditor5';\n\n/**\n * Transforms `<a>` elements which are bookmarks by moving their children after the element.\n *\n * @internal\n */\nexport function transformBookmarks(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  const elementsToChange = [];\n\n  for (const value of writer.createRangeIn(documentFragment)) {\n    const element = value.item;\n\n    if (element.is('element', 'a') && !element.hasAttribute('href') && (element.hasAttribute('id') || element.hasAttribute('name'))) {\n      elementsToChange.push(element);\n    }\n  }\n\n  for (const element of elementsToChange) {\n    const index = element.parent!.getChildIndex(element) + 1;\n    const children = element.getChildren();\n\n    writer.insertChild(index, children, element.parent!);\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/image\n */\n\nimport { Matcher, ViewUpcastWriter, type ViewDocumentFragment, type ViewElement, type ViewNode } from 'ckeditor5';\n\n/**\n * Replaces source attribute of all `<img>` elements representing regular\n * images (not the Word shapes) with inlined base64 image representation extracted from RTF or Blob data.\n *\n * @param documentFragment Document fragment on which transform images.\n * @param rtfData The RTF data from which images representation will be used.\n * @internal\n */\nexport function replaceImagesSourceWithBase64(documentFragment: ViewDocumentFragment, rtfData: string): void {\n  if (!documentFragment.childCount) {\n    return;\n  }\n\n  const upcastWriter = new ViewUpcastWriter(documentFragment.document);\n  const shapesIds = findAllShapesIds(documentFragment, upcastWriter);\n\n  removeAllImgElementsRepresentingShapes(shapesIds, documentFragment, upcastWriter);\n  insertMissingImgs(shapesIds, documentFragment, upcastWriter);\n  removeAllShapeElements(documentFragment, upcastWriter);\n\n  const images = findAllImageElementsWithLocalSource(documentFragment, upcastWriter);\n\n  if (images.length) {\n    replaceImagesFileSourceWithInlineRepresentation(images, extractImageDataFromRtf(rtfData), upcastWriter);\n  }\n}\n\n/**\n * Converts given HEX string to base64 representation.\n *\n * @internal\n * @param hexString The HEX string to be converted.\n * @returns Base64 representation of a given HEX string.\n */\nexport function _convertHexToBase64(hexString: string): string {\n  return btoa(\n    hexString\n      .match(/\\w{2}/g)!\n      .map(char => {\n        return String.fromCharCode(parseInt(char, 16));\n      })\n      .join('')\n  );\n}\n\n/**\n * Finds all shapes (`<v:*>...</v:*>`) ids. Shapes can represent images (canvas)\n * or Word shapes (which does not have RTF or Blob representation).\n *\n * @param documentFragment Document fragment from which to extract shape ids.\n * @returns Array of shape ids.\n */\nfunction findAllShapesIds(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): string[] {\n  const range = writer.createRangeIn(documentFragment);\n\n  const shapeElementsMatcher = new Matcher({\n    name: /v:(.+)/,\n  });\n\n  const shapesIds = [];\n\n  for (const value of range) {\n    if (value.type != 'elementStart') {\n      continue;\n    }\n\n    const el = value.item as ViewElement;\n    const previousSibling = el.previousSibling;\n    const prevSiblingName = previousSibling && previousSibling.is('element') ? previousSibling.name : null;\n    // List of ids which should not be considered as shapes.\n    // https://github.com/ckeditor/ckeditor5/pull/15847#issuecomment-1941543983\n    const exceptionIds = ['Chart'];\n\n    const isElementAShape = shapeElementsMatcher.match(el);\n    const hasElementGfxdataAttribute = el.getAttribute('o:gfxdata');\n    const isPreviousSiblingAShapeType = prevSiblingName === 'v:shapetype';\n    const isElementIdInExceptionsArray = hasElementGfxdataAttribute && exceptionIds.some(item => el.getAttribute('id')!.includes(item));\n\n    // If shape element has 'o:gfxdata' attribute and is not directly before\n    // `<v:shapetype>` element it means that it represents a Word shape.\n    if (isElementAShape && hasElementGfxdataAttribute && !isPreviousSiblingAShapeType && !isElementIdInExceptionsArray) {\n      shapesIds.push((value.item as ViewElement).getAttribute('id')!);\n    }\n  }\n\n  return shapesIds;\n}\n\n/**\n * Removes all `<img>` elements which represents Word shapes and not regular images.\n *\n * @param shapesIds Shape ids which will be checked against `<img>` elements.\n * @param documentFragment Document fragment from which to remove `<img>` elements.\n */\nfunction removeAllImgElementsRepresentingShapes(\n  shapesIds: string[],\n  documentFragment: ViewDocumentFragment,\n  writer: ViewUpcastWriter\n): void {\n  const range = writer.createRangeIn(documentFragment);\n\n  const imageElementsMatcher = new Matcher({\n    name: 'img',\n  });\n\n  const imgs = [];\n\n  for (const value of range) {\n    if (value.item.is('element') && imageElementsMatcher.match(value.item)) {\n      const el = value.item;\n      const shapes = el.getAttribute('v:shapes') ? el.getAttribute('v:shapes')!.split(' ') : [];\n\n      if (shapes.length && shapes.every(shape => shapesIds.indexOf(shape) > -1)) {\n        imgs.push(el);\n        // Shapes may also have empty source while content is paste in some browsers (Safari).\n      } else if (!el.getAttribute('src')) {\n        imgs.push(el);\n      }\n    }\n  }\n\n  for (const img of imgs) {\n    writer.remove(img);\n  }\n}\n\n/**\n * Removes all shape elements (`<v:*>...</v:*>`) so they do not pollute the output structure.\n *\n * @param documentFragment Document fragment from which to remove shape elements.\n */\nfunction removeAllShapeElements(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter) {\n  const range = writer.createRangeIn(documentFragment);\n\n  const shapeElementsMatcher = new Matcher({\n    name: /v:(.+)/,\n  });\n\n  const shapes = [];\n\n  for (const value of range) {\n    if (value.type == 'elementStart' && shapeElementsMatcher.match(value.item as ViewElement)) {\n      shapes.push(value.item as ViewElement);\n    }\n  }\n\n  for (const shape of shapes) {\n    writer.remove(shape);\n  }\n}\n\n/**\n * Inserts `img` tags if there is none after a shape.\n */\nfunction insertMissingImgs(shapeIds: string[], documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter) {\n  const range = writer.createRangeIn(documentFragment);\n\n  const shapes: ViewElement[] = [];\n\n  for (const value of range) {\n    if (value.type == 'elementStart' && value.item.is('element', 'v:shape')) {\n      const id = value.item.getAttribute('id')!;\n\n      if (shapeIds.includes(id)) {\n        continue;\n      }\n\n      if (!containsMatchingImg(value.item.parent!.getChildren(), id)) {\n        shapes.push(value.item);\n      }\n    }\n  }\n\n  for (const shape of shapes) {\n    const attrs: Record<string, unknown> = {\n      src: findSrc(shape),\n    };\n\n    if (shape.hasAttribute('alt')) {\n      attrs['alt'] = shape.getAttribute('alt');\n    }\n\n    const img = writer.createElement('img', attrs);\n\n    writer.insertChild(shape.index! + 1, img, shape.parent!);\n  }\n\n  function containsMatchingImg(nodes: Iterable<ViewNode>, id: string): boolean {\n    for (const node of nodes) {\n      /* istanbul ignore else -- @preserve */\n      if (node.is('element')) {\n        if (node.name == 'img' && node.getAttribute('v:shapes') == id) {\n          return true;\n        }\n\n        if (containsMatchingImg(node.getChildren(), id)) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  function findSrc(shape: ViewElement): string {\n    for (const child of shape.getChildren()) {\n      /* istanbul ignore else -- @preserve */\n      if (child.is('element') && child.getAttribute('src')) {\n        return child.getAttribute('src') as string;\n      }\n    }\n\n    return '';\n  }\n}\n\n/**\n * Finds all `<img>` elements in a given document fragment which have source pointing to local `file://` resource.\n * This function also tracks the index position of each image in the document, which is essential for\n * precise matching with hexadecimal representations in RTF data.\n *\n * @param documentFragment Document fragment in which to look for `<img>` elements.\n * @returns Array of found images along with their position index in the document.\n */\nfunction findAllImageElementsWithLocalSource(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): ImageWithIndex[] {\n  const range = writer.createRangeIn(documentFragment);\n\n  const imageElementsMatcher = new Matcher({\n    name: 'img',\n  });\n\n  const imgs: ImageWithIndex[] = [];\n  let currentImageIndex = 0;\n\n  for (const value of range) {\n    if (value.item.is('element') && imageElementsMatcher.match(value.item)) {\n      if (value.item.getAttribute('src')!.startsWith('file://')) {\n        imgs.push({\n          element: value.item,\n          imageIndex: currentImageIndex,\n        });\n      }\n\n      currentImageIndex++;\n    }\n  }\n\n  return imgs;\n}\n\n/**\n * Represents an image element with its index position in the document.\n * This index is crucial for correctly matching images with their\n * corresponding hexadecimal representations in RTF data.\n */\ninterface ImageWithIndex {\n  /**\n   * The position index of the image in the document.\n   * Used to map the image to its corresponding hexadecimal representation in RTF data.\n   * RTF data contains hexadecimal representations of ALL images in the document,\n   * not just those with file:// URLs.\n   */\n  imageIndex: number;\n\n  /**\n   * The image element.\n   */\n  element: ViewElement;\n}\n\n/**\n * Extracts all images HEX representations from a given RTF data.\n *\n * @param rtfData The RTF data from which to extract images HEX representation.\n * @returns Array of found HEX representations. Each array item is an object containing:\n *\n * * hex Image representation in HEX format.\n * * type Type of image, `image/png` or `image/jpeg`.\n */\nfunction extractImageDataFromRtf(rtfData: string): { hex: string; type: string }[] {\n  if (!rtfData) {\n    return [];\n  }\n\n  const regexPictureHeader = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/;\n  const regexPicture = new RegExp('(?:(' + regexPictureHeader.source + '))([\\\\da-fA-F\\\\s]+)\\\\}', 'g');\n  const images = rtfData.match(regexPicture);\n  const result = [];\n\n  if (images) {\n    for (const image of images) {\n      let imageType: string | false = false;\n\n      if (image.includes('\\\\pngblip')) {\n        imageType = 'image/png';\n      } else if (image.includes('\\\\jpegblip')) {\n        imageType = 'image/jpeg';\n      }\n\n      if (imageType) {\n        result.push({\n          hex: image.replace(regexPictureHeader, '').replace(/[^\\da-fA-F]/g, ''),\n          type: imageType,\n        });\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Replaces `src` attribute value of all given images with the corresponding base64 image representation.\n * Uses the image index to precisely match with the correct hexadecimal representation from RTF data.\n *\n * @param imageElements Array of image elements along with their indices which will have their sources replaced.\n * @param imagesHexSources Array of images hex sources (usually the result of `extractImageDataFromRtf()` function).\n * Contains hexadecimal representations of ALL images in the document, not just those with `file://` URLs.\n * In XML documents, the same image might be defined both as base64 in HTML and as hexadecimal in RTF data.\n */\nfunction replaceImagesFileSourceWithInlineRepresentation(\n  imageElements: ImageWithIndex[],\n  imagesHexSources: ReturnType<typeof extractImageDataFromRtf>,\n  writer: ViewUpcastWriter\n) {\n  for (let i = 0; i < imageElements.length; i++) {\n    const { element, imageIndex } = imageElements[i];\n    const rtfHexSource = imagesHexSources[imageIndex];\n\n    if (rtfHexSource) {\n      const newSrc = `data:${rtfHexSource.type};base64,${_convertHexToBase64(rtfHexSource.hex)}`;\n      writer.setAttribute('src', newSrc, element);\n    }\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/removemsattributes\n */\n\nimport { ViewUpcastWriter, type ViewDocumentFragment, type ViewElement } from 'ckeditor5';\n\n/**\n * Cleanup MS attributes like styles, attributes and elements.\n *\n * @param documentFragment element `data.content` obtained from clipboard.\n * @internal\n */\nexport function removeMSAttributes(documentFragment: ViewDocumentFragment): void {\n  const elementsToUnwrap: ViewElement[] = [];\n\n  const writer = new ViewUpcastWriter(documentFragment.document);\n\n  for (const { item } of writer.createRangeIn(documentFragment)) {\n    if (!item.is('element')) {\n      continue;\n    }\n\n    for (const className of item.getClassNames()) {\n      if (/\\bmso/gi.exec(className)) {\n        writer.removeClass(className, item);\n      }\n    }\n\n    for (const styleName of item.getStyleNames()) {\n      if (/\\bmso/gi.exec(styleName)) {\n        writer.removeStyle(styleName, item);\n      }\n    }\n\n    if (item.is('element', 'w:sdt') || (item.is('element', 'w:sdtpr') && item.isEmpty) || (item.is('element', 'o:p') && item.isEmpty)) {\n      elementsToUnwrap.push(item);\n    }\n  }\n\n  for (const item of elementsToUnwrap) {\n    const itemParent = item.parent!;\n    const childIndex = itemParent.getChildIndex(item);\n\n    writer.insertChild(childIndex, item.getChildren(), itemParent);\n    writer.remove(item);\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/utils\n */\n\n/**\n * Normalizes CSS length value to 'px'.\n *\n * @internal\n */\nexport function convertCssLengthToPx(value: string): string {\n  const numericValue = parseFloat(value);\n\n  if (value.endsWith('pt')) {\n    // 1pt = 1in / 72\n    return toPx((numericValue * 96) / 72);\n  } else if (value.endsWith('pc')) {\n    // 1pc = 12pt = 1in / 6.\n    return toPx((numericValue * 12 * 96) / 72);\n  } else if (value.endsWith('in')) {\n    // 1in = 2.54cm = 96px\n    return toPx(numericValue * 96);\n  } else if (value.endsWith('cm')) {\n    // 1cm = 96px / 2.54\n    return toPx((numericValue * 96) / 2.54);\n  } else if (value.endsWith('mm')) {\n    // 1mm = 1cm / 10\n    return toPx(((numericValue / 10) * 96) / 2.54);\n  }\n\n  return value;\n}\n\n/**\n * Returns true for value with 'px' unit.\n *\n * @internal\n */\nexport function isPx(value?: string): value is string {\n  return value !== undefined && value.endsWith('px');\n}\n\n/**\n * Returns a rounded 'px' value.\n *\n * @internal\n */\nexport function toPx(value: number): string {\n  return Math.round(value) + 'px';\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/table\n */\n\nimport { type ViewUpcastWriter, type ViewDocumentFragment } from 'ckeditor5';\n\nimport { convertCssLengthToPx } from './utils';\n\n/**\n * Applies border none for table and cells without a border specified.\n * Normalizes style length units to px.\n * Handles left block table alignment.\n *\n * @internal\n */\nexport function transformTables(\n  documentFragment: ViewDocumentFragment,\n  writer: ViewUpcastWriter,\n  hasTablePropertiesPlugin = false,\n  hasExtendedTableBlockAlignment = false\n): void {\n  for (const item of writer.createRangeIn(documentFragment).getItems()) {\n    if (!item.is('element', 'table') && !item.is('element', 'td') && !item.is('element', 'th')) {\n      continue;\n    }\n\n    // In MS Word, left-aligned tables (default) have no align attribute on the `<table>` and are not wrapped in a `<div>`.\n    // In such cases, we need to set `margin-left: 0` and `margin-right: auto` to indicate to the editor that\n    // the table is block-aligned to the left.\n    //\n    // Center- and right-aligned tables in MS Word are wrapped in a `<div>` with the `align` attribute set to\n    // `center` or `right`, respectively with no align attribute on the `<table>` itself.\n    //\n    // Additionally, the structure may change when pasting content from MS Word.\n    // Some browsers (e.g., Safari) may insert extra elements around the table (e.g., a <span>),\n    // so the surrounding `<div>` with the `align` attribute may end up being the table's grandparent.\n\n    if (hasTablePropertiesPlugin && hasExtendedTableBlockAlignment && item.is('element', 'table')) {\n      const directParent = item.parent?.is('element', 'div') ? item.parent : null;\n      const grandParent = item.parent?.parent?.is('element', 'div') ? item.parent.parent : null;\n      const divParent = directParent ?? grandParent;\n\n      // Center block table alignment.\n      if (divParent && divParent.getAttribute('align') === 'center' && !item.getAttribute('align')) {\n        writer.setStyle('margin-left', 'auto', item);\n        writer.setStyle('margin-right', 'auto', item);\n      }\n      // Right block table alignment.\n      else if (divParent && divParent.getAttribute('align') === 'right' && !item.getAttribute('align')) {\n        writer.setStyle('margin-left', 'auto', item);\n        writer.setStyle('margin-right', '0', item);\n      }\n      // Left block table alignment.\n      else if (!divParent && !item.getAttribute('align')) {\n        writer.setStyle('margin-left', '0', item);\n        writer.setStyle('margin-right', 'auto', item);\n      }\n    }\n\n    const sides = ['left', 'top', 'right', 'bottom'];\n\n    // As this is a pasted table, we do not want default table styles to apply here\n    // so we set border node for sides that does not have any border style.\n    // It is enough to verify border style as border color and border width properties have default values in DOM.\n    if (sides.every(side => !item.hasStyle(`border-${side}-style`))) {\n      writer.setStyle('border-style', 'none', item);\n    } else {\n      for (const side of sides) {\n        if (!item.hasStyle(`border-${side}-style`)) {\n          writer.setStyle(`border-${side}-style`, 'none', item);\n        }\n      }\n    }\n\n    // Translate style length units to px.\n    const props = ['width', 'height', ...sides.map(side => `border-${side}-width`), ...sides.map(side => `padding-${side}`)];\n\n    for (const prop of props) {\n      if (item.hasStyle(prop)) {\n        writer.setStyle(prop, convertCssLengthToPx(item.getStyle(prop)!), item);\n      }\n    }\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/removeinvalidtablewidth\n */\n\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\n\n/**\n * Removes the `width:0px` style from table pasted from Google Sheets and `width=\"0\"` attribute from Word tables.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n * @internal\n */\nexport function removeInvalidTableWidth(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  for (const child of writer.createRangeIn(documentFragment).getItems()) {\n    if (child.is('element', 'table')) {\n      // Remove invalid width style (Google Sheets: width:0px).\n      if (child.getStyle('width') === '0px') {\n        writer.removeStyle('width', child);\n      }\n\n      // Remove invalid width attribute (Word: width=\"0\").\n      if (child.getAttribute('width') === '0') {\n        writer.removeAttribute('width', child);\n      }\n    }\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/replacemsfootnotes\n */\n\nimport type { ViewDocumentFragment, ViewElement, ViewText, ViewUpcastWriter } from 'ckeditor5';\n\n/**\n * Replaces MS Word specific footnotes references and definitions with proper elements.\n *\n * Things to know about MS Word footnotes:\n *\n * * Footnote references in Word are marked with `mso-footnote-id` style.\n * * Word does not support nested footnotes, so references within definitions are ignored.\n * * Word appends extra spaces after footnote references within definitions, which are trimmed.\n * * Footnote definitions list is marked with `mso-element: footnote-list` style it contain `mso-element: footnote` elements.\n * * Footnote definition might contain tables, lists and other elements, not only text. They are placed directly within `li` element,\n * without any wrapper (in opposition to text content of the definition, which is placed within `MsoFootnoteText` element).\n *\n * Example pseudo document showing MS Word footnote structure:\n *\n * ```html\n * <p>Text with footnote<a style='mso-footnote-id:ftn1'>[1]</a> reference.</p>\n *\n * <div style='mso-element:footnote-list'>\n * \t<div style='mso-element:footnote' id=ftn1>\n * \t\t<p class=MsoFootnoteText><a style='mso-footnote-id:ftn1'>[1]</a> Footnote content</p>\n * \t\t<table class=\"MsoTableGrid\">...</table>\n * \t</div>\n * </div>\n * ```\n *\n * Will be transformed into:\n *\n * ```html\n * <p>Text with footnote<sup class=\"footnote\"><a id=\"ref-footnote-ftn1\" href=\"#footnote-ftn1\">1</a></sup> reference.</p>\n *\n * <ol class=\"footnotes\">\n * \t<li class=\"footnote-definition\" id=\"footnote-ftn1\">\n * \t\t<a href=\"#ref-footnote-ftn1\" class=\"footnote-backlink\">^</a>\n * \t\t<div class=\"footnote-content\">\n * \t\t\t<p>Footnote content</p>\n * \t\t\t<table>...</table>\n * \t\t</div>\n * \t</li>\n * </ol>\n * ```\n *\n * @param documentFragment `data.content` obtained from clipboard.\n * @param writer The view writer instance.\n * @internal\n */\nexport function replaceMSFootnotes(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  const msFootnotesRefs = new Map<string, ViewElement>();\n  const msFootnotesDefs = new Map<string, ViewElement>();\n  let msFootnotesDefinitionsList: ViewElement | null = null;\n\n  // Phase 1: Collect all footnotes references and definitions. Find the footnotes definitions list element.\n  for (const { item } of writer.createRangeIn(documentFragment)) {\n    if (!item.is('element')) {\n      continue;\n    }\n\n    // If spot a footnotes definitions element, let's store it. It'll be replaced later.\n    // There should be only one such element in the document.\n    if (item.getStyle('mso-element') === 'footnote-list') {\n      msFootnotesDefinitionsList = item;\n      continue;\n    }\n\n    // If spot a footnote reference or definition, store it in the corresponding map.\n    if (item.hasStyle('mso-footnote-id')) {\n      const msFootnoteDef = item.findAncestor('element', el => el.getStyle('mso-element') === 'footnote');\n\n      if (msFootnoteDef) {\n        // If it's a reference within a definition, ignore it and track only the definition.\n        // MS Word do not support nested footnotes, so it's safe to assume that all references within\n        // a definition point to the same definition.\n        const msFootnoteDefId = msFootnoteDef.getAttribute('id')!;\n\n        msFootnotesDefs.set(msFootnoteDefId, msFootnoteDef);\n      } else {\n        // If it's a reference outside of a definition, track it as a reference.\n        const msFootnoteRefId = item.getStyle('mso-footnote-id')!;\n\n        msFootnotesRefs.set(msFootnoteRefId, item);\n      }\n\n      continue;\n    }\n  }\n\n  // If there are no footnotes references or definitions, or no definitions list, there's nothing to normalize.\n  if (!msFootnotesRefs.size || !msFootnotesDefinitionsList) {\n    return;\n  }\n\n  // Phase 2: Replace footnotes definitions list with proper element.\n  const footnotesDefinitionsList = createFootnotesListViewElement(writer);\n\n  writer.replace(msFootnotesDefinitionsList, footnotesDefinitionsList);\n\n  // Phase 3: Replace all footnotes references and add matching definitions to the definitions list.\n  for (const [footnoteId, msFootnoteRef] of msFootnotesRefs) {\n    const msFootnoteDef = msFootnotesDefs.get(footnoteId);\n\n    if (!msFootnoteDef) {\n      continue;\n    }\n\n    // Replace footnote reference.\n    writer.replace(msFootnoteRef, createFootnoteRefViewElement(writer, footnoteId));\n\n    // Append found matching definition to the definitions list.\n    // Order doesn't matter here, as it'll be fixed in the post-fixer.\n    const defElements = createFootnoteDefViewElement(writer, footnoteId);\n\n    removeMSReferences(writer, msFootnoteDef);\n\n    // Insert content within the `MsoFootnoteText` element. It's usually a definition text content.\n    for (const child of msFootnoteDef.getChildren()) {\n      let clonedChild = child;\n\n      if (child.is('element')) {\n        clonedChild = writer.clone(child, true);\n      }\n\n      writer.appendChild(clonedChild, defElements.content);\n    }\n\n    writer.appendChild(defElements.listItem, footnotesDefinitionsList);\n  }\n}\n\n/**\n * Removes all MS Office specific references from the given element.\n *\n * It also removes leading space from text nodes following the references, as MS Word adds\n * them to separate the reference from the rest of the text.\n *\n * @param writer The view writer.\n * @param element The element to trim.\n * @returns The trimmed element.\n */\nfunction removeMSReferences(writer: ViewUpcastWriter, element: ViewElement): ViewElement {\n  const elementsToRemove: ViewElement[] = [];\n  const textNodesToTrim: ViewText[] = [];\n\n  for (const { item } of writer.createRangeIn(element)) {\n    if (item.is('element') && item.getStyle('mso-footnote-id')) {\n      elementsToRemove.unshift(item);\n\n      // MS Word used to add spaces after footnote references within definitions. Let's check if there's a space after\n      // the footnote reference and mark it for trimming.\n      const { nextSibling } = item;\n\n      if (nextSibling?.is('$text') && nextSibling.data.startsWith(' ')) {\n        textNodesToTrim.unshift(nextSibling);\n      }\n    }\n  }\n\n  for (const element of elementsToRemove) {\n    writer.remove(element);\n  }\n\n  // Remove only the leading space from text nodes following reference within definition, preserve the rest of the text.\n  for (const textNode of textNodesToTrim) {\n    const trimmedData = textNode.data.substring(1);\n\n    if (trimmedData.length > 0) {\n      // Create a new text node and replace the old one.\n      const parent = textNode.parent!;\n      const index = parent.getChildIndex(textNode);\n      const newTextNode = writer.createText(trimmedData);\n\n      writer.remove(textNode);\n      writer.insertChild(index, newTextNode, parent);\n    } else {\n      // If the text node contained only a space, remove it entirely.\n      writer.remove(textNode);\n    }\n  }\n\n  return element;\n}\n\n/**\n * Creates a footnotes list view element.\n *\n * @param writer The view writer instance.\n * @returns The footnotes list view element.\n */\nfunction createFootnotesListViewElement(writer: ViewUpcastWriter): ViewElement {\n  return writer.createElement('ol', { class: 'footnotes' });\n}\n\n/**\n * Creates a footnote reference view element.\n *\n * @param writer The view writer instance.\n * @param footnoteId The footnote ID.\n * @returns The footnote reference view element.\n */\nfunction createFootnoteRefViewElement(writer: ViewUpcastWriter, footnoteId: string): ViewElement {\n  const sup = writer.createElement('sup', { class: 'footnote' });\n  const link = writer.createElement('a', {\n    id: `ref-${footnoteId}`,\n    href: `#${footnoteId}`,\n  });\n\n  writer.appendChild(link, sup);\n\n  return sup;\n}\n\n/**\n * Creates a footnote definition view element with a backlink and a content container.\n *\n * @param writer The view writer instance.\n * @param footnoteId The footnote ID.\n * @returns An object containing the list item element, backlink and content container.\n */\nfunction createFootnoteDefViewElement(\n  writer: ViewUpcastWriter,\n  footnoteId: string\n): {\n  listItem: ViewElement;\n  content: ViewElement;\n} {\n  const listItem = writer.createElement('li', {\n    id: footnoteId,\n    class: 'footnote-definition',\n  });\n\n  const backLink = writer.createElement('a', {\n    href: `#ref-${footnoteId}`,\n    class: 'footnote-backlink',\n  });\n\n  const content = writer.createElement('div', {\n    class: 'footnote-content',\n  });\n\n  writer.appendChild(writer.createText('^'), backLink);\n  writer.appendChild(backLink, listItem);\n  writer.appendChild(content, listItem);\n\n  return {\n    listItem,\n    content,\n  };\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/normalizers/mswordnormalizer\n */\n\nimport { transformBookmarks } from '../filters/bookmark';\nimport { replaceImagesSourceWithBase64 } from '../filters/image';\nimport { removeMSAttributes } from '../filters/removemsattributes';\nimport { transformTables } from '../filters/table';\nimport { removeInvalidTableWidth } from '../filters/removeinvalidtablewidth';\nimport { replaceMSFootnotes } from '../filters/replacemsfootnotes';\nimport { ViewUpcastWriter, type ViewDocument } from 'ckeditor5';\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from '../types';\n\nconst msWordMatch1 = /<meta\\s*name=\"?generator\"?\\s*content=\"?microsoft\\s*word\\s*\\d+\"?\\/?>/i;\nconst msWordMatch2 = /xmlns:o=\"urn:schemas-microsoft-com/i;\n\n/**\n * Normalizer for the content pasted from Microsoft Word.\n */\nexport class PasteFromOfficeMSWordNormalizer implements PasteFromOfficeNormalizer {\n  public readonly document: ViewDocument;\n\n  public readonly hasMultiLevelListPlugin: boolean;\n\n  public readonly hasTablePropertiesPlugin: boolean;\n\n  public readonly hasExtendedTableBlockAlignment: boolean;\n\n  /**\n   * Creates a new `PasteFromOfficeMSWordNormalizer` instance.\n   *\n   * @param document View document.\n   */\n  constructor(\n    document: ViewDocument,\n    hasMultiLevelListPlugin = false,\n    hasTablePropertiesPlugin = false,\n    hasExtendedTableBlockAlignment = false\n  ) {\n    this.document = document;\n    this.hasMultiLevelListPlugin = hasMultiLevelListPlugin;\n    this.hasTablePropertiesPlugin = hasTablePropertiesPlugin;\n    this.hasExtendedTableBlockAlignment = hasExtendedTableBlockAlignment;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public isActive(htmlString: string): boolean {\n    return msWordMatch1.test(htmlString) || msWordMatch2.test(htmlString);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public execute(data: PasteFromOfficeNormalizerData): void {\n    const writer = new ViewUpcastWriter(this.document);\n    const { body: documentFragment, stylesString } = data._parsedData;\n\n    transformBookmarks(documentFragment, writer);\n    // transformListItemLikeElementsIntoLists(documentFragment, stylesString, this.hasMultiLevelListPlugin);\n    replaceImagesSourceWithBase64(documentFragment, data.dataTransfer.getData('text/rtf'));\n    transformTables(documentFragment, writer, this.hasTablePropertiesPlugin, this.hasExtendedTableBlockAlignment);\n    removeInvalidTableWidth(documentFragment, writer);\n    replaceMSFootnotes(documentFragment, writer);\n    removeMSAttributes(documentFragment);\n\n    data.content = documentFragment;\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/removeboldwrapper\n */\n\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\n\n/**\n * Removes the `<b>` tag wrapper added by Google Docs to a copied content.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n * @internal\n */\nexport function removeBoldWrapper(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  for (const child of documentFragment.getChildren()) {\n    if (child.is('element', 'b') && child.getStyle('font-weight') === 'normal') {\n      const childIndex = documentFragment.getChildIndex(child);\n\n      writer.remove(child);\n      writer.insertChild(childIndex, child.getChildren(), documentFragment);\n    }\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/br\n */\n\nimport {\n  ViewDomConverter,\n  ViewDocument,\n  type ViewUpcastWriter,\n  type ViewDocumentFragment,\n  type ViewElement,\n  type ViewNode,\n} from 'ckeditor5';\n\n/**\n * Transforms `<br>` elements that are siblings to some block element into a paragraphs.\n *\n * @param documentFragment The view structure to be transformed.\n * @internal\n */\nexport function transformBlockBrsToParagraphs(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  const viewDocument = new ViewDocument(writer.document.stylesProcessor);\n  const domConverter = new ViewDomConverter(viewDocument, { renderingMode: 'data' });\n\n  const blockElements = domConverter.blockElements;\n  const inlineObjectElements = domConverter.inlineObjectElements;\n\n  const elementsToReplace = [];\n\n  for (const value of writer.createRangeIn(documentFragment)) {\n    const element = value.item;\n\n    if (element.is('element', 'br')) {\n      const nextSibling = findSibling(element, 'forward', writer, { blockElements, inlineObjectElements });\n      const previousSibling = findSibling(element, 'backward', writer, { blockElements, inlineObjectElements });\n\n      const nextSiblingIsBlock = isBlockViewElement(nextSibling, blockElements);\n      const previousSiblingIsBlock = isBlockViewElement(previousSibling, blockElements);\n\n      // If the <br> is surrounded by blocks then convert it to a paragraph:\n      // * <p>foo</p>[<br>]<p>bar</p> -> <p>foo</p>[<p></p>]<p>bar</p>\n      // * <p>foo</p>[<br>] -> <p>foo</p>[<p></p>]\n      // * [<br>]<p>foo</p> -> [<p></p>]<p>foo</p>\n      if (previousSiblingIsBlock || nextSiblingIsBlock) {\n        elementsToReplace.push(element);\n      }\n    }\n  }\n\n  for (const element of elementsToReplace) {\n    if (element.hasClass('Apple-interchange-newline')) {\n      writer.remove(element);\n    } else {\n      writer.replace(element, writer.createElement('p'));\n    }\n  }\n}\n\n/**\n * Returns sibling node, threats inline elements as transparent (but should stop on an inline objects).\n */\nfunction findSibling(\n  viewElement: ViewElement,\n  direction: 'forward' | 'backward',\n  writer: ViewUpcastWriter,\n  { blockElements, inlineObjectElements }: { blockElements: string[]; inlineObjectElements: string[] }\n) {\n  let position = writer.createPositionAt(viewElement, direction == 'forward' ? 'after' : 'before');\n\n  // Find first position that is just before a first:\n  // * text node,\n  // * block element,\n  // * inline object element.\n  // It's ignoring any inline (non-object) elements like span, strong, etc.\n  position = position.getLastMatchingPosition(\n    ({ item }) => item.is('element') && !blockElements.includes(item.name) && !inlineObjectElements.includes(item.name),\n    { direction }\n  );\n\n  return direction == 'forward' ? position.nodeAfter : position.nodeBefore;\n}\n\n/**\n * Returns true for view elements that are listed as block view elements.\n */\nfunction isBlockViewElement(node: ViewNode | null, blockElements: string[]) {\n  return !!node && node.is('element') && blockElements.includes(node.name);\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/list\n */\n\nimport { Matcher, ViewUpcastWriter, type ViewDocumentFragment, type ViewElement, type ViewNode, type ViewText } from 'ckeditor5';\n\nimport { convertCssLengthToPx, toPx } from './utils';\n\n/**\n * Transforms Word specific list-like elements to the semantic HTML lists.\n *\n * Lists in Word are represented by block elements with special attributes like:\n *\n * ```xml\n * <p class=MsoListParagraphCxSpFirst style='mso-list:l1 level1 lfo1'>...</p> // Paragraph based list.\n * <h1 style='mso-list:l0 level1 lfo1'>...</h1> // Heading 1 based list.\n * ```\n *\n * @param documentFragment The view structure to be transformed.\n * @param stylesString Styles from which list-like elements styling will be extracted.\n * @internal\n */\nexport function transformListItemLikeElementsIntoLists(\n  documentFragment: ViewDocumentFragment,\n  stylesString: string,\n  hasMultiLevelListPlugin: boolean\n): void {\n  if (!documentFragment.childCount) {\n    return;\n  }\n\n  const writer = new ViewUpcastWriter(documentFragment.document);\n  const itemLikeElements = findAllItemLikeElements(documentFragment, writer);\n\n  if (!itemLikeElements.length) {\n    return;\n  }\n\n  const encounteredLists: Record<string, number> = {};\n\n  const stack: ListStack = [];\n\n  let topLevelListInfo: TopLevelListInfo = createTopLevelListInfo();\n\n  for (const itemLikeElement of itemLikeElements) {\n    if (itemLikeElement.indent !== undefined) {\n      if (!isListContinuation(itemLikeElement)) {\n        applyIndentationToTopLevelList(writer, stack, topLevelListInfo);\n        topLevelListInfo = createTopLevelListInfo();\n        stack.length = 0;\n      }\n\n      // Combined list ID for addressing encounter lists counters.\n      const originalListId = `${itemLikeElement.id}:${itemLikeElement.indent}`;\n\n      // Normalized list item indentation.\n      const indent = Math.min(itemLikeElement.indent - 1, stack.length);\n\n      // Trimming of the list stack on list ID change.\n      if (indent < stack.length && stack[indent].id !== itemLikeElement.id) {\n        stack.length = indent;\n      }\n\n      // Trimming of the list stack on lower indent list encountered.\n      if (indent < stack.length - 1) {\n        stack.length = indent + 1;\n      } else {\n        const listStyle = detectListStyle(itemLikeElement, stylesString);\n\n        // Create a new OL/UL if required (greater indent or different list type).\n        if (indent > stack.length - 1 || stack[indent].listElement.name != listStyle.type) {\n          // Check if there is some start index to set from a previous list.\n          if (indent == 0 && listStyle.type == 'ol' && itemLikeElement.id !== undefined && encounteredLists[originalListId]) {\n            listStyle.startIndex = encounteredLists[originalListId];\n          }\n\n          const listElement = createNewEmptyList(listStyle, writer, hasMultiLevelListPlugin);\n\n          // Insert the new OL/UL.\n          if (stack.length == 0) {\n            const parent = itemLikeElement.element.parent!;\n            const index = parent.getChildIndex(itemLikeElement.element) + 1;\n\n            writer.insertChild(index, listElement, parent);\n          } else {\n            const parentListItems = stack[indent - 1].listItemElements;\n\n            writer.appendChild(listElement, parentListItems[parentListItems.length - 1]);\n          }\n\n          // Update the list stack for other items to reference.\n          stack[indent] = {\n            ...itemLikeElement,\n            listElement,\n            listItemElements: [],\n          };\n\n          // Prepare list counter for start index.\n          if (indent == 0 && itemLikeElement.id !== undefined) {\n            encounteredLists[originalListId] = listStyle.startIndex || 1;\n          }\n        }\n      }\n\n      // Use LI if it is already it or create a new LI element.\n      // https://github.com/ckeditor/ckeditor5/issues/15964\n      const listItem = itemLikeElement.element.name == 'li' ? itemLikeElement.element : writer.createElement('li');\n\n      applyListItemMarginLeftAndUpdateTopLevelInfo(writer, stack, topLevelListInfo, itemLikeElement, listItem, indent);\n\n      // Append the LI to OL/UL.\n      writer.appendChild(listItem, stack[indent].listElement);\n      stack[indent].listItemElements.push(listItem);\n\n      // Increment list counter.\n      if (indent == 0 && itemLikeElement.id !== undefined) {\n        encounteredLists[originalListId]++;\n      }\n\n      // Append list block to LI.\n      if (itemLikeElement.element != listItem) {\n        writer.appendChild(itemLikeElement.element, listItem);\n      }\n\n      // Clean list block.\n      removeBulletElement(itemLikeElement.element, writer);\n      writer.removeStyle('text-indent', itemLikeElement.element); // #12361\n      writer.removeStyle('margin-left', itemLikeElement.element);\n    } else {\n      // Other blocks in a list item.\n      const stackItem = stack.find(stackItem => stackItem.marginLeft == itemLikeElement.marginLeft);\n\n      // This might be a paragraph that has known margin, but it is not a real list block.\n      if (stackItem) {\n        const listItems = stackItem.listItemElements;\n\n        // Append block to LI.\n        writer.appendChild(itemLikeElement.element, listItems[listItems.length - 1]);\n        writer.removeStyle('margin-left', itemLikeElement.element);\n      } else {\n        stack.length = 0;\n      }\n    }\n  }\n\n  applyIndentationToTopLevelList(writer, stack, topLevelListInfo);\n}\n\nfunction applyListItemMarginLeftAndUpdateTopLevelInfo(\n  writer: ViewUpcastWriter,\n  stack: ListStack,\n  topLevelListInfo: TopLevelListInfo,\n  itemLikeElement: ListLikeElement,\n  listItem: ViewElement,\n  indent: number\n) {\n  if (itemLikeElement.marginLeft === undefined) {\n    // If at least one of the list items at indent = 0 does not have margin-left style, we cannot set margin-left on the list.\n    if (indent == 0) {\n      topLevelListInfo.canApplyMarginOnList = false;\n    }\n\n    return;\n  }\n\n  const listItemBlockMarginLeft = parseFloat(itemLikeElement.marginLeft);\n\n  let currentListBlockIndent = 0;\n\n  if (stack.length > 1) {\n    const prevStackLevelItems = stack[stack.length - 2].listItemElements;\n\n    if (prevStackLevelItems.length > 0) {\n      // The margin-left style of the previous indent level last item is already a relative value applied in the previous iteration.\n      const lastItemMargin = prevStackLevelItems[prevStackLevelItems.length - 1].getStyle('margin-left');\n\n      if (lastItemMargin !== undefined) {\n        currentListBlockIndent += parseFloat(lastItemMargin);\n      }\n    }\n  }\n\n  // Add 40px for each indent level because by default HTML lists have 40px indentation (padding-inline-start: 40px).\n  // So every nested list is indented by another 40px.\n  // Additionally, the nested list itself may be placed in a list item with margin-left style.\n  currentListBlockIndent += stack.length * 40;\n\n  // Calculate relative list item indentation to the list it is in.\n  const adjustedListItemIndent = listItemBlockMarginLeft - currentListBlockIndent;\n  const listItemBlockMarginLeftPx = adjustedListItemIndent !== 0 ? toPx(adjustedListItemIndent) : undefined;\n\n  if (listItemBlockMarginLeftPx) {\n    writer.setStyle('margin-left', listItemBlockMarginLeftPx, listItem);\n\n    if (indent == 0 && topLevelListInfo.canApplyMarginOnList) {\n      if (topLevelListInfo.marginLeft === undefined) {\n        topLevelListInfo.marginLeft = listItemBlockMarginLeftPx;\n      }\n\n      if (listItemBlockMarginLeftPx !== topLevelListInfo.marginLeft) {\n        topLevelListInfo.canApplyMarginOnList = false;\n      }\n\n      topLevelListInfo.topLevelListItemElements.push(listItem);\n    }\n  }\n}\n\nfunction createTopLevelListInfo(): TopLevelListInfo {\n  return {\n    marginLeft: undefined,\n    canApplyMarginOnList: true,\n    topLevelListItemElements: [],\n  };\n}\n\n/**\n * Sets margin-left style to the top-level list if all its items have the same margin-left.\n * If margin-left is set on the list, it is removed from all its items to avoid doubling of margins.\n */\nfunction applyIndentationToTopLevelList(writer: ViewUpcastWriter, stack: ListStack, topLevelListInfo: TopLevelListInfo) {\n  if (topLevelListInfo.canApplyMarginOnList && topLevelListInfo.marginLeft && topLevelListInfo.topLevelListItemElements.length > 0) {\n    // Apply margin-left to the top-level list if all its items have the same margin-left.\n    writer.setStyle('margin-left', topLevelListInfo.marginLeft, stack[0].listElement);\n\n    // Remove margin-left from all top-level list items.\n    for (const topLevelListItem of topLevelListInfo.topLevelListItemElements) {\n      writer.removeStyle('margin-left', topLevelListItem);\n    }\n  }\n}\n\n/**\n * Removes paragraph wrapping content inside a list item.\n *\n * @internal\n */\nexport function unwrapParagraphInListItem(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  for (const value of writer.createRangeIn(documentFragment)) {\n    const element = value.item;\n\n    if (element.is('element', 'li')) {\n      // Google Docs allows for single paragraph inside LI.\n      const firstChild = element.getChild(0);\n\n      if (firstChild && firstChild.is('element', 'p')) {\n        writer.unwrapElement(firstChild);\n      }\n    }\n  }\n}\n\n/**\n * Finds all list-like elements in a given document fragment.\n *\n * @param documentFragment Document fragment in which to look for list-like nodes.\n * @returns Array of found list-like items. Each item is an object containing\n * @internal\n */\nfunction findAllItemLikeElements(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): ListLikeElement[] {\n  const range = writer.createRangeIn(documentFragment);\n  const itemLikeElements: ListLikeElement[] = [];\n  const foundMargins = new Set<string>();\n\n  for (const item of range.getItems()) {\n    // https://github.com/ckeditor/ckeditor5/issues/15964\n    if (!item.is('element') || !item.name.match(/^(p|h\\d+|li|div)$/)) {\n      continue;\n    }\n\n    // Try to rely on margin-left style to find paragraphs visually aligned with previously encountered list item.\n    let marginLeft = getMarginLeftNormalized(item);\n\n    // Ignore margin-left 0 style if there is no MsoList... class.\n    if (\n      marginLeft !== undefined &&\n      parseFloat(marginLeft) == 0 &&\n      !Array.from(item.getClassNames()).find(className => className.startsWith('MsoList'))\n    ) {\n      marginLeft = undefined;\n    }\n\n    // List item or a following list item block.\n    if ((item.hasStyle('mso-list') && item.getStyle('mso-list') !== 'none') || (marginLeft !== undefined && foundMargins.has(marginLeft))) {\n      const itemData = getListItemData(item);\n\n      itemLikeElements.push({\n        element: item,\n        id: itemData.id,\n        order: itemData.order,\n        indent: itemData.indent,\n        marginLeft,\n      });\n\n      if (marginLeft !== undefined) {\n        foundMargins.add(marginLeft);\n      }\n    }\n    // Clear found margins as we found block after a list.\n    else {\n      foundMargins.clear();\n    }\n  }\n\n  return itemLikeElements;\n}\n\n/**\n * Whether the given element is possibly a list continuation. Previous element was wrapped into a list\n * or the current element already is inside a list.\n */\nfunction isListContinuation(currentItem: ListLikeElement) {\n  const previousSibling = currentItem.element.previousSibling;\n\n  if (!previousSibling) {\n    const parent = currentItem.element.parent as ViewElement;\n\n    // If it's a li inside ul or ol like in here: https://github.com/ckeditor/ckeditor5/issues/15964.\n    // If the parent has previous sibling, which is not a list, then it is not a continuation.\n    return isList(parent) && (!parent.previousSibling || isList(parent.previousSibling));\n  }\n\n  // Even with the same id the list does not have to be continuous (#43).\n  return isList(previousSibling);\n}\n\nfunction isList(element: ViewNode) {\n  return element.is('element', 'ol') || element.is('element', 'ul');\n}\n\n/**\n * Extracts list item style from the provided CSS.\n *\n * List item style is extracted from the CSS stylesheet. Each list with its specific style attribute\n * value (`mso-list:l1 level1 lfo1`) has its dedicated properties in a CSS stylesheet defined with a selector like:\n *\n * ```css\n * @list l1:level1 { ... }\n * ```\n *\n * It contains `mso-level-number-format` property which defines list numbering/bullet style. If this property\n * is not defined it means default `decimal` numbering.\n *\n * Here CSS string representation is used as `mso-level-number-format` property is an invalid CSS property\n * and will be removed during CSS parsing.\n *\n * @param listLikeItem List-like item for which list style will be searched for. Usually\n * a result of `findAllItemLikeElements()` function.\n * @param stylesString CSS stylesheet.\n * @returns An object with properties:\n *\n * * type - List type, could be `ul` or `ol`.\n * * startIndex - List start index, valid only for ordered lists.\n * * style - List style, for example: `decimal`, `lower-roman`, etc. It is extracted\n *     directly from Word stylesheet and adjusted to represent proper values for the CSS `list-style-type` property.\n *     If it cannot be adjusted, the `null` value is returned.\n */\nfunction detectListStyle(listLikeItem: ListLikeElement, stylesString: string) {\n  const listStyleRegexp = new RegExp(`@list l${listLikeItem.id}:level${listLikeItem.indent}\\\\s*({[^}]*)`, 'gi');\n  const listStyleTypeRegex = /mso-level-number-format:([^;]{0,100});/gi;\n  const listStartIndexRegex = /mso-level-start-at:\\s{0,100}([0-9]{0,10})\\s{0,100};/gi;\n  const legalStyleListRegex = new RegExp(`@list\\\\s+l${listLikeItem.id}:level\\\\d\\\\s*{[^{]*mso-level-text:\"%\\\\d\\\\\\\\.`, 'gi');\n  const multiLevelNumberFormatTypeRegex = new RegExp(`@list l${listLikeItem.id}:level\\\\d\\\\s*{[^{]*mso-level-number-format:`, 'gi');\n\n  const legalStyleListMatch = legalStyleListRegex.exec(stylesString);\n  const multiLevelNumberFormatMatch = multiLevelNumberFormatTypeRegex.exec(stylesString);\n\n  // Multi level lists in Word have mso-level-number-format attribute except legal lists,\n  // so we used that. If list has legal list match and doesn't has mso-level-number-format\n  // then this is legal-list.\n  const islegalStyleList = legalStyleListMatch && !multiLevelNumberFormatMatch;\n\n  const listStyleMatch = listStyleRegexp.exec(stylesString);\n\n  let listStyleType = 'decimal'; // Decimal is default one.\n  let type = 'ol'; // <ol> is default list.\n  let startIndex = null;\n\n  if (listStyleMatch && listStyleMatch[1]) {\n    const listStyleTypeMatch = listStyleTypeRegex.exec(listStyleMatch[1]);\n\n    if (listStyleTypeMatch && listStyleTypeMatch[1]) {\n      listStyleType = listStyleTypeMatch[1].trim();\n      type = listStyleType !== 'bullet' && listStyleType !== 'image' ? 'ol' : 'ul';\n    }\n\n    // Styles for the numbered lists are always defined in the Word CSS stylesheet.\n    // Unordered lists MAY contain a value for the Word CSS definition `mso-level-text` but sometimes\n    // this tag is missing. And because of that, we cannot depend on that. We need to predict the list style value\n    // based on the list style marker element.\n    if (listStyleType === 'bullet') {\n      const bulletedStyle = findBulletedListStyle(listLikeItem.element);\n\n      if (bulletedStyle) {\n        listStyleType = bulletedStyle;\n      }\n    } else {\n      const listStartIndexMatch = listStartIndexRegex.exec(listStyleMatch[1]);\n\n      if (listStartIndexMatch && listStartIndexMatch[1]) {\n        startIndex = parseInt(listStartIndexMatch[1]);\n      }\n    }\n\n    if (islegalStyleList) {\n      type = 'ol';\n    }\n  }\n\n  return {\n    type,\n    startIndex,\n    style: mapListStyleDefinition(listStyleType),\n    isLegalStyleList: islegalStyleList,\n  };\n}\n\n/**\n * Tries to extract the `list-style-type` value based on the marker element for bulleted list.\n */\nfunction findBulletedListStyle(element: ViewElement) {\n  // https://github.com/ckeditor/ckeditor5/issues/15964\n  if (element.name == 'li' && element.parent!.name == 'ul' && element.parent!.hasAttribute('type')) {\n    return element.parent!.getAttribute('type');\n  }\n\n  const listMarkerElement = findListMarkerNode(element);\n\n  if (!listMarkerElement) {\n    return null;\n  }\n\n  const listMarker = listMarkerElement._data;\n\n  if (listMarker === 'o') {\n    return 'circle';\n  } else if (listMarker === '·') {\n    return 'disc';\n  }\n  // Word returns '§' instead of '■' for the square list style.\n  else if (listMarker === '§') {\n    return 'square';\n  }\n\n  return null;\n}\n\n/**\n * Tries to find a text node that represents the marker element (list-style-type).\n */\nfunction findListMarkerNode(element: ViewElement): ViewText | null {\n  // If the first child is a text node, it is the data for the element.\n  // The list-style marker is not present here.\n  if (element.getChild(0)!.is('$text')) {\n    return null;\n  }\n\n  for (const childNode of element.getChildren()) {\n    // The list-style marker will be inside the `<span>` element. Let's ignore all non-span elements.\n    // It may happen that the `<a>` element is added as the first child. Most probably, it's an anchor element.\n    if (!childNode.is('element', 'span')) {\n      continue;\n    }\n\n    const textNodeOrElement = childNode.getChild(0);\n\n    if (!textNodeOrElement) {\n      continue;\n    }\n\n    // If already found the marker element, use it.\n    if (textNodeOrElement.is('$text')) {\n      return textNodeOrElement;\n    }\n\n    return (textNodeOrElement as any).getChild(0);\n  }\n\n  /* istanbul ignore next -- @preserve */\n  return null;\n}\n\n/**\n * Parses the `list-style-type` value extracted directly from the Word CSS stylesheet and returns proper CSS definition.\n */\nfunction mapListStyleDefinition(value: string) {\n  if (value.startsWith('arabic-leading-zero')) {\n    return 'decimal-leading-zero';\n  }\n\n  switch (value) {\n    case 'alpha-upper':\n      return 'upper-alpha';\n    case 'alpha-lower':\n      return 'lower-alpha';\n    case 'roman-upper':\n      return 'upper-roman';\n    case 'roman-lower':\n      return 'lower-roman';\n    case 'circle':\n    case 'disc':\n    case 'square':\n      return value;\n    default:\n      return null;\n  }\n}\n\n/**\n * Creates a new list OL/UL element.\n */\nfunction createNewEmptyList(listStyle: ReturnType<typeof detectListStyle>, writer: ViewUpcastWriter, hasMultiLevelListPlugin: boolean) {\n  const list = writer.createElement(listStyle.type);\n\n  // We do not support modifying the marker for a particular list item.\n  // Set the value for the `list-style-type` property directly to the list container.\n  if (listStyle.style) {\n    writer.setStyle('list-style-type', listStyle.style, list);\n  }\n\n  if (listStyle.startIndex && listStyle.startIndex > 1) {\n    writer.setAttribute('start', listStyle.startIndex, list);\n  }\n\n  if (listStyle.isLegalStyleList && hasMultiLevelListPlugin) {\n    writer.addClass('legal-list', list);\n  }\n\n  return list;\n}\n\n/**\n * Extracts list item information from Word specific list-like element style:\n *\n * ```\n * `style=\"mso-list:l1 level1 lfo1\"`\n * ```\n *\n * where:\n *\n * ```\n * * `l1` is a list id (however it does not mean this is a continuous list - see #43),\n * * `level1` is a list item indentation level,\n * * `lfo1` is a list insertion order in a document.\n * ```\n *\n * @param element Element from which style data is extracted.\n */\nfunction getListItemData(element: ViewElement): ListItemData {\n  const listStyle = element.getStyle('mso-list');\n\n  if (listStyle === undefined) {\n    return {};\n  }\n\n  const idMatch = listStyle.match(/(^|\\s{1,100})l(\\d+)/i);\n  const orderMatch = listStyle.match(/\\s{0,100}lfo(\\d+)/i);\n  const indentMatch = listStyle.match(/\\s{0,100}level(\\d+)/i);\n\n  if (idMatch && orderMatch && indentMatch) {\n    return {\n      id: idMatch[2],\n      order: orderMatch[1],\n      indent: parseInt(indentMatch[1]),\n    };\n  }\n\n  return {\n    indent: 1, // Handle empty mso-list style as a marked for default list item.\n  };\n}\n\n/**\n * Removes span with a numbering/bullet from a given element.\n */\nfunction removeBulletElement(element: ViewElement, writer: ViewUpcastWriter) {\n  // Matcher for finding `span` elements holding lists numbering/bullets.\n  const bulletMatcher = new Matcher({\n    name: 'span',\n    styles: {\n      'mso-list': 'Ignore',\n    },\n  });\n\n  const range = writer.createRangeIn(element);\n\n  for (const value of range) {\n    if (value.type === 'elementStart' && bulletMatcher.match(value.item as ViewElement)) {\n      writer.remove(value.item as ViewElement);\n    }\n  }\n}\n\n/**\n * Returns element left margin normalized to 'px' if possible.\n */\nfunction getMarginLeftNormalized(element: ViewElement): string | undefined {\n  const value = element.getStyle('margin-left');\n\n  if (value === undefined || value.endsWith('px')) {\n    return value;\n  }\n\n  return convertCssLengthToPx(value);\n}\n\ninterface ListItemData {\n  /**\n   * Parent list id.\n   */\n  id?: string;\n\n  /**\n   * List item creation order.\n   */\n  order?: string;\n\n  /**\n   * List item indentation level.\n   */\n  indent?: number;\n}\n\ninterface ListLikeElement extends ListItemData {\n  /**\n   * List-like element.\n   */\n  element: ViewElement;\n\n  /**\n   * The margin-left normalized to 'px' if possible.\n   */\n  marginLeft?: string;\n}\n\ntype ListStack = (ListLikeElement & {\n  listElement: ViewElement;\n  listItemElements: ViewElement[];\n})[];\n\ninterface TopLevelListInfo {\n  marginLeft: string | undefined;\n  canApplyMarginOnList: boolean;\n  topLevelListItemElements: ViewElement[];\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/normalizers/googledocsnormalizer\n */\n\nimport { ViewUpcastWriter, type ViewDocument } from 'ckeditor5';\n\nimport { removeBoldWrapper } from '../filters/removeboldwrapper';\nimport { transformBlockBrsToParagraphs } from '../filters/br';\nimport { unwrapParagraphInListItem } from '../filters/list';\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from '../types';\n\nconst googleDocsMatch = /id=(\"|')docs-internal-guid-[-0-9a-f]+(\"|')/i;\n\n/**\n * Normalizer for the content pasted from Google Docs.\n *\n * @internal\n */\nexport class GoogleDocsNormalizer implements PasteFromOfficeNormalizer {\n  public readonly document: ViewDocument;\n\n  /**\n   * Creates a new `GoogleDocsNormalizer` instance.\n   *\n   * @param document View document.\n   */\n  constructor(document: ViewDocument) {\n    this.document = document;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public isActive(htmlString: string): boolean {\n    return googleDocsMatch.test(htmlString);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public execute(data: PasteFromOfficeNormalizerData): void {\n    const writer = new ViewUpcastWriter(this.document);\n    const { body: documentFragment } = data._parsedData;\n\n    removeBoldWrapper(documentFragment, writer);\n    unwrapParagraphInListItem(documentFragment, writer);\n    transformBlockBrsToParagraphs(documentFragment, writer);\n    // replaceTabsWithinPreWithSpaces( documentFragment, writer, 8 );\n\n    data.content = documentFragment;\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/removexmlns\n */\n\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\n\n/**\n * Removes the `xmlns` attribute from table pasted from Google Sheets.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n * @internal\n */\nexport function removeXmlns(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  for (const child of documentFragment.getChildren()) {\n    if (child.is('element', 'table') && child.hasAttribute('xmlns')) {\n      writer.removeAttribute('xmlns', child);\n    }\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/removegooglesheetstag\n */\n\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\n\n/**\n * Removes the `<google-sheets-html-origin>` tag wrapper added by Google Sheets to a copied content.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n * @internal\n */\nexport function removeGoogleSheetsTag(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  for (const child of documentFragment.getChildren()) {\n    if (child.is('element', 'google-sheets-html-origin')) {\n      const childIndex = documentFragment.getChildIndex(child);\n\n      writer.remove(child);\n      writer.insertChild(childIndex, child.getChildren(), documentFragment);\n    }\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/removestyleblock\n */\n\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\n\n/**\n * Removes `<style>` block added by Google Sheets to a copied content.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n * @internal\n */\nexport function removeStyleBlock(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\n  for (const child of Array.from(documentFragment.getChildren())) {\n    if (child.is('element', 'style')) {\n      writer.remove(child);\n    }\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/normalizers/googlesheetsnormalizer\n */\n\nimport { ViewUpcastWriter, type ViewDocument } from 'ckeditor5';\n\nimport { removeXmlns } from '../filters/removexmlns';\nimport { removeGoogleSheetsTag } from '../filters/removegooglesheetstag';\nimport { removeInvalidTableWidth } from '../filters/removeinvalidtablewidth';\nimport { removeStyleBlock } from '../filters/removestyleblock';\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from '../types';\n\nconst googleSheetsMatch = /<google-sheets-html-origin/i;\n\n/**\n * Normalizer for the content pasted from Google Sheets.\n *\n * @internal\n */\nexport class GoogleSheetsNormalizer implements PasteFromOfficeNormalizer {\n  public readonly document: ViewDocument;\n\n  /**\n   * Creates a new `GoogleSheetsNormalizer` instance.\n   *\n   * @param document View document.\n   */\n  constructor(document: ViewDocument) {\n    this.document = document;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public isActive(htmlString: string): boolean {\n    return googleSheetsMatch.test(htmlString);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public execute(data: PasteFromOfficeNormalizerData): void {\n    const writer = new ViewUpcastWriter(this.document);\n    const { body: documentFragment } = data._parsedData;\n\n    removeGoogleSheetsTag(documentFragment, writer);\n    removeXmlns(documentFragment, writer);\n    removeInvalidTableWidth(documentFragment, writer);\n    removeStyleBlock(documentFragment, writer);\n\n    data.content = documentFragment;\n  }\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/space\n */\n\n/**\n * Replaces last space preceding elements closing tag with `&nbsp;`. Such operation prevents spaces from being removed\n * during further DOM/View processing (see especially {@link module:engine/view/domconverter~ViewDomConverter#_processDomInlineNodes}).\n * This method also takes into account Word specific `<o:p></o:p>` empty tags.\n * Additionally multiline sequences of spaces and new lines between tags are removed (see #39 and #40).\n *\n * @param htmlString HTML string in which spacing should be normalized.\n * @returns Input HTML with spaces normalized.\n * @internal\n */\nexport function normalizeSpacing(htmlString: string): string {\n  // Run normalizeSafariSpaceSpans() two times to cover nested spans.\n  return (\n    normalizeSafariSpaceSpans(normalizeSafariSpaceSpans(htmlString))\n      // Remove all \\r\\n from \"spacerun spans\" so the last replace line doesn't strip all whitespaces.\n      .replace(/(<span\\s+style=['\"]mso-spacerun:yes['\"]>[^\\S\\r\\n]*?)[\\r\\n]+([^\\S\\r\\n]*<\\/span>)/g, '$1$2')\n      .replace(/<span\\s+style=['\"]mso-spacerun:yes['\"]><\\/span>/g, '')\n      .replace(/(<span\\s+style=['\"]letter-spacing:[^'\"]+?['\"]>)[\\r\\n]+(<\\/span>)/g, '$1 $2')\n      .replace(/ <\\//g, '\\u00A0</')\n      .replace(/ <o:p><\\/o:p>/g, '\\u00A0<o:p></o:p>')\n      // Remove <o:p> block filler from empty paragraph. Safari uses \\u00A0 instead of &nbsp;.\n      .replace(/<o:p>(&nbsp;|\\u00A0)<\\/o:p>/g, '')\n      // Remove all whitespaces when they contain any \\r or \\n.\n      .replace(/>([^\\S\\r\\n]*[\\r\\n]\\s*)</g, '><')\n  );\n}\n\n/**\n * Normalizes spacing in special Word `spacerun spans` (`<span style='mso-spacerun:yes'>\\s+</span>`) by replacing\n * all spaces with `&nbsp; ` pairs. This prevents spaces from being removed during further DOM/View processing\n * (see especially {@link module:engine/view/domconverter~ViewDomConverter#_processDomInlineNodes}).\n *\n * @param htmlDocument Native `Document` object in which spacing should be normalized.\n * @internal\n */\nexport function normalizeSpacerunSpans(htmlDocument: Document): void {\n  htmlDocument.querySelectorAll('span[style*=spacerun]').forEach(el => {\n    const htmlElement = el as HTMLElement;\n    const innerTextLength = htmlElement.innerText.length || 0;\n\n    htmlElement.innerText = Array(innerTextLength + 1)\n      .join('\\u00A0 ')\n      .substr(0, innerTextLength);\n  });\n}\n\n/**\n * Normalizes specific spacing generated by Safari when content pasted from Word (`<span class=\"Apple-converted-space\"> </span>`)\n * by replacing all spaces sequences longer than 1 space with `&nbsp; ` pairs. This prevents spaces from being removed during\n * further DOM/View processing (see especially {@link module:engine/view/domconverter~ViewDomConverter#_processDataFromDomText}).\n *\n * This function is similar to {@link module:clipboard/utils/normalizeclipboarddata normalizeClipboardData util} but uses\n * regular spaces / &nbsp; sequence for replacement.\n *\n * @param htmlString HTML string in which spacing should be normalized\n * @returns Input HTML with spaces normalized.\n * @internal\n */\nfunction normalizeSafariSpaceSpans(htmlString: string) {\n  return htmlString.replace(/<span(?: class=\"Apple-converted-space\"|)>(\\s+)<\\/span>/g, (fullMatch, spaces) => {\n    return spaces.length === 1\n      ? ' '\n      : Array(spaces.length + 1)\n          .join('\\u00A0 ')\n          .substr(0, spaces.length);\n  });\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/filters/parse\n */\n\nimport { ViewDomConverter, ViewDocument, type StylesProcessor, type ViewDocumentFragment } from 'ckeditor5';\n\nimport { normalizeSpacing, normalizeSpacerunSpans } from './space';\n\n/**\n * Parses the provided HTML extracting contents of `<body>` and `<style>` tags.\n *\n * @param htmlString HTML string to be parsed.\n */\nexport function parsePasteOfficeHtml(htmlString: string, stylesProcessor: StylesProcessor): PasteOfficeHtmlParseResult {\n  const domParser = new DOMParser();\n\n  // Remove Word specific \"if comments\" so content inside is not omitted by the parser.\n  htmlString = htmlString.replace(/<!--\\[if gte vml 1]>/g, '');\n\n  // Clean the <head> section of MS Windows specific tags. See https://github.com/ckeditor/ckeditor5/issues/15333.\n  // The regular expression matches the <o:SmartTagType> tag with optional attributes (with or without values).\n  htmlString = htmlString.replace(/<o:SmartTagType(?:\\s+[^\\s>=]+(?:=\"[^\"]*\")?)*\\s*\\/?>/gi, '');\n\n  const normalizedHtml = normalizeSpacing(cleanContentAfterBody(htmlString));\n\n  // Parse htmlString as native Document object.\n  const htmlDocument = domParser.parseFromString(normalizedHtml, 'text/html');\n\n  normalizeSpacerunSpans(htmlDocument);\n\n  // Get `innerHTML` first as transforming to View modifies the source document.\n  const bodyString = htmlDocument.body.innerHTML;\n\n  // Transform document.body to View.\n  const bodyView = documentToView(htmlDocument, stylesProcessor);\n\n  // Extract stylesheets.\n  const stylesObject = extractStyles(htmlDocument);\n\n  return {\n    body: bodyView,\n    bodyString,\n    styles: stylesObject.styles,\n    stylesString: stylesObject.stylesString,\n  };\n}\n\n/**\n * The result of {@link ~parsePasteOfficeHtml}.\n */\nexport interface PasteOfficeHtmlParseResult {\n  /**\n   * Parsed body content as a traversable structure.\n   */\n  body: ViewDocumentFragment;\n\n  /**\n   * Entire body content as a string.\n   */\n  bodyString: string;\n\n  /**\n   * Array of native `CSSStyleSheet` objects, each representing separate `style` tag from the source HTML.\n   */\n  styles: CSSStyleSheet[];\n\n  /**\n   * All `style` tags contents combined in the order of occurrence into one string.\n   */\n  stylesString: string;\n}\n\n/**\n * Transforms native `Document` object into {@link module:engine/view/documentfragment~ViewDocumentFragment}. Comments are skipped.\n *\n * @param htmlDocument Native `Document` object to be transformed.\n */\nfunction documentToView(htmlDocument: Document, stylesProcessor: StylesProcessor) {\n  const viewDocument = new ViewDocument(stylesProcessor);\n  const domConverter = new ViewDomConverter(viewDocument, { renderingMode: 'data' });\n  const fragment = htmlDocument.createDocumentFragment();\n  const nodes = htmlDocument.body.childNodes;\n\n  while (nodes.length > 0) {\n    fragment.appendChild(nodes[0]);\n  }\n\n  return domConverter.domToView(fragment, { skipComments: true }) as ViewDocumentFragment;\n}\n\n/**\n * Extracts both `CSSStyleSheet` and string representation from all `style` elements available in a provided `htmlDocument`.\n *\n * @param htmlDocument Native `Document` object from which styles will be extracted.\n */\nfunction extractStyles(htmlDocument: Document): { styles: CSSStyleSheet[]; stylesString: string } {\n  const styles = [];\n  const stylesString = [];\n  const styleTags = Array.from(htmlDocument.getElementsByTagName('style'));\n\n  for (const style of styleTags) {\n    if (style.sheet && style.sheet.cssRules && style.sheet.cssRules.length) {\n      styles.push(style.sheet);\n      stylesString.push(style.innerHTML);\n    }\n  }\n\n  return {\n    styles,\n    stylesString: stylesString.join(' '),\n  };\n}\n\n/**\n * Removes leftover content from between closing </body> and closing </html> tag:\n *\n * ```html\n * <html><body><p>Foo Bar</p></body><span>Fo</span></html> -> <html><body><p>Foo Bar</p></body></html>\n * ```\n *\n * This function is used as specific browsers (Edge) add some random content after `body` tag when pasting from Word.\n * @param htmlString The HTML string to be cleaned.\n * @returns The HTML string with leftover content removed.\n */\nfunction cleanContentAfterBody(htmlString: string) {\n  const bodyCloseTag = '</body>';\n  const htmlCloseTag = '</html>';\n\n  const bodyCloseIndex = htmlString.indexOf(bodyCloseTag);\n\n  if (bodyCloseIndex < 0) {\n    return htmlString;\n  }\n\n  const htmlCloseIndex = htmlString.indexOf(htmlCloseTag, bodyCloseIndex + bodyCloseTag.length);\n\n  return htmlString.substring(0, bodyCloseIndex + bodyCloseTag.length) + (htmlCloseIndex >= 0 ? htmlString.substring(htmlCloseIndex) : '');\n}\n","/**\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\n */\n\n/**\n * @module paste-from-office/pastefromoffice\n */\n\nimport { Plugin, ClipboardPipeline } from 'ckeditor5';\n\nimport { PasteFromOfficeMSWordNormalizer } from './normalizers/mswordnormalizer';\nimport { GoogleDocsNormalizer } from './normalizers/googledocsnormalizer';\nimport { GoogleSheetsNormalizer } from './normalizers/googlesheetsnormalizer';\n\nimport { parsePasteOfficeHtml } from './filters/parse';\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from './types';\n\n/**\n * The Paste from Office plugin.\n *\n * This plugin handles content pasted from Office apps and transforms it (if necessary)\n * to a valid structure which can then be understood by the editor features.\n *\n * Transformation is made by a set of predefined {@link module:paste-from-office/normalizer~PasteFromOfficeNormalizer normalizers}.\n * This plugin includes following normalizers:\n * * {@link module:paste-from-office/normalizers/mswordnormalizer~PasteFromOfficeMSWordNormalizer Microsoft Word normalizer}\n * * {@link module:paste-from-office/normalizers/googledocsnormalizer~GoogleDocsNormalizer Google Docs normalizer}\n *\n * For more information about this feature check the {@glink api/paste-from-office package page}.\n */\nexport class PasteHandler extends Plugin {\n  /**\n   * @inheritDoc\n   */\n  public static get pluginName() {\n    return 'PasteHandler' as const;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public static get requires() {\n    return [ClipboardPipeline] as const;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public init(): void {\n    const editor = this.editor;\n    const clipboardPipeline: ClipboardPipeline = editor.plugins.get('ClipboardPipeline');\n    const viewDocument = editor.editing.view.document;\n    const normalizers: PasteFromOfficeNormalizer[] = [];\n    const hasMultiLevelListPlugin = this.editor.plugins.has('MultiLevelListEditing');\n    const hasTablePropertiesPlugin = this.editor.plugins.has('TablePropertiesEditing');\n    const hasExtendedTableBlockAlignment = true; // In CKEditor 5 v48, extended table block alignment is stable and enabled by default.\n\n    normalizers.push(\n      new PasteFromOfficeMSWordNormalizer(viewDocument, hasMultiLevelListPlugin, hasTablePropertiesPlugin, hasExtendedTableBlockAlignment)\n    );\n    normalizers.push(new GoogleDocsNormalizer(viewDocument));\n    normalizers.push(new GoogleSheetsNormalizer(viewDocument));\n\n    clipboardPipeline.on(\n      'inputTransformation',\n      (evt, data: PasteFromOfficeNormalizerData) => {\n        if (data._isTransformedWithPasteFromOffice) {\n          return;\n        }\n\n        const codeBlock = editor.model.document.selection.getFirstPosition()!.parent;\n\n        if (codeBlock.is('element', 'codeBlock')) {\n          return;\n        }\n\n        const htmlString = data.dataTransfer.getData('text/html');\n        const activeNormalizer = normalizers.find(normalizer => normalizer.isActive(htmlString));\n\n        if (activeNormalizer) {\n          if (!data._parsedData) {\n            data._parsedData = parsePasteOfficeHtml(htmlString, viewDocument.stylesProcessor);\n          }\n\n          activeNormalizer.execute(data);\n\n          data._isTransformedWithPasteFromOffice = true;\n        }\n      },\n      { priority: 'high' }\n    );\n  }\n}\n","import { Plugin } from 'ckeditor5';\n\nexport class HighlightRangePlugin extends Plugin {\n  init() {\n    const editor = this.editor;\n\n    editor.conversion.for('editingDowncast').markerToHighlight({\n      model: 'highlightRange',\n      view: {\n        classes: 'highlight-range',\n      },\n    });\n  }\n}\n","import { Plugin } from 'ckeditor5';\n\n/**\n * Plugin để thêm margin-bottom: 4px cho các block elements\n * (paragraph, heading, list, table) thông qua downcast conversion\n */\nexport class BlockSpace extends Plugin {\n  static get pluginName() {\n    return 'BlockSpace';\n  }\n\n  init() {\n    const editor = this.editor;\n    const conversion = editor.conversion;\n\n    // Handler factory để áp dụng margin-bottom: 4px\n    const makeHandler = (elementType: string) => {\n      return (evt: any, data: any, conversionApi: any) => {\n        const viewElement = conversionApi.mapper.toViewElement(data.item);\n        if (viewElement) {\n          conversionApi.writer.setStyle('margin-top', '0', viewElement);\n          conversionApi.writer.setStyle('margin-bottom', '6pt', viewElement);\n          conversionApi.writer.setStyle('padding-top', '0', viewElement);\n          conversionApi.writer.setStyle('padding-bottom', '0', viewElement);\n          conversionApi.writer.setStyle('line-height', '1.15', viewElement);\n        }\n      };\n    };\n\n    // Áp dụng margin-bottom cho tất cả block elements\n    conversion.for('downcast').add(dispatcher => {\n      // Paragraph\n      dispatcher.on('insert:paragraph', makeHandler('paragraph'), { priority: 'low' });\n\n      // Heading (h1-h6)\n      ['heading1', 'heading2', 'heading3', 'heading4', 'heading5', 'heading6'].forEach(heading => {\n        dispatcher.on(`insert:${heading}`, makeHandler(heading), { priority: 'low' });\n      });\n\n      // Table\n      dispatcher.on('insert:table', makeHandler('table'), { priority: 'low' });\n\n      // PageBreak - add page-break-before style\n      dispatcher.on(\n        'insert:pageBreak',\n        (evt: any, data: any, conversionApi: any) => {\n          const viewElement = conversionApi.mapper.toViewElement(data.item);\n          if (viewElement) {\n            conversionApi.writer.setStyle('page-break-before', 'always', viewElement);\n          }\n        },\n        { priority: 'low' }\n      );\n    });\n  }\n}\n","import { Plugin, ContextualBalloon, ButtonView, ModelRange, View } from 'ckeditor5';\nimport { DocumentBuilderI18n } from '../../document-builder.model';\nimport { CkComment, CkCommentConfig, CkCommentColors, CkCommentSelection } from './ck-comment.plugin.model';\n\nexport class CkCommentPlugin extends Plugin {\n  static get pluginName() {\n    return 'CkComment';\n  }\n\n  static get requires() {\n    return [ContextualBalloon];\n  }\n\n  #comments = new Map<string | number, CkComment>();\n  // i18n đọc từ editor.config — plugin không có DI nên dùng pattern này; fallback giữ VI để consumer chưa setup vẫn chạy\n  #getI18n(): DocumentBuilderI18n | undefined {\n    return (this.editor.config as { get(key: string): unknown }).get('_i18n') as DocumentBuilderI18n | undefined;\n  }\n  #selectedId: string | number | null = null;\n  #pendingId: string | null = null; // ID cho pending highlight\n  #isCreatingPending = false; // Flag để prevent clearing pending khi đang tạo\n  #isProcessingClick = false; // Flag để prevent duplicate click events\n  #balloon!: ContextualBalloon;\n  #config: CkCommentConfig = {};\n\n  // Hằng số ID cho pending marker\n  static readonly PENDING_MARKER_ID = '__pending_comment__';\n\n  // Số node tìm kiếm mặc định khi path không chính xác\n  static readonly DEFAULT_SEARCH_RANGE = 5;\n\n  // Độ dài text tối đa để tạo marker\n  static readonly DEFAULT_MAX_TEXT_LENGTH = 1000;\n\n  // Màu sắc mặc định cho markers\n  static readonly DEFAULT_COLORS: CkCommentColors = {\n    marker: 'rgba(59, 130, 246, 0.2)',\n    markerSelected: 'rgba(59, 130, 246, 0.5)',\n    markerPending: 'rgba(245, 158, 11, 0.4)',\n    markerModified: 'rgba(255, 193, 7, 0.4)',\n  };\n\n  /**\n   * Debug log - chỉ log khi debug config là true\n   */\n  #log(...args: any[]): void {\n    if (this.#config.debug) {\n      console.log('[CkCommentPlugin]', ...args);\n    }\n  }\n\n  /**\n   * Debug warn - chỉ warn khi debug config là true\n   */\n  #warn(...args: any[]): void {\n    if (this.#config.debug) {\n      console.warn('[CkCommentPlugin]', ...args);\n    }\n  }\n\n  /**\n   * Lấy màu sắc đã merge với default\n   */\n  #getColors(): CkCommentColors {\n    return { ...CkCommentPlugin.DEFAULT_COLORS, ...this.#config.colors };\n  }\n\n  init() {\n    const editor = this.editor;\n    this.#balloon = editor.plugins.get(ContextualBalloon);\n\n    this.#log('init() called');\n\n    // Thiết lập marker to highlight conversion\n    this.#setupMarkerConversion();\n\n    // Thiết lập click handler cho markers\n    this.#setupMarkerClickHandler();\n\n    // Thiết lập toolbar button\n    this.#setupToolbarButton();\n\n    // Thiết lập ContextualBalloon cho text selection (tùy chọn)\n    this.#setupContextualBalloon();\n\n    // Theo dõi thay đổi nội dung để cập nhật trạng thái comment\n    this.#setupChangeTracking();\n  }\n\n  // ========================================================================\n  // TOOLBAR BUTTON\n  // ========================================================================\n\n  #setupToolbarButton() {\n    const editor = this.editor;\n\n    editor.ui.componentFactory.add('ckCommentBtn', locale => {\n      const view = new ButtonView(locale);\n\n      const i18n = this.#getI18n();\n      view.set({\n        label: i18n?.t('core.component.document-builder.ck-comment.label') ?? '',\n        icon: '<svg width=\"16px\" height=\"16px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 13v6l-4-4H4a2 2 0 01-2-2V4a2 2 0 012-2h14a2 2 0 012 2v9zM5 7h10v2H5V7zm0 4h10v2H5v-2z\"/></svg>',\n        tooltip: true,\n        isEnabled: false,\n      });\n\n      // Enable khi có selection, không phải chỉ khoảng trắng, và allowCreating = true\n      const selection = editor.model.document.selection;\n      this.listenTo(selection, 'change', () => {\n        // Disabled ngay khi allowCreating = false\n        if (!(this.#config.allowCreating ?? true)) {\n          view.isEnabled = false;\n          return;\n        }\n\n        const isCollapsed = selection.isCollapsed;\n        const range = selection.getFirstRange();\n\n        // Kiểm tra xem selection có content không phải khoảng trắng không\n        let hasValidContent = false;\n        if (range && !isCollapsed) {\n          const text = this.#getTextFromRange(range);\n          const trimmedText = text.trim();\n          const maxTextLength = this.#config.maxTextLength ?? CkCommentPlugin.DEFAULT_MAX_TEXT_LENGTH;\n          // Kiểm tra: có content, không phải chỉ khoảng trắng, và không vượt quá max length\n          hasValidContent = trimmedText.length > 0 && trimmedText.length <= maxTextLength;\n\n          if (trimmedText.length > maxTextLength) {\n            // @i18n-ignore — dev-only debug log, không hiển thị cho người dùng\n            this.#log(`Độ dài text vượt quá giới hạn: ${trimmedText.length} > ${maxTextLength}`);\n          }\n        }\n\n        view.isEnabled = hasValidContent;\n      });\n\n      // Xử lý khi click button\n      this.listenTo(view, 'execute', () => {\n        this.#log('Toolbar button clicked');\n        const selectionData = this.#getSelectionData();\n        if (selectionData) {\n          // Set flag để prevent clearing pending khi selection change\n          this.#isCreatingPending = true;\n\n          this.#log('Calling onPendingComment callback');\n          this.#config.onPendingComment?.({\n            id: '',\n            startPath: selectionData.startPath,\n            endPath: selectionData.endPath,\n            originalText: selectionData.text,\n            currentText: selectionData.text,\n            status: 'normal',\n          });\n\n          // Reset flag sau một khoảng ngắn để cho phép clear nếu selection thực sự thay đổi\n          setTimeout(() => {\n            this.#isCreatingPending = false;\n          }, 100);\n        }\n      });\n\n      return view;\n    });\n  }\n\n  // ========================================================================\n  // MARKER CONVERSION\n  // ========================================================================\n\n  #setupMarkerConversion() {\n    const self = this;\n\n    this.editor.conversion.for('editingDowncast').markerToHighlight({\n      model: 'comment',\n      view: (data: { markerRange: ModelRange; markerName: string }) => {\n        const markerName = data.markerName;\n        const commentId = markerName.replace('comment:', '');\n        const classes = ['ck-comment-marker'];\n        const colors = self.#getColors();\n\n        // Kiểm tra xem có phải pending marker không\n        if (commentId === CkCommentPlugin.PENDING_MARKER_ID) {\n          classes.push('ck-comment-pending');\n          return {\n            classes: classes,\n            attributes: {\n              'data-comment-id': commentId,\n              style: `--comment-pending-bg: ${colors.markerPending}`,\n            },\n          };\n        }\n\n        const comment = self.#comments.get(commentId);\n\n        // Build CSS variables based on status - ALWAYS set the correct variable for the status\n        let cssVars: string[] = [];\n\n        if (comment) {\n          // Add status class\n          classes.push(`ck-comment-${comment.status}`);\n\n          // Set CSS variable based on status\n          if (comment.status === 'modified') {\n            cssVars = [`--comment-modified-bg: ${colors.markerModified}`];\n          } else if (comment.status === 'broken') {\n            cssVars = [`--comment-broken-bg: ${colors.markerBroken}`];\n          } else {\n            // normal status\n            cssVars = [`--comment-bg: ${colors.marker}`];\n          }\n\n          // Add selected state if needed\n          if (commentId === self.#selectedId) {\n            classes.push('ck-comment-selected');\n            cssVars.push(`--comment-selected-bg: ${colors.markerSelected}`);\n          }\n        } else {\n          // No comment found - use default\n          cssVars = [`--comment-bg: ${colors.marker}`];\n        }\n\n        return {\n          classes: classes,\n          attributes: {\n            'data-comment-id': commentId,\n            style: cssVars.join('; '),\n          },\n        };\n      },\n    });\n  }\n\n  // ========================================================================\n  // CLICK HANDLER\n  // ========================================================================\n\n  #setupMarkerClickHandler() {\n    const viewDocument = this.editor.editing.view.document;\n\n    // Lắng nghe cả click và mousedown trên CKEditor view\n    viewDocument.on('mousedown', (evt: any, data: any) => {\n      this.#log('Mousedown event triggered, data:', data);\n      this.#handleMarkerClick(evt, data);\n    });\n\n    viewDocument.on('click', (evt: any, data: any) => {\n      this.#log('Click event triggered, data:', data);\n      this.#handleMarkerClick(evt, data);\n    });\n\n    // Thêm DOM event listener như fallback để đảm bảo bắt được click\n    // Sử dụng editor's editable DOM element\n    const editableElement = this.editor.ui.getEditableElement();\n    if (editableElement) {\n      editableElement.addEventListener('click', (domEvent: Event) => {\n        this.#log('DOM click event triggered');\n        this.#handleDomMarkerClick(domEvent as MouseEvent, editableElement);\n      });\n    }\n  }\n\n  /**\n   * Handle DOM click event (fallback)\n   */\n  #handleDomMarkerClick(domEvent: MouseEvent, rootElement: Element) {\n    // Prevent duplicate if already processing\n    if (this.#isProcessingClick) {\n      this.#log('DOM click skipped - already processing');\n      return;\n    }\n\n    let targetElement: Element | null = domEvent.target as Element;\n\n    // Traverse up to find marker element\n    while (targetElement && targetElement !== rootElement) {\n      if (targetElement.classList?.contains('ck-comment-marker')) {\n        const commentId = targetElement.getAttribute('data-comment-id');\n        this.#log('DOM click found marker with commentId:', commentId);\n        if (commentId) {\n          this.#isProcessingClick = true;\n          this.selectComment(commentId, false);\n          domEvent.stopPropagation();\n          domEvent.preventDefault();\n\n          // Reset flag after a short delay\n          setTimeout(() => {\n            this.#isProcessingClick = false;\n          }, 50);\n        }\n        return;\n      }\n      targetElement = targetElement.parentElement;\n    }\n\n    // Click outside markers - clear selection\n    if (this.#selectedId) {\n      this.#log('DOM click outside markers, clearing selection');\n      this.#selectedId = null;\n      this.#refreshView();\n    }\n  }\n\n  #handleMarkerClick(evt: any, data: any) {\n    // Prevent duplicate if already processing\n    if (this.#isProcessingClick) {\n      this.#log('View click skipped - already processing');\n      return;\n    }\n\n    const viewElement = data.target;\n    let element: any = viewElement;\n\n    this.#log('Target element:', element, 'hasClass:', typeof element?.hasClass);\n\n    // Duyệt lên cây để tìm comment marker\n    while (element) {\n      const hasMarkerClass = element.hasClass?.('ck-comment-marker');\n      this.#log('Checking element, hasMarkerClass:', hasMarkerClass);\n\n      if (hasMarkerClass) {\n        const commentId = element.getAttribute('data-comment-id');\n        this.#log('Found marker with commentId:', commentId);\n        this.#isProcessingClick = true;\n        this.selectComment(commentId, false);\n        evt.stop();\n\n        // Reset flag after a short delay\n        setTimeout(() => {\n          this.#isProcessingClick = false;\n        }, 50);\n        return;\n      }\n      element = element.parent;\n    }\n\n    // Click ngoài markers - xóa selection\n    if (this.#selectedId) {\n      this.#log('Click outside markers, clearing selection');\n      this.#selectedId = null;\n      this.#refreshView();\n    }\n  }\n\n  // ========================================================================\n  // CONTEXTUAL BALLOON\n  // ========================================================================\n\n  #setupContextualBalloon() {\n    const editor = this.editor;\n    const selection = editor.model.document.selection;\n\n    this.#log('#setupContextualBalloon initialized');\n\n    // Lắng nghe selection changes\n    this.listenTo(selection, 'change:range', () => {\n      this.#log('Selection change:range, isCollapsed:', selection.isCollapsed);\n\n      // Xóa pending nếu selection thay đổi sang text khác\n      // NHƯNG không xóa nếu đang trong quá trình tạo pending\n      if (this.#pendingId && !this.#isCreatingPending) {\n        this.#log('Selection changed, clearing pending');\n        this.clearPendingSelection();\n      } else if (this.#isCreatingPending) {\n        this.#log('Skipping clear pending - isCreatingPending flag is set');\n      }\n\n      if (!selection.isCollapsed) {\n        // Chỉ hiện balloon khi allowCreating = true (mặc định)\n        if (!(this.#config.allowCreating ?? true)) {\n          this.#hideBalloon();\n          return;\n        }\n\n        const range = selection.getFirstRange();\n        if (range) {\n          // Chỉ hiện balloon khi selection có content không phải khoảng trắng và không vượt quá max length\n          const text = this.#getTextFromRange(range);\n          const trimmedText = text.trim();\n          const maxTextLength = this.#config.maxTextLength ?? CkCommentPlugin.DEFAULT_MAX_TEXT_LENGTH;\n          if (trimmedText.length > 0 && trimmedText.length <= maxTextLength) {\n            this.#showBalloon(range);\n          } else {\n            this.#hideBalloon();\n          }\n        }\n      } else {\n        this.#hideBalloon();\n      }\n    });\n\n    // Ẩn balloon khi focus thay đổi\n    this.listenTo(editor.ui, 'update', () => {\n      if (selection.isCollapsed) {\n        this.#hideBalloon();\n      }\n    });\n  }\n\n  #showBalloon(range: ModelRange) {\n    this.#log('#showBalloon called, range:', range);\n    const editor = this.editor;\n\n    // Ẩn balloon hiện tại trước\n    this.#hideBalloon();\n\n    // Tạo balloon button\n    const buttonView = new ButtonView(editor.locale);\n    const balloonI18n = this.#getI18n();\n    buttonView.set({\n      label: balloonI18n?.t('core.component.document-builder.ck-comment.label') ?? '',\n      icon: '<svg width=\"16px\" height=\"16px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 13v6l-4-4H4a2 2 0 01-2-2V4a2 2 0 012-2h14a2 2 0 012 2v9zM5 7h10v2H5V7zm0 4h10v2H5v-2z\"/></svg>',\n      tooltip: true,\n      withText: true,\n    });\n\n    // Xử lý khi click button\n    this.listenTo(buttonView, 'execute', () => {\n      this.#log('Balloon button clicked');\n      const selection = this.#getSelectionData();\n      this.#log('Selection data:', selection);\n      if (selection) {\n        // Set flag để prevent clearing pending khi selection change\n        this.#isCreatingPending = true;\n\n        this.#log('Calling onPendingComment callback');\n        this.#config.onPendingComment?.({\n          id: '',\n          startPath: selection.startPath,\n          endPath: selection.endPath,\n          originalText: selection.text,\n          currentText: selection.text,\n          status: 'normal',\n        });\n\n        // Reset flag sau một khoảng ngắn\n        setTimeout(() => {\n          this.#isCreatingPending = false;\n        }, 100);\n      }\n      this.#hideBalloon();\n    });\n\n    // Thêm vào balloon\n    try {\n      this.#balloon.add({\n        view: buttonView,\n        position: {\n          target: () => {\n            const viewRange = editor.editing.mapper.toViewRange(range);\n            return editor.editing.view.domConverter.viewRangeToDom(viewRange);\n          },\n        },\n      });\n      this.#balloonView = buttonView;\n      this.#log('Balloon added successfully');\n    } catch (e) {\n      this.#warn('Error adding balloon:', e);\n    }\n  }\n\n  #balloonView: View<HTMLElement> | null = null;\n\n  #hideBalloon() {\n    if (this.#balloonView) {\n      this.#balloon.remove(this.#balloonView);\n      this.#balloonView = null;\n    }\n  }\n\n  // ========================================================================\n  // CHANGE TRACKING\n  // ========================================================================\n\n  #setupChangeTracking() {\n    const editor = this.editor;\n\n    // Lắng nghe thay đổi dữ liệu\n    editor.model.document.on('change:data', () => {\n      this.#updateCommentStatuses();\n    });\n\n    // Lắng nghe thay đổi marker\n    editor.model.document.on('change:markers', () => {\n      this.#updateCommentStatuses();\n    });\n  }\n\n  #updateCommentStatuses() {\n    let hasChanges = false;\n\n    this.#comments.forEach((comment, id) => {\n      const marker = this.editor.model.markers.get(`comment:${id}`);\n\n      if (marker) {\n        const range = marker.getRange();\n        const currentText = this.#getTextFromRange(range);\n\n        // Tự động cập nhật paths (CKEditor duy trì chúng)\n        const newStartPath = Array.from(range.start.path);\n        const newEndPath = Array.from(range.end.path);\n\n        const pathChanged =\n          JSON.stringify(comment.startPath) !== JSON.stringify(newStartPath) ||\n          JSON.stringify(comment.endPath) !== JSON.stringify(newEndPath);\n\n        const textChanged = currentText !== comment.currentText;\n\n        if (pathChanged || textChanged) {\n          const oldStatus = comment.status;\n          hasChanges = true;\n          comment.startPath = newStartPath;\n          comment.endPath = newEndPath;\n          comment.currentText = currentText;\n\n          // Cập nhật trạng thái\n          if (currentText === comment.originalText) {\n            comment.status = 'normal';\n          } else if (currentText.length === 0) {\n            comment.status = 'broken';\n          } else {\n            comment.status = 'modified';\n          }\n\n          this.#log(\n            `Comment ${id} status changed: ${oldStatus} -> ${comment.status}`,\n            `\\n  originalText: \"${comment.originalText}\"`,\n            `\\n  currentText: \"${currentText}\"`,\n            `\\n  textChanged: ${textChanged}`\n          );\n        }\n      } else {\n        // Không tìm thấy marker - bị hỏng\n        if (comment.status !== 'broken') {\n          const oldStatus = comment.status;\n          hasChanges = true;\n          comment.status = 'broken';\n          this.#log(`Comment ${id} marker not found, status changed: ${oldStatus} -> broken`);\n        }\n      }\n    });\n\n    if (hasChanges) {\n      this.#refreshView();\n      this.#fireOnChange();\n    }\n  }\n\n  // ========================================================================\n  // PUBLIC API\n  // ========================================================================\n\n  /**\n   * Thiết lập config với callbacks\n   */\n  setConfig(config: CkCommentConfig) {\n    this.#config = config;\n  }\n\n  /**\n   * Thêm comment và tạo marker\n   */\n  addComment(comment: CkComment): boolean {\n    if (this.#comments.has(comment.id)) {\n      this.#warn(`Comment with id ${comment.id} already exists`);\n      return false;\n    }\n\n    // Tạo marker\n    const success = this.#createMarker(comment);\n\n    // Lưu comment (với trạng thái broken nếu marker thất bại)\n    const storedComment = success ? { ...comment } : { ...comment, status: 'broken' as const };\n    this.#comments.set(comment.id, storedComment);\n\n    this.#refreshView();\n    this.#fireOnChange();\n\n    // Chỉ fire onAddComment callback KHI thêm thành công (không phải broken)\n    if (success) {\n      this.#config.onAddComment?.(storedComment);\n    }\n\n    return true;\n  }\n\n  /**\n   * Xóa comment theo id\n   */\n  removeComment(id: string | number): boolean {\n    const comment = this.#comments.get(id);\n    if (!comment) {\n      return false;\n    }\n\n    // Xóa marker\n    this.editor.model.change(writer => {\n      writer.removeMarker(`comment:${id}`);\n    });\n\n    // Xóa khỏi map\n    this.#comments.delete(id);\n\n    // Xóa selection nếu bị xóa\n    if (this.#selectedId === id) {\n      this.#selectedId = null;\n    }\n\n    this.#refreshView();\n    this.#fireOnChange();\n\n    return true;\n  }\n\n  /**\n   * Chọn comment theo id - chỉ thêm class highlight, không bôi đen text\n   */\n  selectComment(id: string | number, scrollIntoView = true): void {\n    this.#log('selectComment called with id:', id, 'hasComment:', this.#comments.has(id));\n\n    if (!this.#comments.has(id)) {\n      this.#warn('Comment not found:', id);\n      return;\n    }\n\n    this.#selectedId = id;\n    this.#refreshView();\n    if (scrollIntoView) {\n      this.#scrollToComment(id);\n    }\n\n    this.#log('Firing onSelectComment callback for id:', id);\n    this.#config.onSelectComment?.(id);\n  }\n\n  /**\n   * Thiết lập tất cả comments (khôi phục từ dữ liệu)\n   */\n  setComments(comments: CkComment[]): void {\n    this.#log('setComments called with', comments.length, 'comments');\n\n    // Xóa comments hiện tại\n    this.#log('Clearing existing comments, count:', this.#comments.size);\n    this.#comments.forEach((_, id) => {\n      const markerName = `comment:${id}`;\n      if (this.editor.model.markers.has(markerName)) {\n        this.#log('Removing marker:', markerName);\n        this.editor.model.change(writer => {\n          writer.removeMarker(markerName);\n        });\n      } else {\n        this.#warn('Marker not found, skipping:', markerName);\n      }\n    });\n    this.#comments.clear();\n    this.#selectedId = null;\n\n    // Thêm comments mới - status sẽ được tính toán động từ editor\n    comments.forEach(comment => {\n      const success = this.#createMarker(comment);\n      // Lưu comment với status mặc định, sẽ được cập nhật bởi #updateCommentStatuses\n      const storedComment = {\n        ...comment,\n        status: success ? ('normal' as const) : ('broken' as const),\n        currentText: success ? comment.originalText : '',\n      };\n      this.#comments.set(comment.id, storedComment);\n    });\n\n    this.#refreshView();\n    this.#fireOnChange();\n  }\n\n  /**\n   * Lấy tất cả comments\n   */\n  get comments(): CkComment[] {\n    return Array.from(this.#comments.values());\n  }\n\n  /**\n   * Thiết lập pending highlight cho selection (khi user đang nhập nội dung comment)\n   */\n  setPendingSelection(startPath: number[], endPath: number[]): boolean {\n    // Xóa pending marker hiện tại MÀ KHÔNG fire callback\n    this.#clearPendingMarker();\n\n    const model = this.editor.model;\n\n    try {\n      model.change(writer => {\n        const root = model.document.getRoot();\n        if (!root) {\n          throw new Error('Document root not found');\n        }\n        const startPos = writer.createPositionFromPath(root, startPath);\n        const endPos = writer.createPositionFromPath(root, endPath);\n        const range = writer.createRange(startPos, endPos);\n\n        writer.addMarker(`comment:${CkCommentPlugin.PENDING_MARKER_ID}`, {\n          range,\n          usingOperation: false,\n          affectsData: false,\n        });\n      });\n\n      this.#pendingId = CkCommentPlugin.PENDING_MARKER_ID;\n      this.#refreshView();\n      return true;\n    } catch (e) {\n      this.#warn('Failed to set pending selection:', e);\n      return false;\n    }\n  }\n\n  /**\n   * Xóa pending marker mà không fire callback (dùng nội bộ)\n   */\n  #clearPendingMarker(): void {\n    if (!this.#pendingId) return;\n\n    this.editor.model.change(writer => {\n      writer.removeMarker(`comment:${CkCommentPlugin.PENDING_MARKER_ID}`);\n    });\n\n    this.#pendingId = null;\n    this.#refreshView();\n  }\n\n  /**\n   * Xóa pending highlight và fire onCancelPending callback\n   */\n  clearPendingSelection(): void {\n    if (!this.#pendingId) return;\n\n    this.#clearPendingMarker();\n\n    // Fire callback để thông báo UI\n    this.#config.onCancelPending?.();\n  }\n\n  /**\n   * Lấy dữ liệu selection hiện tại để tạo comment\n   * Trim khoảng trắng để tránh sai vị trí khi lưu\n   */\n  #getSelectionData(): CkCommentSelection | null {\n    const selection = this.editor.model.document.selection;\n    const range = selection.getFirstRange();\n\n    if (!range || range.isCollapsed) {\n      return null;\n    }\n\n    // Validate: start/end không được nằm bên trong isObject element (path.length > 2)\n    // Trường hợp xảy ra khi user drag-select qua bound variable widget\n    if (range.start.path.length > 2 || range.end.path.length > 2) {\n      this.#warn('Selection contains invalid path (inside isObject element) - aborting comment creation', {\n        startPath: Array.from(range.start.path),\n        endPath: Array.from(range.end.path),\n      });\n      return null;\n    }\n\n    const text = this.#getTextFromRange(range);\n    const trimmedText = text.trim();\n\n    if (!trimmedText) {\n      return null;\n    }\n\n    // Kiểm tra độ dài text tối đa\n    const maxTextLength = this.#config.maxTextLength ?? CkCommentPlugin.DEFAULT_MAX_TEXT_LENGTH;\n    if (trimmedText.length > maxTextLength) {\n      this.#warn(`Text too long: ${trimmedText.length} > ${maxTextLength}`);\n      // Fire error callback\n      const errorI18n = this.#getI18n();\n      this.#config.onError?.({\n        code: 'TEXT_TOO_LONG',\n        message:\n          errorI18n?.t('core.component.document-builder.ck-comment.text-too-long', { length: trimmedText.length, max: maxTextLength }) ??\n          '',\n        data: { textLength: trimmedText.length, maxLength: maxTextLength },\n      });\n      return null;\n    }\n\n    // Tính toán số ký tự cần trim ở đầu và cuối\n    const leadingWhitespace = text.length - text.trimStart().length;\n    const trailingWhitespace = text.length - text.trimEnd().length;\n\n    // Điều chỉnh range để loại bỏ khoảng trắng\n    let adjustedRange = range;\n    if (leadingWhitespace > 0 || trailingWhitespace > 0) {\n      adjustedRange = this.#adjustRangeForTrim(range, leadingWhitespace, trailingWhitespace);\n    }\n\n    // Validate lại sau khi trim\n    if (adjustedRange.start.path.length > 2 || adjustedRange.end.path.length > 2) {\n      this.#warn('Adjusted range has invalid path depth - aborting');\n      return null;\n    }\n\n    return {\n      range: adjustedRange,\n      startPath: Array.from(adjustedRange.start.path),\n      endPath: Array.from(adjustedRange.end.path),\n      text: trimmedText,\n    };\n  }\n\n  /**\n   * Điều chỉnh range để loại bỏ khoảng trắng đầu/cuối.\n   * Đảm bảo các vị trí sau khi dịch chuyển không rơi vào bên trong isObject element\n   * (ví dụ: variable widget đã bound) để tránh lỗi document-selection-wrong-position.\n   */\n  #adjustRangeForTrim(range: ModelRange, leadingTrim: number, trailingTrim: number): ModelRange {\n    const model = this.editor.model;\n\n    /** Kiểm tra pos có hợp lệ (không nằm bên trong isObject element) */\n    const isValidPosition = (pos: any): boolean => {\n      try {\n        // path.length > 2 nghĩa là position nằm sâu hơn paragraph → bên trong element\n        if (pos.path && pos.path.length > 2) return false;\n        // Kiểm tra node tại vị trí đó\n        const nodeAfter = pos.nodeAfter;\n        const nodeBefore = pos.nodeBefore;\n        // Không cho phép position bắt đầu/kết thúc bên trong isObject\n        if (nodeAfter && model.schema.isObject(nodeAfter)) return true; // trước object = ok\n        if (nodeBefore && model.schema.isObject(nodeBefore)) return true; // sau object = ok\n        return model.schema.checkChild(pos, '$text') || true;\n      } catch {\n        return false;\n      }\n    };\n\n    return model.change(writer => {\n      let startPos = range.start;\n      let endPos = range.end;\n\n      // Dịch start position forward để bỏ khoảng trắng đầu\n      if (leadingTrim > 0) {\n        for (let i = 0; i < leadingTrim && startPos; i++) {\n          const nextPos = startPos.getShiftedBy(1);\n          if (nextPos && isValidPosition(nextPos)) {\n            startPos = nextPos;\n          } else {\n            break;\n          }\n        }\n      }\n\n      // Dịch end position backward để bỏ khoảng trắng cuối\n      if (trailingTrim > 0) {\n        for (let i = 0; i < trailingTrim && endPos; i++) {\n          const prevPos = endPos.getShiftedBy(-1);\n          if (prevPos && prevPos.isAfter(startPos) && isValidPosition(prevPos)) {\n            endPos = prevPos;\n          } else {\n            break;\n          }\n        }\n      }\n\n      return writer.createRange(startPos, endPos);\n    });\n  }\n\n  // ========================================================================\n  // INTERNAL HELPERS\n  // ========================================================================\n\n  #createMarker(comment: CkComment): boolean {\n    const model = this.editor.model;\n\n    try {\n      model.change(writer => {\n        const root = model.document.getRoot();\n        if (!root) {\n          throw new Error('Document root not found');\n        }\n        const startPos = writer.createPositionFromPath(root, comment.startPath);\n        const endPos = writer.createPositionFromPath(root, comment.endPath);\n        const range = writer.createRange(startPos, endPos);\n\n        // Validate: kiểm tra text tại range có khớp với originalText không\n        const rangeText = this.#getTextFromRange(range);\n        this.#log('Range text:', rangeText, 'range:', range);\n\n        if (rangeText !== comment.originalText) {\n          this.#warn(\n            `Marker text mismatch for comment ${comment.id}:`,\n            `\\n  Expected: \"${comment.originalText}\"`,\n            `\\n  Got: \"${rangeText}\"`,\n            `\\n  Trying to find text near original path...`\n          );\n\n          // Thử tìm text gần path gốc\n          const searchRange = this.#config.searchRange ?? CkCommentPlugin.DEFAULT_SEARCH_RANGE;\n          const foundRange = this.#findTextNearPath(comment.originalText, comment.startPath, comment.endPath, searchRange);\n\n          if (foundRange) {\n            this.#log('Found text at new position, updating paths');\n            // Cập nhật paths cho comment\n            comment.startPath = Array.from(foundRange.start.path);\n            comment.endPath = Array.from(foundRange.end.path);\n\n            writer.addMarker(`comment:${comment.id}`, {\n              range: foundRange,\n              usingOperation: true,\n              affectsData: false,\n            });\n            return;\n          }\n\n          throw new Error(`Failed to find text \"${comment.originalText}\" near original path`);\n        }\n\n        writer.addMarker(`comment:${comment.id}`, {\n          range,\n          usingOperation: true, // CKEditor tự động cập nhật vị trí\n          affectsData: false,\n        });\n      });\n\n      return true;\n    } catch (e) {\n      this.#warn(`Failed to create marker for comment ${comment.id}:`, e);\n      return false;\n    }\n  }\n\n  /**\n   * Tìm text trong document trong phạm vi ±searchRange nodes từ path gốc\n   */\n  #findTextNearPath(searchText: string, startPath: number[], endPath: number[], searchRange: number): ModelRange | null {\n    if (!searchText) return null;\n\n    const model = this.editor.model;\n    const root = model.document.getRoot();\n    if (!root) return null;\n\n    // TODO: Implement text search logic here\n    // 1. Lấy vị trí start và end từ các path gốc\n    // 2. Tìm kiếm trong phạm vi ±searchRange nodes từ các vị trí đó\n    // 3. Trả về range nếu tìm thấy text, null nếu không tìm thấy\n\n    return null;\n  }\n\n  #getTextFromRange(range: ModelRange): string {\n    let text = '';\n    for (const item of range.getItems()) {\n      if (item.is('$textProxy') || item.is('$text')) {\n        text += (item as any).data;\n      }\n    }\n    return text;\n  }\n\n  #scrollToComment(id: string | number): void {\n    const marker = this.editor.model.markers.get(`comment:${id}`);\n    if (!marker) {\n      this.#warn('Marker not found for scroll:', id);\n      return;\n    }\n\n    const editor = this.editor;\n    const STICKY_OFFSET = 100; // Offset cho sticky toolbar\n\n    try {\n      // Get the model range from marker\n      const modelRange = marker.getRange();\n\n      // Convert model range to view range\n      const viewRange = editor.editing.mapper.toViewRange(modelRange);\n\n      // Convert view range to DOM range\n      const domRange = editor.editing.view.domConverter.viewRangeToDom(viewRange);\n\n      this.#log('DOM range start:', domRange.startContainer, domRange.startOffset);\n\n      // Get the start position of the range\n      let targetElement: Element | Node = domRange.startContainer;\n\n      // If it's a text node, get its parent\n      if (targetElement.nodeType === Node.TEXT_NODE) {\n        targetElement = targetElement.parentElement!;\n      }\n\n      this.#log('Target element:', targetElement);\n\n      // Find .builder-container\n      let scrollContainer: Element | null = targetElement as Element;\n      while (scrollContainer && !scrollContainer.classList?.contains('builder-container')) {\n        scrollContainer = scrollContainer.parentElement;\n      }\n\n      this.#log('Found scroll container:', scrollContainer);\n\n      if (!scrollContainer) {\n        this.#warn('No builder-container found');\n        return;\n      }\n\n      // Get the target element's position relative to the container\n      const containerRect = scrollContainer.getBoundingClientRect();\n      const targetRect = (targetElement as Element).getBoundingClientRect();\n      const relativeTop = targetRect.top - containerRect.top + scrollContainer.scrollTop - STICKY_OFFSET;\n\n      this.#log('Container top:', containerRect.top);\n      this.#log('Target top:', targetRect.top);\n      this.#log('Current scroll:', scrollContainer.scrollTop);\n      this.#log('Relative top to scroll:', relativeTop);\n\n      scrollContainer.scrollTo({ top: relativeTop, behavior: 'smooth' });\n    } catch (e) {\n      this.#warn('Error scrolling to comment:', e);\n    }\n  }\n\n  #refreshView(): void {\n    // Force view refresh để cập nhật marker classes\n    // Reconvert tất cả comment markers để cập nhật classes của chúng\n    const markers = this.editor.model.markers;\n    for (const marker of markers) {\n      if (marker.name.startsWith('comment:')) {\n        this.editor.editing.reconvertMarker(marker.name);\n      }\n    }\n  }\n\n  #fireOnChange(): void {\n    this.#config.onChange?.(this.comments);\n  }\n}\n","/**\n * Document Builder Utilities\n * Các hàm tiện ích cho document builder\n */\n\nimport { ColorUtilities } from '@sdcorejs/utils/fns';\n\n/**\n * Chuẩn hóa nội dung bằng cách chuyển đổi tất cả màu HSL và RGB sang hex\n * @param content - Nội dung HTML cần chuẩn hóa\n * @returns Nội dung đã được chuẩn hóa với màu hex\n */\nexport function normalize(content: string): string {\n  let normalized = content;\n\n  // Chuyển đổi HSL sang hex\n  const hslRegex = /hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*\\)/gi;\n  normalized = normalized.replace(hslRegex, (match, h, s, l) => {\n    try {\n      const hue = parseInt(h, 10);\n      const saturation = parseInt(s, 10);\n      const lightness = parseInt(l, 10);\n\n      // Kiểm tra giá trị hợp lệ\n      if (hue >= 0 && hue <= 360 && saturation >= 0 && saturation <= 100 && lightness >= 0 && lightness <= 100) {\n        return ColorUtilities.hslToHex(hue, saturation, lightness);\n      }\n    } catch (error) {\n      console.warn('Failed to convert HSL to hex:', error, match);\n    }\n\n    return match; // Giữ nguyên nếu không thể chuyển đổi\n  });\n\n  // Chuyển đổi RGB sang hex\n  const rgbRegex = /rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/gi;\n  normalized = normalized.replace(rgbRegex, (match, r, g, b) => {\n    try {\n      const red = parseInt(r, 10);\n      const green = parseInt(g, 10);\n      const blue = parseInt(b, 10);\n\n      if (red >= 0 && red <= 255 && green >= 0 && green <= 255 && blue >= 0 && blue <= 255) {\n        return ColorUtilities.rgbToHex(red, green, blue);\n      }\n    } catch (error) {\n      console.warn('Failed to convert RGB to hex:', error, match);\n    }\n\n    return match;\n  });\n\n  return normalized;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, inject, OnInit, OnDestroy, input, output } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdCKEditorStyles } from '@sdcorejs/angular/components/ckeditor-styles';\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\nimport {\n  Alignment,\n  Bold,\n  ClassicEditor,\n  Essentials,\n  FontBackgroundColor,\n  FontColor,\n  FontFamily,\n  FontSize,\n  // GeneralHtmlSupport,\n  Heading,\n  Image,\n  ImageBlock,\n  ImageCaption,\n  ImageResize,\n  ImageStyle,\n  ImageToolbar,\n  ImageUpload,\n  Indent,\n  IndentBlock,\n  Italic,\n  List,\n  ModelElement,\n  ModelRange,\n  PageBreak,\n  Paragraph,\n  Subscript,\n  Superscript,\n  Table,\n  TableCellProperties,\n  TableColumnResize,\n  TableProperties,\n  TableToolbar,\n  Underline,\n  Undo,\n} from 'ckeditor5';\nimport { throttleTime, Subject, Subscription } from 'rxjs';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\nimport {\n  PageOrientation,\n  TableCustom,\n  VariablePlugin,\n  sanitizeVariableHtmlBoundSerializedHtml,\n  ImageUploadPlugin,\n  HeadingPlugin,\n  ImageCustomPlugin,\n  PasteHandler,\n  HighlightRangePlugin,\n  BlockSpace,\n  CkCommentPlugin,\n} from './plugins';\nimport { getPresetColors, getColorPickerConfig, getFontSizeOptions, getHeadingOptions } from './document-builder.config';\nimport { DocumentBuilderI18n, DocumentBuilderOption, SdDocumentBuilderHeading, SdDocumentBuilderOption } from './document-builder.model';\nimport { normalize } from './document-builder.utils';\n\n@Component({\n  selector: 'sd-document-builder',\n  standalone: true,\n  imports: [CommonModule, CKEditorModule, SdCKEditorStyles],\n  templateUrl: './document-builder.component.html',\n  styleUrls: [\n    './document-builder.component.scss',\n    './plugins/heading/heading.plugin.scss',\n    './plugins/variable/variable.plugin.scss',\n    './plugins/highlight-range/highlight-range.plugin.scss',\n    './plugins/ck-comment/ck-comment.plugin.scss',\n  ],\n})\nexport class SdDocumentBuilder implements OnInit, OnDestroy {\n  readonly #i18n = inject(I18nService);\n\n  readonly option = input.required<SdDocumentBuilderOption>();\n\n  disabled = false;\n  @Input('disabled') set _disabled(val: boolean | '' | undefined | null) {\n    this.disabled = val === '' || !!val;\n    this.#updateState();\n  }\n\n  readonly contentChange = output<string>(); // Emit HTML content\n\n  Editor = ClassicEditor;\n  #editor!: ClassicEditor;\n\n  #id = '55b0afb0-288d-423c-98b3-5f9db286e16d';\n  #subscription = new Subscription();\n  #sharedColors = getPresetColors();\n  #headingOptions = getHeadingOptions();\n  #fontSizeOptions = getFontSizeOptions();\n  #colorPickerConfig = getColorPickerConfig();\n  #contentChangeSubject = new Subject<string>();\n  #idTimeOutScrollHeading: ReturnType<typeof setTimeout> | null = null;\n  #headingElementsMap = new Map<string, ModelElement>(); // Hash lưu trữ các heading\n\n  // Wrapper giữ `this` của I18nService — CKEditor config không truyền được class instance có private fields.\n  readonly #editorI18n: DocumentBuilderI18n = {\n    t: (key, params) => this.#i18n.t(key, params),\n  };\n\n  // Config\n  config: DocumentBuilderOption = {\n    getOption: () => this.option(),\n    _i18n: this.#editorI18n,\n    licenseKey: 'GPL', // Hoặc key thương mại nếu có\n    plugins: [\n      FontSize,\n      FontColor,\n      FontFamily,\n      FontBackgroundColor,\n      Bold,\n      Italic,\n      Underline,\n      Essentials,\n      Paragraph,\n      Heading,\n      List,\n      Table,\n      TableToolbar,\n      TableProperties,\n      TableCellProperties,\n      TableColumnResize,\n      PageBreak,\n      Undo,\n      Alignment, // Canh lề\n      Subscript, // Mũ dưới (H₂O)\n      Superscript, // Mũ trên (x²)\n      // Image\n      Image,\n      ImageUpload,\n      ImageToolbar,\n      ImageCaption,\n      ImageResize,\n      ImageStyle,\n      ImageBlock,\n      // Indent\n      Indent,\n      IndentBlock,\n      // Custom Plugin\n      HeadingPlugin,\n      VariablePlugin,\n      TableCustom,\n      PageOrientation,\n      ImageUploadPlugin,\n      ImageCustomPlugin,\n      HighlightRangePlugin,\n      PasteHandler,\n      BlockSpace,\n      CkCommentPlugin,\n    ],\n    toolbar: {\n      items: [\n        'pageOrientation',\n        '|',\n        'heading',\n        'fontFamily',\n        '|',\n        'fontSize',\n        'fontColor',\n        'fontBackgroundColor',\n        '|',\n        'bold',\n        'italic',\n        'underline',\n        'subscript',\n        'superscript',\n        '|',\n        'alignment',\n        'bulletedList',\n        'numberedList',\n        '|',\n        'insertTable',\n        'imageUpload',\n        'pageBreak',\n        '|',\n        'undo',\n        'redo',\n      ],\n      shouldNotGroupWhenFull: true,\n    },\n\n    image: {\n      styles: {\n        options: ['inline', 'alignLeft', 'alignRight', 'alignCenter'],\n      },\n      toolbar: [\n        'imageStyle:inline',\n        'imageStyle:alignCenter',\n        {\n          name: 'imageStyle:alignDropdown',\n          items: ['imageStyle:alignLeft', 'imageStyle:alignRight'],\n          defaultItem: 'imageStyle:alignLeft',\n        },\n      ],\n    },\n\n    fontSize: {\n      options: this.#fontSizeOptions,\n      supportAllValues: true,\n    },\n\n    heading: {\n      options: this.#headingOptions,\n    },\n\n    // 4. Cấu hình bảng màu (Tùy chọn)\n    fontColor: {\n      // columns: 5,\n      documentColors: 10,\n      colorPicker: this.#colorPickerConfig,\n      colors: this.#sharedColors,\n    },\n\n    fontBackgroundColor: {\n      // columns: 5,\n      documentColors: 10,\n      colorPicker: this.#colorPickerConfig,\n      colors: this.#sharedColors,\n    },\n\n    table: {\n      contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells', '|', 'tableProperties', 'tableCellProperties'],\n      tableProperties: {\n        borderColors: this.#sharedColors,\n        backgroundColors: this.#sharedColors,\n        colorPicker: this.#colorPickerConfig,\n        defaultProperties: {\n          borderStyle: 'solid',\n          borderWidth: '1px',\n          borderColor: '#ccc',\n        },\n      },\n      tableCellProperties: {\n        borderColors: this.#sharedColors,\n        backgroundColors: this.#sharedColors,\n        colorPicker: this.#colorPickerConfig,\n        defaultProperties: {\n          borderStyle: 'solid',\n          borderWidth: '1px',\n          borderColor: '#ccc',\n        },\n      },\n    },\n\n    indentBlock: {\n      offset: 48, // Đơn vị px cho mỗi mức indent (tương đương 0.5 inch)\n      unit: 'px',\n    },\n\n    // Quan trọng: Cho phép paste style từ Word nhưng bỏ qua margin/padding\n    htmlSupport: {\n      allow: [\n        {\n          name: /.*/, // Cho phép tất cả tên thẻ HTML\n          attributes: true, // Cho phép tất cả attributes\n          classes: true, // Cho phép tất cả classes\n          styles: true, // Cho phép tất cả styles\n        },\n      ],\n    },\n  };\n\n  ngOnInit() {\n    // Debounce trong rxjs không hỗ trợ leading --> throttleTime\n    this.#subscription.add(\n      this.#contentChangeSubject.pipe(throttleTime(500, undefined, { leading: true, trailing: true })).subscribe(content => {\n        this.contentChange.emit(normalize(content));\n      })\n    );\n  }\n\n  ngOnDestroy() {\n    this.#subscription.unsubscribe();\n  }\n\n  onReady(editor: ClassicEditor) {\n    this.#editor = editor;\n\n    // Setup orientation plugin callback\n    try {\n      const orientationPlugin = editor.plugins.get('PageOrientation') as PageOrientation;\n      if (orientationPlugin && typeof orientationPlugin.onOrientationChange === 'function') {\n        orientationPlugin.onOrientationChange(orientation => {\n          this.option().onOrientation?.(orientation);\n        });\n\n        // Set initial orientation if provided\n        const option = this.option();\n        if (option.orientation) {\n          orientationPlugin.setOrientation(option.orientation);\n        }\n      }\n    } catch (error) {\n      console.warn('PageOrientation not available:', error);\n    }\n\n    // Lắng nghe selection\n    editor.model.document.selection.on('change', $event => {\n      this.option().onSelection?.(this.#editor.model.document.selection, $event);\n    });\n\n    // Lắng nghe sự kiện thay đổi nội dung\n    editor.model.document.on('change:data', () => {\n      const content = editor.getData();\n      this.#contentChangeSubject.next(content);\n    });\n\n    try {\n      // Manual keybinding cho Tab nếu cần\n      editor.keystrokes.set('Tab', (evt, cancel) => {\n        const command = editor.commands.get('indentBlock');\n        if (command && command.isEnabled) {\n          editor.execute('indentBlock');\n          cancel();\n        }\n      });\n\n      // Manual keybinding cho Shift+Tab\n      editor.keystrokes.set('Shift+Tab', (evt, cancel) => {\n        const command = editor.commands.get('outdentBlock');\n        if (command && command.isEnabled) {\n          editor.execute('outdentBlock');\n          cancel();\n        }\n      });\n    } catch (error) {\n      console.warn('Error setting up indent keybindings:', error);\n    }\n\n    this.#updateState();\n\n    // Setup CkCommentPlugin callbacks\n    this.#setupCkCommentPlugin();\n  }\n\n  #setupCkCommentPlugin() {\n    if (!this.#editor) return;\n\n    try {\n      const ckCommentPlugin = this.#editor.plugins.get('CkComment') as CkCommentPlugin;\n      const option = this.option();\n      if (ckCommentPlugin && option.comment) {\n        ckCommentPlugin.setConfig(option.comment);\n      }\n    } catch (error) {\n      console.warn('CkCommentPlugin not available:', error);\n    }\n  }\n\n  setContent = (html: string) => {\n    const safe = sanitizeVariableHtmlBoundSerializedHtml(html);\n    this.#editor?.setData?.(safe);\n  };\n\n  getContent = () => {\n    if (this.#editor) {\n      return this.#editor.getData();\n    }\n    return '';\n  };\n\n  setOrientation = (orientation: 'PORTRAIT' | 'LANDSCAPE'): void => {\n    if (!this.#editor) return;\n\n    try {\n      const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\n      if (orientationPlugin && typeof orientationPlugin.setOrientation === 'function') {\n        orientationPlugin.setOrientation(orientation);\n      }\n    } catch (error) {\n      console.warn('Failed to set orientation:', error);\n    }\n  };\n\n  getOrientation = (): 'PORTRAIT' | 'LANDSCAPE' => {\n    if (!this.#editor) return 'PORTRAIT';\n\n    try {\n      const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\n      if (orientationPlugin && typeof orientationPlugin.getOrientation === 'function') {\n        return orientationPlugin.getOrientation();\n      }\n    } catch (error) {\n      console.warn('Failed to get orientation:', error);\n    }\n\n    return 'PORTRAIT';\n  };\n\n  scrollToTop() {\n    setTimeout(() => {\n      if (this.#editor) {\n        const editableElement = this.#editor.ui.view.editable.element;\n        if (editableElement) {\n          const scrollContainer = editableElement.closest('.builder-container');\n          if (scrollContainer) {\n            scrollContainer.scrollTo({\n              top: 0,\n              behavior: 'smooth',\n            });\n          } else {\n            editableElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n          }\n        }\n      }\n    }, 100);\n  }\n\n  #updateState(): void {\n    if (!this.#editor) return;\n    if (this.disabled) {\n      // Bật chế độ chỉ đọc với ID khóa\n      this.#editor.enableReadOnlyMode(this.#id);\n\n      // Disable page orientation button\n      try {\n        const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\n        if (orientationPlugin && (orientationPlugin as any).buttonView) {\n          (orientationPlugin as any).buttonView.isEnabled = false;\n        }\n      } catch (error) {\n        console.warn('Failed to disable orientation button:', error);\n      }\n    } else {\n      // Tắt chế độ chỉ đọc với ID khóa tương ứng\n      this.#editor.disableReadOnlyMode(this.#id);\n\n      // Enable page orientation button\n      try {\n        const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\n        if (orientationPlugin && (orientationPlugin as any).buttonView) {\n          (orientationPlugin as any).buttonView.isEnabled = true;\n        }\n      } catch (error) {\n        console.warn('Failed to enable orientation button:', error);\n      }\n    }\n  }\n\n  #getTextFromElement = (element: ModelElement): string => {\n    let text = '';\n    // Heading trong Model chứa các text node con\n    for (const child of element.getChildren()) {\n      if (child.is('$text') || child.is('$textProxy')) {\n        text += (child as any).data;\n      }\n    }\n    return text;\n  };\n\n  #getTextFromRange = (range: ModelRange): string => {\n    let text = '';\n    for (const item of range.getItems()) {\n      // TextProxy là một phần của Text Node nằm trong Range\n      if (item.is('$textProxy') || item.is('$text')) {\n        text += (item as any).data;\n      }\n    }\n    return text;\n  };\n\n  // ========================================================================\n  // 1. QUẢN LÝ HEADING\n  // ========================================================================\n  heading = {\n    /**\n     * Lấy tất cả headings trong document\n     * @returns Danh sách tất cả headings\n     */\n    all: (): SdDocumentBuilderHeading[] => {\n      if (!this.#editor) return [];\n\n      const root = this.#editor.model.document.getRoot();\n      if (!root) return [];\n\n      // Reset lại map mỗi lần quét\n      this.#headingElementsMap.clear();\n\n      const headings: SdDocumentBuilderHeading[] = [];\n      const range = this.#editor.model.createRangeIn(root);\n\n      // Biến đếm để tạo ID unique\n      let index = 0;\n\n      for (const item of range.getItems()) {\n        // Kiểm tra xem item có phải là Element và tên bắt đầu bằng 'heading' không\n        if (item.is('element') && item.name.startsWith('heading')) {\n          // 1. Lấy text của heading\n          const text = this.#getTextFromElement(item);\n          // 2. Xác định Level (heading1 -> 1, heading2 -> 2)\n          // item.name có dạng 'heading1', 'heading2'\n          const level = parseInt(item.name.replace('heading', ''), 10) || 1;\n          // 3. Tạo ID runtime (Dùng để map khi click scroll)\n          // Bạn có thể generate slug từ text nếu muốn, ở đây mình dùng index cho đơn giản và unique\n          const id = `heading_${index}_${Date.now()}`;\n          // 4. Lưu tham chiếu Model Element vào Map\n          this.#headingElementsMap.set(id, item as ModelElement);\n          headings.push({\n            id: id,\n            text: text,\n            level: level,\n            type: item.name,\n          });\n          index++;\n        }\n      }\n\n      return headings;\n    },\n\n    /**\n     * Scroll tới vị trí của heading\n     * @param id - ID của heading cần scroll tới\n     */\n    scroll: (id: string) => {\n      if (!this.#editor) return;\n\n      const modelElement = this.#headingElementsMap.get(id);\n\n      if (modelElement) {\n        this.#editor.model.change(writer => {\n          // Xóa marker cũ\n          if (this.#idTimeOutScrollHeading) {\n            clearTimeout(this.#idTimeOutScrollHeading);\n          }\n          const currentMarker = this.#editor.model.markers.get('highlightMarker');\n          if (currentMarker) {\n            writer.removeMarker(currentMarker);\n          }\n\n          // Tạo Range bao trùm highlight\n          const range = writer.createRangeOn(modelElement);\n\n          // Thêm Marker mới\n          writer.addMarker('highlightMarker', {\n            range: range,\n            usingOperation: false,\n          });\n        });\n\n        // Scroll tới vị trí tìm được\n        const viewElement = this.#editor.editing.mapper.toViewElement(modelElement);\n        if (viewElement) {\n          const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\n          if (domElement) {\n            domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n          }\n        }\n\n        // Tự động tắt marker sau 5 giây\n        this.#idTimeOutScrollHeading = setTimeout(() => {\n          if (this.#editor) {\n            this.#editor.model.change(writer => {\n              const marker = this.#editor.model.markers.get('highlightMarker');\n              if (marker) writer.removeMarker(marker);\n            });\n          }\n        }, 5000);\n      } else {\n        console.warn(`Heading with id ${id} not found.`);\n      }\n    },\n  };\n\n  // ========================================================================\n  // 2. QUẢN LÝ COMMENT (Marker-based)\n  // ========================================================================\n  getCommentPluginAPI() {\n    if (!this.#editor) return null;\n    try {\n      const plugin = this.#editor.plugins.get('CkComment') as CkCommentPlugin;\n      return plugin;\n    } catch (error) {\n      console.warn('CkCommentPlugin not available:', error);\n      return null;\n    }\n  }\n\n  // ========================================================================\n  // 3. QUẢN LÝ VARIABLE\n  // ========================================================================\n  getVariablePluginAPI(): VariablePlugin | null {\n    if (!this.#editor) return null;\n    try {\n      // Dùng class reference (không dùng string) → an toàn trong build minified, TypeScript-typed\n      return this.#editor.plugins.get(VariablePlugin);\n    } catch (error) {\n      console.warn('VariablePlugin not available:', error);\n      return null;\n    }\n  }\n\n  // ========================================================================\n  // 4. HÀM EXPORT DOCX (FULL HEADER/FOOTER + PAGE NUMBER)\n  // ========================================================================\n  /**\n   * Xuất file Word có Header/Footer\n   * @param fileName Tên file\n   * @param headerText Nội dung Header (hoặc HTML)\n   * '<p style=\"text-align: center; font-weight: bold;\">CÔNG TY CỔ PHẦN CÔNG NGHỆ ABC</p>'\n   * @param footerText Nội dung Footer (hoặc HTML)\n   * '<p style=\"text-align: right; font-size: 10pt;\">Trang <span style=\"mso-field-code: PAGE\"></span> / <span style=\"mso-field-code: NUMPAGES\"></span></p>'\n   */\n  exportDocx(args: { fileName?: string; header?: string; footer?: string }): void {\n    if (!this.#editor) return;\n    const fileName = args?.fileName || `document_${Date.now()}.docx`;\n    const header = args?.header || ``;\n    const footer = args?.footer || ``;\n    // 1. Kiểm tra xoay giấy\n    const rootElement = this.#editor.editing.view.document.getRoot();\n    const isLandscape = rootElement?.hasClass('landscape');\n    const orientation = isLandscape ? 'landscape' : 'portrait';\n\n    // Kích thước giấy cho Word (A4)\n    // Portrait: 21cm x 29.7cm\n    // Landscape: 29.7cm x 21cm\n    // @page size trong CSS Word đôi khi cần set cứng width/height để header không bị lệch\n    const pageCss = isLandscape\n      ? 'size: 29.7cm 21cm; mso-page-orientation: landscape;'\n      : 'size: 21cm 29.7cm; mso-page-orientation: portrait;';\n\n    const contentHtml = this.#editor.getData();\n\n    // 2. TẠO HTML CHUẨN MICROSOFT WORD XML\n    // Phải có xmlns:o và xmlns:w thì Word mới hiểu được các lệnh mso-\n    const fullHtml = `\n      <html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'>\n        <head>\n          <meta charset=\"UTF-8\">\n          <title>Export Document</title>\n          \n          <style>\n            /* --- 1. SETUP TRANG GIẤY & HEADER/FOOTER --- */\n            @page {\n              ${pageCss}\n              margin: 2.0cm; /* Lề chuẩn 2cm */\n              \n              /* Kỹ thuật map ID của Word */\n              mso-header: header1;\n              mso-footer: footer1;\n            }\n\n            /* Quan trọng: Ẩn các div header/footer khỏi luồng văn bản chính */\n            /* Chúng sẽ chỉ hiện thị khi được @page gọi thông qua mso-header/footer */\n            div#header1 { display: none; }\n            div#footer1 { display: none; }\n\n            /* --- 2. STYLE CƠ BẢN --- */\n            body {\n              font-family: 'Times New Roman', serif;\n              font-size: 13pt;\n              line-height: 1.5;\n              tab-interval: 36pt;\n            }\n            \n            /* Style Bảng */\n            table { width: 100%; border-collapse: collapse; }\n            td, th { border: 1px solid black; padding: 5px; }\n\n            /* Style Biến (Giữ nguyên giao diện đẹp của bạn) */\n            .variable-widget {\n              color: var(--sd-primary, #005cbb); font-weight: bold;\n              background: #e3f2fd; padding: 0 4px; border-radius: 4px;\n              border: 1px solid #90caf9;\n            }\n            \n            /* Ẩn Comment khi in/xuất file */\n            .ck-comment-marker { background-color: transparent; border: none; text-decoration: none; }\n          </style>\n        </head>\n        <body>\n          \n          <div id=\"header1\">\n            <div style=\"mso-element:header\">\n               ${header}\n               <div style='border-bottom: 1px solid #000; margin-top: 5px; margin-bottom: 20px;'></div>\n            </div>\n          </div>\n\n          <div id=\"footer1\">\n            <div style=\"mso-element:footer\">\n               <div style='border-top: 1px solid #000; margin-top: 20px; margin-bottom: 5px;'></div>\n               ${footer}\n            </div>\n          </div>\n\n          <div class=\"content\">\n            ${contentHtml}\n          </div>\n\n        </body>\n      </html>\n    `;\n\n    // 3. TẠO BLOB VÀ TẢI XUỐNG\n    // Lưu ý: Dùng type 'application/msword' thay vì dùng thư viện html-docx-js\n    // Thêm '\\ufeff' (BOM) để fix lỗi font tiếng Việt\n    const blob = new Blob(['\\ufeff', fullHtml], { type: 'application/msword' });\n    BrowserUtilities.downloadBlob(blob, fileName);\n  }\n\n  hightSelectRange = (range: ModelRange): void => {\n    if (!range) return;\n    const editor = this.#editor;\n\n    editor.model.change(writer => {\n      // Xóa marker cũ (nếu có)\n      if (editor.model.markers.has('highlightRange')) {\n        writer.removeMarker('highlightRange');\n      }\n\n      // Tạo marker mới\n      writer.addMarker('highlightRange', {\n        usingOperation: false, // Không lưu vào lịch sử Undo/Redo\n        affectsData: false, // Không ảnh hưởng đến data lấy ra (getData)\n        range: range,\n      });\n    });\n  };\n\n  removeHighlightSeclectRange = (): void => {\n    const editor = this.#editor;\n    editor.model.change(writer => {\n      if (editor.model.markers.has('highlightRange')) {\n        writer.removeMarker('highlightRange');\n      }\n    });\n  };\n}\n","<sd-ckeditor-styles />\n<div class=\"builder-container\">\n  <ckeditor class=\"w-full\" [editor]=\"Editor\" [config]=\"config\" (ready)=\"onReady($event)\" [disabled]=\"disabled\"> </ckeditor>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}