@domternal/angular 0.4.0 → 0.5.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
|
@@ -24,7 +24,7 @@ See <u>[Packages & Bundle Size](https://domternal.dev/v1/packages)</u> for a ful
|
|
|
24
24
|
- **Tree-shakeable** - import only what you use, your bundler strips the rest
|
|
25
25
|
- **~38 KB gzipped** (own code), <u>[~108 KB total](https://domternal.dev/v1/packages)</u> with ProseMirror
|
|
26
26
|
- **TypeScript first** - 100% typed, zero `any`
|
|
27
|
-
- **
|
|
27
|
+
- **6,400+ tests** - 2,677 unit tests and 3,767 E2E tests across 78 Playwright specs
|
|
28
28
|
- **Light and dark theme** - 70+ CSS custom properties for full visual control
|
|
29
29
|
- **Inline styles export** - `getHTML({ styled: true })` produces inline CSS ready for email clients, CMS, and Google Docs
|
|
30
30
|
- **SSR helpers** - `generateHTML`, `generateJSON`, `generateText` for server-side rendering
|
package/dist/README.md
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@domternal/angular)
|
|
4
4
|
[](https://github.com/domternal/domternal/blob/main/LICENSE)
|
|
5
5
|
|
|
6
|
-
A lightweight, extensible rich text editor toolkit built on <u>[ProseMirror](https://prosemirror.net/)</u>. Framework-agnostic headless core with first-class Angular support.
|
|
7
|
-
Use it headless with vanilla JS/TS, add the built-in toolbar and theme, or drop in ready-made
|
|
6
|
+
A lightweight, extensible rich text editor toolkit built on <u>[ProseMirror](https://prosemirror.net/)</u>. Framework-agnostic headless core with first-class Angular and React support.
|
|
7
|
+
Use it headless with vanilla JS/TS, add the built-in toolbar and theme, or drop in ready-made framework components. Fully tree-shakeable, import only what you use, unused extensions are stripped from your bundle.
|
|
8
8
|
|
|
9
9
|
## Links
|
|
10
10
|
|
|
11
|
-
<u>[Website](https://domternal.dev)</u> • <u>[Documentation](https://domternal.dev/v1/introduction)</u>
|
|
11
|
+
<u>[Website](https://domternal.dev)</u> • <u>[Documentation](https://domternal.dev/v1/introduction)</u>
|
|
12
|
+
<u>[StackBlitz (Angular)](https://stackblitz.com/edit/domternal-angular-full-example)</u> • <u>[StackBlitz (React)](https://stackblitz.com/edit/domternal-react-full-example)</u> • <u>[StackBlitz (Vanilla TS)](https://stackblitz.com/edit/domternal-vanilla-full-example)</u>
|
|
12
13
|
|
|
13
14
|
## Features
|
|
14
15
|
|
|
@@ -16,13 +17,14 @@ See <u>[Packages & Bundle Size](https://domternal.dev/v1/packages)</u> for a ful
|
|
|
16
17
|
|
|
17
18
|
- **Headless core** - use with any framework or vanilla JS/TS
|
|
18
19
|
- **Angular components** - editor, toolbar, bubble menu, floating menu, emoji picker (signals, OnPush, zoneless-ready)
|
|
19
|
-
- **
|
|
20
|
+
- **React components** - composable `Domternal` component, toolbar, bubble menu, floating menu, emoji picker, custom node views (React 18+)
|
|
21
|
+
- **57 extensions across 11 packages** - 23 nodes, 9 marks, and 25 behavior extensions
|
|
20
22
|
- **140+ chainable commands** - `editor.chain().focus().toggleBold().run()`
|
|
21
23
|
- **Full table support** - cell merging, column resize, row/column controls, cell toolbar, all free and MIT licensed
|
|
22
24
|
- **Tree-shakeable** - import only what you use, your bundler strips the rest
|
|
23
25
|
- **~38 KB gzipped** (own code), <u>[~108 KB total](https://domternal.dev/v1/packages)</u> with ProseMirror
|
|
24
26
|
- **TypeScript first** - 100% typed, zero `any`
|
|
25
|
-
- **
|
|
27
|
+
- **6,400+ tests** - 2,677 unit tests and 3,767 E2E tests across 78 Playwright specs
|
|
26
28
|
- **Light and dark theme** - 70+ CSS custom properties for full visual control
|
|
27
29
|
- **Inline styles export** - `getHTML({ styled: true })` produces inline CSS ready for email clients, CMS, and Google Docs
|
|
28
30
|
- **SSR helpers** - `generateHTML`, `generateJSON`, `generateText` for server-side rendering
|
|
@@ -470,6 +470,28 @@ class DomternalToolbarComponent {
|
|
|
470
470
|
this.controller.navigateLast();
|
|
471
471
|
this.focusCurrentButton();
|
|
472
472
|
break;
|
|
473
|
+
case 'ArrowDown': {
|
|
474
|
+
event.preventDefault();
|
|
475
|
+
if (this.openDropdown()) {
|
|
476
|
+
this.focusDropdownItem(1);
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
const buttons = this.elRef.nativeElement.querySelectorAll('.dm-toolbar-button');
|
|
480
|
+
const btn = buttons[this.controller?.focusedIndex ?? 0];
|
|
481
|
+
if (btn?.getAttribute('aria-haspopup')) {
|
|
482
|
+
btn.click();
|
|
483
|
+
requestAnimationFrame(() => this.focusDropdownItem(0, true));
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
break;
|
|
487
|
+
}
|
|
488
|
+
case 'ArrowUp': {
|
|
489
|
+
event.preventDefault();
|
|
490
|
+
if (this.openDropdown()) {
|
|
491
|
+
this.focusDropdownItem(-1);
|
|
492
|
+
}
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
473
495
|
case 'Escape':
|
|
474
496
|
if (this.openDropdown()) {
|
|
475
497
|
event.preventDefault();
|
|
@@ -483,6 +505,24 @@ class DomternalToolbarComponent {
|
|
|
483
505
|
}
|
|
484
506
|
}
|
|
485
507
|
// === Private ===
|
|
508
|
+
focusDropdownItem(direction, first) {
|
|
509
|
+
const panel = this.elRef.nativeElement.querySelector('.dm-toolbar-dropdown-panel');
|
|
510
|
+
if (!panel)
|
|
511
|
+
return;
|
|
512
|
+
const items = Array.from(panel.querySelectorAll('[role="menuitem"]'));
|
|
513
|
+
if (!items.length)
|
|
514
|
+
return;
|
|
515
|
+
if (first) {
|
|
516
|
+
items[0]?.focus();
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
const current = document.activeElement;
|
|
520
|
+
const idx = items.indexOf(current);
|
|
521
|
+
const next = idx === -1
|
|
522
|
+
? (direction > 0 ? 0 : items.length - 1)
|
|
523
|
+
: (idx + direction + items.length) % items.length;
|
|
524
|
+
items[next]?.focus();
|
|
525
|
+
}
|
|
486
526
|
resolveIconSvg(name) {
|
|
487
527
|
const customIcons = this.icons();
|
|
488
528
|
if (customIcons) {
|
|
@@ -642,6 +682,7 @@ class DomternalToolbarComponent {
|
|
|
642
682
|
class="dm-color-swatch"
|
|
643
683
|
[class.dm-color-swatch--active]="isActive(sub.name)"
|
|
644
684
|
role="menuitem"
|
|
685
|
+
[attr.tabindex]="-1"
|
|
645
686
|
[attr.aria-label]="sub.label"
|
|
646
687
|
[title]="sub.label"
|
|
647
688
|
[style.background-color]="sub.color"
|
|
@@ -653,8 +694,10 @@ class DomternalToolbarComponent {
|
|
|
653
694
|
type="button"
|
|
654
695
|
class="dm-color-palette-reset"
|
|
655
696
|
role="menuitem"
|
|
697
|
+
[attr.tabindex]="-1"
|
|
656
698
|
[attr.aria-label]="sub.label"
|
|
657
699
|
[innerHTML]="getCachedItemContent(sub.icon, sub.label)"
|
|
700
|
+
[attr.tabindex]="-1"
|
|
658
701
|
(mousedown)="$event.preventDefault()"
|
|
659
702
|
(click)="onDropdownItemClick(sub)"
|
|
660
703
|
></button>
|
|
@@ -670,6 +713,7 @@ class DomternalToolbarComponent {
|
|
|
670
713
|
class="dm-toolbar-dropdown-item"
|
|
671
714
|
[class.dm-toolbar-dropdown-item--active]="isActive(sub.name)"
|
|
672
715
|
role="menuitem"
|
|
716
|
+
[attr.tabindex]="-1"
|
|
673
717
|
[attr.aria-label]="sub.label"
|
|
674
718
|
[attr.style]="sub.style ?? null"
|
|
675
719
|
[innerHTML]="getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)"
|
|
@@ -752,6 +796,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
752
796
|
class="dm-color-swatch"
|
|
753
797
|
[class.dm-color-swatch--active]="isActive(sub.name)"
|
|
754
798
|
role="menuitem"
|
|
799
|
+
[attr.tabindex]="-1"
|
|
755
800
|
[attr.aria-label]="sub.label"
|
|
756
801
|
[title]="sub.label"
|
|
757
802
|
[style.background-color]="sub.color"
|
|
@@ -763,8 +808,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
763
808
|
type="button"
|
|
764
809
|
class="dm-color-palette-reset"
|
|
765
810
|
role="menuitem"
|
|
811
|
+
[attr.tabindex]="-1"
|
|
766
812
|
[attr.aria-label]="sub.label"
|
|
767
813
|
[innerHTML]="getCachedItemContent(sub.icon, sub.label)"
|
|
814
|
+
[attr.tabindex]="-1"
|
|
768
815
|
(mousedown)="$event.preventDefault()"
|
|
769
816
|
(click)="onDropdownItemClick(sub)"
|
|
770
817
|
></button>
|
|
@@ -780,6 +827,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
780
827
|
class="dm-toolbar-dropdown-item"
|
|
781
828
|
[class.dm-toolbar-dropdown-item--active]="isActive(sub.name)"
|
|
782
829
|
role="menuitem"
|
|
830
|
+
[attr.tabindex]="-1"
|
|
783
831
|
[attr.aria-label]="sub.label"
|
|
784
832
|
[attr.style]="sub.style ?? null"
|
|
785
833
|
[innerHTML]="getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)"
|
|
@@ -1115,13 +1163,14 @@ class DomternalBubbleMenuComponent {
|
|
|
1115
1163
|
}
|
|
1116
1164
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DomternalBubbleMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1117
1165
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: DomternalBubbleMenuComponent, isStandalone: true, selector: "domternal-bubble-menu", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, shouldShow: { classPropertyName: "shouldShow", publicName: "shouldShow", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, updateDelay: { classPropertyName: "updateDelay", publicName: "updateDelay", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, contexts: { classPropertyName: "contexts", publicName: "contexts", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "menuEl", first: true, predicate: ["menuEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
1118
|
-
<div #menuEl class="dm-bubble-menu">
|
|
1166
|
+
<div #menuEl class="dm-bubble-menu" role="toolbar" aria-label="Text formatting">
|
|
1119
1167
|
@for (item of resolvedItems(); track item.name) {
|
|
1120
1168
|
@if (item.type === 'separator') {
|
|
1121
|
-
<span class="dm-toolbar-separator"></span>
|
|
1169
|
+
<span class="dm-toolbar-separator" role="separator"></span>
|
|
1122
1170
|
} @else {
|
|
1123
1171
|
<button type="button" class="dm-toolbar-button"
|
|
1124
1172
|
[class.dm-toolbar-button--active]="isItemActive(item)"
|
|
1173
|
+
[attr.aria-pressed]="isItemActive(item)"
|
|
1125
1174
|
[disabled]="isItemDisabled(item)"
|
|
1126
1175
|
[title]="item.label"
|
|
1127
1176
|
[attr.aria-label]="item.label"
|
|
@@ -1137,13 +1186,14 @@ class DomternalBubbleMenuComponent {
|
|
|
1137
1186
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DomternalBubbleMenuComponent, decorators: [{
|
|
1138
1187
|
type: Component,
|
|
1139
1188
|
args: [{ selector: 'domternal-bubble-menu', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
1140
|
-
<div #menuEl class="dm-bubble-menu">
|
|
1189
|
+
<div #menuEl class="dm-bubble-menu" role="toolbar" aria-label="Text formatting">
|
|
1141
1190
|
@for (item of resolvedItems(); track item.name) {
|
|
1142
1191
|
@if (item.type === 'separator') {
|
|
1143
|
-
<span class="dm-toolbar-separator"></span>
|
|
1192
|
+
<span class="dm-toolbar-separator" role="separator"></span>
|
|
1144
1193
|
} @else {
|
|
1145
1194
|
<button type="button" class="dm-toolbar-button"
|
|
1146
1195
|
[class.dm-toolbar-button--active]="isItemActive(item)"
|
|
1196
|
+
[attr.aria-pressed]="isItemActive(item)"
|
|
1147
1197
|
[disabled]="isItemDisabled(item)"
|
|
1148
1198
|
[title]="item.label"
|
|
1149
1199
|
[attr.aria-label]="item.label"
|
|
@@ -1301,6 +1351,45 @@ class DomternalEmojiPickerComponent {
|
|
|
1301
1351
|
}
|
|
1302
1352
|
});
|
|
1303
1353
|
}
|
|
1354
|
+
onGridKeydown(event) {
|
|
1355
|
+
const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid');
|
|
1356
|
+
if (!grid)
|
|
1357
|
+
return;
|
|
1358
|
+
const swatches = Array.from(grid.querySelectorAll('.dm-emoji-swatch'));
|
|
1359
|
+
if (!swatches.length)
|
|
1360
|
+
return;
|
|
1361
|
+
const current = document.activeElement;
|
|
1362
|
+
const idx = swatches.indexOf(current);
|
|
1363
|
+
if (idx === -1)
|
|
1364
|
+
return;
|
|
1365
|
+
const cols = 8;
|
|
1366
|
+
let next = idx;
|
|
1367
|
+
switch (event.key) {
|
|
1368
|
+
case 'ArrowRight':
|
|
1369
|
+
event.preventDefault();
|
|
1370
|
+
next = Math.min(idx + 1, swatches.length - 1);
|
|
1371
|
+
break;
|
|
1372
|
+
case 'ArrowLeft':
|
|
1373
|
+
event.preventDefault();
|
|
1374
|
+
next = Math.max(idx - 1, 0);
|
|
1375
|
+
break;
|
|
1376
|
+
case 'ArrowDown':
|
|
1377
|
+
event.preventDefault();
|
|
1378
|
+
next = Math.min(idx + cols, swatches.length - 1);
|
|
1379
|
+
break;
|
|
1380
|
+
case 'ArrowUp':
|
|
1381
|
+
event.preventDefault();
|
|
1382
|
+
next = Math.max(idx - cols, 0);
|
|
1383
|
+
break;
|
|
1384
|
+
case 'Enter':
|
|
1385
|
+
case ' ':
|
|
1386
|
+
event.preventDefault();
|
|
1387
|
+
swatches[idx]?.click();
|
|
1388
|
+
return;
|
|
1389
|
+
default: return;
|
|
1390
|
+
}
|
|
1391
|
+
swatches[next]?.focus();
|
|
1392
|
+
}
|
|
1304
1393
|
onGridScroll() {
|
|
1305
1394
|
const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid');
|
|
1306
1395
|
if (!grid || this.searchQuery())
|
|
@@ -1356,7 +1445,7 @@ class DomternalEmojiPickerComponent {
|
|
|
1356
1445
|
});
|
|
1357
1446
|
}
|
|
1358
1447
|
const input = this.elRef.nativeElement.querySelector('.dm-emoji-picker-search input');
|
|
1359
|
-
input?.focus();
|
|
1448
|
+
input?.focus({ preventScroll: true });
|
|
1360
1449
|
});
|
|
1361
1450
|
});
|
|
1362
1451
|
};
|
|
@@ -1423,6 +1512,7 @@ class DomternalEmojiPickerComponent {
|
|
|
1423
1512
|
placeholder="Search emoji..."
|
|
1424
1513
|
[value]="searchQuery()"
|
|
1425
1514
|
(input)="onSearch($event)"
|
|
1515
|
+
aria-label="Search emoji"
|
|
1426
1516
|
(keydown.escape)="close()"
|
|
1427
1517
|
/>
|
|
1428
1518
|
</div>
|
|
@@ -1433,6 +1523,8 @@ class DomternalEmojiPickerComponent {
|
|
|
1433
1523
|
type="button"
|
|
1434
1524
|
class="dm-emoji-picker-tab"
|
|
1435
1525
|
[class.dm-emoji-picker-tab--active]="activeCategory() === cat"
|
|
1526
|
+
role="tab"
|
|
1527
|
+
[attr.aria-selected]="activeCategory() === cat"
|
|
1436
1528
|
[title]="cat"
|
|
1437
1529
|
[attr.aria-label]="cat"
|
|
1438
1530
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1441,12 +1533,13 @@ class DomternalEmojiPickerComponent {
|
|
|
1441
1533
|
}
|
|
1442
1534
|
</div>
|
|
1443
1535
|
|
|
1444
|
-
<div class="dm-emoji-picker-grid" #grid (scroll)="onGridScroll()">
|
|
1536
|
+
<div class="dm-emoji-picker-grid" #grid (scroll)="onGridScroll()" (keydown)="onGridKeydown($event)">
|
|
1445
1537
|
@if (searchQuery()) {
|
|
1446
1538
|
@for (item of filteredEmojis(); track item.name) {
|
|
1447
1539
|
<button
|
|
1448
1540
|
type="button"
|
|
1449
1541
|
class="dm-emoji-swatch"
|
|
1542
|
+
[attr.tabindex]="-1"
|
|
1450
1543
|
[title]="formatName(item.name)"
|
|
1451
1544
|
[attr.aria-label]="formatName(item.name)"
|
|
1452
1545
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1463,6 +1556,7 @@ class DomternalEmojiPickerComponent {
|
|
|
1463
1556
|
<button
|
|
1464
1557
|
type="button"
|
|
1465
1558
|
class="dm-emoji-swatch"
|
|
1559
|
+
[attr.tabindex]="-1"
|
|
1466
1560
|
[title]="formatName(item.name)"
|
|
1467
1561
|
[attr.aria-label]="formatName(item.name)"
|
|
1468
1562
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1476,6 +1570,7 @@ class DomternalEmojiPickerComponent {
|
|
|
1476
1570
|
<button
|
|
1477
1571
|
type="button"
|
|
1478
1572
|
class="dm-emoji-swatch"
|
|
1573
|
+
[attr.tabindex]="-1"
|
|
1479
1574
|
[title]="formatName(item.name)"
|
|
1480
1575
|
[attr.aria-label]="formatName(item.name)"
|
|
1481
1576
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1506,6 +1601,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1506
1601
|
placeholder="Search emoji..."
|
|
1507
1602
|
[value]="searchQuery()"
|
|
1508
1603
|
(input)="onSearch($event)"
|
|
1604
|
+
aria-label="Search emoji"
|
|
1509
1605
|
(keydown.escape)="close()"
|
|
1510
1606
|
/>
|
|
1511
1607
|
</div>
|
|
@@ -1516,6 +1612,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1516
1612
|
type="button"
|
|
1517
1613
|
class="dm-emoji-picker-tab"
|
|
1518
1614
|
[class.dm-emoji-picker-tab--active]="activeCategory() === cat"
|
|
1615
|
+
role="tab"
|
|
1616
|
+
[attr.aria-selected]="activeCategory() === cat"
|
|
1519
1617
|
[title]="cat"
|
|
1520
1618
|
[attr.aria-label]="cat"
|
|
1521
1619
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1524,12 +1622,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1524
1622
|
}
|
|
1525
1623
|
</div>
|
|
1526
1624
|
|
|
1527
|
-
<div class="dm-emoji-picker-grid" #grid (scroll)="onGridScroll()">
|
|
1625
|
+
<div class="dm-emoji-picker-grid" #grid (scroll)="onGridScroll()" (keydown)="onGridKeydown($event)">
|
|
1528
1626
|
@if (searchQuery()) {
|
|
1529
1627
|
@for (item of filteredEmojis(); track item.name) {
|
|
1530
1628
|
<button
|
|
1531
1629
|
type="button"
|
|
1532
1630
|
class="dm-emoji-swatch"
|
|
1631
|
+
[attr.tabindex]="-1"
|
|
1533
1632
|
[title]="formatName(item.name)"
|
|
1534
1633
|
[attr.aria-label]="formatName(item.name)"
|
|
1535
1634
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1546,6 +1645,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1546
1645
|
<button
|
|
1547
1646
|
type="button"
|
|
1548
1647
|
class="dm-emoji-swatch"
|
|
1648
|
+
[attr.tabindex]="-1"
|
|
1549
1649
|
[title]="formatName(item.name)"
|
|
1550
1650
|
[attr.aria-label]="formatName(item.name)"
|
|
1551
1651
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1559,6 +1659,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1559
1659
|
<button
|
|
1560
1660
|
type="button"
|
|
1561
1661
|
class="dm-emoji-swatch"
|
|
1662
|
+
[attr.tabindex]="-1"
|
|
1562
1663
|
[title]="formatName(item.name)"
|
|
1563
1664
|
[attr.aria-label]="formatName(item.name)"
|
|
1564
1665
|
(mousedown)="$event.preventDefault()"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domternal-angular.mjs","sources":["../../src/lib/editor.component.ts","../../src/lib/toolbar.component.ts","../../src/lib/bubble-menu.component.ts","../../src/lib/floating-menu.component.ts","../../src/lib/emoji-picker.component.ts","../../src/domternal-angular.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n forwardRef,\n signal,\n ChangeDetectionStrategy,\n inject,\n NgZone,\n OnDestroy,\n effect,\n input,\n output,\n viewChild,\n untracked,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type { Content, AnyExtension, FocusPosition, JSONContent, TransactionEventProps, FocusEventProps } from '@domternal/core';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [Document, Paragraph, Text, BaseKeymap, History];\n\n@Component({\n selector: 'domternal-editor',\n template: '<div #editorRef></div>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'dm-editor' },\n styles: [`:host { display: block; }`],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DomternalEditorComponent),\n multi: true,\n },\n ],\n})\nexport class DomternalEditorComponent implements ControlValueAccessor, OnDestroy {\n // === Template ref ===\n readonly editorRef = viewChild.required<ElementRef<HTMLDivElement>>('editorRef');\n\n // === Inputs ===\n readonly extensions = input<AnyExtension[]>([]);\n readonly content = input<Content>('');\n readonly editable = input(true);\n readonly autofocus = input<FocusPosition>(false);\n readonly outputFormat = input<'html' | 'json'>('html');\n\n // === Outputs ===\n readonly editorCreated = output<Editor>();\n readonly contentUpdated = output<{ editor: Editor }>();\n readonly selectionChanged = output<{ editor: Editor }>();\n readonly focusChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly blurChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly editorDestroyed = output<void>();\n\n // === Signals (read-only public state) ===\n private _htmlContent = signal('');\n private _jsonContent = signal<JSONContent | null>(null);\n private _isEmpty = signal(true);\n private _isFocused = signal(false);\n // Candidate for linkedSignal(editable) once min Angular version is >=20\n private _isEditable = signal(true);\n\n readonly htmlContent = this._htmlContent.asReadonly();\n readonly jsonContent = this._jsonContent.asReadonly();\n readonly isEmpty = this._isEmpty.asReadonly();\n readonly isFocused = this._isFocused.asReadonly();\n readonly isEditable = this._isEditable.asReadonly();\n\n // === Editor instance ===\n private _editor: Editor | null = null;\n\n get editor(): Editor | null {\n return this._editor;\n }\n\n // === ControlValueAccessor ===\n private onChange: (value: Content) => void = () => {};\n private onTouched: () => void = () => {};\n private _pendingContent: Content | null = null;\n\n private ngZone = inject(NgZone);\n\n constructor() {\n afterNextRender(() => {\n this.createEditor();\n });\n\n // React to editable input changes\n effect(() => {\n const editable = this.editable();\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n this._editor!.setEditable(editable);\n this._isEditable.set(editable);\n });\n });\n\n // React to content input changes\n effect(() => {\n const content = this.content();\n const format = this.outputFormat();\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n const current = format === 'html'\n ? this._editor!.getHTML()\n : JSON.stringify(this._editor!.getJSON());\n const incoming = format === 'html'\n ? (content as string)\n : JSON.stringify(content);\n if (incoming !== current) {\n this._editor!.setContent(content, false);\n }\n });\n });\n\n // React to extensions input changes\n effect(() => {\n this.extensions(); // track the signal\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n this.recreateEditor();\n });\n });\n }\n\n // === Lifecycle ===\n\n ngOnDestroy(): void {\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.destroy();\n this.editorDestroyed.emit();\n }\n this._editor = null;\n }\n\n // === ControlValueAccessor implementation ===\n\n writeValue(value: Content): void {\n if (!this._editor || this._editor.isDestroyed) {\n this._pendingContent = value;\n return;\n }\n\n // Compare current content to avoid unnecessary setContent (which resets cursor)\n if (this.outputFormat() === 'html') {\n if (value === this._editor.getHTML()) return;\n } else {\n if (JSON.stringify(value) === JSON.stringify(this._editor.getJSON())) return;\n }\n\n this._editor.setContent(value, false);\n }\n\n registerOnChange(fn: (value: Content) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._isEditable.set(!isDisabled);\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.setEditable(!isDisabled);\n }\n }\n\n // === Private ===\n\n private recreateEditor(): void {\n if (!this._editor || this._editor.isDestroyed) return;\n const currentContent = this._editor.getJSON();\n this._editor.destroy();\n this.editorDestroyed.emit();\n this._pendingContent = currentContent;\n this.createEditor();\n }\n\n private createEditor(): void {\n const initialContent = this._pendingContent ?? this.content();\n this._pendingContent = null;\n\n this._editor = new Editor({\n element: this.editorRef().nativeElement,\n extensions: [...DEFAULT_EXTENSIONS, ...this.extensions()],\n content: initialContent,\n editable: this.editable(),\n autofocus: this.autofocus(),\n });\n\n this._isEditable.set(this.editable());\n\n // Set initial signal values\n this._htmlContent.set(this._editor.getHTML());\n this._jsonContent.set(this._editor.getJSON());\n this._isEmpty.set(this._editor.isEmpty);\n\n this._editor.on('transaction', ({ transaction }: TransactionEventProps) => {\n this.ngZone.run(() => {\n const ed = this._editor!;\n\n if (transaction.docChanged) {\n const html = ed.getHTML();\n this._htmlContent.set(html);\n this._jsonContent.set(ed.getJSON());\n this._isEmpty.set(ed.isEmpty);\n this.contentUpdated.emit({ editor: ed });\n\n const value: Content = this.outputFormat() === 'html' ? html : ed.getJSON();\n this.onChange(value);\n }\n\n if (!transaction.docChanged && transaction.selectionSet) {\n this.selectionChanged.emit({ editor: ed });\n }\n });\n });\n\n this._editor.on('focus', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(true);\n this.focusChanged.emit({ editor: this._editor!, event });\n });\n });\n\n this._editor.on('blur', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(false);\n this.blurChanged.emit({ editor: this._editor!, event });\n this.onTouched();\n });\n });\n\n // Emit editor created\n this.ngZone.run(() => {\n this.editorCreated.emit(this._editor!);\n });\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n Editor,\n ToolbarController,\n defaultIcons,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n ToolbarItem,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarControllerEditor,\n IconSet,\n ToolbarGroup,\n ToolbarLayoutEntry,\n} from '@domternal/core';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\n@Component({\n selector: 'domternal-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'dm-toolbar',\n 'role': 'toolbar',\n '[attr.aria-label]': '\"Editor formatting\"',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n @for (group of groups(); track group.name; let gi = $index) {\n @if (gi > 0) {\n <div class=\"dm-toolbar-separator\" role=\"separator\"></div>\n }\n <div class=\"dm-toolbar-group\" role=\"group\" [attr.aria-label]=\"group.name || 'Tools'\">\n @for (item of group.items; track item.name) {\n @if (item.type === 'button') {\n <button\n type=\"button\"\n class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isActive(item.name)\"\n [attr.aria-pressed]=\"isActive(item.name)\"\n [attr.aria-expanded]=\"getAriaExpanded(asButton(item))\"\n [attr.aria-label]=\"asButton(item).label\"\n [title]=\"getTooltip(asButton(item))\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(item.name)\"\n [innerHTML]=\"getCachedIcon(asButton(item).icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onButtonClick(asButton(item), $event)\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n }\n @if (item.type === 'dropdown') {\n <div class=\"dm-toolbar-dropdown-wrapper\">\n <button\n type=\"button\"\n class=\"dm-toolbar-button dm-toolbar-dropdown-trigger\"\n [class.dm-toolbar-button--active]=\"isDropdownActive(asDropdown(item))\"\n [attr.aria-expanded]=\"openDropdown() === asDropdown(item).name\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-label]=\"asDropdown(item).label\"\n [title]=\"asDropdown(item).label\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(asDropdown(item).name)\"\n [attr.data-dropdown]=\"asDropdown(item).name\"\n [innerHTML]=\"getDropdownTriggerHtml(asDropdown(item))\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownToggle(asDropdown(item))\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n @if (openDropdown() === asDropdown(item).name) {\n @if (asDropdown(item).layout === 'grid') {\n <div class=\"dm-toolbar-dropdown-panel dm-color-palette\" role=\"menu\"\n [attr.style]=\"getGridStyle(asDropdown(item))\">\n @for (sub of asDropdown(item).items; track sub.name) {\n @if (sub.color) {\n <button\n type=\"button\"\n class=\"dm-color-swatch\"\n [class.dm-color-swatch--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.aria-label]=\"sub.label\"\n [title]=\"sub.label\"\n [style.background-color]=\"sub.color\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n } @else {\n <button\n type=\"button\"\n class=\"dm-color-palette-reset\"\n role=\"menuitem\"\n [attr.aria-label]=\"sub.label\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n }\n }\n </div>\n } @else {\n <div class=\"dm-toolbar-dropdown-panel\" role=\"menu\"\n [attr.data-display-mode]=\"asDropdown(item).displayMode ?? null\">\n @for (sub of asDropdown(item).items; track sub.name) {\n <button\n type=\"button\"\n class=\"dm-toolbar-dropdown-item\"\n [class.dm-toolbar-dropdown-item--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.aria-label]=\"sub.label\"\n [attr.style]=\"sub.style ?? null\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub, $event)\"\n ></button>\n }\n </div>\n }\n }\n </div>\n }\n }\n </div>\n }\n `,\n})\nexport class DomternalToolbarComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly icons = input<IconSet | null>(null);\n readonly layout = input<ToolbarLayoutEntry[]>();\n\n /** Exposed state signals for template */\n readonly groups = signal<ToolbarGroup[]>([]);\n readonly focusedIndex = signal(0);\n readonly openDropdown = signal<string | null>(null);\n /** Bumped on active state changes to trigger re-evaluation of isActive() */\n readonly activeVersion = signal(0);\n\n private controller: ToolbarController | null = null;\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private dismissOverlayHandler: (() => void) | null = null;\n private editorEl: HTMLElement | null = null;\n private cleanupFloating: (() => void) | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject(ElementRef);\n private sanitizer = inject(DomSanitizer);\n\n /** SafeHtml cache — same reference returned for same key, prevents DOM churn */\n private htmlCache = new Map<string, SafeHtml>();\n\n private readonly dropdownCaret = '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"><path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => this.setupController(editor));\n });\n }\n\n ngOnDestroy(): void {\n this.destroyController();\n }\n\n // === Template helpers ===\n\n isActive(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.activeMap.get(name) ?? false;\n }\n\n isDisabled(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.disabledMap.get(name) ?? false;\n }\n\n isDropdownActive(dropdown: ToolbarDropdown): boolean {\n if (dropdown.layout === 'grid') return false; // color dropdowns use bar indicator instead\n if (dropdown.dynamicLabel) return false; // label text already communicates state\n this.activeVersion(); // subscribe to changes\n return dropdown.items.some((item: 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\n onDropdownToggle(dropdown: ToolbarDropdown): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.toggleDropdown(dropdown.name);\n this.syncState();\n\n // Position the panel after Angular renders it (tracks resize, not scroll)\n if (this.openDropdown()) {\n requestAnimationFrame(() => {\n const trigger = this.elRef.nativeElement.querySelector(\n `[aria-expanded=\"true\"]`,\n ) as HTMLElement | null;\n const panel = trigger?.parentElement?.querySelector(\n '.dm-toolbar-dropdown-panel',\n ) as HTMLElement | null;\n if (trigger && panel) {\n // List dropdowns align to trigger's left edge; grid/picker dropdowns center\n const placement = dropdown.layout === 'grid' ? 'bottom' : 'bottom-start';\n this.cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n }\n });\n }\n }\n\n onDropdownItemClick(item: ToolbarButton, event?: Event): void {\n // For emitEvent items, use the dropdown trigger as anchor (sub-item gets removed when dropdown closes)\n let anchor: HTMLElement | undefined;\n if (item.emitEvent && event?.currentTarget) {\n const wrapper = (event.currentTarget as HTMLElement).closest('.dm-toolbar-dropdown-wrapper');\n anchor = wrapper?.querySelector('.dm-toolbar-dropdown-trigger') as HTMLElement | undefined;\n }\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n if (item.emitEvent) {\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n } else {\n this.controller?.executeCommand(item);\n }\n }\n\n onButtonFocus(name: string): void {\n const index = this.controller?.getFlatIndex(name) ?? -1;\n if (index >= 0) {\n this.controller?.setFocusedIndex(index);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (!this.controller) return;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.controller.navigateNext();\n this.focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.controller.navigatePrev();\n this.focusCurrentButton();\n break;\n case 'Home':\n event.preventDefault();\n this.controller.navigateFirst();\n this.focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n this.controller.navigateLast();\n this.focusCurrentButton();\n break;\n case 'Escape':\n if (this.openDropdown()) {\n event.preventDefault();\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller.closeDropdown();\n this.syncState();\n this.focusCurrentButton();\n }\n break;\n }\n }\n\n // === Private ===\n\n private resolveIconSvg(name: string): string {\n const customIcons = this.icons();\n if (customIcons) {\n return customIcons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }\n\n private setupController(editor: Editor): void {\n this.destroyController();\n\n this.controller = new ToolbarController(\n editor as unknown as ToolbarControllerEditor,\n () => this.ngZone.run(() => this.syncState()),\n this.layout(),\n );\n this.controller.subscribe();\n this.syncState();\n\n // Click outside to close dropdown\n this.clickOutsideHandler = (e: Event) => {\n if (this.openDropdown() && !this.elRef.nativeElement.contains(e.target as Node)) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => this.syncState());\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n // Listen for dismiss-overlays (e.g. table handle clicks that stopPropagation on mousedown)\n this.editorEl = editor.view.dom.closest('.dm-editor') as HTMLElement | null;\n if (this.editorEl) {\n this.dismissOverlayHandler = () => {\n if (this.openDropdown()) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => this.syncState());\n }\n };\n this.editorEl.addEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n }\n }\n\n private destroyController(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.dismissOverlayHandler && this.editorEl) {\n this.editorEl.removeEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n this.dismissOverlayHandler = null;\n this.editorEl = null;\n }\n if (this.controller) {\n this.controller.destroy();\n this.controller = null;\n }\n }\n\n private syncState(): void {\n if (!this.controller) return;\n\n // Only update groups if they actually changed (initial build or rebuild)\n const controllerGroups = this.controller.groups;\n if (this.groups().length !== controllerGroups.length) {\n this.groups.set(controllerGroups);\n }\n\n this.focusedIndex.set(this.controller.focusedIndex);\n this.openDropdown.set(this.controller.openDropdown);\n\n // Bump version to trigger isActive() re-evaluation without creating new objects\n this.activeVersion.update(v => v + 1);\n }\n\n private getComputedStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n // Prefer inline style (explicit mark) over computed style (inherited from heading, etc.)\n return el.style.getPropertyValue(prop)\n || window.getComputedStyle(el).getPropertyValue(prop)\n || null;\n } catch {\n return null;\n }\n }\n\n /** Read only inline style — no computed fallback (used for font-family). */\n private getInlineStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n }\n\n private focusCurrentButton(): void {\n const idx = this.controller?.focusedIndex ?? 0;\n const buttons = this.elRef.nativeElement.querySelectorAll(\n '.dm-toolbar-button'\n ) as NodeListOf<HTMLButtonElement>;\n buttons[idx]?.focus();\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n inject,\n NgZone,\n viewChild,\n ElementRef,\n afterNextRender,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n Editor,\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultIcons,\n} from '@domternal/core';\nimport type { BubbleMenuOptions, ToolbarButton } from '@domternal/core';\n\ninterface BubbleMenuSeparator { type: 'separator'; name: string }\ntype BubbleMenuItem = ToolbarButton | BubbleMenuSeparator;\n\n/** Minimal ProseMirror Selection shape for duck-typing (avoids instanceof issues across bundles) */\ninterface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\ninterface SelectionShape {\n empty: boolean;\n $from: ResolvedPosShape;\n $to: ResolvedPosShape;\n node?: { type: { name: string } };\n}\n\n/** Check if a resolved position is inside a table cell or header. */\nfunction isInsideTableCell($pos: ResolvedPosShape): boolean {\n for (let d = $pos.depth; d > 0; d--) {\n const name = $pos.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return true;\n }\n return false;\n}\n\n/** ProseMirror schema shape for mark filtering */\ninterface SchemaShape {\n nodes: Record<string, { allowsMarkType: (mt: unknown) => boolean }>;\n marks: Record<string, unknown>;\n}\n\n@Component({\n selector: 'domternal-bubble-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div #menuEl class=\"dm-bubble-menu\">\n @for (item of resolvedItems(); track item.name) {\n @if (item.type === 'separator') {\n <span class=\"dm-toolbar-separator\"></span>\n } @else {\n <button type=\"button\" class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isItemActive(item)\"\n [disabled]=\"isItemDisabled(item)\"\n [title]=\"item.label\"\n [attr.aria-label]=\"item.label\"\n [innerHTML]=\"getCachedIcon(item.icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"executeCommand(item)\"></button>\n }\n }\n <ng-content />\n </div>\n `,\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalBubbleMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<BubbleMenuOptions['shouldShow']>();\n readonly placement = input<'top' | 'bottom'>('top');\n readonly offset = input<number>(8);\n readonly updateDelay = input(0);\n\n /** Fixed item names (e.g. ['bold', 'italic', 'code']). Omit for auto mode (all format items). */\n readonly items = input<string[]>();\n\n /** Context-aware: map context names to item arrays, `true` for all valid items, or `null` to disable */\n readonly contexts = input<Record<string, string[] | true | null>>();\n\n /** Internal — updated on transactions. Not meant to be set from outside. */\n readonly resolvedItems = signal<BubbleMenuItem[]>([]);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private pluginKey: PluginKey;\n\n private sanitizer = inject(DomSanitizer);\n private ngZone = inject(NgZone);\n\n private activeVersion = signal(0);\n private itemMap = new Map<string, ToolbarButton>();\n private activeMap = new Map<string, boolean>();\n private disabledMap = new Map<string, boolean>();\n private htmlCache = new Map<string, SafeHtml>();\n private bubbleDefaults = new Map<string, BubbleMenuItem[]>();\n private transactionHandler: (() => void) | null = null;\n\n constructor() {\n this.pluginKey = new PluginKey(\n 'angularBubbleMenu-' + Math.random().toString(36).slice(2, 8),\n );\n\n afterNextRender(() => {\n const editor = this.editor();\n const ctxs = this.contexts();\n let shouldShowFn = this.shouldShow();\n\n if (!shouldShowFn) {\n if (ctxs) {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n const context = this.detectContext(state.selection, ctxs);\n if (!context) return false;\n if (context in ctxs) {\n const val = ctxs[context];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return this.bubbleDefaults.has(context);\n };\n } else {\n // Auto/items mode: show when any endpoint's parent allows marks\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n if (state.selection.empty || state.selection.node) return false;\n if (isInsideTableCell(state.selection.$from)) return false;\n return state.selection.$from.parent.type.spec.marks !== ''\n || state.selection.$to.parent.type.spec.marks !== '';\n };\n }\n }\n\n const plugin = createBubbleMenuPlugin({\n pluginKey: this.pluginKey,\n editor,\n element: this.menuEl().nativeElement,\n shouldShow: shouldShowFn,\n placement: this.placement(),\n offset: this.offset(),\n updateDelay: this.updateDelay(),\n });\n editor.registerPlugin(plugin);\n this.setupItemTracking(editor);\n });\n }\n\n ngOnDestroy(): void {\n const editor = this.editor();\n if (this.transactionHandler) {\n editor.off('transaction', this.transactionHandler);\n }\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n\n // === Template helpers ===\n\n isItemActive(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.activeMap.get(item.name) ?? false;\n }\n\n isItemDisabled(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.disabledMap.get(item.name) ?? false;\n }\n\n getCachedIcon(name: string): SafeHtml {\n let cached = this.htmlCache.get(name);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(defaultIcons[name] ?? '');\n this.htmlCache.set(name, cached);\n }\n return cached;\n }\n\n executeCommand(item: ToolbarButton): void {\n if (item.emitEvent) {\n // emitEvent is a dynamic string; cast needed to bypass strict EventEmitter<EditorEvents> typing\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, {});\n return;\n }\n ToolbarController.executeItem(this.editor() as never, item);\n }\n\n // === Internal ===\n\n private buildItemMap(editor: Editor): void {\n this.itemMap.clear();\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') {\n this.itemMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n for (const sub of item.items) {\n this.itemMap.set(sub.name, sub);\n }\n }\n }\n }\n\n private resolveNames(names: string[]): BubbleMenuItem[] {\n const result: BubbleMenuItem[] = [];\n let sepIdx = 0;\n for (const name of names) {\n if (name === '|') {\n result.push({ type: 'separator', name: `sep-${sepIdx++}` });\n } else {\n const item = this.itemMap.get(name);\n if (item) result.push(item);\n }\n }\n return result;\n }\n\n private getFormatItems(): ToolbarButton[] {\n return Array.from(this.itemMap.values())\n .filter(item => item.group === 'format')\n .sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n }\n\n private detectContext(selection: SelectionShape, ctxs: Record<string, string[] | true | null>): string | null {\n // CellSelection (duck-type: has $anchorCell) — never show bubble menu\n if ('$anchorCell' in selection) return null;\n if (selection.node) return selection.node.type.name;\n if (selection.empty) return null;\n\n // TextSelection inside a table cell → 'table' context.\n // Cross-cell TextSelection (drag across cells) → hide bubble menu.\n const fromCell = this.findCellNode(selection.$from);\n if (fromCell) {\n const toCell = this.findCellNode(selection.$to);\n if (toCell && fromCell !== toCell) return null;\n return 'table';\n }\n\n const fromName = selection.$from.parent.type.name;\n if (fromName in ctxs) return fromName;\n if ('text' in ctxs && selection.$from.parent.type.spec.marks !== '') return 'text';\n // Cross-block: also check $to so bold/italic is offered when any endpoint allows marks\n const toName = selection.$to.parent.type.name;\n if (toName in ctxs) return toName;\n if ('text' in ctxs && selection.$to.parent.type.spec.marks !== '') return 'text';\n return null;\n }\n\n private findCellNode(pos: ResolvedPosShape): { type: { name: string } } | null {\n for (let d = pos.depth; d > 0; d--) {\n const node = pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n return node;\n }\n }\n return null;\n }\n\n /** Filters out mark items that the context node type doesn't allow (e.g. bold on codeBlock) */\n private filterBySchema(editor: Editor, contextName: string, items: ToolbarButton[]): ToolbarButton[] {\n if (contextName === 'text' || contextName === 'table') return items;\n const schema = (editor.state as unknown as { schema?: SchemaShape }).schema;\n if (!schema) return items;\n const nodeType = schema.nodes[contextName];\n if (!nodeType) return items;\n return items.filter(item => {\n const markName = typeof item.isActive === 'string' ? item.isActive : null;\n if (!markName) return true;\n const markType = schema.marks?.[markName];\n if (!markType) return true;\n return nodeType.allowsMarkType(markType);\n });\n }\n\n private buildBubbleDefaults(editor: Editor): void {\n this.bubbleDefaults.clear();\n const byCtx = new Map<string, ToolbarButton[]>();\n const addItem = (btn: ToolbarButton): void => {\n const ctx = (btn as unknown as Record<string, unknown>)['bubbleMenu'] as string | undefined;\n if (!ctx) return;\n let arr = byCtx.get(ctx);\n if (!arr) { arr = []; byCtx.set(ctx, arr); }\n arr.push(btn);\n };\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') addItem(item);\n else if (item.type === 'dropdown') {\n for (const sub of item.items) addItem(sub);\n }\n }\n for (const [ctx, items] of byCtx) {\n items.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const result: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of items) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n result.push({ type: 'separator', name: `bsep-${sepIdx++}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n this.bubbleDefaults.set(ctx, result);\n }\n }\n\n private setupItemTracking(editor: Editor): void {\n this.buildItemMap(editor);\n this.buildBubbleDefaults(editor);\n\n if (this.contexts()) {\n this.updateContextItems(editor);\n } else if (this.items()) {\n this.resolvedItems.set(this.resolveNames(this.items()!));\n } else {\n this.resolvedItems.set(this.resolveNames(['bold', 'italic', 'underline']));\n }\n\n this.transactionHandler = () => {\n this.ngZone.run(() => {\n if (this.contexts()) {\n this.updateContextItems(editor);\n }\n this.updateStates(editor);\n this.activeVersion.update(v => v + 1);\n });\n };\n editor.on('transaction', this.transactionHandler);\n this.updateStates(editor);\n }\n\n private updateContextItems(editor: Editor): void {\n const ctxs = this.contexts()!;\n const ctx = this.detectContext(editor.state.selection as unknown as SelectionShape, ctxs);\n if (!ctx) {\n this.resolvedItems.set([]);\n return;\n }\n if (ctx in ctxs) {\n const val = ctxs[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n this.resolvedItems.set([]);\n return;\n }\n if (val === true) {\n this.resolvedItems.set(this.filterBySchema(editor, ctx, this.getFormatItems()));\n } else if (Array.isArray(val)) {\n const resolved = this.resolveNames(val);\n const buttons = resolved.filter((i): i is ToolbarButton => i.type !== 'separator');\n const filtered = new Set(this.filterBySchema(editor, ctx, buttons).map(b => b.name));\n this.resolvedItems.set(resolved.filter(i => i.type === 'separator' || filtered.has(i.name)));\n }\n } else {\n this.resolvedItems.set(this.bubbleDefaults.get(ctx) ?? []);\n }\n }\n\n private updateStates(editor: Editor): void {\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try { canProxy = editor.can() as unknown as Record<string, (...args: unknown[]) => boolean>; } catch {}\n\n for (const item of this.resolvedItems()) {\n if (item.type === 'separator') continue;\n this.activeMap.set(item.name, ToolbarController.resolveActive(editor as never, item));\n try {\n const canCmd = canProxy?.[item.command];\n this.disabledMap.set(item.name, canCmd\n ? !(item.commandArgs?.length ? canCmd(...item.commandArgs) : canCmd())\n : false);\n } catch { this.disabledMap.set(item.name, false); }\n }\n }\n\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n viewChild,\n ElementRef,\n afterNextRender,\n} from '@angular/core';\n\nimport {\n Editor,\n PluginKey,\n createFloatingMenuPlugin,\n} from '@domternal/core';\nimport type { FloatingMenuOptions } from '@domternal/core';\n\n@Component({\n selector: 'domternal-floating-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '<div #menuEl class=\"dm-floating-menu\"><ng-content /></div>',\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalFloatingMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<FloatingMenuOptions['shouldShow']>();\n readonly offset = input<number>(0);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private pluginKey: PluginKey;\n\n constructor() {\n // Unique key per instance — multiple floating menus on same page\n this.pluginKey = new PluginKey(\n 'angularFloatingMenu-' + Math.random().toString(36).slice(2, 8),\n );\n\n afterNextRender(() => {\n const shouldShow = this.shouldShow();\n const plugin = createFloatingMenuPlugin({\n pluginKey: this.pluginKey,\n editor: this.editor(),\n element: this.menuEl().nativeElement,\n ...(shouldShow && { shouldShow }),\n offset: this.offset(),\n });\n this.editor().registerPlugin(plugin);\n });\n }\n\n ngOnDestroy(): void {\n const editor = this.editor();\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n computed,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\n\nimport { Editor, positionFloatingOnce } from '@domternal/core';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\nconst CATEGORY_ICONS: Record<string, string> = {\n 'Smileys & Emotion': '\\u{1F600}',\n 'People & Body': '\\u{1F44B}',\n 'Animals & Nature': '\\u{1F431}',\n 'Food & Drink': '\\u{1F355}',\n 'Travel & Places': '\\u{1F697}',\n 'Activities': '\\u{26BD}',\n 'Objects': '\\u{1F4A1}',\n 'Symbols': '\\u{1F523}',\n 'Flags': '\\u{1F3C1}',\n};\n\n@Component({\n selector: 'domternal-emoji-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { 'class': 'dm-emoji-picker-host' },\n template: `\n @if (isOpen()) {\n <div class=\"dm-emoji-picker\">\n <div class=\"dm-emoji-picker-search\">\n <input\n #searchInput\n type=\"text\"\n placeholder=\"Search emoji...\"\n [value]=\"searchQuery()\"\n (input)=\"onSearch($event)\"\n (keydown.escape)=\"close()\"\n />\n </div>\n\n <div class=\"dm-emoji-picker-tabs\" role=\"tablist\">\n @for (cat of categoryNames(); track cat) {\n <button\n type=\"button\"\n class=\"dm-emoji-picker-tab\"\n [class.dm-emoji-picker-tab--active]=\"activeCategory() === cat\"\n [title]=\"cat\"\n [attr.aria-label]=\"cat\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"scrollToCategory(cat)\"\n >{{ categoryIcon(cat) }}</button>\n }\n </div>\n\n <div class=\"dm-emoji-picker-grid\" #grid (scroll)=\"onGridScroll()\">\n @if (searchQuery()) {\n @for (item of filteredEmojis(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n @empty {\n <div class=\"dm-emoji-picker-empty\">No emoji found</div>\n }\n } @else {\n @if (frequentlyUsed().length) {\n <div class=\"dm-emoji-picker-category-label\">Frequently Used</div>\n @for (item of frequentlyUsed(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n @for (cat of categoryNames(); track cat) {\n <div class=\"dm-emoji-picker-category-label\" [attr.data-category]=\"cat\">{{ cat }}</div>\n @for (item of getCategory(cat); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n }\n </div>\n </div>\n }\n `,\n})\nexport class DomternalEmojiPickerComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly emojis = input.required<EmojiPickerItem[]>();\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeCategory = signal('');\n\n private anchorEl: HTMLElement | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject(ElementRef);\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private eventHandler: ((...args: unknown[]) => void) | null = null;\n private cleanupFloating: (() => void) | null = null;\n\n readonly categories = computed(() => {\n const map = new Map<string, EmojiPickerItem[]>();\n for (const item of this.emojis()) {\n let list = map.get(item.group);\n if (!list) {\n list = [];\n map.set(item.group, list);\n }\n list.push(item);\n }\n return map;\n });\n\n readonly categoryNames = computed(() => [...this.categories().keys()]);\n\n readonly filteredEmojis = computed(() => {\n const query = this.searchQuery().toLowerCase();\n if (!query) return [];\n const storage = this.getEmojiStorage();\n const searchFn = storage?.['searchEmoji'] as ((q: string) => EmojiPickerItem[]) | undefined;\n if (searchFn) {\n return searchFn(query);\n }\n return this.emojis().filter(\n (item) =>\n item.name.includes(query) ||\n item.group.toLowerCase().includes(query),\n );\n });\n\n readonly frequentlyUsed = computed(() => {\n // Re-evaluate when panel opens (isOpen changes)\n this.isOpen();\n const storage = this.getEmojiStorage();\n const getFreq = storage?.['getFrequentlyUsed'] as (() => string[]) | undefined;\n if (!getFreq) return [];\n const names = getFreq();\n if (!names.length) return [];\n const nameMap = storage!['_nameMap'] as Map<string, EmojiPickerItem> | undefined;\n if (!nameMap) return [];\n return names.slice(0, 16).map((n) => nameMap.get(n)).filter(Boolean) as EmojiPickerItem[];\n });\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => this.setupEventListener(editor));\n });\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n getCategory(cat: string): EmojiPickerItem[] {\n return this.categories().get(cat) ?? [];\n }\n\n categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n }\n\n formatName(name: string): string {\n return name.replace(/_/g, ' ');\n }\n\n onSearch(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.searchQuery.set(input.value);\n }\n\n selectEmoji(item: EmojiPickerItem): void {\n const editor = this.editor();\n const cmd = editor.commands as Record<string, (...args: unknown[]) => boolean>;\n if (cmd['insertEmoji']) {\n cmd['insertEmoji'](item.name);\n }\n this.close();\n }\n\n scrollToCategory(cat: string): void {\n this.searchQuery.set('');\n this.activeCategory.set(cat);\n\n // Wait for search to clear and DOM to update\n requestAnimationFrame(() => {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n const label = grid.querySelector(`[data-category=\"${cat}\"]`) as HTMLElement | null;\n if (label) {\n // Use manual scrollTop instead of scrollIntoView to avoid scrolling the page\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop, behavior: 'smooth' });\n }\n });\n }\n\n onGridScroll(): void {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid || this.searchQuery()) return;\n\n const labels = Array.from(grid.querySelectorAll('.dm-emoji-picker-category-label[data-category]')) as HTMLElement[];\n\n let currentCat = '';\n for (const label of labels) {\n if (label.offsetTop - grid.offsetTop <= grid.scrollTop + 20) {\n currentCat = label.getAttribute('data-category') ?? '';\n }\n }\n\n if (currentCat && currentCat !== this.activeCategory()) {\n this.activeCategory.set(currentCat);\n }\n }\n\n close(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.isOpen.set(false);\n this.setStorageOpen(false);\n this.searchQuery.set('');\n this.anchorEl = null;\n this.removeGlobalListeners();\n this.editor().view.focus();\n }\n\n private setupEventListener(editor: Editor): void {\n this.cleanup();\n\n this.eventHandler = (...args: unknown[]) => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n this.ngZone.run(() => {\n if (this.isOpen()) {\n this.close();\n return;\n }\n\n this.anchorEl = data?.anchorElement ?? null;\n this.isOpen.set(true);\n this.setStorageOpen(true);\n this.searchQuery.set('');\n\n // Set initial active category\n const names = this.categoryNames();\n if (names.length > 0 && names[0]) {\n this.activeCategory.set(names[0]);\n }\n\n this.addGlobalListeners();\n\n // Position panel and focus search input after render\n requestAnimationFrame(() => {\n const panel = this.elRef.nativeElement.querySelector('.dm-emoji-picker') as HTMLElement | null;\n if (panel && this.anchorEl) {\n this.cleanupFloating?.();\n this.cleanupFloating = positionFloatingOnce(this.anchorEl, panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = this.elRef.nativeElement.querySelector('.dm-emoji-picker-search input') as HTMLInputElement | null;\n input?.focus();\n });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n }\n\n private addGlobalListeners(): void {\n this.clickOutsideHandler = (e: Event) => {\n const target = e.target as Node;\n if (\n this.isOpen() &&\n !this.elRef.nativeElement.contains(target) &&\n target !== this.anchorEl &&\n !this.anchorEl?.contains(target)\n ) {\n this.ngZone.run(() => this.close());\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n this.keydownHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen()) {\n e.preventDefault();\n this.ngZone.run(() => this.close());\n }\n };\n document.addEventListener('keydown', this.keydownHandler);\n }\n\n private removeGlobalListeners(): void {\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.keydownHandler) {\n document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n }\n\n private setStorageOpen(open: boolean): void {\n const storage = this.getEmojiStorage();\n if (storage) storage['isOpen'] = open;\n // Dispatch a no-op transaction so the toolbar's transaction handler\n // re-evaluates isActiveFn and shows the button as active/inactive.\n const editor = this.editor();\n editor.view.dispatch(editor.view.state.tr);\n }\n\n private getEmojiStorage(): Record<string, unknown> | null {\n const storage = this.editor().storage as Record<string, unknown>;\n return (storage['emoji'] as Record<string, unknown>) ?? null;\n }\n\n private cleanup(): void {\n this.removeGlobalListeners();\n if (this.eventHandler) {\n const editor = this.editor();\n (editor.off as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n this.eventHandler = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"domternal-angular.mjs","sources":["../../src/lib/editor.component.ts","../../src/lib/toolbar.component.ts","../../src/lib/bubble-menu.component.ts","../../src/lib/floating-menu.component.ts","../../src/lib/emoji-picker.component.ts","../../src/domternal-angular.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n forwardRef,\n signal,\n ChangeDetectionStrategy,\n inject,\n NgZone,\n OnDestroy,\n effect,\n input,\n output,\n viewChild,\n untracked,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type { Content, AnyExtension, FocusPosition, JSONContent, TransactionEventProps, FocusEventProps } from '@domternal/core';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [Document, Paragraph, Text, BaseKeymap, History];\n\n@Component({\n selector: 'domternal-editor',\n template: '<div #editorRef></div>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'dm-editor' },\n styles: [`:host { display: block; }`],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DomternalEditorComponent),\n multi: true,\n },\n ],\n})\nexport class DomternalEditorComponent implements ControlValueAccessor, OnDestroy {\n // === Template ref ===\n readonly editorRef = viewChild.required<ElementRef<HTMLDivElement>>('editorRef');\n\n // === Inputs ===\n readonly extensions = input<AnyExtension[]>([]);\n readonly content = input<Content>('');\n readonly editable = input(true);\n readonly autofocus = input<FocusPosition>(false);\n readonly outputFormat = input<'html' | 'json'>('html');\n\n // === Outputs ===\n readonly editorCreated = output<Editor>();\n readonly contentUpdated = output<{ editor: Editor }>();\n readonly selectionChanged = output<{ editor: Editor }>();\n readonly focusChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly blurChanged = output<{ editor: Editor; event: FocusEvent }>();\n readonly editorDestroyed = output<void>();\n\n // === Signals (read-only public state) ===\n private _htmlContent = signal('');\n private _jsonContent = signal<JSONContent | null>(null);\n private _isEmpty = signal(true);\n private _isFocused = signal(false);\n // Candidate for linkedSignal(editable) once min Angular version is >=20\n private _isEditable = signal(true);\n\n readonly htmlContent = this._htmlContent.asReadonly();\n readonly jsonContent = this._jsonContent.asReadonly();\n readonly isEmpty = this._isEmpty.asReadonly();\n readonly isFocused = this._isFocused.asReadonly();\n readonly isEditable = this._isEditable.asReadonly();\n\n // === Editor instance ===\n private _editor: Editor | null = null;\n\n get editor(): Editor | null {\n return this._editor;\n }\n\n // === ControlValueAccessor ===\n private onChange: (value: Content) => void = () => {};\n private onTouched: () => void = () => {};\n private _pendingContent: Content | null = null;\n\n private ngZone = inject(NgZone);\n\n constructor() {\n afterNextRender(() => {\n this.createEditor();\n });\n\n // React to editable input changes\n effect(() => {\n const editable = this.editable();\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n this._editor!.setEditable(editable);\n this._isEditable.set(editable);\n });\n });\n\n // React to content input changes\n effect(() => {\n const content = this.content();\n const format = this.outputFormat();\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n const current = format === 'html'\n ? this._editor!.getHTML()\n : JSON.stringify(this._editor!.getJSON());\n const incoming = format === 'html'\n ? (content as string)\n : JSON.stringify(content);\n if (incoming !== current) {\n this._editor!.setContent(content, false);\n }\n });\n });\n\n // React to extensions input changes\n effect(() => {\n this.extensions(); // track the signal\n if (!this._editor || this._editor.isDestroyed) return;\n untracked(() => {\n this.recreateEditor();\n });\n });\n }\n\n // === Lifecycle ===\n\n ngOnDestroy(): void {\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.destroy();\n this.editorDestroyed.emit();\n }\n this._editor = null;\n }\n\n // === ControlValueAccessor implementation ===\n\n writeValue(value: Content): void {\n if (!this._editor || this._editor.isDestroyed) {\n this._pendingContent = value;\n return;\n }\n\n // Compare current content to avoid unnecessary setContent (which resets cursor)\n if (this.outputFormat() === 'html') {\n if (value === this._editor.getHTML()) return;\n } else {\n if (JSON.stringify(value) === JSON.stringify(this._editor.getJSON())) return;\n }\n\n this._editor.setContent(value, false);\n }\n\n registerOnChange(fn: (value: Content) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._isEditable.set(!isDisabled);\n if (this._editor && !this._editor.isDestroyed) {\n this._editor.setEditable(!isDisabled);\n }\n }\n\n // === Private ===\n\n private recreateEditor(): void {\n if (!this._editor || this._editor.isDestroyed) return;\n const currentContent = this._editor.getJSON();\n this._editor.destroy();\n this.editorDestroyed.emit();\n this._pendingContent = currentContent;\n this.createEditor();\n }\n\n private createEditor(): void {\n const initialContent = this._pendingContent ?? this.content();\n this._pendingContent = null;\n\n this._editor = new Editor({\n element: this.editorRef().nativeElement,\n extensions: [...DEFAULT_EXTENSIONS, ...this.extensions()],\n content: initialContent,\n editable: this.editable(),\n autofocus: this.autofocus(),\n });\n\n this._isEditable.set(this.editable());\n\n // Set initial signal values\n this._htmlContent.set(this._editor.getHTML());\n this._jsonContent.set(this._editor.getJSON());\n this._isEmpty.set(this._editor.isEmpty);\n\n this._editor.on('transaction', ({ transaction }: TransactionEventProps) => {\n this.ngZone.run(() => {\n const ed = this._editor!;\n\n if (transaction.docChanged) {\n const html = ed.getHTML();\n this._htmlContent.set(html);\n this._jsonContent.set(ed.getJSON());\n this._isEmpty.set(ed.isEmpty);\n this.contentUpdated.emit({ editor: ed });\n\n const value: Content = this.outputFormat() === 'html' ? html : ed.getJSON();\n this.onChange(value);\n }\n\n if (!transaction.docChanged && transaction.selectionSet) {\n this.selectionChanged.emit({ editor: ed });\n }\n });\n });\n\n this._editor.on('focus', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(true);\n this.focusChanged.emit({ editor: this._editor!, event });\n });\n });\n\n this._editor.on('blur', ({ event }: FocusEventProps) => {\n this.ngZone.run(() => {\n this._isFocused.set(false);\n this.blurChanged.emit({ editor: this._editor!, event });\n this.onTouched();\n });\n });\n\n // Emit editor created\n this.ngZone.run(() => {\n this.editorCreated.emit(this._editor!);\n });\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n Editor,\n ToolbarController,\n defaultIcons,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n ToolbarItem,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarControllerEditor,\n IconSet,\n ToolbarGroup,\n ToolbarLayoutEntry,\n} from '@domternal/core';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\n@Component({\n selector: 'domternal-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'dm-toolbar',\n 'role': 'toolbar',\n '[attr.aria-label]': '\"Editor formatting\"',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n @for (group of groups(); track group.name; let gi = $index) {\n @if (gi > 0) {\n <div class=\"dm-toolbar-separator\" role=\"separator\"></div>\n }\n <div class=\"dm-toolbar-group\" role=\"group\" [attr.aria-label]=\"group.name || 'Tools'\">\n @for (item of group.items; track item.name) {\n @if (item.type === 'button') {\n <button\n type=\"button\"\n class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isActive(item.name)\"\n [attr.aria-pressed]=\"isActive(item.name)\"\n [attr.aria-expanded]=\"getAriaExpanded(asButton(item))\"\n [attr.aria-label]=\"asButton(item).label\"\n [title]=\"getTooltip(asButton(item))\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(item.name)\"\n [innerHTML]=\"getCachedIcon(asButton(item).icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onButtonClick(asButton(item), $event)\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n }\n @if (item.type === 'dropdown') {\n <div class=\"dm-toolbar-dropdown-wrapper\">\n <button\n type=\"button\"\n class=\"dm-toolbar-button dm-toolbar-dropdown-trigger\"\n [class.dm-toolbar-button--active]=\"isDropdownActive(asDropdown(item))\"\n [attr.aria-expanded]=\"openDropdown() === asDropdown(item).name\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-label]=\"asDropdown(item).label\"\n [title]=\"asDropdown(item).label\"\n [tabindex]=\"getFlatIndex(item.name) === focusedIndex() ? 0 : -1\"\n [disabled]=\"isDisabled(asDropdown(item).name)\"\n [attr.data-dropdown]=\"asDropdown(item).name\"\n [innerHTML]=\"getDropdownTriggerHtml(asDropdown(item))\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownToggle(asDropdown(item))\"\n (focus)=\"onButtonFocus(item.name)\"\n ></button>\n @if (openDropdown() === asDropdown(item).name) {\n @if (asDropdown(item).layout === 'grid') {\n <div class=\"dm-toolbar-dropdown-panel dm-color-palette\" role=\"menu\"\n [attr.style]=\"getGridStyle(asDropdown(item))\">\n @for (sub of asDropdown(item).items; track sub.name) {\n @if (sub.color) {\n <button\n type=\"button\"\n class=\"dm-color-swatch\"\n [class.dm-color-swatch--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [title]=\"sub.label\"\n [style.background-color]=\"sub.color\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n } @else {\n <button\n type=\"button\"\n class=\"dm-color-palette-reset\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label)\"\n [attr.tabindex]=\"-1\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub)\"\n ></button>\n }\n }\n </div>\n } @else {\n <div class=\"dm-toolbar-dropdown-panel\" role=\"menu\"\n [attr.data-display-mode]=\"asDropdown(item).displayMode ?? null\">\n @for (sub of asDropdown(item).items; track sub.name) {\n <button\n type=\"button\"\n class=\"dm-toolbar-dropdown-item\"\n [class.dm-toolbar-dropdown-item--active]=\"isActive(sub.name)\"\n role=\"menuitem\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"sub.label\"\n [attr.style]=\"sub.style ?? null\"\n [innerHTML]=\"getCachedItemContent(sub.icon, sub.label, asDropdown(item).displayMode)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onDropdownItemClick(sub, $event)\"\n ></button>\n }\n </div>\n }\n }\n </div>\n }\n }\n </div>\n }\n `,\n})\nexport class DomternalToolbarComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly icons = input<IconSet | null>(null);\n readonly layout = input<ToolbarLayoutEntry[]>();\n\n /** Exposed state signals for template */\n readonly groups = signal<ToolbarGroup[]>([]);\n readonly focusedIndex = signal(0);\n readonly openDropdown = signal<string | null>(null);\n /** Bumped on active state changes to trigger re-evaluation of isActive() */\n readonly activeVersion = signal(0);\n\n private controller: ToolbarController | null = null;\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private dismissOverlayHandler: (() => void) | null = null;\n private editorEl: HTMLElement | null = null;\n private cleanupFloating: (() => void) | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject(ElementRef);\n private sanitizer = inject(DomSanitizer);\n\n /** SafeHtml cache — same reference returned for same key, prevents DOM churn */\n private htmlCache = new Map<string, SafeHtml>();\n\n private readonly dropdownCaret = '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"><path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => this.setupController(editor));\n });\n }\n\n ngOnDestroy(): void {\n this.destroyController();\n }\n\n // === Template helpers ===\n\n isActive(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.activeMap.get(name) ?? false;\n }\n\n isDisabled(name: string): boolean {\n this.activeVersion(); // subscribe to changes\n return this.controller?.disabledMap.get(name) ?? false;\n }\n\n isDropdownActive(dropdown: ToolbarDropdown): boolean {\n if (dropdown.layout === 'grid') return false; // color dropdowns use bar indicator instead\n if (dropdown.dynamicLabel) return false; // label text already communicates state\n this.activeVersion(); // subscribe to changes\n return dropdown.items.some((item: ToolbarButton) => this.controller?.activeMap.get(item.name) ?? false);\n }\n\n /** Returns trigger innerHTML: dynamic icon + caret (+ color indicator for grid dropdowns). */\n getDropdownTriggerHtml(dropdown: ToolbarDropdown): SafeHtml {\n this.activeVersion(); // subscribe to changes\n const activeItem = dropdown.items.find((item: ToolbarButton) => this.controller?.activeMap.get(item.name));\n\n if (dropdown.layout === 'grid') {\n const color = activeItem?.color ?? dropdown.defaultIndicatorColor ?? null;\n const key = `tr:${dropdown.icon}:${color ?? ''}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n let html = this.resolveIconSvg(dropdown.icon) + this.dropdownCaret;\n if (color) {\n html += `<span class=\"dm-toolbar-color-indicator\" style=\"background-color: ${color}\"></span>`;\n }\n cached = this.sanitizer.bypassSecurityTrustHtml(html);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n // Non-grid dropdown — show active sub-item's label as text\n if (dropdown.dynamicLabel) {\n if (activeItem) return this.getCachedTriggerLabel(activeItem.label);\n\n // Try reading CSS property from DOM (inline or computed depending on property)\n if (dropdown.computedStyleProperty) {\n let computed: string | null;\n if (dropdown.computedStyleProperty === 'font-family') {\n // Font-family: read ONLY inline style (explicit mark), not computed (browser default)\n computed = this.getInlineStyleAtCursor(dropdown.computedStyleProperty);\n if (computed) {\n const first = computed.split(',')[0]?.replace(/['\"]+/g, '').trim();\n computed = first || null;\n }\n } else {\n computed = this.getComputedStyleAtCursor(dropdown.computedStyleProperty);\n }\n if (computed) return this.getCachedTriggerLabel(computed);\n }\n\n if (dropdown.dynamicLabelFallback) {\n return this.getCachedTriggerLabel(dropdown.dynamicLabelFallback);\n }\n return this.getCachedTriggerLabel(dropdown.icon, true);\n }\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return this.getCachedTriggerIcon(icon);\n }\n\n /**\n * Returns 'true' when an emitEvent button's panel is open, null otherwise.\n * Maps to [attr.aria-expanded] — null removes the attribute entirely.\n */\n getAriaExpanded(item: ToolbarButton): string | null {\n if (!item.emitEvent) return null;\n this.activeVersion(); // subscribe to changes\n return this.controller?.expandedMap.get(item.name) ? 'true' : null;\n }\n\n getFlatIndex(name: string): number {\n return this.controller?.getFlatIndex(name) ?? -1;\n }\n\n getTooltip(item: ToolbarButton): string {\n if (item.shortcut) {\n const parts = item.shortcut.split('-');\n const mapped = parts.map((p: string) => {\n if (p === 'Mod') return isMac ? '\\u2318' : 'Ctrl';\n if (p === 'Shift') return isMac ? '\\u21E7' : 'Shift';\n if (p === 'Alt') return isMac ? '\\u2325' : 'Alt';\n return p.toUpperCase();\n });\n const shortcut = isMac ? mapped.join('') : mapped.join('+');\n return `${item.label} (${shortcut})`;\n }\n return item.label;\n }\n\n getCachedIcon(name: string): SafeHtml {\n const key = `i:${name}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(this.resolveIconSvg(name));\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedTriggerLabel(label: string, isIcon?: boolean): SafeHtml {\n const key = `tl:${label}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n const content = isIcon ? this.resolveIconSvg(label) : label;\n cached = this.sanitizer.bypassSecurityTrustHtml(\n `<span class=\"dm-toolbar-trigger-label\">${content}</span>` + this.dropdownCaret,\n );\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedTriggerIcon(iconName: string): SafeHtml {\n const key = `t:${iconName}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(this.resolveIconSvg(iconName) + this.dropdownCaret);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n getCachedItemContent(iconName: string, label: string, displayMode?: 'icon-text' | 'text' | 'icon'): SafeHtml {\n const mode = displayMode ?? 'icon-text';\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = this.htmlCache.get(key);\n if (!cached) {\n let html: string;\n if (mode === 'text') {\n html = label;\n } else if (mode === 'icon') {\n html = this.resolveIconSvg(iconName);\n } else {\n html = this.resolveIconSvg(iconName) + ' ' + label;\n }\n cached = this.sanitizer.bypassSecurityTrustHtml(html);\n this.htmlCache.set(key, cached);\n }\n return cached;\n }\n\n asButton(item: ToolbarItem): ToolbarButton {\n return item as ToolbarButton;\n }\n\n asDropdown(item: ToolbarItem): ToolbarDropdown {\n return item as ToolbarDropdown;\n }\n\n getGridStyle(dropdown: ToolbarDropdown): string {\n return `--dm-palette-columns: ${String(dropdown.gridColumns ?? 10)}`;\n }\n\n // === Event handlers ===\n\n onButtonClick(item: ToolbarButton, event?: MouseEvent): void {\n // Close any open dropdown when clicking a regular button\n if (this.openDropdown()) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.syncState();\n }\n\n if (item.emitEvent) {\n const anchor = event?.currentTarget as HTMLElement | undefined;\n // emitEvent is a dynamic string; cast needed to bypass strict EventEmitter<EditorEvents> typing\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n this.controller?.executeCommand(item);\n }\n\n onDropdownToggle(dropdown: ToolbarDropdown): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.toggleDropdown(dropdown.name);\n this.syncState();\n\n // Position the panel after Angular renders it (tracks resize, not scroll)\n if (this.openDropdown()) {\n requestAnimationFrame(() => {\n const trigger = this.elRef.nativeElement.querySelector(\n `[aria-expanded=\"true\"]`,\n ) as HTMLElement | null;\n const panel = trigger?.parentElement?.querySelector(\n '.dm-toolbar-dropdown-panel',\n ) as HTMLElement | null;\n if (trigger && panel) {\n // List dropdowns align to trigger's left edge; grid/picker dropdowns center\n const placement = dropdown.layout === 'grid' ? 'bottom' : 'bottom-start';\n this.cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n }\n });\n }\n }\n\n onDropdownItemClick(item: ToolbarButton, event?: Event): void {\n // For emitEvent items, use the dropdown trigger as anchor (sub-item gets removed when dropdown closes)\n let anchor: HTMLElement | undefined;\n if (item.emitEvent && event?.currentTarget) {\n const wrapper = (event.currentTarget as HTMLElement).closest('.dm-toolbar-dropdown-wrapper');\n anchor = wrapper?.querySelector('.dm-toolbar-dropdown-trigger') as HTMLElement | undefined;\n }\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n if (item.emitEvent) {\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n } else {\n this.controller?.executeCommand(item);\n }\n }\n\n onButtonFocus(name: string): void {\n const index = this.controller?.getFlatIndex(name) ?? -1;\n if (index >= 0) {\n this.controller?.setFocusedIndex(index);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (!this.controller) return;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.controller.navigateNext();\n this.focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.controller.navigatePrev();\n this.focusCurrentButton();\n break;\n case 'Home':\n event.preventDefault();\n this.controller.navigateFirst();\n this.focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n this.controller.navigateLast();\n this.focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (this.openDropdown()) {\n this.focusDropdownItem(1);\n } else {\n const buttons = this.elRef.nativeElement.querySelectorAll('.dm-toolbar-button') as NodeListOf<HTMLElement>;\n const btn = buttons[this.controller?.focusedIndex ?? 0];\n if (btn?.getAttribute('aria-haspopup')) {\n btn.click();\n requestAnimationFrame(() => this.focusDropdownItem(0, true));\n }\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (this.openDropdown()) {\n this.focusDropdownItem(-1);\n }\n break;\n }\n case 'Escape':\n if (this.openDropdown()) {\n event.preventDefault();\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller.closeDropdown();\n this.syncState();\n this.focusCurrentButton();\n }\n break;\n }\n }\n\n // === Private ===\n\n private focusDropdownItem(direction: number, first?: boolean): void {\n const panel = this.elRef.nativeElement.querySelector('.dm-toolbar-dropdown-panel') as HTMLElement | null;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll('[role=\"menuitem\"]')) as HTMLElement[];\n if (!items.length) return;\n if (first) { items[0]?.focus(); return; }\n const current = document.activeElement as HTMLElement;\n const idx = items.indexOf(current);\n const next = idx === -1\n ? (direction > 0 ? 0 : items.length - 1)\n : (idx + direction + items.length) % items.length;\n items[next]?.focus();\n }\n\n private resolveIconSvg(name: string): string {\n const customIcons = this.icons();\n if (customIcons) {\n return customIcons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }\n\n private setupController(editor: Editor): void {\n this.destroyController();\n\n this.controller = new ToolbarController(\n editor as unknown as ToolbarControllerEditor,\n () => this.ngZone.run(() => this.syncState()),\n this.layout(),\n );\n this.controller.subscribe();\n this.syncState();\n\n // Click outside to close dropdown\n this.clickOutsideHandler = (e: Event) => {\n if (this.openDropdown() && !this.elRef.nativeElement.contains(e.target as Node)) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => this.syncState());\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n // Listen for dismiss-overlays (e.g. table handle clicks that stopPropagation on mousedown)\n this.editorEl = editor.view.dom.closest('.dm-editor') as HTMLElement | null;\n if (this.editorEl) {\n this.dismissOverlayHandler = () => {\n if (this.openDropdown()) {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.controller?.closeDropdown();\n this.ngZone.run(() => this.syncState());\n }\n };\n this.editorEl.addEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n }\n }\n\n private destroyController(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.dismissOverlayHandler && this.editorEl) {\n this.editorEl.removeEventListener('dm:dismiss-overlays', this.dismissOverlayHandler);\n this.dismissOverlayHandler = null;\n this.editorEl = null;\n }\n if (this.controller) {\n this.controller.destroy();\n this.controller = null;\n }\n }\n\n private syncState(): void {\n if (!this.controller) return;\n\n // Only update groups if they actually changed (initial build or rebuild)\n const controllerGroups = this.controller.groups;\n if (this.groups().length !== controllerGroups.length) {\n this.groups.set(controllerGroups);\n }\n\n this.focusedIndex.set(this.controller.focusedIndex);\n this.openDropdown.set(this.controller.openDropdown);\n\n // Bump version to trigger isActive() re-evaluation without creating new objects\n this.activeVersion.update(v => v + 1);\n }\n\n private getComputedStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n // Prefer inline style (explicit mark) over computed style (inherited from heading, etc.)\n return el.style.getPropertyValue(prop)\n || window.getComputedStyle(el).getPropertyValue(prop)\n || null;\n } catch {\n return null;\n }\n }\n\n /** Read only inline style — no computed fallback (used for font-family). */\n private getInlineStyleAtCursor(prop: string): string | null {\n try {\n const { from } = this.editor().state.selection;\n const resolved = this.editor().view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n }\n\n private focusCurrentButton(): void {\n const idx = this.controller?.focusedIndex ?? 0;\n const buttons = this.elRef.nativeElement.querySelectorAll(\n '.dm-toolbar-button'\n ) as NodeListOf<HTMLButtonElement>;\n buttons[idx]?.focus();\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n inject,\n NgZone,\n viewChild,\n ElementRef,\n afterNextRender,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\n\nimport {\n Editor,\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultIcons,\n} from '@domternal/core';\nimport type { BubbleMenuOptions, ToolbarButton } from '@domternal/core';\n\ninterface BubbleMenuSeparator { type: 'separator'; name: string }\ntype BubbleMenuItem = ToolbarButton | BubbleMenuSeparator;\n\n/** Minimal ProseMirror Selection shape for duck-typing (avoids instanceof issues across bundles) */\ninterface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\ninterface SelectionShape {\n empty: boolean;\n $from: ResolvedPosShape;\n $to: ResolvedPosShape;\n node?: { type: { name: string } };\n}\n\n/** Check if a resolved position is inside a table cell or header. */\nfunction isInsideTableCell($pos: ResolvedPosShape): boolean {\n for (let d = $pos.depth; d > 0; d--) {\n const name = $pos.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return true;\n }\n return false;\n}\n\n/** ProseMirror schema shape for mark filtering */\ninterface SchemaShape {\n nodes: Record<string, { allowsMarkType: (mt: unknown) => boolean }>;\n marks: Record<string, unknown>;\n}\n\n@Component({\n selector: 'domternal-bubble-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div #menuEl class=\"dm-bubble-menu\" role=\"toolbar\" aria-label=\"Text formatting\">\n @for (item of resolvedItems(); track item.name) {\n @if (item.type === 'separator') {\n <span class=\"dm-toolbar-separator\" role=\"separator\"></span>\n } @else {\n <button type=\"button\" class=\"dm-toolbar-button\"\n [class.dm-toolbar-button--active]=\"isItemActive(item)\"\n [attr.aria-pressed]=\"isItemActive(item)\"\n [disabled]=\"isItemDisabled(item)\"\n [title]=\"item.label\"\n [attr.aria-label]=\"item.label\"\n [innerHTML]=\"getCachedIcon(item.icon)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"executeCommand(item)\"></button>\n }\n }\n <ng-content />\n </div>\n `,\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalBubbleMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<BubbleMenuOptions['shouldShow']>();\n readonly placement = input<'top' | 'bottom'>('top');\n readonly offset = input<number>(8);\n readonly updateDelay = input(0);\n\n /** Fixed item names (e.g. ['bold', 'italic', 'code']). Omit for auto mode (all format items). */\n readonly items = input<string[]>();\n\n /** Context-aware: map context names to item arrays, `true` for all valid items, or `null` to disable */\n readonly contexts = input<Record<string, string[] | true | null>>();\n\n /** Internal — updated on transactions. Not meant to be set from outside. */\n readonly resolvedItems = signal<BubbleMenuItem[]>([]);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private pluginKey: PluginKey;\n\n private sanitizer = inject(DomSanitizer);\n private ngZone = inject(NgZone);\n\n private activeVersion = signal(0);\n private itemMap = new Map<string, ToolbarButton>();\n private activeMap = new Map<string, boolean>();\n private disabledMap = new Map<string, boolean>();\n private htmlCache = new Map<string, SafeHtml>();\n private bubbleDefaults = new Map<string, BubbleMenuItem[]>();\n private transactionHandler: (() => void) | null = null;\n\n constructor() {\n this.pluginKey = new PluginKey(\n 'angularBubbleMenu-' + Math.random().toString(36).slice(2, 8),\n );\n\n afterNextRender(() => {\n const editor = this.editor();\n const ctxs = this.contexts();\n let shouldShowFn = this.shouldShow();\n\n if (!shouldShowFn) {\n if (ctxs) {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n const context = this.detectContext(state.selection, ctxs);\n if (!context) return false;\n if (context in ctxs) {\n const val = ctxs[context];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return this.bubbleDefaults.has(context);\n };\n } else {\n // Auto/items mode: show when any endpoint's parent allows marks\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n if (state.selection.empty || state.selection.node) return false;\n if (isInsideTableCell(state.selection.$from)) return false;\n return state.selection.$from.parent.type.spec.marks !== ''\n || state.selection.$to.parent.type.spec.marks !== '';\n };\n }\n }\n\n const plugin = createBubbleMenuPlugin({\n pluginKey: this.pluginKey,\n editor,\n element: this.menuEl().nativeElement,\n shouldShow: shouldShowFn,\n placement: this.placement(),\n offset: this.offset(),\n updateDelay: this.updateDelay(),\n });\n editor.registerPlugin(plugin);\n this.setupItemTracking(editor);\n });\n }\n\n ngOnDestroy(): void {\n const editor = this.editor();\n if (this.transactionHandler) {\n editor.off('transaction', this.transactionHandler);\n }\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n\n // === Template helpers ===\n\n isItemActive(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.activeMap.get(item.name) ?? false;\n }\n\n isItemDisabled(item: ToolbarButton): boolean {\n this.activeVersion();\n return this.disabledMap.get(item.name) ?? false;\n }\n\n getCachedIcon(name: string): SafeHtml {\n let cached = this.htmlCache.get(name);\n if (!cached) {\n cached = this.sanitizer.bypassSecurityTrustHtml(defaultIcons[name] ?? '');\n this.htmlCache.set(name, cached);\n }\n return cached;\n }\n\n executeCommand(item: ToolbarButton): void {\n if (item.emitEvent) {\n // emitEvent is a dynamic string; cast needed to bypass strict EventEmitter<EditorEvents> typing\n (this.editor().emit as (e: string, d: unknown) => void)(item.emitEvent, {});\n return;\n }\n ToolbarController.executeItem(this.editor() as never, item);\n }\n\n // === Internal ===\n\n private buildItemMap(editor: Editor): void {\n this.itemMap.clear();\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') {\n this.itemMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n for (const sub of item.items) {\n this.itemMap.set(sub.name, sub);\n }\n }\n }\n }\n\n private resolveNames(names: string[]): BubbleMenuItem[] {\n const result: BubbleMenuItem[] = [];\n let sepIdx = 0;\n for (const name of names) {\n if (name === '|') {\n result.push({ type: 'separator', name: `sep-${sepIdx++}` });\n } else {\n const item = this.itemMap.get(name);\n if (item) result.push(item);\n }\n }\n return result;\n }\n\n private getFormatItems(): ToolbarButton[] {\n return Array.from(this.itemMap.values())\n .filter(item => item.group === 'format')\n .sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n }\n\n private detectContext(selection: SelectionShape, ctxs: Record<string, string[] | true | null>): string | null {\n // CellSelection (duck-type: has $anchorCell) — never show bubble menu\n if ('$anchorCell' in selection) return null;\n if (selection.node) return selection.node.type.name;\n if (selection.empty) return null;\n\n // TextSelection inside a table cell → 'table' context.\n // Cross-cell TextSelection (drag across cells) → hide bubble menu.\n const fromCell = this.findCellNode(selection.$from);\n if (fromCell) {\n const toCell = this.findCellNode(selection.$to);\n if (toCell && fromCell !== toCell) return null;\n return 'table';\n }\n\n const fromName = selection.$from.parent.type.name;\n if (fromName in ctxs) return fromName;\n if ('text' in ctxs && selection.$from.parent.type.spec.marks !== '') return 'text';\n // Cross-block: also check $to so bold/italic is offered when any endpoint allows marks\n const toName = selection.$to.parent.type.name;\n if (toName in ctxs) return toName;\n if ('text' in ctxs && selection.$to.parent.type.spec.marks !== '') return 'text';\n return null;\n }\n\n private findCellNode(pos: ResolvedPosShape): { type: { name: string } } | null {\n for (let d = pos.depth; d > 0; d--) {\n const node = pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n return node;\n }\n }\n return null;\n }\n\n /** Filters out mark items that the context node type doesn't allow (e.g. bold on codeBlock) */\n private filterBySchema(editor: Editor, contextName: string, items: ToolbarButton[]): ToolbarButton[] {\n if (contextName === 'text' || contextName === 'table') return items;\n const schema = (editor.state as unknown as { schema?: SchemaShape }).schema;\n if (!schema) return items;\n const nodeType = schema.nodes[contextName];\n if (!nodeType) return items;\n return items.filter(item => {\n const markName = typeof item.isActive === 'string' ? item.isActive : null;\n if (!markName) return true;\n const markType = schema.marks?.[markName];\n if (!markType) return true;\n return nodeType.allowsMarkType(markType);\n });\n }\n\n private buildBubbleDefaults(editor: Editor): void {\n this.bubbleDefaults.clear();\n const byCtx = new Map<string, ToolbarButton[]>();\n const addItem = (btn: ToolbarButton): void => {\n const ctx = (btn as unknown as Record<string, unknown>)['bubbleMenu'] as string | undefined;\n if (!ctx) return;\n let arr = byCtx.get(ctx);\n if (!arr) { arr = []; byCtx.set(ctx, arr); }\n arr.push(btn);\n };\n for (const item of editor.toolbarItems) {\n if (item.type === 'button') addItem(item);\n else if (item.type === 'dropdown') {\n for (const sub of item.items) addItem(sub);\n }\n }\n for (const [ctx, items] of byCtx) {\n items.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const result: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of items) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n result.push({ type: 'separator', name: `bsep-${sepIdx++}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n this.bubbleDefaults.set(ctx, result);\n }\n }\n\n private setupItemTracking(editor: Editor): void {\n this.buildItemMap(editor);\n this.buildBubbleDefaults(editor);\n\n if (this.contexts()) {\n this.updateContextItems(editor);\n } else if (this.items()) {\n this.resolvedItems.set(this.resolveNames(this.items()!));\n } else {\n this.resolvedItems.set(this.resolveNames(['bold', 'italic', 'underline']));\n }\n\n this.transactionHandler = () => {\n this.ngZone.run(() => {\n if (this.contexts()) {\n this.updateContextItems(editor);\n }\n this.updateStates(editor);\n this.activeVersion.update(v => v + 1);\n });\n };\n editor.on('transaction', this.transactionHandler);\n this.updateStates(editor);\n }\n\n private updateContextItems(editor: Editor): void {\n const ctxs = this.contexts()!;\n const ctx = this.detectContext(editor.state.selection as unknown as SelectionShape, ctxs);\n if (!ctx) {\n this.resolvedItems.set([]);\n return;\n }\n if (ctx in ctxs) {\n const val = ctxs[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n this.resolvedItems.set([]);\n return;\n }\n if (val === true) {\n this.resolvedItems.set(this.filterBySchema(editor, ctx, this.getFormatItems()));\n } else if (Array.isArray(val)) {\n const resolved = this.resolveNames(val);\n const buttons = resolved.filter((i): i is ToolbarButton => i.type !== 'separator');\n const filtered = new Set(this.filterBySchema(editor, ctx, buttons).map(b => b.name));\n this.resolvedItems.set(resolved.filter(i => i.type === 'separator' || filtered.has(i.name)));\n }\n } else {\n this.resolvedItems.set(this.bubbleDefaults.get(ctx) ?? []);\n }\n }\n\n private updateStates(editor: Editor): void {\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try { canProxy = editor.can() as unknown as Record<string, (...args: unknown[]) => boolean>; } catch {}\n\n for (const item of this.resolvedItems()) {\n if (item.type === 'separator') continue;\n this.activeMap.set(item.name, ToolbarController.resolveActive(editor as never, item));\n try {\n const canCmd = canProxy?.[item.command];\n this.disabledMap.set(item.name, canCmd\n ? !(item.commandArgs?.length ? canCmd(...item.commandArgs) : canCmd())\n : false);\n } catch { this.disabledMap.set(item.name, false); }\n }\n }\n\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n viewChild,\n ElementRef,\n afterNextRender,\n} from '@angular/core';\n\nimport {\n Editor,\n PluginKey,\n createFloatingMenuPlugin,\n} from '@domternal/core';\nimport type { FloatingMenuOptions } from '@domternal/core';\n\n@Component({\n selector: 'domternal-floating-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '<div #menuEl class=\"dm-floating-menu\"><ng-content /></div>',\n styles: [`:host { display: contents; }`],\n})\nexport class DomternalFloatingMenuComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly shouldShow = input<FloatingMenuOptions['shouldShow']>();\n readonly offset = input<number>(0);\n\n private menuEl = viewChild.required<ElementRef<HTMLElement>>('menuEl');\n private pluginKey: PluginKey;\n\n constructor() {\n // Unique key per instance — multiple floating menus on same page\n this.pluginKey = new PluginKey(\n 'angularFloatingMenu-' + Math.random().toString(36).slice(2, 8),\n );\n\n afterNextRender(() => {\n const shouldShow = this.shouldShow();\n const plugin = createFloatingMenuPlugin({\n pluginKey: this.pluginKey,\n editor: this.editor(),\n element: this.menuEl().nativeElement,\n ...(shouldShow && { shouldShow }),\n offset: this.offset(),\n });\n this.editor().registerPlugin(plugin);\n });\n }\n\n ngOnDestroy(): void {\n const editor = this.editor();\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(this.pluginKey);\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n OnDestroy,\n input,\n signal,\n computed,\n effect,\n inject,\n NgZone,\n ElementRef,\n untracked,\n} from '@angular/core';\n\nimport { Editor, positionFloatingOnce } from '@domternal/core';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\nconst CATEGORY_ICONS: Record<string, string> = {\n 'Smileys & Emotion': '\\u{1F600}',\n 'People & Body': '\\u{1F44B}',\n 'Animals & Nature': '\\u{1F431}',\n 'Food & Drink': '\\u{1F355}',\n 'Travel & Places': '\\u{1F697}',\n 'Activities': '\\u{26BD}',\n 'Objects': '\\u{1F4A1}',\n 'Symbols': '\\u{1F523}',\n 'Flags': '\\u{1F3C1}',\n};\n\n@Component({\n selector: 'domternal-emoji-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { 'class': 'dm-emoji-picker-host' },\n template: `\n @if (isOpen()) {\n <div class=\"dm-emoji-picker\">\n <div class=\"dm-emoji-picker-search\">\n <input\n #searchInput\n type=\"text\"\n placeholder=\"Search emoji...\"\n [value]=\"searchQuery()\"\n (input)=\"onSearch($event)\"\n aria-label=\"Search emoji\"\n (keydown.escape)=\"close()\"\n />\n </div>\n\n <div class=\"dm-emoji-picker-tabs\" role=\"tablist\">\n @for (cat of categoryNames(); track cat) {\n <button\n type=\"button\"\n class=\"dm-emoji-picker-tab\"\n [class.dm-emoji-picker-tab--active]=\"activeCategory() === cat\"\n role=\"tab\"\n [attr.aria-selected]=\"activeCategory() === cat\"\n [title]=\"cat\"\n [attr.aria-label]=\"cat\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"scrollToCategory(cat)\"\n >{{ categoryIcon(cat) }}</button>\n }\n </div>\n\n <div class=\"dm-emoji-picker-grid\" #grid (scroll)=\"onGridScroll()\" (keydown)=\"onGridKeydown($event)\">\n @if (searchQuery()) {\n @for (item of filteredEmojis(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n @empty {\n <div class=\"dm-emoji-picker-empty\">No emoji found</div>\n }\n } @else {\n @if (frequentlyUsed().length) {\n <div class=\"dm-emoji-picker-category-label\">Frequently Used</div>\n @for (item of frequentlyUsed(); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n @for (cat of categoryNames(); track cat) {\n <div class=\"dm-emoji-picker-category-label\" [attr.data-category]=\"cat\">{{ cat }}</div>\n @for (item of getCategory(cat); track item.name) {\n <button\n type=\"button\"\n class=\"dm-emoji-swatch\"\n [attr.tabindex]=\"-1\"\n [title]=\"formatName(item.name)\"\n [attr.aria-label]=\"formatName(item.name)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectEmoji(item)\"\n >{{ item.emoji }}</button>\n }\n }\n }\n </div>\n </div>\n }\n `,\n})\nexport class DomternalEmojiPickerComponent implements OnDestroy {\n readonly editor = input.required<Editor>();\n readonly emojis = input.required<EmojiPickerItem[]>();\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeCategory = signal('');\n\n private anchorEl: HTMLElement | null = null;\n private ngZone = inject(NgZone);\n private elRef = inject(ElementRef);\n private clickOutsideHandler: ((e: Event) => void) | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private eventHandler: ((...args: unknown[]) => void) | null = null;\n private cleanupFloating: (() => void) | null = null;\n\n readonly categories = computed(() => {\n const map = new Map<string, EmojiPickerItem[]>();\n for (const item of this.emojis()) {\n let list = map.get(item.group);\n if (!list) {\n list = [];\n map.set(item.group, list);\n }\n list.push(item);\n }\n return map;\n });\n\n readonly categoryNames = computed(() => [...this.categories().keys()]);\n\n readonly filteredEmojis = computed(() => {\n const query = this.searchQuery().toLowerCase();\n if (!query) return [];\n const storage = this.getEmojiStorage();\n const searchFn = storage?.['searchEmoji'] as ((q: string) => EmojiPickerItem[]) | undefined;\n if (searchFn) {\n return searchFn(query);\n }\n return this.emojis().filter(\n (item) =>\n item.name.includes(query) ||\n item.group.toLowerCase().includes(query),\n );\n });\n\n readonly frequentlyUsed = computed(() => {\n // Re-evaluate when panel opens (isOpen changes)\n this.isOpen();\n const storage = this.getEmojiStorage();\n const getFreq = storage?.['getFrequentlyUsed'] as (() => string[]) | undefined;\n if (!getFreq) return [];\n const names = getFreq();\n if (!names.length) return [];\n const nameMap = storage!['_nameMap'] as Map<string, EmojiPickerItem> | undefined;\n if (!nameMap) return [];\n return names.slice(0, 16).map((n) => nameMap.get(n)).filter(Boolean) as EmojiPickerItem[];\n });\n\n constructor() {\n effect(() => {\n const editor = this.editor();\n untracked(() => this.setupEventListener(editor));\n });\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n getCategory(cat: string): EmojiPickerItem[] {\n return this.categories().get(cat) ?? [];\n }\n\n categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n }\n\n formatName(name: string): string {\n return name.replace(/_/g, ' ');\n }\n\n onSearch(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.searchQuery.set(input.value);\n }\n\n selectEmoji(item: EmojiPickerItem): void {\n const editor = this.editor();\n const cmd = editor.commands as Record<string, (...args: unknown[]) => boolean>;\n if (cmd['insertEmoji']) {\n cmd['insertEmoji'](item.name);\n }\n this.close();\n }\n\n scrollToCategory(cat: string): void {\n this.searchQuery.set('');\n this.activeCategory.set(cat);\n\n // Wait for search to clear and DOM to update\n requestAnimationFrame(() => {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n const label = grid.querySelector(`[data-category=\"${cat}\"]`) as HTMLElement | null;\n if (label) {\n // Use manual scrollTop instead of scrollIntoView to avoid scrolling the page\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop, behavior: 'smooth' });\n }\n });\n }\n\n onGridKeydown(event: KeyboardEvent): void {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n const swatches = Array.from(grid.querySelectorAll('.dm-emoji-swatch')) as HTMLElement[];\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n const idx = swatches.indexOf(current);\n if (idx === -1) return;\n const cols = 8;\n let next = idx;\n switch (event.key) {\n case 'ArrowRight': event.preventDefault(); next = Math.min(idx + 1, swatches.length - 1); break;\n case 'ArrowLeft': event.preventDefault(); next = Math.max(idx - 1, 0); break;\n case 'ArrowDown': event.preventDefault(); next = Math.min(idx + cols, swatches.length - 1); break;\n case 'ArrowUp': event.preventDefault(); next = Math.max(idx - cols, 0); break;\n case 'Enter': case ' ': event.preventDefault(); swatches[idx]?.click(); return;\n default: return;\n }\n swatches[next]?.focus();\n }\n\n onGridScroll(): void {\n const grid = this.elRef.nativeElement.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid || this.searchQuery()) return;\n\n const labels = Array.from(grid.querySelectorAll('.dm-emoji-picker-category-label[data-category]')) as HTMLElement[];\n\n let currentCat = '';\n for (const label of labels) {\n if (label.offsetTop - grid.offsetTop <= grid.scrollTop + 20) {\n currentCat = label.getAttribute('data-category') ?? '';\n }\n }\n\n if (currentCat && currentCat !== this.activeCategory()) {\n this.activeCategory.set(currentCat);\n }\n }\n\n close(): void {\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n this.isOpen.set(false);\n this.setStorageOpen(false);\n this.searchQuery.set('');\n this.anchorEl = null;\n this.removeGlobalListeners();\n this.editor().view.focus();\n }\n\n private setupEventListener(editor: Editor): void {\n this.cleanup();\n\n this.eventHandler = (...args: unknown[]) => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n this.ngZone.run(() => {\n if (this.isOpen()) {\n this.close();\n return;\n }\n\n this.anchorEl = data?.anchorElement ?? null;\n this.isOpen.set(true);\n this.setStorageOpen(true);\n this.searchQuery.set('');\n\n // Set initial active category\n const names = this.categoryNames();\n if (names.length > 0 && names[0]) {\n this.activeCategory.set(names[0]);\n }\n\n this.addGlobalListeners();\n\n // Position panel and focus search input after render\n requestAnimationFrame(() => {\n const panel = this.elRef.nativeElement.querySelector('.dm-emoji-picker') as HTMLElement | null;\n if (panel && this.anchorEl) {\n this.cleanupFloating?.();\n this.cleanupFloating = positionFloatingOnce(this.anchorEl, panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = this.elRef.nativeElement.querySelector('.dm-emoji-picker-search input') as HTMLInputElement | null;\n input?.focus({ preventScroll: true });\n });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n }\n\n private addGlobalListeners(): void {\n this.clickOutsideHandler = (e: Event) => {\n const target = e.target as Node;\n if (\n this.isOpen() &&\n !this.elRef.nativeElement.contains(target) &&\n target !== this.anchorEl &&\n !this.anchorEl?.contains(target)\n ) {\n this.ngZone.run(() => this.close());\n }\n };\n document.addEventListener('mousedown', this.clickOutsideHandler);\n\n this.keydownHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen()) {\n e.preventDefault();\n this.ngZone.run(() => this.close());\n }\n };\n document.addEventListener('keydown', this.keydownHandler);\n }\n\n private removeGlobalListeners(): void {\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n if (this.keydownHandler) {\n document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n }\n\n private setStorageOpen(open: boolean): void {\n const storage = this.getEmojiStorage();\n if (storage) storage['isOpen'] = open;\n // Dispatch a no-op transaction so the toolbar's transaction handler\n // re-evaluates isActiveFn and shows the button as active/inactive.\n const editor = this.editor();\n editor.view.dispatch(editor.view.state.tr);\n }\n\n private getEmojiStorage(): Record<string, unknown> | null {\n const storage = this.editor().storage as Record<string, unknown>;\n return (storage['emoji'] as Record<string, unknown>) ?? null;\n }\n\n private cleanup(): void {\n this.removeGlobalListeners();\n if (this.eventHandler) {\n const editor = this.editor();\n (editor.off as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', this.eventHandler);\n this.eventHandler = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -106,6 +106,7 @@ declare class DomternalToolbarComponent implements OnDestroy {
|
|
|
106
106
|
onDropdownItemClick(item: ToolbarButton, event?: Event): void;
|
|
107
107
|
onButtonFocus(name: string): void;
|
|
108
108
|
onKeydown(event: KeyboardEvent): void;
|
|
109
|
+
private focusDropdownItem;
|
|
109
110
|
private resolveIconSvg;
|
|
110
111
|
private setupController;
|
|
111
112
|
private destroyController;
|
|
@@ -219,6 +220,7 @@ declare class DomternalEmojiPickerComponent implements OnDestroy {
|
|
|
219
220
|
onSearch(event: Event): void;
|
|
220
221
|
selectEmoji(item: EmojiPickerItem): void;
|
|
221
222
|
scrollToCategory(cat: string): void;
|
|
223
|
+
onGridKeydown(event: KeyboardEvent): void;
|
|
222
224
|
onGridScroll(): void;
|
|
223
225
|
close(): void;
|
|
224
226
|
private setupEventListener;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@domternal/angular",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Angular components for Domternal editor",
|
|
5
5
|
"author": "https://github.com/ThomasNowHere",
|
|
6
6
|
"license": "MIT",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"peerDependencies": {
|
|
17
17
|
"@angular/core": ">=17.1.0",
|
|
18
18
|
"@angular/forms": ">=17.1.0",
|
|
19
|
-
"@domternal/core": ">=0.
|
|
19
|
+
"@domternal/core": ">=0.5.0"
|
|
20
20
|
},
|
|
21
21
|
"files": [
|
|
22
22
|
"dist"
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"@angular/platform-browser": "^21.2.4",
|
|
34
34
|
"ng-packagr": "^21.0.0",
|
|
35
35
|
"typescript": "~5.9.3",
|
|
36
|
-
"@domternal/core": "0.
|
|
36
|
+
"@domternal/core": "0.5.0"
|
|
37
37
|
},
|
|
38
38
|
"keywords": [
|
|
39
39
|
"angular",
|