@aquera/nile-elements 0.1.67-beta-1.5 → 0.1.67-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.
- package/demo/index.html +24 -11
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +130 -58
- package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.cjs.js.map +1 -1
- package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
- package/dist/nile-badge/index.cjs.js +1 -1
- package/dist/nile-badge/index.esm.js +1 -1
- package/dist/nile-badge/nile-badge.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.cjs.js.map +1 -1
- package/dist/nile-badge/nile-badge.esm.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js.map +1 -1
- package/dist/nile-badge/nile-badge.test.esm.js +1 -1
- package/dist/nile-button/index.cjs.js +1 -1
- package/dist/nile-button/index.esm.js +1 -1
- package/dist/nile-button/nile-button.cjs.js +1 -1
- package/dist/nile-button/nile-button.cjs.js.map +1 -1
- package/dist/nile-button/nile-button.esm.js +1 -1
- package/dist/nile-button/nile-button.test.cjs.js +1 -1
- package/dist/nile-button/nile-button.test.cjs.js.map +1 -1
- package/dist/nile-button/nile-button.test.esm.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js.map +1 -1
- package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js.map +1 -1
- package/dist/nile-chip/nile-chip.test.esm.js +1 -1
- package/dist/nile-dialog/index.cjs.js +1 -1
- package/dist/nile-dialog/index.esm.js +1 -1
- package/dist/nile-dialog/nile-dialog.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.cjs.js.map +1 -1
- package/dist/nile-dialog/nile-dialog.esm.js +2 -2
- package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.test.cjs.js.map +1 -1
- package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
- package/dist/nile-drawer/index.cjs.js +1 -1
- package/dist/nile-drawer/index.esm.js +1 -1
- package/dist/nile-drawer/nile-drawer.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.cjs.js.map +1 -1
- package/dist/nile-drawer/nile-drawer.esm.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.cjs.js.map +1 -1
- package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
- package/dist/nile-icon/icons/svg/format_clear.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/format_clear.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/format_clear.esm.js +1 -0
- package/dist/nile-icon/icons/svg/format_list_bulleted.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/format_list_bulleted.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/format_list_bulleted.esm.js +1 -0
- package/dist/nile-icon/icons/svg/format_list_numbered.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/format_list_numbered.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/format_list_numbered.esm.js +1 -0
- package/dist/nile-icon/icons/svg/index.cjs.js +1 -1
- package/dist/nile-icon/icons/svg/index.esm.js +1 -1
- package/dist/nile-icon/index.cjs.js +1 -1
- package/dist/nile-icon/index.cjs.js.map +1 -1
- package/dist/nile-icon/index.esm.js +2 -2
- package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
- package/dist/nile-icon/nile-icon.test.cjs.js.map +1 -1
- package/dist/nile-icon/nile-icon.test.esm.js +1 -1
- package/dist/nile-icon-button/index.cjs.js +1 -1
- package/dist/nile-icon-button/index.esm.js +1 -1
- package/dist/nile-icon-button/nile-icon-button.cjs.js +1 -1
- package/dist/nile-icon-button/nile-icon-button.cjs.js.map +1 -1
- package/dist/nile-icon-button/nile-icon-button.esm.js +1 -1
- package/dist/nile-input/index.cjs.js +1 -1
- package/dist/nile-input/index.esm.js +1 -1
- package/dist/nile-input/nile-input.cjs.js +1 -1
- package/dist/nile-input/nile-input.cjs.js.map +1 -1
- package/dist/nile-input/nile-input.esm.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js.map +1 -1
- package/dist/nile-input/nile-input.test.esm.js +1 -1
- package/dist/nile-menu-item/index.cjs.js +1 -1
- package/dist/nile-menu-item/index.esm.js +1 -1
- package/dist/nile-menu-item/nile-menu-item.cjs.js +1 -1
- package/dist/nile-menu-item/nile-menu-item.cjs.js.map +1 -1
- package/dist/nile-menu-item/nile-menu-item.esm.js +1 -1
- package/dist/nile-option/index.cjs.js +1 -1
- package/dist/nile-option/index.esm.js +1 -1
- package/dist/nile-option/nile-option.cjs.js +1 -1
- package/dist/nile-option/nile-option.cjs.js.map +1 -1
- package/dist/nile-option/nile-option.esm.js +1 -1
- package/dist/nile-rich-text-editor/index.cjs.js +1 -1
- package/dist/nile-rich-text-editor/index.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +14 -13
- package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-color.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-color.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rte-color.esm.js +54 -1
- package/dist/nile-rich-text-editor/nile-rte-link.cjs.js +2 -0
- package/dist/nile-rich-text-editor/nile-rte-link.cjs.js.map +1 -0
- package/dist/nile-rich-text-editor/nile-rte-link.esm.js +19 -0
- package/dist/nile-rich-text-editor/nile-rte-select.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.esm.js +39 -39
- package/dist/nile-rich-text-editor/utils.cjs.js +1 -1
- package/dist/nile-rich-text-editor/utils.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/utils.esm.js +1 -1
- package/dist/nile-select/index.cjs.js +1 -1
- package/dist/nile-select/index.esm.js +1 -1
- package/dist/nile-select/nile-select.cjs.js +1 -1
- package/dist/nile-select/nile-select.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.esm.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.test.esm.js +1 -1
- package/dist/nile-tab/index.cjs.js +1 -1
- package/dist/nile-tab/index.esm.js +1 -1
- package/dist/nile-tab/nile-tab.cjs.js +1 -1
- package/dist/nile-tab/nile-tab.cjs.js.map +1 -1
- package/dist/nile-tab/nile-tab.esm.js +1 -1
- package/dist/nile-tab-group/index.cjs.js +1 -1
- package/dist/nile-tab-group/index.esm.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.cjs.js.map +1 -1
- package/dist/nile-tab-group/nile-tab-group.esm.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js.map +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
- package/dist/nile-tag/index.cjs.js +1 -1
- package/dist/nile-tag/index.esm.js +1 -1
- package/dist/nile-tag/nile-tag.cjs.js +1 -1
- package/dist/nile-tag/nile-tag.cjs.js.map +1 -1
- package/dist/nile-tag/nile-tag.esm.js +1 -1
- package/dist/nile-toast/index.cjs.js +1 -1
- package/dist/nile-toast/index.esm.js +1 -1
- package/dist/nile-toast/nile-toast.cjs.js +1 -1
- package/dist/nile-toast/nile-toast.cjs.js.map +1 -1
- package/dist/nile-toast/nile-toast.esm.js +1 -1
- package/dist/nile-tree/index.cjs.js +1 -1
- package/dist/nile-tree/index.esm.js +1 -1
- package/dist/nile-tree/nile-tree.cjs.js +1 -1
- package/dist/nile-tree/nile-tree.cjs.js.map +1 -1
- package/dist/nile-tree/nile-tree.esm.js +1 -1
- package/dist/nile-tree-item/index.cjs.js +1 -1
- package/dist/nile-tree-item/index.esm.js +1 -1
- package/dist/nile-tree-item/nile-tree-item.cjs.js +1 -1
- package/dist/nile-tree-item/nile-tree-item.cjs.js.map +1 -1
- package/dist/nile-tree-item/nile-tree-item.esm.js +1 -1
- package/dist/nile-virtual-select/index.cjs.js +1 -1
- package/dist/nile-virtual-select/index.esm.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.esm.js +1 -1
- package/dist/src/nile-icon/icons/svg/format_clear.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/format_clear.js +5 -0
- package/dist/src/nile-icon/icons/svg/format_clear.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/format_list_bulleted.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/format_list_bulleted.js +5 -0
- package/dist/src/nile-icon/icons/svg/format_list_bulleted.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/format_list_numbered.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/format_list_numbered.js +5 -0
- package/dist/src/nile-icon/icons/svg/format_list_numbered.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/index.d.ts +3 -0
- package/dist/src/nile-icon/icons/svg/index.js +3 -0
- package/dist/src/nile-icon/icons/svg/index.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +14 -13
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +38 -90
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rte-color.d.ts +11 -3
- package/dist/src/nile-rich-text-editor/nile-rte-color.js +171 -6
- package/dist/src/nile-rich-text-editor/nile-rte-color.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rte-link.d.ts +19 -0
- package/dist/src/nile-rich-text-editor/nile-rte-link.js +172 -0
- package/dist/src/nile-rich-text-editor/nile-rte-link.js.map +1 -0
- package/dist/src/nile-rich-text-editor/nile-rte-select.js +62 -57
- package/dist/src/nile-rich-text-editor/nile-rte-select.js.map +1 -1
- package/dist/src/nile-rich-text-editor/rte-utils/content.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/content.js +25 -0
- package/dist/src/nile-rich-text-editor/rte-utils/content.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/css.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/css.js +9 -0
- package/dist/src/nile-rich-text-editor/rte-utils/css.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/dom.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/dom.js +48 -0
- package/dist/src/nile-rich-text-editor/rte-utils/dom.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/formatting.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/formatting.js +69 -0
- package/dist/src/nile-rich-text-editor/rte-utils/formatting.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/keys.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/keys.js +38 -0
- package/dist/src/nile-rich-text-editor/rte-utils/keys.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/lists.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/lists.js +28 -0
- package/dist/src/nile-rich-text-editor/rte-utils/lists.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/selection.d.ts +17 -0
- package/dist/src/nile-rich-text-editor/rte-utils/selection.js +39 -0
- package/dist/src/nile-rich-text-editor/rte-utils/selection.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbar.d.ts +28 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbar.js +161 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbar.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.d.ts +13 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.js +119 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/vars.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/vars.js +14 -0
- package/dist/src/nile-rich-text-editor/rte-utils/vars.js.map +1 -0
- package/dist/src/nile-rich-text-editor/sanatize.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/sanatize.js +40 -0
- package/dist/src/nile-rich-text-editor/sanatize.js.map +1 -0
- package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-icon/icons/svg/format_clear.ts +5 -0
- package/src/nile-icon/icons/svg/format_list_bulleted.ts +5 -0
- package/src/nile-icon/icons/svg/format_list_numbered.ts +5 -0
- package/src/nile-icon/icons/svg/index.ts +3 -0
- package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +14 -13
- package/src/nile-rich-text-editor/nile-rich-text-editor.ts +56 -90
- package/src/nile-rich-text-editor/nile-rte-color.ts +182 -6
- package/src/nile-rich-text-editor/nile-rte-link.ts +161 -0
- package/src/nile-rich-text-editor/nile-rte-select.ts +178 -173
- package/src/nile-rich-text-editor/utils.ts +342 -341
- package/vscode-html-custom-data.json +33 -3
@@ -0,0 +1,172 @@
|
|
1
|
+
import { __decorate } from "tslib";
|
2
|
+
import { LitElement, html } from 'lit';
|
3
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
4
|
+
let NileRteLink = class NileRteLink extends LitElement {
|
5
|
+
constructor() {
|
6
|
+
super(...arguments);
|
7
|
+
this.placeholder = 'https://';
|
8
|
+
this.linkValue = '';
|
9
|
+
this.selectionRange = null;
|
10
|
+
}
|
11
|
+
createRenderRoot() { return this; }
|
12
|
+
connectedCallback() {
|
13
|
+
super.connectedCallback();
|
14
|
+
this.injectCss(`
|
15
|
+
nile-rte-link nile-button.rte-link-trigger::part(base) {
|
16
|
+
width: 32px;
|
17
|
+
height: 32px;
|
18
|
+
padding: 0;
|
19
|
+
border: none;
|
20
|
+
border-radius: 6px;
|
21
|
+
}
|
22
|
+
.link-popup {
|
23
|
+
display: flex;
|
24
|
+
gap: 6px;
|
25
|
+
padding: 6px 8px;
|
26
|
+
align-items: center;
|
27
|
+
background: white;
|
28
|
+
}
|
29
|
+
.link-input {
|
30
|
+
flex: 1;
|
31
|
+
padding: 6px 8px;
|
32
|
+
font-size: 14px;
|
33
|
+
border: 1px solid #ccc;
|
34
|
+
border-radius: 4px;
|
35
|
+
}
|
36
|
+
nile-popover.rte-link-popover::part(popover) {
|
37
|
+
min-width: 250px;
|
38
|
+
height: 44px;
|
39
|
+
padding: 0px;
|
40
|
+
gap: 0px;
|
41
|
+
}
|
42
|
+
`);
|
43
|
+
}
|
44
|
+
injectCss(cssText) {
|
45
|
+
if (this.querySelector('style[data-rte-link-style]'))
|
46
|
+
return;
|
47
|
+
const style = document.createElement('style');
|
48
|
+
style.setAttribute('data-rte-link-style', 'true');
|
49
|
+
style.textContent = cssText;
|
50
|
+
this.insertBefore(style, this.firstChild);
|
51
|
+
}
|
52
|
+
onOpen() {
|
53
|
+
if (!this.editorEl)
|
54
|
+
return;
|
55
|
+
const sel = document.getSelection();
|
56
|
+
if (!sel || sel.rangeCount === 0)
|
57
|
+
return;
|
58
|
+
this.selectionRange = sel.getRangeAt(0).cloneRange();
|
59
|
+
// Pre-fill with existing href if selection inside <a>
|
60
|
+
let n = sel.anchorNode;
|
61
|
+
let a = null;
|
62
|
+
while (n && n !== this.editorEl) {
|
63
|
+
if (n instanceof HTMLAnchorElement) {
|
64
|
+
a = n;
|
65
|
+
break;
|
66
|
+
}
|
67
|
+
n = n.parentNode;
|
68
|
+
}
|
69
|
+
this.linkValue = a?.href || '';
|
70
|
+
setTimeout(() => {
|
71
|
+
this.querySelector('.link-input')?.focus();
|
72
|
+
}, 0);
|
73
|
+
}
|
74
|
+
onApply() {
|
75
|
+
if (!this.editorEl || !this.selectionRange)
|
76
|
+
return;
|
77
|
+
const url = this.linkValue.trim();
|
78
|
+
if (!url)
|
79
|
+
return;
|
80
|
+
const sel = document.getSelection();
|
81
|
+
if (!sel)
|
82
|
+
return;
|
83
|
+
sel.removeAllRanges();
|
84
|
+
sel.addRange(this.selectionRange);
|
85
|
+
// Check for existing <a>
|
86
|
+
let n = this.selectionRange.startContainer;
|
87
|
+
let a = null;
|
88
|
+
while (n && n !== this.editorEl) {
|
89
|
+
if (n instanceof HTMLAnchorElement) {
|
90
|
+
a = n;
|
91
|
+
break;
|
92
|
+
}
|
93
|
+
n = n.parentNode;
|
94
|
+
}
|
95
|
+
if (a) {
|
96
|
+
a.href = url;
|
97
|
+
}
|
98
|
+
else {
|
99
|
+
const link = document.createElement('a');
|
100
|
+
link.href = url;
|
101
|
+
if (this.selectionRange.collapsed) {
|
102
|
+
link.textContent = url;
|
103
|
+
this.selectionRange.insertNode(link);
|
104
|
+
}
|
105
|
+
else {
|
106
|
+
try {
|
107
|
+
this.selectionRange.surroundContents(link);
|
108
|
+
}
|
109
|
+
catch {
|
110
|
+
const frag = this.selectionRange.extractContents();
|
111
|
+
link.appendChild(frag);
|
112
|
+
this.selectionRange.insertNode(link);
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
this.emit(url);
|
117
|
+
// Close the popover by toggling `open`
|
118
|
+
const pop = this.querySelector('nile-popover');
|
119
|
+
if (pop)
|
120
|
+
pop.isShow = false;
|
121
|
+
}
|
122
|
+
emit(href) {
|
123
|
+
this.dispatchEvent(new CustomEvent('link-changed', {
|
124
|
+
detail: { href },
|
125
|
+
bubbles: true,
|
126
|
+
composed: true
|
127
|
+
}));
|
128
|
+
}
|
129
|
+
render() {
|
130
|
+
return html `
|
131
|
+
<nile-popover placement="bottom-start" class="rte-link-popover" distance="10" .arrow=${false}>
|
132
|
+
<nile-button class="rte-link-trigger" slot="anchor" variant="tertiary" size="small" @click=${() => this.onOpen()}>
|
133
|
+
<nile-icon name="link_2" aria-label="Insert/Edit Link"></nile-icon>
|
134
|
+
</nile-button>
|
135
|
+
|
136
|
+
<div class="link-popup">
|
137
|
+
<input
|
138
|
+
class="link-input"
|
139
|
+
type="text"
|
140
|
+
placeholder="Type or paste link here"
|
141
|
+
.value=${this.linkValue}
|
142
|
+
@input=${(e) => this.linkValue = e.target.value}
|
143
|
+
@keydown=${(e) => {
|
144
|
+
if (e.key === 'Enter')
|
145
|
+
this.onApply();
|
146
|
+
if (e.key === 'Escape') {
|
147
|
+
const pop = this.querySelector('nile-popover');
|
148
|
+
if (pop)
|
149
|
+
pop.isShow = false;
|
150
|
+
}
|
151
|
+
}}
|
152
|
+
/>
|
153
|
+
<nile-button @click=${() => this.onApply()}>Apply</nile-button>
|
154
|
+
</div>
|
155
|
+
</nile-popover>
|
156
|
+
`;
|
157
|
+
}
|
158
|
+
};
|
159
|
+
__decorate([
|
160
|
+
property({ attribute: false })
|
161
|
+
], NileRteLink.prototype, "editorEl", void 0);
|
162
|
+
__decorate([
|
163
|
+
property({ type: String })
|
164
|
+
], NileRteLink.prototype, "placeholder", void 0);
|
165
|
+
__decorate([
|
166
|
+
state()
|
167
|
+
], NileRteLink.prototype, "linkValue", void 0);
|
168
|
+
NileRteLink = __decorate([
|
169
|
+
customElement('nile-rte-link')
|
170
|
+
], NileRteLink);
|
171
|
+
export { NileRteLink };
|
172
|
+
//# sourceMappingURL=nile-rte-link.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"nile-rte-link.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-link.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n@customElement('nile-rte-link')\nexport class NileRteLink extends LitElement {\n protected createRenderRoot() { return this; }\n\n @property({ attribute: false }) editorEl!: HTMLElement;\n @property({ type: String }) placeholder = 'https://';\n\n @state() private linkValue = '';\n private selectionRange: Range | null = null;\n\n connectedCallback() {\n super.connectedCallback();\n this.injectCss(`\n nile-rte-link nile-button.rte-link-trigger::part(base) {\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 6px;\n }\n .link-popup {\n display: flex;\n gap: 6px;\n padding: 6px 8px;\n align-items: center;\n background: white;\n }\n .link-input {\n flex: 1;\n padding: 6px 8px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 4px;\n }\n nile-popover.rte-link-popover::part(popover) {\n min-width: 250px;\n height: 44px;\n padding: 0px;\n gap: 0px;\n }\n `);\n }\n\n private injectCss(cssText: string) {\n if (this.querySelector('style[data-rte-link-style]')) return;\n const style = document.createElement('style');\n style.setAttribute('data-rte-link-style', 'true');\n style.textContent = cssText;\n this.insertBefore(style, this.firstChild);\n }\n\n private onOpen() {\n if (!this.editorEl) return;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n\n this.selectionRange = sel.getRangeAt(0).cloneRange();\n\n // Pre-fill with existing href if selection inside <a>\n let n: Node | null = sel.anchorNode;\n let a: HTMLAnchorElement | null = null;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLAnchorElement) { a = n; break; }\n n = n.parentNode;\n }\n this.linkValue = a?.href || '';\n\n setTimeout(() => {\n this.querySelector<HTMLInputElement>('.link-input')?.focus();\n }, 0);\n }\n\n private onApply() {\n if (!this.editorEl || !this.selectionRange) return;\n const url = this.linkValue.trim();\n if (!url) return;\n\n const sel = document.getSelection();\n if (!sel) return;\n sel.removeAllRanges();\n sel.addRange(this.selectionRange);\n\n // Check for existing <a>\n let n: Node | null = this.selectionRange.startContainer;\n let a: HTMLAnchorElement | null = null;\n while (n && n !== this.editorEl) {\n if (n instanceof HTMLAnchorElement) { a = n; break; }\n n = n.parentNode;\n }\n\n if (a) {\n a.href = url;\n } else {\n const link = document.createElement('a');\n link.href = url;\n if (this.selectionRange.collapsed) {\n link.textContent = url;\n this.selectionRange.insertNode(link);\n } else {\n try {\n this.selectionRange.surroundContents(link);\n } catch {\n const frag = this.selectionRange.extractContents();\n link.appendChild(frag);\n this.selectionRange.insertNode(link);\n }\n }\n }\n\n this.emit(url);\n\n // Close the popover by toggling `open`\n const pop = this.querySelector('nile-popover');\n if (pop) (pop as any).isShow = false;\n }\n\n private emit(href: string) {\n this.dispatchEvent(new CustomEvent('link-changed', {\n detail: { href },\n bubbles: true,\n composed: true\n }));\n }\n\n render() {\n return html`\n <nile-popover placement=\"bottom-start\" class=\"rte-link-popover\" distance=\"10\" .arrow=${false}>\n <nile-button class=\"rte-link-trigger\" slot=\"anchor\" variant=\"tertiary\" size=\"small\" @click=${() => this.onOpen()}>\n <nile-icon name=\"link_2\" aria-label=\"Insert/Edit Link\"></nile-icon>\n </nile-button>\n\n <div class=\"link-popup\">\n <input\n class=\"link-input\"\n type=\"text\"\n placeholder=\"Type or paste link here\"\n .value=${this.linkValue}\n @input=${(e: any) => this.linkValue = e.target.value}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter') this.onApply();\n if (e.key === 'Escape') {\n const pop = this.querySelector('nile-popover');\n if (pop) (pop as any).isShow = false;\n }\n }}\n />\n <nile-button @click=${() => this.onApply()}>Apply</nile-button>\n </div>\n </nile-popover>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-link': NileRteLink;\n }\n}\n"]}
|
@@ -27,7 +27,7 @@ let NileRteSelect = class NileRteSelect extends LitElement {
|
|
27
27
|
right: 'format_align_right',
|
28
28
|
justify: 'format_align_justify'
|
29
29
|
};
|
30
|
-
return map[v] || '
|
30
|
+
return map[v] || 'format_align_left';
|
31
31
|
}
|
32
32
|
get parsedOptions() {
|
33
33
|
// Prefer programmatic options if present (gives TS compile-time checks)
|
@@ -89,21 +89,26 @@ let NileRteSelect = class NileRteSelect extends LitElement {
|
|
89
89
|
const style = document.createElement('style');
|
90
90
|
style.setAttribute('data-rte-select-style', 'true');
|
91
91
|
style.textContent = `
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
92
|
+
nile-menu.rte-align-menu::part(menu__items-wrapper) {
|
93
|
+
display: flex;
|
94
|
+
}
|
95
|
+
nile-menu.rte-align-menu,
|
96
|
+
nile-menu.rte-default-menu {
|
97
|
+
margin-top: 0px;
|
98
|
+
}
|
99
|
+
nile-button.rte-align-trigger::part(base),
|
100
|
+
nile-button.rte-default-trigger::part(base) {
|
101
|
+
min-width: 32px;
|
102
|
+
height: 32px;
|
103
|
+
padding: 0px 6px;
|
104
|
+
box-shadow: none;
|
105
|
+
}
|
106
|
+
nile-button.rte-align-trigger::part(base) {
|
107
|
+
|
108
|
+
|
109
|
+
border: none;
|
110
|
+
}
|
111
|
+
`;
|
107
112
|
this.insertBefore(style, this.firstChild);
|
108
113
|
}
|
109
114
|
render() {
|
@@ -116,58 +121,39 @@ let NileRteSelect = class NileRteSelect extends LitElement {
|
|
116
121
|
? html `<nile-icon name="${current.icon}"></nile-icon>`
|
117
122
|
: (this.label || 'Align');
|
118
123
|
return html `
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
124
|
+
<nile-dropdown class="rte-align-dd">
|
125
|
+
<nile-button slot="trigger" variant="tertiary" class="rte-align-trigger">
|
126
|
+
${trigger}
|
127
|
+
</nile-button>
|
128
|
+
<nile-menu class="rte-align-menu">
|
129
|
+
${opts.map(o => html `
|
130
|
+
<nile-menu-item
|
131
|
+
class="rte-align-item"
|
132
|
+
?active=${o.value === this.selectedValue}
|
133
|
+
@click=${() => this.onSelect(o.value)}>
|
134
|
+
<nile-icon name="${o.icon}"></nile-icon>
|
135
|
+
</nile-menu-item>
|
136
|
+
`)}
|
137
|
+
</nile-menu>
|
138
|
+
</nile-dropdown>
|
139
|
+
`;
|
135
140
|
}
|
136
141
|
// ► Font: show labels, preview fonts in items and trigger
|
137
142
|
if (this.type === 'font') {
|
138
143
|
const triggerText = current?.label || this.label || 'Font';
|
139
144
|
return html `
|
140
|
-
<nile-dropdown class="rte-default-dd">
|
141
|
-
<nile-button
|
142
|
-
slot="trigger"
|
143
|
-
variant="tertiary"
|
144
|
-
class="rte-default-trigger"
|
145
|
-
style="font-family: ${current?.value || 'inherit'}">
|
146
|
-
${triggerText} <nile-icon name="arrowdown"></nile-icon>
|
147
|
-
</nile-button>
|
148
|
-
<nile-menu class="rte-default-menu">
|
149
|
-
${opts.map(o => html `
|
150
|
-
<nile-menu-item
|
151
|
-
style="font-family: ${o.value}"
|
152
|
-
?active=${o.value === this.selectedValue}
|
153
|
-
@click=${() => this.onSelect(o.value)}>
|
154
|
-
${o.label}
|
155
|
-
</nile-menu-item>
|
156
|
-
`)}
|
157
|
-
</nile-menu>
|
158
|
-
</nile-dropdown>
|
159
|
-
`;
|
160
|
-
}
|
161
|
-
// ► Default (e.g., heading): text items; heading values are validated already
|
162
|
-
const triggerText = current?.label || this.label || 'Select';
|
163
|
-
return html `
|
164
145
|
<nile-dropdown class="rte-default-dd">
|
165
|
-
<nile-button
|
146
|
+
<nile-button
|
147
|
+
slot="trigger"
|
148
|
+
variant="tertiary"
|
149
|
+
class="rte-default-trigger"
|
150
|
+
style="font-family: ${current?.value || 'inherit'}">
|
166
151
|
${triggerText} <nile-icon name="arrowdown"></nile-icon>
|
167
152
|
</nile-button>
|
168
153
|
<nile-menu class="rte-default-menu">
|
169
154
|
${opts.map(o => html `
|
170
155
|
<nile-menu-item
|
156
|
+
style="font-family: ${o.value}"
|
171
157
|
?active=${o.value === this.selectedValue}
|
172
158
|
@click=${() => this.onSelect(o.value)}>
|
173
159
|
${o.label}
|
@@ -176,6 +162,25 @@ let NileRteSelect = class NileRteSelect extends LitElement {
|
|
176
162
|
</nile-menu>
|
177
163
|
</nile-dropdown>
|
178
164
|
`;
|
165
|
+
}
|
166
|
+
// ► Default (e.g., heading): text items; heading values are validated already
|
167
|
+
const triggerText = current?.label || this.label || 'Select';
|
168
|
+
return html `
|
169
|
+
<nile-dropdown class="rte-default-dd">
|
170
|
+
<nile-button slot="trigger" variant="tertiary" class="rte-default-trigger">
|
171
|
+
${triggerText} <nile-icon name="arrowdown"></nile-icon>
|
172
|
+
</nile-button>
|
173
|
+
<nile-menu class="rte-default-menu">
|
174
|
+
${opts.map(o => html `
|
175
|
+
<nile-menu-item
|
176
|
+
?active=${o.value === this.selectedValue}
|
177
|
+
@click=${() => this.onSelect(o.value)}>
|
178
|
+
${o.label}
|
179
|
+
</nile-menu-item>
|
180
|
+
`)}
|
181
|
+
</nile-menu>
|
182
|
+
</nile-dropdown>
|
183
|
+
`;
|
179
184
|
}
|
180
185
|
};
|
181
186
|
__decorate([
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nile-rte-select.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-select.ts"],"names":[],"mappings":"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","sourcesContent":[" // nile-rte-select.ts\n import { LitElement, html } from 'lit';\n import { customElement, property, state } from 'lit/decorators.js';\n\n type HeadingTag = 'p' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n type GenericOption = { value: string; label?: string; icon?: string };\n type HeadingOption = { value: HeadingTag; label?: string; icon?: string };\n type NormalizedOption = { value: string; label: string; icon?: string };\n\n const HEADING_ALLOWLIST: ReadonlySet<HeadingTag> = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'\n ]);\n\n function isHeadingTag(v: string): v is HeadingTag {\n return HEADING_ALLOWLIST.has(v as HeadingTag);\n }\n\n @customElement('nile-rte-select')\n export class NileRteSelect extends LitElement {\n protected createRenderRoot() { return this; }\n\n /** 'heading' | 'font' | 'align' */\n @property({ type: String }) type = '';\n\n /** JSON: [{ value, label?, icon? }, ...] (attribute-based; runtime-validated) */\n @property({ type: String }) options = '[]';\n\n /** Programmatic options (preferred for TS safety). */\n @property({ attribute: false })\n optionsObj?: Array<GenericOption | HeadingOption>;\n\n /** Fallback label for trigger (e.g., \"Align\") */\n @property({ type: String }) label = '';\n\n @state() private selectedValue = '';\n\n private mapAlignIcon(v: string) {\n const map: Record<string,string> = {\n left: 'format_align_left',\n center: 'format_align_middle',\n right: 'format_align_right',\n justify: 'format_align_justify'\n };\n return map[v] || 'align-left';\n }\n\n private get parsedOptions(): NormalizedOption[] {\n // Prefer programmatic options if present (gives TS compile-time checks)\n const source: unknown = this.optionsObj ?? this.options;\n\n const rawArray: any[] = (() => {\n if (Array.isArray(source)) return source;\n try { return JSON.parse(String(source)); } catch { return []; }\n })();\n\n // Normalize to consistent shape\n let items: NormalizedOption[] = rawArray.map((o: any) => {\n const value: string = o?.value ?? o;\n const label: string = o?.label ?? o?.value ?? o;\n const icon: string | undefined =\n o?.icon ?? (this.type === 'align' ? this.mapAlignIcon(String(value)) : undefined);\n return { value, label, icon };\n });\n\n // If type is heading, enforce allowlist (runtime validation)\n if (this.type === 'heading') {\n const before = items.length;\n items = items.filter(i => isHeadingTag(i.value));\n if (items.length !== before) {\n }\n // If current selection is invalid for heading, reset\n if (this.selectedValue && !isHeadingTag(this.selectedValue)) {\n this.selectedValue = '';\n }\n }\n\n return items;\n }\n\n private ensureDefault() {\n if (!this.selectedValue) {\n const first = this.parsedOptions[0];\n if (first) this.selectedValue = first.value;\n }\n }\n\n private onSelect(value: string) {\n if (this.type === 'heading' && !isHeadingTag(value)) {\n console.warn(`[nile-rte-select] Ignoring invalid heading value: ${value}`);\n return;\n }\n this.selectedValue = value;\n this.dispatchEvent(new CustomEvent('change', {\n detail: value, bubbles: true, composed: true\n }));\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.injectLocalStyles();\n }\n\n private injectLocalStyles() {\n if (this.querySelector('style[data-rte-select-style]')) return;\n\n const style = document.createElement('style');\n style.setAttribute('data-rte-select-style', 'true');\n style.textContent = `\n nile-menu.rte-align-menu::part(menu__items-wrapper) {\n display: flex;\n }\n nile-menu.rte-align-menu,\n nile-menu.rte-default-menu {\n margin-top: 0px;\n }\n nile-button.rte-align-trigger::part(base),\n nile-button.rte-default-trigger::part(base) {\n min-width: 32px;\n height: 32px;\n padding: 0px 6px;\n box-shadow: none;\n }\n `;\n this.insertBefore(style, this.firstChild);\n }\n\n render() {\n const opts = this.parsedOptions;\n this.ensureDefault();\n const current = opts.find(o => o.value === this.selectedValue);\n\n // ► Align: icon-only items + icon trigger\n if (this.type === 'align') {\n const trigger = current?.icon\n ? html`<nile-icon name=\"${current.icon}\"></nile-icon>`\n : (this.label || 'Align');\n\n return html`\n <nile-dropdown class=\"rte-align-dd\">\n <nile-button slot=\"trigger\" variant=\"tertiary\" class=\"rte-align-trigger\">\n ${trigger}\n </nile-button>\n <nile-menu class=\"rte-align-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n class=\"rte-align-item\"\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n <nile-icon name=\"${o.icon}\"></nile-icon>\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n\n // ► Font: show labels, preview fonts in items and trigger\n if (this.type === 'font') {\n const triggerText = current?.label || this.label || 'Font';\n return html`\n <nile-dropdown class=\"rte-default-dd\">\n <nile-button\n slot=\"trigger\"\n variant=\"tertiary\"\n class=\"rte-default-trigger\"\n style=\"font-family: ${current?.value || 'inherit'}\">\n ${triggerText} <nile-icon name=\"arrowdown\"></nile-icon>\n </nile-button>\n <nile-menu class=\"rte-default-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n style=\"font-family: ${o.value}\"\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n ${o.label}\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n\n // ► Default (e.g., heading): text items; heading values are validated already\n const triggerText = current?.label || this.label || 'Select';\n return html`\n <nile-dropdown class=\"rte-default-dd\">\n <nile-button slot=\"trigger\" variant=\"tertiary\" class=\"rte-default-trigger\">\n ${triggerText} <nile-icon name=\"arrowdown\"></nile-icon>\n </nile-button>\n <nile-menu class=\"rte-default-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n ${o.label}\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n }\n\n declare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-select': NileRteSelect;\n }\n }\n"]}
|
1
|
+
{"version":3,"file":"nile-rte-select.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-select.ts"],"names":[],"mappings":";AAAA,qBAAqB;AACrB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAOnE,MAAM,iBAAiB,GAA4B,IAAI,GAAG,CAAC;IACzD,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CACxC,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAe,CAAC,CAAC;AAChD,CAAC;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QAGL,mCAAmC;QACP,SAAI,GAAG,EAAE,CAAC;QAEtC,iFAAiF;QACrD,YAAO,GAAG,IAAI,CAAC;QAM3C,iDAAiD;QACrB,UAAK,GAAG,EAAE,CAAC;QAEtB,kBAAa,GAAG,EAAE,CAAC;IA4KtC,CAAC;IA3LW,gBAAgB,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAiBrC,YAAY,CAAC,CAAS;QAC5B,MAAM,GAAG,GAA0B;YACjC,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,qBAAqB;YAC7B,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EAAE,sBAAsB;SAChC,CAAC;QACF,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC;IACvC,CAAC;IAED,IAAY,aAAa;QACvB,wEAAwE;QACxE,MAAM,MAAM,GAAY,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC;QAExD,MAAM,QAAQ,GAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YACzC,IAAI,CAAC;gBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,EAAE,CAAC;YAAC,CAAC;QACjE,CAAC,CAAC,EAAE,CAAC;QAEL,gCAAgC;QAChC,IAAI,KAAK,GAAuB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;YACtD,MAAM,KAAK,GAAW,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAW,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YAChD,MAAM,IAAI,GACR,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACpF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,6DAA6D;QAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,CAAC;YACD,qDAAqD;YACrD,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC5D,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,KAAK;gBAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,KAAa;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,qDAAqD,KAAK,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE;YAC3C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,aAAa,CAAC,8BAA8B,CAAC;YAAE,OAAO;QAE/D,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,YAAY,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QACpD,KAAK,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;KAoBnB,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;QAE/D,0CAA0C;QAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,OAAO,EAAE,IAAI;gBAC3B,CAAC,CAAC,IAAI,CAAA,oBAAoB,OAAO,CAAC,IAAI,gBAAgB;gBACtD,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC;YAE5B,OAAO,IAAI,CAAA;;;cAGH,OAAO;;;cAGP,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAA;;;0BAGN,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa;yBAC/B,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;mCAClB,CAAC,CAAC,IAAI;;aAE5B,CAAC;;;OAGP,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;YAC3D,OAAO,IAAI,CAAA;;;;;;kCAMiB,OAAO,EAAE,KAAK,IAAI,SAAS;cAC/C,WAAW;;;cAGX,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAA;;sCAEM,CAAC,CAAC,KAAK;0BACnB,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa;yBAC/B,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;kBACnC,CAAC,CAAC,KAAK;;aAEZ,CAAC;;;OAGP,CAAC;QACJ,CAAC;QAED,8EAA8E;QAC9E,MAAM,WAAW,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;QAC7D,OAAO,IAAI,CAAA;;;YAGH,WAAW;;;YAGX,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAA;;wBAEN,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa;uBAC/B,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBACnC,CAAC,CAAC,KAAK;;WAEZ,CAAC;;;KAGP,CAAC;IACJ,CAAC;CACF,CAAA;AAxL6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAW;AAGV;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAgB;AAI3C;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;iDACmB;AAGtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAY;AAEtB;IAAhB,KAAK,EAAE;oDAA4B;AAhBzB,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CA4LzB","sourcesContent":["// nile-rte-select.ts\nimport { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\ntype HeadingTag = 'p' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\ntype GenericOption = { value: string; label?: string; icon?: string };\ntype HeadingOption = { value: HeadingTag; label?: string; icon?: string };\ntype NormalizedOption = { value: string; label: string; icon?: string };\n\nconst HEADING_ALLOWLIST: ReadonlySet<HeadingTag> = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'\n]);\n\nfunction isHeadingTag(v: string): v is HeadingTag {\n return HEADING_ALLOWLIST.has(v as HeadingTag);\n}\n\n@customElement('nile-rte-select')\nexport class NileRteSelect extends LitElement {\n protected createRenderRoot() { return this; }\n\n /** 'heading' | 'font' | 'align' */\n @property({ type: String }) type = '';\n\n /** JSON: [{ value, label?, icon? }, ...] (attribute-based; runtime-validated) */\n @property({ type: String }) options = '[]';\n\n /** Programmatic options (preferred for TS safety). */\n @property({ attribute: false })\n optionsObj?: Array<GenericOption | HeadingOption>;\n\n /** Fallback label for trigger (e.g., \"Align\") */\n @property({ type: String }) label = '';\n\n @state() private selectedValue = '';\n\n private mapAlignIcon(v: string) {\n const map: Record<string,string> = {\n left: 'format_align_left',\n center: 'format_align_middle',\n right: 'format_align_right',\n justify: 'format_align_justify'\n };\n return map[v] || 'format_align_left';\n }\n\n private get parsedOptions(): NormalizedOption[] {\n // Prefer programmatic options if present (gives TS compile-time checks)\n const source: unknown = this.optionsObj ?? this.options;\n\n const rawArray: any[] = (() => {\n if (Array.isArray(source)) return source;\n try { return JSON.parse(String(source)); } catch { return []; }\n })();\n\n // Normalize to consistent shape\n let items: NormalizedOption[] = rawArray.map((o: any) => {\n const value: string = o?.value ?? o;\n const label: string = o?.label ?? o?.value ?? o;\n const icon: string | undefined =\n o?.icon ?? (this.type === 'align' ? this.mapAlignIcon(String(value)) : undefined);\n return { value, label, icon };\n });\n\n // If type is heading, enforce allowlist (runtime validation)\n if (this.type === 'heading') {\n const before = items.length;\n items = items.filter(i => isHeadingTag(i.value));\n if (items.length !== before) {\n }\n // If current selection is invalid for heading, reset\n if (this.selectedValue && !isHeadingTag(this.selectedValue)) {\n this.selectedValue = '';\n }\n }\n\n return items;\n }\n\n private ensureDefault() {\n if (!this.selectedValue) {\n const first = this.parsedOptions[0];\n if (first) this.selectedValue = first.value;\n }\n }\n\n private onSelect(value: string) {\n if (this.type === 'heading' && !isHeadingTag(value)) {\n console.warn(`[nile-rte-select] Ignoring invalid heading value: ${value}`);\n return;\n }\n this.selectedValue = value;\n this.dispatchEvent(new CustomEvent('change', {\n detail: value, bubbles: true, composed: true\n }));\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.injectLocalStyles();\n }\n\n private injectLocalStyles() {\n if (this.querySelector('style[data-rte-select-style]')) return;\n\n const style = document.createElement('style');\n style.setAttribute('data-rte-select-style', 'true');\n style.textContent = `\n nile-menu.rte-align-menu::part(menu__items-wrapper) {\n display: flex;\n }\n nile-menu.rte-align-menu,\n nile-menu.rte-default-menu {\n margin-top: 0px;\n }\n nile-button.rte-align-trigger::part(base),\n nile-button.rte-default-trigger::part(base) {\n min-width: 32px;\n height: 32px;\n padding: 0px 6px;\n box-shadow: none;\n }\n nile-button.rte-align-trigger::part(base) {\n \n\n border: none;\n}\n `;\n this.insertBefore(style, this.firstChild);\n }\n\n render() {\n const opts = this.parsedOptions;\n this.ensureDefault();\n const current = opts.find(o => o.value === this.selectedValue);\n\n // ► Align: icon-only items + icon trigger\n if (this.type === 'align') {\n const trigger = current?.icon\n ? html`<nile-icon name=\"${current.icon}\"></nile-icon>`\n : (this.label || 'Align');\n\n return html`\n <nile-dropdown class=\"rte-align-dd\">\n <nile-button slot=\"trigger\" variant=\"tertiary\" class=\"rte-align-trigger\">\n ${trigger}\n </nile-button>\n <nile-menu class=\"rte-align-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n class=\"rte-align-item\"\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n <nile-icon name=\"${o.icon}\"></nile-icon>\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n\n // ► Font: show labels, preview fonts in items and trigger\n if (this.type === 'font') {\n const triggerText = current?.label || this.label || 'Font';\n return html`\n <nile-dropdown class=\"rte-default-dd\">\n <nile-button\n slot=\"trigger\"\n variant=\"tertiary\"\n class=\"rte-default-trigger\"\n style=\"font-family: ${current?.value || 'inherit'}\">\n ${triggerText} <nile-icon name=\"arrowdown\"></nile-icon>\n </nile-button>\n <nile-menu class=\"rte-default-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n style=\"font-family: ${o.value}\"\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n ${o.label}\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n\n // ► Default (e.g., heading): text items; heading values are validated already\n const triggerText = current?.label || this.label || 'Select';\n return html`\n <nile-dropdown class=\"rte-default-dd\">\n <nile-button slot=\"trigger\" variant=\"tertiary\" class=\"rte-default-trigger\">\n ${triggerText} <nile-icon name=\"arrowdown\"></nile-icon>\n </nile-button>\n <nile-menu class=\"rte-default-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n ${o.label}\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-select': NileRteSelect;\n }\n}\n"]}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
export function inlineComputedStyles(sourceEl) {
|
2
|
+
const clone = sourceEl.cloneNode(true);
|
3
|
+
const origWalker = document.createTreeWalker(sourceEl, NodeFilter.SHOW_ELEMENT);
|
4
|
+
const cloneWalker = document.createTreeWalker(clone, NodeFilter.SHOW_ELEMENT);
|
5
|
+
while (origWalker.nextNode() && cloneWalker.nextNode()) {
|
6
|
+
const origEl = origWalker.currentNode;
|
7
|
+
const cloneEl = cloneWalker.currentNode;
|
8
|
+
const computed = window.getComputedStyle(origEl);
|
9
|
+
const cssText = Array.from(computed).map(prop => `${prop}:${computed.getPropertyValue(prop)}`).join(';');
|
10
|
+
cloneEl.setAttribute('style', cssText);
|
11
|
+
}
|
12
|
+
return clone.innerHTML;
|
13
|
+
}
|
14
|
+
export function updateContentAndEmit(host, editorEl, previewEl) {
|
15
|
+
const content = inlineComputedStyles(editorEl);
|
16
|
+
if (previewEl)
|
17
|
+
previewEl.innerHTML = content;
|
18
|
+
host.dispatchEvent(new CustomEvent('content-changed', {
|
19
|
+
detail: { content },
|
20
|
+
bubbles: true,
|
21
|
+
composed: true,
|
22
|
+
}));
|
23
|
+
return content;
|
24
|
+
}
|
25
|
+
//# sourceMappingURL=content.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/content.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,QAAqB;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;IAEtD,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IAE9E,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,UAAU,CAAC,WAA0B,CAAC;QACrD,MAAM,OAAO,GAAG,WAAW,CAAC,WAA0B,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC,SAAS,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAiB,EAAE,QAAqB,EAAE,SAA6B;IAC1G,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,SAAS;QAAE,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC;IAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,EAAE;QACpD,MAAM,EAAE,EAAE,OAAO,EAAE;QACnB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC,CAAC;IACJ,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["export function inlineComputedStyles(sourceEl: HTMLElement): string {\n const clone = sourceEl.cloneNode(true) as HTMLElement;\n \n const origWalker = document.createTreeWalker(sourceEl, NodeFilter.SHOW_ELEMENT);\n const cloneWalker = document.createTreeWalker(clone, NodeFilter.SHOW_ELEMENT);\n \n while (origWalker.nextNode() && cloneWalker.nextNode()) {\n const origEl = origWalker.currentNode as HTMLElement;\n const cloneEl = cloneWalker.currentNode as HTMLElement;\n const computed = window.getComputedStyle(origEl);\n const cssText = Array.from(computed).map(prop => `${prop}:${computed.getPropertyValue(prop)}`).join(';');\n cloneEl.setAttribute('style', cssText);\n }\n \n return clone.innerHTML;\n }\n \n export function updateContentAndEmit(host: HTMLElement, editorEl: HTMLElement, previewEl: HTMLElement | null): string {\n const content = inlineComputedStyles(editorEl);\n if (previewEl) previewEl.innerHTML = content;\n host.dispatchEvent(new CustomEvent('content-changed', {\n detail: { content },\n bubbles: true,\n composed: true,\n }));\n return content;\n }\n "]}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare function injectCss(host: HTMLElement, cssText: string): void;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
export function injectCss(host, cssText) {
|
2
|
+
if (host.querySelector('style[data-rte-style]'))
|
3
|
+
return;
|
4
|
+
const style = document.createElement('style');
|
5
|
+
style.setAttribute('data-rte-style', 'true');
|
6
|
+
style.textContent = cssText;
|
7
|
+
host.insertBefore(style, host.firstChild);
|
8
|
+
}
|
9
|
+
//# sourceMappingURL=css.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/css.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,IAAiB,EAAE,OAAe;IACxD,IAAI,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC;QAAE,OAAO;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC7C,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["export function injectCss(host: HTMLElement, cssText: string) {\n if (host.querySelector('style[data-rte-style]')) return;\n const style = document.createElement('style');\n style.setAttribute('data-rte-style', 'true');\n style.textContent = cssText;\n host.insertBefore(style, host.firstChild);\n }"]}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
export function ensureEditor(host, toolbarEl, previewEl) {
|
2
|
+
let editorEl = host.querySelector('.editor');
|
3
|
+
if (!editorEl) {
|
4
|
+
const editor = document.createElement('article');
|
5
|
+
editor.className = 'editor';
|
6
|
+
editor.setAttribute('contenteditable', 'true');
|
7
|
+
if (toolbarEl?.nextSibling) {
|
8
|
+
host.insertBefore(editor, toolbarEl.nextSibling);
|
9
|
+
}
|
10
|
+
else if (previewEl) {
|
11
|
+
host.insertBefore(editor, previewEl);
|
12
|
+
}
|
13
|
+
else {
|
14
|
+
host.appendChild(editor);
|
15
|
+
}
|
16
|
+
editorEl = editor;
|
17
|
+
}
|
18
|
+
if (!editorEl.innerHTML.trim())
|
19
|
+
editorEl.innerHTML = '<p><br></p>';
|
20
|
+
ensureAtLeastOneParagraph(editorEl);
|
21
|
+
return editorEl;
|
22
|
+
}
|
23
|
+
export function ensureAtLeastOneParagraph(el) {
|
24
|
+
if (!el)
|
25
|
+
return;
|
26
|
+
const onlyWhitespace = (el.textContent ?? '').replace(/\u200B/g, '').trim() === '';
|
27
|
+
if (el.childNodes.length === 0 || onlyWhitespace) {
|
28
|
+
el.innerHTML = '<p><br></p>';
|
29
|
+
return;
|
30
|
+
}
|
31
|
+
const hasBlock = el.querySelector('p,h1,h2,h3,h4,h5,h6,ul,ol,table,blockquote,pre');
|
32
|
+
if (!hasBlock) {
|
33
|
+
const p = document.createElement('p');
|
34
|
+
while (el.firstChild)
|
35
|
+
p.appendChild(el.firstChild);
|
36
|
+
if (!p.hasChildNodes())
|
37
|
+
p.appendChild(document.createElement('br'));
|
38
|
+
el.appendChild(p);
|
39
|
+
return;
|
40
|
+
}
|
41
|
+
el.querySelectorAll('p').forEach(p => {
|
42
|
+
if ((p.textContent ?? '').replace(/\u200B/g, '') === '') {
|
43
|
+
if (!p.innerHTML.toLowerCase().includes('<br'))
|
44
|
+
p.innerHTML = '<br>';
|
45
|
+
}
|
46
|
+
});
|
47
|
+
}
|
48
|
+
//# sourceMappingURL=dom.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/dom.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,IAAiB,EAAE,SAA8B,EAAE,SAA8B;IAC1G,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAuB,CAAC;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC5B,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,SAAS,GAAG,aAAa,CAAC;IACnE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EAAe;IACvD,IAAI,CAAC,EAAE;QAAE,OAAO;IAEhB,MAAM,cAAc,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IACnF,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;QACjD,EAAE,CAAC,SAAS,GAAG,aAAa,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,gDAAgD,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,EAAE,CAAC,UAAU;YAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE;YAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACnC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["export function ensureEditor(host: HTMLElement, toolbarEl?: HTMLElement | null, previewEl?: HTMLElement | null) {\n let editorEl = host.querySelector('.editor') as HTMLElement | null;\n if (!editorEl) {\n const editor = document.createElement('article');\n editor.className = 'editor';\n editor.setAttribute('contenteditable', 'true');\n if (toolbarEl?.nextSibling) {\n host.insertBefore(editor, toolbarEl.nextSibling);\n } else if (previewEl) {\n host.insertBefore(editor, previewEl);\n } else {\n host.appendChild(editor);\n }\n editorEl = editor;\n }\n if (!editorEl.innerHTML.trim()) editorEl.innerHTML = '<p><br></p>';\n ensureAtLeastOneParagraph(editorEl);\n return editorEl;\n }\n \n export function ensureAtLeastOneParagraph(el: HTMLElement) {\n if (!el) return;\n \n const onlyWhitespace = (el.textContent ?? '').replace(/\\u200B/g, '').trim() === '';\n if (el.childNodes.length === 0 || onlyWhitespace) {\n el.innerHTML = '<p><br></p>';\n return;\n }\n \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 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 "]}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
const FORMATTING_TAGS = new Set(['B', 'STRONG', 'I', 'EM', 'U', 'SPAN', 'FONT', 'A']);
|
2
|
+
function isFormatting(el) {
|
3
|
+
return FORMATTING_TAGS.has(el.tagName) || el.hasAttribute('style');
|
4
|
+
}
|
5
|
+
function liftOutOfFormatting(editorEl, marker) {
|
6
|
+
let p = marker.parentElement;
|
7
|
+
while (p && p !== editorEl && isFormatting(p)) {
|
8
|
+
const before = p.cloneNode(false);
|
9
|
+
const after = p.cloneNode(false);
|
10
|
+
while (p.firstChild && p.firstChild !== marker)
|
11
|
+
before.appendChild(p.firstChild);
|
12
|
+
while (marker.nextSibling)
|
13
|
+
after.appendChild(marker.nextSibling);
|
14
|
+
if (before.firstChild)
|
15
|
+
p.parentNode.insertBefore(before, p);
|
16
|
+
p.parentNode.insertBefore(marker, p);
|
17
|
+
if (after.firstChild)
|
18
|
+
p.parentNode.insertBefore(after, p);
|
19
|
+
const next = p.parentElement;
|
20
|
+
p.remove();
|
21
|
+
p = next;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
export function clearSelectionFormatting(selection, editorEl) {
|
25
|
+
selection.focusAndRestore();
|
26
|
+
const sel = window.getSelection();
|
27
|
+
if (!sel || sel.rangeCount === 0)
|
28
|
+
return;
|
29
|
+
const range = sel.getRangeAt(0);
|
30
|
+
if (!editorEl.contains(range.commonAncestorContainer))
|
31
|
+
return;
|
32
|
+
if (range.collapsed)
|
33
|
+
return;
|
34
|
+
const frag = range.extractContents();
|
35
|
+
const walker = document.createTreeWalker(frag, NodeFilter.SHOW_ELEMENT);
|
36
|
+
const toUnwrap = [];
|
37
|
+
while (walker.nextNode()) {
|
38
|
+
const el = walker.currentNode;
|
39
|
+
el.removeAttribute('style');
|
40
|
+
if (FORMATTING_TAGS.has(el.tagName))
|
41
|
+
toUnwrap.push(el);
|
42
|
+
}
|
43
|
+
for (const el of toUnwrap) {
|
44
|
+
const parent = el.parentNode;
|
45
|
+
while (el.firstChild)
|
46
|
+
parent.insertBefore(el.firstChild, el);
|
47
|
+
parent.removeChild(el);
|
48
|
+
}
|
49
|
+
const marker = document.createElement('span');
|
50
|
+
marker.setAttribute('data-rte-clear', '1');
|
51
|
+
marker.appendChild(frag);
|
52
|
+
range.insertNode(marker);
|
53
|
+
liftOutOfFormatting(editorEl, marker);
|
54
|
+
const last = marker.lastChild;
|
55
|
+
const parent = marker.parentNode;
|
56
|
+
while (marker.firstChild)
|
57
|
+
parent.insertBefore(marker.firstChild, marker);
|
58
|
+
parent.removeChild(marker);
|
59
|
+
const r = document.createRange();
|
60
|
+
if (last)
|
61
|
+
r.setStartAfter(last);
|
62
|
+
else
|
63
|
+
r.setStart(parent, parent.childNodes?.length ?? 0);
|
64
|
+
r.collapse(true);
|
65
|
+
sel.removeAllRanges();
|
66
|
+
sel.addRange(r);
|
67
|
+
selection.save();
|
68
|
+
}
|
69
|
+
//# sourceMappingURL=formatting.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/formatting.ts"],"names":[],"mappings":"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","sourcesContent":["import { SelectionManager } from './selection';\n\nconst FORMATTING_TAGS = new Set(['B','STRONG','I','EM','U','SPAN','FONT','A']);\n\nfunction isFormatting(el: HTMLElement) {\n return FORMATTING_TAGS.has(el.tagName) || el.hasAttribute('style');\n}\n\nfunction liftOutOfFormatting(editorEl: HTMLElement, marker: HTMLElement) {\n let p: HTMLElement | null = marker.parentElement;\n while (p && p !== editorEl && isFormatting(p)) {\n const before = p.cloneNode(false) as HTMLElement;\n const after = p.cloneNode(false) as HTMLElement;\n\n while (p.firstChild && p.firstChild !== marker) before.appendChild(p.firstChild);\n while (marker.nextSibling) after.appendChild(marker.nextSibling);\n\n if (before.firstChild) p.parentNode!.insertBefore(before, p);\n p.parentNode!.insertBefore(marker, p);\n if (after.firstChild) p.parentNode!.insertBefore(after, p);\n\n const next = p.parentElement;\n p.remove();\n p = next;\n }\n}\n\nexport function clearSelectionFormatting(selection: SelectionManager, editorEl: HTMLElement) {\n selection.focusAndRestore();\n\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n\n const range = sel.getRangeAt(0);\n if (!editorEl.contains(range.commonAncestorContainer)) return;\n if (range.collapsed) return;\n\n const frag = range.extractContents();\n\n const walker = document.createTreeWalker(frag, NodeFilter.SHOW_ELEMENT);\n const toUnwrap: HTMLElement[] = [];\n while (walker.nextNode()) {\n const el = walker.currentNode as HTMLElement;\n el.removeAttribute('style');\n if (FORMATTING_TAGS.has(el.tagName)) toUnwrap.push(el);\n }\n for (const el of toUnwrap) {\n const parent = el.parentNode!;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n parent.removeChild(el);\n }\n\n const marker = document.createElement('span');\n marker.setAttribute('data-rte-clear', '1');\n marker.appendChild(frag);\n range.insertNode(marker);\n\n liftOutOfFormatting(editorEl, marker);\n\n const last = marker.lastChild;\n const parent = marker.parentNode!;\n while (marker.firstChild) parent.insertBefore(marker.firstChild, marker);\n parent.removeChild(marker);\n\n const r = document.createRange();\n if (last) r.setStartAfter(last); else r.setStart(parent, (parent as any).childNodes?.length ?? 0);\n r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n\n selection.save();\n}"]}
|