@domternal/angular 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"domternal-angular.mjs","sources":["../../src/lib/editor.component.ts","../../src/lib/toolbar.component.ts","../../src/lib/bubble-menu.component.ts","../../src/lib/floating-menu.component.ts","../../src/lib/emoji-picker.component.ts","../../src/domternal-angular.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n forwardRef,\n signal,\n ChangeDetectionStrategy,\n inject,\n NgZone,\n OnDestroy,\n effect,\n input,\n output,\n viewChild,\n untracked,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type { Content, AnyExtension, FocusPosition, JSONContent, TransactionEventProps, FocusEventProps } from '@domternal/core';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [Document, Paragraph, Text, BaseKeymap, History];\n\n@Component({\n selector: 'domternal-editor',\n template: '<div #editorRef></div>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'dm-editor', 'data-dm-editor-ui': '' },\n styles: [`:host { display: block; }`],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DomternalEditorComponent),\n multi: true,\n },\n ],\n})\nexport class DomternalEditorComponent implements ControlValueAccessor, OnDestroy {\n // === Template ref ===\n readonly editorRef = viewChild.required<ElementRef<HTMLDivElement>>('editorRef');\n\n // === Inputs ===\n readonly extensions = input<AnyExtension[]>([]);\n readonly content = input<Content>('');\n readonly editable = input(true);\n readonly autofocus = input<FocusPosition>(false);\n readonly outputFormat = input<'html' | 'json'>('html');\n\n // === Outputs ===\n readonly editorCreated = output<Editor>();\n readonly contentUpdated = output<{ editor: Editor }>();\n readonly selectionChanged = output<{ editor: Editor }>();\n readonly focusChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly blurChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly editorDestroyed = output<void>();\n\n // === Signals (read-only public state) ===\n private _htmlContent = signal('');\n private _jsonContent = signal<JSONContent | null>(null);\n private _isEmpty = signal(true);\n private _isFocused = signal(false);\n // Candidate for linkedSignal(editable) once min Angular version is >=20\n private _isEditable = signal(true);\n\n readonly htmlContent = this._htmlContent.asReadonly();\n readonly jsonContent = this._jsonContent.asReadonly();\n readonly isEmpty = this._isEmpty.asReadonly();\n readonly isFocused = this._isFocused.asReadonly();\n readonly isEditable = this._isEditable.asReadonly();\n\n // === Editor instance ===\n private _editor: Editor | null = null;\n\n get editor(): Editor | null {\n return this._editor;\n }\n\n // === ControlValueAccessor ===\n private onChange: (value: Content) => void = () => {};\n private onTouched: () => void = () => {};\n private _pendingContent: Content | null = null;\n\n private ngZone = inject(NgZone);\n\n constructor() {\n afterNextRender(() => {\n this.createEditor();\n });\n\n // React to editable input changes\n effect(() => {\n const editable = this.editable();\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n this._editor!.setEditable(editable);\n this._isEditable.set(editable);\n });\n });\n\n // React to content input changes\n effect(() => {\n const content = this.content();\n const format = this.outputFormat();\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n const current = format === 'html'\n ? this._editor!.getHTML()\n : JSON.stringify(this._editor!.getJSON());\n const incoming = format === 'html'\n ? (content as string)\n : JSON.stringify(content);\n if (incoming !== current) {\n this._editor!.setContent(content, false);\n }\n });\n });\n\n // React to extensions input changes\n effect(() => {\n this.extensions(); // track the signal\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n this.recreateEditor();\n });\n });\n }\n\n // === Lifecycle ===\n\n ngOnDestroy(): void {\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.destroy();\n this.editorDestroyed.emit();\n }\n this._editor = null;\n }\n\n // === ControlValueAccessor implementation ===\n\n writeValue(value: Content): void {\n if (!this._editor || this._editor.isDestroyed) {\n this._pendingContent = value;\n return;\n }\n\n // Compare current content to avoid unnecessary setContent (which resets cursor)\n if (this.outputFormat() === 'html') {\n if (value === this._editor.getHTML()) return;\n } else {\n if (JSON.stringify(value) === JSON.stringify(this._editor.getJSON())) return;\n }\n\n this._editor.setContent(value, false);\n }\n\n registerOnChange(fn: (value: Content) => 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._isEditable.set(!isDisabled);\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.setEditable(!isDisabled);\n }\n }\n\n // === Private ===\n\n private recreateEditor(): void {\n if (!this._editor || this._editor.isDestroyed) return;\n const currentContent = this._editor.getJSON();\n this._editor.destroy();\n this.editorDestroyed.emit();\n this._pendingContent = currentContent;\n this.createEditor();\n }\n\n private createEditor(): void {\n const initialContent = this._pendingContent ?? this.content();\n this._pendingContent = null;\n\n this._editor = new Editor({\n element: this.editorRef().nativeElement,\n extensions: [...DEFAULT_EXTENSIONS, ...this.extensions()],\n content: initialContent,\n editable: this.editable(),\n autofocus: this.autofocus(),\n });\n\n this._isEditable.set(this.editable());\n\n // Set initial signal values\n this._htmlContent.set(this._editor.getHTML());\n this._jsonContent.set(this._editor.getJSON());\n this._isEmpty.set(this._editor.isEmpty);\n\n this._editor.on('transaction', ({ transaction }: TransactionEventProps) => {\n this.ngZone.run(() => {\n const ed = this._editor!;\n\n if (transaction.docChanged) {\n const html = ed.getHTML();\n this._htmlContent.set(html);\n this._jsonContent.set(ed.getJSON());\n this._isEmpty.set(ed.isEmpty);\n this.contentUpdated.emit({ editor: ed });\n\n const value: Content = this.outputFormat() === 'html' ? html : ed.getJSON();\n this.onChange(value);\n }\n\n if (!transaction.docChanged && transaction.selectionSet) {\n this.selectionChanged.emit({ editor: ed });\n }\n });\n });\n\n this._editor.on('focus', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(true);\n this.focusChanged.emit({ editor: this._editor!, event });\n });\n });\n\n this._editor.on('blur', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(false);\n this.blurChanged.emit({ editor: this._editor!, event });\n this.onTouched();\n });\n });\n\n // Emit editor created\n this.ngZone.run(() => {\n this.editorCreated.emit(this._editor!);\n });\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n Editor,\n ToolbarController,\n defaultIcons,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n ToolbarItem,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarControllerEditor,\n IconSet,\n ToolbarGroup,\n ToolbarLayoutEntry,\n} from '@domternal/core';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\n@Component({\n selector: 'domternal-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'dm-toolbar',\n 'role': 'toolbar',\n 'data-dm-editor-ui': '',\n '[attr.aria-label]': '\"Editor formatting\"',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n @for (group of groups(); track group.name; let gi = $index) {\n @if (gi > 0) {\n <div class=\"dm-toolbar-separator\" role=\"separator\"></div>\n }\n <div class=\"dm-toolbar-group\" role=\"group\" [attr.aria-label]=\"group.name || 'Tools'\">\n @for (item of group.items; track item.name) {\n @if (item.type === 'button') {\n <button\n type=\"button\"\n class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isActive(item.name)\"\n [attr.aria-pressed]=\"isActive(item.name)\"\n [attr.aria-expanded]=\"getAriaExpanded(asButton(item))\"\n [attr.aria-label]=\"asButton(item).label\"\n [title]=\"getTooltip(asButton(item))\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(item.name)\"\n [innerHTML]=\"getCachedIcon(asButton(item).icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onButtonClick(asButton(item), $event)\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n }\n @if (item.type === 'dropdown') {\n <div class=\"dm-toolbar-dropdown-wrapper\">\n <button\n type=\"button\"\n class=\"dm-toolbar-button dm-toolbar-dropdown-trigger\"\n [class.dm-toolbar-button--active]=\"isDropdownActive(asDropdown(item))\"\n [attr.aria-expanded]=\"openDropdown() === asDropdown(item).name\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-label]=\"asDropdown(item).label\"\n [title]=\"asDropdown(item).label\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(asDropdown(item).name)\"\n [attr.data-dropdown]=\"asDropdown(item).name\"\n [innerHTML]=\"getDropdownTriggerHtml(asDropdown(item))\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownToggle(asDropdown(item))\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n @if (openDropdown() === asDropdown(item).name) {\n @if (asDropdown(item).layout === 'grid') {\n <div class=\"dm-toolbar-dropdown-panel dm-color-palette\" role=\"menu\"\n [attr.style]=\"getGridStyle(asDropdown(item))\">\n @for (sub of asDropdown(item).items; track sub.name) {\n @if (sub.color) {\n <button\n type=\"button\"\n class=\"dm-color-swatch\"\n [class.dm-color-swatch--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [title]=\"sub.label\"\n [style.background-color]=\"sub.color\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n } @else {\n <button\n type=\"button\"\n class=\"dm-color-palette-reset\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label)\"\n [attr.tabindex]=\"-1\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n }\n }\n </div>\n } @else {\n <div class=\"dm-toolbar-dropdown-panel\" role=\"menu\"\n [attr.data-display-mode]=\"asDropdown(item).displayMode ?? null\">\n @for (sub of asDropdown(item).items; track sub.name) {\n <button\n type=\"button\"\n class=\"dm-toolbar-dropdown-item\"\n [class.dm-toolbar-dropdown-item--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [attr.style]=\"sub.style ?? null\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub, $event)\"\n ></button>\n }\n </div>\n }\n }\n </div>\n }\n }\n </div>\n }\n `,\n})\nexport class DomternalToolbarComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly icons = input<IconSet | null>(null);\n readonly layout = input<ToolbarLayoutEntry[]>();\n\n /** Exposed state signals for template */\n readonly groups = signal<ToolbarGroup[]>([]);\n readonly focusedIndex = signal(0);\n readonly openDropdown = signal<string | null>(null);\n /** Bumped on active state changes to trigger re-evaluation of isActive() */\n readonly activeVersion = signal(0);\n\n private controller: ToolbarController | null = null;\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private dismissOverlayHandler: (() => void) | null = null;\n private editorEl: HTMLElement | null = null;\n private cleanupFloating: (() => void) | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject(ElementRef);\n private sanitizer = inject(DomSanitizer);\n\n /** SafeHtml cache — same reference returned for same key, prevents DOM churn */\n private htmlCache = new Map<string, SafeHtml>();\n\n private readonly dropdownCaret = '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"><path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => this.setupController(editor));\n });\n }\n\n ngOnDestroy(): void {\n this.destroyController();\n }\n\n // === Template helpers ===\n\n isActive(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.activeMap.get(name) ?? false;\n }\n\n isDisabled(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.disabledMap.get(name) ?? false;\n }\n\n isDropdownActive(dropdown: ToolbarDropdown): boolean {\n if (dropdown.layout === 'grid') return false; // color dropdowns use bar indicator instead\n if (dropdown.dynamicLabel) return false; // label text already communicates state\n this.activeVersion(); // subscribe to changes\n return dropdown.items.some((item: ToolbarButton) => this.controller?.activeMap.get(item.name) ?? false);\n }\n\n /** Returns trigger innerHTML: dynamic icon + caret (+ color indicator for grid dropdowns). */\n getDropdownTriggerHtml(dropdown: ToolbarDropdown): SafeHtml {\n this.activeVersion(); // subscribe to changes\n const activeItem = dropdown.items.find((item: ToolbarButton) => this.controller?.activeMap.get(item.name));\n\n if (dropdown.layout === 'grid') {\n const color = activeItem?.color ?? dropdown.defaultIndicatorColor ?? null;\n const key = `tr:${dropdown.icon}:${color ?? ''}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n let html = this.resolveIconSvg(dropdown.icon) + this.dropdownCaret;\n if (color) {\n html += `<span class=\"dm-toolbar-color-indicator\" style=\"background-color: ${color}\"></span>`;\n }\n cached = this.sanitizer.bypassSecurityTrustHtml(html);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n // Non-grid dropdown — show active sub-item's label as text\n if (dropdown.dynamicLabel) {\n if (activeItem) return this.getCachedTriggerLabel(activeItem.label);\n\n // Try reading CSS property from DOM (inline or computed depending on property)\n if (dropdown.computedStyleProperty) {\n let computed: string | null;\n if (dropdown.computedStyleProperty === 'font-family') {\n // Font-family: read ONLY inline style (explicit mark), not computed (browser default)\n computed = this.getInlineStyleAtCursor(dropdown.computedStyleProperty);\n if (computed) {\n const first = computed.split(',')[0]?.replace(/['\"]+/g, '').trim();\n computed = first || null;\n }\n } else {\n computed = this.getComputedStyleAtCursor(dropdown.computedStyleProperty);\n }\n if (computed) return this.getCachedTriggerLabel(computed);\n }\n\n if (dropdown.dynamicLabelFallback) {\n return this.getCachedTriggerLabel(dropdown.dynamicLabelFallback);\n }\n return this.getCachedTriggerLabel(dropdown.icon, true);\n }\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return this.getCachedTriggerIcon(icon);\n }\n\n /**\n * Returns 'true' when an emitEvent button's panel is open, null otherwise.\n * Maps to [attr.aria-expanded] — null removes the attribute entirely.\n */\n getAriaExpanded(item: ToolbarButton): string | null {\n if (!item.emitEvent) return null;\n this.activeVersion(); // subscribe to changes\n return this.controller?.expandedMap.get(item.name) ? 'true' : null;\n }\n\n getFlatIndex(name: string): number {\n return this.controller?.getFlatIndex(name) ?? -1;\n }\n\n getTooltip(item: ToolbarButton): string {\n if (item.shortcut) {\n const parts = item.shortcut.split('-');\n const mapped = parts.map((p: string) => {\n if (p === 'Mod') return isMac ? '\\u2318' : 'Ctrl';\n if (p === 'Shift') return isMac ? '\\u21E7' : 'Shift';\n if (p === 'Alt') return isMac ? '\\u2325' : 'Alt';\n return p.toUpperCase();\n });\n const shortcut = isMac ? mapped.join('') : mapped.join('+');\n return `${item.label} (${shortcut})`;\n }\n return item.label;\n }\n\n getCachedIcon(name: string): SafeHtml {\n const key = `i:${name}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(this.resolveIconSvg(name));\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedTriggerLabel(label: string, isIcon?: boolean): SafeHtml {\n const key = `tl:${label}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n const content = isIcon ? this.resolveIconSvg(label) : label;\n cached = this.sanitizer.bypassSecurityTrustHtml(\n `<span class=\"dm-toolbar-trigger-label\">${content}</span>` + this.dropdownCaret,\n );\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedTriggerIcon(iconName: string): SafeHtml {\n const key = `t:${iconName}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(this.resolveIconSvg(iconName) + this.dropdownCaret);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedItemContent(iconName: string, label: string, displayMode?: 'icon-text' | 'text' | 'icon'): SafeHtml {\n const mode = displayMode ?? 'icon-text';\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n let html: string;\n if (mode === 'text') {\n html = label;\n } else if (mode === 'icon') {\n html = this.resolveIconSvg(iconName);\n } else {\n html = this.resolveIconSvg(iconName) + ' ' + label;\n }\n cached = this.sanitizer.bypassSecurityTrustHtml(html);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n asButton(item: ToolbarItem): ToolbarButton {\n return item as ToolbarButton;\n }\n\n asDropdown(item: ToolbarItem): ToolbarDropdown {\n return item as ToolbarDropdown;\n }\n\n getGridStyle(dropdown: ToolbarDropdown): string {\n return `--dm-palette-columns: ${String(dropdown.gridColumns ?? 10)}`;\n }\n\n // === Event handlers ===\n\n onButtonClick(item: ToolbarButton, event?: MouseEvent): void {\n // Close any open dropdown when clicking a regular button\n if (this.openDropdown()) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.syncState();\n }\n\n if (item.emitEvent) {\n const anchor = event?.currentTarget as HTMLElement | undefined;\n // emitEvent is a dynamic string; cast needed to bypass strict EventEmitter<EditorEvents> typing\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n this.controller?.executeCommand(item);\n\n // If the button was activated via keyboard (Enter/Space on a focused\n // toolbar button), refocus the editor so the browser renders the\n // ::selection highlight for the still-active range.\n // Keyboard-triggered click events have detail === 0.\n // Always refocus editor after executing a command via toolbar button.\n // Mouse clicks already keep focus via mousedown.preventDefault();\n // keyboard activations (Enter/Space) need explicit refocus.\n requestAnimationFrame(() => this.editor().view.focus());\n }\n\n onDropdownToggle(dropdown: ToolbarDropdown): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.toggleDropdown(dropdown.name);\n this.syncState();\n\n // Position the panel after Angular renders it (tracks resize, not scroll)\n if (this.openDropdown()) {\n requestAnimationFrame(() => {\n const trigger = this.elRef.nativeElement.querySelector(\n `[aria-expanded=\"true\"]`,\n ) as HTMLElement | null;\n const panel = trigger?.parentElement?.querySelector(\n '.dm-toolbar-dropdown-panel',\n ) as HTMLElement | null;\n if (trigger && panel) {\n // List dropdowns align to trigger's left edge; grid/picker dropdowns center\n const placement = dropdown.layout === 'grid' ? 'bottom' : 'bottom-start';\n this.cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n }\n });\n }\n }\n\n onDropdownItemClick(item: ToolbarButton, event?: Event): void {\n // For emitEvent items, use the dropdown trigger as anchor (sub-item gets removed when dropdown closes)\n let anchor: HTMLElement | undefined;\n if (item.emitEvent && event?.currentTarget) {\n const wrapper = (event.currentTarget as HTMLElement).closest('.dm-toolbar-dropdown-wrapper');\n anchor = wrapper?.querySelector('.dm-toolbar-dropdown-trigger') as HTMLElement | undefined;\n }\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n if (item.emitEvent) {\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n } else {\n this.controller?.executeCommand(item);\n }\n\n // Refocus editor so ::selection highlight stays visible\n requestAnimationFrame(() => this.editor().view.focus());\n }\n\n onButtonFocus(name: string): void {\n const index = this.controller?.getFlatIndex(name) ?? -1;\n if (index >= 0) {\n this.controller?.setFocusedIndex(index);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (!this.controller) return;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.controller.navigateNext();\n this.focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.controller.navigatePrev();\n this.focusCurrentButton();\n break;\n case 'Home':\n event.preventDefault();\n this.controller.navigateFirst();\n this.focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n this.controller.navigateLast();\n this.focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (this.openDropdown()) {\n this.focusDropdownItem(1);\n } else {\n const btn = document.activeElement as HTMLElement | null;\n if (btn?.getAttribute('aria-haspopup') && btn.closest('.dm-toolbar')) {\n btn.click();\n requestAnimationFrame(() => this.focusDropdownItem(0, true));\n }\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (this.openDropdown()) {\n this.focusDropdownItem(-1);\n }\n break;\n }\n case 'Escape':\n if (this.openDropdown()) {\n event.preventDefault();\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller.closeDropdown();\n this.syncState();\n this.focusCurrentButton();\n }\n break;\n }\n }\n\n // === Private ===\n\n private focusDropdownItem(direction: number, first?: boolean): void {\n const panel = this.elRef.nativeElement.querySelector('.dm-toolbar-dropdown-panel') as HTMLElement | null;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll('[role=\"menuitem\"]')) as HTMLElement[];\n if (!items.length) return;\n if (first) { items[0]?.focus(); return; }\n const current = document.activeElement as HTMLElement;\n const idx = items.indexOf(current);\n const next = idx === -1\n ? (direction > 0 ? 0 : items.length - 1)\n : (idx + direction + items.length) % items.length;\n items[next]?.focus();\n }\n\n private resolveIconSvg(name: string): string {\n const customIcons = this.icons();\n if (customIcons) {\n return customIcons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }\n\n private setupController(editor: Editor): void {\n this.destroyController();\n\n this.controller = new ToolbarController(\n editor as unknown as ToolbarControllerEditor,\n () => this.ngZone.run(() => this.syncState()),\n this.layout(),\n );\n this.controller.subscribe();\n this.syncState();\n\n // Click outside to close dropdown\n this.clickOutsideHandler = (e: Event) => {\n if (this.openDropdown() && !this.elRef.nativeElement.contains(e.target as Node)) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => this.syncState());\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n // Listen for dismiss-overlays (e.g. table handle clicks that stopPropagation on mousedown)\n this.editorEl = editor.view.dom.closest('.dm-editor') as HTMLElement | null;\n if (this.editorEl) {\n this.dismissOverlayHandler = () => {\n if (this.openDropdown()) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => this.syncState());\n }\n };\n this.editorEl.addEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n }\n }\n\n private destroyController(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.dismissOverlayHandler && this.editorEl) {\n this.editorEl.removeEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n this.dismissOverlayHandler = null;\n this.editorEl = null;\n }\n if (this.controller) {\n this.controller.destroy();\n this.controller = null;\n }\n }\n\n private syncState(): void {\n if (!this.controller) return;\n\n // Only update groups if they actually changed (initial build or rebuild)\n const controllerGroups = this.controller.groups;\n if (this.groups().length !== controllerGroups.length) {\n this.groups.set(controllerGroups);\n }\n\n this.focusedIndex.set(this.controller.focusedIndex);\n this.openDropdown.set(this.controller.openDropdown);\n\n // Bump version to trigger isActive() re-evaluation without creating new objects\n this.activeVersion.update(v => v + 1);\n }\n\n private getComputedStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n // Prefer inline style (explicit mark) over computed style (inherited from heading, etc.)\n return el.style.getPropertyValue(prop)\n || window.getComputedStyle(el).getPropertyValue(prop)\n || null;\n } catch {\n return null;\n }\n }\n\n /** Read only inline style — no computed fallback (used for font-family). */\n private getInlineStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n }\n\n private focusCurrentButton(): void {\n const idx = this.controller?.focusedIndex ?? 0;\n const buttons = this.elRef.nativeElement.querySelectorAll(\n '.dm-toolbar-button'\n ) as NodeListOf<HTMLButtonElement>;\n buttons[idx]?.focus();\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n inject,\n NgZone,\n viewChild,\n ElementRef,\n afterNextRender,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n Editor,\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultIcons,\n} from '@domternal/core';\nimport type { BubbleMenuOptions, ToolbarButton } from '@domternal/core';\n\ninterface BubbleMenuSeparator { type: 'separator'; name: string }\ntype BubbleMenuItem = ToolbarButton | BubbleMenuSeparator;\n\n/** Minimal ProseMirror Selection shape for duck-typing (avoids instanceof issues across bundles) */\ninterface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\ninterface SelectionShape {\n empty: boolean;\n $from: ResolvedPosShape;\n $to: ResolvedPosShape;\n node?: { type: { name: string } };\n}\n\n/** Check if a resolved position is inside a table cell or header. */\nfunction isInsideTableCell($pos: ResolvedPosShape): boolean {\n for (let d = $pos.depth; d > 0; d--) {\n const name = $pos.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return true;\n }\n return false;\n}\n\n/** ProseMirror schema shape for mark filtering */\ninterface SchemaShape {\n nodes: Record<string, { allowsMarkType: (mt: unknown) => boolean }>;\n marks: Record<string, unknown>;\n}\n\n@Component({\n selector: 'domternal-bubble-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div #menuEl class=\"dm-bubble-menu\" role=\"toolbar\" aria-label=\"Text formatting\">\n @for (item of resolvedItems(); track item.name) {\n @if (item.type === 'separator') {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n } @else {\n <button type=\"button\" class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isItemActive(item)\"\n [attr.aria-pressed]=\"isItemActive(item)\"\n [disabled]=\"isItemDisabled(item)\"\n [title]=\"item.label\"\n [attr.aria-label]=\"item.label\"\n [innerHTML]=\"getCachedIcon(item.icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"executeCommand(item)\"></button>\n }\n }\n <ng-content />\n </div>\n `,\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalBubbleMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<BubbleMenuOptions['shouldShow']>();\n readonly placement = input<'top' | 'bottom'>('top');\n readonly offset = input<number>(8);\n readonly updateDelay = input(0);\n\n /** Fixed item names (e.g. ['bold', 'italic', 'code']). Omit for auto mode (all format items). */\n readonly items = input<string[]>();\n\n /** Context-aware: map context names to item arrays, `true` for all valid items, or `null` to disable */\n readonly contexts = input<Record<string, string[] | true | null>>();\n\n /** Internal — updated on transactions. Not meant to be set from outside. */\n readonly resolvedItems = signal<BubbleMenuItem[]>([]);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private pluginKey: PluginKey;\n\n private sanitizer = inject(DomSanitizer);\n private ngZone = inject(NgZone);\n\n private activeVersion = signal(0);\n private itemMap = new Map<string, ToolbarButton>();\n private activeMap = new Map<string, boolean>();\n private disabledMap = new Map<string, boolean>();\n private htmlCache = new Map<string, SafeHtml>();\n private bubbleDefaults = new Map<string, BubbleMenuItem[]>();\n private transactionHandler: (() => void) | null = null;\n\n constructor() {\n this.pluginKey = new PluginKey(\n 'angularBubbleMenu-' + Math.random().toString(36).slice(2, 8),\n );\n\n afterNextRender(() => {\n const editor = this.editor();\n const ctxs = this.contexts();\n let shouldShowFn = this.shouldShow();\n\n if (!shouldShowFn) {\n if (ctxs) {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n const context = this.detectContext(state.selection, ctxs);\n if (!context) return false;\n if (context in ctxs) {\n const val = ctxs[context];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return this.bubbleDefaults.has(context);\n };\n } else {\n // Auto/items mode: show when any endpoint's parent allows marks\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n if (state.selection.empty || state.selection.node) return false;\n if (isInsideTableCell(state.selection.$from)) return false;\n return state.selection.$from.parent.type.spec.marks !== ''\n || state.selection.$to.parent.type.spec.marks !== '';\n };\n }\n }\n\n const plugin = createBubbleMenuPlugin({\n pluginKey: this.pluginKey,\n editor,\n element: this.menuEl().nativeElement,\n shouldShow: shouldShowFn,\n placement: this.placement(),\n offset: this.offset(),\n updateDelay: this.updateDelay(),\n });\n editor.registerPlugin(plugin);\n this.setupItemTracking(editor);\n });\n }\n\n ngOnDestroy(): void {\n const editor = this.editor();\n if (this.transactionHandler) {\n editor.off('transaction', this.transactionHandler);\n }\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n\n // === Template helpers ===\n\n isItemActive(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.activeMap.get(item.name) ?? false;\n }\n\n isItemDisabled(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.disabledMap.get(item.name) ?? false;\n }\n\n getCachedIcon(name: string): SafeHtml {\n let cached = this.htmlCache.get(name);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(defaultIcons[name] ?? '');\n this.htmlCache.set(name, cached);\n }\n return cached;\n }\n\n executeCommand(item: ToolbarButton): void {\n if (item.emitEvent) {\n // emitEvent is a dynamic string; cast needed to bypass strict EventEmitter<EditorEvents> typing\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, {});\n return;\n }\n ToolbarController.executeItem(this.editor() as never, item);\n }\n\n // === Internal ===\n\n private buildItemMap(editor: Editor): void {\n this.itemMap.clear();\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') {\n this.itemMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n for (const sub of item.items) {\n this.itemMap.set(sub.name, sub);\n }\n }\n }\n }\n\n private resolveNames(names: string[]): BubbleMenuItem[] {\n const result: BubbleMenuItem[] = [];\n let sepIdx = 0;\n for (const name of names) {\n if (name === '|') {\n result.push({ type: 'separator', name: `sep-${sepIdx++}` });\n } else {\n const item = this.itemMap.get(name);\n if (item) result.push(item);\n }\n }\n return result;\n }\n\n private getFormatItems(): ToolbarButton[] {\n return Array.from(this.itemMap.values())\n .filter(item => item.group === 'format')\n .sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n }\n\n private detectContext(selection: SelectionShape, ctxs: Record<string, string[] | true | null>): string | null {\n // CellSelection (duck-type: has $anchorCell) — never show bubble menu\n if ('$anchorCell' in selection) return null;\n if (selection.node) return selection.node.type.name;\n if (selection.empty) return null;\n\n // TextSelection inside a table cell → 'table' context.\n // Cross-cell TextSelection (drag across cells) → hide bubble menu.\n const fromCell = this.findCellNode(selection.$from);\n if (fromCell) {\n const toCell = this.findCellNode(selection.$to);\n if (toCell && fromCell !== toCell) return null;\n return 'table';\n }\n\n const fromName = selection.$from.parent.type.name;\n if (fromName in ctxs) return fromName;\n if ('text' in ctxs && selection.$from.parent.type.spec.marks !== '') return 'text';\n // Cross-block: also check $to so bold/italic is offered when any endpoint allows marks\n const toName = selection.$to.parent.type.name;\n if (toName in ctxs) return toName;\n if ('text' in ctxs && selection.$to.parent.type.spec.marks !== '') return 'text';\n return null;\n }\n\n private findCellNode(pos: ResolvedPosShape): { type: { name: string } } | null {\n for (let d = pos.depth; d > 0; d--) {\n const node = pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n return node;\n }\n }\n return null;\n }\n\n /** Filters out mark items that the context node type doesn't allow (e.g. bold on codeBlock) */\n private filterBySchema(editor: Editor, contextName: string, items: ToolbarButton[]): ToolbarButton[] {\n if (contextName === 'text' || contextName === 'table') return items;\n const schema = (editor.state as unknown as { schema?: SchemaShape }).schema;\n if (!schema) return items;\n const nodeType = schema.nodes[contextName];\n if (!nodeType) return items;\n return items.filter(item => {\n const markName = typeof item.isActive === 'string' ? item.isActive : null;\n if (!markName) return true;\n const markType = schema.marks?.[markName];\n if (!markType) return true;\n return nodeType.allowsMarkType(markType);\n });\n }\n\n private buildBubbleDefaults(editor: Editor): void {\n this.bubbleDefaults.clear();\n const byCtx = new Map<string, ToolbarButton[]>();\n const addItem = (btn: ToolbarButton): void => {\n const ctx = (btn as unknown as Record<string, unknown>)['bubbleMenu'] as string | undefined;\n if (!ctx) return;\n let arr = byCtx.get(ctx);\n if (!arr) { arr = []; byCtx.set(ctx, arr); }\n arr.push(btn);\n };\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') addItem(item);\n else if (item.type === 'dropdown') {\n for (const sub of item.items) addItem(sub);\n }\n }\n for (const [ctx, items] of byCtx) {\n items.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const result: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of items) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n result.push({ type: 'separator', name: `bsep-${sepIdx++}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n this.bubbleDefaults.set(ctx, result);\n }\n }\n\n private setupItemTracking(editor: Editor): void {\n this.buildItemMap(editor);\n this.buildBubbleDefaults(editor);\n\n if (this.contexts()) {\n this.updateContextItems(editor);\n } else if (this.items()) {\n this.resolvedItems.set(this.resolveNames(this.items()!));\n } else {\n this.resolvedItems.set(this.resolveNames(['bold', 'italic', 'underline']));\n }\n\n this.transactionHandler = () => {\n this.ngZone.run(() => {\n if (this.contexts()) {\n this.updateContextItems(editor);\n }\n this.updateStates(editor);\n this.activeVersion.update(v => v + 1);\n });\n };\n editor.on('transaction', this.transactionHandler);\n this.updateStates(editor);\n }\n\n private updateContextItems(editor: Editor): void {\n const ctxs = this.contexts()!;\n const ctx = this.detectContext(editor.state.selection as unknown as SelectionShape, ctxs);\n if (!ctx) {\n this.resolvedItems.set([]);\n return;\n }\n if (ctx in ctxs) {\n const val = ctxs[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n this.resolvedItems.set([]);\n return;\n }\n if (val === true) {\n this.resolvedItems.set(this.filterBySchema(editor, ctx, this.getFormatItems()));\n } else if (Array.isArray(val)) {\n const resolved = this.resolveNames(val);\n const buttons = resolved.filter((i): i is ToolbarButton => i.type !== 'separator');\n const filtered = new Set(this.filterBySchema(editor, ctx, buttons).map(b => b.name));\n this.resolvedItems.set(resolved.filter(i => i.type === 'separator' || filtered.has(i.name)));\n }\n } else {\n this.resolvedItems.set(this.bubbleDefaults.get(ctx) ?? []);\n }\n }\n\n private updateStates(editor: Editor): void {\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try { canProxy = editor.can() as unknown as Record<string, (...args: unknown[]) => boolean>; } catch {}\n\n for (const item of this.resolvedItems()) {\n if (item.type === 'separator') continue;\n this.activeMap.set(item.name, ToolbarController.resolveActive(editor as never, item));\n try {\n const canCmd = canProxy?.[item.command];\n this.disabledMap.set(item.name, canCmd\n ? !(item.commandArgs?.length ? canCmd(...item.commandArgs) : canCmd())\n : false);\n } catch { this.disabledMap.set(item.name, false); }\n }\n }\n\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n viewChild,\n ElementRef,\n afterNextRender,\n} from '@angular/core';\n\nimport {\n Editor,\n PluginKey,\n createFloatingMenuPlugin,\n} from '@domternal/core';\nimport type { FloatingMenuOptions } from '@domternal/core';\n\n@Component({\n selector: 'domternal-floating-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '<div #menuEl class=\"dm-floating-menu\"><ng-content /></div>',\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalFloatingMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<FloatingMenuOptions['shouldShow']>();\n readonly offset = input<number>(0);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private pluginKey: PluginKey;\n\n constructor() {\n // Unique key per instance — multiple floating menus on same page\n this.pluginKey = new PluginKey(\n 'angularFloatingMenu-' + Math.random().toString(36).slice(2, 8),\n );\n\n afterNextRender(() => {\n const shouldShow = this.shouldShow();\n const plugin = createFloatingMenuPlugin({\n pluginKey: this.pluginKey,\n editor: this.editor(),\n element: this.menuEl().nativeElement,\n ...(shouldShow && { shouldShow }),\n offset: this.offset(),\n });\n this.editor().registerPlugin(plugin);\n });\n }\n\n ngOnDestroy(): void {\n const editor = this.editor();\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n computed,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\n\nimport { Editor, positionFloatingOnce } from '@domternal/core';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\nconst CATEGORY_ICONS: Record<string, string> = {\n 'Smileys & Emotion': '\\u{1F600}',\n 'People & Body': '\\u{1F44B}',\n 'Animals & Nature': '\\u{1F431}',\n 'Food & Drink': '\\u{1F355}',\n 'Travel & Places': '\\u{1F697}',\n 'Activities': '\\u{26BD}',\n 'Objects': '\\u{1F4A1}',\n 'Symbols': '\\u{1F523}',\n 'Flags': '\\u{1F3C1}',\n};\n\n@Component({\n selector: 'domternal-emoji-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { 'class': 'dm-emoji-picker-host' },\n template: `\n @if (isOpen()) {\n <div class=\"dm-emoji-picker\">\n <div class=\"dm-emoji-picker-search\">\n <input\n #searchInput\n type=\"text\"\n placeholder=\"Search emoji...\"\n [value]=\"searchQuery()\"\n (input)=\"onSearch($event)\"\n aria-label=\"Search emoji\"\n (keydown.escape)=\"close()\"\n />\n </div>\n\n <div class=\"dm-emoji-picker-tabs\" role=\"tablist\">\n @for (cat of categoryNames(); track cat) {\n <button\n type=\"button\"\n class=\"dm-emoji-picker-tab\"\n [class.dm-emoji-picker-tab--active]=\"activeCategory() === cat\"\n role=\"tab\"\n [attr.aria-selected]=\"activeCategory() === cat\"\n [title]=\"cat\"\n [attr.aria-label]=\"cat\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"scrollToCategory(cat)\"\n >{{ categoryIcon(cat) }}</button>\n }\n </div>\n\n <div class=\"dm-emoji-picker-grid\" #grid (scroll)=\"onGridScroll()\" (keydown)=\"onGridKeydown($event)\">\n @if (searchQuery()) {\n @for (item of filteredEmojis(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n @empty {\n <div class=\"dm-emoji-picker-empty\">No emoji found</div>\n }\n } @else {\n @if (frequentlyUsed().length) {\n <div class=\"dm-emoji-picker-category-label\">Frequently Used</div>\n @for (item of frequentlyUsed(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n @for (cat of categoryNames(); track cat) {\n <div class=\"dm-emoji-picker-category-label\" [attr.data-category]=\"cat\">{{ cat }}</div>\n @for (item of getCategory(cat); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n }\n </div>\n </div>\n }\n `,\n})\nexport class DomternalEmojiPickerComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly emojis = input.required<EmojiPickerItem[]>();\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeCategory = signal('');\n\n private anchorEl: HTMLElement | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject(ElementRef);\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private eventHandler: ((...args: unknown[]) => void) | null = null;\n private cleanupFloating: (() => void) | null = null;\n\n readonly categories = computed(() => {\n const map = new Map<string, EmojiPickerItem[]>();\n for (const item of this.emojis()) {\n let list = map.get(item.group);\n if (!list) {\n list = [];\n map.set(item.group, list);\n }\n list.push(item);\n }\n return map;\n });\n\n readonly categoryNames = computed(() => [...this.categories().keys()]);\n\n readonly filteredEmojis = computed(() => {\n const query = this.searchQuery().toLowerCase();\n if (!query) return [];\n const storage = this.getEmojiStorage();\n const searchFn = storage?.['searchEmoji'] as ((q: string) => EmojiPickerItem[]) | undefined;\n if (searchFn) {\n return searchFn(query);\n }\n return this.emojis().filter(\n (item) =>\n item.name.includes(query) ||\n item.group.toLowerCase().includes(query),\n );\n });\n\n readonly frequentlyUsed = computed(() => {\n // Re-evaluate when panel opens (isOpen changes)\n this.isOpen();\n const storage = this.getEmojiStorage();\n const getFreq = storage?.['getFrequentlyUsed'] as (() => string[]) | undefined;\n if (!getFreq) return [];\n const names = getFreq();\n if (!names.length) return [];\n const nameMap = storage!['_nameMap'] as Map<string, EmojiPickerItem> | undefined;\n if (!nameMap) return [];\n return names.slice(0, 16).map((n) => nameMap.get(n)).filter(Boolean) as EmojiPickerItem[];\n });\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => this.setupEventListener(editor));\n });\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n getCategory(cat: string): EmojiPickerItem[] {\n return this.categories().get(cat) ?? [];\n }\n\n categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n }\n\n formatName(name: string): string {\n return name.replace(/_/g, ' ');\n }\n\n onSearch(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.searchQuery.set(input.value);\n }\n\n selectEmoji(item: EmojiPickerItem): void {\n const editor = this.editor();\n const cmd = editor.commands as Record<string, (...args: unknown[]) => boolean>;\n if (cmd['insertEmoji']) {\n cmd['insertEmoji'](item.name);\n }\n this.close();\n }\n\n scrollToCategory(cat: string): void {\n this.searchQuery.set('');\n this.activeCategory.set(cat);\n\n // Wait for search to clear and DOM to update\n requestAnimationFrame(() => {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n const label = grid.querySelector(`[data-category=\"${cat}\"]`) as HTMLElement | null;\n if (label) {\n // Use manual scrollTop instead of scrollIntoView to avoid scrolling the page\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop });\n // Focus first emoji swatch after scroll completes\n setTimeout(() => {\n const firstSwatch = label.nextElementSibling;\n if (firstSwatch instanceof HTMLElement && firstSwatch.classList.contains('dm-emoji-swatch')) {\n firstSwatch.focus();\n }\n }, 50);\n }\n });\n }\n\n onGridKeydown(event: KeyboardEvent): void {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n const swatches = Array.from(grid.querySelectorAll('.dm-emoji-swatch')) as HTMLElement[];\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n let idx = swatches.indexOf(current);\n if (idx === -1) {\n // Focus is on grid container, not a swatch — enter the grid\n if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n swatches[0]?.focus();\n }\n return;\n }\n const cols = 8;\n let next = idx;\n switch (event.key) {\n case 'ArrowRight': event.preventDefault(); next = Math.min(idx + 1, swatches.length - 1); break;\n case 'ArrowLeft': event.preventDefault(); next = Math.max(idx - 1, 0); break;\n case 'ArrowDown': event.preventDefault(); next = Math.min(idx + cols, swatches.length - 1); break;\n case 'ArrowUp': event.preventDefault(); next = Math.max(idx - cols, 0); break;\n case 'Enter': case ' ': event.preventDefault(); swatches[idx]?.click(); return;\n default: return;\n }\n swatches[next]?.focus();\n }\n\n onGridScroll(): void {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid || this.searchQuery()) return;\n\n const labels = Array.from(grid.querySelectorAll('.dm-emoji-picker-category-label[data-category]')) as HTMLElement[];\n\n let currentCat = '';\n for (const label of labels) {\n if (label.offsetTop - grid.offsetTop <= grid.scrollTop + 20) {\n currentCat = label.getAttribute('data-category') ?? '';\n }\n }\n\n if (currentCat && currentCat !== this.activeCategory()) {\n this.activeCategory.set(currentCat);\n }\n }\n\n close(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.isOpen.set(false);\n this.setStorageOpen(false);\n this.searchQuery.set('');\n this.anchorEl = null;\n this.removeGlobalListeners();\n this.editor().view.focus();\n }\n\n private setupEventListener(editor: Editor): void {\n this.cleanup();\n\n this.eventHandler = (...args: unknown[]) => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n this.ngZone.run(() => {\n if (this.isOpen()) {\n this.close();\n return;\n }\n\n this.anchorEl = data?.anchorElement ?? null;\n this.isOpen.set(true);\n this.setStorageOpen(true);\n this.searchQuery.set('');\n\n // Set initial active category\n const names = this.categoryNames();\n if (names.length > 0 && names[0]) {\n this.activeCategory.set(names[0]);\n }\n\n this.addGlobalListeners();\n\n // Position panel and focus search input after render\n requestAnimationFrame(() => {\n const panel = this.elRef.nativeElement.querySelector('.dm-emoji-picker') as HTMLElement | null;\n if (panel && this.anchorEl) {\n this.cleanupFloating?.();\n this.cleanupFloating = positionFloatingOnce(this.anchorEl, panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = this.elRef.nativeElement.querySelector('.dm-emoji-picker-search input') as HTMLInputElement | null;\n input?.focus({ preventScroll: true });\n });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n }\n\n private addGlobalListeners(): void {\n this.clickOutsideHandler = (e: Event) => {\n const target = e.target as Node;\n if (\n this.isOpen() &&\n !this.elRef.nativeElement.contains(target) &&\n target !== this.anchorEl &&\n !this.anchorEl?.contains(target)\n ) {\n this.ngZone.run(() => this.close());\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n this.keydownHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen()) {\n e.preventDefault();\n this.ngZone.run(() => this.close());\n }\n };\n document.addEventListener('keydown', this.keydownHandler);\n }\n\n private removeGlobalListeners(): void {\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.keydownHandler) {\n document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n }\n\n private setStorageOpen(open: boolean): void {\n const storage = this.getEmojiStorage();\n if (storage) storage['isOpen'] = open;\n // Dispatch a no-op transaction so the toolbar's transaction handler\n // re-evaluates isActiveFn and shows the button as active/inactive.\n const editor = this.editor();\n editor.view.dispatch(editor.view.state.tr);\n }\n\n private getEmojiStorage(): Record<string, unknown> | null {\n const storage = this.editor().storage as Record<string, unknown>;\n return (storage['emoji'] as Record<string, unknown>) ?? null;\n }\n\n private cleanup(): void {\n this.removeGlobalListeners();\n if (this.eventHandler) {\n const editor = this.editor();\n (editor.off as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n this.eventHandler = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"domternal-angular.mjs","sources":["../../src/lib/editor.component.ts","../../src/lib/toolbar.component.ts","../../src/lib/bubble-menu.component.ts","../../src/lib/floating-menu.component.ts","../../src/lib/emoji-picker.component.ts","../../src/lib/notion-color-picker.component.ts","../../src/domternal-angular.ts"],"sourcesContent":["import type { ElementRef, OnDestroy } from '@angular/core';\nimport {\n Component,\n ViewEncapsulation,\n afterNextRender,\n forwardRef,\n signal,\n ChangeDetectionStrategy,\n inject,\n NgZone,\n effect,\n input,\n output,\n viewChild,\n untracked,\n} from '@angular/core';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type { Content, AnyExtension, FocusPosition, JSONContent, TransactionEventProps, FocusEventProps } from '@domternal/core';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [Document, Paragraph, Text, BaseKeymap, History];\n\n@Component({\n selector: 'domternal-editor',\n template: '<div #editorRef></div>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'dm-editor', 'data-dm-editor-ui': '' },\n styles: [`:host { display: block; }`],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DomternalEditorComponent),\n multi: true,\n },\n ],\n})\nexport class DomternalEditorComponent implements ControlValueAccessor, OnDestroy {\n // === Template ref ===\n readonly editorRef = viewChild.required<ElementRef<HTMLDivElement>>('editorRef');\n\n // === Inputs ===\n readonly extensions = input<AnyExtension[]>([]);\n readonly content = input<Content>('');\n readonly editable = input(true);\n readonly autofocus = input<FocusPosition>(false);\n readonly outputFormat = input<'html' | 'json'>('html');\n\n // === Outputs ===\n readonly editorCreated = output<Editor>();\n readonly contentUpdated = output<{ editor: Editor }>();\n readonly selectionChanged = output<{ editor: Editor }>();\n readonly focusChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly blurChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly editorDestroyed = output();\n\n // === Signals (read-only public state) ===\n private _htmlContent = signal('');\n private _jsonContent = signal<JSONContent | null>(null);\n private _isEmpty = signal(true);\n private _isFocused = signal(false);\n // Candidate for linkedSignal(editable) once min Angular version is >=20\n private _isEditable = signal(true);\n\n readonly htmlContent = this._htmlContent.asReadonly();\n readonly jsonContent = this._jsonContent.asReadonly();\n readonly isEmpty = this._isEmpty.asReadonly();\n readonly isFocused = this._isFocused.asReadonly();\n readonly isEditable = this._isEditable.asReadonly();\n\n // === Editor instance ===\n private _editor: Editor | null = null;\n\n get editor(): Editor | null {\n return this._editor;\n }\n\n // === ControlValueAccessor ===\n private onChange: (value: Content) => void = () => { /* noop until registerOnChange */ };\n private onTouched: () => void = () => { /* noop until registerOnTouched */ };\n private _pendingContent: Content | null = null;\n\n private ngZone = inject(NgZone);\n\n constructor() {\n afterNextRender(() => {\n this.createEditor();\n });\n\n // React to editable input changes\n effect(() => {\n const editable = this.editable();\n if (!this._editor || this._editor.isDestroyed) return;\n const ed = this._editor;\n untracked(() => {\n ed.setEditable(editable);\n this._isEditable.set(editable);\n });\n });\n\n // React to content input changes\n effect(() => {\n const content = this.content();\n const format = this.outputFormat();\n if (!this._editor || this._editor.isDestroyed) return;\n const ed = this._editor;\n untracked(() => {\n const current = format === 'html'\n ? ed.getHTML()\n : JSON.stringify(ed.getJSON());\n const incoming = format === 'html'\n ? (content as string)\n : JSON.stringify(content);\n if (incoming !== current) {\n ed.setContent(content, false);\n }\n });\n });\n\n // React to extensions input changes\n effect(() => {\n this.extensions(); // track the signal\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n this.recreateEditor();\n });\n });\n }\n\n // === Lifecycle ===\n\n ngOnDestroy(): void {\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.destroy();\n this.editorDestroyed.emit();\n }\n this._editor = null;\n }\n\n // === ControlValueAccessor implementation ===\n\n writeValue(value: Content): void {\n if (!this._editor || this._editor.isDestroyed) {\n this._pendingContent = value;\n return;\n }\n\n // Compare current content to avoid unnecessary setContent (which resets cursor)\n if (this.outputFormat() === 'html') {\n if (value === this._editor.getHTML()) return;\n } else {\n if (JSON.stringify(value) === JSON.stringify(this._editor.getJSON())) return;\n }\n\n this._editor.setContent(value, false);\n }\n\n registerOnChange(fn: (value: Content) => 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._isEditable.set(!isDisabled);\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.setEditable(!isDisabled);\n }\n }\n\n // === Private ===\n\n private recreateEditor(): void {\n if (!this._editor || this._editor.isDestroyed) return;\n const currentContent = this._editor.getJSON();\n this._editor.destroy();\n this.editorDestroyed.emit();\n this._pendingContent = currentContent;\n this.createEditor();\n }\n\n private createEditor(): void {\n const initialContent = this._pendingContent ?? this.content();\n this._pendingContent = null;\n\n this._editor = new Editor({\n element: this.editorRef().nativeElement,\n extensions: [...DEFAULT_EXTENSIONS, ...this.extensions()],\n content: initialContent,\n editable: this.editable(),\n autofocus: this.autofocus(),\n });\n\n this._isEditable.set(this.editable());\n\n // Set initial signal values\n this._htmlContent.set(this._editor.getHTML());\n this._jsonContent.set(this._editor.getJSON());\n this._isEmpty.set(this._editor.isEmpty);\n\n const editor = this._editor;\n editor.on('transaction', ({ transaction }: TransactionEventProps) => {\n this.ngZone.run(() => {\n const ed = editor;\n\n if (transaction.docChanged) {\n const html = ed.getHTML();\n this._htmlContent.set(html);\n this._jsonContent.set(ed.getJSON());\n this._isEmpty.set(ed.isEmpty);\n this.contentUpdated.emit({ editor: ed });\n\n const value: Content = this.outputFormat() === 'html' ? html : ed.getJSON();\n this.onChange(value);\n }\n\n if (!transaction.docChanged && transaction.selectionSet) {\n this.selectionChanged.emit({ editor: ed });\n }\n });\n });\n\n editor.on('focus', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(true);\n this.focusChanged.emit({ editor, event });\n });\n });\n\n editor.on('blur', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(false);\n this.blurChanged.emit({ editor, event });\n this.onTouched();\n });\n });\n\n // Emit editor created\n this.ngZone.run(() => {\n this.editorCreated.emit(editor);\n });\n }\n}\n","import type { OnDestroy } from '@angular/core';\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n signal,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n ToolbarController,\n defaultIcons,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n ToolbarItem,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarControllerEditor,\n IconSet,\n ToolbarGroup,\n ToolbarLayoutEntry,\n\n Editor} from '@domternal/core';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\n@Component({\n selector: 'domternal-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'dm-toolbar',\n 'role': 'toolbar',\n 'data-dm-editor-ui': '',\n '[attr.aria-label]': '\"Editor formatting\"',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n @for (group of groups(); track group.name; let gi = $index) {\n @if (gi > 0) {\n <div class=\"dm-toolbar-separator\" role=\"separator\"></div>\n }\n <div class=\"dm-toolbar-group\" role=\"group\" [attr.aria-label]=\"group.name || 'Tools'\">\n @for (item of group.items; track item.name) {\n @if (item.type === 'button') {\n <button\n type=\"button\"\n class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isActive(item.name)\"\n [attr.aria-pressed]=\"isActive(item.name)\"\n [attr.aria-expanded]=\"getAriaExpanded(asButton(item))\"\n [attr.aria-label]=\"asButton(item).label\"\n [title]=\"getTooltip(asButton(item))\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(item.name)\"\n [innerHTML]=\"getCachedIcon(asButton(item).icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onButtonClick(asButton(item), $event)\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n }\n @if (item.type === 'dropdown') {\n <div class=\"dm-toolbar-dropdown-wrapper\">\n <button\n type=\"button\"\n class=\"dm-toolbar-button dm-toolbar-dropdown-trigger\"\n [class.dm-toolbar-button--active]=\"isDropdownActive(asDropdown(item))\"\n [attr.aria-expanded]=\"openDropdown() === asDropdown(item).name\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-label]=\"asDropdown(item).label\"\n [title]=\"asDropdown(item).label\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(asDropdown(item).name)\"\n [attr.data-dropdown]=\"asDropdown(item).name\"\n [innerHTML]=\"getDropdownTriggerHtml(asDropdown(item))\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownToggle(asDropdown(item))\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n @if (openDropdown() === asDropdown(item).name) {\n @if (asDropdown(item).layout === 'grid') {\n <div class=\"dm-toolbar-dropdown-panel dm-color-palette\" role=\"menu\"\n [attr.style]=\"getGridStyle(asDropdown(item))\">\n @for (sub of asDropdown(item).items; track sub.name) {\n @if (sub.color) {\n <button\n type=\"button\"\n class=\"dm-color-swatch\"\n [class.dm-color-swatch--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [title]=\"sub.label\"\n [style.background-color]=\"sub.color\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n } @else {\n <button\n type=\"button\"\n class=\"dm-color-palette-reset\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label)\"\n [attr.tabindex]=\"-1\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n }\n }\n </div>\n } @else {\n <div class=\"dm-toolbar-dropdown-panel\" role=\"menu\"\n [attr.data-display-mode]=\"asDropdown(item).displayMode ?? null\">\n @for (sub of asDropdown(item).items; track sub.name) {\n <button\n type=\"button\"\n class=\"dm-toolbar-dropdown-item\"\n [class.dm-toolbar-dropdown-item--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [attr.style]=\"sub.style ?? null\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub, $event)\"\n ></button>\n }\n </div>\n }\n }\n </div>\n }\n }\n </div>\n }\n `,\n})\nexport class DomternalToolbarComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly icons = input<IconSet | null>(null);\n readonly layout = input<ToolbarLayoutEntry[]>();\n\n /** Exposed state signals for template */\n readonly groups = signal<ToolbarGroup[]>([]);\n readonly focusedIndex = signal(0);\n readonly openDropdown = signal<string | null>(null);\n /** Bumped on active state changes to trigger re-evaluation of isActive() */\n readonly activeVersion = signal(0);\n\n private controller: ToolbarController | null = null;\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private dismissOverlayHandler: (() => void) | null = null;\n private editorEl: HTMLElement | null = null;\n private cleanupFloating: (() => void) | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private sanitizer = inject(DomSanitizer);\n\n /** SafeHtml cache - same reference returned for same key, prevents DOM churn */\n private htmlCache = new Map<string, SafeHtml>();\n\n private readonly dropdownCaret = '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"><path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => { this.setupController(editor); });\n });\n }\n\n ngOnDestroy(): void {\n this.destroyController();\n }\n\n // === Template helpers ===\n\n isActive(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.activeMap.get(name) ?? false;\n }\n\n isDisabled(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.disabledMap.get(name) ?? false;\n }\n\n isDropdownActive(dropdown: ToolbarDropdown): boolean {\n if (dropdown.layout === 'grid') return false; // color dropdowns use bar indicator instead\n if (dropdown.dynamicLabel) return false; // label text already communicates state\n this.activeVersion(); // subscribe to changes\n return dropdown.items.some((item: ToolbarButton) => this.controller?.activeMap.get(item.name) ?? false);\n }\n\n /** Returns trigger innerHTML: dynamic icon + caret (+ color indicator for grid dropdowns). */\n getDropdownTriggerHtml(dropdown: ToolbarDropdown): SafeHtml {\n this.activeVersion(); // subscribe to changes\n const activeItem = dropdown.items.find((item: ToolbarButton) => this.controller?.activeMap.get(item.name));\n\n if (dropdown.layout === 'grid') {\n const color = activeItem?.color ?? dropdown.defaultIndicatorColor ?? null;\n const key = `tr:${dropdown.icon}:${color ?? ''}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n let html = this.resolveIconSvg(dropdown.icon) + this.dropdownCaret;\n if (color) {\n html += `<span class=\"dm-toolbar-color-indicator\" style=\"background-color: ${color}\"></span>`;\n }\n cached = this.sanitizer.bypassSecurityTrustHtml(html);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n // Non-grid dropdown - show active sub-item's label as text\n if (dropdown.dynamicLabel) {\n if (activeItem) return this.getCachedTriggerLabel(activeItem.label);\n\n // Try reading CSS property from DOM (inline or computed depending on property)\n if (dropdown.computedStyleProperty) {\n let computed: string | null;\n if (dropdown.computedStyleProperty === 'font-family') {\n // Font-family: read ONLY inline style (explicit mark), not computed (browser default)\n computed = this.getInlineStyleAtCursor(dropdown.computedStyleProperty);\n if (computed) {\n const first = computed.split(',')[0]?.replace(/['\"]+/g, '').trim();\n computed = first ?? null;\n }\n } else {\n computed = this.getComputedStyleAtCursor(dropdown.computedStyleProperty);\n }\n if (computed) return this.getCachedTriggerLabel(computed);\n }\n\n if (dropdown.dynamicLabelFallback) {\n return this.getCachedTriggerLabel(dropdown.dynamicLabelFallback);\n }\n return this.getCachedTriggerLabel(dropdown.icon, true);\n }\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return this.getCachedTriggerIcon(icon);\n }\n\n /**\n * Returns 'true' when an emitEvent button's panel is open, null otherwise.\n * Maps to [attr.aria-expanded] - null removes the attribute entirely.\n */\n getAriaExpanded(item: ToolbarButton): string | null {\n if (!item.emitEvent) return null;\n this.activeVersion(); // subscribe to changes\n return this.controller?.expandedMap.get(item.name) ? 'true' : null;\n }\n\n getFlatIndex(name: string): number {\n return this.controller?.getFlatIndex(name) ?? -1;\n }\n\n getTooltip(item: ToolbarButton): string {\n if (item.shortcut) {\n const parts = item.shortcut.split('-');\n const mapped = parts.map((p: string) => {\n if (p === 'Mod') return isMac ? '\\u2318' : 'Ctrl';\n if (p === 'Shift') return isMac ? '\\u21E7' : 'Shift';\n if (p === 'Alt') return isMac ? '\\u2325' : 'Alt';\n return p.toUpperCase();\n });\n const shortcut = isMac ? mapped.join('') : mapped.join('+');\n return `${item.label} (${shortcut})`;\n }\n return item.label;\n }\n\n getCachedIcon(name: string): SafeHtml {\n const key = `i:${name}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(this.resolveIconSvg(name));\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedTriggerLabel(label: string, isIcon?: boolean): SafeHtml {\n const key = `tl:${label}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n const content = isIcon ? this.resolveIconSvg(label) : label;\n cached = this.sanitizer.bypassSecurityTrustHtml(\n `<span class=\"dm-toolbar-trigger-label\">${content}</span>` + this.dropdownCaret,\n );\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedTriggerIcon(iconName: string): SafeHtml {\n const key = `t:${iconName}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(this.resolveIconSvg(iconName) + this.dropdownCaret);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedItemContent(iconName: string, label: string, displayMode?: 'icon-text' | 'text' | 'icon'): SafeHtml {\n const mode = displayMode ?? 'icon-text';\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n let html: string;\n if (mode === 'text') {\n html = label;\n } else if (mode === 'icon') {\n html = this.resolveIconSvg(iconName);\n } else {\n html = this.resolveIconSvg(iconName) + ' ' + label;\n }\n cached = this.sanitizer.bypassSecurityTrustHtml(html);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n asButton(item: ToolbarItem): ToolbarButton {\n return item as ToolbarButton;\n }\n\n asDropdown(item: ToolbarItem): ToolbarDropdown {\n return item as ToolbarDropdown;\n }\n\n getGridStyle(dropdown: ToolbarDropdown): string {\n return `--dm-palette-columns: ${String(dropdown.gridColumns ?? 10)}`;\n }\n\n // === Event handlers ===\n\n onButtonClick(item: ToolbarButton, event?: MouseEvent): void {\n // Close any open dropdown when clicking a regular button\n if (this.openDropdown()) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.syncState();\n }\n\n if (item.emitEvent) {\n const anchor = event?.currentTarget as HTMLElement | undefined;\n // emitEvent is a dynamic string; cast needed to bypass strict EventEmitter<EditorEvents> typing\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n this.controller?.executeCommand(item);\n\n // If the button was activated via keyboard (Enter/Space on a focused\n // toolbar button), refocus the editor so the browser renders the\n // ::selection highlight for the still-active range.\n // Keyboard-triggered click events have detail === 0.\n // Always refocus editor after executing a command via toolbar button.\n // Mouse clicks already keep focus via mousedown.preventDefault();\n // keyboard activations (Enter/Space) need explicit refocus.\n requestAnimationFrame(() => { this.editor().view.focus(); });\n }\n\n onDropdownToggle(dropdown: ToolbarDropdown): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.toggleDropdown(dropdown.name);\n this.syncState();\n\n // Position the panel after Angular renders it (tracks resize, not scroll)\n if (this.openDropdown()) {\n requestAnimationFrame(() => {\n const trigger = this.elRef.nativeElement.querySelector<HTMLElement>(\n `[aria-expanded=\"true\"]`,\n );\n const panel = trigger?.parentElement?.querySelector<HTMLElement>(\n '.dm-toolbar-dropdown-panel',\n );\n if (trigger && panel) {\n // List dropdowns align to trigger's left edge; grid/picker dropdowns center\n const placement = dropdown.layout === 'grid' ? 'bottom' : 'bottom-start';\n this.cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n }\n });\n }\n }\n\n onDropdownItemClick(item: ToolbarButton, event?: Event): void {\n // For emitEvent items, use the dropdown trigger as anchor (sub-item gets removed when dropdown closes)\n let anchor: HTMLElement | undefined;\n if (item.emitEvent && event?.currentTarget) {\n const wrapper = (event.currentTarget as HTMLElement).closest('.dm-toolbar-dropdown-wrapper');\n anchor = wrapper?.querySelector('.dm-toolbar-dropdown-trigger') as HTMLElement | undefined;\n }\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n if (item.emitEvent) {\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n } else {\n this.controller?.executeCommand(item);\n }\n\n // Refocus editor so ::selection highlight stays visible\n requestAnimationFrame(() => { this.editor().view.focus(); });\n }\n\n onButtonFocus(name: string): void {\n const index = this.controller?.getFlatIndex(name) ?? -1;\n if (index >= 0) {\n this.controller?.setFocusedIndex(index);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (!this.controller) return;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.controller.navigateNext();\n this.focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.controller.navigatePrev();\n this.focusCurrentButton();\n break;\n case 'Home':\n event.preventDefault();\n this.controller.navigateFirst();\n this.focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n this.controller.navigateLast();\n this.focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (this.openDropdown()) {\n this.focusDropdownItem(1);\n } else {\n const btn = document.activeElement as HTMLElement | null;\n if (btn?.getAttribute('aria-haspopup') && btn.closest('.dm-toolbar')) {\n btn.click();\n requestAnimationFrame(() => { this.focusDropdownItem(0, true); });\n }\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (this.openDropdown()) {\n this.focusDropdownItem(-1);\n }\n break;\n }\n case 'Escape':\n if (this.openDropdown()) {\n event.preventDefault();\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller.closeDropdown();\n this.syncState();\n this.focusCurrentButton();\n }\n break;\n }\n }\n\n // === Private ===\n\n private focusDropdownItem(direction: number, first?: boolean): void {\n const panel = this.elRef.nativeElement.querySelector<HTMLElement>('.dm-toolbar-dropdown-panel');\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"menuitem\"]'));\n if (!items.length) return;\n if (first) { items[0]?.focus(); return; }\n const current = document.activeElement as HTMLElement;\n const idx = items.indexOf(current);\n const next = idx === -1\n ? (direction > 0 ? 0 : items.length - 1)\n : (idx + direction + items.length) % items.length;\n items[next]?.focus();\n }\n\n private resolveIconSvg(name: string): string {\n const customIcons = this.icons();\n if (customIcons) {\n return customIcons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }\n\n private setupController(editor: Editor): void {\n this.destroyController();\n\n this.controller = new ToolbarController(\n editor as unknown as ToolbarControllerEditor,\n () => { this.ngZone.run(() => { this.syncState(); }); },\n this.layout(),\n );\n this.controller.subscribe();\n this.syncState();\n\n // Click outside to close dropdown\n this.clickOutsideHandler = (e: Event) => {\n if (this.openDropdown() && !this.elRef.nativeElement.contains(e.target as Node)) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => { this.syncState(); });\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n // Listen for dismiss-overlays (e.g. table handle clicks that stopPropagation on mousedown)\n this.editorEl = editor.view.dom.closest('.dm-editor');\n if (this.editorEl) {\n this.dismissOverlayHandler = () => {\n if (this.openDropdown()) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => { this.syncState(); });\n }\n };\n this.editorEl.addEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n }\n }\n\n private destroyController(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.dismissOverlayHandler && this.editorEl) {\n this.editorEl.removeEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n this.dismissOverlayHandler = null;\n this.editorEl = null;\n }\n if (this.controller) {\n this.controller.destroy();\n this.controller = null;\n }\n }\n\n private syncState(): void {\n if (!this.controller) return;\n\n // Only update groups if they actually changed (initial build or rebuild)\n const controllerGroups = this.controller.groups;\n if (this.groups().length !== controllerGroups.length) {\n this.groups.set(controllerGroups);\n }\n\n this.focusedIndex.set(this.controller.focusedIndex);\n this.openDropdown.set(this.controller.openDropdown);\n\n // Bump version to trigger isActive() re-evaluation without creating new objects\n this.activeVersion.update(v => v + 1);\n }\n\n private getComputedStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n // Prefer inline style (explicit mark) over computed style (inherited from heading, etc.)\n return el.style.getPropertyValue(prop)\n || window.getComputedStyle(el).getPropertyValue(prop)\n || null;\n } catch {\n return null;\n }\n }\n\n /** Read only inline style - no computed fallback (used for font-family). */\n private getInlineStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n }\n\n private focusCurrentButton(): void {\n const idx = this.controller?.focusedIndex ?? 0;\n const buttons = this.elRef.nativeElement.querySelectorAll<HTMLButtonElement>(\n '.dm-toolbar-button'\n );\n buttons[idx]?.focus();\n }\n}\n","import type { OnDestroy, ElementRef } from '@angular/core';\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n signal,\n effect,\n inject,\n NgZone,\n viewChild,\n afterNextRender,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultBubbleContexts,\n defaultIcons,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type { BubbleMenuOptions, IconSet, ToolbarButton, ToolbarDropdown ,\n Editor} from '@domternal/core';\n\ninterface BubbleMenuSeparator { type: 'separator'; name: string }\ntype BubbleMenuItem = ToolbarButton | ToolbarDropdown | BubbleMenuSeparator;\n\n/** Minimal ProseMirror Selection shape for duck-typing (avoids instanceof issues across bundles) */\ninterface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\ninterface SelectionShape {\n empty: boolean;\n $from: ResolvedPosShape;\n $to: ResolvedPosShape;\n node?: { type: { name: string } };\n}\n\n/** Check if a resolved position is inside a table cell or header. */\nfunction isInsideTableCell($pos: ResolvedPosShape): boolean {\n for (let d = $pos.depth; d > 0; d--) {\n const name = $pos.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return true;\n }\n return false;\n}\n\n/** ProseMirror schema shape for mark filtering */\ninterface SchemaShape {\n nodes: Record<string, { allowsMarkType: (mt: unknown) => boolean }>;\n marks: Record<string, unknown>;\n}\n\n@Component({\n selector: 'domternal-bubble-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div #menuEl class=\"dm-bubble-menu\" role=\"toolbar\" aria-label=\"Text formatting\">\n @for (item of resolvedItems(); track item.name) {\n @if (item.type === 'separator') {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n } @else if (item.type === 'dropdown') {\n <div class=\"dm-toolbar-dropdown-wrapper\" [attr.data-dropdown-wrapper]=\"asDropdown(item).name\">\n <button type=\"button\"\n class=\"dm-toolbar-button dm-toolbar-dropdown-trigger\"\n [class.dm-toolbar-button--active]=\"isDropdownActive(asDropdown(item))\"\n [attr.aria-expanded]=\"openDropdown() === asDropdown(item).name\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-label]=\"asDropdown(item).label\"\n [title]=\"asDropdown(item).label\"\n [attr.data-dropdown]=\"asDropdown(item).name\"\n [innerHTML]=\"getDropdownTriggerHtml(asDropdown(item))\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownToggle(asDropdown(item), $event)\"></button>\n @if (openDropdown() === asDropdown(item).name) {\n <div class=\"dm-toolbar-dropdown-panel\" role=\"menu\"\n data-dm-editor-ui\n [attr.data-dropdown-panel]=\"asDropdown(item).name\">\n @for (sub of asDropdown(item).items; track sub.name) {\n <button type=\"button\"\n class=\"dm-toolbar-dropdown-item\"\n [class.dm-toolbar-dropdown-item--active]=\"isSubItemActive(sub.name)\"\n role=\"menuitem\"\n [attr.aria-label]=\"sub.label\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"></button>\n }\n </div>\n }\n </div>\n } @else {\n <button type=\"button\" class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isItemActive(asButton(item))\"\n [attr.aria-pressed]=\"isItemActive(asButton(item))\"\n [disabled]=\"isItemDisabled(asButton(item))\"\n [title]=\"asButton(item).label\"\n [attr.aria-label]=\"asButton(item).label\"\n [innerHTML]=\"getCachedIcon(asButton(item).icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"executeCommand(asButton(item), $event)\"></button>\n }\n }\n @if (showColorPickerButton() && !isNodeSelection()) {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n <button #colorBtn type=\"button\" class=\"dm-toolbar-button dm-ncp-trigger\"\n [class.dm-toolbar-button--active]=\"hasAnyColor()\"\n title=\"Text and background color\"\n aria-label=\"Text and background color\"\n aria-haspopup=\"dialog\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"openColorPicker(colorBtn)\">\n <span class=\"dm-ncp-trigger-glyph\"\n [style.color]=\"currentTextColorVar()\">A</span>\n <span class=\"dm-ncp-trigger-underline\"\n [style.background-color]=\"currentBgColorVar()\"></span>\n </button>\n }\n @if (showBlockMenuButton() && !isNodeSelection()) {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n <button #blockMenuBtn type=\"button\" class=\"dm-toolbar-button\"\n [disabled]=\"blockMenuButtonDisabled()\"\n [title]=\"blockMenuButtonDisabled() ? 'Block actions (select within a single block)' : 'More options'\"\n aria-label=\"More options\"\n aria-haspopup=\"menu\"\n [innerHTML]=\"getCachedIcon('dotsThree')\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"openBlockContextMenu(blockMenuBtn)\"></button>\n }\n <ng-content />\n </div>\n `,\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalBubbleMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<BubbleMenuOptions['shouldShow']>();\n readonly placement = input<'top' | 'bottom'>('top');\n readonly offset = input<number>(8);\n readonly updateDelay = input(0);\n\n /** Fixed item names (e.g. ['bold', 'italic', 'code']). Omit for auto mode (all format items). */\n readonly items = input<string[] | undefined>(undefined);\n\n /** Context-aware: map context names to item arrays, `true` for all valid items, or `null` to disable */\n readonly contexts = input<Record<string, string[] | true | null> | undefined>(undefined);\n\n /**\n * Custom icon overrides. Falls back to default Phosphor icons for unmapped keys.\n * For nullable bindings, use `iconsSignal() ?? {}` to satisfy strict template checks.\n */\n readonly icons = input<IconSet | undefined>(undefined);\n\n /**\n * Returns the effective contexts map: the explicit `contexts` input\n * when provided, the standard default when neither `contexts` nor\n * `items` is set, or `undefined` (items-mode) when only `items` is set.\n * The standard default is richer when the editor sits inside\n * `.dm-notion-mode`.\n */\n private resolveContexts(editor: Editor): Record<string, string[] | true | null> | undefined {\n const explicit = this.contexts();\n if (explicit !== undefined) return explicit;\n if (this.items() !== undefined) return undefined;\n return defaultBubbleContexts(editor);\n }\n\n /** Internal - updated on transactions. Not meant to be set from outside. */\n readonly resolvedItems = signal<BubbleMenuItem[]>([]);\n\n /** Internal - true when the BlockContextMenu extension is loaded; toggles the \"...\" trailing button. */\n readonly showBlockMenuButton = signal(false);\n\n /** Internal - true when the selection spans more than one top-level block; the \"...\" trigger is disabled in that case because block-level commands have no unambiguous target. */\n readonly blockMenuButtonDisabled = signal(false);\n\n /** Internal - true when the current selection is a NodeSelection (image, HR). The text-color and block-context triggers are hidden in that case: a node has no inline text to color and its bubble menu already exposes node-specific actions. */\n readonly isNodeSelection = signal(false);\n\n /** Internal - true when the NotionColorPicker extension is loaded; toggles the \"A\" color trigger. */\n readonly showColorPickerButton = signal(false);\n\n /** Current text color CSS variable expression for the trigger glyph (null = default). */\n readonly currentTextColorVar = signal<string | null>(null);\n\n /** Current background color CSS variable expression for the trigger underline (null = transparent). */\n readonly currentBgColorVar = signal<string | null>(null);\n\n /** Internal - true when the selection has any token-based text or background color applied. */\n readonly hasAnyColor = signal(false);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private pluginKey: PluginKey;\n\n private sanitizer = inject(DomSanitizer);\n private ngZone = inject(NgZone);\n\n private activeVersion = signal(0);\n private itemMap = new Map<string, ToolbarButton>();\n private dropdownMap = new Map<string, ToolbarDropdown>();\n private activeMap = new Map<string, boolean>();\n private disabledMap = new Map<string, boolean>();\n private htmlCache = new Map<string, SafeHtml>();\n private bubbleDefaults = new Map<string, BubbleMenuItem[]>();\n private transactionHandler: (() => void) | null = null;\n\n // Dropdown state for bubble-menu-embedded dropdowns (e.g. text-align).\n readonly openDropdown = signal<string | null>(null);\n private dropdownCleanupFloating: (() => void) | null = null;\n private dropdownOutsideHandler: ((e: MouseEvent) => void) | null = null;\n private dropdownKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private dropdownDismissHandler: (() => void) | null = null;\n\n private readonly dropdownCaret =\n '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">' +\n '<path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n constructor() {\n // Each component instance needs a unique plugin key so that multiple\n // bubble-menus mounted in the same editor do not collide. Prefer\n // crypto.randomUUID over Math.random() for collision-free uniqueness\n // (Math.random across two simultaneous mounts has a small but real\n // collision probability, and SSR may share the random seed).\n const crypto = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const suffix =\n crypto?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8);\n this.pluginKey = new PluginKey('angularBubbleMenu-' + suffix);\n\n // Cache keys do not include icon-set identity, so flush on swap.\n effect(() => {\n this.icons();\n this.htmlCache.clear();\n });\n\n afterNextRender(() => {\n const editor = this.editor();\n const ctxs = this.resolveContexts(editor);\n let shouldShowFn = this.shouldShow();\n\n if (!shouldShowFn) {\n if (ctxs) {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n const context = this.detectContext(state.selection, ctxs);\n if (!context) return false;\n if (context in ctxs) {\n const val = ctxs[context];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return this.bubbleDefaults.has(context);\n };\n } else {\n // Auto/items mode: show when any endpoint's parent allows marks\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n if (state.selection.empty) return false;\n if (state.selection.node) return this.bubbleDefaults.has(state.selection.node.type.name);\n if (isInsideTableCell(state.selection.$from)) return false;\n return state.selection.$from.parent.type.spec.marks !== ''\n || state.selection.$to.parent.type.spec.marks !== '';\n };\n }\n }\n\n const plugin = createBubbleMenuPlugin({\n pluginKey: this.pluginKey,\n editor,\n element: this.menuEl().nativeElement,\n shouldShow: shouldShowFn,\n placement: this.placement(),\n offset: this.offset(),\n updateDelay: this.updateDelay(),\n });\n editor.registerPlugin(plugin);\n this.setupItemTracking(editor);\n });\n }\n\n ngOnDestroy(): void {\n const editor = this.editor();\n if (this.transactionHandler) {\n editor.off('transaction', this.transactionHandler);\n }\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n\n // === Template helpers ===\n\n isItemActive(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.activeMap.get(item.name) ?? false;\n }\n\n isItemDisabled(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.disabledMap.get(item.name) ?? false;\n }\n\n getCachedIcon(name: string): SafeHtml {\n let cached = this.htmlCache.get(name);\n if (!cached) {\n const custom = this.icons();\n cached = this.sanitizer.bypassSecurityTrustHtml(custom?.[name] ?? defaultIcons[name] ?? '');\n this.htmlCache.set(name, cached);\n }\n return cached;\n }\n\n executeCommand(item: ToolbarButton, event?: Event): void {\n if (item.emitEvent) {\n // Forward the clicked button as the anchor so listeners (LinkPopover,\n // image popover, emoji picker) can position their panels against it\n // - matches `openColorPicker(anchor)` and the toolbar's executeItem.\n const anchor =\n (event?.currentTarget as HTMLElement | undefined) ??\n (event?.target as HTMLElement | undefined) ?? null;\n // emitEvent is a dynamic string; cast needed to bypass strict EventEmitter<EditorEvents> typing\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n ToolbarController.executeItem(this.editor() as never, item);\n }\n\n /**\n * Emit the `notionColorOpen` event with the trigger button as the anchor.\n * The framework popover component (DomternalNotionColorPickerComponent)\n * listens for this event and positions itself against the anchor.\n */\n openColorPicker(anchor: HTMLElement): void {\n (this.editor().emit as (e: string, d: unknown) => void)(\n 'notionColorOpen',\n { anchorElement: anchor },\n );\n }\n\n /**\n * Open the BlockContextMenu against the cursor's containing block. Skips\n * the textblock for nested cases (cursor in `listItem > paragraph` targets\n * the listItem, not the paragraph) so Delete / Turn into operate on the\n * \"visual block\" the user is editing.\n */\n openBlockContextMenu(anchor: HTMLElement): void {\n const editor = this.editor();\n const $from = editor.state.selection.$from;\n if ($from.depth < 1) return;\n // Walk one level up to use the container when the cursor's textblock\n // isn't a direct doc child; otherwise use the textblock itself.\n const depth = $from.depth > 1 && $from.node($from.depth - 1).type.name !== 'doc'\n ? $from.depth - 1\n : $from.depth;\n const blockPos = $from.before(depth);\n const editorEl = editor.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.dispatchEvent(new CustomEvent('dm:block-context-menu-open', {\n bubbles: false,\n detail: { blockPos, anchorElement: anchor },\n }));\n }\n\n // === Internal ===\n\n private buildItemMap(editor: Editor): void {\n this.itemMap.clear();\n this.dropdownMap.clear();\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') {\n this.itemMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n this.dropdownMap.set(item.name, item);\n for (const sub of item.items) {\n this.itemMap.set(sub.name, sub);\n }\n }\n }\n }\n\n private resolveNames(names: string[]): BubbleMenuItem[] {\n const result: BubbleMenuItem[] = [];\n let sepIdx = 0;\n for (const name of names) {\n if (name === '|') {\n result.push({ type: 'separator', name: `sep-${String(sepIdx++)}` });\n } else {\n const dropdown = this.dropdownMap.get(name);\n if (dropdown) { result.push(dropdown); continue; }\n const item = this.itemMap.get(name);\n if (item) result.push(item);\n }\n }\n return result;\n }\n\n private getFormatItems(): ToolbarButton[] {\n return Array.from(this.itemMap.values())\n .filter(item => item.group === 'format')\n .sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n }\n\n private detectContext(selection: SelectionShape, ctxs: Record<string, string[] | true | null>): string | null {\n // CellSelection (duck-type: has $anchorCell) - never show bubble menu\n if ('$anchorCell' in selection) return null;\n if (selection.node) return selection.node.type.name;\n if (selection.empty) return null;\n\n // TextSelection inside a table cell → 'table' context.\n // Cross-cell TextSelection (drag across cells) → hide bubble menu.\n const fromCell = this.findCellNode(selection.$from);\n if (fromCell) {\n const toCell = this.findCellNode(selection.$to);\n if (toCell && fromCell !== toCell) return null;\n return 'table';\n }\n\n const fromName = selection.$from.parent.type.name;\n if (fromName in ctxs) return fromName;\n if ('text' in ctxs && selection.$from.parent.type.spec.marks !== '') return 'text';\n // Cross-block: also check $to so bold/italic is offered when any endpoint allows marks\n const toName = selection.$to.parent.type.name;\n if (toName in ctxs) return toName;\n if ('text' in ctxs && selection.$to.parent.type.spec.marks !== '') return 'text';\n return null;\n }\n\n private findCellNode(pos: ResolvedPosShape): { type: { name: string } } | null {\n for (let d = pos.depth; d > 0; d--) {\n const node = pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n return node;\n }\n }\n return null;\n }\n\n /** Filters out mark items that the context node type doesn't allow (e.g. bold on codeBlock) */\n private filterBySchema(editor: Editor, contextName: string, items: ToolbarButton[]): ToolbarButton[] {\n if (contextName === 'text' || contextName === 'table') return items;\n const schema = (editor.state as unknown as { schema?: SchemaShape }).schema;\n if (!schema) return items;\n const nodeType = schema.nodes[contextName];\n if (!nodeType) return items;\n return items.filter(item => {\n const markName = typeof item.isActive === 'string' ? item.isActive : null;\n if (!markName) return true;\n const markType = schema.marks[markName];\n if (!markType) return true;\n return nodeType.allowsMarkType(markType);\n });\n }\n\n private buildBubbleDefaults(editor: Editor): void {\n this.bubbleDefaults.clear();\n const byCtx = new Map<string, ToolbarButton[]>();\n const addItem = (btn: ToolbarButton): void => {\n const ctx = (btn as unknown as Record<string, unknown>)['bubbleMenu'] as string | undefined;\n if (!ctx) return;\n let arr = byCtx.get(ctx);\n if (!arr) { arr = []; byCtx.set(ctx, arr); }\n arr.push(btn);\n };\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') addItem(item);\n else if (item.type === 'dropdown') {\n for (const sub of item.items) addItem(sub);\n }\n }\n for (const [ctx, items] of byCtx) {\n items.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const result: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of items) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n result.push({ type: 'separator', name: `bsep-${String(sepIdx++)}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n this.bubbleDefaults.set(ctx, result);\n }\n }\n\n private setupItemTracking(editor: Editor): void {\n this.buildItemMap(editor);\n this.buildBubbleDefaults(editor);\n this.showBlockMenuButton.set(\n editor.extensionManager.extensions.some((e) => e.name === 'blockContextMenu'),\n );\n this.showColorPickerButton.set(\n editor.extensionManager.extensions.some((e) => e.name === 'notionColorPicker'),\n );\n\n const items = this.items();\n const defaultItems = this.resolveNames(items ?? ['bold', 'italic', 'underline']);\n\n if (this.resolveContexts(editor)) {\n this.updateContextItems(editor);\n } else {\n this.resolvedItems.set(defaultItems);\n }\n\n this.transactionHandler = () => {\n this.ngZone.run(() => {\n const sel = editor.state.selection as unknown as SelectionShape;\n this.isNodeSelection.set(!!sel.node);\n if (this.resolveContexts(editor)) {\n this.updateContextItems(editor);\n } else if (sel.node && this.bubbleDefaults.has(sel.node.type.name)) {\n this.resolvedItems.set(this.bubbleDefaults.get(sel.node.type.name) ?? []);\n } else {\n this.resolvedItems.set(defaultItems);\n }\n this.updateStates(editor);\n this.syncTrailingButtonsState(editor);\n this.activeVersion.update((v) => v + 1);\n });\n };\n editor.on('transaction', this.transactionHandler);\n this.updateStates(editor);\n this.syncTrailingButtonsState(editor);\n }\n\n /**\n * Refresh state for the optional trailing buttons (A color trigger,\n * \"...\" block menu) and the isNodeSelection flag. Called from both\n * setupItemTracking init and the per-transaction handler so the two\n * paths stay in sync.\n */\n private syncTrailingButtonsState(editor: Editor): void {\n this.isNodeSelection.set(\n !!(editor.state.selection as unknown as SelectionShape).node,\n );\n if (this.showColorPickerButton()) this.syncColorTriggerState(editor);\n if (this.showBlockMenuButton()) this.syncBlockMenuButtonState(editor);\n }\n\n /**\n * Disable the \"...\" trigger when the selection spans more than one\n * top-level block. The block context menu targets the block at $from, so\n * a multi-block selection has no unambiguous target.\n */\n private syncBlockMenuButtonState(editor: Editor): void {\n const { $from, $to } = editor.state.selection;\n // depth(1) addresses the top-level child of doc; if either end is\n // shallower we can't compare blocks meaningfully.\n if ($from.depth < 1 || $to.depth < 1) {\n this.blockMenuButtonDisabled.set(true);\n return;\n }\n this.blockMenuButtonDisabled.set($from.before(1) !== $to.before(1));\n }\n\n /**\n * Update the trigger's indicator colors to mirror the current selection.\n * Used by the \"A\" button so the underline matches whatever the user has\n * applied at the cursor (Notion-style live preview).\n */\n private syncColorTriggerState(editor: Editor): void {\n const $from = editor.state.selection.$from;\n const mark = $from.marks().find((m) => m.type.name === 'textStyle');\n const attrs = (mark?.attrs ?? {}) as {\n colorToken?: string | null;\n backgroundColorToken?: string | null;\n };\n const textToken = attrs.colorToken ?? null;\n const bgToken = attrs.backgroundColorToken ?? null;\n this.currentTextColorVar.set(\n textToken ? `var(--dm-block-text-${textToken})` : null,\n );\n this.currentBgColorVar.set(\n bgToken ? `var(--dm-block-bg-${bgToken})` : null,\n );\n this.hasAnyColor.set(textToken !== null || bgToken !== null);\n }\n\n private updateContextItems(editor: Editor): void {\n const ctxs = this.resolveContexts(editor);\n if (!ctxs) return;\n const ctx = this.detectContext(editor.state.selection as unknown as SelectionShape, ctxs);\n if (!ctx) {\n this.resolvedItems.set([]);\n return;\n }\n if (ctx in ctxs) {\n const val = ctxs[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n this.resolvedItems.set([]);\n return;\n }\n if (val === true) {\n this.resolvedItems.set(this.filterBySchema(editor, ctx, this.getFormatItems()));\n } else if (Array.isArray(val)) {\n const resolved = this.resolveNames(val);\n const buttons = resolved.filter((i): i is ToolbarButton => i.type !== 'separator');\n const filtered = new Set(this.filterBySchema(editor, ctx, buttons).map(b => b.name));\n this.resolvedItems.set(resolved.filter(i => i.type === 'separator' || filtered.has(i.name)));\n }\n } else {\n this.resolvedItems.set(this.bubbleDefaults.get(ctx) ?? []);\n }\n }\n\n private updateStates(editor: Editor): void {\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try { canProxy = editor.can() as unknown as Record<string, (...args: unknown[]) => boolean>; } catch { /* ignore */ }\n\n const trackButton = (btn: ToolbarButton): void => {\n this.activeMap.set(btn.name, ToolbarController.resolveActive(editor as never, btn));\n try {\n const canCmd = typeof btn.command === 'string' ? canProxy?.[btn.command] : undefined;\n this.disabledMap.set(btn.name, canCmd\n ? !(btn.commandArgs?.length ? canCmd(...btn.commandArgs) : canCmd())\n : false);\n } catch { this.disabledMap.set(btn.name, false); }\n };\n\n for (const item of this.resolvedItems()) {\n if (item.type === 'separator') continue;\n if (item.type === 'dropdown') {\n // Track each child so dynamicIcon + isActive lookups work.\n for (const sub of item.items) trackButton(sub);\n continue;\n }\n trackButton(item);\n }\n }\n\n // === Dropdown helpers (shared shape with toolbar.component.ts) ===\n\n asButton(item: BubbleMenuItem): ToolbarButton {\n return item as ToolbarButton;\n }\n\n asDropdown(item: BubbleMenuItem): ToolbarDropdown {\n return item as ToolbarDropdown;\n }\n\n isDropdownActive(dropdown: ToolbarDropdown): boolean {\n this.activeVersion();\n return dropdown.items.some((sub) => this.activeMap.get(sub.name) ?? false);\n }\n\n /** Trigger HTML: swap icon to the active child when `dynamicIcon` is set. */\n getDropdownTriggerHtml(dropdown: ToolbarDropdown): SafeHtml {\n this.activeVersion();\n const activeItem = dropdown.dynamicIcon\n ? dropdown.items.find((sub) => this.activeMap.get(sub.name))\n : undefined;\n const iconName = activeItem?.icon ?? dropdown.icon;\n const key = `t:${iconName}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n const custom = this.icons();\n const svg = custom?.[iconName] ?? defaultIcons[iconName] ?? '';\n cached = this.sanitizer.bypassSecurityTrustHtml(svg + this.dropdownCaret);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedItemContent(iconName: string, label: string): SafeHtml {\n const key = `dc:${iconName}:${label}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n const custom = this.icons();\n const svg = custom?.[iconName] ?? defaultIcons[iconName] ?? '';\n cached = this.sanitizer.bypassSecurityTrustHtml(`${svg} ${label}`);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n isSubItemActive(name: string): boolean {\n this.activeVersion();\n return this.activeMap.get(name) ?? false;\n }\n\n onDropdownToggle(dropdown: ToolbarDropdown, event?: MouseEvent): void {\n const isOpening = this.openDropdown() !== dropdown.name;\n this.cleanupDropdown();\n\n if (!isOpening) return;\n this.openDropdown.set(dropdown.name);\n\n // NOTE: we deliberately do NOT broadcast `dm:dismiss-overlays` here.\n // The bubble menu plugin in core listens for that event and would\n // hide itself - taking our just-opened dropdown's trigger with it.\n // Other overlays (color picker, link popover) close themselves via\n // their own click-outside handlers when the user clicks our trigger,\n // so cooperative dismissal still works.\n const editorElBroadcast = this.menuEl().nativeElement.closest<HTMLElement>('.dm-editor');\n\n // Position the panel against the trigger after Angular renders it.\n // We deliberately keep the panel INSIDE `.dm-bubble-menu` so it\n // inherits the bubble-menu-scoped button tokens (--dm-button-active-bg\n // / --dm-button-active-color). Reparenting into `.dm-editor` was\n // tempting for consistency with the color picker, but that dropped\n // the active-state colors because those tokens aren't defined at\n // editor scope. floating-ui handles cross-element positioning fine\n // without reparenting.\n requestAnimationFrame(() => {\n const trigger = (event?.currentTarget as HTMLElement | null)\n ?? this.menuEl().nativeElement.querySelector<HTMLElement>(`[data-dropdown=\"${dropdown.name}\"]`);\n const panel = this.menuEl().nativeElement.querySelector<HTMLElement>(\n `[data-dropdown-panel=\"${dropdown.name}\"]`,\n );\n if (!trigger || !panel) return;\n\n this.dropdownCleanupFloating?.();\n this.dropdownCleanupFloating = positionFloatingOnce(trigger, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n });\n\n // Click-outside dismissal. mousedown is used so the dropdown closes\n // BEFORE the bubble menu's blur handler runs.\n const onOutside = (e: MouseEvent): void => {\n const target = e.target as Node | null;\n if (!target) return;\n const panel = document.querySelector<HTMLElement>(\n `[data-dropdown-panel=\"${dropdown.name}\"]`,\n );\n const trigger = this.menuEl().nativeElement.querySelector<HTMLElement>(\n `[data-dropdown=\"${dropdown.name}\"]`,\n );\n if (panel?.contains(target)) return;\n if (trigger?.contains(target)) return;\n this.cleanupDropdown();\n };\n document.addEventListener('mousedown', onOutside);\n this.dropdownOutsideHandler = onOutside;\n\n // Escape closes the dropdown.\n const onKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.cleanupDropdown();\n }\n };\n document.addEventListener('keydown', onKeydown);\n this.dropdownKeydownHandler = onKeydown;\n\n // Listen for cooperative dismissals from other overlays opening.\n const onDismiss = (): void => { this.cleanupDropdown(); };\n if (editorElBroadcast) {\n editorElBroadcast.addEventListener('dm:dismiss-overlays', onDismiss);\n this.dropdownDismissHandler = (): void => {\n editorElBroadcast.removeEventListener('dm:dismiss-overlays', onDismiss);\n };\n }\n }\n\n onDropdownItemClick(item: ToolbarButton): void {\n this.cleanupDropdown();\n ToolbarController.executeItem(this.editor() as never, item);\n requestAnimationFrame(() => { this.editor().view.focus(); });\n }\n\n private cleanupDropdown(): void {\n if (this.dropdownOutsideHandler) {\n document.removeEventListener('mousedown', this.dropdownOutsideHandler);\n this.dropdownOutsideHandler = null;\n }\n if (this.dropdownKeydownHandler) {\n document.removeEventListener('keydown', this.dropdownKeydownHandler);\n this.dropdownKeydownHandler = null;\n }\n if (this.dropdownDismissHandler) {\n this.dropdownDismissHandler();\n this.dropdownDismissHandler = null;\n }\n this.dropdownCleanupFloating?.();\n this.dropdownCleanupFloating = null;\n this.openDropdown.set(null);\n }\n\n}\n","import type { OnDestroy, ElementRef } from '@angular/core';\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n NgZone,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport {\n PluginKey,\n FloatingMenuController,\n defaultIcons,\n} from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n IconSet,\n} from '@domternal/core';\nimport { createFloatingMenuPlugin } from '@domternal/extension-block-menu';\nimport type {\n FloatingMenuKeymap,\n FloatingMenuOptions,\n} from '@domternal/extension-block-menu';\n\n/**\n * Block-insert floating menu for Angular.\n *\n * Renders defaults collected from the editor's extensions via\n * `addFloatingMenuItems()`; use `items` to override the list and `icons`\n * to swap the icon set.\n */\n@Component({\n selector: 'domternal-floating-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div\n #menuEl\n class=\"dm-floating-menu\"\n role=\"menu\"\n aria-label=\"Insert block\"\n data-dm-editor-ui=\"\"\n (keydown)=\"onKeyDown($event)\"\n >\n @for (group of groups(); track group.name || $index; let gi = $index) {\n @if (group.name) {\n <div class=\"dm-floating-menu-group-label\" [id]=\"'dm-fm-g' + gi\">{{ group.name }}</div>\n }\n <div\n class=\"dm-floating-menu-group\"\n role=\"group\"\n [attr.aria-labelledby]=\"group.name ? 'dm-fm-g' + gi : null\"\n >\n @for (item of group.items; track item.name) {\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"dm-floating-menu-item\"\n [attr.data-floating-menu-item]=\"item.name\"\n [attr.data-floating-menu-index]=\"flatIndexOf(item.name)\"\n [attr.tabindex]=\"tabIndexFor(item.name)\"\n [attr.aria-disabled]=\"isItemDisabled(item) ? 'true' : null\"\n [attr.aria-keyshortcuts]=\"item.shortcut\"\n [disabled]=\"isItemDisabled(item)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onItemClick(item)\"\n >\n @if (iconHtml(item.icon); as html) {\n <span class=\"dm-floating-menu-item-icon\" aria-hidden=\"true\" [innerHTML]=\"html\"></span>\n }\n <span class=\"dm-floating-menu-item-label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <span class=\"dm-floating-menu-item-shortcut\" aria-hidden=\"true\">{{ item.shortcut }}</span>\n }\n </button>\n }\n </div>\n }\n </div>\n `,\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalFloatingMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<FloatingMenuOptions['shouldShow']>();\n readonly offset = input<number>(0);\n readonly items = input<FloatingMenuItemsOverride | undefined>(undefined);\n readonly keymap = input<FloatingMenuKeymap | undefined>(undefined);\n readonly icons = input<IconSet | undefined>(undefined);\n /**\n * When true, the menu does NOT auto-show on every empty paragraph;\n * it only opens when the BlockHandle `+` button (or any caller of\n * `showFloatingMenu`) explicitly triggers it. Notion-style behaviour\n * - empty rows show a placeholder, the slash menu is the keyboard\n * trigger, the `+` button is the gutter trigger.\n * @default false\n */\n readonly requireExplicitTrigger = input<boolean>(false);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private ngZone = inject(NgZone);\n private sanitizer = inject(DomSanitizer);\n private pluginKey: PluginKey;\n\n private controller: FloatingMenuController | null = null;\n\n // Signal that bumps on every controller change - templates read it to\n // re-run @for tracking. OnPush components need explicit change triggers.\n private version = signal(0);\n private iconCache = new Map<string, SafeHtml>();\n\n readonly groups = computed(() => {\n // Read version to subscribe to controller updates.\n void this.version();\n return this.controller?.groups ?? [];\n });\n\n private flatNames = computed(() => {\n void this.version();\n return this.groups().flatMap((g) => g.items.map((i) => i.name));\n });\n\n private focusedIndex = computed(() => {\n void this.version();\n return this.controller?.focusedIndex ?? -1;\n });\n\n constructor() {\n // Prefer crypto.randomUUID for collision-free uniqueness (Math.random\n // across simultaneous mounts may collide; SSR can share the seed).\n // Matches the bubble-menu component's pattern.\n const cryptoRef = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const suffix =\n cryptoRef?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8);\n this.pluginKey = new PluginKey('angularFloatingMenu-' + suffix);\n\n afterNextRender(() => {\n const editor = this.editor();\n const shouldShow = this.shouldShow();\n const keymap = this.keymap();\n const plugin = createFloatingMenuPlugin({\n pluginKey: this.pluginKey,\n editor,\n element: this.menuEl().nativeElement,\n ...(shouldShow && { shouldShow }),\n offset: this.offset(),\n ...(keymap && { keymap }),\n requireExplicitTrigger: this.requireExplicitTrigger(),\n });\n editor.registerPlugin(plugin);\n\n // Create controller for default rendering. ProseMirror transactions\n // fire outside Angular zone, so signal updates inside the onChange\n // callback must be wrapped to trigger OnPush change detection.\n const controller = new FloatingMenuController(\n editor,\n () => {\n this.ngZone.run(() => { this.version.update((v) => v + 1); });\n },\n this.items(),\n );\n controller.subscribe();\n this.controller = controller;\n // Controller is a plain field, not a signal - bumping `version` is\n // what tells the `groups`/`focusedIndex` computeds to re-evaluate\n // and pick up the freshly assigned controller instance.\n this.version.update((v) => v + 1);\n });\n\n // Imperatively focus the active menuitem on focusedIndex change.\n effect(() => {\n const idx = this.focusedIndex();\n if (idx < 0) return;\n queueMicrotask(() => {\n const target = this.menuEl().nativeElement.querySelector<HTMLElement>(\n `[data-floating-menu-index=\"${String(idx)}\"]`,\n );\n target?.focus();\n });\n });\n }\n\n ngOnDestroy(): void {\n this.controller?.destroy();\n this.controller = null;\n const editor = this.editor();\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n\n // === Template helpers ===\n\n flatIndexOf(name: string): number {\n return this.flatNames().indexOf(name);\n }\n\n tabIndexFor(name: string): 0 | -1 {\n const flat = this.flatIndexOf(name);\n const focused = this.focusedIndex();\n if (flat === focused) return 0;\n // When menu not yet entered, first item is tabbable so external focus\n // (e.g. Tab traversal) lands naturally.\n if (focused < 0 && flat === 0) return 0;\n return -1;\n }\n\n isItemDisabled(item: FloatingMenuItem): boolean {\n return this.controller?.isDisabled(item) ?? false;\n }\n\n iconHtml(name?: string): SafeHtml | null {\n if (!name) return null;\n const existing = this.iconCache.get(name);\n if (existing) return existing;\n const raw = this.icons()?.[name] ?? defaultIcons[name] ?? '';\n if (!raw) return null;\n const sanitized = this.sanitizer.bypassSecurityTrustHtml(raw);\n this.iconCache.set(name, sanitized);\n return sanitized;\n }\n\n onItemClick(item: FloatingMenuItem): void {\n const editor = this.editor();\n const ctl = this.controller;\n if (!ctl) return;\n ctl.execute(item);\n requestAnimationFrame(() => { editor.view.focus(); });\n }\n\n onKeyDown(e: KeyboardEvent): void {\n const ctl = this.controller;\n if (!ctl) return;\n const focused = ctl.focusedItem();\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n ctl.next();\n return;\n case 'ArrowUp':\n e.preventDefault();\n ctl.prev();\n return;\n case 'Home':\n e.preventDefault();\n ctl.first();\n return;\n case 'End':\n e.preventDefault();\n ctl.last();\n return;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n ctl.leaveMenu();\n this.editor().view.focus();\n return;\n case 'Enter':\n case ' ':\n if (focused) {\n e.preventDefault();\n this.onItemClick(focused);\n }\n return;\n default:\n return;\n }\n }\n}\n","import type { OnDestroy } from '@angular/core';\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n signal,\n computed,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\n\nimport type { Editor } from '@domternal/core';\nimport { positionFloatingOnce } from '@domternal/core';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\nconst CATEGORY_ICONS: Record<string, string> = {\n 'Smileys & Emotion': '\\u{1F600}',\n 'People & Body': '\\u{1F44B}',\n 'Animals & Nature': '\\u{1F431}',\n 'Food & Drink': '\\u{1F355}',\n 'Travel & Places': '\\u{1F697}',\n 'Activities': '\\u{26BD}',\n 'Objects': '\\u{1F4A1}',\n 'Symbols': '\\u{1F523}',\n 'Flags': '\\u{1F3C1}',\n};\n\n@Component({\n selector: 'domternal-emoji-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { 'class': 'dm-emoji-picker-host' },\n template: `\n @if (isOpen()) {\n <div class=\"dm-emoji-picker\">\n <div class=\"dm-emoji-picker-search\">\n <input\n #searchInput\n type=\"text\"\n placeholder=\"Search emoji...\"\n [value]=\"searchQuery()\"\n (input)=\"onSearch($event)\"\n aria-label=\"Search emoji\"\n (keydown.escape)=\"close()\"\n />\n </div>\n\n <div class=\"dm-emoji-picker-tabs\" role=\"tablist\">\n @for (cat of categoryNames(); track cat) {\n <button\n type=\"button\"\n class=\"dm-emoji-picker-tab\"\n [class.dm-emoji-picker-tab--active]=\"activeCategory() === cat\"\n role=\"tab\"\n [attr.aria-selected]=\"activeCategory() === cat\"\n [title]=\"cat\"\n [attr.aria-label]=\"cat\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"scrollToCategory(cat)\"\n >{{ categoryIcon(cat) }}</button>\n }\n </div>\n\n <div class=\"dm-emoji-picker-grid\" #grid (scroll)=\"onGridScroll()\" (keydown)=\"onGridKeydown($event)\">\n @if (searchQuery()) {\n @for (item of filteredEmojis(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n @empty {\n <div class=\"dm-emoji-picker-empty\">No emoji found</div>\n }\n } @else {\n @if (frequentlyUsed().length) {\n <div class=\"dm-emoji-picker-category-label\">Frequently Used</div>\n @for (item of frequentlyUsed(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n @for (cat of categoryNames(); track cat) {\n <div class=\"dm-emoji-picker-category-label\" [attr.data-category]=\"cat\">{{ cat }}</div>\n @for (item of getCategory(cat); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n }\n </div>\n </div>\n }\n `,\n})\nexport class DomternalEmojiPickerComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly emojis = input.required<EmojiPickerItem[]>();\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeCategory = signal('');\n\n private anchorEl: HTMLElement | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private eventHandler: ((...args: unknown[]) => void) | null = null;\n private cleanupFloating: (() => void) | null = null;\n\n readonly categories = computed(() => {\n const map = new Map<string, EmojiPickerItem[]>();\n for (const item of this.emojis()) {\n let list = map.get(item.group);\n if (!list) {\n list = [];\n map.set(item.group, list);\n }\n list.push(item);\n }\n return map;\n });\n\n readonly categoryNames = computed(() => [...this.categories().keys()]);\n\n readonly filteredEmojis = computed(() => {\n const query = this.searchQuery().toLowerCase();\n if (!query) return [];\n const storage = this.getEmojiStorage();\n const searchFn = storage?.['searchEmoji'] as ((q: string) => EmojiPickerItem[]) | undefined;\n if (searchFn) {\n return searchFn(query);\n }\n return this.emojis().filter(\n (item) =>\n item.name.includes(query) ||\n item.group.toLowerCase().includes(query),\n );\n });\n\n readonly frequentlyUsed = computed(() => {\n // Re-evaluate when panel opens (isOpen changes)\n this.isOpen();\n const storage = this.getEmojiStorage();\n if (!storage) return [];\n const getFreq = storage['getFrequentlyUsed'] as (() => string[]) | undefined;\n if (!getFreq) return [];\n const names = getFreq();\n if (!names.length) return [];\n const nameMap = storage['_nameMap'] as Map<string, EmojiPickerItem> | undefined;\n if (!nameMap) return [];\n return names.slice(0, 16).map((n) => nameMap.get(n)).filter(Boolean) as EmojiPickerItem[];\n });\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => { this.setupEventListener(editor); });\n });\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n getCategory(cat: string): EmojiPickerItem[] {\n return this.categories().get(cat) ?? [];\n }\n\n categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n }\n\n formatName(name: string): string {\n return name.replace(/_/g, ' ');\n }\n\n onSearch(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.searchQuery.set(input.value);\n }\n\n selectEmoji(item: EmojiPickerItem): void {\n const editor = this.editor();\n const cmd = editor.commands as Record<string, (...args: unknown[]) => boolean>;\n if (cmd['insertEmoji']) {\n cmd['insertEmoji'](item.name);\n }\n this.close();\n }\n\n scrollToCategory(cat: string): void {\n this.searchQuery.set('');\n this.activeCategory.set(cat);\n\n // Wait for search to clear and DOM to update\n requestAnimationFrame(() => {\n const grid = this.elRef.nativeElement.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const label = grid.querySelector<HTMLElement>(`[data-category=\"${cat}\"]`);\n if (label) {\n // Use manual scrollTop instead of scrollIntoView to avoid scrolling the page\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop });\n // Focus first emoji swatch after scroll completes\n setTimeout(() => {\n const firstSwatch = label.nextElementSibling;\n if (firstSwatch instanceof HTMLElement && firstSwatch.classList.contains('dm-emoji-swatch')) {\n firstSwatch.focus();\n }\n }, 50);\n }\n });\n }\n\n onGridKeydown(event: KeyboardEvent): void {\n const grid = this.elRef.nativeElement.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const swatches = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-swatch'));\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n const idx = swatches.indexOf(current);\n if (idx === -1) {\n // Focus is on grid container, not a swatch - enter the grid\n if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n swatches[0]?.focus();\n }\n return;\n }\n const cols = 8;\n let next = idx;\n switch (event.key) {\n case 'ArrowRight': event.preventDefault(); next = Math.min(idx + 1, swatches.length - 1); break;\n case 'ArrowLeft': event.preventDefault(); next = Math.max(idx - 1, 0); break;\n case 'ArrowDown': event.preventDefault(); next = Math.min(idx + cols, swatches.length - 1); break;\n case 'ArrowUp': event.preventDefault(); next = Math.max(idx - cols, 0); break;\n case 'Enter': case ' ': event.preventDefault(); swatches[idx]?.click(); return;\n default: return;\n }\n swatches[next]?.focus();\n }\n\n onGridScroll(): void {\n const grid = this.elRef.nativeElement.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid || this.searchQuery()) return;\n\n const labels = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]'));\n\n let currentCat = '';\n for (const label of labels) {\n if (label.offsetTop - grid.offsetTop <= grid.scrollTop + 20) {\n currentCat = label.getAttribute('data-category') ?? '';\n }\n }\n\n if (currentCat && currentCat !== this.activeCategory()) {\n this.activeCategory.set(currentCat);\n }\n }\n\n close(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.isOpen.set(false);\n this.setStorageOpen(false);\n this.searchQuery.set('');\n this.anchorEl = null;\n this.removeGlobalListeners();\n this.editor().view.focus();\n }\n\n private setupEventListener(editor: Editor): void {\n this.cleanup();\n\n this.eventHandler = (...args: unknown[]) => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n this.ngZone.run(() => {\n if (this.isOpen()) {\n this.close();\n return;\n }\n\n this.anchorEl = data?.anchorElement ?? null;\n this.isOpen.set(true);\n this.setStorageOpen(true);\n this.searchQuery.set('');\n\n // Set initial active category\n const names = this.categoryNames();\n if (names.length > 0 && names[0]) {\n this.activeCategory.set(names[0]);\n }\n\n this.addGlobalListeners();\n\n // Position panel and focus search input after render\n requestAnimationFrame(() => {\n const panel = this.elRef.nativeElement.querySelector<HTMLElement>('.dm-emoji-picker');\n if (panel && this.anchorEl) {\n this.cleanupFloating?.();\n this.cleanupFloating = positionFloatingOnce(this.anchorEl, panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = this.elRef.nativeElement.querySelector<HTMLInputElement>('.dm-emoji-picker-search input');\n input?.focus({ preventScroll: true });\n });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n }\n\n private addGlobalListeners(): void {\n this.clickOutsideHandler = (e: Event) => {\n const target = e.target as Node;\n if (\n this.isOpen() &&\n !this.elRef.nativeElement.contains(target) &&\n target !== this.anchorEl &&\n !this.anchorEl?.contains(target)\n ) {\n this.ngZone.run(() => { this.close(); });\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n this.keydownHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen()) {\n e.preventDefault();\n this.ngZone.run(() => { this.close(); });\n }\n };\n document.addEventListener('keydown', this.keydownHandler);\n }\n\n private removeGlobalListeners(): void {\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.keydownHandler) {\n document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n }\n\n private setStorageOpen(open: boolean): void {\n const storage = this.getEmojiStorage();\n if (storage) storage['isOpen'] = open;\n // Dispatch a no-op transaction so the toolbar's transaction handler\n // re-evaluates isActiveFn and shows the button as active/inactive.\n const editor = this.editor();\n editor.view.dispatch(editor.view.state.tr);\n }\n\n private getEmojiStorage(): Record<string, unknown> | null {\n const storage = this.editor().storage;\n return (storage['emoji'] as Record<string, unknown> | undefined) ?? null;\n }\n\n private cleanup(): void {\n this.removeGlobalListeners();\n if (this.eventHandler) {\n const editor = this.editor();\n (editor.off as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n this.eventHandler = null;\n }\n }\n}\n","/**\n * Notion-style color picker popover. Listens for the `notionColorOpen` event\n * emitted by the bubble-menu's \"A\" trigger and renders a two-section dropdown\n * (Text color / Background color).\n *\n * Drives `setTextColorToken` / `setBackgroundColorToken` on click.\n */\nimport type { OnDestroy } from '@angular/core';\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n signal,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\n\nimport type { Editor } from '@domternal/core';\nimport { positionFloating } from '@domternal/core';\n\ninterface NotionColorPickerStorage {\n isOpen: boolean;\n}\n\n/**\n * Display labels for the named-token palette. Used in tooltips / aria labels;\n * unknown tokens fall back to a title-cased version of the raw key.\n */\nconst TOKEN_LABELS: Record<string, string> = {\n gray: 'Gray',\n brown: 'Brown',\n orange: 'Orange',\n yellow: 'Yellow',\n green: 'Green',\n blue: 'Blue',\n purple: 'Purple',\n pink: 'Pink',\n red: 'Red',\n};\n\n@Component({\n selector: 'domternal-notion-color-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (isOpen()) {\n <div\n class=\"dm-notion-color-picker\"\n data-show\n data-dm-editor-ui\n role=\"dialog\"\n aria-label=\"Text and background color\"\n aria-modal=\"false\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <div class=\"dm-ncp-section\">\n <div class=\"dm-ncp-label\">Text color</div>\n <div class=\"dm-ncp-grid\">\n <button\n type=\"button\"\n class=\"dm-ncp-swatch dm-ncp-swatch--text\"\n [class.dm-ncp-active]=\"currentTextToken() === null\"\n [attr.aria-pressed]=\"currentTextToken() === null\"\n data-color=\"null\"\n title=\"Default text color\"\n aria-label=\"Default text color\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"applyText(null)\"\n ></button>\n @for (t of palette(); track t) {\n <button\n type=\"button\"\n class=\"dm-ncp-swatch dm-ncp-swatch--text\"\n [class.dm-ncp-active]=\"currentTextToken() === t\"\n [attr.aria-pressed]=\"currentTextToken() === t\"\n [attr.data-color]=\"t\"\n [title]=\"tokenLabel(t)\"\n [attr.aria-label]=\"tokenLabel(t) + ' text'\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"applyText(t)\"\n ></button>\n }\n </div>\n </div>\n\n <div class=\"dm-ncp-section\">\n <div class=\"dm-ncp-label\">Background color</div>\n <div class=\"dm-ncp-grid\">\n <button\n type=\"button\"\n class=\"dm-ncp-swatch dm-ncp-swatch--bg\"\n [class.dm-ncp-active]=\"currentBgToken() === null\"\n [attr.aria-pressed]=\"currentBgToken() === null\"\n data-color=\"null\"\n title=\"Default background\"\n aria-label=\"Default background\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"applyBg(null)\"\n ></button>\n @for (t of palette(); track t) {\n <button\n type=\"button\"\n class=\"dm-ncp-swatch dm-ncp-swatch--bg\"\n [class.dm-ncp-active]=\"currentBgToken() === t\"\n [attr.aria-pressed]=\"currentBgToken() === t\"\n [attr.data-color]=\"t\"\n [title]=\"tokenLabel(t) + ' background'\"\n [attr.aria-label]=\"tokenLabel(t) + ' background'\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"applyBg(t)\"\n ></button>\n }\n </div>\n </div>\n </div>\n }\n `,\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalNotionColorPickerComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n\n readonly isOpen = signal(false);\n readonly currentTextToken = signal<string | null>(null);\n readonly currentBgToken = signal<string | null>(null);\n readonly palette = signal<string[]>([]);\n\n private anchorEl: HTMLElement | null = null;\n // Reference to the picker panel after it has been reparented into\n // `.dm-editor`. After reparenting `elRef.nativeElement.contains(panel)`\n // returns false, so any inside-click detection must consult `panelEl`\n // directly rather than walking up from the component host.\n private panelEl: HTMLElement | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n private eventHandler: ((...args: unknown[]) => void) | null = null;\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private selectionHandler: (() => void) | null = null;\n private cleanupFloating: (() => void) | null = null;\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => { this.setupEventListener(editor); });\n });\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n tokenLabel(token: string): string {\n return TOKEN_LABELS[token] ?? token.charAt(0).toUpperCase() + token.slice(1);\n }\n\n applyText(token: string | null): void {\n const editor = this.editor();\n editor.commands.setTextColorToken(token);\n // Picker stays open so the user can chain picks; close mirrors the bubble\n // menu (outside-click / Escape / empty selection).\n this.syncFromSelection();\n }\n\n applyBg(token: string | null): void {\n const editor = this.editor();\n editor.commands.setBackgroundColorToken(token);\n this.syncFromSelection();\n }\n\n /**\n * Arrow-key navigation across the 5-column swatch grids. Arrows move\n * within and across rows, Home/End jump to grid boundaries, Tab leaves\n * the picker (browser default), Enter/Space activates the focused swatch.\n * Focus moves sequentially through Text color → Background color so\n * keyboard users can reach any swatch without re-grabbing Tab.\n */\n onPanelKeydown(event: KeyboardEvent): void {\n const cols = 5;\n // Query off the tracked panel; after reparenting into `.dm-editor` the\n // swatches are no longer descendants of the component host element.\n const root = this.panelEl ?? this.elRef.nativeElement;\n const swatches = Array.from(\n root.querySelectorAll<HTMLElement>('.dm-ncp-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement as HTMLElement | null;\n const idx = active ? swatches.indexOf(active) : -1;\n if (idx === -1) return;\n\n let next = idx;\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n next = Math.min(idx + 1, swatches.length - 1);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n next = Math.max(idx - 1, 0);\n break;\n case 'ArrowDown':\n event.preventDefault();\n next = Math.min(idx + cols, swatches.length - 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n next = Math.max(idx - cols, 0);\n break;\n case 'Home':\n event.preventDefault();\n next = 0;\n break;\n case 'End':\n event.preventDefault();\n next = swatches.length - 1;\n break;\n default:\n return;\n }\n swatches[next]?.focus();\n }\n\n close(opts: { refocus?: boolean } = {}): void {\n if (!this.isOpen()) return;\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.isOpen.set(false);\n this.setStorageOpen(false);\n this.anchorEl = null;\n this.panelEl = null;\n this.removeGlobalListeners();\n if (opts.refocus) {\n this.editor().view.focus();\n }\n }\n\n private setupEventListener(editor: Editor): void {\n this.cleanup();\n\n this.eventHandler = (...args: unknown[]) => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n this.ngZone.run(() => {\n const anchor = data?.anchorElement;\n if (!anchor) return;\n\n // Toggle: clicking the same anchor while open closes the picker.\n if (this.isOpen() && this.anchorEl === anchor) {\n this.close({ refocus: true });\n return;\n }\n\n this.anchorEl = anchor;\n this.palette.set(this.readPalette());\n this.syncFromSelection();\n this.isOpen.set(true);\n this.setStorageOpen(true);\n\n this.addGlobalListeners();\n\n // Position panel against the trigger after Angular renders the DOM.\n // Focus management (move into the first/active swatch) runs on a\n // second rAF so positioning + paint has flushed; focusing during the\n // same frame as mount can race with the bubble-menu's blur handler\n // and momentarily hide the floating layer Playwright observes.\n requestAnimationFrame(() => {\n const panel = this.elRef.nativeElement.querySelector<HTMLElement>(\n '.dm-notion-color-picker',\n );\n if (panel && this.anchorEl) {\n // Reparent into `.dm-editor` so the panel inherits the editor's\n // CSS custom properties (`--dm-block-bg-*`, `--dm-block-text-*`,\n // surface/border tokens). All variables in @domternal/theme are\n // scoped to `.dm-editor`; without reparenting the picker would\n // sit as a sibling and render with bare fallbacks.\n const editorEl = this.anchorEl.closest<HTMLElement>('.dm-editor');\n if (editorEl && panel.parentElement !== editorEl) {\n editorEl.appendChild(panel);\n }\n this.panelEl = panel;\n\n this.cleanupFloating?.();\n this.cleanupFloating = positionFloating(this.anchorEl, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n }\n requestAnimationFrame(() => {\n if (!this.isOpen()) return; // bailed out between frames\n // Use the tracked panel reference: after reparenting into\n // `.dm-editor` the panel is no longer a descendant of the\n // component host, so `elRef.nativeElement.querySelector` returns\n // null and focus never lands.\n const p = this.panelEl;\n if (!p) return;\n const active = p.querySelector<HTMLElement>(\n '.dm-ncp-swatch.dm-ncp-active',\n );\n const fallback = p.querySelector<HTMLElement>(\n '.dm-ncp-swatch--text[data-color=\"null\"]',\n );\n (active ?? fallback)?.focus({ preventScroll: true });\n });\n });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)(\n 'notionColorOpen',\n this.eventHandler,\n );\n }\n\n private addGlobalListeners(): void {\n this.clickOutsideHandler = (e: Event) => {\n if (!this.isOpen()) return;\n const target = e.target as Node;\n // Clicks inside the reparented panel or on the anchor (which toggles\n // via the event handler) must not trigger outside-close. The panel\n // has been moved out of `elRef.nativeElement` to inherit editor CSS\n // vars, so we cannot rely on the host element for containment.\n if (this.panelEl?.contains(target)) return;\n if (this.elRef.nativeElement.contains(target)) return;\n if (this.anchorEl?.contains(target)) return;\n this.ngZone.run(() => { this.close({ refocus: false }); });\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n this.keydownHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen()) {\n e.preventDefault();\n this.ngZone.run(() => { this.close({ refocus: true }); });\n }\n };\n document.addEventListener('keydown', this.keydownHandler);\n\n // Empty selection (user clicked elsewhere) closes the picker since the\n // bubble-menu anchor it sits on is about to vanish anyway.\n this.selectionHandler = () => {\n if (!this.isOpen()) return;\n // Defensive: bubble menu may have vanished between transactions\n // (hideout, route change). Positioning against a detached anchor is\n // a no-op; close instead. Matches React/Vue behaviour.\n if (this.anchorEl && !this.anchorEl.isConnected) {\n this.ngZone.run(() => { this.close({ refocus: false }); });\n return;\n }\n if (this.editor().state.selection.empty) {\n this.ngZone.run(() => { this.close({ refocus: false }); });\n } else {\n // Selection changed but stays non-empty (e.g. shift+arrow): refresh\n // the active-state indicators against the new mark set.\n this.syncFromSelection();\n }\n };\n (this.editor().on as (e: string, h: () => void) => void)(\n 'selectionUpdate',\n this.selectionHandler,\n );\n }\n\n private removeGlobalListeners(): void {\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.keydownHandler) {\n document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n if (this.selectionHandler) {\n (this.editor().off as (e: string, h: () => void) => void)(\n 'selectionUpdate',\n this.selectionHandler,\n );\n this.selectionHandler = null;\n }\n }\n\n private syncFromSelection(): void {\n const editor = this.editor();\n const { selection } = editor.state;\n\n // Empty cursor: stored-marks semantics (what newly-typed text inherits).\n // Non-empty: scan the range for the first text node carrying a textStyle\n // mark. `$from.nodeAfter` can land on a block (paragraph) when the\n // selection starts at a block boundary (e.g. AllSelection / selectAll),\n // so walking text nodes is necessary for correct active-state detection.\n let mark: { attrs: Record<string, unknown> } | null = null;\n if (selection.empty) {\n mark = selection.$from.marks().find((m) => m.type.name === 'textStyle') ?? null;\n } else {\n editor.state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (mark) return false;\n if (node.isText) {\n const found = node.marks.find((m) => m.type.name === 'textStyle');\n if (found) mark = found;\n }\n return true;\n });\n }\n\n const attrs = (mark?.attrs ?? {}) as { colorToken?: string | null; backgroundColorToken?: string | null };\n this.currentTextToken.set(attrs.colorToken ?? null);\n this.currentBgToken.set(attrs.backgroundColorToken ?? null);\n }\n\n private readPalette(): string[] {\n const ext = this.editor().extensionManager.extensions.find((e) => e.name === 'notionColorPicker');\n const options = (ext?.options ?? null) as { palette?: readonly string[] } | null;\n return options?.palette ? [...options.palette] : [];\n }\n\n private getStorage(): NotionColorPickerStorage | null {\n const storage = this.editor().storage;\n const slot = storage['notionColorPicker'];\n if (!slot || typeof slot !== 'object') return null;\n return slot as NotionColorPickerStorage;\n }\n\n private setStorageOpen(open: boolean): void {\n const storage = this.getStorage();\n if (storage) storage.isOpen = open;\n }\n\n private cleanup(): void {\n this.removeGlobalListeners();\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n if (this.eventHandler) {\n const editor = this.editor();\n (editor.off as (e: string, h: (...args: unknown[]) => void) => void)(\n 'notionColorOpen',\n this.eventHandler,\n );\n this.eventHandler = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}