@aquera/nile-elements 1.2.1-beta-1.5 → 1.2.1-beta-1.7

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 (43) hide show
  1. package/demo/index.html +83 -100
  2. package/demo/variables.css +2 -3
  3. package/dist/index.js +369 -657
  4. package/dist/nile-calendar/nile-calendar.cjs.js +1 -1
  5. package/dist/nile-calendar/nile-calendar.cjs.js.map +1 -1
  6. package/dist/nile-calendar/nile-calendar.css.cjs.js +1 -1
  7. package/dist/nile-calendar/nile-calendar.css.cjs.js.map +1 -1
  8. package/dist/nile-calendar/nile-calendar.css.esm.js +38 -221
  9. package/dist/nile-calendar/nile-calendar.esm.js +98 -204
  10. package/dist/nile-select/nile-select.cjs.js +1 -1
  11. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  12. package/dist/nile-select/nile-select.esm.js +4 -4
  13. package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
  14. package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
  15. package/dist/nile-select/virtual-scroll-helper.esm.js +1 -0
  16. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
  17. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  18. package/dist/nile-virtual-select/nile-virtual-select.esm.js +1 -1
  19. package/dist/src/nile-calendar/nile-calendar.css.js +36 -219
  20. package/dist/src/nile-calendar/nile-calendar.css.js.map +1 -1
  21. package/dist/src/nile-calendar/nile-calendar.d.ts +0 -15
  22. package/dist/src/nile-calendar/nile-calendar.js +93 -318
  23. package/dist/src/nile-calendar/nile-calendar.js.map +1 -1
  24. package/dist/src/nile-rich-text-editor/utils.d.ts +0 -13
  25. package/dist/src/nile-rich-text-editor/utils.js +1 -537
  26. package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
  27. package/dist/src/nile-select/nile-select.d.ts +1 -0
  28. package/dist/src/nile-select/nile-select.js +30 -9
  29. package/dist/src/nile-select/nile-select.js.map +1 -1
  30. package/dist/src/nile-select/virtual-scroll-helper.js +1 -0
  31. package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
  32. package/dist/src/nile-virtual-select/nile-virtual-select.js +1 -0
  33. package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
  34. package/dist/src/version.js +1 -1
  35. package/dist/src/version.js.map +1 -1
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/src/nile-calendar/nile-calendar.css.ts +36 -219
  39. package/src/nile-calendar/nile-calendar.ts +106 -343
  40. package/src/nile-select/nile-select.ts +25 -15
  41. package/src/nile-select/virtual-scroll-helper.ts +2 -0
  42. package/src/nile-virtual-select/nile-virtual-select.ts +1 -0
  43. package/vscode-html-custom-data.json +17 -41
@@ -1,538 +1,2 @@
1
- export function closestBlock(node, root) {
2
- while (node && node !== root) {
3
- if (node instanceof HTMLElement) {
4
- const display = getComputedStyle(node).display;
5
- if (node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) ||
6
- display === 'block' ||
7
- display === 'list-item') {
8
- return node;
9
- }
10
- }
11
- node = node?.parentNode || null;
12
- }
13
- return root;
14
- }
15
- export function nearestElement(n) {
16
- while (n && !(n instanceof HTMLElement))
17
- n = n.parentNode;
18
- return n;
19
- }
20
- export function rgbToHex(rgb) {
21
- const m = rgb.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i);
22
- if (!m)
23
- return '#000000';
24
- const r = Number(m[1]).toString(16).padStart(2, '0');
25
- const g = Number(m[2]).toString(16).padStart(2, '0');
26
- const b = Number(m[3]).toString(16).padStart(2, '0');
27
- return `#${r}${g}${b}`;
28
- }
29
- export function unwrap(node) {
30
- const p = node.parentNode;
31
- if (!p)
32
- return;
33
- while (node.firstChild)
34
- p.insertBefore(node.firstChild, node);
35
- p.removeChild(node);
36
- }
37
- export function surroundInline(range, tag, attrs) {
38
- const wrap = document.createElement(tag);
39
- if (attrs)
40
- Object.entries(attrs).forEach(([k, v]) => wrap.setAttribute(k, v));
41
- try {
42
- range.surroundContents(wrap);
43
- }
44
- catch {
45
- const frag = range.extractContents();
46
- wrap.appendChild(frag);
47
- range.insertNode(wrap);
48
- }
49
- }
50
- function unwrapAllMatching(node, root, matcher) {
51
- let n = node.parentNode;
52
- while (n && n !== root) {
53
- if (n instanceof HTMLElement && matcher(n)) {
54
- unwrap(n);
55
- n = node.parentNode;
56
- continue;
57
- }
58
- n = n.parentNode;
59
- }
60
- }
61
- export function toggleInlineTag(root, tag, attrs) {
62
- const sel = document.getSelection();
63
- if (!sel || sel.rangeCount === 0) {
64
- return;
65
- }
66
- const range = sel.getRangeAt(0);
67
- const aliases = {
68
- strong: ['strong', 'b'],
69
- em: ['em', 'i'],
70
- u: ['u'],
71
- span: ['span'],
72
- };
73
- const candidates = aliases[tag] ?? [tag];
74
- function isMatchingInline(el) {
75
- return candidates.includes(el.tagName.toLowerCase());
76
- }
77
- if (range.collapsed) {
78
- let n = range.startContainer;
79
- while (n && n !== root) {
80
- if (n instanceof HTMLElement && isMatchingInline(n)) {
81
- unwrapAllMatching(range.startContainer, root, isMatchingInline);
82
- return;
83
- }
84
- n = n.parentNode;
85
- }
86
- const elm = document.createElement(tag);
87
- if (attrs)
88
- Object.entries(attrs).forEach(([k, v]) => elm.setAttribute(k, v));
89
- elm.appendChild(document.createTextNode('\u200b'));
90
- range.insertNode(elm);
91
- const r = document.createRange();
92
- r.setStart(elm.firstChild, 1);
93
- r.collapse(true);
94
- sel.removeAllRanges();
95
- sel.addRange(r);
96
- return;
97
- }
98
- const startBlock = closestBlock(range.startContainer, root);
99
- const endBlock = closestBlock(range.endContainer, root);
100
- if (startBlock && endBlock && startBlock !== endBlock) {
101
- const blocks = [];
102
- let node = startBlock;
103
- while (node) {
104
- if (node instanceof HTMLElement)
105
- blocks.push(node);
106
- if (node === endBlock)
107
- break;
108
- node = node.nextSibling;
109
- }
110
- blocks.forEach((block, i) => {
111
- const r = document.createRange();
112
- r.selectNodeContents(block);
113
- const textNodes = [];
114
- const tw = document.createTreeWalker(block, NodeFilter.SHOW_TEXT, null);
115
- let tn;
116
- while ((tn = tw.nextNode())) {
117
- if (tn.nodeValue?.trim())
118
- textNodes.push(tn);
119
- }
120
- const allWrapped = textNodes.length > 0 &&
121
- textNodes.every(txt => {
122
- let n = txt;
123
- while (n && n !== block) {
124
- if (n instanceof HTMLElement && isMatchingInline(n))
125
- return true;
126
- n = n.parentNode;
127
- }
128
- return false;
129
- });
130
- if (allWrapped) {
131
- textNodes.forEach(txt => unwrapAllMatching(txt, block, isMatchingInline));
132
- }
133
- else {
134
- surroundInline(r, tag, attrs);
135
- }
136
- });
137
- return;
138
- }
139
- const walker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_TEXT, {
140
- acceptNode: n => {
141
- if (!n.nodeValue || !n.nodeValue.trim())
142
- return NodeFilter.FILTER_REJECT;
143
- const nodeRange = document.createRange();
144
- nodeRange.selectNodeContents(n);
145
- const intersects = range.compareBoundaryPoints(Range.END_TO_START, nodeRange) <= 0 &&
146
- range.compareBoundaryPoints(Range.START_TO_END, nodeRange) >= 0;
147
- return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
148
- },
149
- });
150
- const textNodes = [];
151
- let t;
152
- while ((t = walker.nextNode()))
153
- textNodes.push(t);
154
- if (textNodes.length === 0) {
155
- let n = range.startContainer;
156
- while (n && n !== root) {
157
- if (n instanceof HTMLElement && isMatchingInline(n)) {
158
- unwrapAllMatching(range.startContainer, root, isMatchingInline);
159
- return;
160
- }
161
- n = n.parentNode;
162
- }
163
- }
164
- const allWrapped = textNodes.length > 0 &&
165
- textNodes.every(txt => {
166
- let n = txt;
167
- while (n && n !== root) {
168
- if (n instanceof HTMLElement && isMatchingInline(n)) {
169
- return true;
170
- }
171
- n = n.parentNode;
172
- }
173
- return false;
174
- });
175
- if (allWrapped) {
176
- textNodes.forEach(txt => unwrapAllMatching(txt, root, isMatchingInline));
177
- }
178
- else {
179
- surroundInline(range, tag, attrs);
180
- }
181
- // restore selection
182
- const selRange = document.createRange();
183
- selRange.setStart(range.startContainer, range.startOffset);
184
- selRange.setEnd(range.endContainer, range.endOffset);
185
- sel.removeAllRanges();
186
- sel.addRange(selRange);
187
- }
188
- export function setBlockTag(root, tag) {
189
- const sel = document.getSelection();
190
- if (!sel || sel.rangeCount === 0)
191
- return;
192
- const range = sel.getRangeAt(0);
193
- const block = closestBlock(range.startContainer, root);
194
- if (!block)
195
- return;
196
- if (block.tagName.toLowerCase() === tag)
197
- return;
198
- const nb = document.createElement(tag);
199
- while (block.firstChild)
200
- nb.appendChild(block.firstChild);
201
- block.replaceWith(nb);
202
- const r = document.createRange();
203
- r.selectNodeContents(nb);
204
- r.collapse(true);
205
- sel.removeAllRanges();
206
- sel.addRange(r);
207
- }
208
- export function setAlignment(root, align) {
209
- const sel = document.getSelection();
210
- if (!sel || sel.rangeCount === 0)
211
- return;
212
- const range = sel.getRangeAt(0);
213
- let block = closestBlock(range.startContainer, root);
214
- if (!block)
215
- return;
216
- if (block.tagName.toLowerCase() === 'li') {
217
- block.style.textAlign = align;
218
- const list = block.closest('ul,ol');
219
- if (list)
220
- list.style.textAlign = align;
221
- }
222
- else {
223
- block.style.textAlign = align === 'justify' ? 'justify' : align;
224
- }
225
- }
226
- export function setFontFamily(root, family) {
227
- const sel = document.getSelection();
228
- if (!sel || sel.rangeCount === 0)
229
- return;
230
- const range = sel.getRangeAt(0);
231
- if (range.collapsed) {
232
- const span = document.createElement('span');
233
- span.style.fontFamily = family;
234
- span.appendChild(document.createTextNode('\u200b'));
235
- range.insertNode(span);
236
- const r = document.createRange();
237
- r.setStart(span.firstChild, 1);
238
- r.collapse(true);
239
- sel.removeAllRanges();
240
- sel.addRange(r);
241
- return;
242
- }
243
- surroundInline(range, 'span', { style: `font-family:${family}` });
244
- }
245
- function enclosingStyledSpan(editor, node, dataAttr) {
246
- while (node && node !== editor) {
247
- if (node instanceof HTMLSpanElement && node.hasAttribute(dataAttr)) {
248
- return node;
249
- }
250
- node = node.parentNode;
251
- }
252
- return null;
253
- }
254
- function applyInlineStyle(editor, cssProp, value, dataAttr) {
255
- const sel = window.getSelection();
256
- if (!sel || sel.rangeCount === 0)
257
- return;
258
- const r0 = sel.getRangeAt(0);
259
- if (!editor.contains(r0.commonAncestorContainer))
260
- return;
261
- const range = r0.cloneRange();
262
- if (range.collapsed) {
263
- const enclosing = enclosingStyledSpan(editor, range.startContainer, dataAttr);
264
- if (enclosing) {
265
- enclosing.style[cssProp] = value;
266
- mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
267
- return;
268
- }
269
- const s = document.createElement('span');
270
- s.setAttribute(dataAttr, '1');
271
- s.style[cssProp] = value;
272
- s.appendChild(document.createTextNode('\u200B'));
273
- range.insertNode(s);
274
- const caret = document.createRange();
275
- caret.setStart(s.firstChild, 1);
276
- caret.collapse(true);
277
- sel.removeAllRanges();
278
- sel.addRange(caret);
279
- mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
280
- return;
281
- }
282
- const leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);
283
- const rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);
284
- if (leftEdge && leftEdge === rightEdge) {
285
- if (rangeCoversWholeNode(range, leftEdge)) {
286
- leftEdge.style[cssProp] = value;
287
- }
288
- else {
289
- const mid = splitAndRecolorWithinSpan(leftEdge, range, dataAttr, cssProp, value);
290
- const sel = window.getSelection();
291
- const r = document.createRange();
292
- r.selectNodeContents(mid);
293
- sel?.removeAllRanges();
294
- sel?.addRange(r);
295
- }
296
- mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
297
- return;
298
- }
299
- const commonEl = (() => {
300
- let n = range.commonAncestorContainer;
301
- while (n && !(n instanceof HTMLElement))
302
- n = n.parentNode;
303
- return n;
304
- })();
305
- const walker = document.createTreeWalker(commonEl || editor, NodeFilter.SHOW_TEXT, {
306
- acceptNode: n => {
307
- if (!n.nodeValue || !n.nodeValue.trim())
308
- return NodeFilter.FILTER_REJECT;
309
- const nodeRange = document.createRange();
310
- nodeRange.selectNodeContents(n);
311
- const intersects = range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&
312
- range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0;
313
- return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
314
- },
315
- });
316
- const toProcess = [];
317
- let t;
318
- while ((t = walker.nextNode()))
319
- toProcess.push(t);
320
- toProcess.forEach(text => {
321
- let start = 0, end = text.length;
322
- if (text === range.startContainer)
323
- start = range.startOffset;
324
- if (text === range.endContainer)
325
- end = range.endOffset;
326
- if (start > 0)
327
- text = text.splitText(start);
328
- if (end < text.length)
329
- text.splitText(end);
330
- const existing = enclosingStyledSpan(editor, text, dataAttr);
331
- if (existing) {
332
- existing.style[cssProp] = value;
333
- return;
334
- }
335
- const span = document.createElement('span');
336
- span.setAttribute(dataAttr, '1');
337
- span.style[cssProp] = value;
338
- const parent = text.parentElement;
339
- parent.replaceChild(span, text);
340
- span.appendChild(text);
341
- });
342
- mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
343
- // restore selection
344
- sel.removeAllRanges();
345
- sel.addRange(range);
346
- }
347
- // Is the range covering the entire node's contents?
348
- function rangeCoversWholeNode(range, node) {
349
- const all = document.createRange();
350
- all.selectNodeContents(node);
351
- return (range.compareBoundaryPoints(Range.START_TO_START, all) <= 0 &&
352
- range.compareBoundaryPoints(Range.END_TO_END, all) >= 0);
353
- }
354
- function hasRangeContent(r) {
355
- if (r.collapsed)
356
- return false;
357
- const text = r.cloneContents().textContent || '';
358
- return text.length > 0;
359
- }
360
- // Split one styled span into [left][middle][right]; recolor only middle
361
- function splitAndRecolorWithinSpan(span, range, dataAttr, cssProp, newValue) {
362
- const oldValue = span.style[cssProp];
363
- const left = document.createRange();
364
- left.setStart(span, 0);
365
- left.setEnd(range.startContainer, range.startOffset);
366
- const right = document.createRange();
367
- right.setStart(range.endContainer, range.endOffset);
368
- right.setEnd(span, span.childNodes.length);
369
- // Build replacement fragment
370
- const frag = document.createDocumentFragment();
371
- // helper to make a styled clone shell
372
- const makeShell = (val) => {
373
- const s = document.createElement('span');
374
- s.setAttribute(dataAttr, '1');
375
- s.style[cssProp] = val;
376
- return s;
377
- };
378
- if (hasRangeContent(left)) {
379
- const sLeft = makeShell(oldValue);
380
- sLeft.appendChild(left.cloneContents());
381
- frag.appendChild(sLeft);
382
- }
383
- const mid = makeShell(newValue);
384
- mid.appendChild(range.cloneContents());
385
- frag.appendChild(mid);
386
- if (hasRangeContent(right)) {
387
- const sRight = makeShell(oldValue);
388
- sRight.appendChild(right.cloneContents());
389
- frag.appendChild(sRight);
390
- }
391
- span.replaceWith(frag);
392
- return mid;
393
- }
394
- function mergeAdjacentStyledSpans(root, dataAttr, cssProp) {
395
- const spans = Array.from(root.querySelectorAll(`span[${dataAttr}]`));
396
- const valOf = (el) => el.style[cssProp];
397
- spans.forEach(s => {
398
- const nested = Array.from(s.querySelectorAll(`span[${dataAttr}]`));
399
- nested.forEach(child => {
400
- if (valOf(child) === valOf(s)) {
401
- while (child.firstChild)
402
- s.insertBefore(child.firstChild, child);
403
- child.remove();
404
- }
405
- });
406
- const prev = s.previousSibling;
407
- if (prev instanceof HTMLSpanElement &&
408
- prev.hasAttribute(dataAttr) &&
409
- valOf(prev) === valOf(s)) {
410
- while (s.firstChild)
411
- prev.appendChild(s.firstChild);
412
- s.remove();
413
- return;
414
- }
415
- const next = s.nextSibling;
416
- if (next instanceof HTMLSpanElement &&
417
- next.hasAttribute(dataAttr) &&
418
- valOf(next) === valOf(s)) {
419
- while (next.firstChild)
420
- s.appendChild(next.firstChild);
421
- next.remove();
422
- }
423
- });
424
- }
425
- export function setForeColor(editor, hex) {
426
- applyInlineStyle(editor, 'color', hex, 'data-rte-color');
427
- }
428
- export function setBackColor(editor, hex) {
429
- applyInlineStyle(editor, 'backgroundColor', hex, 'data-rte-bg');
430
- }
431
- export function toggleList(root, kind) {
432
- const sel = document.getSelection();
433
- if (!sel || sel.rangeCount === 0)
434
- return;
435
- const range = sel.getRangeAt(0);
436
- const blocks = [];
437
- const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
438
- acceptNode: n => {
439
- if (!(n instanceof HTMLElement))
440
- return NodeFilter.FILTER_SKIP;
441
- if (!/^(P|DIV|LI|H[1-6])$/.test(n.tagName))
442
- return NodeFilter.FILTER_SKIP;
443
- const r = document.createRange();
444
- r.selectNodeContents(n);
445
- const intersects = range.compareBoundaryPoints(Range.END_TO_START, r) < 0 &&
446
- range.compareBoundaryPoints(Range.START_TO_END, r) > 0;
447
- return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
448
- },
449
- });
450
- let n;
451
- while ((n = walker.nextNode())) {
452
- blocks.push(n);
453
- }
454
- if (blocks.length === 0) {
455
- const block = closestBlock(range.startContainer, root);
456
- if (block)
457
- blocks.push(block);
458
- }
459
- const firstLi = blocks[0].closest('li');
460
- if (firstLi) {
461
- const currentList = firstLi.closest('ul,ol');
462
- if (!currentList)
463
- return;
464
- if (currentList.tagName.toLowerCase() === kind) {
465
- const frag = document.createDocumentFragment();
466
- for (const li of Array.from(currentList.querySelectorAll('li'))) {
467
- const p = document.createElement('p');
468
- while (li.firstChild)
469
- p.appendChild(li.firstChild);
470
- frag.appendChild(p);
471
- }
472
- currentList.replaceWith(frag);
473
- }
474
- else {
475
- const newList = document.createElement(kind);
476
- while (currentList.firstChild)
477
- newList.appendChild(currentList.firstChild);
478
- currentList.replaceWith(newList);
479
- }
480
- return;
481
- }
482
- const newList = document.createElement(kind);
483
- for (const block of blocks) {
484
- const li = document.createElement('li');
485
- while (block.firstChild)
486
- li.appendChild(block.firstChild);
487
- newList.appendChild(li);
488
- block.replaceWith(newList);
489
- }
490
- }
491
- export function insertOrEditLink(root, href) {
492
- const sel = document.getSelection();
493
- if (!sel || sel.rangeCount === 0)
494
- return;
495
- const range = sel.getRangeAt(0);
496
- let n = range.startContainer;
497
- let a = null;
498
- while (n && n !== root) {
499
- if (n instanceof HTMLAnchorElement) {
500
- a = n;
501
- break;
502
- }
503
- n = n.parentNode;
504
- }
505
- const url = href ??
506
- (typeof window !== 'undefined'
507
- ? window.prompt('Enter URL', a?.href || 'https://') || ''
508
- : '');
509
- if (!url)
510
- return;
511
- if (a) {
512
- a.href = url;
513
- return;
514
- }
515
- if (range.collapsed) {
516
- const link = document.createElement('a');
517
- link.href = url;
518
- link.textContent = url;
519
- range.insertNode(link);
520
- const r = document.createRange();
521
- r.setStartAfter(link);
522
- r.collapse(true);
523
- sel.removeAllRanges();
524
- sel.addRange(r);
525
- return;
526
- }
527
- const link = document.createElement('a');
528
- link.href = url;
529
- try {
530
- range.surroundContents(link);
531
- }
532
- catch {
533
- const frag = range.extractContents();
534
- link.appendChild(frag);
535
- range.insertNode(link);
536
- }
537
- }
1
+ "use strict";
538
2
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["export function closestBlock(\n node: Node | null,\n root: HTMLElement\n): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (\n node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) ||\n display === 'block' ||\n display === 'list-item'\n ) {\n return node;\n }\n }\n node = node?.parentNode || null;\n }\n return root;\n}\n\nexport function nearestElement(n: Node | null): HTMLElement | null {\n while (n && !(n instanceof HTMLElement)) n = n.parentNode as Node | null;\n return n as HTMLElement | null;\n}\n\nexport function rgbToHex(rgb: string): string {\n const m = rgb.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/i);\n if (!m) return '#000000';\n const r = Number(m[1]).toString(16).padStart(2, '0');\n const g = Number(m[2]).toString(16).padStart(2, '0');\n const b = Number(m[3]).toString(16).padStart(2, '0');\n return `#${r}${g}${b}`;\n}\n\nexport function unwrap(node: HTMLElement) {\n const p = node.parentNode;\n if (!p) return;\n while (node.firstChild) p.insertBefore(node.firstChild, node);\n p.removeChild(node);\n}\n\nexport function surroundInline(\n range: Range,\n tag: string,\n attrs?: Record<string, string>\n) {\n const wrap = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k, v]) => wrap.setAttribute(k, v));\n try {\n range.surroundContents(wrap);\n } catch {\n const frag = range.extractContents();\n wrap.appendChild(frag);\n range.insertNode(wrap);\n }\n}\n\nfunction unwrapAllMatching(\n node: Node,\n root: HTMLElement,\n matcher: (el: HTMLElement) => boolean\n) {\n let n: Node | null = node.parentNode;\n while (n && n !== root) {\n if (n instanceof HTMLElement && matcher(n)) {\n unwrap(n);\n\n n = node.parentNode;\n continue;\n }\n n = n.parentNode;\n }\n}\n\nexport function toggleInlineTag(\n root: HTMLElement,\n tag: 'strong' | 'em' | 'u' | 'span',\n attrs?: Record<string, string>\n) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) {\n return;\n }\n const range = sel.getRangeAt(0);\n\n const aliases: Record<string, string[]> = {\n strong: ['strong', 'b'],\n em: ['em', 'i'],\n u: ['u'],\n span: ['span'],\n };\n const candidates = aliases[tag] ?? [tag];\n\n function isMatchingInline(el: HTMLElement): boolean {\n return candidates.includes(el.tagName.toLowerCase());\n }\n\n if (range.collapsed) {\n let n: Node | null = range.startContainer;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatchingInline(n)) {\n unwrapAllMatching(range.startContainer, root, isMatchingInline);\n return;\n }\n n = n.parentNode;\n }\n\n const elm = document.createElement(tag);\n if (attrs)\n Object.entries(attrs).forEach(([k, v]) => elm.setAttribute(k, v));\n elm.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(elm);\n\n const r = document.createRange();\n r.setStart(elm.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n\n return;\n }\n\n const startBlock = closestBlock(range.startContainer, root);\n const endBlock = closestBlock(range.endContainer, root);\n if (startBlock && endBlock && startBlock !== endBlock) {\n const blocks: HTMLElement[] = [];\n let node: Node | null = startBlock;\n while (node) {\n if (node instanceof HTMLElement) blocks.push(node);\n if (node === endBlock) break;\n node = node.nextSibling;\n }\n\n blocks.forEach((block, i) => {\n const r = document.createRange();\n r.selectNodeContents(block);\n\n const textNodes: Text[] = [];\n const tw = document.createTreeWalker(block, NodeFilter.SHOW_TEXT, null);\n let tn: Node | null;\n while ((tn = tw.nextNode())) {\n if (tn.nodeValue?.trim()) textNodes.push(tn as Text);\n }\n\n const allWrapped =\n textNodes.length > 0 &&\n textNodes.every(txt => {\n let n: Node | null = txt;\n while (n && n !== block) {\n if (n instanceof HTMLElement && isMatchingInline(n)) return true;\n n = n.parentNode;\n }\n return false;\n });\n\n if (allWrapped) {\n textNodes.forEach(txt =>\n unwrapAllMatching(txt, block, isMatchingInline)\n );\n } else {\n surroundInline(r, tag, attrs);\n }\n });\n return;\n }\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: n => {\n if (!n.nodeValue || !n.nodeValue.trim())\n return NodeFilter.FILTER_REJECT;\n const nodeRange = document.createRange();\n nodeRange.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, nodeRange) <= 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, nodeRange) >= 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n }\n );\n\n const textNodes: Text[] = [];\n let t: Node | null;\n while ((t = walker.nextNode())) textNodes.push(t as Text);\n\n if (textNodes.length === 0) {\n let n: Node | null = range.startContainer;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatchingInline(n)) {\n unwrapAllMatching(range.startContainer, root, isMatchingInline);\n return;\n }\n n = n.parentNode;\n }\n }\n\n const allWrapped =\n textNodes.length > 0 &&\n textNodes.every(txt => {\n let n: Node | null = txt;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatchingInline(n)) {\n return true;\n }\n n = n.parentNode;\n }\n return false;\n });\n\n if (allWrapped) {\n textNodes.forEach(txt => unwrapAllMatching(txt, root, isMatchingInline));\n } else {\n surroundInline(range, tag, attrs);\n }\n\n // restore selection\n const selRange = document.createRange();\n selRange.setStart(range.startContainer, range.startOffset);\n selRange.setEnd(range.endContainer, range.endOffset);\n sel.removeAllRanges();\n sel.addRange(selRange);\n}\n\nexport function setBlockTag(root: HTMLElement, tag: 'p' | 'h1' | 'h2' | 'h3') {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root);\n if (!block) return;\n if (block.tagName.toLowerCase() === tag) return;\n const nb = document.createElement(tag);\n while (block.firstChild) nb.appendChild(block.firstChild);\n block.replaceWith(nb);\n const r = document.createRange();\n r.selectNodeContents(nb);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n}\n\nexport function setAlignment(\n root: HTMLElement,\n align: 'left' | 'center' | 'right' | 'justify'\n) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n let block = closestBlock(range.startContainer, root);\n if (!block) return;\n\n if (block.tagName.toLowerCase() === 'li') {\n block.style.textAlign = align;\n const list = block.closest('ul,ol') as HTMLElement | null;\n if (list) list.style.textAlign = align;\n } else {\n block.style.textAlign = align === 'justify' ? 'justify' : align;\n }\n}\n\nexport function setFontFamily(root: HTMLElement, family: string) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const span = document.createElement('span');\n span.style.fontFamily = family;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const r = document.createRange();\n r.setStart(span.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `font-family:${family}` });\n}\n\nfunction enclosingStyledSpan(\n editor: HTMLElement,\n node: Node | null,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n): HTMLSpanElement | null {\n while (node && node !== editor) {\n if (node instanceof HTMLSpanElement && node.hasAttribute(dataAttr)) {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n}\n\nfunction applyInlineStyle(\n editor: HTMLElement,\n cssProp: 'color' | 'backgroundColor',\n value: string,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const r0 = sel.getRangeAt(0);\n if (!editor.contains(r0.commonAncestorContainer)) return;\n\n const range = r0.cloneRange();\n\n if (range.collapsed) {\n const enclosing = enclosingStyledSpan(\n editor,\n range.startContainer,\n dataAttr\n );\n if (enclosing) {\n (enclosing.style as any)[cssProp] = value;\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = value;\n s.appendChild(document.createTextNode('\\u200B'));\n range.insertNode(s);\n\n const caret = document.createRange();\n caret.setStart(s.firstChild!, 1);\n caret.collapse(true);\n sel.removeAllRanges();\n sel.addRange(caret);\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);\n const rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);\n if (leftEdge && leftEdge === rightEdge) {\n if (rangeCoversWholeNode(range, leftEdge)) {\n (leftEdge.style as any)[cssProp] = value;\n } else {\n const mid = splitAndRecolorWithinSpan(\n leftEdge,\n range,\n dataAttr,\n cssProp,\n value\n );\n\n const sel = window.getSelection();\n const r = document.createRange();\n r.selectNodeContents(mid);\n sel?.removeAllRanges();\n sel?.addRange(r);\n }\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const commonEl = (() => {\n let n: Node | null = range.commonAncestorContainer;\n while (n && !(n instanceof HTMLElement)) n = n.parentNode;\n return n as HTMLElement | null;\n })();\n\n const walker = document.createTreeWalker(\n commonEl || editor,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: n => {\n if (!n.nodeValue || !n.nodeValue.trim())\n return NodeFilter.FILTER_REJECT;\n const nodeRange = document.createRange();\n nodeRange.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n }\n );\n\n const toProcess: Text[] = [];\n let t: Node | null;\n while ((t = walker.nextNode())) toProcess.push(t as Text);\n\n toProcess.forEach(text => {\n let start = 0,\n end = text.length;\n if (text === range.startContainer) start = range.startOffset;\n if (text === range.endContainer) end = range.endOffset;\n if (start > 0) text = text.splitText(start);\n if (end < text.length) text.splitText(end);\n\n const existing = enclosingStyledSpan(editor, text, dataAttr);\n if (existing) {\n (existing.style as any)[cssProp] = value;\n return;\n }\n\n const span = document.createElement('span');\n span.setAttribute(dataAttr, '1');\n (span.style as any)[cssProp] = value;\n const parent = text.parentElement!;\n parent.replaceChild(span, text);\n span.appendChild(text);\n });\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n\n // restore selection\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\n// Is the range covering the entire node's contents?\nfunction rangeCoversWholeNode(range: Range, node: Node): boolean {\n const all = document.createRange();\n all.selectNodeContents(node);\n return (\n range.compareBoundaryPoints(Range.START_TO_START, all) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, all) >= 0\n );\n}\n\nfunction hasRangeContent(r: Range): boolean {\n if (r.collapsed) return false;\n const text = r.cloneContents().textContent || '';\n return text.length > 0;\n}\n\n// Split one styled span into [left][middle][right]; recolor only middle\nfunction splitAndRecolorWithinSpan(\n span: HTMLSpanElement,\n range: Range,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor',\n newValue: string\n): HTMLSpanElement {\n const oldValue = (span.style as any)[cssProp];\n\n const left = document.createRange();\n left.setStart(span, 0);\n left.setEnd(range.startContainer, range.startOffset);\n\n const right = document.createRange();\n right.setStart(range.endContainer, range.endOffset);\n right.setEnd(span, span.childNodes.length);\n\n // Build replacement fragment\n const frag = document.createDocumentFragment();\n\n // helper to make a styled clone shell\n const makeShell = (val: string) => {\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = val;\n return s;\n };\n\n if (hasRangeContent(left)) {\n const sLeft = makeShell(oldValue);\n sLeft.appendChild(left.cloneContents());\n frag.appendChild(sLeft);\n }\n\n const mid = makeShell(newValue);\n mid.appendChild(range.cloneContents());\n frag.appendChild(mid);\n\n if (hasRangeContent(right)) {\n const sRight = makeShell(oldValue);\n sRight.appendChild(right.cloneContents());\n frag.appendChild(sRight);\n }\n\n span.replaceWith(frag);\n return mid;\n}\n\nfunction mergeAdjacentStyledSpans(\n root: HTMLElement,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor'\n) {\n const spans = Array.from(\n root.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`)\n );\n\n const valOf = (el: HTMLElement) => (el.style as any)[cssProp];\n\n spans.forEach(s => {\n const nested = Array.from(\n s.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`)\n );\n nested.forEach(child => {\n if (valOf(child) === valOf(s)) {\n while (child.firstChild) s.insertBefore(child.firstChild, child);\n child.remove();\n }\n });\n\n const prev = s.previousSibling;\n if (\n prev instanceof HTMLSpanElement &&\n prev.hasAttribute(dataAttr) &&\n valOf(prev) === valOf(s)\n ) {\n while (s.firstChild) prev.appendChild(s.firstChild);\n s.remove();\n return;\n }\n\n const next = s.nextSibling;\n if (\n next instanceof HTMLSpanElement &&\n next.hasAttribute(dataAttr) &&\n valOf(next) === valOf(s)\n ) {\n while (next.firstChild) s.appendChild(next.firstChild);\n next.remove();\n }\n });\n}\n\nexport function setForeColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'color', hex, 'data-rte-color');\n}\nexport function setBackColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'backgroundColor', hex, 'data-rte-bg');\n}\n\nexport function toggleList(root: HTMLElement, kind: 'ul' | 'ol') {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n const blocks: HTMLElement[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode: n => {\n if (!(n instanceof HTMLElement)) return NodeFilter.FILTER_SKIP;\n if (!/^(P|DIV|LI|H[1-6])$/.test(n.tagName)) return NodeFilter.FILTER_SKIP;\n\n const r = document.createRange();\n r.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, r) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, r) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n });\n\n let n: Node | null;\n while ((n = walker.nextNode())) {\n blocks.push(n as HTMLElement);\n }\n\n if (blocks.length === 0) {\n const block = closestBlock(range.startContainer, root);\n if (block) blocks.push(block);\n }\n\n const firstLi = blocks[0].closest('li');\n if (firstLi) {\n const currentList = firstLi.closest('ul,ol') as HTMLElement | null;\n if (!currentList) return;\n\n if (currentList.tagName.toLowerCase() === kind) {\n const frag = document.createDocumentFragment();\n for (const li of Array.from(currentList.querySelectorAll('li'))) {\n const p = document.createElement('p');\n while (li.firstChild) p.appendChild(li.firstChild);\n frag.appendChild(p);\n }\n currentList.replaceWith(frag);\n } else {\n const newList = document.createElement(kind);\n while (currentList.firstChild)\n newList.appendChild(currentList.firstChild);\n currentList.replaceWith(newList);\n }\n return;\n }\n\n const newList = document.createElement(kind);\n for (const block of blocks) {\n const li = document.createElement('li');\n while (block.firstChild) li.appendChild(block.firstChild);\n newList.appendChild(li);\n block.replaceWith(newList);\n }\n}\n\nexport function insertOrEditLink(root: HTMLElement, href?: string) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n let n: Node | null = range.startContainer;\n let a: HTMLAnchorElement | null = null;\n while (n && n !== root) {\n if (n instanceof HTMLAnchorElement) {\n a = n;\n break;\n }\n n = n.parentNode;\n }\n\n const url =\n href ??\n (typeof window !== 'undefined'\n ? window.prompt('Enter URL', a?.href || 'https://') || ''\n : '');\n if (!url) return;\n\n if (a) {\n a.href = url;\n return;\n }\n\n if (range.collapsed) {\n const link = document.createElement('a');\n link.href = url;\n link.textContent = url;\n range.insertNode(link);\n const r = document.createRange();\n r.setStartAfter(link);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n return;\n }\n\n const link = document.createElement('a');\n link.href = url;\n try {\n range.surroundContents(link);\n } catch {\n const frag = range.extractContents();\n link.appendChild(frag);\n range.insertNode(link);\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/utils.ts"],"names":[],"mappings":"","sourcesContent":["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"]}
@@ -197,6 +197,7 @@ export declare class NileSelect extends NileElement implements NileFormControl {
197
197
  private handleFocus;
198
198
  private handleBlur;
199
199
  private handleDocumentFocusIn;
200
+ private handleVirtualSelectOpenChange;
200
201
  /**
201
202
  * Handles the click event on the footer.
202
203
  * @param event - The click event.