@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,38 @@
1
+ export function handleTabKey(e, selection, onContent, onToolbar) {
2
+ e.preventDefault();
3
+ selection.focusAndRestore();
4
+ const sel = window.getSelection();
5
+ if (!sel || sel.rangeCount === 0)
6
+ return;
7
+ const range = sel.getRangeAt(0);
8
+ if (e.shiftKey) {
9
+ if (range.collapsed && range.startContainer.nodeType === Node.TEXT_NODE) {
10
+ const t = range.startContainer;
11
+ const off = range.startOffset;
12
+ const before = t.data.slice(0, off);
13
+ const removed = before.replace(/(\t|[ \u00a0]{2})$/, '');
14
+ if (removed.length !== before.length) {
15
+ t.data = removed + t.data.slice(off);
16
+ const r = document.createRange();
17
+ r.setStart(t, removed.length);
18
+ r.collapse(true);
19
+ sel.removeAllRanges();
20
+ sel.addRange(r);
21
+ onContent();
22
+ onToolbar();
23
+ }
24
+ }
25
+ return;
26
+ }
27
+ range.deleteContents();
28
+ const tabNode = document.createTextNode('\t');
29
+ range.insertNode(tabNode);
30
+ const r = document.createRange();
31
+ r.setStartAfter(tabNode);
32
+ r.collapse(true);
33
+ sel.removeAllRanges();
34
+ sel.addRange(r);
35
+ onContent();
36
+ onToolbar();
37
+ }
38
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/keys.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAC1B,CAAgB,EAChB,SAA2B,EAC3B,SAAqB,EACrB,SAAqB;IAErB,CAAC,CAAC,cAAc,EAAE,CAAC;IACnB,SAAS,CAAC,eAAe,EAAE,CAAC;IAE5B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAK,CAAS,CAAC,QAAQ,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACxE,MAAM,CAAC,GAAG,KAAK,CAAC,cAAsB,CAAC;YACvC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;YAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;gBACrC,CAAC,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACjC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACjB,GAAG,CAAC,eAAe,EAAE,CAAC;gBAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACvC,SAAS,EAAE,CAAC;gBAAC,SAAS,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE1B,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,GAAG,CAAC,eAAe,EAAE,CAAC;IAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEvC,SAAS,EAAE,CAAC;IAAC,SAAS,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["import { SelectionManager } from './selection';\n\nexport function handleTabKey(\n e: KeyboardEvent,\n selection: SelectionManager,\n onContent: () => void,\n onToolbar: () => void,\n) {\n e.preventDefault();\n selection.focusAndRestore();\n\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n if ((e as any).shiftKey) {\n if (range.collapsed && range.startContainer.nodeType === Node.TEXT_NODE) {\n const t = range.startContainer as Text;\n const off = range.startOffset;\n const before = t.data.slice(0, off);\n const removed = before.replace(/(\\t|[ \\u00a0]{2})$/, '');\n if (removed.length !== before.length) {\n t.data = removed + t.data.slice(off);\n const r = document.createRange();\n r.setStart(t, removed.length);\n r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n onContent(); onToolbar();\n }\n }\n return;\n }\n\n range.deleteContents();\n const tabNode = document.createTextNode('\\t');\n range.insertNode(tabNode);\n\n const r = document.createRange();\n r.setStartAfter(tabNode);\n r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n\n onContent(); onToolbar();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { SelectionManager } from './selection';
2
+ export declare function insertList(type: 'ul' | 'ol', selection: SelectionManager): void;
@@ -0,0 +1,28 @@
1
+ export function insertList(type, selection) {
2
+ selection.restore();
3
+ if (!selection.lastRange)
4
+ return;
5
+ const list = document.createElement(type);
6
+ const frag = selection.lastRange.extractContents();
7
+ const temp = document.createElement('div');
8
+ temp.appendChild(frag);
9
+ Array.from(temp.childNodes).forEach(n => {
10
+ if (n.nodeType === Node.TEXT_NODE && !(n.textContent ?? '').trim())
11
+ return;
12
+ const li = document.createElement('li');
13
+ li.appendChild(n); // moves node
14
+ list.appendChild(li);
15
+ });
16
+ selection.lastRange.insertNode(list);
17
+ afterListEdit(selection, list);
18
+ }
19
+ function afterListEdit(selection, node) {
20
+ const range = document.createRange();
21
+ range.setStartAfter(node);
22
+ range.collapse(true);
23
+ const sel = window.getSelection();
24
+ sel?.removeAllRanges();
25
+ sel?.addRange(range);
26
+ selection.save();
27
+ }
28
+ //# sourceMappingURL=lists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/lists.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAiB,EAAE,SAA2B;IACvE,SAAS,CAAC,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC,SAAS,CAAC,SAAS;QAAE,OAAO;IAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAEvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAAE,OAAO;QAC3E,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;QAChC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACrC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,SAA2B,EAAE,IAAU;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IAClC,GAAG,EAAE,eAAe,EAAE,CAAC;IACvB,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrB,SAAS,CAAC,IAAI,EAAE,CAAC;AACnB,CAAC","sourcesContent":["import { SelectionManager } from './selection';\n\nexport function insertList(type: 'ul' | 'ol', selection: SelectionManager) {\n selection.restore();\n if (!selection.lastRange) return;\n\n const list = document.createElement(type);\n const frag = selection.lastRange.extractContents();\n const temp = document.createElement('div');\n temp.appendChild(frag);\n\n Array.from(temp.childNodes).forEach(n => {\n if (n.nodeType === Node.TEXT_NODE && !(n.textContent ?? '').trim()) return;\n const li = document.createElement('li');\n li.appendChild(n); // moves node\n list.appendChild(li);\n });\n\n selection.lastRange.insertNode(list);\n afterListEdit(selection, list);\n}\n\nfunction afterListEdit(selection: SelectionManager, node: Node) {\n const range = document.createRange();\n range.setStartAfter(node);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n selection.save();\n}"]}
@@ -0,0 +1,17 @@
1
+ export declare class SelectionManager {
2
+ private host;
3
+ private onChange;
4
+ editorEl: HTMLElement;
5
+ lastRange: Range | null;
6
+ private handler;
7
+ constructor(args: {
8
+ host: HTMLElement;
9
+ editorEl: HTMLElement;
10
+ onChange: () => void;
11
+ });
12
+ start(): void;
13
+ stop(): void;
14
+ save(): void;
15
+ restore(): void;
16
+ focusAndRestore(): void;
17
+ }
@@ -0,0 +1,39 @@
1
+ export class SelectionManager {
2
+ constructor(args) {
3
+ this.lastRange = null;
4
+ this.host = args.host;
5
+ this.editorEl = args.editorEl;
6
+ this.onChange = args.onChange;
7
+ }
8
+ start() {
9
+ this.handler = () => {
10
+ const sel = document.getSelection();
11
+ if (!sel || sel.rangeCount === 0)
12
+ return;
13
+ const range = sel.getRangeAt(0);
14
+ if (this.editorEl.contains(range.commonAncestorContainer)) {
15
+ this.lastRange = range.cloneRange();
16
+ this.onChange();
17
+ }
18
+ };
19
+ document.addEventListener('selectionchange', this.handler, true);
20
+ }
21
+ stop() { if (this.handler)
22
+ document.removeEventListener('selectionchange', this.handler, true); }
23
+ save() {
24
+ const sel = window.getSelection();
25
+ if (sel && sel.rangeCount)
26
+ this.lastRange = sel.getRangeAt(0).cloneRange();
27
+ }
28
+ restore() {
29
+ if (!this.lastRange)
30
+ return;
31
+ const sel = document.getSelection();
32
+ if (!sel)
33
+ return;
34
+ sel.removeAllRanges();
35
+ sel.addRange(this.lastRange);
36
+ }
37
+ focusAndRestore() { this.editorEl?.focus(); this.restore(); }
38
+ }
39
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/selection.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAgB;IAOzB,YAAY,IAAwE;QAH7E,cAAS,GAAiB,IAAI,CAAC;QAIpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC;gBAAE,OAAO;YACzC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO;QAAE,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjG,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU;YAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC7E,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;QAAC,IAAI,CAAC,GAAG;YAAE,OAAO;QACtD,GAAG,CAAC,eAAe,EAAE,CAAC;QAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,eAAe,KAAK,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;CAC9D","sourcesContent":["export class SelectionManager {\n private host: HTMLElement;\n private onChange: () => void;\n public editorEl: HTMLElement;\n public lastRange: Range | null = null;\n private handler!: () => void;\n \n constructor(args: { host: HTMLElement; editorEl: HTMLElement; onChange: () => void }) {\n this.host = args.host;\n this.editorEl = args.editorEl;\n this.onChange = args.onChange;\n }\n \n start() {\n this.handler = () => {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (this.editorEl.contains(range.commonAncestorContainer)) {\n this.lastRange = range.cloneRange();\n this.onChange();\n }\n };\n document.addEventListener('selectionchange', this.handler, true);\n }\n \n stop() { if (this.handler) document.removeEventListener('selectionchange', this.handler, true); }\n \n save() {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) this.lastRange = sel.getRangeAt(0).cloneRange();\n }\n \n restore() {\n if (!this.lastRange) return;\n const sel = document.getSelection(); if (!sel) return;\n sel.removeAllRanges(); sel.addRange(this.lastRange);\n }\n \n focusAndRestore() { this.editorEl?.focus(); this.restore(); }\n }\n "]}
@@ -0,0 +1,28 @@
1
+ export declare class ToolbarController {
2
+ buttonMap: Map<string, HTMLElement[]>;
3
+ headingSelect: HTMLSelectElement | null;
4
+ fontSelect: HTMLSelectElement | null;
5
+ colorInput: HTMLInputElement | null;
6
+ bgColorInput: HTMLInputElement | null;
7
+ colorSwatchEl: HTMLElement | null;
8
+ bgSwatchEl: HTMLElement | null;
9
+ private editorEl;
10
+ private onCommand;
11
+ private onChange;
12
+ private setAlignment;
13
+ private setBlockTag;
14
+ private setFontFamily;
15
+ private setForeColor;
16
+ private setBackColor;
17
+ constructor(args: {
18
+ editorEl: HTMLElement;
19
+ onCommand: (cmd: string) => void;
20
+ onChange: () => void;
21
+ setAlignment: (a: 'left' | 'center' | 'right' | 'justify') => void;
22
+ setBlockTag: (t: string) => void;
23
+ setFontFamily: (ff: string) => void;
24
+ setForeColor: (c: string) => void;
25
+ setBackColor: (c: string) => void;
26
+ });
27
+ wire(tb: HTMLElement): void;
28
+ }
@@ -0,0 +1,161 @@
1
+ import { DEFAULT_ICONS } from './vars';
2
+ export class ToolbarController {
3
+ constructor(args) {
4
+ this.buttonMap = new Map();
5
+ this.headingSelect = null;
6
+ this.fontSelect = null;
7
+ this.colorInput = null;
8
+ this.bgColorInput = null;
9
+ this.colorSwatchEl = null;
10
+ this.bgSwatchEl = null;
11
+ this.editorEl = args.editorEl;
12
+ this.onCommand = args.onCommand;
13
+ this.onChange = args.onChange;
14
+ this.setAlignment = args.setAlignment;
15
+ this.setBlockTag = args.setBlockTag;
16
+ this.setFontFamily = args.setFontFamily;
17
+ this.setForeColor = args.setForeColor;
18
+ this.setBackColor = args.setBackColor;
19
+ }
20
+ wire(tb) {
21
+ // reset
22
+ this.buttonMap.clear();
23
+ this.headingSelect = null;
24
+ this.fontSelect = null;
25
+ this.colorInput = null;
26
+ this.bgColorInput = null;
27
+ this.colorSwatchEl = null;
28
+ this.bgSwatchEl = null;
29
+ Array.from(tb.children).forEach(child => {
30
+ const tag = child.tagName.toLowerCase();
31
+ if (tag === 'nile-rte-select' && child.getAttribute('type') === 'align') {
32
+ child.addEventListener('change', (e) => {
33
+ const alignment = e.detail;
34
+ this.setAlignment(alignment);
35
+ this.onChange();
36
+ });
37
+ return;
38
+ }
39
+ if (tag === 'nile-rte-toolbar-item') {
40
+ let btn = child.querySelector(':scope > nile-button');
41
+ const cmd = child.getAttribute('name') || '';
42
+ const label = child.getAttribute('label') || cmd;
43
+ const iconAttr = child.getAttribute('icon');
44
+ const authoredHasContent = child.innerHTML.trim().length > 0;
45
+ if (!btn) {
46
+ btn = document.createElement('nile-button');
47
+ btn.variant = 'tertiary';
48
+ btn.size = 'small';
49
+ }
50
+ if (iconAttr) {
51
+ btn.innerHTML = `<nile-icon name="${iconAttr}" aria-label="${label}"></nile-icon>`;
52
+ child.innerHTML = '';
53
+ }
54
+ else if (!authoredHasContent) {
55
+ const defaultIcon = DEFAULT_ICONS[cmd];
56
+ if (defaultIcon) {
57
+ btn.innerHTML = `<nile-icon name="${defaultIcon}" size="20" color="black" aria-label="${label}"></nile-icon>`;
58
+ }
59
+ else {
60
+ btn.textContent = label || cmd;
61
+ }
62
+ child.innerHTML = '';
63
+ }
64
+ else {
65
+ btn.innerHTML = child.innerHTML;
66
+ child.innerHTML = '';
67
+ }
68
+ if (!btn.isConnected)
69
+ child.appendChild(btn);
70
+ btn.setAttribute('aria-label', label);
71
+ btn.addEventListener('mousedown', e => e.preventDefault());
72
+ btn.addEventListener('click', () => this.onCommand(cmd));
73
+ const arr = this.buttonMap.get(cmd) ?? [];
74
+ arr.push(btn);
75
+ this.buttonMap.set(cmd, arr);
76
+ return;
77
+ }
78
+ if (tag === 'nile-rte-select') {
79
+ const type = child.getAttribute('type') || '';
80
+ child.addEventListener('change', (e) => {
81
+ const val = e.detail;
82
+ if (type === 'heading')
83
+ this.setBlockTag(val);
84
+ else if (type === 'font')
85
+ this.setFontFamily(val);
86
+ this.onChange();
87
+ });
88
+ return;
89
+ }
90
+ if (tag === 'nile-rte-color') {
91
+ const label = child.getAttribute('label') ?? 'Text color';
92
+ const value = child.getAttribute('value') ?? '#000000';
93
+ const mode = child.getAttribute('mode') ?? 'text';
94
+ let input = child.querySelector(':scope > input[type="color"]');
95
+ if (!input) {
96
+ input = document.createElement('input');
97
+ input.type = 'color';
98
+ input.style.position = 'absolute';
99
+ input.style.opacity = '0';
100
+ input.style.pointerEvents = 'none';
101
+ child.appendChild(input);
102
+ }
103
+ input.title = label;
104
+ input.value = value;
105
+ let trigger = child.querySelector(':scope > button.rte-color-trigger');
106
+ if (!trigger) {
107
+ trigger = document.createElement('button');
108
+ trigger.type = 'button';
109
+ trigger.className = 'rte-color-trigger';
110
+ trigger.setAttribute('aria-label', label);
111
+ if (mode === 'background') {
112
+ trigger.innerHTML = `<span class="swatch-box" aria-hidden="true"></span>`;
113
+ }
114
+ else {
115
+ trigger.innerHTML = `
116
+ <span class="glyph-stack" aria-hidden="true">
117
+ <span class="glyph">A</span>
118
+ <span class="underline"></span>
119
+ </span>`;
120
+ }
121
+ child.appendChild(trigger);
122
+ }
123
+ const underline = trigger.querySelector('.underline');
124
+ const square = trigger.querySelector('.swatch-box');
125
+ if (mode === 'background') {
126
+ this.bgColorInput = input;
127
+ this.bgSwatchEl = square;
128
+ if (this.bgSwatchEl)
129
+ this.bgSwatchEl.style.backgroundColor = input.value;
130
+ }
131
+ else {
132
+ this.colorInput = input;
133
+ this.colorSwatchEl = underline;
134
+ if (this.colorSwatchEl)
135
+ this.colorSwatchEl.style.backgroundColor = input.value;
136
+ }
137
+ trigger.addEventListener('click', (e) => {
138
+ e.preventDefault();
139
+ // Caller will handle selection focus before invoking controller events
140
+ input.click();
141
+ });
142
+ input.addEventListener('input', () => {
143
+ if (mode === 'background') {
144
+ this.setBackColor(input.value);
145
+ if (this.bgSwatchEl)
146
+ this.bgSwatchEl.style.backgroundColor = input.value;
147
+ }
148
+ else {
149
+ this.setForeColor(input.value);
150
+ if (this.colorSwatchEl)
151
+ this.colorSwatchEl.style.backgroundColor = input.value;
152
+ }
153
+ this.onChange();
154
+ });
155
+ trigger.addEventListener('mousedown', e => e.preventDefault());
156
+ input.addEventListener('mousedown', e => e.preventDefault());
157
+ }
158
+ });
159
+ }
160
+ }
161
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/toolbar.ts"],"names":[],"mappings":"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","sourcesContent":["import { DEFAULT_ICONS } from './vars';\n\nexport class ToolbarController {\n public buttonMap = new Map<string, HTMLElement[]>();\n public headingSelect: HTMLSelectElement | null = null;\n public fontSelect: HTMLSelectElement | null = null;\n public colorInput: HTMLInputElement | null = null;\n public bgColorInput: HTMLInputElement | null = null;\n public colorSwatchEl: HTMLElement | null = null;\n public bgSwatchEl: HTMLElement | null = null;\n\n private editorEl: HTMLElement;\n private onCommand: (cmd: string) => void;\n private onChange: () => void;\n private setAlignment: (a: 'left'|'center'|'right'|'justify') => void;\n private setBlockTag: (t: string) => void;\n private setFontFamily: (ff: string) => void;\n private setForeColor: (c: string) => void;\n private setBackColor: (c: string) => void;\n\n constructor(args: {\n editorEl: HTMLElement;\n onCommand: (cmd: string) => void;\n onChange: () => void;\n setAlignment: (a: 'left'|'center'|'right'|'justify') => void;\n setBlockTag: (t: string) => void;\n setFontFamily: (ff: string) => void;\n setForeColor: (c: string) => void;\n setBackColor: (c: string) => void;\n }) {\n this.editorEl = args.editorEl;\n this.onCommand = args.onCommand;\n this.onChange = args.onChange;\n this.setAlignment = args.setAlignment;\n this.setBlockTag = args.setBlockTag;\n this.setFontFamily = args.setFontFamily;\n this.setForeColor = args.setForeColor;\n this.setBackColor = args.setBackColor;\n }\n\n wire(tb: HTMLElement) {\n // reset\n this.buttonMap.clear();\n this.headingSelect = null; this.fontSelect = null;\n this.colorInput = null; this.bgColorInput = null;\n this.colorSwatchEl = null; this.bgSwatchEl = null;\n\n Array.from(tb.children).forEach(child => {\n const tag = child.tagName.toLowerCase();\n\n if (tag === 'nile-rte-select' && child.getAttribute('type') === 'align') {\n child.addEventListener('change', (e: any) => {\n const alignment = e.detail as 'left'|'center'|'right'|'justify';\n this.setAlignment(alignment);\n this.onChange();\n });\n return;\n }\n\n if (tag === 'nile-rte-toolbar-item') {\n let btn = child.querySelector(':scope > nile-button') as HTMLElement | null;\n const cmd = child.getAttribute('name') || '';\n const label = child.getAttribute('label') || cmd;\n const iconAttr = child.getAttribute('icon');\n const authoredHasContent = child.innerHTML.trim().length > 0;\n\n if (!btn) {\n btn = document.createElement('nile-button');\n (btn as any).variant = 'tertiary';\n (btn as any).size = 'small';\n }\n\n if (iconAttr) {\n btn.innerHTML = `<nile-icon name=\"${iconAttr}\" aria-label=\"${label}\"></nile-icon>`;\n child.innerHTML = '';\n } else if (!authoredHasContent) {\n const defaultIcon = DEFAULT_ICONS[cmd] as string | undefined;\n if (defaultIcon) {\n btn.innerHTML = `<nile-icon name=\"${defaultIcon}\" size=\"20\" color=\"black\" aria-label=\"${label}\"></nile-icon>`;\n } else {\n btn.textContent = label || cmd;\n }\n child.innerHTML = '';\n } else {\n btn.innerHTML = child.innerHTML;\n child.innerHTML = '';\n }\n\n if (!btn.isConnected) child.appendChild(btn);\n btn.setAttribute('aria-label', label);\n btn.addEventListener('mousedown', e => e.preventDefault());\n btn.addEventListener('click', () => this.onCommand(cmd));\n\n const arr = this.buttonMap.get(cmd) ?? [];\n arr.push(btn); this.buttonMap.set(cmd, arr);\n return;\n }\n\n if (tag === 'nile-rte-select') {\n const type = child.getAttribute('type') || '';\n child.addEventListener('change', (e: any) => {\n const val = e.detail as string;\n if (type === 'heading') this.setBlockTag(val as any);\n else if (type === 'font') this.setFontFamily(val);\n this.onChange();\n });\n return;\n }\n\n if (tag === 'nile-rte-color') {\n const label = child.getAttribute('label') ?? 'Text color';\n const value = child.getAttribute('value') ?? '#000000';\n const mode = child.getAttribute('mode') ?? 'text';\n\n let input = child.querySelector(':scope > input[type=\"color\"]') as HTMLInputElement | null;\n if (!input) {\n input = document.createElement('input');\n input.type = 'color';\n input.style.position = 'absolute';\n input.style.opacity = '0';\n input.style.pointerEvents = 'none';\n child.appendChild(input);\n }\n input.title = label; input.value = value;\n\n let trigger = child.querySelector(':scope > button.rte-color-trigger') as HTMLButtonElement | null;\n if (!trigger) {\n trigger = document.createElement('button');\n trigger.type = 'button';\n trigger.className = 'rte-color-trigger';\n trigger.setAttribute('aria-label', label);\n if (mode === 'background') {\n trigger.innerHTML = `<span class=\"swatch-box\" aria-hidden=\"true\"></span>`;\n } else {\n trigger.innerHTML = `\n <span class=\"glyph-stack\" aria-hidden=\"true\">\n <span class=\"glyph\">A</span>\n <span class=\"underline\"></span>\n </span>`;\n }\n child.appendChild(trigger);\n }\n\n const underline = trigger.querySelector('.underline') as HTMLElement | null;\n const square = trigger.querySelector('.swatch-box') as HTMLElement | null;\n\n if (mode === 'background') {\n this.bgColorInput = input; this.bgSwatchEl = square;\n if (this.bgSwatchEl) this.bgSwatchEl.style.backgroundColor = input.value;\n } else {\n this.colorInput = input; this.colorSwatchEl = underline;\n if (this.colorSwatchEl) this.colorSwatchEl.style.backgroundColor = input.value;\n }\n\n trigger.addEventListener('click', (e) => {\n e.preventDefault();\n // Caller will handle selection focus before invoking controller events\n input!.click();\n });\n\n input.addEventListener('input', () => {\n if (mode === 'background') {\n this.setBackColor(input!.value);\n if (this.bgSwatchEl) this.bgSwatchEl.style.backgroundColor = input!.value;\n } else {\n this.setForeColor(input!.value);\n if (this.colorSwatchEl) this.colorSwatchEl.style.backgroundColor = input!.value;\n }\n this.onChange();\n });\n\n trigger.addEventListener('mousedown', e => e.preventDefault());\n input.addEventListener('mousedown', e => e.preventDefault());\n }\n });\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export declare function updateToolbarState(ctx: {
2
+ editorEl: HTMLElement;
3
+ buttonMap: Map<string, HTMLElement[]>;
4
+ headingSelect: HTMLSelectElement | null;
5
+ fontSelect: HTMLSelectElement | null;
6
+ colorInput: HTMLInputElement | null;
7
+ colorSwatchEl: HTMLElement | null;
8
+ bgColorInput: HTMLInputElement | null;
9
+ bgSwatchEl: HTMLElement | null;
10
+ nearestElement: (n: Node) => HTMLElement | null;
11
+ closestBlock: (n: Node, root: HTMLElement) => HTMLElement | null;
12
+ rgbToHex: (rgb: string) => string;
13
+ }): void;
@@ -0,0 +1,119 @@
1
+ export function updateToolbarState(ctx) {
2
+ const { editorEl, buttonMap, headingSelect, fontSelect, colorInput, colorSwatchEl, bgColorInput, bgSwatchEl, nearestElement, closestBlock, rgbToHex } = ctx;
3
+ const sel = document.getSelection();
4
+ if (!sel || sel.rangeCount === 0)
5
+ return;
6
+ const range = sel.getRangeAt(0);
7
+ if (!editorEl.contains(range.commonAncestorContainer))
8
+ return;
9
+ const startElm = nearestElement(range.startContainer) || editorEl;
10
+ const comp = getComputedStyle(startElm);
11
+ const block = closestBlock(range.startContainer, editorEl) || editorEl;
12
+ // Bold
13
+ const isBold = (() => {
14
+ let n = startElm;
15
+ while (n && n !== editorEl) {
16
+ if (n instanceof HTMLElement) {
17
+ const t = n.tagName.toLowerCase();
18
+ if (t === 'strong' || t === 'b')
19
+ return true;
20
+ const w = getComputedStyle(n).fontWeight;
21
+ if (parseInt(w, 10) >= 600)
22
+ return true;
23
+ }
24
+ n = n.parentNode;
25
+ }
26
+ return false;
27
+ })();
28
+ // Italic
29
+ const isItalic = (() => {
30
+ let n = startElm;
31
+ while (n && n !== editorEl) {
32
+ if (n instanceof HTMLElement) {
33
+ const t = n.tagName.toLowerCase();
34
+ if (t === 'em' || t === 'i')
35
+ return true;
36
+ if (getComputedStyle(n).fontStyle === 'italic')
37
+ return true;
38
+ }
39
+ n = n.parentNode;
40
+ }
41
+ return false;
42
+ })();
43
+ // Underline
44
+ const isUnderline = (() => {
45
+ let n = startElm;
46
+ while (n && n !== editorEl) {
47
+ if (n instanceof HTMLElement) {
48
+ const tdl = getComputedStyle(n).textDecorationLine;
49
+ if (tdl && tdl.includes('underline'))
50
+ return true;
51
+ if (n.tagName.toLowerCase() === 'u')
52
+ return true;
53
+ }
54
+ n = n.parentNode;
55
+ }
56
+ return false;
57
+ })();
58
+ const inLink = !!startElm.closest('a');
59
+ const align = block.style.textAlign || getComputedStyle(block).textAlign || 'start';
60
+ const alignNorm = align === 'start' ? 'left' : align;
61
+ const inLi = !!startElm.closest('li');
62
+ const listType = inLi ? (startElm.closest('ul,ol')?.tagName.toLowerCase() || '') : '';
63
+ const setBtnActive = (cmd, active) => {
64
+ const arr = buttonMap.get(cmd);
65
+ if (!arr)
66
+ return;
67
+ for (const btn of arr)
68
+ btn.toggleAttribute('data-active', !!active);
69
+ };
70
+ setBtnActive('bold', isBold);
71
+ setBtnActive('italic', isItalic);
72
+ setBtnActive('underline', isUnderline);
73
+ setBtnActive('link', inLink);
74
+ setBtnActive('left', alignNorm === 'left' && !['center', 'right', 'justify'].includes(alignNorm));
75
+ setBtnActive('center', alignNorm === 'center');
76
+ setBtnActive('right', alignNorm === 'right');
77
+ setBtnActive('justify', alignNorm === 'justify');
78
+ setBtnActive('ul', listType === 'ul');
79
+ setBtnActive('ol', listType === 'ol');
80
+ // Heading reflect
81
+ if (headingSelect) {
82
+ const tag = block.tagName.toLowerCase();
83
+ const v = ['h1', 'h2', 'h3'].includes(tag) ? tag : 'p';
84
+ if (headingSelect.value !== v)
85
+ headingSelect.value = v;
86
+ }
87
+ // Font reflect
88
+ if (fontSelect) {
89
+ const ff = (comp.fontFamily || '').replace(/["']/g, '').split(',')[0].trim().toLowerCase();
90
+ if (ff) {
91
+ for (const opt of Array.from(fontSelect.options)) {
92
+ if (opt.value.toLowerCase() === ff) {
93
+ fontSelect.value = opt.value;
94
+ break;
95
+ }
96
+ }
97
+ }
98
+ }
99
+ if (colorInput) {
100
+ const hex = rgbToHex(comp.color);
101
+ if (hex && colorInput.value.toLowerCase() !== hex.toLowerCase()) {
102
+ colorInput.value = hex;
103
+ }
104
+ if (colorSwatchEl)
105
+ colorSwatchEl.style.backgroundColor = colorInput.value;
106
+ }
107
+ if (bgColorInput) {
108
+ const bg = getComputedStyle(startElm).backgroundColor;
109
+ if (bg && !/transparent|rgba\(\s*0\s*,\s*0\s*,\s*0\s*,\s*0\s*\)/i.test(bg)) {
110
+ const bgHex = rgbToHex(bg);
111
+ if (bgHex && bgColorInput.value.toLowerCase() !== bgHex.toLowerCase()) {
112
+ bgColorInput.value = bgHex;
113
+ }
114
+ }
115
+ if (bgSwatchEl)
116
+ bgSwatchEl.style.backgroundColor = bgColorInput.value;
117
+ }
118
+ }
119
+ //# sourceMappingURL=toolbarState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbarState.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/toolbarState.ts"],"names":[],"mappings":"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","sourcesContent":["export function updateToolbarState(ctx: {\n editorEl: HTMLElement;\n buttonMap: Map<string, HTMLElement[]>;\n headingSelect: HTMLSelectElement | null;\n fontSelect: HTMLSelectElement | null;\n colorInput: HTMLInputElement | null;\n colorSwatchEl: HTMLElement | null;\n bgColorInput: HTMLInputElement | null;\n bgSwatchEl: HTMLElement | null;\n nearestElement: (n: Node) => HTMLElement | null;\n closestBlock: (n: Node, root: HTMLElement) => HTMLElement | null;\n rgbToHex: (rgb: string) => string;\n }) {\n const { editorEl, buttonMap, headingSelect, fontSelect, colorInput, colorSwatchEl, bgColorInput, bgSwatchEl, nearestElement, closestBlock, rgbToHex } = ctx;\n \n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!editorEl.contains(range.commonAncestorContainer)) return;\n \n const startElm = nearestElement(range.startContainer) || editorEl;\n const comp = getComputedStyle(startElm);\n const block = closestBlock(range.startContainer, editorEl) || editorEl;\n \n // Bold\n const isBold = (() => {\n let n: Node | null = startElm;\n while (n && n !== editorEl) {\n if (n instanceof HTMLElement) {\n const t = n.tagName.toLowerCase();\n if (t === 'strong' || t === 'b') return true;\n const w = getComputedStyle(n).fontWeight;\n if (parseInt(w, 10) >= 600) return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n \n // Italic\n const isItalic = (() => {\n let n: Node | null = startElm;\n while (n && n !== editorEl) {\n if (n instanceof HTMLElement) {\n const t = n.tagName.toLowerCase();\n if (t === 'em' || t === 'i') return true;\n if (getComputedStyle(n).fontStyle === 'italic') return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n \n // Underline\n const isUnderline = (() => {\n let n: Node | null = startElm;\n while (n && n !== editorEl) {\n if (n instanceof HTMLElement) {\n const tdl = getComputedStyle(n).textDecorationLine;\n if (tdl && tdl.includes('underline')) return true;\n if (n.tagName.toLowerCase() === 'u') return true;\n }\n n = n.parentNode;\n }\n return false;\n })();\n \n const inLink = !!(startElm as HTMLElement).closest('a');\n \n const align = (block as HTMLElement).style.textAlign || getComputedStyle(block).textAlign || 'start';\n const alignNorm = align === 'start' ? 'left' : align;\n \n const inLi = !!(startElm as HTMLElement).closest('li');\n const listType = inLi ? (((startElm as HTMLElement).closest('ul,ol') as HTMLElement | null)?.tagName.toLowerCase() || '') : '';\n \n const setBtnActive = (cmd: string, active: boolean) => {\n const arr = buttonMap.get(cmd); if (!arr) return;\n for (const btn of arr) btn.toggleAttribute('data-active', !!active);\n };\n \n setBtnActive('bold', isBold);\n setBtnActive('italic', isItalic);\n setBtnActive('underline', isUnderline);\n setBtnActive('link', inLink);\n \n setBtnActive('left', alignNorm === 'left' && !['center','right','justify'].includes(alignNorm));\n setBtnActive('center', alignNorm === 'center');\n setBtnActive('right', alignNorm === 'right');\n setBtnActive('justify', alignNorm === 'justify');\n \n setBtnActive('ul', listType === 'ul');\n setBtnActive('ol', listType === 'ol');\n \n // Heading reflect\n if (headingSelect) {\n const tag = (block as HTMLElement).tagName.toLowerCase();\n const v = ['h1','h2','h3'].includes(tag) ? tag : 'p';\n if (headingSelect.value !== v) headingSelect.value = v;\n }\n \n // Font reflect\n if (fontSelect) {\n const ff = (comp.fontFamily || '').replace(/[\"']/g, '').split(',')[0].trim().toLowerCase();\n if (ff) {\n for (const opt of Array.from(fontSelect.options)) {\n if (opt.value.toLowerCase() === ff) { fontSelect.value = opt.value; break; }\n }\n }\n }\n \n if (colorInput) {\n const hex = rgbToHex(comp.color);\n if (hex && colorInput.value.toLowerCase() !== hex.toLowerCase()) {\n colorInput.value = hex;\n }\n if (colorSwatchEl) colorSwatchEl.style.backgroundColor = colorInput.value;\n }\n \n if (bgColorInput) {\n const bg = getComputedStyle(startElm).backgroundColor;\n if (bg && !/transparent|rgba\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/i.test(bg)) {\n const bgHex = rgbToHex(bg);\n if (bgHex && bgColorInput.value.toLowerCase() !== bgHex.toLowerCase()) {\n bgColorInput.value = bgHex;\n }\n }\n if (bgSwatchEl) bgSwatchEl.style.backgroundColor = bgColorInput.value;\n }\n }\n "]}
@@ -0,0 +1 @@
1
+ export declare const DEFAULT_ICONS: Record<string, string>;
@@ -0,0 +1,14 @@
1
+ export const DEFAULT_ICONS = {
2
+ bold: 'format_bold',
3
+ italic: 'format_italic',
4
+ underline: 'format_underline',
5
+ link: 'link_2',
6
+ left: 'format_align_left',
7
+ center: 'format_align_middle',
8
+ right: 'format_align_right',
9
+ justify: 'format_align_justify',
10
+ ul: 'nile-ul',
11
+ ol: 'nile-ol',
12
+ clear: 'error',
13
+ };
14
+ //# sourceMappingURL=vars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vars.js","sourceRoot":"","sources":["../../../../src/nile-rich-text-editor/rte-utils/vars.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAA2B;IACjD,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,eAAe;IACvB,SAAS,EAAE,kBAAkB;IAC7B,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,mBAAmB;IACzB,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE,oBAAoB;IAC3B,OAAO,EAAE,sBAAsB;IAC/B,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,OAAO;CACf,CAAC","sourcesContent":["export const DEFAULT_ICONS: Record<string, string> = {\n bold: 'format_bold',\n italic: 'format_italic',\n underline: 'format_underline',\n link: 'link_2',\n left: 'format_align_left',\n center: 'format_align_middle',\n right: 'format_align_right',\n justify: 'format_align_justify',\n ul: 'nile-ul',\n ol: 'nile-ol',\n clear: 'error',\n };"]}
@@ -0,0 +1 @@
1
+ export declare function sanitizeContent(editorEl: HTMLElement): HTMLElement;
@@ -0,0 +1,40 @@
1
+ // sanitize.ts
2
+ export function sanitizeContent(editorEl) {
3
+ const clone = editorEl.cloneNode(true);
4
+ // Disallowed tags
5
+ clone.querySelectorAll('font, o\\:p, script, style').forEach(n => n.remove());
6
+ // Clean empty spans
7
+ clone.querySelectorAll('span').forEach(span => {
8
+ if (!span.getAttributeNames().length) {
9
+ while (span.firstChild)
10
+ span.parentNode?.insertBefore(span.firstChild, span);
11
+ span.remove();
12
+ }
13
+ });
14
+ const allowed = [
15
+ 'font-weight', 'font-style', 'text-decoration', 'text-transform',
16
+ 'font-size', 'line-height', 'font-family', 'color', 'background-color',
17
+ 'text-align', 'margin-left', 'margin-right', 'margin-top', 'margin-bottom',
18
+ 'list-style-type'
19
+ ];
20
+ // Walk over elements and embed computed styles
21
+ const walker = document.createTreeWalker(editorEl, NodeFilter.SHOW_ELEMENT);
22
+ const targetWalker = document.createTreeWalker(clone, NodeFilter.SHOW_ELEMENT);
23
+ while (walker.nextNode() && targetWalker.nextNode()) {
24
+ const srcEl = walker.currentNode;
25
+ const dstEl = targetWalker.currentNode;
26
+ const comp = getComputedStyle(srcEl);
27
+ const safe = [];
28
+ allowed.forEach(prop => {
29
+ const val = comp.getPropertyValue(prop);
30
+ if (val && val !== 'normal' && val !== 'initial' && val !== 'none' && val !== '0px') {
31
+ safe.push(`${prop}:${val}`);
32
+ }
33
+ });
34
+ if (safe.length) {
35
+ dstEl.setAttribute('style', safe.join(';'));
36
+ }
37
+ }
38
+ return clone;
39
+ }
40
+ //# sourceMappingURL=sanatize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanatize.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/sanatize.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,MAAM,UAAU,eAAe,CAAC,QAAqB;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;IAEtD,kBAAkB;IAClB,KAAK,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAE9E,oBAAoB;IACpB,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC5C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC7E,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG;QACd,aAAa,EAAC,YAAY,EAAC,iBAAiB,EAAC,gBAAgB;QAC7D,WAAW,EAAC,aAAa,EAAC,aAAa,EAAC,OAAO,EAAC,kBAAkB;QAClE,YAAY,EAAC,aAAa,EAAC,cAAc,EAAC,YAAY,EAAC,eAAe;QACtE,iBAAiB;KAClB,CAAC;IAEF,+CAA+C;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IAC5E,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IAE/E,OAAO,MAAM,CAAC,QAAQ,EAAE,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,WAA0B,CAAC;QAChD,MAAM,KAAK,GAAG,YAAY,CAAC,WAA0B,CAAC;QAEtD,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBACpF,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["// sanitize.ts\nexport function sanitizeContent(editorEl: HTMLElement): HTMLElement {\n const clone = editorEl.cloneNode(true) as HTMLElement;\n \n // Disallowed tags\n clone.querySelectorAll('font, o\\\\:p, script, style').forEach(n => n.remove());\n \n // Clean empty spans\n clone.querySelectorAll('span').forEach(span => {\n if (!span.getAttributeNames().length) {\n while (span.firstChild) span.parentNode?.insertBefore(span.firstChild, span);\n span.remove();\n }\n });\n \n const allowed = [\n 'font-weight','font-style','text-decoration','text-transform',\n 'font-size','line-height','font-family','color','background-color',\n 'text-align','margin-left','margin-right','margin-top','margin-bottom',\n 'list-style-type'\n ];\n \n // Walk over elements and embed computed styles\n const walker = document.createTreeWalker(editorEl, NodeFilter.SHOW_ELEMENT);\n const targetWalker = document.createTreeWalker(clone, NodeFilter.SHOW_ELEMENT);\n \n while (walker.nextNode() && targetWalker.nextNode()) {\n const srcEl = walker.currentNode as HTMLElement;\n const dstEl = targetWalker.currentNode as HTMLElement;\n \n const comp = getComputedStyle(srcEl);\n const safe: string[] = [];\n \n allowed.forEach(prop => {\n const val = comp.getPropertyValue(prop);\n if (val && val !== 'normal' && val !== 'initial' && val !== 'none' && val !== '0px') {\n safe.push(`${prop}:${val}`);\n }\n });\n \n if (safe.length) {\n dstEl.setAttribute('style', safe.join(';'));\n }\n }\n \n return clone;\n }\n "]}