@domternal/angular 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,7 +19,7 @@ emoji picker, and Notion color picker auto-render from the extensions you load.
19
19
  pnpm add @domternal/angular @domternal/core @domternal/theme
20
20
  ```
21
21
 
22
- `@angular/core` (>=17.1), `@angular/forms` (>=17.1), `@angular/platform-browser` (>=17.1), and `@domternal/core` (>=1.0.0 <2.0.0)
22
+ `@angular/core` (>=17.1), `@angular/forms` (>=17.1), `@angular/platform-browser` (>=17.1), and `@domternal/core` (>=1.1.0 <2.0.0)
23
23
  are peer dependencies. Add the theme ([`@domternal/theme`](https://www.npmjs.com/package/@domternal/theme))
24
24
  to your global stylesheet (e.g. `styles.scss`):
25
25
 
package/dist/README.md CHANGED
@@ -19,7 +19,7 @@ emoji picker, and Notion color picker auto-render from the extensions you load.
19
19
  pnpm add @domternal/angular @domternal/core @domternal/theme
20
20
  ```
21
21
 
22
- `@angular/core` (>=17.1), `@angular/forms` (>=17.1), `@angular/platform-browser` (>=17.1), and `@domternal/core` (>=1.0.0 <2.0.0)
22
+ `@angular/core` (>=17.1), `@angular/forms` (>=17.1), `@angular/platform-browser` (>=17.1), and `@domternal/core` (>=1.1.0 <2.0.0)
23
23
  are peer dependencies. Add the theme ([`@domternal/theme`](https://www.npmjs.com/package/@domternal/theme))
24
24
  to your global stylesheet (e.g. `styles.scss`):
25
25
 
@@ -741,7 +741,7 @@ class DomternalToolbarComponent {
741
741
  role="menuitem"
742
742
  [attr.tabindex]="-1"
743
743
  [attr.aria-label]="sub.label"
744
- [title]="sub.label"
744
+ [title]="getTooltip(sub)"
745
745
  [style.background-color]="sub.color"
746
746
  (mousedown)="$event.preventDefault()"
747
747
  (click)="onDropdownItemClick(sub)"
@@ -753,6 +753,7 @@ class DomternalToolbarComponent {
753
753
  role="menuitem"
754
754
  [attr.tabindex]="-1"
755
755
  [attr.aria-label]="sub.label"
756
+ [title]="getTooltip(sub)"
756
757
  [innerHTML]="getCachedItemContent(sub.icon, sub.label)"
757
758
  [attr.tabindex]="-1"
758
759
  (mousedown)="$event.preventDefault()"
@@ -772,6 +773,7 @@ class DomternalToolbarComponent {
772
773
  role="menuitem"
773
774
  [attr.tabindex]="-1"
774
775
  [attr.aria-label]="sub.label"
776
+ [title]="getTooltip(sub)"
775
777
  [attr.style]="sub.style ?? null"
776
778
  [innerHTML]="getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)"
777
779
  (mousedown)="$event.preventDefault()"
@@ -856,7 +858,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
856
858
  role="menuitem"
857
859
  [attr.tabindex]="-1"
858
860
  [attr.aria-label]="sub.label"
859
- [title]="sub.label"
861
+ [title]="getTooltip(sub)"
860
862
  [style.background-color]="sub.color"
861
863
  (mousedown)="$event.preventDefault()"
862
864
  (click)="onDropdownItemClick(sub)"
@@ -868,6 +870,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
868
870
  role="menuitem"
869
871
  [attr.tabindex]="-1"
870
872
  [attr.aria-label]="sub.label"
873
+ [title]="getTooltip(sub)"
871
874
  [innerHTML]="getCachedItemContent(sub.icon, sub.label)"
872
875
  [attr.tabindex]="-1"
873
876
  (mousedown)="$event.preventDefault()"
@@ -887,6 +890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
887
890
  role="menuitem"
888
891
  [attr.tabindex]="-1"
889
892
  [attr.aria-label]="sub.label"
893
+ [title]="getTooltip(sub)"
890
894
  [attr.style]="sub.style ?? null"
891
895
  [innerHTML]="getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)"
892
896
  (mousedown)="$event.preventDefault()"
@@ -1719,7 +1723,14 @@ class DomternalFloatingMenuComponent {
1719
1723
  @if (iconHtml(item.icon); as html) {
1720
1724
  <span class="dm-floating-menu-item-icon" aria-hidden="true" [innerHTML]="html"></span>
1721
1725
  }
1722
- <span class="dm-floating-menu-item-label">{{ item.label }}</span>
1726
+ @if (item.description) {
1727
+ <span class="dm-floating-menu-item-text">
1728
+ <span class="dm-floating-menu-item-label">{{ item.label }}</span>
1729
+ <span class="dm-floating-menu-item-description">{{ item.description }}</span>
1730
+ </span>
1731
+ } @else {
1732
+ <span class="dm-floating-menu-item-label">{{ item.label }}</span>
1733
+ }
1723
1734
  @if (item.shortcut) {
1724
1735
  <span class="dm-floating-menu-item-shortcut" aria-hidden="true">{{ item.shortcut }}</span>
1725
1736
  }
@@ -1767,7 +1778,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
1767
1778
  @if (iconHtml(item.icon); as html) {
1768
1779
  <span class="dm-floating-menu-item-icon" aria-hidden="true" [innerHTML]="html"></span>
1769
1780
  }
1770
- <span class="dm-floating-menu-item-label">{{ item.label }}</span>
1781
+ @if (item.description) {
1782
+ <span class="dm-floating-menu-item-text">
1783
+ <span class="dm-floating-menu-item-label">{{ item.label }}</span>
1784
+ <span class="dm-floating-menu-item-description">{{ item.description }}</span>
1785
+ </span>
1786
+ } @else {
1787
+ <span class="dm-floating-menu-item-label">{{ item.label }}</span>
1788
+ }
1771
1789
  @if (item.shortcut) {
1772
1790
  <span class="dm-floating-menu-item-shortcut" aria-hidden="true">{{ item.shortcut }}</span>
1773
1791
  }
@@ -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/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, EditorPreset, 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 /**\n * Whether the built-in History extension is included. Disable it when an\n * extension brings its own undo/redo, such as collaborative editing.\n */\n readonly history = input(true);\n readonly content = input<Content>('');\n readonly editable = input(true);\n /**\n * Editing experience preset. `'notion'` paints `dm-notion-mode` on this\n * component's host and switches preset-aware extensions to their Notion\n * behavior, replacing the hand-written class. Create-time only.\n */\n readonly preset = input<EditorPreset | undefined>(undefined);\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 const defaults = this.history()\n ? DEFAULT_EXTENSIONS\n : DEFAULT_EXTENSIONS.filter((extension) => extension.name !== 'history');\n const preset = this.preset();\n this._editor = new Editor({\n element: this.editorRef().nativeElement,\n extensions: [...defaults, ...this.extensions()],\n content: initialContent,\n editable: this.editable(),\n autofocus: this.autofocus(),\n ...(preset ? { preset } : {}),\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\n // Programmatic writes (writeValue, [content]) set skipUpdate: keep local\n // state in sync but do not emit change or mark the reactive form dirty.\n if (!transaction.getMeta('skipUpdate')) {\n this.contentUpdated.emit({ editor: ed });\n\n const value: Content = this.outputFormat() === 'html' ? html : ed.getJSON();\n this.onChange(value);\n }\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 refocusEditorAfterCommand,\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 escapeKeydownHandler: ((e: KeyboardEvent) => 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 refocusEditorAfterCommand(this.editor().view);\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 refocusEditorAfterCommand(this.editor().view);\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 // Escape from anywhere: opening a dropdown with the mouse leaves focus\n // outside the toolbar, so the host keydown handler never sees the key.\n // Focus stays put, since the caret is usually still in the editor.\n this.escapeKeydownHandler = (e: KeyboardEvent) => {\n if (!this.openDropdown()) return;\n if (e.key !== 'Escape') return;\n // Focus inside the toolbar belongs to the host handler, which also\n // restores focus. Not defaultPrevented: ProseMirror prevents Escape\n // first whenever the caret is in the editor.\n if (this.elRef.nativeElement.contains(document.activeElement)) return;\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => { this.syncState(); });\n e.preventDefault();\n };\n document.addEventListener('keydown', this.escapeKeydownHandler);\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.escapeKeydownHandler) {\n document.removeEventListener('keydown', this.escapeKeydownHandler);\n this.escapeKeydownHandler = 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 computed,\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 buildBubbleItemMaps,\n createBubbleMenuPlugin,\n createBubbleShouldShow,\n defaultBubbleContexts,\n defaultIcons,\n positionFloatingOnce,\n refocusEditorAfterCommand,\n resolveBubbleMenuItems,\n resolveBubbleNames,\n} from '@domternal/core';\nimport type {\n BubbleContexts,\n BubbleItemMaps,\n BubbleMenuItem,\n BubbleMenuOptions,\n IconSet,\n SelectionShape,\n ToolbarButton,\n ToolbarDropdown,\n Editor,\n} from '@domternal/core';\n\n/* The item pipeline (which list this selection gets, what the schema allows,\n which separators survive) is core's. This component renders the answer and\n owns nothing about how it is reached. */\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 (showColorTrigger()) {\n @if (resolvedItems().length > 0) {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n }\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 (showBlockTrigger()) {\n @if (resolvedItems().length > 0 || showColorTrigger()) {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n }\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 /**\n * Context-aware: map context names to item arrays, `true` for all valid\n * items, or `null` to disable.\n *\n * Typed through core's `BubbleContexts` rather than the same shape written\n * out here. Angular emits an input's declared type into the package types,\n * and an inline union came out of that emit as `Record<string, true |\n * string[]>`: the `null` that disables a context was missing from the\n * published type, so the documented way to switch one off did not\n * type-check. A named type survives the trip intact.\n */\n readonly contexts = input<BubbleContexts | 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): BubbleContexts | 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 /**\n * The list core hands back, stored once. A default or fallback list comes\n * back by reference and a signal set to its current value notifies nobody,\n * so those passes cost nothing; a list resolved from names is rebuilt each\n * time, as it always was.\n */\n private setResolvedItems(items: BubbleMenuItem[]): void {\n this.resolvedItems.set(items);\n }\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 * The trailing triggers, resolved once for the template: each is read twice,\n * for the button and for the separator that may lead it.\n */\n readonly showColorTrigger = computed(\n () => this.showColorPickerButton() && !this.isNodeSelection(),\n );\n readonly showBlockTrigger = computed(\n () => this.showBlockMenuButton() && !this.isNodeSelection(),\n );\n /** notionColorPicker extension loaded (immutable per editor). */\n private hasNotionColorPicker = 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 /** Rebuilt per editor by `setupItemTracking`; empty until then. */\n private maps: BubbleItemMaps = {\n itemMap: new Map<string, ToolbarButton>(),\n dropdownMap: new Map<string, ToolbarDropdown>(),\n bubbleDefaults: new Map<string, BubbleMenuItem[]>(),\n };\n private activeMap = new Map<string, boolean>();\n private disabledMap = new Map<string, boolean>();\n private htmlCache = new Map<string, SafeHtml>();\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 bubble-\n // menus mounted in the same editor do not collide.\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\n /* Item tracking first, and the order is load-bearing: it is what builds\n `this.maps`, and the visibility rule below reads that object once.\n With the plugin registered first the rule closed over an empty map,\n and `bubbleDefaults.has(...)` was false for every node selection, so\n an image never got a menu at all. */\n this.setupItemTracking(editor);\n\n const ctxs = this.resolveContexts(editor);\n const shouldShowFn =\n this.shouldShow() ??\n createBubbleShouldShow(this.maps, ctxs);\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 });\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 setupItemTracking(editor: Editor): void {\n /* One pipeline, built once per editor. Every renderer asks core the same\n question, so none of them answers it. */\n this.maps = buildBubbleItemMaps(editor);\n this.showBlockMenuButton.set(\n editor.extensionManager.extensions.some((e) => e.name === 'blockContextMenu'),\n );\n // Presence cached; the show decision needs a live listener (per sync below).\n this.hasNotionColorPicker =\n editor.extensionManager.extensions.some((e) => e.name === 'notionColorPicker');\n\n const fallbackItems = resolveBubbleNames(\n this.items() ?? ['bold', 'italic', 'underline'],\n this.maps.itemMap,\n this.maps.dropdownMap,\n );\n const refreshItems = (): void => {\n this.setResolvedItems(\n resolveBubbleMenuItems({\n editor,\n maps: this.maps,\n contexts: this.resolveContexts(editor),\n fallbackItems,\n }),\n );\n };\n\n refreshItems();\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 refreshItems();\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 // Hidden without a live notionColorOpen listener: the trigger would be dead.\n this.showColorPickerButton.set(\n this.hasNotionColorPicker && editor.listenerCount('notionColorOpen') > 0,\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 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. The\n // bubble menu plugin in core listens for that event and would hide itself -\n // taking our just-opened dropdown's trigger with it.\n const editorElBroadcast = this.menuEl().nativeElement.closest<HTMLElement>('.dm-editor');\n\n // Position the panel against the trigger after Angular renders it. We\n // deliberately keep the panel INSIDE `.dm-bubble-menu` so it inherits the\n // bubble-menu-scoped button tokens (--dm-button-active-bg / --dm-button-\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 refocusEditorAfterCommand(this.editor().view);\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 createFloatingMenuPlugin,\n defaultIcons,\n refocusEditorAfterCommand,\n} from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n FloatingMenuKeymap,\n FloatingMenuOptions,\n IconSet,\n} from '@domternal/core';\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 refocusEditorAfterCommand(editor.view);\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 >\n {{ categoryIcon(cat) }}\n </button>\n }\n </div>\n\n <div\n class=\"dm-emoji-picker-grid\"\n #grid\n (scroll)=\"onGridScroll()\"\n (keydown)=\"onGridKeydown($event)\"\n >\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 >\n {{ item.emoji }}\n </button>\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 >\n {{ item.emoji }}\n </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 >\n {{ item.emoji }}\n </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) => item.name.includes(query) || 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\n .slice(0, 16)\n .map((n) => nameMap.get(n))\n .filter(Boolean) as EmojiPickerItem[];\n });\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => {\n this.setupEventListener(editor);\n });\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 (\n firstSwatch instanceof HTMLElement &&\n firstSwatch.classList.contains('dm-emoji-swatch')\n ) {\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: number;\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 'Enter':\n case ' ':\n event.preventDefault();\n swatches[idx]?.click();\n return;\n default:\n 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(\n grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]')\n );\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>(\n '.dm-emoji-picker-search input'\n );\n input?.focus({ preventScroll: true });\n });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)(\n 'insertEmoji',\n this.eventHandler\n );\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(() => {\n this.close();\n });\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(() => {\n this.close();\n });\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)(\n 'insertEmoji',\n this.eventHandler\n );\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\nfunction paletteFromExtensionOptions(options: unknown): string[] {\n if (typeof options !== 'object' || options === null || !('palette' in options)) return [];\n const palette: unknown = options.palette;\n if (!Array.isArray(palette) || !palette.every((token: unknown) => typeof token === 'string')) {\n return [];\n }\n return [...palette];\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: [\n `\n :host {\n display: contents;\n }\n `,\n ],\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(() => {\n this.setupEventListener(editor);\n });\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(root.querySelectorAll<HTMLElement>('.dm-ncp-swatch'));\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: number;\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 =\n this.elRef.nativeElement.querySelector<HTMLElement>('.dm-notion-color-picker');\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>('.dm-ncp-swatch.dm-ncp-active');\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(() => {\n this.close({ refocus: false });\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(() => {\n this.close({ refocus: true });\n });\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(() => {\n this.close({ refocus: false });\n });\n return;\n }\n if (this.editor().state.selection.empty) {\n this.ngZone.run(() => {\n this.close({ refocus: false });\n });\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 {\n colorToken?: string | null;\n backgroundColorToken?: string | null;\n };\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(\n (e) => e.name === 'notionColorPicker'\n );\n return paletteFromExtensionOptions(ext?.options);\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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"}
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, EditorPreset, 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 /**\n * Whether the built-in History extension is included. Disable it when an\n * extension brings its own undo/redo, such as collaborative editing.\n */\n readonly history = input(true);\n readonly content = input<Content>('');\n readonly editable = input(true);\n /**\n * Editing experience preset. `'notion'` paints `dm-notion-mode` on this\n * component's host and switches preset-aware extensions to their Notion\n * behavior, replacing the hand-written class. Create-time only.\n */\n readonly preset = input<EditorPreset | undefined>(undefined);\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 const defaults = this.history()\n ? DEFAULT_EXTENSIONS\n : DEFAULT_EXTENSIONS.filter((extension) => extension.name !== 'history');\n const preset = this.preset();\n this._editor = new Editor({\n element: this.editorRef().nativeElement,\n extensions: [...defaults, ...this.extensions()],\n content: initialContent,\n editable: this.editable(),\n autofocus: this.autofocus(),\n ...(preset ? { preset } : {}),\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\n // Programmatic writes (writeValue, [content]) set skipUpdate: keep local\n // state in sync but do not emit change or mark the reactive form dirty.\n if (!transaction.getMeta('skipUpdate')) {\n this.contentUpdated.emit({ editor: ed });\n\n const value: Content = this.outputFormat() === 'html' ? html : ed.getJSON();\n this.onChange(value);\n }\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 refocusEditorAfterCommand,\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]=\"getTooltip(sub)\"\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 [title]=\"getTooltip(sub)\"\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 [title]=\"getTooltip(sub)\"\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 escapeKeydownHandler: ((e: KeyboardEvent) => 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 refocusEditorAfterCommand(this.editor().view);\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 refocusEditorAfterCommand(this.editor().view);\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 // Escape from anywhere: opening a dropdown with the mouse leaves focus\n // outside the toolbar, so the host keydown handler never sees the key.\n // Focus stays put, since the caret is usually still in the editor.\n this.escapeKeydownHandler = (e: KeyboardEvent) => {\n if (!this.openDropdown()) return;\n if (e.key !== 'Escape') return;\n // Focus inside the toolbar belongs to the host handler, which also\n // restores focus. Not defaultPrevented: ProseMirror prevents Escape\n // first whenever the caret is in the editor.\n if (this.elRef.nativeElement.contains(document.activeElement)) return;\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => { this.syncState(); });\n e.preventDefault();\n };\n document.addEventListener('keydown', this.escapeKeydownHandler);\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.escapeKeydownHandler) {\n document.removeEventListener('keydown', this.escapeKeydownHandler);\n this.escapeKeydownHandler = 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 computed,\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 buildBubbleItemMaps,\n createBubbleMenuPlugin,\n createBubbleShouldShow,\n defaultBubbleContexts,\n defaultIcons,\n positionFloatingOnce,\n refocusEditorAfterCommand,\n resolveBubbleMenuItems,\n resolveBubbleNames,\n} from '@domternal/core';\nimport type {\n BubbleContexts,\n BubbleItemMaps,\n BubbleMenuItem,\n BubbleMenuOptions,\n IconSet,\n SelectionShape,\n ToolbarButton,\n ToolbarDropdown,\n Editor,\n} from '@domternal/core';\n\n/* The item pipeline (which list this selection gets, what the schema allows,\n which separators survive) is core's. This component renders the answer and\n owns nothing about how it is reached. */\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 (showColorTrigger()) {\n @if (resolvedItems().length > 0) {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n }\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 (showBlockTrigger()) {\n @if (resolvedItems().length > 0 || showColorTrigger()) {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n }\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 /**\n * Context-aware: map context names to item arrays, `true` for all valid\n * items, or `null` to disable.\n *\n * Typed through core's `BubbleContexts` rather than the same shape written\n * out here. Angular emits an input's declared type into the package types,\n * and an inline union came out of that emit as `Record<string, true |\n * string[]>`: the `null` that disables a context was missing from the\n * published type, so the documented way to switch one off did not\n * type-check. A named type survives the trip intact.\n */\n readonly contexts = input<BubbleContexts | 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): BubbleContexts | 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 /**\n * The list core hands back, stored once. A default or fallback list comes\n * back by reference and a signal set to its current value notifies nobody,\n * so those passes cost nothing; a list resolved from names is rebuilt each\n * time, as it always was.\n */\n private setResolvedItems(items: BubbleMenuItem[]): void {\n this.resolvedItems.set(items);\n }\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 * The trailing triggers, resolved once for the template: each is read twice,\n * for the button and for the separator that may lead it.\n */\n readonly showColorTrigger = computed(\n () => this.showColorPickerButton() && !this.isNodeSelection(),\n );\n readonly showBlockTrigger = computed(\n () => this.showBlockMenuButton() && !this.isNodeSelection(),\n );\n /** notionColorPicker extension loaded (immutable per editor). */\n private hasNotionColorPicker = 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 /** Rebuilt per editor by `setupItemTracking`; empty until then. */\n private maps: BubbleItemMaps = {\n itemMap: new Map<string, ToolbarButton>(),\n dropdownMap: new Map<string, ToolbarDropdown>(),\n bubbleDefaults: new Map<string, BubbleMenuItem[]>(),\n };\n private activeMap = new Map<string, boolean>();\n private disabledMap = new Map<string, boolean>();\n private htmlCache = new Map<string, SafeHtml>();\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 bubble-\n // menus mounted in the same editor do not collide.\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\n /* Item tracking first, and the order is load-bearing: it is what builds\n `this.maps`, and the visibility rule below reads that object once.\n With the plugin registered first the rule closed over an empty map,\n and `bubbleDefaults.has(...)` was false for every node selection, so\n an image never got a menu at all. */\n this.setupItemTracking(editor);\n\n const ctxs = this.resolveContexts(editor);\n const shouldShowFn =\n this.shouldShow() ??\n createBubbleShouldShow(this.maps, ctxs);\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 });\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 setupItemTracking(editor: Editor): void {\n /* One pipeline, built once per editor. Every renderer asks core the same\n question, so none of them answers it. */\n this.maps = buildBubbleItemMaps(editor);\n this.showBlockMenuButton.set(\n editor.extensionManager.extensions.some((e) => e.name === 'blockContextMenu'),\n );\n // Presence cached; the show decision needs a live listener (per sync below).\n this.hasNotionColorPicker =\n editor.extensionManager.extensions.some((e) => e.name === 'notionColorPicker');\n\n const fallbackItems = resolveBubbleNames(\n this.items() ?? ['bold', 'italic', 'underline'],\n this.maps.itemMap,\n this.maps.dropdownMap,\n );\n const refreshItems = (): void => {\n this.setResolvedItems(\n resolveBubbleMenuItems({\n editor,\n maps: this.maps,\n contexts: this.resolveContexts(editor),\n fallbackItems,\n }),\n );\n };\n\n refreshItems();\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 refreshItems();\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 // Hidden without a live notionColorOpen listener: the trigger would be dead.\n this.showColorPickerButton.set(\n this.hasNotionColorPicker && editor.listenerCount('notionColorOpen') > 0,\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 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. The\n // bubble menu plugin in core listens for that event and would hide itself -\n // taking our just-opened dropdown's trigger with it.\n const editorElBroadcast = this.menuEl().nativeElement.closest<HTMLElement>('.dm-editor');\n\n // Position the panel against the trigger after Angular renders it. We\n // deliberately keep the panel INSIDE `.dm-bubble-menu` so it inherits the\n // bubble-menu-scoped button tokens (--dm-button-active-bg / --dm-button-\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 refocusEditorAfterCommand(this.editor().view);\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 createFloatingMenuPlugin,\n defaultIcons,\n refocusEditorAfterCommand,\n} from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n FloatingMenuKeymap,\n FloatingMenuOptions,\n IconSet,\n} from '@domternal/core';\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 @if (item.description) {\n <span class=\"dm-floating-menu-item-text\">\n <span class=\"dm-floating-menu-item-label\">{{ item.label }}</span>\n <span class=\"dm-floating-menu-item-description\">{{ item.description }}</span>\n </span>\n } @else {\n <span class=\"dm-floating-menu-item-label\">{{ item.label }}</span>\n }\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 refocusEditorAfterCommand(editor.view);\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 >\n {{ categoryIcon(cat) }}\n </button>\n }\n </div>\n\n <div\n class=\"dm-emoji-picker-grid\"\n #grid\n (scroll)=\"onGridScroll()\"\n (keydown)=\"onGridKeydown($event)\"\n >\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 >\n {{ item.emoji }}\n </button>\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 >\n {{ item.emoji }}\n </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 >\n {{ item.emoji }}\n </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) => item.name.includes(query) || 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\n .slice(0, 16)\n .map((n) => nameMap.get(n))\n .filter(Boolean) as EmojiPickerItem[];\n });\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => {\n this.setupEventListener(editor);\n });\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 (\n firstSwatch instanceof HTMLElement &&\n firstSwatch.classList.contains('dm-emoji-swatch')\n ) {\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: number;\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 'Enter':\n case ' ':\n event.preventDefault();\n swatches[idx]?.click();\n return;\n default:\n 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(\n grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]')\n );\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>(\n '.dm-emoji-picker-search input'\n );\n input?.focus({ preventScroll: true });\n });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)(\n 'insertEmoji',\n this.eventHandler\n );\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(() => {\n this.close();\n });\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(() => {\n this.close();\n });\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)(\n 'insertEmoji',\n this.eventHandler\n );\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\nfunction paletteFromExtensionOptions(options: unknown): string[] {\n if (typeof options !== 'object' || options === null || !('palette' in options)) return [];\n const palette: unknown = options.palette;\n if (!Array.isArray(palette) || !palette.every((token: unknown) => typeof token === 'string')) {\n return [];\n }\n return [...palette];\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: [\n `\n :host {\n display: contents;\n }\n `,\n ],\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(() => {\n this.setupEventListener(editor);\n });\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(root.querySelectorAll<HTMLElement>('.dm-ncp-swatch'));\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: number;\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 =\n this.elRef.nativeElement.querySelector<HTMLElement>('.dm-notion-color-picker');\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>('.dm-ncp-swatch.dm-ncp-active');\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(() => {\n this.close({ refocus: false });\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(() => {\n this.close({ refocus: true });\n });\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(() => {\n this.close({ refocus: false });\n });\n return;\n }\n if (this.editor().state.selection.empty) {\n this.ngZone.run(() => {\n this.close({ refocus: false });\n });\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 {\n colorToken?: string | null;\n backgroundColorToken?: string | null;\n };\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(\n (e) => e.name === 'notionColorPicker'\n );\n return paletteFromExtensionOptions(ext?.options);\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@domternal/angular",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "MIT-licensed Angular components for the Domternal rich text editor",
5
5
  "author": "https://github.com/ThomasNowHere",
6
6
  "license": "MIT",
@@ -20,7 +20,7 @@
20
20
  "@angular/core": ">=17.1.0",
21
21
  "@angular/forms": ">=17.1.0",
22
22
  "@angular/platform-browser": ">=17.1.0",
23
- "@domternal/core": ">=1.0.0 <2.0.0"
23
+ "@domternal/core": ">=1.1.0 <2.0.0"
24
24
  },
25
25
  "files": [
26
26
  "dist"
@@ -28,12 +28,6 @@
28
28
  "dependencies": {
29
29
  "tslib": "^2.8.0"
30
30
  },
31
- "scripts": {
32
- "build": "ng-packagr -p ng-package.json",
33
- "lint": "eslint src",
34
- "prepublishOnly": "pnpm build && node ../../scripts/prepare-publish-manifest.mjs",
35
- "postpublish": "git checkout package.json"
36
- },
37
31
  "keywords": [
38
32
  "angular",
39
33
  "prosemirror",
@@ -52,5 +46,9 @@
52
46
  "bugs": {
53
47
  "url": "https://github.com/domternal/domternal/issues"
54
48
  },
55
- "homepage": "https://domternal.dev"
56
- }
49
+ "homepage": "https://domternal.dev",
50
+ "scripts": {
51
+ "build": "ng-packagr -p ng-package.json",
52
+ "lint": "eslint src"
53
+ }
54
+ }