@phuong-tran-redoc/document-engine-angular 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phuong-tran-redoc-document-engine-angular.mjs","sources":["../../../../libs/document-engine-angular/src/lib/core/kit/kit.ts","../../../../libs/document-engine-angular/src/lib/core/capability.model.ts","../../../../libs/document-engine-angular/src/lib/configs/editor.config.ts","../../../../libs/document-engine-angular/src/lib/core/bubble-menu/bubble-menu.directive.ts","../../../../libs/document-engine-angular/src/lib/core/bubble-menu/bubble-menu.util.ts","../../../../libs/document-engine-angular/src/lib/core/event-manager.ts","../../../../libs/document-engine-angular/src/lib/core/focus-trap.service.ts","../../../../libs/document-engine-angular/src/lib/core/angular-renderer.ts","../../../../libs/document-engine-angular/src/lib/core/draggable.directive.ts","../../../../libs/document-engine-angular/src/lib/core/editor-tokens.ts","../../../../libs/document-engine-angular/src/lib/core/editor.directive.ts","../../../../libs/document-engine-angular/src/lib/core/floating-menu.directive.ts","../../../../libs/document-engine-angular/src/lib/core/popover.directive.ts","../../../../libs/document-engine-angular/src/lib/ui/character-count/character-count.component.ts","../../../../libs/document-engine-angular/src/lib/ui/character-count/character-count.component.html","../../../../libs/document-engine-angular/src/lib/ui/footer/footer.component.ts","../../../../libs/document-engine-angular/src/lib/ui/footer/footer.component.html","../../../../libs/document-engine-angular/src/lib/constants/color.constant.ts","../../../../libs/document-engine-angular/src/lib/ui/button.ts","../../../../libs/document-engine-angular/src/lib/ui/icon/icon.constant.ts","../../../../libs/document-engine-angular/src/lib/ui/icon/icon-registry.service.ts","../../../../libs/document-engine-angular/src/lib/ui/icon/icon.component.ts","../../../../libs/document-engine-angular/src/lib/ui/color-picker.ts","../../../../libs/document-engine-angular/src/lib/views/color-picker-view/color-picker-view.ts","../../../../libs/document-engine-angular/src/lib/configs/color.config.ts","../../../../libs/document-engine-angular/src/lib/ui/input/input.ts","../../../../libs/document-engine-angular/src/lib/ui/input/label.ts","../../../../libs/document-engine-angular/src/lib/views/dynamic-fields-view/dynamic-fields-view.ts","../../../../libs/document-engine-angular/src/lib/configs/dynamic-fields.config.ts","../../../../libs/document-engine-angular/src/lib/views/image-insert-view/image-pick.util.ts","../../../../libs/document-engine-angular/src/lib/utils/validator.util.ts","../../../../libs/document-engine-angular/src/lib/ui/input/error-message.ts","../../../../libs/document-engine-angular/src/lib/views/image-insert-view/image-insert-view.ts","../../../../libs/document-engine-angular/src/lib/configs/image.config.ts","../../../../libs/document-engine-angular/src/lib/views/link-views/link-edit-view.ts","../../../../libs/document-engine-angular/src/lib/views/link-views/link-main-view.ts","../../../../libs/document-engine-angular/src/lib/ui/checkbox/checkbox.ts","../../../../libs/document-engine-angular/src/lib/views/link-views/link-properties-view.ts","../../../../libs/document-engine-angular/src/lib/configs/link.config.ts","../../../../libs/document-engine-angular/src/lib/constants/character.constant.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select-label.directive.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select.contract.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select-option.directive.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select.component.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select.component.html","../../../../libs/document-engine-angular/src/lib/views/special-characters-view/special-characters-view.ts","../../../../libs/document-engine-angular/src/lib/configs/special-characters.config.ts","../../../../libs/document-engine-angular/src/lib/ui/toggle-button/toggle-button.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/border-width.util.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-cell-style-view.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-create-view.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-main-view.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-style-view.ts","../../../../libs/document-engine-angular/src/lib/configs/table.config.ts","../../../../libs/document-engine-angular/src/lib/views/template-view/template-view.ts","../../../../libs/document-engine-angular/src/lib/configs/template.config.ts","../../../../libs/document-engine-angular/src/lib/constants/text-style.constant.ts","../../../../libs/document-engine-angular/src/lib/constants/list.constant.ts","../../../../libs/document-engine-angular/src/lib/views/wrapper/editor-bubble-menu.wrapper.ts","../../../../libs/document-engine-angular/src/lib/views/wrapper/toolbar-bubble-menu.wrapper.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.service.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.state.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.component.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.component.html","../../../../libs/document-engine-angular/src/lib/components/document-editor.component.ts","../../../../libs/document-engine-angular/src/lib/components/document-editor.component.html","../../../../libs/document-engine-angular/src/lib/components/document-editor.module.ts","../../../../libs/document-engine-angular/src/phuong-tran-redoc-document-engine-angular.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport Blockquote from '@tiptap/extension-blockquote';\nimport Bold from '@tiptap/extension-bold';\nimport Code from '@tiptap/extension-code';\nimport CodeBlock from '@tiptap/extension-code-block';\nimport { Document } from '@tiptap/extension-document';\nimport { HardBreak } from '@tiptap/extension-hard-break';\nimport { HorizontalRule } from '@tiptap/extension-horizontal-rule';\nimport { Image } from '@tiptap/extension-image';\nimport Italic from '@tiptap/extension-italic';\nimport Link, { LinkOptions } from '@tiptap/extension-link';\nimport { BulletList, ListItem, ListKeymap } from '@tiptap/extension-list';\nimport { Paragraph } from '@tiptap/extension-paragraph';\nimport Strike from '@tiptap/extension-strike';\nimport { Subscript } from '@tiptap/extension-subscript';\nimport { Superscript } from '@tiptap/extension-superscript';\nimport { Text } from '@tiptap/extension-text';\nimport { TextAlign } from '@tiptap/extension-text-align';\nimport { TextStyleKit } from '@tiptap/extension-text-style';\nimport Underline from '@tiptap/extension-underline';\nimport { CharacterCount, Dropcursor, Gapcursor, Placeholder, TrailingNode, UndoRedo } from '@tiptap/extensions';\nimport {\n ClearContent,\n CustomOrderedList,\n Indent,\n ResetFormat,\n ResetOnEnter,\n RestrictedEditing,\n StyledTableKit,\n TextCase,\n EditableRegion,\n DynamicField,\n NotumHeading,\n PageBreak,\n ImageRef,\n} from '@phuong-tran-redoc/document-engine-core';\nimport { DocumentEngineConfig } from './kit.type';\n\nexport const DocumentEngineKit = Extension.create<DocumentEngineConfig>({\n name: 'DocumentEngineKit',\n\n addExtensions() {\n // Default extensions\n const extensions = [\n Document,\n Paragraph,\n Text,\n Dropcursor,\n Gapcursor,\n HardBreak,\n HorizontalRule,\n TrailingNode,\n ResetOnEnter,\n ];\n\n const options = this.options;\n\n // Defaults centralized for readability\n const DEFAULT_LINK_OPTIONS: Partial<LinkOptions> = {\n openOnClick: false,\n defaultProtocol: 'https',\n enableClickSelection: true,\n shouldAutoLink: (url) =>\n url.startsWith('http://') || url.startsWith('https://') || url.startsWith('mailto:') || url.startsWith('tel:'),\n };\n const DEFAULT_TEXT_ALIGN = { types: ['paragraph', 'heading'] } as const;\n const DEFAULT_PLACEHOLDER = { placeholder: 'Type something...' } as const;\n const DEFAULT_TABLES = { table: { resizable: true } } as const;\n\n // Small helper to add a configurable extension\n const add = (opt: unknown, ext: unknown, defaultConfig?: object) => {\n if (opt === false || opt === undefined) return;\n\n if (typeof opt === 'object') {\n extensions.push((ext as any).configure(opt));\n return;\n }\n\n extensions.push(defaultConfig ? (ext as any).configure(defaultConfig) : (ext as any));\n };\n\n // RestrictedEditing\n if (options.restrictedEditing !== false && options.restrictedEditing !== undefined) {\n // Editable Region will always be added after RestrictedEditing\n extensions.push(EditableRegion);\n\n if (typeof options.restrictedEditing === 'object') {\n extensions.push(RestrictedEditing.configure(options.restrictedEditing));\n } else {\n extensions.push(RestrictedEditing.configure({ initialMode: 'standard' }));\n }\n }\n\n if (options.list !== false) {\n add(true, ListKeymap);\n add(true, ListItem);\n add(true, BulletList);\n add(true, CustomOrderedList);\n }\n\n // Configurable, with consistent defaults where applicable\n add(options.blockquote, Blockquote);\n add(options.bold, Bold);\n add(options.italic, Italic);\n add(options.underline, Underline);\n add(options.strike, Strike);\n add(options.link, Link, DEFAULT_LINK_OPTIONS);\n add(options.codeBlock, CodeBlock);\n add(options.code, Code);\n add(options.undoRedo, UndoRedo);\n add(options.textStyleKit, TextStyleKit);\n add(options.tables, StyledTableKit, DEFAULT_TABLES);\n add(options.characterCount, CharacterCount);\n add(options.subscript, Subscript);\n add(options.superscript, Superscript);\n add(options.textAlign, TextAlign, DEFAULT_TEXT_ALIGN);\n add(options.image, Image);\n add(options.imageRef, ImageRef);\n add(options.placeholder, Placeholder, DEFAULT_PLACEHOLDER);\n add(options.pageBreak, PageBreak);\n add(options.resetFormat, ResetFormat);\n add(options.indent, Indent);\n add(options.clearContent, ClearContent);\n add(options.textCase, TextCase);\n add(options.heading, NotumHeading);\n add(options.dynamicField, DynamicField);\n\n return extensions;\n },\n});\n","import { DocumentEngineConfig } from './kit/kit.type';\n\n/**\n * EditorCapabilities class\n * Pre-calculates all capability checks from DocumentEngineConfig\n * to avoid repeated function calls in UI components\n */\nexport class EditorCapabilities {\n // History (undo/redo)\n readonly hasHistory: boolean;\n\n // Basic inline\n readonly hasBold: boolean;\n readonly hasItalic: boolean;\n readonly hasUnderline: boolean;\n readonly hasStrike: boolean;\n readonly basicInline: boolean;\n\n // Advanced Inine\n readonly hasSubscript: boolean;\n readonly hasSuperscript: boolean;\n readonly hasCode: boolean;\n readonly hasLink: boolean;\n readonly advancedInline: boolean;\n\n // Text property\n readonly hasHeading: boolean;\n readonly hasFontSize: boolean;\n readonly hasLineHeight: boolean;\n readonly hasTextCase: boolean;\n readonly hasTextProperty: boolean;\n\n // Alignment & Layout\n readonly hasTextAlign: boolean;\n readonly hasIndent: boolean;\n readonly hasLists: boolean;\n readonly hasAlignmentLayout: boolean;\n\n // Format Utilities\n readonly hasColors: boolean;\n readonly hasResetFormat: boolean;\n readonly hasFormatUtilities: boolean;\n\n // Block Types\n readonly hasCodeBlock: boolean;\n readonly hasBlockquote: boolean;\n readonly hasBlockTypes: boolean;\n\n // Insert Object\n readonly hasImages: boolean;\n readonly hasTable: boolean;\n readonly hasSpecialChars: boolean;\n readonly hasPageBreak: boolean;\n readonly hasInsertObject: boolean;\n\n // Business Features\n readonly hasTemplates: boolean;\n readonly hasDynamicFields: boolean;\n readonly hasEditableRegion: boolean;\n readonly hasBusinessFeatures: boolean;\n\n // Actions\n readonly hasClearContent: boolean;\n readonly hasMarkdown: boolean;\n readonly hasActions: boolean;\n\n // UI Components\n readonly hasFooter: boolean;\n readonly hasPrintButton: boolean;\n\n constructor(config: Partial<DocumentEngineConfig>) {\n // History\n this.hasHistory = config.undoRedo !== false;\n\n // Basic inline\n this.hasBold = config.bold !== false;\n this.hasItalic = config.italic !== false;\n this.hasUnderline = config.underline !== false;\n this.hasStrike = config.strike !== false;\n this.basicInline = this.hasBold || this.hasItalic || this.hasUnderline || this.hasStrike;\n\n // Advanced Inline\n this.hasSubscript = config.subscript !== false;\n this.hasSuperscript = config.superscript !== false;\n this.hasCode = config.code !== false;\n this.hasLink = config.link !== false;\n this.advancedInline = this.hasSubscript || this.hasSuperscript || this.hasCode || this.hasLink;\n\n // Text property\n this.hasHeading = config.heading !== false;\n this.hasFontSize = config.fontSize !== false;\n this.hasLineHeight = config.lineHeight !== false;\n this.hasTextCase = config.textCase !== false;\n this.hasTextProperty = this.hasHeading || this.hasFontSize || this.hasLineHeight || this.hasTextCase;\n\n // Alignment & Layout\n this.hasTextAlign = config.textAlign !== false;\n this.hasIndent = config.indent !== false;\n this.hasLists = config.list !== false;\n this.hasAlignmentLayout = this.hasTextAlign || this.hasIndent || this.hasLists;\n\n // Format Utilities\n this.hasColors = config.textStyleKit !== false;\n this.hasResetFormat = config.resetFormat !== false;\n this.hasFormatUtilities = this.hasColors || this.hasResetFormat;\n\n // Block Types\n this.hasCodeBlock = false;\n this.hasBlockquote = config.blockquote !== false;\n this.hasBlockTypes = this.hasCodeBlock || this.hasBlockquote;\n\n // Insert Object\n this.hasImages = config.image !== false;\n this.hasTable = config.tables !== false;\n this.hasSpecialChars = config.specialCharacters !== false;\n this.hasPageBreak = config.pageBreak !== false;\n this.hasInsertObject = this.hasImages || this.hasTable || this.hasSpecialChars || this.hasPageBreak;\n\n // Business Features\n this.hasTemplates = !!(config.templates && config.templates.length > 0);\n this.hasDynamicFields = config.dynamicField !== false;\n this.hasEditableRegion = config.restrictedEditing !== false;\n this.hasBusinessFeatures = this.hasTemplates || this.hasDynamicFields || this.hasEditableRegion;\n\n // Actions\n this.hasClearContent = config.clearContent !== false;\n this.hasMarkdown = false;\n this.hasActions = this.hasClearContent || this.hasMarkdown;\n\n // UI Components\n this.hasFooter = config.showFooter !== false;\n this.hasPrintButton = config.showPrintButton !== false;\n }\n}\n","import { DocumentEngineConfig } from '../core/kit/kit.type';\n\nexport const DefaultEditorConfig: Partial<DocumentEngineConfig> = {\n link: {\n openOnClick: false,\n defaultProtocol: 'https',\n enableClickSelection: true,\n shouldAutoLink: (url) =>\n url.startsWith('http://') || url.startsWith('https://') || url.startsWith('mailto:') || url.startsWith('tel:'),\n },\n blockquote: false,\n heading: false,\n bold: false,\n italic: false,\n underline: false,\n strike: false,\n list: false,\n codeBlock: false,\n code: false,\n undoRedo: false,\n textStyleKit: false,\n tables: false,\n characterCount: false,\n subscript: false,\n superscript: false,\n textAlign: false,\n image: false,\n placeholder: false,\n pageBreak: false,\n resetFormat: false,\n indent: false,\n clearContent: false,\n textCase: false,\n dynamicField: false,\n specialCharacters: false,\n showFooter: false,\n fontSize: false,\n lineHeight: false,\n editable: true,\n restrictedEditing: false,\n showToolbar: true,\n showPrintButton: false,\n};\n","import { Directive, ElementRef, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuPlugin, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';\nimport { BubbleMenuProps } from './bubble-menu.type';\n\n@Directive({\n selector: 'tiptap-bubble-menu[editor], [tiptapBubbleMenu][editor]',\n standalone: true,\n})\nexport class TiptapBubbleMenuDirective implements OnInit, OnDestroy {\n private elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n @Input() props!: BubbleMenuProps;\n @Input() editor!: Editor;\n @Input() mountTo?: BubbleMenuPluginProps['getReferencedVirtualElement'];\n @Input() shouldShow?: BubbleMenuPluginProps['shouldShow'];\n\n ngOnInit(): void {\n const editor = this.editor;\n if (!editor) throw new Error('Required: Input `editor`');\n\n const bubbleMenuElement = this.elRef.nativeElement;\n bubbleMenuElement.style.visibility = 'hidden';\n bubbleMenuElement.style.position = 'absolute';\n\n // Prevent editor blur when interacting with the bubble content\n // bubbleMenuElement.addEventListener('mousedown', this.preventDefault);\n\n const { pluginKey, appendTo, updateDelay, resizeDelay, options } = this.props;\n\n editor.registerPlugin(\n BubbleMenuPlugin({\n pluginKey,\n appendTo,\n updateDelay,\n resizeDelay,\n editor,\n element: bubbleMenuElement,\n options: this.getFloatingUiOptions(options ?? {}, bubbleMenuElement),\n shouldShow: this.shouldShow,\n getReferencedVirtualElement: this.mountTo,\n }),\n );\n }\n\n ngOnDestroy(): void {\n if (this.editor && this.props?.pluginKey) {\n this.editor.unregisterPlugin(this.props.pluginKey);\n }\n\n window.requestAnimationFrame(() => {\n if (this.elRef.nativeElement.parentNode) {\n this.elRef.nativeElement.parentNode.removeChild(this.elRef.nativeElement);\n }\n });\n\n this.elRef.nativeElement.removeEventListener('mousedown', this.preventDefault);\n }\n\n preventDefault(event: MouseEvent): void {\n // Allow default behavior for focusable elements so inputs can receive focus\n const target = event.target as HTMLElement | null;\n if (target) {\n const tag = target.tagName;\n const isFocusableTag = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable;\n if (isFocusableTag) return;\n }\n\n event.preventDefault();\n }\n\n private getFloatingUiOptions(\n userOptions: Partial<Record<string, unknown>>,\n element: HTMLElement,\n ): BubbleMenuPluginProps['options'] {\n // Find arrow element if it exists\n // const arrowElement = element.querySelector('[data-arrow]') as HTMLElement | null;\n\n // Merge with default Floating UI options\n const defaultOptions: BubbleMenuPluginProps['options'] = {\n placement: 'bottom',\n flip: {\n fallbackPlacements: ['top', 'bottom', 'bottom-start', 'top-end', 'bottom-end'],\n padding: 8,\n },\n // Enable shift middleware to keep bubble within viewport\n shift: { padding: 8 },\n // Add offset to create space between selection and bubble\n offset: 10,\n // Configure arrow if element exists\n // arrow: arrowElement ? { element: arrowElement } : false,\n };\n\n return { ...defaultOptions, ...userOptions };\n }\n}\n","import { Editor } from '@tiptap/core';\nimport { BubbleTarget } from './bubble-menu.type';\n\nexport function shouldShowFnFactory(params: {\n editor: Editor;\n target: BubbleTarget;\n forceOpen: () => boolean;\n}): () => boolean {\n const { editor, target, forceOpen } = params;\n const requireFocus = target.requireFocus !== false;\n const allowEmptySelection = target.allowEmptySelection === true;\n\n return () => {\n if (forceOpen()) return true;\n if (requireFocus && !editor.isFocused) return false;\n\n // Avoid showing during drag/resize\n const dragging = (editor as unknown as { isDragging?: boolean }).isDragging;\n if (dragging) return false;\n\n // Avoid showing when selection is empty and mark is required\n if (!allowEmptySelection && editor.state.selection.empty && target.kind === 'mark') return false;\n\n // Avoid showing when extension is not active\n const active = Array.isArray(target.name)\n ? target.name.some((name) => editor.isActive(name))\n : editor.isActive(target.name);\n\n if (!active) return false;\n\n // Avoid showing when extra predicate is not met\n if (target.extraPredicate && !target.extraPredicate(editor)) return false;\n\n return true;\n };\n}\n\nexport function selectionChangeHandler(params: {\n editor: Editor;\n target: BubbleTarget;\n onActive: (attrs: Record<string, unknown>) => void;\n onInactive: () => void;\n listenOnUpdate?: boolean; // default false\n}): () => void {\n const { editor, target, onActive, onInactive, listenOnUpdate } = params;\n\n const run = () => {\n const isActive = Array.isArray(target.name)\n ? target.name.some((name) => editor.isActive(name))\n : editor.isActive(target.name);\n\n if (!isActive) return onInactive();\n\n const activeName = Array.isArray(target.name) ? target.name.find((name) => editor.isActive(name)) : target.name;\n\n const attrs =\n target.kind === 'mark'\n ? (editor.getAttributes(activeName as string) ?? {})\n : ((editor.state.selection as any).node?.attrs ?? {});\n\n onActive(attrs);\n };\n\n const onSelection = () => run();\n const onUpdate = () => run();\n\n editor.on('selectionUpdate', onSelection);\n if (listenOnUpdate) editor.on('update', onUpdate);\n\n run(); // initial sync\n\n return () => {\n editor.off('selectionUpdate', onSelection);\n if (listenOnUpdate) editor.off('update', onUpdate);\n };\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\nexport type OutsideHandler = (e: Event) => void;\n\n@Injectable({ providedIn: 'root' })\nexport class EventManager {\n private document = inject(DOCUMENT);\n private keyToEscapeListener = new Map<string, OutsideHandler>();\n private keyToOutsideListener = new Map<string, OutsideHandler>();\n\n isAttached(key: string): boolean {\n return this.keyToOutsideListener.has(key) || this.keyToEscapeListener.has(key);\n }\n\n attach(key: string, hostElement: HTMLElement, cb: (key: string) => void, anchorElement?: HTMLElement): void {\n // Avoid duplicate listeners\n this.detach(key);\n\n const oldOutside = this.keyToOutsideListener.get(key);\n if (!oldOutside) {\n const handler: OutsideHandler = (event: Event) => {\n const target = event.target as Node | null;\n const path = (event as unknown as { composedPath?: () => EventTarget[] }).composedPath?.();\n\n // Check if click is inside bubble\n const isInsideBubble =\n !!hostElement && ((!!target && hostElement.contains(target)) || (!!path && path.includes(hostElement)));\n if (isInsideBubble) return;\n\n // Check if click is on the anchor (toolbar button)\n const isInsideAnchor =\n !!anchorElement && ((!!target && anchorElement.contains(target)) || (!!path && path.includes(anchorElement)));\n if (isInsideAnchor) return;\n\n // Check if click is inside a CDK overlay (e.g., MatSelect dropdown, MatMenu, etc.)\n // These are rendered outside the bubble but should not close it\n if (target instanceof Element) {\n const isInsideOverlay = target.closest('.cdk-overlay-container, .cdk-overlay-pane');\n if (isInsideOverlay) return;\n }\n\n cb(key);\n };\n\n this.keyToOutsideListener.set(key, handler);\n\n this.document.addEventListener('pointerdown', handler, true);\n this.document.addEventListener('mousedown', handler, true);\n this.document.addEventListener('click', handler, true);\n }\n\n const oldEsc = this.keyToEscapeListener.get(key);\n if (!oldEsc) {\n const escHandler = (e: Event) => (e as KeyboardEvent).key === 'Escape' && cb(key);\n this.document.addEventListener('keydown', escHandler, true);\n this.keyToEscapeListener.set(key, escHandler);\n }\n }\n\n detach(key: string): void {\n const outside = this.keyToOutsideListener.get(key);\n if (outside) {\n this.document.removeEventListener('pointerdown', outside, true);\n this.document.removeEventListener('mousedown', outside, true);\n this.document.removeEventListener('click', outside, true);\n this.keyToOutsideListener.delete(key);\n }\n\n const esc = this.keyToEscapeListener.get(key);\n if (esc) {\n this.document.removeEventListener('keydown', esc, true);\n this.keyToEscapeListener.delete(key);\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\n\n/**\n * Service to manage focus trapping within an element\n * Traps keyboard focus inside a container element for accessibility\n */\n@Injectable({ providedIn: 'root' })\nexport class FocusTrapService {\n private document = inject(DOCUMENT);\n private activeTraps = new Map<\n HTMLElement,\n {\n handler: (event: KeyboardEvent) => void;\n firstElement: HTMLElement | null;\n lastElement: HTMLElement | null;\n }\n >();\n\n /**\n * Attach focus trap to an element\n * @param element The container element to trap focus within\n * @param autoFocus Whether to automatically focus the first focusable element\n */\n attach(element: HTMLElement, autoFocus = true): void {\n if (!element) return;\n\n // Detach existing trap if any\n this.detach(element);\n\n // Get all focusable elements within the container\n const focusableSelectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ');\n\n const focusableElements = Array.from(element.querySelectorAll(focusableSelectors)) as HTMLElement[];\n\n if (focusableElements.length === 0) return;\n\n const firstFocusableElement = focusableElements[0];\n const lastFocusableElement = focusableElements[focusableElements.length - 1];\n\n // Focus the first element if requested\n if (autoFocus && firstFocusableElement) {\n setTimeout(() => {\n firstFocusableElement.focus();\n }, 0);\n }\n\n // Handle Tab key to trap focus\n const handler = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n if (!element.contains(this.document.activeElement)) {\n event.preventDefault();\n if (event.shiftKey) {\n lastFocusableElement?.focus();\n } else {\n firstFocusableElement?.focus();\n }\n return;\n }\n\n if (event.shiftKey) {\n // Shift + Tab: going backwards\n if (this.document.activeElement === firstFocusableElement) {\n event.preventDefault();\n lastFocusableElement?.focus();\n }\n } else {\n // Tab: going forwards\n if (this.document.activeElement === lastFocusableElement) {\n event.preventDefault();\n firstFocusableElement?.focus();\n }\n }\n };\n\n element.addEventListener('keydown', handler);\n\n this.activeTraps.set(element, {\n handler,\n firstElement: firstFocusableElement,\n lastElement: lastFocusableElement,\n });\n }\n\n /**\n * Detach focus trap from an element\n * @param element The element to remove focus trap from\n */\n detach(element: HTMLElement): void {\n if (!element) return;\n\n const trap = this.activeTraps.get(element);\n if (trap) {\n element.removeEventListener('keydown', trap.handler);\n this.activeTraps.delete(element);\n }\n }\n\n /**\n * Detach all active focus traps\n */\n detachAll(): void {\n this.activeTraps.forEach((trap, element) => {\n element.removeEventListener('keydown', trap.handler);\n });\n this.activeTraps.clear();\n }\n\n /**\n * Re-attach focus trap to an element (useful when content changes)\n * @param element The element to re-attach focus trap to\n * @param autoFocus Whether to automatically focus the first focusable element\n */\n reattach(element: HTMLElement, autoFocus = false): void {\n this.detach(element);\n this.attach(element, autoFocus);\n }\n}\n","import { ApplicationRef, ComponentRef, ElementRef, Injector, Type, createComponent } from '@angular/core';\n\nexport class AngularRenderer<C, P> {\n private applicationRef: ApplicationRef;\n private componentRef: ComponentRef<C>;\n\n constructor(ViewComponent: Type<C>, injector: Injector, props: Partial<P>) {\n this.applicationRef = injector.get(ApplicationRef);\n\n this.componentRef = createComponent(ViewComponent, {\n environmentInjector: this.applicationRef.injector,\n elementInjector: injector,\n });\n\n // set input props to the component\n this.updateProps(props);\n\n this.applicationRef.attachView(this.componentRef.hostView);\n }\n\n get instance(): C {\n return this.componentRef.instance;\n }\n\n get elementRef(): ElementRef {\n return this.componentRef.injector.get(ElementRef);\n }\n\n get dom(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n updateProps<T extends P>(props: Partial<T>): void {\n Object.entries(props).forEach(([key, value]) => {\n this.componentRef.setInput(key, value);\n });\n }\n\n updateAttributes(attributes: Record<string, string>): void {\n Object.keys(attributes).forEach((key) => {\n this.dom.setAttribute(key, attributes[key]);\n });\n }\n\n detectChanges(): void {\n this.componentRef.changeDetectorRef.detectChanges();\n }\n\n destroy(): void {\n this.componentRef.destroy();\n this.applicationRef.detachView(this.componentRef.hostView);\n }\n}\n","import { Directive, HostBinding } from '@angular/core';\n\n@Directive({\n selector: '[tiptapDraggable]',\n})\nexport class TiptapDraggableDirective {\n @HostBinding('attr.draggable') draggable = true;\n @HostBinding('attr.data-drag-handle') handle = '';\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Type definition for HTML preprocessor function.\n * Allows clients to transform HTML content before it's set into the editor.\n *\n * @param html - The raw HTML string to be processed\n * @returns The processed HTML string that will be set into the editor\n *\n * @example\n * ```typescript\n * const myPreprocessor: EditorHtmlPreprocessor = (html: string) => {\n * // Remove all script tags for security\n * return html.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n * };\n * ```\n */\nexport type EditorHtmlPreprocessor = (html: string) => string;\n\n/**\n * Injection token for HTML preprocessor function.\n * Use this token to provide a custom function that processes HTML content\n * before it's set into the TipTap editor.\n *\n * This is optional - if not provided, the editor will use the HTML content as-is.\n *\n * @example\n * ```typescript\n * // In your component or module providers\n * {\n * provide: EDITOR_HTML_PREPROCESSOR,\n * useValue: (html: string) => {\n * // Your custom preprocessing logic\n * return html.replace(/old/g, 'new');\n * }\n * }\n * ```\n */\nexport const EDITOR_HTML_PREPROCESSOR = new InjectionToken<EditorHtmlPreprocessor>('EDITOR_HTML_PREPROCESSOR');\n\n/**\n * Injection token for content wrapper class.\n * Use this token to provide a custom class name for the content wrapper element.\n *\n * @example\n * ```typescript\n * // In your component or module providers\n * {\n * provide: EDITOR_CONTENT_WRAPPER_CLASS,\n * useValue: 'my-content-wrapper'\n * }\n * ```\n */\nexport const EDITOR_CONTENT_WRAPPER_CLASS = new InjectionToken<string | null>('EDITOR_CONTENT_WRAPPER_CLASS', {\n providedIn: 'root',\n factory: () => null,\n});\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n Input,\n OnInit,\n Renderer2,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Content, Editor, type EditorEvents } from '@tiptap/core';\nimport { EDITOR_CONTENT_WRAPPER_CLASS, EDITOR_HTML_PREPROCESSOR } from './editor-tokens';\n\n@Directive({\n selector: 'tiptap[editor], [tiptap][editor], tiptap-editor[editor], [tiptapEditor][editor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TiptapEditorDirective),\n multi: true,\n },\n ],\n standalone: true,\n host: {\n ['class']: 'tiptap-editor no-twp',\n },\n})\nexport class TiptapEditorDirective implements OnInit, AfterViewInit, ControlValueAccessor {\n protected elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n protected renderer = inject(Renderer2);\n protected changeDetectorRef = inject(ChangeDetectorRef);\n\n protected htmlPreprocessor = inject(EDITOR_HTML_PREPROCESSOR, { optional: true });\n protected contentWrapperClass = inject(EDITOR_CONTENT_WRAPPER_CLASS, { optional: true });\n\n private _editor?: Editor;\n private initialEditableState?: boolean;\n\n @Input()\n set editor(editor: Editor) {\n this._editor = editor;\n // Store initial editable state immediately when editor is set\n // This ensures we capture the state before any Forms API calls\n if (this.initialEditableState === undefined && editor) {\n this.initialEditableState = editor.isEditable;\n }\n }\n\n get editor(): Editor {\n if (!this._editor) {\n throw new Error('Editor must be set before use.');\n }\n return this._editor;\n }\n\n @Input() outputFormat: 'json' | 'html' = 'html';\n\n protected onChange: (value: Content) => void = () => {\n /** */\n };\n protected onTouched: () => void = () => {\n /** */\n };\n\n // Writes a new value to the element.\n // This methods is called when programmatic changes from model to view are requested.\n writeValue(value: Content): void {\n // Apply preprocessor if value is a string (HTML) and preprocessor is available\n let processedValue = value;\n if (typeof value === 'string' && this.htmlPreprocessor) {\n processedValue = this.htmlPreprocessor(value);\n }\n this.editor.chain().setContent(processedValue, { emitUpdate: false }).run();\n }\n\n // Registers a callback function that is called when the control's value changes in the UI.\n registerOnChange(fn: () => void): void {\n this.onChange = fn;\n }\n\n // Registers a callback function that is called by the forms API on initialization to update the form model on blur.\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n // Called by the forms api to enable or disable the element\n setDisabledState(isDisabled: boolean): void {\n // Ensure we have captured the initial state (fallback in case setter wasn't called)\n if (this.initialEditableState === undefined && this.editor) {\n this.initialEditableState = this.editor.isEditable;\n }\n\n // Only apply disabled state if editor was initially editable\n // If editor was configured as readonly (editable: false), preserve that state\n if (this.initialEditableState === true) {\n this.editor.setEditable(!isDisabled);\n }\n // If initialEditableState === false, do nothing - preserve readonly state\n\n this.renderer.setProperty(this.elRef.nativeElement, 'disabled', isDisabled);\n }\n\n protected handleChange = ({ editor, transaction }: EditorEvents['transaction']): void => {\n if (!transaction.docChanged) return;\n\n // Needed for ChangeDetectionStrategy.OnPush to get notified about changes\n this.changeDetectorRef.markForCheck();\n\n if (this.outputFormat === 'html') {\n const htmlContent = editor.getHTML();\n\n let finalContent = htmlContent;\n\n if (this.contentWrapperClass) {\n finalContent = `<div class=\"${this.contentWrapperClass}\">${htmlContent}</div>`;\n }\n\n this.onChange(finalContent);\n return;\n }\n\n this.onChange(editor.getJSON());\n };\n\n ngOnInit(): void {\n const editor = this.editor;\n\n // take the inner contents and clear the block\n const { innerHTML } = this.elRef.nativeElement;\n this.elRef.nativeElement.innerHTML = '';\n\n // insert the editor in the dom\n this.elRef.nativeElement.append(\n ...Array.from((editor.options.element as HTMLElement | undefined)?.childNodes || [])\n );\n\n // update the options for the editor\n editor.setOptions({ element: this.elRef.nativeElement });\n\n // update content to the editor\n if (innerHTML) {\n // Apply preprocessor to initial content if available\n const processedContent = this.htmlPreprocessor ? this.htmlPreprocessor(innerHTML) : innerHTML;\n editor.chain().setContent(processedContent, { emitUpdate: false }).run();\n }\n\n // register blur handler to update `touched` property\n editor.on('blur', () => {\n this.onTouched();\n });\n\n // register update handler to listen to changes on update\n editor.on('update', this.handleChange);\n\n // Needed for ChangeDetectionStrategy.OnPush to get notified\n editor.on('selectionUpdate', () => this.changeDetectorRef.markForCheck());\n }\n\n ngAfterViewInit(): void {\n this.changeDetectorRef.detectChanges();\n }\n}\n","import { Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { FloatingMenuPlugin, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu';\n\n@Directive({\n selector: 'tiptap-floating-menu[editor], [tiptapFloatingMenu][editor]',\n})\nexport class TiptapFloatingMenuDirective implements OnInit, OnDestroy {\n constructor(private elRef: ElementRef<HTMLElement>) {}\n\n @Input() pluginKey: FloatingMenuPluginProps['pluginKey'] = 'TiptapFloatingMenu';\n @Input() editor!: Editor;\n @Input() options: FloatingMenuPluginProps['options'] = {};\n @Input() shouldShow?: FloatingMenuPluginProps['shouldShow'];\n\n ngOnInit(): void {\n const editor = this.editor;\n if (!editor) {\n throw new Error('Required: Input `editor`');\n }\n\n const floatingMenuElement = this.elRef.nativeElement;\n floatingMenuElement.style.visibility = 'hidden';\n floatingMenuElement.style.position = 'absolute';\n\n editor.registerPlugin(\n FloatingMenuPlugin({\n pluginKey: this.pluginKey,\n editor,\n element: floatingMenuElement,\n options: this.options,\n shouldShow: this.shouldShow,\n }),\n );\n }\n\n ngOnDestroy(): void {\n if (this.editor && this.pluginKey) {\n this.editor.unregisterPlugin(this.pluginKey);\n }\n window.requestAnimationFrame(() => {\n if (this.elRef.nativeElement.parentNode) {\n this.elRef.nativeElement.parentNode.removeChild(this.elRef.nativeElement);\n }\n });\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Directive,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { computePosition, flip, offset, shift, autoUpdate, Placement } from '@floating-ui/dom';\n\n/**\n * Directive for positioning a popover/dropdown relative to a trigger element using floating-ui\n * Handles positioning, visibility, and cleanup automatically\n *\n * Usage:\n * <button #trigger>Open</button>\n * <div [documentEnginePopover]=\"trigger\" [isOpen]=\"isOpen\">\n * Content\n * </div>\n *\n * The host is pinned `position: fixed`, so floating-ui is asked for viewport-\n * relative coordinates (`strategy: 'fixed'`). Omitting the strategy yields\n * offset-parent-relative numbers, which are off by the page's scroll offset\n * once written onto a fixed element.\n */\n@Directive({\n // `documentEnginePopover` is the supported selector. `[popover]` is kept as a\n // deprecated alias for consumers on <= 0.1.4; it collides with the platform's\n // native popover attribute and will be removed in the next major.\n selector: '[documentEnginePopover], [popover]',\n standalone: true,\n host: {\n '[style.position]': '\"fixed\"',\n '[style.visibility]': 'isPositioned ? \"visible\" : \"hidden\"',\n },\n})\nexport class PopoverDirective implements OnChanges, AfterViewInit, OnDestroy {\n private elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private cdr = inject(ChangeDetectorRef);\n\n /**\n * The trigger element reference (ElementRef or HTMLElement)\n */\n @Input() documentEnginePopover?: ElementRef<HTMLElement> | HTMLElement;\n\n /**\n * The trigger element reference (ElementRef or HTMLElement)\n *\n * @deprecated Use `documentEnginePopover`. `[popover]` collides with the\n * native HTML popover attribute and will be removed in the next major.\n */\n @Input() popover?: ElementRef<HTMLElement> | HTMLElement;\n\n /** The trigger, whichever input supplied it. */\n private get trigger(): ElementRef<HTMLElement> | HTMLElement | undefined {\n return this.documentEnginePopover ?? this.popover;\n }\n\n /**\n * Whether the popover is open\n */\n @Input() isOpen = false;\n\n /**\n * Placement of the popover relative to trigger\n */\n @Input() placement: Placement = 'bottom-start';\n\n /**\n * Offset from trigger\n */\n @Input() offset = 8;\n\n /**\n * Padding for flip/shift middleware\n */\n @Input() padding = 8;\n\n private cleanupAutoUpdate?: () => void;\n isPositioned = false;\n private viewInitialized = false;\n private retryCount = 0;\n private readonly maxRetries = 10;\n\n ngAfterViewInit(): void {\n this.viewInitialized = true;\n this.updateVisibility();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n this.viewInitialized &&\n (changes['isOpen'] || changes['popover'] || changes['documentEnginePopover'])\n ) {\n this.updateVisibility();\n }\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n private updateVisibility(): void {\n if (!this.viewInitialized) return;\n\n if (this.isOpen && this.trigger) {\n // Wait for next tick to ensure element is rendered\n setTimeout(() => {\n this.setupFloating();\n });\n } else {\n this.isPositioned = false;\n this.cleanup();\n }\n }\n\n private setupFloating(): void {\n // Reset retry count on each attempt\n this.retryCount = 0;\n this._setupFloatingInternal();\n }\n\n private _setupFloatingInternal(): void {\n let triggerEl: HTMLElement | undefined;\n const trigger = this.trigger;\n\n if (!trigger) {\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => this._setupFloatingInternal(), 10);\n }\n return;\n }\n\n if (trigger instanceof ElementRef) {\n triggerEl = trigger.nativeElement;\n // If ElementRef exists but nativeElement is not yet available, retry\n if (!triggerEl) {\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => this._setupFloatingInternal(), 10);\n }\n return;\n }\n } else {\n triggerEl = trigger;\n }\n\n const dropdownEl = this.elRef.nativeElement;\n\n if (!triggerEl || !dropdownEl) {\n // Retry if elements not ready\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => this._setupFloatingInternal(), 10);\n }\n return;\n }\n\n // Compute initial position before showing dropdown to prevent flash\n this.reposition(triggerEl, dropdownEl)\n .then(() => {\n this.isPositioned = true;\n // Trigger change detection to update visibility binding\n this.cdr.markForCheck();\n })\n .catch((error) => {\n console.error('[PopoverDirective] Error computing position', error);\n });\n\n // Use autoUpdate to automatically reposition on scroll/resize. It must use\n // the SAME strategy as the initial call, or the first scroll undoes the fix.\n this.cleanupAutoUpdate = autoUpdate(triggerEl, dropdownEl, () => {\n void this.reposition(triggerEl as HTMLElement, dropdownEl);\n });\n }\n\n /**\n * Position `dropdownEl` against `triggerEl`.\n *\n * `strategy: 'fixed'` is required: the host binding pins this element to\n * `position: fixed`, so the coordinates must be viewport-relative. Without it\n * floating-ui returns offset-parent-relative numbers and the panel lands the\n * page's scroll offset away from its trigger.\n */\n private reposition(triggerEl: HTMLElement, dropdownEl: HTMLElement): Promise<void> {\n return computePosition(triggerEl, dropdownEl, {\n strategy: 'fixed',\n placement: this.placement,\n middleware: [offset(this.offset), flip(), shift({ padding: this.padding })],\n }).then(({ x, y }) => {\n Object.assign(dropdownEl.style, { left: `${x}px`, top: `${y}px` });\n });\n }\n\n private cleanup(): void {\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = undefined;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { Editor } from '@tiptap/core';\n\n/**\n * Character Count component for document editor footer\n * Displays character/word count with optional limit and color coding\n */\n@Component({\n selector: 'document-engine-character-count',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './character-count.component.html',\n styleUrls: ['./character-count.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CharacterCountComponent implements OnInit, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input() editor!: Editor;\n @Input() config?: Partial<DocumentEngineConfig>;\n @Input() mode: 'characters' | 'words' = 'characters';\n\n count = 0;\n limit: number | null = null;\n\n private updateCount = (): void => {\n if (!this.editor) {\n return;\n }\n\n // Get count from editor storage if available\n const characterCountStorage = this.editor.storage.characterCount;\n if (characterCountStorage) {\n if (this.mode === 'characters') {\n this.count = characterCountStorage.characters?.() || 0;\n } else {\n this.count = characterCountStorage.words?.() || 0;\n }\n } else {\n // Fallback: calculate from text\n const text = this.editor.getText();\n if (this.mode === 'characters') {\n this.count = text.length;\n } else {\n this.count = text.trim() ? text.trim().split(/\\s+/).length : 0;\n }\n }\n\n // Get limit from config\n const characterCountConfig = this.config?.characterCount;\n if (characterCountConfig && typeof characterCountConfig === 'object') {\n this.limit = characterCountConfig.limit || null;\n } else {\n this.limit = null;\n }\n\n this.cdr.markForCheck();\n };\n\n ngOnInit(): void {\n if (!this.editor) {\n return;\n }\n\n // Subscribe to update events to keep count in sync\n this.editor.on('update', this.updateCount);\n this.editor.on('transaction', this.updateCount);\n\n // Initialize count once\n this.updateCount();\n }\n\n ngOnDestroy(): void {\n if (this.editor) {\n this.editor.off('update', this.updateCount);\n this.editor.off('transaction', this.updateCount);\n }\n }\n\n isNearLimit(): boolean {\n if (!this.limit) {\n return false;\n }\n // Consider near limit when >= 90% of limit\n return this.count >= this.limit * 0.9 && this.count < this.limit;\n }\n\n isOverLimit(): boolean {\n if (!this.limit) {\n return false;\n }\n return this.count > this.limit;\n }\n}\n","<div class=\"document-engine-character-count\">\n <span\n class=\"document-engine-character-count__text\"\n [class.document-engine-character-count__text--muted]=\"!isNearLimit() && !isOverLimit()\"\n [class.document-engine-character-count__text--warning]=\"isNearLimit() && !isOverLimit()\"\n [class.document-engine-character-count__text--error]=\"isOverLimit()\"\n >\n <ng-container *ngIf=\"mode === 'characters'\">\n <ng-container *ngIf=\"limit; else noLimit\"> {{ count }} / {{ limit }} characters. </ng-container>\n <ng-template #noLimit> {{ count }} {{ count === 1 ? 'character' : 'characters' }}. </ng-template>\n </ng-container>\n <ng-container *ngIf=\"mode === 'words'\"> {{ count }} {{ count === 1 ? 'word' : 'words' }}. </ng-container>\n </span>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { Editor } from '@tiptap/core';\nimport { CharacterCountComponent } from '../character-count/character-count.component';\n\n/**\n * Footer component for document editor\n * Container for footer components like character count\n */\n@Component({\n selector: 'document-engine-footer',\n standalone: true,\n imports: [CommonModule, CharacterCountComponent],\n templateUrl: './footer.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FooterComponent {\n @Input() editor!: Editor;\n @Input() config?: Partial<DocumentEngineConfig>;\n // @Input() editable = true;\n\n hasCharacterCount(): boolean {\n const config = this.config ?? {};\n return config.characterCount !== false;\n }\n}\n","<div class=\"document-engine-document-editor__footer\">\n <div class=\"document-engine-document-editor__footer-content\">\n <div class=\"document-engine-document-editor__footer-left\">\n <!-- Additional footer components can be added here -->\n </div>\n\n <div class=\"document-engine-document-editor__footer-right\">\n <document-engine-character-count\n *ngIf=\"hasCharacterCount()\"\n [editor]=\"editor\"\n [config]=\"config\"\n mode=\"characters\"\n ></document-engine-character-count>\n </div>\n </div>\n</div>\n","import { Color } from '@phuong-tran-redoc/document-engine-core';\n\nexport const COLORS: Color[] = Color.fromArray([\n { name: 'Black', value: '#000000', type: 'hex' },\n { name: 'Dim gray', value: '#696969', type: 'hex' },\n { name: 'Light gray', value: '#d3d3d3', type: 'hex' },\n { name: 'White', value: '#ffffff', type: 'hex' },\n { name: 'Transparent', value: 'transparent', type: 'hex' },\n\n // row 2\n { name: 'Red', value: '#ff0000', type: 'hex' },\n { name: 'Orange', value: '#ffa500', type: 'hex' },\n { name: 'Yellow', value: '#ffff00', type: 'hex' },\n { name: 'Light green', value: '#90ee90', type: 'hex' },\n { name: 'Green', value: '#008000', type: 'hex' },\n\n // row 3\n { name: 'Aquamarine', value: '#7fffd4', type: 'hex' },\n { name: 'Turquoise', value: '#40e0d0', type: 'hex' },\n { name: 'Lightblue', value: '#add8e6', type: 'hex' },\n { name: 'Blue', value: '#0000ff', type: 'hex' },\n { name: 'Purple', value: '#800080', type: 'hex' },\n]);\n","import { Directive, HostBinding, Input } from '@angular/core';\n\n/**\n * Custom button directive matching React button component styles\n * Supports variants: default, destructive, outline, secondary, ghost, link\n * Supports sizes: default, sm, lg, icon, icon-sm, icon-lg\n *\n * Usage:\n * - <button documentEngineButton>Text</button> - secondary variant, default size\n * - <button documentEngineButton=\"filled\">Text</button> - default variant (primary)\n * - <button documentEngineButton variant=\"outline\">Text</button> - outline variant\n * - <button documentEngineButton variant=\"icon\" size=\"icon-sm\">Icon</button> - icon button\n */\n@Directive({\n selector: 'button[documentEngineButton]',\n standalone: true,\n host: {\n type: 'button',\n },\n})\nexport class ButtonDirective {\n @Input() variant: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link' = 'ghost';\n @Input() size: 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm' | 'icon-lg' = 'default';\n\n @HostBinding('class')\n get buttonClasses(): string {\n const classes: string[] = ['btn'];\n\n classes.push(`btn--${this.variant}`);\n classes.push(`btn--size-${this.size}`);\n\n return classes.join(' ');\n }\n}\n","export const DEFAULT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect></svg>`;\n\nexport const CHECK = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"100%\" height=\"100%\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/></svg>`;\n\n// Official icons\nexport const UNDO = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M280-200v-80h284q63 0 109.5-40T720-420q0-60-46.5-100T564-560H312l104 104-56 56-200-200 200-200 56 56-104 104h252q97 0 166.5 63T800-420q0 94-69.5 157T564-200H280Z\"/></svg>`;\n\nexport const REDO = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M396-200q-97 0-166.5-63T160-420q0-94 69.5-157T396-640h252L544-744l56-56 200 200-200 200-56-56 104-104H396q-63 0-109.5 40T240-420q0 60 46.5 100T396-280h284v80H396Z\"/></svg>`;\n\nexport const FORMAT_SIZE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M560-160v-520H360v-120h520v120H680v520H560Zm-360 0v-320H80v-120h360v120H320v320H200Z\"/></svg>`;\n\nexport const ARROW_DROP_DOWN = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M480-360 280-560h400L480-360Z\"/></svg>`;\n\nexport const FORMAT_LINE_SPACING = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M240-160 80-320l56-56 64 62v-332l-64 62-56-56 160-160 160 160-56 56-64-62v332l64-62 56 56-160 160Zm240-40v-80h400v80H480Zm0-240v-80h400v80H480Zm0-240v-80h400v80H480Z\"/></svg>`;\n\nexport const MATCH_CASE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m131-252 165-440h79l165 440h-76l-39-112H247l-40 112h-76Zm139-176h131l-64-182h-4l-63 182Zm395 186q-51 0-81-27.5T554-342q0-44 34.5-72.5T677-443q23 0 45 4t38 11v-12q0-29-20.5-47T685-505q-23 0-42 9.5T610-468l-47-35q24-29 54.5-43t68.5-14q69 0 103 32.5t34 97.5v178h-63v-37h-4q-14 23-38 35t-53 12Zm12-54q35 0 59.5-24t24.5-56q-14-8-33.5-12.5T689-393q-32 0-50 14t-18 37q0 20 16 33t40 13Z\"/></svg>`;\n\nexport const FORMAT_CLEAR = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"m528-546-93-93-121-121h486v120H568l-40 94ZM792-56 460-388l-80 188H249l119-280L56-792l56-56 736 736-56 56Z\"/></svg>`;\n\nexport const FORMAT_COLOR_TEXT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M80 0v-160h800V0H80Zm140-280 210-560h100l210 560h-96l-50-144H368l-52 144h-96Zm176-224h168l-82-232h-4l-82 232Z\"/></svg>`;\n\nexport const FORMAT_COLOR_FILL = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m247-904 57-56 343 343q23 23 23 57t-23 57L457-313q-23 23-57 23t-57-23L153-503q-23-23-23-57t23-57l190-191-96-96Zm153 153L209-560h382L400-751Zm360 471q-33 0-56.5-23.5T680-360q0-21 12.5-45t27.5-45q9-12 19-25t21-25q11 12 21 25t19 25q15 21 27.5 45t12.5 45q0 33-23.5 56.5T760-280ZM80 0v-160h800V0H80Z\"/></svg>`;\n\nexport const FORMAT_BOLD = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z\"/></svg>`;\n\nexport const FORMAT_ITALIC = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100H200Z\"/></svg>`;\n\nexport const FORMAT_UNDERLINE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-120v-80h560v80H200Zm280-160q-101 0-157-63t-56-167v-330h103v336q0 56 28 91t82 35q54 0 82-35t28-91v-336h103v330q0 104-56 167t-157 63Z\"/></svg>`;\n\nexport const FORMAT_STRIKETHROUGH = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M80-400v-80h800v80H80Zm340-160v-120H200v-120h560v120H540v120H420Zm0 400v-160h120v160H420Z\"/></svg>`;\n\nexport const SUBSCRIPT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M760-160v-80q0-17 11.5-28.5T800-280h80v-40H760v-40h120q17 0 28.5 11.5T920-320v40q0 17-11.5 28.5T880-240h-80v40h120v40H760Zm-525-80 185-291-172-269h106l124 200h4l123-200h107L539-531l186 291H618L482-457h-4L342-240H235Z\"/></svg>`;\n\nexport const SUPERSCRIPT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M760-600v-80q0-17 11.5-28.5T800-720h80v-40H760v-40h120q17 0 28.5 11.5T920-760v40q0 17-11.5 28.5T880-680h-80v40h120v40H760ZM235-160l185-291-172-269h106l124 200h4l123-200h107L539-451l186 291H618L482-377h-4L342-160H235Z\"/></svg>`;\n\nexport const CODE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M320-240 80-480l240-240 57 57-184 184 183 183-56 56Zm320 0-57-57 184-184-183-183 56-56 240 240-240 240Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_LEFT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_CENTER = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm160-160v-80h400v80H280ZM120-440v-80h720v80H120Zm160-160v-80h400v80H280ZM120-760v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_RIGHT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_JUSTIFY = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_INDENT_DECREASE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm320-160v-80h400v80H440Zm0-160v-80h400v80H440Zm0-160v-80h400v80H440ZM120-760v-80h720v80H120Zm160 440L120-480l160-160v320Z\"/></svg>`;\n\nexport const FORMAT_INDENT_INCREASE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm320-160v-80h400v80H440Zm0-160v-80h400v80H440Zm0-160v-80h400v80H440ZM120-760v-80h720v80H120Zm0 440v-320l160 160-160 160Z\"/></svg>`;\n\nexport const FORMAT_LIST_BULLETED = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z\"/></svg>`;\n\nexport const FORMAT_LIST_NUMBERED = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-80v-60h100v-30h-60v-60h60v-30H120v-60h120q17 0 28.5 11.5T280-280v40q0 17-11.5 28.5T240-200q17 0 28.5 11.5T280-160v40q0 17-11.5 28.5T240-80H120Zm0-280v-110q0-17 11.5-28.5T160-510h60v-30H120v-60h120q17 0 28.5 11.5T280-560v70q0 17-11.5 28.5T240-450h-60v30h100v60H120Zm60-280v-180h-60v-60h120v240h-60Zm180 440v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360Z\"/></svg>`;\n\nexport const FORMAT_QUOTE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m228-240 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T458-480L320-240h-92Zm360 0 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T818-480L680-240h-92ZM320-500q25 0 42.5-17.5T380-560q0-25-17.5-42.5T320-620q-25 0-42.5 17.5T260-560q0 25 17.5 42.5T320-500Zm360 0q25 0 42.5-17.5T740-560q0-25-17.5-42.5T680-620q-25 0-42.5 17.5T620-560q0 25 17.5 42.5T680-500Zm0-60Zm-360 0Z\"/></svg>`;\n\nexport const TABLE_ROWS = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M760-200v-120H200v120h560Zm0-200v-160H200v160h560Zm0-240v-120H200v120h560ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Z\"/></svg>`;\n\nexport const LINK = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z\"/></svg>`;\n\nexport const LINK_OFF = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m770-302-60-62q40-11 65-42.5t25-73.5q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 57-29.5 105T770-302ZM634-440l-80-80h86v80h-6ZM792-56 56-792l56-56 736 736-56 56ZM440-280H280q-83 0-141.5-58.5T80-480q0-69 42-123t108-71l74 74h-24q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h65l79 80H320Z\"/></svg>`;\n\nexport const SPECIAL_CHARACTER = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-120h200q-84-45-132-125t-48-175q0-142 99-241t241-99q142 0 241 99t99 241q0 95-48 175T640-240h200v120H520v-204q78-14 129-75t51-141q0-92-64-156t-156-64q-92 0-156 64t-64 156q0 80 51 141t129 75v204H120Z\"/></svg>`;\n\nexport const CLEAR_ALL = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-280v-80h560v80H120Zm80-160v-80h560v80H200Zm80-160v-80h560v80H280Z\"/></svg>`;\n\nexport const INSERT_PAGE_BREAK = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M240-80q-33 0-56.5-23.5T160-160v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-80H240Zm-80-440v-280q0-33 23.5-56.5T240-880h320l240 240v120h-80v-80H520v-200H240v280h-80Zm200 160v-80h240v80H360Zm320 0v-80h240v80H680Zm-640 0v-80h240v80H40Zm440-160Zm0 240Z\"/></svg>`;\n\nexport const MARKDOWN = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m640-360 120-120-42-43-48 48v-125h-60v125l-48-48-42 43 120 120ZM160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-480H160v480Zm0 0v-480 480Zm60-120h60v-180h40v120h60v-120h40v180h60v-200q0-17-11.5-28.5T440-600H260q-17 0-28.5 11.5T220-560v200Z\"/></svg>`;\n\nexport const DYNAMIC_FORM = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M160-520q-33 0-56.5-23.5T80-600v-120q0-33 23.5-56.5T160-800h360v280H160Zm0-80h280v-120H160v120Zm0 440q-33 0-56.5-23.5T80-240v-120q0-33 23.5-56.5T160-440h440v280H160Zm0-80h360v-120H160v120Zm520 80v-360h-80v-280h280l-80 200h80L680-160ZM190-270h60v-60h-60v60Zm0-360h60v-60h-60v60Zm-30 30v-120 120Zm0 360v-120 120Z\"/></svg>`;\n\nexport const PHOTO = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm40-80h480L570-480 450-320l-90-120-120 160Zm-40 80v-560 560Z\"/></svg>`;\n\nexport const PRINT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M640-640v-120H320v120h-80v-200h480v200h-80Zm-480 80h640-640Zm560 100q17 0 28.5-11.5T760-500q0-17-11.5-28.5T720-540q-17 0-28.5 11.5T680-500q0 17 11.5 28.5T720-460Zm-80 260v-160H320v160h320Zm80 80H240v-160H80v-240q0-51 35-85.5t85-34.5h560q51 0 85.5 34.5T880-520v240H720v160Zm80-240v-160q0-17-11.5-28.5T760-560H200q-17 0-28.5 11.5T160-520v160h80v-80h480v80h80Z\"/></svg>`;\n\nexport const ARCHIVE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m480-240 160-160-56-56-64 64v-168h-80v168l-64-64-56 56 160 160ZM200-640v440h560v-440H200Zm0 520q-33 0-56.5-23.5T120-200v-499q0-14 4.5-27t13.5-24l50-61q11-14 27.5-21.5T250-840h460q18 0 34.5 7.5T772-811l50 61q9 11 13.5 24t4.5 27v499q0 33-23.5 56.5T760-120H200Zm16-600h528l-34-40H250l-34 40Zm264 300Z\"/></svg>`;\n\n// Common Icons\nexport const EDIT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-200h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T817-647L290-120H120Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z\"/></svg>`;\n\nexport const SETTINGS = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm70-80h79l14-106q31-8 57.5-23.5T639-327l99 41 39-68-86-65q5-14 7-29.5t2-31.5q0-16-2-31.5t-7-29.5l86-65-39-68-99 42q-22-23-48.5-38.5T533-694l-13-106h-79l-14 106q-31 8-57.5 23.5T321-633l-99-41-39 68 86 64q-5 15-7 30t-2 32q0 16 2 31t7 30l-86 65 39 68 99-42q22 23 48.5 38.5T427-266l13 106Zm42-180q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Zm-2-140Z\"/></svg>`;\n\nexport const SEARCH = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z\"/></svg>`;\n\nexport const SEARCH_OFF = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M280-80q-83 0-141.5-58.5T80-280q0-83 58.5-141.5T280-480q83 0 141.5 58.5T480-280q0 83-58.5 141.5T280-80Zm544-40L568-376q-12-13-25.5-26.5T516-428q38-24 61-64t23-88q0-75-52.5-127.5T420-760q-75 0-127.5 52.5T240-580q0 6 .5 11.5T242-557q-18 2-39.5 8T164-535q-2-11-3-22t-1-23q0-109 75.5-184.5T420-840q109 0 184.5 75.5T680-580q0 43-13.5 81.5T629-428l251 252-56 56Zm-615-61 71-71 70 71 29-28-71-71 71-71-28-28-71 71-71-71-28 28 71 71-71 71 28 28Z\"/></svg>`;\n\nexport const DESCRIPTION = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\"/></svg>`;\n\nexport const CLOSE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>`;\n\nexport const VERTICAL_ALIGN_TOP = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M160-760v-80h640v80H160Zm280 640v-408L336-424l-56-56 200-200 200 200-56 56-104-104v408h-80Z\"/></svg>`;\n\nexport const VERTICAL_ALIGN_CENTER = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M440-80v-168l-64 64-56-56 160-160 160 160-56 56-64-64v168h-80ZM160-440v-80h640v80H160Zm320-120L320-720l56-56 64 64v-168h80v168l64-64 56 56-160 160Z\"/></svg>`;\n\nexport const VERTICAL_ALIGN_BOTTOM = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M160-120v-80h640v80H160Zm320-160L280-480l56-56 104 104v-408h80v408l104-104 56 56-200 200Z\"/></svg>`;\n\n// Custom SVG\nexport const RESTRICT_EDIT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <g transform=\"translate(10 10) scale(0.8) translate(-10 -10)\">\n <path d=\"M6.25 16a.75.75 0 1 1 0 1.5H.75a.75.75 0 1 1 0-1.5zm0-5a.75.75 0 1 1 0 1.5H.75a.75.75 0 1 1 0-1.5zm3-5a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1 0-1.5zm6-5a.75.75 0 1 1 0 1.5H.75a.75.75 0 0 1 0-1.5zm.25 5.5a3.5 3.5 0 0 1 3.143 1.959.75.75 0 0 1-1.36.636A2 2 0 0 0 13.5 10v2H19a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1v-2l.005-.192A3.5 3.5 0 0 1 15.5 6.5m0 7.5a.5.5 0 0 0-.492.41L15 14.5v2a.5.5 0 0 0 .992.09L16 16.5v-2a.5.5 0 0 0-.5-.5\">\n </path>\n </g>\n</svg>\n`;\n\nexport const TABLE_CELL_PROPERTY = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"m11.105 18-.17 1H2.5A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1h15A1.5 1.5 0 0 1 19 2.5v9.975l-.85-.124-.15-.302V8h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5zM2 12h5V8H2zm10-4H8v4h4zM2 2v5h5V2zm0 16h5v-5H2zM13 7h5V2h-5zM8 2v5h4V2z\" opacity=\".6\"></path>\n <path d=\"m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43zM13 6a1 1 0 0 1 1 1v3.172a2 2 0 0 0-.293.443l-.858 1.736-1.916.28-.151.027A1.98 1.98 0 0 0 9.315 14H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm-1 2H8v4h4z\"></path>\n</svg>\n`;\n\nexport const TABLE_COLUMN = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1M2 2v16h16V2z\" opacity=\".6\"></path>\n <path d=\"M18 7v1H2V7zm0 5v1H2v-1z\" opacity=\".6\"></path>\n <path d=\"M14 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1m-2 1H8v4h4zm0 6H8v4h4zm0 6H8v4h4z\"></path>\n</svg>\n`;\n\nexport const TABLE_MERGE_CELL = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1M2 2v16h16V2z\" opacity=\".6\"></path>\n <path d=\"M7 2h1v16H7zm5 0h1v7h-1zm6 5v1H2V7zM8 12v1H2v-1z\" opacity=\".6\"></path>\n <path d=\"M7 7h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1m1 2v9h10V9z\"></path>\n</svg>\n`;\n\nexport const TABLE_PROPERTY = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2zm4 6H8v4h4z\" opacity=\".6\"></path>\n <path d=\"m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2 2 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2z\"></path>\n</svg>\n`;\n\nexport const TABLE_ROW = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1M2 2v16h16V2z\" opacity=\".6\"></path>\n <path d=\"M7 2h1v16H7zm5 0h1v16h-1z\" opacity=\".6\"></path>\n <path d=\"M1 6h18a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1m1 2v4h4V8zm6 0v4h4V8zm6 0v4h4V8z\"></path>\n</svg>\n`;\n","import { inject, Injectable } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport * as IconConstants from './icon.constant';\n\n/**\n * Icon registry service for managing SVG icons\n * Similar to Angular Material's MatIconRegistry\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class IconRegistryService {\n private sanitizer = inject(DomSanitizer);\n private icons: Map<string, string> = new Map();\n\n constructor() {\n this.registerDefaultIcons();\n }\n\n /**\n * Register a new icon with its SVG content\n */\n registerIcon(name: string, svgContent: string): void {\n if (this.icons.has(name)) {\n throw new Error(`Icon ${name} already registered`);\n }\n\n this.icons.set(name, svgContent);\n }\n\n /**\n * Get icon SVG content by name\n * Returns SafeHtml for use in templates with [innerHTML]\n */\n getIcon(name: string): SafeHtml {\n const icon = this.icons.get(name);\n\n if (!icon) {\n console.warn(`Icon ${name} not registered`);\n return this.sanitizer.bypassSecurityTrustHtml(IconConstants.DEFAULT);\n }\n\n return this.sanitizer.bypassSecurityTrustHtml(icon);\n }\n\n /**\n * Get raw icon SVG string by name\n * Returns string for direct DOM manipulation\n */\n getIconString(name: string): string {\n const icon = this.icons.get(name);\n\n if (!icon) {\n console.warn(`Icon ${name} not registered`);\n return IconConstants.DEFAULT;\n }\n\n return icon;\n }\n\n /**\n * Register default icons used in the application\n */\n private registerDefaultIcons(): void {\n // Basic icons\n this.registerIcon('check', IconConstants.CHECK);\n this.registerIcon('undo', IconConstants.UNDO);\n this.registerIcon('redo', IconConstants.REDO);\n\n // Formatting icons\n this.registerIcon('format_size', IconConstants.FORMAT_SIZE);\n this.registerIcon('arrow_drop_down', IconConstants.ARROW_DROP_DOWN);\n this.registerIcon('format_line_spacing', IconConstants.FORMAT_LINE_SPACING);\n this.registerIcon('match_case', IconConstants.MATCH_CASE);\n this.registerIcon('format_clear', IconConstants.FORMAT_CLEAR);\n this.registerIcon('format_color_text', IconConstants.FORMAT_COLOR_TEXT);\n this.registerIcon('format_color_fill', IconConstants.FORMAT_COLOR_FILL);\n this.registerIcon('format_bold', IconConstants.FORMAT_BOLD);\n this.registerIcon('format_italic', IconConstants.FORMAT_ITALIC);\n this.registerIcon('format_underline', IconConstants.FORMAT_UNDERLINE);\n this.registerIcon('format_strikethrough', IconConstants.FORMAT_STRIKETHROUGH);\n this.registerIcon('subscript', IconConstants.SUBSCRIPT);\n this.registerIcon('superscript', IconConstants.SUPERSCRIPT);\n this.registerIcon('code', IconConstants.CODE);\n\n // Alignment icons\n this.registerIcon('format_align_left', IconConstants.FORMAT_ALIGN_LEFT);\n this.registerIcon('format_align_center', IconConstants.FORMAT_ALIGN_CENTER);\n this.registerIcon('format_align_right', IconConstants.FORMAT_ALIGN_RIGHT);\n this.registerIcon('format_align_justify', IconConstants.FORMAT_ALIGN_JUSTIFY);\n this.registerIcon('format_indent_decrease', IconConstants.FORMAT_INDENT_DECREASE);\n this.registerIcon('format_indent_increase', IconConstants.FORMAT_INDENT_INCREASE);\n\n // List icons\n this.registerIcon('format_list_bulleted', IconConstants.FORMAT_LIST_BULLETED);\n this.registerIcon('format_list_numbered', IconConstants.FORMAT_LIST_NUMBERED);\n this.registerIcon('format_quote', IconConstants.FORMAT_QUOTE);\n\n // Table icons\n this.registerIcon('table_rows', IconConstants.TABLE_ROWS);\n this.registerIcon('table_cell_property', IconConstants.TABLE_CELL_PROPERTY);\n this.registerIcon('table_column', IconConstants.TABLE_COLUMN);\n this.registerIcon('table_merge_cell', IconConstants.TABLE_MERGE_CELL);\n this.registerIcon('table_property', IconConstants.TABLE_PROPERTY);\n this.registerIcon('table_row', IconConstants.TABLE_ROW);\n\n // Other icons\n this.registerIcon('link', IconConstants.LINK);\n this.registerIcon('link_off', IconConstants.LINK_OFF);\n this.registerIcon('special_character', IconConstants.SPECIAL_CHARACTER);\n this.registerIcon('clear_all', IconConstants.CLEAR_ALL);\n this.registerIcon('insert_page_break', IconConstants.INSERT_PAGE_BREAK);\n this.registerIcon('markdown', IconConstants.MARKDOWN);\n this.registerIcon('dynamic_form', IconConstants.DYNAMIC_FORM);\n this.registerIcon('photo', IconConstants.PHOTO);\n this.registerIcon('print', IconConstants.PRINT);\n this.registerIcon('archive', IconConstants.ARCHIVE);\n this.registerIcon('restrict_edit', IconConstants.RESTRICT_EDIT);\n\n this.registerIcon('edit', IconConstants.EDIT);\n this.registerIcon('settings', IconConstants.SETTINGS);\n this.registerIcon('search', IconConstants.SEARCH);\n this.registerIcon('search_off', IconConstants.SEARCH_OFF);\n this.registerIcon('description', IconConstants.DESCRIPTION);\n this.registerIcon('close', IconConstants.CLOSE);\n this.registerIcon('vertical_align_top', IconConstants.VERTICAL_ALIGN_TOP);\n this.registerIcon('vertical_align_center', IconConstants.VERTICAL_ALIGN_CENTER);\n this.registerIcon('vertical_align_bottom', IconConstants.VERTICAL_ALIGN_BOTTOM);\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n SimpleChanges,\n ViewEncapsulation,\n} from '@angular/core';\nimport { IconRegistryService } from './icon-registry.service';\n\n@Component({\n selector: 'document-engine-icon',\n standalone: true,\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class IconComponent {\n @Input()\n set name(value: string) {\n const svgContent = this.iconRegistry.getIconString(value);\n const hostElement = this.elementRef.nativeElement;\n\n // Set innerHTML to render SVG\n hostElement.innerHTML = svgContent;\n // this.cdr.markForCheck();\n }\n\n // private cdr = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private iconRegistry = inject(IconRegistryService);\n\n // ngOnChanges(changes: SimpleChanges): void {\n // if (changes['name']) {\n // const svgContent = this.iconRegistry.getIconString(this.name);\n // const hostElement = this.elementRef.nativeElement;\n\n // // Set innerHTML to render SVG\n // hostElement.innerHTML = svgContent;\n // this.cdr.markForCheck();\n // }\n // }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color } from '@phuong-tran-redoc/document-engine-core';\nimport { ButtonDirective } from './button';\nimport { IconComponent } from './icon';\n\n@Component({\n standalone: true,\n selector: 'document-engine-color-picker',\n imports: [CommonModule, FormsModule, ButtonDirective, IconComponent],\n template: `\n <div class=\"document-engine-color-picker\">\n <!-- Color Palette -->\n <div class=\"palette\">\n <div class=\"palette__item\" *ngFor=\"let color of colorPalette; trackBy: trackByColorValue\">\n <button\n type=\"button\"\n class=\"swatch\"\n [style.background-color]=\"color.value\"\n [attr.data-color]=\"color.value\"\n (click)=\"colorSelected.emit(color)\"\n [attr.title]=\"color.name\"\n >\n <div class=\"swatch__transparent\" *ngIf=\"color.value === 'transparent'\"></div>\n </button>\n\n <button\n *ngIf=\"isActive(color)\"\n type=\"button\"\n class=\"swatch__active-indicator\"\n (click)=\"colorRemoved.emit()\"\n [attr.title]=\"'Unset color'\"\n aria-label=\"Unset color\"\n >\n <document-engine-icon name=\"check\"></document-engine-icon>\n </button>\n </div>\n </div>\n\n <!-- Used Colors -->\n <div class=\"used\" *ngIf=\"usedColors && usedColors.length > 0\">\n <div class=\"used__label\">Used in document</div>\n <div class=\"used__list\">\n <button\n type=\"button\"\n class=\"swatch used__swatch\"\n *ngFor=\"let color of usedColors; trackBy: trackByColorValue\"\n [style.background-color]=\"color.value\"\n (click)=\"colorSelected.emit(color)\"\n [attr.title]=\"color.name\"\n ></button>\n </div>\n </div>\n\n <!-- Custom Color Input -->\n <div class=\"custom\">\n <div class=\"custom__label\">Custom</div>\n <div class=\"custom__controls\">\n <input type=\"color\" #colorInput class=\"custom__picker\" [(ngModel)]=\"customColor\" />\n\n <input\n type=\"text\"\n #hexInput=\"ngModel\"\n class=\"custom__hex\"\n placeholder=\"#000000\"\n required\n pattern=\"#([0-9a-fA-F]{6})\"\n [(ngModel)]=\"customColor\"\n />\n\n <button\n type=\"button\"\n documentEngineButton\n variant=\"default\"\n (click)=\"selectCustomColor()\"\n [disabled]=\"hexInput.invalid\"\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ColorPickerComponent {\n @Input() colorPalette: Color[] = [];\n @Input() usedColors: Color[] = [];\n @Input() activeColor: Color | null = null;\n\n @Output() colorSelected = new EventEmitter<Color>();\n @Output() colorRemoved = new EventEmitter<void>();\n\n customColor: string | null = null;\n\n trackByColorValue = (_: number, c: Color) => c?.value;\n\n isActive(color: Color): boolean {\n const active = this.activeColor;\n return active ? active.equals(color) : false;\n }\n\n selectCustomColor(): void {\n if (!this.customColor) {\n return;\n }\n this.colorSelected.emit(Color.from(this.customColor));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Color, normalizeColor } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { COLORS } from '../../constants/color.constant';\nimport { ButtonDirective } from '../../ui/button';\nimport { ColorPickerComponent } from '../../ui/color-picker';\n\n/**\n * Color picker view for bubble menu\n * Shows color palette for text and background colors\n */\n@Component({\n selector: 'document-engine-color-picker-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, ColorPickerComponent],\n template: `\n <div class=\"color-picker-view\">\n <!-- Title -->\n <div class=\"color-picker-view__title\">{{ colorType === 'text' ? 'Text Color' : 'Background Color' }}</div>\n\n <!-- Color Picker Component -->\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n [activeColor]=\"activeColor\"\n [usedColors]=\"usedColors\"\n (colorSelected)=\"applyColor($event)\"\n (colorRemoved)=\"removeColor()\"\n ></document-engine-color-picker>\n\n <!-- Actions -->\n <div class=\"color-picker-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"destructive\" (click)=\"removeColor()\">Remove Color</button>\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./color-picker-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ColorPickerViewComponent implements BubbleMenuViewContent<Record<string, unknown>> {\n editor?: Editor;\n colorType: 'text' | 'fill' = 'text';\n usedColors: Color[] = [];\n activeColor: Color | null = null;\n\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n // Basic color palette\n colorPalette = COLORS;\n\n onActivate(attrs: Record<string, unknown>): void {\n this.colorType = (attrs['type'] as 'text' | 'fill') || 'text';\n this.usedColors = this.collectUsedColors(this.colorType);\n this.activeColor = this.getActiveColor(this.colorType);\n }\n\n applyColor(color: Color | null): void {\n if (!this.editor || !color) return;\n\n if (this.colorType === 'text') {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).setColor(color.value).run();\n } else {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).setBackgroundColor(color.value).run();\n }\n\n this.close?.();\n }\n\n removeColor(): void {\n if (!this.editor) return;\n\n if (this.colorType === 'text') {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).unsetColor().run();\n } else {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).unsetBackgroundColor().run();\n }\n\n this.close?.();\n }\n\n private getActiveColor(type: 'text' | 'fill'): Color | null {\n const attr = type === 'text' ? 'color' : 'backgroundColor';\n const attrs = this.editor?.getAttributes('textStyle');\n const color = (attrs?.[attr] as string | undefined) || null;\n if (!color) return null;\n const normalized = normalizeColor(color);\n return normalized ? Color.from(normalized) : null;\n }\n\n private collectUsedColors(type: 'text' | 'fill'): Color[] {\n try {\n const json = this.editor?.getJSON();\n const colors = new Set<string>();\n const attr = type === 'text' ? 'color' : 'backgroundColor';\n\n type ProseMirrorNode = {\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n content?: ProseMirrorNode[];\n };\n\n const walk = (node: ProseMirrorNode | undefined): void => {\n if (!node) return;\n if (node.marks) {\n for (const m of node.marks) {\n const attrs = m.attrs as Record<string, unknown> | undefined;\n if (m.type === 'textStyle' && attrs && typeof attrs[attr] === 'string') {\n colors.add(attrs[attr] as string);\n }\n }\n }\n if (node.content) {\n for (const child of node.content) walk(child);\n }\n };\n\n walk(json as unknown as ProseMirrorNode);\n\n const arr = Array.from(colors)\n .map((c) => normalizeColor(c))\n .filter((c): c is string => !!c)\n .filter((c) => c.toLowerCase() !== '#000000' && c.toLowerCase() !== '#ffffff')\n .map((c) => Color.from(c));\n\n return Array.from(new Map(arr.map((c) => [c.value, c])).values());\n } catch {\n return [];\n }\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { ColorPickerViewComponent } from '../views/color-picker-view/color-picker-view';\n\nexport const ColorBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'ColorBubbleMenu',\n views: [\n {\n id: 'picker',\n component: ColorPickerViewComponent,\n label: 'Color Picker',\n isDefault: true,\n },\n ],\n};\n","import { Directive, HostBinding, Input } from '@angular/core';\n\n/**\n * Input directive matching shadcn Input component styles\n * Supports all standard input attributes and types\n *\n * Usage:\n * <input documentEngineInput type=\"text\" placeholder=\"Enter text\" />\n * <input documentEngineInput type=\"email\" class=\"custom-class\" />\n */\n@Directive({\n selector: 'input[documentEngineInput]',\n standalone: true,\n})\nexport class InputDirective {\n @Input() class = '';\n\n @HostBinding('class')\n get inputClasses(): string {\n return ['document-engine-input', this.class].filter(Boolean).join(' ');\n }\n}\n","import { Directive, HostBinding, Input } from '@angular/core';\n\n/**\n * Label directive for form fields\n *\n * Usage:\n * <label documentEngineLabel for=\"input-id\">Label text</label>\n */\n@Directive({\n selector: 'label[documentEngineLabel]',\n standalone: true,\n})\nexport class LabelDirective {\n @Input() class = '';\n\n @HostBinding('class')\n get labelClasses(): string {\n return ['document-engine-label', this.class].filter(Boolean).join(' ');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFieldCategory, DynamicFieldItem } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\n\n/**\n * Dynamic fields view for bubble menu\n * Shows categorized dynamic fields for insertion into the editor\n */\n@Component({\n selector: 'document-engine-dynamic-fields-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, IconComponent],\n template: `\n <div class=\"dynamic-fields-view\">\n <!-- Title -->\n <div class=\"dynamic-fields-view__header\">Dynamic Fields</div>\n\n <!-- Search Bar -->\n <div class=\"dynamic-fields-view__search\">\n <div class=\"dynamic-fields-view__search-field\">\n <label documentEngineLabel for=\"search-input\">Search merge field</label>\n <div class=\"dynamic-fields-view__search-input-wrapper\">\n <document-engine-icon name=\"search\" class=\"dynamic-fields-view__search-icon\"></document-engine-icon>\n <input\n documentEngineInput\n id=\"search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search fields...\"\n aria-label=\"Search dynamic fields\"\n />\n </div>\n </div>\n </div>\n\n <!-- Fields List -->\n <div class=\"dynamic-fields-view__list-container\">\n <div *ngIf=\"filteredCategories.length > 0; else noResults\" class=\"dynamic-fields-view__list\">\n <div *ngFor=\"let category of filteredCategories; let isLast = last\" class=\"dynamic-fields-view__category\">\n <div class=\"dynamic-fields-view__category-header\">{{ category.label }}</div>\n\n <div class=\"dynamic-fields-view__fields\">\n <button\n *ngFor=\"let field of category.fields\"\n type=\"button\"\n class=\"dynamic-fields-view__field-item\"\n (click)=\"insertDynamicField(field)\"\n [attr.aria-label]=\"field.label + (field.description ? ' - ' + field.description : '')\"\n [title]=\"field.description || field.label\"\n >\n <div class=\"dynamic-fields-view__field-label\">{{ field.label }}</div>\n <div *ngIf=\"field.description\" class=\"dynamic-fields-view__field-description\">\n {{ field.description }}\n </div>\n </button>\n </div>\n\n <div *ngIf=\"!isLast\" class=\"dynamic-fields-view__divider\"></div>\n </div>\n </div>\n\n <ng-template #noResults>\n <div class=\"dynamic-fields-view__empty\">\n <document-engine-icon name=\"search_off\" class=\"dynamic-fields-view__empty-icon\"></document-engine-icon>\n <div class=\"dynamic-fields-view__empty-text\">No fields found matching \"{{ searchQuery }}\"</div>\n </div>\n </ng-template>\n </div>\n\n <!-- Actions -->\n <div class=\"dynamic-fields-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./dynamic-fields-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicFieldsViewComponent implements BubbleMenuViewContent<Record<string, unknown>>, OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n searchQuery = '';\n originalFields: DynamicFieldItem[] = [];\n originalCategories: DynamicFieldCategory[] = [];\n\n // Reactive form control for search\n searchControl = new FormControl('');\n private destroy$ = new Subject<void>();\n\n onActivate(attrs: Record<string, unknown>): void {\n const categories = attrs['categories'] as DynamicFieldCategory[];\n if (!categories) throw new Error('Categories are required');\n this.originalCategories = categories;\n this.originalFields = categories.flatMap((category) => category.fields);\n this.searchQuery = '';\n this.searchControl.setValue('');\n this.cdr.markForCheck();\n }\n\n ngOnInit(): void {\n // Set up reactive form subscription with debounce\n this.searchControl.valueChanges\n .pipe(debounceTime(200), distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((value) => {\n this.searchQuery = value || '';\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Getter that filters categories and fields based on search query\n */\n get filteredCategories(): DynamicFieldCategory[] {\n const query = this.searchQuery.toLowerCase().trim();\n\n if (!query) return this.originalCategories;\n\n // Filter categories and fields based on search query\n return this.originalCategories\n .map((category) => {\n const categoryFields = category.fields.filter(\n (field) =>\n field.label.toLowerCase().includes(query) ||\n field.description?.toLowerCase().includes(query) ||\n field.id.toLowerCase().includes(query)\n );\n\n if (categoryFields.length > 0) {\n return { key: category.key, label: category.label, fields: categoryFields };\n }\n\n return null;\n })\n .filter((category): category is DynamicFieldCategory => category !== null);\n }\n\n /**\n * Insert a dynamic field into the editor\n */\n insertDynamicField(field: DynamicFieldItem): void {\n if (!this.editor) return;\n\n this.editor.chain().focus().insertDynamicField({ fieldId: field.id, label: field.label }).run();\n this.close?.();\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { DynamicFieldsViewComponent } from '../views/dynamic-fields-view/dynamic-fields-view';\n\nexport const DynamicFieldsBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'DynamicFieldsBubbleMenu',\n views: [\n {\n id: 'fields',\n component: DynamicFieldsViewComponent,\n label: 'Dynamic Fields',\n isDefault: true,\n },\n ],\n};\n","import type { Editor } from '@tiptap/core';\nimport { ImagePickHook, MediaResult } from '../../types/media-result.type';\n\n/**\n * Framework-free helpers for the image-insert picker flow. Kept out of the\n * component so they can be unit-tested without Angular's TestBed (this lib runs\n * in a bare `node` jest env that does not transpile Angular ESM).\n */\n\n/** A minimal view of the chained commands the picker uses (provided at runtime by the editor's extensions). */\ninterface ImageInsertChain {\n setImage(attrs: { src: string; alt?: string }): ImageInsertChain;\n insertImageRef(attrs: { imageId: string; caption?: string | null }): ImageInsertChain;\n run(): boolean;\n}\n\n/**\n * Whether a picker result is worth inserting. A `null`/`undefined` result (or one\n * with neither an `id` nor a `url`) is treated as a cancel — insert nothing.\n */\nexport function isInsertableResult(result: MediaResult | null | undefined): result is MediaResult {\n return !!result && (!!result.id || !!result.url);\n}\n\n/** Read the consumer's `onPick` media hook off the `image` extension options, if any. */\nexport function getImagePickHook(editor: Editor): ImagePickHook | undefined {\n const ext = editor.extensionManager.extensions.find((e) => e.name === 'image');\n return (ext?.options as { onPick?: ImagePickHook } | undefined)?.onPick;\n}\n\n/**\n * Insert a picked media result: an `image-ref` node when that node is enabled\n * (preferred — URL-free), otherwise a plain image from the resolved URL. Returns\n * `true` when something was actually inserted, `false` when the result had\n * nothing usable (id-only with no `imageRef` node, and no url) — so the caller can\n * avoid closing the view as if an insert had happened.\n */\nexport function insertMediaResult(editor: Editor, result: MediaResult): boolean {\n const hasImageRef = editor.extensionManager.extensions.some((e) => e.name === 'imageRef');\n const chain = editor.chain().focus() as unknown as ImageInsertChain;\n\n if (hasImageRef && result.id) {\n chain.insertImageRef({ imageId: result.id, caption: result.alt ?? null }).run();\n return true;\n }\n\n if (result.url) {\n chain.setImage({ src: result.url, alt: result.alt ?? '' }).run();\n return true;\n }\n\n return false;\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport const urlValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {\n const value = ((control.value as string | null) ?? '').trim();\n\n if (!value) return null;\n\n // Allow http, https, mailto, tel. Add protocol if missing during submit; here just a loose check.\n const hasAllowedScheme = /^(https?:|mailto:|tel:)/i.test(value);\n const looksLikeDomain = /^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(?:\\/.*)?$/.test(value);\n\n if (hasAllowedScheme || looksLikeDomain) return null;\n\n return { url: true } as ValidationErrors;\n};\n","import { Component, Input } from '@angular/core';\n\n/**\n * Error message component for form validation\n *\n * Usage:\n * <document-engine-error-message *ngIf=\"control.hasError('required')\">\n * This field is required\n * </document-engine-error-message>\n */\n@Component({\n selector: 'document-engine-error-message',\n standalone: true,\n template: `\n <p [class]=\"errorClasses\">\n <ng-content></ng-content>\n </p>\n `,\n})\nexport class ErrorMessageComponent {\n @Input() class = '';\n\n get errorClasses(): string {\n return ['document-engine-error-message__text', this.class].filter(Boolean).join(' ');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { getImagePickHook, insertMediaResult, isInsertableResult } from './image-pick.util';\nimport { urlValidator } from '../../utils';\nimport { ButtonDirective } from '../../ui/button';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\nimport { ErrorMessageComponent } from '../../ui/input/error-message';\n\n/**\n * Image insert view for the bubble menu.\n *\n * Two modes:\n * - When the editor's `image` config supplies an async `onPick` hook, the view\n * delegates selection to the consumer's media picker and inserts the result\n * (an `image-ref` node when that node is enabled, else a plain image).\n * - Otherwise it falls back to the built-in raw-URL input form.\n */\n@Component({\n selector: 'document-engine-image-insert-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, ErrorMessageComponent],\n template: `\n <div class=\"image-insert-view\">\n <!-- Title -->\n <div class=\"image-insert-view__header\">Insert Image</div>\n\n <!-- Picker mode: delegate selection to the consumer's media library -->\n <ng-container *ngIf=\"hasPicker; else urlForm\">\n <div class=\"image-insert-view__content\">\n <p class=\"image-insert-view__hint\">Choose an image from your media library.</p>\n </div>\n <div class=\"image-insert-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" [disabled]=\"loading\" (click)=\"cancel()\">\n Cancel\n </button>\n <button type=\"button\" documentEngineButton variant=\"default\" [disabled]=\"loading\" (click)=\"pickImage()\">\n {{ loading ? 'Loading…' : 'Choose from library' }}\n </button>\n </div>\n </ng-container>\n\n <!-- Fallback: built-in raw-URL input form -->\n <ng-template #urlForm>\n <form [formGroup]=\"imageForm\" (ngSubmit)=\"insertImage()\">\n <div class=\"image-insert-view__content\">\n <!-- Image URL input -->\n <div class=\"image-insert-view__field\">\n <label documentEngineLabel for=\"url-input\">Image URL</label>\n <input\n #urlInput\n documentEngineInput\n id=\"url-input\"\n formControlName=\"url\"\n placeholder=\"https://example.com/image.jpg\"\n [attr.aria-invalid]=\"imageForm.controls.url.invalid && imageForm.controls.url.touched\"\n />\n <document-engine-error-message\n *ngIf=\"imageForm.controls.url.hasError('required') && imageForm.controls.url.touched\"\n >\n This field is required\n </document-engine-error-message>\n <document-engine-error-message\n *ngIf=\"imageForm.controls.url.hasError('url') && imageForm.controls.url.touched\"\n >\n Enter a valid URL\n </document-engine-error-message>\n </div>\n\n <!-- Alt text input -->\n <div class=\"image-insert-view__field\">\n <label documentEngineLabel for=\"alt-input\">Alt Text</label>\n <input documentEngineInput id=\"alt-input\" formControlName=\"alt\" placeholder=\"Describe the image\" />\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"image-insert-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n\n <button type=\"submit\" documentEngineButton variant=\"default\" [disabled]=\"!canInsert()\">Insert Image</button>\n </div>\n </form>\n </ng-template>\n </div>\n `,\n styleUrls: ['./image-insert-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ImageInsertViewComponent implements BubbleMenuViewContent<Record<string, unknown>> {\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n\n close?: () => void;\n goBack?: (viewId?: string) => void;\n\n /** True while the consumer's `onPick` promise is in flight. */\n loading = false;\n\n imageForm = this.fb.nonNullable.group({\n url: this.fb.control('', [Validators.required, urlValidator]),\n alt: this.fb.control(''),\n });\n\n /** The consumer's media picker, read off the `image` extension options (if any). */\n private get onPick() {\n return this.editor ? getImagePickHook(this.editor) : undefined;\n }\n\n /** Whether to show the picker mode (vs the raw-URL fallback form). */\n get hasPicker(): boolean {\n return typeof this.onPick === 'function';\n }\n\n onActivate(): void {\n this.loading = false;\n this.imageForm.reset();\n this.imageForm.controls.url.markAsUntouched();\n this.cdr.markForCheck();\n }\n\n canInsert(): boolean {\n return this.imageForm.valid && !!this.imageForm.controls.url.value;\n }\n\n insertImage(): void {\n if (!this.canInsert() || !this.editor) return;\n\n const url = this.imageForm.controls.url.value || '';\n const alt = this.imageForm.controls.alt.value || '';\n\n // Insert image at current cursor position\n this.editor.chain().focus().setImage({ src: url, alt }).run();\n\n this.close?.();\n }\n\n /** Delegate selection to the consumer's media picker, then insert the result. */\n async pickImage(): Promise<void> {\n const onPick = this.onPick;\n if (!onPick || !this.editor || this.loading) return;\n\n this.loading = true;\n this.cdr.markForCheck();\n\n try {\n const result = await onPick();\n // Reject / resolve-nothing is a deliberate no-op (consumer cancelled). Only\n // close when something was actually inserted — an id-only result with no\n // `image-ref` node inserts nothing and must leave the view open.\n if (this.editor && isInsertableResult(result) && insertMediaResult(this.editor, result)) {\n this.close?.();\n }\n } catch {\n // Swallow: a rejected picker (e.g. dialog dismissed) must not crash the editor.\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n cancel(): void {\n this.close?.();\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { ImageInsertViewComponent } from '../views/image-insert-view/image-insert-view';\n\nexport const ImageBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'ImageBubbleMenu',\n views: [\n {\n id: 'insert',\n component: ImageInsertViewComponent,\n label: 'Insert Image',\n isDefault: true,\n },\n ],\n};\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { FormBuilder, FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { getActiveMarkRange } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { urlValidator } from '../../utils';\nimport { ButtonDirective } from '../../ui/button';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\nimport { ErrorMessageComponent } from '../../ui/input/error-message';\n\ninterface LinkAttrs {\n href?: string;\n target?: string;\n rel?: string;\n}\n\ninterface LinkFormControls {\n url: FormControl<string>;\n displayText: FormControl<string>;\n}\n\n/**\n * Edit view for link bubble menu\n * Shows when creating a new link or editing an existing one\n * Provides URL input, display text input, and quick link shortcuts\n */\n@Component({\n selector: 'document-engine-link-edit-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, ErrorMessageComponent],\n template: `\n <div class=\"link-edit-view\">\n <!-- Title -->\n <div class=\"link-edit-view__header\">\n {{ isNewLink ? 'Add Link' : 'Edit Link' }}\n </div>\n\n <!-- Content -->\n <form [formGroup]=\"linkForm\" (ngSubmit)=\"applyLink()\">\n <div class=\"link-edit-view__content\">\n <!-- URL input -->\n <div class=\"link-edit-view__field\">\n <label documentEngineLabel for=\"url-input\">URL</label>\n <input\n #urlInput\n documentEngineInput\n id=\"url-input\"\n formControlName=\"url\"\n placeholder=\"https://example.com\"\n [attr.aria-invalid]=\"linkForm.controls.url.invalid && linkForm.controls.url.touched\"\n />\n <document-engine-error-message\n *ngIf=\"linkForm.controls.url.hasError('required') && linkForm.controls.url.touched\"\n >\n This field is required\n </document-engine-error-message>\n <document-engine-error-message\n *ngIf=\"linkForm.controls.url.hasError('url') && linkForm.controls.url.touched\"\n >\n Enter a valid URL\n </document-engine-error-message>\n </div>\n\n <!-- Display text input -->\n <div class=\"link-edit-view__field\">\n <label documentEngineLabel for=\"display-text-input\">Display Text</label>\n <input documentEngineInput id=\"display-text-input\" formControlName=\"displayText\" placeholder=\"Click here\" />\n </div>\n </div>\n\n <!-- Link shortcuts -->\n <!-- <div class=\"link-edit-view__shortcuts\">\n <span class=\"link-edit-view__shortcuts-label\">Quick links:</span>\n\n <div class=\"chip-set\">\n <button\n type=\"button\"\n class=\"chip\"\n *ngFor=\"let shortcut of linkShortcuts\"\n (click)=\"applyShortcut(shortcut.url)\"\n >\n {{ shortcut.label }}\n </button>\n </div>\n </div> -->\n\n <!-- Actions -->\n <div class=\"link-edit-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n\n <button type=\"submit\" documentEngineButton variant=\"default\" [disabled]=\"!canApply()\">\n {{ isNewLink ? 'Insert' : 'Update' }}\n </button>\n </div>\n </form>\n </div>\n `,\n styleUrls: ['./link-edit-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkEditViewComponent implements BubbleMenuViewContent<LinkAttrs> {\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n position?: { from: number; to: number };\n\n goBack?: (viewId?: string) => void;\n close?: () => void;\n\n linkForm = this.fb.nonNullable.group({\n url: this.fb.control('', [Validators.required, urlValidator]),\n displayText: this.fb.control(''),\n });\n\n isNewLink = true;\n linkShortcuts = [\n { label: 'Google', url: 'https://google.com' },\n { label: 'GitHub', url: 'https://github.com' },\n { label: 'Docs', url: 'https://docs.example.com' },\n ];\n\n onActivate(attrs: LinkAttrs): void {\n // Check if we're editing existing link or creating new\n this.isNewLink = !attrs.href;\n\n if (!this.editor) return;\n\n // Set URL from attrs\n this.linkForm.controls.url.setValue(attrs.href || '');\n this.linkForm.controls.url.markAsUntouched();\n\n const selection = this.editor.state.selection;\n const mark = getActiveMarkRange(this.editor, 'link');\n\n // Determine the range to use: selection if not empty, otherwise mark range\n let range: { from: number; to: number } | undefined;\n\n if (!selection.empty) {\n // User has text selected\n range = { from: selection.from, to: selection.to };\n } else if (mark) {\n // Cursor is inside an existing link\n range = { from: mark.from, to: mark.to };\n }\n\n // Set position and display text based on the determined range\n this.position = range;\n\n if (range) {\n const text = this.editor.state.doc.textBetween(range.from, range.to, ' ');\n this.linkForm.controls.displayText.setValue(text || '');\n } else {\n // No selection and not inside a link - empty display text\n this.linkForm.controls.displayText.setValue('');\n }\n\n this.cdr.markForCheck();\n }\n\n applyShortcut(url: string): void {\n this.linkForm.controls.url.setValue(url);\n }\n\n canApply(): boolean {\n return this.linkForm.valid && !!this.linkForm.controls.url.value;\n }\n\n applyLink(): void {\n if (!this.canApply() || !this.editor) return;\n\n const url = this.normalizeUrl(this.linkForm.controls.url.value || '');\n const displayText = this.linkForm.controls.displayText.value;\n const { empty } = this.editor.state.selection;\n\n const apply = (editor: Editor) => {\n // If display text provided, replace selection with it and apply link\n if (displayText && displayText.trim() && this.position) {\n editor\n .chain()\n .focus()\n .setTextSelection(this.position)\n .insertContent({\n type: 'text',\n text: displayText,\n marks: [{ type: 'link', attrs: { href: url, target: '_blank' } }],\n })\n .run();\n return;\n }\n\n // Apply link to existing selection (selection exists and no custom text)\n if (!empty) {\n editor.chain().focus().setLink({ href: url, target: '_blank' }).run();\n return;\n }\n\n // No selection and no display text - insert URL as link text\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: displayText || url,\n marks: [{ type: 'link', attrs: { href: url, target: '_blank' } }],\n })\n .run();\n };\n\n apply(this.editor);\n this.close?.(); // Close after applying\n }\n\n cancel(): void {\n if (this.isNewLink) {\n this.close?.(); // Close if creating new link\n } else {\n this.goBack?.('main'); // Go back to main if editing existing link\n }\n }\n\n private normalizeUrl(input: string): string {\n if (!input) return input;\n if (/^(https?:|mailto:|tel:)/i.test(input)) return input;\n return `https://${input.trim()}`;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\n\ninterface LinkAttrs {\n href?: string;\n target?: string;\n rel?: string;\n}\n\n/**\n * Main view for link bubble menu\n * Shows when an existing link is selected\n * Provides navigation to edit and properties views\n */\n@Component({\n selector: 'document-engine-link-main-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, IconComponent],\n template: `\n <div class=\"link-main-view\">\n <!-- Title -->\n <div class=\"link-main-view__header\">Link</div>\n\n <!-- Content -->\n <div class=\"link-main-view__content\">\n <a class=\"link-main-view__url\" [title]=\"currentUrl\" [href]=\"currentUrl\" target=\"_blank\">\n {{ currentUrl }}\n </a>\n\n <button documentEngineButton variant=\"ghost\" size=\"sm\" class=\"link-main-view__button\" (click)=\"editLink()\">\n <document-engine-icon name=\"edit\"></document-engine-icon>\n <span>Edit</span>\n </button>\n\n <button\n documentEngineButton\n variant=\"ghost\"\n size=\"sm\"\n class=\"link-main-view__button\"\n (click)=\"openProperties()\"\n >\n <document-engine-icon name=\"settings\"></document-engine-icon>\n <span>Properties</span>\n </button>\n\n <button\n documentEngineButton\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"link-main-view__button-icon\"\n (click)=\"removeLink()\"\n title=\"Remove link\"\n >\n <document-engine-icon name=\"link_off\"></document-engine-icon>\n </button>\n </div>\n </div>\n `,\n styleUrls: ['./link-main-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkMainViewComponent implements BubbleMenuViewContent<LinkAttrs> {\n editor?: Editor;\n currentUrl = '';\n\n close?: () => void;\n navigateTo?: (viewId: string) => void;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n onActivate(attrs: LinkAttrs): void {\n this.currentUrl = attrs.href || '';\n this.cdr.markForCheck();\n }\n\n editLink(): void {\n this.navigateTo?.('edit');\n }\n\n openProperties(): void {\n this.navigateTo?.('properties');\n }\n\n removeLink(): void {\n this.editor?.chain().focus().unsetLink().run();\n this.close?.();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n forwardRef,\n HostBinding,\n inject,\n Input,\n Output,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IconComponent } from '../icon';\n\n/**\n * Checkbox component\n * Works with ngModel and reactive forms\n *\n * Usage:\n * <document-engine-checkbox [(ngModel)]=\"checked\">Label text</document-engine-checkbox>\n */\n@Component({\n selector: 'document-engine-checkbox',\n standalone: true,\n imports: [CommonModule, IconComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true,\n },\n ],\n template: `\n <label class=\"document-engine-checkbox\">\n <input\n type=\"checkbox\"\n class=\"document-engine-checkbox__input\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n (change)=\"onCheckboxChange($event)\"\n />\n <span class=\"document-engine-checkbox__box\">\n <document-engine-icon\n *ngIf=\"checked\"\n name=\"check\"\n class=\"document-engine-checkbox__icon\"\n ></document-engine-icon>\n </span>\n <span class=\"document-engine-checkbox__label\">\n <ng-content></ng-content>\n </span>\n </label>\n `,\n styleUrls: ['../../styles/checkbox.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CheckboxComponent implements ControlValueAccessor {\n @Input() disabled = false;\n @Input() checked = false;\n\n @Output() checkedChange = new EventEmitter<boolean>();\n\n @HostBinding('class.document-engine-checkbox-container') hostClass = true;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChange: (value: boolean) => void = () => {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouched: () => void = () => {};\n\n onCheckboxChange(event: Event): void {\n if (this.disabled) return;\n\n const target = event.target as HTMLInputElement;\n this.checked = target.checked;\n this.checkedChange.emit(this.checked);\n this.onChange(this.checked);\n this.onTouched();\n }\n\n // ControlValueAccessor implementation.\n //\n // The forms package calls these from outside any template binding, so on an\n // OnPush component they must mark the view dirty explicitly. Without it a\n // programmatic `setValue()` — including a bubble-menu view being re-activated\n // with different attributes on a reused instance — updates the model while the\n // rendered tick keeps showing the previous state.\n writeValue(value: boolean): void {\n this.checked = value;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { CheckboxComponent } from '../../ui/checkbox/checkbox';\n\ninterface LinkAttrs {\n href?: string;\n target?: string;\n rel?: string;\n}\n\n/**\n * Properties view for link bubble menu\n * Shows link properties like target and rel attributes\n * Allows user to configure SEO and security settings\n */\n@Component({\n selector: 'document-engine-link-properties-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, CheckboxComponent],\n template: `\n <div class=\"link-properties-view\">\n <!-- Title -->\n <!-- No referrer -->\n <div class=\"link-properties-view__header\">Link Properties</div>\n\n <!-- Content -->\n <div class=\"link-properties-view__content\">\n <!-- Open in new tab -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"newTabControl\">Open in new tab</document-engine-checkbox>\n </div>\n\n <!-- No follow -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"noFollowControl\">\n Add <code class=\"inline-code\">rel=\"nofollow\"</code>\n </document-engine-checkbox>\n </div>\n\n <!-- No opener -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"noOpenerControl\">\n Add <code class=\"inline-code\">rel=\"noopener\"</code>\n </document-engine-checkbox>\n </div>\n\n <!-- No referrer -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"noReferrerControl\">\n Add <code class=\"inline-code\">rel=\"noreferrer\"</code>\n </document-engine-checkbox>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"link-properties-view__actions\">\n <button documentEngineButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n\n <button type=\"submit\" documentEngineButton variant=\"default\" (click)=\"saveProperties()\">Save</button>\n </div>\n </div>\n `,\n styleUrls: ['./link-properties-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkPropertiesViewComponent implements BubbleMenuViewContent<LinkAttrs> {\n editor?: Editor;\n goBack?: (viewId?: string) => void;\n\n newTabControl = new FormControl(false);\n noFollowControl = new FormControl(false);\n noOpenerControl = new FormControl(false);\n noReferrerControl = new FormControl(false);\n\n private currentHref = '';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n onActivate(attrs: LinkAttrs): void {\n this.currentHref = attrs.href || '';\n\n // Parse existing attributes\n this.newTabControl.setValue(attrs.target === '_blank');\n\n const rel = attrs.rel || '';\n this.noFollowControl.setValue(rel.includes('nofollow'));\n this.noOpenerControl.setValue(rel.includes('noopener'));\n this.noReferrerControl.setValue(rel.includes('noreferrer'));\n\n this.cdr.markForCheck();\n }\n\n saveProperties(): void {\n if (!this.editor || !this.currentHref) return;\n\n // Build rel attribute\n const relParts: string[] = [];\n if (this.noFollowControl.value) relParts.push('nofollow');\n if (this.noOpenerControl.value) relParts.push('noopener');\n if (this.noReferrerControl.value) relParts.push('noreferrer');\n\n // Update link attributes\n this.editor\n .chain()\n .focus()\n .setLink({\n href: this.currentHref,\n target: this.newTabControl.value ? '_blank' : undefined,\n rel: relParts.length > 0 ? relParts.join(' ') : undefined,\n })\n .run();\n\n this.goBack?.('main'); // Always go back to main after saving\n }\n\n cancel(): void {\n this.goBack?.('main'); // Always go back to main on cancel\n }\n}\n","import { EditorBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { LinkEditViewComponent } from '../views/link-views/link-edit-view';\nimport { LinkMainViewComponent } from '../views/link-views/link-main-view';\nimport { LinkPropertiesViewComponent } from '../views/link-views/link-properties-view';\n\nexport const LinkBubbleConfig: EditorBubbleMenuConfig = {\n props: {\n pluginKey: 'LinkBubbleMenu',\n },\n target: { kind: 'mark', name: 'link', allowEmptySelection: true, requireFocus: true },\n views: [\n {\n id: 'main',\n component: LinkMainViewComponent,\n showWhen: (attrs) => !!attrs['href'], // Show when link exists\n label: 'Main View',\n },\n {\n id: 'edit',\n component: LinkEditViewComponent,\n showWhen: (attrs) => !attrs['href'], // Show when creating new link\n showOnForceOpen: true, // Show when toolbar button clicked\n label: 'Edit View',\n },\n {\n id: 'properties',\n component: LinkPropertiesViewComponent,\n label: 'Properties View',\n },\n ],\n};\n","export const CharacterCategory = {\n ALL: 'all',\n CURRENCY: 'currency',\n MATH: 'math',\n ARROWS: 'arrows',\n SYMBOLS: 'symbols',\n PUNCTUATION: 'punctuation',\n} as const;\n\nexport interface SpecialCharacter {\n char: string;\n name: string;\n code?: string;\n}\n\ntype CharacterCategoryValue = (typeof CharacterCategory)[keyof typeof CharacterCategory];\ntype CharacterCategoryWithoutAll = Exclude<CharacterCategoryValue, 'all'>;\n\nexport const CHARACTERS: { [key in CharacterCategoryWithoutAll]: SpecialCharacter[] } = {\n [CharacterCategory.CURRENCY]: [\n { char: '$', name: 'Dollar sign', code: 'U+0024' },\n { char: '€', name: 'Euro sign', code: 'U+20AC' },\n { char: '£', name: 'Pound sign', code: 'U+00A3' },\n { char: '¥', name: 'Yen sign', code: 'U+00A5' },\n { char: '₹', name: 'Indian rupee sign', code: 'U+20B9' },\n { char: '¢', name: 'Cent sign', code: 'U+00A2' },\n { char: '₽', name: 'Ruble sign', code: 'U+20BD' },\n { char: '₩', name: 'Won sign', code: 'U+20A9' },\n { char: '₪', name: 'Shekel sign', code: 'U+20AA' },\n { char: '₱', name: 'Peso sign', code: 'U+20B1' },\n { char: '₦', name: 'Naira sign', code: 'U+20A6' },\n { char: '₫', name: 'Dong sign', code: 'U+20AB' },\n ],\n [CharacterCategory.MATH]: [\n { char: '±', name: 'Plus-minus sign', code: 'U+00B1' },\n { char: '×', name: 'Multiplication sign', code: 'U+00D7' },\n { char: '÷', name: 'Division sign', code: 'U+00F7' },\n { char: '≈', name: 'Almost equal to', code: 'U+2248' },\n { char: '≠', name: 'Not equal to', code: 'U+2260' },\n { char: '≤', name: 'Less than or equal to', code: 'U+2264' },\n { char: '≥', name: 'Greater than or equal to', code: 'U+2265' },\n { char: '∞', name: 'Infinity', code: 'U+221E' },\n { char: '∑', name: 'Summation', code: 'U+2211' },\n { char: '√', name: 'Square root', code: 'U+221A' },\n { char: '∫', name: 'Integral', code: 'U+222B' },\n { char: '∂', name: 'Partial differential', code: 'U+2202' },\n { char: '∆', name: 'Delta', code: 'U+2206' },\n { char: '∏', name: 'Product', code: 'U+220F' },\n { char: 'π', name: 'Pi', code: 'U+03C0' },\n { char: 'α', name: 'Alpha', code: 'U+03B1' },\n { char: 'β', name: 'Beta', code: 'U+03B2' },\n { char: 'θ', name: 'Theta', code: 'U+03B8' },\n ],\n [CharacterCategory.ARROWS]: [\n { char: '←', name: 'Left arrow', code: 'U+2190' },\n { char: '→', name: 'Right arrow', code: 'U+2192' },\n { char: '↑', name: 'Up arrow', code: 'U+2191' },\n { char: '↓', name: 'Down arrow', code: 'U+2193' },\n { char: '↔', name: 'Left-right arrow', code: 'U+2194' },\n { char: '↕', name: 'Up-down arrow', code: 'U+2195' },\n { char: '⇐', name: 'Double left arrow', code: 'U+21D0' },\n { char: '⇒', name: 'Double right arrow', code: 'U+21D2' },\n { char: '⇑', name: 'Double up arrow', code: 'U+21D1' },\n { char: '⇓', name: 'Double down arrow', code: 'U+21D3' },\n { char: '⇔', name: 'Double left-right arrow', code: 'U+21D4' },\n { char: '↖', name: 'North-west arrow', code: 'U+2196' },\n { char: '↗', name: 'North-east arrow', code: 'U+2197' },\n { char: '↘', name: 'South-east arrow', code: 'U+2198' },\n { char: '↙', name: 'South-west arrow', code: 'U+2199' },\n { char: '↺', name: 'Anticlockwise arrow', code: 'U+21BA' },\n { char: '↻', name: 'Clockwise arrow', code: 'U+21BB' },\n { char: '➜', name: 'Heavy right arrow', code: 'U+279C' },\n ],\n [CharacterCategory.SYMBOLS]: [\n { char: '©', name: 'Copyright', code: 'U+00A9' },\n { char: '®', name: 'Registered trademark', code: 'U+00AE' },\n { char: '™', name: 'Trademark', code: 'U+2122' },\n { char: '§', name: 'Section sign', code: 'U+00A7' },\n { char: '¶', name: 'Pilcrow', code: 'U+00B6' },\n { char: '†', name: 'Dagger', code: 'U+2020' },\n { char: '‡', name: 'Double dagger', code: 'U+2021' },\n { char: '•', name: 'Bullet', code: 'U+2022' },\n { char: '◦', name: 'White bullet', code: 'U+25E6' },\n { char: '●', name: 'Black circle', code: 'U+25CF' },\n { char: '○', name: 'White circle', code: 'U+25CB' },\n { char: '■', name: 'Black square', code: 'U+25A0' },\n { char: '□', name: 'White square', code: 'U+25A1' },\n { char: '▪', name: 'Small black square', code: 'U+25AA' },\n { char: '▫', name: 'Small white square', code: 'U+25AB' },\n { char: '★', name: 'Black star', code: 'U+2605' },\n { char: '☆', name: 'White star', code: 'U+2606' },\n { char: '♠', name: 'Spade', code: 'U+2660' },\n { char: '♣', name: 'Club', code: 'U+2663' },\n { char: '♥', name: 'Heart', code: 'U+2665' },\n { char: '♦', name: 'Diamond', code: 'U+2666' },\n { char: '✓', name: 'Check mark', code: 'U+2713' },\n { char: '✗', name: 'Ballot X', code: 'U+2717' },\n { char: '☐', name: 'Ballot box', code: 'U+2610' },\n ],\n [CharacterCategory.PUNCTUATION]: [\n { char: '‚', name: 'Single low-9 quotation mark', code: 'U+201A' },\n { char: '„', name: 'Double low-9 quotation mark', code: 'U+201E' },\n { char: \"'\", name: 'Left single quotation mark', code: 'U+2018' },\n { char: \"'\", name: 'Right single quotation mark', code: 'U+2019' },\n { char: '\"', name: 'Left double quotation mark', code: 'U+201C' },\n { char: '\"', name: 'Right double quotation mark', code: 'U+201D' },\n { char: '«', name: 'Left guillemet', code: 'U+00AB' },\n { char: '»', name: 'Right guillemet', code: 'U+00BB' },\n { char: '‹', name: 'Single left angle quotation', code: 'U+2039' },\n { char: '›', name: 'Single right angle quotation', code: 'U+203A' },\n { char: '—', name: 'Em dash', code: 'U+2014' },\n { char: '–', name: 'En dash', code: 'U+2013' },\n { char: '…', name: 'Ellipsis', code: 'U+2026' },\n { char: '‰', name: 'Per mille', code: 'U+2030' },\n { char: '¿', name: 'Inverted question mark', code: 'U+00BF' },\n { char: '¡', name: 'Inverted exclamation mark', code: 'U+00A1' },\n { char: '·', name: 'Middle dot', code: 'U+00B7' },\n { char: '‧', name: 'Hyphenation point', code: 'U+2027' },\n ],\n};\n\nexport type CharacterCategory = (typeof CharacterCategory)[keyof typeof CharacterCategory];\n\n","import { Directive } from '@angular/core';\n\n/**\n * Directive for select label content\n * Must be used within document-engine-select component when labelMode=\"static\"\n *\n * Usage:\n * <document-engine-select labelMode=\"static\">\n * <div documentEngineSelectLabel>\n * <document-engine-icon name=\"format_size\"></document-engine-icon>\n * <span>Font Size</span>\n * </div>\n * <button documentEngineSelectOption value=\"14px\">14px</button>\n * </document-engine-select>\n */\n@Directive({\n selector: '[documentEngineSelectLabel]',\n standalone: true,\n})\nexport class SelectLabelDirective {}\n","import { InjectionToken } from '@angular/core';\n\nexport interface ISelectParent {\n value: string | null;\n selectOption(option: unknown): void;\n}\n\nexport const SELECT_PARENT_TOKEN = new InjectionToken<ISelectParent>('ISelectParent');\n","import { Directive, ElementRef, HostListener, Input, inject } from '@angular/core';\nimport { SELECT_PARENT_TOKEN } from './select.contract';\n\n/**\n * Directive for select options\n * Must be used within document-engine-select component\n *\n * Usage:\n * <button documentEngineSelectOption value=\"option1\">Option 1</button>\n */\n@Directive({\n selector: '[documentEngineSelectOption]',\n standalone: true,\n host: {\n role: 'option',\n '[attr.aria-selected]': 'select?.value === value',\n '[attr.aria-disabled]': 'disabled',\n class: 'document-engine-select-option',\n '[class.document-engine-select-option--disabled]': 'disabled',\n '[class.document-engine-select-option--selected]': 'select?.value === value',\n },\n})\nexport class SelectOptionDirective {\n readonly elementRef = inject(ElementRef);\n readonly select = inject(SELECT_PARENT_TOKEN, { optional: true });\n\n @Input() value!: string | null;\n @Input() label?: string;\n @Input() disabled = false;\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n event.stopPropagation();\n\n if (!this.disabled) {\n this.select?.selectOption(this);\n }\n }\n\n // Get label from element text content if not provided\n getLabel(): string {\n return this.label || this.elementRef.nativeElement.textContent?.trim() || this.value;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n QueryList,\n SimpleChanges,\n ViewChild,\n forwardRef,\n inject,\n} from '@angular/core';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { Subject, takeUntil } from 'rxjs';\nimport { IconComponent } from '../icon';\nimport { SelectLabelDirective } from './select-label.directive';\nimport { SelectOptionDirective } from './select-option.directive';\nimport { ISelectParent, SELECT_PARENT_TOKEN } from './select.contract';\n\n/**\n * Select component with floating dropdown using @floating-ui/dom\n *\n * Usage:\n * <document-engine-select [(value)]=\"selectedValue\" placeholder=\"Select...\">\n * <button documentEngineSelectOption value=\"option1\">Option 1</button>\n * <button documentEngineSelectOption value=\"option2\">Option 2</button>\n * </document-engine-select>\n */\n@Component({\n selector: 'document-engine-select',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './select.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: SELECT_PARENT_TOKEN,\n useExisting: forwardRef(() => SelectComponent),\n },\n ],\n})\nexport class SelectComponent implements AfterContentInit, OnChanges, OnDestroy, ISelectParent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input() value: string | null = null;\n @Input() disabled = false;\n @Input() labelMode: 'static' | 'activeOption' = 'activeOption';\n @Input() variant: 'default' | 'outline' = 'default';\n\n @Output() valueChange = new EventEmitter<string | null>();\n\n @ViewChild('trigger', { static: false, read: ElementRef }) triggerRef!: ElementRef<HTMLElement>;\n @ViewChild('dropdown', { static: false, read: ElementRef }) dropdownRef!: ElementRef<HTMLElement>;\n\n @ContentChildren(SelectLabelDirective, { descendants: true }) labelDirectives!: QueryList<SelectLabelDirective>;\n @ContentChildren(SelectOptionDirective, { descendants: true }) options!: QueryList<SelectOptionDirective>;\n\n isOpen = false;\n selectedLabel: string | null = null;\n\n private cleanupAutoUpdate?: () => void;\n private documentClickListener?: () => void;\n private destroy = new Subject<void>();\n private contentInitialized = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['value'] || !this.contentInitialized) return;\n\n this.updateSelectedLabel();\n }\n\n ngAfterContentInit(): void {\n // ContentChildren (options) are now available\n this.contentInitialized = true;\n\n // Initial update for any pre-set value\n this.updateSelectedLabel();\n\n // Listen to option changes (e.g., when options are dynamically added/removed)\n this.options.changes.pipe(takeUntil(this.destroy)).subscribe(() => {\n this.updateSelectedLabel();\n });\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n this.removeDocumentClickListener();\n this.destroy.next();\n this.destroy.complete();\n }\n\n toggle(): void {\n if (this.disabled) return;\n\n if (this.isOpen) {\n this.close();\n return;\n }\n\n this.open();\n }\n\n open(): void {\n if (this.disabled || this.isOpen) return;\n\n this.isOpen = true;\n this.cdr.markForCheck();\n\n // Wait for dropdown to render\n setTimeout(() => {\n this.setupFloating();\n this.addDocumentClickListener();\n });\n }\n\n close(): void {\n if (!this.isOpen) return;\n\n this.isOpen = false;\n this.cleanup();\n this.removeDocumentClickListener();\n this.cdr.markForCheck();\n }\n\n selectOption(option: SelectOptionDirective): void {\n if (option.disabled) {\n return;\n }\n\n this.value = option.value;\n this.selectedLabel = option.getLabel();\n this.valueChange.emit(this.value);\n this.close();\n this.cdr.markForCheck();\n }\n\n private setupFloating(): void {\n if (!this.triggerRef || !this.dropdownRef) return;\n\n const triggerEl = this.triggerRef.nativeElement;\n const dropdownEl = this.dropdownRef.nativeElement;\n\n // Use autoUpdate to automatically reposition on scroll/resize\n this.cleanupAutoUpdate = autoUpdate(triggerEl, dropdownEl, () => {\n computePosition(triggerEl, dropdownEl, {\n placement: 'bottom-start',\n middleware: [offset(4), flip(), shift({ padding: 8 })],\n }).then(({ x, y }) => {\n Object.assign(dropdownEl.style, { left: `${x}px`, top: `${y}px` });\n });\n });\n }\n\n private cleanup(): void {\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = undefined;\n }\n }\n\n private addDocumentClickListener(): void {\n this.documentClickListener = () => this.close();\n\n // Use timeout to avoid immediate close from the same click that opened\n setTimeout(() => {\n if (this.documentClickListener) {\n document.addEventListener('click', this.documentClickListener);\n }\n });\n }\n\n private removeDocumentClickListener(): void {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = undefined;\n }\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n // Stop propagation to prevent document click listener from closing\n event.stopPropagation();\n }\n\n /**\n * Check if should use static label (directive)\n * Falls back to activeOption if static mode but no label directive provided\n */\n get useStaticLabel(): boolean {\n return this.labelMode === 'static' && this.hasLabelDirective;\n }\n\n /**\n * Check if label directive exists\n */\n get hasLabelDirective(): boolean {\n return this.labelDirectives?.length > 0;\n }\n\n private updateSelectedLabel(): void {\n if (!this.options || this.labelMode === 'static') return;\n\n const selected = this.options.find((opt) => opt.value === this.value);\n this.selectedLabel = selected?.getLabel() || null;\n this.cdr.markForCheck();\n }\n}\n","<div class=\"document-engine-select\" [class.document-engine-select--outline]=\"variant === 'outline'\">\n <button\n #trigger\n type=\"button\"\n class=\"document-engine-select__trigger\"\n [class.document-engine-select__trigger--open]=\"isOpen\"\n [class.document-engine-select__trigger--disabled]=\"disabled\"\n [disabled]=\"disabled\"\n (click)=\"toggle()\"\n >\n <span class=\"document-engine-select__value\">\n <!-- Static label mode: use label directive content -->\n <ng-container *ngIf=\"useStaticLabel\">\n <ng-content select=\"[documentEngineSelectLabel]\"></ng-content>\n </ng-container>\n\n <!-- ActiveOption mode: use computed label -->\n <ng-container *ngIf=\"!useStaticLabel\"> {{ selectedLabel }} </ng-container>\n </span>\n <document-engine-icon name=\"arrow_drop_down\" class=\"document-engine-select__icon\"></document-engine-icon>\n </button>\n\n <div #dropdown *ngIf=\"isOpen\" class=\"document-engine-select__dropdown\">\n <div class=\"document-engine-select__options\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n OnDestroy,\n QueryList,\n ViewChildren,\n inject,\n} from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { CharacterCategory, CHARACTERS, SpecialCharacter } from '../../constants/character.constant';\nimport { ButtonDirective } from '../../ui/button';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\n\n/**\n * Special characters view for bubble menu\n * Shows categorized special characters for insertion\n */\n@Component({\n selector: 'document-engine-special-characters-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, SelectComponent, SelectOptionDirective],\n template: `\n <div class=\"special-characters-view\">\n <!-- Title -->\n <div class=\"special-characters-view__header\">Special Characters</div>\n\n <!-- Category Select -->\n <div class=\"special-characters-view__select\">\n <document-engine-select [(value)]=\"selectedCategory\" labelMode=\"activeOption\">\n <button documentEngineSelectOption value=\"all\">All</button>\n <button documentEngineSelectOption value=\"currency\">Currency</button>\n <button documentEngineSelectOption value=\"math\">Math</button>\n <button documentEngineSelectOption value=\"arrows\">Arrows</button>\n <button documentEngineSelectOption value=\"symbols\">Symbols</button>\n <button documentEngineSelectOption value=\"punctuation\">Punctuation</button>\n </document-engine-select>\n </div>\n\n <!-- Characters Grid -->\n <div class=\"special-characters-view__grid-container\">\n <div\n class=\"special-characters-view__grid\"\n role=\"grid\"\n aria-label=\"Special characters grid\"\n tabindex=\"-1\"\n (keydown)=\"onGridKeydown($event)\"\n >\n <button\n *ngFor=\"let char of currentCharacters; let i = index\"\n #charButton\n type=\"button\"\n role=\"gridcell\"\n class=\"special-characters-view__char-button\"\n (click)=\"insertCharacter(char.char)\"\n [attr.aria-label]=\"char.name + (char.code ? ' (' + char.code + ')' : '')\"\n [title]=\"char.name + (char.code ? ' (' + char.code + ')' : '')\"\n [attr.data-index]=\"i\"\n >\n {{ char.char }}\n </button>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"special-characters-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./special-characters-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpecialCharactersViewComponent implements BubbleMenuViewContent<Record<string, unknown>>, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n selectedCategory: (typeof CharacterCategory)[keyof typeof CharacterCategory] = 'all';\n\n @ViewChildren('charButton') charButtons!: QueryList<ElementRef<HTMLButtonElement>>;\n\n readonly GRID_COLUMNS = 6;\n\n private rafId: number | null = null;\n private pendingKey: string | null = null;\n\n get currentCharacters(): SpecialCharacter[] {\n const category = this.selectedCategory;\n switch (category) {\n case 'all':\n return [\n ...this.currencyChars,\n ...this.mathChars,\n ...this.arrowChars,\n ...this.symbolChars,\n ...this.punctuationChars,\n ];\n case 'currency':\n return this.currencyChars;\n case 'math':\n return this.mathChars;\n case 'arrows':\n return this.arrowChars;\n case 'symbols':\n return this.symbolChars;\n case 'punctuation':\n return this.punctuationChars;\n default:\n return this.currencyChars;\n }\n }\n\n currencyChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.CURRENCY];\n mathChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.MATH];\n arrowChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.ARROWS];\n symbolChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.SYMBOLS];\n punctuationChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.PUNCTUATION];\n\n onActivate(): void {\n // Reset to default category and trigger change detection\n this.selectedCategory = 'all';\n this.cdr.markForCheck();\n }\n\n insertCharacter(char: string): void {\n if (!this.editor) return;\n\n this.editor.chain().focus().insertContent(char).run();\n this.close?.();\n }\n\n onGridKeydown(event: KeyboardEvent): void {\n const validKeys = ['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp', 'Home', 'End'];\n if (!validKeys.includes(event.key)) return;\n\n event.preventDefault();\n this.pendingKey = event.key;\n\n // Already scheduled, skip\n if (this.rafId !== null) return;\n\n this.rafId = requestAnimationFrame(() => {\n if (this.pendingKey) {\n this.handleNavigation(this.pendingKey);\n }\n this.rafId = null;\n this.pendingKey = null;\n });\n }\n\n private handleNavigation(key: string): void {\n const buttons = this.charButtons.toArray();\n if (buttons.length === 0) return;\n\n const activeElement = document.activeElement as HTMLElement;\n const currentIndex = buttons.findIndex((btn) => btn.nativeElement === activeElement);\n\n if (currentIndex === -1) return;\n\n let targetIndex = currentIndex;\n\n switch (key) {\n case 'ArrowRight':\n targetIndex = currentIndex < buttons.length - 1 ? currentIndex + 1 : currentIndex;\n break;\n case 'ArrowLeft':\n targetIndex = currentIndex > 0 ? currentIndex - 1 : currentIndex;\n break;\n case 'ArrowDown':\n targetIndex = currentIndex + this.GRID_COLUMNS;\n if (targetIndex >= buttons.length) {\n targetIndex = currentIndex;\n }\n break;\n case 'ArrowUp':\n targetIndex = currentIndex - this.GRID_COLUMNS;\n if (targetIndex < 0) {\n targetIndex = currentIndex;\n }\n break;\n case 'Home':\n targetIndex = 0;\n break;\n case 'End':\n targetIndex = buttons.length - 1;\n break;\n }\n\n buttons[targetIndex]?.nativeElement.focus();\n }\n\n ngOnDestroy(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { SpecialCharactersViewComponent } from '../views/special-characters-view/special-characters-view';\n\nexport const SpecialCharactersBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'SpecialCharactersBubbleMenu',\n views: [\n {\n id: 'characters',\n component: SpecialCharactersViewComponent,\n label: 'Special Characters',\n isDefault: true,\n },\n ],\n};\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n EventEmitter,\n HostBinding,\n Input,\n Output,\n QueryList,\n} from '@angular/core';\n\n/**\n * Toggle button option directive\n */\n@Component({\n selector: 'button[documentEngineToggleOption]',\n standalone: true,\n template: '<ng-content></ng-content>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.document-engine-toggle-option]': 'true',\n '[class.document-engine-toggle-option--active]': 'isActive',\n '[disabled]': 'disabled',\n '(click)': 'onClick()',\n },\n})\nexport class ToggleOptionDirective {\n @Input() value!: string;\n @Input() disabled = false;\n\n @HostBinding('class.document-engine-toggle-option--active')\n isActive = false;\n\n onClick(): void {\n if (!this.disabled) {\n this.selected.emit(this.value);\n }\n }\n\n selected = new EventEmitter<string>();\n}\n\n/**\n * Toggle button group component\n * Similar to mat-button-toggle-group\n *\n * Usage:\n * <document-engine-toggle-group [(value)]=\"alignment\">\n * <button documentEngineToggleOption value=\"left\"><document-engine-icon name=\"format_align_left\"></document-engine-icon></button>\n * <button documentEngineToggleOption value=\"center\"><document-engine-icon name=\"format_align_center\"></document-engine-icon></button>\n * </document-engine-toggle-group>\n */\n@Component({\n selector: 'document-engine-toggle-group',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"document-engine-toggle-group\">\n <ng-content></ng-content>\n </div>\n `,\n styleUrls: ['../../styles/toggle-button.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToggleGroupComponent {\n @Input() value: string | null = null;\n @Input() disabled = false;\n\n @Output() valueChange = new EventEmitter<string | null>();\n\n @ContentChildren(ToggleOptionDirective, { descendants: true }) options!: QueryList<ToggleOptionDirective>;\n\n ngAfterContentInit(): void {\n // Initialize active state\n this.updateActiveStates();\n\n // Listen to option selections\n this.options.forEach((option) => {\n option.selected.subscribe((value) => {\n this.value = value;\n this.valueChange.emit(value);\n this.updateActiveStates();\n });\n });\n }\n\n ngOnChanges(): void {\n this.updateActiveStates();\n }\n\n private updateActiveStates(): void {\n if (!this.options) return;\n\n this.options.forEach((option) => {\n option.isActive = option.value === this.value;\n });\n }\n}\n","/**\n * Normalize what a user typed into the border-width field into a valid CSS length.\n *\n * The field is a free-text input, and `border-width: 3` is not a valid declaration —\n * the browser drops it silently, so typing a bare number used to do nothing at all\n * with no feedback. A bare number is the single most likely thing to type, and in a\n * length context it conventionally means pixels, so it is completed to `px`.\n *\n * Anything already carrying a unit is left alone (only the unit is lower-cased).\n *\n * The two failure modes are deliberately NOT the same value, because the command this\n * feeds reads `null` as \"clear this field\" and `undefined` as \"leave it alone\":\n *\n * - an **empty** field is a real instruction to clear the width, so it returns `null`;\n * - **unusable** input (`abc`, `-2px`, `50%`) returns `undefined`, so a typo leaves the\n * width the cell already had instead of wiping it. Collapsing the two would mean a\n * user with a working `1px` border who mistypes `3 pixels` loses it on Save with no\n * message — the field is free text, so mistyping it is the expected case, not a rare one.\n *\n * @returns a valid CSS border-width; `null` to clear it; `undefined` to leave it alone.\n */\nexport function normalizeBorderWidth(input: string | null | undefined): string | null | undefined {\n const value = (input ?? '').trim();\n if (!value) return null;\n\n // `thin | medium | thick` are valid border-width keywords in their own right.\n if (/^(thin|medium|thick)$/i.test(value)) return value.toLowerCase();\n\n // A bare number — the case this helper exists for. Border widths cannot be\n // negative, so a signed value is rejected rather than quietly clamped.\n if (/^\\d+(\\.\\d+)?$/.test(value)) return `${parseFloat(value)}px`;\n\n // Already a length. Units per CSS Values 4; `%` is not valid for border-width.\n const withUnit = /^(\\d+(?:\\.\\d+)?)\\s*(px|em|rem|pt|pc|in|cm|mm|q|ch|ex|vh|vw|vmin|vmax)$/i.exec(value);\n if (withUnit) return `${parseFloat(withUnit[1])}${withUnit[2].toLowerCase()}`;\n\n // Not a border-width at all — leave whatever the cell already has untouched.\n return undefined;\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n Color,\n getCombinedCellAttributeValue,\n getSelectedCells,\n TableBorder,\n TableDefaultAttributes,\n} from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { COLORS } from '../../constants/color.constant';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { PopoverDirective } from '../../core/popover.directive';\nimport { ButtonDirective } from '../../ui/button';\nimport { ColorPickerComponent } from '../../ui/color-picker';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\nimport { ToggleGroupComponent } from '../../ui/toggle-button/toggle-button';\nimport { ToggleOptionDirective } from '../../ui/toggle-button/toggle-button';\nimport { normalizeBorderWidth } from './border-width.util';\n\n/**\n * Cell style view for table bubble menu\n * Allows styling individual table cells (borders, background, alignment)\n */\n@Component({\n selector: 'document-engine-table-cell-style-view',\n standalone: true,\n imports: [\n CommonModule,\n IconComponent,\n ButtonDirective,\n InputDirective,\n SelectComponent,\n SelectOptionDirective,\n FormsModule,\n ColorPickerComponent,\n ToggleGroupComponent,\n ToggleOptionDirective,\n PopoverDirective,\n ],\n template: `\n <div class=\"table-cell-style-view\">\n <!-- Title -->\n <div class=\"table-cell-style-view__header\">Cell properties</div>\n\n <div class=\"table-cell-style-view__content\">\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Border</div>\n\n <div class=\"table-cell-style-view__border-grid\">\n <div class=\"table-cell-style-view__field\">\n <div class=\"table-cell-style-view__field-label\">Width</div>\n <input\n documentEngineInput\n data-testid=\"border-width\"\n [(ngModel)]=\"borderWidth\"\n (ngModelChange)=\"onBorderWidthChange()\"\n placeholder=\"1px\"\n />\n </div>\n\n <div class=\"table-cell-style-view__field\">\n <div class=\"table-cell-style-view__field-label\">Style</div>\n\n <document-engine-select data-testid=\"border-style\" [(value)]=\"borderStyle\" variant=\"outline\">\n <button documentEngineSelectOption value=\"solid\">Solid</button>\n <button documentEngineSelectOption value=\"dashed\">Dashed</button>\n <button documentEngineSelectOption value=\"dotted\">Dotted</button>\n <button documentEngineSelectOption value=\"none\">None</button>\n </document-engine-select>\n </div>\n\n <div class=\"table-cell-style-view__field table-cell-style-view__field--color\">\n <div class=\"table-cell-style-view__field-label\">Color</div>\n\n <div class=\"table-cell-style-view__color-input\">\n <input documentEngineInput [value]=\"borderColor\" readonly />\n\n <button\n *ngIf=\"borderColor\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-cell-style-view__color-clear\"\n data-testid=\"clear-border-color\"\n (click)=\"borderColor = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #borderColorTrigger\n type=\"button\"\n data-testid=\"border-color-trigger\"\n class=\"table-cell-style-view__color-swatch\"\n [style.background-color]=\"borderColor || 'transparent'\"\n (click)=\"toggleColorPicker('border')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"borderColor === 'transparent'\" class=\"table-cell-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for border -->\n <div\n *ngIf=\"showColorPicker === 'border'\"\n [documentEnginePopover]=\"borderColorTrigger\"\n [isOpen]=\"showColorPicker === 'border'\"\n class=\"table-cell-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"border-color\"\n [activeColor]=\"borderColorObj\"\n (colorSelected)=\"onBorderColorSelected($event)\"\n (colorRemoved)=\"onBorderColorRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Background</div>\n <div class=\"table-cell-style-view__field table-cell-style-view__field--color\">\n <div class=\"table-cell-style-view__field-label\">Color</div>\n\n <div class=\"table-cell-style-view__color-input\">\n <input documentEngineInput [value]=\"backgroundColor\" readonly />\n\n <button\n *ngIf=\"backgroundColor\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-cell-style-view__color-clear\"\n data-testid=\"clear-background-color\"\n (click)=\"backgroundColor = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #bgColorTrigger\n type=\"button\"\n data-testid=\"background-color-trigger\"\n class=\"table-cell-style-view__color-swatch\"\n [style.background-color]=\"backgroundColor || 'transparent'\"\n (click)=\"toggleColorPicker('bg')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"backgroundColor === 'transparent'\" class=\"table-cell-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for background -->\n <div\n *ngIf=\"showColorPicker === 'bg'\"\n [documentEnginePopover]=\"bgColorTrigger\"\n [isOpen]=\"showColorPicker === 'bg'\"\n class=\"table-cell-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"background-color\"\n [activeColor]=\"backgroundColorObj\"\n (colorSelected)=\"onBackgroundColorSelected($event)\"\n (colorRemoved)=\"onBackgroundColorRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Text alignment</div>\n\n <document-engine-toggle-group [(value)]=\"textAlign\">\n <button documentEngineToggleOption value=\"left\" title=\"Left\">\n <document-engine-icon name=\"format_align_left\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"center\" title=\"Center\">\n <document-engine-icon name=\"format_align_center\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"right\" title=\"Right\">\n <document-engine-icon name=\"format_align_right\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"justify\" title=\"Justify\">\n <document-engine-icon name=\"format_align_justify\"></document-engine-icon>\n </button>\n </document-engine-toggle-group>\n </div>\n\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Vertical alignment</div>\n\n <document-engine-toggle-group [(value)]=\"vAlign\">\n <button documentEngineToggleOption value=\"top\" title=\"Top\">\n <document-engine-icon name=\"vertical_align_top\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"middle\" title=\"Middle\">\n <document-engine-icon name=\"vertical_align_center\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"bottom\" title=\"Bottom\">\n <document-engine-icon name=\"vertical_align_bottom\"></document-engine-icon>\n </button>\n </document-engine-toggle-group>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"table-cell-style-view__actions\">\n <button documentEngineButton data-testid=\"cancel\" variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n <button documentEngineButton data-testid=\"save\" variant=\"default\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n `,\n styleUrls: ['./table-cell-style-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableCellStyleViewComponent implements BubbleMenuViewContent {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChild('borderColorTrigger', { static: false, read: ElementRef })\n borderColorTrigger!: ElementRef<HTMLElement>;\n @ViewChild('bgColorTrigger', { static: false, read: ElementRef })\n bgColorTrigger!: ElementRef<HTMLElement>;\n\n editor?: Editor;\n goBack?: (viewId?: string) => void;\n\n // State\n borderStyle: 'solid' | 'dashed' | 'dotted' | 'none' | null = null;\n borderColor: string | null = null;\n borderWidth: string | null = '1px';\n\n backgroundColor: string | null = null;\n textAlign: 'left' | 'center' | 'right' | 'justify' | null = null;\n vAlign: 'top' | 'middle' | 'bottom' | null = 'middle';\n\n showColorPicker: 'border' | 'bg' | null = null;\n\n // Color picker state\n colorPalette = COLORS;\n\n private documentClickListener?: () => void;\n\n get borderColorObj(): Color | null {\n return this.borderColor ? Color.from(this.borderColor) : null;\n }\n\n get backgroundColorObj(): Color | null {\n return this.backgroundColor ? Color.from(this.backgroundColor) : null;\n }\n\n onActivate(): void {\n if (!this.editor) return;\n\n const { state } = this.editor;\n const cells = getSelectedCells(state);\n\n if (!cells.length) return;\n\n const backgroundColor = getCombinedCellAttributeValue(\n cells,\n 'backgroundColor',\n TableDefaultAttributes.cellBackgroundColor\n ) as string | null;\n\n const border = getCombinedCellAttributeValue(cells, 'border', TableDefaultAttributes.cellBorder) as TableBorder;\n const textAlign = getCombinedCellAttributeValue(cells, 'textAlign', TableDefaultAttributes.cellTextAlign) as\n | 'left'\n | 'center'\n | 'right'\n | 'justify'\n | null;\n const vAlign = getCombinedCellAttributeValue(cells, 'verticalAlign', TableDefaultAttributes.cellVerticalAlign) as\n | 'top'\n | 'middle'\n | 'bottom'\n | null;\n\n this.backgroundColor = backgroundColor;\n this.borderStyle = (border?.style as 'solid' | 'dashed' | 'dotted' | 'none' | null) || null;\n this.borderColor = (border?.color as string | null) || null;\n this.borderWidth = (border?.width as string | null) || null;\n this.textAlign = textAlign;\n this.vAlign = vAlign;\n this.closeColorPicker();\n\n this.cdr.markForCheck();\n }\n\n toggleColorPicker(type: 'border' | 'bg'): void {\n if (this.showColorPicker === type) {\n this.closeColorPicker();\n } else {\n this.showColorPicker = type;\n this.cdr.markForCheck();\n this.addDocumentClickListener();\n }\n }\n\n closeColorPicker(): void {\n this.showColorPicker = null;\n this.removeDocumentClickListener();\n this.cdr.markForCheck();\n }\n\n private addDocumentClickListener(): void {\n this.documentClickListener = () => this.closeColorPicker();\n\n // Use timeout to avoid immediate close from the same click that opened\n setTimeout(() => {\n if (this.documentClickListener) {\n document.addEventListener('click', this.documentClickListener);\n }\n });\n }\n\n private removeDocumentClickListener(): void {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = undefined;\n }\n }\n\n onBorderColorSelected(color: Color): void {\n this.borderColor = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderColorRemoved(): void {\n this.borderColor = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBackgroundColorSelected(color: Color): void {\n this.backgroundColor = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBackgroundColorRemoved(): void {\n this.backgroundColor = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderWidthChange(): void {\n this.cdr.markForCheck();\n }\n\n onSave(): void {\n // See `normalizeBorderWidth`: a bare number is completed to `px` so the field does\n // not silently do nothing, and unusable input yields `undefined` so the command\n // leaves the width the cell already has rather than clearing it.\n const width = normalizeBorderWidth(this.borderWidth);\n\n this.editor\n ?.chain()\n .focus()\n .setCellBorder({ style: this.borderStyle, color: this.borderColor, width })\n .setCellBackgroundColor(this.backgroundColor)\n .setCellTextAlign(this.textAlign)\n .setCellVerticalAlign(this.vAlign)\n .run();\n\n this.cancel();\n }\n\n cancel(): void {\n this.goBack?.('main');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { NonNullableFormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { CheckboxComponent } from '../../ui/checkbox/checkbox';\nimport { ErrorMessageComponent } from '../../ui/input/error-message';\nimport { InputDirective } from '../../ui/input/input';\n\nexport interface TableCreateViewData {\n rows?: number;\n cols?: number;\n header?: boolean;\n}\n\n/**\n * Table creation view for bubble menu\n * Allows users to configure table dimensions and header row\n */\n@Component({\n selector: 'document-engine-table-create-view',\n standalone: true,\n imports: [\n CommonModule,\n ButtonDirective,\n CheckboxComponent,\n ReactiveFormsModule,\n InputDirective,\n ErrorMessageComponent,\n ],\n template: `\n <div class=\"table-create-view\">\n <!-- Title -->\n <div class=\"table-create-view__header\">Insert Table</div>\n\n <!-- Header option -->\n <form [formGroup]=\"form\" class=\"table-create-view__option\">\n <document-engine-checkbox formControlName=\"header\">Header row</document-engine-checkbox>\n </form>\n\n <!-- Divider -->\n <div class=\"table-create-view__divider\"></div>\n\n <!-- Grid Selector -->\n <div class=\"table-create-view__grid-section\">\n <div class=\"table-create-view__grid-wrapper\">\n <!-- Grid -->\n <div class=\"table-create-view__grid\" (mouseenter)=\"onGridMouseEnter()\" (mouseleave)=\"onGridMouseLeave()\">\n <div *ngFor=\"let row of gridRows\" class=\"table-create-view__grid-row\">\n <div\n *ngFor=\"let col of gridCols\"\n class=\"table-create-view__grid-cell\"\n [class.table-create-view__grid-cell--selected]=\"isBoxSelected(row, col)\"\n (mouseenter)=\"onBoxHover(row, col)\"\n (mousedown)=\"onBoxClick(row, col)\"\n ></div>\n </div>\n </div>\n\n <!-- Dimension display -->\n <div class=\"table-create-view__dimension\">{{ hoveredRows }} × {{ hoveredCols }}</div>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"table-create-view__divider\"></div>\n\n <!-- Form -->\n <div class=\"table-create-view__form\">\n <div class=\"table-create-view__form-label\">Or enter dimensions manually:</div>\n <form [formGroup]=\"form\" class=\"table-create-view__form-fields\">\n <div class=\"table-create-view__form-field\">\n <input\n documentEngineInput\n type=\"number\"\n formControlName=\"rows\"\n min=\"1\"\n [max]=\"MAX_GRID_ROWS\"\n placeholder=\"Rows\"\n />\n <document-engine-error-message *ngIf=\"form.controls.rows.invalid && form.controls.rows.touched\">\n Enter 1-{{ MAX_GRID_ROWS }}\n </document-engine-error-message>\n </div>\n\n <div class=\"table-create-view__form-field\">\n <input\n documentEngineInput\n type=\"number\"\n formControlName=\"cols\"\n min=\"1\"\n [max]=\"MAX_GRID_COLS\"\n placeholder=\"Columns\"\n />\n <document-engine-error-message *ngIf=\"form.controls.cols.invalid && form.controls.cols.touched\">\n Enter 1-{{ MAX_GRID_COLS }}\n </document-engine-error-message>\n </div>\n </form>\n </div>\n\n <!-- Actions -->\n <div class=\"table-create-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" (click)=\"close?.()\">Cancel</button>\n <button\n type=\"button\"\n documentEngineButton\n variant=\"default\"\n (click)=\"onInsertFromForm()\"\n [disabled]=\"form.invalid\"\n >\n Insert\n </button>\n </div>\n </div>\n `,\n styleUrls: ['./table-create-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableCreateViewComponent implements BubbleMenuViewContent<TableCreateViewData> {\n private readonly fb = inject(NonNullableFormBuilder);\n private readonly cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n // Grid configuration\n readonly MAX_GRID_ROWS = 100;\n readonly MAX_GRID_COLS = 10;\n readonly GRID_ROW = 10;\n readonly GRID_COL = this.MAX_GRID_COLS;\n\n gridRows = Array.from({ length: this.GRID_ROW }, (_, i) => i);\n gridCols = Array.from({ length: this.GRID_COL }, (_, i) => i);\n\n // Grid state\n hoveredRows = 1;\n hoveredCols = 1;\n frozenRows: number | null = null;\n frozenCols: number | null = null;\n\n form = this.fb.group({\n rows: this.fb.control(3, {\n validators: [Validators.required, Validators.min(1), Validators.max(this.MAX_GRID_ROWS)],\n }),\n cols: this.fb.control(3, {\n validators: [Validators.required, Validators.min(1), Validators.max(this.MAX_GRID_COLS)],\n }),\n header: this.fb.control(false),\n });\n\n onActivate(attrs: TableCreateViewData): void {\n // Reset form with provided data or defaults\n this.form.patchValue({\n rows: this.clamp(attrs?.rows ?? 3, 1, 50),\n cols: this.clamp(attrs?.cols ?? 3, 1, 20),\n header: attrs?.header ?? false,\n });\n\n // Reset grid state\n this.hoveredRows = 1;\n this.hoveredCols = 1;\n this.frozenRows = null;\n this.frozenCols = null;\n this.cdr.markForCheck();\n }\n\n isBoxSelected(row: number, col: number): boolean {\n const activeRows = this.frozenRows ?? this.hoveredRows;\n const activeCols = this.frozenCols ?? this.hoveredCols;\n return row < activeRows && col < activeCols;\n }\n\n onBoxHover(row: number, col: number): void {\n // Don't update if frozen\n if (this.frozenRows !== null || this.frozenCols !== null) return;\n\n this.hoveredRows = row + 1;\n this.hoveredCols = col + 1;\n }\n\n onBoxClick(row: number, col: number): void {\n const rows = row + 1;\n const cols = col + 1;\n\n if (!this.editor) return;\n\n const header = this.form.controls.header.value;\n\n // Insert table using TipTap's table extension\n this.editor.chain().focus().insertTable({ rows, cols, withHeaderRow: header }).run();\n\n this.close?.();\n }\n\n onGridMouseEnter(): void {\n // Unfreeze when mouse re-enters grid\n this.frozenRows = null;\n this.frozenCols = null;\n }\n\n onGridMouseLeave(): void {\n // Freeze current selection when mouse leaves\n this.frozenRows = this.hoveredRows;\n this.frozenCols = this.hoveredCols;\n }\n\n onInsertFromForm(): void {\n if (!this.editor || this.form.invalid) return;\n\n const { rows, cols, header } = this.form.getRawValue();\n\n // Insert table using TipTap's table extension\n this.editor.chain().focus().insertTable({ rows, cols, withHeaderRow: header }).run();\n\n this.close?.();\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { getCursorCellInfo } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { CellSelection } from '@tiptap/pm/tables';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectLabelDirective } from '../../ui/select/select-label.directive';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\n\n/**\n * Main view for table bubble menu\n * Shows table manipulation controls (rows, columns, cells)\n * Provides navigation to cell and table styling views\n */\n@Component({\n selector: 'document-engine-table-main-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, IconComponent, SelectComponent, SelectOptionDirective, SelectLabelDirective],\n template: `\n <div class=\"table-main-view\">\n <!-- Column actions -->\n <document-engine-select data-testid=\"column-actions\" [(value)]=\"colAction\" (valueChange)=\"handleColAction($event)\" labelMode=\"static\">\n <document-engine-icon documentEngineSelectLabel name=\"table_column\"></document-engine-icon>\n\n <button documentEngineSelectOption value=\"add-before\">Insert column left</button>\n <button documentEngineSelectOption value=\"add-after\">Insert column right</button>\n <button documentEngineSelectOption value=\"delete\">Remove column</button>\n <button documentEngineSelectOption value=\"select\">Select column</button>\n </document-engine-select>\n\n <!-- Row actions -->\n <document-engine-select data-testid=\"row-actions\" [(value)]=\"rowAction\" (valueChange)=\"handleRowAction($event)\" labelMode=\"static\">\n <document-engine-icon documentEngineSelectLabel name=\"table_row\"></document-engine-icon>\n\n <button documentEngineSelectOption value=\"add-before\">Insert row above</button>\n <button documentEngineSelectOption value=\"add-after\">Insert row below</button>\n <button documentEngineSelectOption value=\"delete\">Remove row</button>\n <button documentEngineSelectOption value=\"select\">Select row</button>\n </document-engine-select>\n\n <!-- Cell actions -->\n <document-engine-select data-testid=\"cell-actions\" [(value)]=\"cellAction\" (valueChange)=\"handleCellAction($event)\" labelMode=\"static\">\n <document-engine-icon documentEngineSelectLabel name=\"table_merge_cell\"></document-engine-icon>\n\n <button documentEngineSelectOption data-testid=\"merge-cells\" value=\"merge\" [disabled]=\"!canMerge\">\n Merge cells\n </button>\n <button documentEngineSelectOption data-testid=\"split-cell\" value=\"split\" [disabled]=\"!canSplit\">\n Split cell\n </button>\n </document-engine-select>\n\n <!-- Table style -->\n <button\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n title=\"Table Properties\"\n data-testid=\"table-properties\"\n (click)=\"navigateTo?.('table-style')\"\n >\n <document-engine-icon name=\"table_property\"></document-engine-icon>\n </button>\n\n <!-- Cell style -->\n <button\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n title=\"Cell Properties\"\n data-testid=\"cell-properties\"\n (click)=\"navigateTo?.('cell-style')\"\n >\n <document-engine-icon name=\"table_cell_property\"></document-engine-icon>\n </button>\n </div>\n `,\n styleUrls: ['./table-main-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableMainViewComponent implements BubbleMenuViewContent {\n editor?: Editor;\n navigateTo?: (viewId: string) => void;\n close?: () => void;\n\n colAction: string | null = '';\n rowAction: string | null = '';\n cellAction: string | null = '';\n\n get canMerge(): boolean {\n return this.editor?.can()?.chain()?.focus()?.mergeCells()?.run() || false;\n }\n\n get canSplit(): boolean {\n return this.editor?.can()?.chain()?.focus()?.splitCell()?.run() || false;\n }\n\n handleColAction(action: string | null): void {\n if (!action || !this.editor) return;\n\n switch (action) {\n case 'add-before':\n this.editor.chain().focus().addColumnBefore().run();\n break;\n case 'add-after':\n this.editor.chain().focus().addColumnAfter().run();\n break;\n case 'delete':\n this.editor.chain().focus().deleteColumn().run();\n break;\n case 'select':\n this.setSelection('column');\n break;\n }\n\n // Reset selection\n this.colAction = '';\n }\n\n handleRowAction(action: string | null): void {\n if (!action || !this.editor) return;\n\n switch (action) {\n case 'add-before':\n this.editor.chain().focus().addRowBefore().run();\n break;\n case 'add-after':\n this.editor.chain().focus().addRowAfter().run();\n break;\n case 'delete':\n this.editor.chain().focus().deleteRow().run();\n break;\n case 'select':\n this.setSelection('row');\n break;\n }\n\n // Reset selection\n this.rowAction = '';\n }\n\n handleCellAction(action: string | null): void {\n if (!action || !this.editor) return;\n\n switch (action) {\n case 'merge':\n this.editor.chain().focus().mergeCells().run();\n break;\n case 'split':\n this.editor.chain().focus().splitCell().run();\n break;\n }\n\n // Reset selection\n this.cellAction = '';\n }\n\n setSelection(selection: 'column' | 'row'): void {\n if (!this.editor) return;\n\n const { state, view } = this.editor;\n\n const cellInfo = getCursorCellInfo(state);\n if (!cellInfo) {\n this.close?.();\n return;\n }\n\n const { map, tableStart, rowIndex, colIndex } = cellInfo;\n\n if (selection === 'row') {\n // Select the entire row\n const firstCellPos = tableStart + map.map[rowIndex * map.width];\n const lastCellPos = tableStart + map.map[rowIndex * map.width + map.width - 1];\n\n const $anchor = state.doc.resolve(firstCellPos);\n const $head = state.doc.resolve(lastCellPos);\n\n const cellSelection = CellSelection.rowSelection($anchor, $head);\n const tr = state.tr.setSelection(cellSelection);\n view.dispatch(tr);\n view.focus();\n this.close?.();\n return;\n }\n\n // Select the entire column\n const firstCellPos = tableStart + map.map[colIndex];\n const lastCellPos = tableStart + map.map[colIndex + (map.height - 1) * map.width];\n\n const $anchor = state.doc.resolve(firstCellPos);\n const $head = state.doc.resolve(lastCellPos);\n\n const cellSelection = CellSelection.colSelection($anchor, $head);\n const tr = state.tr.setSelection(cellSelection);\n view.dispatch(tr);\n view.focus();\n this.close?.();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, ViewChild, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color, getCursorCellInfo, TableDefaultAttributes } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { COLORS } from '../../constants/color.constant';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { PopoverDirective } from '../../core/popover.directive';\nimport { ButtonDirective } from '../../ui/button';\nimport { ColorPickerComponent } from '../../ui/color-picker';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\nimport { normalizeBorderWidth } from './border-width.util';\n\n/**\n * Table style view for table bubble menu\n * Allows styling the entire table (borders, background, dimensions, alignment)\n */\n@Component({\n selector: 'document-engine-table-style-view',\n standalone: true,\n imports: [\n CommonModule,\n IconComponent,\n ButtonDirective,\n InputDirective,\n SelectComponent,\n SelectOptionDirective,\n FormsModule,\n ColorPickerComponent,\n PopoverDirective,\n ],\n template: `\n <div class=\"table-style-view\">\n <!-- Title -->\n <div class=\"table-style-view__header\">Table Properties</div>\n\n <div class=\"table-style-view__content\">\n <div class=\"table-style-view__section\">\n <div class=\"table-style-view__section-label\">Border</div>\n\n <div class=\"table-style-view__border-grid\">\n <div class=\"table-style-view__field\">\n <div class=\"table-style-view__field-label\">Width</div>\n\n <input\n documentEngineInput\n data-testid=\"border-width\"\n [(ngModel)]=\"borderWidth\"\n (ngModelChange)=\"onBorderWidthChange()\"\n placeholder=\"1px\"\n />\n </div>\n\n <div class=\"table-style-view__field\">\n <div class=\"table-style-view__field-label\">Style</div>\n\n <document-engine-select data-testid=\"border-style\" [(value)]=\"borderStyle\" variant=\"outline\">\n <button documentEngineSelectOption value=\"solid\">Solid</button>\n <button documentEngineSelectOption value=\"double\">Double</button>\n <button documentEngineSelectOption value=\"dashed\">Dashed</button>\n <button documentEngineSelectOption value=\"dotted\">Dotted</button>\n <button documentEngineSelectOption value=\"none\">None</button>\n </document-engine-select>\n </div>\n\n <div class=\"table-style-view__field table-style-view__field--color\">\n <div class=\"table-style-view__field-label\">Color</div>\n <div class=\"table-style-view__color-input\">\n <input documentEngineInput [value]=\"borderColor\" readonly />\n\n <button\n *ngIf=\"borderColor\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-style-view__color-clear\"\n data-testid=\"clear-border-color\"\n (click)=\"borderColor = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #borderColorTrigger\n type=\"button\"\n data-testid=\"border-color-trigger\"\n class=\"table-style-view__color-swatch\"\n [style.background-color]=\"borderColor || 'transparent'\"\n (click)=\"toggleColorPicker('border')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"borderColor === 'transparent'\" class=\"table-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for border -->\n <div\n *ngIf=\"showColorPicker === 'border'\"\n [documentEnginePopover]=\"borderColorTrigger\"\n [isOpen]=\"showColorPicker === 'border'\"\n class=\"table-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"border-color\"\n [activeColor]=\"borderColorObj\"\n (colorSelected)=\"onBorderColorSelected($event)\"\n (colorRemoved)=\"onBorderColorRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-style-view__section\">\n <div class=\"table-style-view__section-label\">Background</div>\n <div class=\"table-style-view__field table-style-view__field--color\">\n <div class=\"table-style-view__field-label\">Color</div>\n\n <div class=\"table-style-view__color-input\">\n <input documentEngineInput [value]=\"tableBg\" readonly />\n\n <button\n *ngIf=\"tableBg\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-style-view__color-clear\"\n data-testid=\"clear-background-color\"\n (click)=\"tableBg = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #bgColorTrigger\n type=\"button\"\n data-testid=\"background-color-trigger\"\n class=\"table-style-view__color-swatch\"\n [style.background-color]=\"tableBg || 'transparent'\"\n (click)=\"toggleColorPicker('bg')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"tableBg === 'transparent'\" class=\"table-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for background -->\n <div\n *ngIf=\"showColorPicker === 'bg'\"\n [documentEnginePopover]=\"bgColorTrigger\"\n [isOpen]=\"showColorPicker === 'bg'\"\n class=\"table-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"background-color\"\n [activeColor]=\"tableBgObj\"\n (colorSelected)=\"onTableBgSelected($event)\"\n (colorRemoved)=\"onTableBgRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"table-style-view__actions\">\n <button documentEngineButton data-testid=\"cancel\" variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n <button documentEngineButton data-testid=\"save\" variant=\"default\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n `,\n styleUrls: ['./table-style-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableStyleViewComponent implements BubbleMenuViewContent {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChild('borderColorTrigger', { static: false, read: ElementRef })\n borderColorTrigger!: ElementRef<HTMLElement>;\n @ViewChild('bgColorTrigger', { static: false, read: ElementRef })\n bgColorTrigger!: ElementRef<HTMLElement>;\n\n editor?: Editor;\n goBack?: (viewId?: string) => void;\n\n // State\n borderStyle: 'solid' | 'double' | 'dashed' | 'dotted' | 'none' | null = null;\n borderColor: string | null = null;\n borderWidth: string | null = null;\n tableBg: string | null = null;\n\n showColorPicker: 'border' | 'bg' | null = null;\n\n // Color picker state\n colorPalette = COLORS;\n\n private documentClickListener?: () => void;\n\n get borderColorObj(): Color | null {\n return this.borderColor ? Color.from(this.borderColor) : null;\n }\n\n get tableBgObj(): Color | null {\n return this.tableBg ? Color.from(this.tableBg) : null;\n }\n\n onActivate(): void {\n if (!this.editor) return;\n\n const { state } = this.editor;\n const cellInfo = getCursorCellInfo(state);\n if (!cellInfo) return;\n\n const tableAttrs = cellInfo.tableNode.attrs;\n\n // Initialize border signals from table attributes\n this.borderStyle = tableAttrs['border']?.['style'] || TableDefaultAttributes.border.style;\n this.borderColor = tableAttrs['border']?.['color'] || TableDefaultAttributes.border.color;\n this.borderWidth = tableAttrs['border']?.['width'] || TableDefaultAttributes.border.width;\n\n this.tableBg = tableAttrs['backgroundColor'] || null;\n this.closeColorPicker();\n\n this.cdr.markForCheck();\n }\n\n toggleColorPicker(type: 'border' | 'bg'): void {\n if (this.showColorPicker === type) {\n this.closeColorPicker();\n } else {\n this.showColorPicker = type;\n this.cdr.markForCheck();\n this.addDocumentClickListener();\n }\n }\n\n closeColorPicker(): void {\n this.showColorPicker = null;\n this.removeDocumentClickListener();\n this.cdr.markForCheck();\n }\n\n private addDocumentClickListener(): void {\n this.documentClickListener = () => this.closeColorPicker();\n\n // Use timeout to avoid immediate close from the same click that opened\n setTimeout(() => {\n if (this.documentClickListener) {\n document.addEventListener('click', this.documentClickListener);\n }\n });\n }\n\n private removeDocumentClickListener(): void {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = undefined;\n }\n }\n\n onBorderColorSelected(color: Color): void {\n this.borderColor = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderColorRemoved(): void {\n this.borderColor = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onTableBgSelected(color: Color): void {\n this.tableBg = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onTableBgRemoved(): void {\n this.tableBg = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderWidthChange(): void {\n this.cdr.markForCheck();\n }\n\n onSave(): void {\n const editor = this.editor;\n if (!editor) return;\n\n // Complete a bare number to `px` before it reaches the command; `border-width: 3`\n // is invalid CSS and would be dropped without any feedback. `undefined` here means\n // the input was not a width at all, and the command leaves the current one alone.\n const width = normalizeBorderWidth(this.borderWidth);\n\n editor\n .chain()\n .focus()\n .setTableBorder({ style: this.borderStyle, color: this.borderColor, width })\n .setTableBackgroundColor(this.tableBg)\n .run();\n\n this.cancel();\n }\n\n cancel(): void {\n this.goBack?.('main');\n }\n}\n","import { EditorBubbleMenuConfig, ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { TableCellStyleViewComponent } from '../views/table-views/table-cell-style-view';\nimport { TableCreateViewComponent } from '../views/table-views/table-create-view';\nimport { TableMainViewComponent } from '../views/table-views/table-main-view';\nimport { TableStyleViewComponent } from '../views/table-views/table-style-view';\n\nexport const TableBubbleConfig: EditorBubbleMenuConfig = {\n props: {\n pluginKey: 'TableBubbleMenu',\n mountTo: 'table',\n },\n target: {\n kind: 'node',\n name: ['tableCell', 'tableHeader'],\n allowEmptySelection: true,\n requireFocus: false,\n },\n views: [\n {\n id: 'main',\n component: TableMainViewComponent,\n label: 'Table',\n isDefault: true,\n },\n {\n id: 'table-style',\n component: TableStyleViewComponent,\n label: 'Table Properties',\n },\n {\n id: 'cell-style',\n component: TableCellStyleViewComponent,\n label: 'Cell Properties',\n },\n ],\n};\n\nexport const TableCreateBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'TableCreateBubbleMenu',\n views: [\n {\n id: 'create',\n component: TableCreateViewComponent,\n label: 'Create Table',\n isDefault: true,\n },\n ],\n};\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { TemplateItem } from '../../types/template.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\n\n/**\n * Template view for bubble menu\n * Shows templates for insertion into the editor\n * Replaces entire editor content with selected template\n */\n@Component({\n selector: 'document-engine-template-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, IconComponent],\n template: `\n <div class=\"template-view\">\n <!-- Title -->\n <div class=\"template-view__header\">Templates</div>\n\n <!-- Search Bar -->\n <div class=\"template-view__search\">\n <div class=\"template-view__search-field\">\n <label documentEngineLabel for=\"search-input\">Search templates</label>\n <div class=\"template-view__search-input-wrapper\">\n <document-engine-icon name=\"search\" class=\"template-view__search-icon\"></document-engine-icon>\n <input\n documentEngineInput\n id=\"search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n aria-label=\"Search templates\"\n />\n </div>\n </div>\n </div>\n\n <!-- Templates List -->\n <div class=\"template-view__list-container\">\n <div *ngIf=\"filteredTemplates.length > 0; else noResults\" class=\"template-view__list\">\n <button\n *ngFor=\"let template of filteredTemplates\"\n type=\"button\"\n class=\"template-view__template-item\"\n (click)=\"insertTemplate(template)\"\n [attr.aria-label]=\"template.title + (template.description ? ' - ' + template.description : '')\"\n [title]=\"template.description || template.title\"\n >\n <div class=\"template-view__template-title\">{{ template.title }}</div>\n <div *ngIf=\"template.description\" class=\"template-view__template-description\">\n {{ template.description }}\n </div>\n </button>\n </div>\n\n <ng-template #noResults>\n <div class=\"template-view__empty\">\n <document-engine-icon name=\"search_off\" class=\"template-view__empty-icon\"></document-engine-icon>\n <div class=\"template-view__empty-text\">No templates found matching \"{{ searchQuery }}\"</div>\n </div>\n </ng-template>\n </div>\n\n <!-- Actions -->\n <div class=\"template-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./template-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TemplateViewComponent implements BubbleMenuViewContent<Record<string, unknown>>, OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n searchQuery = '';\n originalTemplates: TemplateItem[] = [];\n\n // Reactive form control for search\n searchControl = new FormControl('');\n private destroy$ = new Subject<void>();\n\n onActivate(attrs: Record<string, unknown>): void {\n const templates = attrs['templates'] as TemplateItem[];\n if (!templates) throw new Error('Templates are required');\n this.originalTemplates = templates;\n this.searchQuery = '';\n this.searchControl.setValue('');\n this.cdr.markForCheck();\n }\n\n ngOnInit(): void {\n // Set up reactive form subscription with debounce\n this.searchControl.valueChanges\n .pipe(debounceTime(200), distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((value) => {\n this.searchQuery = value || '';\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Getter that filters templates based on search query\n */\n get filteredTemplates(): TemplateItem[] {\n const query = this.searchQuery.toLowerCase().trim();\n\n if (!query) return this.originalTemplates;\n\n // Filter templates based on search query\n return this.originalTemplates.filter(\n (template) => template.title.toLowerCase().includes(query) || template.description?.toLowerCase().includes(query)\n );\n }\n\n /**\n * Insert a template into the editor, replacing entire content\n */\n insertTemplate(template: TemplateItem): void {\n if (!this.editor) return;\n\n // Replace entire editor content with template data\n this.editor.chain().focus().setContent(template.data).run();\n this.close?.();\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { TemplateViewComponent } from '../views/template-view/template-view';\n\nexport const TemplateBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'TemplateBubbleMenu',\n maxWidth: '400px',\n width: '400px',\n views: [\n {\n id: 'templates',\n component: TemplateViewComponent,\n label: 'Templates',\n isDefault: true,\n },\n ],\n};\n","import { HeadingLevel } from '../types/heading.type';\n\nexport const FONT_SIZE_OPTIONS = [\n { value: '12px', label: '12px' },\n { value: '14px', label: '14px' },\n { value: '16px', label: '16px' },\n { value: '18px', label: '18px' },\n { value: '20px', label: '20px' },\n];\n\nexport const LINE_HEIGHT_OPTIONS = [\n { value: null, label: 'Default' },\n { value: '1', label: '1' },\n { value: '1.5', label: '1.5' },\n { value: '2', label: '2' },\n { value: '2.5', label: '2.5' },\n { value: '3', label: '3' },\n];\n\nexport const TEXT_CASE_OPTIONS = [\n { value: 'uppercase', label: 'UPPERCASE' },\n { value: 'lowercase', label: 'lowercase' },\n { value: 'capitalize', label: 'Capitalize' },\n];\n\nexport interface HeadingOption {\n value: HeadingLevel | null;\n label: string;\n class: string;\n}\n\n/**\n * Heading levels offered when `heading` is enabled without an explicit `levels`\n * array — mirrors the Tiptap Heading extension default (1–6).\n */\nexport const DEFAULT_HEADING_LEVELS: HeadingLevel[] = [1, 2, 3, 4, 5, 6];\n\n/**\n * Build the block-type dropdown options from the editor's configured heading\n * levels, so the toolbar offers exactly the levels the editor can produce: no\n * dead entry for a level the config omits, and no configured level left\n * unreachable. The leading \"Normal text\" (paragraph) entry is always present.\n * Levels are de-duplicated and sorted ascending; an empty or omitted list falls\n * back to {@link DEFAULT_HEADING_LEVELS}.\n */\nexport function buildHeadingOptions(levels?: readonly number[]): HeadingOption[] {\n const source = levels && levels.length > 0 ? levels : DEFAULT_HEADING_LEVELS;\n const sorted = [...new Set(source)].sort((a, b) => a - b);\n return [\n { value: null, label: 'Normal text', class: '' },\n ...sorted.map((level) => ({\n value: level as HeadingLevel,\n label: `Heading ${level}`,\n class: `h${level}`,\n })),\n ];\n}\n\nexport const TEXT_ALIGN_OPTIONS = [\n { value: 'left', label: 'Align Left', icon: 'format_align_left' },\n { value: 'center', label: 'Align Center', icon: 'format_align_center' },\n { value: 'right', label: 'Align Right', icon: 'format_align_right' },\n { value: 'justify', label: 'Align Justify', icon: 'format_align_justify' },\n];\n","export const LIST_STYLE_OPTIONS = [\n { value: 'decimal', label: 'Decimal', example: '1.' },\n { value: 'lower-alpha-dot', label: 'Lower Alpha', example: 'a.' },\n { value: 'lower-alpha-parens', label: 'Lower Alpha (Parentheses)', example: '(a)' },\n { value: 'lower-roman-parens', label: 'Lower Roman', example: '(i)' },\n];\n","import { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n inject,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { getClosestDomElement } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport {\n BubbleMenuViewConfig,\n BubbleMenuViewContent,\n EditorBubbleMenuConfig,\n} from '../../core/bubble-menu/bubble-menu.type';\nimport { FocusTrapService } from '../../core/focus-trap.service';\nimport { selectionChangeHandler, shouldShowFnFactory } from '../../core/bubble-menu/bubble-menu.util';\nimport { TiptapBubbleMenuDirective } from '../../core/bubble-menu/bubble-menu.directive';\n\n@Component({\n selector: 'document-engine-editor-bubble-menu',\n standalone: true,\n imports: [CommonModule, TiptapBubbleMenuDirective],\n template: `\n <div\n #bubbleElement\n class=\"bubble-menu-wrapper\"\n tiptapBubbleMenu\n [editor]=\"editor\"\n [props]=\"config.props!\"\n [mountTo]=\"mountTo\"\n [shouldShow]=\"shouldShowFn\"\n >\n <!-- View component will be dynamically inserted here -->\n <ng-container #viewContainer></ng-container>\n </div>\n `,\n styleUrls: ['./editor-bubble-menu.wrapper.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EditorBubbleMenuComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input() editor!: Editor;\n @Input() config!: EditorBubbleMenuConfig;\n\n @ViewChild('viewContainer', { read: ViewContainerRef }) private viewContainer!: ViewContainerRef;\n @ViewChild('bubbleElement') private bubbleElement!: ElementRef<HTMLElement>;\n\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private document = inject(DOCUMENT);\n private focusTrap = inject(FocusTrapService);\n private currentViewRef: ComponentRef<BubbleMenuViewContent> | null = null;\n private currentViewId: string | null = null;\n private currentAttributes: Record<string, unknown> = {};\n private cleanupSelection: (() => void) | null = null;\n private shouldShowImpl: (() => boolean) | null = null;\n\n private viewReady = false;\n private keyToSignal = new Map<string, { value: boolean }>();\n private forceOpen: { value: boolean } = { value: false };\n private documentClickHandler!: (event: MouseEvent) => void;\n\n // Stable function reference for template binding\n shouldShowFn = () => (this.shouldShowImpl ? this.shouldShowImpl() : false);\n\n get mountTo() {\n const mountTo = this.config.props?.mountTo;\n if (!mountTo) return undefined;\n return () => getClosestDomElement(this.editor, mountTo);\n }\n\n ngOnInit(): void {\n const editor = this.editor;\n const config = this.config;\n\n if (!config.props?.pluginKey) {\n throw new Error('Required: Input `props.pluginKey`');\n }\n\n // Initialize force open signal\n this.forceOpen = this.signalFor(config.props?.pluginKey);\n\n // Setup shouldShow logic\n this.shouldShowImpl = shouldShowFnFactory({\n editor,\n target: config.target,\n forceOpen: () => this.forceOpen.value,\n });\n\n // Setup selection change handler\n this.cleanupSelection = selectionChangeHandler({\n editor,\n target: config.target,\n onActive: (attrs) => this.ngZone.run(() => this.handleActivate(attrs)),\n onInactive: () => this.ngZone.run(() => this.handleDeactivate()),\n });\n\n this.addDocumentClickHandler();\n }\n\n ngAfterViewInit(): void {\n this.viewReady = true;\n // const bubbleElement = this.bubbleElement?.nativeElement;\n // if (bubbleElement) {\n // this.focusTrap.attach(bubbleElement);\n // }\n }\n\n ngOnDestroy(): void {\n if (this.cleanupSelection) {\n this.cleanupSelection();\n this.cleanupSelection = null;\n }\n\n this.destroyCurrentView();\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n this.focusTrap.detach(bubbleElement);\n }\n this.document.removeEventListener('mousedown', this.documentClickHandler);\n }\n\n private addDocumentClickHandler() {\n this.documentClickHandler = (event: MouseEvent) => {\n const target = event.target as Node;\n\n // Check if click is inside editor or its children\n const isClickInsideEditor = (this.editor.options.element as HTMLElement | undefined)?.contains(target);\n\n // Check if click is inside bubble menu or its children\n const isClickInsideBubbleMenu = this.bubbleElement?.nativeElement?.contains(target);\n\n // Check if click is inside a CDK overlay (e.g., MatSelect dropdown, MatMenu, etc.)\n // These are rendered outside the bubble but should not close it\n const isInsideOverlay =\n target instanceof Element && !!target.closest('.cdk-overlay-container, .cdk-overlay-pane');\n\n if (!isClickInsideEditor && !isClickInsideBubbleMenu && !isInsideOverlay) {\n // If click is completely outside, manually deactivate the bubble\n // and blur the editor to maintain correct focus state\n this.handleDeactivate();\n }\n };\n\n // Use mousedown for faster response than click\n this.document.addEventListener('mousedown', this.documentClickHandler);\n }\n\n /**\n * Public method to force open the bubble menu\n */\n showBubble(): void {\n // Select view for force-open scenario\n const viewId = this.selectInitialView({}, true);\n if (!viewId) {\n console.warn('[BubbleMenuMultiView] No view configured for force-open');\n return;\n }\n\n const hostElement = this.bubbleElement?.nativeElement;\n if (!hostElement) {\n console.error('[BubbleMenuMultiView] Bubble element not found');\n return;\n }\n\n // Open the bubble\n this.forceOpen.value = true;\n this.editor.commands.focus();\n this.editor.view.dispatch(this.editor.state.tr);\n\n // Attach outside click/escape listeners\n // this.eventManager.attach(this.config.pluginKey, hostElement, this.hideBubble.bind(this));\n\n // Show the view\n this.showView(viewId);\n this.cdr.markForCheck();\n }\n\n /**\n * Handle close request from view\n */\n hideBubble(): void {\n this.forceOpen.value = false;\n // this.eventManager.detach(this.config.pluginKey);\n this.destroyCurrentView();\n this.cdr.markForCheck();\n }\n\n /**\n * Handle when target mark/node becomes active\n */\n private handleActivate(attrs: Record<string, unknown>): void {\n if (!this.viewReady) {\n return;\n }\n\n this.currentAttributes = attrs;\n\n // Select which view to show\n const viewId = this.selectInitialView(attrs, false);\n\n if (!viewId) {\n console.warn('[BubbleMenuMultiView] No suitable view found for attributes:', attrs);\n return;\n }\n\n // Attach outside click/escape listeners\n // const bubbleElement = this.bubbleElement?.nativeElement;\n // const isAttached = this.eventManager.isAttached(this.config.pluginKey);\n // if (bubbleElement && !isAttached) {\n // this.eventManager.attach(this.config.pluginKey, bubbleElement, this.hideBubble.bind(this));\n // }\n\n // If view is already showing, just update it with new attributes\n if (this.currentViewId === viewId && this.currentViewRef) {\n // Attributes changed but same view - call onActivate to update\n this.activateView(this.currentViewRef);\n } else {\n // Different view - show it\n this.showView(viewId);\n }\n }\n\n /**\n * Handle when target mark/node becomes inactive\n */\n private handleDeactivate(): void {\n // Mark bubble as hidden\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n bubbleElement.removeAttribute('data-visible');\n }\n\n // // Detach outside click/escape listeners\n // const isAttached = this.eventManager.isAttached(this.config.pluginKey);\n // if (isAttached) {\n // this.eventManager.detach(this.config.pluginKey);\n // }\n\n // Reset force open state\n this.forceOpen.value = false;\n\n this.destroyCurrentView();\n this.currentAttributes = {};\n\n this.cdr.markForCheck();\n }\n\n /**\n * Select which view should be shown initially\n */\n private selectInitialView(attrs: Record<string, unknown>, isForceOpen: boolean): string | null {\n const config = this.config;\n\n // If force-opening, find view with showOnForceOpen\n if (isForceOpen) {\n const forceOpenView = config.views.find((v) => v.showOnForceOpen);\n if (forceOpenView) return forceOpenView.id;\n }\n\n // Find first view that matches showWhen condition\n for (const view of config.views) {\n if (view.showWhen && view.showWhen(attrs)) {\n return view.id;\n }\n }\n\n // Fall back to default view\n const defaultView = config.views.find((v) => v.isDefault);\n if (defaultView) return defaultView.id;\n\n // If no default, use first view\n return config.views[0]?.id || null;\n }\n\n /**\n * Show a specific view by ID\n */\n private showView(viewId: string): void {\n // If already showing this view, do nothing\n if (this.currentViewId === viewId && this.currentViewRef) {\n return;\n }\n\n // Find view config\n const viewConfig = this.findViewConfig(viewId);\n if (!viewConfig) {\n console.error(`[BubbleMenuMultiView] View not found: ${viewId}`);\n return;\n }\n\n // Destroy current view if exists\n if (this.currentViewRef) {\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n }\n\n // Create new view\n this.currentViewRef = this.createView(viewConfig);\n this.currentViewId = viewId;\n\n // Activate new view\n this.activateView(this.currentViewRef);\n\n // Trigger change detection for the child component to render immediately\n // (the view is created imperatively, so it is outside Angular's normal CD pass)\n this.cdr.markForCheck();\n\n // Mark bubble as visible for transition handling\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement && this.config.target?.requireFocus) {\n // Use requestAnimationFrame to ensure the DOM is updated first\n requestAnimationFrame(() => {\n bubbleElement.setAttribute('data-visible', 'true');\n // Re-setup focus trap after view is created (focusable elements may have changed)\n // this.focusTrap.reattach(bubbleElement, true);\n });\n }\n }\n\n /**\n * Create a view component\n */\n private createView(viewConfig: BubbleMenuViewConfig): ComponentRef<BubbleMenuViewContent> {\n if (!this.viewContainer) {\n throw new Error('[BubbleMenuMultiView] View container not found');\n }\n\n // Clear container\n this.viewContainer.clear();\n\n // Create component\n const componentRef = this.viewContainer.createComponent(viewConfig.component);\n\n // Inject dependencies\n const instance = componentRef.instance;\n instance.editor = this.editor;\n instance.viewId = viewConfig.id;\n instance.navigateTo = this.handleNavigateTo.bind(this);\n instance.goBack = this.handleGoBack.bind(this);\n instance.close = this.hideBubble.bind(this);\n\n return componentRef;\n }\n\n /**\n * Activate a view (call onActivate)\n */\n private activateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onActivate) return;\n componentRef.instance.onActivate(this.currentAttributes);\n }\n\n /**\n * Deactivate a view (call onDeactivate)\n */\n private deactivateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onDeactivate) return;\n componentRef.instance.onDeactivate();\n }\n\n /**\n * Destroy current view\n */\n private destroyCurrentView(): void {\n if (!this.currentViewRef) return;\n\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n this.currentViewId = null;\n }\n\n /**\n * Handle navigation request from view\n */\n private handleNavigateTo(viewId: string): void {\n // Validate view exists\n if (!this.findViewConfig(viewId)) {\n console.error(`[BubbleMenuMultiView] Cannot navigate to non-existent view: ${viewId}`);\n return;\n }\n\n // Navigate to view\n this.showView(viewId);\n }\n\n /**\n * Handle go back request from view\n */\n private handleGoBack(viewId?: string): void {\n // Navigate to specific view\n if (viewId) {\n this.handleNavigateTo(viewId);\n return;\n }\n\n // Close bubble if no target specified\n this.hideBubble();\n }\n\n /**\n * Find view config by ID\n */\n private findViewConfig(viewId: string): BubbleMenuViewConfig | null {\n return this.config.views.find((v) => v.id === viewId) || null;\n }\n\n signalFor(key: string): { value: boolean } {\n let s = this.keyToSignal.get(key);\n if (!s) {\n s = { value: false };\n this.keyToSignal.set(key, s);\n }\n return s;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n EnvironmentInjector,\n inject,\n Input,\n OnDestroy,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { Editor } from '@tiptap/core';\nimport {\n BubbleMenuViewConfig,\n BubbleMenuViewContent,\n ToolbarBubbleMenuConfig,\n} from '../../core/bubble-menu/bubble-menu.type';\nimport { EventManager } from '../../core/event-manager';\nimport { FocusTrapService } from '../../core/focus-trap.service';\n\n/**\n * A bubble menu wrapper specifically for toolbar buttons\n * Unlike the regular bubble menu, this one is positioned relative to toolbar buttons\n * and doesn't depend on text selection in the editor\n */\n@Component({\n selector: 'document-engine-toolbar-bubble-menu',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div\n #bubbleElement\n class=\"toolbar-bubble-menu\"\n [class.toolbar-bubble-menu--hidden]=\"!isVisible\"\n [style.width]=\"config.width || 'auto'\"\n [style.maxWidth]=\"config.maxWidth || '320px'\"\n >\n <ng-container #viewContainer></ng-container>\n </div>\n `,\n // The panel's surface ships as library CSS (see the .scss), not as Tailwind\n // utilities in the template: utilities like `bg-card` / `shadow-elevation-2`\n // only exist if the HOST app's tailwind.config.js defines those theme keys.\n styleUrls: ['./toolbar-bubble-menu.wrapper.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolbarBubbleMenuComponent implements AfterViewInit, OnDestroy {\n @Input() editor!: Editor;\n @Input() config!: ToolbarBubbleMenuConfig;\n\n private cdr = inject(ChangeDetectorRef);\n private eventManager = inject(EventManager);\n private focusTrap = inject(FocusTrapService);\n\n @ViewChild('bubbleElement') private bubbleElement!: ElementRef<HTMLElement>;\n @ViewChild('viewContainer', { read: ViewContainerRef }) private viewContainer!: ViewContainerRef;\n\n private currentViewRef: ComponentRef<BubbleMenuViewContent> | null = null;\n private currentViewId: string | null = null;\n private currentAttributes: Record<string, unknown> = {};\n private cleanupAutoUpdate?: () => void;\n private positionTimeout?: ReturnType<typeof setTimeout>;\n\n isVisible = false;\n\n ngAfterViewInit(): void {\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n this.focusTrap.attach(bubbleElement, true);\n }\n }\n\n ngOnDestroy(): void {\n this.destroyCurrentView();\n this.hideBubble();\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n this.focusTrap.detach(bubbleElement);\n }\n }\n\n isActive(type: 'text' | 'fill'): boolean {\n return this.isVisible && this.currentAttributes['type'] === type;\n }\n\n toggleBubble(targetElement: HTMLElement, attrs: Record<string, unknown> = {}, viewId?: string): void {\n if (this.isVisible) {\n this.hideBubble();\n return;\n }\n\n this.showBubble(targetElement, attrs, viewId);\n }\n\n /**\n * Show the bubble menu positioned relative to a target element (toolbar button)\n */\n showBubble(targetElement: HTMLElement, attrs: Record<string, unknown> = {}, viewId?: string): void {\n this.currentAttributes = attrs;\n\n this.isVisible = true;\n\n // Create and show the view\n const initialView = this.selectInitialView(attrs, viewId);\n if (!initialView) {\n console.warn('[ToolbarBubbleMenu] No suitable view to show');\n return;\n }\n this.showView(initialView);\n\n // Position the bubble relative to the target element\n // TODO: It make the bubble jump when the bubble is opened\n clearTimeout(this.positionTimeout);\n this.positionTimeout = setTimeout(() => this.positionBubble(targetElement), 0);\n\n // Attach outside click/escape listeners using the bubble element, not the toolbar button\n const bubbleEl = this.bubbleElement?.nativeElement;\n if (bubbleEl) {\n this.eventManager.attach(this.config.pluginKey, bubbleEl, this.hideBubble.bind(this), targetElement);\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Hide the bubble menu\n */\n hideBubble(): void {\n this.isVisible = false;\n // Cancel a positioning pass that has not run yet. `showBubble` defers it by a\n // tick, so a show-then-immediately-hide (or a teardown) would otherwise let it\n // fire afterwards and register a fresh `autoUpdate` — scroll/resize listeners\n // plus a Resize and an Intersection observer — on a hidden or detached\n // element, with the handle for disposing it already thrown away.\n clearTimeout(this.positionTimeout);\n this.positionTimeout = undefined;\n this.cleanupAutoUpdate?.();\n this.cleanupAutoUpdate = undefined;\n this.eventManager.detach(this.config.pluginKey);\n this.destroyCurrentView();\n this.cdr.markForCheck();\n }\n\n private selectInitialView(attrs: Record<string, unknown>, requestedViewId?: string): string | null {\n const config = this.config;\n\n if (requestedViewId && this.findViewConfig(requestedViewId)) return requestedViewId;\n\n // Find first view that matches showWhen condition\n for (const v of config.views) {\n if (!v.showWhen || v.showWhen(attrs)) return v.id;\n }\n\n // Fall back to default view\n const defaultView = config.views.find((v) => v.isDefault);\n if (defaultView) return defaultView.id;\n\n // If no default, use first view\n return config.views[0]?.id || null;\n }\n\n private showView(viewId: string): void {\n // If already showing this view, do nothing\n if (this.currentViewId === viewId && this.currentViewRef) {\n return;\n }\n\n // Find view config\n const viewConfig = this.findViewConfig(viewId);\n if (!viewConfig) {\n console.error(`[ToolbarBubbleMenu] View not found: ${viewId}`);\n return;\n }\n\n // Destroy current view if exists\n if (this.currentViewRef) {\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n }\n\n this.currentViewRef = this.createView(viewConfig);\n this.currentViewId = viewId;\n\n // Activate new view\n this.activateView(this.currentViewRef);\n\n // Re-setup focus trap after view is created (focusable elements may have changed)\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n setTimeout(() => {\n this.focusTrap.reattach(bubbleElement, true);\n }, 0);\n }\n }\n\n private createView(viewConfig: BubbleMenuViewConfig): ComponentRef<BubbleMenuViewContent> {\n if (!this.viewContainer) {\n throw new Error('[ToolbarBubbleMenu] View container not found');\n }\n\n // Clear container\n this.viewContainer.clear();\n\n // Create component with proper environment injector (standalone support)\n const envInjector = this.viewContainer.injector.get(EnvironmentInjector);\n const componentRef = this.viewContainer.createComponent(viewConfig.component, {\n environmentInjector: envInjector,\n });\n\n // Inject dependencies\n const instance = componentRef.instance;\n instance.editor = this.editor;\n instance.viewId = viewConfig.id;\n instance.navigateTo = this.handleNavigateTo.bind(this);\n instance.goBack = this.handleGoBack.bind(this);\n instance.close = this.hideBubble.bind(this);\n\n return componentRef;\n }\n\n private activateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onActivate) return;\n componentRef.instance.onActivate(this.currentAttributes);\n }\n\n private deactivateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onDeactivate) return;\n componentRef.instance.onDeactivate();\n }\n\n private destroyCurrentView(): void {\n if (!this.currentViewRef) return;\n\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n this.currentViewId = null;\n }\n\n private handleNavigateTo(viewId: string): void {\n if (!this.findViewConfig(viewId)) {\n console.error(`[ToolbarBubbleMenu] Cannot navigate to non-existent view: ${viewId}`);\n return;\n }\n this.showView(viewId);\n }\n\n private handleGoBack(viewId?: string): void {\n if (viewId) {\n this.handleNavigateTo(viewId);\n return;\n }\n this.hideBubble();\n }\n\n private findViewConfig(viewId: string): BubbleMenuViewConfig | null {\n return this.config.views.find((v) => v.id === viewId) || null;\n }\n\n /**\n * Anchor the bubble to its trigger with floating-ui, matching\n * `PopoverDirective`.\n *\n * The hand-rolled version this replaces measured the trigger exactly once, so\n * scrolling left the panel welded to the viewport while its target slid away.\n * It also had no third case: a panel that fit neither below nor above got a\n * negative `top`, putting its own header off the top edge of the screen.\n * `flip` handles the second placement and `shift` clamps the panel into the\n * viewport instead, so there is no unhandled case left.\n *\n * `strategy: 'fixed'` matches the `position: fixed` written below — asking for\n * the default `'absolute'` coordinates would offset the panel by the page's\n * scroll amount.\n */\n private positionBubble(targetElement: HTMLElement): void {\n const bubble = this.bubbleElement?.nativeElement;\n if (!bubble) return;\n\n bubble.style.position = 'fixed';\n\n this.cleanupAutoUpdate?.();\n this.cleanupAutoUpdate = autoUpdate(targetElement, bubble, () => {\n computePosition(targetElement, bubble, {\n strategy: 'fixed',\n placement: 'bottom',\n middleware: [offset(8), flip({ padding: 8 }), shift({ padding: 8 })],\n })\n .then(({ x, y }) => {\n Object.assign(bubble.style, { left: `${x}px`, top: `${y}px` });\n })\n .catch((error) => {\n console.error('[ToolbarBubbleMenu] Error computing position', error);\n });\n });\n }\n}\n","import { EventEmitter, Injectable, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n/**\n * Service to handle toolbar action emissions\n */\n@Injectable({ providedIn: 'root' })\nexport class ToolbarService implements OnDestroy {\n // Subject để emit toolbar actions\n private readonly actionSubject = new Subject<{ actionName: string; value?: unknown }>();\n readonly action$ = this.actionSubject.asObservable();\n\n // EventEmitter for template binding\n readonly action = new EventEmitter<string>();\n\n /**\n * Emit an action\n */\n emit(actionName: string, value?: unknown): void {\n this.actionSubject.next({ actionName, value });\n this.action.emit(actionName);\n }\n\n ngOnDestroy(): void {\n this.actionSubject.complete();\n }\n}\n","import { RestrictedEditingOptions } from '@phuong-tran-redoc/document-engine-core';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { Editor } from '@tiptap/core';\n\nexport interface ToolbarState {\n isReadOnly: boolean;\n\n // History\n canUndo: boolean;\n canRedo: boolean;\n\n // Format Utilities\n canResetFormat: boolean;\n\n // Text Styles - Basic Inline\n canToggleBold: boolean;\n canToggleItalic: boolean;\n canToggleUnderline: boolean;\n canToggleStrike: boolean;\n\n // Text Styles - Advanced Inline\n canToggleSubscript: boolean;\n canToggleSuperscript: boolean;\n canToggleCode: boolean;\n canToggleLink: boolean;\n\n // Alignment & Layout\n canDecreaseIndent: boolean;\n canIncreaseIndent: boolean;\n canToggleBulletList: boolean;\n\n // Block Types\n canToggleBlockquote: boolean;\n\n // Insert Object\n canInsertPageBreak: boolean;\n\n // Business Features\n canToggleEditableRegion: boolean;\n\n // Actions\n canClearContent: boolean;\n}\n\nexport const DEFAULT_TOOLBAR_STATE: ToolbarState = {\n isReadOnly: true,\n canUndo: false,\n canRedo: false,\n canResetFormat: false,\n canToggleBold: false,\n canToggleItalic: false,\n canToggleUnderline: false,\n canToggleStrike: false,\n canToggleSubscript: false,\n canToggleSuperscript: false,\n canToggleCode: false,\n canToggleLink: false,\n canDecreaseIndent: false,\n canIncreaseIndent: false,\n canToggleBulletList: false,\n canToggleBlockquote: false,\n canInsertPageBreak: false,\n canToggleEditableRegion: false,\n canClearContent: false,\n};\n\nfunction safeCanCheck(editor: Editor, commandFn: () => boolean): boolean {\n try {\n return commandFn();\n } catch {\n return false;\n }\n}\n\nexport function buildToolbarState(editor: Editor, config?: Partial<DocumentEngineConfig>): ToolbarState {\n return {\n isReadOnly:\n !config?.editable ||\n (!!config.restrictedEditing &&\n (config?.restrictedEditing as RestrictedEditingOptions).initialMode === 'restricted'),\n\n // History\n canUndo: safeCanCheck(editor, () => editor.can().chain().focus().undo().run()),\n canRedo: safeCanCheck(editor, () => editor.can().chain().focus().redo().run()),\n\n // Format Utilities\n canResetFormat: safeCanCheck(editor, () => editor.can().chain().focus().resetFormat().run()),\n\n // Text Styles - Basic Inline\n canToggleBold: safeCanCheck(editor, () => editor.can().chain().focus().toggleBold().run()),\n canToggleItalic: safeCanCheck(editor, () => editor.can().chain().focus().toggleItalic().run()),\n canToggleUnderline: safeCanCheck(editor, () => editor.can().chain().focus().toggleUnderline().run()),\n canToggleStrike: safeCanCheck(editor, () => editor.can().chain().focus().toggleStrike().run()),\n\n // Text Styles - Advanced Inline\n canToggleSubscript: safeCanCheck(editor, () => editor.can().chain().focus().toggleSubscript().run()),\n canToggleSuperscript: safeCanCheck(editor, () => editor.can().chain().focus().toggleSuperscript().run()),\n canToggleCode: safeCanCheck(editor, () => editor.can().chain().focus().toggleCode().run()),\n canToggleLink: safeCanCheck(editor, () => editor.can().chain().focus().toggleLink().run()),\n\n // Alignment & Layout\n canDecreaseIndent: safeCanCheck(editor, () => editor.can().chain().focus().decreaseIndent().run()),\n canIncreaseIndent: safeCanCheck(editor, () => editor.can().chain().focus().increaseIndent().run()),\n canToggleBulletList: safeCanCheck(editor, () => editor.can().chain().focus().toggleBulletList().run()),\n\n // Block Types\n canToggleBlockquote: safeCanCheck(editor, () => editor.can().chain().focus().toggleBlockquote().run()),\n\n // Insert Object\n canInsertPageBreak: safeCanCheck(editor, () => editor.can().chain().focus().insertPageBreak().run()),\n\n // Business Features\n canToggleEditableRegion: safeCanCheck(editor, () => editor.can().chain().focus().toggleEditableRegion().run()),\n\n // Actions\n canClearContent: safeCanCheck(editor, () => editor.can().chain().focus().clear().run()),\n };\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n inject,\n} from '@angular/core';\nimport { ListStyleType, TextCaseType } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { throttle } from 'lodash-es';\nimport { ColorBubbleConfig } from '../../configs/color.config';\nimport { DynamicFieldsBubbleConfig } from '../../configs/dynamic-fields.config';\nimport { ImageBubbleConfig } from '../../configs/image.config';\nimport { LinkBubbleConfig } from '../../configs/link.config';\nimport { SpecialCharactersBubbleConfig } from '../../configs/special-characters.config';\nimport { TableBubbleConfig, TableCreateBubbleConfig } from '../../configs/table.config';\nimport { TemplateBubbleConfig } from '../../configs/template.config';\nimport {\n FONT_SIZE_OPTIONS,\n HeadingOption,\n LINE_HEIGHT_OPTIONS,\n TEXT_ALIGN_OPTIONS,\n TEXT_CASE_OPTIONS,\n buildHeadingOptions,\n} from '../../constants/text-style.constant';\nimport { LIST_STYLE_OPTIONS } from '../../constants/list.constant';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { EditorBubbleMenuConfig, ToolbarBubbleMenuConfig } from '../../core/bubble-menu/bubble-menu.type';\nimport { EditorCapabilities } from '../../core/capability.model';\nimport { HeadingLevel } from '../../types/heading.type';\nimport { ToolbarButton } from '../../types/button.type';\nimport { EditorBubbleMenuComponent } from '../../views/wrapper/editor-bubble-menu.wrapper';\nimport { ToolbarBubbleMenuComponent } from '../../views/wrapper/toolbar-bubble-menu.wrapper';\nimport { ButtonDirective } from '../button';\nimport { IconComponent } from '../icon';\nimport { SelectLabelDirective } from '../select/select-label.directive';\nimport { SelectOptionDirective } from '../select/select-option.directive';\nimport { SelectComponent } from '../select/select.component';\nimport { ToolbarService } from './toolbar.service';\nimport { DEFAULT_TOOLBAR_STATE, ToolbarState, buildToolbarState } from './toolbar.state';\n\n/**\n * Toolbar component for document editor\n * Provides toolbar controls for editor actions\n */\n@Component({\n selector: 'document-engine-toolbar',\n standalone: true,\n imports: [\n CommonModule,\n IconComponent,\n ButtonDirective,\n SelectComponent,\n SelectLabelDirective,\n SelectOptionDirective,\n ToolbarBubbleMenuComponent,\n EditorBubbleMenuComponent,\n ],\n templateUrl: './toolbar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n `\n :host {\n position: sticky;\n top: 0;\n z-index: 20;\n }\n `,\n ],\n})\nexport class ToolbarComponent implements OnInit, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly ngZone = inject(NgZone);\n private readonly toolbarService = inject(ToolbarService);\n\n @Input() editor!: Editor;\n @Input() capabilities!: EditorCapabilities;\n @Input() config?: Partial<DocumentEngineConfig>; // Only for dynamicFieldsCategories and templates\n\n @Output() readonly action = this.toolbarService.action;\n\n activeFontSize: string | null = null;\n activeLineHeight: string | null = null;\n activeHeading: number | null = null;\n activeTextAlign: string | null = null;\n activeTextAlignIcon = 'format_align_left';\n\n toolbarState: ToolbarState = DEFAULT_TOOLBAR_STATE;\n\n readonly fontSizeOptions = FONT_SIZE_OPTIONS;\n readonly lineHeightOptions = LINE_HEIGHT_OPTIONS;\n readonly textCaseOptions = TEXT_CASE_OPTIONS as { value: TextCaseType; label: string }[];\n // Derived from the editor's configured heading levels in ngOnInit so the\n // block-type dropdown lists exactly the levels the config allows (no dead\n // entry, no unreachable level). Seeded with the default set for first paint.\n headingOptions: HeadingOption[] = buildHeadingOptions();\n readonly textAlignOptions = TEXT_ALIGN_OPTIONS;\n readonly listStyleOptions = LIST_STYLE_OPTIONS as { value: ListStyleType; label: string; example: string }[];\n\n @ViewChild('colorBubbleMenu') private colorBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('linkBubbleWrapper') private linkBubbleWrapper!: EditorBubbleMenuComponent;\n @ViewChild('imageBubbleMenu') private imageBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('specialCharsBubbleMenu') private specialCharsBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('dynamicFieldsBubbleMenu') private dynamicFieldsBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('templateBubbleMenu') private templateBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('tableCreateBubbleMenu') private tableCreateBubbleMenu!: ToolbarBubbleMenuComponent;\n\n readonly colorBubbleConfig: ToolbarBubbleMenuConfig = ColorBubbleConfig;\n readonly linkBubbleConfig: EditorBubbleMenuConfig = LinkBubbleConfig;\n readonly tableBubbleConfig: EditorBubbleMenuConfig = TableBubbleConfig;\n readonly imageBubbleConfig: ToolbarBubbleMenuConfig = ImageBubbleConfig;\n readonly specialCharsBubbleConfig: ToolbarBubbleMenuConfig = SpecialCharactersBubbleConfig;\n readonly dynamicFieldsBubbleConfig: ToolbarBubbleMenuConfig = DynamicFieldsBubbleConfig;\n readonly templateBubbleConfig: ToolbarBubbleMenuConfig = TemplateBubbleConfig;\n readonly tableCreateBubbleConfig: ToolbarBubbleMenuConfig = TableCreateBubbleConfig;\n\n private throttleUpdateToolbarState = throttle(() => this.updateToolbarState(), 150, {\n leading: true,\n trailing: false,\n });\n\n private updateToolbarState = (): void => {\n this.ngZone.run(() => {\n if (!this.editor) return;\n\n // Update toolbar state (can* properties)\n this.toolbarState = buildToolbarState(this.editor, this.config);\n\n // Update active font size and line height\n const attrs = this.editor.getAttributes('textStyle');\n const size = (attrs?.['fontSize'] as string | undefined) || null;\n this.activeFontSize = size;\n\n const lineHeight = (attrs?.['lineHeight'] as string | undefined) || null;\n this.activeLineHeight = lineHeight;\n\n // Update active heading\n let headingLevel: number | null = null;\n for (const option of this.headingOptions) {\n if (this.editor.isActive('heading', { level: option.value })) {\n headingLevel = option.value;\n break;\n }\n }\n this.activeHeading = headingLevel;\n\n // Update active text align\n const alignOption = this.textAlignOptions.find((option) => this.editor.isActive({ textAlign: option.value }));\n this.activeTextAlign = alignOption?.value || null;\n this.activeTextAlignIcon = alignOption?.icon || 'format_align_left';\n\n this.cdr.markForCheck();\n });\n };\n\n ngOnInit(): void {\n // Build the block-type dropdown from the configured heading levels (semantic\n // mode = 2/3/4, etc.) rather than a fixed 1/2/3 set. Done before the first\n // updateToolbarState() so its heading-active scan iterates the real options.\n this.headingOptions = buildHeadingOptions(this.resolveHeadingLevels());\n\n // Subscribe to selectionUpdate to keep toolbar state in sync when cursor/selection changes\n this.editor.on('update', this.updateToolbarState);\n this.editor.on('transaction', this.throttleUpdateToolbarState);\n\n // Initialize toolbar state once\n this.updateToolbarState();\n }\n\n ngOnDestroy(): void {\n this.editor.off('update', this.updateToolbarState);\n this.editor.off('transaction', this.throttleUpdateToolbarState);\n\n if (this.throttleUpdateToolbarState) {\n this.throttleUpdateToolbarState.cancel();\n }\n\n this.toolbarService.ngOnDestroy();\n this.editor.destroy();\n }\n\n /**\n * Read the configured heading levels off `config.heading`. It may be a boolean\n * (`true` = default levels, handled by buildHeadingOptions' fallback) or a\n * `Partial<HeadingOptions>` carrying a `levels` array. Returns undefined when no\n * explicit levels are set so the caller falls back to the default set.\n */\n private resolveHeadingLevels(): readonly number[] | undefined {\n const heading = this.config?.heading;\n if (heading && typeof heading === 'object' && Array.isArray(heading.levels)) {\n return heading.levels;\n }\n return undefined;\n }\n\n runAndEmit(actionName: string, chain: () => void): void {\n chain();\n this.toolbarService.emit(actionName);\n }\n\n setFontSize(size: string | null): void {\n if (size) {\n this.editor.chain().focus().setFontSize(size).run();\n } else {\n this.editor.chain().focus().unsetFontSize().run();\n }\n this.toolbarService.emit('setFontSize', size);\n }\n\n setLineHeight(lineHeight: string | null): void {\n if (lineHeight) {\n this.editor.chain().focus().setLineHeight(lineHeight).run();\n } else {\n this.editor.chain().focus().unsetLineHeight().run();\n }\n this.toolbarService.emit('setLineHeight', lineHeight);\n }\n\n setHeading(level: string | null): void {\n if (!level) {\n this.editor.chain().focus().removeHeading().run();\n } else {\n const levelNumber = parseInt(level, 10) as HeadingLevel;\n this.editor.chain().focus().toggleHeading({ level: levelNumber }).run();\n }\n this.toolbarService.emit('setHeading', level);\n }\n\n setTextAlign(align: string | null): void {\n if (align) {\n this.editor\n .chain()\n .focus()\n .setTextAlign(align as 'left' | 'center' | 'right' | 'justify')\n .run();\n } else {\n // Reset to default (left)\n this.editor.chain().focus().setTextAlign('left').run();\n }\n this.toolbarService.emit('setTextAlign', align);\n }\n\n setListStyle(listStyleType: ListStyleType): void {\n if (this.editor.isActive('customOrderedList')) {\n // If there's an active ordered list, update its style\n this.editor.chain().focus().setListStyle(listStyleType).run();\n } else {\n // If no active list, create a new one with the selected style\n this.editor.chain().focus().toggleOrderedList().run();\n this.editor.chain().focus().setListStyle(listStyleType).run();\n }\n this.toolbarService.emit('setListStyle', listStyleType);\n }\n\n openColorBubble(event: MouseEvent, type: 'text' | 'fill'): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.colorBubbleMenu?.toggleBubble(targetElement, { type });\n this.toolbarService.emit('openColorBubble', { type });\n }\n\n toggleLink(): void {\n if (this.editor.isActive('link')) {\n // If link is active, remove it\n this.editor.chain().focus().unsetLink().run();\n } else {\n // If no link, open the bubble menu\n this.linkBubbleWrapper?.showBubble();\n }\n this.toolbarService.emit('toggleLink');\n }\n\n insertImage(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.imageBubbleMenu?.toggleBubble(targetElement);\n this.toolbarService.emit('insertImage');\n }\n\n openSpecialCharsBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.specialCharsBubbleMenu?.toggleBubble(targetElement);\n this.toolbarService.emit('openSpecialCharsBubble');\n }\n\n openDynamicFieldsBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.dynamicFieldsBubbleMenu?.toggleBubble(targetElement, {\n categories: this.config?.dynamicFieldsCategories || [],\n });\n this.toolbarService.emit('openDynamicFieldsBubble');\n }\n\n openTemplateBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.templateBubbleMenu?.toggleBubble(targetElement, {\n templates: this.config?.templates || [],\n });\n this.toolbarService.emit('openTemplateBubble');\n }\n\n openCreateTableBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.tableCreateBubbleMenu?.toggleBubble(targetElement);\n this.toolbarService.emit('openCreateTableBubble');\n }\n\n // downloadAsMarkdown(filename?: string): void {\n // const fileName = filename ? `${filename}.md` : 'export.md';\n\n // const markdown = renderToMarkdown({\n // content: this.editor.getJSON(),\n // extensions: this.editor.options.extensions,\n // options: {\n // nodeMapping: {\n // pageBreak: () => 'Page break',\n // },\n // },\n // });\n\n // const blob = new Blob([markdown], { type: 'text/markdown' });\n // const url = URL.createObjectURL(blob);\n // const a = document.createElement('a');\n // a.href = url;\n // a.download = fileName;\n // a.click();\n // URL.revokeObjectURL(url);\n // }\n\n trackByValue(index: number, item: { value: unknown }): unknown {\n return item.value;\n }\n\n trackByIndex(index: number): number {\n return index;\n }\n\n get customToolbarButtons(): ToolbarButton[] {\n return this.config?.customToolbarButtons || [];\n }\n\n handleCustomIconButton(button: ToolbarButton): void {\n if (button.type === 'icon-button') {\n button.callback();\n this.toolbarService.emit('customIconButton', { label: button.label, icon: button.icon });\n }\n }\n\n handleCustomSelectButton(button: ToolbarButton, value: string): void {\n if (button.type === 'select-button') {\n button.callback();\n this.toolbarService.emit('customSelectButton', { label: button.label, value });\n }\n }\n\n printValue(): void {\n console.log('html', this.editor.getHTML());\n console.log('json', this.editor.getJSON());\n console.log('State', this.editor.state);\n this.toolbarService.emit('printValue');\n }\n}\n","<div class=\"document-engine-document-editor__toolbar\">\n <div class=\"document-engine-document-editor__toolbar-content\">\n <div class=\"document-engine-document-editor__toolbar-left\">\n <!-- History: Undo/Redo -->\n <div *ngIf=\"capabilities.hasHistory\" class=\"document-engine-document-editor__toolbar-group\" data-group=\"history\">\n <button\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canUndo\"\n (click)=\"runAndEmit('undo', editor.chain().focus().undo().run)\"\n title=\"Undo (Ctrl+Z)\"\n >\n <document-engine-icon name=\"undo\"></document-engine-icon>\n </button>\n\n <button\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canRedo\"\n (click)=\"runAndEmit('redo', editor.chain().focus().redo().run)\"\n title=\"Redo\"\n >\n <document-engine-icon name=\"redo\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Text Formatting: Font Size, Line Height, Text Case, Heading -->\n <div\n *ngIf=\"capabilities.hasTextProperty\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"text-property\"\n >\n <!-- Font Size -->\n <document-engine-select\n *ngIf=\"capabilities.hasFontSize\"\n [value]=\"activeFontSize\"\n placeholder=\"Font Size\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Font Size\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"format_size\"></document-engine-icon>\n\n <button documentEngineSelectOption [value]=\"null\">Default</button>\n\n <button\n *ngFor=\"let option of fontSizeOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"setFontSize(option.value)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n\n <!-- Line Height -->\n <document-engine-select\n *ngIf=\"capabilities.hasLineHeight\"\n [value]=\"activeLineHeight\"\n placeholder=\"Line Height\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Line Height\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"format_line_spacing\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of lineHeightOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"setLineHeight(option.value)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n\n <!-- Text Case -->\n <document-engine-select\n *ngIf=\"capabilities.hasTextCase\"\n placeholder=\"Text Case\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Text Case\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"match_case\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of textCaseOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"runAndEmit('setTextCase', editor.chain().focus().textCase(option.value).run)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n\n <!-- Heading -->\n <document-engine-select\n *ngIf=\"capabilities.hasHeading\"\n [value]=\"activeHeading?.toString() || null\"\n placeholder=\"Normal text\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Heading\"\n >\n <button\n *ngFor=\"let option of headingOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value?.toString() || null\"\n [class]=\"option.class\"\n (click)=\"setHeading(option.value?.toString() || null)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n </div>\n\n <!-- Format Utilities: Reset Formatting & Colors -->\n <div\n *ngIf=\"capabilities.hasFormatUtilities\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"format-utilities\"\n >\n <!-- Reset Formatting -->\n <button\n *ngIf=\"capabilities.hasResetFormat\"\n documentEngineButton\n size=\"icon\"\n (click)=\"runAndEmit('resetFormat', editor.chain().focus().resetFormat().run)\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canResetFormat\"\n title=\"Clear Formatting\"\n >\n <document-engine-icon name=\"format_clear\"></document-engine-icon>\n </button>\n\n <!-- Colors: Text/Background -->\n <button\n *ngIf=\"capabilities.hasColors\"\n documentEngineButton\n size=\"icon\"\n title=\"Text Color\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openColorBubble($event, 'text')\"\n >\n <document-engine-icon name=\"format_color_text\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasColors\"\n documentEngineButton\n size=\"icon\"\n title=\"Background Color\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openColorBubble($event, 'fill')\"\n >\n <document-engine-icon name=\"format_color_fill\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Text Styles: Bold/Italic/Underline/Strike -->\n <div\n *ngIf=\"capabilities.basicInline\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"basic-inline\"\n >\n <button\n *ngIf=\"capabilities.hasBold\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleBold\"\n (click)=\"runAndEmit('toggleBold', editor.chain().focus().toggleBold().run)\"\n [class.active]=\"editor.isActive('bold')\"\n title=\"Bold\"\n >\n <document-engine-icon name=\"format_bold\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasItalic\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleItalic\"\n (click)=\"runAndEmit('toggleItalic', editor.chain().focus().toggleItalic().run)\"\n [class.active]=\"editor.isActive('italic')\"\n title=\"Italic\"\n >\n <document-engine-icon name=\"format_italic\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasUnderline\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleUnderline\"\n (click)=\"runAndEmit('toggleUnderline', editor.chain().focus().toggleUnderline().run)\"\n [class.active]=\"editor.isActive('underline')\"\n title=\"Underline\"\n >\n <document-engine-icon name=\"format_underline\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasStrike\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleStrike\"\n (click)=\"runAndEmit('toggleStrike', editor.chain().focus().toggleStrike().run)\"\n [class.active]=\"editor.isActive('strike')\"\n title=\"Strikethrough\"\n >\n <document-engine-icon name=\"format_strikethrough\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Text Styles: Sub/Super/Code/Link -->\n <div\n *ngIf=\"capabilities.advancedInline\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"advanced-inline\"\n >\n <button\n *ngIf=\"capabilities.hasSubscript\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleSubscript\"\n (click)=\"runAndEmit('toggleSubscript', editor.chain().focus().toggleSubscript().run)\"\n [class.active]=\"editor.isActive('subscript')\"\n title=\"Subscript\"\n >\n <document-engine-icon name=\"subscript\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasSuperscript\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleSuperscript\"\n (click)=\"runAndEmit('toggleSuperscript', editor.chain().focus().toggleSuperscript().run)\"\n [class.active]=\"editor.isActive('superscript')\"\n title=\"Superscript\"\n >\n <document-engine-icon name=\"superscript\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasCode\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleCode\"\n (click)=\"runAndEmit('toggleCode', editor.chain().focus().toggleCode().run)\"\n [class.active]=\"editor.isActive('code')\"\n title=\"Code\"\n >\n <document-engine-icon name=\"code\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasLink\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleLink\"\n (click)=\"toggleLink()\"\n [class.active]=\"editor.isActive('link')\"\n [title]=\"editor.isActive('link') ? 'Unlink' : 'Link'\"\n >\n <document-engine-icon [name]=\"editor.isActive('link') ? 'link_off' : 'link'\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Alignment & Layout: Text Align, Indent -->\n <div\n *ngIf=\"capabilities.hasAlignmentLayout\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"alignment-layout\"\n >\n <!-- Text Alignment -->\n <document-engine-select\n *ngIf=\"capabilities.hasTextAlign\"\n [value]=\"activeTextAlign\"\n (valueChange)=\"setTextAlign($event)\"\n placeholder=\"Text Align\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Text Align\"\n >\n <document-engine-icon documentEngineSelectLabel [name]=\"activeTextAlignIcon\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of textAlignOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n >\n <document-engine-icon [name]=\"option.icon\"></document-engine-icon>\n <span>{{ option.label }}</span>\n </button>\n </document-engine-select>\n\n <!-- Indent -->\n <button\n *ngIf=\"capabilities.hasIndent\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canDecreaseIndent\"\n (click)=\"runAndEmit('decreaseIndent', editor.chain().focus().decreaseIndent().run)\"\n title=\"Decrease Indent\"\n >\n <document-engine-icon name=\"format_indent_decrease\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasIndent\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canIncreaseIndent\"\n (click)=\"runAndEmit('increaseIndent', editor.chain().focus().increaseIndent().run)\"\n title=\"Increase Indent\"\n >\n <document-engine-icon name=\"format_indent_increase\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Lists -->\n <div\n *ngIf=\"capabilities.hasAlignmentLayout\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"alignment-layout\"\n >\n <!-- Lists: Bullet, Numbered (with style) -->\n <button\n *ngIf=\"capabilities.hasLists\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleBulletList\"\n (click)=\"runAndEmit('toggleBulletList', editor.chain().focus().toggleBulletList().run)\"\n [class.active]=\"editor.isActive('bulletList')\"\n title=\"Bullet List\"\n >\n <document-engine-icon name=\"format_list_bulleted\"></document-engine-icon>\n </button>\n\n <!-- Numbered List with Style -->\n <document-engine-select\n *ngIf=\"capabilities.hasLists\"\n placeholder=\"Numbered List\"\n labelMode=\"static\"\n [value]=\"\n editor.isActive('customOrderedList')\n ? editor.getAttributes('customOrderedList')['data-list-style-type'] || 'decimal'\n : null\n \"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Numbered List\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"format_list_numbered\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of listStyleOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"setListStyle(option.value)\"\n [class.active]=\"\n editor.isActive('customOrderedList') &&\n editor.getAttributes('customOrderedList')['data-list-style-type'] === option.value\n \"\n >\n <span>{{ option.example }}</span>\n <span>{{ option.label }}</span>\n </button>\n </document-engine-select>\n </div>\n\n <!-- Block Types: Code Block, Blockquote -->\n <div\n *ngIf=\"capabilities.hasBlockTypes\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"block-types\"\n >\n <!-- Blockquote -->\n <button\n *ngIf=\"capabilities.hasBlockquote\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleBlockquote\"\n (click)=\"runAndEmit('toggleBlockquote', editor.chain().focus().toggleBlockquote().run)\"\n [class.active]=\"editor.isActive('blockquote')\"\n title=\"Quote\"\n >\n <document-engine-icon name=\"format_quote\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Insert Object: Table, Images, Special Chars, Page Break -->\n <div\n *ngIf=\"capabilities.hasInsertObject\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"insert-object\"\n >\n <button\n *ngIf=\"capabilities.hasTable\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openCreateTableBubble($event)\"\n [class.active]=\"editor.isActive('table')\"\n title=\"Table\"\n >\n <document-engine-icon name=\"table_rows\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasImages\"\n documentEngineButton\n size=\"icon\"\n title=\"Insert Image\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"insertImage($event)\"\n >\n <document-engine-icon name=\"photo\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasSpecialChars\"\n documentEngineButton\n size=\"icon\"\n title=\"Special Character\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openSpecialCharsBubble($event)\"\n >\n <document-engine-icon name=\"special_character\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasPageBreak\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canInsertPageBreak\"\n (click)=\"runAndEmit('insertPageBreak', editor.chain().focus().insertPageBreak().run)\"\n [class.active]=\"editor.isActive('pageBreak')\"\n title=\"Insert page break\"\n >\n <document-engine-icon name=\"insert_page_break\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Business Features: Templates, Dynamic Fields, Editable Region -->\n <div\n *ngIf=\"capabilities.hasBusinessFeatures\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"business-features\"\n >\n <button\n *ngIf=\"capabilities.hasDynamicFields\"\n documentEngineButton\n size=\"icon\"\n title=\"Dynamic Field\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openDynamicFieldsBubble($event)\"\n >\n <document-engine-icon name=\"dynamic_form\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasTemplates\"\n documentEngineButton\n size=\"icon\"\n title=\"Template\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openTemplateBubble($event)\"\n >\n <document-engine-icon name=\"description\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasEditableRegion\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"!toolbarState.canToggleEditableRegion || toolbarState.isReadOnly\"\n (click)=\"runAndEmit('toggleEditableRegion', editor.chain().focus().toggleEditableRegion().run)\"\n [class.active]=\"editor.isActive('editableRegion')\"\n title=\"Toggle editable region\"\n >\n <document-engine-icon name=\"restrict_edit\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Actions: Clear Content, Markdown -->\n <div *ngIf=\"capabilities.hasActions\" class=\"document-engine-document-editor__toolbar-group\" data-group=\"actions\">\n <button\n *ngIf=\"capabilities.hasClearContent\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canClearContent\"\n (click)=\"runAndEmit('clear', editor.chain().focus().clear().run)\"\n title=\"Clear all content\"\n >\n <document-engine-icon name=\"clear_all\"></document-engine-icon>\n </button>\n\n <!-- <button\n *ngIf=\"capabilities.hasMarkdown\"\n documentEngineButton\n size=\"icon\"\n (click)=\"downloadAsMarkdown()\"\n title=\"Download as Markdown\"\n >\n <document-engine-icon name=\"markdown\"></document-engine-icon>\n </button> -->\n </div>\n\n <!-- Custom Toolbar Buttons -->\n <div\n *ngIf=\"customToolbarButtons.length > 0\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"custom-buttons\"\n >\n <ng-container *ngFor=\"let button of customToolbarButtons; trackBy: trackByIndex\">\n <!-- Icon Button -->\n <button\n *ngIf=\"button.type === 'icon-button'\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"handleCustomIconButton(button)\"\n [title]=\"button.label || ''\"\n >\n <document-engine-icon [name]=\"button.icon\"></document-engine-icon>\n </button>\n\n <!-- Select Button -->\n <document-engine-select\n *ngIf=\"button.type === 'select-button'\"\n [value]=\"null\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n [title]=\"button.label\"\n >\n <span documentEngineSelectLabel>{{ button.label }}</span>\n\n <button\n *ngFor=\"let option of button.options; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"handleCustomSelectButton(button, option.value)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n </ng-container>\n </div>\n </div>\n\n <!-- Right side actions -->\n <div class=\"document-engine-document-editor__toolbar-right\">\n <button\n *ngIf=\"capabilities.hasPrintButton\"\n documentEngineButton\n size=\"icon\"\n (click)=\"printValue()\"\n title=\"Print Value\"\n >\n <document-engine-icon name=\"print\"></document-engine-icon>\n </button>\n </div>\n </div>\n\n <!-- Color Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n #colorBubbleMenu\n [editor]=\"editor\"\n [config]=\"colorBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Link Bubble Menu -->\n <document-engine-editor-bubble-menu\n *ngIf=\"capabilities.hasLink\"\n #linkBubbleWrapper\n [editor]=\"editor\"\n [config]=\"linkBubbleConfig\"\n ></document-engine-editor-bubble-menu>\n\n <!-- Table Bubble Menu -->\n <document-engine-editor-bubble-menu\n *ngIf=\"capabilities.hasTable\"\n #tableBubbleWrapper\n [editor]=\"editor\"\n [config]=\"tableBubbleConfig\"\n ></document-engine-editor-bubble-menu>\n\n <!-- Image Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasImages\"\n #imageBubbleMenu\n [editor]=\"editor\"\n [config]=\"imageBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Special Characters Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasSpecialChars\"\n #specialCharsBubbleMenu\n [editor]=\"editor\"\n [config]=\"specialCharsBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Dynamic Fields Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasDynamicFields\"\n #dynamicFieldsBubbleMenu\n [editor]=\"editor\"\n [config]=\"dynamicFieldsBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Template Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasTemplates\"\n #templateBubbleMenu\n [editor]=\"editor\"\n [config]=\"templateBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Table Create Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasTable\"\n #tableCreateBubbleMenu\n [editor]=\"editor\"\n [config]=\"tableCreateBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { DocumentEngineConfig } from '../core/kit/kit.type';\nimport { DocumentEngineKit } from '../core/kit/kit';\nimport { EditorCapabilities } from '../core/capability.model';\nimport { Editor } from '@tiptap/core';\nimport { DefaultEditorConfig } from '../configs/editor.config';\nimport { EDITOR_CONTENT_WRAPPER_CLASS } from '../core';\nimport { FooterComponent } from '../ui/footer/footer.component';\nimport { ToolbarComponent } from '../ui/toolbar/toolbar.component';\n\n/**\n * Document Editor Component\n * High-level wrapper that encapsulates TiptapEditor and DocumentEngineKit\n * Provides a simple API for consumers without exposing internal dependencies\n *\n * Usage:\n * <document-engine-editor\n * #editor\n * [config]=\"editorConfig\"\n *\n * (editorReady)=\"editor = docEditor.editor\"\n * >\n * <tiptap-editor\n * [editor]=\"docEditor.editor\"\n * [(ngModel)]=\"content\"\n * ></tiptap-editor>\n * </document-engine-editor>\n */\n@Component({\n selector: 'document-engine-editor',\n imports: [CommonModule, ToolbarComponent, FooterComponent],\n templateUrl: './document-editor.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'no-twp',\n },\n styles: [\n `\n /* A custom element defaults to display: inline, which makes the editor\n * impossible to size from the outside. Make it a stretchable column so a\n * consumer can give this element a height and have the editing surface\n * fill it (see --de-editor-min-height in docs/THEMING.md). */\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n :host ::ng-deep {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n }\n `,\n ],\n})\nexport class DocumentEditorComponent implements OnInit, OnChanges, OnDestroy {\n private readonly ngZone = inject(NgZone);\n private readonly contentWrapperClass = inject(EDITOR_CONTENT_WRAPPER_CLASS, { optional: true });\n\n @Input() config?: Partial<DocumentEngineConfig>;\n\n @Output() editorReady = new EventEmitter<Editor>();\n\n // Expose editor property for external access (re-export)\n editor!: Editor;\n\n // Store merged config for toolbar and helper methods\n get mergedConfig(): Partial<DocumentEngineConfig> {\n return this._mergedConfig ?? this.getMergedConfig();\n }\n\n private _mergedConfig?: Partial<DocumentEngineConfig>;\n\n // Capabilities instance for toolbar\n capabilities!: EditorCapabilities;\n\n private updateCapabilities(): void {\n this.capabilities = new EditorCapabilities(this.mergedConfig);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['config']) return;\n\n if (!this.editor) return;\n\n this._mergedConfig = this.getMergedConfig();\n this.updateCapabilities();\n this.editor.setEditable(this._mergedConfig.editable ?? true);\n }\n\n ngOnInit(): void {\n this.initializeEditor();\n }\n\n ngOnDestroy(): void {\n if (this.editor) this.editor.destroy();\n }\n\n // Internal methods\n private initializeEditor(): void {\n // Run editor initialization outside Angular zone for better performance\n // Editor operations (especially typing) don't need to trigger Angular change detection\n this.ngZone.runOutsideAngular(() => {\n // Merge user config with default full-featured config\n this._mergedConfig = this.getMergedConfig();\n\n // Initialize editor with config\n // Initial content will be set by TiptapEditorDirective via writeValue\n this.editor = new Editor({\n editable: this._mergedConfig.editable,\n extensions: [DocumentEngineKit.configure(this._mergedConfig)],\n editorProps: { attributes: { class: this.contentWrapperClass ?? '' } },\n });\n\n // Emit editorReady event back inside Angular zone\n this.ngZone.run(() => {\n // Create capabilities instance after editor is initialized\n this.updateCapabilities();\n this.editorReady.emit(this.editor);\n });\n });\n }\n\n /**\n * Get merged config with all extensions enabled by default\n * User config will override defaults\n */\n private getMergedConfig(): Partial<DocumentEngineConfig> {\n // Merge user config with defaults, preferring user config when provided\n return this.mergeConfig(DefaultEditorConfig, this.config);\n }\n\n /**\n * Merge two config objects, preferring userConfig values when provided\n */\n private mergeConfig(\n defaultConfig: Partial<DocumentEngineConfig>,\n userConfig?: Partial<DocumentEngineConfig>\n ): Partial<DocumentEngineConfig> {\n if (!userConfig) return defaultConfig;\n\n const merged: Record<string, unknown> = { ...defaultConfig };\n const keys = Object.keys(userConfig) as Array<keyof DocumentEngineConfig>;\n\n for (const key of keys) {\n const value = userConfig[key];\n if (value !== undefined) merged[key] = value;\n }\n\n return merged;\n }\n}\n","<div class=\"document-engine-document-editor\">\n <document-engine-toolbar\n *ngIf=\"mergedConfig.showToolbar\"\n [editor]=\"editor\"\n [capabilities]=\"capabilities\"\n [config]=\"mergedConfig\"\n ></document-engine-toolbar>\n\n <div class=\"document-engine-document-editor__content\">\n <ng-content></ng-content>\n </div>\n\n <document-engine-footer\n *ngIf=\"editor && mergedConfig.showFooter\"\n [editor]=\"editor\"\n [config]=\"mergedConfig\"\n ></document-engine-footer>\n</div>\n","import { NgModule } from '@angular/core';\nimport { TiptapEditorDirective } from '../core';\nimport { DocumentEditorComponent } from './document-editor.component';\n\n/**\n * Back-compat shim for NgModule-based consumers. `DocumentEditorComponent` is now\n * standalone (and `@defer`-friendly); standalone consumers should import it (and\n * `TiptapEditorDirective`) directly instead of this module.\n */\n@NgModule({\n imports: [DocumentEditorComponent, TiptapEditorDirective],\n exports: [DocumentEditorComponent, TiptapEditorDirective],\n})\nexport class DocumentEditorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["IconConstants.DEFAULT","IconConstants.CHECK","IconConstants.UNDO","IconConstants.REDO","IconConstants.FORMAT_SIZE","IconConstants.ARROW_DROP_DOWN","IconConstants.FORMAT_LINE_SPACING","IconConstants.MATCH_CASE","IconConstants.FORMAT_CLEAR","IconConstants.FORMAT_COLOR_TEXT","IconConstants.FORMAT_COLOR_FILL","IconConstants.FORMAT_BOLD","IconConstants.FORMAT_ITALIC","IconConstants.FORMAT_UNDERLINE","IconConstants.FORMAT_STRIKETHROUGH","IconConstants.SUBSCRIPT","IconConstants.SUPERSCRIPT","IconConstants.CODE","IconConstants.FORMAT_ALIGN_LEFT","IconConstants.FORMAT_ALIGN_CENTER","IconConstants.FORMAT_ALIGN_RIGHT","IconConstants.FORMAT_ALIGN_JUSTIFY","IconConstants.FORMAT_INDENT_DECREASE","IconConstants.FORMAT_INDENT_INCREASE","IconConstants.FORMAT_LIST_BULLETED","IconConstants.FORMAT_LIST_NUMBERED","IconConstants.FORMAT_QUOTE","IconConstants.TABLE_ROWS","IconConstants.TABLE_CELL_PROPERTY","IconConstants.TABLE_COLUMN","IconConstants.TABLE_MERGE_CELL","IconConstants.TABLE_PROPERTY","IconConstants.TABLE_ROW","IconConstants.LINK","IconConstants.LINK_OFF","IconConstants.SPECIAL_CHARACTER","IconConstants.CLEAR_ALL","IconConstants.INSERT_PAGE_BREAK","IconConstants.MARKDOWN","IconConstants.DYNAMIC_FORM","IconConstants.PHOTO","IconConstants.PRINT","IconConstants.ARCHIVE","IconConstants.RESTRICT_EDIT","IconConstants.EDIT","IconConstants.SETTINGS","IconConstants.SEARCH","IconConstants.SEARCH_OFF","IconConstants.DESCRIPTION","IconConstants.CLOSE","IconConstants.VERTICAL_ALIGN_TOP","IconConstants.VERTICAL_ALIGN_CENTER","IconConstants.VERTICAL_ALIGN_BOTTOM","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"phuong-tran-redoc-document-engine-angular.mjs","sources":["../../../../libs/document-engine-angular/src/lib/core/kit/kit.ts","../../../../libs/document-engine-angular/src/lib/core/capability.model.ts","../../../../libs/document-engine-angular/src/lib/configs/editor.config.ts","../../../../libs/document-engine-angular/src/lib/core/bubble-menu/bubble-menu.directive.ts","../../../../libs/document-engine-angular/src/lib/core/bubble-menu/bubble-menu.util.ts","../../../../libs/document-engine-angular/src/lib/core/event-manager.ts","../../../../libs/document-engine-angular/src/lib/core/focus-trap.service.ts","../../../../libs/document-engine-angular/src/lib/core/angular-renderer.ts","../../../../libs/document-engine-angular/src/lib/core/draggable.directive.ts","../../../../libs/document-engine-angular/src/lib/core/editor-tokens.ts","../../../../libs/document-engine-angular/src/lib/core/editor.directive.ts","../../../../libs/document-engine-angular/src/lib/core/floating-menu.directive.ts","../../../../libs/document-engine-angular/src/lib/core/popover.directive.ts","../../../../libs/document-engine-angular/src/lib/ui/character-count/character-count.component.ts","../../../../libs/document-engine-angular/src/lib/ui/character-count/character-count.component.html","../../../../libs/document-engine-angular/src/lib/ui/footer/footer.component.ts","../../../../libs/document-engine-angular/src/lib/ui/footer/footer.component.html","../../../../libs/document-engine-angular/src/lib/constants/color.constant.ts","../../../../libs/document-engine-angular/src/lib/ui/button.ts","../../../../libs/document-engine-angular/src/lib/ui/icon/icon.constant.ts","../../../../libs/document-engine-angular/src/lib/ui/icon/icon-registry.service.ts","../../../../libs/document-engine-angular/src/lib/ui/icon/icon.component.ts","../../../../libs/document-engine-angular/src/lib/ui/color-picker.ts","../../../../libs/document-engine-angular/src/lib/views/color-picker-view/color-picker-view.ts","../../../../libs/document-engine-angular/src/lib/configs/color.config.ts","../../../../libs/document-engine-angular/src/lib/ui/input/input.ts","../../../../libs/document-engine-angular/src/lib/ui/input/label.ts","../../../../libs/document-engine-angular/src/lib/views/dynamic-fields-view/dynamic-fields-view.ts","../../../../libs/document-engine-angular/src/lib/configs/dynamic-fields.config.ts","../../../../libs/document-engine-angular/src/lib/views/image-insert-view/image-pick.util.ts","../../../../libs/document-engine-angular/src/lib/utils/validator.util.ts","../../../../libs/document-engine-angular/src/lib/ui/input/error-message.ts","../../../../libs/document-engine-angular/src/lib/views/image-insert-view/image-insert-view.ts","../../../../libs/document-engine-angular/src/lib/configs/image.config.ts","../../../../libs/document-engine-angular/src/lib/views/link-views/link-edit-view.ts","../../../../libs/document-engine-angular/src/lib/views/link-views/link-main-view.ts","../../../../libs/document-engine-angular/src/lib/ui/checkbox/checkbox.ts","../../../../libs/document-engine-angular/src/lib/views/link-views/link-properties-view.ts","../../../../libs/document-engine-angular/src/lib/configs/link.config.ts","../../../../libs/document-engine-angular/src/lib/constants/character.constant.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select-label.directive.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select.contract.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select-option.directive.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select.component.ts","../../../../libs/document-engine-angular/src/lib/ui/select/select.component.html","../../../../libs/document-engine-angular/src/lib/views/special-characters-view/special-characters-view.ts","../../../../libs/document-engine-angular/src/lib/configs/special-characters.config.ts","../../../../libs/document-engine-angular/src/lib/ui/toggle-button/toggle-button.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/border-width.util.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-cell-style-view.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-create-view.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-main-view.ts","../../../../libs/document-engine-angular/src/lib/views/table-views/table-style-view.ts","../../../../libs/document-engine-angular/src/lib/configs/table.config.ts","../../../../libs/document-engine-angular/src/lib/views/template-view/template-view.ts","../../../../libs/document-engine-angular/src/lib/configs/template.config.ts","../../../../libs/document-engine-angular/src/lib/constants/text-style.constant.ts","../../../../libs/document-engine-angular/src/lib/constants/list.constant.ts","../../../../libs/document-engine-angular/src/lib/views/wrapper/editor-bubble-menu.wrapper.ts","../../../../libs/document-engine-angular/src/lib/views/wrapper/toolbar-bubble-menu.wrapper.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.service.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.state.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.component.ts","../../../../libs/document-engine-angular/src/lib/ui/toolbar/toolbar.component.html","../../../../libs/document-engine-angular/src/lib/components/document-editor.component.ts","../../../../libs/document-engine-angular/src/lib/components/document-editor.component.html","../../../../libs/document-engine-angular/src/lib/components/document-editor.module.ts","../../../../libs/document-engine-angular/src/phuong-tran-redoc-document-engine-angular.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport { Blockquote } from '@tiptap/extension-blockquote';\nimport { Bold } from '@tiptap/extension-bold';\nimport { Code } from '@tiptap/extension-code';\nimport { CodeBlock } from '@tiptap/extension-code-block';\nimport { Document } from '@tiptap/extension-document';\nimport { HardBreak } from '@tiptap/extension-hard-break';\nimport { HorizontalRule } from '@tiptap/extension-horizontal-rule';\nimport { Image } from '@tiptap/extension-image';\nimport { Italic } from '@tiptap/extension-italic';\nimport { Link, LinkOptions } from '@tiptap/extension-link';\nimport { BulletList, ListItem, ListKeymap } from '@tiptap/extension-list';\nimport { Paragraph } from '@tiptap/extension-paragraph';\nimport { Strike } from '@tiptap/extension-strike';\nimport { Subscript } from '@tiptap/extension-subscript';\nimport { Superscript } from '@tiptap/extension-superscript';\nimport { Text } from '@tiptap/extension-text';\nimport { TextAlign } from '@tiptap/extension-text-align';\nimport { TextStyleKit } from '@tiptap/extension-text-style';\nimport { Underline } from '@tiptap/extension-underline';\nimport { CharacterCount, Dropcursor, Gapcursor, Placeholder, TrailingNode, UndoRedo } from '@tiptap/extensions';\nimport {\n CkCompat,\n ClearContent,\n CustomOrderedList,\n Indent,\n ResetFormat,\n ResetOnEnter,\n RestrictedEditing,\n StyledTableKit,\n TextCase,\n EditableRegion,\n DynamicField,\n NotumHeading,\n PageBreak,\n ImageRef,\n} from '@phuong-tran-redoc/document-engine-core';\nimport { DocumentEngineConfig } from './kit.type';\n\nexport const DocumentEngineKit = Extension.create<DocumentEngineConfig>({\n name: 'DocumentEngineKit',\n\n addExtensions() {\n // Default extensions\n const extensions = [\n Document,\n Paragraph,\n Text,\n Dropcursor,\n Gapcursor,\n HardBreak,\n HorizontalRule,\n TrailingNode,\n ResetOnEnter,\n ];\n\n const options = this.options;\n\n // Defaults centralized for readability\n const DEFAULT_LINK_OPTIONS: Partial<LinkOptions> = {\n openOnClick: false,\n defaultProtocol: 'https',\n enableClickSelection: true,\n shouldAutoLink: (url) =>\n url.startsWith('http://') || url.startsWith('https://') || url.startsWith('mailto:') || url.startsWith('tel:'),\n };\n const DEFAULT_TEXT_ALIGN = { types: ['paragraph', 'heading'] } as const;\n const DEFAULT_PLACEHOLDER = { placeholder: 'Type something...' } as const;\n const DEFAULT_TABLES = { table: { resizable: true } } as const;\n\n // Small helper to add a configurable extension\n const add = (opt: unknown, ext: unknown, defaultConfig?: object) => {\n if (opt === false || opt === undefined) return;\n\n if (typeof opt === 'object') {\n extensions.push((ext as any).configure(opt));\n return;\n }\n\n extensions.push(defaultConfig ? (ext as any).configure(defaultConfig) : (ext as any));\n };\n\n // RestrictedEditing\n if (options.restrictedEditing !== false && options.restrictedEditing !== undefined) {\n // Editable Region will always be added after RestrictedEditing\n extensions.push(EditableRegion);\n\n if (typeof options.restrictedEditing === 'object') {\n extensions.push(RestrictedEditing.configure(options.restrictedEditing));\n } else {\n extensions.push(RestrictedEditing.configure({ initialMode: 'standard' }));\n }\n }\n\n if (options.list !== false) {\n add(true, ListKeymap);\n add(true, ListItem);\n add(true, BulletList);\n add(true, CustomOrderedList);\n }\n\n // Configurable, with consistent defaults where applicable\n add(options.blockquote, Blockquote);\n add(options.bold, Bold);\n add(options.italic, Italic);\n add(options.underline, Underline);\n add(options.strike, Strike);\n add(options.link, Link, DEFAULT_LINK_OPTIONS);\n add(options.codeBlock, CodeBlock);\n add(options.code, Code);\n add(options.undoRedo, UndoRedo);\n add(options.textStyleKit, TextStyleKit);\n add(options.tables, StyledTableKit, DEFAULT_TABLES);\n add(options.characterCount, CharacterCount);\n add(options.subscript, Subscript);\n add(options.superscript, Superscript);\n add(options.textAlign, TextAlign, DEFAULT_TEXT_ALIGN);\n add(options.image, Image);\n add(options.imageRef, ImageRef);\n add(options.placeholder, Placeholder, DEFAULT_PLACEHOLDER);\n add(options.pageBreak, PageBreak);\n add(options.resetFormat, ResetFormat);\n add(options.indent, Indent);\n add(options.clearContent, ClearContent);\n add(options.textCase, TextCase);\n add(options.heading, NotumHeading);\n add(options.dynamicField, DynamicField);\n add(options.ckCompat, CkCompat);\n\n return extensions;\n },\n});\n","import { DocumentEngineConfig } from './kit/kit.type';\n\n/**\n * EditorCapabilities class\n * Pre-calculates all capability checks from DocumentEngineConfig\n * to avoid repeated function calls in UI components\n */\nexport class EditorCapabilities {\n // History (undo/redo)\n readonly hasHistory: boolean;\n\n // Basic inline\n readonly hasBold: boolean;\n readonly hasItalic: boolean;\n readonly hasUnderline: boolean;\n readonly hasStrike: boolean;\n readonly basicInline: boolean;\n\n // Advanced Inine\n readonly hasSubscript: boolean;\n readonly hasSuperscript: boolean;\n readonly hasCode: boolean;\n readonly hasLink: boolean;\n readonly advancedInline: boolean;\n\n // Text property\n readonly hasHeading: boolean;\n readonly hasFontSize: boolean;\n readonly hasLineHeight: boolean;\n readonly hasTextCase: boolean;\n readonly hasTextProperty: boolean;\n\n // Alignment & Layout\n readonly hasTextAlign: boolean;\n readonly hasIndent: boolean;\n readonly hasLists: boolean;\n readonly hasAlignmentLayout: boolean;\n\n // Format Utilities\n readonly hasColors: boolean;\n readonly hasResetFormat: boolean;\n readonly hasFormatUtilities: boolean;\n\n // Block Types\n readonly hasCodeBlock: boolean;\n readonly hasBlockquote: boolean;\n readonly hasBlockTypes: boolean;\n\n // Insert Object\n readonly hasImages: boolean;\n readonly hasTable: boolean;\n readonly hasSpecialChars: boolean;\n readonly hasPageBreak: boolean;\n readonly hasInsertObject: boolean;\n\n // Business Features\n readonly hasTemplates: boolean;\n readonly hasDynamicFields: boolean;\n readonly hasEditableRegion: boolean;\n readonly hasBusinessFeatures: boolean;\n\n // Actions\n readonly hasClearContent: boolean;\n readonly hasMarkdown: boolean;\n readonly hasActions: boolean;\n\n // UI Components\n readonly hasFooter: boolean;\n readonly hasPrintButton: boolean;\n\n constructor(config: Partial<DocumentEngineConfig>) {\n // History\n this.hasHistory = config.undoRedo !== false;\n\n // Basic inline\n this.hasBold = config.bold !== false;\n this.hasItalic = config.italic !== false;\n this.hasUnderline = config.underline !== false;\n this.hasStrike = config.strike !== false;\n this.basicInline = this.hasBold || this.hasItalic || this.hasUnderline || this.hasStrike;\n\n // Advanced Inline\n this.hasSubscript = config.subscript !== false;\n this.hasSuperscript = config.superscript !== false;\n this.hasCode = config.code !== false;\n this.hasLink = config.link !== false;\n this.advancedInline = this.hasSubscript || this.hasSuperscript || this.hasCode || this.hasLink;\n\n // Text property\n this.hasHeading = config.heading !== false;\n this.hasFontSize = config.fontSize !== false;\n this.hasLineHeight = config.lineHeight !== false;\n this.hasTextCase = config.textCase !== false;\n this.hasTextProperty = this.hasHeading || this.hasFontSize || this.hasLineHeight || this.hasTextCase;\n\n // Alignment & Layout\n this.hasTextAlign = config.textAlign !== false;\n this.hasIndent = config.indent !== false;\n this.hasLists = config.list !== false;\n this.hasAlignmentLayout = this.hasTextAlign || this.hasIndent || this.hasLists;\n\n // Format Utilities\n this.hasColors = config.textStyleKit !== false;\n this.hasResetFormat = config.resetFormat !== false;\n this.hasFormatUtilities = this.hasColors || this.hasResetFormat;\n\n // Block Types\n this.hasCodeBlock = false;\n this.hasBlockquote = config.blockquote !== false;\n this.hasBlockTypes = this.hasCodeBlock || this.hasBlockquote;\n\n // Insert Object\n this.hasImages = config.image !== false;\n this.hasTable = config.tables !== false;\n this.hasSpecialChars = config.specialCharacters !== false;\n this.hasPageBreak = config.pageBreak !== false;\n this.hasInsertObject = this.hasImages || this.hasTable || this.hasSpecialChars || this.hasPageBreak;\n\n // Business Features\n this.hasTemplates = !!(config.templates && config.templates.length > 0);\n this.hasDynamicFields = config.dynamicField !== false;\n this.hasEditableRegion = config.restrictedEditing !== false;\n this.hasBusinessFeatures = this.hasTemplates || this.hasDynamicFields || this.hasEditableRegion;\n\n // Actions\n this.hasClearContent = config.clearContent !== false;\n this.hasMarkdown = false;\n this.hasActions = this.hasClearContent || this.hasMarkdown;\n\n // UI Components\n this.hasFooter = config.showFooter !== false;\n this.hasPrintButton = config.showPrintButton !== false;\n }\n}\n","import { DocumentEngineConfig } from '../core/kit/kit.type';\n\nexport const DefaultEditorConfig: Partial<DocumentEngineConfig> = {\n link: {\n openOnClick: false,\n defaultProtocol: 'https',\n enableClickSelection: true,\n shouldAutoLink: (url) =>\n url.startsWith('http://') || url.startsWith('https://') || url.startsWith('mailto:') || url.startsWith('tel:'),\n },\n blockquote: false,\n heading: false,\n bold: false,\n italic: false,\n underline: false,\n strike: false,\n list: false,\n codeBlock: false,\n code: false,\n undoRedo: false,\n textStyleKit: false,\n tables: false,\n characterCount: false,\n subscript: false,\n superscript: false,\n textAlign: false,\n image: false,\n placeholder: false,\n pageBreak: false,\n resetFormat: false,\n indent: false,\n clearContent: false,\n textCase: false,\n dynamicField: false,\n specialCharacters: false,\n showFooter: false,\n fontSize: false,\n lineHeight: false,\n editable: true,\n restrictedEditing: false,\n showToolbar: true,\n showPrintButton: false,\n};\n","import { Directive, ElementRef, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuPlugin, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';\nimport { BubbleMenuProps } from './bubble-menu.type';\n\n@Directive({\n selector: 'tiptap-bubble-menu[editor], [tiptapBubbleMenu][editor]',\n standalone: true,\n})\nexport class TiptapBubbleMenuDirective implements OnInit, OnDestroy {\n private elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n @Input() props!: BubbleMenuProps;\n @Input() editor!: Editor;\n @Input() mountTo?: BubbleMenuPluginProps['getReferencedVirtualElement'];\n @Input() shouldShow?: BubbleMenuPluginProps['shouldShow'];\n\n ngOnInit(): void {\n const editor = this.editor;\n if (!editor) throw new Error('Required: Input `editor`');\n\n const bubbleMenuElement = this.elRef.nativeElement;\n bubbleMenuElement.style.visibility = 'hidden';\n bubbleMenuElement.style.position = 'absolute';\n\n // Prevent editor blur when interacting with the bubble content\n // bubbleMenuElement.addEventListener('mousedown', this.preventDefault);\n\n const { pluginKey, appendTo, updateDelay, resizeDelay, options } = this.props;\n\n editor.registerPlugin(\n BubbleMenuPlugin({\n pluginKey,\n appendTo,\n updateDelay,\n resizeDelay,\n editor,\n element: bubbleMenuElement,\n options: this.getFloatingUiOptions(options ?? {}, bubbleMenuElement),\n shouldShow: this.shouldShow,\n getReferencedVirtualElement: this.mountTo,\n }),\n );\n }\n\n ngOnDestroy(): void {\n if (this.editor && this.props?.pluginKey) {\n this.editor.unregisterPlugin(this.props.pluginKey);\n }\n\n window.requestAnimationFrame(() => {\n if (this.elRef.nativeElement.parentNode) {\n this.elRef.nativeElement.parentNode.removeChild(this.elRef.nativeElement);\n }\n });\n\n this.elRef.nativeElement.removeEventListener('mousedown', this.preventDefault);\n }\n\n preventDefault(event: MouseEvent): void {\n // Allow default behavior for focusable elements so inputs can receive focus\n const target = event.target as HTMLElement | null;\n if (target) {\n const tag = target.tagName;\n const isFocusableTag = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable;\n if (isFocusableTag) return;\n }\n\n event.preventDefault();\n }\n\n private getFloatingUiOptions(\n userOptions: Partial<Record<string, unknown>>,\n element: HTMLElement,\n ): BubbleMenuPluginProps['options'] {\n // Find arrow element if it exists\n // const arrowElement = element.querySelector('[data-arrow]') as HTMLElement | null;\n\n // Merge with default Floating UI options\n const defaultOptions: BubbleMenuPluginProps['options'] = {\n placement: 'bottom',\n flip: {\n fallbackPlacements: ['top', 'bottom', 'bottom-start', 'top-end', 'bottom-end'],\n padding: 8,\n },\n // Enable shift middleware to keep bubble within viewport\n shift: { padding: 8 },\n // Add offset to create space between selection and bubble\n offset: 10,\n // Configure arrow if element exists\n // arrow: arrowElement ? { element: arrowElement } : false,\n };\n\n return { ...defaultOptions, ...userOptions };\n }\n}\n","import { Editor } from '@tiptap/core';\nimport { BubbleTarget } from './bubble-menu.type';\n\nexport function shouldShowFnFactory(params: {\n editor: Editor;\n target: BubbleTarget;\n forceOpen: () => boolean;\n}): () => boolean {\n const { editor, target, forceOpen } = params;\n const requireFocus = target.requireFocus !== false;\n const allowEmptySelection = target.allowEmptySelection === true;\n\n return () => {\n if (forceOpen()) return true;\n if (requireFocus && !editor.isFocused) return false;\n\n // Avoid showing during drag/resize\n const dragging = (editor as unknown as { isDragging?: boolean }).isDragging;\n if (dragging) return false;\n\n // Avoid showing when selection is empty and mark is required\n if (!allowEmptySelection && editor.state.selection.empty && target.kind === 'mark') return false;\n\n // Avoid showing when extension is not active\n const active = Array.isArray(target.name)\n ? target.name.some((name) => editor.isActive(name))\n : editor.isActive(target.name);\n\n if (!active) return false;\n\n // Avoid showing when extra predicate is not met\n if (target.extraPredicate && !target.extraPredicate(editor)) return false;\n\n return true;\n };\n}\n\nexport function selectionChangeHandler(params: {\n editor: Editor;\n target: BubbleTarget;\n onActive: (attrs: Record<string, unknown>) => void;\n onInactive: () => void;\n listenOnUpdate?: boolean; // default false\n}): () => void {\n const { editor, target, onActive, onInactive, listenOnUpdate } = params;\n\n const run = () => {\n const isActive = Array.isArray(target.name)\n ? target.name.some((name) => editor.isActive(name))\n : editor.isActive(target.name);\n\n if (!isActive) return onInactive();\n\n const activeName = Array.isArray(target.name) ? target.name.find((name) => editor.isActive(name)) : target.name;\n\n const attrs =\n target.kind === 'mark'\n ? (editor.getAttributes(activeName as string) ?? {})\n : ((editor.state.selection as any).node?.attrs ?? {});\n\n onActive(attrs);\n };\n\n const onSelection = () => run();\n const onUpdate = () => run();\n\n editor.on('selectionUpdate', onSelection);\n if (listenOnUpdate) editor.on('update', onUpdate);\n\n run(); // initial sync\n\n return () => {\n editor.off('selectionUpdate', onSelection);\n if (listenOnUpdate) editor.off('update', onUpdate);\n };\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\nexport type OutsideHandler = (e: Event) => void;\n\n@Injectable({ providedIn: 'root' })\nexport class EventManager {\n private document = inject(DOCUMENT);\n private keyToEscapeListener = new Map<string, OutsideHandler>();\n private keyToOutsideListener = new Map<string, OutsideHandler>();\n\n isAttached(key: string): boolean {\n return this.keyToOutsideListener.has(key) || this.keyToEscapeListener.has(key);\n }\n\n attach(key: string, hostElement: HTMLElement, cb: (key: string) => void, anchorElement?: HTMLElement): void {\n // Avoid duplicate listeners\n this.detach(key);\n\n const oldOutside = this.keyToOutsideListener.get(key);\n if (!oldOutside) {\n const handler: OutsideHandler = (event: Event) => {\n const target = event.target as Node | null;\n const path = (event as unknown as { composedPath?: () => EventTarget[] }).composedPath?.();\n\n // Check if click is inside bubble\n const isInsideBubble =\n !!hostElement && ((!!target && hostElement.contains(target)) || (!!path && path.includes(hostElement)));\n if (isInsideBubble) return;\n\n // Check if click is on the anchor (toolbar button)\n const isInsideAnchor =\n !!anchorElement && ((!!target && anchorElement.contains(target)) || (!!path && path.includes(anchorElement)));\n if (isInsideAnchor) return;\n\n // Check if click is inside a CDK overlay (e.g., MatSelect dropdown, MatMenu, etc.)\n // These are rendered outside the bubble but should not close it\n if (target instanceof Element) {\n const isInsideOverlay = target.closest('.cdk-overlay-container, .cdk-overlay-pane');\n if (isInsideOverlay) return;\n }\n\n cb(key);\n };\n\n this.keyToOutsideListener.set(key, handler);\n\n this.document.addEventListener('pointerdown', handler, true);\n this.document.addEventListener('mousedown', handler, true);\n this.document.addEventListener('click', handler, true);\n }\n\n const oldEsc = this.keyToEscapeListener.get(key);\n if (!oldEsc) {\n const escHandler = (e: Event) => (e as KeyboardEvent).key === 'Escape' && cb(key);\n this.document.addEventListener('keydown', escHandler, true);\n this.keyToEscapeListener.set(key, escHandler);\n }\n }\n\n detach(key: string): void {\n const outside = this.keyToOutsideListener.get(key);\n if (outside) {\n this.document.removeEventListener('pointerdown', outside, true);\n this.document.removeEventListener('mousedown', outside, true);\n this.document.removeEventListener('click', outside, true);\n this.keyToOutsideListener.delete(key);\n }\n\n const esc = this.keyToEscapeListener.get(key);\n if (esc) {\n this.document.removeEventListener('keydown', esc, true);\n this.keyToEscapeListener.delete(key);\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\n\n/**\n * Service to manage focus trapping within an element\n * Traps keyboard focus inside a container element for accessibility\n */\n@Injectable({ providedIn: 'root' })\nexport class FocusTrapService {\n private document = inject(DOCUMENT);\n private activeTraps = new Map<\n HTMLElement,\n {\n handler: (event: KeyboardEvent) => void;\n firstElement: HTMLElement | null;\n lastElement: HTMLElement | null;\n }\n >();\n\n /**\n * Attach focus trap to an element\n * @param element The container element to trap focus within\n * @param autoFocus Whether to automatically focus the first focusable element\n */\n attach(element: HTMLElement, autoFocus = true): void {\n if (!element) return;\n\n // Detach existing trap if any\n this.detach(element);\n\n // Get all focusable elements within the container\n const focusableSelectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ');\n\n const focusableElements = Array.from(element.querySelectorAll(focusableSelectors)) as HTMLElement[];\n\n if (focusableElements.length === 0) return;\n\n const firstFocusableElement = focusableElements[0];\n const lastFocusableElement = focusableElements[focusableElements.length - 1];\n\n // Focus the first element if requested\n if (autoFocus && firstFocusableElement) {\n setTimeout(() => {\n firstFocusableElement.focus();\n }, 0);\n }\n\n // Handle Tab key to trap focus\n const handler = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n if (!element.contains(this.document.activeElement)) {\n event.preventDefault();\n if (event.shiftKey) {\n lastFocusableElement?.focus();\n } else {\n firstFocusableElement?.focus();\n }\n return;\n }\n\n if (event.shiftKey) {\n // Shift + Tab: going backwards\n if (this.document.activeElement === firstFocusableElement) {\n event.preventDefault();\n lastFocusableElement?.focus();\n }\n } else {\n // Tab: going forwards\n if (this.document.activeElement === lastFocusableElement) {\n event.preventDefault();\n firstFocusableElement?.focus();\n }\n }\n };\n\n element.addEventListener('keydown', handler);\n\n this.activeTraps.set(element, {\n handler,\n firstElement: firstFocusableElement,\n lastElement: lastFocusableElement,\n });\n }\n\n /**\n * Detach focus trap from an element\n * @param element The element to remove focus trap from\n */\n detach(element: HTMLElement): void {\n if (!element) return;\n\n const trap = this.activeTraps.get(element);\n if (trap) {\n element.removeEventListener('keydown', trap.handler);\n this.activeTraps.delete(element);\n }\n }\n\n /**\n * Detach all active focus traps\n */\n detachAll(): void {\n this.activeTraps.forEach((trap, element) => {\n element.removeEventListener('keydown', trap.handler);\n });\n this.activeTraps.clear();\n }\n\n /**\n * Re-attach focus trap to an element (useful when content changes)\n * @param element The element to re-attach focus trap to\n * @param autoFocus Whether to automatically focus the first focusable element\n */\n reattach(element: HTMLElement, autoFocus = false): void {\n this.detach(element);\n this.attach(element, autoFocus);\n }\n}\n","import { ApplicationRef, ComponentRef, ElementRef, Injector, Type, createComponent } from '@angular/core';\n\nexport class AngularRenderer<C, P> {\n private applicationRef: ApplicationRef;\n private componentRef: ComponentRef<C>;\n\n constructor(ViewComponent: Type<C>, injector: Injector, props: Partial<P>) {\n this.applicationRef = injector.get(ApplicationRef);\n\n this.componentRef = createComponent(ViewComponent, {\n environmentInjector: this.applicationRef.injector,\n elementInjector: injector,\n });\n\n // set input props to the component\n this.updateProps(props);\n\n this.applicationRef.attachView(this.componentRef.hostView);\n }\n\n get instance(): C {\n return this.componentRef.instance;\n }\n\n get elementRef(): ElementRef {\n return this.componentRef.injector.get(ElementRef);\n }\n\n get dom(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n updateProps<T extends P>(props: Partial<T>): void {\n Object.entries(props).forEach(([key, value]) => {\n this.componentRef.setInput(key, value);\n });\n }\n\n updateAttributes(attributes: Record<string, string>): void {\n Object.keys(attributes).forEach((key) => {\n this.dom.setAttribute(key, attributes[key]);\n });\n }\n\n detectChanges(): void {\n this.componentRef.changeDetectorRef.detectChanges();\n }\n\n destroy(): void {\n this.componentRef.destroy();\n this.applicationRef.detachView(this.componentRef.hostView);\n }\n}\n","import { Directive, HostBinding } from '@angular/core';\n\n@Directive({\n selector: '[tiptapDraggable]',\n})\nexport class TiptapDraggableDirective {\n @HostBinding('attr.draggable') draggable = true;\n @HostBinding('attr.data-drag-handle') handle = '';\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Type definition for HTML preprocessor function.\n * Allows clients to transform HTML content before it's set into the editor.\n *\n * @param html - The raw HTML string to be processed\n * @returns The processed HTML string that will be set into the editor\n *\n * @example\n * ```typescript\n * const myPreprocessor: EditorHtmlPreprocessor = (html: string) => {\n * // Remove all script tags for security\n * return html.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n * };\n * ```\n */\nexport type EditorHtmlPreprocessor = (html: string) => string;\n\n/**\n * Injection token for HTML preprocessor function.\n * Use this token to provide a custom function that processes HTML content\n * before it's set into the TipTap editor.\n *\n * This is optional - if not provided, the editor will use the HTML content as-is.\n *\n * @example\n * ```typescript\n * // In your component or module providers\n * {\n * provide: EDITOR_HTML_PREPROCESSOR,\n * useValue: (html: string) => {\n * // Your custom preprocessing logic\n * return html.replace(/old/g, 'new');\n * }\n * }\n * ```\n */\nexport const EDITOR_HTML_PREPROCESSOR = new InjectionToken<EditorHtmlPreprocessor>('EDITOR_HTML_PREPROCESSOR');\n\n/**\n * Injection token for content wrapper class.\n * Use this token to provide a custom class name for the content wrapper element.\n *\n * @example\n * ```typescript\n * // In your component or module providers\n * {\n * provide: EDITOR_CONTENT_WRAPPER_CLASS,\n * useValue: 'my-content-wrapper'\n * }\n * ```\n */\nexport const EDITOR_CONTENT_WRAPPER_CLASS = new InjectionToken<string | null>('EDITOR_CONTENT_WRAPPER_CLASS', {\n providedIn: 'root',\n factory: () => null,\n});\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n Input,\n OnInit,\n Renderer2,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Content, Editor, type EditorEvents } from '@tiptap/core';\nimport { EDITOR_CONTENT_WRAPPER_CLASS, EDITOR_HTML_PREPROCESSOR } from './editor-tokens';\n\n@Directive({\n selector: 'tiptap[editor], [tiptap][editor], tiptap-editor[editor], [tiptapEditor][editor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TiptapEditorDirective),\n multi: true,\n },\n ],\n standalone: true,\n host: {\n ['class']: 'tiptap-editor no-twp',\n },\n})\nexport class TiptapEditorDirective implements OnInit, AfterViewInit, ControlValueAccessor {\n protected elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n protected renderer = inject(Renderer2);\n protected changeDetectorRef = inject(ChangeDetectorRef);\n\n protected htmlPreprocessor = inject(EDITOR_HTML_PREPROCESSOR, { optional: true });\n protected contentWrapperClass = inject(EDITOR_CONTENT_WRAPPER_CLASS, { optional: true });\n\n private _editor?: Editor;\n private initialEditableState?: boolean;\n\n @Input()\n set editor(editor: Editor) {\n this._editor = editor;\n // Store initial editable state immediately when editor is set\n // This ensures we capture the state before any Forms API calls\n if (this.initialEditableState === undefined && editor) {\n this.initialEditableState = editor.isEditable;\n }\n }\n\n get editor(): Editor {\n if (!this._editor) {\n throw new Error('Editor must be set before use.');\n }\n return this._editor;\n }\n\n @Input() outputFormat: 'json' | 'html' = 'html';\n\n protected onChange: (value: Content) => void = () => {\n /** */\n };\n protected onTouched: () => void = () => {\n /** */\n };\n\n // Writes a new value to the element.\n // This methods is called when programmatic changes from model to view are requested.\n writeValue(value: Content): void {\n // Apply preprocessor if value is a string (HTML) and preprocessor is available\n let processedValue = value;\n if (typeof value === 'string' && this.htmlPreprocessor) {\n processedValue = this.htmlPreprocessor(value);\n }\n this.editor.chain().setContent(processedValue, { emitUpdate: false }).run();\n }\n\n // Registers a callback function that is called when the control's value changes in the UI.\n registerOnChange(fn: () => void): void {\n this.onChange = fn;\n }\n\n // Registers a callback function that is called by the forms API on initialization to update the form model on blur.\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n // Called by the forms api to enable or disable the element\n setDisabledState(isDisabled: boolean): void {\n // Ensure we have captured the initial state (fallback in case setter wasn't called)\n if (this.initialEditableState === undefined && this.editor) {\n this.initialEditableState = this.editor.isEditable;\n }\n\n // Only apply disabled state if editor was initially editable\n // If editor was configured as readonly (editable: false), preserve that state\n if (this.initialEditableState === true) {\n this.editor.setEditable(!isDisabled);\n }\n // If initialEditableState === false, do nothing - preserve readonly state\n\n this.renderer.setProperty(this.elRef.nativeElement, 'disabled', isDisabled);\n }\n\n protected handleChange = ({ editor, transaction }: EditorEvents['transaction']): void => {\n if (!transaction.docChanged) return;\n\n // Needed for ChangeDetectionStrategy.OnPush to get notified about changes\n this.changeDetectorRef.markForCheck();\n\n if (this.outputFormat === 'html') {\n const htmlContent = editor.getHTML();\n\n let finalContent = htmlContent;\n\n if (this.contentWrapperClass) {\n finalContent = `<div class=\"${this.contentWrapperClass}\">${htmlContent}</div>`;\n }\n\n this.onChange(finalContent);\n return;\n }\n\n this.onChange(editor.getJSON());\n };\n\n ngOnInit(): void {\n const editor = this.editor;\n\n // take the inner contents and clear the block\n const { innerHTML } = this.elRef.nativeElement;\n this.elRef.nativeElement.innerHTML = '';\n\n // insert the editor in the dom\n this.elRef.nativeElement.append(\n ...Array.from((editor.options.element as HTMLElement | undefined)?.childNodes || [])\n );\n\n // update the options for the editor\n editor.setOptions({ element: this.elRef.nativeElement });\n\n // update content to the editor\n if (innerHTML) {\n // Apply preprocessor to initial content if available\n const processedContent = this.htmlPreprocessor ? this.htmlPreprocessor(innerHTML) : innerHTML;\n editor.chain().setContent(processedContent, { emitUpdate: false }).run();\n }\n\n // register blur handler to update `touched` property\n editor.on('blur', () => {\n this.onTouched();\n });\n\n // register update handler to listen to changes on update\n editor.on('update', this.handleChange);\n\n // Needed for ChangeDetectionStrategy.OnPush to get notified\n editor.on('selectionUpdate', () => this.changeDetectorRef.markForCheck());\n }\n\n ngAfterViewInit(): void {\n this.changeDetectorRef.detectChanges();\n }\n}\n","import { Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { FloatingMenuPlugin, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu';\n\n@Directive({\n selector: 'tiptap-floating-menu[editor], [tiptapFloatingMenu][editor]',\n})\nexport class TiptapFloatingMenuDirective implements OnInit, OnDestroy {\n constructor(private elRef: ElementRef<HTMLElement>) {}\n\n @Input() pluginKey: FloatingMenuPluginProps['pluginKey'] = 'TiptapFloatingMenu';\n @Input() editor!: Editor;\n @Input() options: FloatingMenuPluginProps['options'] = {};\n @Input() shouldShow?: FloatingMenuPluginProps['shouldShow'];\n\n ngOnInit(): void {\n const editor = this.editor;\n if (!editor) {\n throw new Error('Required: Input `editor`');\n }\n\n const floatingMenuElement = this.elRef.nativeElement;\n floatingMenuElement.style.visibility = 'hidden';\n floatingMenuElement.style.position = 'absolute';\n\n editor.registerPlugin(\n FloatingMenuPlugin({\n pluginKey: this.pluginKey,\n editor,\n element: floatingMenuElement,\n options: this.options,\n shouldShow: this.shouldShow,\n }),\n );\n }\n\n ngOnDestroy(): void {\n if (this.editor && this.pluginKey) {\n this.editor.unregisterPlugin(this.pluginKey);\n }\n window.requestAnimationFrame(() => {\n if (this.elRef.nativeElement.parentNode) {\n this.elRef.nativeElement.parentNode.removeChild(this.elRef.nativeElement);\n }\n });\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Directive,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { computePosition, flip, offset, shift, autoUpdate, Placement } from '@floating-ui/dom';\n\n/**\n * Directive for positioning a popover/dropdown relative to a trigger element using floating-ui\n * Handles positioning, visibility, and cleanup automatically\n *\n * Usage:\n * <button #trigger>Open</button>\n * <div [documentEnginePopover]=\"trigger\" [isOpen]=\"isOpen\">\n * Content\n * </div>\n *\n * The host is pinned `position: fixed`, so floating-ui is asked for viewport-\n * relative coordinates (`strategy: 'fixed'`). Omitting the strategy yields\n * offset-parent-relative numbers, which are off by the page's scroll offset\n * once written onto a fixed element.\n */\n@Directive({\n // `documentEnginePopover` is the supported selector. `[popover]` is kept as a\n // deprecated alias for consumers on <= 0.1.4; it collides with the platform's\n // native popover attribute and will be removed in the next major.\n selector: '[documentEnginePopover], [popover]',\n standalone: true,\n host: {\n '[style.position]': '\"fixed\"',\n '[style.visibility]': 'isPositioned ? \"visible\" : \"hidden\"',\n },\n})\nexport class PopoverDirective implements OnChanges, AfterViewInit, OnDestroy {\n private elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private cdr = inject(ChangeDetectorRef);\n\n /**\n * The trigger element reference (ElementRef or HTMLElement)\n */\n @Input() documentEnginePopover?: ElementRef<HTMLElement> | HTMLElement;\n\n /**\n * The trigger element reference (ElementRef or HTMLElement)\n *\n * @deprecated Use `documentEnginePopover`. `[popover]` collides with the\n * native HTML popover attribute and will be removed in the next major.\n */\n @Input() popover?: ElementRef<HTMLElement> | HTMLElement;\n\n /** The trigger, whichever input supplied it. */\n private get trigger(): ElementRef<HTMLElement> | HTMLElement | undefined {\n return this.documentEnginePopover ?? this.popover;\n }\n\n /**\n * Whether the popover is open\n */\n @Input() isOpen = false;\n\n /**\n * Placement of the popover relative to trigger\n */\n @Input() placement: Placement = 'bottom-start';\n\n /**\n * Offset from trigger\n */\n @Input() offset = 8;\n\n /**\n * Padding for flip/shift middleware\n */\n @Input() padding = 8;\n\n private cleanupAutoUpdate?: () => void;\n isPositioned = false;\n private viewInitialized = false;\n private retryCount = 0;\n private readonly maxRetries = 10;\n\n ngAfterViewInit(): void {\n this.viewInitialized = true;\n this.updateVisibility();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n this.viewInitialized &&\n (changes['isOpen'] || changes['popover'] || changes['documentEnginePopover'])\n ) {\n this.updateVisibility();\n }\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n private updateVisibility(): void {\n if (!this.viewInitialized) return;\n\n if (this.isOpen && this.trigger) {\n // Wait for next tick to ensure element is rendered\n setTimeout(() => {\n this.setupFloating();\n });\n } else {\n this.isPositioned = false;\n this.cleanup();\n }\n }\n\n private setupFloating(): void {\n // Reset retry count on each attempt\n this.retryCount = 0;\n this._setupFloatingInternal();\n }\n\n private _setupFloatingInternal(): void {\n let triggerEl: HTMLElement | undefined;\n const trigger = this.trigger;\n\n if (!trigger) {\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => this._setupFloatingInternal(), 10);\n }\n return;\n }\n\n if (trigger instanceof ElementRef) {\n triggerEl = trigger.nativeElement;\n // If ElementRef exists but nativeElement is not yet available, retry\n if (!triggerEl) {\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => this._setupFloatingInternal(), 10);\n }\n return;\n }\n } else {\n triggerEl = trigger;\n }\n\n const dropdownEl = this.elRef.nativeElement;\n\n if (!triggerEl || !dropdownEl) {\n // Retry if elements not ready\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => this._setupFloatingInternal(), 10);\n }\n return;\n }\n\n // Compute initial position before showing dropdown to prevent flash\n this.reposition(triggerEl, dropdownEl)\n .then(() => {\n this.isPositioned = true;\n // Trigger change detection to update visibility binding\n this.cdr.markForCheck();\n })\n .catch((error) => {\n console.error('[PopoverDirective] Error computing position', error);\n });\n\n // Use autoUpdate to automatically reposition on scroll/resize. It must use\n // the SAME strategy as the initial call, or the first scroll undoes the fix.\n this.cleanupAutoUpdate = autoUpdate(triggerEl, dropdownEl, () => {\n void this.reposition(triggerEl as HTMLElement, dropdownEl);\n });\n }\n\n /**\n * Position `dropdownEl` against `triggerEl`.\n *\n * `strategy: 'fixed'` is required: the host binding pins this element to\n * `position: fixed`, so the coordinates must be viewport-relative. Without it\n * floating-ui returns offset-parent-relative numbers and the panel lands the\n * page's scroll offset away from its trigger.\n */\n private reposition(triggerEl: HTMLElement, dropdownEl: HTMLElement): Promise<void> {\n return computePosition(triggerEl, dropdownEl, {\n strategy: 'fixed',\n placement: this.placement,\n middleware: [offset(this.offset), flip(), shift({ padding: this.padding })],\n }).then(({ x, y }) => {\n Object.assign(dropdownEl.style, { left: `${x}px`, top: `${y}px` });\n });\n }\n\n private cleanup(): void {\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = undefined;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { Editor } from '@tiptap/core';\n\n/**\n * Character Count component for document editor footer\n * Displays character/word count with optional limit and color coding\n */\n@Component({\n selector: 'document-engine-character-count',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './character-count.component.html',\n styleUrls: ['./character-count.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CharacterCountComponent implements OnInit, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input() editor!: Editor;\n @Input() config?: Partial<DocumentEngineConfig>;\n @Input() mode: 'characters' | 'words' = 'characters';\n\n count = 0;\n limit: number | null = null;\n\n private updateCount = (): void => {\n if (!this.editor) {\n return;\n }\n\n // Get count from editor storage if available\n const characterCountStorage = this.editor.storage.characterCount;\n if (characterCountStorage) {\n if (this.mode === 'characters') {\n this.count = characterCountStorage.characters?.() || 0;\n } else {\n this.count = characterCountStorage.words?.() || 0;\n }\n } else {\n // Fallback: calculate from text\n const text = this.editor.getText();\n if (this.mode === 'characters') {\n this.count = text.length;\n } else {\n this.count = text.trim() ? text.trim().split(/\\s+/).length : 0;\n }\n }\n\n // Get limit from config\n const characterCountConfig = this.config?.characterCount;\n if (characterCountConfig && typeof characterCountConfig === 'object') {\n this.limit = characterCountConfig.limit || null;\n } else {\n this.limit = null;\n }\n\n this.cdr.markForCheck();\n };\n\n ngOnInit(): void {\n if (!this.editor) {\n return;\n }\n\n // Subscribe to update events to keep count in sync\n this.editor.on('update', this.updateCount);\n this.editor.on('transaction', this.updateCount);\n\n // Initialize count once\n this.updateCount();\n }\n\n ngOnDestroy(): void {\n if (this.editor) {\n this.editor.off('update', this.updateCount);\n this.editor.off('transaction', this.updateCount);\n }\n }\n\n isNearLimit(): boolean {\n if (!this.limit) {\n return false;\n }\n // Consider near limit when >= 90% of limit\n return this.count >= this.limit * 0.9 && this.count < this.limit;\n }\n\n isOverLimit(): boolean {\n if (!this.limit) {\n return false;\n }\n return this.count > this.limit;\n }\n}\n","<div class=\"document-engine-character-count\">\n <span\n class=\"document-engine-character-count__text\"\n [class.document-engine-character-count__text--muted]=\"!isNearLimit() && !isOverLimit()\"\n [class.document-engine-character-count__text--warning]=\"isNearLimit() && !isOverLimit()\"\n [class.document-engine-character-count__text--error]=\"isOverLimit()\"\n >\n <ng-container *ngIf=\"mode === 'characters'\">\n <ng-container *ngIf=\"limit; else noLimit\"> {{ count }} / {{ limit }} characters. </ng-container>\n <ng-template #noLimit> {{ count }} {{ count === 1 ? 'character' : 'characters' }}. </ng-template>\n </ng-container>\n <ng-container *ngIf=\"mode === 'words'\"> {{ count }} {{ count === 1 ? 'word' : 'words' }}. </ng-container>\n </span>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { Editor } from '@tiptap/core';\nimport { CharacterCountComponent } from '../character-count/character-count.component';\n\n/**\n * Footer component for document editor\n * Container for footer components like character count\n */\n@Component({\n selector: 'document-engine-footer',\n standalone: true,\n imports: [CommonModule, CharacterCountComponent],\n templateUrl: './footer.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FooterComponent {\n @Input() editor!: Editor;\n @Input() config?: Partial<DocumentEngineConfig>;\n // @Input() editable = true;\n\n hasCharacterCount(): boolean {\n const config = this.config ?? {};\n return config.characterCount !== false;\n }\n}\n","<div class=\"document-engine-document-editor__footer\">\n <div class=\"document-engine-document-editor__footer-content\">\n <div class=\"document-engine-document-editor__footer-left\">\n <!-- Additional footer components can be added here -->\n </div>\n\n <div class=\"document-engine-document-editor__footer-right\">\n <document-engine-character-count\n *ngIf=\"hasCharacterCount()\"\n [editor]=\"editor\"\n [config]=\"config\"\n mode=\"characters\"\n ></document-engine-character-count>\n </div>\n </div>\n</div>\n","import { Color } from '@phuong-tran-redoc/document-engine-core';\n\nexport const COLORS: Color[] = Color.fromArray([\n { name: 'Black', value: '#000000', type: 'hex' },\n { name: 'Dim gray', value: '#696969', type: 'hex' },\n { name: 'Light gray', value: '#d3d3d3', type: 'hex' },\n { name: 'White', value: '#ffffff', type: 'hex' },\n { name: 'Transparent', value: 'transparent', type: 'hex' },\n\n // row 2\n { name: 'Red', value: '#ff0000', type: 'hex' },\n { name: 'Orange', value: '#ffa500', type: 'hex' },\n { name: 'Yellow', value: '#ffff00', type: 'hex' },\n { name: 'Light green', value: '#90ee90', type: 'hex' },\n { name: 'Green', value: '#008000', type: 'hex' },\n\n // row 3\n { name: 'Aquamarine', value: '#7fffd4', type: 'hex' },\n { name: 'Turquoise', value: '#40e0d0', type: 'hex' },\n { name: 'Lightblue', value: '#add8e6', type: 'hex' },\n { name: 'Blue', value: '#0000ff', type: 'hex' },\n { name: 'Purple', value: '#800080', type: 'hex' },\n]);\n","import { Directive, HostBinding, Input } from '@angular/core';\n\n/**\n * Custom button directive matching React button component styles\n * Supports variants: default, destructive, outline, secondary, ghost, link\n * Supports sizes: default, sm, lg, icon, icon-sm, icon-lg\n *\n * Usage:\n * - <button documentEngineButton>Text</button> - secondary variant, default size\n * - <button documentEngineButton=\"filled\">Text</button> - default variant (primary)\n * - <button documentEngineButton variant=\"outline\">Text</button> - outline variant\n * - <button documentEngineButton variant=\"icon\" size=\"icon-sm\">Icon</button> - icon button\n */\n@Directive({\n selector: 'button[documentEngineButton]',\n standalone: true,\n host: {\n type: 'button',\n },\n})\nexport class ButtonDirective {\n @Input() variant: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link' = 'ghost';\n @Input() size: 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm' | 'icon-lg' = 'default';\n\n @HostBinding('class')\n get buttonClasses(): string {\n const classes: string[] = ['btn'];\n\n classes.push(`btn--${this.variant}`);\n classes.push(`btn--size-${this.size}`);\n\n return classes.join(' ');\n }\n}\n","export const DEFAULT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect></svg>`;\n\nexport const CHECK = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"100%\" height=\"100%\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/></svg>`;\n\n// Official icons\nexport const UNDO = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M280-200v-80h284q63 0 109.5-40T720-420q0-60-46.5-100T564-560H312l104 104-56 56-200-200 200-200 56 56-104 104h252q97 0 166.5 63T800-420q0 94-69.5 157T564-200H280Z\"/></svg>`;\n\nexport const REDO = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M396-200q-97 0-166.5-63T160-420q0-94 69.5-157T396-640h252L544-744l56-56 200 200-200 200-56-56 104-104H396q-63 0-109.5 40T240-420q0 60 46.5 100T396-280h284v80H396Z\"/></svg>`;\n\nexport const FORMAT_SIZE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M560-160v-520H360v-120h520v120H680v520H560Zm-360 0v-320H80v-120h360v120H320v320H200Z\"/></svg>`;\n\nexport const ARROW_DROP_DOWN = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M480-360 280-560h400L480-360Z\"/></svg>`;\n\nexport const FORMAT_LINE_SPACING = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M240-160 80-320l56-56 64 62v-332l-64 62-56-56 160-160 160 160-56 56-64-62v332l64-62 56 56-160 160Zm240-40v-80h400v80H480Zm0-240v-80h400v80H480Zm0-240v-80h400v80H480Z\"/></svg>`;\n\nexport const MATCH_CASE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m131-252 165-440h79l165 440h-76l-39-112H247l-40 112h-76Zm139-176h131l-64-182h-4l-63 182Zm395 186q-51 0-81-27.5T554-342q0-44 34.5-72.5T677-443q23 0 45 4t38 11v-12q0-29-20.5-47T685-505q-23 0-42 9.5T610-468l-47-35q24-29 54.5-43t68.5-14q69 0 103 32.5t34 97.5v178h-63v-37h-4q-14 23-38 35t-53 12Zm12-54q35 0 59.5-24t24.5-56q-14-8-33.5-12.5T689-393q-32 0-50 14t-18 37q0 20 16 33t40 13Z\"/></svg>`;\n\nexport const FORMAT_CLEAR = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"m528-546-93-93-121-121h486v120H568l-40 94ZM792-56 460-388l-80 188H249l119-280L56-792l56-56 736 736-56 56Z\"/></svg>`;\n\nexport const FORMAT_COLOR_TEXT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M80 0v-160h800V0H80Zm140-280 210-560h100l210 560h-96l-50-144H368l-52 144h-96Zm176-224h168l-82-232h-4l-82 232Z\"/></svg>`;\n\nexport const FORMAT_COLOR_FILL = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m247-904 57-56 343 343q23 23 23 57t-23 57L457-313q-23 23-57 23t-57-23L153-503q-23-23-23-57t23-57l190-191-96-96Zm153 153L209-560h382L400-751Zm360 471q-33 0-56.5-23.5T680-360q0-21 12.5-45t27.5-45q9-12 19-25t21-25q11 12 21 25t19 25q15 21 27.5 45t12.5 45q0 33-23.5 56.5T760-280ZM80 0v-160h800V0H80Z\"/></svg>`;\n\nexport const FORMAT_BOLD = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z\"/></svg>`;\n\nexport const FORMAT_ITALIC = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100H200Z\"/></svg>`;\n\nexport const FORMAT_UNDERLINE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-120v-80h560v80H200Zm280-160q-101 0-157-63t-56-167v-330h103v336q0 56 28 91t82 35q54 0 82-35t28-91v-336h103v330q0 104-56 167t-157 63Z\"/></svg>`;\n\nexport const FORMAT_STRIKETHROUGH = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M80-400v-80h800v80H80Zm340-160v-120H200v-120h560v120H540v120H420Zm0 400v-160h120v160H420Z\"/></svg>`;\n\nexport const SUBSCRIPT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M760-160v-80q0-17 11.5-28.5T800-280h80v-40H760v-40h120q17 0 28.5 11.5T920-320v40q0 17-11.5 28.5T880-240h-80v40h120v40H760Zm-525-80 185-291-172-269h106l124 200h4l123-200h107L539-531l186 291H618L482-457h-4L342-240H235Z\"/></svg>`;\n\nexport const SUPERSCRIPT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M760-600v-80q0-17 11.5-28.5T800-720h80v-40H760v-40h120q17 0 28.5 11.5T920-760v40q0 17-11.5 28.5T880-680h-80v40h120v40H760ZM235-160l185-291-172-269h106l124 200h4l123-200h107L539-451l186 291H618L482-377h-4L342-160H235Z\"/></svg>`;\n\nexport const CODE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M320-240 80-480l240-240 57 57-184 184 183 183-56 56Zm320 0-57-57 184-184-183-183 56-56 240 240-240 240Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_LEFT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_CENTER = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm160-160v-80h400v80H280ZM120-440v-80h720v80H120Zm160-160v-80h400v80H280ZM120-760v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_RIGHT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_ALIGN_JUSTIFY = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z\"/></svg>`;\n\nexport const FORMAT_INDENT_DECREASE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm320-160v-80h400v80H440Zm0-160v-80h400v80H440Zm0-160v-80h400v80H440ZM120-760v-80h720v80H120Zm160 440L120-480l160-160v320Z\"/></svg>`;\n\nexport const FORMAT_INDENT_INCREASE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-80h720v80H120Zm320-160v-80h400v80H440Zm0-160v-80h400v80H440Zm0-160v-80h400v80H440ZM120-760v-80h720v80H120Zm0 440v-320l160 160-160 160Z\"/></svg>`;\n\nexport const FORMAT_LIST_BULLETED = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z\"/></svg>`;\n\nexport const FORMAT_LIST_NUMBERED = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-80v-60h100v-30h-60v-60h60v-30H120v-60h120q17 0 28.5 11.5T280-280v40q0 17-11.5 28.5T240-200q17 0 28.5 11.5T280-160v40q0 17-11.5 28.5T240-80H120Zm0-280v-110q0-17 11.5-28.5T160-510h60v-30H120v-60h120q17 0 28.5 11.5T280-560v70q0 17-11.5 28.5T240-450h-60v30h100v60H120Zm60-280v-180h-60v-60h120v240h-60Zm180 440v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360Z\"/></svg>`;\n\nexport const FORMAT_QUOTE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m228-240 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T458-480L320-240h-92Zm360 0 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T818-480L680-240h-92ZM320-500q25 0 42.5-17.5T380-560q0-25-17.5-42.5T320-620q-25 0-42.5 17.5T260-560q0 25 17.5 42.5T320-500Zm360 0q25 0 42.5-17.5T740-560q0-25-17.5-42.5T680-620q-25 0-42.5 17.5T620-560q0 25 17.5 42.5T680-500Zm0-60Zm-360 0Z\"/></svg>`;\n\nexport const TABLE_ROWS = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M760-200v-120H200v120h560Zm0-200v-160H200v160h560Zm0-240v-120H200v120h560ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Z\"/></svg>`;\n\nexport const LINK = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z\"/></svg>`;\n\nexport const LINK_OFF = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m770-302-60-62q40-11 65-42.5t25-73.5q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 57-29.5 105T770-302ZM634-440l-80-80h86v80h-6ZM792-56 56-792l56-56 736 736-56 56ZM440-280H280q-83 0-141.5-58.5T80-480q0-69 42-123t108-71l74 74h-24q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h65l79 80H320Z\"/></svg>`;\n\nexport const SPECIAL_CHARACTER = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-120v-120h200q-84-45-132-125t-48-175q0-142 99-241t241-99q142 0 241 99t99 241q0 95-48 175T640-240h200v120H520v-204q78-14 129-75t51-141q0-92-64-156t-156-64q-92 0-156 64t-64 156q0 80 51 141t129 75v204H120Z\"/></svg>`;\n\nexport const CLEAR_ALL = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M120-280v-80h560v80H120Zm80-160v-80h560v80H200Zm80-160v-80h560v80H280Z\"/></svg>`;\n\nexport const INSERT_PAGE_BREAK = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M240-80q-33 0-56.5-23.5T160-160v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-80H240Zm-80-440v-280q0-33 23.5-56.5T240-880h320l240 240v120h-80v-80H520v-200H240v280h-80Zm200 160v-80h240v80H360Zm320 0v-80h240v80H680Zm-640 0v-80h240v80H40Zm440-160Zm0 240Z\"/></svg>`;\n\nexport const MARKDOWN = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m640-360 120-120-42-43-48 48v-125h-60v125l-48-48-42 43 120 120ZM160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-480H160v480Zm0 0v-480 480Zm60-120h60v-180h40v120h60v-120h40v180h60v-200q0-17-11.5-28.5T440-600H260q-17 0-28.5 11.5T220-560v200Z\"/></svg>`;\n\nexport const DYNAMIC_FORM = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M160-520q-33 0-56.5-23.5T80-600v-120q0-33 23.5-56.5T160-800h360v280H160Zm0-80h280v-120H160v120Zm0 440q-33 0-56.5-23.5T80-240v-120q0-33 23.5-56.5T160-440h440v280H160Zm0-80h360v-120H160v120Zm520 80v-360h-80v-280h280l-80 200h80L680-160ZM190-270h60v-60h-60v60Zm0-360h60v-60h-60v60Zm-30 30v-120 120Zm0 360v-120 120Z\"/></svg>`;\n\nexport const PHOTO = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm40-80h480L570-480 450-320l-90-120-120 160Zm-40 80v-560 560Z\"/></svg>`;\n\nexport const PRINT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M640-640v-120H320v120h-80v-200h480v200h-80Zm-480 80h640-640Zm560 100q17 0 28.5-11.5T760-500q0-17-11.5-28.5T720-540q-17 0-28.5 11.5T680-500q0 17 11.5 28.5T720-460Zm-80 260v-160H320v160h320Zm80 80H240v-160H80v-240q0-51 35-85.5t85-34.5h560q51 0 85.5 34.5T880-520v240H720v160Zm80-240v-160q0-17-11.5-28.5T760-560H200q-17 0-28.5 11.5T160-520v160h80v-80h480v80h80Z\"/></svg>`;\n\nexport const ARCHIVE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m480-240 160-160-56-56-64 64v-168h-80v168l-64-64-56 56 160 160ZM200-640v440h560v-440H200Zm0 520q-33 0-56.5-23.5T120-200v-499q0-14 4.5-27t13.5-24l50-61q11-14 27.5-21.5T250-840h460q18 0 34.5 7.5T772-811l50 61q9 11 13.5 24t4.5 27v499q0 33-23.5 56.5T760-120H200Zm16-600h528l-34-40H250l-34 40Zm264 300Z\"/></svg>`;\n\n// Common Icons\nexport const EDIT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M200-200h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T817-647L290-120H120Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z\"/></svg>`;\n\nexport const SETTINGS = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm70-80h79l14-106q31-8 57.5-23.5T639-327l99 41 39-68-86-65q5-14 7-29.5t2-31.5q0-16-2-31.5t-7-29.5l86-65-39-68-99 42q-22-23-48.5-38.5T533-694l-13-106h-79l-14 106q-31 8-57.5 23.5T321-633l-99-41-39 68 86 64q-5 15-7 30t-2 32q0 16 2 31t7 30l-86 65 39 68 99-42q22 23 48.5 38.5T427-266l13 106Zm42-180q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Zm-2-140Z\"/></svg>`;\n\nexport const SEARCH = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z\"/></svg>`;\n\nexport const SEARCH_OFF = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M280-80q-83 0-141.5-58.5T80-280q0-83 58.5-141.5T280-480q83 0 141.5 58.5T480-280q0 83-58.5 141.5T280-80Zm544-40L568-376q-12-13-25.5-26.5T516-428q38-24 61-64t23-88q0-75-52.5-127.5T420-760q-75 0-127.5 52.5T240-580q0 6 .5 11.5T242-557q-18 2-39.5 8T164-535q-2-11-3-22t-1-23q0-109 75.5-184.5T420-840q109 0 184.5 75.5T680-580q0 43-13.5 81.5T629-428l251 252-56 56Zm-615-61 71-71 70 71 29-28-71-71 71-71-28-28-71 71-71-71-28 28 71 71-71 71 28 28Z\"/></svg>`;\n\nexport const DESCRIPTION = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\"/></svg>`;\n\nexport const CLOSE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>`;\n\nexport const VERTICAL_ALIGN_TOP = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M160-760v-80h640v80H160Zm280 640v-408L336-424l-56-56 200-200 200 200-56 56-104-104v408h-80Z\"/></svg>`;\n\nexport const VERTICAL_ALIGN_CENTER = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M440-80v-168l-64 64-56-56 160-160 160 160-56 56-64-64v168h-80ZM160-440v-80h640v80H160Zm320-120L320-720l56-56 64 64v-168h80v168l64-64 56 56-160 160Z\"/></svg>`;\n\nexport const VERTICAL_ALIGN_BOTTOM = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M160-120v-80h640v80H160Zm320-160L280-480l56-56 104 104v-408h80v408l104-104 56 56-200 200Z\"/></svg>`;\n\n// Custom SVG\nexport const RESTRICT_EDIT = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <g transform=\"translate(10 10) scale(0.8) translate(-10 -10)\">\n <path d=\"M6.25 16a.75.75 0 1 1 0 1.5H.75a.75.75 0 1 1 0-1.5zm0-5a.75.75 0 1 1 0 1.5H.75a.75.75 0 1 1 0-1.5zm3-5a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1 0-1.5zm6-5a.75.75 0 1 1 0 1.5H.75a.75.75 0 0 1 0-1.5zm.25 5.5a3.5 3.5 0 0 1 3.143 1.959.75.75 0 0 1-1.36.636A2 2 0 0 0 13.5 10v2H19a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1v-2l.005-.192A3.5 3.5 0 0 1 15.5 6.5m0 7.5a.5.5 0 0 0-.492.41L15 14.5v2a.5.5 0 0 0 .992.09L16 16.5v-2a.5.5 0 0 0-.5-.5\">\n </path>\n </g>\n</svg>\n`;\n\nexport const TABLE_CELL_PROPERTY = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"m11.105 18-.17 1H2.5A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1h15A1.5 1.5 0 0 1 19 2.5v9.975l-.85-.124-.15-.302V8h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5zM2 12h5V8H2zm10-4H8v4h4zM2 2v5h5V2zm0 16h5v-5H2zM13 7h5V2h-5zM8 2v5h4V2z\" opacity=\".6\"></path>\n <path d=\"m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43zM13 6a1 1 0 0 1 1 1v3.172a2 2 0 0 0-.293.443l-.858 1.736-1.916.28-.151.027A1.98 1.98 0 0 0 9.315 14H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm-1 2H8v4h4z\"></path>\n</svg>\n`;\n\nexport const TABLE_COLUMN = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1M2 2v16h16V2z\" opacity=\".6\"></path>\n <path d=\"M18 7v1H2V7zm0 5v1H2v-1z\" opacity=\".6\"></path>\n <path d=\"M14 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1m-2 1H8v4h4zm0 6H8v4h4zm0 6H8v4h4z\"></path>\n</svg>\n`;\n\nexport const TABLE_MERGE_CELL = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1M2 2v16h16V2z\" opacity=\".6\"></path>\n <path d=\"M7 2h1v16H7zm5 0h1v7h-1zm6 5v1H2V7zM8 12v1H2v-1z\" opacity=\".6\"></path>\n <path d=\"M7 7h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1m1 2v9h10V9z\"></path>\n</svg>\n`;\n\nexport const TABLE_PROPERTY = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2zm4 6H8v4h4z\" opacity=\".6\"></path>\n <path d=\"m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2 2 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2z\"></path>\n</svg>\n`;\n\nexport const TABLE_ROW = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1M2 2v16h16V2z\" opacity=\".6\"></path>\n <path d=\"M7 2h1v16H7zm5 0h1v16h-1z\" opacity=\".6\"></path>\n <path d=\"M1 6h18a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1m1 2v4h4V8zm6 0v4h4V8zm6 0v4h4V8z\"></path>\n</svg>\n`;\n","import { inject, Injectable } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport * as IconConstants from './icon.constant';\n\n/**\n * Icon registry service for managing SVG icons\n * Similar to Angular Material's MatIconRegistry\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class IconRegistryService {\n private sanitizer = inject(DomSanitizer);\n private icons: Map<string, string> = new Map();\n\n constructor() {\n this.registerDefaultIcons();\n }\n\n /**\n * Register a new icon with its SVG content\n */\n registerIcon(name: string, svgContent: string): void {\n if (this.icons.has(name)) {\n throw new Error(`Icon ${name} already registered`);\n }\n\n this.icons.set(name, svgContent);\n }\n\n /**\n * Get icon SVG content by name\n * Returns SafeHtml for use in templates with [innerHTML]\n */\n getIcon(name: string): SafeHtml {\n const icon = this.icons.get(name);\n\n if (!icon) {\n console.warn(`Icon ${name} not registered`);\n return this.sanitizer.bypassSecurityTrustHtml(IconConstants.DEFAULT);\n }\n\n return this.sanitizer.bypassSecurityTrustHtml(icon);\n }\n\n /**\n * Get raw icon SVG string by name\n * Returns string for direct DOM manipulation\n */\n getIconString(name: string): string {\n const icon = this.icons.get(name);\n\n if (!icon) {\n console.warn(`Icon ${name} not registered`);\n return IconConstants.DEFAULT;\n }\n\n return icon;\n }\n\n /**\n * Register default icons used in the application\n */\n private registerDefaultIcons(): void {\n // Basic icons\n this.registerIcon('check', IconConstants.CHECK);\n this.registerIcon('undo', IconConstants.UNDO);\n this.registerIcon('redo', IconConstants.REDO);\n\n // Formatting icons\n this.registerIcon('format_size', IconConstants.FORMAT_SIZE);\n this.registerIcon('arrow_drop_down', IconConstants.ARROW_DROP_DOWN);\n this.registerIcon('format_line_spacing', IconConstants.FORMAT_LINE_SPACING);\n this.registerIcon('match_case', IconConstants.MATCH_CASE);\n this.registerIcon('format_clear', IconConstants.FORMAT_CLEAR);\n this.registerIcon('format_color_text', IconConstants.FORMAT_COLOR_TEXT);\n this.registerIcon('format_color_fill', IconConstants.FORMAT_COLOR_FILL);\n this.registerIcon('format_bold', IconConstants.FORMAT_BOLD);\n this.registerIcon('format_italic', IconConstants.FORMAT_ITALIC);\n this.registerIcon('format_underline', IconConstants.FORMAT_UNDERLINE);\n this.registerIcon('format_strikethrough', IconConstants.FORMAT_STRIKETHROUGH);\n this.registerIcon('subscript', IconConstants.SUBSCRIPT);\n this.registerIcon('superscript', IconConstants.SUPERSCRIPT);\n this.registerIcon('code', IconConstants.CODE);\n\n // Alignment icons\n this.registerIcon('format_align_left', IconConstants.FORMAT_ALIGN_LEFT);\n this.registerIcon('format_align_center', IconConstants.FORMAT_ALIGN_CENTER);\n this.registerIcon('format_align_right', IconConstants.FORMAT_ALIGN_RIGHT);\n this.registerIcon('format_align_justify', IconConstants.FORMAT_ALIGN_JUSTIFY);\n this.registerIcon('format_indent_decrease', IconConstants.FORMAT_INDENT_DECREASE);\n this.registerIcon('format_indent_increase', IconConstants.FORMAT_INDENT_INCREASE);\n\n // List icons\n this.registerIcon('format_list_bulleted', IconConstants.FORMAT_LIST_BULLETED);\n this.registerIcon('format_list_numbered', IconConstants.FORMAT_LIST_NUMBERED);\n this.registerIcon('format_quote', IconConstants.FORMAT_QUOTE);\n\n // Table icons\n this.registerIcon('table_rows', IconConstants.TABLE_ROWS);\n this.registerIcon('table_cell_property', IconConstants.TABLE_CELL_PROPERTY);\n this.registerIcon('table_column', IconConstants.TABLE_COLUMN);\n this.registerIcon('table_merge_cell', IconConstants.TABLE_MERGE_CELL);\n this.registerIcon('table_property', IconConstants.TABLE_PROPERTY);\n this.registerIcon('table_row', IconConstants.TABLE_ROW);\n\n // Other icons\n this.registerIcon('link', IconConstants.LINK);\n this.registerIcon('link_off', IconConstants.LINK_OFF);\n this.registerIcon('special_character', IconConstants.SPECIAL_CHARACTER);\n this.registerIcon('clear_all', IconConstants.CLEAR_ALL);\n this.registerIcon('insert_page_break', IconConstants.INSERT_PAGE_BREAK);\n this.registerIcon('markdown', IconConstants.MARKDOWN);\n this.registerIcon('dynamic_form', IconConstants.DYNAMIC_FORM);\n this.registerIcon('photo', IconConstants.PHOTO);\n this.registerIcon('print', IconConstants.PRINT);\n this.registerIcon('archive', IconConstants.ARCHIVE);\n this.registerIcon('restrict_edit', IconConstants.RESTRICT_EDIT);\n\n this.registerIcon('edit', IconConstants.EDIT);\n this.registerIcon('settings', IconConstants.SETTINGS);\n this.registerIcon('search', IconConstants.SEARCH);\n this.registerIcon('search_off', IconConstants.SEARCH_OFF);\n this.registerIcon('description', IconConstants.DESCRIPTION);\n this.registerIcon('close', IconConstants.CLOSE);\n this.registerIcon('vertical_align_top', IconConstants.VERTICAL_ALIGN_TOP);\n this.registerIcon('vertical_align_center', IconConstants.VERTICAL_ALIGN_CENTER);\n this.registerIcon('vertical_align_bottom', IconConstants.VERTICAL_ALIGN_BOTTOM);\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n SimpleChanges,\n ViewEncapsulation,\n} from '@angular/core';\nimport { IconRegistryService } from './icon-registry.service';\n\n@Component({\n selector: 'document-engine-icon',\n standalone: true,\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class IconComponent {\n @Input()\n set name(value: string) {\n const svgContent = this.iconRegistry.getIconString(value);\n const hostElement = this.elementRef.nativeElement;\n\n // Set innerHTML to render SVG\n hostElement.innerHTML = svgContent;\n // this.cdr.markForCheck();\n }\n\n // private cdr = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private iconRegistry = inject(IconRegistryService);\n\n // ngOnChanges(changes: SimpleChanges): void {\n // if (changes['name']) {\n // const svgContent = this.iconRegistry.getIconString(this.name);\n // const hostElement = this.elementRef.nativeElement;\n\n // // Set innerHTML to render SVG\n // hostElement.innerHTML = svgContent;\n // this.cdr.markForCheck();\n // }\n // }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color } from '@phuong-tran-redoc/document-engine-core';\nimport { ButtonDirective } from './button';\nimport { IconComponent } from './icon';\n\n@Component({\n standalone: true,\n selector: 'document-engine-color-picker',\n imports: [CommonModule, FormsModule, ButtonDirective, IconComponent],\n template: `\n <div class=\"document-engine-color-picker\">\n <!-- Color Palette -->\n <div class=\"palette\">\n <div class=\"palette__item\" *ngFor=\"let color of colorPalette; trackBy: trackByColorValue\">\n <button\n type=\"button\"\n class=\"swatch\"\n [style.background-color]=\"color.value\"\n [attr.data-color]=\"color.value\"\n (click)=\"colorSelected.emit(color)\"\n [attr.title]=\"color.name\"\n >\n <div class=\"swatch__transparent\" *ngIf=\"color.value === 'transparent'\"></div>\n </button>\n\n <button\n *ngIf=\"isActive(color)\"\n type=\"button\"\n class=\"swatch__active-indicator\"\n (click)=\"colorRemoved.emit()\"\n [attr.title]=\"'Unset color'\"\n aria-label=\"Unset color\"\n >\n <document-engine-icon name=\"check\"></document-engine-icon>\n </button>\n </div>\n </div>\n\n <!-- Used Colors -->\n <div class=\"used\" *ngIf=\"usedColors && usedColors.length > 0\">\n <div class=\"used__label\">Used in document</div>\n <div class=\"used__list\">\n <button\n type=\"button\"\n class=\"swatch used__swatch\"\n *ngFor=\"let color of usedColors; trackBy: trackByColorValue\"\n [style.background-color]=\"color.value\"\n (click)=\"colorSelected.emit(color)\"\n [attr.title]=\"color.name\"\n ></button>\n </div>\n </div>\n\n <!-- Custom Color Input -->\n <div class=\"custom\">\n <div class=\"custom__label\">Custom</div>\n <div class=\"custom__controls\">\n <input type=\"color\" #colorInput class=\"custom__picker\" [(ngModel)]=\"customColor\" />\n\n <input\n type=\"text\"\n #hexInput=\"ngModel\"\n class=\"custom__hex\"\n placeholder=\"#000000\"\n required\n pattern=\"#([0-9a-fA-F]{6})\"\n [(ngModel)]=\"customColor\"\n />\n\n <button\n type=\"button\"\n documentEngineButton\n variant=\"default\"\n (click)=\"selectCustomColor()\"\n [disabled]=\"hexInput.invalid\"\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ColorPickerComponent {\n @Input() colorPalette: Color[] = [];\n @Input() usedColors: Color[] = [];\n @Input() activeColor: Color | null = null;\n\n @Output() colorSelected = new EventEmitter<Color>();\n @Output() colorRemoved = new EventEmitter<void>();\n\n customColor: string | null = null;\n\n trackByColorValue = (_: number, c: Color) => c?.value;\n\n isActive(color: Color): boolean {\n const active = this.activeColor;\n return active ? active.equals(color) : false;\n }\n\n selectCustomColor(): void {\n if (!this.customColor) {\n return;\n }\n this.colorSelected.emit(Color.from(this.customColor));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Color, normalizeColor } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { COLORS } from '../../constants/color.constant';\nimport { ButtonDirective } from '../../ui/button';\nimport { ColorPickerComponent } from '../../ui/color-picker';\n\n/**\n * Color picker view for bubble menu\n * Shows color palette for text and background colors\n */\n@Component({\n selector: 'document-engine-color-picker-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, ColorPickerComponent],\n template: `\n <div class=\"color-picker-view\">\n <!-- Title -->\n <div class=\"color-picker-view__title\">{{ colorType === 'text' ? 'Text Color' : 'Background Color' }}</div>\n\n <!-- Color Picker Component -->\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n [activeColor]=\"activeColor\"\n [usedColors]=\"usedColors\"\n (colorSelected)=\"applyColor($event)\"\n (colorRemoved)=\"removeColor()\"\n ></document-engine-color-picker>\n\n <!-- Actions -->\n <div class=\"color-picker-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"destructive\" (click)=\"removeColor()\">Remove Color</button>\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./color-picker-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ColorPickerViewComponent implements BubbleMenuViewContent<Record<string, unknown>> {\n editor?: Editor;\n colorType: 'text' | 'fill' = 'text';\n usedColors: Color[] = [];\n activeColor: Color | null = null;\n\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n // Basic color palette\n colorPalette = COLORS;\n\n onActivate(attrs: Record<string, unknown>): void {\n this.colorType = (attrs['type'] as 'text' | 'fill') || 'text';\n this.usedColors = this.collectUsedColors(this.colorType);\n this.activeColor = this.getActiveColor(this.colorType);\n }\n\n applyColor(color: Color | null): void {\n if (!this.editor || !color) return;\n\n if (this.colorType === 'text') {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).setColor(color.value).run();\n } else {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).setBackgroundColor(color.value).run();\n }\n\n this.close?.();\n }\n\n removeColor(): void {\n if (!this.editor) return;\n\n if (this.colorType === 'text') {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).unsetColor().run();\n } else {\n // Use the TextStyle extension methods\n (this.editor.chain().focus() as any).unsetBackgroundColor().run();\n }\n\n this.close?.();\n }\n\n private getActiveColor(type: 'text' | 'fill'): Color | null {\n const attr = type === 'text' ? 'color' : 'backgroundColor';\n const attrs = this.editor?.getAttributes('textStyle');\n const color = (attrs?.[attr] as string | undefined) || null;\n if (!color) return null;\n const normalized = normalizeColor(color);\n return normalized ? Color.from(normalized) : null;\n }\n\n private collectUsedColors(type: 'text' | 'fill'): Color[] {\n try {\n const json = this.editor?.getJSON();\n const colors = new Set<string>();\n const attr = type === 'text' ? 'color' : 'backgroundColor';\n\n type ProseMirrorNode = {\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n content?: ProseMirrorNode[];\n };\n\n const walk = (node: ProseMirrorNode | undefined): void => {\n if (!node) return;\n if (node.marks) {\n for (const m of node.marks) {\n const attrs = m.attrs as Record<string, unknown> | undefined;\n if (m.type === 'textStyle' && attrs && typeof attrs[attr] === 'string') {\n colors.add(attrs[attr] as string);\n }\n }\n }\n if (node.content) {\n for (const child of node.content) walk(child);\n }\n };\n\n walk(json as unknown as ProseMirrorNode);\n\n const arr = Array.from(colors)\n .map((c) => normalizeColor(c))\n .filter((c): c is string => !!c)\n .filter((c) => c.toLowerCase() !== '#000000' && c.toLowerCase() !== '#ffffff')\n .map((c) => Color.from(c));\n\n return Array.from(new Map(arr.map((c) => [c.value, c])).values());\n } catch {\n return [];\n }\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { ColorPickerViewComponent } from '../views/color-picker-view/color-picker-view';\n\nexport const ColorBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'ColorBubbleMenu',\n views: [\n {\n id: 'picker',\n component: ColorPickerViewComponent,\n label: 'Color Picker',\n isDefault: true,\n },\n ],\n};\n","import { Directive, HostBinding, Input } from '@angular/core';\n\n/**\n * Input directive matching shadcn Input component styles\n * Supports all standard input attributes and types\n *\n * Usage:\n * <input documentEngineInput type=\"text\" placeholder=\"Enter text\" />\n * <input documentEngineInput type=\"email\" class=\"custom-class\" />\n */\n@Directive({\n selector: 'input[documentEngineInput]',\n standalone: true,\n})\nexport class InputDirective {\n @Input() class = '';\n\n @HostBinding('class')\n get inputClasses(): string {\n return ['document-engine-input', this.class].filter(Boolean).join(' ');\n }\n}\n","import { Directive, HostBinding, Input } from '@angular/core';\n\n/**\n * Label directive for form fields\n *\n * Usage:\n * <label documentEngineLabel for=\"input-id\">Label text</label>\n */\n@Directive({\n selector: 'label[documentEngineLabel]',\n standalone: true,\n})\nexport class LabelDirective {\n @Input() class = '';\n\n @HostBinding('class')\n get labelClasses(): string {\n return ['document-engine-label', this.class].filter(Boolean).join(' ');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFieldCategory, DynamicFieldItem } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\n\n/**\n * Dynamic fields view for bubble menu\n * Shows categorized dynamic fields for insertion into the editor\n */\n@Component({\n selector: 'document-engine-dynamic-fields-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, IconComponent],\n template: `\n <div class=\"dynamic-fields-view\">\n <!-- Title -->\n <div class=\"dynamic-fields-view__header\">Dynamic Fields</div>\n\n <!-- Search Bar -->\n <div class=\"dynamic-fields-view__search\">\n <div class=\"dynamic-fields-view__search-field\">\n <label documentEngineLabel for=\"search-input\">Search merge field</label>\n <div class=\"dynamic-fields-view__search-input-wrapper\">\n <document-engine-icon name=\"search\" class=\"dynamic-fields-view__search-icon\"></document-engine-icon>\n <input\n documentEngineInput\n id=\"search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search fields...\"\n aria-label=\"Search dynamic fields\"\n />\n </div>\n </div>\n </div>\n\n <!-- Fields List -->\n <div class=\"dynamic-fields-view__list-container\">\n <div *ngIf=\"filteredCategories.length > 0; else noResults\" class=\"dynamic-fields-view__list\">\n <div *ngFor=\"let category of filteredCategories; let isLast = last\" class=\"dynamic-fields-view__category\">\n <div class=\"dynamic-fields-view__category-header\">{{ category.label }}</div>\n\n <div class=\"dynamic-fields-view__fields\">\n <button\n *ngFor=\"let field of category.fields\"\n type=\"button\"\n class=\"dynamic-fields-view__field-item\"\n (click)=\"insertDynamicField(field)\"\n [attr.aria-label]=\"field.label + (field.description ? ' - ' + field.description : '')\"\n [title]=\"field.description || field.label\"\n >\n <div class=\"dynamic-fields-view__field-label\">{{ field.label }}</div>\n <div *ngIf=\"field.description\" class=\"dynamic-fields-view__field-description\">\n {{ field.description }}\n </div>\n </button>\n </div>\n\n <div *ngIf=\"!isLast\" class=\"dynamic-fields-view__divider\"></div>\n </div>\n </div>\n\n <ng-template #noResults>\n <div class=\"dynamic-fields-view__empty\">\n <document-engine-icon name=\"search_off\" class=\"dynamic-fields-view__empty-icon\"></document-engine-icon>\n <div class=\"dynamic-fields-view__empty-text\">No fields found matching \"{{ searchQuery }}\"</div>\n </div>\n </ng-template>\n </div>\n\n <!-- Actions -->\n <div class=\"dynamic-fields-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./dynamic-fields-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicFieldsViewComponent implements BubbleMenuViewContent<Record<string, unknown>>, OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n searchQuery = '';\n originalFields: DynamicFieldItem[] = [];\n originalCategories: DynamicFieldCategory[] = [];\n\n // Reactive form control for search\n searchControl = new FormControl('');\n private destroy$ = new Subject<void>();\n\n onActivate(attrs: Record<string, unknown>): void {\n const categories = attrs['categories'] as DynamicFieldCategory[];\n if (!categories) throw new Error('Categories are required');\n this.originalCategories = categories;\n this.originalFields = categories.flatMap((category) => category.fields);\n this.searchQuery = '';\n this.searchControl.setValue('');\n this.cdr.markForCheck();\n }\n\n ngOnInit(): void {\n // Set up reactive form subscription with debounce\n this.searchControl.valueChanges\n .pipe(debounceTime(200), distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((value) => {\n this.searchQuery = value || '';\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Getter that filters categories and fields based on search query\n */\n get filteredCategories(): DynamicFieldCategory[] {\n const query = this.searchQuery.toLowerCase().trim();\n\n if (!query) return this.originalCategories;\n\n // Filter categories and fields based on search query\n return this.originalCategories\n .map((category) => {\n const categoryFields = category.fields.filter(\n (field) =>\n field.label.toLowerCase().includes(query) ||\n field.description?.toLowerCase().includes(query) ||\n field.id.toLowerCase().includes(query)\n );\n\n if (categoryFields.length > 0) {\n return { key: category.key, label: category.label, fields: categoryFields };\n }\n\n return null;\n })\n .filter((category): category is DynamicFieldCategory => category !== null);\n }\n\n /**\n * Insert a dynamic field into the editor\n */\n insertDynamicField(field: DynamicFieldItem): void {\n if (!this.editor) return;\n\n this.editor.chain().focus().insertDynamicField({ fieldId: field.id, label: field.label }).run();\n this.close?.();\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { DynamicFieldsViewComponent } from '../views/dynamic-fields-view/dynamic-fields-view';\n\nexport const DynamicFieldsBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'DynamicFieldsBubbleMenu',\n views: [\n {\n id: 'fields',\n component: DynamicFieldsViewComponent,\n label: 'Dynamic Fields',\n isDefault: true,\n },\n ],\n};\n","import type { Editor } from '@tiptap/core';\nimport { ImagePickHook, MediaResult } from '../../types/media-result.type';\n\n/**\n * Framework-free helpers for the image-insert picker flow. Kept out of the\n * component so they can be unit-tested without Angular's TestBed (this lib runs\n * in a bare `node` jest env that does not transpile Angular ESM).\n */\n\n/** A minimal view of the chained commands the picker uses (provided at runtime by the editor's extensions). */\ninterface ImageInsertChain {\n setImage(attrs: { src: string; alt?: string }): ImageInsertChain;\n insertImageRef(attrs: { imageId: string; caption?: string | null }): ImageInsertChain;\n run(): boolean;\n}\n\n/**\n * Whether a picker result is worth inserting. A `null`/`undefined` result (or one\n * with neither an `id` nor a `url`) is treated as a cancel — insert nothing.\n */\nexport function isInsertableResult(result: MediaResult | null | undefined): result is MediaResult {\n return !!result && (!!result.id || !!result.url);\n}\n\n/** Read the consumer's `onPick` media hook off the `image` extension options, if any. */\nexport function getImagePickHook(editor: Editor): ImagePickHook | undefined {\n const ext = editor.extensionManager.extensions.find((e) => e.name === 'image');\n return (ext?.options as { onPick?: ImagePickHook } | undefined)?.onPick;\n}\n\n/**\n * Insert a picked media result: an `image-ref` node when that node is enabled\n * (preferred — URL-free), otherwise a plain image from the resolved URL. Returns\n * `true` when something was actually inserted, `false` when the result had\n * nothing usable (id-only with no `imageRef` node, and no url) — so the caller can\n * avoid closing the view as if an insert had happened.\n */\nexport function insertMediaResult(editor: Editor, result: MediaResult): boolean {\n const hasImageRef = editor.extensionManager.extensions.some((e) => e.name === 'imageRef');\n const chain = editor.chain().focus() as unknown as ImageInsertChain;\n\n if (hasImageRef && result.id) {\n chain.insertImageRef({ imageId: result.id, caption: result.alt ?? null }).run();\n return true;\n }\n\n if (result.url) {\n chain.setImage({ src: result.url, alt: result.alt ?? '' }).run();\n return true;\n }\n\n return false;\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport const urlValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {\n const value = ((control.value as string | null) ?? '').trim();\n\n if (!value) return null;\n\n // Allow http, https, mailto, tel. Add protocol if missing during submit; here just a loose check.\n const hasAllowedScheme = /^(https?:|mailto:|tel:)/i.test(value);\n const looksLikeDomain = /^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(?:\\/.*)?$/.test(value);\n\n if (hasAllowedScheme || looksLikeDomain) return null;\n\n return { url: true } as ValidationErrors;\n};\n","import { Component, Input } from '@angular/core';\n\n/**\n * Error message component for form validation\n *\n * Usage:\n * <document-engine-error-message *ngIf=\"control.hasError('required')\">\n * This field is required\n * </document-engine-error-message>\n */\n@Component({\n selector: 'document-engine-error-message',\n standalone: true,\n template: `\n <p [class]=\"errorClasses\">\n <ng-content></ng-content>\n </p>\n `,\n})\nexport class ErrorMessageComponent {\n @Input() class = '';\n\n get errorClasses(): string {\n return ['document-engine-error-message__text', this.class].filter(Boolean).join(' ');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { getImagePickHook, insertMediaResult, isInsertableResult } from './image-pick.util';\nimport { urlValidator } from '../../utils';\nimport { ButtonDirective } from '../../ui/button';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\nimport { ErrorMessageComponent } from '../../ui/input/error-message';\n\n/**\n * Image insert view for the bubble menu.\n *\n * Two modes:\n * - When the editor's `image` config supplies an async `onPick` hook, the view\n * delegates selection to the consumer's media picker and inserts the result\n * (an `image-ref` node when that node is enabled, else a plain image).\n * - Otherwise it falls back to the built-in raw-URL input form.\n */\n@Component({\n selector: 'document-engine-image-insert-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, ErrorMessageComponent],\n template: `\n <div class=\"image-insert-view\">\n <!-- Title -->\n <div class=\"image-insert-view__header\">Insert Image</div>\n\n <!-- Picker mode: delegate selection to the consumer's media library -->\n <ng-container *ngIf=\"hasPicker; else urlForm\">\n <div class=\"image-insert-view__content\">\n <p class=\"image-insert-view__hint\">Choose an image from your media library.</p>\n </div>\n <div class=\"image-insert-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" [disabled]=\"loading\" (click)=\"cancel()\">\n Cancel\n </button>\n <button type=\"button\" documentEngineButton variant=\"default\" [disabled]=\"loading\" (click)=\"pickImage()\">\n {{ loading ? 'Loading…' : 'Choose from library' }}\n </button>\n </div>\n </ng-container>\n\n <!-- Fallback: built-in raw-URL input form -->\n <ng-template #urlForm>\n <form [formGroup]=\"imageForm\" (ngSubmit)=\"insertImage()\">\n <div class=\"image-insert-view__content\">\n <!-- Image URL input -->\n <div class=\"image-insert-view__field\">\n <label documentEngineLabel for=\"url-input\">Image URL</label>\n <input\n #urlInput\n documentEngineInput\n id=\"url-input\"\n formControlName=\"url\"\n placeholder=\"https://example.com/image.jpg\"\n [attr.aria-invalid]=\"imageForm.controls.url.invalid && imageForm.controls.url.touched\"\n />\n <document-engine-error-message\n *ngIf=\"imageForm.controls.url.hasError('required') && imageForm.controls.url.touched\"\n >\n This field is required\n </document-engine-error-message>\n <document-engine-error-message\n *ngIf=\"imageForm.controls.url.hasError('url') && imageForm.controls.url.touched\"\n >\n Enter a valid URL\n </document-engine-error-message>\n </div>\n\n <!-- Alt text input -->\n <div class=\"image-insert-view__field\">\n <label documentEngineLabel for=\"alt-input\">Alt Text</label>\n <input documentEngineInput id=\"alt-input\" formControlName=\"alt\" placeholder=\"Describe the image\" />\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"image-insert-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n\n <button type=\"submit\" documentEngineButton variant=\"default\" [disabled]=\"!canInsert()\">Insert Image</button>\n </div>\n </form>\n </ng-template>\n </div>\n `,\n styleUrls: ['./image-insert-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ImageInsertViewComponent implements BubbleMenuViewContent<Record<string, unknown>> {\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n\n close?: () => void;\n goBack?: (viewId?: string) => void;\n\n /** True while the consumer's `onPick` promise is in flight. */\n loading = false;\n\n imageForm = this.fb.nonNullable.group({\n url: this.fb.control('', [Validators.required, urlValidator]),\n alt: this.fb.control(''),\n });\n\n /** The consumer's media picker, read off the `image` extension options (if any). */\n private get onPick() {\n return this.editor ? getImagePickHook(this.editor) : undefined;\n }\n\n /** Whether to show the picker mode (vs the raw-URL fallback form). */\n get hasPicker(): boolean {\n return typeof this.onPick === 'function';\n }\n\n onActivate(): void {\n this.loading = false;\n this.imageForm.reset();\n this.imageForm.controls.url.markAsUntouched();\n this.cdr.markForCheck();\n }\n\n canInsert(): boolean {\n return this.imageForm.valid && !!this.imageForm.controls.url.value;\n }\n\n insertImage(): void {\n if (!this.canInsert() || !this.editor) return;\n\n const url = this.imageForm.controls.url.value || '';\n const alt = this.imageForm.controls.alt.value || '';\n\n // Insert image at current cursor position\n this.editor.chain().focus().setImage({ src: url, alt }).run();\n\n this.close?.();\n }\n\n /** Delegate selection to the consumer's media picker, then insert the result. */\n async pickImage(): Promise<void> {\n const onPick = this.onPick;\n if (!onPick || !this.editor || this.loading) return;\n\n this.loading = true;\n this.cdr.markForCheck();\n\n try {\n const result = await onPick();\n // Reject / resolve-nothing is a deliberate no-op (consumer cancelled). Only\n // close when something was actually inserted — an id-only result with no\n // `image-ref` node inserts nothing and must leave the view open.\n if (this.editor && isInsertableResult(result) && insertMediaResult(this.editor, result)) {\n this.close?.();\n }\n } catch {\n // Swallow: a rejected picker (e.g. dialog dismissed) must not crash the editor.\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n cancel(): void {\n this.close?.();\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { ImageInsertViewComponent } from '../views/image-insert-view/image-insert-view';\n\nexport const ImageBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'ImageBubbleMenu',\n views: [\n {\n id: 'insert',\n component: ImageInsertViewComponent,\n label: 'Insert Image',\n isDefault: true,\n },\n ],\n};\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { FormBuilder, FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { getActiveMarkRange } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { urlValidator } from '../../utils';\nimport { ButtonDirective } from '../../ui/button';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\nimport { ErrorMessageComponent } from '../../ui/input/error-message';\n\ninterface LinkAttrs {\n href?: string;\n target?: string;\n rel?: string;\n}\n\ninterface LinkFormControls {\n url: FormControl<string>;\n displayText: FormControl<string>;\n}\n\n/**\n * Edit view for link bubble menu\n * Shows when creating a new link or editing an existing one\n * Provides URL input, display text input, and quick link shortcuts\n */\n@Component({\n selector: 'document-engine-link-edit-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, ErrorMessageComponent],\n template: `\n <div class=\"link-edit-view\">\n <!-- Title -->\n <div class=\"link-edit-view__header\">\n {{ isNewLink ? 'Add Link' : 'Edit Link' }}\n </div>\n\n <!-- Content -->\n <form [formGroup]=\"linkForm\" (ngSubmit)=\"applyLink()\">\n <div class=\"link-edit-view__content\">\n <!-- URL input -->\n <div class=\"link-edit-view__field\">\n <label documentEngineLabel for=\"url-input\">URL</label>\n <input\n #urlInput\n documentEngineInput\n id=\"url-input\"\n formControlName=\"url\"\n placeholder=\"https://example.com\"\n [attr.aria-invalid]=\"linkForm.controls.url.invalid && linkForm.controls.url.touched\"\n />\n <document-engine-error-message\n *ngIf=\"linkForm.controls.url.hasError('required') && linkForm.controls.url.touched\"\n >\n This field is required\n </document-engine-error-message>\n <document-engine-error-message\n *ngIf=\"linkForm.controls.url.hasError('url') && linkForm.controls.url.touched\"\n >\n Enter a valid URL\n </document-engine-error-message>\n </div>\n\n <!-- Display text input -->\n <div class=\"link-edit-view__field\">\n <label documentEngineLabel for=\"display-text-input\">Display Text</label>\n <input documentEngineInput id=\"display-text-input\" formControlName=\"displayText\" placeholder=\"Click here\" />\n </div>\n </div>\n\n <!-- Link shortcuts -->\n <!-- <div class=\"link-edit-view__shortcuts\">\n <span class=\"link-edit-view__shortcuts-label\">Quick links:</span>\n\n <div class=\"chip-set\">\n <button\n type=\"button\"\n class=\"chip\"\n *ngFor=\"let shortcut of linkShortcuts\"\n (click)=\"applyShortcut(shortcut.url)\"\n >\n {{ shortcut.label }}\n </button>\n </div>\n </div> -->\n\n <!-- Actions -->\n <div class=\"link-edit-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n\n <button type=\"submit\" documentEngineButton variant=\"default\" [disabled]=\"!canApply()\">\n {{ isNewLink ? 'Insert' : 'Update' }}\n </button>\n </div>\n </form>\n </div>\n `,\n styleUrls: ['./link-edit-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkEditViewComponent implements BubbleMenuViewContent<LinkAttrs> {\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n position?: { from: number; to: number };\n\n goBack?: (viewId?: string) => void;\n close?: () => void;\n\n linkForm = this.fb.nonNullable.group({\n url: this.fb.control('', [Validators.required, urlValidator]),\n displayText: this.fb.control(''),\n });\n\n isNewLink = true;\n linkShortcuts = [\n { label: 'Google', url: 'https://google.com' },\n { label: 'GitHub', url: 'https://github.com' },\n { label: 'Docs', url: 'https://docs.example.com' },\n ];\n\n onActivate(attrs: LinkAttrs): void {\n // Check if we're editing existing link or creating new\n this.isNewLink = !attrs.href;\n\n if (!this.editor) return;\n\n // Set URL from attrs\n this.linkForm.controls.url.setValue(attrs.href || '');\n this.linkForm.controls.url.markAsUntouched();\n\n const selection = this.editor.state.selection;\n const mark = getActiveMarkRange(this.editor, 'link');\n\n // Determine the range to use: selection if not empty, otherwise mark range\n let range: { from: number; to: number } | undefined;\n\n if (!selection.empty) {\n // User has text selected\n range = { from: selection.from, to: selection.to };\n } else if (mark) {\n // Cursor is inside an existing link\n range = { from: mark.from, to: mark.to };\n }\n\n // Set position and display text based on the determined range\n this.position = range;\n\n if (range) {\n const text = this.editor.state.doc.textBetween(range.from, range.to, ' ');\n this.linkForm.controls.displayText.setValue(text || '');\n } else {\n // No selection and not inside a link - empty display text\n this.linkForm.controls.displayText.setValue('');\n }\n\n this.cdr.markForCheck();\n }\n\n applyShortcut(url: string): void {\n this.linkForm.controls.url.setValue(url);\n }\n\n canApply(): boolean {\n return this.linkForm.valid && !!this.linkForm.controls.url.value;\n }\n\n applyLink(): void {\n if (!this.canApply() || !this.editor) return;\n\n const url = this.normalizeUrl(this.linkForm.controls.url.value || '');\n const displayText = this.linkForm.controls.displayText.value;\n const { empty } = this.editor.state.selection;\n\n const apply = (editor: Editor) => {\n // If display text provided, replace selection with it and apply link\n if (displayText && displayText.trim() && this.position) {\n editor\n .chain()\n .focus()\n .setTextSelection(this.position)\n .insertContent({\n type: 'text',\n text: displayText,\n marks: [{ type: 'link', attrs: { href: url, target: '_blank' } }],\n })\n .run();\n return;\n }\n\n // Apply link to existing selection (selection exists and no custom text)\n if (!empty) {\n editor.chain().focus().setLink({ href: url, target: '_blank' }).run();\n return;\n }\n\n // No selection and no display text - insert URL as link text\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: displayText || url,\n marks: [{ type: 'link', attrs: { href: url, target: '_blank' } }],\n })\n .run();\n };\n\n apply(this.editor);\n this.close?.(); // Close after applying\n }\n\n cancel(): void {\n if (this.isNewLink) {\n this.close?.(); // Close if creating new link\n } else {\n this.goBack?.('main'); // Go back to main if editing existing link\n }\n }\n\n private normalizeUrl(input: string): string {\n if (!input) return input;\n if (/^(https?:|mailto:|tel:)/i.test(input)) return input;\n return `https://${input.trim()}`;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\n\ninterface LinkAttrs {\n href?: string;\n target?: string;\n rel?: string;\n}\n\n/**\n * Main view for link bubble menu\n * Shows when an existing link is selected\n * Provides navigation to edit and properties views\n */\n@Component({\n selector: 'document-engine-link-main-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, IconComponent],\n template: `\n <div class=\"link-main-view\">\n <!-- Title -->\n <div class=\"link-main-view__header\">Link</div>\n\n <!-- Content -->\n <div class=\"link-main-view__content\">\n <a class=\"link-main-view__url\" [title]=\"currentUrl\" [href]=\"currentUrl\" target=\"_blank\">\n {{ currentUrl }}\n </a>\n\n <button documentEngineButton variant=\"ghost\" size=\"sm\" class=\"link-main-view__button\" (click)=\"editLink()\">\n <document-engine-icon name=\"edit\"></document-engine-icon>\n <span>Edit</span>\n </button>\n\n <button\n documentEngineButton\n variant=\"ghost\"\n size=\"sm\"\n class=\"link-main-view__button\"\n (click)=\"openProperties()\"\n >\n <document-engine-icon name=\"settings\"></document-engine-icon>\n <span>Properties</span>\n </button>\n\n <button\n documentEngineButton\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"link-main-view__button-icon\"\n (click)=\"removeLink()\"\n title=\"Remove link\"\n >\n <document-engine-icon name=\"link_off\"></document-engine-icon>\n </button>\n </div>\n </div>\n `,\n styleUrls: ['./link-main-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkMainViewComponent implements BubbleMenuViewContent<LinkAttrs> {\n editor?: Editor;\n currentUrl = '';\n\n close?: () => void;\n navigateTo?: (viewId: string) => void;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n onActivate(attrs: LinkAttrs): void {\n this.currentUrl = attrs.href || '';\n this.cdr.markForCheck();\n }\n\n editLink(): void {\n this.navigateTo?.('edit');\n }\n\n openProperties(): void {\n this.navigateTo?.('properties');\n }\n\n removeLink(): void {\n this.editor?.chain().focus().unsetLink().run();\n this.close?.();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n forwardRef,\n HostBinding,\n inject,\n Input,\n Output,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IconComponent } from '../icon';\n\n/**\n * Checkbox component\n * Works with ngModel and reactive forms\n *\n * Usage:\n * <document-engine-checkbox [(ngModel)]=\"checked\">Label text</document-engine-checkbox>\n */\n@Component({\n selector: 'document-engine-checkbox',\n standalone: true,\n imports: [CommonModule, IconComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true,\n },\n ],\n template: `\n <label class=\"document-engine-checkbox\">\n <input\n type=\"checkbox\"\n class=\"document-engine-checkbox__input\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n (change)=\"onCheckboxChange($event)\"\n />\n <span class=\"document-engine-checkbox__box\">\n <document-engine-icon\n *ngIf=\"checked\"\n name=\"check\"\n class=\"document-engine-checkbox__icon\"\n ></document-engine-icon>\n </span>\n <span class=\"document-engine-checkbox__label\">\n <ng-content></ng-content>\n </span>\n </label>\n `,\n styleUrls: ['../../styles/checkbox.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CheckboxComponent implements ControlValueAccessor {\n @Input() disabled = false;\n @Input() checked = false;\n\n @Output() checkedChange = new EventEmitter<boolean>();\n\n @HostBinding('class.document-engine-checkbox-container') hostClass = true;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChange: (value: boolean) => void = () => {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouched: () => void = () => {};\n\n onCheckboxChange(event: Event): void {\n if (this.disabled) return;\n\n const target = event.target as HTMLInputElement;\n this.checked = target.checked;\n this.checkedChange.emit(this.checked);\n this.onChange(this.checked);\n this.onTouched();\n }\n\n // ControlValueAccessor implementation.\n //\n // The forms package calls these from outside any template binding, so on an\n // OnPush component they must mark the view dirty explicitly. Without it a\n // programmatic `setValue()` — including a bubble-menu view being re-activated\n // with different attributes on a reused instance — updates the model while the\n // rendered tick keeps showing the previous state.\n writeValue(value: boolean): void {\n this.checked = value;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { CheckboxComponent } from '../../ui/checkbox/checkbox';\n\ninterface LinkAttrs {\n href?: string;\n target?: string;\n rel?: string;\n}\n\n/**\n * Properties view for link bubble menu\n * Shows link properties like target and rel attributes\n * Allows user to configure SEO and security settings\n */\n@Component({\n selector: 'document-engine-link-properties-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, CheckboxComponent],\n template: `\n <div class=\"link-properties-view\">\n <!-- Title -->\n <!-- No referrer -->\n <div class=\"link-properties-view__header\">Link Properties</div>\n\n <!-- Content -->\n <div class=\"link-properties-view__content\">\n <!-- Open in new tab -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"newTabControl\">Open in new tab</document-engine-checkbox>\n </div>\n\n <!-- No follow -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"noFollowControl\">\n Add <code class=\"inline-code\">rel=\"nofollow\"</code>\n </document-engine-checkbox>\n </div>\n\n <!-- No opener -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"noOpenerControl\">\n Add <code class=\"inline-code\">rel=\"noopener\"</code>\n </document-engine-checkbox>\n </div>\n\n <!-- No referrer -->\n <div class=\"link-properties-view__option\">\n <document-engine-checkbox [formControl]=\"noReferrerControl\">\n Add <code class=\"inline-code\">rel=\"noreferrer\"</code>\n </document-engine-checkbox>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"link-properties-view__actions\">\n <button documentEngineButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n\n <button type=\"submit\" documentEngineButton variant=\"default\" (click)=\"saveProperties()\">Save</button>\n </div>\n </div>\n `,\n styleUrls: ['./link-properties-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkPropertiesViewComponent implements BubbleMenuViewContent<LinkAttrs> {\n editor?: Editor;\n goBack?: (viewId?: string) => void;\n\n newTabControl = new FormControl(false);\n noFollowControl = new FormControl(false);\n noOpenerControl = new FormControl(false);\n noReferrerControl = new FormControl(false);\n\n private currentHref = '';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n onActivate(attrs: LinkAttrs): void {\n this.currentHref = attrs.href || '';\n\n // Parse existing attributes\n this.newTabControl.setValue(attrs.target === '_blank');\n\n const rel = attrs.rel || '';\n this.noFollowControl.setValue(rel.includes('nofollow'));\n this.noOpenerControl.setValue(rel.includes('noopener'));\n this.noReferrerControl.setValue(rel.includes('noreferrer'));\n\n this.cdr.markForCheck();\n }\n\n saveProperties(): void {\n if (!this.editor || !this.currentHref) return;\n\n // Build rel attribute\n const relParts: string[] = [];\n if (this.noFollowControl.value) relParts.push('nofollow');\n if (this.noOpenerControl.value) relParts.push('noopener');\n if (this.noReferrerControl.value) relParts.push('noreferrer');\n\n // Update link attributes\n this.editor\n .chain()\n .focus()\n .setLink({\n href: this.currentHref,\n target: this.newTabControl.value ? '_blank' : undefined,\n rel: relParts.length > 0 ? relParts.join(' ') : undefined,\n })\n .run();\n\n this.goBack?.('main'); // Always go back to main after saving\n }\n\n cancel(): void {\n this.goBack?.('main'); // Always go back to main on cancel\n }\n}\n","import { EditorBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { LinkEditViewComponent } from '../views/link-views/link-edit-view';\nimport { LinkMainViewComponent } from '../views/link-views/link-main-view';\nimport { LinkPropertiesViewComponent } from '../views/link-views/link-properties-view';\n\nexport const LinkBubbleConfig: EditorBubbleMenuConfig = {\n props: {\n pluginKey: 'LinkBubbleMenu',\n },\n target: { kind: 'mark', name: 'link', allowEmptySelection: true, requireFocus: true },\n views: [\n {\n id: 'main',\n component: LinkMainViewComponent,\n showWhen: (attrs) => !!attrs['href'], // Show when link exists\n label: 'Main View',\n },\n {\n id: 'edit',\n component: LinkEditViewComponent,\n showWhen: (attrs) => !attrs['href'], // Show when creating new link\n showOnForceOpen: true, // Show when toolbar button clicked\n label: 'Edit View',\n },\n {\n id: 'properties',\n component: LinkPropertiesViewComponent,\n label: 'Properties View',\n },\n ],\n};\n","export const CharacterCategory = {\n ALL: 'all',\n CURRENCY: 'currency',\n MATH: 'math',\n ARROWS: 'arrows',\n SYMBOLS: 'symbols',\n PUNCTUATION: 'punctuation',\n} as const;\n\nexport interface SpecialCharacter {\n char: string;\n name: string;\n code?: string;\n}\n\ntype CharacterCategoryValue = (typeof CharacterCategory)[keyof typeof CharacterCategory];\ntype CharacterCategoryWithoutAll = Exclude<CharacterCategoryValue, 'all'>;\n\nexport const CHARACTERS: { [key in CharacterCategoryWithoutAll]: SpecialCharacter[] } = {\n [CharacterCategory.CURRENCY]: [\n { char: '$', name: 'Dollar sign', code: 'U+0024' },\n { char: '€', name: 'Euro sign', code: 'U+20AC' },\n { char: '£', name: 'Pound sign', code: 'U+00A3' },\n { char: '¥', name: 'Yen sign', code: 'U+00A5' },\n { char: '₹', name: 'Indian rupee sign', code: 'U+20B9' },\n { char: '¢', name: 'Cent sign', code: 'U+00A2' },\n { char: '₽', name: 'Ruble sign', code: 'U+20BD' },\n { char: '₩', name: 'Won sign', code: 'U+20A9' },\n { char: '₪', name: 'Shekel sign', code: 'U+20AA' },\n { char: '₱', name: 'Peso sign', code: 'U+20B1' },\n { char: '₦', name: 'Naira sign', code: 'U+20A6' },\n { char: '₫', name: 'Dong sign', code: 'U+20AB' },\n ],\n [CharacterCategory.MATH]: [\n { char: '±', name: 'Plus-minus sign', code: 'U+00B1' },\n { char: '×', name: 'Multiplication sign', code: 'U+00D7' },\n { char: '÷', name: 'Division sign', code: 'U+00F7' },\n { char: '≈', name: 'Almost equal to', code: 'U+2248' },\n { char: '≠', name: 'Not equal to', code: 'U+2260' },\n { char: '≤', name: 'Less than or equal to', code: 'U+2264' },\n { char: '≥', name: 'Greater than or equal to', code: 'U+2265' },\n { char: '∞', name: 'Infinity', code: 'U+221E' },\n { char: '∑', name: 'Summation', code: 'U+2211' },\n { char: '√', name: 'Square root', code: 'U+221A' },\n { char: '∫', name: 'Integral', code: 'U+222B' },\n { char: '∂', name: 'Partial differential', code: 'U+2202' },\n { char: '∆', name: 'Delta', code: 'U+2206' },\n { char: '∏', name: 'Product', code: 'U+220F' },\n { char: 'π', name: 'Pi', code: 'U+03C0' },\n { char: 'α', name: 'Alpha', code: 'U+03B1' },\n { char: 'β', name: 'Beta', code: 'U+03B2' },\n { char: 'θ', name: 'Theta', code: 'U+03B8' },\n ],\n [CharacterCategory.ARROWS]: [\n { char: '←', name: 'Left arrow', code: 'U+2190' },\n { char: '→', name: 'Right arrow', code: 'U+2192' },\n { char: '↑', name: 'Up arrow', code: 'U+2191' },\n { char: '↓', name: 'Down arrow', code: 'U+2193' },\n { char: '↔', name: 'Left-right arrow', code: 'U+2194' },\n { char: '↕', name: 'Up-down arrow', code: 'U+2195' },\n { char: '⇐', name: 'Double left arrow', code: 'U+21D0' },\n { char: '⇒', name: 'Double right arrow', code: 'U+21D2' },\n { char: '⇑', name: 'Double up arrow', code: 'U+21D1' },\n { char: '⇓', name: 'Double down arrow', code: 'U+21D3' },\n { char: '⇔', name: 'Double left-right arrow', code: 'U+21D4' },\n { char: '↖', name: 'North-west arrow', code: 'U+2196' },\n { char: '↗', name: 'North-east arrow', code: 'U+2197' },\n { char: '↘', name: 'South-east arrow', code: 'U+2198' },\n { char: '↙', name: 'South-west arrow', code: 'U+2199' },\n { char: '↺', name: 'Anticlockwise arrow', code: 'U+21BA' },\n { char: '↻', name: 'Clockwise arrow', code: 'U+21BB' },\n { char: '➜', name: 'Heavy right arrow', code: 'U+279C' },\n ],\n [CharacterCategory.SYMBOLS]: [\n { char: '©', name: 'Copyright', code: 'U+00A9' },\n { char: '®', name: 'Registered trademark', code: 'U+00AE' },\n { char: '™', name: 'Trademark', code: 'U+2122' },\n { char: '§', name: 'Section sign', code: 'U+00A7' },\n { char: '¶', name: 'Pilcrow', code: 'U+00B6' },\n { char: '†', name: 'Dagger', code: 'U+2020' },\n { char: '‡', name: 'Double dagger', code: 'U+2021' },\n { char: '•', name: 'Bullet', code: 'U+2022' },\n { char: '◦', name: 'White bullet', code: 'U+25E6' },\n { char: '●', name: 'Black circle', code: 'U+25CF' },\n { char: '○', name: 'White circle', code: 'U+25CB' },\n { char: '■', name: 'Black square', code: 'U+25A0' },\n { char: '□', name: 'White square', code: 'U+25A1' },\n { char: '▪', name: 'Small black square', code: 'U+25AA' },\n { char: '▫', name: 'Small white square', code: 'U+25AB' },\n { char: '★', name: 'Black star', code: 'U+2605' },\n { char: '☆', name: 'White star', code: 'U+2606' },\n { char: '♠', name: 'Spade', code: 'U+2660' },\n { char: '♣', name: 'Club', code: 'U+2663' },\n { char: '♥', name: 'Heart', code: 'U+2665' },\n { char: '♦', name: 'Diamond', code: 'U+2666' },\n { char: '✓', name: 'Check mark', code: 'U+2713' },\n { char: '✗', name: 'Ballot X', code: 'U+2717' },\n { char: '☐', name: 'Ballot box', code: 'U+2610' },\n ],\n [CharacterCategory.PUNCTUATION]: [\n { char: '‚', name: 'Single low-9 quotation mark', code: 'U+201A' },\n { char: '„', name: 'Double low-9 quotation mark', code: 'U+201E' },\n { char: \"'\", name: 'Left single quotation mark', code: 'U+2018' },\n { char: \"'\", name: 'Right single quotation mark', code: 'U+2019' },\n { char: '\"', name: 'Left double quotation mark', code: 'U+201C' },\n { char: '\"', name: 'Right double quotation mark', code: 'U+201D' },\n { char: '«', name: 'Left guillemet', code: 'U+00AB' },\n { char: '»', name: 'Right guillemet', code: 'U+00BB' },\n { char: '‹', name: 'Single left angle quotation', code: 'U+2039' },\n { char: '›', name: 'Single right angle quotation', code: 'U+203A' },\n { char: '—', name: 'Em dash', code: 'U+2014' },\n { char: '–', name: 'En dash', code: 'U+2013' },\n { char: '…', name: 'Ellipsis', code: 'U+2026' },\n { char: '‰', name: 'Per mille', code: 'U+2030' },\n { char: '¿', name: 'Inverted question mark', code: 'U+00BF' },\n { char: '¡', name: 'Inverted exclamation mark', code: 'U+00A1' },\n { char: '·', name: 'Middle dot', code: 'U+00B7' },\n { char: '‧', name: 'Hyphenation point', code: 'U+2027' },\n ],\n};\n\nexport type CharacterCategory = (typeof CharacterCategory)[keyof typeof CharacterCategory];\n\n","import { Directive } from '@angular/core';\n\n/**\n * Directive for select label content\n * Must be used within document-engine-select component when labelMode=\"static\"\n *\n * Usage:\n * <document-engine-select labelMode=\"static\">\n * <div documentEngineSelectLabel>\n * <document-engine-icon name=\"format_size\"></document-engine-icon>\n * <span>Font Size</span>\n * </div>\n * <button documentEngineSelectOption value=\"14px\">14px</button>\n * </document-engine-select>\n */\n@Directive({\n selector: '[documentEngineSelectLabel]',\n standalone: true,\n})\nexport class SelectLabelDirective {}\n","import { InjectionToken } from '@angular/core';\n\nexport interface ISelectParent {\n value: string | null;\n selectOption(option: unknown): void;\n}\n\nexport const SELECT_PARENT_TOKEN = new InjectionToken<ISelectParent>('ISelectParent');\n","import { Directive, ElementRef, HostListener, Input, inject } from '@angular/core';\nimport { SELECT_PARENT_TOKEN } from './select.contract';\n\n/**\n * Directive for select options\n * Must be used within document-engine-select component\n *\n * Usage:\n * <button documentEngineSelectOption value=\"option1\">Option 1</button>\n */\n@Directive({\n selector: '[documentEngineSelectOption]',\n standalone: true,\n host: {\n role: 'option',\n '[attr.aria-selected]': 'select?.value === value',\n '[attr.aria-disabled]': 'disabled',\n class: 'document-engine-select-option',\n '[class.document-engine-select-option--disabled]': 'disabled',\n '[class.document-engine-select-option--selected]': 'select?.value === value',\n },\n})\nexport class SelectOptionDirective {\n readonly elementRef = inject(ElementRef);\n readonly select = inject(SELECT_PARENT_TOKEN, { optional: true });\n\n @Input() value!: string | null;\n @Input() label?: string;\n @Input() disabled = false;\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n event.stopPropagation();\n\n if (!this.disabled) {\n this.select?.selectOption(this);\n }\n }\n\n // Get label from element text content if not provided\n getLabel(): string {\n return this.label || this.elementRef.nativeElement.textContent?.trim() || this.value;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n QueryList,\n SimpleChanges,\n ViewChild,\n forwardRef,\n inject,\n} from '@angular/core';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { Subject, takeUntil } from 'rxjs';\nimport { IconComponent } from '../icon';\nimport { SelectLabelDirective } from './select-label.directive';\nimport { SelectOptionDirective } from './select-option.directive';\nimport { ISelectParent, SELECT_PARENT_TOKEN } from './select.contract';\n\n/**\n * Select component with floating dropdown using @floating-ui/dom\n *\n * Usage:\n * <document-engine-select [(value)]=\"selectedValue\" placeholder=\"Select...\">\n * <button documentEngineSelectOption value=\"option1\">Option 1</button>\n * <button documentEngineSelectOption value=\"option2\">Option 2</button>\n * </document-engine-select>\n */\n@Component({\n selector: 'document-engine-select',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './select.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: SELECT_PARENT_TOKEN,\n useExisting: forwardRef(() => SelectComponent),\n },\n ],\n})\nexport class SelectComponent implements AfterContentInit, OnChanges, OnDestroy, ISelectParent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input() value: string | null = null;\n @Input() disabled = false;\n @Input() labelMode: 'static' | 'activeOption' = 'activeOption';\n @Input() variant: 'default' | 'outline' = 'default';\n\n @Output() valueChange = new EventEmitter<string | null>();\n\n @ViewChild('trigger', { static: false, read: ElementRef }) triggerRef!: ElementRef<HTMLElement>;\n @ViewChild('dropdown', { static: false, read: ElementRef }) dropdownRef!: ElementRef<HTMLElement>;\n\n @ContentChildren(SelectLabelDirective, { descendants: true }) labelDirectives!: QueryList<SelectLabelDirective>;\n @ContentChildren(SelectOptionDirective, { descendants: true }) options!: QueryList<SelectOptionDirective>;\n\n isOpen = false;\n selectedLabel: string | null = null;\n\n private cleanupAutoUpdate?: () => void;\n private documentClickListener?: () => void;\n private destroy = new Subject<void>();\n private contentInitialized = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['value'] || !this.contentInitialized) return;\n\n this.updateSelectedLabel();\n }\n\n ngAfterContentInit(): void {\n // ContentChildren (options) are now available\n this.contentInitialized = true;\n\n // Initial update for any pre-set value\n this.updateSelectedLabel();\n\n // Listen to option changes (e.g., when options are dynamically added/removed)\n this.options.changes.pipe(takeUntil(this.destroy)).subscribe(() => {\n this.updateSelectedLabel();\n });\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n this.removeDocumentClickListener();\n this.destroy.next();\n this.destroy.complete();\n }\n\n toggle(): void {\n if (this.disabled) return;\n\n if (this.isOpen) {\n this.close();\n return;\n }\n\n this.open();\n }\n\n open(): void {\n if (this.disabled || this.isOpen) return;\n\n this.isOpen = true;\n this.cdr.markForCheck();\n\n // Wait for dropdown to render\n setTimeout(() => {\n this.setupFloating();\n this.addDocumentClickListener();\n });\n }\n\n close(): void {\n if (!this.isOpen) return;\n\n this.isOpen = false;\n this.cleanup();\n this.removeDocumentClickListener();\n this.cdr.markForCheck();\n }\n\n selectOption(option: SelectOptionDirective): void {\n if (option.disabled) {\n return;\n }\n\n this.value = option.value;\n this.selectedLabel = option.getLabel();\n this.valueChange.emit(this.value);\n this.close();\n this.cdr.markForCheck();\n }\n\n private setupFloating(): void {\n if (!this.triggerRef || !this.dropdownRef) return;\n\n const triggerEl = this.triggerRef.nativeElement;\n const dropdownEl = this.dropdownRef.nativeElement;\n\n // Use autoUpdate to automatically reposition on scroll/resize\n this.cleanupAutoUpdate = autoUpdate(triggerEl, dropdownEl, () => {\n computePosition(triggerEl, dropdownEl, {\n placement: 'bottom-start',\n middleware: [offset(4), flip(), shift({ padding: 8 })],\n }).then(({ x, y }) => {\n Object.assign(dropdownEl.style, { left: `${x}px`, top: `${y}px` });\n });\n });\n }\n\n private cleanup(): void {\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = undefined;\n }\n }\n\n private addDocumentClickListener(): void {\n this.documentClickListener = () => this.close();\n\n // Use timeout to avoid immediate close from the same click that opened\n setTimeout(() => {\n if (this.documentClickListener) {\n document.addEventListener('click', this.documentClickListener);\n }\n });\n }\n\n private removeDocumentClickListener(): void {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = undefined;\n }\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n // Stop propagation to prevent document click listener from closing\n event.stopPropagation();\n }\n\n /**\n * Check if should use static label (directive)\n * Falls back to activeOption if static mode but no label directive provided\n */\n get useStaticLabel(): boolean {\n return this.labelMode === 'static' && this.hasLabelDirective;\n }\n\n /**\n * Check if label directive exists\n */\n get hasLabelDirective(): boolean {\n return this.labelDirectives?.length > 0;\n }\n\n private updateSelectedLabel(): void {\n if (!this.options || this.labelMode === 'static') return;\n\n const selected = this.options.find((opt) => opt.value === this.value);\n this.selectedLabel = selected?.getLabel() || null;\n this.cdr.markForCheck();\n }\n}\n","<div class=\"document-engine-select\" [class.document-engine-select--outline]=\"variant === 'outline'\">\n <button\n #trigger\n type=\"button\"\n class=\"document-engine-select__trigger\"\n [class.document-engine-select__trigger--open]=\"isOpen\"\n [class.document-engine-select__trigger--disabled]=\"disabled\"\n [disabled]=\"disabled\"\n (click)=\"toggle()\"\n >\n <span class=\"document-engine-select__value\">\n <!-- Static label mode: use label directive content -->\n <ng-container *ngIf=\"useStaticLabel\">\n <ng-content select=\"[documentEngineSelectLabel]\"></ng-content>\n </ng-container>\n\n <!-- ActiveOption mode: use computed label -->\n <ng-container *ngIf=\"!useStaticLabel\"> {{ selectedLabel }} </ng-container>\n </span>\n <document-engine-icon name=\"arrow_drop_down\" class=\"document-engine-select__icon\"></document-engine-icon>\n </button>\n\n <div #dropdown *ngIf=\"isOpen\" class=\"document-engine-select__dropdown\">\n <div class=\"document-engine-select__options\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n OnDestroy,\n QueryList,\n ViewChildren,\n inject,\n} from '@angular/core';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { CharacterCategory, CHARACTERS, SpecialCharacter } from '../../constants/character.constant';\nimport { ButtonDirective } from '../../ui/button';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\n\n/**\n * Special characters view for bubble menu\n * Shows categorized special characters for insertion\n */\n@Component({\n selector: 'document-engine-special-characters-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, SelectComponent, SelectOptionDirective],\n template: `\n <div class=\"special-characters-view\">\n <!-- Title -->\n <div class=\"special-characters-view__header\">Special Characters</div>\n\n <!-- Category Select -->\n <div class=\"special-characters-view__select\">\n <document-engine-select [(value)]=\"selectedCategory\" labelMode=\"activeOption\">\n <button documentEngineSelectOption value=\"all\">All</button>\n <button documentEngineSelectOption value=\"currency\">Currency</button>\n <button documentEngineSelectOption value=\"math\">Math</button>\n <button documentEngineSelectOption value=\"arrows\">Arrows</button>\n <button documentEngineSelectOption value=\"symbols\">Symbols</button>\n <button documentEngineSelectOption value=\"punctuation\">Punctuation</button>\n </document-engine-select>\n </div>\n\n <!-- Characters Grid -->\n <div class=\"special-characters-view__grid-container\">\n <div\n class=\"special-characters-view__grid\"\n role=\"grid\"\n aria-label=\"Special characters grid\"\n tabindex=\"-1\"\n (keydown)=\"onGridKeydown($event)\"\n >\n <button\n *ngFor=\"let char of currentCharacters; let i = index\"\n #charButton\n type=\"button\"\n role=\"gridcell\"\n class=\"special-characters-view__char-button\"\n (click)=\"insertCharacter(char.char)\"\n [attr.aria-label]=\"char.name + (char.code ? ' (' + char.code + ')' : '')\"\n [title]=\"char.name + (char.code ? ' (' + char.code + ')' : '')\"\n [attr.data-index]=\"i\"\n >\n {{ char.char }}\n </button>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"special-characters-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./special-characters-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpecialCharactersViewComponent implements BubbleMenuViewContent<Record<string, unknown>>, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n selectedCategory: (typeof CharacterCategory)[keyof typeof CharacterCategory] = 'all';\n\n @ViewChildren('charButton') charButtons!: QueryList<ElementRef<HTMLButtonElement>>;\n\n readonly GRID_COLUMNS = 6;\n\n private rafId: number | null = null;\n private pendingKey: string | null = null;\n\n get currentCharacters(): SpecialCharacter[] {\n const category = this.selectedCategory;\n switch (category) {\n case 'all':\n return [\n ...this.currencyChars,\n ...this.mathChars,\n ...this.arrowChars,\n ...this.symbolChars,\n ...this.punctuationChars,\n ];\n case 'currency':\n return this.currencyChars;\n case 'math':\n return this.mathChars;\n case 'arrows':\n return this.arrowChars;\n case 'symbols':\n return this.symbolChars;\n case 'punctuation':\n return this.punctuationChars;\n default:\n return this.currencyChars;\n }\n }\n\n currencyChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.CURRENCY];\n mathChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.MATH];\n arrowChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.ARROWS];\n symbolChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.SYMBOLS];\n punctuationChars: SpecialCharacter[] = CHARACTERS[CharacterCategory.PUNCTUATION];\n\n onActivate(): void {\n // Reset to default category and trigger change detection\n this.selectedCategory = 'all';\n this.cdr.markForCheck();\n }\n\n insertCharacter(char: string): void {\n if (!this.editor) return;\n\n this.editor.chain().focus().insertContent(char).run();\n this.close?.();\n }\n\n onGridKeydown(event: KeyboardEvent): void {\n const validKeys = ['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp', 'Home', 'End'];\n if (!validKeys.includes(event.key)) return;\n\n event.preventDefault();\n this.pendingKey = event.key;\n\n // Already scheduled, skip\n if (this.rafId !== null) return;\n\n this.rafId = requestAnimationFrame(() => {\n if (this.pendingKey) {\n this.handleNavigation(this.pendingKey);\n }\n this.rafId = null;\n this.pendingKey = null;\n });\n }\n\n private handleNavigation(key: string): void {\n const buttons = this.charButtons.toArray();\n if (buttons.length === 0) return;\n\n const activeElement = document.activeElement as HTMLElement;\n const currentIndex = buttons.findIndex((btn) => btn.nativeElement === activeElement);\n\n if (currentIndex === -1) return;\n\n let targetIndex = currentIndex;\n\n switch (key) {\n case 'ArrowRight':\n targetIndex = currentIndex < buttons.length - 1 ? currentIndex + 1 : currentIndex;\n break;\n case 'ArrowLeft':\n targetIndex = currentIndex > 0 ? currentIndex - 1 : currentIndex;\n break;\n case 'ArrowDown':\n targetIndex = currentIndex + this.GRID_COLUMNS;\n if (targetIndex >= buttons.length) {\n targetIndex = currentIndex;\n }\n break;\n case 'ArrowUp':\n targetIndex = currentIndex - this.GRID_COLUMNS;\n if (targetIndex < 0) {\n targetIndex = currentIndex;\n }\n break;\n case 'Home':\n targetIndex = 0;\n break;\n case 'End':\n targetIndex = buttons.length - 1;\n break;\n }\n\n buttons[targetIndex]?.nativeElement.focus();\n }\n\n ngOnDestroy(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { SpecialCharactersViewComponent } from '../views/special-characters-view/special-characters-view';\n\nexport const SpecialCharactersBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'SpecialCharactersBubbleMenu',\n views: [\n {\n id: 'characters',\n component: SpecialCharactersViewComponent,\n label: 'Special Characters',\n isDefault: true,\n },\n ],\n};\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n EventEmitter,\n HostBinding,\n Input,\n Output,\n QueryList,\n} from '@angular/core';\n\n/**\n * Toggle button option directive\n */\n@Component({\n selector: 'button[documentEngineToggleOption]',\n standalone: true,\n template: '<ng-content></ng-content>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.document-engine-toggle-option]': 'true',\n '[class.document-engine-toggle-option--active]': 'isActive',\n '[disabled]': 'disabled',\n '(click)': 'onClick()',\n },\n})\nexport class ToggleOptionDirective {\n @Input() value!: string;\n @Input() disabled = false;\n\n @HostBinding('class.document-engine-toggle-option--active')\n isActive = false;\n\n onClick(): void {\n if (!this.disabled) {\n this.selected.emit(this.value);\n }\n }\n\n selected = new EventEmitter<string>();\n}\n\n/**\n * Toggle button group component\n * Similar to mat-button-toggle-group\n *\n * Usage:\n * <document-engine-toggle-group [(value)]=\"alignment\">\n * <button documentEngineToggleOption value=\"left\"><document-engine-icon name=\"format_align_left\"></document-engine-icon></button>\n * <button documentEngineToggleOption value=\"center\"><document-engine-icon name=\"format_align_center\"></document-engine-icon></button>\n * </document-engine-toggle-group>\n */\n@Component({\n selector: 'document-engine-toggle-group',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"document-engine-toggle-group\">\n <ng-content></ng-content>\n </div>\n `,\n styleUrls: ['../../styles/toggle-button.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToggleGroupComponent {\n @Input() value: string | null = null;\n @Input() disabled = false;\n\n @Output() valueChange = new EventEmitter<string | null>();\n\n @ContentChildren(ToggleOptionDirective, { descendants: true }) options!: QueryList<ToggleOptionDirective>;\n\n ngAfterContentInit(): void {\n // Initialize active state\n this.updateActiveStates();\n\n // Listen to option selections\n this.options.forEach((option) => {\n option.selected.subscribe((value) => {\n this.value = value;\n this.valueChange.emit(value);\n this.updateActiveStates();\n });\n });\n }\n\n ngOnChanges(): void {\n this.updateActiveStates();\n }\n\n private updateActiveStates(): void {\n if (!this.options) return;\n\n this.options.forEach((option) => {\n option.isActive = option.value === this.value;\n });\n }\n}\n","/**\n * Normalize what a user typed into the border-width field into a valid CSS length.\n *\n * The field is a free-text input, and `border-width: 3` is not a valid declaration —\n * the browser drops it silently, so typing a bare number used to do nothing at all\n * with no feedback. A bare number is the single most likely thing to type, and in a\n * length context it conventionally means pixels, so it is completed to `px`.\n *\n * Anything already carrying a unit is left alone (only the unit is lower-cased).\n *\n * The two failure modes are deliberately NOT the same value, because the command this\n * feeds reads `null` as \"clear this field\" and `undefined` as \"leave it alone\":\n *\n * - an **empty** field is a real instruction to clear the width, so it returns `null`;\n * - **unusable** input (`abc`, `-2px`, `50%`) returns `undefined`, so a typo leaves the\n * width the cell already had instead of wiping it. Collapsing the two would mean a\n * user with a working `1px` border who mistypes `3 pixels` loses it on Save with no\n * message — the field is free text, so mistyping it is the expected case, not a rare one.\n *\n * @returns a valid CSS border-width; `null` to clear it; `undefined` to leave it alone.\n */\nexport function normalizeBorderWidth(input: string | null | undefined): string | null | undefined {\n const value = (input ?? '').trim();\n if (!value) return null;\n\n // `thin | medium | thick` are valid border-width keywords in their own right.\n if (/^(thin|medium|thick)$/i.test(value)) return value.toLowerCase();\n\n // A bare number — the case this helper exists for. Border widths cannot be\n // negative, so a signed value is rejected rather than quietly clamped.\n if (/^\\d+(\\.\\d+)?$/.test(value)) return `${parseFloat(value)}px`;\n\n // Already a length. Units per CSS Values 4; `%` is not valid for border-width.\n const withUnit = /^(\\d+(?:\\.\\d+)?)\\s*(px|em|rem|pt|pc|in|cm|mm|q|ch|ex|vh|vw|vmin|vmax)$/i.exec(value);\n if (withUnit) return `${parseFloat(withUnit[1])}${withUnit[2].toLowerCase()}`;\n\n // Not a border-width at all — leave whatever the cell already has untouched.\n return undefined;\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n Color,\n getCombinedCellAttributeValue,\n getSelectedCells,\n TableBorder,\n TableDefaultAttributes,\n} from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { COLORS } from '../../constants/color.constant';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { PopoverDirective } from '../../core/popover.directive';\nimport { ButtonDirective } from '../../ui/button';\nimport { ColorPickerComponent } from '../../ui/color-picker';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\nimport { ToggleGroupComponent } from '../../ui/toggle-button/toggle-button';\nimport { ToggleOptionDirective } from '../../ui/toggle-button/toggle-button';\nimport { normalizeBorderWidth } from './border-width.util';\n\n/**\n * Cell style view for table bubble menu\n * Allows styling individual table cells (borders, background, alignment)\n */\n@Component({\n selector: 'document-engine-table-cell-style-view',\n standalone: true,\n imports: [\n CommonModule,\n IconComponent,\n ButtonDirective,\n InputDirective,\n SelectComponent,\n SelectOptionDirective,\n FormsModule,\n ColorPickerComponent,\n ToggleGroupComponent,\n ToggleOptionDirective,\n PopoverDirective,\n ],\n template: `\n <div class=\"table-cell-style-view\">\n <!-- Title -->\n <div class=\"table-cell-style-view__header\">Cell properties</div>\n\n <div class=\"table-cell-style-view__content\">\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Border</div>\n\n <div class=\"table-cell-style-view__border-grid\">\n <div class=\"table-cell-style-view__field\">\n <div class=\"table-cell-style-view__field-label\">Width</div>\n <input\n documentEngineInput\n data-testid=\"border-width\"\n [(ngModel)]=\"borderWidth\"\n (ngModelChange)=\"onBorderWidthChange()\"\n placeholder=\"1px\"\n />\n </div>\n\n <div class=\"table-cell-style-view__field\">\n <div class=\"table-cell-style-view__field-label\">Style</div>\n\n <document-engine-select data-testid=\"border-style\" [(value)]=\"borderStyle\" variant=\"outline\">\n <button documentEngineSelectOption value=\"solid\">Solid</button>\n <button documentEngineSelectOption value=\"dashed\">Dashed</button>\n <button documentEngineSelectOption value=\"dotted\">Dotted</button>\n <button documentEngineSelectOption value=\"none\">None</button>\n </document-engine-select>\n </div>\n\n <div class=\"table-cell-style-view__field table-cell-style-view__field--color\">\n <div class=\"table-cell-style-view__field-label\">Color</div>\n\n <div class=\"table-cell-style-view__color-input\">\n <input documentEngineInput [value]=\"borderColor\" readonly />\n\n <button\n *ngIf=\"borderColor\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-cell-style-view__color-clear\"\n data-testid=\"clear-border-color\"\n (click)=\"borderColor = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #borderColorTrigger\n type=\"button\"\n data-testid=\"border-color-trigger\"\n class=\"table-cell-style-view__color-swatch\"\n [style.background-color]=\"borderColor || 'transparent'\"\n (click)=\"toggleColorPicker('border')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"borderColor === 'transparent'\" class=\"table-cell-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for border -->\n <div\n *ngIf=\"showColorPicker === 'border'\"\n [documentEnginePopover]=\"borderColorTrigger\"\n [isOpen]=\"showColorPicker === 'border'\"\n class=\"table-cell-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"border-color\"\n [activeColor]=\"borderColorObj\"\n (colorSelected)=\"onBorderColorSelected($event)\"\n (colorRemoved)=\"onBorderColorRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Background</div>\n <div class=\"table-cell-style-view__field table-cell-style-view__field--color\">\n <div class=\"table-cell-style-view__field-label\">Color</div>\n\n <div class=\"table-cell-style-view__color-input\">\n <input documentEngineInput [value]=\"backgroundColor\" readonly />\n\n <button\n *ngIf=\"backgroundColor\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-cell-style-view__color-clear\"\n data-testid=\"clear-background-color\"\n (click)=\"backgroundColor = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #bgColorTrigger\n type=\"button\"\n data-testid=\"background-color-trigger\"\n class=\"table-cell-style-view__color-swatch\"\n [style.background-color]=\"backgroundColor || 'transparent'\"\n (click)=\"toggleColorPicker('bg')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"backgroundColor === 'transparent'\" class=\"table-cell-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for background -->\n <div\n *ngIf=\"showColorPicker === 'bg'\"\n [documentEnginePopover]=\"bgColorTrigger\"\n [isOpen]=\"showColorPicker === 'bg'\"\n class=\"table-cell-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"background-color\"\n [activeColor]=\"backgroundColorObj\"\n (colorSelected)=\"onBackgroundColorSelected($event)\"\n (colorRemoved)=\"onBackgroundColorRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Text alignment</div>\n\n <document-engine-toggle-group [(value)]=\"textAlign\">\n <button documentEngineToggleOption value=\"left\" title=\"Left\">\n <document-engine-icon name=\"format_align_left\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"center\" title=\"Center\">\n <document-engine-icon name=\"format_align_center\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"right\" title=\"Right\">\n <document-engine-icon name=\"format_align_right\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"justify\" title=\"Justify\">\n <document-engine-icon name=\"format_align_justify\"></document-engine-icon>\n </button>\n </document-engine-toggle-group>\n </div>\n\n <div class=\"table-cell-style-view__section\">\n <div class=\"table-cell-style-view__section-label\">Vertical alignment</div>\n\n <document-engine-toggle-group [(value)]=\"vAlign\">\n <button documentEngineToggleOption value=\"top\" title=\"Top\">\n <document-engine-icon name=\"vertical_align_top\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"middle\" title=\"Middle\">\n <document-engine-icon name=\"vertical_align_center\"></document-engine-icon>\n </button>\n <button documentEngineToggleOption value=\"bottom\" title=\"Bottom\">\n <document-engine-icon name=\"vertical_align_bottom\"></document-engine-icon>\n </button>\n </document-engine-toggle-group>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"table-cell-style-view__actions\">\n <button documentEngineButton data-testid=\"cancel\" variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n <button documentEngineButton data-testid=\"save\" variant=\"default\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n `,\n styleUrls: ['./table-cell-style-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableCellStyleViewComponent implements BubbleMenuViewContent {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChild('borderColorTrigger', { static: false, read: ElementRef })\n borderColorTrigger!: ElementRef<HTMLElement>;\n @ViewChild('bgColorTrigger', { static: false, read: ElementRef })\n bgColorTrigger!: ElementRef<HTMLElement>;\n\n editor?: Editor;\n goBack?: (viewId?: string) => void;\n\n // State\n borderStyle: 'solid' | 'dashed' | 'dotted' | 'none' | null = null;\n borderColor: string | null = null;\n borderWidth: string | null = '1px';\n\n backgroundColor: string | null = null;\n textAlign: 'left' | 'center' | 'right' | 'justify' | null = null;\n vAlign: 'top' | 'middle' | 'bottom' | null = 'middle';\n\n showColorPicker: 'border' | 'bg' | null = null;\n\n // Color picker state\n colorPalette = COLORS;\n\n private documentClickListener?: () => void;\n\n get borderColorObj(): Color | null {\n return this.borderColor ? Color.from(this.borderColor) : null;\n }\n\n get backgroundColorObj(): Color | null {\n return this.backgroundColor ? Color.from(this.backgroundColor) : null;\n }\n\n onActivate(): void {\n if (!this.editor) return;\n\n const { state } = this.editor;\n const cells = getSelectedCells(state);\n\n if (!cells.length) return;\n\n const backgroundColor = getCombinedCellAttributeValue(\n cells,\n 'backgroundColor',\n TableDefaultAttributes.cellBackgroundColor\n ) as string | null;\n\n const border = getCombinedCellAttributeValue(cells, 'border', TableDefaultAttributes.cellBorder) as TableBorder;\n const textAlign = getCombinedCellAttributeValue(cells, 'textAlign', TableDefaultAttributes.cellTextAlign) as\n | 'left'\n | 'center'\n | 'right'\n | 'justify'\n | null;\n const vAlign = getCombinedCellAttributeValue(cells, 'verticalAlign', TableDefaultAttributes.cellVerticalAlign) as\n | 'top'\n | 'middle'\n | 'bottom'\n | null;\n\n this.backgroundColor = backgroundColor;\n this.borderStyle = (border?.style as 'solid' | 'dashed' | 'dotted' | 'none' | null) || null;\n this.borderColor = (border?.color as string | null) || null;\n this.borderWidth = (border?.width as string | null) || null;\n this.textAlign = textAlign;\n this.vAlign = vAlign;\n this.closeColorPicker();\n\n this.cdr.markForCheck();\n }\n\n toggleColorPicker(type: 'border' | 'bg'): void {\n if (this.showColorPicker === type) {\n this.closeColorPicker();\n } else {\n this.showColorPicker = type;\n this.cdr.markForCheck();\n this.addDocumentClickListener();\n }\n }\n\n closeColorPicker(): void {\n this.showColorPicker = null;\n this.removeDocumentClickListener();\n this.cdr.markForCheck();\n }\n\n private addDocumentClickListener(): void {\n this.documentClickListener = () => this.closeColorPicker();\n\n // Use timeout to avoid immediate close from the same click that opened\n setTimeout(() => {\n if (this.documentClickListener) {\n document.addEventListener('click', this.documentClickListener);\n }\n });\n }\n\n private removeDocumentClickListener(): void {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = undefined;\n }\n }\n\n onBorderColorSelected(color: Color): void {\n this.borderColor = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderColorRemoved(): void {\n this.borderColor = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBackgroundColorSelected(color: Color): void {\n this.backgroundColor = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBackgroundColorRemoved(): void {\n this.backgroundColor = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderWidthChange(): void {\n this.cdr.markForCheck();\n }\n\n onSave(): void {\n // See `normalizeBorderWidth`: a bare number is completed to `px` so the field does\n // not silently do nothing, and unusable input yields `undefined` so the command\n // leaves the width the cell already has rather than clearing it.\n const width = normalizeBorderWidth(this.borderWidth);\n\n this.editor\n ?.chain()\n .focus()\n .setCellBorder({ style: this.borderStyle, color: this.borderColor, width })\n .setCellBackgroundColor(this.backgroundColor)\n .setCellTextAlign(this.textAlign)\n .setCellVerticalAlign(this.vAlign)\n .run();\n\n this.cancel();\n }\n\n cancel(): void {\n this.goBack?.('main');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { NonNullableFormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { CheckboxComponent } from '../../ui/checkbox/checkbox';\nimport { ErrorMessageComponent } from '../../ui/input/error-message';\nimport { InputDirective } from '../../ui/input/input';\n\nexport interface TableCreateViewData {\n rows?: number;\n cols?: number;\n header?: boolean;\n}\n\n/**\n * Table creation view for bubble menu\n * Allows users to configure table dimensions and header row\n */\n@Component({\n selector: 'document-engine-table-create-view',\n standalone: true,\n imports: [\n CommonModule,\n ButtonDirective,\n CheckboxComponent,\n ReactiveFormsModule,\n InputDirective,\n ErrorMessageComponent,\n ],\n template: `\n <div class=\"table-create-view\">\n <!-- Title -->\n <div class=\"table-create-view__header\">Insert Table</div>\n\n <!-- Header option -->\n <form [formGroup]=\"form\" class=\"table-create-view__option\">\n <document-engine-checkbox formControlName=\"header\">Header row</document-engine-checkbox>\n </form>\n\n <!-- Divider -->\n <div class=\"table-create-view__divider\"></div>\n\n <!-- Grid Selector -->\n <div class=\"table-create-view__grid-section\">\n <div class=\"table-create-view__grid-wrapper\">\n <!-- Grid -->\n <div class=\"table-create-view__grid\" (mouseenter)=\"onGridMouseEnter()\" (mouseleave)=\"onGridMouseLeave()\">\n <div *ngFor=\"let row of gridRows\" class=\"table-create-view__grid-row\">\n <div\n *ngFor=\"let col of gridCols\"\n class=\"table-create-view__grid-cell\"\n [class.table-create-view__grid-cell--selected]=\"isBoxSelected(row, col)\"\n (mouseenter)=\"onBoxHover(row, col)\"\n (mousedown)=\"onBoxClick(row, col)\"\n ></div>\n </div>\n </div>\n\n <!-- Dimension display -->\n <div class=\"table-create-view__dimension\">{{ hoveredRows }} × {{ hoveredCols }}</div>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"table-create-view__divider\"></div>\n\n <!-- Form -->\n <div class=\"table-create-view__form\">\n <div class=\"table-create-view__form-label\">Or enter dimensions manually:</div>\n <form [formGroup]=\"form\" class=\"table-create-view__form-fields\">\n <div class=\"table-create-view__form-field\">\n <input\n documentEngineInput\n type=\"number\"\n formControlName=\"rows\"\n min=\"1\"\n [max]=\"MAX_GRID_ROWS\"\n placeholder=\"Rows\"\n />\n <document-engine-error-message *ngIf=\"form.controls.rows.invalid && form.controls.rows.touched\">\n Enter 1-{{ MAX_GRID_ROWS }}\n </document-engine-error-message>\n </div>\n\n <div class=\"table-create-view__form-field\">\n <input\n documentEngineInput\n type=\"number\"\n formControlName=\"cols\"\n min=\"1\"\n [max]=\"MAX_GRID_COLS\"\n placeholder=\"Columns\"\n />\n <document-engine-error-message *ngIf=\"form.controls.cols.invalid && form.controls.cols.touched\">\n Enter 1-{{ MAX_GRID_COLS }}\n </document-engine-error-message>\n </div>\n </form>\n </div>\n\n <!-- Actions -->\n <div class=\"table-create-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"ghost\" (click)=\"close?.()\">Cancel</button>\n <button\n type=\"button\"\n documentEngineButton\n variant=\"default\"\n (click)=\"onInsertFromForm()\"\n [disabled]=\"form.invalid\"\n >\n Insert\n </button>\n </div>\n </div>\n `,\n styleUrls: ['./table-create-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableCreateViewComponent implements BubbleMenuViewContent<TableCreateViewData> {\n private readonly fb = inject(NonNullableFormBuilder);\n private readonly cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n // Grid configuration\n readonly MAX_GRID_ROWS = 100;\n readonly MAX_GRID_COLS = 10;\n readonly GRID_ROW = 10;\n readonly GRID_COL = this.MAX_GRID_COLS;\n\n gridRows = Array.from({ length: this.GRID_ROW }, (_, i) => i);\n gridCols = Array.from({ length: this.GRID_COL }, (_, i) => i);\n\n // Grid state\n hoveredRows = 1;\n hoveredCols = 1;\n frozenRows: number | null = null;\n frozenCols: number | null = null;\n\n form = this.fb.group({\n rows: this.fb.control(3, {\n validators: [Validators.required, Validators.min(1), Validators.max(this.MAX_GRID_ROWS)],\n }),\n cols: this.fb.control(3, {\n validators: [Validators.required, Validators.min(1), Validators.max(this.MAX_GRID_COLS)],\n }),\n header: this.fb.control(false),\n });\n\n onActivate(attrs: TableCreateViewData): void {\n // Reset form with provided data or defaults\n this.form.patchValue({\n rows: this.clamp(attrs?.rows ?? 3, 1, 50),\n cols: this.clamp(attrs?.cols ?? 3, 1, 20),\n header: attrs?.header ?? false,\n });\n\n // Reset grid state\n this.hoveredRows = 1;\n this.hoveredCols = 1;\n this.frozenRows = null;\n this.frozenCols = null;\n this.cdr.markForCheck();\n }\n\n isBoxSelected(row: number, col: number): boolean {\n const activeRows = this.frozenRows ?? this.hoveredRows;\n const activeCols = this.frozenCols ?? this.hoveredCols;\n return row < activeRows && col < activeCols;\n }\n\n onBoxHover(row: number, col: number): void {\n // Don't update if frozen\n if (this.frozenRows !== null || this.frozenCols !== null) return;\n\n this.hoveredRows = row + 1;\n this.hoveredCols = col + 1;\n }\n\n onBoxClick(row: number, col: number): void {\n const rows = row + 1;\n const cols = col + 1;\n\n if (!this.editor) return;\n\n const header = this.form.controls.header.value;\n\n // Insert table using TipTap's table extension\n this.editor.chain().focus().insertTable({ rows, cols, withHeaderRow: header }).run();\n\n this.close?.();\n }\n\n onGridMouseEnter(): void {\n // Unfreeze when mouse re-enters grid\n this.frozenRows = null;\n this.frozenCols = null;\n }\n\n onGridMouseLeave(): void {\n // Freeze current selection when mouse leaves\n this.frozenRows = this.hoveredRows;\n this.frozenCols = this.hoveredCols;\n }\n\n onInsertFromForm(): void {\n if (!this.editor || this.form.invalid) return;\n\n const { rows, cols, header } = this.form.getRawValue();\n\n // Insert table using TipTap's table extension\n this.editor.chain().focus().insertTable({ rows, cols, withHeaderRow: header }).run();\n\n this.close?.();\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { getCursorCellInfo } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { CellSelection } from '@tiptap/pm/tables';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectLabelDirective } from '../../ui/select/select-label.directive';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\n\n/**\n * Main view for table bubble menu\n * Shows table manipulation controls (rows, columns, cells)\n * Provides navigation to cell and table styling views\n */\n@Component({\n selector: 'document-engine-table-main-view',\n standalone: true,\n imports: [CommonModule, ButtonDirective, IconComponent, SelectComponent, SelectOptionDirective, SelectLabelDirective],\n template: `\n <div class=\"table-main-view\">\n <!-- Column actions -->\n <document-engine-select data-testid=\"column-actions\" [(value)]=\"colAction\" (valueChange)=\"handleColAction($event)\" labelMode=\"static\">\n <document-engine-icon documentEngineSelectLabel name=\"table_column\"></document-engine-icon>\n\n <button documentEngineSelectOption value=\"add-before\">Insert column left</button>\n <button documentEngineSelectOption value=\"add-after\">Insert column right</button>\n <button documentEngineSelectOption value=\"delete\">Remove column</button>\n <button documentEngineSelectOption value=\"select\">Select column</button>\n </document-engine-select>\n\n <!-- Row actions -->\n <document-engine-select data-testid=\"row-actions\" [(value)]=\"rowAction\" (valueChange)=\"handleRowAction($event)\" labelMode=\"static\">\n <document-engine-icon documentEngineSelectLabel name=\"table_row\"></document-engine-icon>\n\n <button documentEngineSelectOption value=\"add-before\">Insert row above</button>\n <button documentEngineSelectOption value=\"add-after\">Insert row below</button>\n <button documentEngineSelectOption value=\"delete\">Remove row</button>\n <button documentEngineSelectOption value=\"select\">Select row</button>\n </document-engine-select>\n\n <!-- Cell actions -->\n <document-engine-select data-testid=\"cell-actions\" [(value)]=\"cellAction\" (valueChange)=\"handleCellAction($event)\" labelMode=\"static\">\n <document-engine-icon documentEngineSelectLabel name=\"table_merge_cell\"></document-engine-icon>\n\n <button documentEngineSelectOption data-testid=\"merge-cells\" value=\"merge\" [disabled]=\"!canMerge\">\n Merge cells\n </button>\n <button documentEngineSelectOption data-testid=\"split-cell\" value=\"split\" [disabled]=\"!canSplit\">\n Split cell\n </button>\n </document-engine-select>\n\n <!-- Table style -->\n <button\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n title=\"Table Properties\"\n data-testid=\"table-properties\"\n (click)=\"navigateTo?.('table-style')\"\n >\n <document-engine-icon name=\"table_property\"></document-engine-icon>\n </button>\n\n <!-- Cell style -->\n <button\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n title=\"Cell Properties\"\n data-testid=\"cell-properties\"\n (click)=\"navigateTo?.('cell-style')\"\n >\n <document-engine-icon name=\"table_cell_property\"></document-engine-icon>\n </button>\n </div>\n `,\n styleUrls: ['./table-main-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableMainViewComponent implements BubbleMenuViewContent {\n editor?: Editor;\n navigateTo?: (viewId: string) => void;\n close?: () => void;\n\n colAction: string | null = '';\n rowAction: string | null = '';\n cellAction: string | null = '';\n\n get canMerge(): boolean {\n return this.editor?.can()?.chain()?.focus()?.mergeCells()?.run() || false;\n }\n\n get canSplit(): boolean {\n return this.editor?.can()?.chain()?.focus()?.splitCell()?.run() || false;\n }\n\n handleColAction(action: string | null): void {\n if (!action || !this.editor) return;\n\n switch (action) {\n case 'add-before':\n this.editor.chain().focus().addColumnBefore().run();\n break;\n case 'add-after':\n this.editor.chain().focus().addColumnAfter().run();\n break;\n case 'delete':\n this.editor.chain().focus().deleteColumn().run();\n break;\n case 'select':\n this.setSelection('column');\n break;\n }\n\n // Reset selection\n this.colAction = '';\n }\n\n handleRowAction(action: string | null): void {\n if (!action || !this.editor) return;\n\n switch (action) {\n case 'add-before':\n this.editor.chain().focus().addRowBefore().run();\n break;\n case 'add-after':\n this.editor.chain().focus().addRowAfter().run();\n break;\n case 'delete':\n this.editor.chain().focus().deleteRow().run();\n break;\n case 'select':\n this.setSelection('row');\n break;\n }\n\n // Reset selection\n this.rowAction = '';\n }\n\n handleCellAction(action: string | null): void {\n if (!action || !this.editor) return;\n\n switch (action) {\n case 'merge':\n this.editor.chain().focus().mergeCells().run();\n break;\n case 'split':\n this.editor.chain().focus().splitCell().run();\n break;\n }\n\n // Reset selection\n this.cellAction = '';\n }\n\n setSelection(selection: 'column' | 'row'): void {\n if (!this.editor) return;\n\n const { state, view } = this.editor;\n\n const cellInfo = getCursorCellInfo(state);\n if (!cellInfo) {\n this.close?.();\n return;\n }\n\n const { map, tableStart, rowIndex, colIndex } = cellInfo;\n\n if (selection === 'row') {\n // Select the entire row\n const firstCellPos = tableStart + map.map[rowIndex * map.width];\n const lastCellPos = tableStart + map.map[rowIndex * map.width + map.width - 1];\n\n const $anchor = state.doc.resolve(firstCellPos);\n const $head = state.doc.resolve(lastCellPos);\n\n const cellSelection = CellSelection.rowSelection($anchor, $head);\n const tr = state.tr.setSelection(cellSelection);\n view.dispatch(tr);\n view.focus();\n this.close?.();\n return;\n }\n\n // Select the entire column\n const firstCellPos = tableStart + map.map[colIndex];\n const lastCellPos = tableStart + map.map[colIndex + (map.height - 1) * map.width];\n\n const $anchor = state.doc.resolve(firstCellPos);\n const $head = state.doc.resolve(lastCellPos);\n\n const cellSelection = CellSelection.colSelection($anchor, $head);\n const tr = state.tr.setSelection(cellSelection);\n view.dispatch(tr);\n view.focus();\n this.close?.();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, ViewChild, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Color, getCursorCellInfo, TableDefaultAttributes } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { COLORS } from '../../constants/color.constant';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { PopoverDirective } from '../../core/popover.directive';\nimport { ButtonDirective } from '../../ui/button';\nimport { ColorPickerComponent } from '../../ui/color-picker';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { SelectComponent } from '../../ui/select/select.component';\nimport { SelectOptionDirective } from '../../ui/select/select-option.directive';\nimport { normalizeBorderWidth } from './border-width.util';\n\n/**\n * Table style view for table bubble menu\n * Allows styling the entire table (borders, background, dimensions, alignment)\n */\n@Component({\n selector: 'document-engine-table-style-view',\n standalone: true,\n imports: [\n CommonModule,\n IconComponent,\n ButtonDirective,\n InputDirective,\n SelectComponent,\n SelectOptionDirective,\n FormsModule,\n ColorPickerComponent,\n PopoverDirective,\n ],\n template: `\n <div class=\"table-style-view\">\n <!-- Title -->\n <div class=\"table-style-view__header\">Table Properties</div>\n\n <div class=\"table-style-view__content\">\n <div class=\"table-style-view__section\">\n <div class=\"table-style-view__section-label\">Border</div>\n\n <div class=\"table-style-view__border-grid\">\n <div class=\"table-style-view__field\">\n <div class=\"table-style-view__field-label\">Width</div>\n\n <input\n documentEngineInput\n data-testid=\"border-width\"\n [(ngModel)]=\"borderWidth\"\n (ngModelChange)=\"onBorderWidthChange()\"\n placeholder=\"1px\"\n />\n </div>\n\n <div class=\"table-style-view__field\">\n <div class=\"table-style-view__field-label\">Style</div>\n\n <document-engine-select data-testid=\"border-style\" [(value)]=\"borderStyle\" variant=\"outline\">\n <button documentEngineSelectOption value=\"solid\">Solid</button>\n <button documentEngineSelectOption value=\"double\">Double</button>\n <button documentEngineSelectOption value=\"dashed\">Dashed</button>\n <button documentEngineSelectOption value=\"dotted\">Dotted</button>\n <button documentEngineSelectOption value=\"none\">None</button>\n </document-engine-select>\n </div>\n\n <div class=\"table-style-view__field table-style-view__field--color\">\n <div class=\"table-style-view__field-label\">Color</div>\n <div class=\"table-style-view__color-input\">\n <input documentEngineInput [value]=\"borderColor\" readonly />\n\n <button\n *ngIf=\"borderColor\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-style-view__color-clear\"\n data-testid=\"clear-border-color\"\n (click)=\"borderColor = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #borderColorTrigger\n type=\"button\"\n data-testid=\"border-color-trigger\"\n class=\"table-style-view__color-swatch\"\n [style.background-color]=\"borderColor || 'transparent'\"\n (click)=\"toggleColorPicker('border')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"borderColor === 'transparent'\" class=\"table-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for border -->\n <div\n *ngIf=\"showColorPicker === 'border'\"\n [documentEnginePopover]=\"borderColorTrigger\"\n [isOpen]=\"showColorPicker === 'border'\"\n class=\"table-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"border-color\"\n [activeColor]=\"borderColorObj\"\n (colorSelected)=\"onBorderColorSelected($event)\"\n (colorRemoved)=\"onBorderColorRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-style-view__section\">\n <div class=\"table-style-view__section-label\">Background</div>\n <div class=\"table-style-view__field table-style-view__field--color\">\n <div class=\"table-style-view__field-label\">Color</div>\n\n <div class=\"table-style-view__color-input\">\n <input documentEngineInput [value]=\"tableBg\" readonly />\n\n <button\n *ngIf=\"tableBg\"\n type=\"button\"\n documentEngineButton\n size=\"icon\"\n variant=\"ghost\"\n class=\"table-style-view__color-clear\"\n data-testid=\"clear-background-color\"\n (click)=\"tableBg = null\"\n >\n <document-engine-icon name=\"close\"></document-engine-icon>\n </button>\n\n <button\n #bgColorTrigger\n type=\"button\"\n data-testid=\"background-color-trigger\"\n class=\"table-style-view__color-swatch\"\n [style.background-color]=\"tableBg || 'transparent'\"\n (click)=\"toggleColorPicker('bg')\"\n title=\"Pick color\"\n >\n <div *ngIf=\"tableBg === 'transparent'\" class=\"table-style-view__color-checker\"></div>\n </button>\n </div>\n\n <!-- Color picker for background -->\n <div\n *ngIf=\"showColorPicker === 'bg'\"\n [documentEnginePopover]=\"bgColorTrigger\"\n [isOpen]=\"showColorPicker === 'bg'\"\n class=\"table-style-view__color-picker-dropdown\"\n (click)=\"$event.stopPropagation()\"\n >\n <document-engine-color-picker\n [colorPalette]=\"colorPalette\"\n data-testid=\"background-color\"\n [activeColor]=\"tableBgObj\"\n (colorSelected)=\"onTableBgSelected($event)\"\n (colorRemoved)=\"onTableBgRemoved()\"\n ></document-engine-color-picker>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"table-style-view__actions\">\n <button documentEngineButton data-testid=\"cancel\" variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n <button documentEngineButton data-testid=\"save\" variant=\"default\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n `,\n styleUrls: ['./table-style-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableStyleViewComponent implements BubbleMenuViewContent {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChild('borderColorTrigger', { static: false, read: ElementRef })\n borderColorTrigger!: ElementRef<HTMLElement>;\n @ViewChild('bgColorTrigger', { static: false, read: ElementRef })\n bgColorTrigger!: ElementRef<HTMLElement>;\n\n editor?: Editor;\n goBack?: (viewId?: string) => void;\n\n // State\n borderStyle: 'solid' | 'double' | 'dashed' | 'dotted' | 'none' | null = null;\n borderColor: string | null = null;\n borderWidth: string | null = null;\n tableBg: string | null = null;\n\n showColorPicker: 'border' | 'bg' | null = null;\n\n // Color picker state\n colorPalette = COLORS;\n\n private documentClickListener?: () => void;\n\n get borderColorObj(): Color | null {\n return this.borderColor ? Color.from(this.borderColor) : null;\n }\n\n get tableBgObj(): Color | null {\n return this.tableBg ? Color.from(this.tableBg) : null;\n }\n\n onActivate(): void {\n if (!this.editor) return;\n\n const { state } = this.editor;\n const cellInfo = getCursorCellInfo(state);\n if (!cellInfo) return;\n\n const tableAttrs = cellInfo.tableNode.attrs;\n\n // Initialize border signals from table attributes\n this.borderStyle = tableAttrs['border']?.['style'] || TableDefaultAttributes.border.style;\n this.borderColor = tableAttrs['border']?.['color'] || TableDefaultAttributes.border.color;\n this.borderWidth = tableAttrs['border']?.['width'] || TableDefaultAttributes.border.width;\n\n this.tableBg = tableAttrs['backgroundColor'] || null;\n this.closeColorPicker();\n\n this.cdr.markForCheck();\n }\n\n toggleColorPicker(type: 'border' | 'bg'): void {\n if (this.showColorPicker === type) {\n this.closeColorPicker();\n } else {\n this.showColorPicker = type;\n this.cdr.markForCheck();\n this.addDocumentClickListener();\n }\n }\n\n closeColorPicker(): void {\n this.showColorPicker = null;\n this.removeDocumentClickListener();\n this.cdr.markForCheck();\n }\n\n private addDocumentClickListener(): void {\n this.documentClickListener = () => this.closeColorPicker();\n\n // Use timeout to avoid immediate close from the same click that opened\n setTimeout(() => {\n if (this.documentClickListener) {\n document.addEventListener('click', this.documentClickListener);\n }\n });\n }\n\n private removeDocumentClickListener(): void {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = undefined;\n }\n }\n\n onBorderColorSelected(color: Color): void {\n this.borderColor = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderColorRemoved(): void {\n this.borderColor = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onTableBgSelected(color: Color): void {\n this.tableBg = color.value;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onTableBgRemoved(): void {\n this.tableBg = null;\n this.closeColorPicker();\n this.cdr.markForCheck();\n }\n\n onBorderWidthChange(): void {\n this.cdr.markForCheck();\n }\n\n onSave(): void {\n const editor = this.editor;\n if (!editor) return;\n\n // Complete a bare number to `px` before it reaches the command; `border-width: 3`\n // is invalid CSS and would be dropped without any feedback. `undefined` here means\n // the input was not a width at all, and the command leaves the current one alone.\n const width = normalizeBorderWidth(this.borderWidth);\n\n editor\n .chain()\n .focus()\n .setTableBorder({ style: this.borderStyle, color: this.borderColor, width })\n .setTableBackgroundColor(this.tableBg)\n .run();\n\n this.cancel();\n }\n\n cancel(): void {\n this.goBack?.('main');\n }\n}\n","import { EditorBubbleMenuConfig, ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { TableCellStyleViewComponent } from '../views/table-views/table-cell-style-view';\nimport { TableCreateViewComponent } from '../views/table-views/table-create-view';\nimport { TableMainViewComponent } from '../views/table-views/table-main-view';\nimport { TableStyleViewComponent } from '../views/table-views/table-style-view';\n\nexport const TableBubbleConfig: EditorBubbleMenuConfig = {\n props: {\n pluginKey: 'TableBubbleMenu',\n mountTo: 'table',\n },\n target: {\n kind: 'node',\n name: ['tableCell', 'tableHeader'],\n allowEmptySelection: true,\n requireFocus: false,\n },\n views: [\n {\n id: 'main',\n component: TableMainViewComponent,\n label: 'Table',\n isDefault: true,\n },\n {\n id: 'table-style',\n component: TableStyleViewComponent,\n label: 'Table Properties',\n },\n {\n id: 'cell-style',\n component: TableCellStyleViewComponent,\n label: 'Cell Properties',\n },\n ],\n};\n\nexport const TableCreateBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'TableCreateBubbleMenu',\n views: [\n {\n id: 'create',\n component: TableCreateViewComponent,\n label: 'Create Table',\n isDefault: true,\n },\n ],\n};\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Editor } from '@tiptap/core';\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { BubbleMenuViewContent } from '../../core/bubble-menu/bubble-menu.type';\nimport { TemplateItem } from '../../types/template.type';\nimport { ButtonDirective } from '../../ui/button';\nimport { IconComponent } from '../../ui/icon/icon.component';\nimport { InputDirective } from '../../ui/input/input';\nimport { LabelDirective } from '../../ui/input/label';\n\n/**\n * Template view for bubble menu\n * Shows templates for insertion into the editor\n * Replaces entire editor content with selected template\n */\n@Component({\n selector: 'document-engine-template-view',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonDirective, InputDirective, LabelDirective, IconComponent],\n template: `\n <div class=\"template-view\">\n <!-- Title -->\n <div class=\"template-view__header\">Templates</div>\n\n <!-- Search Bar -->\n <div class=\"template-view__search\">\n <div class=\"template-view__search-field\">\n <label documentEngineLabel for=\"search-input\">Search templates</label>\n <div class=\"template-view__search-input-wrapper\">\n <document-engine-icon name=\"search\" class=\"template-view__search-icon\"></document-engine-icon>\n <input\n documentEngineInput\n id=\"search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n aria-label=\"Search templates\"\n />\n </div>\n </div>\n </div>\n\n <!-- Templates List -->\n <div class=\"template-view__list-container\">\n <div *ngIf=\"filteredTemplates.length > 0; else noResults\" class=\"template-view__list\">\n <button\n *ngFor=\"let template of filteredTemplates\"\n type=\"button\"\n class=\"template-view__template-item\"\n (click)=\"insertTemplate(template)\"\n [attr.aria-label]=\"template.title + (template.description ? ' - ' + template.description : '')\"\n [title]=\"template.description || template.title\"\n >\n <div class=\"template-view__template-title\">{{ template.title }}</div>\n <div *ngIf=\"template.description\" class=\"template-view__template-description\">\n {{ template.description }}\n </div>\n </button>\n </div>\n\n <ng-template #noResults>\n <div class=\"template-view__empty\">\n <document-engine-icon name=\"search_off\" class=\"template-view__empty-icon\"></document-engine-icon>\n <div class=\"template-view__empty-text\">No templates found matching \"{{ searchQuery }}\"</div>\n </div>\n </ng-template>\n </div>\n\n <!-- Actions -->\n <div class=\"template-view__actions\">\n <button type=\"button\" documentEngineButton variant=\"secondary\" (click)=\"close?.()\">Close</button>\n </div>\n </div>\n `,\n styleUrls: ['./template-view.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TemplateViewComponent implements BubbleMenuViewContent<Record<string, unknown>>, OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n editor?: Editor;\n close?: () => void;\n goBack?: (viewId?: string) => void;\n navigateTo?: (viewId: string) => void;\n\n searchQuery = '';\n originalTemplates: TemplateItem[] = [];\n\n // Reactive form control for search\n searchControl = new FormControl('');\n private destroy$ = new Subject<void>();\n\n onActivate(attrs: Record<string, unknown>): void {\n const templates = attrs['templates'] as TemplateItem[];\n if (!templates) throw new Error('Templates are required');\n this.originalTemplates = templates;\n this.searchQuery = '';\n this.searchControl.setValue('');\n this.cdr.markForCheck();\n }\n\n ngOnInit(): void {\n // Set up reactive form subscription with debounce\n this.searchControl.valueChanges\n .pipe(debounceTime(200), distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((value) => {\n this.searchQuery = value || '';\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Getter that filters templates based on search query\n */\n get filteredTemplates(): TemplateItem[] {\n const query = this.searchQuery.toLowerCase().trim();\n\n if (!query) return this.originalTemplates;\n\n // Filter templates based on search query\n return this.originalTemplates.filter(\n (template) => template.title.toLowerCase().includes(query) || template.description?.toLowerCase().includes(query)\n );\n }\n\n /**\n * Insert a template into the editor, replacing entire content\n */\n insertTemplate(template: TemplateItem): void {\n if (!this.editor) return;\n\n // Replace entire editor content with template data\n this.editor.chain().focus().setContent(template.data).run();\n this.close?.();\n }\n}\n","import { ToolbarBubbleMenuConfig } from '../core/bubble-menu/bubble-menu.type';\nimport { TemplateViewComponent } from '../views/template-view/template-view';\n\nexport const TemplateBubbleConfig: ToolbarBubbleMenuConfig = {\n pluginKey: 'TemplateBubbleMenu',\n maxWidth: '400px',\n width: '400px',\n views: [\n {\n id: 'templates',\n component: TemplateViewComponent,\n label: 'Templates',\n isDefault: true,\n },\n ],\n};\n","import { HeadingLevel } from '../types/heading.type';\n\nexport const FONT_SIZE_OPTIONS = [\n { value: '12px', label: '12px' },\n { value: '14px', label: '14px' },\n { value: '16px', label: '16px' },\n { value: '18px', label: '18px' },\n { value: '20px', label: '20px' },\n];\n\nexport const LINE_HEIGHT_OPTIONS = [\n { value: null, label: 'Default' },\n { value: '1', label: '1' },\n { value: '1.5', label: '1.5' },\n { value: '2', label: '2' },\n { value: '2.5', label: '2.5' },\n { value: '3', label: '3' },\n];\n\nexport const TEXT_CASE_OPTIONS = [\n { value: 'uppercase', label: 'UPPERCASE' },\n { value: 'lowercase', label: 'lowercase' },\n { value: 'capitalize', label: 'Capitalize' },\n];\n\nexport interface HeadingOption {\n value: HeadingLevel | null;\n label: string;\n class: string;\n}\n\n/**\n * Heading levels offered when `heading` is enabled without an explicit `levels`\n * array — mirrors the Tiptap Heading extension default (1–6).\n */\nexport const DEFAULT_HEADING_LEVELS: HeadingLevel[] = [1, 2, 3, 4, 5, 6];\n\n/**\n * Build the block-type dropdown options from the editor's configured heading\n * levels, so the toolbar offers exactly the levels the editor can produce: no\n * dead entry for a level the config omits, and no configured level left\n * unreachable. The leading \"Normal text\" (paragraph) entry is always present.\n * Levels are de-duplicated and sorted ascending; an empty or omitted list falls\n * back to {@link DEFAULT_HEADING_LEVELS}.\n */\nexport function buildHeadingOptions(levels?: readonly number[]): HeadingOption[] {\n const source = levels && levels.length > 0 ? levels : DEFAULT_HEADING_LEVELS;\n const sorted = [...new Set(source)].sort((a, b) => a - b);\n return [\n { value: null, label: 'Normal text', class: '' },\n ...sorted.map((level) => ({\n value: level as HeadingLevel,\n label: `Heading ${level}`,\n class: `h${level}`,\n })),\n ];\n}\n\nexport const TEXT_ALIGN_OPTIONS = [\n { value: 'left', label: 'Align Left', icon: 'format_align_left' },\n { value: 'center', label: 'Align Center', icon: 'format_align_center' },\n { value: 'right', label: 'Align Right', icon: 'format_align_right' },\n { value: 'justify', label: 'Align Justify', icon: 'format_align_justify' },\n];\n","export const LIST_STYLE_OPTIONS = [\n { value: 'decimal', label: 'Decimal', example: '1.' },\n { value: 'lower-alpha-dot', label: 'Lower Alpha', example: 'a.' },\n { value: 'lower-alpha-parens', label: 'Lower Alpha (Parentheses)', example: '(a)' },\n { value: 'lower-roman-parens', label: 'Lower Roman', example: '(i)' },\n];\n","import { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n inject,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { getClosestDomElement } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport {\n BubbleMenuViewConfig,\n BubbleMenuViewContent,\n EditorBubbleMenuConfig,\n} from '../../core/bubble-menu/bubble-menu.type';\nimport { FocusTrapService } from '../../core/focus-trap.service';\nimport { selectionChangeHandler, shouldShowFnFactory } from '../../core/bubble-menu/bubble-menu.util';\nimport { TiptapBubbleMenuDirective } from '../../core/bubble-menu/bubble-menu.directive';\n\n@Component({\n selector: 'document-engine-editor-bubble-menu',\n standalone: true,\n imports: [CommonModule, TiptapBubbleMenuDirective],\n template: `\n <div\n #bubbleElement\n class=\"bubble-menu-wrapper\"\n tiptapBubbleMenu\n [editor]=\"editor\"\n [props]=\"config.props!\"\n [mountTo]=\"mountTo\"\n [shouldShow]=\"shouldShowFn\"\n >\n <!-- View component will be dynamically inserted here -->\n <ng-container #viewContainer></ng-container>\n </div>\n `,\n styleUrls: ['./editor-bubble-menu.wrapper.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EditorBubbleMenuComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input() editor!: Editor;\n @Input() config!: EditorBubbleMenuConfig;\n\n @ViewChild('viewContainer', { read: ViewContainerRef }) private viewContainer!: ViewContainerRef;\n @ViewChild('bubbleElement') private bubbleElement!: ElementRef<HTMLElement>;\n\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private document = inject(DOCUMENT);\n private focusTrap = inject(FocusTrapService);\n private currentViewRef: ComponentRef<BubbleMenuViewContent> | null = null;\n private currentViewId: string | null = null;\n private currentAttributes: Record<string, unknown> = {};\n private cleanupSelection: (() => void) | null = null;\n private shouldShowImpl: (() => boolean) | null = null;\n\n private viewReady = false;\n private keyToSignal = new Map<string, { value: boolean }>();\n private forceOpen: { value: boolean } = { value: false };\n private documentClickHandler!: (event: MouseEvent) => void;\n\n // Stable function reference for template binding\n shouldShowFn = () => (this.shouldShowImpl ? this.shouldShowImpl() : false);\n\n get mountTo() {\n const mountTo = this.config.props?.mountTo;\n if (!mountTo) return undefined;\n return () => getClosestDomElement(this.editor, mountTo);\n }\n\n ngOnInit(): void {\n const editor = this.editor;\n const config = this.config;\n\n if (!config.props?.pluginKey) {\n throw new Error('Required: Input `props.pluginKey`');\n }\n\n // Initialize force open signal\n this.forceOpen = this.signalFor(config.props?.pluginKey);\n\n // Setup shouldShow logic\n this.shouldShowImpl = shouldShowFnFactory({\n editor,\n target: config.target,\n forceOpen: () => this.forceOpen.value,\n });\n\n // Setup selection change handler\n this.cleanupSelection = selectionChangeHandler({\n editor,\n target: config.target,\n onActive: (attrs) => this.ngZone.run(() => this.handleActivate(attrs)),\n onInactive: () => this.ngZone.run(() => this.handleDeactivate()),\n });\n\n this.addDocumentClickHandler();\n }\n\n ngAfterViewInit(): void {\n this.viewReady = true;\n // const bubbleElement = this.bubbleElement?.nativeElement;\n // if (bubbleElement) {\n // this.focusTrap.attach(bubbleElement);\n // }\n }\n\n ngOnDestroy(): void {\n if (this.cleanupSelection) {\n this.cleanupSelection();\n this.cleanupSelection = null;\n }\n\n this.destroyCurrentView();\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n this.focusTrap.detach(bubbleElement);\n }\n this.document.removeEventListener('mousedown', this.documentClickHandler);\n }\n\n private addDocumentClickHandler() {\n this.documentClickHandler = (event: MouseEvent) => {\n const target = event.target as Node;\n\n // Check if click is inside editor or its children\n const isClickInsideEditor = (this.editor.options.element as HTMLElement | undefined)?.contains(target);\n\n // Check if click is inside bubble menu or its children\n const isClickInsideBubbleMenu = this.bubbleElement?.nativeElement?.contains(target);\n\n // Check if click is inside a CDK overlay (e.g., MatSelect dropdown, MatMenu, etc.)\n // These are rendered outside the bubble but should not close it\n const isInsideOverlay =\n target instanceof Element && !!target.closest('.cdk-overlay-container, .cdk-overlay-pane');\n\n if (!isClickInsideEditor && !isClickInsideBubbleMenu && !isInsideOverlay) {\n // If click is completely outside, manually deactivate the bubble\n // and blur the editor to maintain correct focus state\n this.handleDeactivate();\n }\n };\n\n // Use mousedown for faster response than click\n this.document.addEventListener('mousedown', this.documentClickHandler);\n }\n\n /**\n * Public method to force open the bubble menu\n */\n showBubble(): void {\n // Select view for force-open scenario\n const viewId = this.selectInitialView({}, true);\n if (!viewId) {\n console.warn('[BubbleMenuMultiView] No view configured for force-open');\n return;\n }\n\n const hostElement = this.bubbleElement?.nativeElement;\n if (!hostElement) {\n console.error('[BubbleMenuMultiView] Bubble element not found');\n return;\n }\n\n // Open the bubble\n this.forceOpen.value = true;\n this.editor.commands.focus();\n this.editor.view.dispatch(this.editor.state.tr);\n\n // Attach outside click/escape listeners\n // this.eventManager.attach(this.config.pluginKey, hostElement, this.hideBubble.bind(this));\n\n // Show the view\n this.showView(viewId);\n this.cdr.markForCheck();\n }\n\n /**\n * Handle close request from view\n */\n hideBubble(): void {\n this.forceOpen.value = false;\n // this.eventManager.detach(this.config.pluginKey);\n this.destroyCurrentView();\n this.cdr.markForCheck();\n }\n\n /**\n * Handle when target mark/node becomes active\n */\n private handleActivate(attrs: Record<string, unknown>): void {\n if (!this.viewReady) {\n return;\n }\n\n this.currentAttributes = attrs;\n\n // Select which view to show\n const viewId = this.selectInitialView(attrs, false);\n\n if (!viewId) {\n console.warn('[BubbleMenuMultiView] No suitable view found for attributes:', attrs);\n return;\n }\n\n // Attach outside click/escape listeners\n // const bubbleElement = this.bubbleElement?.nativeElement;\n // const isAttached = this.eventManager.isAttached(this.config.pluginKey);\n // if (bubbleElement && !isAttached) {\n // this.eventManager.attach(this.config.pluginKey, bubbleElement, this.hideBubble.bind(this));\n // }\n\n // If view is already showing, just update it with new attributes\n if (this.currentViewId === viewId && this.currentViewRef) {\n // Attributes changed but same view - call onActivate to update\n this.activateView(this.currentViewRef);\n } else {\n // Different view - show it\n this.showView(viewId);\n }\n }\n\n /**\n * Handle when target mark/node becomes inactive\n */\n private handleDeactivate(): void {\n // Mark bubble as hidden\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n bubbleElement.removeAttribute('data-visible');\n }\n\n // // Detach outside click/escape listeners\n // const isAttached = this.eventManager.isAttached(this.config.pluginKey);\n // if (isAttached) {\n // this.eventManager.detach(this.config.pluginKey);\n // }\n\n // Reset force open state\n this.forceOpen.value = false;\n\n this.destroyCurrentView();\n this.currentAttributes = {};\n\n this.cdr.markForCheck();\n }\n\n /**\n * Select which view should be shown initially\n */\n private selectInitialView(attrs: Record<string, unknown>, isForceOpen: boolean): string | null {\n const config = this.config;\n\n // If force-opening, find view with showOnForceOpen\n if (isForceOpen) {\n const forceOpenView = config.views.find((v) => v.showOnForceOpen);\n if (forceOpenView) return forceOpenView.id;\n }\n\n // Find first view that matches showWhen condition\n for (const view of config.views) {\n if (view.showWhen && view.showWhen(attrs)) {\n return view.id;\n }\n }\n\n // Fall back to default view\n const defaultView = config.views.find((v) => v.isDefault);\n if (defaultView) return defaultView.id;\n\n // If no default, use first view\n return config.views[0]?.id || null;\n }\n\n /**\n * Show a specific view by ID\n */\n private showView(viewId: string): void {\n // If already showing this view, do nothing\n if (this.currentViewId === viewId && this.currentViewRef) {\n return;\n }\n\n // Find view config\n const viewConfig = this.findViewConfig(viewId);\n if (!viewConfig) {\n console.error(`[BubbleMenuMultiView] View not found: ${viewId}`);\n return;\n }\n\n // Destroy current view if exists\n if (this.currentViewRef) {\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n }\n\n // Create new view\n this.currentViewRef = this.createView(viewConfig);\n this.currentViewId = viewId;\n\n // Activate new view\n this.activateView(this.currentViewRef);\n\n // Trigger change detection for the child component to render immediately\n // (the view is created imperatively, so it is outside Angular's normal CD pass)\n this.cdr.markForCheck();\n\n // Mark bubble as visible for transition handling\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement && this.config.target?.requireFocus) {\n // Use requestAnimationFrame to ensure the DOM is updated first\n requestAnimationFrame(() => {\n bubbleElement.setAttribute('data-visible', 'true');\n // Re-setup focus trap after view is created (focusable elements may have changed)\n // this.focusTrap.reattach(bubbleElement, true);\n });\n }\n }\n\n /**\n * Create a view component\n */\n private createView(viewConfig: BubbleMenuViewConfig): ComponentRef<BubbleMenuViewContent> {\n if (!this.viewContainer) {\n throw new Error('[BubbleMenuMultiView] View container not found');\n }\n\n // Clear container\n this.viewContainer.clear();\n\n // Create component\n const componentRef = this.viewContainer.createComponent(viewConfig.component);\n\n // Inject dependencies\n const instance = componentRef.instance;\n instance.editor = this.editor;\n instance.viewId = viewConfig.id;\n instance.navigateTo = this.handleNavigateTo.bind(this);\n instance.goBack = this.handleGoBack.bind(this);\n instance.close = this.hideBubble.bind(this);\n\n return componentRef;\n }\n\n /**\n * Activate a view (call onActivate)\n */\n private activateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onActivate) return;\n componentRef.instance.onActivate(this.currentAttributes);\n }\n\n /**\n * Deactivate a view (call onDeactivate)\n */\n private deactivateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onDeactivate) return;\n componentRef.instance.onDeactivate();\n }\n\n /**\n * Destroy current view\n */\n private destroyCurrentView(): void {\n if (!this.currentViewRef) return;\n\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n this.currentViewId = null;\n }\n\n /**\n * Handle navigation request from view\n */\n private handleNavigateTo(viewId: string): void {\n // Validate view exists\n if (!this.findViewConfig(viewId)) {\n console.error(`[BubbleMenuMultiView] Cannot navigate to non-existent view: ${viewId}`);\n return;\n }\n\n // Navigate to view\n this.showView(viewId);\n }\n\n /**\n * Handle go back request from view\n */\n private handleGoBack(viewId?: string): void {\n // Navigate to specific view\n if (viewId) {\n this.handleNavigateTo(viewId);\n return;\n }\n\n // Close bubble if no target specified\n this.hideBubble();\n }\n\n /**\n * Find view config by ID\n */\n private findViewConfig(viewId: string): BubbleMenuViewConfig | null {\n return this.config.views.find((v) => v.id === viewId) || null;\n }\n\n signalFor(key: string): { value: boolean } {\n let s = this.keyToSignal.get(key);\n if (!s) {\n s = { value: false };\n this.keyToSignal.set(key, s);\n }\n return s;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n EnvironmentInjector,\n inject,\n Input,\n OnDestroy,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { Editor } from '@tiptap/core';\nimport {\n BubbleMenuViewConfig,\n BubbleMenuViewContent,\n ToolbarBubbleMenuConfig,\n} from '../../core/bubble-menu/bubble-menu.type';\nimport { EventManager } from '../../core/event-manager';\nimport { FocusTrapService } from '../../core/focus-trap.service';\n\n/**\n * A bubble menu wrapper specifically for toolbar buttons\n * Unlike the regular bubble menu, this one is positioned relative to toolbar buttons\n * and doesn't depend on text selection in the editor\n */\n@Component({\n selector: 'document-engine-toolbar-bubble-menu',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div\n #bubbleElement\n class=\"toolbar-bubble-menu\"\n [class.toolbar-bubble-menu--hidden]=\"!isVisible\"\n [style.width]=\"config.width || 'auto'\"\n [style.maxWidth]=\"config.maxWidth || '320px'\"\n >\n <ng-container #viewContainer></ng-container>\n </div>\n `,\n // The panel's surface ships as library CSS (see the .scss), not as Tailwind\n // utilities in the template: utilities like `bg-card` / `shadow-elevation-2`\n // only exist if the HOST app's tailwind.config.js defines those theme keys.\n styleUrls: ['./toolbar-bubble-menu.wrapper.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolbarBubbleMenuComponent implements AfterViewInit, OnDestroy {\n @Input() editor!: Editor;\n @Input() config!: ToolbarBubbleMenuConfig;\n\n private cdr = inject(ChangeDetectorRef);\n private eventManager = inject(EventManager);\n private focusTrap = inject(FocusTrapService);\n\n @ViewChild('bubbleElement') private bubbleElement!: ElementRef<HTMLElement>;\n @ViewChild('viewContainer', { read: ViewContainerRef }) private viewContainer!: ViewContainerRef;\n\n private currentViewRef: ComponentRef<BubbleMenuViewContent> | null = null;\n private currentViewId: string | null = null;\n private currentAttributes: Record<string, unknown> = {};\n private cleanupAutoUpdate?: () => void;\n private positionTimeout?: ReturnType<typeof setTimeout>;\n\n isVisible = false;\n\n ngAfterViewInit(): void {\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n this.focusTrap.attach(bubbleElement, true);\n }\n }\n\n ngOnDestroy(): void {\n this.destroyCurrentView();\n this.hideBubble();\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n this.focusTrap.detach(bubbleElement);\n }\n }\n\n isActive(type: 'text' | 'fill'): boolean {\n return this.isVisible && this.currentAttributes['type'] === type;\n }\n\n toggleBubble(targetElement: HTMLElement, attrs: Record<string, unknown> = {}, viewId?: string): void {\n if (this.isVisible) {\n this.hideBubble();\n return;\n }\n\n this.showBubble(targetElement, attrs, viewId);\n }\n\n /**\n * Show the bubble menu positioned relative to a target element (toolbar button)\n */\n showBubble(targetElement: HTMLElement, attrs: Record<string, unknown> = {}, viewId?: string): void {\n this.currentAttributes = attrs;\n\n this.isVisible = true;\n\n // Create and show the view\n const initialView = this.selectInitialView(attrs, viewId);\n if (!initialView) {\n console.warn('[ToolbarBubbleMenu] No suitable view to show');\n return;\n }\n this.showView(initialView);\n\n // Position the bubble relative to the target element\n // TODO: It make the bubble jump when the bubble is opened\n clearTimeout(this.positionTimeout);\n this.positionTimeout = setTimeout(() => this.positionBubble(targetElement), 0);\n\n // Attach outside click/escape listeners using the bubble element, not the toolbar button\n const bubbleEl = this.bubbleElement?.nativeElement;\n if (bubbleEl) {\n this.eventManager.attach(this.config.pluginKey, bubbleEl, this.hideBubble.bind(this), targetElement);\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Hide the bubble menu\n */\n hideBubble(): void {\n this.isVisible = false;\n // Cancel a positioning pass that has not run yet. `showBubble` defers it by a\n // tick, so a show-then-immediately-hide (or a teardown) would otherwise let it\n // fire afterwards and register a fresh `autoUpdate` — scroll/resize listeners\n // plus a Resize and an Intersection observer — on a hidden or detached\n // element, with the handle for disposing it already thrown away.\n clearTimeout(this.positionTimeout);\n this.positionTimeout = undefined;\n this.cleanupAutoUpdate?.();\n this.cleanupAutoUpdate = undefined;\n this.eventManager.detach(this.config.pluginKey);\n this.destroyCurrentView();\n this.cdr.markForCheck();\n }\n\n private selectInitialView(attrs: Record<string, unknown>, requestedViewId?: string): string | null {\n const config = this.config;\n\n if (requestedViewId && this.findViewConfig(requestedViewId)) return requestedViewId;\n\n // Find first view that matches showWhen condition\n for (const v of config.views) {\n if (!v.showWhen || v.showWhen(attrs)) return v.id;\n }\n\n // Fall back to default view\n const defaultView = config.views.find((v) => v.isDefault);\n if (defaultView) return defaultView.id;\n\n // If no default, use first view\n return config.views[0]?.id || null;\n }\n\n private showView(viewId: string): void {\n // If already showing this view, do nothing\n if (this.currentViewId === viewId && this.currentViewRef) {\n return;\n }\n\n // Find view config\n const viewConfig = this.findViewConfig(viewId);\n if (!viewConfig) {\n console.error(`[ToolbarBubbleMenu] View not found: ${viewId}`);\n return;\n }\n\n // Destroy current view if exists\n if (this.currentViewRef) {\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n }\n\n this.currentViewRef = this.createView(viewConfig);\n this.currentViewId = viewId;\n\n // Activate new view\n this.activateView(this.currentViewRef);\n\n // Re-setup focus trap after view is created (focusable elements may have changed)\n const bubbleElement = this.bubbleElement?.nativeElement;\n if (bubbleElement) {\n setTimeout(() => {\n this.focusTrap.reattach(bubbleElement, true);\n }, 0);\n }\n }\n\n private createView(viewConfig: BubbleMenuViewConfig): ComponentRef<BubbleMenuViewContent> {\n if (!this.viewContainer) {\n throw new Error('[ToolbarBubbleMenu] View container not found');\n }\n\n // Clear container\n this.viewContainer.clear();\n\n // Create component with proper environment injector (standalone support)\n const envInjector = this.viewContainer.injector.get(EnvironmentInjector);\n const componentRef = this.viewContainer.createComponent(viewConfig.component, {\n environmentInjector: envInjector,\n });\n\n // Inject dependencies\n const instance = componentRef.instance;\n instance.editor = this.editor;\n instance.viewId = viewConfig.id;\n instance.navigateTo = this.handleNavigateTo.bind(this);\n instance.goBack = this.handleGoBack.bind(this);\n instance.close = this.hideBubble.bind(this);\n\n return componentRef;\n }\n\n private activateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onActivate) return;\n componentRef.instance.onActivate(this.currentAttributes);\n }\n\n private deactivateView(componentRef: ComponentRef<BubbleMenuViewContent>): void {\n if (!componentRef.instance.onDeactivate) return;\n componentRef.instance.onDeactivate();\n }\n\n private destroyCurrentView(): void {\n if (!this.currentViewRef) return;\n\n this.deactivateView(this.currentViewRef);\n this.currentViewRef.destroy();\n this.currentViewRef = null;\n this.currentViewId = null;\n }\n\n private handleNavigateTo(viewId: string): void {\n if (!this.findViewConfig(viewId)) {\n console.error(`[ToolbarBubbleMenu] Cannot navigate to non-existent view: ${viewId}`);\n return;\n }\n this.showView(viewId);\n }\n\n private handleGoBack(viewId?: string): void {\n if (viewId) {\n this.handleNavigateTo(viewId);\n return;\n }\n this.hideBubble();\n }\n\n private findViewConfig(viewId: string): BubbleMenuViewConfig | null {\n return this.config.views.find((v) => v.id === viewId) || null;\n }\n\n /**\n * Anchor the bubble to its trigger with floating-ui, matching\n * `PopoverDirective`.\n *\n * The hand-rolled version this replaces measured the trigger exactly once, so\n * scrolling left the panel welded to the viewport while its target slid away.\n * It also had no third case: a panel that fit neither below nor above got a\n * negative `top`, putting its own header off the top edge of the screen.\n * `flip` handles the second placement and `shift` clamps the panel into the\n * viewport instead, so there is no unhandled case left.\n *\n * `strategy: 'fixed'` matches the `position: fixed` written below — asking for\n * the default `'absolute'` coordinates would offset the panel by the page's\n * scroll amount.\n */\n private positionBubble(targetElement: HTMLElement): void {\n const bubble = this.bubbleElement?.nativeElement;\n if (!bubble) return;\n\n bubble.style.position = 'fixed';\n\n this.cleanupAutoUpdate?.();\n this.cleanupAutoUpdate = autoUpdate(targetElement, bubble, () => {\n computePosition(targetElement, bubble, {\n strategy: 'fixed',\n placement: 'bottom',\n middleware: [offset(8), flip({ padding: 8 }), shift({ padding: 8 })],\n })\n .then(({ x, y }) => {\n Object.assign(bubble.style, { left: `${x}px`, top: `${y}px` });\n })\n .catch((error) => {\n console.error('[ToolbarBubbleMenu] Error computing position', error);\n });\n });\n }\n}\n","import { EventEmitter, Injectable, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n/**\n * Service to handle toolbar action emissions\n */\n@Injectable({ providedIn: 'root' })\nexport class ToolbarService implements OnDestroy {\n // Subject để emit toolbar actions\n private readonly actionSubject = new Subject<{ actionName: string; value?: unknown }>();\n readonly action$ = this.actionSubject.asObservable();\n\n // EventEmitter for template binding\n readonly action = new EventEmitter<string>();\n\n /**\n * Emit an action\n */\n emit(actionName: string, value?: unknown): void {\n this.actionSubject.next({ actionName, value });\n this.action.emit(actionName);\n }\n\n ngOnDestroy(): void {\n this.actionSubject.complete();\n }\n}\n","import { RestrictedEditingOptions } from '@phuong-tran-redoc/document-engine-core';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { Editor } from '@tiptap/core';\n\nexport interface ToolbarState {\n isReadOnly: boolean;\n\n // History\n canUndo: boolean;\n canRedo: boolean;\n\n // Format Utilities\n canResetFormat: boolean;\n\n // Text Styles - Basic Inline\n canToggleBold: boolean;\n canToggleItalic: boolean;\n canToggleUnderline: boolean;\n canToggleStrike: boolean;\n\n // Text Styles - Advanced Inline\n canToggleSubscript: boolean;\n canToggleSuperscript: boolean;\n canToggleCode: boolean;\n canToggleLink: boolean;\n\n // Alignment & Layout\n canDecreaseIndent: boolean;\n canIncreaseIndent: boolean;\n canToggleBulletList: boolean;\n\n // Block Types\n canToggleBlockquote: boolean;\n\n // Insert Object\n canInsertPageBreak: boolean;\n\n // Business Features\n canToggleEditableRegion: boolean;\n\n // Actions\n canClearContent: boolean;\n}\n\nexport const DEFAULT_TOOLBAR_STATE: ToolbarState = {\n isReadOnly: true,\n canUndo: false,\n canRedo: false,\n canResetFormat: false,\n canToggleBold: false,\n canToggleItalic: false,\n canToggleUnderline: false,\n canToggleStrike: false,\n canToggleSubscript: false,\n canToggleSuperscript: false,\n canToggleCode: false,\n canToggleLink: false,\n canDecreaseIndent: false,\n canIncreaseIndent: false,\n canToggleBulletList: false,\n canToggleBlockquote: false,\n canInsertPageBreak: false,\n canToggleEditableRegion: false,\n canClearContent: false,\n};\n\nfunction safeCanCheck(editor: Editor, commandFn: () => boolean): boolean {\n try {\n return commandFn();\n } catch {\n return false;\n }\n}\n\nexport function buildToolbarState(editor: Editor, config?: Partial<DocumentEngineConfig>): ToolbarState {\n return {\n isReadOnly:\n !config?.editable ||\n (!!config.restrictedEditing &&\n (config?.restrictedEditing as RestrictedEditingOptions).initialMode === 'restricted'),\n\n // History\n canUndo: safeCanCheck(editor, () => editor.can().chain().focus().undo().run()),\n canRedo: safeCanCheck(editor, () => editor.can().chain().focus().redo().run()),\n\n // Format Utilities\n canResetFormat: safeCanCheck(editor, () => editor.can().chain().focus().resetFormat().run()),\n\n // Text Styles - Basic Inline\n canToggleBold: safeCanCheck(editor, () => editor.can().chain().focus().toggleBold().run()),\n canToggleItalic: safeCanCheck(editor, () => editor.can().chain().focus().toggleItalic().run()),\n canToggleUnderline: safeCanCheck(editor, () => editor.can().chain().focus().toggleUnderline().run()),\n canToggleStrike: safeCanCheck(editor, () => editor.can().chain().focus().toggleStrike().run()),\n\n // Text Styles - Advanced Inline\n canToggleSubscript: safeCanCheck(editor, () => editor.can().chain().focus().toggleSubscript().run()),\n canToggleSuperscript: safeCanCheck(editor, () => editor.can().chain().focus().toggleSuperscript().run()),\n canToggleCode: safeCanCheck(editor, () => editor.can().chain().focus().toggleCode().run()),\n canToggleLink: safeCanCheck(editor, () => editor.can().chain().focus().toggleLink().run()),\n\n // Alignment & Layout\n canDecreaseIndent: safeCanCheck(editor, () => editor.can().chain().focus().decreaseIndent().run()),\n canIncreaseIndent: safeCanCheck(editor, () => editor.can().chain().focus().increaseIndent().run()),\n canToggleBulletList: safeCanCheck(editor, () => editor.can().chain().focus().toggleBulletList().run()),\n\n // Block Types\n canToggleBlockquote: safeCanCheck(editor, () => editor.can().chain().focus().toggleBlockquote().run()),\n\n // Insert Object\n canInsertPageBreak: safeCanCheck(editor, () => editor.can().chain().focus().insertPageBreak().run()),\n\n // Business Features\n canToggleEditableRegion: safeCanCheck(editor, () => editor.can().chain().focus().toggleEditableRegion().run()),\n\n // Actions\n canClearContent: safeCanCheck(editor, () => editor.can().chain().focus().clear().run()),\n };\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n inject,\n} from '@angular/core';\nimport { ListStyleType, TextCaseType } from '@phuong-tran-redoc/document-engine-core';\nimport { Editor } from '@tiptap/core';\nimport { throttle } from 'lodash-es';\nimport { ColorBubbleConfig } from '../../configs/color.config';\nimport { DynamicFieldsBubbleConfig } from '../../configs/dynamic-fields.config';\nimport { ImageBubbleConfig } from '../../configs/image.config';\nimport { LinkBubbleConfig } from '../../configs/link.config';\nimport { SpecialCharactersBubbleConfig } from '../../configs/special-characters.config';\nimport { TableBubbleConfig, TableCreateBubbleConfig } from '../../configs/table.config';\nimport { TemplateBubbleConfig } from '../../configs/template.config';\nimport {\n FONT_SIZE_OPTIONS,\n HeadingOption,\n LINE_HEIGHT_OPTIONS,\n TEXT_ALIGN_OPTIONS,\n TEXT_CASE_OPTIONS,\n buildHeadingOptions,\n} from '../../constants/text-style.constant';\nimport { LIST_STYLE_OPTIONS } from '../../constants/list.constant';\nimport { DocumentEngineConfig } from '../../core/kit/kit.type';\nimport { EditorBubbleMenuConfig, ToolbarBubbleMenuConfig } from '../../core/bubble-menu/bubble-menu.type';\nimport { EditorCapabilities } from '../../core/capability.model';\nimport { HeadingLevel } from '../../types/heading.type';\nimport { ToolbarButton } from '../../types/button.type';\nimport { EditorBubbleMenuComponent } from '../../views/wrapper/editor-bubble-menu.wrapper';\nimport { ToolbarBubbleMenuComponent } from '../../views/wrapper/toolbar-bubble-menu.wrapper';\nimport { ButtonDirective } from '../button';\nimport { IconComponent } from '../icon';\nimport { SelectLabelDirective } from '../select/select-label.directive';\nimport { SelectOptionDirective } from '../select/select-option.directive';\nimport { SelectComponent } from '../select/select.component';\nimport { ToolbarService } from './toolbar.service';\nimport { DEFAULT_TOOLBAR_STATE, ToolbarState, buildToolbarState } from './toolbar.state';\n\n/**\n * Toolbar component for document editor\n * Provides toolbar controls for editor actions\n */\n@Component({\n selector: 'document-engine-toolbar',\n standalone: true,\n imports: [\n CommonModule,\n IconComponent,\n ButtonDirective,\n SelectComponent,\n SelectLabelDirective,\n SelectOptionDirective,\n ToolbarBubbleMenuComponent,\n EditorBubbleMenuComponent,\n ],\n templateUrl: './toolbar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n `\n :host {\n position: sticky;\n top: 0;\n z-index: 20;\n }\n `,\n ],\n})\nexport class ToolbarComponent implements OnInit, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly ngZone = inject(NgZone);\n private readonly toolbarService = inject(ToolbarService);\n\n @Input() editor!: Editor;\n @Input() capabilities!: EditorCapabilities;\n @Input() config?: Partial<DocumentEngineConfig>; // Only for dynamicFieldsCategories and templates\n\n @Output() readonly action = this.toolbarService.action;\n\n activeFontSize: string | null = null;\n activeLineHeight: string | null = null;\n activeHeading: number | null = null;\n activeTextAlign: string | null = null;\n activeTextAlignIcon = 'format_align_left';\n\n toolbarState: ToolbarState = DEFAULT_TOOLBAR_STATE;\n\n readonly fontSizeOptions = FONT_SIZE_OPTIONS;\n readonly lineHeightOptions = LINE_HEIGHT_OPTIONS;\n readonly textCaseOptions = TEXT_CASE_OPTIONS as { value: TextCaseType; label: string }[];\n // Derived from the editor's configured heading levels in ngOnInit so the\n // block-type dropdown lists exactly the levels the config allows (no dead\n // entry, no unreachable level). Seeded with the default set for first paint.\n headingOptions: HeadingOption[] = buildHeadingOptions();\n readonly textAlignOptions = TEXT_ALIGN_OPTIONS;\n readonly listStyleOptions = LIST_STYLE_OPTIONS as { value: ListStyleType; label: string; example: string }[];\n\n @ViewChild('colorBubbleMenu') private colorBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('linkBubbleWrapper') private linkBubbleWrapper!: EditorBubbleMenuComponent;\n @ViewChild('imageBubbleMenu') private imageBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('specialCharsBubbleMenu') private specialCharsBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('dynamicFieldsBubbleMenu') private dynamicFieldsBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('templateBubbleMenu') private templateBubbleMenu!: ToolbarBubbleMenuComponent;\n @ViewChild('tableCreateBubbleMenu') private tableCreateBubbleMenu!: ToolbarBubbleMenuComponent;\n\n readonly colorBubbleConfig: ToolbarBubbleMenuConfig = ColorBubbleConfig;\n readonly linkBubbleConfig: EditorBubbleMenuConfig = LinkBubbleConfig;\n readonly tableBubbleConfig: EditorBubbleMenuConfig = TableBubbleConfig;\n readonly imageBubbleConfig: ToolbarBubbleMenuConfig = ImageBubbleConfig;\n readonly specialCharsBubbleConfig: ToolbarBubbleMenuConfig = SpecialCharactersBubbleConfig;\n readonly dynamicFieldsBubbleConfig: ToolbarBubbleMenuConfig = DynamicFieldsBubbleConfig;\n readonly templateBubbleConfig: ToolbarBubbleMenuConfig = TemplateBubbleConfig;\n readonly tableCreateBubbleConfig: ToolbarBubbleMenuConfig = TableCreateBubbleConfig;\n\n private throttleUpdateToolbarState = throttle(() => this.updateToolbarState(), 150, {\n leading: true,\n trailing: false,\n });\n\n private updateToolbarState = (): void => {\n this.ngZone.run(() => {\n if (!this.editor) return;\n\n // Update toolbar state (can* properties)\n this.toolbarState = buildToolbarState(this.editor, this.config);\n\n // Update active font size and line height\n const attrs = this.editor.getAttributes('textStyle');\n const size = (attrs?.['fontSize'] as string | undefined) || null;\n this.activeFontSize = size;\n\n const lineHeight = (attrs?.['lineHeight'] as string | undefined) || null;\n this.activeLineHeight = lineHeight;\n\n // Update active heading\n let headingLevel: number | null = null;\n for (const option of this.headingOptions) {\n if (this.editor.isActive('heading', { level: option.value })) {\n headingLevel = option.value;\n break;\n }\n }\n this.activeHeading = headingLevel;\n\n // Update active text align\n const alignOption = this.textAlignOptions.find((option) => this.editor.isActive({ textAlign: option.value }));\n this.activeTextAlign = alignOption?.value || null;\n this.activeTextAlignIcon = alignOption?.icon || 'format_align_left';\n\n this.cdr.markForCheck();\n });\n };\n\n ngOnInit(): void {\n // Build the block-type dropdown from the configured heading levels (semantic\n // mode = 2/3/4, etc.) rather than a fixed 1/2/3 set. Done before the first\n // updateToolbarState() so its heading-active scan iterates the real options.\n this.headingOptions = buildHeadingOptions(this.resolveHeadingLevels());\n\n // Subscribe to selectionUpdate to keep toolbar state in sync when cursor/selection changes\n this.editor.on('update', this.updateToolbarState);\n this.editor.on('transaction', this.throttleUpdateToolbarState);\n\n // Initialize toolbar state once\n this.updateToolbarState();\n }\n\n ngOnDestroy(): void {\n this.editor.off('update', this.updateToolbarState);\n this.editor.off('transaction', this.throttleUpdateToolbarState);\n\n if (this.throttleUpdateToolbarState) {\n this.throttleUpdateToolbarState.cancel();\n }\n\n this.toolbarService.ngOnDestroy();\n this.editor.destroy();\n }\n\n /**\n * Read the configured heading levels off `config.heading`. It may be a boolean\n * (`true` = default levels, handled by buildHeadingOptions' fallback) or a\n * `Partial<HeadingOptions>` carrying a `levels` array. Returns undefined when no\n * explicit levels are set so the caller falls back to the default set.\n */\n private resolveHeadingLevels(): readonly number[] | undefined {\n const heading = this.config?.heading;\n if (heading && typeof heading === 'object' && Array.isArray(heading.levels)) {\n return heading.levels;\n }\n return undefined;\n }\n\n runAndEmit(actionName: string, chain: () => void): void {\n chain();\n this.toolbarService.emit(actionName);\n }\n\n setFontSize(size: string | null): void {\n if (size) {\n this.editor.chain().focus().setFontSize(size).run();\n } else {\n this.editor.chain().focus().unsetFontSize().run();\n }\n this.toolbarService.emit('setFontSize', size);\n }\n\n setLineHeight(lineHeight: string | null): void {\n if (lineHeight) {\n this.editor.chain().focus().setLineHeight(lineHeight).run();\n } else {\n this.editor.chain().focus().unsetLineHeight().run();\n }\n this.toolbarService.emit('setLineHeight', lineHeight);\n }\n\n setHeading(level: string | null): void {\n if (!level) {\n this.editor.chain().focus().removeHeading().run();\n } else {\n const levelNumber = parseInt(level, 10) as HeadingLevel;\n this.editor.chain().focus().toggleHeading({ level: levelNumber }).run();\n }\n this.toolbarService.emit('setHeading', level);\n }\n\n setTextAlign(align: string | null): void {\n if (align) {\n this.editor\n .chain()\n .focus()\n .setTextAlign(align as 'left' | 'center' | 'right' | 'justify')\n .run();\n } else {\n // Reset to default (left)\n this.editor.chain().focus().setTextAlign('left').run();\n }\n this.toolbarService.emit('setTextAlign', align);\n }\n\n setListStyle(listStyleType: ListStyleType): void {\n if (this.editor.isActive('customOrderedList')) {\n // If there's an active ordered list, update its style\n this.editor.chain().focus().setListStyle(listStyleType).run();\n } else {\n // If no active list, create a new one with the selected style\n this.editor.chain().focus().toggleOrderedList().run();\n this.editor.chain().focus().setListStyle(listStyleType).run();\n }\n this.toolbarService.emit('setListStyle', listStyleType);\n }\n\n openColorBubble(event: MouseEvent, type: 'text' | 'fill'): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.colorBubbleMenu?.toggleBubble(targetElement, { type });\n this.toolbarService.emit('openColorBubble', { type });\n }\n\n toggleLink(): void {\n if (this.editor.isActive('link')) {\n // If link is active, remove it\n this.editor.chain().focus().unsetLink().run();\n } else {\n // If no link, open the bubble menu\n this.linkBubbleWrapper?.showBubble();\n }\n this.toolbarService.emit('toggleLink');\n }\n\n insertImage(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.imageBubbleMenu?.toggleBubble(targetElement);\n this.toolbarService.emit('insertImage');\n }\n\n openSpecialCharsBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.specialCharsBubbleMenu?.toggleBubble(targetElement);\n this.toolbarService.emit('openSpecialCharsBubble');\n }\n\n openDynamicFieldsBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.dynamicFieldsBubbleMenu?.toggleBubble(targetElement, {\n categories: this.config?.dynamicFieldsCategories || [],\n });\n this.toolbarService.emit('openDynamicFieldsBubble');\n }\n\n openTemplateBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.templateBubbleMenu?.toggleBubble(targetElement, {\n templates: this.config?.templates || [],\n });\n this.toolbarService.emit('openTemplateBubble');\n }\n\n openCreateTableBubble(event: MouseEvent): void {\n const targetElement = (event.currentTarget || event.target) as HTMLElement;\n this.tableCreateBubbleMenu?.toggleBubble(targetElement);\n this.toolbarService.emit('openCreateTableBubble');\n }\n\n // downloadAsMarkdown(filename?: string): void {\n // const fileName = filename ? `${filename}.md` : 'export.md';\n\n // const markdown = renderToMarkdown({\n // content: this.editor.getJSON(),\n // extensions: this.editor.options.extensions,\n // options: {\n // nodeMapping: {\n // pageBreak: () => 'Page break',\n // },\n // },\n // });\n\n // const blob = new Blob([markdown], { type: 'text/markdown' });\n // const url = URL.createObjectURL(blob);\n // const a = document.createElement('a');\n // a.href = url;\n // a.download = fileName;\n // a.click();\n // URL.revokeObjectURL(url);\n // }\n\n trackByValue(index: number, item: { value: unknown }): unknown {\n return item.value;\n }\n\n trackByIndex(index: number): number {\n return index;\n }\n\n get customToolbarButtons(): ToolbarButton[] {\n return this.config?.customToolbarButtons || [];\n }\n\n handleCustomIconButton(button: ToolbarButton): void {\n if (button.type === 'icon-button') {\n button.callback();\n this.toolbarService.emit('customIconButton', { label: button.label, icon: button.icon });\n }\n }\n\n handleCustomSelectButton(button: ToolbarButton, value: string): void {\n if (button.type === 'select-button') {\n button.callback();\n this.toolbarService.emit('customSelectButton', { label: button.label, value });\n }\n }\n\n printValue(): void {\n console.log('html', this.editor.getHTML());\n console.log('json', this.editor.getJSON());\n console.log('State', this.editor.state);\n this.toolbarService.emit('printValue');\n }\n}\n","<div class=\"document-engine-document-editor__toolbar\">\n <div class=\"document-engine-document-editor__toolbar-content\">\n <div class=\"document-engine-document-editor__toolbar-left\">\n <!-- History: Undo/Redo -->\n <div *ngIf=\"capabilities.hasHistory\" class=\"document-engine-document-editor__toolbar-group\" data-group=\"history\">\n <button\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canUndo\"\n (click)=\"runAndEmit('undo', editor.chain().focus().undo().run)\"\n title=\"Undo (Ctrl+Z)\"\n >\n <document-engine-icon name=\"undo\"></document-engine-icon>\n </button>\n\n <button\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canRedo\"\n (click)=\"runAndEmit('redo', editor.chain().focus().redo().run)\"\n title=\"Redo\"\n >\n <document-engine-icon name=\"redo\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Text Formatting: Font Size, Line Height, Text Case, Heading -->\n <div\n *ngIf=\"capabilities.hasTextProperty\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"text-property\"\n >\n <!-- Font Size -->\n <document-engine-select\n *ngIf=\"capabilities.hasFontSize\"\n [value]=\"activeFontSize\"\n placeholder=\"Font Size\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Font Size\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"format_size\"></document-engine-icon>\n\n <button documentEngineSelectOption [value]=\"null\">Default</button>\n\n <button\n *ngFor=\"let option of fontSizeOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"setFontSize(option.value)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n\n <!-- Line Height -->\n <document-engine-select\n *ngIf=\"capabilities.hasLineHeight\"\n [value]=\"activeLineHeight\"\n placeholder=\"Line Height\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Line Height\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"format_line_spacing\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of lineHeightOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"setLineHeight(option.value)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n\n <!-- Text Case -->\n <document-engine-select\n *ngIf=\"capabilities.hasTextCase\"\n placeholder=\"Text Case\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Text Case\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"match_case\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of textCaseOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"runAndEmit('setTextCase', editor.chain().focus().textCase(option.value).run)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n\n <!-- Heading -->\n <document-engine-select\n *ngIf=\"capabilities.hasHeading\"\n [value]=\"activeHeading?.toString() || null\"\n placeholder=\"Normal text\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Heading\"\n >\n <button\n *ngFor=\"let option of headingOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value?.toString() || null\"\n [class]=\"option.class\"\n (click)=\"setHeading(option.value?.toString() || null)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n </div>\n\n <!-- Format Utilities: Reset Formatting & Colors -->\n <div\n *ngIf=\"capabilities.hasFormatUtilities\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"format-utilities\"\n >\n <!-- Reset Formatting -->\n <button\n *ngIf=\"capabilities.hasResetFormat\"\n documentEngineButton\n size=\"icon\"\n (click)=\"runAndEmit('resetFormat', editor.chain().focus().resetFormat().run)\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canResetFormat\"\n title=\"Clear Formatting\"\n >\n <document-engine-icon name=\"format_clear\"></document-engine-icon>\n </button>\n\n <!-- Colors: Text/Background -->\n <button\n *ngIf=\"capabilities.hasColors\"\n documentEngineButton\n size=\"icon\"\n title=\"Text Color\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openColorBubble($event, 'text')\"\n >\n <document-engine-icon name=\"format_color_text\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasColors\"\n documentEngineButton\n size=\"icon\"\n title=\"Background Color\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openColorBubble($event, 'fill')\"\n >\n <document-engine-icon name=\"format_color_fill\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Text Styles: Bold/Italic/Underline/Strike -->\n <div\n *ngIf=\"capabilities.basicInline\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"basic-inline\"\n >\n <button\n *ngIf=\"capabilities.hasBold\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleBold\"\n (click)=\"runAndEmit('toggleBold', editor.chain().focus().toggleBold().run)\"\n [class.active]=\"editor.isActive('bold')\"\n title=\"Bold\"\n >\n <document-engine-icon name=\"format_bold\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasItalic\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleItalic\"\n (click)=\"runAndEmit('toggleItalic', editor.chain().focus().toggleItalic().run)\"\n [class.active]=\"editor.isActive('italic')\"\n title=\"Italic\"\n >\n <document-engine-icon name=\"format_italic\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasUnderline\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleUnderline\"\n (click)=\"runAndEmit('toggleUnderline', editor.chain().focus().toggleUnderline().run)\"\n [class.active]=\"editor.isActive('underline')\"\n title=\"Underline\"\n >\n <document-engine-icon name=\"format_underline\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasStrike\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleStrike\"\n (click)=\"runAndEmit('toggleStrike', editor.chain().focus().toggleStrike().run)\"\n [class.active]=\"editor.isActive('strike')\"\n title=\"Strikethrough\"\n >\n <document-engine-icon name=\"format_strikethrough\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Text Styles: Sub/Super/Code/Link -->\n <div\n *ngIf=\"capabilities.advancedInline\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"advanced-inline\"\n >\n <button\n *ngIf=\"capabilities.hasSubscript\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleSubscript\"\n (click)=\"runAndEmit('toggleSubscript', editor.chain().focus().toggleSubscript().run)\"\n [class.active]=\"editor.isActive('subscript')\"\n title=\"Subscript\"\n >\n <document-engine-icon name=\"subscript\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasSuperscript\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleSuperscript\"\n (click)=\"runAndEmit('toggleSuperscript', editor.chain().focus().toggleSuperscript().run)\"\n [class.active]=\"editor.isActive('superscript')\"\n title=\"Superscript\"\n >\n <document-engine-icon name=\"superscript\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasCode\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleCode\"\n (click)=\"runAndEmit('toggleCode', editor.chain().focus().toggleCode().run)\"\n [class.active]=\"editor.isActive('code')\"\n title=\"Code\"\n >\n <document-engine-icon name=\"code\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasLink\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleLink\"\n (click)=\"toggleLink()\"\n [class.active]=\"editor.isActive('link')\"\n [title]=\"editor.isActive('link') ? 'Unlink' : 'Link'\"\n >\n <document-engine-icon [name]=\"editor.isActive('link') ? 'link_off' : 'link'\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Alignment & Layout: Text Align, Indent -->\n <div\n *ngIf=\"capabilities.hasAlignmentLayout\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"alignment-layout\"\n >\n <!-- Text Alignment -->\n <document-engine-select\n *ngIf=\"capabilities.hasTextAlign\"\n [value]=\"activeTextAlign\"\n (valueChange)=\"setTextAlign($event)\"\n placeholder=\"Text Align\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Text Align\"\n >\n <document-engine-icon documentEngineSelectLabel [name]=\"activeTextAlignIcon\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of textAlignOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n >\n <document-engine-icon [name]=\"option.icon\"></document-engine-icon>\n <span>{{ option.label }}</span>\n </button>\n </document-engine-select>\n\n <!-- Indent -->\n <button\n *ngIf=\"capabilities.hasIndent\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canDecreaseIndent\"\n (click)=\"runAndEmit('decreaseIndent', editor.chain().focus().decreaseIndent().run)\"\n title=\"Decrease Indent\"\n >\n <document-engine-icon name=\"format_indent_decrease\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasIndent\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canIncreaseIndent\"\n (click)=\"runAndEmit('increaseIndent', editor.chain().focus().increaseIndent().run)\"\n title=\"Increase Indent\"\n >\n <document-engine-icon name=\"format_indent_increase\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Lists -->\n <div\n *ngIf=\"capabilities.hasAlignmentLayout\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"alignment-layout\"\n >\n <!-- Lists: Bullet, Numbered (with style) -->\n <button\n *ngIf=\"capabilities.hasLists\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleBulletList\"\n (click)=\"runAndEmit('toggleBulletList', editor.chain().focus().toggleBulletList().run)\"\n [class.active]=\"editor.isActive('bulletList')\"\n title=\"Bullet List\"\n >\n <document-engine-icon name=\"format_list_bulleted\"></document-engine-icon>\n </button>\n\n <!-- Numbered List with Style -->\n <document-engine-select\n *ngIf=\"capabilities.hasLists\"\n placeholder=\"Numbered List\"\n labelMode=\"static\"\n [value]=\"\n editor.isActive('customOrderedList')\n ? editor.getAttributes('customOrderedList')['data-list-style-type'] || 'decimal'\n : null\n \"\n [disabled]=\"toolbarState.isReadOnly\"\n title=\"Numbered List\"\n >\n <document-engine-icon documentEngineSelectLabel name=\"format_list_numbered\"></document-engine-icon>\n\n <button\n *ngFor=\"let option of listStyleOptions; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"setListStyle(option.value)\"\n [class.active]=\"\n editor.isActive('customOrderedList') &&\n editor.getAttributes('customOrderedList')['data-list-style-type'] === option.value\n \"\n >\n <span>{{ option.example }}</span>\n <span>{{ option.label }}</span>\n </button>\n </document-engine-select>\n </div>\n\n <!-- Block Types: Code Block, Blockquote -->\n <div\n *ngIf=\"capabilities.hasBlockTypes\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"block-types\"\n >\n <!-- Blockquote -->\n <button\n *ngIf=\"capabilities.hasBlockquote\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canToggleBlockquote\"\n (click)=\"runAndEmit('toggleBlockquote', editor.chain().focus().toggleBlockquote().run)\"\n [class.active]=\"editor.isActive('blockquote')\"\n title=\"Quote\"\n >\n <document-engine-icon name=\"format_quote\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Insert Object: Table, Images, Special Chars, Page Break -->\n <div\n *ngIf=\"capabilities.hasInsertObject\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"insert-object\"\n >\n <button\n *ngIf=\"capabilities.hasTable\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openCreateTableBubble($event)\"\n [class.active]=\"editor.isActive('table')\"\n title=\"Table\"\n >\n <document-engine-icon name=\"table_rows\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasImages\"\n documentEngineButton\n size=\"icon\"\n title=\"Insert Image\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"insertImage($event)\"\n >\n <document-engine-icon name=\"photo\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasSpecialChars\"\n documentEngineButton\n size=\"icon\"\n title=\"Special Character\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openSpecialCharsBubble($event)\"\n >\n <document-engine-icon name=\"special_character\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasPageBreak\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canInsertPageBreak\"\n (click)=\"runAndEmit('insertPageBreak', editor.chain().focus().insertPageBreak().run)\"\n [class.active]=\"editor.isActive('pageBreak')\"\n title=\"Insert page break\"\n >\n <document-engine-icon name=\"insert_page_break\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Business Features: Templates, Dynamic Fields, Editable Region -->\n <div\n *ngIf=\"capabilities.hasBusinessFeatures\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"business-features\"\n >\n <button\n *ngIf=\"capabilities.hasDynamicFields\"\n documentEngineButton\n size=\"icon\"\n title=\"Dynamic Field\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openDynamicFieldsBubble($event)\"\n >\n <document-engine-icon name=\"dynamic_form\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasTemplates\"\n documentEngineButton\n size=\"icon\"\n title=\"Template\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"openTemplateBubble($event)\"\n >\n <document-engine-icon name=\"description\"></document-engine-icon>\n </button>\n\n <button\n *ngIf=\"capabilities.hasEditableRegion\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"!toolbarState.canToggleEditableRegion || toolbarState.isReadOnly\"\n (click)=\"runAndEmit('toggleEditableRegion', editor.chain().focus().toggleEditableRegion().run)\"\n [class.active]=\"editor.isActive('editableRegion')\"\n title=\"Toggle editable region\"\n >\n <document-engine-icon name=\"restrict_edit\"></document-engine-icon>\n </button>\n </div>\n\n <!-- Actions: Clear Content, Markdown -->\n <div *ngIf=\"capabilities.hasActions\" class=\"document-engine-document-editor__toolbar-group\" data-group=\"actions\">\n <button\n *ngIf=\"capabilities.hasClearContent\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly || !toolbarState.canClearContent\"\n (click)=\"runAndEmit('clear', editor.chain().focus().clear().run)\"\n title=\"Clear all content\"\n >\n <document-engine-icon name=\"clear_all\"></document-engine-icon>\n </button>\n\n <!-- <button\n *ngIf=\"capabilities.hasMarkdown\"\n documentEngineButton\n size=\"icon\"\n (click)=\"downloadAsMarkdown()\"\n title=\"Download as Markdown\"\n >\n <document-engine-icon name=\"markdown\"></document-engine-icon>\n </button> -->\n </div>\n\n <!-- Custom Toolbar Buttons -->\n <div\n *ngIf=\"customToolbarButtons.length > 0\"\n class=\"document-engine-document-editor__toolbar-group\"\n data-group=\"custom-buttons\"\n >\n <ng-container *ngFor=\"let button of customToolbarButtons; trackBy: trackByIndex\">\n <!-- Icon Button -->\n <button\n *ngIf=\"button.type === 'icon-button'\"\n documentEngineButton\n size=\"icon\"\n [disabled]=\"toolbarState.isReadOnly\"\n (click)=\"handleCustomIconButton(button)\"\n [title]=\"button.label || ''\"\n >\n <document-engine-icon [name]=\"button.icon\"></document-engine-icon>\n </button>\n\n <!-- Select Button -->\n <document-engine-select\n *ngIf=\"button.type === 'select-button'\"\n [value]=\"null\"\n labelMode=\"static\"\n [disabled]=\"toolbarState.isReadOnly\"\n [title]=\"button.label\"\n >\n <span documentEngineSelectLabel>{{ button.label }}</span>\n\n <button\n *ngFor=\"let option of button.options; trackBy: trackByValue\"\n documentEngineSelectOption\n [value]=\"option.value\"\n (click)=\"handleCustomSelectButton(button, option.value)\"\n >\n {{ option.label }}\n </button>\n </document-engine-select>\n </ng-container>\n </div>\n </div>\n\n <!-- Right side actions -->\n <div class=\"document-engine-document-editor__toolbar-right\">\n <button\n *ngIf=\"capabilities.hasPrintButton\"\n documentEngineButton\n size=\"icon\"\n (click)=\"printValue()\"\n title=\"Print Value\"\n >\n <document-engine-icon name=\"print\"></document-engine-icon>\n </button>\n </div>\n </div>\n\n <!-- Color Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n #colorBubbleMenu\n [editor]=\"editor\"\n [config]=\"colorBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Link Bubble Menu -->\n <document-engine-editor-bubble-menu\n *ngIf=\"capabilities.hasLink\"\n #linkBubbleWrapper\n [editor]=\"editor\"\n [config]=\"linkBubbleConfig\"\n ></document-engine-editor-bubble-menu>\n\n <!-- Table Bubble Menu -->\n <document-engine-editor-bubble-menu\n *ngIf=\"capabilities.hasTable\"\n #tableBubbleWrapper\n [editor]=\"editor\"\n [config]=\"tableBubbleConfig\"\n ></document-engine-editor-bubble-menu>\n\n <!-- Image Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasImages\"\n #imageBubbleMenu\n [editor]=\"editor\"\n [config]=\"imageBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Special Characters Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasSpecialChars\"\n #specialCharsBubbleMenu\n [editor]=\"editor\"\n [config]=\"specialCharsBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Dynamic Fields Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasDynamicFields\"\n #dynamicFieldsBubbleMenu\n [editor]=\"editor\"\n [config]=\"dynamicFieldsBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Template Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasTemplates\"\n #templateBubbleMenu\n [editor]=\"editor\"\n [config]=\"templateBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n\n <!-- Table Create Bubble Menu -->\n <document-engine-toolbar-bubble-menu\n *ngIf=\"capabilities.hasTable\"\n #tableCreateBubbleMenu\n [editor]=\"editor\"\n [config]=\"tableCreateBubbleConfig\"\n ></document-engine-toolbar-bubble-menu>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { DocumentEngineConfig } from '../core/kit/kit.type';\nimport { DocumentEngineKit } from '../core/kit/kit';\nimport { EditorCapabilities } from '../core/capability.model';\nimport { Editor } from '@tiptap/core';\nimport { DefaultEditorConfig } from '../configs/editor.config';\nimport { EDITOR_CONTENT_WRAPPER_CLASS } from '../core';\nimport { FooterComponent } from '../ui/footer/footer.component';\nimport { ToolbarComponent } from '../ui/toolbar/toolbar.component';\n\n/**\n * Document Editor Component\n * High-level wrapper that encapsulates TiptapEditor and DocumentEngineKit\n * Provides a simple API for consumers without exposing internal dependencies\n *\n * Usage:\n * <document-engine-editor\n * #editor\n * [config]=\"editorConfig\"\n *\n * (editorReady)=\"editor = docEditor.editor\"\n * >\n * <tiptap-editor\n * [editor]=\"docEditor.editor\"\n * [(ngModel)]=\"content\"\n * ></tiptap-editor>\n * </document-engine-editor>\n */\n@Component({\n selector: 'document-engine-editor',\n imports: [CommonModule, ToolbarComponent, FooterComponent],\n templateUrl: './document-editor.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'no-twp',\n },\n styles: [\n `\n /* A custom element defaults to display: inline, which makes the editor\n * impossible to size from the outside. Make it a stretchable column so a\n * consumer can give this element a height and have the editing surface\n * fill it (see --de-editor-min-height in docs/THEMING.md). */\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n :host ::ng-deep {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n }\n `,\n ],\n})\nexport class DocumentEditorComponent implements OnInit, OnChanges, OnDestroy {\n private readonly ngZone = inject(NgZone);\n private readonly contentWrapperClass = inject(EDITOR_CONTENT_WRAPPER_CLASS, { optional: true });\n\n @Input() config?: Partial<DocumentEngineConfig>;\n\n @Output() editorReady = new EventEmitter<Editor>();\n\n // Expose editor property for external access (re-export)\n editor!: Editor;\n\n // Store merged config for toolbar and helper methods\n get mergedConfig(): Partial<DocumentEngineConfig> {\n return this._mergedConfig ?? this.getMergedConfig();\n }\n\n private _mergedConfig?: Partial<DocumentEngineConfig>;\n\n // Capabilities instance for toolbar\n capabilities!: EditorCapabilities;\n\n private updateCapabilities(): void {\n this.capabilities = new EditorCapabilities(this.mergedConfig);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['config']) return;\n\n if (!this.editor) return;\n\n this._mergedConfig = this.getMergedConfig();\n this.updateCapabilities();\n this.editor.setEditable(this._mergedConfig.editable ?? true);\n }\n\n ngOnInit(): void {\n this.initializeEditor();\n }\n\n ngOnDestroy(): void {\n if (this.editor) this.editor.destroy();\n }\n\n // Internal methods\n private initializeEditor(): void {\n // Run editor initialization outside Angular zone for better performance\n // Editor operations (especially typing) don't need to trigger Angular change detection\n this.ngZone.runOutsideAngular(() => {\n // Merge user config with default full-featured config\n this._mergedConfig = this.getMergedConfig();\n\n // Initialize editor with config\n // Initial content will be set by TiptapEditorDirective via writeValue\n this.editor = new Editor({\n editable: this._mergedConfig.editable,\n extensions: [DocumentEngineKit.configure(this._mergedConfig)],\n editorProps: { attributes: { class: this.contentWrapperClass ?? '' } },\n });\n\n // Emit editorReady event back inside Angular zone\n this.ngZone.run(() => {\n // Create capabilities instance after editor is initialized\n this.updateCapabilities();\n this.editorReady.emit(this.editor);\n });\n });\n }\n\n /**\n * Get merged config with all extensions enabled by default\n * User config will override defaults\n */\n private getMergedConfig(): Partial<DocumentEngineConfig> {\n // Merge user config with defaults, preferring user config when provided\n return this.mergeConfig(DefaultEditorConfig, this.config);\n }\n\n /**\n * Merge two config objects, preferring userConfig values when provided\n */\n private mergeConfig(\n defaultConfig: Partial<DocumentEngineConfig>,\n userConfig?: Partial<DocumentEngineConfig>\n ): Partial<DocumentEngineConfig> {\n if (!userConfig) return defaultConfig;\n\n const merged: Record<string, unknown> = { ...defaultConfig };\n const keys = Object.keys(userConfig) as Array<keyof DocumentEngineConfig>;\n\n for (const key of keys) {\n const value = userConfig[key];\n if (value !== undefined) merged[key] = value;\n }\n\n return merged;\n }\n}\n","<div class=\"document-engine-document-editor\">\n <document-engine-toolbar\n *ngIf=\"mergedConfig.showToolbar\"\n [editor]=\"editor\"\n [capabilities]=\"capabilities\"\n [config]=\"mergedConfig\"\n ></document-engine-toolbar>\n\n <div class=\"document-engine-document-editor__content\">\n <ng-content></ng-content>\n </div>\n\n <document-engine-footer\n *ngIf=\"editor && mergedConfig.showFooter\"\n [editor]=\"editor\"\n [config]=\"mergedConfig\"\n ></document-engine-footer>\n</div>\n","import { NgModule } from '@angular/core';\nimport { TiptapEditorDirective } from '../core';\nimport { DocumentEditorComponent } from './document-editor.component';\n\n/**\n * Back-compat shim for NgModule-based consumers. `DocumentEditorComponent` is now\n * standalone (and `@defer`-friendly); standalone consumers should import it (and\n * `TiptapEditorDirective`) directly instead of this module.\n */\n@NgModule({\n imports: [DocumentEditorComponent, TiptapEditorDirective],\n exports: [DocumentEditorComponent, TiptapEditorDirective],\n})\nexport class DocumentEditorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["IconConstants.DEFAULT","IconConstants.CHECK","IconConstants.UNDO","IconConstants.REDO","IconConstants.FORMAT_SIZE","IconConstants.ARROW_DROP_DOWN","IconConstants.FORMAT_LINE_SPACING","IconConstants.MATCH_CASE","IconConstants.FORMAT_CLEAR","IconConstants.FORMAT_COLOR_TEXT","IconConstants.FORMAT_COLOR_FILL","IconConstants.FORMAT_BOLD","IconConstants.FORMAT_ITALIC","IconConstants.FORMAT_UNDERLINE","IconConstants.FORMAT_STRIKETHROUGH","IconConstants.SUBSCRIPT","IconConstants.SUPERSCRIPT","IconConstants.CODE","IconConstants.FORMAT_ALIGN_LEFT","IconConstants.FORMAT_ALIGN_CENTER","IconConstants.FORMAT_ALIGN_RIGHT","IconConstants.FORMAT_ALIGN_JUSTIFY","IconConstants.FORMAT_INDENT_DECREASE","IconConstants.FORMAT_INDENT_INCREASE","IconConstants.FORMAT_LIST_BULLETED","IconConstants.FORMAT_LIST_NUMBERED","IconConstants.FORMAT_QUOTE","IconConstants.TABLE_ROWS","IconConstants.TABLE_CELL_PROPERTY","IconConstants.TABLE_COLUMN","IconConstants.TABLE_MERGE_CELL","IconConstants.TABLE_PROPERTY","IconConstants.TABLE_ROW","IconConstants.LINK","IconConstants.LINK_OFF","IconConstants.SPECIAL_CHARACTER","IconConstants.CLEAR_ALL","IconConstants.INSERT_PAGE_BREAK","IconConstants.MARKDOWN","IconConstants.DYNAMIC_FORM","IconConstants.PHOTO","IconConstants.PRINT","IconConstants.ARCHIVE","IconConstants.RESTRICT_EDIT","IconConstants.EDIT","IconConstants.SETTINGS","IconConstants.SEARCH","IconConstants.SEARCH_OFF","IconConstants.DESCRIPTION","IconConstants.CLOSE","IconConstants.VERTICAL_ALIGN_TOP","IconConstants.VERTICAL_ALIGN_CENTER","IconConstants.VERTICAL_ALIGN_BOTTOM","i1"],"mappings":"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"}
|