@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.
Files changed (223) hide show
  1. package/demo/index.html +24 -11
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.esm.js +1 -1
  4. package/dist/index.js +130 -58
  5. package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
  6. package/dist/nile-avatar/nile-avatar.test.cjs.js.map +1 -1
  7. package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
  8. package/dist/nile-badge/index.cjs.js +1 -1
  9. package/dist/nile-badge/index.esm.js +1 -1
  10. package/dist/nile-badge/nile-badge.cjs.js +1 -1
  11. package/dist/nile-badge/nile-badge.cjs.js.map +1 -1
  12. package/dist/nile-badge/nile-badge.esm.js +1 -1
  13. package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
  14. package/dist/nile-badge/nile-badge.test.cjs.js.map +1 -1
  15. package/dist/nile-badge/nile-badge.test.esm.js +1 -1
  16. package/dist/nile-button/index.cjs.js +1 -1
  17. package/dist/nile-button/index.esm.js +1 -1
  18. package/dist/nile-button/nile-button.cjs.js +1 -1
  19. package/dist/nile-button/nile-button.cjs.js.map +1 -1
  20. package/dist/nile-button/nile-button.esm.js +1 -1
  21. package/dist/nile-button/nile-button.test.cjs.js +1 -1
  22. package/dist/nile-button/nile-button.test.cjs.js.map +1 -1
  23. package/dist/nile-button/nile-button.test.esm.js +1 -1
  24. package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
  25. package/dist/nile-calendar/nile-calendar.test.cjs.js.map +1 -1
  26. package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
  27. package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
  28. package/dist/nile-chip/nile-chip.test.cjs.js.map +1 -1
  29. package/dist/nile-chip/nile-chip.test.esm.js +1 -1
  30. package/dist/nile-dialog/index.cjs.js +1 -1
  31. package/dist/nile-dialog/index.esm.js +1 -1
  32. package/dist/nile-dialog/nile-dialog.cjs.js +1 -1
  33. package/dist/nile-dialog/nile-dialog.cjs.js.map +1 -1
  34. package/dist/nile-dialog/nile-dialog.esm.js +2 -2
  35. package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
  36. package/dist/nile-dialog/nile-dialog.test.cjs.js.map +1 -1
  37. package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
  38. package/dist/nile-drawer/index.cjs.js +1 -1
  39. package/dist/nile-drawer/index.esm.js +1 -1
  40. package/dist/nile-drawer/nile-drawer.cjs.js +1 -1
  41. package/dist/nile-drawer/nile-drawer.cjs.js.map +1 -1
  42. package/dist/nile-drawer/nile-drawer.esm.js +1 -1
  43. package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
  44. package/dist/nile-drawer/nile-drawer.test.cjs.js.map +1 -1
  45. package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
  46. package/dist/nile-icon/icons/svg/format_clear.cjs.js +2 -0
  47. package/dist/nile-icon/icons/svg/format_clear.cjs.js.map +1 -0
  48. package/dist/nile-icon/icons/svg/format_clear.esm.js +1 -0
  49. package/dist/nile-icon/icons/svg/format_list_bulleted.cjs.js +2 -0
  50. package/dist/nile-icon/icons/svg/format_list_bulleted.cjs.js.map +1 -0
  51. package/dist/nile-icon/icons/svg/format_list_bulleted.esm.js +1 -0
  52. package/dist/nile-icon/icons/svg/format_list_numbered.cjs.js +2 -0
  53. package/dist/nile-icon/icons/svg/format_list_numbered.cjs.js.map +1 -0
  54. package/dist/nile-icon/icons/svg/format_list_numbered.esm.js +1 -0
  55. package/dist/nile-icon/icons/svg/index.cjs.js +1 -1
  56. package/dist/nile-icon/icons/svg/index.esm.js +1 -1
  57. package/dist/nile-icon/index.cjs.js +1 -1
  58. package/dist/nile-icon/index.cjs.js.map +1 -1
  59. package/dist/nile-icon/index.esm.js +2 -2
  60. package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
  61. package/dist/nile-icon/nile-icon.test.cjs.js.map +1 -1
  62. package/dist/nile-icon/nile-icon.test.esm.js +1 -1
  63. package/dist/nile-icon-button/index.cjs.js +1 -1
  64. package/dist/nile-icon-button/index.esm.js +1 -1
  65. package/dist/nile-icon-button/nile-icon-button.cjs.js +1 -1
  66. package/dist/nile-icon-button/nile-icon-button.cjs.js.map +1 -1
  67. package/dist/nile-icon-button/nile-icon-button.esm.js +1 -1
  68. package/dist/nile-input/index.cjs.js +1 -1
  69. package/dist/nile-input/index.esm.js +1 -1
  70. package/dist/nile-input/nile-input.cjs.js +1 -1
  71. package/dist/nile-input/nile-input.cjs.js.map +1 -1
  72. package/dist/nile-input/nile-input.esm.js +1 -1
  73. package/dist/nile-input/nile-input.test.cjs.js +1 -1
  74. package/dist/nile-input/nile-input.test.cjs.js.map +1 -1
  75. package/dist/nile-input/nile-input.test.esm.js +1 -1
  76. package/dist/nile-menu-item/index.cjs.js +1 -1
  77. package/dist/nile-menu-item/index.esm.js +1 -1
  78. package/dist/nile-menu-item/nile-menu-item.cjs.js +1 -1
  79. package/dist/nile-menu-item/nile-menu-item.cjs.js.map +1 -1
  80. package/dist/nile-menu-item/nile-menu-item.esm.js +1 -1
  81. package/dist/nile-option/index.cjs.js +1 -1
  82. package/dist/nile-option/index.esm.js +1 -1
  83. package/dist/nile-option/nile-option.cjs.js +1 -1
  84. package/dist/nile-option/nile-option.cjs.js.map +1 -1
  85. package/dist/nile-option/nile-option.esm.js +1 -1
  86. package/dist/nile-rich-text-editor/index.cjs.js +1 -1
  87. package/dist/nile-rich-text-editor/index.esm.js +1 -1
  88. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
  89. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
  90. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
  91. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
  92. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +14 -13
  93. package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
  94. package/dist/nile-rich-text-editor/nile-rte-color.cjs.js +1 -1
  95. package/dist/nile-rich-text-editor/nile-rte-color.cjs.js.map +1 -1
  96. package/dist/nile-rich-text-editor/nile-rte-color.esm.js +54 -1
  97. package/dist/nile-rich-text-editor/nile-rte-link.cjs.js +2 -0
  98. package/dist/nile-rich-text-editor/nile-rte-link.cjs.js.map +1 -0
  99. package/dist/nile-rich-text-editor/nile-rte-link.esm.js +19 -0
  100. package/dist/nile-rich-text-editor/nile-rte-select.cjs.js +1 -1
  101. package/dist/nile-rich-text-editor/nile-rte-select.cjs.js.map +1 -1
  102. package/dist/nile-rich-text-editor/nile-rte-select.esm.js +39 -39
  103. package/dist/nile-rich-text-editor/utils.cjs.js +1 -1
  104. package/dist/nile-rich-text-editor/utils.cjs.js.map +1 -1
  105. package/dist/nile-rich-text-editor/utils.esm.js +1 -1
  106. package/dist/nile-select/index.cjs.js +1 -1
  107. package/dist/nile-select/index.esm.js +1 -1
  108. package/dist/nile-select/nile-select.cjs.js +1 -1
  109. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  110. package/dist/nile-select/nile-select.esm.js +1 -1
  111. package/dist/nile-select/nile-select.test.cjs.js +1 -1
  112. package/dist/nile-select/nile-select.test.cjs.js.map +1 -1
  113. package/dist/nile-select/nile-select.test.esm.js +1 -1
  114. package/dist/nile-tab/index.cjs.js +1 -1
  115. package/dist/nile-tab/index.esm.js +1 -1
  116. package/dist/nile-tab/nile-tab.cjs.js +1 -1
  117. package/dist/nile-tab/nile-tab.cjs.js.map +1 -1
  118. package/dist/nile-tab/nile-tab.esm.js +1 -1
  119. package/dist/nile-tab-group/index.cjs.js +1 -1
  120. package/dist/nile-tab-group/index.esm.js +1 -1
  121. package/dist/nile-tab-group/nile-tab-group.cjs.js +1 -1
  122. package/dist/nile-tab-group/nile-tab-group.cjs.js.map +1 -1
  123. package/dist/nile-tab-group/nile-tab-group.esm.js +1 -1
  124. package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
  125. package/dist/nile-tab-group/nile-tab-group.test.cjs.js.map +1 -1
  126. package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
  127. package/dist/nile-tag/index.cjs.js +1 -1
  128. package/dist/nile-tag/index.esm.js +1 -1
  129. package/dist/nile-tag/nile-tag.cjs.js +1 -1
  130. package/dist/nile-tag/nile-tag.cjs.js.map +1 -1
  131. package/dist/nile-tag/nile-tag.esm.js +1 -1
  132. package/dist/nile-toast/index.cjs.js +1 -1
  133. package/dist/nile-toast/index.esm.js +1 -1
  134. package/dist/nile-toast/nile-toast.cjs.js +1 -1
  135. package/dist/nile-toast/nile-toast.cjs.js.map +1 -1
  136. package/dist/nile-toast/nile-toast.esm.js +1 -1
  137. package/dist/nile-tree/index.cjs.js +1 -1
  138. package/dist/nile-tree/index.esm.js +1 -1
  139. package/dist/nile-tree/nile-tree.cjs.js +1 -1
  140. package/dist/nile-tree/nile-tree.cjs.js.map +1 -1
  141. package/dist/nile-tree/nile-tree.esm.js +1 -1
  142. package/dist/nile-tree-item/index.cjs.js +1 -1
  143. package/dist/nile-tree-item/index.esm.js +1 -1
  144. package/dist/nile-tree-item/nile-tree-item.cjs.js +1 -1
  145. package/dist/nile-tree-item/nile-tree-item.cjs.js.map +1 -1
  146. package/dist/nile-tree-item/nile-tree-item.esm.js +1 -1
  147. package/dist/nile-virtual-select/index.cjs.js +1 -1
  148. package/dist/nile-virtual-select/index.esm.js +1 -1
  149. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
  150. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  151. package/dist/nile-virtual-select/nile-virtual-select.esm.js +1 -1
  152. package/dist/src/nile-icon/icons/svg/format_clear.d.ts +5 -0
  153. package/dist/src/nile-icon/icons/svg/format_clear.js +5 -0
  154. package/dist/src/nile-icon/icons/svg/format_clear.js.map +1 -0
  155. package/dist/src/nile-icon/icons/svg/format_list_bulleted.d.ts +5 -0
  156. package/dist/src/nile-icon/icons/svg/format_list_bulleted.js +5 -0
  157. package/dist/src/nile-icon/icons/svg/format_list_bulleted.js.map +1 -0
  158. package/dist/src/nile-icon/icons/svg/format_list_numbered.d.ts +5 -0
  159. package/dist/src/nile-icon/icons/svg/format_list_numbered.js +5 -0
  160. package/dist/src/nile-icon/icons/svg/format_list_numbered.js.map +1 -0
  161. package/dist/src/nile-icon/icons/svg/index.d.ts +3 -0
  162. package/dist/src/nile-icon/icons/svg/index.js +3 -0
  163. package/dist/src/nile-icon/icons/svg/index.js.map +1 -1
  164. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +14 -13
  165. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
  166. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +1 -0
  167. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +38 -90
  168. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
  169. package/dist/src/nile-rich-text-editor/nile-rte-color.d.ts +11 -3
  170. package/dist/src/nile-rich-text-editor/nile-rte-color.js +171 -6
  171. package/dist/src/nile-rich-text-editor/nile-rte-color.js.map +1 -1
  172. package/dist/src/nile-rich-text-editor/nile-rte-link.d.ts +19 -0
  173. package/dist/src/nile-rich-text-editor/nile-rte-link.js +172 -0
  174. package/dist/src/nile-rich-text-editor/nile-rte-link.js.map +1 -0
  175. package/dist/src/nile-rich-text-editor/nile-rte-select.js +62 -57
  176. package/dist/src/nile-rich-text-editor/nile-rte-select.js.map +1 -1
  177. package/dist/src/nile-rich-text-editor/rte-utils/content.d.ts +2 -0
  178. package/dist/src/nile-rich-text-editor/rte-utils/content.js +25 -0
  179. package/dist/src/nile-rich-text-editor/rte-utils/content.js.map +1 -0
  180. package/dist/src/nile-rich-text-editor/rte-utils/css.d.ts +1 -0
  181. package/dist/src/nile-rich-text-editor/rte-utils/css.js +9 -0
  182. package/dist/src/nile-rich-text-editor/rte-utils/css.js.map +1 -0
  183. package/dist/src/nile-rich-text-editor/rte-utils/dom.d.ts +2 -0
  184. package/dist/src/nile-rich-text-editor/rte-utils/dom.js +48 -0
  185. package/dist/src/nile-rich-text-editor/rte-utils/dom.js.map +1 -0
  186. package/dist/src/nile-rich-text-editor/rte-utils/formatting.d.ts +2 -0
  187. package/dist/src/nile-rich-text-editor/rte-utils/formatting.js +69 -0
  188. package/dist/src/nile-rich-text-editor/rte-utils/formatting.js.map +1 -0
  189. package/dist/src/nile-rich-text-editor/rte-utils/keys.d.ts +2 -0
  190. package/dist/src/nile-rich-text-editor/rte-utils/keys.js +38 -0
  191. package/dist/src/nile-rich-text-editor/rte-utils/keys.js.map +1 -0
  192. package/dist/src/nile-rich-text-editor/rte-utils/lists.d.ts +2 -0
  193. package/dist/src/nile-rich-text-editor/rte-utils/lists.js +28 -0
  194. package/dist/src/nile-rich-text-editor/rte-utils/lists.js.map +1 -0
  195. package/dist/src/nile-rich-text-editor/rte-utils/selection.d.ts +17 -0
  196. package/dist/src/nile-rich-text-editor/rte-utils/selection.js +39 -0
  197. package/dist/src/nile-rich-text-editor/rte-utils/selection.js.map +1 -0
  198. package/dist/src/nile-rich-text-editor/rte-utils/toolbar.d.ts +28 -0
  199. package/dist/src/nile-rich-text-editor/rte-utils/toolbar.js +161 -0
  200. package/dist/src/nile-rich-text-editor/rte-utils/toolbar.js.map +1 -0
  201. package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.d.ts +13 -0
  202. package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.js +119 -0
  203. package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.js.map +1 -0
  204. package/dist/src/nile-rich-text-editor/rte-utils/vars.d.ts +1 -0
  205. package/dist/src/nile-rich-text-editor/rte-utils/vars.js +14 -0
  206. package/dist/src/nile-rich-text-editor/rte-utils/vars.js.map +1 -0
  207. package/dist/src/nile-rich-text-editor/sanatize.d.ts +1 -0
  208. package/dist/src/nile-rich-text-editor/sanatize.js +40 -0
  209. package/dist/src/nile-rich-text-editor/sanatize.js.map +1 -0
  210. package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
  211. package/dist/tsconfig.tsbuildinfo +1 -1
  212. package/package.json +1 -1
  213. package/src/nile-icon/icons/svg/format_clear.ts +5 -0
  214. package/src/nile-icon/icons/svg/format_list_bulleted.ts +5 -0
  215. package/src/nile-icon/icons/svg/format_list_numbered.ts +5 -0
  216. package/src/nile-icon/icons/svg/index.ts +3 -0
  217. package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +14 -13
  218. package/src/nile-rich-text-editor/nile-rich-text-editor.ts +56 -90
  219. package/src/nile-rich-text-editor/nile-rte-color.ts +182 -6
  220. package/src/nile-rich-text-editor/nile-rte-link.ts +161 -0
  221. package/src/nile-rich-text-editor/nile-rte-select.ts +178 -173
  222. package/src/nile-rich-text-editor/utils.ts +342 -341
  223. 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] || 'align-left';
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
- 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
- `;
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
- <nile-dropdown class="rte-align-dd">
120
- <nile-button slot="trigger" variant="tertiary" class="rte-align-trigger">
121
- ${trigger}
122
- </nile-button>
123
- <nile-menu class="rte-align-menu">
124
- ${opts.map(o => html `
125
- <nile-menu-item
126
- class="rte-align-item"
127
- ?active=${o.value === this.selectedValue}
128
- @click=${() => this.onSelect(o.value)}>
129
- <nile-icon name="${o.icon}"></nile-icon>
130
- </nile-menu-item>
131
- `)}
132
- </nile-menu>
133
- </nile-dropdown>
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 slot="trigger" variant="tertiary" class="rte-default-trigger">
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":"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","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,2 @@
1
+ export declare function inlineComputedStyles(sourceEl: HTMLElement): string;
2
+ export declare function updateContentAndEmit(host: HTMLElement, editorEl: HTMLElement, previewEl: HTMLElement | null): string;
@@ -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,2 @@
1
+ export declare function ensureEditor(host: HTMLElement, toolbarEl?: HTMLElement | null, previewEl?: HTMLElement | null): HTMLElement;
2
+ export declare function ensureAtLeastOneParagraph(el: HTMLElement): void;
@@ -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,2 @@
1
+ import { SelectionManager } from './selection';
2
+ export declare function clearSelectionFormatting(selection: SelectionManager, editorEl: HTMLElement): void;
@@ -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}"]}
@@ -0,0 +1,2 @@
1
+ import { SelectionManager } from './selection';
2
+ export declare function handleTabKey(e: KeyboardEvent, selection: SelectionManager, onContent: () => void, onToolbar: () => void): void;