@aquera/nile-elements 0.1.64-beta-1.2 → 0.1.65-beta-1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/demo/index.html +29 -109
  2. package/dist/index.js +608 -547
  3. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
  4. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
  5. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
  6. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
  7. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +45 -2
  8. package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
  9. package/dist/nile-rich-text-editor/nile-rte-mentions.cjs.js +1 -1
  10. package/dist/nile-rich-text-editor/nile-rte-mentions.cjs.js.map +1 -1
  11. package/dist/nile-rich-text-editor/nile-rte-mentions.esm.js +1 -1
  12. package/dist/nile-rich-text-editor/nile-rte-select.cjs.js +1 -1
  13. package/dist/nile-rich-text-editor/nile-rte-select.cjs.js.map +1 -1
  14. package/dist/nile-rich-text-editor/nile-rte-select.esm.js +31 -13
  15. package/dist/nile-rich-text-editor/utils.cjs.js +1 -1
  16. package/dist/nile-rich-text-editor/utils.cjs.js.map +1 -1
  17. package/dist/nile-rich-text-editor/utils.esm.js +1 -1
  18. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +43 -0
  19. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
  20. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +3 -0
  21. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +81 -22
  22. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
  23. package/dist/src/nile-rich-text-editor/nile-rte-mentions.js +5 -0
  24. package/dist/src/nile-rich-text-editor/nile-rte-mentions.js.map +1 -1
  25. package/dist/src/nile-rich-text-editor/nile-rte-select.d.ts +15 -1
  26. package/dist/src/nile-rich-text-editor/nile-rte-select.js +85 -52
  27. package/dist/src/nile-rich-text-editor/nile-rte-select.js.map +1 -1
  28. package/dist/src/nile-rich-text-editor/utils.d.ts +1 -0
  29. package/dist/src/nile-rich-text-editor/utils.js +17 -0
  30. package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +1 -1
  33. package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +43 -0
  34. package/src/nile-rich-text-editor/nile-rich-text-editor.ts +112 -40
  35. package/src/nile-rich-text-editor/nile-rte-mentions.ts +5 -0
  36. package/src/nile-rich-text-editor/nile-rte-select.ts +97 -58
  37. package/src/nile-rich-text-editor/utils.ts +18 -0
  38. package/vscode-html-custom-data.json +3 -3
@@ -43,6 +43,49 @@ nile-rte-toolbar-item > nile-button::part(base) {
43
43
 
44
44
  .editor { min-height:160px; padding:12px; border:1px solid #e5e7eb; border-radius:0 0 8px 8px; background:#fff; outline:none; }
45
45
  nile-rte-preview { display:block; margin-top:10px; padding:10px; border:1px dashed #cbd5e1; border-radius:8px; background:#fafafa; }
46
+
47
+ .rte-color-trigger {
48
+ display: inline-flex;
49
+ align-items: center;
50
+ justify-content: center;
51
+ height: 28px;
52
+ padding: 0 8px;
53
+ border: 1px solid var(--nile-color-border, #d9d9d9);
54
+ border-radius: 6px;
55
+ background: #fff;
56
+ cursor: pointer;
57
+ }
58
+
59
+ .rte-color-trigger .glyph-stack {
60
+ display: grid; /* stack vertically */
61
+ grid-auto-rows: max-content;
62
+ align-items: center;
63
+ justify-items: center;
64
+ line-height: 1;
65
+ }
66
+
67
+ .rte-color-trigger .glyph {
68
+ font-size: 14px;
69
+ line-height: 1;
70
+ margin-bottom: 2px; /* little breathing space above underline */
71
+ }
72
+
73
+ .rte-color-trigger .underline {
74
+ width: 18px;
75
+ height: 3px;
76
+ border-radius: 2px;
77
+ background: currentColor; /* we override via JS with backgroundColor */
78
+ }
79
+
80
+ /* (unchanged) highlight square */
81
+ .rte-color-trigger .swatch-box {
82
+ width: 18px;
83
+ height: 16px;
84
+ border-radius: 4px;
85
+ border: 1px solid rgba(0,0,0,0.35);
86
+ background: currentColor; /* overridden via JS */
87
+ }
88
+
46
89
  `;
47
90
  export default [styles];
48
91
  //# sourceMappingURL=nile-rich-text-editor.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nile-rich-text-editor.css.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rich-text-editor.css.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["// rte-styles.ts\nimport { css } from 'lit';\n\nexport const styles = css`\n /* Host positioning for overlays */\n nile-rich-text-editor { position: relative; display: block; font-family: inherit; }\n\n \nnile-rte-toolbar-item > nile-button::part(base) {\n \n width:32px; height:32px; padding:0px 6px;\n border: none;\n}\n \n \n\n\n .toolbar, nile-rte-toolbar {\n display:flex; align-items:center; gap:8px; padding:8px; \n border:1px solid #e5e7eb; border-bottom:none; border-radius:8px 8px 0 0; background:#fff;\n }\n\n nile-rte-toolbar-item > button, .toolbar button, nile-rte-toolbar button {\n border:1px solid #e5e7eb; background:#fff; border-radius:6px;\n cursor:pointer;\n }\n\n \n /* Ensure clicks hit the button (not nested icon internals) */\n nile-rte-toolbar-item > button nile-icon { pointer-events:none; }\n\n nile-rte-toolbar-item > button.active { border-color:#2563eb; background:#eff6ff; }\n nile-rte-select select { height:32px; border:1px solid #e5e7eb; border-radius:6px; background:#fff; }\n nile-rte-color input[type=\"color\"] { height:32px; width:36px; border:1px solid #e5e7eb; padding:0; border-radius:6px; background:#fff; }\n nile-rte-divider { width:1px; height:20px; background:#e5e7eb; display:inline-block; margin:0 4px; }\n\n .editor p { margin:1em 0; }\n .editor h1 { font-size:2em }\n .editor h2 { font-size:1.5em }\n .editor h3 { font-size:1.17em }\n .editor h4 { font-size:1em }\n .editor h5 { font-size:0.83em }\n .editor h6 { font-size:0.67em }\n\n .editor { min-height:160px; padding:12px; border:1px solid #e5e7eb; border-radius:0 0 8px 8px; background:#fff; outline:none; }\n nile-rte-preview { display:block; margin-top:10px; padding:10px; border:1px dashed #cbd5e1; border-radius:8px; background:#fafafa; }\n`;\n\nexport default [styles];"]}
1
+ {"version":3,"file":"nile-rich-text-editor.css.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rich-text-editor.css.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["// rte-styles.ts\nimport { css } from 'lit';\n\nexport const styles = css`\n /* Host positioning for overlays */\n nile-rich-text-editor { position: relative; display: block; font-family: inherit; }\n\n \nnile-rte-toolbar-item > nile-button::part(base) {\n \n width:32px; height:32px; padding:0px 6px;\n border: none;\n}\n \n \n\n\n .toolbar, nile-rte-toolbar {\n display:flex; align-items:center; gap:8px; padding:8px; \n border:1px solid #e5e7eb; border-bottom:none; border-radius:8px 8px 0 0; background:#fff;\n }\n\n nile-rte-toolbar-item > button, .toolbar button, nile-rte-toolbar button {\n border:1px solid #e5e7eb; background:#fff; border-radius:6px;\n cursor:pointer;\n }\n\n \n /* Ensure clicks hit the button (not nested icon internals) */\n nile-rte-toolbar-item > button nile-icon { pointer-events:none; }\n\n nile-rte-toolbar-item > button.active { border-color:#2563eb; background:#eff6ff; }\n nile-rte-select select { height:32px; border:1px solid #e5e7eb; border-radius:6px; background:#fff; }\n nile-rte-color input[type=\"color\"] { height:32px; width:36px; border:1px solid #e5e7eb; padding:0; border-radius:6px; background:#fff; }\n nile-rte-divider { width:1px; height:20px; background:#e5e7eb; display:inline-block; margin:0 4px; }\n\n .editor p { margin:1em 0; }\n .editor h1 { font-size:2em }\n .editor h2 { font-size:1.5em }\n .editor h3 { font-size:1.17em }\n .editor h4 { font-size:1em }\n .editor h5 { font-size:0.83em }\n .editor h6 { font-size:0.67em }\n\n .editor { min-height:160px; padding:12px; border:1px solid #e5e7eb; border-radius:0 0 8px 8px; background:#fff; outline:none; }\n nile-rte-preview { display:block; margin-top:10px; padding:10px; border:1px dashed #cbd5e1; border-radius:8px; background:#fafafa; }\n\n .rte-color-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--nile-color-border, #d9d9d9);\n border-radius: 6px;\n background: #fff;\n cursor: pointer;\n}\n\n.rte-color-trigger .glyph-stack {\n display: grid; /* stack vertically */\n grid-auto-rows: max-content; \n align-items: center;\n justify-items: center;\n line-height: 1;\n}\n\n.rte-color-trigger .glyph {\n font-size: 14px;\n line-height: 1;\n margin-bottom: 2px; /* little breathing space above underline */\n}\n\n.rte-color-trigger .underline {\n width: 18px;\n height: 3px;\n border-radius: 2px;\n background: currentColor; /* we override via JS with backgroundColor */\n}\n\n/* (unchanged) highlight square */\n.rte-color-trigger .swatch-box {\n width: 18px;\n height: 16px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0.35);\n background: currentColor; /* overridden via JS */\n}\n\n`;\n\nexport default [styles];"]}
@@ -26,6 +26,9 @@ export declare class NileRichTextEditor extends LitElement {
26
26
  private headingSelect;
27
27
  private fontSelect;
28
28
  private colorInput;
29
+ private bgColorInput;
30
+ private colorSwatchEl;
31
+ private bgSwatchEl;
29
32
  private mentionsEl;
30
33
  private injectCss;
31
34
  connectedCallback(): void;
@@ -9,7 +9,7 @@ import './nile-rte-color';
9
9
  import './nile-rte-divider';
10
10
  import './nile-rte-preview';
11
11
  import './nile-rte-mentions';
12
- import { closestBlock, nearestElement, rgbToHex, toggleInlineTag, setBlockTag, setAlignment, setFontFamily, setForeColor, insertOrEditLink } from './utils';
12
+ import { closestBlock, nearestElement, rgbToHex, toggleInlineTag, setBlockTag, setAlignment, setFontFamily, setForeColor, insertOrEditLink, setBackColor } from './utils';
13
13
  import { styles } from './nile-rich-text-editor.css';
14
14
  /**
15
15
  * Map commands → default icon names from your <nile-icon> set.
@@ -45,9 +45,11 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
45
45
  this.headingSelect = null;
46
46
  this.fontSelect = null;
47
47
  this.colorInput = null;
48
+ this.bgColorInput = null;
49
+ this.colorSwatchEl = null;
50
+ this.bgSwatchEl = null;
48
51
  // Mentions controller (child)
49
52
  this.mentionsEl = null;
50
- // ---------- Selection helpers (for toolbar state only) ----------
51
53
  this.onSelectionChange = () => {
52
54
  if (!this.editorEl)
53
55
  return;
@@ -73,22 +75,16 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
73
75
  }
74
76
  connectedCallback() {
75
77
  super.connectedCallback();
76
- // 1) Inject styles once (so authored DOM stays as-is)
77
78
  this.injectCss(styles.cssText);
78
- // 2) Keep authored nodes
79
79
  this.toolbarEl = this.querySelector('nile-rte-toolbar');
80
80
  this.previewEl = this.querySelector('nile-rte-preview');
81
- // 3) Ensure there is an editor element; create if missing.
82
81
  this.ensureEditor();
83
- // 4) Fill initial content
84
82
  if (this.value && !this.editorEl.innerHTML.trim()) {
85
83
  this.editorEl.innerHTML = this.value;
86
84
  }
87
85
  this.content = this.editorEl.innerHTML;
88
- // 5) Wire toolbar authored children directly
89
86
  if (this.toolbarEl)
90
87
  this.wireAuthoredToolbar(this.toolbarEl);
91
- // 6) Mentions: delegate to child controller
92
88
  this.mentionsEl = this.querySelector('nile-rte-mentions');
93
89
  if (this.mentionsEl) {
94
90
  this.mentionsEl.attach?.(this.editorEl, this);
@@ -101,7 +97,6 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
101
97
  }
102
98
  disconnectedCallback() {
103
99
  document.removeEventListener('selectionchange', this.onSelectionChange, true);
104
- // Optionally tell mentions to cleanup
105
100
  if (this.mentionsEl && this.mentionsEl.detach) {
106
101
  this.mentionsEl.detach();
107
102
  }
@@ -124,7 +119,6 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
124
119
  }
125
120
  this.editorEl = editor;
126
121
  }
127
- // **NEW**: seed an empty paragraph so setBlockTag() has something to swap
128
122
  if (!this.editorEl.innerHTML.trim()) {
129
123
  this.editorEl.innerHTML = '<p><br></p>';
130
124
  }
@@ -137,15 +131,13 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
137
131
  this.updateContent();
138
132
  });
139
133
  this.editorEl.addEventListener('mouseup', () => this.saveSelection());
140
- this.editorEl.addEventListener('keyup', () => this.saveSelection()); // keep range fresh for toolbar
134
+ this.editorEl.addEventListener('keyup', () => this.saveSelection());
141
135
  }
142
136
  wireAuthoredToolbar(tb) {
143
- // Clear previous map
144
137
  this.buttonMap.clear();
145
138
  this.headingSelect = null;
146
139
  this.fontSelect = null;
147
140
  this.colorInput = null;
148
- // Process children
149
141
  Array.from(tb.children).forEach(child => {
150
142
  const tag = child.tagName.toLowerCase();
151
143
  if (tag === 'nile-rte-select' && child.getAttribute('type') === 'align') {
@@ -159,19 +151,16 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
159
151
  return;
160
152
  }
161
153
  if (tag === 'nile-rte-toolbar-item') {
162
- // Look for an authored <nile-button> (so authors can override)
163
154
  let btn = child.querySelector(':scope > nile-button');
164
155
  const cmd = child.getAttribute('name') || '';
165
156
  const label = child.getAttribute('label') || cmd;
166
157
  const iconAttr = child.getAttribute('icon');
167
158
  const authoredHasContent = child.innerHTML.trim().length > 0;
168
- // If none, create one
169
159
  if (!btn) {
170
160
  btn = document.createElement('nile-button');
171
161
  btn.variant = 'tertiary';
172
162
  btn.size = 'small'; // optional
173
163
  }
174
- // Fill visual content
175
164
  if (iconAttr) {
176
165
  btn.innerHTML = `<nile-icon name="${iconAttr}" aria-label="${label}"></nile-icon>`;
177
166
  child.innerHTML = '';
@@ -228,25 +217,83 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
228
217
  if (tag === 'nile-rte-color') {
229
218
  const label = child.getAttribute('label') ?? 'Text color';
230
219
  const value = child.getAttribute('value') ?? '#000000';
231
- // render internal <input type="color">
220
+ const mode = child.getAttribute('mode') ?? 'text'; // 'text' | 'background'
221
+ // Create/attach the hidden color input
232
222
  let input = child.querySelector(':scope > input[type="color"]');
233
223
  if (!input) {
234
224
  input = document.createElement('input');
235
225
  input.type = 'color';
226
+ input.style.position = 'absolute';
227
+ input.style.opacity = '0';
228
+ input.style.pointerEvents = 'none'; // we'll click it programmatically
236
229
  child.appendChild(input);
237
230
  }
238
231
  input.title = label;
239
232
  input.value = value;
240
- input.addEventListener('mousedown', e => e.preventDefault());
233
+ // Build a custom trigger that shows the current color
234
+ let trigger = child.querySelector(':scope > button.rte-color-trigger');
235
+ if (!trigger) {
236
+ trigger = document.createElement('button');
237
+ trigger.type = 'button';
238
+ trigger.className = 'rte-color-trigger';
239
+ trigger.setAttribute('aria-label', label);
240
+ if (mode === 'background') {
241
+ trigger.innerHTML = `
242
+ <span class="swatch-box" aria-hidden="true"></span>
243
+ `;
244
+ }
245
+ else {
246
+ trigger.innerHTML = `
247
+ <span class="glyph-stack" aria-hidden="true">
248
+ <span class="glyph">A</span>
249
+ <span class="underline"></span>
250
+ </span>
251
+ `;
252
+ }
253
+ child.appendChild(trigger);
254
+ }
255
+ // Cache swatch elements to update later
256
+ const underline = trigger.querySelector('.underline');
257
+ const square = trigger.querySelector('.swatch-box');
258
+ if (mode === 'background') {
259
+ this.bgColorInput = input;
260
+ this.bgSwatchEl = square;
261
+ if (this.bgSwatchEl)
262
+ this.bgSwatchEl.style.backgroundColor = input.value;
263
+ }
264
+ else {
265
+ this.colorInput = input;
266
+ this.colorSwatchEl = underline;
267
+ if (this.colorSwatchEl)
268
+ this.colorSwatchEl.style.backgroundColor = input.value;
269
+ }
270
+ // Open native picker on trigger click
271
+ trigger.addEventListener('click', (e) => {
272
+ e.preventDefault();
273
+ // Keep selection before opening the picker
274
+ this.focusAndRestore();
275
+ input.click();
276
+ });
277
+ // When the user picks a color, apply it + update swatch
241
278
  input.addEventListener('input', () => {
242
279
  this.focusAndRestore();
243
- setForeColor(this.editorEl, input.value);
280
+ if (mode === 'background') {
281
+ setBackColor(this.editorEl, input.value);
282
+ if (this.bgSwatchEl)
283
+ this.bgSwatchEl.style.backgroundColor = input.value;
284
+ }
285
+ else {
286
+ setForeColor(this.editorEl, input.value);
287
+ if (this.colorSwatchEl)
288
+ this.colorSwatchEl.style.backgroundColor = input.value;
289
+ }
244
290
  this.updateContent();
245
291
  this.updateToolbarState();
246
292
  });
247
- this.colorInput = input;
293
+ // Prevent losing selection when interacting
294
+ trigger.addEventListener('mousedown', e => e.preventDefault());
295
+ input.addEventListener('mousedown', e => e.preventDefault());
248
296
  }
249
- // nile-rte-divider: no-op (purely visual)
250
297
  });
251
298
  }
252
299
  saveSelection() {
@@ -481,12 +528,24 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
481
528
  }
482
529
  }
483
530
  }
484
- // Reflect color
485
531
  if (this.colorInput) {
486
532
  const hex = rgbToHex(comp.color);
487
533
  if (hex && this.colorInput.value.toLowerCase() !== hex.toLowerCase()) {
488
534
  this.colorInput.value = hex;
489
535
  }
536
+ if (this.colorSwatchEl)
537
+ this.colorSwatchEl.style.backgroundColor = this.colorInput.value;
538
+ }
539
+ if (this.bgColorInput) {
540
+ const bg = getComputedStyle(startElm).backgroundColor;
541
+ if (bg && !/transparent|rgba\(\s*0\s*,\s*0\s*,\s*0\s*,\s*0\s*\)/i.test(bg)) {
542
+ const bgHex = rgbToHex(bg);
543
+ if (bgHex && this.bgColorInput.value.toLowerCase() !== bgHex.toLowerCase()) {
544
+ this.bgColorInput.value = bgHex;
545
+ }
546
+ }
547
+ if (this.bgSwatchEl)
548
+ this.bgSwatchEl.style.backgroundColor = this.bgColorInput.value;
490
549
  }
491
550
  }
492
551
  syncPreview() {
@@ -1 +1 @@
1
- {"version":3,"file":"nile-rich-text-editor.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rich-text-editor.ts"],"names":[],"mappings":"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","sourcesContent":["// nile-rich-text-editor.ts\nimport { LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport './nile-rte-toolbar';\nimport './nile-rte-toolbar-item';\nimport './nile-rte-select';\nimport './nile-rte-color';\nimport './nile-rte-divider';\nimport './nile-rte-preview';\nimport './nile-rte-mentions';\n\nimport {\n closestBlock, nearestElement, rgbToHex,\n toggleInlineTag, setBlockTag, setAlignment,\n setFontFamily, setForeColor, insertOrEditLink\n} from './utils';\n\nimport {styles} from './nile-rich-text-editor.css'; \n\ntype MentionsConfig = Record<string, { key: string; label: string }[]>;\n\n/**\n * Map commands → default icon names from your <nile-icon> set.\n * Adjust values to match the real names you have.\n */\nconst DEFAULT_ICONS: Record<string, string> = {\n bold: 'nile-bold',\n italic: 'nile-italic',\n underline: 'nile-underline',\n link: 'user',\n left: 'nile-leftalign',\n center: 'nile-centeralign',\n right: 'nile-rightalign',\n justify: 'nile-justify',\n ul: 'nile-ul',\n ol: 'nile-ol',\n clear: 'error',\n};\n\n@customElement('nile-rich-text-editor')\nexport class NileRichTextEditor extends LitElement {\n protected createRenderRoot() { return this; } \n protected shouldUpdate() { return false; } \n\n /** Initial HTML content */\n @property({ type: String }) value = '';\n\n /** Optional mentions config (can also be on <nile-rte-mentions mentions=\"...\">) */\n @property({\n attribute: 'mentions',\n converter: {\n fromAttribute: (value: string): MentionsConfig => {\n try {\n const parsed = JSON.parse(value);\n const out: MentionsConfig = {};\n for (const trig of Object.keys(parsed)) {\n const arr = parsed[trig];\n if (Array.isArray(arr)) {\n out[trig] = arr\n .filter(i => i && typeof i.key === 'string' && typeof i.label === 'string')\n .map(i => ({ key: i.key, label: i.label }));\n }\n }\n return out;\n } catch { return {}; }\n },\n toAttribute: (v: MentionsConfig) => JSON.stringify(v),\n }\n })\n mentions: MentionsConfig = {};\n\n // ----- internal state (no Lit render) -----\n @state() private content = '';\n private editorEl!: HTMLElement;\n private previewEl: HTMLElement | null = null;\n private toolbarEl: HTMLElement | null = null;\n\n private lastRange: Range | null = null;\n\n // map for button active reflections\n private buttonMap = new Map<string, HTMLElement[]>();\n private headingSelect: HTMLSelectElement | null = null;\n private fontSelect: HTMLSelectElement | null = null;\n private colorInput: HTMLInputElement | null = null;\n\n // Mentions controller (child)\n private mentionsEl: HTMLElement | null = null;\n\n \n\n private injectCss(cssText: string) {\n if (this.querySelector('style[data-rte-style]')) return;\n const style = document.createElement('style');\n style.setAttribute('data-rte-style', 'true');\n style.textContent = cssText;\n this.insertBefore(style, this.firstChild);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n // 1) Inject styles once (so authored DOM stays as-is)\n this.injectCss(styles.cssText); \n \n\n // 2) Keep authored nodes\n this.toolbarEl = this.querySelector('nile-rte-toolbar');\n this.previewEl = this.querySelector('nile-rte-preview');\n\n // 3) Ensure there is an editor element; create if missing.\n this.ensureEditor();\n\n // 4) Fill initial content\n if (this.value && !this.editorEl.innerHTML.trim()) {\n this.editorEl.innerHTML = this.value;\n }\n this.content = this.editorEl.innerHTML;\n\n // 5) Wire toolbar authored children directly\n if (this.toolbarEl) this.wireAuthoredToolbar(this.toolbarEl);\n\n // 6) Mentions: delegate to child controller\n this.mentionsEl = this.querySelector('nile-rte-mentions');\n if (this.mentionsEl) {\n \n (this.mentionsEl as any).attach?.(this.editorEl, this as HTMLElement);\n \n (this.mentionsEl as any).setExternalConfig?.(this.mentions);\n }\n\n \n this.wireEditor();\n\n \n this.updateToolbarState();\n this.syncPreview();\n\n \n document.addEventListener('selectionchange', this.onSelectionChange, true);\n }\n\n disconnectedCallback(): void {\n document.removeEventListener('selectionchange', this.onSelectionChange, true);\n // Optionally tell mentions to cleanup\n if (this.mentionsEl && (this.mentionsEl as any).detach) {\n (this.mentionsEl as any).detach();\n }\n super.disconnectedCallback();\n }\n\n \n \n\n private ensureEditor() {\n this.editorEl = this.querySelector('.editor') as HTMLElement;\n if (!this.editorEl) {\n const editor = document.createElement('div');\n editor.className = 'editor';\n editor.setAttribute('contenteditable','true');\n if (this.toolbarEl?.nextSibling) {\n this.insertBefore(editor, this.toolbarEl.nextSibling);\n } else if (this.previewEl) {\n this.insertBefore(editor, this.previewEl);\n } else {\n this.appendChild(editor);\n }\n this.editorEl = editor;\n }\n // **NEW**: seed an empty paragraph so setBlockTag() has something to swap\n if (!this.editorEl.innerHTML.trim()) {\n this.editorEl.innerHTML = '<p><br></p>';\n }\n this.ensureAtLeastOneParagraph();\n }\n\n private wireEditor() {\n // Input & selection preservation\n this.editorEl.addEventListener('input', () => { \n this.ensureAtLeastOneParagraph();\n this.updateContent();\n });\n this.editorEl.addEventListener('mouseup', () => this.saveSelection());\n this.editorEl.addEventListener('keyup', () => this.saveSelection()); // keep range fresh for toolbar\n }\n\n private wireAuthoredToolbar(tb: HTMLElement) {\n // Clear previous map\n this.buttonMap.clear();\n this.headingSelect = null;\n this.fontSelect = null;\n this.colorInput = null;\n\n // Process children\n Array.from(tb.children).forEach(child => {\n const tag = child.tagName.toLowerCase();\n\n if (tag === 'nile-rte-select' && child.getAttribute('type') === 'align') {\n child.addEventListener('change', (e: any) => {\n this.focusAndRestore();\n const alignment = e.detail as 'left'|'center'|'right'|'justify';\n setAlignment(this.editorEl, alignment);\n this.updateContent();\n this.updateToolbarState();\n });\n return;\n }\n \n\n if (tag === 'nile-rte-toolbar-item') {\n // Look for an authored <nile-button> (so authors can override)\n let btn = child.querySelector(':scope > nile-button') as HTMLElement | null;\n \n const cmd = child.getAttribute('name') || '';\n const label = child.getAttribute('label') || cmd;\n const iconAttr = child.getAttribute('icon');\n const authoredHasContent = child.innerHTML.trim().length > 0;\n \n // If none, create one\n if (!btn) {\n btn = document.createElement('nile-button');\n (btn as any).variant = 'tertiary';\n (btn as any).size = 'small'; // optional\n }\n \n // Fill visual content\n if (iconAttr) {\n btn.innerHTML = `<nile-icon name=\"${iconAttr}\" aria-label=\"${label}\"></nile-icon>`;\n child.innerHTML = '';\n } else if (!authoredHasContent) {\n const defaultIcon = DEFAULT_ICONS[cmd];\n if (defaultIcon) {\n btn.innerHTML = `<nile-icon name=\"${defaultIcon}\" size=\"20\" color=\"black\" aria-label=\"${label}\"></nile-icon>`;\n } else {\n btn.textContent = label || cmd;\n }\n child.innerHTML = '';\n } else {\n // Author provided custom content (could be a <nile-icon> already)\n btn.innerHTML = child.innerHTML;\n child.innerHTML = '';\n }\n \n // Mount it\n if (!btn.isConnected) child.appendChild(btn);\n \n // Interactions\n btn.setAttribute('aria-label', label);\n btn.addEventListener('mousedown', e => e.preventDefault());\n btn.addEventListener('click', () => this.onToolbarCommand(cmd));\n \n // Register for active reflection\n const arr = this.buttonMap.get(cmd) ?? [];\n arr.push(btn);\n this.buttonMap.set(cmd, arr);\n \n return; // done with this child\n }\n if (tag === 'nile-rte-select') {\n const type = child.getAttribute('type') || '';\n\n // listen for our custom dropdown’s change event\n child.addEventListener('change', (e: any) => {\n // restore focus & selection\n this.focusAndRestore();\n\n const val = e.detail as string;\n\n if (type === 'heading') {\n // apply block tag\n setBlockTag(this.editorEl, val as any);\n }\n else if (type === 'font') {\n setFontFamily(this.editorEl, val);\n }\n \n // update the editor content & toolbar UI\n this.updateContent();\n this.updateToolbarState();\n });\n\n // nothing else to inject into the DOM\n return;\n }\n \n\n if (tag === 'nile-rte-color') {\n const label = child.getAttribute('label') ?? 'Text color';\n const value = child.getAttribute('value') ?? '#000000';\n // render internal <input type=\"color\">\n let input = child.querySelector(':scope > input[type=\"color\"]') as HTMLInputElement | null;\n if (!input) {\n input = document.createElement('input');\n input.type = 'color';\n child.appendChild(input);\n }\n input.title = label;\n input.value = value;\n input.addEventListener('mousedown', e => e.preventDefault());\n input.addEventListener('input', () => {\n this.focusAndRestore();\n setForeColor(this.editorEl, input!.value);\n this.updateContent(); this.updateToolbarState();\n });\n this.colorInput = input;\n }\n\n // nile-rte-divider: no-op (purely visual)\n });\n }\n\n // ---------- Selection helpers (for toolbar state only) ----------\n private onSelectionChange = () => {\n if (!this.editorEl) return;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (this.editorEl.contains(range.commonAncestorContainer)) {\n this.lastRange = range.cloneRange();\n this.updateToolbarState();\n }\n };\n private saveSelection() {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) this.lastRange = sel.getRangeAt(0).cloneRange();\n }\n private restoreSelection() {\n if (!this.lastRange) return;\n const sel = document.getSelection(); if (!sel) return;\n sel.removeAllRanges(); sel.addRange(this.lastRange);\n }\n private focusAndRestore() { this.editorEl?.focus(); this.restoreSelection(); }\n\n /*──────────────────────── LIST HELPERS ────────────────────────*/\nprivate insertList(type: 'ul' | 'ol') {\n this.restoreSelection();\n if (!this.lastRange) return;\n\n // build <ul>/<ol>\n const list = document.createElement(type);\n\n // grab the selected fragment\n const frag = this.lastRange.extractContents();\n const temp = document.createElement('div');\n temp.appendChild(frag);\n\n // wrap each top-level node in an <li>\n Array.from(temp.childNodes).forEach(n => {\n // skip empty whitespace text nodes\n if (n.nodeType === Node.TEXT_NODE && !n.textContent?.trim()) return;\n const li = document.createElement('li');\n li.appendChild(n); // moves the node!\n list.appendChild(li);\n });\n\n // insert list where the selection was\n this.lastRange.insertNode(list);\n this.afterListEdit(list);\n}\n\nprivate afterListEdit(node: Node) {\n const range = document.createRange();\n range.setStartAfter(node);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n\n this.saveSelection();\n this.updateContent();\n this.updateToolbarState();\n}\n // Keep at least one <p><br></p> and wrap stray inline/text into a <p>\nprivate ensureAtLeastOneParagraph() {\n const el = this.editorEl;\n if (!el) return;\n\n // 1) If completely empty → seed a paragraph\n const onlyWhitespace =\n (el.textContent ?? '').replace(/\\u200B/g, '').trim() === '';\n if (el.childNodes.length === 0 || onlyWhitespace) {\n el.innerHTML = '<p><br></p>';\n return;\n }\n\n // 2) If no block elements exist, wrap whatever is there into a <p>\n const hasBlock = el.querySelector('p,h1,h2,h3,h4,h5,h6,ul,ol,table,blockquote,pre');\n if (!hasBlock) {\n const p = document.createElement('p');\n while (el.firstChild) p.appendChild(el.firstChild);\n if (!p.hasChildNodes()) p.appendChild(document.createElement('br'));\n el.appendChild(p);\n return;\n }\n\n // 3) Make sure the first/only empty <p> still has a <br>\n el.querySelectorAll('p').forEach(p => {\n if ((p.textContent ?? '').replace(/\\u200B/g, '') === '') {\n if (!p.innerHTML.toLowerCase().includes('<br')) p.innerHTML = '<br>';\n }\n });\n}\n\n\n\n // ---------- Toolbar/commands ----------\n private onToolbarCommand(cmd: string) {\n this.focusAndRestore();\n switch (cmd) {\n case 'bold': toggleInlineTag(this.editorEl, 'strong'); break;\n case 'italic': toggleInlineTag(this.editorEl, 'em'); break;\n case 'underline': toggleInlineTag(this.editorEl, 'u'); break;\n case 'left': setAlignment(this.editorEl, 'left'); break;\n case 'center': setAlignment(this.editorEl, 'center'); break;\n case 'right': setAlignment(this.editorEl, 'right'); break;\n case 'justify': setAlignment(this.editorEl, 'justify'); break;\n case 'ul': this.insertList('ul'); break;\n case 'ol': this.insertList('ol'); break;\n case 'link': insertOrEditLink(this.editorEl); break;\n case 'clear':\n const walker = document.createTreeWalker(this.editorEl, NodeFilter.SHOW_ELEMENT);\n const toUnwrap: HTMLElement[] = [];\n while (walker.nextNode()) {\n const el = walker.currentNode as HTMLElement;\n el.removeAttribute('style');\n if (['B','STRONG','I','EM','U','SPAN','FONT'].includes(el.tagName)) {\n toUnwrap.push(el);\n }\n }\n for (const el of toUnwrap) {\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\n el.remove();\n }\n this.ensureAtLeastOneParagraph();\n break;\n\n default: break;\n }\n this.updateContent(); this.updateToolbarState();\n }\n\n private setBtnActive(cmd: string, active: boolean) {\n const arr = this.buttonMap.get(cmd); if (!arr) return;\n for (const btn of arr) btn.toggleAttribute('data-active', !!active);\n }\n\n private updateToolbarState() {\n if (!this.editorEl) return;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!this.editorEl.contains(range.commonAncestorContainer)) return;\n\n const startElm = nearestElement(range.startContainer) || this.editorEl;\n const comp = getComputedStyle(startElm);\n const block = closestBlock(range.startContainer, this.editorEl) || this.editorEl;\n\n const isBold = (() => {\n let n: Node | null = startElm;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLElement) {\n const t = n.tagName.toLowerCase();\n if (t === 'strong' || t === 'b') return true;\n const w = getComputedStyle(n).fontWeight;\n if (parseInt(w, 10) >= 600) return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n\n const isItalic = (() => {\n let n: Node | null = startElm;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLElement) {\n const t = n.tagName.toLowerCase();\n if (t === 'em' || t === 'i') return true;\n if (getComputedStyle(n).fontStyle === 'italic') return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n\n const isUnderline = (() => {\n let n: Node | null = startElm;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLElement) {\n const tdl = getComputedStyle(n).textDecorationLine;\n if (tdl && tdl.includes('underline')) return true;\n if (n.tagName.toLowerCase() === 'u') return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n\n const inLink = !!startElm.closest('a');\n\n const align = (block.style.textAlign || getComputedStyle(block).textAlign || 'start') as string;\n const alignNorm = align === 'start' ? 'left' : align;\n\n const inLi = !!startElm.closest('li');\n const listType = inLi ? (startElm.closest('ul,ol')?.tagName.toLowerCase() || '') : '';\n\n this.setBtnActive('bold', isBold);\n this.setBtnActive('italic', isItalic);\n this.setBtnActive('underline', isUnderline);\n this.setBtnActive('link', inLink);\n\n this.setBtnActive('left', alignNorm === 'left' && !['center','right','justify'].includes(alignNorm));\n this.setBtnActive('center', alignNorm === 'center');\n this.setBtnActive('right', alignNorm === 'right');\n this.setBtnActive('justify', alignNorm === 'justify');\n\n this.setBtnActive('ul', listType === 'ul');\n this.setBtnActive('ol', listType === 'ol');\n\n // Reflect heading\n if (this.headingSelect) {\n const tag = block.tagName.toLowerCase();\n const v = ['h1','h2','h3'].includes(tag) ? tag : 'p';\n if (this.headingSelect.value !== v) this.headingSelect.value = v;\n }\n\n // Reflect font family\n if (this.fontSelect) {\n const ff = (comp.fontFamily || '').replace(/[\"']/g, '').split(',')[0].trim().toLowerCase();\n if (ff) {\n for (const opt of Array.from(this.fontSelect.options)) {\n if (opt.value.toLowerCase() === ff) { this.fontSelect.value = opt.value; break; }\n }\n }\n }\n\n // Reflect color\n if (this.colorInput) {\n const hex = rgbToHex(comp.color);\n if (hex && this.colorInput.value.toLowerCase() !== hex.toLowerCase()) {\n this.colorInput.value = hex;\n }\n }\n }\n\n private syncPreview() {\n this.updateContent();\n }\n\n private updateContent() {\n if (!this.editorEl) return;\n this.ensureAtLeastOneParagraph();\n this.content = this.editorEl.innerHTML;\n\n // live preview on the authored node (kept in place)\n if (this.previewEl) this.previewEl.innerHTML = this.content;\n\n this.dispatchEvent(new CustomEvent('content-changed', {\n detail: { content: this.content }, bubbles: true, composed: true\n }));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rich-text-editor': NileRichTextEditor;\n }\n}\n\n"]}
1
+ {"version":3,"file":"nile-rich-text-editor.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rich-text-editor.ts"],"names":[],"mappings":"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","sourcesContent":["// nile-rich-text-editor.ts\nimport { LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport './nile-rte-toolbar';\nimport './nile-rte-toolbar-item';\nimport './nile-rte-select';\nimport './nile-rte-color';\nimport './nile-rte-divider';\nimport './nile-rte-preview';\nimport './nile-rte-mentions';\n\nimport {\n closestBlock, nearestElement, rgbToHex,\n toggleInlineTag, setBlockTag, setAlignment,\n setFontFamily, setForeColor, insertOrEditLink, setBackColor\n} from './utils';\n\nimport {styles} from './nile-rich-text-editor.css'; \n\ntype MentionsConfig = Record<string, { key: string; label: string }[]>;\n\n/**\n * Map commands → default icon names from your <nile-icon> set.\n * Adjust values to match the real names you have.\n */\nconst DEFAULT_ICONS: Record<string, string> = {\n bold: 'nile-bold',\n italic: 'nile-italic',\n underline: 'nile-underline',\n link: 'user',\n left: 'nile-leftalign',\n center: 'nile-centeralign',\n right: 'nile-rightalign',\n justify: 'nile-justify',\n ul: 'nile-ul',\n ol: 'nile-ol',\n clear: 'error',\n};\n\n@customElement('nile-rich-text-editor')\nexport class NileRichTextEditor extends LitElement {\n protected createRenderRoot() { return this; } \n protected shouldUpdate() { return false; } \n\n /** Initial HTML content */\n @property({ type: String }) value = '';\n\n /** Optional mentions config (can also be on <nile-rte-mentions mentions=\"...\">) */\n @property({\n attribute: 'mentions',\n converter: {\n fromAttribute: (value: string): MentionsConfig => {\n try {\n const parsed = JSON.parse(value);\n const out: MentionsConfig = {};\n for (const trig of Object.keys(parsed)) {\n const arr = parsed[trig];\n if (Array.isArray(arr)) {\n out[trig] = arr\n .filter(i => i && typeof i.key === 'string' && typeof i.label === 'string')\n .map(i => ({ key: i.key, label: i.label }));\n }\n }\n return out;\n } catch { return {}; }\n },\n toAttribute: (v: MentionsConfig) => JSON.stringify(v),\n }\n })\n mentions: MentionsConfig = {};\n\n // ----- internal state (no Lit render) -----\n @state() private content = '';\n private editorEl!: HTMLElement;\n private previewEl: HTMLElement | null = null;\n private toolbarEl: HTMLElement | null = null;\n\n private lastRange: Range | null = null;\n\n // map for button active reflections\n private buttonMap = new Map<string, HTMLElement[]>();\n private headingSelect: HTMLSelectElement | null = null;\n private fontSelect: HTMLSelectElement | null = null;\n private colorInput: HTMLInputElement | null = null;\nprivate bgColorInput: HTMLInputElement | null = null; \nprivate colorSwatchEl: HTMLElement | null = null; \nprivate bgSwatchEl: HTMLElement | null = null; \n\n\n // Mentions controller (child)\n private mentionsEl: HTMLElement | null = null;\n\n \n\n private injectCss(cssText: string) {\n if (this.querySelector('style[data-rte-style]')) return;\n const style = document.createElement('style');\n style.setAttribute('data-rte-style', 'true');\n style.textContent = cssText;\n this.insertBefore(style, this.firstChild);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n \n this.injectCss(styles.cssText); \n \n\n \n this.toolbarEl = this.querySelector('nile-rte-toolbar');\n this.previewEl = this.querySelector('nile-rte-preview');\n\n \n this.ensureEditor();\n\n \n if (this.value && !this.editorEl.innerHTML.trim()) {\n this.editorEl.innerHTML = this.value;\n }\n this.content = this.editorEl.innerHTML;\n\n \n if (this.toolbarEl) this.wireAuthoredToolbar(this.toolbarEl);\n\n \n this.mentionsEl = this.querySelector('nile-rte-mentions');\n if (this.mentionsEl) {\n \n (this.mentionsEl as any).attach?.(this.editorEl, this as HTMLElement);\n \n (this.mentionsEl as any).setExternalConfig?.(this.mentions);\n }\n\n \n this.wireEditor();\n\n \n this.updateToolbarState();\n this.syncPreview();\n\n \n document.addEventListener('selectionchange', this.onSelectionChange, true);\n }\n\n disconnectedCallback(): void {\n document.removeEventListener('selectionchange', this.onSelectionChange, true);\n \n if (this.mentionsEl && (this.mentionsEl as any).detach) {\n (this.mentionsEl as any).detach();\n }\n super.disconnectedCallback();\n }\n\n \n \n\n private ensureEditor() {\n this.editorEl = this.querySelector('.editor') as HTMLElement;\n if (!this.editorEl) {\n const editor = document.createElement('div');\n editor.className = 'editor';\n editor.setAttribute('contenteditable','true');\n if (this.toolbarEl?.nextSibling) {\n this.insertBefore(editor, this.toolbarEl.nextSibling);\n } else if (this.previewEl) {\n this.insertBefore(editor, this.previewEl);\n } else {\n this.appendChild(editor);\n }\n this.editorEl = editor;\n }\n if (!this.editorEl.innerHTML.trim()) {\n this.editorEl.innerHTML = '<p><br></p>';\n }\n this.ensureAtLeastOneParagraph();\n }\n\n private wireEditor() {\n // Input & selection preservation\n this.editorEl.addEventListener('input', () => { \n this.ensureAtLeastOneParagraph();\n this.updateContent();\n });\n this.editorEl.addEventListener('mouseup', () => this.saveSelection());\n this.editorEl.addEventListener('keyup', () => this.saveSelection()); \n }\n\n private wireAuthoredToolbar(tb: HTMLElement) {\n \n this.buttonMap.clear();\n this.headingSelect = null;\n this.fontSelect = null;\n this.colorInput = null;\n\n \n Array.from(tb.children).forEach(child => {\n const tag = child.tagName.toLowerCase();\n\n if (tag === 'nile-rte-select' && child.getAttribute('type') === 'align') {\n child.addEventListener('change', (e: any) => {\n this.focusAndRestore();\n const alignment = e.detail as 'left'|'center'|'right'|'justify';\n setAlignment(this.editorEl, alignment);\n this.updateContent();\n this.updateToolbarState();\n });\n return;\n }\n \n\n if (tag === 'nile-rte-toolbar-item') {\n \n let btn = child.querySelector(':scope > nile-button') as HTMLElement | null;\n \n const cmd = child.getAttribute('name') || '';\n const label = child.getAttribute('label') || cmd;\n const iconAttr = child.getAttribute('icon');\n const authoredHasContent = child.innerHTML.trim().length > 0;\n \n \n if (!btn) {\n btn = document.createElement('nile-button');\n (btn as any).variant = 'tertiary';\n (btn as any).size = 'small'; // optional\n }\n \n \n if (iconAttr) {\n btn.innerHTML = `<nile-icon name=\"${iconAttr}\" aria-label=\"${label}\"></nile-icon>`;\n child.innerHTML = '';\n } else if (!authoredHasContent) {\n const defaultIcon = DEFAULT_ICONS[cmd];\n if (defaultIcon) {\n btn.innerHTML = `<nile-icon name=\"${defaultIcon}\" size=\"20\" color=\"black\" aria-label=\"${label}\"></nile-icon>`;\n } else {\n btn.textContent = label || cmd;\n }\n child.innerHTML = '';\n } else {\n // Author provided custom content (could be a <nile-icon> already)\n btn.innerHTML = child.innerHTML;\n child.innerHTML = '';\n }\n \n // Mount it\n if (!btn.isConnected) child.appendChild(btn);\n \n // Interactions\n btn.setAttribute('aria-label', label);\n btn.addEventListener('mousedown', e => e.preventDefault());\n btn.addEventListener('click', () => this.onToolbarCommand(cmd));\n \n // Register for active reflection\n const arr = this.buttonMap.get(cmd) ?? [];\n arr.push(btn);\n this.buttonMap.set(cmd, arr);\n \n return; // done with this child\n }\n if (tag === 'nile-rte-select') {\n const type = child.getAttribute('type') || '';\n\n // listen for our custom dropdown’s change event\n child.addEventListener('change', (e: any) => {\n // restore focus & selection\n this.focusAndRestore();\n\n const val = e.detail as string;\n\n if (type === 'heading') {\n // apply block tag\n setBlockTag(this.editorEl, val as any);\n }\n else if (type === 'font') {\n setFontFamily(this.editorEl, val);\n }\n \n // update the editor content & toolbar UI\n this.updateContent();\n this.updateToolbarState();\n });\n\n // nothing else to inject into the DOM\n return;\n }\n \n\n if (tag === 'nile-rte-color') {\n const label = child.getAttribute('label') ?? 'Text color';\n const value = child.getAttribute('value') ?? '#000000';\n const mode = child.getAttribute('mode') ?? 'text'; // 'text' | 'background'\n \n // Create/attach the hidden color input\n let input = child.querySelector(':scope > input[type=\"color\"]') as HTMLInputElement | null;\n if (!input) {\n input = document.createElement('input');\n input.type = 'color';\n input.style.position = 'absolute';\n input.style.opacity = '0';\n input.style.pointerEvents = 'none'; // we'll click it programmatically\n child.appendChild(input);\n }\n input.title = label;\n input.value = value;\n \n // Build a custom trigger that shows the current color\n let trigger = child.querySelector(':scope > button.rte-color-trigger') as HTMLButtonElement | null;\n if (!trigger) {\n trigger = document.createElement('button');\n trigger.type = 'button';\n trigger.className = 'rte-color-trigger';\n trigger.setAttribute('aria-label', label);\n \n if (mode === 'background') {\n trigger.innerHTML = `\n <span class=\"swatch-box\" aria-hidden=\"true\"></span>\n `;\n } else {\n trigger.innerHTML = `\n <span class=\"glyph-stack\" aria-hidden=\"true\">\n <span class=\"glyph\">A</span>\n <span class=\"underline\"></span>\n </span>\n `;\n }\n child.appendChild(trigger);\n }\n \n // Cache swatch elements to update later\n const underline = trigger.querySelector('.underline') as HTMLElement | null;\n const square = trigger.querySelector('.swatch-box') as HTMLElement | null;\n \n if (mode === 'background') {\n this.bgColorInput = input;\n this.bgSwatchEl = square;\n if (this.bgSwatchEl) this.bgSwatchEl.style.backgroundColor = input.value;\n } else {\n this.colorInput = input;\n this.colorSwatchEl = underline;\n if (this.colorSwatchEl) this.colorSwatchEl.style.backgroundColor = input.value;\n }\n \n // Open native picker on trigger click\n trigger.addEventListener('click', (e) => {\n e.preventDefault();\n // Keep selection before opening the picker\n this.focusAndRestore();\n input!.click();\n });\n \n // When the user picks a color, apply it + update swatch\n input.addEventListener('input', () => {\n this.focusAndRestore();\n if (mode === 'background') {\n setBackColor(this.editorEl, input!.value);\n if (this.bgSwatchEl) this.bgSwatchEl.style.backgroundColor = input!.value;\n } else {\n setForeColor(this.editorEl, input!.value);\n if (this.colorSwatchEl) this.colorSwatchEl.style.backgroundColor = input!.value;\n }\n this.updateContent();\n this.updateToolbarState();\n });\n \n // Prevent losing selection when interacting\n trigger.addEventListener('mousedown', e => e.preventDefault());\n input.addEventListener('mousedown', e => e.preventDefault());\n }\n });\n }\n private onSelectionChange = () => {\n if (!this.editorEl) return;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (this.editorEl.contains(range.commonAncestorContainer)) {\n this.lastRange = range.cloneRange();\n this.updateToolbarState();\n }\n };\n private saveSelection() {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) this.lastRange = sel.getRangeAt(0).cloneRange();\n }\n private restoreSelection() {\n if (!this.lastRange) return;\n const sel = document.getSelection(); if (!sel) return;\n sel.removeAllRanges(); sel.addRange(this.lastRange);\n }\n private focusAndRestore() { this.editorEl?.focus(); this.restoreSelection(); }\n\n /*──────────────────────── LIST HELPERS ────────────────────────*/\nprivate insertList(type: 'ul' | 'ol') {\n this.restoreSelection();\n if (!this.lastRange) return;\n\n // build <ul>/<ol>\n const list = document.createElement(type);\n\n // grab the selected fragment\n const frag = this.lastRange.extractContents();\n const temp = document.createElement('div');\n temp.appendChild(frag);\n\n // wrap each top-level node in an <li>\n Array.from(temp.childNodes).forEach(n => {\n // skip empty whitespace text nodes\n if (n.nodeType === Node.TEXT_NODE && !n.textContent?.trim()) return;\n const li = document.createElement('li');\n li.appendChild(n); // moves the node!\n list.appendChild(li);\n });\n\n // insert list where the selection was\n this.lastRange.insertNode(list);\n this.afterListEdit(list);\n}\n\nprivate afterListEdit(node: Node) {\n const range = document.createRange();\n range.setStartAfter(node);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n\n this.saveSelection();\n this.updateContent();\n this.updateToolbarState();\n}\n // Keep at least one <p><br></p> and wrap stray inline/text into a <p>\nprivate ensureAtLeastOneParagraph() {\n const el = this.editorEl;\n if (!el) return;\n\n // 1) If completely empty → seed a paragraph\n const onlyWhitespace =\n (el.textContent ?? '').replace(/\\u200B/g, '').trim() === '';\n if (el.childNodes.length === 0 || onlyWhitespace) {\n el.innerHTML = '<p><br></p>';\n return;\n }\n\n // 2) If no block elements exist, wrap whatever is there into a <p>\n const hasBlock = el.querySelector('p,h1,h2,h3,h4,h5,h6,ul,ol,table,blockquote,pre');\n if (!hasBlock) {\n const p = document.createElement('p');\n while (el.firstChild) p.appendChild(el.firstChild);\n if (!p.hasChildNodes()) p.appendChild(document.createElement('br'));\n el.appendChild(p);\n return;\n }\n\n // 3) Make sure the first/only empty <p> still has a <br>\n el.querySelectorAll('p').forEach(p => {\n if ((p.textContent ?? '').replace(/\\u200B/g, '') === '') {\n if (!p.innerHTML.toLowerCase().includes('<br')) p.innerHTML = '<br>';\n }\n });\n}\n\n\n\n // ---------- Toolbar/commands ----------\n private onToolbarCommand(cmd: string) {\n this.focusAndRestore();\n switch (cmd) {\n case 'bold': toggleInlineTag(this.editorEl, 'strong'); break;\n case 'italic': toggleInlineTag(this.editorEl, 'em'); break;\n case 'underline': toggleInlineTag(this.editorEl, 'u'); break;\n case 'left': setAlignment(this.editorEl, 'left'); break;\n case 'center': setAlignment(this.editorEl, 'center'); break;\n case 'right': setAlignment(this.editorEl, 'right'); break;\n case 'justify': setAlignment(this.editorEl, 'justify'); break;\n case 'ul': this.insertList('ul'); break;\n case 'ol': this.insertList('ol'); break;\n case 'link': insertOrEditLink(this.editorEl); break;\n case 'clear':\n const walker = document.createTreeWalker(this.editorEl, NodeFilter.SHOW_ELEMENT);\n const toUnwrap: HTMLElement[] = [];\n while (walker.nextNode()) {\n const el = walker.currentNode as HTMLElement;\n el.removeAttribute('style');\n if (['B','STRONG','I','EM','U','SPAN','FONT'].includes(el.tagName)) {\n toUnwrap.push(el);\n }\n }\n for (const el of toUnwrap) {\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\n el.remove();\n }\n this.ensureAtLeastOneParagraph();\n break;\n\n default: break;\n }\n this.updateContent(); this.updateToolbarState();\n }\n\n private setBtnActive(cmd: string, active: boolean) {\n const arr = this.buttonMap.get(cmd); if (!arr) return;\n for (const btn of arr) btn.toggleAttribute('data-active', !!active);\n }\n\n private updateToolbarState() {\n if (!this.editorEl) return;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!this.editorEl.contains(range.commonAncestorContainer)) return;\n\n const startElm = nearestElement(range.startContainer) || this.editorEl;\n const comp = getComputedStyle(startElm);\n const block = closestBlock(range.startContainer, this.editorEl) || this.editorEl;\n\n const isBold = (() => {\n let n: Node | null = startElm;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLElement) {\n const t = n.tagName.toLowerCase();\n if (t === 'strong' || t === 'b') return true;\n const w = getComputedStyle(n).fontWeight;\n if (parseInt(w, 10) >= 600) return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n\n const isItalic = (() => {\n let n: Node | null = startElm;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLElement) {\n const t = n.tagName.toLowerCase();\n if (t === 'em' || t === 'i') return true;\n if (getComputedStyle(n).fontStyle === 'italic') return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n\n const isUnderline = (() => {\n let n: Node | null = startElm;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLElement) {\n const tdl = getComputedStyle(n).textDecorationLine;\n if (tdl && tdl.includes('underline')) return true;\n if (n.tagName.toLowerCase() === 'u') return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n\n const inLink = !!startElm.closest('a');\n\n const align = (block.style.textAlign || getComputedStyle(block).textAlign || 'start') as string;\n const alignNorm = align === 'start' ? 'left' : align;\n\n const inLi = !!startElm.closest('li');\n const listType = inLi ? (startElm.closest('ul,ol')?.tagName.toLowerCase() || '') : '';\n\n this.setBtnActive('bold', isBold);\n this.setBtnActive('italic', isItalic);\n this.setBtnActive('underline', isUnderline);\n this.setBtnActive('link', inLink);\n\n this.setBtnActive('left', alignNorm === 'left' && !['center','right','justify'].includes(alignNorm));\n this.setBtnActive('center', alignNorm === 'center');\n this.setBtnActive('right', alignNorm === 'right');\n this.setBtnActive('justify', alignNorm === 'justify');\n\n this.setBtnActive('ul', listType === 'ul');\n this.setBtnActive('ol', listType === 'ol');\n\n // Reflect heading\n if (this.headingSelect) {\n const tag = block.tagName.toLowerCase();\n const v = ['h1','h2','h3'].includes(tag) ? tag : 'p';\n if (this.headingSelect.value !== v) this.headingSelect.value = v;\n }\n\n // Reflect font family\n if (this.fontSelect) {\n const ff = (comp.fontFamily || '').replace(/[\"']/g, '').split(',')[0].trim().toLowerCase();\n if (ff) {\n for (const opt of Array.from(this.fontSelect.options)) {\n if (opt.value.toLowerCase() === ff) { this.fontSelect.value = opt.value; break; }\n }\n }\n }\n\n if (this.colorInput) {\n const hex = rgbToHex(comp.color);\n if (hex && this.colorInput.value.toLowerCase() !== hex.toLowerCase()) {\n this.colorInput.value = hex;\n }\n if (this.colorSwatchEl) this.colorSwatchEl.style.backgroundColor = this.colorInput.value;\n }\n \n\n if (this.bgColorInput) {\n const bg = getComputedStyle(startElm).backgroundColor;\n if (bg && !/transparent|rgba\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/i.test(bg)) {\n const bgHex = rgbToHex(bg);\n if (bgHex && this.bgColorInput.value.toLowerCase() !== bgHex.toLowerCase()) {\n this.bgColorInput.value = bgHex;\n }\n }\n if (this.bgSwatchEl) this.bgSwatchEl.style.backgroundColor = this.bgColorInput.value;\n }\n }\n\n private syncPreview() {\n this.updateContent();\n }\n\n private updateContent() {\n if (!this.editorEl) return;\n this.ensureAtLeastOneParagraph();\n this.content = this.editorEl.innerHTML;\n\n // live preview on the authored node (kept in place)\n if (this.previewEl) this.previewEl.innerHTML = this.content;\n\n this.dispatchEvent(new CustomEvent('content-changed', {\n detail: { content: this.content }, bubbles: true, composed: true\n }));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rich-text-editor': NileRichTextEditor;\n }\n}\n\n"]}
@@ -188,6 +188,10 @@ let NileRteMentions = class NileRteMentions extends LitElement {
188
188
  .mention-dropdown li { padding: 6px 8px; cursor: pointer; border-radius: 4px; }
189
189
  .mention-dropdown li:hover { background: #f1f5f9; }
190
190
  .mention { background: #eef2ff; padding: 0 3px; border-radius: 3px; }
191
+ nile-menu.mentions-menu::part(menu__items-wrapper){
192
+ max-height: 260px;
193
+ }
194
+
191
195
  `;
192
196
  this.insertBefore(style, this.firstChild);
193
197
  }
@@ -212,6 +216,7 @@ let NileRteMentions = class NileRteMentions extends LitElement {
212
216
  dd.appendChild(btn);
213
217
  this.triggerBtn = btn;
214
218
  const menu = document.createElement('nile-menu');
219
+ menu.classList.add('mentions-menu');
215
220
  dd.appendChild(menu);
216
221
  this.hostEl.appendChild(dd);
217
222
  this.dropdownEl = dd;