@opentiny/fluent-editor 3.25.4 → 4.0.0-alpha.1

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 (247) hide show
  1. package/es/attributors/font-style.es.js +1 -1
  2. package/es/attributors/font-style.es.js.map +1 -1
  3. package/es/attributors/line-height.es.js +1 -1
  4. package/es/attributors/line-height.es.js.map +1 -1
  5. package/es/config/editor.config.es.js +0 -7
  6. package/es/config/editor.config.es.js.map +1 -1
  7. package/es/config/editor.utils.es.js +0 -9
  8. package/es/config/editor.utils.es.js.map +1 -1
  9. package/es/config/i18n/en-us.es.js +33 -17
  10. package/es/config/i18n/en-us.es.js.map +1 -1
  11. package/es/config/i18n/zh-cn.es.js +33 -17
  12. package/es/config/i18n/zh-cn.es.js.map +1 -1
  13. package/es/config/index.es.js +7 -13
  14. package/es/config/index.es.js.map +1 -1
  15. package/es/core/fluent-editor.es.js +6 -4
  16. package/es/core/fluent-editor.es.js.map +1 -1
  17. package/es/fluent-editor.es.js +24 -12
  18. package/es/fluent-editor.es.js.map +1 -1
  19. package/es/formats/video.es.js +2 -2
  20. package/es/formats/video.es.js.map +1 -1
  21. package/es/index.es.js +8 -4
  22. package/es/index.es.js.map +1 -1
  23. package/es/modules/custom-clipboard.es.js +3 -61
  24. package/es/modules/custom-clipboard.es.js.map +1 -1
  25. package/es/modules/custom-image/BlotFormatter.es.js +1 -2
  26. package/es/modules/custom-image/BlotFormatter.es.js.map +1 -1
  27. package/es/modules/custom-image/image.es.js +4 -16
  28. package/es/modules/custom-image/image.es.js.map +1 -1
  29. package/es/modules/custom-uploader.es.js +60 -193
  30. package/es/modules/custom-uploader.es.js.map +1 -1
  31. package/es/modules/file/formats/file.es.js +12 -14
  32. package/es/modules/file/formats/file.es.js.map +1 -1
  33. package/es/modules/file/index.es.js +6 -7
  34. package/es/modules/file/index.es.js.map +1 -1
  35. package/es/modules/i18n.es.js +32 -12
  36. package/es/modules/i18n.es.js.map +1 -1
  37. package/es/modules/link/index.es.js +0 -17
  38. package/es/modules/link/index.es.js.map +1 -1
  39. package/es/modules/link/modules/tooltip.es.js +3 -2
  40. package/es/modules/link/modules/tooltip.es.js.map +1 -1
  41. package/es/modules/shortcut-key/index.es.js +229 -0
  42. package/es/modules/shortcut-key/index.es.js.map +1 -0
  43. package/es/modules/table-up/index.es.js +64 -0
  44. package/es/modules/table-up/index.es.js.map +1 -0
  45. package/es/modules/toolbar/better-picker.es.js +21 -269
  46. package/es/modules/toolbar/better-picker.es.js.map +1 -1
  47. package/es/modules/toolbar/index.es.js +0 -1
  48. package/es/modules/toolbar/index.es.js.map +1 -1
  49. package/es/modules/toolbar/toolbar-tip.es.js +44 -9
  50. package/es/modules/toolbar/toolbar-tip.es.js.map +1 -1
  51. package/es/themes/snow.es.js +198 -50
  52. package/es/themes/snow.es.js.map +1 -1
  53. package/es/ui/icons.config.es.js +6 -5
  54. package/es/ui/icons.config.es.js.map +1 -1
  55. package/es/ui/icons.es.js +3 -12
  56. package/es/ui/icons.es.js.map +1 -1
  57. package/es/utils/is.es.js +4 -0
  58. package/es/utils/is.es.js.map +1 -1
  59. package/lib/attributors/font-style.cjs.js +1 -1
  60. package/lib/attributors/font-style.cjs.js.map +1 -1
  61. package/lib/attributors/line-height.cjs.js +1 -1
  62. package/lib/attributors/line-height.cjs.js.map +1 -1
  63. package/lib/config/editor.config.cjs.js +0 -7
  64. package/lib/config/editor.config.cjs.js.map +1 -1
  65. package/lib/config/editor.utils.cjs.js +0 -9
  66. package/lib/config/editor.utils.cjs.js.map +1 -1
  67. package/lib/config/i18n/en-us.cjs.js +33 -17
  68. package/lib/config/i18n/en-us.cjs.js.map +1 -1
  69. package/lib/config/i18n/zh-cn.cjs.js +33 -17
  70. package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
  71. package/lib/config/index.cjs.js +5 -11
  72. package/lib/config/index.cjs.js.map +1 -1
  73. package/lib/core/fluent-editor.cjs.js +5 -3
  74. package/lib/core/fluent-editor.cjs.js.map +1 -1
  75. package/lib/fluent-editor.cjs.js +23 -11
  76. package/lib/fluent-editor.cjs.js.map +1 -1
  77. package/lib/formats/video.cjs.js +2 -2
  78. package/lib/formats/video.cjs.js.map +1 -1
  79. package/lib/index.cjs.js +9 -2
  80. package/lib/index.cjs.js.map +1 -1
  81. package/lib/modules/custom-clipboard.cjs.js +2 -60
  82. package/lib/modules/custom-clipboard.cjs.js.map +1 -1
  83. package/lib/modules/custom-image/BlotFormatter.cjs.js +0 -1
  84. package/lib/modules/custom-image/BlotFormatter.cjs.js.map +1 -1
  85. package/lib/modules/custom-image/image.cjs.js +4 -16
  86. package/lib/modules/custom-image/image.cjs.js.map +1 -1
  87. package/lib/modules/custom-uploader.cjs.js +61 -194
  88. package/lib/modules/custom-uploader.cjs.js.map +1 -1
  89. package/lib/modules/file/formats/file.cjs.js +12 -14
  90. package/lib/modules/file/formats/file.cjs.js.map +1 -1
  91. package/lib/modules/file/index.cjs.js +6 -7
  92. package/lib/modules/file/index.cjs.js.map +1 -1
  93. package/lib/modules/i18n.cjs.js +31 -11
  94. package/lib/modules/i18n.cjs.js.map +1 -1
  95. package/lib/modules/link/index.cjs.js +0 -17
  96. package/lib/modules/link/index.cjs.js.map +1 -1
  97. package/lib/modules/link/modules/tooltip.cjs.js +2 -1
  98. package/lib/modules/link/modules/tooltip.cjs.js.map +1 -1
  99. package/lib/modules/shortcut-key/index.cjs.js +229 -0
  100. package/lib/modules/shortcut-key/index.cjs.js.map +1 -0
  101. package/lib/modules/table-up/index.cjs.js +64 -0
  102. package/lib/modules/table-up/index.cjs.js.map +1 -0
  103. package/lib/modules/toolbar/better-picker.cjs.js +21 -270
  104. package/lib/modules/toolbar/better-picker.cjs.js.map +1 -1
  105. package/lib/modules/toolbar/index.cjs.js +0 -1
  106. package/lib/modules/toolbar/index.cjs.js.map +1 -1
  107. package/lib/modules/toolbar/toolbar-tip.cjs.js +44 -9
  108. package/lib/modules/toolbar/toolbar-tip.cjs.js.map +1 -1
  109. package/lib/themes/snow.cjs.js +200 -52
  110. package/lib/themes/snow.cjs.js.map +1 -1
  111. package/lib/ui/icons.cjs.js +2 -11
  112. package/lib/ui/icons.cjs.js.map +1 -1
  113. package/lib/ui/icons.config.cjs.js +6 -5
  114. package/lib/ui/icons.config.cjs.js.map +1 -1
  115. package/lib/utils/is.cjs.js +4 -0
  116. package/lib/utils/is.cjs.js.map +1 -1
  117. package/package.json +4 -2
  118. package/style.css +316 -2149
  119. package/types/attributors/font-style.d.ts +1 -1
  120. package/types/config/editor.config.d.ts +0 -218
  121. package/types/config/editor.utils.d.ts +0 -1
  122. package/types/config/i18n/en-us.d.ts +31 -16
  123. package/types/config/i18n/zh-cn.d.ts +31 -16
  124. package/types/config/index.d.ts +1 -1
  125. package/types/config/types/editor-config.interface.d.ts +0 -19
  126. package/types/config/types/editor-modules.interface.d.ts +2 -0
  127. package/types/config/types/toolbar-item.interface.d.ts +11 -11
  128. package/types/core/fluent-editor.d.ts +4 -1
  129. package/types/index.d.ts +3 -0
  130. package/types/modules/counter.d.ts +1 -1
  131. package/types/modules/custom-clipboard.d.ts +1 -1
  132. package/types/modules/custom-image/image.d.ts +8 -11
  133. package/types/modules/file/formats/file.d.ts +12 -8
  134. package/types/modules/file/index.d.ts +5 -5
  135. package/types/modules/i18n.d.ts +4 -4
  136. package/types/modules/shortcut-key/index.d.ts +68 -0
  137. package/types/modules/table-up/index.d.ts +66 -0
  138. package/types/modules/toolbar/better-picker.d.ts +15 -0
  139. package/types/themes/snow.d.ts +10 -2
  140. package/types/ui/icons.config.d.ts +2 -2
  141. package/types/utils/is.d.ts +2 -0
  142. package/es/modules/global-link/constants.es.js +0 -9
  143. package/es/modules/global-link/constants.es.js.map +0 -1
  144. package/es/modules/global-link/formats/customer-widget-link.es.js +0 -28
  145. package/es/modules/global-link/formats/customer-widget-link.es.js.map +0 -1
  146. package/es/modules/global-link/formats/doc-link.es.js +0 -42
  147. package/es/modules/global-link/formats/doc-link.es.js.map +0 -1
  148. package/es/modules/global-link/formats/wiki-link.es.js +0 -34
  149. package/es/modules/global-link/formats/wiki-link.es.js.map +0 -1
  150. package/es/modules/global-link/formats/work-item-link.es.js +0 -36
  151. package/es/modules/global-link/formats/work-item-link.es.js.map +0 -1
  152. package/es/modules/global-link/global-link-panel.es.js +0 -2
  153. package/es/modules/global-link/global-link-panel.es.js.map +0 -1
  154. package/es/modules/global-link/index.es.js +0 -139
  155. package/es/modules/global-link/index.es.js.map +0 -1
  156. package/es/modules/global-link/utils/createTable.es.js +0 -50
  157. package/es/modules/global-link/utils/createTable.es.js.map +0 -1
  158. package/es/modules/quick-menu.es.js +0 -82
  159. package/es/modules/quick-menu.es.js.map +0 -1
  160. package/es/modules/table/better-table.es.js +0 -485
  161. package/es/modules/table/better-table.es.js.map +0 -1
  162. package/es/modules/table/formats/header.es.js +0 -94
  163. package/es/modules/table/formats/header.es.js.map +0 -1
  164. package/es/modules/table/formats/list.es.js +0 -163
  165. package/es/modules/table/formats/list.es.js.map +0 -1
  166. package/es/modules/table/formats/table.es.js +0 -969
  167. package/es/modules/table/formats/table.es.js.map +0 -1
  168. package/es/modules/table/modules/table-column-tool.es.js +0 -400
  169. package/es/modules/table/modules/table-column-tool.es.js.map +0 -1
  170. package/es/modules/table/modules/table-operation-menu.es.js +0 -475
  171. package/es/modules/table/modules/table-operation-menu.es.js.map +0 -1
  172. package/es/modules/table/modules/table-scroll-bar.es.js +0 -190
  173. package/es/modules/table/modules/table-scroll-bar.es.js.map +0 -1
  174. package/es/modules/table/modules/table-selection.es.js +0 -305
  175. package/es/modules/table/modules/table-selection.es.js.map +0 -1
  176. package/es/modules/table/modules/table-selector.es.js +0 -158
  177. package/es/modules/table/modules/table-selector.es.js.map +0 -1
  178. package/es/modules/table/table-config.es.js +0 -74
  179. package/es/modules/table/table-config.es.js.map +0 -1
  180. package/es/modules/table/utils/index.es.js +0 -54
  181. package/es/modules/table/utils/index.es.js.map +0 -1
  182. package/es/modules/table/utils/node-matchers.es.js +0 -292
  183. package/es/modules/table/utils/node-matchers.es.js.map +0 -1
  184. package/lib/modules/global-link/constants.cjs.js +0 -9
  185. package/lib/modules/global-link/constants.cjs.js.map +0 -1
  186. package/lib/modules/global-link/formats/customer-widget-link.cjs.js +0 -28
  187. package/lib/modules/global-link/formats/customer-widget-link.cjs.js.map +0 -1
  188. package/lib/modules/global-link/formats/doc-link.cjs.js +0 -42
  189. package/lib/modules/global-link/formats/doc-link.cjs.js.map +0 -1
  190. package/lib/modules/global-link/formats/wiki-link.cjs.js +0 -34
  191. package/lib/modules/global-link/formats/wiki-link.cjs.js.map +0 -1
  192. package/lib/modules/global-link/formats/work-item-link.cjs.js +0 -36
  193. package/lib/modules/global-link/formats/work-item-link.cjs.js.map +0 -1
  194. package/lib/modules/global-link/global-link-panel.cjs.js +0 -2
  195. package/lib/modules/global-link/global-link-panel.cjs.js.map +0 -1
  196. package/lib/modules/global-link/index.cjs.js +0 -139
  197. package/lib/modules/global-link/index.cjs.js.map +0 -1
  198. package/lib/modules/global-link/utils/createTable.cjs.js +0 -50
  199. package/lib/modules/global-link/utils/createTable.cjs.js.map +0 -1
  200. package/lib/modules/quick-menu.cjs.js +0 -82
  201. package/lib/modules/quick-menu.cjs.js.map +0 -1
  202. package/lib/modules/table/better-table.cjs.js +0 -485
  203. package/lib/modules/table/better-table.cjs.js.map +0 -1
  204. package/lib/modules/table/formats/header.cjs.js +0 -94
  205. package/lib/modules/table/formats/header.cjs.js.map +0 -1
  206. package/lib/modules/table/formats/list.cjs.js +0 -163
  207. package/lib/modules/table/formats/list.cjs.js.map +0 -1
  208. package/lib/modules/table/formats/table.cjs.js +0 -969
  209. package/lib/modules/table/formats/table.cjs.js.map +0 -1
  210. package/lib/modules/table/modules/table-column-tool.cjs.js +0 -400
  211. package/lib/modules/table/modules/table-column-tool.cjs.js.map +0 -1
  212. package/lib/modules/table/modules/table-operation-menu.cjs.js +0 -475
  213. package/lib/modules/table/modules/table-operation-menu.cjs.js.map +0 -1
  214. package/lib/modules/table/modules/table-scroll-bar.cjs.js +0 -190
  215. package/lib/modules/table/modules/table-scroll-bar.cjs.js.map +0 -1
  216. package/lib/modules/table/modules/table-selection.cjs.js +0 -305
  217. package/lib/modules/table/modules/table-selection.cjs.js.map +0 -1
  218. package/lib/modules/table/modules/table-selector.cjs.js +0 -158
  219. package/lib/modules/table/modules/table-selector.cjs.js.map +0 -1
  220. package/lib/modules/table/table-config.cjs.js +0 -74
  221. package/lib/modules/table/table-config.cjs.js.map +0 -1
  222. package/lib/modules/table/utils/index.cjs.js +0 -54
  223. package/lib/modules/table/utils/index.cjs.js.map +0 -1
  224. package/lib/modules/table/utils/node-matchers.cjs.js +0 -292
  225. package/lib/modules/table/utils/node-matchers.cjs.js.map +0 -1
  226. package/types/modules/custom-uploader.d.ts +0 -31
  227. package/types/modules/global-link/constants.d.ts +0 -3
  228. package/types/modules/global-link/formats/customer-widget-link.d.ts +0 -14
  229. package/types/modules/global-link/formats/doc-link.d.ts +0 -17
  230. package/types/modules/global-link/formats/wiki-link.d.ts +0 -16
  231. package/types/modules/global-link/formats/work-item-link.d.ts +0 -16
  232. package/types/modules/global-link/global-link-panel.d.ts +0 -19
  233. package/types/modules/global-link/index.d.ts +0 -18
  234. package/types/modules/global-link/utils/createTable.d.ts +0 -1
  235. package/types/modules/quick-menu.d.ts +0 -22
  236. package/types/modules/table/better-table.d.ts +0 -35
  237. package/types/modules/table/formats/header.d.ts +0 -23
  238. package/types/modules/table/formats/list.d.ts +0 -34
  239. package/types/modules/table/formats/table.d.ts +0 -147
  240. package/types/modules/table/modules/table-column-tool.d.ts +0 -23
  241. package/types/modules/table/modules/table-operation-menu.d.ts +0 -38
  242. package/types/modules/table/modules/table-scroll-bar.d.ts +0 -33
  243. package/types/modules/table/modules/table-selection.d.ts +0 -37
  244. package/types/modules/table/modules/table-selector.d.ts +0 -22
  245. package/types/modules/table/table-config.d.ts +0 -38
  246. package/types/modules/table/utils/index.d.ts +0 -17
  247. package/types/modules/table/utils/node-matchers.d.ts +0 -9
@@ -1,133 +1,31 @@
1
- import Quill from "quill";
2
- import { isNullOrUndefined } from "../../config/editor.utils.es.js";
3
- const SnowTheme = Quill.imports["themes/snow"];
4
- let optionsCounter = 0;
5
- function toggleAriaAttribute(element, attribute) {
6
- element.setAttribute(
7
- attribute,
8
- element.getAttribute(attribute) !== "true"
9
- );
10
- }
11
- class Picker {
12
- constructor(select) {
13
- this.select = select;
14
- this.container = document.createElement("span");
15
- this.buildPicker();
16
- this.select.style.display = "none";
17
- this.select.parentNode.insertBefore(this.container, this.select);
18
- this.label.addEventListener("mousedown", (e) => {
19
- this.togglePicker();
20
- e.preventDefault();
21
- });
22
- this.label.addEventListener("keydown", (event) => {
23
- switch (event.key) {
24
- case "Enter":
25
- this.togglePicker();
26
- break;
27
- case "Escape":
28
- this.escape();
29
- event.preventDefault();
30
- break;
31
- default:
32
- }
33
- });
34
- this.select.addEventListener("change", this.update.bind(this));
35
- }
36
- togglePicker() {
37
- this.container.classList.toggle("ql-expanded");
38
- toggleAriaAttribute(this.label, "aria-expanded");
39
- toggleAriaAttribute(this.options, "aria-hidden");
40
- }
41
- buildItem(option) {
42
- const item = document.createElement("span");
43
- item.tabIndex = 0;
44
- item.setAttribute("role", "button");
45
- item.classList.add("ql-picker-item");
46
- if (option.hasAttribute("value")) {
47
- item.setAttribute("data-value", option.getAttribute("value"));
48
- }
49
- if (option.textContent) {
50
- item.setAttribute("data-label", option.textContent);
51
- }
52
- item.addEventListener("click", () => {
53
- this.selectItem(item, true);
54
- });
55
- item.addEventListener("keydown", (event) => {
56
- switch (event.key) {
57
- case "Enter":
58
- this.selectItem(item, true);
59
- event.preventDefault();
60
- break;
61
- case "Escape":
62
- this.escape();
63
- event.preventDefault();
64
- break;
65
- default:
66
- }
67
- });
68
- return item;
69
- }
1
+ import { EasyColorPicker } from "quill-easy-color";
2
+ import FluentEditor from "../../core/fluent-editor.es.js";
3
+ const OriginPicker = FluentEditor.import("ui/picker");
4
+ class Picker extends OriginPicker {
70
5
  buildLabel() {
71
6
  const label = document.createElement("span");
72
7
  label.classList.add("ql-picker-label");
73
- label.innerHTML = `
74
- <svg viewbox="0 0 18 18">
75
- <polygon class="ql-stroke" points="7 11 9 13 11 11 7 11"></polygon>
76
- <polygon class="ql-stroke" points="7 7 9 5 11 7 7 7"></polygon>
77
- </svg>
78
- `;
8
+ label.innerHTML = `<i class="icon" />`;
79
9
  label.tabIndex = 0;
80
10
  label.setAttribute("role", "button");
81
11
  label.setAttribute("aria-expanded", "false");
82
12
  this.container.appendChild(label);
83
13
  return label;
84
14
  }
85
- buildOptions() {
86
- const options = document.createElement("span");
87
- options.classList.add("ql-picker-options");
88
- options.setAttribute("aria-hidden", "true");
89
- options.tabIndex = -1;
90
- options.id = `ql-picker-options-${optionsCounter}`;
91
- optionsCounter += 1;
92
- this.label.setAttribute("aria-controls", options.id);
93
- this.options = options;
94
- Array.from(this.select.options).forEach((option) => {
95
- const item = this.buildItem(option);
96
- options.appendChild(item);
97
- if (option.selected === true) {
98
- this.selectItem(item);
99
- }
100
- });
101
- this.container.appendChild(options);
102
- }
103
- buildPicker() {
104
- Array.from(this.select.attributes).forEach((item) => {
105
- this.container.setAttribute(item.name, item.value);
106
- });
107
- this.container.classList.add("ql-picker");
108
- this.label = this.buildLabel();
109
- this.buildOptions();
110
- }
111
- escape() {
112
- this.close();
113
- setTimeout(() => this.label.focus(), 1);
114
- }
115
- close() {
116
- this.container.classList.remove("ql-expanded");
117
- this.label.setAttribute("aria-expanded", "false");
118
- this.options.setAttribute("aria-hidden", "true");
15
+ buildItem(option) {
16
+ const item = super.buildItem(option);
17
+ const value = option.getAttribute("value");
18
+ item.style.setProperty("--value", value);
19
+ return item;
119
20
  }
120
21
  selectItem(item, trigger = false) {
121
22
  const selected = this.container.querySelector(".ql-selected");
122
- if (item === selected) return;
123
- if (!isNullOrUndefined(selected)) {
23
+ if (item === selected || item == null) return;
24
+ if (selected != null) {
124
25
  selected.classList.remove("ql-selected");
125
26
  }
126
- if (isNullOrUndefined(item)) return;
127
27
  item.classList.add("ql-selected");
128
- this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(
129
- item
130
- );
28
+ this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(item);
131
29
  if (item.hasAttribute("data-value")) {
132
30
  this.label.setAttribute("data-value", item.getAttribute("data-value"));
133
31
  } else {
@@ -139,169 +37,23 @@ class Picker {
139
37
  this.label.removeAttribute("data-label");
140
38
  }
141
39
  if (trigger) {
142
- let ev;
143
- if (typeof Event === "function") {
144
- ev = new Event("change");
145
- } else {
146
- ev = document.createEvent("Event");
147
- ev.initEvent("change", true, true);
148
- }
149
- this.select.dispatchEvent(ev);
40
+ this.select.dispatchEvent(new Event("change"));
150
41
  this.close();
151
42
  }
152
43
  }
153
- update() {
154
- let option;
155
- if (this.select.selectedIndex > -1) {
156
- const item = this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];
157
- option = this.select.options[this.select.selectedIndex];
158
- this.selectItem(item);
159
- } else {
160
- this.selectItem(null);
161
- }
162
- const isActive = !isNullOrUndefined(option) && option !== this.select.querySelector("option[selected]");
163
- if (isActive) {
164
- this.label.classList.add("ql-active");
165
- } else {
166
- this.label.classList.remove("ql-active");
167
- }
168
- }
169
44
  }
170
- class IconPicker extends Picker {
171
- constructor(select, icons) {
172
- super(select);
173
- this.container.classList.add("ql-icon-picker");
174
- Array.from(this.container.querySelectorAll(".ql-picker-item")).forEach(
175
- (item) => {
176
- item.innerHTML = icons[item.getAttribute("data-value") || ""];
177
- }
178
- );
179
- this.defaultItem = this.container.querySelector(".ql-selected");
180
- this.selectItem(this.defaultItem, null);
181
- }
182
- selectItem(target, trigger) {
183
- super.selectItem(target, trigger);
184
- const item = target || this.defaultItem;
185
- if (this.label.innerHTML === item.innerHTML) return;
186
- this.label.innerHTML = item.innerHTML;
187
- }
188
- }
189
- class ColorPicker extends Picker {
190
- constructor(select, label) {
191
- super(select);
192
- this.label.innerHTML = label;
193
- this.container.classList.add("ql-color-picker");
194
- Array.from(this.container.querySelectorAll(".ql-picker-item")).slice(0, 7).forEach((item) => {
195
- item.classList.add("ql-primary");
196
- });
45
+ class ColorPicker extends EasyColorPicker {
46
+ constructor(select, label, options) {
47
+ super(select, label, options);
197
48
  }
198
49
  buildItem(option) {
199
50
  const item = super.buildItem(option);
200
- item.style.backgroundColor = option.getAttribute("value") || "";
51
+ item.setAttribute("title", option.getAttribute("value"));
201
52
  return item;
202
53
  }
203
- selectItem(item, trigger) {
204
- super.selectItem(item, trigger);
205
- const colorLabel = this.label.querySelector(".ql-color-label");
206
- const value = item ? item.getAttribute("data-value") || "" : "";
207
- if (colorLabel) {
208
- if (colorLabel.tagName === "line") {
209
- colorLabel.style.stroke = value;
210
- } else {
211
- colorLabel.style.fill = value;
212
- }
213
- }
214
- }
215
54
  }
216
- Quill.register("ui/picker", Picker, true);
217
- Quill.register("ui/icon-picker", IconPicker, true);
218
- Quill.register("ui/color-picker", ColorPicker, true);
219
- const ALIGNS = [false, "center", "right"];
220
- const COLORS = [
221
- "#000000",
222
- "#e60000",
223
- "#ff9900",
224
- "#ffff00",
225
- "#008a00",
226
- "#0066cc",
227
- "#9933ff",
228
- "#ffffff",
229
- "#facccc",
230
- "#ffebcc",
231
- "#ffffcc",
232
- "#cce8cc",
233
- "#cce0f5",
234
- "#ebd6ff",
235
- "#bbbbbb",
236
- "#f06666",
237
- "#ffc266",
238
- "#ffff66",
239
- "#66b966",
240
- "#66a3e0",
241
- "#c285ff",
242
- "#888888",
243
- "#a10000",
244
- "#b26b00",
245
- "#b2b200",
246
- "#006100",
247
- "#0047b2",
248
- "#6b24b2",
249
- "#444444",
250
- "#5c0000",
251
- "#663d00",
252
- "#666600",
253
- "#003700",
254
- "#002966",
255
- "#3d1466"
256
- ];
257
- const FONTS = [false, "serif", "monospace"];
258
- const HEADERS = ["1", "2", "3", false];
259
- const SIZES = ["small", false, "large", "huge"];
260
- SnowTheme.prototype.buildPickers = function(selects, icons) {
261
- this.pickers = Array.from(selects).map((select) => {
262
- if (select.classList.contains("ql-align")) {
263
- if (isNullOrUndefined(select.querySelector("option"))) {
264
- fillSelect(select, ALIGNS);
265
- }
266
- return new IconPicker(select, icons.align);
267
- }
268
- if (select.classList.contains("ql-background") || select.classList.contains("ql-color")) {
269
- const format = select.classList.contains("ql-background") ? "background" : "color";
270
- if (isNullOrUndefined(select.querySelector("option"))) {
271
- fillSelect(
272
- select,
273
- COLORS
274
- );
275
- }
276
- return new ColorPicker(select, icons[format]);
277
- }
278
- if (isNullOrUndefined(select.querySelector("option"))) {
279
- if (select.classList.contains("ql-font")) {
280
- fillSelect(select, FONTS);
281
- } else if (select.classList.contains("ql-header")) {
282
- fillSelect(select, HEADERS);
283
- } else if (select.classList.contains("ql-size")) {
284
- fillSelect(select, SIZES);
285
- }
286
- }
287
- return new Picker(select);
288
- });
289
- const update = () => {
290
- this.pickers.forEach((picker) => {
291
- picker.update();
292
- });
293
- };
294
- this.quill.on(Quill.events.EDITOR_CHANGE, update);
55
+ export {
56
+ ColorPicker,
57
+ Picker
295
58
  };
296
- function fillSelect(select, values, defaultValue = false) {
297
- values.forEach((value) => {
298
- const option = document.createElement("option");
299
- if (value === defaultValue) {
300
- option.setAttribute("selected", "selected");
301
- } else {
302
- option.setAttribute("value", value);
303
- }
304
- select.appendChild(option);
305
- });
306
- }
307
59
  //# sourceMappingURL=better-picker.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"better-picker.es.js","sources":["../../../../src/modules/toolbar/better-picker.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined } from '../../config/editor.utils'\r\n\r\nconst SnowTheme = Quill.imports['themes/snow']\r\n\r\nlet optionsCounter = 0\r\n\r\nfunction toggleAriaAttribute(element, attribute) {\r\n element.setAttribute(\r\n attribute,\r\n element.getAttribute(attribute) !== 'true',\r\n )\r\n}\r\n\r\nclass Picker {\r\n container: any\r\n label: any\r\n options: any\r\n select: any\r\n constructor(select) {\r\n this.select = select\r\n this.container = document.createElement('span')\r\n this.buildPicker()\r\n this.select.style.display = 'none'\r\n this.select.parentNode.insertBefore(this.container, this.select)\r\n\r\n this.label.addEventListener('mousedown', (e) => {\r\n this.togglePicker()\r\n e.preventDefault()\r\n })\r\n this.label.addEventListener('keydown', (event) => {\r\n switch (event.key) {\r\n case 'Enter':\r\n this.togglePicker()\r\n break\r\n case 'Escape':\r\n this.escape()\r\n event.preventDefault()\r\n break\r\n default:\r\n }\r\n })\r\n this.select.addEventListener('change', this.update.bind(this))\r\n }\r\n\r\n togglePicker() {\r\n this.container.classList.toggle('ql-expanded')\r\n // Toggle aria-expanded and aria-hidden to make the picker accessible\r\n toggleAriaAttribute(this.label, 'aria-expanded')\r\n toggleAriaAttribute(this.options, 'aria-hidden')\r\n }\r\n\r\n buildItem(option) {\r\n const item = document.createElement('span')\r\n item.tabIndex = 0\r\n item.setAttribute('role', 'button')\r\n item.classList.add('ql-picker-item')\r\n if (option.hasAttribute('value')) {\r\n item.setAttribute('data-value', option.getAttribute('value'))\r\n }\r\n if (option.textContent) {\r\n item.setAttribute('data-label', option.textContent)\r\n }\r\n item.addEventListener('click', () => {\r\n this.selectItem(item, true)\r\n })\r\n item.addEventListener('keydown', (event) => {\r\n switch (event.key) {\r\n case 'Enter':\r\n this.selectItem(item, true)\r\n event.preventDefault()\r\n break\r\n case 'Escape':\r\n this.escape()\r\n event.preventDefault()\r\n break\r\n default:\r\n }\r\n })\r\n\r\n return item\r\n }\r\n\r\n buildLabel() {\r\n const label = document.createElement('span')\r\n label.classList.add('ql-picker-label')\r\n label.innerHTML = `\r\n <svg viewbox=\"0 0 18 18\">\r\n <polygon class=\"ql-stroke\" points=\"7 11 9 13 11 11 7 11\"></polygon>\r\n <polygon class=\"ql-stroke\" points=\"7 7 9 5 11 7 7 7\"></polygon>\r\n </svg>\r\n `\r\n label.tabIndex = 0\r\n label.setAttribute('role', 'button')\r\n label.setAttribute('aria-expanded', 'false')\r\n this.container.appendChild(label)\r\n return label\r\n }\r\n\r\n buildOptions() {\r\n const options = document.createElement('span')\r\n options.classList.add('ql-picker-options')\r\n\r\n // Don't want screen readers to read this until options are visible\r\n options.setAttribute('aria-hidden', 'true')\r\n options.tabIndex = -1\r\n\r\n // Need a unique id for aria-controls\r\n options.id = `ql-picker-options-${optionsCounter}`\r\n optionsCounter += 1\r\n this.label.setAttribute('aria-controls', options.id)\r\n\r\n this.options = options\r\n\r\n Array.from(this.select.options).forEach((option: any) => {\r\n const item = this.buildItem(option)\r\n options.appendChild(item)\r\n if (option.selected === true) {\r\n this.selectItem(item)\r\n }\r\n })\r\n this.container.appendChild(options)\r\n }\r\n\r\n buildPicker() {\r\n Array.from(this.select.attributes).forEach((item: any) => {\r\n this.container.setAttribute(item.name, item.value)\r\n })\r\n this.container.classList.add('ql-picker')\r\n this.label = this.buildLabel()\r\n this.buildOptions()\r\n }\r\n\r\n escape() {\r\n // Close menu and return focus to trigger label\r\n this.close()\r\n // Need setTimeout for accessibility to ensure that the browser executes\r\n // focus on the next process thread and after any DOM content changes\r\n setTimeout(() => this.label.focus(), 1)\r\n }\r\n\r\n close() {\r\n this.container.classList.remove('ql-expanded')\r\n this.label.setAttribute('aria-expanded', 'false')\r\n this.options.setAttribute('aria-hidden', 'true')\r\n }\r\n\r\n selectItem(item, trigger = false) {\r\n const selected = this.container.querySelector('.ql-selected')\r\n if (item === selected) return\r\n if (!isNullOrUndefined(selected)) {\r\n selected.classList.remove('ql-selected')\r\n }\r\n if (isNullOrUndefined(item)) return\r\n item.classList.add('ql-selected')\r\n this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(\r\n item,\r\n )\r\n if (item.hasAttribute('data-value')) {\r\n this.label.setAttribute('data-value', item.getAttribute('data-value'))\r\n }\r\n else {\r\n this.label.removeAttribute('data-value')\r\n }\r\n if (item.hasAttribute('data-label')) {\r\n this.label.setAttribute('data-label', item.getAttribute('data-label'))\r\n }\r\n else {\r\n this.label.removeAttribute('data-label')\r\n }\r\n if (trigger) {\r\n let ev\r\n if (typeof Event === 'function') {\r\n ev = new Event('change')\r\n }\r\n else {\r\n ev = document.createEvent('Event')\r\n ev.initEvent('change', true, true)\r\n }\r\n this.select.dispatchEvent(ev)\r\n this.close()\r\n }\r\n }\r\n\r\n update() {\r\n let option\r\n if (this.select.selectedIndex > -1) {\r\n const item = this.container.querySelector('.ql-picker-options').children[\r\n this.select.selectedIndex\r\n ]\r\n option = this.select.options[this.select.selectedIndex]\r\n this.selectItem(item)\r\n }\r\n else {\r\n this.selectItem(null)\r\n }\r\n const isActive\r\n = !isNullOrUndefined(option)\r\n && option !== this.select.querySelector('option[selected]')\r\n\r\n if (isActive) {\r\n this.label.classList.add('ql-active')\r\n }\r\n else {\r\n this.label.classList.remove('ql-active')\r\n }\r\n }\r\n}\r\n\r\nclass IconPicker extends Picker {\r\n defaultItem: any\r\n constructor(select, icons) {\r\n super(select)\r\n this.container.classList.add('ql-icon-picker')\r\n Array.from(this.container.querySelectorAll('.ql-picker-item')).forEach(\r\n (item: any) => {\r\n item.innerHTML = icons[item.getAttribute('data-value') || '']\r\n },\r\n )\r\n this.defaultItem = this.container.querySelector('.ql-selected')\r\n this.selectItem(this.defaultItem, null)\r\n }\r\n\r\n selectItem(target, trigger) {\r\n super.selectItem(target, trigger)\r\n const item = target || this.defaultItem\r\n if (this.label.innerHTML === item.innerHTML) return\r\n this.label.innerHTML = item.innerHTML\r\n }\r\n}\r\n\r\nclass ColorPicker extends Picker {\r\n constructor(select, label) {\r\n super(select)\r\n this.label.innerHTML = label\r\n this.container.classList.add('ql-color-picker')\r\n Array.from(this.container.querySelectorAll('.ql-picker-item'))\r\n .slice(0, 7)\r\n .forEach((item: any) => {\r\n item.classList.add('ql-primary')\r\n })\r\n }\r\n\r\n buildItem(option) {\r\n const item = super.buildItem(option)\r\n item.style.backgroundColor = option.getAttribute('value') || ''\r\n return item\r\n }\r\n\r\n selectItem(item, trigger) {\r\n super.selectItem(item, trigger)\r\n const colorLabel = this.label.querySelector('.ql-color-label')\r\n const value = item ? item.getAttribute('data-value') || '' : ''\r\n if (colorLabel) {\r\n if (colorLabel.tagName === 'line') {\r\n colorLabel.style.stroke = value\r\n }\r\n else {\r\n colorLabel.style.fill = value\r\n }\r\n }\r\n }\r\n}\r\n\r\nQuill.register('ui/picker', Picker, true)\r\nQuill.register('ui/icon-picker', IconPicker, true)\r\nQuill.register('ui/color-picker', ColorPicker, true)\r\n\r\nconst ALIGNS = [false, 'center', 'right']\r\n\r\nconst COLORS = [\r\n '#000000',\r\n '#e60000',\r\n '#ff9900',\r\n '#ffff00',\r\n '#008a00',\r\n '#0066cc',\r\n '#9933ff',\r\n '#ffffff',\r\n '#facccc',\r\n '#ffebcc',\r\n '#ffffcc',\r\n '#cce8cc',\r\n '#cce0f5',\r\n '#ebd6ff',\r\n '#bbbbbb',\r\n '#f06666',\r\n '#ffc266',\r\n '#ffff66',\r\n '#66b966',\r\n '#66a3e0',\r\n '#c285ff',\r\n '#888888',\r\n '#a10000',\r\n '#b26b00',\r\n '#b2b200',\r\n '#006100',\r\n '#0047b2',\r\n '#6b24b2',\r\n '#444444',\r\n '#5c0000',\r\n '#663d00',\r\n '#666600',\r\n '#003700',\r\n '#002966',\r\n '#3d1466',\r\n]\r\n\r\nconst FONTS = [false, 'serif', 'monospace']\r\n\r\nconst HEADERS = ['1', '2', '3', false]\r\n\r\nconst SIZES = ['small', false, 'large', 'huge']\r\n\r\nSnowTheme.prototype.buildPickers = function (selects, icons) {\r\n this.pickers = Array.from(selects).map((select: any) => {\r\n if (select.classList.contains('ql-align')) {\r\n if (isNullOrUndefined(select.querySelector('option'))) {\r\n fillSelect(select, ALIGNS)\r\n }\r\n return new IconPicker(select, icons.align)\r\n }\r\n if (\r\n select.classList.contains('ql-background')\r\n || select.classList.contains('ql-color')\r\n ) {\r\n const format = select.classList.contains('ql-background')\r\n ? 'background'\r\n : 'color'\r\n if (isNullOrUndefined(select.querySelector('option'))) {\r\n fillSelect(\r\n select,\r\n COLORS,\r\n )\r\n }\r\n return new ColorPicker(select, icons[format])\r\n }\r\n if (isNullOrUndefined(select.querySelector('option'))) {\r\n if (select.classList.contains('ql-font')) {\r\n fillSelect(select, FONTS)\r\n }\r\n else if (select.classList.contains('ql-header')) {\r\n fillSelect(select, HEADERS)\r\n }\r\n else if (select.classList.contains('ql-size')) {\r\n fillSelect(select, SIZES)\r\n }\r\n }\r\n return new Picker(select)\r\n })\r\n const update = () => {\r\n this.pickers.forEach((picker) => {\r\n picker.update()\r\n })\r\n }\r\n this.quill.on(Quill.events.EDITOR_CHANGE, update)\r\n}\r\n\r\nfunction fillSelect(select, values, defaultValue = false) {\r\n values.forEach((value) => {\r\n const option = document.createElement('option')\r\n if (value === defaultValue) {\r\n option.setAttribute('selected', 'selected')\r\n }\r\n else {\r\n option.setAttribute('value', value)\r\n }\r\n select.appendChild(option)\r\n })\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"better-picker.es.js","sources":["../../../../src/modules/toolbar/better-picker.ts"],"sourcesContent":["import type TypePicker from 'quill/ui/picker'\r\nimport { EasyColorPicker } from 'quill-easy-color'\r\nimport FluentEditor from '../../core/fluent-editor'\r\n\r\nconst OriginPicker = FluentEditor.import('ui/picker') as typeof TypePicker\r\nexport class Picker extends OriginPicker {\r\n buildLabel() {\r\n const label = document.createElement('span')\r\n label.classList.add('ql-picker-label')\r\n label.innerHTML = `<i class=\"icon\" />`\r\n label.tabIndex = 0\r\n label.setAttribute('role', 'button')\r\n label.setAttribute('aria-expanded', 'false')\r\n this.container.appendChild(label)\r\n return label\r\n }\r\n\r\n buildItem(option: HTMLOptionElement) {\r\n const item = super.buildItem(option)\r\n const value = option.getAttribute('value')\r\n item.style.setProperty('--value', value)\r\n return item\r\n }\r\n\r\n selectItem(item: HTMLElement | null, trigger = false) {\r\n const selected = this.container.querySelector('.ql-selected')\r\n if (item === selected || item == null) return\r\n // move ql-selected clear after judge.\r\n // ql-selected is the class for check mark in picker\r\n if (selected != null) {\r\n selected.classList.remove('ql-selected')\r\n }\r\n item.classList.add('ql-selected')\r\n this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(item)\r\n if (item.hasAttribute('data-value')) {\r\n this.label.setAttribute('data-value', item.getAttribute('data-value'))\r\n }\r\n else {\r\n this.label.removeAttribute('data-value')\r\n }\r\n if (item.hasAttribute('data-label')) {\r\n this.label.setAttribute('data-label', item.getAttribute('data-label'))\r\n }\r\n else {\r\n this.label.removeAttribute('data-label')\r\n }\r\n if (trigger) {\r\n this.select.dispatchEvent(new Event('change'))\r\n this.close()\r\n }\r\n }\r\n}\r\n\r\nexport class ColorPicker extends EasyColorPicker {\r\n static clearText: string\r\n static customText: string\r\n\r\n constructor(select: HTMLSelectElement, label: string, options: any) {\r\n super(select, label, options)\r\n }\r\n\r\n buildItem(option: HTMLOptionElement) {\r\n const item = super.buildItem(option)\r\n item.setAttribute('title', option.getAttribute('value'))\r\n return item\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAIA,MAAM,eAAe,aAAa,OAAO,WAAW;AAC7C,MAAM,eAAe,aAAa;AAAA,EACvC,aAAa;AACL,UAAA,QAAQ,SAAS,cAAc,MAAM;AACrC,UAAA,UAAU,IAAI,iBAAiB;AACrC,UAAM,YAAY;AAClB,UAAM,WAAW;AACX,UAAA,aAAa,QAAQ,QAAQ;AAC7B,UAAA,aAAa,iBAAiB,OAAO;AACtC,SAAA,UAAU,YAAY,KAAK;AACzB,WAAA;AAAA,EAAA;AAAA,EAGT,UAAU,QAA2B;AAC7B,UAAA,OAAO,MAAM,UAAU,MAAM;AAC7B,UAAA,QAAQ,OAAO,aAAa,OAAO;AACpC,SAAA,MAAM,YAAY,WAAW,KAAK;AAChC,WAAA;AAAA,EAAA;AAAA,EAGT,WAAW,MAA0B,UAAU,OAAO;AACpD,UAAM,WAAW,KAAK,UAAU,cAAc,cAAc;AACxD,QAAA,SAAS,YAAY,QAAQ,KAAM;AAGvC,QAAI,YAAY,MAAM;AACX,eAAA,UAAU,OAAO,aAAa;AAAA,IAAA;AAEpC,SAAA,UAAU,IAAI,aAAa;AAC3B,SAAA,OAAO,gBAAgB,MAAM,KAAK,KAAK,WAAW,QAAQ,EAAE,QAAQ,IAAI;AACzE,QAAA,KAAK,aAAa,YAAY,GAAG;AACnC,WAAK,MAAM,aAAa,cAAc,KAAK,aAAa,YAAY,CAAC;AAAA,IAAA,OAElE;AACE,WAAA,MAAM,gBAAgB,YAAY;AAAA,IAAA;AAErC,QAAA,KAAK,aAAa,YAAY,GAAG;AACnC,WAAK,MAAM,aAAa,cAAc,KAAK,aAAa,YAAY,CAAC;AAAA,IAAA,OAElE;AACE,WAAA,MAAM,gBAAgB,YAAY;AAAA,IAAA;AAEzC,QAAI,SAAS;AACX,WAAK,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC;AAC7C,WAAK,MAAM;AAAA,IAAA;AAAA,EACb;AAEJ;AAEO,MAAM,oBAAoB,gBAAgB;AAAA,EAI/C,YAAY,QAA2B,OAAe,SAAc;AAC5D,UAAA,QAAQ,OAAO,OAAO;AAAA,EAAA;AAAA,EAG9B,UAAU,QAA2B;AAC7B,UAAA,OAAO,MAAM,UAAU,MAAM;AACnC,SAAK,aAAa,SAAS,OAAO,aAAa,OAAO,CAAC;AAChD,WAAA;AAAA,EAAA;AAEX;"}
@@ -1,6 +1,5 @@
1
1
  import Quill from "quill";
2
2
  import { isNullOrUndefined } from "../../config/editor.utils.es.js";
3
- import "./better-picker.es.js";
4
3
  import { generateToolbarTip } from "./toolbar-tip.es.js";
5
4
  const Delta = Quill.import("delta");
6
5
  const Parchment = Quill.import("parchment");
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../../../src/modules/toolbar/index.ts"],"sourcesContent":["import type TypeToolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\nimport { isNullOrUndefined } from '../../config/editor.utils'\r\nimport './better-picker'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Parchment = Quill.import('parchment')\r\nconst levels = ['error', 'warn', 'log', 'info'] as const\r\nlet level = 'warn' as const\r\n\r\nfunction debuglogger(method: typeof levels[number], ...args) {\r\n if (levels.indexOf(method) <= levels.indexOf(level)) {\r\n console[method](...args) // eslint-disable-line no-console\r\n }\r\n}\r\n\r\nfunction namespace(ns) {\r\n return levels.reduce((logger, method) => {\r\n logger[method] = debuglogger.bind(console, method, ns)\r\n return logger\r\n }, {} as Record<typeof levels[number], (...args: any) => void>)\r\n}\r\n\r\nnamespace.level = (newLevel) => {\r\n level = newLevel\r\n}\r\ndebuglogger.level = namespace.level\r\nconst debug = namespace('quill:toolbar')\r\n\r\nconst Toolbar = Quill.import('modules/toolbar') as typeof TypeToolbar\r\n// let oldClean = Toolbar.DEFAULTS.handlers.clean\r\n\r\nclass BetterToolbar extends Toolbar {\r\n update(range) {\r\n const formats = isNullOrUndefined(range) ? {} : this.quill.getFormat(range) as Record<string, any>\r\n this.controls.forEach((pair) => {\r\n const [format, input] = pair\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n let option\r\n if (isNullOrUndefined(range)) {\r\n option = null\r\n }\r\n else if (isNullOrUndefined(formats[format])) {\r\n option = select.querySelector('option[selected]')\r\n }\r\n else if (!Array.isArray(formats[format])) {\r\n let value = format === 'header' ? formats[format].value : formats[format]\r\n if (typeof value === 'string') {\r\n value = value.replace(/\"/g, '\\\\\"')\r\n }\r\n option = select.querySelector(`option[value=\"${value}\"]`)\r\n }\r\n if (isNullOrUndefined(option)) {\r\n select.value = '' // TODO make configurable?\r\n select.selectedIndex = -1\r\n }\r\n else {\r\n option.selected = true\r\n }\r\n }\r\n else if (isNullOrUndefined(range)) {\r\n input.classList.remove('ql-active')\r\n }\r\n else if (input.hasAttribute('value')) {\r\n // both being null should match (default values)\r\n // '1' should match with 1 (headers)\r\n let isActive\r\n = formats[format] === input.getAttribute('value')\r\n || (!isNullOrUndefined(formats[format])\r\n && (formats[format].value === input.getAttribute('value')\r\n || formats[format].toString() === input.getAttribute('value')))\r\n || (isNullOrUndefined(formats[format]) && !input.getAttribute('value'))\r\n\r\n if (!isActive) {\r\n const checkFormat = formats[format]\r\n if (checkFormat === 'checked' || checkFormat === 'unchecked') {\r\n isActive = input.getAttribute('value') === 'check'\r\n }\r\n }\r\n\r\n if (isActive) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n else {\r\n if (!isNullOrUndefined(formats[format])) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n })\r\n }\r\n\r\n attach(input: HTMLElement) {\r\n let format = Array.from(input.classList).find((className) => {\r\n return className.indexOf('ql-') === 0\r\n })\r\n if (!format) return\r\n format = format.slice('ql-'.length)\r\n\r\n if (input.tagName === 'BUTTON') {\r\n input.setAttribute('type', 'button')\r\n }\r\n\r\n if (this.handlers[format] == null && this.quill.scroll.query(format) == null) {\r\n debug.warn('ignoring attaching to nonexistent format', format, input)\r\n return\r\n }\r\n\r\n const eventName = input.tagName === 'SELECT' ? 'change' : 'click'\r\n input.addEventListener(eventName, (e) => {\r\n let value: boolean | string\r\n\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n if (select.selectedIndex < 0) return\r\n const selected = select.options[select.selectedIndex]\r\n\r\n if (selected.hasAttribute('selected')) {\r\n value = false\r\n }\r\n else {\r\n value = selected.value || false\r\n }\r\n }\r\n else {\r\n const button = input as HTMLButtonElement\r\n if (button.classList.contains('ql-active')) {\r\n value = false\r\n }\r\n else {\r\n value = button.value || !button.hasAttribute('value')\r\n }\r\n e.preventDefault()\r\n }\r\n\r\n this.quill.focus({ preventScroll: format === 'screenshot' })\r\n const [range] = this.quill.selection.getRange()\r\n if (this.handlers[format] != null) {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.handlers[format].call(this, value)\r\n }\r\n else if (\r\n // @ts-ignore\r\n this.quill.scroll.query(format).prototype instanceof Parchment.EmbedBlot\r\n ) {\r\n value = prompt(`Enter ${format}`)\r\n if (!value) return\r\n this.quill.updateContents(\r\n new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ [format]: value }),\r\n Quill.sources.USER,\r\n )\r\n }\r\n else {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.quill.format(format, value, Quill.sources.USER)\r\n }\r\n\r\n this.update(range)\r\n })\r\n this.controls.push([format, input])\r\n }\r\n}\r\n\r\nexport default BetterToolbar\r\nexport * from './toolbar-tip'\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../../../../src/modules/toolbar/index.ts"],"sourcesContent":["import type TypeToolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\nimport { isNullOrUndefined } from '../../config/editor.utils'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Parchment = Quill.import('parchment')\r\nconst levels = ['error', 'warn', 'log', 'info'] as const\r\nlet level = 'warn' as const\r\n\r\nfunction debuglogger(method: typeof levels[number], ...args) {\r\n if (levels.indexOf(method) <= levels.indexOf(level)) {\r\n console[method](...args) // eslint-disable-line no-console\r\n }\r\n}\r\n\r\nfunction namespace(ns) {\r\n return levels.reduce((logger, method) => {\r\n logger[method] = debuglogger.bind(console, method, ns)\r\n return logger\r\n }, {} as Record<typeof levels[number], (...args: any) => void>)\r\n}\r\n\r\nnamespace.level = (newLevel) => {\r\n level = newLevel\r\n}\r\ndebuglogger.level = namespace.level\r\nconst debug = namespace('quill:toolbar')\r\n\r\nconst Toolbar = Quill.import('modules/toolbar') as typeof TypeToolbar\r\n\r\nclass BetterToolbar extends Toolbar {\r\n update(range) {\r\n const formats = isNullOrUndefined(range) ? {} : this.quill.getFormat(range) as Record<string, any>\r\n this.controls.forEach((pair) => {\r\n const [format, input] = pair\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n let option\r\n if (isNullOrUndefined(range)) {\r\n option = null\r\n }\r\n else if (isNullOrUndefined(formats[format])) {\r\n option = select.querySelector('option[selected]')\r\n }\r\n else if (!Array.isArray(formats[format])) {\r\n let value = format === 'header' ? formats[format].value : formats[format]\r\n if (typeof value === 'string') {\r\n value = value.replace(/\"/g, '\\\\\"')\r\n }\r\n option = select.querySelector(`option[value=\"${value}\"]`)\r\n }\r\n if (isNullOrUndefined(option)) {\r\n select.value = '' // TODO make configurable?\r\n select.selectedIndex = -1\r\n }\r\n else {\r\n option.selected = true\r\n }\r\n }\r\n else if (isNullOrUndefined(range)) {\r\n input.classList.remove('ql-active')\r\n }\r\n else if (input.hasAttribute('value')) {\r\n // both being null should match (default values)\r\n // '1' should match with 1 (headers)\r\n let isActive\r\n = formats[format] === input.getAttribute('value')\r\n || (!isNullOrUndefined(formats[format])\r\n && (formats[format].value === input.getAttribute('value')\r\n || formats[format].toString() === input.getAttribute('value')))\r\n || (isNullOrUndefined(formats[format]) && !input.getAttribute('value'))\r\n\r\n if (!isActive) {\r\n const checkFormat = formats[format]\r\n if (checkFormat === 'checked' || checkFormat === 'unchecked') {\r\n isActive = input.getAttribute('value') === 'check'\r\n }\r\n }\r\n\r\n if (isActive) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n else {\r\n if (!isNullOrUndefined(formats[format])) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n })\r\n }\r\n\r\n attach(input: HTMLElement) {\r\n let format = Array.from(input.classList).find((className) => {\r\n return className.indexOf('ql-') === 0\r\n })\r\n if (!format) return\r\n format = format.slice('ql-'.length)\r\n\r\n if (input.tagName === 'BUTTON') {\r\n input.setAttribute('type', 'button')\r\n }\r\n\r\n if (this.handlers[format] == null && this.quill.scroll.query(format) == null) {\r\n debug.warn('ignoring attaching to nonexistent format', format, input)\r\n return\r\n }\r\n\r\n const eventName = input.tagName === 'SELECT' ? 'change' : 'click'\r\n input.addEventListener(eventName, (e) => {\r\n let value: boolean | string\r\n\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n if (select.selectedIndex < 0) return\r\n const selected = select.options[select.selectedIndex]\r\n\r\n if (selected.hasAttribute('selected')) {\r\n value = false\r\n }\r\n else {\r\n value = selected.value || false\r\n }\r\n }\r\n else {\r\n const button = input as HTMLButtonElement\r\n if (button.classList.contains('ql-active')) {\r\n value = false\r\n }\r\n else {\r\n value = button.value || !button.hasAttribute('value')\r\n }\r\n e.preventDefault()\r\n }\r\n\r\n this.quill.focus({ preventScroll: format === 'screenshot' })\r\n const [range] = this.quill.selection.getRange()\r\n if (this.handlers[format] != null) {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.handlers[format].call(this, value)\r\n }\r\n else if (\r\n // @ts-ignore\r\n this.quill.scroll.query(format).prototype instanceof Parchment.EmbedBlot\r\n ) {\r\n value = prompt(`Enter ${format}`)\r\n if (!value) return\r\n this.quill.updateContents(\r\n new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ [format]: value }),\r\n Quill.sources.USER,\r\n )\r\n }\r\n else {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.quill.format(format, value, Quill.sources.USER)\r\n }\r\n\r\n this.update(range)\r\n })\r\n this.controls.push([format, input])\r\n }\r\n}\r\n\r\nexport default BetterToolbar\r\nexport * from './toolbar-tip'\r\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import "../../config/index.es.js";
2
+ import { isString } from "../../utils/is.es.js";
2
3
  import { CHANGE_LANGUAGE_EVENT } from "../../config/editor.config.es.js";
3
4
  function generateToolbarTip(QuillToolbarTip) {
4
5
  return class extends QuillToolbarTip {
@@ -17,7 +18,39 @@ function generateToolbarTip(QuillToolbarTip) {
17
18
  resolveOptions(options) {
18
19
  const result = super.resolveOptions(options);
19
20
  if (!this.quill.lang) return result;
21
+ const shortKeyMap = {
22
+ "bold": "Ctrl + B",
23
+ "italic": "Ctrl + I",
24
+ "underline": "Ctrl + U",
25
+ "strike": "Ctrl + D",
26
+ "clean": "Ctrl + /",
27
+ "align-left": "Alt + L",
28
+ "align-center": "Alt + C",
29
+ "align-right": "Alt + R",
30
+ "align-justify": "Alt + J",
31
+ "indent-+1": "Ctrl + ]",
32
+ "indent--1": "Ctrl + [",
33
+ "script-sub": "Ctrl + ;",
34
+ "script-super": "Ctrl + '",
35
+ "code": "Ctrl + E",
36
+ "direction-rtl": "Ctrl + R",
37
+ "direction-ltr": "Ctrl + L",
38
+ "undo": "Ctrl + Z",
39
+ "redo": "Ctrl + shift + Z",
40
+ "color": "Ctrl + Alt + C",
41
+ "background": "Ctrl + Alt + B",
42
+ "link": "Ctrl + K"
43
+ };
44
+ const shortcutModule = this.quill.getModule("shortcut-key");
45
+ const getShortKey = (name) => {
46
+ if (!shortcutModule) return "";
47
+ const shortKey = shortKeyMap[name];
48
+ return shortKey ? `
49
+ ${shortKey}` : "";
50
+ };
20
51
  const btnTips = [
52
+ "color",
53
+ "background",
21
54
  "bold",
22
55
  "italic",
23
56
  "strike",
@@ -34,25 +67,23 @@ function generateToolbarTip(QuillToolbarTip) {
34
67
  "emoji",
35
68
  "video",
36
69
  "screenshot",
37
- "better-table",
38
70
  "code-block",
39
71
  "formula",
40
72
  "format-painter",
41
- "header-list"
73
+ "header-list",
74
+ "table-up"
42
75
  ].reduce((map, name) => {
43
- map[name] = this.quill.getLangText(name);
76
+ map[name] = this.quill.getLangText(name) + getShortKey(name);
44
77
  return map;
45
78
  }, {});
46
79
  const selectTips = [
47
- "color",
48
- "background",
49
80
  "font",
50
81
  "size",
51
- "lineheight"
82
+ "line-height"
52
83
  ].reduce((map, name) => {
53
84
  map[name] = {
54
85
  onShow: () => {
55
- return this.quill.getLangText(name);
86
+ return this.quill.getLangText(name) + getShortKey(name);
56
87
  }
57
88
  };
58
89
  return map;
@@ -77,7 +108,7 @@ function generateToolbarTip(QuillToolbarTip) {
77
108
  value = "normal";
78
109
  }
79
110
  }
80
- return this.quill.getLangText(`${name}-${value}`);
111
+ return this.quill.getLangText(`${name}-${value}`) + getShortKey(`${name}-${value}`);
81
112
  }
82
113
  };
83
114
  return map;
@@ -92,11 +123,15 @@ function generateToolbarTip(QuillToolbarTip) {
92
123
  }
93
124
  }
94
125
  };
126
+ const inputTipTextMap = Object.entries(options.tipTextMap).reduce((pre, [key, value]) => {
127
+ pre[key] = isString(value) ? this.quill.getLangText(value) : value;
128
+ return pre;
129
+ }, {});
95
130
  return {
96
131
  ...result,
97
132
  tipTextMap: {
98
133
  ...textMap,
99
- ...options.tipTextMap
134
+ ...inputTipTextMap
100
135
  }
101
136
  };
102
137
  }
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-tip.es.js","sources":["../../../../src/modules/toolbar/toolbar-tip.ts"],"sourcesContent":["import type { Constructor } from '../../config/types'\r\nimport type FluentEditor from '../../fluent-editor'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../config'\r\n\r\nexport function generateToolbarTip(QuillToolbarTip: Constructor) {\r\n return class extends QuillToolbarTip {\r\n constructor(public quill: FluentEditor, options: Partial<Record<string, any>>) {\r\n if (!options?.tipTextMap) {\r\n options.tipTextMap = {}\r\n }\r\n super(quill, options)\r\n\r\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.destroyAllTips()\r\n this.options = this.resolveOptions(options)\r\n this.createToolbarTip()\r\n })\r\n }\r\n\r\n resolveOptions(options: Partial<Record<string, any>>): Record<string, any> {\r\n const result = super.resolveOptions(options)\r\n if (!this.quill.lang) return result\r\n const btnTips = [\r\n 'bold',\r\n 'italic',\r\n 'strike',\r\n 'underline',\r\n 'undo',\r\n 'redo',\r\n 'clean',\r\n 'link',\r\n 'divider',\r\n 'blockquote',\r\n 'code',\r\n 'image',\r\n 'file',\r\n 'emoji',\r\n 'video',\r\n 'screenshot',\r\n 'better-table',\r\n 'code-block',\r\n 'formula',\r\n 'format-painter',\r\n 'header-list',\r\n ].reduce((map, name) => {\r\n map[name] = this.quill.getLangText(name)\r\n return map\r\n }, {} as Record<string, string>)\r\n const selectTips = [\r\n 'color',\r\n 'background',\r\n 'font',\r\n 'size',\r\n 'lineheight',\r\n ].reduce((map, name) => {\r\n map[name] = {\r\n onShow: () => {\r\n return this.quill.getLangText(name)\r\n },\r\n }\r\n return map\r\n }, {})\r\n const valueControlTips = [\r\n 'list',\r\n 'align',\r\n 'script',\r\n 'indent',\r\n 'header',\r\n 'direction',\r\n ].reduce((map, name) => {\r\n map[name] = {\r\n onShow: (target: HTMLElement, value: string) => {\r\n if (name === 'direction') {\r\n value = target.classList.contains('ql-active') ? 'rtl' : 'ltr'\r\n }\r\n if (!value) {\r\n if (name === 'align') {\r\n value = 'left'\r\n }\r\n else if (name === 'header') {\r\n value = 'normal'\r\n }\r\n }\r\n return this.quill.getLangText(`${name}-${value}`)\r\n },\r\n }\r\n return map\r\n }, {})\r\n const textMap = {\r\n ...btnTips,\r\n ...valueControlTips,\r\n ...selectTips,\r\n fullscreen: {\r\n onShow: () => {\r\n return this.quill.getLangText(this.quill.isFullscreen ? 'exit-fullscreen' : 'fullscreen')\r\n },\r\n },\r\n }\r\n return {\r\n ...result,\r\n tipTextMap: {\r\n ...textMap,\r\n ...options.tipTextMap,\r\n },\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAIO,SAAS,mBAAmB,iBAA8B;AAC/D,SAAO,cAAc,gBAAgB;AAAA,IACnC,YAAmB,OAAqB,SAAuC;AACzE,UAAA,EAAC,mCAAS,aAAY;AACxB,gBAAQ,aAAa,CAAC;AAAA,MAAA;AAExB,YAAM,OAAO,OAAO;AAJH,WAAA,QAAA;AAMjB,WAAK,MAAM,QAAQ,GAAG,uBAAuB,MAAM;AACjD,aAAK,eAAe;AACf,aAAA,UAAU,KAAK,eAAe,OAAO;AAC1C,aAAK,iBAAiB;AAAA,MAAA,CACvB;AAAA,IAAA;AAAA,IAGH,eAAe,SAA4D;AACnE,YAAA,SAAS,MAAM,eAAe,OAAO;AAC3C,UAAI,CAAC,KAAK,MAAM,KAAa,QAAA;AAC7B,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EACA,OAAO,CAAC,KAAK,SAAS;AACtB,YAAI,IAAI,IAAI,KAAK,MAAM,YAAY,IAAI;AAChC,eAAA;AAAA,MACT,GAAG,EAA4B;AAC/B,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EACA,OAAO,CAAC,KAAK,SAAS;AACtB,YAAI,IAAI,IAAI;AAAA,UACV,QAAQ,MAAM;AACL,mBAAA,KAAK,MAAM,YAAY,IAAI;AAAA,UAAA;AAAA,QAEtC;AACO,eAAA;AAAA,MACT,GAAG,EAAE;AACL,YAAM,mBAAmB;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EACA,OAAO,CAAC,KAAK,SAAS;AACtB,YAAI,IAAI,IAAI;AAAA,UACV,QAAQ,CAAC,QAAqB,UAAkB;AAC9C,gBAAI,SAAS,aAAa;AACxB,sBAAQ,OAAO,UAAU,SAAS,WAAW,IAAI,QAAQ;AAAA,YAAA;AAE3D,gBAAI,CAAC,OAAO;AACV,kBAAI,SAAS,SAAS;AACZ,wBAAA;AAAA,cAAA,WAED,SAAS,UAAU;AAClB,wBAAA;AAAA,cAAA;AAAA,YACV;AAEF,mBAAO,KAAK,MAAM,YAAY,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,UAAA;AAAA,QAEpD;AACO,eAAA;AAAA,MACT,GAAG,EAAE;AACL,YAAM,UAAU;AAAA,QACd,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY;AAAA,UACV,QAAQ,MAAM;AACZ,mBAAO,KAAK,MAAM,YAAY,KAAK,MAAM,eAAe,oBAAoB,YAAY;AAAA,UAAA;AAAA,QAC1F;AAAA,MAEJ;AACO,aAAA;AAAA,QACL,GAAG;AAAA,QACH,YAAY;AAAA,UACV,GAAG;AAAA,UACH,GAAG,QAAQ;AAAA,QAAA;AAAA,MAEf;AAAA,IAAA;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"toolbar-tip.es.js","sources":["../../../../src/modules/toolbar/toolbar-tip.ts"],"sourcesContent":["import type { Constructor } from '../../config/types'\r\nimport type FluentEditor from '../../fluent-editor'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../config'\r\nimport { isString } from '../../utils/is'\r\n\r\nexport function generateToolbarTip(QuillToolbarTip: Constructor) {\r\n return class extends QuillToolbarTip {\r\n constructor(public quill: FluentEditor, options: Partial<Record<string, any>>) {\r\n if (!options?.tipTextMap) {\r\n options.tipTextMap = {}\r\n }\r\n super(quill, options)\r\n\r\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.destroyAllTips()\r\n this.options = this.resolveOptions(options)\r\n this.createToolbarTip()\r\n })\r\n }\r\n\r\n resolveOptions(options: Partial<Record<string, any>>): Record<string, any> {\r\n const result = super.resolveOptions(options)\r\n if (!this.quill.lang) return result\r\n const shortKeyMap = {\r\n 'bold': 'Ctrl + B',\r\n 'italic': 'Ctrl + I',\r\n 'underline': 'Ctrl + U',\r\n 'strike': 'Ctrl + D',\r\n 'clean': 'Ctrl + /',\r\n 'align-left': 'Alt + L',\r\n 'align-center': 'Alt + C',\r\n 'align-right': 'Alt + R',\r\n 'align-justify': 'Alt + J',\r\n 'indent-+1': 'Ctrl + ]',\r\n 'indent--1': 'Ctrl + [',\r\n 'script-sub': 'Ctrl + ;',\r\n 'script-super': 'Ctrl + \\'',\r\n 'code': 'Ctrl + E',\r\n 'direction-rtl': 'Ctrl + R',\r\n 'direction-ltr': 'Ctrl + L',\r\n 'undo': 'Ctrl + Z',\r\n 'redo': 'Ctrl + shift + Z',\r\n 'color': 'Ctrl + Alt + C',\r\n 'background': 'Ctrl + Alt + B',\r\n 'link': 'Ctrl + K',\r\n }\r\n const shortcutModule = this.quill.getModule('shortcut-key')\r\n const getShortKey = (name: string) => {\r\n if (!shortcutModule) return ''\r\n const shortKey = shortKeyMap[name]\r\n return shortKey ? `\\n${shortKey}` : ''\r\n }\r\n const btnTips = [\r\n 'color',\r\n 'background',\r\n 'bold',\r\n 'italic',\r\n 'strike',\r\n 'underline',\r\n 'undo',\r\n 'redo',\r\n 'clean',\r\n 'link',\r\n 'divider',\r\n 'blockquote',\r\n 'code',\r\n 'image',\r\n 'file',\r\n 'emoji',\r\n 'video',\r\n 'screenshot',\r\n 'code-block',\r\n 'formula',\r\n 'format-painter',\r\n 'header-list',\r\n 'table-up',\r\n ].reduce((map, name) => {\r\n map[name] = this.quill.getLangText(name) + getShortKey(name)\r\n return map\r\n }, {} as Record<string, string>)\r\n const selectTips = [\r\n 'font',\r\n 'size',\r\n 'line-height',\r\n ].reduce((map, name) => {\r\n map[name] = {\r\n onShow: () => {\r\n return this.quill.getLangText(name) + getShortKey(name)\r\n },\r\n }\r\n return map\r\n }, {})\r\n const valueControlTips = [\r\n 'list',\r\n 'align',\r\n 'script',\r\n 'indent',\r\n 'header',\r\n 'direction',\r\n ].reduce((map, name) => {\r\n map[name] = {\r\n onShow: (target: HTMLElement, value: string) => {\r\n if (name === 'direction') {\r\n value = target.classList.contains('ql-active') ? 'rtl' : 'ltr'\r\n }\r\n if (!value) {\r\n if (name === 'align') {\r\n value = 'left'\r\n }\r\n else if (name === 'header') {\r\n value = 'normal'\r\n }\r\n }\r\n return this.quill.getLangText(`${name}-${value}`) + getShortKey(`${name}-${value}`)\r\n },\r\n }\r\n return map\r\n }, {})\r\n const textMap = {\r\n ...btnTips,\r\n ...valueControlTips,\r\n ...selectTips,\r\n fullscreen: {\r\n onShow: () => {\r\n return this.quill.getLangText(this.quill.isFullscreen ? 'exit-fullscreen' : 'fullscreen')\r\n },\r\n },\r\n }\r\n const inputTipTextMap = Object.entries(options.tipTextMap).reduce((pre, [key, value]) => {\r\n pre[key] = isString(value) ? this.quill.getLangText(value) : value\r\n return pre\r\n }, {})\r\n return {\r\n ...result,\r\n tipTextMap: {\r\n ...textMap,\r\n ...inputTipTextMap,\r\n },\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}