@domternal/angular 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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 } 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' },\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 }) => {\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 }) => {\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 }) => {\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 '[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.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.aria-label]=\"sub.label\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label)\"\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.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) => 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) => 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 => {\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\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\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 '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 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\">\n @for (item of resolvedItems(); track item.name) {\n @if (item.type === 'separator') {\n <span class=\"dm-toolbar-separator\"></span>\n } @else {\n <button type=\"button\" class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isItemActive(item)\"\n [disabled]=\"isItemDisabled(item)\"\n [title]=\"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 (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 [title]=\"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()\">\n @if (searchQuery()) {\n @for (item of filteredEmojis(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [title]=\"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 [title]=\"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 [title]=\"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, behavior: 'smooth' });\n }\n });\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();\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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"}
@@ -0,0 +1,235 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnDestroy, ElementRef } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
4
+ import { AnyExtension, Content, FocusPosition, Editor, JSONContent, IconSet, ToolbarLayoutEntry, ToolbarGroup, ToolbarDropdown, ToolbarButton, ToolbarItem } from '@domternal/core';
5
+ export { AnyExtension, Content, Editor, FocusPosition, JSONContent } from '@domternal/core';
6
+ import { SafeHtml } from '@angular/platform-browser';
7
+ import * as prosemirror_state from 'prosemirror-state';
8
+ import * as prosemirror_view from 'prosemirror-view';
9
+
10
+ declare const DEFAULT_EXTENSIONS: AnyExtension[];
11
+ declare class DomternalEditorComponent implements ControlValueAccessor, OnDestroy {
12
+ readonly editorRef: _angular_core.Signal<ElementRef<HTMLDivElement>>;
13
+ readonly extensions: _angular_core.InputSignal<AnyExtension[]>;
14
+ readonly content: _angular_core.InputSignal<Content>;
15
+ readonly editable: _angular_core.InputSignal<boolean>;
16
+ readonly autofocus: _angular_core.InputSignal<FocusPosition>;
17
+ readonly outputFormat: _angular_core.InputSignal<"html" | "json">;
18
+ readonly editorCreated: _angular_core.OutputEmitterRef<Editor>;
19
+ readonly contentUpdated: _angular_core.OutputEmitterRef<{
20
+ editor: Editor;
21
+ }>;
22
+ readonly selectionChanged: _angular_core.OutputEmitterRef<{
23
+ editor: Editor;
24
+ }>;
25
+ readonly focusChanged: _angular_core.OutputEmitterRef<{
26
+ editor: Editor;
27
+ event: FocusEvent;
28
+ }>;
29
+ readonly blurChanged: _angular_core.OutputEmitterRef<{
30
+ editor: Editor;
31
+ event: FocusEvent;
32
+ }>;
33
+ readonly editorDestroyed: _angular_core.OutputEmitterRef<void>;
34
+ private _htmlContent;
35
+ private _jsonContent;
36
+ private _isEmpty;
37
+ private _isFocused;
38
+ private _isEditable;
39
+ readonly htmlContent: _angular_core.Signal<string>;
40
+ readonly jsonContent: _angular_core.Signal<JSONContent>;
41
+ readonly isEmpty: _angular_core.Signal<boolean>;
42
+ readonly isFocused: _angular_core.Signal<boolean>;
43
+ readonly isEditable: _angular_core.Signal<boolean>;
44
+ private _editor;
45
+ get editor(): Editor | null;
46
+ private onChange;
47
+ private onTouched;
48
+ private _pendingContent;
49
+ private ngZone;
50
+ constructor();
51
+ ngOnDestroy(): void;
52
+ writeValue(value: Content): void;
53
+ registerOnChange(fn: (value: Content) => void): void;
54
+ registerOnTouched(fn: () => void): void;
55
+ setDisabledState(isDisabled: boolean): void;
56
+ private recreateEditor;
57
+ private createEditor;
58
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DomternalEditorComponent, never>;
59
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DomternalEditorComponent, "domternal-editor", never, { "extensions": { "alias": "extensions"; "required": false; "isSignal": true; }; "content": { "alias": "content"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "outputFormat": { "alias": "outputFormat"; "required": false; "isSignal": true; }; }, { "editorCreated": "editorCreated"; "contentUpdated": "contentUpdated"; "selectionChanged": "selectionChanged"; "focusChanged": "focusChanged"; "blurChanged": "blurChanged"; "editorDestroyed": "editorDestroyed"; }, never, never, true, never>;
60
+ }
61
+
62
+ declare class DomternalToolbarComponent implements OnDestroy {
63
+ readonly editor: _angular_core.InputSignal<Editor>;
64
+ readonly icons: _angular_core.InputSignal<IconSet>;
65
+ readonly layout: _angular_core.InputSignal<ToolbarLayoutEntry[]>;
66
+ /** Exposed state signals for template */
67
+ readonly groups: _angular_core.WritableSignal<ToolbarGroup[]>;
68
+ readonly focusedIndex: _angular_core.WritableSignal<number>;
69
+ readonly openDropdown: _angular_core.WritableSignal<string>;
70
+ /** Bumped on active state changes to trigger re-evaluation of isActive() */
71
+ readonly activeVersion: _angular_core.WritableSignal<number>;
72
+ private controller;
73
+ private clickOutsideHandler;
74
+ private dismissOverlayHandler;
75
+ private editorEl;
76
+ private cleanupFloating;
77
+ private ngZone;
78
+ private elRef;
79
+ private sanitizer;
80
+ /** SafeHtml cache — same reference returned for same key, prevents DOM churn */
81
+ private htmlCache;
82
+ private readonly dropdownCaret;
83
+ constructor();
84
+ ngOnDestroy(): void;
85
+ isActive(name: string): boolean;
86
+ isDisabled(name: string): boolean;
87
+ isDropdownActive(dropdown: ToolbarDropdown): boolean;
88
+ /** Returns trigger innerHTML: dynamic icon + caret (+ color indicator for grid dropdowns). */
89
+ getDropdownTriggerHtml(dropdown: ToolbarDropdown): SafeHtml;
90
+ /**
91
+ * Returns 'true' when an emitEvent button's panel is open, null otherwise.
92
+ * Maps to [attr.aria-expanded] — null removes the attribute entirely.
93
+ */
94
+ getAriaExpanded(item: ToolbarButton): string | null;
95
+ getFlatIndex(name: string): number;
96
+ getTooltip(item: ToolbarButton): string;
97
+ getCachedIcon(name: string): SafeHtml;
98
+ getCachedTriggerLabel(label: string, isIcon?: boolean): SafeHtml;
99
+ getCachedTriggerIcon(iconName: string): SafeHtml;
100
+ getCachedItemContent(iconName: string, label: string, displayMode?: 'icon-text' | 'text' | 'icon'): SafeHtml;
101
+ asButton(item: ToolbarItem): ToolbarButton;
102
+ asDropdown(item: ToolbarItem): ToolbarDropdown;
103
+ getGridStyle(dropdown: ToolbarDropdown): string;
104
+ onButtonClick(item: ToolbarButton, event?: MouseEvent): void;
105
+ onDropdownToggle(dropdown: ToolbarDropdown): void;
106
+ onDropdownItemClick(item: ToolbarButton, event?: Event): void;
107
+ onButtonFocus(name: string): void;
108
+ onKeydown(event: KeyboardEvent): void;
109
+ private resolveIconSvg;
110
+ private setupController;
111
+ private destroyController;
112
+ private syncState;
113
+ private getComputedStyleAtCursor;
114
+ /** Read only inline style — no computed fallback (used for font-family). */
115
+ private getInlineStyleAtCursor;
116
+ private focusCurrentButton;
117
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DomternalToolbarComponent, never>;
118
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DomternalToolbarComponent, "domternal-toolbar", never, { "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "icons": { "alias": "icons"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
119
+ }
120
+
121
+ interface BubbleMenuSeparator {
122
+ type: 'separator';
123
+ name: string;
124
+ }
125
+ type BubbleMenuItem = ToolbarButton | BubbleMenuSeparator;
126
+ declare class DomternalBubbleMenuComponent implements OnDestroy {
127
+ readonly editor: _angular_core.InputSignal<Editor>;
128
+ readonly shouldShow: _angular_core.InputSignal<(props: {
129
+ editor: Editor;
130
+ view: prosemirror_view.EditorView;
131
+ state: prosemirror_state.EditorState;
132
+ from: number;
133
+ to: number;
134
+ }) => boolean>;
135
+ readonly placement: _angular_core.InputSignal<"bottom" | "top">;
136
+ readonly offset: _angular_core.InputSignal<number>;
137
+ readonly updateDelay: _angular_core.InputSignal<number>;
138
+ /** Fixed item names (e.g. ['bold', 'italic', 'code']). Omit for auto mode (all format items). */
139
+ readonly items: _angular_core.InputSignal<string[]>;
140
+ /** Context-aware: map context names to item arrays, `true` for all valid items, or `null` to disable */
141
+ readonly contexts: _angular_core.InputSignal<Record<string, true | string[]>>;
142
+ /** Internal — updated on transactions. Not meant to be set from outside. */
143
+ readonly resolvedItems: _angular_core.WritableSignal<BubbleMenuItem[]>;
144
+ private menuEl;
145
+ private pluginKey;
146
+ private sanitizer;
147
+ private ngZone;
148
+ private activeVersion;
149
+ private itemMap;
150
+ private activeMap;
151
+ private disabledMap;
152
+ private htmlCache;
153
+ private bubbleDefaults;
154
+ private transactionHandler;
155
+ constructor();
156
+ ngOnDestroy(): void;
157
+ isItemActive(item: ToolbarButton): boolean;
158
+ isItemDisabled(item: ToolbarButton): boolean;
159
+ getCachedIcon(name: string): SafeHtml;
160
+ executeCommand(item: ToolbarButton): void;
161
+ private buildItemMap;
162
+ private resolveNames;
163
+ private getFormatItems;
164
+ private detectContext;
165
+ private findCellNode;
166
+ /** Filters out mark items that the context node type doesn't allow (e.g. bold on codeBlock) */
167
+ private filterBySchema;
168
+ private buildBubbleDefaults;
169
+ private setupItemTracking;
170
+ private updateContextItems;
171
+ private updateStates;
172
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DomternalBubbleMenuComponent, never>;
173
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DomternalBubbleMenuComponent, "domternal-bubble-menu", never, { "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "shouldShow": { "alias": "shouldShow"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "updateDelay": { "alias": "updateDelay"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "contexts": { "alias": "contexts"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
174
+ }
175
+
176
+ declare class DomternalFloatingMenuComponent implements OnDestroy {
177
+ readonly editor: _angular_core.InputSignal<Editor>;
178
+ readonly shouldShow: _angular_core.InputSignal<(props: {
179
+ editor: Editor;
180
+ view: prosemirror_view.EditorView;
181
+ state: prosemirror_state.EditorState;
182
+ }) => boolean>;
183
+ readonly offset: _angular_core.InputSignal<number>;
184
+ private menuEl;
185
+ private pluginKey;
186
+ constructor();
187
+ ngOnDestroy(): void;
188
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DomternalFloatingMenuComponent, never>;
189
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DomternalFloatingMenuComponent, "domternal-floating-menu", never, { "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "shouldShow": { "alias": "shouldShow"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
190
+ }
191
+
192
+ interface EmojiPickerItem {
193
+ emoji: string;
194
+ name: string;
195
+ group: string;
196
+ }
197
+ declare class DomternalEmojiPickerComponent implements OnDestroy {
198
+ readonly editor: _angular_core.InputSignal<Editor>;
199
+ readonly emojis: _angular_core.InputSignal<EmojiPickerItem[]>;
200
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
201
+ readonly searchQuery: _angular_core.WritableSignal<string>;
202
+ readonly activeCategory: _angular_core.WritableSignal<string>;
203
+ private anchorEl;
204
+ private ngZone;
205
+ private elRef;
206
+ private clickOutsideHandler;
207
+ private keydownHandler;
208
+ private eventHandler;
209
+ private cleanupFloating;
210
+ readonly categories: _angular_core.Signal<Map<string, EmojiPickerItem[]>>;
211
+ readonly categoryNames: _angular_core.Signal<string[]>;
212
+ readonly filteredEmojis: _angular_core.Signal<EmojiPickerItem[]>;
213
+ readonly frequentlyUsed: _angular_core.Signal<EmojiPickerItem[]>;
214
+ constructor();
215
+ ngOnDestroy(): void;
216
+ getCategory(cat: string): EmojiPickerItem[];
217
+ categoryIcon(cat: string): string;
218
+ formatName(name: string): string;
219
+ onSearch(event: Event): void;
220
+ selectEmoji(item: EmojiPickerItem): void;
221
+ scrollToCategory(cat: string): void;
222
+ onGridScroll(): void;
223
+ close(): void;
224
+ private setupEventListener;
225
+ private addGlobalListeners;
226
+ private removeGlobalListeners;
227
+ private setStorageOpen;
228
+ private getEmojiStorage;
229
+ private cleanup;
230
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DomternalEmojiPickerComponent, never>;
231
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DomternalEmojiPickerComponent, "domternal-emoji-picker", never, { "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "emojis": { "alias": "emojis"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
232
+ }
233
+
234
+ export { DEFAULT_EXTENSIONS, DomternalBubbleMenuComponent, DomternalEditorComponent, DomternalEmojiPickerComponent, DomternalFloatingMenuComponent, DomternalToolbarComponent };
235
+ export type { EmojiPickerItem };
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@domternal/angular",
3
+ "version": "0.2.0",
4
+ "description": "Angular components for Domternal editor",
5
+ "author": "https://github.com/ThomasNowHere",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "types": "./dist/types/domternal-angular.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/types/domternal-angular.d.ts",
13
+ "default": "./dist/fesm2022/domternal-angular.mjs"
14
+ }
15
+ },
16
+ "peerDependencies": {
17
+ "@angular/core": ">=17.1.0",
18
+ "@angular/forms": ">=17.1.0",
19
+ "@domternal/core": ">=0.2.0"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "dependencies": {
25
+ "tslib": "^2.8.0"
26
+ },
27
+ "devDependencies": {
28
+ "@angular/common": "^21.2.4",
29
+ "@angular/compiler": "^21.2.4",
30
+ "@angular/compiler-cli": "^21.2.4",
31
+ "@angular/core": "^21.2.4",
32
+ "@angular/forms": "^21.2.4",
33
+ "@angular/platform-browser": "^21.2.4",
34
+ "@domternal/core": "workspace:*",
35
+ "ng-packagr": "^21.0.0",
36
+ "typescript": "~5.9.3"
37
+ },
38
+ "scripts": {
39
+ "build": "ng-packagr -p ng-package.json"
40
+ },
41
+ "keywords": [
42
+ "angular",
43
+ "prosemirror",
44
+ "editor",
45
+ "rich-text",
46
+ "domternal"
47
+ ],
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/domternal/domternal.git",
51
+ "directory": "packages/angular"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/domternal/domternal/issues"
55
+ },
56
+ "homepage": "https://domternal.dev"
57
+ }