@dangl/angular-material-shared 2.9.0-beta0037 → 2.9.0-beta0040

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 (175) hide show
  1. package/fesm2022/dangl-angular-material-shared-tiny-mce.mjs +29 -35
  2. package/fesm2022/dangl-angular-material-shared-tiny-mce.mjs.map +1 -1
  3. package/fesm2022/dangl-angular-material-shared.mjs +36 -51
  4. package/fesm2022/dangl-angular-material-shared.mjs.map +1 -1
  5. package/package.json +11 -10
  6. package/styles/material-theme.scss +1 -1
  7. package/styles/material-variables.scss +5 -5
  8. package/tinymce-assets/icons/default/icons.js +46 -9
  9. package/tinymce-assets/icons/default/icons.min.js +1 -1
  10. package/tinymce-assets/models/dom/model.js +8198 -7244
  11. package/tinymce-assets/models/dom/model.min.js +1 -4
  12. package/tinymce-assets/plugins/accordion/plugin.js +1174 -879
  13. package/tinymce-assets/plugins/accordion/plugin.min.js +1 -4
  14. package/tinymce-assets/plugins/advlist/plugin.js +412 -200
  15. package/tinymce-assets/plugins/advlist/plugin.min.js +1 -4
  16. package/tinymce-assets/plugins/anchor/plugin.js +189 -166
  17. package/tinymce-assets/plugins/anchor/plugin.min.js +1 -4
  18. package/tinymce-assets/plugins/autolink/plugin.js +310 -220
  19. package/tinymce-assets/plugins/autolink/plugin.min.js +1 -4
  20. package/tinymce-assets/plugins/autoresize/plugin.js +180 -149
  21. package/tinymce-assets/plugins/autoresize/plugin.min.js +1 -4
  22. package/tinymce-assets/plugins/autosave/plugin.js +208 -189
  23. package/tinymce-assets/plugins/autosave/plugin.min.js +1 -4
  24. package/tinymce-assets/plugins/charmap/plugin.js +905 -1566
  25. package/tinymce-assets/plugins/charmap/plugin.min.js +1 -4
  26. package/tinymce-assets/plugins/code/plugin.js +73 -61
  27. package/tinymce-assets/plugins/code/plugin.min.js +0 -3
  28. package/tinymce-assets/plugins/codesample/plugin.js +3593 -2402
  29. package/tinymce-assets/plugins/codesample/plugin.min.js +8 -3
  30. package/tinymce-assets/plugins/directionality/plugin.js +545 -304
  31. package/tinymce-assets/plugins/directionality/plugin.min.js +1 -4
  32. package/tinymce-assets/plugins/emoticons/js/emojiimages.min.js +0 -2
  33. package/tinymce-assets/plugins/emoticons/js/emojis.min.js +0 -1
  34. package/tinymce-assets/plugins/emoticons/plugin.js +702 -488
  35. package/tinymce-assets/plugins/emoticons/plugin.min.js +1 -4
  36. package/tinymce-assets/plugins/fullscreen/plugin.js +1409 -1049
  37. package/tinymce-assets/plugins/fullscreen/plugin.min.js +1 -4
  38. package/tinymce-assets/plugins/help/js/i18n/keynav/ar.js +4 -1
  39. package/tinymce-assets/plugins/help/js/i18n/keynav/bg_BG.js +4 -1
  40. package/tinymce-assets/plugins/help/js/i18n/keynav/ca.js +4 -1
  41. package/tinymce-assets/plugins/help/js/i18n/keynav/cs.js +4 -1
  42. package/tinymce-assets/plugins/help/js/i18n/keynav/da.js +4 -1
  43. package/tinymce-assets/plugins/help/js/i18n/keynav/de.js +4 -1
  44. package/tinymce-assets/plugins/help/js/i18n/keynav/el.js +4 -1
  45. package/tinymce-assets/plugins/help/js/i18n/keynav/en.js +4 -1
  46. package/tinymce-assets/plugins/help/js/i18n/keynav/es.js +4 -1
  47. package/tinymce-assets/plugins/help/js/i18n/keynav/eu.js +4 -1
  48. package/tinymce-assets/plugins/help/js/i18n/keynav/fa.js +4 -1
  49. package/tinymce-assets/plugins/help/js/i18n/keynav/fi.js +4 -1
  50. package/tinymce-assets/plugins/help/js/i18n/keynav/fr_FR.js +4 -1
  51. package/tinymce-assets/plugins/help/js/i18n/keynav/he_IL.js +4 -1
  52. package/tinymce-assets/plugins/help/js/i18n/keynav/hi.js +4 -1
  53. package/tinymce-assets/plugins/help/js/i18n/keynav/hr.js +4 -1
  54. package/tinymce-assets/plugins/help/js/i18n/keynav/hu_HU.js +4 -1
  55. package/tinymce-assets/plugins/help/js/i18n/keynav/id.js +4 -1
  56. package/tinymce-assets/plugins/help/js/i18n/keynav/it.js +4 -1
  57. package/tinymce-assets/plugins/help/js/i18n/keynav/ja.js +4 -1
  58. package/tinymce-assets/plugins/help/js/i18n/keynav/kk.js +4 -1
  59. package/tinymce-assets/plugins/help/js/i18n/keynav/ko_KR.js +4 -1
  60. package/tinymce-assets/plugins/help/js/i18n/keynav/ms.js +4 -1
  61. package/tinymce-assets/plugins/help/js/i18n/keynav/nb_NO.js +4 -1
  62. package/tinymce-assets/plugins/help/js/i18n/keynav/nl.js +4 -1
  63. package/tinymce-assets/plugins/help/js/i18n/keynav/pl.js +4 -1
  64. package/tinymce-assets/plugins/help/js/i18n/keynav/pt_BR.js +4 -1
  65. package/tinymce-assets/plugins/help/js/i18n/keynav/pt_PT.js +4 -1
  66. package/tinymce-assets/plugins/help/js/i18n/keynav/ro.js +4 -1
  67. package/tinymce-assets/plugins/help/js/i18n/keynav/ru.js +4 -1
  68. package/tinymce-assets/plugins/help/js/i18n/keynav/sk.js +4 -1
  69. package/tinymce-assets/plugins/help/js/i18n/keynav/sl_SI.js +5 -2
  70. package/tinymce-assets/plugins/help/js/i18n/keynav/sv_SE.js +4 -1
  71. package/tinymce-assets/plugins/help/js/i18n/keynav/th_TH.js +4 -1
  72. package/tinymce-assets/plugins/help/js/i18n/keynav/tr.js +4 -1
  73. package/tinymce-assets/plugins/help/js/i18n/keynav/uk.js +4 -1
  74. package/tinymce-assets/plugins/help/js/i18n/keynav/vi.js +4 -1
  75. package/tinymce-assets/plugins/help/js/i18n/keynav/zh_CN.js +8 -5
  76. package/tinymce-assets/plugins/help/js/i18n/keynav/zh_TW.js +4 -1
  77. package/tinymce-assets/plugins/help/plugin.js +739 -809
  78. package/tinymce-assets/plugins/help/plugin.min.js +1 -4
  79. package/tinymce-assets/plugins/image/plugin.js +1475 -1291
  80. package/tinymce-assets/plugins/image/plugin.min.js +1 -4
  81. package/tinymce-assets/plugins/importcss/plugin.js +328 -269
  82. package/tinymce-assets/plugins/importcss/plugin.min.js +1 -4
  83. package/tinymce-assets/plugins/insertdatetime/plugin.js +140 -141
  84. package/tinymce-assets/plugins/insertdatetime/plugin.min.js +1 -4
  85. package/tinymce-assets/plugins/link/plugin.js +1419 -1084
  86. package/tinymce-assets/plugins/link/plugin.min.js +1 -4
  87. package/tinymce-assets/plugins/lists/plugin.js +2177 -1805
  88. package/tinymce-assets/plugins/lists/plugin.min.js +1 -4
  89. package/tinymce-assets/plugins/media/plugin.js +1305 -1047
  90. package/tinymce-assets/plugins/media/plugin.min.js +1 -4
  91. package/tinymce-assets/plugins/nonbreaking/plugin.js +93 -88
  92. package/tinymce-assets/plugins/nonbreaking/plugin.min.js +0 -3
  93. package/tinymce-assets/plugins/pagebreak/plugin.js +91 -85
  94. package/tinymce-assets/plugins/pagebreak/plugin.min.js +0 -3
  95. package/tinymce-assets/plugins/preview/plugin.js +742 -74
  96. package/tinymce-assets/plugins/preview/plugin.min.js +1 -4
  97. package/tinymce-assets/plugins/quickbars/plugin.js +582 -375
  98. package/tinymce-assets/plugins/quickbars/plugin.min.js +1 -4
  99. package/tinymce-assets/plugins/save/plugin.js +100 -82
  100. package/tinymce-assets/plugins/save/plugin.min.js +1 -4
  101. package/tinymce-assets/plugins/searchreplace/plugin.js +1183 -906
  102. package/tinymce-assets/plugins/searchreplace/plugin.min.js +1 -4
  103. package/tinymce-assets/plugins/table/plugin.js +3651 -3094
  104. package/tinymce-assets/plugins/table/plugin.min.js +1 -4
  105. package/tinymce-assets/plugins/visualblocks/plugin.js +71 -63
  106. package/tinymce-assets/plugins/visualblocks/plugin.min.js +1 -4
  107. package/tinymce-assets/plugins/visualchars/plugin.js +685 -436
  108. package/tinymce-assets/plugins/visualchars/plugin.min.js +1 -4
  109. package/tinymce-assets/plugins/wordcount/plugin.js +382 -307
  110. package/tinymce-assets/plugins/wordcount/plugin.min.js +1 -4
  111. package/tinymce-assets/skins/content/dark/content.css +9 -0
  112. package/tinymce-assets/skins/content/dark/content.js +10 -2
  113. package/tinymce-assets/skins/content/dark/content.min.css +9 -0
  114. package/tinymce-assets/skins/content/default/content.css +9 -0
  115. package/tinymce-assets/skins/content/default/content.js +10 -2
  116. package/tinymce-assets/skins/content/default/content.min.css +9 -0
  117. package/tinymce-assets/skins/content/document/content.css +9 -0
  118. package/tinymce-assets/skins/content/document/content.js +10 -2
  119. package/tinymce-assets/skins/content/document/content.min.css +9 -0
  120. package/tinymce-assets/skins/content/tinymce-5/content.css +9 -0
  121. package/tinymce-assets/skins/content/tinymce-5/content.js +10 -2
  122. package/tinymce-assets/skins/content/tinymce-5/content.min.css +9 -0
  123. package/tinymce-assets/skins/content/tinymce-5-dark/content.css +9 -0
  124. package/tinymce-assets/skins/content/tinymce-5-dark/content.js +10 -2
  125. package/tinymce-assets/skins/content/tinymce-5-dark/content.min.css +9 -0
  126. package/tinymce-assets/skins/content/writer/content.css +9 -0
  127. package/tinymce-assets/skins/content/writer/content.js +10 -2
  128. package/tinymce-assets/skins/content/writer/content.min.css +9 -0
  129. package/tinymce-assets/skins/ui/oxide/content.css +157 -49
  130. package/tinymce-assets/skins/ui/oxide/content.inline.css +157 -49
  131. package/tinymce-assets/skins/ui/oxide/content.inline.js +10 -2
  132. package/tinymce-assets/skins/ui/oxide/content.inline.min.css +10 -1
  133. package/tinymce-assets/skins/ui/oxide/content.js +10 -2
  134. package/tinymce-assets/skins/ui/oxide/content.min.css +10 -1
  135. package/tinymce-assets/skins/ui/oxide/skin.css +1592 -214
  136. package/tinymce-assets/skins/ui/oxide/skin.js +1 -2
  137. package/tinymce-assets/skins/ui/oxide/skin.min.css +1 -1
  138. package/tinymce-assets/skins/ui/oxide/skin.shadowdom.js +1 -2
  139. package/tinymce-assets/skins/ui/oxide-dark/content.css +157 -42
  140. package/tinymce-assets/skins/ui/oxide-dark/content.inline.css +157 -49
  141. package/tinymce-assets/skins/ui/oxide-dark/content.inline.js +10 -2
  142. package/tinymce-assets/skins/ui/oxide-dark/content.inline.min.css +10 -1
  143. package/tinymce-assets/skins/ui/oxide-dark/content.js +10 -2
  144. package/tinymce-assets/skins/ui/oxide-dark/content.min.css +10 -1
  145. package/tinymce-assets/skins/ui/oxide-dark/skin.css +1595 -217
  146. package/tinymce-assets/skins/ui/oxide-dark/skin.js +1 -2
  147. package/tinymce-assets/skins/ui/oxide-dark/skin.min.css +1 -1
  148. package/tinymce-assets/skins/ui/oxide-dark/skin.shadowdom.js +1 -2
  149. package/tinymce-assets/skins/ui/tinymce-5/content.css +157 -49
  150. package/tinymce-assets/skins/ui/tinymce-5/content.inline.css +157 -49
  151. package/tinymce-assets/skins/ui/tinymce-5/content.inline.js +10 -2
  152. package/tinymce-assets/skins/ui/tinymce-5/content.inline.min.css +10 -1
  153. package/tinymce-assets/skins/ui/tinymce-5/content.js +10 -2
  154. package/tinymce-assets/skins/ui/tinymce-5/content.min.css +10 -1
  155. package/tinymce-assets/skins/ui/tinymce-5/skin.css +1606 -203
  156. package/tinymce-assets/skins/ui/tinymce-5/skin.js +1 -2
  157. package/tinymce-assets/skins/ui/tinymce-5/skin.min.css +1 -1
  158. package/tinymce-assets/skins/ui/tinymce-5/skin.shadowdom.js +1 -2
  159. package/tinymce-assets/skins/ui/tinymce-5-dark/content.css +157 -42
  160. package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.css +157 -49
  161. package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.js +10 -2
  162. package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.min.css +10 -1
  163. package/tinymce-assets/skins/ui/tinymce-5-dark/content.js +10 -2
  164. package/tinymce-assets/skins/ui/tinymce-5-dark/content.min.css +10 -1
  165. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.css +1607 -204
  166. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.js +1 -2
  167. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.min.css +1 -1
  168. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.shadowdom.js +1 -2
  169. package/tinymce-assets/themes/silver/theme.js +32786 -28738
  170. package/tinymce-assets/themes/silver/theme.min.js +1 -4
  171. package/types/dangl-angular-material-shared-tiny-mce.d.ts +12 -13
  172. package/types/dangl-angular-material-shared.d.ts +26 -26
  173. package/tinymce-assets/plugins/template/index.js +0 -7
  174. package/tinymce-assets/plugins/template/plugin.js +0 -567
  175. package/tinymce-assets/plugins/template/plugin.min.js +0 -4
@@ -1,802 +1,813 @@
1
1
  /**
2
- * TinyMCE version 6.8.3 (2024-02-08)
2
+ * TinyMCE version 7.9.3 (2026-05-19)
3
3
  */
4
4
 
5
5
  (function () {
6
6
  'use strict';
7
7
 
8
- const Cell = initial => {
9
- let value = initial;
10
- const get = () => {
11
- return value;
12
- };
13
- const set = v => {
14
- value = v;
15
- };
16
- return {
17
- get,
18
- set
19
- };
20
- };
21
-
22
- var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');
23
-
24
- const get$5 = fullscreenState => ({ isFullscreen: () => fullscreenState.get() !== null });
25
-
8
+ /* eslint-disable @typescript-eslint/no-wrapper-object-types */
26
9
  const hasProto = (v, constructor, predicate) => {
27
- var _a;
28
- if (predicate(v, constructor.prototype)) {
29
- return true;
30
- } else {
31
- return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
32
- }
33
- };
34
- const typeOf = x => {
35
- const t = typeof x;
36
- if (x === null) {
37
- return 'null';
38
- } else if (t === 'object' && Array.isArray(x)) {
39
- return 'array';
40
- } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
41
- return 'string';
42
- } else {
43
- return t;
44
- }
45
- };
46
- const isType$1 = type => value => typeOf(value) === type;
47
- const isSimpleType = type => value => typeof value === type;
48
- const eq$1 = t => a => t === a;
10
+ var _a;
11
+ if (predicate(v, constructor.prototype)) {
12
+ return true;
13
+ }
14
+ else {
15
+ // String-based fallback time
16
+ return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
17
+ }
18
+ };
19
+ const typeOf = (x) => {
20
+ const t = typeof x;
21
+ if (x === null) {
22
+ return 'null';
23
+ }
24
+ else if (t === 'object' && Array.isArray(x)) {
25
+ return 'array';
26
+ }
27
+ else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
28
+ return 'string';
29
+ }
30
+ else {
31
+ return t;
32
+ }
33
+ };
34
+ const isType$1 = (type) => (value) => typeOf(value) === type;
35
+ const isSimpleType = (type) => (value) => typeof value === type;
36
+ const eq$1 = (t) => (a) => t === a;
49
37
  const isString = isType$1('string');
50
38
  const isObject = isType$1('object');
51
39
  const isArray = isType$1('array');
52
40
  const isNull = eq$1(null);
53
41
  const isBoolean = isSimpleType('boolean');
54
42
  const isUndefined = eq$1(undefined);
55
- const isNullable = a => a === null || a === undefined;
56
- const isNonNullable = a => !isNullable(a);
43
+ const isNullable = (a) => a === null || a === undefined;
44
+ const isNonNullable = (a) => !isNullable(a);
57
45
  const isFunction = isSimpleType('function');
58
46
  const isNumber = isSimpleType('number');
59
47
 
60
- const noop = () => {
61
- };
48
+ const noop = () => { };
49
+ /** Compose a unary function with an n-ary function */
62
50
  const compose = (fa, fb) => {
63
- return (...args) => {
64
- return fa(fb.apply(null, args));
65
- };
51
+ return (...args) => {
52
+ return fa(fb.apply(null, args));
53
+ };
66
54
  };
67
- const compose1 = (fbc, fab) => a => fbc(fab(a));
68
- const constant = value => {
69
- return () => {
70
- return value;
71
- };
55
+ /** Compose two unary functions. Similar to compose, but avoids using Function.prototype.apply. */
56
+ const compose1 = (fbc, fab) => (a) => fbc(fab(a));
57
+ const constant = (value) => {
58
+ return () => {
59
+ return value;
60
+ };
72
61
  };
62
+ // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
73
63
  function curry(fn, ...initialArgs) {
74
- return (...restArgs) => {
75
- const all = initialArgs.concat(restArgs);
76
- return fn.apply(null, all);
77
- };
64
+ return (...restArgs) => {
65
+ const all = initialArgs.concat(restArgs);
66
+ return fn.apply(null, all);
67
+ };
78
68
  }
79
69
  const never = constant(false);
80
70
  const always = constant(true);
81
71
 
72
+ /**
73
+ * The `Optional` type represents a value (of any type) that potentially does
74
+ * not exist. Any `Optional<T>` can either be a `Some<T>` (in which case the
75
+ * value does exist) or a `None` (in which case the value does not exist). This
76
+ * module defines a whole lot of FP-inspired utility functions for dealing with
77
+ * `Optional` objects.
78
+ *
79
+ * Comparison with null or undefined:
80
+ * - We don't get fancy null coalescing operators with `Optional`
81
+ * - We do get fancy helper functions with `Optional`
82
+ * - `Optional` support nesting, and allow for the type to still be nullable (or
83
+ * another `Optional`)
84
+ * - There is no option to turn off strict-optional-checks like there is for
85
+ * strict-null-checks
86
+ */
82
87
  class Optional {
83
- constructor(tag, value) {
84
- this.tag = tag;
85
- this.value = value;
86
- }
87
- static some(value) {
88
- return new Optional(true, value);
89
- }
90
- static none() {
91
- return Optional.singletonNone;
92
- }
93
- fold(onNone, onSome) {
94
- if (this.tag) {
95
- return onSome(this.value);
96
- } else {
97
- return onNone();
98
- }
99
- }
100
- isSome() {
101
- return this.tag;
102
- }
103
- isNone() {
104
- return !this.tag;
105
- }
106
- map(mapper) {
107
- if (this.tag) {
108
- return Optional.some(mapper(this.value));
109
- } else {
110
- return Optional.none();
111
- }
112
- }
113
- bind(binder) {
114
- if (this.tag) {
115
- return binder(this.value);
116
- } else {
117
- return Optional.none();
118
- }
119
- }
120
- exists(predicate) {
121
- return this.tag && predicate(this.value);
122
- }
123
- forall(predicate) {
124
- return !this.tag || predicate(this.value);
125
- }
126
- filter(predicate) {
127
- if (!this.tag || predicate(this.value)) {
128
- return this;
129
- } else {
130
- return Optional.none();
131
- }
132
- }
133
- getOr(replacement) {
134
- return this.tag ? this.value : replacement;
135
- }
136
- or(replacement) {
137
- return this.tag ? this : replacement;
138
- }
139
- getOrThunk(thunk) {
140
- return this.tag ? this.value : thunk();
141
- }
142
- orThunk(thunk) {
143
- return this.tag ? this : thunk();
144
- }
145
- getOrDie(message) {
146
- if (!this.tag) {
147
- throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
148
- } else {
149
- return this.value;
150
- }
151
- }
152
- static from(value) {
153
- return isNonNullable(value) ? Optional.some(value) : Optional.none();
154
- }
155
- getOrNull() {
156
- return this.tag ? this.value : null;
157
- }
158
- getOrUndefined() {
159
- return this.value;
160
- }
161
- each(worker) {
162
- if (this.tag) {
163
- worker(this.value);
164
- }
165
- }
166
- toArray() {
167
- return this.tag ? [this.value] : [];
168
- }
169
- toString() {
170
- return this.tag ? `some(${ this.value })` : 'none()';
171
- }
88
+ // The internal representation has a `tag` and a `value`, but both are
89
+ // private: able to be console.logged, but not able to be accessed by code
90
+ constructor(tag, value) {
91
+ this.tag = tag;
92
+ this.value = value;
93
+ }
94
+ // --- Identities ---
95
+ /**
96
+ * Creates a new `Optional<T>` that **does** contain a value.
97
+ */
98
+ static some(value) {
99
+ return new Optional(true, value);
100
+ }
101
+ /**
102
+ * Create a new `Optional<T>` that **does not** contain a value. `T` can be
103
+ * any type because we don't actually have a `T`.
104
+ */
105
+ static none() {
106
+ return Optional.singletonNone;
107
+ }
108
+ /**
109
+ * Perform a transform on an `Optional` type. Regardless of whether this
110
+ * `Optional` contains a value or not, `fold` will return a value of type `U`.
111
+ * If this `Optional` does not contain a value, the `U` will be created by
112
+ * calling `onNone`. If this `Optional` does contain a value, the `U` will be
113
+ * created by calling `onSome`.
114
+ *
115
+ * For the FP enthusiasts in the room, this function:
116
+ * 1. Could be used to implement all of the functions below
117
+ * 2. Forms a catamorphism
118
+ */
119
+ fold(onNone, onSome) {
120
+ if (this.tag) {
121
+ return onSome(this.value);
122
+ }
123
+ else {
124
+ return onNone();
125
+ }
126
+ }
127
+ /**
128
+ * Determine if this `Optional` object contains a value.
129
+ */
130
+ isSome() {
131
+ return this.tag;
132
+ }
133
+ /**
134
+ * Determine if this `Optional` object **does not** contain a value.
135
+ */
136
+ isNone() {
137
+ return !this.tag;
138
+ }
139
+ // --- Functor (name stolen from Haskell / maths) ---
140
+ /**
141
+ * Perform a transform on an `Optional` object, **if** there is a value. If
142
+ * you provide a function to turn a T into a U, this is the function you use
143
+ * to turn an `Optional<T>` into an `Optional<U>`. If this **does** contain
144
+ * a value then the output will also contain a value (that value being the
145
+ * output of `mapper(this.value)`), and if this **does not** contain a value
146
+ * then neither will the output.
147
+ */
148
+ map(mapper) {
149
+ if (this.tag) {
150
+ return Optional.some(mapper(this.value));
151
+ }
152
+ else {
153
+ return Optional.none();
154
+ }
155
+ }
156
+ // --- Monad (name stolen from Haskell / maths) ---
157
+ /**
158
+ * Perform a transform on an `Optional` object, **if** there is a value.
159
+ * Unlike `map`, here the transform itself also returns an `Optional`.
160
+ */
161
+ bind(binder) {
162
+ if (this.tag) {
163
+ return binder(this.value);
164
+ }
165
+ else {
166
+ return Optional.none();
167
+ }
168
+ }
169
+ // --- Traversable (name stolen from Haskell / maths) ---
170
+ /**
171
+ * For a given predicate, this function finds out if there **exists** a value
172
+ * inside this `Optional` object that meets the predicate. In practice, this
173
+ * means that for `Optional`s that do not contain a value it returns false (as
174
+ * no predicate-meeting value exists).
175
+ */
176
+ exists(predicate) {
177
+ return this.tag && predicate(this.value);
178
+ }
179
+ /**
180
+ * For a given predicate, this function finds out if **all** the values inside
181
+ * this `Optional` object meet the predicate. In practice, this means that
182
+ * for `Optional`s that do not contain a value it returns true (as all 0
183
+ * objects do meet the predicate).
184
+ */
185
+ forall(predicate) {
186
+ return !this.tag || predicate(this.value);
187
+ }
188
+ filter(predicate) {
189
+ if (!this.tag || predicate(this.value)) {
190
+ return this;
191
+ }
192
+ else {
193
+ return Optional.none();
194
+ }
195
+ }
196
+ // --- Getters ---
197
+ /**
198
+ * Get the value out of the inside of the `Optional` object, using a default
199
+ * `replacement` value if the provided `Optional` object does not contain a
200
+ * value.
201
+ */
202
+ getOr(replacement) {
203
+ return this.tag ? this.value : replacement;
204
+ }
205
+ /**
206
+ * Get the value out of the inside of the `Optional` object, using a default
207
+ * `replacement` value if the provided `Optional` object does not contain a
208
+ * value. Unlike `getOr`, in this method the `replacement` object is also
209
+ * `Optional` - meaning that this method will always return an `Optional`.
210
+ */
211
+ or(replacement) {
212
+ return this.tag ? this : replacement;
213
+ }
214
+ /**
215
+ * Get the value out of the inside of the `Optional` object, using a default
216
+ * `replacement` value if the provided `Optional` object does not contain a
217
+ * value. Unlike `getOr`, in this method the `replacement` value is
218
+ * "thunked" - that is to say that you don't pass a value to `getOrThunk`, you
219
+ * pass a function which (if called) will **return** the `value` you want to
220
+ * use.
221
+ */
222
+ getOrThunk(thunk) {
223
+ return this.tag ? this.value : thunk();
224
+ }
225
+ /**
226
+ * Get the value out of the inside of the `Optional` object, using a default
227
+ * `replacement` value if the provided Optional object does not contain a
228
+ * value.
229
+ *
230
+ * Unlike `or`, in this method the `replacement` value is "thunked" - that is
231
+ * to say that you don't pass a value to `orThunk`, you pass a function which
232
+ * (if called) will **return** the `value` you want to use.
233
+ *
234
+ * Unlike `getOrThunk`, in this method the `replacement` value is also
235
+ * `Optional`, meaning that this method will always return an `Optional`.
236
+ */
237
+ orThunk(thunk) {
238
+ return this.tag ? this : thunk();
239
+ }
240
+ /**
241
+ * Get the value out of the inside of the `Optional` object, throwing an
242
+ * exception if the provided `Optional` object does not contain a value.
243
+ *
244
+ * WARNING:
245
+ * You should only be using this function if you know that the `Optional`
246
+ * object **is not** empty (otherwise you're throwing exceptions in production
247
+ * code, which is bad).
248
+ *
249
+ * In tests this is more acceptable.
250
+ *
251
+ * Prefer other methods to this, such as `.each`.
252
+ */
253
+ getOrDie(message) {
254
+ if (!this.tag) {
255
+ throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
256
+ }
257
+ else {
258
+ return this.value;
259
+ }
260
+ }
261
+ // --- Interop with null and undefined ---
262
+ /**
263
+ * Creates an `Optional` value from a nullable (or undefined-able) input.
264
+ * Null, or undefined, is converted to `None`, and anything else is converted
265
+ * to `Some`.
266
+ */
267
+ static from(value) {
268
+ return isNonNullable(value) ? Optional.some(value) : Optional.none();
269
+ }
270
+ /**
271
+ * Converts an `Optional` to a nullable type, by getting the value if it
272
+ * exists, or returning `null` if it does not.
273
+ */
274
+ getOrNull() {
275
+ return this.tag ? this.value : null;
276
+ }
277
+ /**
278
+ * Converts an `Optional` to an undefined-able type, by getting the value if
279
+ * it exists, or returning `undefined` if it does not.
280
+ */
281
+ getOrUndefined() {
282
+ return this.value;
283
+ }
284
+ // --- Utilities ---
285
+ /**
286
+ * If the `Optional` contains a value, perform an action on that value.
287
+ * Unlike the rest of the methods on this type, `.each` has side-effects. If
288
+ * you want to transform an `Optional<T>` **into** something, then this is not
289
+ * the method for you. If you want to use an `Optional<T>` to **do**
290
+ * something, then this is the method for you - provided you're okay with not
291
+ * doing anything in the case where the `Optional` doesn't have a value inside
292
+ * it. If you're not sure whether your use-case fits into transforming
293
+ * **into** something or **doing** something, check whether it has a return
294
+ * value. If it does, you should be performing a transform.
295
+ */
296
+ each(worker) {
297
+ if (this.tag) {
298
+ worker(this.value);
299
+ }
300
+ }
301
+ /**
302
+ * Turn the `Optional` object into an array that contains all of the values
303
+ * stored inside the `Optional`. In practice, this means the output will have
304
+ * either 0 or 1 elements.
305
+ */
306
+ toArray() {
307
+ return this.tag ? [this.value] : [];
308
+ }
309
+ /**
310
+ * Turn the `Optional` object into a string for debugging or printing. Not
311
+ * recommended for production code, but good for debugging. Also note that
312
+ * these days an `Optional` object can be logged to the console directly, and
313
+ * its inner value (if it exists) will be visible.
314
+ */
315
+ toString() {
316
+ return this.tag ? `some(${this.value})` : 'none()';
317
+ }
172
318
  }
319
+ // Sneaky optimisation: every instance of Optional.none is identical, so just
320
+ // reuse the same object
173
321
  Optional.singletonNone = new Optional(false);
174
322
 
175
323
  const nativePush = Array.prototype.push;
176
324
  const map = (xs, f) => {
177
- const len = xs.length;
178
- const r = new Array(len);
179
- for (let i = 0; i < len; i++) {
180
- const x = xs[i];
181
- r[i] = f(x, i);
182
- }
183
- return r;
325
+ // pre-allocating array size when it's guaranteed to be known
326
+ // http://jsperf.com/push-allocated-vs-dynamic/22
327
+ const len = xs.length;
328
+ const r = new Array(len);
329
+ for (let i = 0; i < len; i++) {
330
+ const x = xs[i];
331
+ r[i] = f(x, i);
332
+ }
333
+ return r;
184
334
  };
335
+ // Unwound implementing other functions in terms of each.
336
+ // The code size is roughly the same, and it should allow for better optimisation.
337
+ // const each = function<T, U>(xs: T[], f: (x: T, i?: number, xs?: T[]) => void): void {
185
338
  const each$1 = (xs, f) => {
186
- for (let i = 0, len = xs.length; i < len; i++) {
187
- const x = xs[i];
188
- f(x, i);
189
- }
339
+ for (let i = 0, len = xs.length; i < len; i++) {
340
+ const x = xs[i];
341
+ f(x, i);
342
+ }
190
343
  };
191
344
  const filter$1 = (xs, pred) => {
192
- const r = [];
193
- for (let i = 0, len = xs.length; i < len; i++) {
194
- const x = xs[i];
195
- if (pred(x, i)) {
196
- r.push(x);
345
+ const r = [];
346
+ for (let i = 0, len = xs.length; i < len; i++) {
347
+ const x = xs[i];
348
+ if (pred(x, i)) {
349
+ r.push(x);
350
+ }
197
351
  }
198
- }
199
- return r;
352
+ return r;
200
353
  };
201
354
  const findUntil = (xs, pred, until) => {
202
- for (let i = 0, len = xs.length; i < len; i++) {
203
- const x = xs[i];
204
- if (pred(x, i)) {
205
- return Optional.some(x);
206
- } else if (until(x, i)) {
207
- break;
355
+ for (let i = 0, len = xs.length; i < len; i++) {
356
+ const x = xs[i];
357
+ if (pred(x, i)) {
358
+ return Optional.some(x);
359
+ }
360
+ else if (until(x, i)) {
361
+ break;
362
+ }
208
363
  }
209
- }
210
- return Optional.none();
364
+ return Optional.none();
211
365
  };
212
366
  const find$1 = (xs, pred) => {
213
- return findUntil(xs, pred, never);
214
- };
215
- const flatten = xs => {
216
- const r = [];
217
- for (let i = 0, len = xs.length; i < len; ++i) {
218
- if (!isArray(xs[i])) {
219
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
367
+ return findUntil(xs, pred, never);
368
+ };
369
+ const flatten = (xs) => {
370
+ // Note, this is possible because push supports multiple arguments:
371
+ // http://jsperf.com/concat-push/6
372
+ // Note that in the past, concat() would silently work (very slowly) for array-like objects.
373
+ // With this change it will throw an error.
374
+ const r = [];
375
+ for (let i = 0, len = xs.length; i < len; ++i) {
376
+ // Ensure that each value is an array itself
377
+ if (!isArray(xs[i])) {
378
+ throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
379
+ }
380
+ nativePush.apply(r, xs[i]);
220
381
  }
221
- nativePush.apply(r, xs[i]);
222
- }
223
- return r;
382
+ return r;
224
383
  };
225
384
  const bind$3 = (xs, f) => flatten(map(xs, f));
226
- const get$4 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
227
- const head = xs => get$4(xs, 0);
385
+ const get$5 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
386
+ const head = (xs) => get$5(xs, 0);
228
387
  const findMap = (arr, f) => {
229
- for (let i = 0; i < arr.length; i++) {
230
- const r = f(arr[i], i);
231
- if (r.isSome()) {
232
- return r;
388
+ for (let i = 0; i < arr.length; i++) {
389
+ const r = f(arr[i], i);
390
+ if (r.isSome()) {
391
+ return r;
392
+ }
233
393
  }
234
- }
235
- return Optional.none();
236
- };
237
-
238
- const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
239
-
240
- const singleton = doRevoke => {
241
- const subject = Cell(Optional.none());
242
- const revoke = () => subject.get().each(doRevoke);
243
- const clear = () => {
244
- revoke();
245
- subject.set(Optional.none());
246
- };
247
- const isSet = () => subject.get().isSome();
248
- const get = () => subject.get();
249
- const set = s => {
250
- revoke();
251
- subject.set(Optional.some(s));
252
- };
253
- return {
254
- clear,
255
- isSet,
256
- get,
257
- set
258
- };
259
- };
260
- const unbindable = () => singleton(s => s.unbind());
261
- const value = () => {
262
- const subject = singleton(noop);
263
- const on = f => subject.get().each(f);
264
- return {
265
- ...subject,
266
- on
267
- };
268
- };
269
-
270
- const first = (fn, rate) => {
271
- let timer = null;
272
- const cancel = () => {
273
- if (!isNull(timer)) {
274
- clearTimeout(timer);
275
- timer = null;
276
- }
277
- };
278
- const throttle = (...args) => {
279
- if (isNull(timer)) {
280
- timer = setTimeout(() => {
281
- timer = null;
282
- fn.apply(null, args);
283
- }, rate);
284
- }
285
- };
286
- return {
287
- cancel,
288
- throttle
289
- };
394
+ return Optional.none();
290
395
  };
291
396
 
397
+ // There are many variations of Object iteration that are faster than the 'for-in' style:
398
+ // http://jsperf.com/object-keys-iteration/107
399
+ //
400
+ // Use the native keys if it is available (IE9+), otherwise fall back to manually filtering
292
401
  const keys = Object.keys;
293
402
  const each = (obj, f) => {
294
- const props = keys(obj);
295
- for (let k = 0, len = props.length; k < len; k++) {
296
- const i = props[k];
297
- const x = obj[i];
298
- f(x, i);
299
- }
403
+ const props = keys(obj);
404
+ for (let k = 0, len = props.length; k < len; k++) {
405
+ const i = props[k];
406
+ const x = obj[i];
407
+ f(x, i);
408
+ }
300
409
  };
301
410
 
411
+ const Cell = (initial) => {
412
+ let value = initial;
413
+ const get = () => {
414
+ return value;
415
+ };
416
+ const set = (v) => {
417
+ value = v;
418
+ };
419
+ return {
420
+ get,
421
+ set
422
+ };
423
+ };
424
+
425
+ // Use window object as the global if it's available since CSP will block script evals
426
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
302
427
  const Global = typeof window !== 'undefined' ? window : Function('return this;')();
303
428
 
429
+ /*
430
+ Notes on the lift functions:
431
+ - We used to have a generic liftN, but we were concerned about its type-safety, and the below variants were faster in microbenchmarks.
432
+ - The getOrDie calls are partial functions, but are checked beforehand. This is faster and more convenient (but less safe) than folds.
433
+ - && is used instead of a loop for simplicity and performance.
434
+ */
435
+ const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
436
+
437
+ /** path :: ([String], JsObj?) -> JsObj */
304
438
  const path = (parts, scope) => {
305
- let o = scope !== undefined && scope !== null ? scope : Global;
306
- for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
307
- o = o[parts[i]];
308
- }
309
- return o;
439
+ let o = scope !== undefined && scope !== null ? scope : Global;
440
+ for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
441
+ o = o[parts[i]];
442
+ }
443
+ return o;
310
444
  };
445
+ /** resolve :: (String, JsObj?) -> JsObj */
311
446
  const resolve = (p, scope) => {
312
- const parts = p.split('.');
313
- return path(parts, scope);
447
+ const parts = p.split('.');
448
+ return path(parts, scope);
314
449
  };
315
450
 
316
- const unsafe = (name, scope) => {
317
- return resolve(name, scope);
451
+ const singleton = (doRevoke) => {
452
+ const subject = Cell(Optional.none());
453
+ const revoke = () => subject.get().each(doRevoke);
454
+ const clear = () => {
455
+ revoke();
456
+ subject.set(Optional.none());
457
+ };
458
+ const isSet = () => subject.get().isSome();
459
+ const get = () => subject.get();
460
+ const set = (s) => {
461
+ revoke();
462
+ subject.set(Optional.some(s));
463
+ };
464
+ return {
465
+ clear,
466
+ isSet,
467
+ get,
468
+ set
469
+ };
318
470
  };
319
- const getOrDie = (name, scope) => {
320
- const actual = unsafe(name, scope);
321
- if (actual === undefined || actual === null) {
322
- throw new Error(name + ' not available on this browser');
323
- }
324
- return actual;
471
+ const unbindable = () => singleton((s) => s.unbind());
472
+ const value = () => {
473
+ const subject = singleton(noop);
474
+ const on = (f) => subject.get().each(f);
475
+ return {
476
+ ...subject,
477
+ on
478
+ };
325
479
  };
326
480
 
327
- const getPrototypeOf = Object.getPrototypeOf;
328
- const sandHTMLElement = scope => {
329
- return getOrDie('HTMLElement', scope);
330
- };
331
- const isPrototypeOf = x => {
332
- const scope = resolve('ownerDocument.defaultView', x);
333
- return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\w*Element$/.test(getPrototypeOf(x).constructor.name));
481
+ const contains = (str, substr, start = 0, end) => {
482
+ const idx = str.indexOf(substr, start);
483
+ if (idx !== -1) {
484
+ return isUndefined(end) ? true : idx + substr.length <= end;
485
+ }
486
+ else {
487
+ return false;
488
+ }
334
489
  };
335
490
 
336
- const DOCUMENT = 9;
337
- const DOCUMENT_FRAGMENT = 11;
338
- const ELEMENT = 1;
339
- const TEXT = 3;
340
-
341
- const type = element => element.dom.nodeType;
342
- const isType = t => element => type(element) === t;
343
- const isHTMLElement = element => isElement(element) && isPrototypeOf(element.dom);
344
- const isElement = isType(ELEMENT);
345
- const isText = isType(TEXT);
346
- const isDocument = isType(DOCUMENT);
347
- const isDocumentFragment = isType(DOCUMENT_FRAGMENT);
348
-
349
- const rawSet = (dom, key, value) => {
350
- if (isString(value) || isBoolean(value) || isNumber(value)) {
351
- dom.setAttribute(key, value + '');
352
- } else {
353
- console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
354
- throw new Error('Attribute value was not simple');
355
- }
356
- };
357
- const set$1 = (element, key, value) => {
358
- rawSet(element.dom, key, value);
359
- };
360
- const get$3 = (element, key) => {
361
- const v = element.dom.getAttribute(key);
362
- return v === null ? undefined : v;
363
- };
364
- const remove = (element, key) => {
365
- element.dom.removeAttribute(key);
491
+ // Run a function fn after rate ms. If another invocation occurs
492
+ // during the time it is waiting, ignore it completely.
493
+ const first = (fn, rate) => {
494
+ let timer = null;
495
+ const cancel = () => {
496
+ if (!isNull(timer)) {
497
+ clearTimeout(timer);
498
+ timer = null;
499
+ }
500
+ };
501
+ const throttle = (...args) => {
502
+ if (isNull(timer)) {
503
+ timer = setTimeout(() => {
504
+ timer = null;
505
+ fn.apply(null, args);
506
+ }, rate);
507
+ }
508
+ };
509
+ return {
510
+ cancel,
511
+ throttle
512
+ };
366
513
  };
367
514
 
368
- const supports = element => element.dom.classList !== undefined;
369
-
370
- const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz);
371
-
372
- const contains = (str, substr, start = 0, end) => {
373
- const idx = str.indexOf(substr, start);
374
- if (idx !== -1) {
375
- return isUndefined(end) ? true : idx + substr.length <= end;
376
- } else {
377
- return false;
378
- }
515
+ const cached = (f) => {
516
+ let called = false;
517
+ let r;
518
+ return (...args) => {
519
+ if (!called) {
520
+ called = true;
521
+ r = f.apply(null, args);
522
+ }
523
+ return r;
524
+ };
379
525
  };
380
526
 
381
- const isSupported$1 = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);
527
+ var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');
528
+
529
+ const get$4 = (fullscreenState) => ({
530
+ isFullscreen: () => fullscreenState.get() !== null
531
+ });
382
532
 
383
533
  const fromHtml = (html, scope) => {
384
- const doc = scope || document;
385
- const div = doc.createElement('div');
386
- div.innerHTML = html;
387
- if (!div.hasChildNodes() || div.childNodes.length > 1) {
388
- const message = 'HTML does not have a single root node';
389
- console.error(message, html);
390
- throw new Error(message);
391
- }
392
- return fromDom(div.childNodes[0]);
534
+ const doc = scope || document;
535
+ const div = doc.createElement('div');
536
+ div.innerHTML = html;
537
+ if (!div.hasChildNodes() || div.childNodes.length > 1) {
538
+ const message = 'HTML does not have a single root node';
539
+ // eslint-disable-next-line no-console
540
+ console.error(message, html);
541
+ throw new Error(message);
542
+ }
543
+ return fromDom(div.childNodes[0]);
393
544
  };
394
545
  const fromTag = (tag, scope) => {
395
- const doc = scope || document;
396
- const node = doc.createElement(tag);
397
- return fromDom(node);
546
+ const doc = scope || document;
547
+ const node = doc.createElement(tag);
548
+ return fromDom(node);
398
549
  };
399
550
  const fromText = (text, scope) => {
400
- const doc = scope || document;
401
- const node = doc.createTextNode(text);
402
- return fromDom(node);
403
- };
404
- const fromDom = node => {
405
- if (node === null || node === undefined) {
406
- throw new Error('Node cannot be null or undefined');
407
- }
408
- return { dom: node };
551
+ const doc = scope || document;
552
+ const node = doc.createTextNode(text);
553
+ return fromDom(node);
554
+ };
555
+ const fromDom = (node) => {
556
+ // TODO: Consider removing this check, but left atm for safety
557
+ if (node === null || node === undefined) {
558
+ throw new Error('Node cannot be null or undefined');
559
+ }
560
+ return {
561
+ dom: node
562
+ };
409
563
  };
410
564
  const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
565
+ // tslint:disable-next-line:variable-name
411
566
  const SugarElement = {
412
- fromHtml,
413
- fromTag,
414
- fromText,
415
- fromDom,
416
- fromPoint
417
- };
418
-
419
- const is = (element, selector) => {
420
- const dom = element.dom;
421
- if (dom.nodeType !== ELEMENT) {
422
- return false;
423
- } else {
424
- const elem = dom;
425
- if (elem.matches !== undefined) {
426
- return elem.matches(selector);
427
- } else if (elem.msMatchesSelector !== undefined) {
428
- return elem.msMatchesSelector(selector);
429
- } else if (elem.webkitMatchesSelector !== undefined) {
430
- return elem.webkitMatchesSelector(selector);
431
- } else if (elem.mozMatchesSelector !== undefined) {
432
- return elem.mozMatchesSelector(selector);
433
- } else {
434
- throw new Error('Browser lacks native selectors');
435
- }
436
- }
437
- };
438
- const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
439
- const all$1 = (selector, scope) => {
440
- const base = scope === undefined ? document : scope.dom;
441
- return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom);
567
+ fromHtml,
568
+ fromTag,
569
+ fromText,
570
+ fromDom,
571
+ fromPoint
442
572
  };
443
573
 
444
- const eq = (e1, e2) => e1.dom === e2.dom;
445
-
446
- const owner = element => SugarElement.fromDom(element.dom.ownerDocument);
447
- const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos);
448
- const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
449
- const parents = (element, isRoot) => {
450
- const stop = isFunction(isRoot) ? isRoot : never;
451
- let dom = element.dom;
452
- const ret = [];
453
- while (dom.parentNode !== null && dom.parentNode !== undefined) {
454
- const rawParent = dom.parentNode;
455
- const p = SugarElement.fromDom(rawParent);
456
- ret.push(p);
457
- if (stop(p) === true) {
458
- break;
459
- } else {
460
- dom = rawParent;
461
- }
462
- }
463
- return ret;
464
- };
465
- const siblings$2 = element => {
466
- const filterSelf = elements => filter$1(elements, x => !eq(element, x));
467
- return parent(element).map(children).map(filterSelf).getOr([]);
468
- };
469
- const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
470
- const children = element => map(element.dom.childNodes, SugarElement.fromDom);
574
+ const DOCUMENT = 9;
575
+ const DOCUMENT_FRAGMENT = 11;
576
+ const ELEMENT = 1;
577
+ const TEXT = 3;
471
578
 
472
- const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host);
473
- const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
474
- const isSupported = constant(supported);
475
- const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;
476
- const getShadowRoot = e => {
477
- const r = getRootNode(e);
478
- return isShadowRoot(r) ? Optional.some(r) : Optional.none();
479
- };
480
- const getShadowHost = e => SugarElement.fromDom(e.dom.host);
481
- const getOriginalEventTarget = event => {
482
- if (isSupported() && isNonNullable(event.target)) {
483
- const el = SugarElement.fromDom(event.target);
484
- if (isElement(el) && isOpenShadowHost(el)) {
485
- if (event.composed && event.composedPath) {
486
- const composedPath = event.composedPath();
487
- if (composedPath) {
488
- return head(composedPath);
579
+ const is = (element, selector) => {
580
+ const dom = element.dom;
581
+ if (dom.nodeType !== ELEMENT) {
582
+ return false;
583
+ }
584
+ else {
585
+ const elem = dom;
586
+ if (elem.matches !== undefined) {
587
+ return elem.matches(selector);
588
+ }
589
+ else if (elem.msMatchesSelector !== undefined) {
590
+ return elem.msMatchesSelector(selector);
489
591
  }
490
- }
592
+ else if (elem.webkitMatchesSelector !== undefined) {
593
+ return elem.webkitMatchesSelector(selector);
594
+ }
595
+ else if (elem.mozMatchesSelector !== undefined) {
596
+ // cast to any as mozMatchesSelector doesn't exist in TS DOM lib
597
+ return elem.mozMatchesSelector(selector);
598
+ }
599
+ else {
600
+ throw new Error('Browser lacks native selectors');
601
+ } // unfortunately we can't throw this on startup :(
491
602
  }
492
- }
493
- return Optional.from(event.target);
494
- };
495
- const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot);
496
-
497
- const inBody = element => {
498
- const dom = isText(element) ? element.dom.parentNode : element.dom;
499
- if (dom === undefined || dom === null || dom.ownerDocument === null) {
500
- return false;
501
- }
502
- const doc = dom.ownerDocument;
503
- return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));
504
- };
505
- const getBody = doc => {
506
- const b = doc.dom.body;
507
- if (b === null || b === undefined) {
508
- throw new Error('Body is not available yet');
509
- }
510
- return SugarElement.fromDom(b);
511
- };
512
-
513
- const internalSet = (dom, property, value) => {
514
- if (!isString(value)) {
515
- console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
516
- throw new Error('CSS value must be a string: ' + value);
517
- }
518
- if (isSupported$1(dom)) {
519
- dom.style.setProperty(property, value);
520
- }
521
- };
522
- const set = (element, property, value) => {
523
- const dom = element.dom;
524
- internalSet(dom, property, value);
525
- };
526
- const setAll = (element, css) => {
527
- const dom = element.dom;
528
- each(css, (v, k) => {
529
- internalSet(dom, k, v);
530
- });
531
603
  };
532
- const get$2 = (element, property) => {
533
- const dom = element.dom;
534
- const styles = window.getComputedStyle(dom);
535
- const r = styles.getPropertyValue(property);
536
- return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
537
- };
538
- const getUnsafeProperty = (dom, property) => isSupported$1(dom) ? dom.style.getPropertyValue(property) : '';
539
-
540
- const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({
541
- target,
542
- x,
543
- y,
544
- stop,
545
- prevent,
546
- kill,
547
- raw
548
- });
549
- const fromRawEvent = rawEvent => {
550
- const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
551
- const stop = () => rawEvent.stopPropagation();
552
- const prevent = () => rawEvent.preventDefault();
553
- const kill = compose(prevent, stop);
554
- return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
555
- };
556
- const handle = (filter, handler) => rawEvent => {
557
- if (filter(rawEvent)) {
558
- handler(fromRawEvent(rawEvent));
559
- }
560
- };
561
- const binder = (element, event, filter, handler, useCapture) => {
562
- const wrapped = handle(filter, handler);
563
- element.dom.addEventListener(event, wrapped, useCapture);
564
- return { unbind: curry(unbind, element, event, wrapped, useCapture) };
565
- };
566
- const bind$2 = (element, event, filter, handler) => binder(element, event, filter, handler, false);
567
- const unbind = (element, event, handler, useCapture) => {
568
- element.dom.removeEventListener(event, handler, useCapture);
604
+ const bypassSelector = (dom) =>
605
+ // Only elements, documents and shadow roots support querySelector
606
+ // shadow root element type is DOCUMENT_FRAGMENT
607
+ dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT ||
608
+ // IE fix for complex queries on empty nodes: http://jsfiddle.net/spyder/fv9ptr5L/
609
+ dom.childElementCount === 0;
610
+ const all$1 = (selector, scope) => {
611
+ const base = scope === undefined ? document : scope.dom;
612
+ return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom);
569
613
  };
570
614
 
571
- const filter = always;
572
- const bind$1 = (element, event, handler) => bind$2(element, event, filter, handler);
573
-
574
- const cached = f => {
575
- let called = false;
576
- let r;
577
- return (...args) => {
578
- if (!called) {
579
- called = true;
580
- r = f.apply(null, args);
581
- }
582
- return r;
583
- };
584
- };
615
+ const eq = (e1, e2) => e1.dom === e2.dom;
585
616
 
586
617
  const DeviceType = (os, browser, userAgent, mediaMatch) => {
587
- const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
588
- const isiPhone = os.isiOS() && !isiPad;
589
- const isMobile = os.isiOS() || os.isAndroid();
590
- const isTouch = isMobile || mediaMatch('(pointer:coarse)');
591
- const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
592
- const isPhone = isiPhone || isMobile && !isTablet;
593
- const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
594
- const isDesktop = !isPhone && !isTablet && !iOSwebview;
595
- return {
596
- isiPad: constant(isiPad),
597
- isiPhone: constant(isiPhone),
598
- isTablet: constant(isTablet),
599
- isPhone: constant(isPhone),
600
- isTouch: constant(isTouch),
601
- isAndroid: os.isAndroid,
602
- isiOS: os.isiOS,
603
- isWebView: constant(iOSwebview),
604
- isDesktop: constant(isDesktop)
605
- };
618
+ const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
619
+ const isiPhone = os.isiOS() && !isiPad;
620
+ const isMobile = os.isiOS() || os.isAndroid();
621
+ const isTouch = isMobile || mediaMatch('(pointer:coarse)');
622
+ const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
623
+ const isPhone = isiPhone || isMobile && !isTablet;
624
+ const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
625
+ const isDesktop = !isPhone && !isTablet && !iOSwebview;
626
+ return {
627
+ isiPad: constant(isiPad),
628
+ isiPhone: constant(isiPhone),
629
+ isTablet: constant(isTablet),
630
+ isPhone: constant(isPhone),
631
+ isTouch: constant(isTouch),
632
+ isAndroid: os.isAndroid,
633
+ isiOS: os.isiOS,
634
+ isWebView: constant(iOSwebview),
635
+ isDesktop: constant(isDesktop)
636
+ };
606
637
  };
607
638
 
608
639
  const firstMatch = (regexes, s) => {
609
- for (let i = 0; i < regexes.length; i++) {
610
- const x = regexes[i];
611
- if (x.test(s)) {
612
- return x;
640
+ for (let i = 0; i < regexes.length; i++) {
641
+ const x = regexes[i];
642
+ if (x.test(s)) {
643
+ return x;
644
+ }
613
645
  }
614
- }
615
- return undefined;
646
+ return undefined;
616
647
  };
617
648
  const find = (regexes, agent) => {
618
- const r = firstMatch(regexes, agent);
619
- if (!r) {
620
- return {
621
- major: 0,
622
- minor: 0
649
+ const r = firstMatch(regexes, agent);
650
+ if (!r) {
651
+ return { major: 0, minor: 0 };
652
+ }
653
+ const group = (i) => {
654
+ return Number(agent.replace(r, '$' + i));
623
655
  };
624
- }
625
- const group = i => {
626
- return Number(agent.replace(r, '$' + i));
627
- };
628
- return nu$2(group(1), group(2));
656
+ return nu$2(group(1), group(2));
629
657
  };
630
658
  const detect$3 = (versionRegexes, agent) => {
631
- const cleanedAgent = String(agent).toLowerCase();
632
- if (versionRegexes.length === 0) {
633
- return unknown$2();
634
- }
635
- return find(versionRegexes, cleanedAgent);
659
+ const cleanedAgent = String(agent).toLowerCase();
660
+ if (versionRegexes.length === 0) {
661
+ return unknown$2();
662
+ }
663
+ return find(versionRegexes, cleanedAgent);
636
664
  };
637
665
  const unknown$2 = () => {
638
- return nu$2(0, 0);
666
+ return nu$2(0, 0);
639
667
  };
640
668
  const nu$2 = (major, minor) => {
641
- return {
642
- major,
643
- minor
644
- };
669
+ return { major, minor };
645
670
  };
646
671
  const Version = {
647
- nu: nu$2,
648
- detect: detect$3,
649
- unknown: unknown$2
672
+ nu: nu$2,
673
+ detect: detect$3,
674
+ unknown: unknown$2
650
675
  };
651
676
 
652
677
  const detectBrowser$1 = (browsers, userAgentData) => {
653
- return findMap(userAgentData.brands, uaBrand => {
654
- const lcBrand = uaBrand.brand.toLowerCase();
655
- return find$1(browsers, browser => {
656
- var _a;
657
- return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
658
- }).map(info => ({
659
- current: info.name,
660
- version: Version.nu(parseInt(uaBrand.version, 10), 0)
661
- }));
662
- });
678
+ return findMap(userAgentData.brands, (uaBrand) => {
679
+ const lcBrand = uaBrand.brand.toLowerCase();
680
+ return find$1(browsers, (browser) => { var _a; return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); })
681
+ .map((info) => ({
682
+ current: info.name,
683
+ version: Version.nu(parseInt(uaBrand.version, 10), 0)
684
+ }));
685
+ });
663
686
  };
664
687
 
665
688
  const detect$2 = (candidates, userAgent) => {
666
- const agent = String(userAgent).toLowerCase();
667
- return find$1(candidates, candidate => {
668
- return candidate.search(agent);
669
- });
689
+ const agent = String(userAgent).toLowerCase();
690
+ return find$1(candidates, (candidate) => {
691
+ return candidate.search(agent);
692
+ });
670
693
  };
694
+ // They (browser and os) are the same at the moment, but they might
695
+ // not stay that way.
671
696
  const detectBrowser = (browsers, userAgent) => {
672
- return detect$2(browsers, userAgent).map(browser => {
673
- const version = Version.detect(browser.versionRegexes, userAgent);
674
- return {
675
- current: browser.name,
676
- version
677
- };
678
- });
697
+ return detect$2(browsers, userAgent).map((browser) => {
698
+ const version = Version.detect(browser.versionRegexes, userAgent);
699
+ return {
700
+ current: browser.name,
701
+ version
702
+ };
703
+ });
679
704
  };
680
705
  const detectOs = (oses, userAgent) => {
681
- return detect$2(oses, userAgent).map(os => {
682
- const version = Version.detect(os.versionRegexes, userAgent);
683
- return {
684
- current: os.name,
685
- version
686
- };
687
- });
706
+ return detect$2(oses, userAgent).map((os) => {
707
+ const version = Version.detect(os.versionRegexes, userAgent);
708
+ return {
709
+ current: os.name,
710
+ version
711
+ };
712
+ });
688
713
  };
689
714
 
690
715
  const normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
691
- const checkContains = target => {
692
- return uastring => {
693
- return contains(uastring, target);
694
- };
716
+ const checkContains = (target) => {
717
+ return (uastring) => {
718
+ return contains(uastring, target);
719
+ };
695
720
  };
696
721
  const browsers = [
697
- {
698
- name: 'Edge',
699
- versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
700
- search: uastring => {
701
- return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
702
- }
703
- },
704
- {
705
- name: 'Chromium',
706
- brand: 'Chromium',
707
- versionRegexes: [
708
- /.*?chrome\/([0-9]+)\.([0-9]+).*/,
709
- normalVersionRegex
710
- ],
711
- search: uastring => {
712
- return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
713
- }
714
- },
715
- {
716
- name: 'IE',
717
- versionRegexes: [
718
- /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
719
- /.*?rv:([0-9]+)\.([0-9]+).*/
720
- ],
721
- search: uastring => {
722
- return contains(uastring, 'msie') || contains(uastring, 'trident');
723
- }
724
- },
725
- {
726
- name: 'Opera',
727
- versionRegexes: [
728
- normalVersionRegex,
729
- /.*?opera\/([0-9]+)\.([0-9]+).*/
730
- ],
731
- search: checkContains('opera')
732
- },
733
- {
734
- name: 'Firefox',
735
- versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
736
- search: checkContains('firefox')
737
- },
738
- {
739
- name: 'Safari',
740
- versionRegexes: [
741
- normalVersionRegex,
742
- /.*?cpu os ([0-9]+)_([0-9]+).*/
743
- ],
744
- search: uastring => {
745
- return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
746
- }
747
- }
722
+ // This is legacy Edge
723
+ {
724
+ name: 'Edge',
725
+ versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
726
+ search: (uastring) => {
727
+ return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
728
+ }
729
+ },
730
+ // This is Google Chrome and Chromium Edge
731
+ {
732
+ name: 'Chromium',
733
+ brand: 'Chromium',
734
+ versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex],
735
+ search: (uastring) => {
736
+ return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
737
+ }
738
+ },
739
+ {
740
+ name: 'IE',
741
+ versionRegexes: [/.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/],
742
+ search: (uastring) => {
743
+ return contains(uastring, 'msie') || contains(uastring, 'trident');
744
+ }
745
+ },
746
+ // INVESTIGATE: Is this still the Opera user agent?
747
+ {
748
+ name: 'Opera',
749
+ versionRegexes: [normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/],
750
+ search: checkContains('opera')
751
+ },
752
+ {
753
+ name: 'Firefox',
754
+ versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
755
+ search: checkContains('firefox')
756
+ },
757
+ {
758
+ name: 'Safari',
759
+ versionRegexes: [normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/],
760
+ search: (uastring) => {
761
+ return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
762
+ }
763
+ }
748
764
  ];
749
765
  const oses = [
750
- {
751
- name: 'Windows',
752
- search: checkContains('win'),
753
- versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
754
- },
755
- {
756
- name: 'iOS',
757
- search: uastring => {
758
- return contains(uastring, 'iphone') || contains(uastring, 'ipad');
766
+ {
767
+ name: 'Windows',
768
+ search: checkContains('win'),
769
+ versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
770
+ },
771
+ {
772
+ name: 'iOS',
773
+ search: (uastring) => {
774
+ return contains(uastring, 'iphone') || contains(uastring, 'ipad');
775
+ },
776
+ versionRegexes: [/.*?version\/\ ?([0-9]+)\.([0-9]+).*/, /.*cpu os ([0-9]+)_([0-9]+).*/, /.*cpu iphone os ([0-9]+)_([0-9]+).*/]
777
+ },
778
+ {
779
+ name: 'Android',
780
+ search: checkContains('android'),
781
+ versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
759
782
  },
760
- versionRegexes: [
761
- /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
762
- /.*cpu os ([0-9]+)_([0-9]+).*/,
763
- /.*cpu iphone os ([0-9]+)_([0-9]+).*/
764
- ]
765
- },
766
- {
767
- name: 'Android',
768
- search: checkContains('android'),
769
- versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
770
- },
771
- {
772
- name: 'macOS',
773
- search: checkContains('mac os x'),
774
- versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
775
- },
776
- {
777
- name: 'Linux',
778
- search: checkContains('linux'),
779
- versionRegexes: []
780
- },
781
- {
782
- name: 'Solaris',
783
- search: checkContains('sunos'),
784
- versionRegexes: []
785
- },
786
- {
787
- name: 'FreeBSD',
788
- search: checkContains('freebsd'),
789
- versionRegexes: []
790
- },
791
- {
792
- name: 'ChromeOS',
793
- search: checkContains('cros'),
794
- versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
795
- }
783
+ {
784
+ name: 'macOS',
785
+ search: checkContains('mac os x'),
786
+ versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
787
+ },
788
+ {
789
+ name: 'Linux',
790
+ search: checkContains('linux'),
791
+ versionRegexes: []
792
+ },
793
+ { name: 'Solaris',
794
+ search: checkContains('sunos'),
795
+ versionRegexes: []
796
+ },
797
+ {
798
+ name: 'FreeBSD',
799
+ search: checkContains('freebsd'),
800
+ versionRegexes: []
801
+ },
802
+ {
803
+ name: 'ChromeOS',
804
+ search: checkContains('cros'),
805
+ versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
806
+ }
796
807
  ];
797
808
  const PlatformInfo = {
798
- browsers: constant(browsers),
799
- oses: constant(oses)
809
+ browsers: constant(browsers),
810
+ oses: constant(oses)
800
811
  };
801
812
 
802
813
  const edge = 'Edge';
@@ -806,35 +817,36 @@
806
817
  const firefox = 'Firefox';
807
818
  const safari = 'Safari';
808
819
  const unknown$1 = () => {
809
- return nu$1({
810
- current: undefined,
811
- version: Version.unknown()
812
- });
813
- };
814
- const nu$1 = info => {
815
- const current = info.current;
816
- const version = info.version;
817
- const isBrowser = name => () => current === name;
818
- return {
819
- current,
820
- version,
821
- isEdge: isBrowser(edge),
822
- isChromium: isBrowser(chromium),
823
- isIE: isBrowser(ie),
824
- isOpera: isBrowser(opera),
825
- isFirefox: isBrowser(firefox),
826
- isSafari: isBrowser(safari)
827
- };
820
+ return nu$1({
821
+ current: undefined,
822
+ version: Version.unknown()
823
+ });
824
+ };
825
+ const nu$1 = (info) => {
826
+ const current = info.current;
827
+ const version = info.version;
828
+ const isBrowser = (name) => () => current === name;
829
+ return {
830
+ current,
831
+ version,
832
+ isEdge: isBrowser(edge),
833
+ isChromium: isBrowser(chromium),
834
+ // NOTE: isIe just looks too weird
835
+ isIE: isBrowser(ie),
836
+ isOpera: isBrowser(opera),
837
+ isFirefox: isBrowser(firefox),
838
+ isSafari: isBrowser(safari)
839
+ };
828
840
  };
829
841
  const Browser = {
830
- unknown: unknown$1,
831
- nu: nu$1,
832
- edge: constant(edge),
833
- chromium: constant(chromium),
834
- ie: constant(ie),
835
- opera: constant(opera),
836
- firefox: constant(firefox),
837
- safari: constant(safari)
842
+ unknown: unknown$1,
843
+ nu: nu$1,
844
+ edge: constant(edge),
845
+ chromium: constant(chromium),
846
+ ie: constant(ie),
847
+ opera: constant(opera),
848
+ firefox: constant(firefox),
849
+ safari: constant(safari)
838
850
  };
839
851
 
840
852
  const windows = 'Windows';
@@ -845,405 +857,753 @@
845
857
  const solaris = 'Solaris';
846
858
  const freebsd = 'FreeBSD';
847
859
  const chromeos = 'ChromeOS';
860
+ // Though there is a bit of dupe with this and Browser, trying to
861
+ // reuse code makes it much harder to follow and change.
848
862
  const unknown = () => {
849
- return nu({
850
- current: undefined,
851
- version: Version.unknown()
852
- });
853
- };
854
- const nu = info => {
855
- const current = info.current;
856
- const version = info.version;
857
- const isOS = name => () => current === name;
858
- return {
859
- current,
860
- version,
861
- isWindows: isOS(windows),
862
- isiOS: isOS(ios),
863
- isAndroid: isOS(android),
864
- isMacOS: isOS(macos),
865
- isLinux: isOS(linux),
866
- isSolaris: isOS(solaris),
867
- isFreeBSD: isOS(freebsd),
868
- isChromeOS: isOS(chromeos)
869
- };
863
+ return nu({
864
+ current: undefined,
865
+ version: Version.unknown()
866
+ });
867
+ };
868
+ const nu = (info) => {
869
+ const current = info.current;
870
+ const version = info.version;
871
+ const isOS = (name) => () => current === name;
872
+ return {
873
+ current,
874
+ version,
875
+ isWindows: isOS(windows),
876
+ // TODO: Fix capitalisation
877
+ isiOS: isOS(ios),
878
+ isAndroid: isOS(android),
879
+ isMacOS: isOS(macos),
880
+ isLinux: isOS(linux),
881
+ isSolaris: isOS(solaris),
882
+ isFreeBSD: isOS(freebsd),
883
+ isChromeOS: isOS(chromeos)
884
+ };
870
885
  };
871
886
  const OperatingSystem = {
872
- unknown,
873
- nu,
874
- windows: constant(windows),
875
- ios: constant(ios),
876
- android: constant(android),
877
- linux: constant(linux),
878
- macos: constant(macos),
879
- solaris: constant(solaris),
880
- freebsd: constant(freebsd),
881
- chromeos: constant(chromeos)
887
+ unknown,
888
+ nu,
889
+ windows: constant(windows),
890
+ ios: constant(ios),
891
+ android: constant(android),
892
+ linux: constant(linux),
893
+ macos: constant(macos),
894
+ solaris: constant(solaris),
895
+ freebsd: constant(freebsd),
896
+ chromeos: constant(chromeos)
882
897
  };
883
898
 
884
899
  const detect$1 = (userAgent, userAgentDataOpt, mediaMatch) => {
885
- const browsers = PlatformInfo.browsers();
886
- const oses = PlatformInfo.oses();
887
- const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu);
888
- const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
889
- const deviceType = DeviceType(os, browser, userAgent, mediaMatch);
890
- return {
891
- browser,
892
- os,
893
- deviceType
894
- };
895
- };
896
- const PlatformDetection = { detect: detect$1 };
900
+ const browsers = PlatformInfo.browsers();
901
+ const oses = PlatformInfo.oses();
902
+ const browser = userAgentDataOpt.bind((userAgentData) => detectBrowser$1(browsers, userAgentData))
903
+ .orThunk(() => detectBrowser(browsers, userAgent))
904
+ .fold(Browser.unknown, Browser.nu);
905
+ const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
906
+ const deviceType = DeviceType(os, browser, userAgent, mediaMatch);
907
+ return {
908
+ browser,
909
+ os,
910
+ deviceType
911
+ };
912
+ };
913
+ const PlatformDetection = {
914
+ detect: detect$1
915
+ };
897
916
 
898
- const mediaMatch = query => window.matchMedia(query).matches;
899
- let platform = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch));
917
+ const mediaMatch = (query) => window.matchMedia(query).matches;
918
+ // IMPORTANT: Must be in a thunk, otherwise rollup thinks calling this immediately
919
+ // causes side effects and won't tree shake this away
920
+ // Note: navigator.userAgentData is not part of the native typescript types yet
921
+ let platform = cached(() => PlatformDetection.detect(window.navigator.userAgent, Optional.from((window.navigator.userAgentData)), mediaMatch));
900
922
  const detect = () => platform();
901
923
 
924
+ const unsafe = (name, scope) => {
925
+ return resolve(name, scope);
926
+ };
927
+ const getOrDie = (name, scope) => {
928
+ const actual = unsafe(name, scope);
929
+ if (actual === undefined || actual === null) {
930
+ throw new Error(name + ' not available on this browser');
931
+ }
932
+ return actual;
933
+ };
934
+
935
+ const getPrototypeOf = Object.getPrototypeOf;
936
+ /*
937
+ * IE9 and above
938
+ *
939
+ * MDN no use on this one, but here's the link anyway:
940
+ * https://developer.mozilla.org/en/docs/Web/API/HTMLElement
941
+ */
942
+ const sandHTMLElement = (scope) => {
943
+ return getOrDie('HTMLElement', scope);
944
+ };
945
+ const isPrototypeOf = (x) => {
946
+ // use Resolve to get the window object for x and just return undefined if it can't find it.
947
+ // undefined scope later triggers using the global window.
948
+ const scope = resolve('ownerDocument.defaultView', x);
949
+ // TINY-7374: We can't rely on looking at the owner window HTMLElement as the element may have
950
+ // been constructed in a different window and then appended to the current window document.
951
+ return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\w*Element$/.test(getPrototypeOf(x).constructor.name));
952
+ };
953
+
954
+ const type = (element) => element.dom.nodeType;
955
+ const isType = (t) => (element) => type(element) === t;
956
+ const isHTMLElement = (element) => isElement(element) && isPrototypeOf(element.dom);
957
+ const isElement = isType(ELEMENT);
958
+ const isText = isType(TEXT);
959
+ const isDocumentFragment = isType(DOCUMENT_FRAGMENT);
960
+
961
+ /**
962
+ * The document associated with the current element
963
+ * NOTE: this will throw if the owner is null.
964
+ */
965
+ const owner = (element) => SugarElement.fromDom(element.dom.ownerDocument);
966
+ const parent = (element) => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
967
+ const parents = (element, isRoot) => {
968
+ const stop = isFunction(isRoot) ? isRoot : never;
969
+ // This is used a *lot* so it needs to be performant, not recursive
970
+ let dom = element.dom;
971
+ const ret = [];
972
+ while (dom.parentNode !== null && dom.parentNode !== undefined) {
973
+ const rawParent = dom.parentNode;
974
+ const p = SugarElement.fromDom(rawParent);
975
+ ret.push(p);
976
+ if (stop(p) === true) {
977
+ break;
978
+ }
979
+ else {
980
+ dom = rawParent;
981
+ }
982
+ }
983
+ return ret;
984
+ };
985
+ const siblings$2 = (element) => {
986
+ // TODO: Refactor out children so we can just not add self instead of filtering afterwards
987
+ const filterSelf = (elements) => filter$1(elements, (x) => !eq(element, x));
988
+ return parent(element).map(children).map(filterSelf).getOr([]);
989
+ };
990
+ const nextSibling = (element) => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
991
+ const children = (element) => map(element.dom.childNodes, SugarElement.fromDom);
992
+
993
+ /**
994
+ * Is the element a ShadowRoot?
995
+ *
996
+ * Note: this is insufficient to test if any element is a shadow root, but it is sufficient to differentiate between
997
+ * a Document and a ShadowRoot.
998
+ */
999
+ const isShadowRoot = (dos) => isDocumentFragment(dos) && isNonNullable(dos.dom.host);
1000
+ const getRootNode = (e) => SugarElement.fromDom(e.dom.getRootNode());
1001
+ /** If this element is in a ShadowRoot, return it. */
1002
+ const getShadowRoot = (e) => {
1003
+ const r = getRootNode(e);
1004
+ return isShadowRoot(r) ? Optional.some(r) : Optional.none();
1005
+ };
1006
+ /** Return the host of a ShadowRoot.
1007
+ *
1008
+ * This function will throw if Shadow DOM is unsupported in the browser, or if the host is null.
1009
+ * If you actually have a ShadowRoot, this shouldn't happen.
1010
+ */
1011
+ const getShadowHost = (e) => SugarElement.fromDom(e.dom.host);
1012
+ /**
1013
+ * When Events bubble up through a ShadowRoot, the browser changes the target to be the shadow host.
1014
+ * This function gets the "original" event target if possible.
1015
+ * This only works if the shadow tree is open - if the shadow tree is closed, event.target is returned.
1016
+ * See: https://developers.google.com/web/fundamentals/web-components/shadowdom#events
1017
+ */
1018
+ const getOriginalEventTarget = (event) => {
1019
+ if (isNonNullable(event.target)) {
1020
+ const el = SugarElement.fromDom(event.target);
1021
+ if (isElement(el) && isOpenShadowHost(el)) {
1022
+ // When target element is inside Shadow DOM we need to take first element from composedPath
1023
+ // otherwise we'll get Shadow Root parent, not actual target element.
1024
+ if (event.composed && event.composedPath) {
1025
+ const composedPath = event.composedPath();
1026
+ if (composedPath) {
1027
+ return head(composedPath);
1028
+ }
1029
+ }
1030
+ }
1031
+ }
1032
+ return Optional.from(event.target);
1033
+ };
1034
+ /** Return true if the element is a host of an open shadow root.
1035
+ * Return false if the element is a host of a closed shadow root, or if the element is not a host.
1036
+ */
1037
+ const isOpenShadowHost = (element) => isNonNullable(element.dom.shadowRoot);
1038
+
1039
+ const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({
1040
+ target,
1041
+ x,
1042
+ y,
1043
+ stop,
1044
+ prevent,
1045
+ kill,
1046
+ raw
1047
+ });
1048
+ /** Wraps an Event in an EventArgs structure.
1049
+ * The returned EventArgs structure has its target set to the "original" target if possible.
1050
+ * See SugarShadowDom.getOriginalEventTarget
1051
+ */
1052
+ const fromRawEvent = (rawEvent) => {
1053
+ const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
1054
+ const stop = () => rawEvent.stopPropagation();
1055
+ const prevent = () => rawEvent.preventDefault();
1056
+ const kill = compose(prevent, stop); // more of a sequence than a compose, but same effect
1057
+ // FIX: Don't just expose the raw event. Need to identify what needs standardisation.
1058
+ return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
1059
+ };
1060
+ const handle = (filter, handler) => (rawEvent) => {
1061
+ if (filter(rawEvent)) {
1062
+ handler(fromRawEvent(rawEvent));
1063
+ }
1064
+ };
1065
+ const binder = (element, event, filter, handler, useCapture) => {
1066
+ const wrapped = handle(filter, handler);
1067
+ // IE9 minimum
1068
+ element.dom.addEventListener(event, wrapped, useCapture);
1069
+ return {
1070
+ unbind: curry(unbind, element, event, wrapped, useCapture)
1071
+ };
1072
+ };
1073
+ const bind$2 = (element, event, filter, handler) => binder(element, event, filter, handler, false);
1074
+ const unbind = (element, event, handler, useCapture) => {
1075
+ // IE9 minimum
1076
+ element.dom.removeEventListener(event, handler, useCapture);
1077
+ };
1078
+
1079
+ const filter = always; // no filter on plain DomEvents
1080
+ const bind$1 = (element, event, handler) => bind$2(element, event, filter, handler);
1081
+
1082
+ const rawSet = (dom, key, value) => {
1083
+ /*
1084
+ * JQuery coerced everything to a string, and silently did nothing on text node/null/undefined.
1085
+ *
1086
+ * We fail on those invalid cases, only allowing numbers and booleans.
1087
+ */
1088
+ if (isString(value) || isBoolean(value) || isNumber(value)) {
1089
+ dom.setAttribute(key, value + '');
1090
+ }
1091
+ else {
1092
+ // eslint-disable-next-line no-console
1093
+ console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
1094
+ throw new Error('Attribute value was not simple');
1095
+ }
1096
+ };
1097
+ const set$1 = (element, key, value) => {
1098
+ rawSet(element.dom, key, value);
1099
+ };
1100
+ const get$3 = (element, key) => {
1101
+ const v = element.dom.getAttribute(key);
1102
+ // undefined is the more appropriate value for JS, and this matches JQuery
1103
+ return v === null ? undefined : v;
1104
+ };
1105
+ const remove = (element, key) => {
1106
+ element.dom.removeAttribute(key);
1107
+ };
1108
+
1109
+ // some elements, such as mathml, don't have style attributes
1110
+ // others, such as angular elements, have style attributes that aren't a CSSStyleDeclaration
1111
+ const isSupported = (dom) =>
1112
+ // eslint-disable-next-line @typescript-eslint/unbound-method
1113
+ dom.style !== undefined && isFunction(dom.style.getPropertyValue);
1114
+
1115
+ // Node.contains() is very, very, very good performance
1116
+ // http://jsperf.com/closest-vs-contains/5
1117
+ const inBody = (element) => {
1118
+ // Technically this is only required on IE, where contains() returns false for text nodes.
1119
+ // But it's cheap enough to run everywhere and Sugar doesn't have platform detection (yet).
1120
+ const dom = isText(element) ? element.dom.parentNode : element.dom;
1121
+ // use ownerDocument.body to ensure this works inside iframes.
1122
+ // Normally contains is bad because an element "contains" itself, but here we want that.
1123
+ if (dom === undefined || dom === null || dom.ownerDocument === null) {
1124
+ return false;
1125
+ }
1126
+ const doc = dom.ownerDocument;
1127
+ return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));
1128
+ };
1129
+ const getBody = (doc) => {
1130
+ const b = doc.dom.body;
1131
+ if (b === null || b === undefined) {
1132
+ throw new Error('Body is not available yet');
1133
+ }
1134
+ return SugarElement.fromDom(b);
1135
+ };
1136
+
1137
+ const internalSet = (dom, property, value) => {
1138
+ // This is going to hurt. Apologies.
1139
+ // JQuery coerces numbers to pixels for certain property names, and other times lets numbers through.
1140
+ // we're going to be explicit; strings only.
1141
+ if (!isString(value)) {
1142
+ // eslint-disable-next-line no-console
1143
+ console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
1144
+ throw new Error('CSS value must be a string: ' + value);
1145
+ }
1146
+ // removed: support for dom().style[property] where prop is camel case instead of normal property name
1147
+ if (isSupported(dom)) {
1148
+ dom.style.setProperty(property, value);
1149
+ }
1150
+ };
1151
+ const set = (element, property, value) => {
1152
+ const dom = element.dom;
1153
+ internalSet(dom, property, value);
1154
+ };
1155
+ const setAll = (element, css) => {
1156
+ const dom = element.dom;
1157
+ each(css, (v, k) => {
1158
+ internalSet(dom, k, v);
1159
+ });
1160
+ };
1161
+ /*
1162
+ * NOTE: For certain properties, this returns the "used value" which is subtly different to the "computed value" (despite calling getComputedStyle).
1163
+ * Blame CSS 2.0.
1164
+ *
1165
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
1166
+ */
1167
+ const get$2 = (element, property) => {
1168
+ const dom = element.dom;
1169
+ /*
1170
+ * IE9 and above per
1171
+ * https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle
1172
+ *
1173
+ * Not in numerosity, because it doesn't memoize and looking this up dynamically in performance critical code would be horrendous.
1174
+ *
1175
+ * JQuery has some magic here for IE popups, but we don't really need that.
1176
+ * It also uses element.ownerDocument.defaultView to handle iframes but that hasn't been required since FF 3.6.
1177
+ */
1178
+ const styles = window.getComputedStyle(dom);
1179
+ const r = styles.getPropertyValue(property);
1180
+ // jquery-ism: If r is an empty string, check that the element is not in a document. If it isn't, return the raw value.
1181
+ // Turns out we do this a lot.
1182
+ return (r === '' && !inBody(element)) ? getUnsafeProperty(dom, property) : r;
1183
+ };
1184
+ // removed: support for dom().style[property] where prop is camel case instead of normal property name
1185
+ // empty string is what the browsers (IE11 and Chrome) return when the propertyValue doesn't exists.
1186
+ const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : '';
1187
+
902
1188
  const r = (left, top) => {
903
- const translate = (x, y) => r(left + x, top + y);
904
- return {
905
- left,
906
- top,
907
- translate
908
- };
1189
+ const translate = (x, y) => r(left + x, top + y);
1190
+ return {
1191
+ left,
1192
+ top,
1193
+ translate
1194
+ };
909
1195
  };
1196
+ // tslint:disable-next-line:variable-name
910
1197
  const SugarPosition = r;
911
1198
 
912
- const get$1 = _DOC => {
913
- const doc = _DOC !== undefined ? _DOC.dom : document;
914
- const x = doc.body.scrollLeft || doc.documentElement.scrollLeft;
915
- const y = doc.body.scrollTop || doc.documentElement.scrollTop;
916
- return SugarPosition(x, y);
1199
+ // get scroll position (x,y) relative to document _doc (or global if not supplied)
1200
+ const get$1 = (_DOC) => {
1201
+ const doc = _DOC !== undefined ? _DOC.dom : document;
1202
+ // ASSUMPTION: This is for cross-browser support, body works for Safari & EDGE, and when we have an iframe body scroller
1203
+ const x = doc.body.scrollLeft || doc.documentElement.scrollLeft;
1204
+ const y = doc.body.scrollTop || doc.documentElement.scrollTop;
1205
+ return SugarPosition(x, y);
917
1206
  };
918
1207
 
919
- const get = _win => {
920
- const win = _win === undefined ? window : _win;
921
- if (detect().browser.isFirefox()) {
922
- return Optional.none();
923
- } else {
924
- return Optional.from(win.visualViewport);
925
- }
1208
+ // IE11 Can return undefined for a classList on elements such as math, so we make sure it's not undefined before attempting to use it.
1209
+ const supports = (element) => element.dom.classList !== undefined;
1210
+
1211
+ const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz);
1212
+
1213
+ const ancestors$1 = (scope, predicate, isRoot) => filter$1(parents(scope, isRoot), predicate);
1214
+ const siblings$1 = (scope, predicate) => filter$1(siblings$2(scope), predicate);
1215
+
1216
+ const all = (selector) => all$1(selector);
1217
+ // For all of the following:
1218
+ //
1219
+ // jQuery does siblings of firstChild. IE9+ supports scope.dom.children (similar to Traverse.children but elements only).
1220
+ // Traverse should also do this (but probably not by default).
1221
+ //
1222
+ const ancestors = (scope, selector, isRoot) =>
1223
+ // It may surprise you to learn this is exactly what JQuery does
1224
+ // TODO: Avoid all this wrapping and unwrapping
1225
+ ancestors$1(scope, (e) => is(e, selector), isRoot);
1226
+ const siblings = (scope, selector) =>
1227
+ // It may surprise you to learn this is exactly what JQuery does
1228
+ // TODO: Avoid all the wrapping and unwrapping
1229
+ siblings$1(scope, (e) => is(e, selector));
1230
+
1231
+ const get = (_win) => {
1232
+ const win = _win === undefined ? window : _win;
1233
+ if (detect().browser.isFirefox()) {
1234
+ // TINY-7984: Firefox 91 is returning incorrect values for visualViewport.pageTop, so disable it for now
1235
+ return Optional.none();
1236
+ }
1237
+ else {
1238
+ return Optional.from(win.visualViewport);
1239
+ }
926
1240
  };
927
1241
  const bounds = (x, y, width, height) => ({
928
- x,
929
- y,
930
- width,
931
- height,
932
- right: x + width,
933
- bottom: y + height
1242
+ x,
1243
+ y,
1244
+ width,
1245
+ height,
1246
+ right: x + width,
1247
+ bottom: y + height
934
1248
  });
935
- const getBounds = _win => {
936
- const win = _win === undefined ? window : _win;
937
- const doc = win.document;
938
- const scroll = get$1(SugarElement.fromDom(doc));
939
- return get(win).fold(() => {
940
- const html = win.document.documentElement;
941
- const width = html.clientWidth;
942
- const height = html.clientHeight;
943
- return bounds(scroll.left, scroll.top, width, height);
944
- }, visualViewport => bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height));
945
- };
946
- const bind = (name, callback, _win) => get(_win).map(visualViewport => {
947
- const handler = e => callback(fromRawEvent(e));
948
- visualViewport.addEventListener(name, handler);
949
- return { unbind: () => visualViewport.removeEventListener(name, handler) };
950
- }).getOrThunk(() => ({ unbind: noop }));
1249
+ const getBounds = (_win) => {
1250
+ const win = _win === undefined ? window : _win;
1251
+ const doc = win.document;
1252
+ const scroll = get$1(SugarElement.fromDom(doc));
1253
+ return get(win).fold(() => {
1254
+ const html = win.document.documentElement;
1255
+ // Don't use window.innerWidth/innerHeight here, as we don't want to include scrollbars
1256
+ // since the right/bottom position is based on the edge of the scrollbar not the window
1257
+ const width = html.clientWidth;
1258
+ const height = html.clientHeight;
1259
+ return bounds(scroll.left, scroll.top, width, height);
1260
+ }, (visualViewport) =>
1261
+ // iOS doesn't update the pageTop/pageLeft when element.scrollIntoView() is called, so we need to fallback to the
1262
+ // scroll position which will always be less than the page top/left values when page top/left are accurate/correct.
1263
+ bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height));
1264
+ };
1265
+ const bind = (name, callback, _win) => get(_win).map((visualViewport) => {
1266
+ const handler = (e) => callback(fromRawEvent(e));
1267
+ visualViewport.addEventListener(name, handler);
1268
+ return {
1269
+ unbind: () => visualViewport.removeEventListener(name, handler)
1270
+ };
1271
+ }).getOrThunk(() => ({
1272
+ unbind: noop
1273
+ }));
951
1274
 
952
- var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
1275
+ var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
953
1276
 
954
- var global = tinymce.util.Tools.resolve('tinymce.Env');
1277
+ var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
955
1278
 
956
1279
  const fireFullscreenStateChanged = (editor, state) => {
957
- editor.dispatch('FullscreenStateChanged', { state });
958
- editor.dispatch('ResizeEditor');
1280
+ editor.dispatch('FullscreenStateChanged', { state });
1281
+ editor.dispatch('ResizeEditor');
959
1282
  };
960
1283
 
961
- const option = name => editor => editor.options.get(name);
962
- const register$2 = editor => {
963
- const registerOption = editor.options.register;
964
- registerOption('fullscreen_native', {
965
- processor: 'boolean',
966
- default: false
967
- });
1284
+ const option = (name) => (editor) => editor.options.get(name);
1285
+ const register$2 = (editor) => {
1286
+ const registerOption = editor.options.register;
1287
+ registerOption('fullscreen_native', {
1288
+ processor: 'boolean',
1289
+ default: false
1290
+ });
968
1291
  };
969
1292
  const getFullscreenNative = option('fullscreen_native');
970
1293
 
971
- const getFullscreenRoot = editor => {
972
- const elem = SugarElement.fromDom(editor.getElement());
973
- return getShadowRoot(elem).map(getShadowHost).getOrThunk(() => getBody(owner(elem)));
974
- };
975
- const getFullscreenElement = root => {
976
- if (root.fullscreenElement !== undefined) {
977
- return root.fullscreenElement;
978
- } else if (root.msFullscreenElement !== undefined) {
979
- return root.msFullscreenElement;
980
- } else if (root.webkitFullscreenElement !== undefined) {
981
- return root.webkitFullscreenElement;
982
- } else {
983
- return null;
984
- }
1294
+ const getFullscreenRoot = (editor) => {
1295
+ const elem = SugarElement.fromDom(editor.getElement());
1296
+ return getShadowRoot(elem).map(getShadowHost)
1297
+ .getOrThunk(() => getBody(owner(elem)));
1298
+ };
1299
+ const getFullscreenElement = (root) => {
1300
+ if (root.fullscreenElement !== undefined) {
1301
+ return root.fullscreenElement;
1302
+ }
1303
+ else if (root.msFullscreenElement !== undefined) {
1304
+ return root.msFullscreenElement;
1305
+ }
1306
+ else if (root.webkitFullscreenElement !== undefined) {
1307
+ return root.webkitFullscreenElement;
1308
+ }
1309
+ else {
1310
+ return null;
1311
+ }
985
1312
  };
986
1313
  const getFullscreenchangeEventName = () => {
987
- if (document.fullscreenElement !== undefined) {
988
- return 'fullscreenchange';
989
- } else if (document.msFullscreenElement !== undefined) {
990
- return 'MSFullscreenChange';
991
- } else if (document.webkitFullscreenElement !== undefined) {
992
- return 'webkitfullscreenchange';
993
- } else {
994
- return 'fullscreenchange';
995
- }
996
- };
997
- const requestFullscreen = sugarElem => {
998
- const elem = sugarElem.dom;
999
- if (elem.requestFullscreen) {
1000
- elem.requestFullscreen();
1001
- } else if (elem.msRequestFullscreen) {
1002
- elem.msRequestFullscreen();
1003
- } else if (elem.webkitRequestFullScreen) {
1004
- elem.webkitRequestFullScreen();
1005
- }
1006
- };
1007
- const exitFullscreen = sugarDoc => {
1008
- const doc = sugarDoc.dom;
1009
- if (doc.exitFullscreen) {
1010
- doc.exitFullscreen();
1011
- } else if (doc.msExitFullscreen) {
1012
- doc.msExitFullscreen();
1013
- } else if (doc.webkitCancelFullScreen) {
1014
- doc.webkitCancelFullScreen();
1015
- }
1016
- };
1017
- const isFullscreenElement = elem => elem.dom === getFullscreenElement(owner(elem).dom);
1018
-
1019
- const ancestors$1 = (scope, predicate, isRoot) => filter$1(parents(scope, isRoot), predicate);
1020
- const siblings$1 = (scope, predicate) => filter$1(siblings$2(scope), predicate);
1021
-
1022
- const all = selector => all$1(selector);
1023
- const ancestors = (scope, selector, isRoot) => ancestors$1(scope, e => is(e, selector), isRoot);
1024
- const siblings = (scope, selector) => siblings$1(scope, e => is(e, selector));
1314
+ if (document.fullscreenElement !== undefined) {
1315
+ return 'fullscreenchange';
1316
+ }
1317
+ else if (document.msFullscreenElement !== undefined) {
1318
+ return 'MSFullscreenChange'; // warning, seems to be case sensitive
1319
+ }
1320
+ else if (document.webkitFullscreenElement !== undefined) {
1321
+ return 'webkitfullscreenchange';
1322
+ }
1323
+ else {
1324
+ return 'fullscreenchange';
1325
+ }
1326
+ };
1327
+ const requestFullscreen = (sugarElem) => {
1328
+ const elem = sugarElem.dom;
1329
+ if (elem.requestFullscreen) {
1330
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
1331
+ elem.requestFullscreen();
1332
+ }
1333
+ else if (elem.msRequestFullscreen) {
1334
+ elem.msRequestFullscreen();
1335
+ }
1336
+ else if (elem.webkitRequestFullScreen) {
1337
+ elem.webkitRequestFullScreen();
1338
+ }
1339
+ };
1340
+ const exitFullscreen = (sugarDoc) => {
1341
+ const doc = sugarDoc.dom;
1342
+ if (doc.exitFullscreen) {
1343
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
1344
+ doc.exitFullscreen();
1345
+ }
1346
+ else if (doc.msExitFullscreen) {
1347
+ doc.msExitFullscreen();
1348
+ }
1349
+ else if (doc.webkitCancelFullScreen) {
1350
+ doc.webkitCancelFullScreen();
1351
+ }
1352
+ };
1353
+ const isFullscreenElement = (elem) => elem.dom === getFullscreenElement(owner(elem).dom);
1025
1354
 
1026
1355
  const attr = 'data-ephox-mobile-fullscreen-style';
1027
1356
  const siblingStyles = 'display:none!important;';
1028
1357
  const ancestorPosition = 'position:absolute!important;';
1358
+ // TINY-3407 ancestors need 'height:100%!important;overflow:visible!important;' to prevent collapsed ancestors hiding the editor
1029
1359
  const ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;';
1030
1360
  const bgFallback = 'background-color:rgb(255,255,255)!important;';
1031
- const isAndroid = global.os.isAndroid();
1032
- const matchColor = editorBody => {
1033
- const color = get$2(editorBody, 'background-color');
1034
- return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback;
1035
- };
1361
+ const isAndroid = global$1.os.isAndroid();
1362
+ const matchColor = (editorBody) => {
1363
+ // in iOS you can overscroll, sometimes when you overscroll you can reveal the bgcolor of an element beneath,
1364
+ // by matching the bg color and clobbering ensures any reveals are 'camouflaged' the same color
1365
+ const color = get$2(editorBody, 'background-color');
1366
+ return (color !== undefined && color !== '') ? 'background-color:' + color + '!important' : bgFallback;
1367
+ };
1368
+ // We clobber all tags, direct ancestors to the editorBody get ancestorStyles, everything else gets siblingStyles
1036
1369
  const clobberStyles = (dom, container, editorBody) => {
1037
- const gatherSiblings = element => {
1038
- return siblings(element, '*:not(.tox-silver-sink)');
1039
- };
1040
- const clobber = clobberStyle => element => {
1041
- const styles = get$3(element, 'style');
1042
- const backup = styles === undefined ? 'no-styles' : styles.trim();
1043
- if (backup === clobberStyle) {
1044
- return;
1045
- } else {
1046
- set$1(element, attr, backup);
1047
- setAll(element, dom.parseStyle(clobberStyle));
1048
- }
1049
- };
1050
- const ancestors$1 = ancestors(container, '*');
1051
- const siblings$1 = bind$3(ancestors$1, gatherSiblings);
1052
- const bgColor = matchColor(editorBody);
1053
- each$1(siblings$1, clobber(siblingStyles));
1054
- each$1(ancestors$1, clobber(ancestorPosition + ancestorStyles + bgColor));
1055
- const containerStyles = isAndroid === true ? '' : ancestorPosition;
1056
- clobber(containerStyles + ancestorStyles + bgColor)(container);
1057
- };
1058
- const restoreStyles = dom => {
1059
- const clobberedEls = all('[' + attr + ']');
1060
- each$1(clobberedEls, element => {
1061
- const restore = get$3(element, attr);
1062
- if (restore && restore !== 'no-styles') {
1063
- setAll(element, dom.parseStyle(restore));
1064
- } else {
1065
- remove(element, 'style');
1066
- }
1067
- remove(element, attr);
1068
- });
1370
+ const gatherSiblings = (element) => {
1371
+ return siblings(element, '*:not(.tox-silver-sink)');
1372
+ };
1373
+ const clobber = (clobberStyle) => (element) => {
1374
+ const styles = get$3(element, 'style');
1375
+ const backup = styles === undefined ? 'no-styles' : styles.trim();
1376
+ if (backup === clobberStyle) {
1377
+ return;
1378
+ }
1379
+ else {
1380
+ set$1(element, attr, backup);
1381
+ setAll(element, dom.parseStyle(clobberStyle));
1382
+ }
1383
+ };
1384
+ const ancestors$1 = ancestors(container, '*');
1385
+ const siblings$1 = bind$3(ancestors$1, gatherSiblings);
1386
+ const bgColor = matchColor(editorBody);
1387
+ /* NOTE: This assumes that container has no siblings itself */
1388
+ each$1(siblings$1, clobber(siblingStyles));
1389
+ each$1(ancestors$1, clobber(ancestorPosition + ancestorStyles + bgColor));
1390
+ // position absolute on the outer-container breaks Android flex layout
1391
+ const containerStyles = isAndroid === true ? '' : ancestorPosition;
1392
+ clobber(containerStyles + ancestorStyles + bgColor)(container);
1393
+ };
1394
+ const restoreStyles = (dom) => {
1395
+ const clobberedEls = all('[' + attr + ']');
1396
+ each$1(clobberedEls, (element) => {
1397
+ const restore = get$3(element, attr);
1398
+ if (restore && restore !== 'no-styles') {
1399
+ setAll(element, dom.parseStyle(restore));
1400
+ }
1401
+ else {
1402
+ remove(element, 'style');
1403
+ }
1404
+ remove(element, attr);
1405
+ });
1069
1406
  };
1070
1407
 
1071
- const DOM = global$1.DOM;
1408
+ const DOM = global$2.DOM;
1072
1409
  const getScrollPos = () => getBounds(window);
1073
- const setScrollPos = pos => window.scrollTo(pos.x, pos.y);
1074
- const viewportUpdate = get().fold(() => ({
1075
- bind: noop,
1076
- unbind: noop
1077
- }), visualViewport => {
1078
- const editorContainer = value();
1079
- const resizeBinder = unbindable();
1080
- const scrollBinder = unbindable();
1081
- const refreshScroll = () => {
1082
- document.body.scrollTop = 0;
1083
- document.documentElement.scrollTop = 0;
1084
- };
1085
- const refreshVisualViewport = () => {
1086
- window.requestAnimationFrame(() => {
1087
- editorContainer.on(container => setAll(container, {
1088
- top: visualViewport.offsetTop + 'px',
1089
- left: visualViewport.offsetLeft + 'px',
1090
- height: visualViewport.height + 'px',
1091
- width: visualViewport.width + 'px'
1092
- }));
1093
- });
1094
- };
1095
- const update = first(() => {
1096
- refreshScroll();
1097
- refreshVisualViewport();
1098
- }, 50);
1099
- const bind$1 = element => {
1100
- editorContainer.set(element);
1101
- update.throttle();
1102
- resizeBinder.set(bind('resize', update.throttle));
1103
- scrollBinder.set(bind('scroll', update.throttle));
1104
- };
1105
- const unbind = () => {
1106
- editorContainer.on(() => {
1107
- resizeBinder.clear();
1108
- scrollBinder.clear();
1109
- });
1110
- editorContainer.clear();
1111
- };
1112
- return {
1113
- bind: bind$1,
1114
- unbind
1115
- };
1410
+ const setScrollPos = (pos) => window.scrollTo(pos.x, pos.y);
1411
+ const viewportUpdate = get().fold(() => ({ bind: noop, unbind: noop }), (visualViewport) => {
1412
+ const editorContainer = value();
1413
+ const resizeBinder = unbindable();
1414
+ const scrollBinder = unbindable();
1415
+ const refreshScroll = () => {
1416
+ document.body.scrollTop = 0;
1417
+ document.documentElement.scrollTop = 0;
1418
+ };
1419
+ const refreshVisualViewport = () => {
1420
+ window.requestAnimationFrame(() => {
1421
+ editorContainer.on((container) => setAll(container, {
1422
+ top: visualViewport.offsetTop + 'px',
1423
+ left: visualViewport.offsetLeft + 'px',
1424
+ height: visualViewport.height + 'px',
1425
+ width: visualViewport.width + 'px'
1426
+ }));
1427
+ });
1428
+ };
1429
+ const update = first(() => {
1430
+ refreshScroll();
1431
+ refreshVisualViewport();
1432
+ }, 50);
1433
+ const bind$1 = (element) => {
1434
+ editorContainer.set(element);
1435
+ update.throttle();
1436
+ resizeBinder.set(bind('resize', update.throttle));
1437
+ scrollBinder.set(bind('scroll', update.throttle));
1438
+ };
1439
+ const unbind = () => {
1440
+ editorContainer.on(() => {
1441
+ resizeBinder.clear();
1442
+ scrollBinder.clear();
1443
+ });
1444
+ editorContainer.clear();
1445
+ };
1446
+ return {
1447
+ bind: bind$1,
1448
+ unbind
1449
+ };
1116
1450
  });
1117
1451
  const toggleFullscreen = (editor, fullscreenState) => {
1118
- const body = document.body;
1119
- const documentElement = document.documentElement;
1120
- const editorContainer = editor.getContainer();
1121
- const editorContainerS = SugarElement.fromDom(editorContainer);
1122
- const sinkContainerS = nextSibling(editorContainerS).filter(elm => isHTMLElement(elm) && has(elm, 'tox-silver-sink'));
1123
- const fullscreenRoot = getFullscreenRoot(editor);
1124
- const fullscreenInfo = fullscreenState.get();
1125
- const editorBody = SugarElement.fromDom(editor.getBody());
1126
- const isTouch = global.deviceType.isTouch();
1127
- const editorContainerStyle = editorContainer.style;
1128
- const iframe = editor.iframeElement;
1129
- const iframeStyle = iframe === null || iframe === void 0 ? void 0 : iframe.style;
1130
- const handleClasses = handler => {
1131
- handler(body, 'tox-fullscreen');
1132
- handler(documentElement, 'tox-fullscreen');
1133
- handler(editorContainer, 'tox-fullscreen');
1134
- getShadowRoot(editorContainerS).map(root => getShadowHost(root).dom).each(host => {
1135
- handler(host, 'tox-fullscreen');
1136
- handler(host, 'tox-shadowhost');
1137
- });
1138
- };
1139
- const cleanup = () => {
1140
- if (isTouch) {
1141
- restoreStyles(editor.dom);
1142
- }
1143
- handleClasses(DOM.removeClass);
1144
- viewportUpdate.unbind();
1145
- Optional.from(fullscreenState.get()).each(info => info.fullscreenChangeHandler.unbind());
1146
- };
1147
- if (!fullscreenInfo) {
1148
- const fullscreenChangeHandler = bind$1(owner(fullscreenRoot), getFullscreenchangeEventName(), _evt => {
1149
- if (getFullscreenNative(editor)) {
1150
- if (!isFullscreenElement(fullscreenRoot) && fullscreenState.get() !== null) {
1151
- toggleFullscreen(editor, fullscreenState);
1452
+ const body = document.body;
1453
+ const documentElement = document.documentElement;
1454
+ const editorContainer = editor.getContainer();
1455
+ const editorContainerS = SugarElement.fromDom(editorContainer);
1456
+ const sinkContainerS = nextSibling(editorContainerS)
1457
+ .filter((elm) => isHTMLElement(elm) && has(elm, 'tox-silver-sink'));
1458
+ const fullscreenRoot = getFullscreenRoot(editor);
1459
+ const fullscreenInfo = fullscreenState.get();
1460
+ const editorBody = SugarElement.fromDom(editor.getBody());
1461
+ const isTouch = global$1.deviceType.isTouch();
1462
+ const editorContainerStyle = editorContainer.style;
1463
+ const iframe = editor.iframeElement;
1464
+ const iframeStyle = iframe === null || iframe === void 0 ? void 0 : iframe.style;
1465
+ const handleClasses = (handler) => {
1466
+ handler(body, 'tox-fullscreen');
1467
+ handler(documentElement, 'tox-fullscreen');
1468
+ handler(editorContainer, 'tox-fullscreen');
1469
+ getShadowRoot(editorContainerS)
1470
+ .map((root) => getShadowHost(root).dom)
1471
+ .each((host) => {
1472
+ handler(host, 'tox-fullscreen');
1473
+ handler(host, 'tox-shadowhost');
1474
+ });
1475
+ };
1476
+ const cleanup = () => {
1477
+ if (isTouch) {
1478
+ restoreStyles(editor.dom);
1152
1479
  }
1153
- }
1154
- });
1155
- const newFullScreenInfo = {
1156
- scrollPos: getScrollPos(),
1157
- containerWidth: editorContainerStyle.width,
1158
- containerHeight: editorContainerStyle.height,
1159
- containerTop: editorContainerStyle.top,
1160
- containerLeft: editorContainerStyle.left,
1161
- iframeWidth: iframeStyle.width,
1162
- iframeHeight: iframeStyle.height,
1163
- fullscreenChangeHandler,
1164
- sinkCssPosition: sinkContainerS.map(elm => get$2(elm, 'position'))
1480
+ handleClasses(DOM.removeClass);
1481
+ viewportUpdate.unbind();
1482
+ Optional.from(fullscreenState.get()).each((info) => info.fullscreenChangeHandler.unbind());
1165
1483
  };
1166
- if (isTouch) {
1167
- clobberStyles(editor.dom, editorContainerS, editorBody);
1168
- }
1169
- iframeStyle.width = iframeStyle.height = '100%';
1170
- editorContainerStyle.width = editorContainerStyle.height = '';
1171
- handleClasses(DOM.addClass);
1172
- sinkContainerS.each(elm => {
1173
- set(elm, 'position', 'fixed');
1174
- });
1175
- viewportUpdate.bind(editorContainerS);
1176
- editor.on('remove', cleanup);
1177
- fullscreenState.set(newFullScreenInfo);
1178
- if (getFullscreenNative(editor)) {
1179
- requestFullscreen(fullscreenRoot);
1180
- }
1181
- fireFullscreenStateChanged(editor, true);
1182
- } else {
1183
- fullscreenInfo.fullscreenChangeHandler.unbind();
1184
- if (getFullscreenNative(editor) && isFullscreenElement(fullscreenRoot)) {
1185
- exitFullscreen(owner(fullscreenRoot));
1186
- }
1187
- iframeStyle.width = fullscreenInfo.iframeWidth;
1188
- iframeStyle.height = fullscreenInfo.iframeHeight;
1189
- editorContainerStyle.width = fullscreenInfo.containerWidth;
1190
- editorContainerStyle.height = fullscreenInfo.containerHeight;
1191
- editorContainerStyle.top = fullscreenInfo.containerTop;
1192
- editorContainerStyle.left = fullscreenInfo.containerLeft;
1193
- lift2(sinkContainerS, fullscreenInfo.sinkCssPosition, (elm, val) => {
1194
- set(elm, 'position', val);
1195
- });
1196
- cleanup();
1197
- setScrollPos(fullscreenInfo.scrollPos);
1198
- fullscreenState.set(null);
1199
- fireFullscreenStateChanged(editor, false);
1200
- editor.off('remove', cleanup);
1201
- }
1484
+ if (!fullscreenInfo) {
1485
+ const fullscreenChangeHandler = bind$1(owner(fullscreenRoot), getFullscreenchangeEventName(), (_evt) => {
1486
+ if (getFullscreenNative(editor)) {
1487
+ // if we have exited browser fullscreen with Escape then exit editor fullscreen too
1488
+ if (!isFullscreenElement(fullscreenRoot) && fullscreenState.get() !== null) {
1489
+ toggleFullscreen(editor, fullscreenState);
1490
+ }
1491
+ }
1492
+ });
1493
+ const newFullScreenInfo = {
1494
+ scrollPos: getScrollPos(),
1495
+ containerWidth: editorContainerStyle.width,
1496
+ containerHeight: editorContainerStyle.height,
1497
+ containerTop: editorContainerStyle.top,
1498
+ containerLeft: editorContainerStyle.left,
1499
+ iframeWidth: iframeStyle.width,
1500
+ iframeHeight: iframeStyle.height,
1501
+ fullscreenChangeHandler,
1502
+ sinkCssPosition: sinkContainerS.map((elm) => get$2(elm, 'position'))
1503
+ };
1504
+ if (isTouch) {
1505
+ clobberStyles(editor.dom, editorContainerS, editorBody);
1506
+ }
1507
+ iframeStyle.width = iframeStyle.height = '100%';
1508
+ editorContainerStyle.width = editorContainerStyle.height = '';
1509
+ handleClasses(DOM.addClass);
1510
+ sinkContainerS.each((elm) => {
1511
+ set(elm, 'position', 'fixed');
1512
+ });
1513
+ viewportUpdate.bind(editorContainerS);
1514
+ editor.on('remove', cleanup);
1515
+ fullscreenState.set(newFullScreenInfo);
1516
+ if (getFullscreenNative(editor)) {
1517
+ requestFullscreen(fullscreenRoot);
1518
+ }
1519
+ fireFullscreenStateChanged(editor, true);
1520
+ }
1521
+ else {
1522
+ fullscreenInfo.fullscreenChangeHandler.unbind();
1523
+ if (getFullscreenNative(editor) && isFullscreenElement(fullscreenRoot)) {
1524
+ exitFullscreen(owner(fullscreenRoot));
1525
+ }
1526
+ iframeStyle.width = fullscreenInfo.iframeWidth;
1527
+ iframeStyle.height = fullscreenInfo.iframeHeight;
1528
+ editorContainerStyle.width = fullscreenInfo.containerWidth;
1529
+ editorContainerStyle.height = fullscreenInfo.containerHeight;
1530
+ editorContainerStyle.top = fullscreenInfo.containerTop;
1531
+ editorContainerStyle.left = fullscreenInfo.containerLeft;
1532
+ lift2(sinkContainerS, fullscreenInfo.sinkCssPosition, (elm, val) => {
1533
+ set(elm, 'position', val);
1534
+ });
1535
+ cleanup();
1536
+ setScrollPos(fullscreenInfo.scrollPos);
1537
+ fullscreenState.set(null);
1538
+ fireFullscreenStateChanged(editor, false);
1539
+ editor.off('remove', cleanup);
1540
+ }
1202
1541
  };
1203
1542
 
1204
1543
  const register$1 = (editor, fullscreenState) => {
1205
- editor.addCommand('mceFullScreen', () => {
1206
- toggleFullscreen(editor, fullscreenState);
1207
- });
1544
+ editor.addCommand('mceFullScreen', () => {
1545
+ toggleFullscreen(editor, fullscreenState);
1546
+ });
1208
1547
  };
1209
1548
 
1210
- const makeSetupHandler = (editor, fullscreenState) => api => {
1211
- api.setActive(fullscreenState.get() !== null);
1212
- const editorEventCallback = e => api.setActive(e.state);
1213
- editor.on('FullscreenStateChanged', editorEventCallback);
1214
- return () => editor.off('FullscreenStateChanged', editorEventCallback);
1549
+ var global = tinymce.util.Tools.resolve('tinymce.util.VK');
1550
+
1551
+ const setup = (editor, fullscreenState) => {
1552
+ editor.on('init', () => {
1553
+ editor.on('keydown', (e) => {
1554
+ if (e.keyCode === global.TAB && !(e.metaKey || e.ctrlKey) && fullscreenState.get()) {
1555
+ e.preventDefault();
1556
+ }
1557
+ });
1558
+ });
1559
+ };
1560
+
1561
+ const makeSetupHandler = (editor, fullscreenState) => (api) => {
1562
+ api.setActive(fullscreenState.get() !== null);
1563
+ const editorEventCallback = (e) => api.setActive(e.state);
1564
+ editor.on('FullscreenStateChanged', editorEventCallback);
1565
+ return () => editor.off('FullscreenStateChanged', editorEventCallback);
1215
1566
  };
1216
1567
  const register = (editor, fullscreenState) => {
1217
- const onAction = () => editor.execCommand('mceFullScreen');
1218
- editor.ui.registry.addToggleMenuItem('fullscreen', {
1219
- text: 'Fullscreen',
1220
- icon: 'fullscreen',
1221
- shortcut: 'Meta+Shift+F',
1222
- onAction,
1223
- onSetup: makeSetupHandler(editor, fullscreenState)
1224
- });
1225
- editor.ui.registry.addToggleButton('fullscreen', {
1226
- tooltip: 'Fullscreen',
1227
- icon: 'fullscreen',
1228
- onAction,
1229
- onSetup: makeSetupHandler(editor, fullscreenState)
1230
- });
1568
+ const onAction = () => editor.execCommand('mceFullScreen');
1569
+ editor.ui.registry.addToggleMenuItem('fullscreen', {
1570
+ text: 'Fullscreen',
1571
+ icon: 'fullscreen',
1572
+ shortcut: 'Meta+Shift+F',
1573
+ onAction,
1574
+ onSetup: makeSetupHandler(editor, fullscreenState),
1575
+ context: 'any'
1576
+ });
1577
+ editor.ui.registry.addToggleButton('fullscreen', {
1578
+ tooltip: 'Fullscreen',
1579
+ icon: 'fullscreen',
1580
+ onAction,
1581
+ onSetup: makeSetupHandler(editor, fullscreenState),
1582
+ shortcut: 'Meta+Shift+F',
1583
+ context: 'any'
1584
+ });
1231
1585
  };
1232
1586
 
1233
1587
  var Plugin = () => {
1234
- global$2.add('fullscreen', editor => {
1235
- const fullscreenState = Cell(null);
1236
- if (editor.inline) {
1237
- return get$5(fullscreenState);
1238
- }
1239
- register$2(editor);
1240
- register$1(editor, fullscreenState);
1241
- register(editor, fullscreenState);
1242
- editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen');
1243
- return get$5(fullscreenState);
1244
- });
1588
+ global$3.add('fullscreen', (editor) => {
1589
+ const fullscreenState = Cell(null);
1590
+ if (editor.inline) {
1591
+ return get$4(fullscreenState);
1592
+ }
1593
+ register$2(editor);
1594
+ register$1(editor, fullscreenState);
1595
+ register(editor, fullscreenState);
1596
+ setup(editor, fullscreenState);
1597
+ editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen');
1598
+ return get$4(fullscreenState);
1599
+ });
1245
1600
  };
1246
1601
 
1247
1602
  Plugin();
1603
+ /** *****
1604
+ * DO NOT EXPORT ANYTHING
1605
+ *
1606
+ * IF YOU DO ROLLUP WILL LEAVE A GLOBAL ON THE PAGE
1607
+ *******/
1248
1608
 
1249
1609
  })();