Rev 1042 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
597 | daniel-mar | 1 | /** |
2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. |
||
3 | * Licensed under the LGPL or a commercial license. |
||
4 | * For LGPL see License.txt in the project root for license information. |
||
5 | * For commercial licenses see https://www.tiny.cloud/ |
||
6 | * |
||
1422 | daniel-mar | 7 | * Version: 5.10.8 (2023-10-19) |
597 | daniel-mar | 8 | */ |
9 | (function () { |
||
10 | 'use strict'; |
||
11 | |||
12 | var __assign = function () { |
||
13 | __assign = Object.assign || function __assign(t) { |
||
14 | for (var s, i = 1, n = arguments.length; i < n; i++) { |
||
15 | s = arguments[i]; |
||
16 | for (var p in s) |
||
17 | if (Object.prototype.hasOwnProperty.call(s, p)) |
||
18 | t[p] = s[p]; |
||
19 | } |
||
20 | return t; |
||
21 | }; |
||
22 | return __assign.apply(this, arguments); |
||
23 | }; |
||
24 | function __rest(s, e) { |
||
25 | var t = {}; |
||
26 | for (var p in s) |
||
27 | if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) |
||
28 | t[p] = s[p]; |
||
29 | if (s != null && typeof Object.getOwnPropertySymbols === 'function') |
||
30 | for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { |
||
31 | if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) |
||
32 | t[p[i]] = s[p[i]]; |
||
33 | } |
||
34 | return t; |
||
35 | } |
||
637 | daniel-mar | 36 | function __spreadArray(to, from, pack) { |
37 | if (pack || arguments.length === 2) |
||
38 | for (var i = 0, l = from.length, ar; i < l; i++) { |
||
39 | if (ar || !(i in from)) { |
||
40 | if (!ar) |
||
41 | ar = Array.prototype.slice.call(from, 0, i); |
||
42 | ar[i] = from[i]; |
||
43 | } |
||
44 | } |
||
45 | return to.concat(ar || Array.prototype.slice.call(from)); |
||
597 | daniel-mar | 46 | } |
47 | |||
48 | var typeOf = function (x) { |
||
49 | var t = typeof x; |
||
50 | if (x === null) { |
||
51 | return 'null'; |
||
52 | } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { |
||
53 | return 'array'; |
||
54 | } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { |
||
55 | return 'string'; |
||
56 | } else { |
||
57 | return t; |
||
58 | } |
||
59 | }; |
||
637 | daniel-mar | 60 | var isType$1 = function (type) { |
597 | daniel-mar | 61 | return function (value) { |
62 | return typeOf(value) === type; |
||
63 | }; |
||
64 | }; |
||
65 | var isSimpleType = function (type) { |
||
66 | return function (value) { |
||
67 | return typeof value === type; |
||
68 | }; |
||
69 | }; |
||
637 | daniel-mar | 70 | var eq$1 = function (t) { |
71 | return function (a) { |
||
72 | return t === a; |
||
73 | }; |
||
74 | }; |
||
75 | var isString = isType$1('string'); |
||
76 | var isObject = isType$1('object'); |
||
77 | var isArray = isType$1('array'); |
||
78 | var isNull = eq$1(null); |
||
597 | daniel-mar | 79 | var isBoolean = isSimpleType('boolean'); |
637 | daniel-mar | 80 | var isUndefined = eq$1(undefined); |
597 | daniel-mar | 81 | var isNullable = function (a) { |
82 | return a === null || a === undefined; |
||
83 | }; |
||
84 | var isNonNullable = function (a) { |
||
85 | return !isNullable(a); |
||
86 | }; |
||
87 | var isFunction = isSimpleType('function'); |
||
88 | var isNumber = isSimpleType('number'); |
||
89 | |||
90 | var noop = function () { |
||
91 | }; |
||
92 | var compose = function (fa, fb) { |
||
93 | return function () { |
||
94 | var args = []; |
||
95 | for (var _i = 0; _i < arguments.length; _i++) { |
||
96 | args[_i] = arguments[_i]; |
||
97 | } |
||
98 | return fa(fb.apply(null, args)); |
||
99 | }; |
||
100 | }; |
||
101 | var compose1 = function (fbc, fab) { |
||
102 | return function (a) { |
||
103 | return fbc(fab(a)); |
||
104 | }; |
||
105 | }; |
||
637 | daniel-mar | 106 | var constant$1 = function (value) { |
597 | daniel-mar | 107 | return function () { |
108 | return value; |
||
109 | }; |
||
110 | }; |
||
111 | var identity = function (x) { |
||
112 | return x; |
||
113 | }; |
||
637 | daniel-mar | 114 | var tripleEquals = function (a, b) { |
115 | return a === b; |
||
116 | }; |
||
597 | daniel-mar | 117 | function curry(fn) { |
118 | var initialArgs = []; |
||
119 | for (var _i = 1; _i < arguments.length; _i++) { |
||
120 | initialArgs[_i - 1] = arguments[_i]; |
||
121 | } |
||
122 | return function () { |
||
123 | var restArgs = []; |
||
124 | for (var _i = 0; _i < arguments.length; _i++) { |
||
125 | restArgs[_i] = arguments[_i]; |
||
126 | } |
||
127 | var all = initialArgs.concat(restArgs); |
||
128 | return fn.apply(null, all); |
||
129 | }; |
||
130 | } |
||
131 | var not = function (f) { |
||
132 | return function (t) { |
||
133 | return !f(t); |
||
134 | }; |
||
135 | }; |
||
136 | var die = function (msg) { |
||
137 | return function () { |
||
138 | throw new Error(msg); |
||
139 | }; |
||
140 | }; |
||
637 | daniel-mar | 141 | var apply$1 = function (f) { |
597 | daniel-mar | 142 | return f(); |
143 | }; |
||
637 | daniel-mar | 144 | var never = constant$1(false); |
145 | var always = constant$1(true); |
||
597 | daniel-mar | 146 | |
147 | var none = function () { |
||
148 | return NONE; |
||
149 | }; |
||
150 | var NONE = function () { |
||
151 | var call = function (thunk) { |
||
152 | return thunk(); |
||
153 | }; |
||
637 | daniel-mar | 154 | var id = identity; |
597 | daniel-mar | 155 | var me = { |
156 | fold: function (n, _s) { |
||
157 | return n(); |
||
158 | }, |
||
159 | isSome: never, |
||
160 | isNone: always, |
||
161 | getOr: id, |
||
162 | getOrThunk: call, |
||
163 | getOrDie: function (msg) { |
||
164 | throw new Error(msg || 'error: getOrDie called on none.'); |
||
165 | }, |
||
637 | daniel-mar | 166 | getOrNull: constant$1(null), |
167 | getOrUndefined: constant$1(undefined), |
||
597 | daniel-mar | 168 | or: id, |
169 | orThunk: call, |
||
170 | map: none, |
||
171 | each: noop, |
||
172 | bind: none, |
||
173 | exists: never, |
||
174 | forall: always, |
||
637 | daniel-mar | 175 | filter: function () { |
176 | return none(); |
||
177 | }, |
||
597 | daniel-mar | 178 | toArray: function () { |
179 | return []; |
||
180 | }, |
||
637 | daniel-mar | 181 | toString: constant$1('none()') |
597 | daniel-mar | 182 | }; |
183 | return me; |
||
184 | }(); |
||
185 | var some = function (a) { |
||
637 | daniel-mar | 186 | var constant_a = constant$1(a); |
597 | daniel-mar | 187 | var self = function () { |
188 | return me; |
||
189 | }; |
||
190 | var bind = function (f) { |
||
191 | return f(a); |
||
192 | }; |
||
193 | var me = { |
||
194 | fold: function (n, s) { |
||
195 | return s(a); |
||
196 | }, |
||
197 | isSome: always, |
||
198 | isNone: never, |
||
199 | getOr: constant_a, |
||
200 | getOrThunk: constant_a, |
||
201 | getOrDie: constant_a, |
||
202 | getOrNull: constant_a, |
||
203 | getOrUndefined: constant_a, |
||
204 | or: self, |
||
205 | orThunk: self, |
||
206 | map: function (f) { |
||
207 | return some(f(a)); |
||
208 | }, |
||
209 | each: function (f) { |
||
210 | f(a); |
||
211 | }, |
||
212 | bind: bind, |
||
213 | exists: bind, |
||
214 | forall: bind, |
||
215 | filter: function (f) { |
||
216 | return f(a) ? me : NONE; |
||
217 | }, |
||
218 | toArray: function () { |
||
219 | return [a]; |
||
220 | }, |
||
221 | toString: function () { |
||
222 | return 'some(' + a + ')'; |
||
223 | } |
||
224 | }; |
||
225 | return me; |
||
226 | }; |
||
227 | var from = function (value) { |
||
228 | return value === null || value === undefined ? NONE : some(value); |
||
229 | }; |
||
230 | var Optional = { |
||
231 | some: some, |
||
232 | none: none, |
||
233 | from: from |
||
234 | }; |
||
235 | |||
637 | daniel-mar | 236 | var cached = function (f) { |
237 | var called = false; |
||
238 | var r; |
||
239 | return function () { |
||
240 | var args = []; |
||
241 | for (var _i = 0; _i < arguments.length; _i++) { |
||
242 | args[_i] = arguments[_i]; |
||
243 | } |
||
244 | if (!called) { |
||
245 | called = true; |
||
246 | r = f.apply(null, args); |
||
247 | } |
||
248 | return r; |
||
249 | }; |
||
250 | }; |
||
251 | |||
252 | var DeviceType = function (os, browser, userAgent, mediaMatch) { |
||
253 | var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; |
||
254 | var isiPhone = os.isiOS() && !isiPad; |
||
255 | var isMobile = os.isiOS() || os.isAndroid(); |
||
256 | var isTouch = isMobile || mediaMatch('(pointer:coarse)'); |
||
257 | var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); |
||
258 | var isPhone = isiPhone || isMobile && !isTablet; |
||
259 | var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; |
||
260 | var isDesktop = !isPhone && !isTablet && !iOSwebview; |
||
261 | return { |
||
262 | isiPad: constant$1(isiPad), |
||
263 | isiPhone: constant$1(isiPhone), |
||
264 | isTablet: constant$1(isTablet), |
||
265 | isPhone: constant$1(isPhone), |
||
266 | isTouch: constant$1(isTouch), |
||
267 | isAndroid: os.isAndroid, |
||
268 | isiOS: os.isiOS, |
||
269 | isWebView: constant$1(iOSwebview), |
||
270 | isDesktop: constant$1(isDesktop) |
||
271 | }; |
||
272 | }; |
||
273 | |||
597 | daniel-mar | 274 | var nativeSlice = Array.prototype.slice; |
275 | var nativeIndexOf = Array.prototype.indexOf; |
||
276 | var nativePush = Array.prototype.push; |
||
277 | var rawIndexOf = function (ts, t) { |
||
278 | return nativeIndexOf.call(ts, t); |
||
279 | }; |
||
637 | daniel-mar | 280 | var contains$1 = function (xs, x) { |
597 | daniel-mar | 281 | return rawIndexOf(xs, x) > -1; |
282 | }; |
||
283 | var exists = function (xs, pred) { |
||
284 | for (var i = 0, len = xs.length; i < len; i++) { |
||
285 | var x = xs[i]; |
||
286 | if (pred(x, i)) { |
||
287 | return true; |
||
288 | } |
||
289 | } |
||
290 | return false; |
||
291 | }; |
||
637 | daniel-mar | 292 | var map$2 = function (xs, f) { |
597 | daniel-mar | 293 | var len = xs.length; |
294 | var r = new Array(len); |
||
295 | for (var i = 0; i < len; i++) { |
||
296 | var x = xs[i]; |
||
297 | r[i] = f(x, i); |
||
298 | } |
||
299 | return r; |
||
300 | }; |
||
637 | daniel-mar | 301 | var each$1 = function (xs, f) { |
597 | daniel-mar | 302 | for (var i = 0, len = xs.length; i < len; i++) { |
303 | var x = xs[i]; |
||
304 | f(x, i); |
||
305 | } |
||
306 | }; |
||
307 | var eachr = function (xs, f) { |
||
308 | for (var i = xs.length - 1; i >= 0; i--) { |
||
309 | var x = xs[i]; |
||
310 | f(x, i); |
||
311 | } |
||
312 | }; |
||
637 | daniel-mar | 313 | var filter$2 = function (xs, pred) { |
597 | daniel-mar | 314 | var r = []; |
315 | for (var i = 0, len = xs.length; i < len; i++) { |
||
316 | var x = xs[i]; |
||
317 | if (pred(x, i)) { |
||
318 | r.push(x); |
||
319 | } |
||
320 | } |
||
321 | return r; |
||
322 | }; |
||
323 | var foldr = function (xs, f, acc) { |
||
637 | daniel-mar | 324 | eachr(xs, function (x, i) { |
325 | acc = f(acc, x, i); |
||
597 | daniel-mar | 326 | }); |
327 | return acc; |
||
328 | }; |
||
329 | var foldl = function (xs, f, acc) { |
||
637 | daniel-mar | 330 | each$1(xs, function (x, i) { |
331 | acc = f(acc, x, i); |
||
597 | daniel-mar | 332 | }); |
333 | return acc; |
||
334 | }; |
||
335 | var findUntil = function (xs, pred, until) { |
||
336 | for (var i = 0, len = xs.length; i < len; i++) { |
||
337 | var x = xs[i]; |
||
338 | if (pred(x, i)) { |
||
339 | return Optional.some(x); |
||
340 | } else if (until(x, i)) { |
||
341 | break; |
||
342 | } |
||
343 | } |
||
344 | return Optional.none(); |
||
345 | }; |
||
637 | daniel-mar | 346 | var find$2 = function (xs, pred) { |
597 | daniel-mar | 347 | return findUntil(xs, pred, never); |
348 | }; |
||
637 | daniel-mar | 349 | var findIndex$1 = function (xs, pred) { |
597 | daniel-mar | 350 | for (var i = 0, len = xs.length; i < len; i++) { |
351 | var x = xs[i]; |
||
352 | if (pred(x, i)) { |
||
353 | return Optional.some(i); |
||
354 | } |
||
355 | } |
||
356 | return Optional.none(); |
||
357 | }; |
||
358 | var flatten = function (xs) { |
||
359 | var r = []; |
||
360 | for (var i = 0, len = xs.length; i < len; ++i) { |
||
361 | if (!isArray(xs[i])) { |
||
362 | throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); |
||
363 | } |
||
364 | nativePush.apply(r, xs[i]); |
||
365 | } |
||
366 | return r; |
||
367 | }; |
||
637 | daniel-mar | 368 | var bind$3 = function (xs, f) { |
369 | return flatten(map$2(xs, f)); |
||
597 | daniel-mar | 370 | }; |
371 | var forall = function (xs, pred) { |
||
372 | for (var i = 0, len = xs.length; i < len; ++i) { |
||
373 | var x = xs[i]; |
||
374 | if (pred(x, i) !== true) { |
||
375 | return false; |
||
376 | } |
||
377 | } |
||
378 | return true; |
||
379 | }; |
||
380 | var reverse = function (xs) { |
||
381 | var r = nativeSlice.call(xs, 0); |
||
382 | r.reverse(); |
||
383 | return r; |
||
384 | }; |
||
385 | var difference = function (a1, a2) { |
||
637 | daniel-mar | 386 | return filter$2(a1, function (x) { |
387 | return !contains$1(a2, x); |
||
597 | daniel-mar | 388 | }); |
389 | }; |
||
637 | daniel-mar | 390 | var pure$2 = function (x) { |
597 | daniel-mar | 391 | return [x]; |
392 | }; |
||
393 | var sort = function (xs, comparator) { |
||
394 | var copy = nativeSlice.call(xs, 0); |
||
395 | copy.sort(comparator); |
||
396 | return copy; |
||
397 | }; |
||
637 | daniel-mar | 398 | var get$d = function (xs, i) { |
597 | daniel-mar | 399 | return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); |
400 | }; |
||
401 | var head = function (xs) { |
||
637 | daniel-mar | 402 | return get$d(xs, 0); |
597 | daniel-mar | 403 | }; |
404 | var findMap = function (arr, f) { |
||
405 | for (var i = 0; i < arr.length; i++) { |
||
406 | var r = f(arr[i], i); |
||
407 | if (r.isSome()) { |
||
408 | return r; |
||
409 | } |
||
410 | } |
||
411 | return Optional.none(); |
||
412 | }; |
||
413 | |||
414 | var firstMatch = function (regexes, s) { |
||
415 | for (var i = 0; i < regexes.length; i++) { |
||
416 | var x = regexes[i]; |
||
417 | if (x.test(s)) { |
||
418 | return x; |
||
419 | } |
||
420 | } |
||
421 | return undefined; |
||
422 | }; |
||
423 | var find$1 = function (regexes, agent) { |
||
424 | var r = firstMatch(regexes, agent); |
||
425 | if (!r) { |
||
426 | return { |
||
427 | major: 0, |
||
428 | minor: 0 |
||
429 | }; |
||
430 | } |
||
431 | var group = function (i) { |
||
432 | return Number(agent.replace(r, '$' + i)); |
||
433 | }; |
||
637 | daniel-mar | 434 | return nu$8(group(1), group(2)); |
597 | daniel-mar | 435 | }; |
637 | daniel-mar | 436 | var detect$4 = function (versionRegexes, agent) { |
597 | daniel-mar | 437 | var cleanedAgent = String(agent).toLowerCase(); |
438 | if (versionRegexes.length === 0) { |
||
637 | daniel-mar | 439 | return unknown$3(); |
597 | daniel-mar | 440 | } |
441 | return find$1(versionRegexes, cleanedAgent); |
||
442 | }; |
||
637 | daniel-mar | 443 | var unknown$3 = function () { |
444 | return nu$8(0, 0); |
||
597 | daniel-mar | 445 | }; |
637 | daniel-mar | 446 | var nu$8 = function (major, minor) { |
597 | daniel-mar | 447 | return { |
448 | major: major, |
||
449 | minor: minor |
||
450 | }; |
||
451 | }; |
||
452 | var Version = { |
||
637 | daniel-mar | 453 | nu: nu$8, |
454 | detect: detect$4, |
||
455 | unknown: unknown$3 |
||
597 | daniel-mar | 456 | }; |
457 | |||
637 | daniel-mar | 458 | var detectBrowser$1 = function (browsers, userAgentData) { |
459 | return findMap(userAgentData.brands, function (uaBrand) { |
||
460 | var lcBrand = uaBrand.brand.toLowerCase(); |
||
461 | return find$2(browsers, function (browser) { |
||
462 | var _a; |
||
463 | return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); |
||
464 | }).map(function (info) { |
||
465 | return { |
||
466 | current: info.name, |
||
467 | version: Version.nu(parseInt(uaBrand.version, 10), 0) |
||
468 | }; |
||
469 | }); |
||
470 | }); |
||
471 | }; |
||
472 | |||
473 | var detect$3 = function (candidates, userAgent) { |
||
597 | daniel-mar | 474 | var agent = String(userAgent).toLowerCase(); |
637 | daniel-mar | 475 | return find$2(candidates, function (candidate) { |
597 | daniel-mar | 476 | return candidate.search(agent); |
477 | }); |
||
478 | }; |
||
479 | var detectBrowser = function (browsers, userAgent) { |
||
637 | daniel-mar | 480 | return detect$3(browsers, userAgent).map(function (browser) { |
597 | daniel-mar | 481 | var version = Version.detect(browser.versionRegexes, userAgent); |
482 | return { |
||
483 | current: browser.name, |
||
484 | version: version |
||
485 | }; |
||
486 | }); |
||
487 | }; |
||
488 | var detectOs = function (oses, userAgent) { |
||
637 | daniel-mar | 489 | return detect$3(oses, userAgent).map(function (os) { |
597 | daniel-mar | 490 | var version = Version.detect(os.versionRegexes, userAgent); |
491 | return { |
||
492 | current: os.name, |
||
493 | version: version |
||
494 | }; |
||
495 | }); |
||
496 | }; |
||
497 | |||
498 | var checkRange = function (str, substr, start) { |
||
499 | return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; |
||
500 | }; |
||
501 | var supplant = function (str, obj) { |
||
502 | var isStringOrNumber = function (a) { |
||
503 | var t = typeof a; |
||
504 | return t === 'string' || t === 'number'; |
||
505 | }; |
||
506 | return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) { |
||
507 | var value = obj[key]; |
||
508 | return isStringOrNumber(value) ? value.toString() : fullMatch; |
||
509 | }); |
||
510 | }; |
||
637 | daniel-mar | 511 | var contains = function (str, substr) { |
597 | daniel-mar | 512 | return str.indexOf(substr) !== -1; |
513 | }; |
||
514 | var endsWith = function (str, suffix) { |
||
515 | return checkRange(str, suffix, str.length - suffix.length); |
||
516 | }; |
||
517 | var blank = function (r) { |
||
518 | return function (s) { |
||
519 | return s.replace(r, ''); |
||
520 | }; |
||
521 | }; |
||
522 | var trim = blank(/^\s+|\s+$/g); |
||
523 | |||
524 | var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; |
||
525 | var checkContains = function (target) { |
||
526 | return function (uastring) { |
||
637 | daniel-mar | 527 | return contains(uastring, target); |
597 | daniel-mar | 528 | }; |
529 | }; |
||
530 | var browsers = [ |
||
531 | { |
||
532 | name: 'Edge', |
||
533 | versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], |
||
534 | search: function (uastring) { |
||
637 | daniel-mar | 535 | return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); |
597 | daniel-mar | 536 | } |
537 | }, |
||
538 | { |
||
539 | name: 'Chrome', |
||
637 | daniel-mar | 540 | brand: 'Chromium', |
597 | daniel-mar | 541 | versionRegexes: [ |
542 | /.*?chrome\/([0-9]+)\.([0-9]+).*/, |
||
543 | normalVersionRegex |
||
544 | ], |
||
545 | search: function (uastring) { |
||
637 | daniel-mar | 546 | return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); |
597 | daniel-mar | 547 | } |
548 | }, |
||
549 | { |
||
550 | name: 'IE', |
||
551 | versionRegexes: [ |
||
552 | /.*?msie\ ?([0-9]+)\.([0-9]+).*/, |
||
553 | /.*?rv:([0-9]+)\.([0-9]+).*/ |
||
554 | ], |
||
555 | search: function (uastring) { |
||
637 | daniel-mar | 556 | return contains(uastring, 'msie') || contains(uastring, 'trident'); |
597 | daniel-mar | 557 | } |
558 | }, |
||
559 | { |
||
560 | name: 'Opera', |
||
561 | versionRegexes: [ |
||
562 | normalVersionRegex, |
||
563 | /.*?opera\/([0-9]+)\.([0-9]+).*/ |
||
564 | ], |
||
565 | search: checkContains('opera') |
||
566 | }, |
||
567 | { |
||
568 | name: 'Firefox', |
||
569 | versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], |
||
570 | search: checkContains('firefox') |
||
571 | }, |
||
572 | { |
||
573 | name: 'Safari', |
||
574 | versionRegexes: [ |
||
575 | normalVersionRegex, |
||
576 | /.*?cpu os ([0-9]+)_([0-9]+).*/ |
||
577 | ], |
||
578 | search: function (uastring) { |
||
637 | daniel-mar | 579 | return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); |
597 | daniel-mar | 580 | } |
581 | } |
||
582 | ]; |
||
583 | var oses = [ |
||
584 | { |
||
585 | name: 'Windows', |
||
586 | search: checkContains('win'), |
||
587 | versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] |
||
588 | }, |
||
589 | { |
||
590 | name: 'iOS', |
||
591 | search: function (uastring) { |
||
637 | daniel-mar | 592 | return contains(uastring, 'iphone') || contains(uastring, 'ipad'); |
597 | daniel-mar | 593 | }, |
594 | versionRegexes: [ |
||
595 | /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, |
||
596 | /.*cpu os ([0-9]+)_([0-9]+).*/, |
||
597 | /.*cpu iphone os ([0-9]+)_([0-9]+).*/ |
||
598 | ] |
||
599 | }, |
||
600 | { |
||
601 | name: 'Android', |
||
602 | search: checkContains('android'), |
||
603 | versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] |
||
604 | }, |
||
605 | { |
||
606 | name: 'OSX', |
||
607 | search: checkContains('mac os x'), |
||
608 | versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] |
||
609 | }, |
||
610 | { |
||
611 | name: 'Linux', |
||
612 | search: checkContains('linux'), |
||
613 | versionRegexes: [] |
||
614 | }, |
||
615 | { |
||
616 | name: 'Solaris', |
||
617 | search: checkContains('sunos'), |
||
618 | versionRegexes: [] |
||
619 | }, |
||
620 | { |
||
621 | name: 'FreeBSD', |
||
622 | search: checkContains('freebsd'), |
||
623 | versionRegexes: [] |
||
624 | }, |
||
625 | { |
||
626 | name: 'ChromeOS', |
||
627 | search: checkContains('cros'), |
||
628 | versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] |
||
629 | } |
||
630 | ]; |
||
631 | var PlatformInfo = { |
||
637 | daniel-mar | 632 | browsers: constant$1(browsers), |
633 | oses: constant$1(oses) |
||
597 | daniel-mar | 634 | }; |
635 | |||
636 | var edge = 'Edge'; |
||
637 | var chrome = 'Chrome'; |
||
638 | var ie = 'IE'; |
||
639 | var opera = 'Opera'; |
||
640 | var firefox = 'Firefox'; |
||
641 | var safari = 'Safari'; |
||
637 | daniel-mar | 642 | var unknown$2 = function () { |
643 | return nu$7({ |
||
597 | daniel-mar | 644 | current: undefined, |
645 | version: Version.unknown() |
||
646 | }); |
||
647 | }; |
||
637 | daniel-mar | 648 | var nu$7 = function (info) { |
597 | daniel-mar | 649 | var current = info.current; |
650 | var version = info.version; |
||
651 | var isBrowser = function (name) { |
||
652 | return function () { |
||
653 | return current === name; |
||
654 | }; |
||
655 | }; |
||
656 | return { |
||
657 | current: current, |
||
658 | version: version, |
||
659 | isEdge: isBrowser(edge), |
||
660 | isChrome: isBrowser(chrome), |
||
661 | isIE: isBrowser(ie), |
||
662 | isOpera: isBrowser(opera), |
||
663 | isFirefox: isBrowser(firefox), |
||
664 | isSafari: isBrowser(safari) |
||
665 | }; |
||
666 | }; |
||
667 | var Browser = { |
||
637 | daniel-mar | 668 | unknown: unknown$2, |
669 | nu: nu$7, |
||
670 | edge: constant$1(edge), |
||
671 | chrome: constant$1(chrome), |
||
672 | ie: constant$1(ie), |
||
673 | opera: constant$1(opera), |
||
674 | firefox: constant$1(firefox), |
||
675 | safari: constant$1(safari) |
||
597 | daniel-mar | 676 | }; |
677 | |||
678 | var windows = 'Windows'; |
||
679 | var ios = 'iOS'; |
||
680 | var android = 'Android'; |
||
681 | var linux = 'Linux'; |
||
682 | var osx = 'OSX'; |
||
683 | var solaris = 'Solaris'; |
||
684 | var freebsd = 'FreeBSD'; |
||
685 | var chromeos = 'ChromeOS'; |
||
637 | daniel-mar | 686 | var unknown$1 = function () { |
687 | return nu$6({ |
||
597 | daniel-mar | 688 | current: undefined, |
689 | version: Version.unknown() |
||
690 | }); |
||
691 | }; |
||
637 | daniel-mar | 692 | var nu$6 = function (info) { |
597 | daniel-mar | 693 | var current = info.current; |
694 | var version = info.version; |
||
695 | var isOS = function (name) { |
||
696 | return function () { |
||
697 | return current === name; |
||
698 | }; |
||
699 | }; |
||
700 | return { |
||
701 | current: current, |
||
702 | version: version, |
||
703 | isWindows: isOS(windows), |
||
704 | isiOS: isOS(ios), |
||
705 | isAndroid: isOS(android), |
||
706 | isOSX: isOS(osx), |
||
707 | isLinux: isOS(linux), |
||
708 | isSolaris: isOS(solaris), |
||
709 | isFreeBSD: isOS(freebsd), |
||
710 | isChromeOS: isOS(chromeos) |
||
711 | }; |
||
712 | }; |
||
713 | var OperatingSystem = { |
||
637 | daniel-mar | 714 | unknown: unknown$1, |
715 | nu: nu$6, |
||
716 | windows: constant$1(windows), |
||
717 | ios: constant$1(ios), |
||
718 | android: constant$1(android), |
||
719 | linux: constant$1(linux), |
||
720 | osx: constant$1(osx), |
||
721 | solaris: constant$1(solaris), |
||
722 | freebsd: constant$1(freebsd), |
||
723 | chromeos: constant$1(chromeos) |
||
597 | daniel-mar | 724 | }; |
725 | |||
637 | daniel-mar | 726 | var detect$2 = function (userAgent, userAgentDataOpt, mediaMatch) { |
597 | daniel-mar | 727 | var browsers = PlatformInfo.browsers(); |
728 | var oses = PlatformInfo.oses(); |
||
637 | daniel-mar | 729 | var browser = userAgentDataOpt.bind(function (userAgentData) { |
730 | return detectBrowser$1(browsers, userAgentData); |
||
731 | }).orThunk(function () { |
||
732 | return detectBrowser(browsers, userAgent); |
||
733 | }).fold(Browser.unknown, Browser.nu); |
||
734 | var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); |
||
597 | daniel-mar | 735 | var deviceType = DeviceType(os, browser, userAgent, mediaMatch); |
736 | return { |
||
737 | browser: browser, |
||
738 | os: os, |
||
739 | deviceType: deviceType |
||
740 | }; |
||
741 | }; |
||
742 | var PlatformDetection = { detect: detect$2 }; |
||
743 | |||
744 | var mediaMatch = function (query) { |
||
745 | return window.matchMedia(query).matches; |
||
746 | }; |
||
637 | daniel-mar | 747 | var platform$1 = cached(function () { |
748 | return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch); |
||
597 | daniel-mar | 749 | }); |
637 | daniel-mar | 750 | var detect$1 = function () { |
751 | return platform$1(); |
||
597 | daniel-mar | 752 | }; |
753 | |||
637 | daniel-mar | 754 | var constant = constant$1; |
755 | var touchstart = constant('touchstart'); |
||
756 | var touchmove = constant('touchmove'); |
||
757 | var touchend = constant('touchend'); |
||
758 | var mousedown = constant('mousedown'); |
||
759 | var mousemove = constant('mousemove'); |
||
760 | var mouseup = constant('mouseup'); |
||
761 | var mouseover = constant('mouseover'); |
||
762 | var keydown = constant('keydown'); |
||
763 | var keyup = constant('keyup'); |
||
764 | var input$1 = constant('input'); |
||
765 | var change = constant('change'); |
||
766 | var click = constant('click'); |
||
767 | var transitionend = constant('transitionend'); |
||
768 | var selectstart = constant('selectstart'); |
||
597 | daniel-mar | 769 | |
770 | var prefixName = function (name) { |
||
637 | daniel-mar | 771 | return constant$1('alloy.' + name); |
597 | daniel-mar | 772 | }; |
773 | var alloy = { tap: prefixName('tap') }; |
||
637 | daniel-mar | 774 | var focus$4 = prefixName('focus'); |
597 | daniel-mar | 775 | var postBlur = prefixName('blur.post'); |
776 | var postPaste = prefixName('paste.post'); |
||
637 | daniel-mar | 777 | var receive$1 = prefixName('receive'); |
778 | var execute$5 = prefixName('execute'); |
||
597 | daniel-mar | 779 | var focusItem = prefixName('focus.item'); |
780 | var tap = alloy.tap; |
||
781 | var longpress = prefixName('longpress'); |
||
782 | var systemInit = prefixName('system.init'); |
||
783 | var attachedToDom = prefixName('system.attached'); |
||
784 | var detachedFromDom = prefixName('system.detached'); |
||
785 | var focusShifted = prefixName('focusmanager.shifted'); |
||
637 | daniel-mar | 786 | var highlight$1 = prefixName('highlight'); |
787 | var dehighlight$1 = prefixName('dehighlight'); |
||
597 | daniel-mar | 788 | |
789 | var emit = function (component, event) { |
||
790 | dispatchWith(component, component.element, event, {}); |
||
791 | }; |
||
792 | var emitWith = function (component, event, properties) { |
||
793 | dispatchWith(component, component.element, event, properties); |
||
794 | }; |
||
795 | var emitExecute = function (component) { |
||
637 | daniel-mar | 796 | emit(component, execute$5()); |
597 | daniel-mar | 797 | }; |
798 | var dispatch = function (component, target, event) { |
||
799 | dispatchWith(component, target, event, {}); |
||
800 | }; |
||
801 | var dispatchWith = function (component, target, event, properties) { |
||
802 | var data = __assign({ target: target }, properties); |
||
803 | component.getSystem().triggerEvent(event, target, data); |
||
804 | }; |
||
805 | var dispatchEvent = function (component, target, event, simulatedEvent) { |
||
806 | component.getSystem().triggerEvent(event, target, simulatedEvent.event); |
||
807 | }; |
||
808 | var dispatchFocus = function (component, target) { |
||
809 | component.getSystem().triggerFocus(target, component.element); |
||
810 | }; |
||
811 | |||
812 | var DOCUMENT = 9; |
||
813 | var DOCUMENT_FRAGMENT = 11; |
||
814 | var ELEMENT = 1; |
||
815 | var TEXT = 3; |
||
816 | |||
637 | daniel-mar | 817 | var fromHtml$2 = function (html, scope) { |
597 | daniel-mar | 818 | var doc = scope || document; |
819 | var div = doc.createElement('div'); |
||
820 | div.innerHTML = html; |
||
821 | if (!div.hasChildNodes() || div.childNodes.length > 1) { |
||
822 | console.error('HTML does not have a single root node', html); |
||
823 | throw new Error('HTML must have a single root node'); |
||
824 | } |
||
825 | return fromDom(div.childNodes[0]); |
||
826 | }; |
||
827 | var fromTag = function (tag, scope) { |
||
828 | var doc = scope || document; |
||
829 | var node = doc.createElement(tag); |
||
830 | return fromDom(node); |
||
831 | }; |
||
832 | var fromText = function (text, scope) { |
||
833 | var doc = scope || document; |
||
834 | var node = doc.createTextNode(text); |
||
835 | return fromDom(node); |
||
836 | }; |
||
837 | var fromDom = function (node) { |
||
838 | if (node === null || node === undefined) { |
||
839 | throw new Error('Node cannot be null or undefined'); |
||
840 | } |
||
841 | return { dom: node }; |
||
842 | }; |
||
843 | var fromPoint = function (docElm, x, y) { |
||
844 | return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); |
||
845 | }; |
||
846 | var SugarElement = { |
||
637 | daniel-mar | 847 | fromHtml: fromHtml$2, |
597 | daniel-mar | 848 | fromTag: fromTag, |
849 | fromText: fromText, |
||
850 | fromDom: fromDom, |
||
851 | fromPoint: fromPoint |
||
852 | }; |
||
853 | |||
637 | daniel-mar | 854 | var is$1 = function (element, selector) { |
597 | daniel-mar | 855 | var dom = element.dom; |
856 | if (dom.nodeType !== ELEMENT) { |
||
857 | return false; |
||
858 | } else { |
||
859 | var elem = dom; |
||
860 | if (elem.matches !== undefined) { |
||
861 | return elem.matches(selector); |
||
862 | } else if (elem.msMatchesSelector !== undefined) { |
||
863 | return elem.msMatchesSelector(selector); |
||
864 | } else if (elem.webkitMatchesSelector !== undefined) { |
||
865 | return elem.webkitMatchesSelector(selector); |
||
866 | } else if (elem.mozMatchesSelector !== undefined) { |
||
867 | return elem.mozMatchesSelector(selector); |
||
868 | } else { |
||
869 | throw new Error('Browser lacks native selectors'); |
||
870 | } |
||
871 | } |
||
872 | }; |
||
873 | var bypassSelector = function (dom) { |
||
874 | return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; |
||
875 | }; |
||
637 | daniel-mar | 876 | var all$2 = function (selector, scope) { |
597 | daniel-mar | 877 | var base = scope === undefined ? document : scope.dom; |
637 | daniel-mar | 878 | return bypassSelector(base) ? [] : map$2(base.querySelectorAll(selector), SugarElement.fromDom); |
597 | daniel-mar | 879 | }; |
880 | var one = function (selector, scope) { |
||
881 | var base = scope === undefined ? document : scope.dom; |
||
882 | return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom); |
||
883 | }; |
||
884 | |||
885 | var eq = function (e1, e2) { |
||
886 | return e1.dom === e2.dom; |
||
887 | }; |
||
888 | |||
637 | daniel-mar | 889 | typeof window !== 'undefined' ? window : Function('return this;')(); |
597 | daniel-mar | 890 | |
637 | daniel-mar | 891 | var name$1 = function (element) { |
597 | daniel-mar | 892 | var r = element.dom.nodeName; |
893 | return r.toLowerCase(); |
||
894 | }; |
||
895 | var type = function (element) { |
||
896 | return element.dom.nodeType; |
||
897 | }; |
||
637 | daniel-mar | 898 | var isType = function (t) { |
597 | daniel-mar | 899 | return function (element) { |
900 | return type(element) === t; |
||
901 | }; |
||
902 | }; |
||
637 | daniel-mar | 903 | var isElement = isType(ELEMENT); |
904 | var isText = isType(TEXT); |
||
905 | var isDocument = isType(DOCUMENT); |
||
906 | var isDocumentFragment = isType(DOCUMENT_FRAGMENT); |
||
597 | daniel-mar | 907 | |
637 | daniel-mar | 908 | var owner$2 = function (element) { |
597 | daniel-mar | 909 | return SugarElement.fromDom(element.dom.ownerDocument); |
910 | }; |
||
911 | var documentOrOwner = function (dos) { |
||
637 | daniel-mar | 912 | return isDocument(dos) ? dos : owner$2(dos); |
597 | daniel-mar | 913 | }; |
914 | var defaultView = function (element) { |
||
915 | return SugarElement.fromDom(documentOrOwner(element).dom.defaultView); |
||
916 | }; |
||
917 | var parent = function (element) { |
||
918 | return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); |
||
919 | }; |
||
920 | var parents = function (element, isRoot) { |
||
921 | var stop = isFunction(isRoot) ? isRoot : never; |
||
922 | var dom = element.dom; |
||
923 | var ret = []; |
||
924 | while (dom.parentNode !== null && dom.parentNode !== undefined) { |
||
925 | var rawParent = dom.parentNode; |
||
926 | var p = SugarElement.fromDom(rawParent); |
||
927 | ret.push(p); |
||
928 | if (stop(p) === true) { |
||
929 | break; |
||
930 | } else { |
||
931 | dom = rawParent; |
||
932 | } |
||
933 | } |
||
934 | return ret; |
||
935 | }; |
||
637 | daniel-mar | 936 | var siblings$2 = function (element) { |
597 | daniel-mar | 937 | var filterSelf = function (elements) { |
637 | daniel-mar | 938 | return filter$2(elements, function (x) { |
597 | daniel-mar | 939 | return !eq(element, x); |
940 | }); |
||
941 | }; |
||
942 | return parent(element).map(children).map(filterSelf).getOr([]); |
||
943 | }; |
||
944 | var nextSibling = function (element) { |
||
945 | return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); |
||
946 | }; |
||
947 | var children = function (element) { |
||
637 | daniel-mar | 948 | return map$2(element.dom.childNodes, SugarElement.fromDom); |
597 | daniel-mar | 949 | }; |
950 | var child = function (element, index) { |
||
951 | var cs = element.dom.childNodes; |
||
952 | return Optional.from(cs[index]).map(SugarElement.fromDom); |
||
953 | }; |
||
954 | var firstChild = function (element) { |
||
955 | return child(element, 0); |
||
956 | }; |
||
957 | |||
637 | daniel-mar | 958 | var before$1 = function (marker, element) { |
597 | daniel-mar | 959 | var parent$1 = parent(marker); |
960 | parent$1.each(function (v) { |
||
961 | v.dom.insertBefore(element.dom, marker.dom); |
||
962 | }); |
||
963 | }; |
||
637 | daniel-mar | 964 | var after$2 = function (marker, element) { |
597 | daniel-mar | 965 | var sibling = nextSibling(marker); |
966 | sibling.fold(function () { |
||
967 | var parent$1 = parent(marker); |
||
968 | parent$1.each(function (v) { |
||
637 | daniel-mar | 969 | append$2(v, element); |
597 | daniel-mar | 970 | }); |
971 | }, function (v) { |
||
637 | daniel-mar | 972 | before$1(v, element); |
597 | daniel-mar | 973 | }); |
974 | }; |
||
637 | daniel-mar | 975 | var prepend$1 = function (parent, element) { |
597 | daniel-mar | 976 | var firstChild$1 = firstChild(parent); |
977 | firstChild$1.fold(function () { |
||
637 | daniel-mar | 978 | append$2(parent, element); |
597 | daniel-mar | 979 | }, function (v) { |
980 | parent.dom.insertBefore(element.dom, v.dom); |
||
981 | }); |
||
982 | }; |
||
637 | daniel-mar | 983 | var append$2 = function (parent, element) { |
597 | daniel-mar | 984 | parent.dom.appendChild(element.dom); |
985 | }; |
||
986 | var appendAt = function (parent, element, index) { |
||
987 | child(parent, index).fold(function () { |
||
637 | daniel-mar | 988 | append$2(parent, element); |
597 | daniel-mar | 989 | }, function (v) { |
637 | daniel-mar | 990 | before$1(v, element); |
597 | daniel-mar | 991 | }); |
992 | }; |
||
993 | |||
994 | var append$1 = function (parent, elements) { |
||
637 | daniel-mar | 995 | each$1(elements, function (x) { |
996 | append$2(parent, x); |
||
597 | daniel-mar | 997 | }); |
998 | }; |
||
999 | |||
1000 | var empty = function (element) { |
||
1001 | element.dom.textContent = ''; |
||
637 | daniel-mar | 1002 | each$1(children(element), function (rogue) { |
1003 | remove$7(rogue); |
||
597 | daniel-mar | 1004 | }); |
1005 | }; |
||
637 | daniel-mar | 1006 | var remove$7 = function (element) { |
597 | daniel-mar | 1007 | var dom = element.dom; |
1008 | if (dom.parentNode !== null) { |
||
1009 | dom.parentNode.removeChild(dom); |
||
1010 | } |
||
1011 | }; |
||
1012 | |||
1013 | var isShadowRoot = function (dos) { |
||
1014 | return isDocumentFragment(dos) && isNonNullable(dos.dom.host); |
||
1015 | }; |
||
1016 | var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); |
||
637 | daniel-mar | 1017 | var isSupported$1 = constant$1(supported); |
597 | daniel-mar | 1018 | var getRootNode = supported ? function (e) { |
1019 | return SugarElement.fromDom(e.dom.getRootNode()); |
||
1020 | } : documentOrOwner; |
||
1021 | var getShadowRoot = function (e) { |
||
1022 | var r = getRootNode(e); |
||
1023 | return isShadowRoot(r) ? Optional.some(r) : Optional.none(); |
||
1024 | }; |
||
1025 | var getShadowHost = function (e) { |
||
1026 | return SugarElement.fromDom(e.dom.host); |
||
1027 | }; |
||
1028 | var getOriginalEventTarget = function (event) { |
||
637 | daniel-mar | 1029 | if (isSupported$1() && isNonNullable(event.target)) { |
597 | daniel-mar | 1030 | var el = SugarElement.fromDom(event.target); |
1031 | if (isElement(el) && isOpenShadowHost(el)) { |
||
1032 | if (event.composed && event.composedPath) { |
||
1033 | var composedPath = event.composedPath(); |
||
1034 | if (composedPath) { |
||
1035 | return head(composedPath); |
||
1036 | } |
||
1037 | } |
||
1038 | } |
||
1039 | } |
||
1040 | return Optional.from(event.target); |
||
1041 | }; |
||
1042 | var isOpenShadowHost = function (element) { |
||
1043 | return isNonNullable(element.dom.shadowRoot); |
||
1044 | }; |
||
1045 | |||
1046 | var inBody = function (element) { |
||
1047 | var dom = isText(element) ? element.dom.parentNode : element.dom; |
||
1048 | if (dom === undefined || dom === null || dom.ownerDocument === null) { |
||
1049 | return false; |
||
1050 | } |
||
1051 | var doc = dom.ownerDocument; |
||
1052 | return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { |
||
1053 | return doc.body.contains(dom); |
||
1054 | }, compose1(inBody, getShadowHost)); |
||
1055 | }; |
||
1056 | var body = function () { |
||
1057 | return getBody(SugarElement.fromDom(document)); |
||
1058 | }; |
||
1059 | var getBody = function (doc) { |
||
1060 | var b = doc.dom.body; |
||
1061 | if (b === null || b === undefined) { |
||
1062 | throw new Error('Body is not available yet'); |
||
1063 | } |
||
1064 | return SugarElement.fromDom(b); |
||
1065 | }; |
||
1066 | |||
1067 | var fireDetaching = function (component) { |
||
1068 | emit(component, detachedFromDom()); |
||
1069 | var children = component.components(); |
||
637 | daniel-mar | 1070 | each$1(children, fireDetaching); |
597 | daniel-mar | 1071 | }; |
1072 | var fireAttaching = function (component) { |
||
1073 | var children = component.components(); |
||
637 | daniel-mar | 1074 | each$1(children, fireAttaching); |
597 | daniel-mar | 1075 | emit(component, attachedToDom()); |
1076 | }; |
||
637 | daniel-mar | 1077 | var attach$1 = function (parent, child) { |
1078 | append$2(parent.element, child.element); |
||
597 | daniel-mar | 1079 | }; |
1080 | var detachChildren = function (component) { |
||
637 | daniel-mar | 1081 | each$1(component.components(), function (childComp) { |
1082 | return remove$7(childComp.element); |
||
597 | daniel-mar | 1083 | }); |
1084 | empty(component.element); |
||
1085 | component.syncComponents(); |
||
1086 | }; |
||
1087 | var replaceChildren = function (component, newChildren) { |
||
1088 | var subs = component.components(); |
||
1089 | detachChildren(component); |
||
1090 | var deleted = difference(subs, newChildren); |
||
637 | daniel-mar | 1091 | each$1(deleted, function (comp) { |
597 | daniel-mar | 1092 | fireDetaching(comp); |
1093 | component.getSystem().removeFromWorld(comp); |
||
1094 | }); |
||
637 | daniel-mar | 1095 | each$1(newChildren, function (childComp) { |
597 | daniel-mar | 1096 | if (!childComp.getSystem().isConnected()) { |
1097 | component.getSystem().addToWorld(childComp); |
||
637 | daniel-mar | 1098 | attach$1(component, childComp); |
597 | daniel-mar | 1099 | if (inBody(component.element)) { |
1100 | fireAttaching(childComp); |
||
1101 | } |
||
1102 | } else { |
||
637 | daniel-mar | 1103 | attach$1(component, childComp); |
597 | daniel-mar | 1104 | } |
1105 | component.syncComponents(); |
||
1106 | }); |
||
1107 | }; |
||
1108 | |||
637 | daniel-mar | 1109 | var attach = function (parent, child) { |
1110 | attachWith(parent, child, append$2); |
||
597 | daniel-mar | 1111 | }; |
1112 | var attachWith = function (parent, child, insertion) { |
||
1113 | parent.getSystem().addToWorld(child); |
||
1114 | insertion(parent.element, child.element); |
||
1115 | if (inBody(parent.element)) { |
||
1116 | fireAttaching(child); |
||
1117 | } |
||
1118 | parent.syncComponents(); |
||
1119 | }; |
||
1120 | var doDetach = function (component) { |
||
1121 | fireDetaching(component); |
||
637 | daniel-mar | 1122 | remove$7(component.element); |
597 | daniel-mar | 1123 | component.getSystem().removeFromWorld(component); |
1124 | }; |
||
1125 | var detach = function (component) { |
||
1126 | var parent$1 = parent(component.element).bind(function (p) { |
||
1127 | return component.getSystem().getByDom(p).toOptional(); |
||
1128 | }); |
||
1129 | doDetach(component); |
||
1130 | parent$1.each(function (p) { |
||
1131 | p.syncComponents(); |
||
1132 | }); |
||
1133 | }; |
||
1134 | var attachSystemAfter = function (element, guiSystem) { |
||
637 | daniel-mar | 1135 | attachSystemWith(element, guiSystem, after$2); |
597 | daniel-mar | 1136 | }; |
1137 | var attachSystemWith = function (element, guiSystem, inserter) { |
||
1138 | inserter(element, guiSystem.element); |
||
1139 | var children$1 = children(guiSystem.element); |
||
637 | daniel-mar | 1140 | each$1(children$1, function (child) { |
597 | daniel-mar | 1141 | guiSystem.getByDom(child).each(fireAttaching); |
1142 | }); |
||
1143 | }; |
||
1144 | var detachSystem = function (guiSystem) { |
||
1145 | var children$1 = children(guiSystem.element); |
||
637 | daniel-mar | 1146 | each$1(children$1, function (child) { |
597 | daniel-mar | 1147 | guiSystem.getByDom(child).each(fireDetaching); |
1148 | }); |
||
637 | daniel-mar | 1149 | remove$7(guiSystem.element); |
597 | daniel-mar | 1150 | }; |
1151 | |||
1152 | var keys = Object.keys; |
||
1153 | var hasOwnProperty = Object.hasOwnProperty; |
||
637 | daniel-mar | 1154 | var each = function (obj, f) { |
597 | daniel-mar | 1155 | var props = keys(obj); |
1156 | for (var k = 0, len = props.length; k < len; k++) { |
||
1157 | var i = props[k]; |
||
1158 | var x = obj[i]; |
||
1159 | f(x, i); |
||
1160 | } |
||
1161 | }; |
||
1162 | var map$1 = function (obj, f) { |
||
1163 | return tupleMap(obj, function (x, i) { |
||
1164 | return { |
||
1165 | k: i, |
||
1166 | v: f(x, i) |
||
1167 | }; |
||
1168 | }); |
||
1169 | }; |
||
1170 | var tupleMap = function (obj, f) { |
||
1171 | var r = {}; |
||
637 | daniel-mar | 1172 | each(obj, function (x, i) { |
597 | daniel-mar | 1173 | var tuple = f(x, i); |
1174 | r[tuple.k] = tuple.v; |
||
1175 | }); |
||
1176 | return r; |
||
1177 | }; |
||
1178 | var objAcc = function (r) { |
||
1179 | return function (x, i) { |
||
1180 | r[i] = x; |
||
1181 | }; |
||
1182 | }; |
||
1183 | var internalFilter = function (obj, pred, onTrue, onFalse) { |
||
1184 | var r = {}; |
||
637 | daniel-mar | 1185 | each(obj, function (x, i) { |
597 | daniel-mar | 1186 | (pred(x, i) ? onTrue : onFalse)(x, i); |
1187 | }); |
||
1188 | return r; |
||
1189 | }; |
||
1190 | var filter$1 = function (obj, pred) { |
||
1191 | var t = {}; |
||
1192 | internalFilter(obj, pred, objAcc(t), noop); |
||
1193 | return t; |
||
1194 | }; |
||
1195 | var mapToArray = function (obj, f) { |
||
1196 | var r = []; |
||
637 | daniel-mar | 1197 | each(obj, function (value, name) { |
597 | daniel-mar | 1198 | r.push(f(value, name)); |
1199 | }); |
||
1200 | return r; |
||
1201 | }; |
||
637 | daniel-mar | 1202 | var find = function (obj, pred) { |
597 | daniel-mar | 1203 | var props = keys(obj); |
1204 | for (var k = 0, len = props.length; k < len; k++) { |
||
1205 | var i = props[k]; |
||
1206 | var x = obj[i]; |
||
1207 | if (pred(x, i, obj)) { |
||
1208 | return Optional.some(x); |
||
1209 | } |
||
1210 | } |
||
1211 | return Optional.none(); |
||
1212 | }; |
||
1213 | var values = function (obj) { |
||
637 | daniel-mar | 1214 | return mapToArray(obj, identity); |
597 | daniel-mar | 1215 | }; |
637 | daniel-mar | 1216 | var get$c = function (obj, key) { |
1217 | return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none(); |
||
597 | daniel-mar | 1218 | }; |
637 | daniel-mar | 1219 | var has$2 = function (obj, key) { |
597 | daniel-mar | 1220 | return hasOwnProperty.call(obj, key); |
1221 | }; |
||
1222 | var hasNonNullableKey = function (obj, key) { |
||
637 | daniel-mar | 1223 | return has$2(obj, key) && obj[key] !== undefined && obj[key] !== null; |
597 | daniel-mar | 1224 | }; |
1225 | |||
1226 | var rawSet = function (dom, key, value) { |
||
1227 | if (isString(value) || isBoolean(value) || isNumber(value)) { |
||
1228 | dom.setAttribute(key, value + ''); |
||
1229 | } else { |
||
1230 | console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); |
||
1231 | throw new Error('Attribute value was not simple'); |
||
1232 | } |
||
1233 | }; |
||
637 | daniel-mar | 1234 | var set$8 = function (element, key, value) { |
597 | daniel-mar | 1235 | rawSet(element.dom, key, value); |
1236 | }; |
||
637 | daniel-mar | 1237 | var setAll$1 = function (element, attrs) { |
597 | daniel-mar | 1238 | var dom = element.dom; |
637 | daniel-mar | 1239 | each(attrs, function (v, k) { |
597 | daniel-mar | 1240 | rawSet(dom, k, v); |
1241 | }); |
||
1242 | }; |
||
637 | daniel-mar | 1243 | var get$b = function (element, key) { |
597 | daniel-mar | 1244 | var v = element.dom.getAttribute(key); |
1245 | return v === null ? undefined : v; |
||
1246 | }; |
||
1247 | var getOpt = function (element, key) { |
||
637 | daniel-mar | 1248 | return Optional.from(get$b(element, key)); |
597 | daniel-mar | 1249 | }; |
1250 | var has$1 = function (element, key) { |
||
1251 | var dom = element.dom; |
||
1252 | return dom && dom.hasAttribute ? dom.hasAttribute(key) : false; |
||
1253 | }; |
||
637 | daniel-mar | 1254 | var remove$6 = function (element, key) { |
597 | daniel-mar | 1255 | element.dom.removeAttribute(key); |
1256 | }; |
||
1257 | |||
637 | daniel-mar | 1258 | var read$2 = function (element, attr) { |
1259 | var value = get$b(element, attr); |
||
597 | daniel-mar | 1260 | return value === undefined || value === '' ? [] : value.split(' '); |
1261 | }; |
||
637 | daniel-mar | 1262 | var add$3 = function (element, attr, id) { |
1263 | var old = read$2(element, attr); |
||
597 | daniel-mar | 1264 | var nu = old.concat([id]); |
637 | daniel-mar | 1265 | set$8(element, attr, nu.join(' ')); |
597 | daniel-mar | 1266 | return true; |
1267 | }; |
||
637 | daniel-mar | 1268 | var remove$5 = function (element, attr, id) { |
1269 | var nu = filter$2(read$2(element, attr), function (v) { |
||
597 | daniel-mar | 1270 | return v !== id; |
1271 | }); |
||
1272 | if (nu.length > 0) { |
||
637 | daniel-mar | 1273 | set$8(element, attr, nu.join(' ')); |
597 | daniel-mar | 1274 | } else { |
637 | daniel-mar | 1275 | remove$6(element, attr); |
597 | daniel-mar | 1276 | } |
1277 | return false; |
||
1278 | }; |
||
1279 | |||
1280 | var supports = function (element) { |
||
1281 | return element.dom.classList !== undefined; |
||
1282 | }; |
||
637 | daniel-mar | 1283 | var get$a = function (element) { |
1284 | return read$2(element, 'class'); |
||
597 | daniel-mar | 1285 | }; |
637 | daniel-mar | 1286 | var add$2 = function (element, clazz) { |
1287 | return add$3(element, 'class', clazz); |
||
597 | daniel-mar | 1288 | }; |
637 | daniel-mar | 1289 | var remove$4 = function (element, clazz) { |
1290 | return remove$5(element, 'class', clazz); |
||
597 | daniel-mar | 1291 | }; |
1292 | |||
637 | daniel-mar | 1293 | var add$1 = function (element, clazz) { |
597 | daniel-mar | 1294 | if (supports(element)) { |
1295 | element.dom.classList.add(clazz); |
||
1296 | } else { |
||
637 | daniel-mar | 1297 | add$2(element, clazz); |
597 | daniel-mar | 1298 | } |
1299 | }; |
||
1300 | var cleanClass = function (element) { |
||
637 | daniel-mar | 1301 | var classList = supports(element) ? element.dom.classList : get$a(element); |
597 | daniel-mar | 1302 | if (classList.length === 0) { |
637 | daniel-mar | 1303 | remove$6(element, 'class'); |
597 | daniel-mar | 1304 | } |
1305 | }; |
||
637 | daniel-mar | 1306 | var remove$3 = function (element, clazz) { |
597 | daniel-mar | 1307 | if (supports(element)) { |
1308 | var classList = element.dom.classList; |
||
1309 | classList.remove(clazz); |
||
1310 | } else { |
||
637 | daniel-mar | 1311 | remove$4(element, clazz); |
597 | daniel-mar | 1312 | } |
1313 | cleanClass(element); |
||
1314 | }; |
||
637 | daniel-mar | 1315 | var has = function (element, clazz) { |
597 | daniel-mar | 1316 | return supports(element) && element.dom.classList.contains(clazz); |
1317 | }; |
||
1318 | |||
1319 | var swap = function (element, addCls, removeCls) { |
||
637 | daniel-mar | 1320 | remove$3(element, removeCls); |
1321 | add$1(element, addCls); |
||
597 | daniel-mar | 1322 | }; |
1323 | var toAlpha = function (component, swapConfig, _swapState) { |
||
1324 | swap(component.element, swapConfig.alpha, swapConfig.omega); |
||
1325 | }; |
||
1326 | var toOmega = function (component, swapConfig, _swapState) { |
||
1327 | swap(component.element, swapConfig.omega, swapConfig.alpha); |
||
1328 | }; |
||
637 | daniel-mar | 1329 | var clear$1 = function (component, swapConfig, _swapState) { |
1330 | remove$3(component.element, swapConfig.alpha); |
||
1331 | remove$3(component.element, swapConfig.omega); |
||
597 | daniel-mar | 1332 | }; |
1333 | var isAlpha = function (component, swapConfig, _swapState) { |
||
637 | daniel-mar | 1334 | return has(component.element, swapConfig.alpha); |
597 | daniel-mar | 1335 | }; |
1336 | var isOmega = function (component, swapConfig, _swapState) { |
||
637 | daniel-mar | 1337 | return has(component.element, swapConfig.omega); |
597 | daniel-mar | 1338 | }; |
1339 | |||
1340 | var SwapApis = /*#__PURE__*/Object.freeze({ |
||
1341 | __proto__: null, |
||
1342 | toAlpha: toAlpha, |
||
1343 | toOmega: toOmega, |
||
1344 | isAlpha: isAlpha, |
||
1345 | isOmega: isOmega, |
||
637 | daniel-mar | 1346 | clear: clear$1 |
597 | daniel-mar | 1347 | }); |
1348 | |||
637 | daniel-mar | 1349 | var value$2 = function (o) { |
597 | daniel-mar | 1350 | var or = function (_opt) { |
637 | daniel-mar | 1351 | return value$2(o); |
597 | daniel-mar | 1352 | }; |
1353 | var orThunk = function (_f) { |
||
637 | daniel-mar | 1354 | return value$2(o); |
597 | daniel-mar | 1355 | }; |
1356 | var map = function (f) { |
||
637 | daniel-mar | 1357 | return value$2(f(o)); |
597 | daniel-mar | 1358 | }; |
1359 | var mapError = function (_f) { |
||
637 | daniel-mar | 1360 | return value$2(o); |
597 | daniel-mar | 1361 | }; |
1362 | var each = function (f) { |
||
1363 | f(o); |
||
1364 | }; |
||
1365 | var bind = function (f) { |
||
1366 | return f(o); |
||
1367 | }; |
||
1368 | var fold = function (_, onValue) { |
||
1369 | return onValue(o); |
||
1370 | }; |
||
1371 | var exists = function (f) { |
||
1372 | return f(o); |
||
1373 | }; |
||
1374 | var forall = function (f) { |
||
1375 | return f(o); |
||
1376 | }; |
||
1377 | var toOptional = function () { |
||
1378 | return Optional.some(o); |
||
1379 | }; |
||
1380 | return { |
||
1381 | isValue: always, |
||
1382 | isError: never, |
||
637 | daniel-mar | 1383 | getOr: constant$1(o), |
1384 | getOrThunk: constant$1(o), |
||
1385 | getOrDie: constant$1(o), |
||
597 | daniel-mar | 1386 | or: or, |
1387 | orThunk: orThunk, |
||
1388 | fold: fold, |
||
1389 | map: map, |
||
1390 | mapError: mapError, |
||
1391 | each: each, |
||
1392 | bind: bind, |
||
1393 | exists: exists, |
||
1394 | forall: forall, |
||
1395 | toOptional: toOptional |
||
1396 | }; |
||
1397 | }; |
||
1398 | var error = function (message) { |
||
1399 | var getOrThunk = function (f) { |
||
1400 | return f(); |
||
1401 | }; |
||
1402 | var getOrDie = function () { |
||
1403 | return die(String(message))(); |
||
1404 | }; |
||
637 | daniel-mar | 1405 | var or = identity; |
597 | daniel-mar | 1406 | var orThunk = function (f) { |
1407 | return f(); |
||
1408 | }; |
||
1409 | var map = function (_f) { |
||
1410 | return error(message); |
||
1411 | }; |
||
1412 | var mapError = function (f) { |
||
1413 | return error(f(message)); |
||
1414 | }; |
||
1415 | var bind = function (_f) { |
||
1416 | return error(message); |
||
1417 | }; |
||
1418 | var fold = function (onError, _) { |
||
1419 | return onError(message); |
||
1420 | }; |
||
1421 | return { |
||
1422 | isValue: never, |
||
1423 | isError: always, |
||
1424 | getOr: identity, |
||
1425 | getOrThunk: getOrThunk, |
||
1426 | getOrDie: getOrDie, |
||
1427 | or: or, |
||
1428 | orThunk: orThunk, |
||
1429 | fold: fold, |
||
1430 | map: map, |
||
1431 | mapError: mapError, |
||
1432 | each: noop, |
||
1433 | bind: bind, |
||
1434 | exists: never, |
||
1435 | forall: always, |
||
1436 | toOptional: Optional.none |
||
1437 | }; |
||
1438 | }; |
||
1439 | var fromOption = function (opt, err) { |
||
1440 | return opt.fold(function () { |
||
1441 | return error(err); |
||
637 | daniel-mar | 1442 | }, value$2); |
597 | daniel-mar | 1443 | }; |
1444 | var Result = { |
||
637 | daniel-mar | 1445 | value: value$2, |
597 | daniel-mar | 1446 | error: error, |
1447 | fromOption: fromOption |
||
1448 | }; |
||
1449 | |||
1450 | var SimpleResultType; |
||
1451 | (function (SimpleResultType) { |
||
1452 | SimpleResultType[SimpleResultType['Error'] = 0] = 'Error'; |
||
1453 | SimpleResultType[SimpleResultType['Value'] = 1] = 'Value'; |
||
1454 | }(SimpleResultType || (SimpleResultType = {}))); |
||
637 | daniel-mar | 1455 | var fold$1 = function (res, onError, onValue) { |
597 | daniel-mar | 1456 | return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue); |
1457 | }; |
||
637 | daniel-mar | 1458 | var partition$1 = function (results) { |
597 | daniel-mar | 1459 | var values = []; |
1460 | var errors = []; |
||
637 | daniel-mar | 1461 | each$1(results, function (obj) { |
1462 | fold$1(obj, function (err) { |
||
597 | daniel-mar | 1463 | return errors.push(err); |
1464 | }, function (val) { |
||
1465 | return values.push(val); |
||
1466 | }); |
||
1467 | }); |
||
1468 | return { |
||
1469 | values: values, |
||
1470 | errors: errors |
||
1471 | }; |
||
1472 | }; |
||
1473 | var mapError = function (res, f) { |
||
1474 | if (res.stype === SimpleResultType.Error) { |
||
1475 | return { |
||
1476 | stype: SimpleResultType.Error, |
||
1477 | serror: f(res.serror) |
||
1478 | }; |
||
1479 | } else { |
||
1480 | return res; |
||
1481 | } |
||
1482 | }; |
||
637 | daniel-mar | 1483 | var map = function (res, f) { |
597 | daniel-mar | 1484 | if (res.stype === SimpleResultType.Value) { |
1485 | return { |
||
1486 | stype: SimpleResultType.Value, |
||
1487 | svalue: f(res.svalue) |
||
1488 | }; |
||
1489 | } else { |
||
1490 | return res; |
||
1491 | } |
||
1492 | }; |
||
637 | daniel-mar | 1493 | var bind$2 = function (res, f) { |
597 | daniel-mar | 1494 | if (res.stype === SimpleResultType.Value) { |
1495 | return f(res.svalue); |
||
1496 | } else { |
||
1497 | return res; |
||
1498 | } |
||
1499 | }; |
||
1500 | var bindError = function (res, f) { |
||
1501 | if (res.stype === SimpleResultType.Error) { |
||
1502 | return f(res.serror); |
||
1503 | } else { |
||
1504 | return res; |
||
1505 | } |
||
1506 | }; |
||
1507 | var svalue = function (v) { |
||
1508 | return { |
||
1509 | stype: SimpleResultType.Value, |
||
1510 | svalue: v |
||
1511 | }; |
||
1512 | }; |
||
1513 | var serror = function (e) { |
||
1514 | return { |
||
1515 | stype: SimpleResultType.Error, |
||
1516 | serror: e |
||
1517 | }; |
||
1518 | }; |
||
637 | daniel-mar | 1519 | var toResult$1 = function (res) { |
1520 | return fold$1(res, Result.error, Result.value); |
||
597 | daniel-mar | 1521 | }; |
1522 | var fromResult = function (res) { |
||
1523 | return res.fold(serror, svalue); |
||
1524 | }; |
||
1525 | var SimpleResult = { |
||
1526 | fromResult: fromResult, |
||
637 | daniel-mar | 1527 | toResult: toResult$1, |
597 | daniel-mar | 1528 | svalue: svalue, |
637 | daniel-mar | 1529 | partition: partition$1, |
597 | daniel-mar | 1530 | serror: serror, |
637 | daniel-mar | 1531 | bind: bind$2, |
597 | daniel-mar | 1532 | bindError: bindError, |
637 | daniel-mar | 1533 | map: map, |
597 | daniel-mar | 1534 | mapError: mapError, |
637 | daniel-mar | 1535 | fold: fold$1 |
597 | daniel-mar | 1536 | }; |
1537 | |||
637 | daniel-mar | 1538 | var field$3 = function (key, newKey, presence, prop) { |
1539 | return { |
||
1540 | tag: 'field', |
||
1541 | key: key, |
||
1542 | newKey: newKey, |
||
1543 | presence: presence, |
||
1544 | prop: prop |
||
1545 | }; |
||
1546 | }; |
||
1547 | var customField$1 = function (newKey, instantiator) { |
||
1548 | return { |
||
1549 | tag: 'custom', |
||
1550 | newKey: newKey, |
||
1551 | instantiator: instantiator |
||
1552 | }; |
||
1553 | }; |
||
1554 | var fold = function (value, ifField, ifCustom) { |
||
1555 | switch (value.tag) { |
||
1556 | case 'field': |
||
1557 | return ifField(value.key, value.newKey, value.presence, value.prop); |
||
1558 | case 'custom': |
||
1559 | return ifCustom(value.newKey, value.instantiator); |
||
597 | daniel-mar | 1560 | } |
1561 | }; |
||
1562 | |||
637 | daniel-mar | 1563 | var shallow$1 = function (old, nu) { |
597 | daniel-mar | 1564 | return nu; |
1565 | }; |
||
1566 | var deep = function (old, nu) { |
||
1567 | var bothObjects = isObject(old) && isObject(nu); |
||
1568 | return bothObjects ? deepMerge(old, nu) : nu; |
||
1569 | }; |
||
1570 | var baseMerge = function (merger) { |
||
1571 | return function () { |
||
1572 | var objects = []; |
||
1573 | for (var _i = 0; _i < arguments.length; _i++) { |
||
1574 | objects[_i] = arguments[_i]; |
||
1575 | } |
||
1576 | if (objects.length === 0) { |
||
1577 | throw new Error('Can\'t merge zero objects'); |
||
1578 | } |
||
1579 | var ret = {}; |
||
1580 | for (var j = 0; j < objects.length; j++) { |
||
1581 | var curObject = objects[j]; |
||
1582 | for (var key in curObject) { |
||
637 | daniel-mar | 1583 | if (has$2(curObject, key)) { |
597 | daniel-mar | 1584 | ret[key] = merger(ret[key], curObject[key]); |
1585 | } |
||
1586 | } |
||
1587 | } |
||
1588 | return ret; |
||
1589 | }; |
||
1590 | }; |
||
1591 | var deepMerge = baseMerge(deep); |
||
637 | daniel-mar | 1592 | var merge$1 = baseMerge(shallow$1); |
597 | daniel-mar | 1593 | |
637 | daniel-mar | 1594 | var required$2 = function () { |
1595 | return { |
||
1596 | tag: 'required', |
||
1597 | process: {} |
||
1598 | }; |
||
597 | daniel-mar | 1599 | }; |
637 | daniel-mar | 1600 | var defaultedThunk = function (fallbackThunk) { |
597 | daniel-mar | 1601 | return { |
637 | daniel-mar | 1602 | tag: 'defaultedThunk', |
1603 | process: fallbackThunk |
||
597 | daniel-mar | 1604 | }; |
1605 | }; |
||
637 | daniel-mar | 1606 | var defaulted$1 = function (fallback) { |
1607 | return defaultedThunk(constant$1(fallback)); |
||
597 | daniel-mar | 1608 | }; |
637 | daniel-mar | 1609 | var asOption = function () { |
1610 | return { |
||
1611 | tag: 'option', |
||
1612 | process: {} |
||
1613 | }; |
||
597 | daniel-mar | 1614 | }; |
637 | daniel-mar | 1615 | var mergeWithThunk = function (baseThunk) { |
1616 | return { |
||
1617 | tag: 'mergeWithThunk', |
||
1618 | process: baseThunk |
||
1619 | }; |
||
597 | daniel-mar | 1620 | }; |
637 | daniel-mar | 1621 | var mergeWith = function (base) { |
1622 | return mergeWithThunk(constant$1(base)); |
||
597 | daniel-mar | 1623 | }; |
1624 | |||
1625 | var mergeValues$1 = function (values, base) { |
||
637 | daniel-mar | 1626 | return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge$1.apply(undefined, values))) : SimpleResult.svalue(base); |
597 | daniel-mar | 1627 | }; |
1628 | var mergeErrors$1 = function (errors) { |
||
1629 | return compose(SimpleResult.serror, flatten)(errors); |
||
1630 | }; |
||
1631 | var consolidateObj = function (objects, base) { |
||
1632 | var partition = SimpleResult.partition(objects); |
||
1633 | return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base); |
||
1634 | }; |
||
1635 | var consolidateArr = function (objects) { |
||
1636 | var partitions = SimpleResult.partition(objects); |
||
1637 | return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values); |
||
1638 | }; |
||
1639 | var ResultCombine = { |
||
1640 | consolidateObj: consolidateObj, |
||
1641 | consolidateArr: consolidateArr |
||
1642 | }; |
||
1643 | |||
1644 | var formatObj = function (input) { |
||
1645 | return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2); |
||
1646 | }; |
||
1647 | var formatErrors = function (errors) { |
||
1648 | var es = errors.length > 10 ? errors.slice(0, 10).concat([{ |
||
1649 | path: [], |
||
637 | daniel-mar | 1650 | getErrorInfo: constant$1('... (only showing first ten failures)') |
597 | daniel-mar | 1651 | }]) : errors; |
637 | daniel-mar | 1652 | return map$2(es, function (e) { |
597 | daniel-mar | 1653 | return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo(); |
1654 | }); |
||
1655 | }; |
||
1656 | |||
637 | daniel-mar | 1657 | var nu$5 = function (path, getErrorInfo) { |
597 | daniel-mar | 1658 | return SimpleResult.serror([{ |
1659 | path: path, |
||
1660 | getErrorInfo: getErrorInfo |
||
1661 | }]); |
||
1662 | }; |
||
637 | daniel-mar | 1663 | var missingRequired = function (path, key, obj) { |
1664 | return nu$5(path, function () { |
||
1665 | return 'Could not find valid *required* value for "' + key + '" in ' + formatObj(obj); |
||
597 | daniel-mar | 1666 | }); |
1667 | }; |
||
1668 | var missingKey = function (path, key) { |
||
637 | daniel-mar | 1669 | return nu$5(path, function () { |
597 | daniel-mar | 1670 | return 'Choice schema did not contain choice key: "' + key + '"'; |
1671 | }); |
||
1672 | }; |
||
1673 | var missingBranch = function (path, branches, branch) { |
||
637 | daniel-mar | 1674 | return nu$5(path, function () { |
597 | daniel-mar | 1675 | return 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches); |
1676 | }); |
||
1677 | }; |
||
1678 | var unsupportedFields = function (path, unsupported) { |
||
637 | daniel-mar | 1679 | return nu$5(path, function () { |
597 | daniel-mar | 1680 | return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified'; |
1681 | }); |
||
1682 | }; |
||
1683 | var custom = function (path, err) { |
||
637 | daniel-mar | 1684 | return nu$5(path, constant$1(err)); |
597 | daniel-mar | 1685 | }; |
1686 | |||
637 | daniel-mar | 1687 | var value$1 = function (validator) { |
1688 | var extract = function (path, val) { |
||
1689 | return SimpleResult.bindError(validator(val), function (err) { |
||
1690 | return custom(path, err); |
||
1691 | }); |
||
1692 | }; |
||
1693 | var toString = constant$1('val'); |
||
1694 | return { |
||
1695 | extract: extract, |
||
1696 | toString: toString |
||
1697 | }; |
||
597 | daniel-mar | 1698 | }; |
637 | daniel-mar | 1699 | var anyValue$1 = value$1(SimpleResult.svalue); |
1700 | |||
1701 | var requiredAccess = function (path, obj, key, bundle) { |
||
1702 | return get$c(obj, key).fold(function () { |
||
1703 | return missingRequired(path, key, obj); |
||
1704 | }, bundle); |
||
597 | daniel-mar | 1705 | }; |
637 | daniel-mar | 1706 | var fallbackAccess = function (obj, key, fallback, bundle) { |
1707 | var v = get$c(obj, key).getOrThunk(function () { |
||
1708 | return fallback(obj); |
||
597 | daniel-mar | 1709 | }); |
637 | daniel-mar | 1710 | return bundle(v); |
597 | daniel-mar | 1711 | }; |
637 | daniel-mar | 1712 | var optionAccess = function (obj, key, bundle) { |
1713 | return bundle(get$c(obj, key)); |
||
597 | daniel-mar | 1714 | }; |
637 | daniel-mar | 1715 | var optionDefaultedAccess = function (obj, key, fallback, bundle) { |
1716 | var opt = get$c(obj, key).map(function (val) { |
||
1717 | return val === true ? fallback(obj) : val; |
||
597 | daniel-mar | 1718 | }); |
637 | daniel-mar | 1719 | return bundle(opt); |
597 | daniel-mar | 1720 | }; |
637 | daniel-mar | 1721 | var extractField = function (field, path, obj, key, prop) { |
1722 | var bundle = function (av) { |
||
1723 | return prop.extract(path.concat([key]), av); |
||
1724 | }; |
||
1725 | var bundleAsOption = function (optValue) { |
||
1726 | return optValue.fold(function () { |
||
1727 | return SimpleResult.svalue(Optional.none()); |
||
1728 | }, function (ov) { |
||
1729 | var result = prop.extract(path.concat([key]), ov); |
||
1730 | return SimpleResult.map(result, Optional.some); |
||
597 | daniel-mar | 1731 | }); |
1732 | }; |
||
637 | daniel-mar | 1733 | switch (field.tag) { |
1734 | case 'required': |
||
1735 | return requiredAccess(path, obj, key, bundle); |
||
1736 | case 'defaultedThunk': |
||
1737 | return fallbackAccess(obj, key, field.process, bundle); |
||
1738 | case 'option': |
||
1739 | return optionAccess(obj, key, bundleAsOption); |
||
1740 | case 'defaultedOptionThunk': |
||
1741 | return optionDefaultedAccess(obj, key, field.process, bundleAsOption); |
||
1742 | case 'mergeWithThunk': { |
||
1743 | return fallbackAccess(obj, key, constant$1({}), function (v) { |
||
1744 | var result = deepMerge(field.process(obj), v); |
||
1745 | return bundle(result); |
||
1746 | }); |
||
1747 | } |
||
1748 | } |
||
597 | daniel-mar | 1749 | }; |
637 | daniel-mar | 1750 | var extractFields = function (path, obj, fields) { |
1751 | var success = {}; |
||
1752 | var errors = []; |
||
1753 | for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) { |
||
1754 | var field = fields_1[_i]; |
||
1755 | fold(field, function (key, newKey, presence, prop) { |
||
1756 | var result = extractField(presence, path, obj, key, prop); |
||
1757 | SimpleResult.fold(result, function (err) { |
||
1758 | errors.push.apply(errors, err); |
||
1759 | }, function (res) { |
||
1760 | success[newKey] = res; |
||
1761 | }); |
||
1762 | }, function (newKey, instantiator) { |
||
1763 | success[newKey] = instantiator(obj); |
||
1764 | }); |
||
1765 | } |
||
1766 | return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success); |
||
1767 | }; |
||
597 | daniel-mar | 1768 | var getSetKeys = function (obj) { |
637 | daniel-mar | 1769 | return keys(filter$1(obj, isNonNullable)); |
597 | daniel-mar | 1770 | }; |
1771 | var objOfOnly = function (fields) { |
||
1772 | var delegate = objOf(fields); |
||
637 | daniel-mar | 1773 | var fieldNames = foldr(fields, function (acc, value) { |
1774 | return fold(value, function (key) { |
||
1775 | var _a; |
||
1776 | return deepMerge(acc, (_a = {}, _a[key] = true, _a)); |
||
1777 | }, constant$1(acc)); |
||
597 | daniel-mar | 1778 | }, {}); |
637 | daniel-mar | 1779 | var extract = function (path, o) { |
597 | daniel-mar | 1780 | var keys = isBoolean(o) ? [] : getSetKeys(o); |
637 | daniel-mar | 1781 | var extra = filter$2(keys, function (k) { |
597 | daniel-mar | 1782 | return !hasNonNullableKey(fieldNames, k); |
1783 | }); |
||
637 | daniel-mar | 1784 | return extra.length === 0 ? delegate.extract(path, o) : unsupportedFields(path, extra); |
597 | daniel-mar | 1785 | }; |
1786 | return { |
||
1787 | extract: extract, |
||
1788 | toString: delegate.toString |
||
1789 | }; |
||
1790 | }; |
||
637 | daniel-mar | 1791 | var objOf = function (values) { |
1792 | var extract = function (path, o) { |
||
1793 | return extractFields(path, o, values); |
||
597 | daniel-mar | 1794 | }; |
1795 | var toString = function () { |
||
637 | daniel-mar | 1796 | var fieldStrings = map$2(values, function (value) { |
1797 | return fold(value, function (key, _okey, _presence, prop) { |
||
597 | daniel-mar | 1798 | return key + ' -> ' + prop.toString(); |
637 | daniel-mar | 1799 | }, function (newKey, _instantiator) { |
1800 | return 'state(' + newKey + ')'; |
||
597 | daniel-mar | 1801 | }); |
1802 | }); |
||
1803 | return 'obj{\n' + fieldStrings.join('\n') + '}'; |
||
1804 | }; |
||
1805 | return { |
||
1806 | extract: extract, |
||
1807 | toString: toString |
||
1808 | }; |
||
1809 | }; |
||
1810 | var arrOf = function (prop) { |
||
637 | daniel-mar | 1811 | var extract = function (path, array) { |
1812 | var results = map$2(array, function (a, i) { |
||
1813 | return prop.extract(path.concat(['[' + i + ']']), a); |
||
597 | daniel-mar | 1814 | }); |
1815 | return ResultCombine.consolidateArr(results); |
||
1816 | }; |
||
1817 | var toString = function () { |
||
1818 | return 'array(' + prop.toString() + ')'; |
||
1819 | }; |
||
1820 | return { |
||
1821 | extract: extract, |
||
1822 | toString: toString |
||
1823 | }; |
||
1824 | }; |
||
637 | daniel-mar | 1825 | var setOf$1 = function (validator, prop) { |
597 | daniel-mar | 1826 | var validateKeys = function (path, keys) { |
637 | daniel-mar | 1827 | return arrOf(value$1(validator)).extract(path, keys); |
597 | daniel-mar | 1828 | }; |
637 | daniel-mar | 1829 | var extract = function (path, o) { |
597 | daniel-mar | 1830 | var keys$1 = keys(o); |
1831 | var validatedKeys = validateKeys(path, keys$1); |
||
1832 | return SimpleResult.bind(validatedKeys, function (validKeys) { |
||
637 | daniel-mar | 1833 | var schema = map$2(validKeys, function (vk) { |
1834 | return field$3(vk, vk, required$2(), prop); |
||
597 | daniel-mar | 1835 | }); |
637 | daniel-mar | 1836 | return objOf(schema).extract(path, o); |
597 | daniel-mar | 1837 | }); |
1838 | }; |
||
1839 | var toString = function () { |
||
1840 | return 'setOf(' + prop.toString() + ')'; |
||
1841 | }; |
||
1842 | return { |
||
1843 | extract: extract, |
||
1844 | toString: toString |
||
1845 | }; |
||
1846 | }; |
||
1847 | |||
637 | daniel-mar | 1848 | var anyValue = constant$1(anyValue$1); |
1849 | var typedValue = function (validator, expectedType) { |
||
1850 | return value$1(function (a) { |
||
1851 | var actualType = typeof a; |
||
1852 | return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType); |
||
1853 | }); |
||
1854 | }; |
||
1855 | var functionProcessor = typedValue(isFunction, 'function'); |
||
1856 | |||
1857 | var chooseFrom = function (path, input, branches, ch) { |
||
1858 | var fields = get$c(branches, ch); |
||
597 | daniel-mar | 1859 | return fields.fold(function () { |
1860 | return missingBranch(path, branches, ch); |
||
1861 | }, function (vp) { |
||
637 | daniel-mar | 1862 | return vp.extract(path.concat(['branch: ' + ch]), input); |
597 | daniel-mar | 1863 | }); |
1864 | }; |
||
637 | daniel-mar | 1865 | var choose$2 = function (key, branches) { |
1866 | var extract = function (path, input) { |
||
1867 | var choice = get$c(input, key); |
||
597 | daniel-mar | 1868 | return choice.fold(function () { |
1869 | return missingKey(path, key); |
||
1870 | }, function (chosen) { |
||
637 | daniel-mar | 1871 | return chooseFrom(path, input, branches, chosen); |
597 | daniel-mar | 1872 | }); |
1873 | }; |
||
1874 | var toString = function () { |
||
1875 | return 'chooseOn(' + key + '). Possible values: ' + keys(branches); |
||
1876 | }; |
||
1877 | return { |
||
1878 | extract: extract, |
||
1879 | toString: toString |
||
1880 | }; |
||
1881 | }; |
||
1882 | |||
1883 | var valueOf = function (validator) { |
||
1884 | return value$1(function (v) { |
||
1885 | return validator(v).fold(SimpleResult.serror, SimpleResult.svalue); |
||
1886 | }); |
||
1887 | }; |
||
637 | daniel-mar | 1888 | var setOf = function (validator, prop) { |
1889 | return setOf$1(function (v) { |
||
597 | daniel-mar | 1890 | return SimpleResult.fromResult(validator(v)); |
1891 | }, prop); |
||
1892 | }; |
||
637 | daniel-mar | 1893 | var extractValue = function (label, prop, obj) { |
1894 | var res = prop.extract([label], obj); |
||
597 | daniel-mar | 1895 | return SimpleResult.mapError(res, function (errs) { |
1896 | return { |
||
1897 | input: obj, |
||
1898 | errors: errs |
||
1899 | }; |
||
1900 | }); |
||
1901 | }; |
||
1902 | var asRaw = function (label, prop, obj) { |
||
637 | daniel-mar | 1903 | return SimpleResult.toResult(extractValue(label, prop, obj)); |
597 | daniel-mar | 1904 | }; |
1905 | var getOrDie = function (extraction) { |
||
1906 | return extraction.fold(function (errInfo) { |
||
1907 | throw new Error(formatError(errInfo)); |
||
1908 | }, identity); |
||
1909 | }; |
||
637 | daniel-mar | 1910 | var asRawOrDie$1 = function (label, prop, obj) { |
597 | daniel-mar | 1911 | return getOrDie(asRaw(label, prop, obj)); |
1912 | }; |
||
1913 | var formatError = function (errInfo) { |
||
1914 | return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input); |
||
1915 | }; |
||
1916 | var choose$1 = function (key, branches) { |
||
637 | daniel-mar | 1917 | return choose$2(key, map$1(branches, objOf)); |
597 | daniel-mar | 1918 | }; |
1919 | |||
637 | daniel-mar | 1920 | var field$2 = field$3; |
1921 | var customField = customField$1; |
||
1922 | var required$1 = function (key) { |
||
1923 | return field$2(key, key, required$2(), anyValue()); |
||
597 | daniel-mar | 1924 | }; |
637 | daniel-mar | 1925 | var requiredOf = function (key, schema) { |
1926 | return field$2(key, key, required$2(), schema); |
||
597 | daniel-mar | 1927 | }; |
1928 | var forbid = function (key, message) { |
||
637 | daniel-mar | 1929 | return field$2(key, key, asOption(), value$1(function (_v) { |
597 | daniel-mar | 1930 | return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message); |
1931 | })); |
||
1932 | }; |
||
637 | daniel-mar | 1933 | var requiredObjOf = function (key, objSchema) { |
1934 | return field$2(key, key, required$2(), objOf(objSchema)); |
||
597 | daniel-mar | 1935 | }; |
1936 | var option = function (key) { |
||
637 | daniel-mar | 1937 | return field$2(key, key, asOption(), anyValue()); |
597 | daniel-mar | 1938 | }; |
1939 | var optionOf = function (key, schema) { |
||
637 | daniel-mar | 1940 | return field$2(key, key, asOption(), schema); |
597 | daniel-mar | 1941 | }; |
1942 | var optionObjOf = function (key, objSchema) { |
||
1943 | return optionOf(key, objOf(objSchema)); |
||
1944 | }; |
||
1945 | var optionObjOfOnly = function (key, objSchema) { |
||
1946 | return optionOf(key, objOfOnly(objSchema)); |
||
1947 | }; |
||
637 | daniel-mar | 1948 | var defaulted = function (key, fallback) { |
1949 | return field$2(key, key, defaulted$1(fallback), anyValue()); |
||
597 | daniel-mar | 1950 | }; |
1951 | var defaultedOf = function (key, fallback, schema) { |
||
637 | daniel-mar | 1952 | return field$2(key, key, defaulted$1(fallback), schema); |
597 | daniel-mar | 1953 | }; |
1954 | var defaultedFunction = function (key, fallback) { |
||
1955 | return defaultedOf(key, fallback, functionProcessor); |
||
1956 | }; |
||
1957 | var defaultedObjOf = function (key, fallback, objSchema) { |
||
1958 | return defaultedOf(key, fallback, objOf(objSchema)); |
||
1959 | }; |
||
1960 | |||
1961 | var SwapSchema = [ |
||
637 | daniel-mar | 1962 | required$1('alpha'), |
1963 | required$1('omega') |
||
597 | daniel-mar | 1964 | ]; |
1965 | |||
637 | daniel-mar | 1966 | var generate$5 = function (cases) { |
1967 | if (!isArray(cases)) { |
||
1968 | throw new Error('cases must be an array'); |
||
1969 | } |
||
1970 | if (cases.length === 0) { |
||
1971 | throw new Error('there must be at least one case'); |
||
1972 | } |
||
1973 | var constructors = []; |
||
1974 | var adt = {}; |
||
1975 | each$1(cases, function (acase, count) { |
||
1976 | var keys$1 = keys(acase); |
||
1977 | if (keys$1.length !== 1) { |
||
1978 | throw new Error('one and only one name per case'); |
||
1979 | } |
||
1980 | var key = keys$1[0]; |
||
1981 | var value = acase[key]; |
||
1982 | if (adt[key] !== undefined) { |
||
1983 | throw new Error('duplicate key detected:' + key); |
||
1984 | } else if (key === 'cata') { |
||
1985 | throw new Error('cannot have a case named cata (sorry)'); |
||
1986 | } else if (!isArray(value)) { |
||
1987 | throw new Error('case arguments must be an array'); |
||
1988 | } |
||
1989 | constructors.push(key); |
||
1990 | adt[key] = function () { |
||
1991 | var args = []; |
||
1992 | for (var _i = 0; _i < arguments.length; _i++) { |
||
1993 | args[_i] = arguments[_i]; |
||
1994 | } |
||
1995 | var argLength = args.length; |
||
1996 | if (argLength !== value.length) { |
||
1997 | throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); |
||
1998 | } |
||
1999 | var match = function (branches) { |
||
2000 | var branchKeys = keys(branches); |
||
2001 | if (constructors.length !== branchKeys.length) { |
||
2002 | throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); |
||
2003 | } |
||
2004 | var allReqd = forall(constructors, function (reqKey) { |
||
2005 | return contains$1(branchKeys, reqKey); |
||
2006 | }); |
||
2007 | if (!allReqd) { |
||
2008 | throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); |
||
2009 | } |
||
2010 | return branches[key].apply(null, args); |
||
2011 | }; |
||
2012 | return { |
||
2013 | fold: function () { |
||
2014 | var foldArgs = []; |
||
2015 | for (var _i = 0; _i < arguments.length; _i++) { |
||
2016 | foldArgs[_i] = arguments[_i]; |
||
2017 | } |
||
2018 | if (foldArgs.length !== cases.length) { |
||
2019 | throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length); |
||
2020 | } |
||
2021 | var target = foldArgs[count]; |
||
2022 | return target.apply(null, args); |
||
2023 | }, |
||
2024 | match: match, |
||
2025 | log: function (label) { |
||
2026 | console.log(label, { |
||
2027 | constructors: constructors, |
||
2028 | constructor: key, |
||
2029 | params: args |
||
2030 | }); |
||
2031 | } |
||
2032 | }; |
||
2033 | }; |
||
2034 | }); |
||
2035 | return adt; |
||
2036 | }; |
||
2037 | var Adt = { generate: generate$5 }; |
||
2038 | |||
2039 | Adt.generate([ |
||
2040 | { |
||
2041 | bothErrors: [ |
||
2042 | 'error1', |
||
2043 | 'error2' |
||
2044 | ] |
||
2045 | }, |
||
2046 | { |
||
2047 | firstError: [ |
||
2048 | 'error1', |
||
2049 | 'value2' |
||
2050 | ] |
||
2051 | }, |
||
2052 | { |
||
2053 | secondError: [ |
||
2054 | 'value1', |
||
2055 | 'error2' |
||
2056 | ] |
||
2057 | }, |
||
2058 | { |
||
2059 | bothValues: [ |
||
2060 | 'value1', |
||
2061 | 'value2' |
||
2062 | ] |
||
2063 | } |
||
2064 | ]); |
||
2065 | var partition = function (results) { |
||
2066 | var errors = []; |
||
2067 | var values = []; |
||
2068 | each$1(results, function (result) { |
||
2069 | result.fold(function (err) { |
||
2070 | errors.push(err); |
||
2071 | }, function (value) { |
||
2072 | values.push(value); |
||
2073 | }); |
||
2074 | }); |
||
2075 | return { |
||
2076 | errors: errors, |
||
2077 | values: values |
||
2078 | }; |
||
2079 | }; |
||
2080 | |||
2081 | var exclude$1 = function (obj, fields) { |
||
2082 | var r = {}; |
||
2083 | each(obj, function (v, k) { |
||
2084 | if (!contains$1(fields, k)) { |
||
2085 | r[k] = v; |
||
2086 | } |
||
2087 | }); |
||
2088 | return r; |
||
2089 | }; |
||
2090 | |||
2091 | var wrap$1 = function (key, value) { |
||
2092 | var _a; |
||
2093 | return _a = {}, _a[key] = value, _a; |
||
2094 | }; |
||
2095 | var wrapAll$1 = function (keyvalues) { |
||
2096 | var r = {}; |
||
2097 | each$1(keyvalues, function (kv) { |
||
2098 | r[kv.key] = kv.value; |
||
2099 | }); |
||
2100 | return r; |
||
2101 | }; |
||
2102 | |||
2103 | var exclude = function (obj, fields) { |
||
2104 | return exclude$1(obj, fields); |
||
2105 | }; |
||
2106 | var wrap = function (key, value) { |
||
2107 | return wrap$1(key, value); |
||
2108 | }; |
||
2109 | var wrapAll = function (keyvalues) { |
||
2110 | return wrapAll$1(keyvalues); |
||
2111 | }; |
||
2112 | var mergeValues = function (values, base) { |
||
2113 | return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge$1.apply(undefined, values))); |
||
2114 | }; |
||
2115 | var mergeErrors = function (errors) { |
||
2116 | return Result.error(flatten(errors)); |
||
2117 | }; |
||
2118 | var consolidate = function (objs, base) { |
||
2119 | var partitions = partition(objs); |
||
2120 | return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base); |
||
2121 | }; |
||
2122 | |||
2123 | var is = function (lhs, rhs, comparator) { |
||
2124 | if (comparator === void 0) { |
||
2125 | comparator = tripleEquals; |
||
2126 | } |
||
2127 | return lhs.exists(function (left) { |
||
2128 | return comparator(left, rhs); |
||
2129 | }); |
||
2130 | }; |
||
2131 | var cat = function (arr) { |
||
2132 | var r = []; |
||
2133 | var push = function (x) { |
||
2134 | r.push(x); |
||
2135 | }; |
||
2136 | for (var i = 0; i < arr.length; i++) { |
||
2137 | arr[i].each(push); |
||
2138 | } |
||
2139 | return r; |
||
2140 | }; |
||
2141 | var sequence = function (arr) { |
||
2142 | var r = []; |
||
2143 | for (var i = 0; i < arr.length; i++) { |
||
2144 | var x = arr[i]; |
||
2145 | if (x.isSome()) { |
||
2146 | r.push(x.getOrDie()); |
||
2147 | } else { |
||
2148 | return Optional.none(); |
||
2149 | } |
||
2150 | } |
||
2151 | return Optional.some(r); |
||
2152 | }; |
||
2153 | var lift2 = function (oa, ob, f) { |
||
2154 | return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); |
||
2155 | }; |
||
2156 | var someIf = function (b, a) { |
||
2157 | return b ? Optional.some(a) : Optional.none(); |
||
2158 | }; |
||
2159 | |||
597 | daniel-mar | 2160 | var ensureIsRoot = function (isRoot) { |
2161 | return isFunction(isRoot) ? isRoot : never; |
||
2162 | }; |
||
637 | daniel-mar | 2163 | var ancestor$2 = function (scope, transform, isRoot) { |
597 | daniel-mar | 2164 | var element = scope.dom; |
2165 | var stop = ensureIsRoot(isRoot); |
||
2166 | while (element.parentNode) { |
||
2167 | element = element.parentNode; |
||
2168 | var el = SugarElement.fromDom(element); |
||
2169 | var transformed = transform(el); |
||
2170 | if (transformed.isSome()) { |
||
2171 | return transformed; |
||
2172 | } else if (stop(el)) { |
||
2173 | break; |
||
2174 | } |
||
2175 | } |
||
2176 | return Optional.none(); |
||
2177 | }; |
||
637 | daniel-mar | 2178 | var closest$3 = function (scope, transform, isRoot) { |
597 | daniel-mar | 2179 | var current = transform(scope); |
2180 | var stop = ensureIsRoot(isRoot); |
||
2181 | return current.orThunk(function () { |
||
637 | daniel-mar | 2182 | return stop(scope) ? Optional.none() : ancestor$2(scope, transform, stop); |
597 | daniel-mar | 2183 | }); |
2184 | }; |
||
2185 | |||
2186 | var isSource = function (component, simulatedEvent) { |
||
2187 | return eq(component.element, simulatedEvent.event.target); |
||
2188 | }; |
||
2189 | |||
637 | daniel-mar | 2190 | var defaultEventHandler = { |
2191 | can: always, |
||
2192 | abort: never, |
||
2193 | run: noop |
||
2194 | }; |
||
597 | daniel-mar | 2195 | var nu$4 = function (parts) { |
2196 | if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) { |
||
2197 | throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!'); |
||
2198 | } |
||
637 | daniel-mar | 2199 | return __assign(__assign({}, defaultEventHandler), parts); |
597 | daniel-mar | 2200 | }; |
2201 | var all$1 = function (handlers, f) { |
||
2202 | return function () { |
||
2203 | var args = []; |
||
2204 | for (var _i = 0; _i < arguments.length; _i++) { |
||
2205 | args[_i] = arguments[_i]; |
||
2206 | } |
||
2207 | return foldl(handlers, function (acc, handler) { |
||
2208 | return acc && f(handler).apply(undefined, args); |
||
2209 | }, true); |
||
2210 | }; |
||
2211 | }; |
||
2212 | var any = function (handlers, f) { |
||
2213 | return function () { |
||
2214 | var args = []; |
||
2215 | for (var _i = 0; _i < arguments.length; _i++) { |
||
2216 | args[_i] = arguments[_i]; |
||
2217 | } |
||
2218 | return foldl(handlers, function (acc, handler) { |
||
2219 | return acc || f(handler).apply(undefined, args); |
||
2220 | }, false); |
||
2221 | }; |
||
2222 | }; |
||
2223 | var read$1 = function (handler) { |
||
2224 | return isFunction(handler) ? { |
||
2225 | can: always, |
||
2226 | abort: never, |
||
2227 | run: handler |
||
2228 | } : handler; |
||
2229 | }; |
||
637 | daniel-mar | 2230 | var fuse$1 = function (handlers) { |
597 | daniel-mar | 2231 | var can = all$1(handlers, function (handler) { |
2232 | return handler.can; |
||
2233 | }); |
||
2234 | var abort = any(handlers, function (handler) { |
||
2235 | return handler.abort; |
||
2236 | }); |
||
2237 | var run = function () { |
||
2238 | var args = []; |
||
2239 | for (var _i = 0; _i < arguments.length; _i++) { |
||
2240 | args[_i] = arguments[_i]; |
||
2241 | } |
||
637 | daniel-mar | 2242 | each$1(handlers, function (handler) { |
597 | daniel-mar | 2243 | handler.run.apply(undefined, args); |
2244 | }); |
||
2245 | }; |
||
637 | daniel-mar | 2246 | return { |
597 | daniel-mar | 2247 | can: can, |
2248 | abort: abort, |
||
2249 | run: run |
||
637 | daniel-mar | 2250 | }; |
597 | daniel-mar | 2251 | }; |
2252 | |||
637 | daniel-mar | 2253 | var derive$3 = function (configs) { |
2254 | return wrapAll(configs); |
||
597 | daniel-mar | 2255 | }; |
2256 | var abort = function (name, predicate) { |
||
2257 | return { |
||
2258 | key: name, |
||
2259 | value: nu$4({ abort: predicate }) |
||
2260 | }; |
||
2261 | }; |
||
2262 | var can = function (name, predicate) { |
||
2263 | return { |
||
2264 | key: name, |
||
2265 | value: nu$4({ can: predicate }) |
||
2266 | }; |
||
2267 | }; |
||
2268 | var run = function (name, handler) { |
||
2269 | return { |
||
2270 | key: name, |
||
2271 | value: nu$4({ run: handler }) |
||
2272 | }; |
||
2273 | }; |
||
2274 | var runActionExtra = function (name, action, extra) { |
||
2275 | return { |
||
2276 | key: name, |
||
2277 | value: nu$4({ |
||
2278 | run: function (component, simulatedEvent) { |
||
2279 | action.apply(undefined, [ |
||
2280 | component, |
||
2281 | simulatedEvent |
||
2282 | ].concat(extra)); |
||
2283 | } |
||
2284 | }) |
||
2285 | }; |
||
2286 | }; |
||
2287 | var runOnName = function (name) { |
||
2288 | return function (handler) { |
||
2289 | return run(name, handler); |
||
2290 | }; |
||
2291 | }; |
||
2292 | var runOnSourceName = function (name) { |
||
2293 | return function (handler) { |
||
2294 | return { |
||
2295 | key: name, |
||
2296 | value: nu$4({ |
||
2297 | run: function (component, simulatedEvent) { |
||
2298 | if (isSource(component, simulatedEvent)) { |
||
2299 | handler(component, simulatedEvent); |
||
2300 | } |
||
2301 | } |
||
2302 | }) |
||
2303 | }; |
||
2304 | }; |
||
2305 | }; |
||
2306 | var redirectToUid = function (name, uid) { |
||
2307 | return run(name, function (component, simulatedEvent) { |
||
2308 | component.getSystem().getByUid(uid).each(function (redirectee) { |
||
2309 | dispatchEvent(redirectee, redirectee.element, name, simulatedEvent); |
||
2310 | }); |
||
2311 | }); |
||
2312 | }; |
||
2313 | var redirectToPart = function (name, detail, partName) { |
||
2314 | var uid = detail.partUids[partName]; |
||
2315 | return redirectToUid(name, uid); |
||
2316 | }; |
||
2317 | var cutter = function (name) { |
||
2318 | return run(name, function (component, simulatedEvent) { |
||
2319 | simulatedEvent.cut(); |
||
2320 | }); |
||
2321 | }; |
||
2322 | var stopper = function (name) { |
||
2323 | return run(name, function (component, simulatedEvent) { |
||
2324 | simulatedEvent.stop(); |
||
2325 | }); |
||
2326 | }; |
||
2327 | var runOnSource = function (name, f) { |
||
2328 | return runOnSourceName(name)(f); |
||
2329 | }; |
||
2330 | var runOnAttached = runOnSourceName(attachedToDom()); |
||
2331 | var runOnDetached = runOnSourceName(detachedFromDom()); |
||
2332 | var runOnInit = runOnSourceName(systemInit()); |
||
637 | daniel-mar | 2333 | var runOnExecute = runOnName(execute$5()); |
597 | daniel-mar | 2334 | |
2335 | var markAsBehaviourApi = function (f, apiName, apiFunction) { |
||
2336 | var delegate = apiFunction.toString(); |
||
2337 | var endIndex = delegate.indexOf(')') + 1; |
||
2338 | var openBracketIndex = delegate.indexOf('('); |
||
2339 | var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); |
||
2340 | f.toFunctionAnnotation = function () { |
||
2341 | return { |
||
2342 | name: apiName, |
||
2343 | parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3))) |
||
2344 | }; |
||
2345 | }; |
||
2346 | return f; |
||
2347 | }; |
||
2348 | var cleanParameters = function (parameters) { |
||
637 | daniel-mar | 2349 | return map$2(parameters, function (p) { |
597 | daniel-mar | 2350 | return endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p; |
2351 | }); |
||
2352 | }; |
||
2353 | var markAsExtraApi = function (f, extraName) { |
||
2354 | var delegate = f.toString(); |
||
2355 | var endIndex = delegate.indexOf(')') + 1; |
||
2356 | var openBracketIndex = delegate.indexOf('('); |
||
2357 | var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); |
||
2358 | f.toFunctionAnnotation = function () { |
||
2359 | return { |
||
2360 | name: extraName, |
||
2361 | parameters: cleanParameters(parameters) |
||
2362 | }; |
||
2363 | }; |
||
2364 | return f; |
||
2365 | }; |
||
2366 | var markAsSketchApi = function (f, apiFunction) { |
||
2367 | var delegate = apiFunction.toString(); |
||
2368 | var endIndex = delegate.indexOf(')') + 1; |
||
2369 | var openBracketIndex = delegate.indexOf('('); |
||
2370 | var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); |
||
2371 | f.toFunctionAnnotation = function () { |
||
2372 | return { |
||
2373 | name: 'OVERRIDE', |
||
2374 | parameters: cleanParameters(parameters.slice(1)) |
||
2375 | }; |
||
2376 | }; |
||
2377 | return f; |
||
2378 | }; |
||
2379 | |||
637 | daniel-mar | 2380 | var nu$3 = function (s) { |
597 | daniel-mar | 2381 | return { |
637 | daniel-mar | 2382 | classes: isUndefined(s.classes) ? [] : s.classes, |
2383 | attributes: isUndefined(s.attributes) ? {} : s.attributes, |
||
2384 | styles: isUndefined(s.styles) ? {} : s.styles |
||
597 | daniel-mar | 2385 | }; |
2386 | }; |
||
637 | daniel-mar | 2387 | var merge = function (defnA, mod) { |
597 | daniel-mar | 2388 | return __assign(__assign({}, defnA), { |
2389 | attributes: __assign(__assign({}, defnA.attributes), mod.attributes), |
||
2390 | styles: __assign(__assign({}, defnA.styles), mod.styles), |
||
2391 | classes: defnA.classes.concat(mod.classes) |
||
2392 | }); |
||
2393 | }; |
||
2394 | |||
2395 | var executeEvent = function (bConfig, bState, executor) { |
||
2396 | return runOnExecute(function (component) { |
||
2397 | executor(component, bConfig, bState); |
||
2398 | }); |
||
2399 | }; |
||
2400 | var loadEvent = function (bConfig, bState, f) { |
||
2401 | return runOnInit(function (component, _simulatedEvent) { |
||
2402 | f(component, bConfig, bState); |
||
2403 | }); |
||
2404 | }; |
||
637 | daniel-mar | 2405 | var create$6 = function (schema, name, active, apis, extra, state) { |
597 | daniel-mar | 2406 | var configSchema = objOfOnly(schema); |
2407 | var schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]); |
||
2408 | return doCreate(configSchema, schemaSchema, name, active, apis, extra, state); |
||
2409 | }; |
||
637 | daniel-mar | 2410 | var createModes$1 = function (modes, name, active, apis, extra, state) { |
597 | daniel-mar | 2411 | var configSchema = modes; |
2412 | var schemaSchema = optionObjOf(name, [optionOf('config', modes)]); |
||
2413 | return doCreate(configSchema, schemaSchema, name, active, apis, extra, state); |
||
2414 | }; |
||
2415 | var wrapApi = function (bName, apiFunction, apiName) { |
||
2416 | var f = function (component) { |
||
2417 | var rest = []; |
||
2418 | for (var _i = 1; _i < arguments.length; _i++) { |
||
2419 | rest[_i - 1] = arguments[_i]; |
||
2420 | } |
||
2421 | var args = [component].concat(rest); |
||
637 | daniel-mar | 2422 | return component.config({ name: constant$1(bName) }).fold(function () { |
597 | daniel-mar | 2423 | throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName); |
2424 | }, function (info) { |
||
2425 | var rest = Array.prototype.slice.call(args, 1); |
||
2426 | return apiFunction.apply(undefined, [ |
||
2427 | component, |
||
2428 | info.config, |
||
2429 | info.state |
||
2430 | ].concat(rest)); |
||
2431 | }); |
||
2432 | }; |
||
2433 | return markAsBehaviourApi(f, apiName, apiFunction); |
||
2434 | }; |
||
2435 | var revokeBehaviour = function (name) { |
||
2436 | return { |
||
2437 | key: name, |
||
2438 | value: undefined |
||
2439 | }; |
||
2440 | }; |
||
2441 | var doCreate = function (configSchema, schemaSchema, name, active, apis, extra, state) { |
||
2442 | var getConfig = function (info) { |
||
2443 | return hasNonNullableKey(info, name) ? info[name]() : Optional.none(); |
||
2444 | }; |
||
2445 | var wrappedApis = map$1(apis, function (apiF, apiName) { |
||
2446 | return wrapApi(name, apiF, apiName); |
||
2447 | }); |
||
2448 | var wrappedExtra = map$1(extra, function (extraF, extraName) { |
||
2449 | return markAsExtraApi(extraF, extraName); |
||
2450 | }); |
||
2451 | var me = __assign(__assign(__assign({}, wrappedExtra), wrappedApis), { |
||
2452 | revoke: curry(revokeBehaviour, name), |
||
2453 | config: function (spec) { |
||
637 | daniel-mar | 2454 | var prepared = asRawOrDie$1(name + '-config', configSchema, spec); |
597 | daniel-mar | 2455 | return { |
2456 | key: name, |
||
2457 | value: { |
||
2458 | config: prepared, |
||
2459 | me: me, |
||
2460 | configAsRaw: cached(function () { |
||
637 | daniel-mar | 2461 | return asRawOrDie$1(name + '-config', configSchema, spec); |
597 | daniel-mar | 2462 | }), |
2463 | initialConfig: spec, |
||
2464 | state: state |
||
2465 | } |
||
2466 | }; |
||
2467 | }, |
||
637 | daniel-mar | 2468 | schema: constant$1(schemaSchema), |
597 | daniel-mar | 2469 | exhibit: function (info, base) { |
637 | daniel-mar | 2470 | return lift2(getConfig(info), get$c(active, 'exhibit'), function (behaviourInfo, exhibitor) { |
2471 | return exhibitor(base, behaviourInfo.config, behaviourInfo.state); |
||
2472 | }).getOrThunk(function () { |
||
2473 | return nu$3({}); |
||
2474 | }); |
||
597 | daniel-mar | 2475 | }, |
637 | daniel-mar | 2476 | name: constant$1(name), |
597 | daniel-mar | 2477 | handlers: function (info) { |
2478 | return getConfig(info).map(function (behaviourInfo) { |
||
637 | daniel-mar | 2479 | var getEvents = get$c(active, 'events').getOr(function () { |
597 | daniel-mar | 2480 | return {}; |
2481 | }); |
||
2482 | return getEvents(behaviourInfo.config, behaviourInfo.state); |
||
2483 | }).getOr({}); |
||
2484 | } |
||
2485 | }); |
||
2486 | return me; |
||
2487 | }; |
||
2488 | |||
2489 | var NoState = { |
||
2490 | init: function () { |
||
637 | daniel-mar | 2491 | return nu$2({ readState: constant$1('No State required') }); |
597 | daniel-mar | 2492 | } |
2493 | }; |
||
637 | daniel-mar | 2494 | var nu$2 = function (spec) { |
597 | daniel-mar | 2495 | return spec; |
2496 | }; |
||
2497 | |||
637 | daniel-mar | 2498 | var derive$2 = function (capabilities) { |
2499 | return wrapAll(capabilities); |
||
597 | daniel-mar | 2500 | }; |
2501 | var simpleSchema = objOfOnly([ |
||
637 | daniel-mar | 2502 | required$1('fields'), |
2503 | required$1('name'), |
||
2504 | defaulted('active', {}), |
||
2505 | defaulted('apis', {}), |
||
2506 | defaulted('state', NoState), |
||
2507 | defaulted('extra', {}) |
||
597 | daniel-mar | 2508 | ]); |
637 | daniel-mar | 2509 | var create$5 = function (data) { |
2510 | var value = asRawOrDie$1('Creating behaviour: ' + data.name, simpleSchema, data); |
||
2511 | return create$6(value.fields, value.name, value.active, value.apis, value.extra, value.state); |
||
597 | daniel-mar | 2512 | }; |
2513 | var modeSchema = objOfOnly([ |
||
637 | daniel-mar | 2514 | required$1('branchKey'), |
2515 | required$1('branches'), |
||
2516 | required$1('name'), |
||
2517 | defaulted('active', {}), |
||
2518 | defaulted('apis', {}), |
||
2519 | defaulted('state', NoState), |
||
2520 | defaulted('extra', {}) |
||
597 | daniel-mar | 2521 | ]); |
637 | daniel-mar | 2522 | var createModes = function (data) { |
2523 | var value = asRawOrDie$1('Creating behaviour: ' + data.name, modeSchema, data); |
||
2524 | return createModes$1(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state); |
||
597 | daniel-mar | 2525 | }; |
637 | daniel-mar | 2526 | var revoke = constant$1(undefined); |
597 | daniel-mar | 2527 | |
637 | daniel-mar | 2528 | var Swapping = create$5({ |
597 | daniel-mar | 2529 | fields: SwapSchema, |
2530 | name: 'swapping', |
||
2531 | apis: SwapApis |
||
2532 | }); |
||
2533 | |||
2534 | var Cell = function (initial) { |
||
2535 | var value = initial; |
||
2536 | var get = function () { |
||
2537 | return value; |
||
2538 | }; |
||
2539 | var set = function (v) { |
||
2540 | value = v; |
||
2541 | }; |
||
2542 | return { |
||
2543 | get: get, |
||
2544 | set: set |
||
2545 | }; |
||
2546 | }; |
||
2547 | |||
2548 | var getDocument = function () { |
||
2549 | return SugarElement.fromDom(document); |
||
2550 | }; |
||
2551 | |||
637 | daniel-mar | 2552 | var focus$3 = function (element) { |
597 | daniel-mar | 2553 | return element.dom.focus(); |
2554 | }; |
||
637 | daniel-mar | 2555 | var blur$1 = function (element) { |
597 | daniel-mar | 2556 | return element.dom.blur(); |
2557 | }; |
||
2558 | var hasFocus = function (element) { |
||
2559 | var root = getRootNode(element).dom; |
||
2560 | return element.dom === root.activeElement; |
||
2561 | }; |
||
2562 | var active = function (root) { |
||
2563 | if (root === void 0) { |
||
2564 | root = getDocument(); |
||
2565 | } |
||
2566 | return Optional.from(root.dom.activeElement).map(SugarElement.fromDom); |
||
2567 | }; |
||
2568 | var search = function (element) { |
||
2569 | return active(getRootNode(element)).filter(function (e) { |
||
2570 | return element.dom.contains(e.dom); |
||
2571 | }); |
||
2572 | }; |
||
2573 | |||
637 | daniel-mar | 2574 | var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); |
597 | daniel-mar | 2575 | |
637 | daniel-mar | 2576 | var global$4 = tinymce.util.Tools.resolve('tinymce.ThemeManager'); |
597 | daniel-mar | 2577 | |
2578 | var openLink = function (target) { |
||
2579 | var link = document.createElement('a'); |
||
2580 | link.target = '_blank'; |
||
2581 | link.href = target.href; |
||
2582 | link.rel = 'noreferrer noopener'; |
||
2583 | var nuEvt = document.createEvent('MouseEvents'); |
||
2584 | nuEvt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); |
||
2585 | document.body.appendChild(link); |
||
2586 | link.dispatchEvent(nuEvt); |
||
2587 | document.body.removeChild(link); |
||
2588 | }; |
||
2589 | |||
2590 | var DefaultStyleFormats = [ |
||
2591 | { |
||
2592 | title: 'Headings', |
||
2593 | items: [ |
||
2594 | { |
||
2595 | title: 'Heading 1', |
||
2596 | format: 'h1' |
||
2597 | }, |
||
2598 | { |
||
2599 | title: 'Heading 2', |
||
2600 | format: 'h2' |
||
2601 | }, |
||
2602 | { |
||
2603 | title: 'Heading 3', |
||
2604 | format: 'h3' |
||
2605 | }, |
||
2606 | { |
||
2607 | title: 'Heading 4', |
||
2608 | format: 'h4' |
||
2609 | }, |
||
2610 | { |
||
2611 | title: 'Heading 5', |
||
2612 | format: 'h5' |
||
2613 | }, |
||
2614 | { |
||
2615 | title: 'Heading 6', |
||
2616 | format: 'h6' |
||
2617 | } |
||
2618 | ] |
||
2619 | }, |
||
2620 | { |
||
2621 | title: 'Inline', |
||
2622 | items: [ |
||
2623 | { |
||
2624 | title: 'Bold', |
||
2625 | icon: 'bold', |
||
2626 | format: 'bold' |
||
2627 | }, |
||
2628 | { |
||
2629 | title: 'Italic', |
||
2630 | icon: 'italic', |
||
2631 | format: 'italic' |
||
2632 | }, |
||
2633 | { |
||
2634 | title: 'Underline', |
||
2635 | icon: 'underline', |
||
2636 | format: 'underline' |
||
2637 | }, |
||
2638 | { |
||
2639 | title: 'Strikethrough', |
||
2640 | icon: 'strikethrough', |
||
2641 | format: 'strikethrough' |
||
2642 | }, |
||
2643 | { |
||
2644 | title: 'Superscript', |
||
2645 | icon: 'superscript', |
||
2646 | format: 'superscript' |
||
2647 | }, |
||
2648 | { |
||
2649 | title: 'Subscript', |
||
2650 | icon: 'subscript', |
||
2651 | format: 'subscript' |
||
2652 | }, |
||
2653 | { |
||
2654 | title: 'Code', |
||
2655 | icon: 'code', |
||
2656 | format: 'code' |
||
2657 | } |
||
2658 | ] |
||
2659 | }, |
||
2660 | { |
||
2661 | title: 'Blocks', |
||
2662 | items: [ |
||
2663 | { |
||
2664 | title: 'Paragraph', |
||
2665 | format: 'p' |
||
2666 | }, |
||
2667 | { |
||
2668 | title: 'Blockquote', |
||
2669 | format: 'blockquote' |
||
2670 | }, |
||
2671 | { |
||
2672 | title: 'Div', |
||
2673 | format: 'div' |
||
2674 | }, |
||
2675 | { |
||
2676 | title: 'Pre', |
||
2677 | format: 'pre' |
||
2678 | } |
||
2679 | ] |
||
2680 | }, |
||
2681 | { |
||
2682 | title: 'Alignment', |
||
2683 | items: [ |
||
2684 | { |
||
2685 | title: 'Left', |
||
2686 | icon: 'alignleft', |
||
2687 | format: 'alignleft' |
||
2688 | }, |
||
2689 | { |
||
2690 | title: 'Center', |
||
2691 | icon: 'aligncenter', |
||
2692 | format: 'aligncenter' |
||
2693 | }, |
||
2694 | { |
||
2695 | title: 'Right', |
||
2696 | icon: 'alignright', |
||
2697 | format: 'alignright' |
||
2698 | }, |
||
2699 | { |
||
2700 | title: 'Justify', |
||
2701 | icon: 'alignjustify', |
||
2702 | format: 'alignjustify' |
||
2703 | } |
||
2704 | ] |
||
2705 | } |
||
2706 | ]; |
||
2707 | |||
2708 | var defaults = [ |
||
2709 | 'undo', |
||
2710 | 'bold', |
||
2711 | 'italic', |
||
2712 | 'link', |
||
2713 | 'image', |
||
2714 | 'bullist', |
||
2715 | 'styleselect' |
||
2716 | ]; |
||
2717 | var isSkinDisabled = function (editor) { |
||
2718 | return editor.getParam('skin') === false; |
||
2719 | }; |
||
2720 | var readOnlyOnInit = function (_editor) { |
||
2721 | return false; |
||
2722 | }; |
||
2723 | var getToolbar = function (editor) { |
||
2724 | return editor.getParam('toolbar', defaults, 'array'); |
||
2725 | }; |
||
2726 | var getStyleFormats = function (editor) { |
||
2727 | return editor.getParam('style_formats', DefaultStyleFormats, 'array'); |
||
2728 | }; |
||
2729 | var getSkinUrl = function (editor) { |
||
2730 | return editor.getParam('skin_url'); |
||
2731 | }; |
||
2732 | |||
2733 | var formatChanged = 'formatChanged'; |
||
2734 | var orientationChanged = 'orientationChanged'; |
||
2735 | var dropupDismissed = 'dropupDismissed'; |
||
2736 | |||
2737 | var fromHtml$1 = function (html, scope) { |
||
2738 | var doc = scope || document; |
||
2739 | var div = doc.createElement('div'); |
||
2740 | div.innerHTML = html; |
||
2741 | return children(SugarElement.fromDom(div)); |
||
2742 | }; |
||
2743 | |||
637 | daniel-mar | 2744 | var get$9 = function (element) { |
597 | daniel-mar | 2745 | return element.dom.innerHTML; |
2746 | }; |
||
637 | daniel-mar | 2747 | var set$7 = function (element, content) { |
2748 | var owner = owner$2(element); |
||
2749 | var docDom = owner.dom; |
||
597 | daniel-mar | 2750 | var fragment = SugarElement.fromDom(docDom.createDocumentFragment()); |
2751 | var contentElements = fromHtml$1(content, docDom); |
||
2752 | append$1(fragment, contentElements); |
||
2753 | empty(element); |
||
637 | daniel-mar | 2754 | append$2(element, fragment); |
597 | daniel-mar | 2755 | }; |
2756 | var getOuter = function (element) { |
||
2757 | var container = SugarElement.fromTag('div'); |
||
2758 | var clone = SugarElement.fromDom(element.dom.cloneNode(true)); |
||
637 | daniel-mar | 2759 | append$2(container, clone); |
2760 | return get$9(container); |
||
597 | daniel-mar | 2761 | }; |
2762 | |||
2763 | var clone = function (original, isDeep) { |
||
2764 | return SugarElement.fromDom(original.dom.cloneNode(isDeep)); |
||
2765 | }; |
||
637 | daniel-mar | 2766 | var shallow = function (original) { |
597 | daniel-mar | 2767 | return clone(original, false); |
2768 | }; |
||
2769 | |||
2770 | var getHtml = function (element) { |
||
2771 | if (isShadowRoot(element)) { |
||
2772 | return '#shadow-root'; |
||
2773 | } else { |
||
637 | daniel-mar | 2774 | var clone = shallow(element); |
597 | daniel-mar | 2775 | return getOuter(clone); |
2776 | } |
||
2777 | }; |
||
2778 | |||
2779 | var element = function (elem) { |
||
2780 | return getHtml(elem); |
||
2781 | }; |
||
2782 | |||
2783 | var chooseChannels = function (channels, message) { |
||
637 | daniel-mar | 2784 | return message.universal ? channels : filter$2(channels, function (ch) { |
2785 | return contains$1(message.channels, ch); |
||
597 | daniel-mar | 2786 | }); |
2787 | }; |
||
637 | daniel-mar | 2788 | var events$a = function (receiveConfig) { |
2789 | return derive$3([run(receive$1(), function (component, message) { |
||
597 | daniel-mar | 2790 | var channelMap = receiveConfig.channels; |
2791 | var channels = keys(channelMap); |
||
2792 | var receivingData = message; |
||
2793 | var targetChannels = chooseChannels(channels, receivingData); |
||
637 | daniel-mar | 2794 | each$1(targetChannels, function (ch) { |
597 | daniel-mar | 2795 | var channelInfo = channelMap[ch]; |
2796 | var channelSchema = channelInfo.schema; |
||
637 | daniel-mar | 2797 | var data = asRawOrDie$1('channel[' + ch + '] data\nReceiver: ' + element(component.element), channelSchema, receivingData.data); |
597 | daniel-mar | 2798 | channelInfo.onReceive(component, data); |
2799 | }); |
||
2800 | })]); |
||
2801 | }; |
||
2802 | |||
2803 | var ActiveReceiving = /*#__PURE__*/Object.freeze({ |
||
2804 | __proto__: null, |
||
637 | daniel-mar | 2805 | events: events$a |
597 | daniel-mar | 2806 | }); |
2807 | |||
637 | daniel-mar | 2808 | var unknown = 'unknown'; |
597 | daniel-mar | 2809 | var EventConfiguration; |
2810 | (function (EventConfiguration) { |
||
2811 | EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP'; |
||
2812 | EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL'; |
||
2813 | EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING'; |
||
2814 | }(EventConfiguration || (EventConfiguration = {}))); |
||
2815 | var eventConfig = Cell({}); |
||
2816 | var makeEventLogger = function (eventName, initialTarget) { |
||
2817 | var sequence = []; |
||
2818 | var startTime = new Date().getTime(); |
||
2819 | return { |
||
2820 | logEventCut: function (_name, target, purpose) { |
||
2821 | sequence.push({ |
||
2822 | outcome: 'cut', |
||
2823 | target: target, |
||
2824 | purpose: purpose |
||
2825 | }); |
||
2826 | }, |
||
2827 | logEventStopped: function (_name, target, purpose) { |
||
2828 | sequence.push({ |
||
2829 | outcome: 'stopped', |
||
2830 | target: target, |
||
2831 | purpose: purpose |
||
2832 | }); |
||
2833 | }, |
||
2834 | logNoParent: function (_name, target, purpose) { |
||
2835 | sequence.push({ |
||
2836 | outcome: 'no-parent', |
||
2837 | target: target, |
||
2838 | purpose: purpose |
||
2839 | }); |
||
2840 | }, |
||
2841 | logEventNoHandlers: function (_name, target) { |
||
2842 | sequence.push({ |
||
2843 | outcome: 'no-handlers-left', |
||
2844 | target: target |
||
2845 | }); |
||
2846 | }, |
||
2847 | logEventResponse: function (_name, target, purpose) { |
||
2848 | sequence.push({ |
||
2849 | outcome: 'response', |
||
2850 | purpose: purpose, |
||
2851 | target: target |
||
2852 | }); |
||
2853 | }, |
||
2854 | write: function () { |
||
2855 | var finishTime = new Date().getTime(); |
||
637 | daniel-mar | 2856 | if (contains$1([ |
597 | daniel-mar | 2857 | 'mousemove', |
2858 | 'mouseover', |
||
2859 | 'mouseout', |
||
2860 | systemInit() |
||
2861 | ], eventName)) { |
||
2862 | return; |
||
2863 | } |
||
2864 | console.log(eventName, { |
||
2865 | event: eventName, |
||
2866 | time: finishTime - startTime, |
||
2867 | target: initialTarget.dom, |
||
637 | daniel-mar | 2868 | sequence: map$2(sequence, function (s) { |
2869 | if (!contains$1([ |
||
597 | daniel-mar | 2870 | 'cut', |
2871 | 'stopped', |
||
2872 | 'response' |
||
2873 | ], s.outcome)) { |
||
2874 | return s.outcome; |
||
2875 | } else { |
||
2876 | return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')'; |
||
2877 | } |
||
2878 | }) |
||
2879 | }); |
||
2880 | } |
||
2881 | }; |
||
2882 | }; |
||
2883 | var processEvent = function (eventName, initialTarget, f) { |
||
637 | daniel-mar | 2884 | var status = get$c(eventConfig.get(), eventName).orThunk(function () { |
597 | daniel-mar | 2885 | var patterns = keys(eventConfig.get()); |
2886 | return findMap(patterns, function (p) { |
||
2887 | return eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.none(); |
||
2888 | }); |
||
2889 | }).getOr(EventConfiguration.NORMAL); |
||
2890 | switch (status) { |
||
2891 | case EventConfiguration.NORMAL: |
||
2892 | return f(noLogger()); |
||
2893 | case EventConfiguration.LOGGING: { |
||
2894 | var logger = makeEventLogger(eventName, initialTarget); |
||
2895 | var output = f(logger); |
||
2896 | logger.write(); |
||
2897 | return output; |
||
2898 | } |
||
2899 | case EventConfiguration.STOP: |
||
2900 | return true; |
||
2901 | } |
||
2902 | }; |
||
2903 | var path = [ |
||
2904 | 'alloy/data/Fields', |
||
2905 | 'alloy/debugging/Debugging' |
||
2906 | ]; |
||
2907 | var getTrace = function () { |
||
2908 | var err = new Error(); |
||
2909 | if (err.stack !== undefined) { |
||
2910 | var lines = err.stack.split('\n'); |
||
637 | daniel-mar | 2911 | return find$2(lines, function (line) { |
597 | daniel-mar | 2912 | return line.indexOf('alloy') > 0 && !exists(path, function (p) { |
2913 | return line.indexOf(p) > -1; |
||
2914 | }); |
||
637 | daniel-mar | 2915 | }).getOr(unknown); |
597 | daniel-mar | 2916 | } else { |
637 | daniel-mar | 2917 | return unknown; |
597 | daniel-mar | 2918 | } |
2919 | }; |
||
2920 | var ignoreEvent = { |
||
2921 | logEventCut: noop, |
||
2922 | logEventStopped: noop, |
||
2923 | logNoParent: noop, |
||
2924 | logEventNoHandlers: noop, |
||
2925 | logEventResponse: noop, |
||
2926 | write: noop |
||
2927 | }; |
||
2928 | var monitorEvent = function (eventName, initialTarget, f) { |
||
2929 | return processEvent(eventName, initialTarget, f); |
||
2930 | }; |
||
637 | daniel-mar | 2931 | var noLogger = constant$1(ignoreEvent); |
597 | daniel-mar | 2932 | |
637 | daniel-mar | 2933 | var menuFields = constant$1([ |
2934 | required$1('menu'), |
||
2935 | required$1('selectedMenu') |
||
597 | daniel-mar | 2936 | ]); |
637 | daniel-mar | 2937 | var itemFields = constant$1([ |
2938 | required$1('item'), |
||
2939 | required$1('selectedItem') |
||
597 | daniel-mar | 2940 | ]); |
637 | daniel-mar | 2941 | constant$1(objOf(itemFields().concat(menuFields()))); |
2942 | var itemSchema$1 = constant$1(objOf(itemFields())); |
||
597 | daniel-mar | 2943 | |
637 | daniel-mar | 2944 | var _initSize = requiredObjOf('initSize', [ |
2945 | required$1('numColumns'), |
||
2946 | required$1('numRows') |
||
597 | daniel-mar | 2947 | ]); |
2948 | var itemMarkers = function () { |
||
637 | daniel-mar | 2949 | return requiredOf('markers', itemSchema$1()); |
597 | daniel-mar | 2950 | }; |
2951 | var tieredMenuMarkers = function () { |
||
637 | daniel-mar | 2952 | return requiredObjOf('markers', [required$1('backgroundMenu')].concat(menuFields()).concat(itemFields())); |
597 | daniel-mar | 2953 | }; |
2954 | var markers = function (required) { |
||
637 | daniel-mar | 2955 | return requiredObjOf('markers', map$2(required, required$1)); |
597 | daniel-mar | 2956 | }; |
2957 | var onPresenceHandler = function (label, fieldName, presence) { |
||
637 | daniel-mar | 2958 | getTrace(); |
2959 | return field$2(fieldName, fieldName, presence, valueOf(function (f) { |
||
597 | daniel-mar | 2960 | return Result.value(function () { |
2961 | var args = []; |
||
2962 | for (var _i = 0; _i < arguments.length; _i++) { |
||
2963 | args[_i] = arguments[_i]; |
||
2964 | } |
||
2965 | return f.apply(undefined, args); |
||
2966 | }); |
||
2967 | })); |
||
2968 | }; |
||
2969 | var onHandler = function (fieldName) { |
||
637 | daniel-mar | 2970 | return onPresenceHandler('onHandler', fieldName, defaulted$1(noop)); |
597 | daniel-mar | 2971 | }; |
2972 | var onKeyboardHandler = function (fieldName) { |
||
637 | daniel-mar | 2973 | return onPresenceHandler('onKeyboardHandler', fieldName, defaulted$1(Optional.none)); |
597 | daniel-mar | 2974 | }; |
2975 | var onStrictHandler = function (fieldName) { |
||
637 | daniel-mar | 2976 | return onPresenceHandler('onHandler', fieldName, required$2()); |
597 | daniel-mar | 2977 | }; |
2978 | var onStrictKeyboardHandler = function (fieldName) { |
||
637 | daniel-mar | 2979 | return onPresenceHandler('onKeyboardHandler', fieldName, required$2()); |
597 | daniel-mar | 2980 | }; |
2981 | var output = function (name, value) { |
||
637 | daniel-mar | 2982 | return customField(name, constant$1(value)); |
597 | daniel-mar | 2983 | }; |
2984 | var snapshot = function (name) { |
||
637 | daniel-mar | 2985 | return customField(name, identity); |
597 | daniel-mar | 2986 | }; |
637 | daniel-mar | 2987 | var initSize = constant$1(_initSize); |
597 | daniel-mar | 2988 | |
637 | daniel-mar | 2989 | var ReceivingSchema = [requiredOf('channels', setOf(Result.value, objOfOnly([ |
597 | daniel-mar | 2990 | onStrictHandler('onReceive'), |
637 | daniel-mar | 2991 | defaulted('schema', anyValue()) |
597 | daniel-mar | 2992 | ])))]; |
2993 | |||
637 | daniel-mar | 2994 | var Receiving = create$5({ |
597 | daniel-mar | 2995 | fields: ReceivingSchema, |
2996 | name: 'receiving', |
||
2997 | active: ActiveReceiving |
||
2998 | }); |
||
2999 | |||
3000 | var SetupBehaviourCellState = function (initialState) { |
||
3001 | var init = function () { |
||
3002 | var cell = Cell(initialState); |
||
3003 | var get = function () { |
||
3004 | return cell.get(); |
||
3005 | }; |
||
3006 | var set = function (newState) { |
||
3007 | return cell.set(newState); |
||
3008 | }; |
||
3009 | var clear = function () { |
||
3010 | return cell.set(initialState); |
||
3011 | }; |
||
3012 | var readState = function () { |
||
3013 | return cell.get(); |
||
3014 | }; |
||
3015 | return { |
||
3016 | get: get, |
||
3017 | set: set, |
||
3018 | clear: clear, |
||
3019 | readState: readState |
||
3020 | }; |
||
3021 | }; |
||
3022 | return { init: init }; |
||
3023 | }; |
||
3024 | |||
3025 | var updateAriaState = function (component, toggleConfig, toggleState) { |
||
3026 | var ariaInfo = toggleConfig.aria; |
||
3027 | ariaInfo.update(component, ariaInfo, toggleState.get()); |
||
3028 | }; |
||
3029 | var updateClass = function (component, toggleConfig, toggleState) { |
||
3030 | toggleConfig.toggleClass.each(function (toggleClass) { |
||
3031 | if (toggleState.get()) { |
||
637 | daniel-mar | 3032 | add$1(component.element, toggleClass); |
597 | daniel-mar | 3033 | } else { |
637 | daniel-mar | 3034 | remove$3(component.element, toggleClass); |
597 | daniel-mar | 3035 | } |
3036 | }); |
||
3037 | }; |
||
3038 | var toggle = function (component, toggleConfig, toggleState) { |
||
637 | daniel-mar | 3039 | set$6(component, toggleConfig, toggleState, !toggleState.get()); |
597 | daniel-mar | 3040 | }; |
637 | daniel-mar | 3041 | var on$1 = function (component, toggleConfig, toggleState) { |
597 | daniel-mar | 3042 | toggleState.set(true); |
3043 | updateClass(component, toggleConfig, toggleState); |
||
3044 | updateAriaState(component, toggleConfig, toggleState); |
||
3045 | }; |
||
3046 | var off = function (component, toggleConfig, toggleState) { |
||
3047 | toggleState.set(false); |
||
3048 | updateClass(component, toggleConfig, toggleState); |
||
3049 | updateAriaState(component, toggleConfig, toggleState); |
||
3050 | }; |
||
637 | daniel-mar | 3051 | var set$6 = function (component, toggleConfig, toggleState, state) { |
3052 | var action = state ? on$1 : off; |
||
597 | daniel-mar | 3053 | action(component, toggleConfig, toggleState); |
3054 | }; |
||
3055 | var isOn = function (component, toggleConfig, toggleState) { |
||
3056 | return toggleState.get(); |
||
3057 | }; |
||
637 | daniel-mar | 3058 | var onLoad$5 = function (component, toggleConfig, toggleState) { |
3059 | set$6(component, toggleConfig, toggleState, toggleConfig.selected); |
||
597 | daniel-mar | 3060 | }; |
3061 | |||
3062 | var ToggleApis = /*#__PURE__*/Object.freeze({ |
||
3063 | __proto__: null, |
||
637 | daniel-mar | 3064 | onLoad: onLoad$5, |
597 | daniel-mar | 3065 | toggle: toggle, |
3066 | isOn: isOn, |
||
637 | daniel-mar | 3067 | on: on$1, |
597 | daniel-mar | 3068 | off: off, |
637 | daniel-mar | 3069 | set: set$6 |
597 | daniel-mar | 3070 | }); |
3071 | |||
637 | daniel-mar | 3072 | var exhibit$5 = function () { |
3073 | return nu$3({}); |
||
597 | daniel-mar | 3074 | }; |
637 | daniel-mar | 3075 | var events$9 = function (toggleConfig, toggleState) { |
597 | daniel-mar | 3076 | var execute = executeEvent(toggleConfig, toggleState, toggle); |
637 | daniel-mar | 3077 | var load = loadEvent(toggleConfig, toggleState, onLoad$5); |
3078 | return derive$3(flatten([ |
||
597 | daniel-mar | 3079 | toggleConfig.toggleOnExecute ? [execute] : [], |
3080 | [load] |
||
3081 | ])); |
||
3082 | }; |
||
3083 | |||
3084 | var ActiveToggle = /*#__PURE__*/Object.freeze({ |
||
3085 | __proto__: null, |
||
637 | daniel-mar | 3086 | exhibit: exhibit$5, |
3087 | events: events$9 |
||
597 | daniel-mar | 3088 | }); |
3089 | |||
3090 | var updatePressed = function (component, ariaInfo, status) { |
||
637 | daniel-mar | 3091 | set$8(component.element, 'aria-pressed', status); |
597 | daniel-mar | 3092 | if (ariaInfo.syncWithExpanded) { |
3093 | updateExpanded(component, ariaInfo, status); |
||
3094 | } |
||
3095 | }; |
||
3096 | var updateSelected = function (component, ariaInfo, status) { |
||
637 | daniel-mar | 3097 | set$8(component.element, 'aria-selected', status); |
597 | daniel-mar | 3098 | }; |
3099 | var updateChecked = function (component, ariaInfo, status) { |
||
637 | daniel-mar | 3100 | set$8(component.element, 'aria-checked', status); |
597 | daniel-mar | 3101 | }; |
3102 | var updateExpanded = function (component, ariaInfo, status) { |
||
637 | daniel-mar | 3103 | set$8(component.element, 'aria-expanded', status); |
597 | daniel-mar | 3104 | }; |
3105 | |||
3106 | var ToggleSchema = [ |
||
637 | daniel-mar | 3107 | defaulted('selected', false), |
597 | daniel-mar | 3108 | option('toggleClass'), |
637 | daniel-mar | 3109 | defaulted('toggleOnExecute', true), |
597 | daniel-mar | 3110 | defaultedOf('aria', { mode: 'none' }, choose$1('mode', { |
3111 | pressed: [ |
||
637 | daniel-mar | 3112 | defaulted('syncWithExpanded', false), |
597 | daniel-mar | 3113 | output('update', updatePressed) |
3114 | ], |
||
3115 | checked: [output('update', updateChecked)], |
||
3116 | expanded: [output('update', updateExpanded)], |
||
3117 | selected: [output('update', updateSelected)], |
||
3118 | none: [output('update', noop)] |
||
3119 | })) |
||
3120 | ]; |
||
3121 | |||
637 | daniel-mar | 3122 | var Toggling = create$5({ |
597 | daniel-mar | 3123 | fields: ToggleSchema, |
3124 | name: 'toggling', |
||
3125 | active: ActiveToggle, |
||
3126 | apis: ToggleApis, |
||
3127 | state: SetupBehaviourCellState(false) |
||
3128 | }); |
||
3129 | |||
3130 | var format = function (command, update) { |
||
3131 | return Receiving.config({ |
||
637 | daniel-mar | 3132 | channels: wrap(formatChanged, { |
597 | daniel-mar | 3133 | onReceive: function (button, data) { |
3134 | if (data.command === command) { |
||
3135 | update(button, data.state); |
||
3136 | } |
||
3137 | } |
||
3138 | }) |
||
3139 | }); |
||
3140 | }; |
||
3141 | var orientation = function (onReceive) { |
||
637 | daniel-mar | 3142 | return Receiving.config({ channels: wrap(orientationChanged, { onReceive: onReceive }) }); |
597 | daniel-mar | 3143 | }; |
637 | daniel-mar | 3144 | var receive = function (channel, onReceive) { |
597 | daniel-mar | 3145 | return { |
3146 | key: channel, |
||
3147 | value: { onReceive: onReceive } |
||
3148 | }; |
||
3149 | }; |
||
3150 | |||
637 | daniel-mar | 3151 | var prefix$2 = 'tinymce-mobile'; |
597 | daniel-mar | 3152 | var resolve = function (p) { |
637 | daniel-mar | 3153 | return prefix$2 + '-' + p; |
597 | daniel-mar | 3154 | }; |
3155 | |||
3156 | var pointerEvents = function () { |
||
3157 | var onClick = function (component, simulatedEvent) { |
||
3158 | simulatedEvent.stop(); |
||
3159 | emitExecute(component); |
||
3160 | }; |
||
3161 | return [ |
||
3162 | run(click(), onClick), |
||
3163 | run(tap(), onClick), |
||
3164 | cutter(touchstart()), |
||
3165 | cutter(mousedown()) |
||
3166 | ]; |
||
3167 | }; |
||
637 | daniel-mar | 3168 | var events$8 = function (optAction) { |
597 | daniel-mar | 3169 | var executeHandler = function (action) { |
3170 | return runOnExecute(function (component, simulatedEvent) { |
||
3171 | action(component); |
||
3172 | simulatedEvent.stop(); |
||
3173 | }); |
||
3174 | }; |
||
637 | daniel-mar | 3175 | return derive$3(flatten([ |
597 | daniel-mar | 3176 | optAction.map(executeHandler).toArray(), |
3177 | pointerEvents() |
||
3178 | ])); |
||
3179 | }; |
||
3180 | |||
3181 | var focus$2 = function (component, focusConfig) { |
||
3182 | if (!focusConfig.ignore) { |
||
637 | daniel-mar | 3183 | focus$3(component.element); |
597 | daniel-mar | 3184 | focusConfig.onFocus(component); |
3185 | } |
||
3186 | }; |
||
637 | daniel-mar | 3187 | var blur = function (component, focusConfig) { |
597 | daniel-mar | 3188 | if (!focusConfig.ignore) { |
637 | daniel-mar | 3189 | blur$1(component.element); |
597 | daniel-mar | 3190 | } |
3191 | }; |
||
3192 | var isFocused = function (component) { |
||
3193 | return hasFocus(component.element); |
||
3194 | }; |
||
3195 | |||
3196 | var FocusApis = /*#__PURE__*/Object.freeze({ |
||
3197 | __proto__: null, |
||
3198 | focus: focus$2, |
||
637 | daniel-mar | 3199 | blur: blur, |
597 | daniel-mar | 3200 | isFocused: isFocused |
3201 | }); |
||
3202 | |||
637 | daniel-mar | 3203 | var exhibit$4 = function (base, focusConfig) { |
597 | daniel-mar | 3204 | var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } }; |
637 | daniel-mar | 3205 | return nu$3(mod); |
597 | daniel-mar | 3206 | }; |
637 | daniel-mar | 3207 | var events$7 = function (focusConfig) { |
3208 | return derive$3([run(focus$4(), function (component, simulatedEvent) { |
||
597 | daniel-mar | 3209 | focus$2(component, focusConfig); |
3210 | simulatedEvent.stop(); |
||
3211 | })].concat(focusConfig.stopMousedown ? [run(mousedown(), function (_, simulatedEvent) { |
||
3212 | simulatedEvent.event.prevent(); |
||
3213 | })] : [])); |
||
3214 | }; |
||
3215 | |||
3216 | var ActiveFocus = /*#__PURE__*/Object.freeze({ |
||
3217 | __proto__: null, |
||
637 | daniel-mar | 3218 | exhibit: exhibit$4, |
3219 | events: events$7 |
||
597 | daniel-mar | 3220 | }); |
3221 | |||
3222 | var FocusSchema = [ |
||
3223 | onHandler('onFocus'), |
||
637 | daniel-mar | 3224 | defaulted('stopMousedown', false), |
3225 | defaulted('ignore', false) |
||
597 | daniel-mar | 3226 | ]; |
3227 | |||
637 | daniel-mar | 3228 | var Focusing = create$5({ |
597 | daniel-mar | 3229 | fields: FocusSchema, |
3230 | name: 'focusing', |
||
3231 | active: ActiveFocus, |
||
3232 | apis: FocusApis |
||
3233 | }); |
||
3234 | |||
637 | daniel-mar | 3235 | var isSupported = function (dom) { |
597 | daniel-mar | 3236 | return dom.style !== undefined && isFunction(dom.style.getPropertyValue); |
3237 | }; |
||
3238 | |||
3239 | var internalSet = function (dom, property, value) { |
||
3240 | if (!isString(value)) { |
||
3241 | console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); |
||
3242 | throw new Error('CSS value must be a string: ' + value); |
||
3243 | } |
||
637 | daniel-mar | 3244 | if (isSupported(dom)) { |
597 | daniel-mar | 3245 | dom.style.setProperty(property, value); |
3246 | } |
||
3247 | }; |
||
3248 | var internalRemove = function (dom, property) { |
||
637 | daniel-mar | 3249 | if (isSupported(dom)) { |
597 | daniel-mar | 3250 | dom.style.removeProperty(property); |
3251 | } |
||
3252 | }; |
||
637 | daniel-mar | 3253 | var set$5 = function (element, property, value) { |
597 | daniel-mar | 3254 | var dom = element.dom; |
3255 | internalSet(dom, property, value); |
||
3256 | }; |
||
637 | daniel-mar | 3257 | var setAll = function (element, css) { |
597 | daniel-mar | 3258 | var dom = element.dom; |
637 | daniel-mar | 3259 | each(css, function (v, k) { |
597 | daniel-mar | 3260 | internalSet(dom, k, v); |
3261 | }); |
||
3262 | }; |
||
637 | daniel-mar | 3263 | var get$8 = function (element, property) { |
597 | daniel-mar | 3264 | var dom = element.dom; |
3265 | var styles = window.getComputedStyle(dom); |
||
3266 | var r = styles.getPropertyValue(property); |
||
3267 | return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; |
||
3268 | }; |
||
3269 | var getUnsafeProperty = function (dom, property) { |
||
637 | daniel-mar | 3270 | return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; |
597 | daniel-mar | 3271 | }; |
3272 | var getRaw = function (element, property) { |
||
3273 | var dom = element.dom; |
||
3274 | var raw = getUnsafeProperty(dom, property); |
||
3275 | return Optional.from(raw).filter(function (r) { |
||
3276 | return r.length > 0; |
||
3277 | }); |
||
3278 | }; |
||
637 | daniel-mar | 3279 | var remove$2 = function (element, property) { |
597 | daniel-mar | 3280 | var dom = element.dom; |
3281 | internalRemove(dom, property); |
||
637 | daniel-mar | 3282 | if (is(getOpt(element, 'style').map(trim), '')) { |
3283 | remove$6(element, 'style'); |
||
597 | daniel-mar | 3284 | } |
3285 | }; |
||
3286 | var reflow = function (e) { |
||
3287 | return e.dom.offsetWidth; |
||
3288 | }; |
||
3289 | |||
3290 | var Dimension = function (name, getOffset) { |
||
3291 | var set = function (element, h) { |
||
3292 | if (!isNumber(h) && !h.match(/^[0-9]+$/)) { |
||
3293 | throw new Error(name + '.set accepts only positive integer values. Value was ' + h); |
||
3294 | } |
||
3295 | var dom = element.dom; |
||
637 | daniel-mar | 3296 | if (isSupported(dom)) { |
597 | daniel-mar | 3297 | dom.style[name] = h + 'px'; |
3298 | } |
||
3299 | }; |
||
3300 | var get = function (element) { |
||
3301 | var r = getOffset(element); |
||
3302 | if (r <= 0 || r === null) { |
||
637 | daniel-mar | 3303 | var css = get$8(element, name); |
597 | daniel-mar | 3304 | return parseFloat(css) || 0; |
3305 | } |
||
3306 | return r; |
||
3307 | }; |
||
3308 | var getOuter = get; |
||
3309 | var aggregate = function (element, properties) { |
||
3310 | return foldl(properties, function (acc, property) { |
||
637 | daniel-mar | 3311 | var val = get$8(element, property); |
597 | daniel-mar | 3312 | var value = val === undefined ? 0 : parseInt(val, 10); |
3313 | return isNaN(value) ? acc : acc + value; |
||
3314 | }, 0); |
||
3315 | }; |
||
3316 | var max = function (element, value, properties) { |
||
3317 | var cumulativeInclusions = aggregate(element, properties); |
||
3318 | var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0; |
||
3319 | return absoluteMax; |
||
3320 | }; |
||
3321 | return { |
||
3322 | set: set, |
||
3323 | get: get, |
||
3324 | getOuter: getOuter, |
||
3325 | aggregate: aggregate, |
||
3326 | max: max |
||
3327 | }; |
||
3328 | }; |
||
3329 | |||
637 | daniel-mar | 3330 | var api$3 = Dimension('height', function (element) { |
597 | daniel-mar | 3331 | var dom = element.dom; |
3332 | return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; |
||
3333 | }); |
||
637 | daniel-mar | 3334 | var get$7 = function (element) { |
3335 | return api$3.get(element); |
||
597 | daniel-mar | 3336 | }; |
3337 | |||
637 | daniel-mar | 3338 | var ancestors$1 = function (scope, predicate, isRoot) { |
3339 | return filter$2(parents(scope, isRoot), predicate); |
||
597 | daniel-mar | 3340 | }; |
3341 | var siblings$1 = function (scope, predicate) { |
||
637 | daniel-mar | 3342 | return filter$2(siblings$2(scope), predicate); |
597 | daniel-mar | 3343 | }; |
3344 | |||
637 | daniel-mar | 3345 | var all = function (selector) { |
3346 | return all$2(selector); |
||
597 | daniel-mar | 3347 | }; |
637 | daniel-mar | 3348 | var ancestors = function (scope, selector, isRoot) { |
3349 | return ancestors$1(scope, function (e) { |
||
3350 | return is$1(e, selector); |
||
597 | daniel-mar | 3351 | }, isRoot); |
3352 | }; |
||
637 | daniel-mar | 3353 | var siblings = function (scope, selector) { |
597 | daniel-mar | 3354 | return siblings$1(scope, function (e) { |
637 | daniel-mar | 3355 | return is$1(e, selector); |
597 | daniel-mar | 3356 | }); |
3357 | }; |
||
3358 | var descendants = function (scope, selector) { |
||
637 | daniel-mar | 3359 | return all$2(selector, scope); |
597 | daniel-mar | 3360 | }; |
3361 | |||
3362 | function ClosestOrAncestor (is, ancestor, scope, a, isRoot) { |
||
3363 | if (is(scope, a)) { |
||
3364 | return Optional.some(scope); |
||
3365 | } else if (isFunction(isRoot) && isRoot(scope)) { |
||
3366 | return Optional.none(); |
||
3367 | } else { |
||
3368 | return ancestor(scope, a, isRoot); |
||
3369 | } |
||
3370 | } |
||
3371 | |||
3372 | var ancestor$1 = function (scope, predicate, isRoot) { |
||
3373 | var element = scope.dom; |
||
3374 | var stop = isFunction(isRoot) ? isRoot : never; |
||
3375 | while (element.parentNode) { |
||
3376 | element = element.parentNode; |
||
3377 | var el = SugarElement.fromDom(element); |
||
3378 | if (predicate(el)) { |
||
3379 | return Optional.some(el); |
||
3380 | } else if (stop(el)) { |
||
3381 | break; |
||
3382 | } |
||
3383 | } |
||
3384 | return Optional.none(); |
||
3385 | }; |
||
637 | daniel-mar | 3386 | var closest$2 = function (scope, predicate, isRoot) { |
597 | daniel-mar | 3387 | var is = function (s, test) { |
3388 | return test(s); |
||
3389 | }; |
||
3390 | return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot); |
||
3391 | }; |
||
637 | daniel-mar | 3392 | var descendant$1 = function (scope, predicate) { |
597 | daniel-mar | 3393 | var descend = function (node) { |
3394 | for (var i = 0; i < node.childNodes.length; i++) { |
||
3395 | var child_1 = SugarElement.fromDom(node.childNodes[i]); |
||
3396 | if (predicate(child_1)) { |
||
3397 | return Optional.some(child_1); |
||
3398 | } |
||
3399 | var res = descend(node.childNodes[i]); |
||
3400 | if (res.isSome()) { |
||
3401 | return res; |
||
3402 | } |
||
3403 | } |
||
3404 | return Optional.none(); |
||
3405 | }; |
||
3406 | return descend(scope.dom); |
||
3407 | }; |
||
3408 | |||
637 | daniel-mar | 3409 | var first$1 = function (selector) { |
597 | daniel-mar | 3410 | return one(selector); |
3411 | }; |
||
637 | daniel-mar | 3412 | var ancestor = function (scope, selector, isRoot) { |
597 | daniel-mar | 3413 | return ancestor$1(scope, function (e) { |
637 | daniel-mar | 3414 | return is$1(e, selector); |
597 | daniel-mar | 3415 | }, isRoot); |
3416 | }; |
||
637 | daniel-mar | 3417 | var descendant = function (scope, selector) { |
597 | daniel-mar | 3418 | return one(selector, scope); |
3419 | }; |
||
637 | daniel-mar | 3420 | var closest$1 = function (scope, selector, isRoot) { |
3421 | var is = function (element, selector) { |
||
3422 | return is$1(element, selector); |
||
597 | daniel-mar | 3423 | }; |
637 | daniel-mar | 3424 | return ClosestOrAncestor(is, ancestor, scope, selector, isRoot); |
597 | daniel-mar | 3425 | }; |
3426 | |||
3427 | var BACKSPACE = [8]; |
||
3428 | var TAB = [9]; |
||
3429 | var ENTER = [13]; |
||
3430 | var ESCAPE = [27]; |
||
3431 | var SPACE = [32]; |
||
3432 | var LEFT = [37]; |
||
3433 | var UP = [38]; |
||
3434 | var RIGHT = [39]; |
||
3435 | var DOWN = [40]; |
||
3436 | |||
3437 | var cyclePrev = function (values, index, predicate) { |
||
3438 | var before = reverse(values.slice(0, index)); |
||
3439 | var after = reverse(values.slice(index + 1)); |
||
637 | daniel-mar | 3440 | return find$2(before.concat(after), predicate); |
597 | daniel-mar | 3441 | }; |
3442 | var tryPrev = function (values, index, predicate) { |
||
3443 | var before = reverse(values.slice(0, index)); |
||
637 | daniel-mar | 3444 | return find$2(before, predicate); |
597 | daniel-mar | 3445 | }; |
3446 | var cycleNext = function (values, index, predicate) { |
||
3447 | var before = values.slice(0, index); |
||
3448 | var after = values.slice(index + 1); |
||
637 | daniel-mar | 3449 | return find$2(after.concat(before), predicate); |
597 | daniel-mar | 3450 | }; |
3451 | var tryNext = function (values, index, predicate) { |
||
3452 | var after = values.slice(index + 1); |
||
637 | daniel-mar | 3453 | return find$2(after, predicate); |
597 | daniel-mar | 3454 | }; |
3455 | |||
3456 | var inSet = function (keys) { |
||
3457 | return function (event) { |
||
3458 | var raw = event.raw; |
||
637 | daniel-mar | 3459 | return contains$1(keys, raw.which); |
597 | daniel-mar | 3460 | }; |
3461 | }; |
||
3462 | var and = function (preds) { |
||
3463 | return function (event) { |
||
3464 | return forall(preds, function (pred) { |
||
3465 | return pred(event); |
||
3466 | }); |
||
3467 | }; |
||
3468 | }; |
||
3469 | var isShift = function (event) { |
||
3470 | var raw = event.raw; |
||
3471 | return raw.shiftKey === true; |
||
3472 | }; |
||
3473 | var isControl = function (event) { |
||
3474 | var raw = event.raw; |
||
3475 | return raw.ctrlKey === true; |
||
3476 | }; |
||
3477 | var isNotShift = not(isShift); |
||
3478 | |||
3479 | var rule = function (matches, action) { |
||
3480 | return { |
||
3481 | matches: matches, |
||
3482 | classification: action |
||
3483 | }; |
||
3484 | }; |
||
637 | daniel-mar | 3485 | var choose = function (transitions, event) { |
3486 | var transition = find$2(transitions, function (t) { |
||
597 | daniel-mar | 3487 | return t.matches(event); |
3488 | }); |
||
3489 | return transition.map(function (t) { |
||
3490 | return t.classification; |
||
3491 | }); |
||
3492 | }; |
||
3493 | |||
3494 | var cycleBy = function (value, delta, min, max) { |
||
3495 | var r = value + delta; |
||
3496 | if (r > max) { |
||
3497 | return min; |
||
3498 | } else if (r < min) { |
||
3499 | return max; |
||
3500 | } else { |
||
3501 | return r; |
||
3502 | } |
||
3503 | }; |
||
3504 | var clamp = function (value, min, max) { |
||
3505 | return Math.min(Math.max(value, min), max); |
||
3506 | }; |
||
3507 | |||
3508 | var dehighlightAllExcept = function (component, hConfig, hState, skip) { |
||
3509 | var highlighted = descendants(component.element, '.' + hConfig.highlightClass); |
||
637 | daniel-mar | 3510 | each$1(highlighted, function (h) { |
597 | daniel-mar | 3511 | if (!exists(skip, function (skipComp) { |
3512 | return skipComp.element === h; |
||
3513 | })) { |
||
637 | daniel-mar | 3514 | remove$3(h, hConfig.highlightClass); |
597 | daniel-mar | 3515 | component.getSystem().getByDom(h).each(function (target) { |
3516 | hConfig.onDehighlight(component, target); |
||
637 | daniel-mar | 3517 | emit(target, dehighlight$1()); |
597 | daniel-mar | 3518 | }); |
3519 | } |
||
3520 | }); |
||
3521 | }; |
||
3522 | var dehighlightAll = function (component, hConfig, hState) { |
||
3523 | return dehighlightAllExcept(component, hConfig, hState, []); |
||
3524 | }; |
||
637 | daniel-mar | 3525 | var dehighlight = function (component, hConfig, hState, target) { |
597 | daniel-mar | 3526 | if (isHighlighted(component, hConfig, hState, target)) { |
637 | daniel-mar | 3527 | remove$3(target.element, hConfig.highlightClass); |
597 | daniel-mar | 3528 | hConfig.onDehighlight(component, target); |
637 | daniel-mar | 3529 | emit(target, dehighlight$1()); |
597 | daniel-mar | 3530 | } |
3531 | }; |
||
637 | daniel-mar | 3532 | var highlight = function (component, hConfig, hState, target) { |
597 | daniel-mar | 3533 | dehighlightAllExcept(component, hConfig, hState, [target]); |
3534 | if (!isHighlighted(component, hConfig, hState, target)) { |
||
637 | daniel-mar | 3535 | add$1(target.element, hConfig.highlightClass); |
597 | daniel-mar | 3536 | hConfig.onHighlight(component, target); |
637 | daniel-mar | 3537 | emit(target, highlight$1()); |
597 | daniel-mar | 3538 | } |
3539 | }; |
||
3540 | var highlightFirst = function (component, hConfig, hState) { |
||
3541 | getFirst(component, hConfig).each(function (firstComp) { |
||
637 | daniel-mar | 3542 | highlight(component, hConfig, hState, firstComp); |
597 | daniel-mar | 3543 | }); |
3544 | }; |
||
3545 | var highlightLast = function (component, hConfig, hState) { |
||
3546 | getLast(component, hConfig).each(function (lastComp) { |
||
637 | daniel-mar | 3547 | highlight(component, hConfig, hState, lastComp); |
597 | daniel-mar | 3548 | }); |
3549 | }; |
||
3550 | var highlightAt = function (component, hConfig, hState, index) { |
||
3551 | getByIndex(component, hConfig, hState, index).fold(function (err) { |
||
3552 | throw err; |
||
3553 | }, function (firstComp) { |
||
637 | daniel-mar | 3554 | highlight(component, hConfig, hState, firstComp); |
597 | daniel-mar | 3555 | }); |
3556 | }; |
||
3557 | var highlightBy = function (component, hConfig, hState, predicate) { |
||
3558 | var candidates = getCandidates(component, hConfig); |
||
637 | daniel-mar | 3559 | var targetComp = find$2(candidates, predicate); |
597 | daniel-mar | 3560 | targetComp.each(function (c) { |
637 | daniel-mar | 3561 | highlight(component, hConfig, hState, c); |
597 | daniel-mar | 3562 | }); |
3563 | }; |
||
3564 | var isHighlighted = function (component, hConfig, hState, queryTarget) { |
||
637 | daniel-mar | 3565 | return has(queryTarget.element, hConfig.highlightClass); |
597 | daniel-mar | 3566 | }; |
3567 | var getHighlighted = function (component, hConfig, _hState) { |
||
637 | daniel-mar | 3568 | return descendant(component.element, '.' + hConfig.highlightClass).bind(function (e) { |
597 | daniel-mar | 3569 | return component.getSystem().getByDom(e).toOptional(); |
3570 | }); |
||
3571 | }; |
||
3572 | var getByIndex = function (component, hConfig, hState, index) { |
||
3573 | var items = descendants(component.element, '.' + hConfig.itemClass); |
||
3574 | return Optional.from(items[index]).fold(function () { |
||
3575 | return Result.error(new Error('No element found with index ' + index)); |
||
3576 | }, component.getSystem().getByDom); |
||
3577 | }; |
||
3578 | var getFirst = function (component, hConfig, _hState) { |
||
637 | daniel-mar | 3579 | return descendant(component.element, '.' + hConfig.itemClass).bind(function (e) { |
597 | daniel-mar | 3580 | return component.getSystem().getByDom(e).toOptional(); |
3581 | }); |
||
3582 | }; |
||
3583 | var getLast = function (component, hConfig, _hState) { |
||
3584 | var items = descendants(component.element, '.' + hConfig.itemClass); |
||
3585 | var last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none(); |
||
3586 | return last.bind(function (c) { |
||
3587 | return component.getSystem().getByDom(c).toOptional(); |
||
3588 | }); |
||
3589 | }; |
||
3590 | var getDelta = function (component, hConfig, hState, delta) { |
||
3591 | var items = descendants(component.element, '.' + hConfig.itemClass); |
||
637 | daniel-mar | 3592 | var current = findIndex$1(items, function (item) { |
3593 | return has(item, hConfig.highlightClass); |
||
597 | daniel-mar | 3594 | }); |
3595 | return current.bind(function (selected) { |
||
3596 | var dest = cycleBy(selected, delta, 0, items.length - 1); |
||
3597 | return component.getSystem().getByDom(items[dest]).toOptional(); |
||
3598 | }); |
||
3599 | }; |
||
3600 | var getPrevious = function (component, hConfig, hState) { |
||
3601 | return getDelta(component, hConfig, hState, -1); |
||
3602 | }; |
||
3603 | var getNext = function (component, hConfig, hState) { |
||
3604 | return getDelta(component, hConfig, hState, +1); |
||
3605 | }; |
||
3606 | var getCandidates = function (component, hConfig, _hState) { |
||
3607 | var items = descendants(component.element, '.' + hConfig.itemClass); |
||
637 | daniel-mar | 3608 | return cat(map$2(items, function (i) { |
597 | daniel-mar | 3609 | return component.getSystem().getByDom(i).toOptional(); |
3610 | })); |
||
3611 | }; |
||
3612 | |||
3613 | var HighlightApis = /*#__PURE__*/Object.freeze({ |
||
3614 | __proto__: null, |
||
3615 | dehighlightAll: dehighlightAll, |
||
637 | daniel-mar | 3616 | dehighlight: dehighlight, |
3617 | highlight: highlight, |
||
597 | daniel-mar | 3618 | highlightFirst: highlightFirst, |
3619 | highlightLast: highlightLast, |
||
3620 | highlightAt: highlightAt, |
||
3621 | highlightBy: highlightBy, |
||
3622 | isHighlighted: isHighlighted, |
||
3623 | getHighlighted: getHighlighted, |
||
3624 | getFirst: getFirst, |
||
3625 | getLast: getLast, |
||
3626 | getPrevious: getPrevious, |
||
3627 | getNext: getNext, |
||
3628 | getCandidates: getCandidates |
||
3629 | }); |
||
3630 | |||
3631 | var HighlightSchema = [ |
||
637 | daniel-mar | 3632 | required$1('highlightClass'), |
3633 | required$1('itemClass'), |
||
597 | daniel-mar | 3634 | onHandler('onHighlight'), |
3635 | onHandler('onDehighlight') |
||
3636 | ]; |
||
3637 | |||
637 | daniel-mar | 3638 | var Highlighting = create$5({ |
597 | daniel-mar | 3639 | fields: HighlightSchema, |
3640 | name: 'highlighting', |
||
3641 | apis: HighlightApis |
||
3642 | }); |
||
3643 | |||
3644 | var reportFocusShifting = function (component, prevFocus, newFocus) { |
||
3645 | var noChange = prevFocus.exists(function (p) { |
||
3646 | return newFocus.exists(function (n) { |
||
3647 | return eq(n, p); |
||
3648 | }); |
||
3649 | }); |
||
3650 | if (!noChange) { |
||
3651 | emitWith(component, focusShifted(), { |
||
3652 | prevFocus: prevFocus, |
||
3653 | newFocus: newFocus |
||
3654 | }); |
||
3655 | } |
||
3656 | }; |
||
637 | daniel-mar | 3657 | var dom$2 = function () { |
597 | daniel-mar | 3658 | var get = function (component) { |
3659 | return search(component.element); |
||
3660 | }; |
||
3661 | var set = function (component, focusee) { |
||
3662 | var prevFocus = get(component); |
||
3663 | component.getSystem().triggerFocus(focusee, component.element); |
||
3664 | var newFocus = get(component); |
||
3665 | reportFocusShifting(component, prevFocus, newFocus); |
||
3666 | }; |
||
3667 | return { |
||
3668 | get: get, |
||
3669 | set: set |
||
3670 | }; |
||
3671 | }; |
||
3672 | var highlights = function () { |
||
3673 | var get = function (component) { |
||
3674 | return Highlighting.getHighlighted(component).map(function (item) { |
||
3675 | return item.element; |
||
3676 | }); |
||
3677 | }; |
||
3678 | var set = function (component, element) { |
||
3679 | var prevFocus = get(component); |
||
3680 | component.getSystem().getByDom(element).fold(noop, function (item) { |
||
3681 | Highlighting.highlight(component, item); |
||
3682 | }); |
||
3683 | var newFocus = get(component); |
||
3684 | reportFocusShifting(component, prevFocus, newFocus); |
||
3685 | }; |
||
3686 | return { |
||
3687 | get: get, |
||
3688 | set: set |
||
3689 | }; |
||
3690 | }; |
||
3691 | |||
3692 | var FocusInsideModes; |
||
3693 | (function (FocusInsideModes) { |
||
3694 | FocusInsideModes['OnFocusMode'] = 'onFocus'; |
||
3695 | FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace'; |
||
3696 | FocusInsideModes['OnApiMode'] = 'onApi'; |
||
3697 | }(FocusInsideModes || (FocusInsideModes = {}))); |
||
3698 | |||
3699 | var typical = function (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) { |
||
3700 | var schema = function () { |
||
3701 | return infoSchema.concat([ |
||
637 | daniel-mar | 3702 | defaulted('focusManager', dom$2()), |
597 | daniel-mar | 3703 | defaultedOf('focusInside', 'onFocus', valueOf(function (val) { |
637 | daniel-mar | 3704 | return contains$1([ |
597 | daniel-mar | 3705 | 'onFocus', |
3706 | 'onEnterOrSpace', |
||
3707 | 'onApi' |
||
3708 | ], val) ? Result.value(val) : Result.error('Invalid value for focusInside'); |
||
3709 | })), |
||
3710 | output('handler', me), |
||
3711 | output('state', stateInit), |
||
3712 | output('sendFocusIn', optFocusIn) |
||
3713 | ]); |
||
3714 | }; |
||
3715 | var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) { |
||
3716 | var rules = getRules(component, simulatedEvent, keyingConfig, keyingState); |
||
637 | daniel-mar | 3717 | return choose(rules, simulatedEvent.event).bind(function (rule) { |
597 | daniel-mar | 3718 | return rule(component, simulatedEvent, keyingConfig, keyingState); |
3719 | }); |
||
3720 | }; |
||
3721 | var toEvents = function (keyingConfig, keyingState) { |
||
3722 | var onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Optional.none() : optFocusIn(keyingConfig).map(function (focusIn) { |
||
637 | daniel-mar | 3723 | return run(focus$4(), function (component, simulatedEvent) { |
597 | daniel-mar | 3724 | focusIn(component, keyingConfig, keyingState); |
3725 | simulatedEvent.stop(); |
||
3726 | }); |
||
3727 | }); |
||
3728 | var tryGoInsideComponent = function (component, simulatedEvent) { |
||
3729 | var isEnterOrSpace = inSet(SPACE.concat(ENTER))(simulatedEvent.event); |
||
3730 | if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) { |
||
3731 | optFocusIn(keyingConfig).each(function (focusIn) { |
||
3732 | focusIn(component, keyingConfig, keyingState); |
||
3733 | simulatedEvent.stop(); |
||
3734 | }); |
||
3735 | } |
||
3736 | }; |
||
3737 | var keyboardEvents = [ |
||
3738 | run(keydown(), function (component, simulatedEvent) { |
||
3739 | processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () { |
||
3740 | tryGoInsideComponent(component, simulatedEvent); |
||
3741 | }, function (_) { |
||
3742 | simulatedEvent.stop(); |
||
3743 | }); |
||
3744 | }), |
||
3745 | run(keyup(), function (component, simulatedEvent) { |
||
3746 | processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) { |
||
3747 | simulatedEvent.stop(); |
||
3748 | }); |
||
3749 | }) |
||
3750 | ]; |
||
637 | daniel-mar | 3751 | return derive$3(onFocusHandler.toArray().concat(keyboardEvents)); |
597 | daniel-mar | 3752 | }; |
3753 | var me = { |
||
3754 | schema: schema, |
||
3755 | processKey: processKey, |
||
3756 | toEvents: toEvents |
||
3757 | }; |
||
3758 | return me; |
||
3759 | }; |
||
3760 | |||
637 | daniel-mar | 3761 | var create$4 = function (cyclicField) { |
597 | daniel-mar | 3762 | var schema = [ |
3763 | option('onEscape'), |
||
3764 | option('onEnter'), |
||
637 | daniel-mar | 3765 | defaulted('selector', '[data-alloy-tabstop="true"]:not(:disabled)'), |
3766 | defaulted('firstTabstop', 0), |
||
3767 | defaulted('useTabstopAt', always), |
||
597 | daniel-mar | 3768 | option('visibilitySelector') |
3769 | ].concat([cyclicField]); |
||
3770 | var isVisible = function (tabbingConfig, element) { |
||
3771 | var target = tabbingConfig.visibilitySelector.bind(function (sel) { |
||
637 | daniel-mar | 3772 | return closest$1(element, sel); |
597 | daniel-mar | 3773 | }).getOr(element); |
637 | daniel-mar | 3774 | return get$7(target) > 0; |
597 | daniel-mar | 3775 | }; |
3776 | var findInitial = function (component, tabbingConfig) { |
||
3777 | var tabstops = descendants(component.element, tabbingConfig.selector); |
||
637 | daniel-mar | 3778 | var visibles = filter$2(tabstops, function (elem) { |
597 | daniel-mar | 3779 | return isVisible(tabbingConfig, elem); |
3780 | }); |
||
3781 | return Optional.from(visibles[tabbingConfig.firstTabstop]); |
||
3782 | }; |
||
3783 | var findCurrent = function (component, tabbingConfig) { |
||
3784 | return tabbingConfig.focusManager.get(component).bind(function (elem) { |
||
637 | daniel-mar | 3785 | return closest$1(elem, tabbingConfig.selector); |
597 | daniel-mar | 3786 | }); |
3787 | }; |
||
3788 | var isTabstop = function (tabbingConfig, element) { |
||
3789 | return isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element); |
||
3790 | }; |
||
3791 | var focusIn = function (component, tabbingConfig, _tabbingState) { |
||
3792 | findInitial(component, tabbingConfig).each(function (target) { |
||
3793 | tabbingConfig.focusManager.set(component, target); |
||
3794 | }); |
||
3795 | }; |
||
3796 | var goFromTabstop = function (component, tabstops, stopIndex, tabbingConfig, cycle) { |
||
3797 | return cycle(tabstops, stopIndex, function (elem) { |
||
3798 | return isTabstop(tabbingConfig, elem); |
||
3799 | }).fold(function () { |
||
3800 | return tabbingConfig.cyclic ? Optional.some(true) : Optional.none(); |
||
3801 | }, function (target) { |
||
3802 | tabbingConfig.focusManager.set(component, target); |
||
3803 | return Optional.some(true); |
||
3804 | }); |
||
3805 | }; |
||
3806 | var go = function (component, _simulatedEvent, tabbingConfig, cycle) { |
||
3807 | var tabstops = descendants(component.element, tabbingConfig.selector); |
||
3808 | return findCurrent(component, tabbingConfig).bind(function (tabstop) { |
||
637 | daniel-mar | 3809 | var optStopIndex = findIndex$1(tabstops, curry(eq, tabstop)); |
597 | daniel-mar | 3810 | return optStopIndex.bind(function (stopIndex) { |
3811 | return goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle); |
||
3812 | }); |
||
3813 | }); |
||
3814 | }; |
||
3815 | var goBackwards = function (component, simulatedEvent, tabbingConfig) { |
||
3816 | var navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev; |
||
3817 | return go(component, simulatedEvent, tabbingConfig, navigate); |
||
3818 | }; |
||
3819 | var goForwards = function (component, simulatedEvent, tabbingConfig) { |
||
3820 | var navigate = tabbingConfig.cyclic ? cycleNext : tryNext; |
||
3821 | return go(component, simulatedEvent, tabbingConfig, navigate); |
||
3822 | }; |
||
3823 | var execute = function (component, simulatedEvent, tabbingConfig) { |
||
3824 | return tabbingConfig.onEnter.bind(function (f) { |
||
3825 | return f(component, simulatedEvent); |
||
3826 | }); |
||
3827 | }; |
||
3828 | var exit = function (component, simulatedEvent, tabbingConfig) { |
||
3829 | return tabbingConfig.onEscape.bind(function (f) { |
||
3830 | return f(component, simulatedEvent); |
||
3831 | }); |
||
3832 | }; |
||
637 | daniel-mar | 3833 | var getKeydownRules = constant$1([ |
597 | daniel-mar | 3834 | rule(and([ |
3835 | isShift, |
||
3836 | inSet(TAB) |
||
3837 | ]), goBackwards), |
||
3838 | rule(inSet(TAB), goForwards), |
||
3839 | rule(inSet(ESCAPE), exit), |
||
3840 | rule(and([ |
||
3841 | isNotShift, |
||
3842 | inSet(ENTER) |
||
3843 | ]), execute) |
||
3844 | ]); |
||
637 | daniel-mar | 3845 | var getKeyupRules = constant$1([]); |
597 | daniel-mar | 3846 | return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () { |
3847 | return Optional.some(focusIn); |
||
3848 | }); |
||
3849 | }; |
||
3850 | |||
637 | daniel-mar | 3851 | var AcyclicType = create$4(customField('cyclic', never)); |
597 | daniel-mar | 3852 | |
637 | daniel-mar | 3853 | var CyclicType = create$4(customField('cyclic', always)); |
597 | daniel-mar | 3854 | |
3855 | var inside = function (target) { |
||
637 | daniel-mar | 3856 | return name$1(target) === 'input' && get$b(target, 'type') !== 'radio' || name$1(target) === 'textarea'; |
597 | daniel-mar | 3857 | }; |
3858 | |||
3859 | var doDefaultExecute = function (component, _simulatedEvent, focused) { |
||
637 | daniel-mar | 3860 | dispatch(component, focused, execute$5()); |
597 | daniel-mar | 3861 | return Optional.some(true); |
3862 | }; |
||
3863 | var defaultExecute = function (component, simulatedEvent, focused) { |
||
3864 | var isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event); |
||
3865 | return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused); |
||
3866 | }; |
||
3867 | var stopEventForFirefox = function (_component, _simulatedEvent) { |
||
3868 | return Optional.some(true); |
||
3869 | }; |
||
3870 | |||
637 | daniel-mar | 3871 | var schema$f = [ |
3872 | defaulted('execute', defaultExecute), |
||
3873 | defaulted('useSpace', false), |
||
3874 | defaulted('useEnter', true), |
||
3875 | defaulted('useControlEnter', false), |
||
3876 | defaulted('useDown', false) |
||
597 | daniel-mar | 3877 | ]; |
637 | daniel-mar | 3878 | var execute$4 = function (component, simulatedEvent, executeConfig) { |
597 | daniel-mar | 3879 | return executeConfig.execute(component, simulatedEvent, component.element); |
3880 | }; |
||
637 | daniel-mar | 3881 | var getKeydownRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) { |
597 | daniel-mar | 3882 | var spaceExec = executeConfig.useSpace && !inside(component.element) ? SPACE : []; |
3883 | var enterExec = executeConfig.useEnter ? ENTER : []; |
||
3884 | var downExec = executeConfig.useDown ? DOWN : []; |
||
3885 | var execKeys = spaceExec.concat(enterExec).concat(downExec); |
||
637 | daniel-mar | 3886 | return [rule(inSet(execKeys), execute$4)].concat(executeConfig.useControlEnter ? [rule(and([ |
597 | daniel-mar | 3887 | isControl, |
3888 | inSet(ENTER) |
||
637 | daniel-mar | 3889 | ]), execute$4)] : []); |
597 | daniel-mar | 3890 | }; |
637 | daniel-mar | 3891 | var getKeyupRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) { |
597 | daniel-mar | 3892 | return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : []; |
3893 | }; |
||
637 | daniel-mar | 3894 | var ExecutionType = typical(schema$f, NoState.init, getKeydownRules$5, getKeyupRules$5, function () { |
597 | daniel-mar | 3895 | return Optional.none(); |
3896 | }); |
||
3897 | |||
637 | daniel-mar | 3898 | var singleton$1 = function (doRevoke) { |
3899 | var subject = Cell(Optional.none()); |
||
3900 | var revoke = function () { |
||
3901 | return subject.get().each(doRevoke); |
||
3902 | }; |
||
3903 | var clear = function () { |
||
3904 | revoke(); |
||
3905 | subject.set(Optional.none()); |
||
3906 | }; |
||
3907 | var isSet = function () { |
||
3908 | return subject.get().isSome(); |
||
3909 | }; |
||
3910 | var get = function () { |
||
3911 | return subject.get(); |
||
3912 | }; |
||
3913 | var set = function (s) { |
||
3914 | revoke(); |
||
3915 | subject.set(Optional.some(s)); |
||
3916 | }; |
||
3917 | return { |
||
3918 | clear: clear, |
||
3919 | isSet: isSet, |
||
3920 | get: get, |
||
3921 | set: set |
||
3922 | }; |
||
3923 | }; |
||
3924 | var destroyable = function () { |
||
3925 | return singleton$1(function (s) { |
||
3926 | return s.destroy(); |
||
3927 | }); |
||
3928 | }; |
||
3929 | var api$2 = function () { |
||
3930 | var subject = destroyable(); |
||
3931 | var run = function (f) { |
||
3932 | return subject.get().each(f); |
||
3933 | }; |
||
3934 | return __assign(__assign({}, subject), { run: run }); |
||
3935 | }; |
||
3936 | var value = function () { |
||
3937 | var subject = singleton$1(noop); |
||
3938 | var on = function (f) { |
||
3939 | return subject.get().each(f); |
||
3940 | }; |
||
3941 | return __assign(__assign({}, subject), { on: on }); |
||
3942 | }; |
||
3943 | |||
3944 | var flatgrid$1 = function () { |
||
3945 | var dimensions = value(); |
||
597 | daniel-mar | 3946 | var setGridSize = function (numRows, numColumns) { |
637 | daniel-mar | 3947 | dimensions.set({ |
597 | daniel-mar | 3948 | numRows: numRows, |
3949 | numColumns: numColumns |
||
637 | daniel-mar | 3950 | }); |
597 | daniel-mar | 3951 | }; |
3952 | var getNumRows = function () { |
||
3953 | return dimensions.get().map(function (d) { |
||
3954 | return d.numRows; |
||
3955 | }); |
||
3956 | }; |
||
3957 | var getNumColumns = function () { |
||
3958 | return dimensions.get().map(function (d) { |
||
3959 | return d.numColumns; |
||
3960 | }); |
||
3961 | }; |
||
637 | daniel-mar | 3962 | return nu$2({ |
597 | daniel-mar | 3963 | readState: function () { |
3964 | return dimensions.get().map(function (d) { |
||
3965 | return { |
||
3966 | numRows: String(d.numRows), |
||
3967 | numColumns: String(d.numColumns) |
||
3968 | }; |
||
3969 | }).getOr({ |
||
3970 | numRows: '?', |
||
3971 | numColumns: '?' |
||
3972 | }); |
||
3973 | }, |
||
3974 | setGridSize: setGridSize, |
||
3975 | getNumRows: getNumRows, |
||
3976 | getNumColumns: getNumColumns |
||
3977 | }); |
||
3978 | }; |
||
637 | daniel-mar | 3979 | var init$5 = function (spec) { |
597 | daniel-mar | 3980 | return spec.state(spec); |
3981 | }; |
||
3982 | |||
3983 | var KeyingState = /*#__PURE__*/Object.freeze({ |
||
3984 | __proto__: null, |
||
637 | daniel-mar | 3985 | flatgrid: flatgrid$1, |
3986 | init: init$5 |
||
597 | daniel-mar | 3987 | }); |
3988 | |||
3989 | var onDirection = function (isLtr, isRtl) { |
||
3990 | return function (element) { |
||
3991 | return getDirection(element) === 'rtl' ? isRtl : isLtr; |
||
3992 | }; |
||
3993 | }; |
||
3994 | var getDirection = function (element) { |
||
637 | daniel-mar | 3995 | return get$8(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; |
597 | daniel-mar | 3996 | }; |
3997 | |||
3998 | var useH = function (movement) { |
||
3999 | return function (component, simulatedEvent, config, state) { |
||
4000 | var move = movement(component.element); |
||
4001 | return use(move, component, simulatedEvent, config, state); |
||
4002 | }; |
||
4003 | }; |
||
4004 | var west = function (moveLeft, moveRight) { |
||
4005 | var movement = onDirection(moveLeft, moveRight); |
||
4006 | return useH(movement); |
||
4007 | }; |
||
4008 | var east = function (moveLeft, moveRight) { |
||
4009 | var movement = onDirection(moveRight, moveLeft); |
||
4010 | return useH(movement); |
||
4011 | }; |
||
4012 | var useV = function (move) { |
||
4013 | return function (component, simulatedEvent, config, state) { |
||
4014 | return use(move, component, simulatedEvent, config, state); |
||
4015 | }; |
||
4016 | }; |
||
4017 | var use = function (move, component, simulatedEvent, config, state) { |
||
4018 | var outcome = config.focusManager.get(component).bind(function (focused) { |
||
4019 | return move(component.element, focused, config, state); |
||
4020 | }); |
||
4021 | return outcome.map(function (newFocus) { |
||
4022 | config.focusManager.set(component, newFocus); |
||
4023 | return true; |
||
4024 | }); |
||
4025 | }; |
||
4026 | var north = useV; |
||
4027 | var south = useV; |
||
637 | daniel-mar | 4028 | var move$1 = useV; |
597 | daniel-mar | 4029 | |
4030 | var isHidden = function (dom) { |
||
4031 | return dom.offsetWidth <= 0 && dom.offsetHeight <= 0; |
||
4032 | }; |
||
4033 | var isVisible = function (element) { |
||
4034 | return !isHidden(element.dom); |
||
4035 | }; |
||
4036 | |||
4037 | var locate = function (candidates, predicate) { |
||
637 | daniel-mar | 4038 | return findIndex$1(candidates, predicate).map(function (index) { |
597 | daniel-mar | 4039 | return { |
4040 | index: index, |
||
4041 | candidates: candidates |
||
4042 | }; |
||
4043 | }); |
||
4044 | }; |
||
4045 | |||
4046 | var locateVisible = function (container, current, selector) { |
||
4047 | var predicate = function (x) { |
||
4048 | return eq(x, current); |
||
4049 | }; |
||
4050 | var candidates = descendants(container, selector); |
||
637 | daniel-mar | 4051 | var visible = filter$2(candidates, isVisible); |
597 | daniel-mar | 4052 | return locate(visible, predicate); |
4053 | }; |
||
637 | daniel-mar | 4054 | var findIndex = function (elements, target) { |
4055 | return findIndex$1(elements, function (elem) { |
||
597 | daniel-mar | 4056 | return eq(target, elem); |
4057 | }); |
||
4058 | }; |
||
4059 | |||
4060 | var withGrid = function (values, index, numCols, f) { |
||
4061 | var oldRow = Math.floor(index / numCols); |
||
4062 | var oldColumn = index % numCols; |
||
4063 | return f(oldRow, oldColumn).bind(function (address) { |
||
4064 | var newIndex = address.row * numCols + address.column; |
||
4065 | return newIndex >= 0 && newIndex < values.length ? Optional.some(values[newIndex]) : Optional.none(); |
||
4066 | }); |
||
4067 | }; |
||
637 | daniel-mar | 4068 | var cycleHorizontal$1 = function (values, index, numRows, numCols, delta) { |
597 | daniel-mar | 4069 | return withGrid(values, index, numCols, function (oldRow, oldColumn) { |
4070 | var onLastRow = oldRow === numRows - 1; |
||
4071 | var colsInRow = onLastRow ? values.length - oldRow * numCols : numCols; |
||
4072 | var newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1); |
||
4073 | return Optional.some({ |
||
4074 | row: oldRow, |
||
4075 | column: newColumn |
||
4076 | }); |
||
4077 | }); |
||
4078 | }; |
||
637 | daniel-mar | 4079 | var cycleVertical$1 = function (values, index, numRows, numCols, delta) { |
597 | daniel-mar | 4080 | return withGrid(values, index, numCols, function (oldRow, oldColumn) { |
4081 | var newRow = cycleBy(oldRow, delta, 0, numRows - 1); |
||
4082 | var onLastRow = newRow === numRows - 1; |
||
4083 | var colsInRow = onLastRow ? values.length - newRow * numCols : numCols; |
||
4084 | var newCol = clamp(oldColumn, 0, colsInRow - 1); |
||
4085 | return Optional.some({ |
||
4086 | row: newRow, |
||
4087 | column: newCol |
||
4088 | }); |
||
4089 | }); |
||
4090 | }; |
||
637 | daniel-mar | 4091 | var cycleRight$1 = function (values, index, numRows, numCols) { |
4092 | return cycleHorizontal$1(values, index, numRows, numCols, +1); |
||
597 | daniel-mar | 4093 | }; |
637 | daniel-mar | 4094 | var cycleLeft$1 = function (values, index, numRows, numCols) { |
4095 | return cycleHorizontal$1(values, index, numRows, numCols, -1); |
||
597 | daniel-mar | 4096 | }; |
637 | daniel-mar | 4097 | var cycleUp$1 = function (values, index, numRows, numCols) { |
4098 | return cycleVertical$1(values, index, numRows, numCols, -1); |
||
597 | daniel-mar | 4099 | }; |
637 | daniel-mar | 4100 | var cycleDown$1 = function (values, index, numRows, numCols) { |
4101 | return cycleVertical$1(values, index, numRows, numCols, +1); |
||
597 | daniel-mar | 4102 | }; |
4103 | |||
637 | daniel-mar | 4104 | var schema$e = [ |
4105 | required$1('selector'), |
||
4106 | defaulted('execute', defaultExecute), |
||
597 | daniel-mar | 4107 | onKeyboardHandler('onEscape'), |
637 | daniel-mar | 4108 | defaulted('captureTab', false), |
597 | daniel-mar | 4109 | initSize() |
4110 | ]; |
||
637 | daniel-mar | 4111 | var focusIn$3 = function (component, gridConfig, _gridState) { |
4112 | descendant(component.element, gridConfig.selector).each(function (first) { |
||
597 | daniel-mar | 4113 | gridConfig.focusManager.set(component, first); |
4114 | }); |
||
4115 | }; |
||
637 | daniel-mar | 4116 | var findCurrent$1 = function (component, gridConfig) { |
597 | daniel-mar | 4117 | return gridConfig.focusManager.get(component).bind(function (elem) { |
637 | daniel-mar | 4118 | return closest$1(elem, gridConfig.selector); |
597 | daniel-mar | 4119 | }); |
4120 | }; |
||
637 | daniel-mar | 4121 | var execute$3 = function (component, simulatedEvent, gridConfig, _gridState) { |
4122 | return findCurrent$1(component, gridConfig).bind(function (focused) { |
||
597 | daniel-mar | 4123 | return gridConfig.execute(component, simulatedEvent, focused); |
4124 | }); |
||
4125 | }; |
||
637 | daniel-mar | 4126 | var doMove$2 = function (cycle) { |
597 | daniel-mar | 4127 | return function (element, focused, gridConfig, gridState) { |
4128 | return locateVisible(element, focused, gridConfig.selector).bind(function (identified) { |
||
4129 | return cycle(identified.candidates, identified.index, gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns)); |
||
4130 | }); |
||
4131 | }; |
||
4132 | }; |
||
4133 | var handleTab = function (_component, _simulatedEvent, gridConfig) { |
||
4134 | return gridConfig.captureTab ? Optional.some(true) : Optional.none(); |
||
4135 | }; |
||
637 | daniel-mar | 4136 | var doEscape$1 = function (component, simulatedEvent, gridConfig) { |
597 | daniel-mar | 4137 | return gridConfig.onEscape(component, simulatedEvent); |
4138 | }; |
||
637 | daniel-mar | 4139 | var moveLeft$3 = doMove$2(cycleLeft$1); |
4140 | var moveRight$3 = doMove$2(cycleRight$1); |
||
4141 | var moveNorth$1 = doMove$2(cycleUp$1); |
||
4142 | var moveSouth$1 = doMove$2(cycleDown$1); |
||
4143 | var getKeydownRules$4 = constant$1([ |
||
4144 | rule(inSet(LEFT), west(moveLeft$3, moveRight$3)), |
||
4145 | rule(inSet(RIGHT), east(moveLeft$3, moveRight$3)), |
||
4146 | rule(inSet(UP), north(moveNorth$1)), |
||
4147 | rule(inSet(DOWN), south(moveSouth$1)), |
||
597 | daniel-mar | 4148 | rule(and([ |
4149 | isShift, |
||
4150 | inSet(TAB) |
||
4151 | ]), handleTab), |
||
4152 | rule(and([ |
||
4153 | isNotShift, |
||
4154 | inSet(TAB) |
||
4155 | ]), handleTab), |
||
637 | daniel-mar | 4156 | rule(inSet(ESCAPE), doEscape$1), |
4157 | rule(inSet(SPACE.concat(ENTER)), execute$3) |
||
597 | daniel-mar | 4158 | ]); |
637 | daniel-mar | 4159 | var getKeyupRules$4 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); |
4160 | var FlatgridType = typical(schema$e, flatgrid$1, getKeydownRules$4, getKeyupRules$4, function () { |
||
4161 | return Optional.some(focusIn$3); |
||
597 | daniel-mar | 4162 | }); |
4163 | |||
4164 | var horizontal = function (container, selector, current, delta) { |
||
4165 | var isDisabledButton = function (candidate) { |
||
637 | daniel-mar | 4166 | return name$1(candidate) === 'button' && get$b(candidate, 'disabled') === 'disabled'; |
597 | daniel-mar | 4167 | }; |
4168 | var tryCycle = function (initial, index, candidates) { |
||
4169 | var newIndex = cycleBy(index, delta, 0, candidates.length - 1); |
||
4170 | if (newIndex === initial) { |
||
4171 | return Optional.none(); |
||
4172 | } else { |
||
4173 | return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Optional.from(candidates[newIndex]); |
||
4174 | } |
||
4175 | }; |
||
4176 | return locateVisible(container, current, selector).bind(function (identified) { |
||
4177 | var index = identified.index; |
||
4178 | var candidates = identified.candidates; |
||
4179 | return tryCycle(index, index, candidates); |
||
4180 | }); |
||
4181 | }; |
||
4182 | |||
637 | daniel-mar | 4183 | var schema$d = [ |
4184 | required$1('selector'), |
||
4185 | defaulted('getInitial', Optional.none), |
||
4186 | defaulted('execute', defaultExecute), |
||
597 | daniel-mar | 4187 | onKeyboardHandler('onEscape'), |
637 | daniel-mar | 4188 | defaulted('executeOnMove', false), |
4189 | defaulted('allowVertical', true) |
||
597 | daniel-mar | 4190 | ]; |
637 | daniel-mar | 4191 | var findCurrent = function (component, flowConfig) { |
597 | daniel-mar | 4192 | return flowConfig.focusManager.get(component).bind(function (elem) { |
637 | daniel-mar | 4193 | return closest$1(elem, flowConfig.selector); |
597 | daniel-mar | 4194 | }); |
4195 | }; |
||
637 | daniel-mar | 4196 | var execute$2 = function (component, simulatedEvent, flowConfig) { |
4197 | return findCurrent(component, flowConfig).bind(function (focused) { |
||
597 | daniel-mar | 4198 | return flowConfig.execute(component, simulatedEvent, focused); |
4199 | }); |
||
4200 | }; |
||
637 | daniel-mar | 4201 | var focusIn$2 = function (component, flowConfig, _state) { |
597 | daniel-mar | 4202 | flowConfig.getInitial(component).orThunk(function () { |
637 | daniel-mar | 4203 | return descendant(component.element, flowConfig.selector); |
597 | daniel-mar | 4204 | }).each(function (first) { |
4205 | flowConfig.focusManager.set(component, first); |
||
4206 | }); |
||
4207 | }; |
||
637 | daniel-mar | 4208 | var moveLeft$2 = function (element, focused, info) { |
597 | daniel-mar | 4209 | return horizontal(element, info.selector, focused, -1); |
4210 | }; |
||
637 | daniel-mar | 4211 | var moveRight$2 = function (element, focused, info) { |
597 | daniel-mar | 4212 | return horizontal(element, info.selector, focused, +1); |
4213 | }; |
||
4214 | var doMove$1 = function (movement) { |
||
4215 | return function (component, simulatedEvent, flowConfig, flowState) { |
||
4216 | return movement(component, simulatedEvent, flowConfig, flowState).bind(function () { |
||
637 | daniel-mar | 4217 | return flowConfig.executeOnMove ? execute$2(component, simulatedEvent, flowConfig) : Optional.some(true); |
597 | daniel-mar | 4218 | }); |
4219 | }; |
||
4220 | }; |
||
637 | daniel-mar | 4221 | var doEscape = function (component, simulatedEvent, flowConfig) { |
597 | daniel-mar | 4222 | return flowConfig.onEscape(component, simulatedEvent); |
4223 | }; |
||
637 | daniel-mar | 4224 | var getKeydownRules$3 = function (_component, _se, flowConfig, _flowState) { |
597 | daniel-mar | 4225 | var westMovers = LEFT.concat(flowConfig.allowVertical ? UP : []); |
4226 | var eastMovers = RIGHT.concat(flowConfig.allowVertical ? DOWN : []); |
||
4227 | return [ |
||
637 | daniel-mar | 4228 | rule(inSet(westMovers), doMove$1(west(moveLeft$2, moveRight$2))), |
4229 | rule(inSet(eastMovers), doMove$1(east(moveLeft$2, moveRight$2))), |
||
4230 | rule(inSet(ENTER), execute$2), |
||
4231 | rule(inSet(SPACE), execute$2), |
||
4232 | rule(inSet(ESCAPE), doEscape) |
||
597 | daniel-mar | 4233 | ]; |
4234 | }; |
||
637 | daniel-mar | 4235 | var getKeyupRules$3 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); |
4236 | var FlowType = typical(schema$d, NoState.init, getKeydownRules$3, getKeyupRules$3, function () { |
||
4237 | return Optional.some(focusIn$2); |
||
597 | daniel-mar | 4238 | }); |
4239 | |||
4240 | var toCell = function (matrix, rowIndex, columnIndex) { |
||
4241 | return Optional.from(matrix[rowIndex]).bind(function (row) { |
||
4242 | return Optional.from(row[columnIndex]).map(function (cell) { |
||
4243 | return { |
||
4244 | rowIndex: rowIndex, |
||
4245 | columnIndex: columnIndex, |
||
4246 | cell: cell |
||
4247 | }; |
||
4248 | }); |
||
4249 | }); |
||
4250 | }; |
||
637 | daniel-mar | 4251 | var cycleHorizontal = function (matrix, rowIndex, startCol, deltaCol) { |
597 | daniel-mar | 4252 | var row = matrix[rowIndex]; |
4253 | var colsInRow = row.length; |
||
4254 | var newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1); |
||
4255 | return toCell(matrix, rowIndex, newColIndex); |
||
4256 | }; |
||
637 | daniel-mar | 4257 | var cycleVertical = function (matrix, colIndex, startRow, deltaRow) { |
597 | daniel-mar | 4258 | var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1); |
4259 | var colsInNextRow = matrix[nextRowIndex].length; |
||
4260 | var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1); |
||
4261 | return toCell(matrix, nextRowIndex, nextColIndex); |
||
4262 | }; |
||
4263 | var moveHorizontal = function (matrix, rowIndex, startCol, deltaCol) { |
||
4264 | var row = matrix[rowIndex]; |
||
4265 | var colsInRow = row.length; |
||
4266 | var newColIndex = clamp(startCol + deltaCol, 0, colsInRow - 1); |
||
4267 | return toCell(matrix, rowIndex, newColIndex); |
||
4268 | }; |
||
4269 | var moveVertical = function (matrix, colIndex, startRow, deltaRow) { |
||
4270 | var nextRowIndex = clamp(startRow + deltaRow, 0, matrix.length - 1); |
||
4271 | var colsInNextRow = matrix[nextRowIndex].length; |
||
4272 | var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1); |
||
4273 | return toCell(matrix, nextRowIndex, nextColIndex); |
||
4274 | }; |
||
637 | daniel-mar | 4275 | var cycleRight = function (matrix, startRow, startCol) { |
4276 | return cycleHorizontal(matrix, startRow, startCol, +1); |
||
597 | daniel-mar | 4277 | }; |
637 | daniel-mar | 4278 | var cycleLeft = function (matrix, startRow, startCol) { |
4279 | return cycleHorizontal(matrix, startRow, startCol, -1); |
||
597 | daniel-mar | 4280 | }; |
637 | daniel-mar | 4281 | var cycleUp = function (matrix, startRow, startCol) { |
4282 | return cycleVertical(matrix, startCol, startRow, -1); |
||
597 | daniel-mar | 4283 | }; |
637 | daniel-mar | 4284 | var cycleDown = function (matrix, startRow, startCol) { |
4285 | return cycleVertical(matrix, startCol, startRow, +1); |
||
597 | daniel-mar | 4286 | }; |
637 | daniel-mar | 4287 | var moveLeft$1 = function (matrix, startRow, startCol) { |
597 | daniel-mar | 4288 | return moveHorizontal(matrix, startRow, startCol, -1); |
4289 | }; |
||
637 | daniel-mar | 4290 | var moveRight$1 = function (matrix, startRow, startCol) { |
597 | daniel-mar | 4291 | return moveHorizontal(matrix, startRow, startCol, +1); |
4292 | }; |
||
637 | daniel-mar | 4293 | var moveUp$1 = function (matrix, startRow, startCol) { |
597 | daniel-mar | 4294 | return moveVertical(matrix, startCol, startRow, -1); |
4295 | }; |
||
637 | daniel-mar | 4296 | var moveDown$1 = function (matrix, startRow, startCol) { |
597 | daniel-mar | 4297 | return moveVertical(matrix, startCol, startRow, +1); |
4298 | }; |
||
4299 | |||
637 | daniel-mar | 4300 | var schema$c = [ |
4301 | requiredObjOf('selectors', [ |
||
4302 | required$1('row'), |
||
4303 | required$1('cell') |
||
597 | daniel-mar | 4304 | ]), |
637 | daniel-mar | 4305 | defaulted('cycles', true), |
4306 | defaulted('previousSelector', Optional.none), |
||
4307 | defaulted('execute', defaultExecute) |
||
597 | daniel-mar | 4308 | ]; |
637 | daniel-mar | 4309 | var focusIn$1 = function (component, matrixConfig, _state) { |
597 | daniel-mar | 4310 | var focused = matrixConfig.previousSelector(component).orThunk(function () { |
4311 | var selectors = matrixConfig.selectors; |
||
637 | daniel-mar | 4312 | return descendant(component.element, selectors.cell); |
597 | daniel-mar | 4313 | }); |
4314 | focused.each(function (cell) { |
||
4315 | matrixConfig.focusManager.set(component, cell); |
||
4316 | }); |
||
4317 | }; |
||
637 | daniel-mar | 4318 | var execute$1 = function (component, simulatedEvent, matrixConfig) { |
597 | daniel-mar | 4319 | return search(component.element).bind(function (focused) { |
4320 | return matrixConfig.execute(component, simulatedEvent, focused); |
||
4321 | }); |
||
4322 | }; |
||
4323 | var toMatrix = function (rows, matrixConfig) { |
||
637 | daniel-mar | 4324 | return map$2(rows, function (row) { |
597 | daniel-mar | 4325 | return descendants(row, matrixConfig.selectors.cell); |
4326 | }); |
||
4327 | }; |
||
637 | daniel-mar | 4328 | var doMove = function (ifCycle, ifMove) { |
597 | daniel-mar | 4329 | return function (element, focused, matrixConfig) { |
4330 | var move = matrixConfig.cycles ? ifCycle : ifMove; |
||
637 | daniel-mar | 4331 | return closest$1(focused, matrixConfig.selectors.row).bind(function (inRow) { |
597 | daniel-mar | 4332 | var cellsInRow = descendants(inRow, matrixConfig.selectors.cell); |
637 | daniel-mar | 4333 | return findIndex(cellsInRow, focused).bind(function (colIndex) { |
597 | daniel-mar | 4334 | var allRows = descendants(element, matrixConfig.selectors.row); |
637 | daniel-mar | 4335 | return findIndex(allRows, inRow).bind(function (rowIndex) { |
597 | daniel-mar | 4336 | var matrix = toMatrix(allRows, matrixConfig); |
4337 | return move(matrix, rowIndex, colIndex).map(function (next) { |
||
4338 | return next.cell; |
||
4339 | }); |
||
4340 | }); |
||
4341 | }); |
||
4342 | }); |
||
4343 | }; |
||
4344 | }; |
||
637 | daniel-mar | 4345 | var moveLeft = doMove(cycleLeft, moveLeft$1); |
4346 | var moveRight = doMove(cycleRight, moveRight$1); |
||
4347 | var moveNorth = doMove(cycleUp, moveUp$1); |
||
4348 | var moveSouth = doMove(cycleDown, moveDown$1); |
||
4349 | var getKeydownRules$2 = constant$1([ |
||
4350 | rule(inSet(LEFT), west(moveLeft, moveRight)), |
||
4351 | rule(inSet(RIGHT), east(moveLeft, moveRight)), |
||
4352 | rule(inSet(UP), north(moveNorth)), |
||
4353 | rule(inSet(DOWN), south(moveSouth)), |
||
4354 | rule(inSet(SPACE.concat(ENTER)), execute$1) |
||
597 | daniel-mar | 4355 | ]); |
637 | daniel-mar | 4356 | var getKeyupRules$2 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); |
4357 | var MatrixType = typical(schema$c, NoState.init, getKeydownRules$2, getKeyupRules$2, function () { |
||
4358 | return Optional.some(focusIn$1); |
||
597 | daniel-mar | 4359 | }); |
4360 | |||
637 | daniel-mar | 4361 | var schema$b = [ |
4362 | required$1('selector'), |
||
4363 | defaulted('execute', defaultExecute), |
||
4364 | defaulted('moveOnTab', false) |
||
597 | daniel-mar | 4365 | ]; |
637 | daniel-mar | 4366 | var execute = function (component, simulatedEvent, menuConfig) { |
597 | daniel-mar | 4367 | return menuConfig.focusManager.get(component).bind(function (focused) { |
4368 | return menuConfig.execute(component, simulatedEvent, focused); |
||
4369 | }); |
||
4370 | }; |
||
637 | daniel-mar | 4371 | var focusIn = function (component, menuConfig, _state) { |
4372 | descendant(component.element, menuConfig.selector).each(function (first) { |
||
597 | daniel-mar | 4373 | menuConfig.focusManager.set(component, first); |
4374 | }); |
||
4375 | }; |
||
637 | daniel-mar | 4376 | var moveUp = function (element, focused, info) { |
597 | daniel-mar | 4377 | return horizontal(element, info.selector, focused, -1); |
4378 | }; |
||
637 | daniel-mar | 4379 | var moveDown = function (element, focused, info) { |
597 | daniel-mar | 4380 | return horizontal(element, info.selector, focused, +1); |
4381 | }; |
||
4382 | var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) { |
||
637 | daniel-mar | 4383 | return menuConfig.moveOnTab ? move$1(moveUp)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); |
597 | daniel-mar | 4384 | }; |
4385 | var fireTab = function (component, simulatedEvent, menuConfig, menuState) { |
||
637 | daniel-mar | 4386 | return menuConfig.moveOnTab ? move$1(moveDown)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); |
597 | daniel-mar | 4387 | }; |
637 | daniel-mar | 4388 | var getKeydownRules$1 = constant$1([ |
4389 | rule(inSet(UP), move$1(moveUp)), |
||
4390 | rule(inSet(DOWN), move$1(moveDown)), |
||
597 | daniel-mar | 4391 | rule(and([ |
4392 | isShift, |
||
4393 | inSet(TAB) |
||
4394 | ]), fireShiftTab), |
||
4395 | rule(and([ |
||
4396 | isNotShift, |
||
4397 | inSet(TAB) |
||
4398 | ]), fireTab), |
||
637 | daniel-mar | 4399 | rule(inSet(ENTER), execute), |
4400 | rule(inSet(SPACE), execute) |
||
597 | daniel-mar | 4401 | ]); |
637 | daniel-mar | 4402 | var getKeyupRules$1 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); |
4403 | var MenuType = typical(schema$b, NoState.init, getKeydownRules$1, getKeyupRules$1, function () { |
||
4404 | return Optional.some(focusIn); |
||
597 | daniel-mar | 4405 | }); |
4406 | |||
637 | daniel-mar | 4407 | var schema$a = [ |
597 | daniel-mar | 4408 | onKeyboardHandler('onSpace'), |
4409 | onKeyboardHandler('onEnter'), |
||
4410 | onKeyboardHandler('onShiftEnter'), |
||
4411 | onKeyboardHandler('onLeft'), |
||
4412 | onKeyboardHandler('onRight'), |
||
4413 | onKeyboardHandler('onTab'), |
||
4414 | onKeyboardHandler('onShiftTab'), |
||
4415 | onKeyboardHandler('onUp'), |
||
4416 | onKeyboardHandler('onDown'), |
||
4417 | onKeyboardHandler('onEscape'), |
||
637 | daniel-mar | 4418 | defaulted('stopSpaceKeyup', false), |
597 | daniel-mar | 4419 | option('focusIn') |
4420 | ]; |
||
637 | daniel-mar | 4421 | var getKeydownRules = function (component, simulatedEvent, specialInfo) { |
597 | daniel-mar | 4422 | return [ |
4423 | rule(inSet(SPACE), specialInfo.onSpace), |
||
4424 | rule(and([ |
||
4425 | isNotShift, |
||
4426 | inSet(ENTER) |
||
4427 | ]), specialInfo.onEnter), |
||
4428 | rule(and([ |
||
4429 | isShift, |
||
4430 | inSet(ENTER) |
||
4431 | ]), specialInfo.onShiftEnter), |
||
4432 | rule(and([ |
||
4433 | isShift, |
||
4434 | inSet(TAB) |
||
4435 | ]), specialInfo.onShiftTab), |
||
4436 | rule(and([ |
||
4437 | isNotShift, |
||
4438 | inSet(TAB) |
||
4439 | ]), specialInfo.onTab), |
||
4440 | rule(inSet(UP), specialInfo.onUp), |
||
4441 | rule(inSet(DOWN), specialInfo.onDown), |
||
4442 | rule(inSet(LEFT), specialInfo.onLeft), |
||
4443 | rule(inSet(RIGHT), specialInfo.onRight), |
||
4444 | rule(inSet(SPACE), specialInfo.onSpace), |
||
4445 | rule(inSet(ESCAPE), specialInfo.onEscape) |
||
4446 | ]; |
||
4447 | }; |
||
637 | daniel-mar | 4448 | var getKeyupRules = function (component, simulatedEvent, specialInfo) { |
597 | daniel-mar | 4449 | return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : []; |
4450 | }; |
||
637 | daniel-mar | 4451 | var SpecialType = typical(schema$a, NoState.init, getKeydownRules, getKeyupRules, function (specialInfo) { |
597 | daniel-mar | 4452 | return specialInfo.focusIn; |
4453 | }); |
||
4454 | |||
4455 | var acyclic = AcyclicType.schema(); |
||
4456 | var cyclic = CyclicType.schema(); |
||
4457 | var flow = FlowType.schema(); |
||
637 | daniel-mar | 4458 | var flatgrid = FlatgridType.schema(); |
597 | daniel-mar | 4459 | var matrix = MatrixType.schema(); |
4460 | var execution = ExecutionType.schema(); |
||
4461 | var menu = MenuType.schema(); |
||
4462 | var special = SpecialType.schema(); |
||
4463 | |||
4464 | var KeyboardBranches = /*#__PURE__*/Object.freeze({ |
||
4465 | __proto__: null, |
||
4466 | acyclic: acyclic, |
||
4467 | cyclic: cyclic, |
||
4468 | flow: flow, |
||
637 | daniel-mar | 4469 | flatgrid: flatgrid, |
597 | daniel-mar | 4470 | matrix: matrix, |
4471 | execution: execution, |
||
4472 | menu: menu, |
||
4473 | special: special |
||
4474 | }); |
||
4475 | |||
4476 | var isFlatgridState = function (keyState) { |
||
4477 | return hasNonNullableKey(keyState, 'setGridSize'); |
||
4478 | }; |
||
637 | daniel-mar | 4479 | var Keying = createModes({ |
597 | daniel-mar | 4480 | branchKey: 'mode', |
4481 | branches: KeyboardBranches, |
||
4482 | name: 'keying', |
||
4483 | active: { |
||
4484 | events: function (keyingConfig, keyingState) { |
||
4485 | var handler = keyingConfig.handler; |
||
4486 | return handler.toEvents(keyingConfig, keyingState); |
||
4487 | } |
||
4488 | }, |
||
4489 | apis: { |
||
4490 | focusIn: function (component, keyConfig, keyState) { |
||
4491 | keyConfig.sendFocusIn(keyConfig).fold(function () { |
||
4492 | component.getSystem().triggerFocus(component.element, component.element); |
||
4493 | }, function (sendFocusIn) { |
||
4494 | sendFocusIn(component, keyConfig, keyState); |
||
4495 | }); |
||
4496 | }, |
||
4497 | setGridSize: function (component, keyConfig, keyState, numRows, numColumns) { |
||
4498 | if (!isFlatgridState(keyState)) { |
||
4499 | console.error('Layout does not support setGridSize'); |
||
4500 | } else { |
||
4501 | keyState.setGridSize(numRows, numColumns); |
||
4502 | } |
||
4503 | } |
||
4504 | }, |
||
4505 | state: KeyingState |
||
4506 | }); |
||
4507 | |||
4508 | var field$1 = function (name, forbidden) { |
||
637 | daniel-mar | 4509 | return defaultedObjOf(name, {}, map$2(forbidden, function (f) { |
597 | daniel-mar | 4510 | return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name); |
637 | daniel-mar | 4511 | }).concat([customField('dump', identity)])); |
597 | daniel-mar | 4512 | }; |
637 | daniel-mar | 4513 | var get$6 = function (data) { |
597 | daniel-mar | 4514 | return data.dump; |
4515 | }; |
||
4516 | var augment = function (data, original) { |
||
679 | daniel-mar | 4517 | return __assign(__assign({}, derive$2(original)), data.dump); |
597 | daniel-mar | 4518 | }; |
4519 | var SketchBehaviours = { |
||
4520 | field: field$1, |
||
4521 | augment: augment, |
||
637 | daniel-mar | 4522 | get: get$6 |
597 | daniel-mar | 4523 | }; |
4524 | |||
4525 | var _placeholder = 'placeholder'; |
||
637 | daniel-mar | 4526 | var adt$5 = Adt.generate([ |
597 | daniel-mar | 4527 | { |
4528 | single: [ |
||
4529 | 'required', |
||
4530 | 'valueThunk' |
||
4531 | ] |
||
4532 | }, |
||
4533 | { |
||
4534 | multiple: [ |
||
4535 | 'required', |
||
4536 | 'valueThunks' |
||
4537 | ] |
||
4538 | } |
||
4539 | ]); |
||
4540 | var isSubstituted = function (spec) { |
||
637 | daniel-mar | 4541 | return has$2(spec, 'uiType'); |
597 | daniel-mar | 4542 | }; |
4543 | var subPlaceholder = function (owner, detail, compSpec, placeholders) { |
||
4544 | if (owner.exists(function (o) { |
||
4545 | return o !== compSpec.owner; |
||
4546 | })) { |
||
637 | daniel-mar | 4547 | return adt$5.single(true, constant$1(compSpec)); |
597 | daniel-mar | 4548 | } |
637 | daniel-mar | 4549 | return get$c(placeholders, compSpec.name).fold(function () { |
597 | daniel-mar | 4550 | throw new Error('Unknown placeholder component: ' + compSpec.name + '\nKnown: [' + keys(placeholders) + ']\nNamespace: ' + owner.getOr('none') + '\nSpec: ' + JSON.stringify(compSpec, null, 2)); |
4551 | }, function (newSpec) { |
||
4552 | return newSpec.replace(); |
||
4553 | }); |
||
4554 | }; |
||
4555 | var scan = function (owner, detail, compSpec, placeholders) { |
||
4556 | if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) { |
||
4557 | return subPlaceholder(owner, detail, compSpec, placeholders); |
||
4558 | } else { |
||
637 | daniel-mar | 4559 | return adt$5.single(false, constant$1(compSpec)); |
597 | daniel-mar | 4560 | } |
4561 | }; |
||
4562 | var substitute = function (owner, detail, compSpec, placeholders) { |
||
4563 | var base = scan(owner, detail, compSpec, placeholders); |
||
4564 | return base.fold(function (req, valueThunk) { |
||
4565 | var value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail); |
||
637 | daniel-mar | 4566 | var childSpecs = get$c(value, 'components').getOr([]); |
4567 | var substituted = bind$3(childSpecs, function (c) { |
||
597 | daniel-mar | 4568 | return substitute(owner, detail, c, placeholders); |
4569 | }); |
||
4570 | return [__assign(__assign({}, value), { components: substituted })]; |
||
4571 | }, function (req, valuesThunk) { |
||
4572 | if (isSubstituted(compSpec)) { |
||
4573 | var values = valuesThunk(detail, compSpec.config, compSpec.validated); |
||
4574 | var preprocessor = compSpec.validated.preprocess.getOr(identity); |
||
4575 | return preprocessor(values); |
||
4576 | } else { |
||
4577 | return valuesThunk(detail); |
||
4578 | } |
||
4579 | }); |
||
4580 | }; |
||
4581 | var substituteAll = function (owner, detail, components, placeholders) { |
||
637 | daniel-mar | 4582 | return bind$3(components, function (c) { |
597 | daniel-mar | 4583 | return substitute(owner, detail, c, placeholders); |
4584 | }); |
||
4585 | }; |
||
4586 | var oneReplace = function (label, replacements) { |
||
4587 | var called = false; |
||
4588 | var used = function () { |
||
4589 | return called; |
||
4590 | }; |
||
4591 | var replace = function () { |
||
4592 | if (called) { |
||
4593 | throw new Error('Trying to use the same placeholder more than once: ' + label); |
||
4594 | } |
||
4595 | called = true; |
||
4596 | return replacements; |
||
4597 | }; |
||
4598 | var required = function () { |
||
4599 | return replacements.fold(function (req, _) { |
||
4600 | return req; |
||
4601 | }, function (req, _) { |
||
4602 | return req; |
||
4603 | }); |
||
4604 | }; |
||
4605 | return { |
||
637 | daniel-mar | 4606 | name: constant$1(label), |
597 | daniel-mar | 4607 | required: required, |
4608 | used: used, |
||
4609 | replace: replace |
||
4610 | }; |
||
4611 | }; |
||
4612 | var substitutePlaces = function (owner, detail, components, placeholders) { |
||
4613 | var ps = map$1(placeholders, function (ph, name) { |
||
4614 | return oneReplace(name, ph); |
||
4615 | }); |
||
4616 | var outcome = substituteAll(owner, detail, components, ps); |
||
637 | daniel-mar | 4617 | each(ps, function (p) { |
597 | daniel-mar | 4618 | if (p.used() === false && p.required()) { |
4619 | throw new Error('Placeholder: ' + p.name() + ' was not found in components list\nNamespace: ' + owner.getOr('none') + '\nComponents: ' + JSON.stringify(detail.components, null, 2)); |
||
4620 | } |
||
4621 | }); |
||
4622 | return outcome; |
||
4623 | }; |
||
637 | daniel-mar | 4624 | var single$2 = adt$5.single; |
4625 | var multiple = adt$5.multiple; |
||
4626 | var placeholder = constant$1(_placeholder); |
||
597 | daniel-mar | 4627 | |
4628 | var unique = 0; |
||
637 | daniel-mar | 4629 | var generate$4 = function (prefix) { |
597 | daniel-mar | 4630 | var date = new Date(); |
4631 | var time = date.getTime(); |
||
4632 | var random = Math.floor(Math.random() * 1000000000); |
||
4633 | unique++; |
||
4634 | return prefix + '_' + random + unique + String(time); |
||
4635 | }; |
||
4636 | |||
637 | daniel-mar | 4637 | var adt$4 = Adt.generate([ |
597 | daniel-mar | 4638 | { required: ['data'] }, |
4639 | { external: ['data'] }, |
||
4640 | { optional: ['data'] }, |
||
4641 | { group: ['data'] } |
||
4642 | ]); |
||
637 | daniel-mar | 4643 | var fFactory = defaulted('factory', { sketch: identity }); |
4644 | var fSchema = defaulted('schema', []); |
||
4645 | var fName = required$1('name'); |
||
4646 | var fPname = field$2('pname', 'pname', defaultedThunk(function (typeSpec) { |
||
4647 | return '<alloy.' + generate$4(typeSpec.name) + '>'; |
||
4648 | }), anyValue()); |
||
4649 | var fGroupSchema = customField('schema', function () { |
||
597 | daniel-mar | 4650 | return [option('preprocess')]; |
4651 | }); |
||
637 | daniel-mar | 4652 | var fDefaults = defaulted('defaults', constant$1({})); |
4653 | var fOverrides = defaulted('overrides', constant$1({})); |
||
597 | daniel-mar | 4654 | var requiredSpec = objOf([ |
4655 | fFactory, |
||
4656 | fSchema, |
||
4657 | fName, |
||
4658 | fPname, |
||
4659 | fDefaults, |
||
4660 | fOverrides |
||
4661 | ]); |
||
4662 | var externalSpec = objOf([ |
||
4663 | fFactory, |
||
4664 | fSchema, |
||
4665 | fName, |
||
4666 | fDefaults, |
||
4667 | fOverrides |
||
4668 | ]); |
||
4669 | var optionalSpec = objOf([ |
||
4670 | fFactory, |
||
4671 | fSchema, |
||
4672 | fName, |
||
4673 | fPname, |
||
4674 | fDefaults, |
||
4675 | fOverrides |
||
4676 | ]); |
||
4677 | var groupSpec = objOf([ |
||
4678 | fFactory, |
||
4679 | fGroupSchema, |
||
4680 | fName, |
||
637 | daniel-mar | 4681 | required$1('unit'), |
597 | daniel-mar | 4682 | fPname, |
4683 | fDefaults, |
||
4684 | fOverrides |
||
4685 | ]); |
||
4686 | var asNamedPart = function (part) { |
||
4687 | return part.fold(Optional.some, Optional.none, Optional.some, Optional.some); |
||
4688 | }; |
||
637 | daniel-mar | 4689 | var name = function (part) { |
597 | daniel-mar | 4690 | var get = function (data) { |
4691 | return data.name; |
||
4692 | }; |
||
4693 | return part.fold(get, get, get, get); |
||
4694 | }; |
||
637 | daniel-mar | 4695 | var convert$1 = function (adtConstructor, partSchema) { |
597 | daniel-mar | 4696 | return function (spec) { |
637 | daniel-mar | 4697 | var data = asRawOrDie$1('Converting part type', partSchema, spec); |
597 | daniel-mar | 4698 | return adtConstructor(data); |
4699 | }; |
||
4700 | }; |
||
637 | daniel-mar | 4701 | var required = convert$1(adt$4.required, requiredSpec); |
4702 | convert$1(adt$4.external, externalSpec); |
||
4703 | var optional = convert$1(adt$4.optional, optionalSpec); |
||
4704 | var group = convert$1(adt$4.group, groupSpec); |
||
4705 | var original = constant$1('entirety'); |
||
597 | daniel-mar | 4706 | |
637 | daniel-mar | 4707 | var combine$2 = function (detail, data, partSpec, partValidated) { |
597 | daniel-mar | 4708 | return deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated)); |
4709 | }; |
||
4710 | var subs = function (owner, detail, parts) { |
||
4711 | var internals = {}; |
||
4712 | var externals = {}; |
||
637 | daniel-mar | 4713 | each$1(parts, function (part) { |
597 | daniel-mar | 4714 | part.fold(function (data) { |
637 | daniel-mar | 4715 | internals[data.pname] = single$2(true, function (detail, partSpec, partValidated) { |
4716 | return data.factory.sketch(combine$2(detail, data, partSpec, partValidated)); |
||
597 | daniel-mar | 4717 | }); |
4718 | }, function (data) { |
||
4719 | var partSpec = detail.parts[data.name]; |
||
637 | daniel-mar | 4720 | externals[data.name] = constant$1(data.factory.sketch(combine$2(detail, data, partSpec[original()]), partSpec)); |
597 | daniel-mar | 4721 | }, function (data) { |
637 | daniel-mar | 4722 | internals[data.pname] = single$2(false, function (detail, partSpec, partValidated) { |
4723 | return data.factory.sketch(combine$2(detail, data, partSpec, partValidated)); |
||
597 | daniel-mar | 4724 | }); |
4725 | }, function (data) { |
||
4726 | internals[data.pname] = multiple(true, function (detail, _partSpec, _partValidated) { |
||
4727 | var units = detail[data.name]; |
||
637 | daniel-mar | 4728 | return map$2(units, function (u) { |
597 | daniel-mar | 4729 | return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u))); |
4730 | }); |
||
4731 | }); |
||
4732 | }); |
||
4733 | }); |
||
4734 | return { |
||
637 | daniel-mar | 4735 | internals: constant$1(internals), |
4736 | externals: constant$1(externals) |
||
597 | daniel-mar | 4737 | }; |
4738 | }; |
||
4739 | |||
637 | daniel-mar | 4740 | var generate$3 = function (owner, parts) { |
597 | daniel-mar | 4741 | var r = {}; |
637 | daniel-mar | 4742 | each$1(parts, function (part) { |
597 | daniel-mar | 4743 | asNamedPart(part).each(function (np) { |
4744 | var g = doGenerateOne(owner, np.pname); |
||
4745 | r[np.name] = function (config) { |
||
637 | daniel-mar | 4746 | var validated = asRawOrDie$1('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config); |
597 | daniel-mar | 4747 | return __assign(__assign({}, g), { |
4748 | config: config, |
||
4749 | validated: validated |
||
4750 | }); |
||
4751 | }; |
||
4752 | }); |
||
4753 | }); |
||
4754 | return r; |
||
4755 | }; |
||
4756 | var doGenerateOne = function (owner, pname) { |
||
4757 | return { |
||
4758 | uiType: placeholder(), |
||
4759 | owner: owner, |
||
4760 | name: pname |
||
4761 | }; |
||
4762 | }; |
||
4763 | var generateOne = function (owner, pname, config) { |
||
4764 | return { |
||
4765 | uiType: placeholder(), |
||
4766 | owner: owner, |
||
4767 | name: pname, |
||
4768 | config: config, |
||
4769 | validated: {} |
||
4770 | }; |
||
4771 | }; |
||
4772 | var schemas = function (parts) { |
||
637 | daniel-mar | 4773 | return bind$3(parts, function (part) { |
597 | daniel-mar | 4774 | return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) { |
637 | daniel-mar | 4775 | return requiredObjOf(data.name, data.schema.concat([snapshot(original())])); |
597 | daniel-mar | 4776 | }).toArray(); |
4777 | }); |
||
4778 | }; |
||
4779 | var names = function (parts) { |
||
637 | daniel-mar | 4780 | return map$2(parts, name); |
597 | daniel-mar | 4781 | }; |
4782 | var substitutes = function (owner, detail, parts) { |
||
4783 | return subs(owner, detail, parts); |
||
4784 | }; |
||
4785 | var components = function (owner, detail, internals) { |
||
4786 | return substitutePlaces(Optional.some(owner), detail, detail.components, internals); |
||
4787 | }; |
||
4788 | var getPart = function (component, detail, partKey) { |
||
4789 | var uid = detail.partUids[partKey]; |
||
4790 | return component.getSystem().getByUid(uid).toOptional(); |
||
4791 | }; |
||
4792 | var getPartOrDie = function (component, detail, partKey) { |
||
4793 | return getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey); |
||
4794 | }; |
||
4795 | var getAllParts = function (component, detail) { |
||
4796 | var system = component.getSystem(); |
||
4797 | return map$1(detail.partUids, function (pUid, _k) { |
||
637 | daniel-mar | 4798 | return constant$1(system.getByUid(pUid)); |
597 | daniel-mar | 4799 | }); |
4800 | }; |
||
4801 | var defaultUids = function (baseUid, partTypes) { |
||
4802 | var partNames = names(partTypes); |
||
637 | daniel-mar | 4803 | return wrapAll(map$2(partNames, function (pn) { |
597 | daniel-mar | 4804 | return { |
4805 | key: pn, |
||
4806 | value: baseUid + '-' + pn |
||
4807 | }; |
||
4808 | })); |
||
4809 | }; |
||
4810 | var defaultUidsSchema = function (partTypes) { |
||
637 | daniel-mar | 4811 | return field$2('partUids', 'partUids', mergeWithThunk(function (spec) { |
597 | daniel-mar | 4812 | return defaultUids(spec.uid, partTypes); |
637 | daniel-mar | 4813 | }), anyValue()); |
597 | daniel-mar | 4814 | }; |
4815 | |||
637 | daniel-mar | 4816 | var premadeTag = generate$4('alloy-premade'); |
4817 | var premade$1 = function (comp) { |
||
4818 | return wrap(premadeTag, comp); |
||
597 | daniel-mar | 4819 | }; |
4820 | var getPremade = function (spec) { |
||
637 | daniel-mar | 4821 | return get$c(spec, premadeTag); |
597 | daniel-mar | 4822 | }; |
4823 | var makeApi = function (f) { |
||
4824 | return markAsSketchApi(function (component) { |
||
4825 | var rest = []; |
||
4826 | for (var _i = 1; _i < arguments.length; _i++) { |
||
4827 | rest[_i - 1] = arguments[_i]; |
||
4828 | } |
||
637 | daniel-mar | 4829 | return f.apply(void 0, __spreadArray([ |
597 | daniel-mar | 4830 | component.getApis(), |
4831 | component |
||
679 | daniel-mar | 4832 | ], rest, false)); |
597 | daniel-mar | 4833 | }, f); |
4834 | }; |
||
4835 | |||
637 | daniel-mar | 4836 | var prefix$1 = constant$1('alloy-id-'); |
4837 | var idAttr$1 = constant$1('data-alloy-id'); |
||
597 | daniel-mar | 4838 | |
637 | daniel-mar | 4839 | var prefix = prefix$1(); |
4840 | var idAttr = idAttr$1(); |
||
597 | daniel-mar | 4841 | var write = function (label, elem) { |
637 | daniel-mar | 4842 | var id = generate$4(prefix + label); |
597 | daniel-mar | 4843 | writeOnly(elem, id); |
4844 | return id; |
||
4845 | }; |
||
4846 | var writeOnly = function (elem, uid) { |
||
637 | daniel-mar | 4847 | Object.defineProperty(elem.dom, idAttr, { |
597 | daniel-mar | 4848 | value: uid, |
4849 | writable: true |
||
4850 | }); |
||
4851 | }; |
||
637 | daniel-mar | 4852 | var read = function (elem) { |
4853 | var id = isElement(elem) ? elem.dom[idAttr] : null; |
||
597 | daniel-mar | 4854 | return Optional.from(id); |
4855 | }; |
||
637 | daniel-mar | 4856 | var generate$2 = function (prefix) { |
4857 | return generate$4(prefix); |
||
597 | daniel-mar | 4858 | }; |
4859 | |||
4860 | var base = function (partSchemas, partUidsSchemas) { |
||
637 | daniel-mar | 4861 | var ps = partSchemas.length > 0 ? [requiredObjOf('parts', partSchemas)] : []; |
597 | daniel-mar | 4862 | return ps.concat([ |
637 | daniel-mar | 4863 | required$1('uid'), |
4864 | defaulted('dom', {}), |
||
4865 | defaulted('components', []), |
||
597 | daniel-mar | 4866 | snapshot('originalSpec'), |
637 | daniel-mar | 4867 | defaulted('debug.sketcher', {}) |
597 | daniel-mar | 4868 | ]).concat(partUidsSchemas); |
4869 | }; |
||
637 | daniel-mar | 4870 | var asRawOrDie = function (label, schema, spec, partSchemas, partUidsSchemas) { |
597 | daniel-mar | 4871 | var baseS = base(partSchemas, partUidsSchemas); |
637 | daniel-mar | 4872 | return asRawOrDie$1(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec); |
597 | daniel-mar | 4873 | }; |
4874 | |||
4875 | var single$1 = function (owner, schema, factory, spec) { |
||
4876 | var specWithUid = supplyUid(spec); |
||
637 | daniel-mar | 4877 | var detail = asRawOrDie(owner, schema, specWithUid, [], []); |
597 | daniel-mar | 4878 | return factory(detail, specWithUid); |
4879 | }; |
||
637 | daniel-mar | 4880 | var composite$1 = function (owner, schema, partTypes, factory, spec) { |
597 | daniel-mar | 4881 | var specWithUid = supplyUid(spec); |
4882 | var partSchemas = schemas(partTypes); |
||
4883 | var partUidsSchema = defaultUidsSchema(partTypes); |
||
637 | daniel-mar | 4884 | var detail = asRawOrDie(owner, schema, specWithUid, partSchemas, [partUidsSchema]); |
597 | daniel-mar | 4885 | var subs = substitutes(owner, detail, partTypes); |
4886 | var components$1 = components(owner, detail, subs.internals()); |
||
4887 | return factory(detail, components$1, specWithUid, subs.externals()); |
||
4888 | }; |
||
4889 | var hasUid = function (spec) { |
||
637 | daniel-mar | 4890 | return has$2(spec, 'uid'); |
597 | daniel-mar | 4891 | }; |
4892 | var supplyUid = function (spec) { |
||
637 | daniel-mar | 4893 | return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$2('uid') }); |
597 | daniel-mar | 4894 | }; |
4895 | |||
637 | daniel-mar | 4896 | var isSketchSpec$1 = function (spec) { |
597 | daniel-mar | 4897 | return spec.uid !== undefined; |
4898 | }; |
||
4899 | var singleSchema = objOfOnly([ |
||
637 | daniel-mar | 4900 | required$1('name'), |
4901 | required$1('factory'), |
||
4902 | required$1('configFields'), |
||
4903 | defaulted('apis', {}), |
||
4904 | defaulted('extraApis', {}) |
||
597 | daniel-mar | 4905 | ]); |
4906 | var compositeSchema = objOfOnly([ |
||
637 | daniel-mar | 4907 | required$1('name'), |
4908 | required$1('factory'), |
||
4909 | required$1('configFields'), |
||
4910 | required$1('partFields'), |
||
4911 | defaulted('apis', {}), |
||
4912 | defaulted('extraApis', {}) |
||
597 | daniel-mar | 4913 | ]); |
637 | daniel-mar | 4914 | var single = function (rawConfig) { |
4915 | var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, singleSchema, rawConfig); |
||
597 | daniel-mar | 4916 | var sketch = function (spec) { |
4917 | return single$1(config.name, config.configFields, config.factory, spec); |
||
4918 | }; |
||
4919 | var apis = map$1(config.apis, makeApi); |
||
4920 | var extraApis = map$1(config.extraApis, function (f, k) { |
||
4921 | return markAsExtraApi(f, k); |
||
4922 | }); |
||
4923 | return __assign(__assign({ |
||
4924 | name: config.name, |
||
4925 | configFields: config.configFields, |
||
4926 | sketch: sketch |
||
4927 | }, apis), extraApis); |
||
4928 | }; |
||
637 | daniel-mar | 4929 | var composite = function (rawConfig) { |
4930 | var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig); |
||
597 | daniel-mar | 4931 | var sketch = function (spec) { |
637 | daniel-mar | 4932 | return composite$1(config.name, config.configFields, config.partFields, config.factory, spec); |
597 | daniel-mar | 4933 | }; |
637 | daniel-mar | 4934 | var parts = generate$3(config.name, config.partFields); |
597 | daniel-mar | 4935 | var apis = map$1(config.apis, makeApi); |
4936 | var extraApis = map$1(config.extraApis, function (f, k) { |
||
4937 | return markAsExtraApi(f, k); |
||
4938 | }); |
||
4939 | return __assign(__assign({ |
||
4940 | name: config.name, |
||
4941 | partFields: config.partFields, |
||
4942 | configFields: config.configFields, |
||
4943 | sketch: sketch, |
||
4944 | parts: parts |
||
4945 | }, apis), extraApis); |
||
4946 | }; |
||
4947 | |||
637 | daniel-mar | 4948 | var factory$5 = function (detail) { |
4949 | var events = events$8(detail.action); |
||
597 | daniel-mar | 4950 | var tag = detail.dom.tag; |
4951 | var lookupAttr = function (attr) { |
||
637 | daniel-mar | 4952 | return get$c(detail.dom, 'attributes').bind(function (attrs) { |
4953 | return get$c(attrs, attr); |
||
597 | daniel-mar | 4954 | }); |
4955 | }; |
||
4956 | var getModAttributes = function () { |
||
4957 | if (tag === 'button') { |
||
4958 | var type = lookupAttr('type').getOr('button'); |
||
4959 | var roleAttrs = lookupAttr('role').map(function (role) { |
||
4960 | return { role: role }; |
||
4961 | }).getOr({}); |
||
4962 | return __assign({ type: type }, roleAttrs); |
||
4963 | } else { |
||
4964 | var role = lookupAttr('role').getOr('button'); |
||
4965 | return { role: role }; |
||
4966 | } |
||
4967 | }; |
||
4968 | return { |
||
4969 | uid: detail.uid, |
||
4970 | dom: detail.dom, |
||
4971 | components: detail.components, |
||
4972 | events: events, |
||
4973 | behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [ |
||
4974 | Focusing.config({}), |
||
4975 | Keying.config({ |
||
4976 | mode: 'execution', |
||
4977 | useSpace: true, |
||
4978 | useEnter: true |
||
4979 | }) |
||
4980 | ]), |
||
4981 | domModification: { attributes: getModAttributes() }, |
||
4982 | eventOrder: detail.eventOrder |
||
4983 | }; |
||
4984 | }; |
||
637 | daniel-mar | 4985 | var Button = single({ |
597 | daniel-mar | 4986 | name: 'Button', |
637 | daniel-mar | 4987 | factory: factory$5, |
597 | daniel-mar | 4988 | configFields: [ |
637 | daniel-mar | 4989 | defaulted('uid', undefined), |
4990 | required$1('dom'), |
||
4991 | defaulted('components', []), |
||
597 | daniel-mar | 4992 | SketchBehaviours.field('buttonBehaviours', [ |
4993 | Focusing, |
||
4994 | Keying |
||
4995 | ]), |
||
4996 | option('action'), |
||
4997 | option('role'), |
||
637 | daniel-mar | 4998 | defaulted('eventOrder', {}) |
597 | daniel-mar | 4999 | ] |
5000 | }); |
||
5001 | |||
637 | daniel-mar | 5002 | var exhibit$3 = function () { |
5003 | return nu$3({ |
||
597 | daniel-mar | 5004 | styles: { |
5005 | '-webkit-user-select': 'none', |
||
5006 | 'user-select': 'none', |
||
5007 | '-ms-user-select': 'none', |
||
5008 | '-moz-user-select': '-moz-none' |
||
5009 | }, |
||
5010 | attributes: { unselectable: 'on' } |
||
5011 | }); |
||
5012 | }; |
||
637 | daniel-mar | 5013 | var events$6 = function () { |
5014 | return derive$3([abort(selectstart(), always)]); |
||
597 | daniel-mar | 5015 | }; |
5016 | |||
5017 | var ActiveUnselecting = /*#__PURE__*/Object.freeze({ |
||
5018 | __proto__: null, |
||
637 | daniel-mar | 5019 | events: events$6, |
5020 | exhibit: exhibit$3 |
||
597 | daniel-mar | 5021 | }); |
5022 | |||
637 | daniel-mar | 5023 | var Unselecting = create$5({ |
597 | daniel-mar | 5024 | fields: [], |
5025 | name: 'unselecting', |
||
5026 | active: ActiveUnselecting |
||
5027 | }); |
||
5028 | |||
637 | daniel-mar | 5029 | var getAttrs$1 = function (elem) { |
597 | daniel-mar | 5030 | var attributes = elem.dom.attributes !== undefined ? elem.dom.attributes : []; |
5031 | return foldl(attributes, function (b, attr) { |
||
5032 | var _a; |
||
5033 | if (attr.name === 'class') { |
||
5034 | return b; |
||
5035 | } else { |
||
5036 | return __assign(__assign({}, b), (_a = {}, _a[attr.name] = attr.value, _a)); |
||
5037 | } |
||
5038 | }, {}); |
||
5039 | }; |
||
5040 | var getClasses = function (elem) { |
||
5041 | return Array.prototype.slice.call(elem.dom.classList, 0); |
||
5042 | }; |
||
637 | daniel-mar | 5043 | var fromHtml = function (html) { |
597 | daniel-mar | 5044 | var elem = SugarElement.fromHtml(html); |
5045 | var children$1 = children(elem); |
||
637 | daniel-mar | 5046 | var attrs = getAttrs$1(elem); |
597 | daniel-mar | 5047 | var classes = getClasses(elem); |
637 | daniel-mar | 5048 | var contents = children$1.length === 0 ? {} : { innerHtml: get$9(elem) }; |
597 | daniel-mar | 5049 | return __assign({ |
637 | daniel-mar | 5050 | tag: name$1(elem), |
597 | daniel-mar | 5051 | classes: classes, |
5052 | attributes: attrs |
||
5053 | }, contents); |
||
5054 | }; |
||
5055 | |||
5056 | var dom$1 = function (rawHtml) { |
||
637 | daniel-mar | 5057 | var html = supplant(rawHtml, { prefix: prefix$2 }); |
5058 | return fromHtml(html); |
||
597 | daniel-mar | 5059 | }; |
5060 | var spec = function (rawHtml) { |
||
5061 | return { dom: dom$1(rawHtml) }; |
||
5062 | }; |
||
5063 | |||
5064 | var forToolbarCommand = function (editor, command) { |
||
5065 | return forToolbar(command, function () { |
||
5066 | editor.execCommand(command); |
||
5067 | }, {}, editor); |
||
5068 | }; |
||
5069 | var getToggleBehaviours = function (command) { |
||
637 | daniel-mar | 5070 | return derive$2([ |
597 | daniel-mar | 5071 | Toggling.config({ |
5072 | toggleClass: resolve('toolbar-button-selected'), |
||
5073 | toggleOnExecute: false, |
||
5074 | aria: { mode: 'pressed' } |
||
5075 | }), |
||
5076 | format(command, function (button, status) { |
||
5077 | var toggle = status ? Toggling.on : Toggling.off; |
||
5078 | toggle(button); |
||
5079 | }) |
||
5080 | ]); |
||
5081 | }; |
||
5082 | var forToolbarStateCommand = function (editor, command) { |
||
5083 | var extraBehaviours = getToggleBehaviours(command); |
||
5084 | return forToolbar(command, function () { |
||
5085 | editor.execCommand(command); |
||
5086 | }, extraBehaviours, editor); |
||
5087 | }; |
||
5088 | var forToolbarStateAction = function (editor, clazz, command, action) { |
||
5089 | var extraBehaviours = getToggleBehaviours(command); |
||
5090 | return forToolbar(clazz, action, extraBehaviours, editor); |
||
5091 | }; |
||
5092 | var getToolbarIconButton = function (clazz, editor) { |
||
5093 | var icons = editor.ui.registry.getAll().icons; |
||
5094 | var optOxideIcon = Optional.from(icons[clazz]); |
||
5095 | return optOxideIcon.fold(function () { |
||
5096 | return dom$1('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item ${prefix}-icon-' + clazz + ' ${prefix}-icon"></span>'); |
||
5097 | }, function (icon) { |
||
5098 | return dom$1('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item">' + icon + '</span>'); |
||
5099 | }); |
||
5100 | }; |
||
5101 | var forToolbar = function (clazz, action, extraBehaviours, editor) { |
||
5102 | return Button.sketch({ |
||
5103 | dom: getToolbarIconButton(clazz, editor), |
||
5104 | action: action, |
||
637 | daniel-mar | 5105 | buttonBehaviours: deepMerge(derive$2([Unselecting.config({})]), extraBehaviours) |
597 | daniel-mar | 5106 | }); |
5107 | }; |
||
5108 | |||
5109 | var labelPart = optional({ |
||
637 | daniel-mar | 5110 | schema: [required$1('dom')], |
597 | daniel-mar | 5111 | name: 'label' |
5112 | }); |
||
5113 | var edgePart = function (name) { |
||
5114 | return optional({ |
||
5115 | name: '' + name + '-edge', |
||
5116 | overrides: function (detail) { |
||
5117 | var action = detail.model.manager.edgeActions[name]; |
||
5118 | return action.fold(function () { |
||
5119 | return {}; |
||
5120 | }, function (a) { |
||
5121 | return { |
||
637 | daniel-mar | 5122 | events: derive$3([ |
597 | daniel-mar | 5123 | runActionExtra(touchstart(), function (comp, se, d) { |
5124 | return a(comp, d); |
||
5125 | }, [detail]), |
||
5126 | runActionExtra(mousedown(), function (comp, se, d) { |
||
5127 | return a(comp, d); |
||
5128 | }, [detail]), |
||
5129 | runActionExtra(mousemove(), function (comp, se, det) { |
||
5130 | if (det.mouseIsDown.get()) { |
||
5131 | a(comp, det); |
||
5132 | } |
||
5133 | }, [detail]) |
||
5134 | ]) |
||
5135 | }; |
||
5136 | }); |
||
5137 | } |
||
5138 | }); |
||
5139 | }; |
||
5140 | var tlEdgePart = edgePart('top-left'); |
||
5141 | var tedgePart = edgePart('top'); |
||
5142 | var trEdgePart = edgePart('top-right'); |
||
5143 | var redgePart = edgePart('right'); |
||
5144 | var brEdgePart = edgePart('bottom-right'); |
||
5145 | var bedgePart = edgePart('bottom'); |
||
5146 | var blEdgePart = edgePart('bottom-left'); |
||
5147 | var ledgePart = edgePart('left'); |
||
5148 | var thumbPart = required({ |
||
5149 | name: 'thumb', |
||
637 | daniel-mar | 5150 | defaults: constant$1({ dom: { styles: { position: 'absolute' } } }), |
597 | daniel-mar | 5151 | overrides: function (detail) { |
5152 | return { |
||
637 | daniel-mar | 5153 | events: derive$3([ |
597 | daniel-mar | 5154 | redirectToPart(touchstart(), detail, 'spectrum'), |
5155 | redirectToPart(touchmove(), detail, 'spectrum'), |
||
5156 | redirectToPart(touchend(), detail, 'spectrum'), |
||
5157 | redirectToPart(mousedown(), detail, 'spectrum'), |
||
5158 | redirectToPart(mousemove(), detail, 'spectrum'), |
||
5159 | redirectToPart(mouseup(), detail, 'spectrum') |
||
5160 | ]) |
||
5161 | }; |
||
5162 | } |
||
5163 | }); |
||
5164 | var spectrumPart = required({ |
||
637 | daniel-mar | 5165 | schema: [customField('mouseIsDown', function () { |
597 | daniel-mar | 5166 | return Cell(false); |
5167 | })], |
||
5168 | name: 'spectrum', |
||
5169 | overrides: function (detail) { |
||
5170 | var modelDetail = detail.model; |
||
5171 | var model = modelDetail.manager; |
||
5172 | var setValueFrom = function (component, simulatedEvent) { |
||
5173 | return model.getValueFromEvent(simulatedEvent).map(function (value) { |
||
5174 | return model.setValueFrom(component, detail, value); |
||
5175 | }); |
||
5176 | }; |
||
5177 | return { |
||
637 | daniel-mar | 5178 | behaviours: derive$2([ |
597 | daniel-mar | 5179 | Keying.config({ |
5180 | mode: 'special', |
||
5181 | onLeft: function (spectrum) { |
||
5182 | return model.onLeft(spectrum, detail); |
||
5183 | }, |
||
5184 | onRight: function (spectrum) { |
||
5185 | return model.onRight(spectrum, detail); |
||
5186 | }, |
||
5187 | onUp: function (spectrum) { |
||
5188 | return model.onUp(spectrum, detail); |
||
5189 | }, |
||
5190 | onDown: function (spectrum) { |
||
5191 | return model.onDown(spectrum, detail); |
||
5192 | } |
||
5193 | }), |
||
5194 | Focusing.config({}) |
||
5195 | ]), |
||
637 | daniel-mar | 5196 | events: derive$3([ |
597 | daniel-mar | 5197 | run(touchstart(), setValueFrom), |
5198 | run(touchmove(), setValueFrom), |
||
5199 | run(mousedown(), setValueFrom), |
||
5200 | run(mousemove(), function (spectrum, se) { |
||
5201 | if (detail.mouseIsDown.get()) { |
||
5202 | setValueFrom(spectrum, se); |
||
5203 | } |
||
5204 | }) |
||
5205 | ]) |
||
5206 | }; |
||
5207 | } |
||
5208 | }); |
||
5209 | var SliderParts = [ |
||
5210 | labelPart, |
||
5211 | ledgePart, |
||
5212 | redgePart, |
||
5213 | tedgePart, |
||
5214 | bedgePart, |
||
5215 | tlEdgePart, |
||
5216 | trEdgePart, |
||
5217 | blEdgePart, |
||
5218 | brEdgePart, |
||
5219 | thumbPart, |
||
5220 | spectrumPart |
||
5221 | ]; |
||
5222 | |||
637 | daniel-mar | 5223 | var onLoad$4 = function (component, repConfig, repState) { |
597 | daniel-mar | 5224 | repConfig.store.manager.onLoad(component, repConfig, repState); |
5225 | }; |
||
637 | daniel-mar | 5226 | var onUnload$2 = function (component, repConfig, repState) { |
597 | daniel-mar | 5227 | repConfig.store.manager.onUnload(component, repConfig, repState); |
5228 | }; |
||
637 | daniel-mar | 5229 | var setValue$3 = function (component, repConfig, repState, data) { |
597 | daniel-mar | 5230 | repConfig.store.manager.setValue(component, repConfig, repState, data); |
5231 | }; |
||
637 | daniel-mar | 5232 | var getValue$4 = function (component, repConfig, repState) { |
597 | daniel-mar | 5233 | return repConfig.store.manager.getValue(component, repConfig, repState); |
5234 | }; |
||
637 | daniel-mar | 5235 | var getState$1 = function (component, repConfig, repState) { |
597 | daniel-mar | 5236 | return repState; |
5237 | }; |
||
5238 | |||
5239 | var RepresentApis = /*#__PURE__*/Object.freeze({ |
||
5240 | __proto__: null, |
||
637 | daniel-mar | 5241 | onLoad: onLoad$4, |
5242 | onUnload: onUnload$2, |
||
5243 | setValue: setValue$3, |
||
5244 | getValue: getValue$4, |
||
5245 | getState: getState$1 |
||
597 | daniel-mar | 5246 | }); |
5247 | |||
5248 | var events$5 = function (repConfig, repState) { |
||
5249 | var es = repConfig.resetOnDom ? [ |
||
5250 | runOnAttached(function (comp, _se) { |
||
637 | daniel-mar | 5251 | onLoad$4(comp, repConfig, repState); |
597 | daniel-mar | 5252 | }), |
5253 | runOnDetached(function (comp, _se) { |
||
637 | daniel-mar | 5254 | onUnload$2(comp, repConfig, repState); |
597 | daniel-mar | 5255 | }) |
637 | daniel-mar | 5256 | ] : [loadEvent(repConfig, repState, onLoad$4)]; |
5257 | return derive$3(es); |
||
597 | daniel-mar | 5258 | }; |
5259 | |||
5260 | var ActiveRepresenting = /*#__PURE__*/Object.freeze({ |
||
5261 | __proto__: null, |
||
5262 | events: events$5 |
||
5263 | }); |
||
5264 | |||
5265 | var memory = function () { |
||
5266 | var data = Cell(null); |
||
5267 | var readState = function () { |
||
5268 | return { |
||
5269 | mode: 'memory', |
||
5270 | value: data.get() |
||
5271 | }; |
||
5272 | }; |
||
5273 | var isNotSet = function () { |
||
5274 | return data.get() === null; |
||
5275 | }; |
||
5276 | var clear = function () { |
||
5277 | data.set(null); |
||
5278 | }; |
||
637 | daniel-mar | 5279 | return nu$2({ |
597 | daniel-mar | 5280 | set: data.set, |
5281 | get: data.get, |
||
5282 | isNotSet: isNotSet, |
||
5283 | clear: clear, |
||
5284 | readState: readState |
||
5285 | }); |
||
5286 | }; |
||
5287 | var manual = function () { |
||
5288 | var readState = noop; |
||
637 | daniel-mar | 5289 | return nu$2({ readState: readState }); |
597 | daniel-mar | 5290 | }; |
5291 | var dataset = function () { |
||
5292 | var dataByValue = Cell({}); |
||
5293 | var dataByText = Cell({}); |
||
5294 | var readState = function () { |
||
5295 | return { |
||
5296 | mode: 'dataset', |
||
5297 | dataByValue: dataByValue.get(), |
||
5298 | dataByText: dataByText.get() |
||
5299 | }; |
||
5300 | }; |
||
5301 | var clear = function () { |
||
5302 | dataByValue.set({}); |
||
5303 | dataByText.set({}); |
||
5304 | }; |
||
5305 | var lookup = function (itemString) { |
||
637 | daniel-mar | 5306 | return get$c(dataByValue.get(), itemString).orThunk(function () { |
5307 | return get$c(dataByText.get(), itemString); |
||
597 | daniel-mar | 5308 | }); |
5309 | }; |
||
5310 | var update = function (items) { |
||
5311 | var currentDataByValue = dataByValue.get(); |
||
5312 | var currentDataByText = dataByText.get(); |
||
5313 | var newDataByValue = {}; |
||
5314 | var newDataByText = {}; |
||
637 | daniel-mar | 5315 | each$1(items, function (item) { |
597 | daniel-mar | 5316 | newDataByValue[item.value] = item; |
637 | daniel-mar | 5317 | get$c(item, 'meta').each(function (meta) { |
5318 | get$c(meta, 'text').each(function (text) { |
||
597 | daniel-mar | 5319 | newDataByText[text] = item; |
5320 | }); |
||
5321 | }); |
||
5322 | }); |
||
5323 | dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue)); |
||
5324 | dataByText.set(__assign(__assign({}, currentDataByText), newDataByText)); |
||
5325 | }; |
||
637 | daniel-mar | 5326 | return nu$2({ |
597 | daniel-mar | 5327 | readState: readState, |
5328 | lookup: lookup, |
||
5329 | update: update, |
||
5330 | clear: clear |
||
5331 | }); |
||
5332 | }; |
||
637 | daniel-mar | 5333 | var init$4 = function (spec) { |
597 | daniel-mar | 5334 | return spec.store.manager.state(spec); |
5335 | }; |
||
5336 | |||
5337 | var RepresentState = /*#__PURE__*/Object.freeze({ |
||
5338 | __proto__: null, |
||
5339 | memory: memory, |
||
5340 | dataset: dataset, |
||
5341 | manual: manual, |
||
637 | daniel-mar | 5342 | init: init$4 |
597 | daniel-mar | 5343 | }); |
5344 | |||
637 | daniel-mar | 5345 | var setValue$2 = function (component, repConfig, repState, data) { |
597 | daniel-mar | 5346 | var store = repConfig.store; |
5347 | repState.update([data]); |
||
5348 | store.setValue(component, data); |
||
5349 | repConfig.onSetValue(component, data); |
||
5350 | }; |
||
637 | daniel-mar | 5351 | var getValue$3 = function (component, repConfig, repState) { |
597 | daniel-mar | 5352 | var store = repConfig.store; |
5353 | var key = store.getDataKey(component); |
||
637 | daniel-mar | 5354 | return repState.lookup(key).getOrThunk(function () { |
597 | daniel-mar | 5355 | return store.getFallbackEntry(key); |
5356 | }); |
||
5357 | }; |
||
637 | daniel-mar | 5358 | var onLoad$3 = function (component, repConfig, repState) { |
597 | daniel-mar | 5359 | var store = repConfig.store; |
5360 | store.initialValue.each(function (data) { |
||
637 | daniel-mar | 5361 | setValue$2(component, repConfig, repState, data); |
597 | daniel-mar | 5362 | }); |
5363 | }; |
||
5364 | var onUnload$1 = function (component, repConfig, repState) { |
||
5365 | repState.clear(); |
||
5366 | }; |
||
5367 | var DatasetStore = [ |
||
5368 | option('initialValue'), |
||
637 | daniel-mar | 5369 | required$1('getFallbackEntry'), |
5370 | required$1('getDataKey'), |
||
5371 | required$1('setValue'), |
||
597 | daniel-mar | 5372 | output('manager', { |
637 | daniel-mar | 5373 | setValue: setValue$2, |
5374 | getValue: getValue$3, |
||
5375 | onLoad: onLoad$3, |
||
597 | daniel-mar | 5376 | onUnload: onUnload$1, |
5377 | state: dataset |
||
5378 | }) |
||
5379 | ]; |
||
5380 | |||
5381 | var getValue$2 = function (component, repConfig, _repState) { |
||
5382 | return repConfig.store.getValue(component); |
||
5383 | }; |
||
637 | daniel-mar | 5384 | var setValue$1 = function (component, repConfig, _repState, data) { |
597 | daniel-mar | 5385 | repConfig.store.setValue(component, data); |
5386 | repConfig.onSetValue(component, data); |
||
5387 | }; |
||
637 | daniel-mar | 5388 | var onLoad$2 = function (component, repConfig, _repState) { |
597 | daniel-mar | 5389 | repConfig.store.initialValue.each(function (data) { |
5390 | repConfig.store.setValue(component, data); |
||
5391 | }); |
||
5392 | }; |
||
5393 | var ManualStore = [ |
||
637 | daniel-mar | 5394 | required$1('getValue'), |
5395 | defaulted('setValue', noop), |
||
597 | daniel-mar | 5396 | option('initialValue'), |
5397 | output('manager', { |
||
637 | daniel-mar | 5398 | setValue: setValue$1, |
597 | daniel-mar | 5399 | getValue: getValue$2, |
637 | daniel-mar | 5400 | onLoad: onLoad$2, |
597 | daniel-mar | 5401 | onUnload: noop, |
5402 | state: NoState.init |
||
5403 | }) |
||
5404 | ]; |
||
5405 | |||
637 | daniel-mar | 5406 | var setValue = function (component, repConfig, repState, data) { |
597 | daniel-mar | 5407 | repState.set(data); |
5408 | repConfig.onSetValue(component, data); |
||
5409 | }; |
||
637 | daniel-mar | 5410 | var getValue$1 = function (component, repConfig, repState) { |
597 | daniel-mar | 5411 | return repState.get(); |
5412 | }; |
||
637 | daniel-mar | 5413 | var onLoad$1 = function (component, repConfig, repState) { |
597 | daniel-mar | 5414 | repConfig.store.initialValue.each(function (initVal) { |
5415 | if (repState.isNotSet()) { |
||
5416 | repState.set(initVal); |
||
5417 | } |
||
5418 | }); |
||
5419 | }; |
||
637 | daniel-mar | 5420 | var onUnload = function (component, repConfig, repState) { |
597 | daniel-mar | 5421 | repState.clear(); |
5422 | }; |
||
5423 | var MemoryStore = [ |
||
5424 | option('initialValue'), |
||
5425 | output('manager', { |
||
637 | daniel-mar | 5426 | setValue: setValue, |
5427 | getValue: getValue$1, |
||
5428 | onLoad: onLoad$1, |
||
5429 | onUnload: onUnload, |
||
597 | daniel-mar | 5430 | state: memory |
5431 | }) |
||
5432 | ]; |
||
5433 | |||
5434 | var RepresentSchema = [ |
||
5435 | defaultedOf('store', { mode: 'memory' }, choose$1('mode', { |
||
5436 | memory: MemoryStore, |
||
5437 | manual: ManualStore, |
||
5438 | dataset: DatasetStore |
||
5439 | })), |
||
5440 | onHandler('onSetValue'), |
||
637 | daniel-mar | 5441 | defaulted('resetOnDom', false) |
597 | daniel-mar | 5442 | ]; |
5443 | |||
637 | daniel-mar | 5444 | var Representing = create$5({ |
597 | daniel-mar | 5445 | fields: RepresentSchema, |
5446 | name: 'representing', |
||
5447 | active: ActiveRepresenting, |
||
5448 | apis: RepresentApis, |
||
5449 | extra: { |
||
5450 | setValueFrom: function (component, source) { |
||
5451 | var value = Representing.getValue(source); |
||
5452 | Representing.setValue(component, value); |
||
5453 | } |
||
5454 | }, |
||
5455 | state: RepresentState |
||
5456 | }); |
||
5457 | |||
5458 | var api$1 = Dimension('width', function (element) { |
||
5459 | return element.dom.offsetWidth; |
||
5460 | }); |
||
5461 | var set$4 = function (element, h) { |
||
5462 | return api$1.set(element, h); |
||
5463 | }; |
||
637 | daniel-mar | 5464 | var get$5 = function (element) { |
597 | daniel-mar | 5465 | return api$1.get(element); |
5466 | }; |
||
5467 | |||
637 | daniel-mar | 5468 | var r$1 = function (left, top) { |
597 | daniel-mar | 5469 | var translate = function (x, y) { |
637 | daniel-mar | 5470 | return r$1(left + x, top + y); |
597 | daniel-mar | 5471 | }; |
5472 | return { |
||
5473 | left: left, |
||
5474 | top: top, |
||
5475 | translate: translate |
||
5476 | }; |
||
5477 | }; |
||
637 | daniel-mar | 5478 | var SugarPosition = r$1; |
597 | daniel-mar | 5479 | |
5480 | var _sliderChangeEvent = 'slider.change.value'; |
||
637 | daniel-mar | 5481 | var sliderChangeEvent = constant$1(_sliderChangeEvent); |
597 | daniel-mar | 5482 | var isTouchEvent = function (evt) { |
5483 | return evt.type.indexOf('touch') !== -1; |
||
5484 | }; |
||
5485 | var getEventSource = function (simulatedEvent) { |
||
5486 | var evt = simulatedEvent.event.raw; |
||
5487 | if (isTouchEvent(evt)) { |
||
5488 | var touchEvent = evt; |
||
5489 | return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Optional.some(touchEvent.touches[0]).map(function (t) { |
||
5490 | return SugarPosition(t.clientX, t.clientY); |
||
5491 | }) : Optional.none(); |
||
5492 | } else { |
||
5493 | var mouseEvent = evt; |
||
5494 | return mouseEvent.clientX !== undefined ? Optional.some(mouseEvent).map(function (me) { |
||
5495 | return SugarPosition(me.clientX, me.clientY); |
||
5496 | }) : Optional.none(); |
||
5497 | } |
||
5498 | }; |
||
5499 | |||
637 | daniel-mar | 5500 | var t = 'top', r = 'right', b = 'bottom', l = 'left'; |
597 | daniel-mar | 5501 | var minX = function (detail) { |
5502 | return detail.model.minX; |
||
5503 | }; |
||
5504 | var minY = function (detail) { |
||
5505 | return detail.model.minY; |
||
5506 | }; |
||
5507 | var min1X = function (detail) { |
||
5508 | return detail.model.minX - 1; |
||
5509 | }; |
||
5510 | var min1Y = function (detail) { |
||
5511 | return detail.model.minY - 1; |
||
5512 | }; |
||
5513 | var maxX = function (detail) { |
||
5514 | return detail.model.maxX; |
||
5515 | }; |
||
5516 | var maxY = function (detail) { |
||
5517 | return detail.model.maxY; |
||
5518 | }; |
||
5519 | var max1X = function (detail) { |
||
5520 | return detail.model.maxX + 1; |
||
5521 | }; |
||
5522 | var max1Y = function (detail) { |
||
5523 | return detail.model.maxY + 1; |
||
5524 | }; |
||
637 | daniel-mar | 5525 | var range$1 = function (detail, max, min) { |
597 | daniel-mar | 5526 | return max(detail) - min(detail); |
5527 | }; |
||
5528 | var xRange = function (detail) { |
||
637 | daniel-mar | 5529 | return range$1(detail, maxX, minX); |
597 | daniel-mar | 5530 | }; |
5531 | var yRange = function (detail) { |
||
637 | daniel-mar | 5532 | return range$1(detail, maxY, minY); |
597 | daniel-mar | 5533 | }; |
5534 | var halfX = function (detail) { |
||
5535 | return xRange(detail) / 2; |
||
5536 | }; |
||
5537 | var halfY = function (detail) { |
||
5538 | return yRange(detail) / 2; |
||
5539 | }; |
||
5540 | var step = function (detail) { |
||
5541 | return detail.stepSize; |
||
5542 | }; |
||
5543 | var snap = function (detail) { |
||
5544 | return detail.snapToGrid; |
||
5545 | }; |
||
5546 | var snapStart = function (detail) { |
||
5547 | return detail.snapStart; |
||
5548 | }; |
||
5549 | var rounded = function (detail) { |
||
5550 | return detail.rounded; |
||
5551 | }; |
||
5552 | var hasEdge = function (detail, edgeName) { |
||
5553 | return detail[edgeName + '-edge'] !== undefined; |
||
5554 | }; |
||
5555 | var hasLEdge = function (detail) { |
||
5556 | return hasEdge(detail, l); |
||
5557 | }; |
||
5558 | var hasREdge = function (detail) { |
||
637 | daniel-mar | 5559 | return hasEdge(detail, r); |
597 | daniel-mar | 5560 | }; |
5561 | var hasTEdge = function (detail) { |
||
5562 | return hasEdge(detail, t); |
||
5563 | }; |
||
5564 | var hasBEdge = function (detail) { |
||
5565 | return hasEdge(detail, b); |
||
5566 | }; |
||
5567 | var currentValue = function (detail) { |
||
5568 | return detail.model.value.get(); |
||
5569 | }; |
||
5570 | |||
5571 | var xValue = function (x) { |
||
5572 | return { x: x }; |
||
5573 | }; |
||
5574 | var yValue = function (y) { |
||
5575 | return { y: y }; |
||
5576 | }; |
||
5577 | var xyValue = function (x, y) { |
||
5578 | return { |
||
5579 | x: x, |
||
5580 | y: y |
||
5581 | }; |
||
5582 | }; |
||
637 | daniel-mar | 5583 | var fireSliderChange$3 = function (component, value) { |
597 | daniel-mar | 5584 | emitWith(component, sliderChangeEvent(), { value: value }); |
5585 | }; |
||
5586 | var setToTLEdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5587 | fireSliderChange$3(edge, xyValue(min1X(detail), min1Y(detail))); |
597 | daniel-mar | 5588 | }; |
5589 | var setToTEdge = function (edge, detail) { |
||
637 | daniel-mar | 5590 | fireSliderChange$3(edge, yValue(min1Y(detail))); |
597 | daniel-mar | 5591 | }; |
5592 | var setToTEdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5593 | fireSliderChange$3(edge, xyValue(halfX(detail), min1Y(detail))); |
597 | daniel-mar | 5594 | }; |
5595 | var setToTREdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5596 | fireSliderChange$3(edge, xyValue(max1X(detail), min1Y(detail))); |
597 | daniel-mar | 5597 | }; |
5598 | var setToREdge = function (edge, detail) { |
||
637 | daniel-mar | 5599 | fireSliderChange$3(edge, xValue(max1X(detail))); |
597 | daniel-mar | 5600 | }; |
5601 | var setToREdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5602 | fireSliderChange$3(edge, xyValue(max1X(detail), halfY(detail))); |
597 | daniel-mar | 5603 | }; |
5604 | var setToBREdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5605 | fireSliderChange$3(edge, xyValue(max1X(detail), max1Y(detail))); |
597 | daniel-mar | 5606 | }; |
5607 | var setToBEdge = function (edge, detail) { |
||
637 | daniel-mar | 5608 | fireSliderChange$3(edge, yValue(max1Y(detail))); |
597 | daniel-mar | 5609 | }; |
5610 | var setToBEdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5611 | fireSliderChange$3(edge, xyValue(halfX(detail), max1Y(detail))); |
597 | daniel-mar | 5612 | }; |
5613 | var setToBLEdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5614 | fireSliderChange$3(edge, xyValue(min1X(detail), max1Y(detail))); |
597 | daniel-mar | 5615 | }; |
5616 | var setToLEdge = function (edge, detail) { |
||
637 | daniel-mar | 5617 | fireSliderChange$3(edge, xValue(min1X(detail))); |
597 | daniel-mar | 5618 | }; |
5619 | var setToLEdgeXY = function (edge, detail) { |
||
637 | daniel-mar | 5620 | fireSliderChange$3(edge, xyValue(min1X(detail), halfY(detail))); |
597 | daniel-mar | 5621 | }; |
5622 | |||
5623 | var reduceBy = function (value, min, max, step) { |
||
5624 | if (value < min) { |
||
5625 | return value; |
||
5626 | } else if (value > max) { |
||
5627 | return max; |
||
5628 | } else if (value === min) { |
||
5629 | return min - 1; |
||
5630 | } else { |
||
5631 | return Math.max(min, value - step); |
||
5632 | } |
||
5633 | }; |
||
5634 | var increaseBy = function (value, min, max, step) { |
||
5635 | if (value > max) { |
||
5636 | return value; |
||
5637 | } else if (value < min) { |
||
5638 | return min; |
||
5639 | } else if (value === max) { |
||
5640 | return max + 1; |
||
5641 | } else { |
||
5642 | return Math.min(max, value + step); |
||
5643 | } |
||
5644 | }; |
||
5645 | var capValue = function (value, min, max) { |
||
5646 | return Math.max(min, Math.min(max, value)); |
||
5647 | }; |
||
5648 | var snapValueOf = function (value, min, max, step, snapStart) { |
||
5649 | return snapStart.fold(function () { |
||
5650 | var initValue = value - min; |
||
5651 | var extraValue = Math.round(initValue / step) * step; |
||
5652 | return capValue(min + extraValue, min - 1, max + 1); |
||
5653 | }, function (start) { |
||
5654 | var remainder = (value - start) % step; |
||
5655 | var adjustment = Math.round(remainder / step); |
||
5656 | var rawSteps = Math.floor((value - start) / step); |
||
5657 | var maxSteps = Math.floor((max - start) / step); |
||
5658 | var numSteps = Math.min(maxSteps, rawSteps + adjustment); |
||
5659 | var r = start + numSteps * step; |
||
5660 | return Math.max(start, r); |
||
5661 | }); |
||
5662 | }; |
||
5663 | var findOffsetOf = function (value, min, max) { |
||
5664 | return Math.min(max, Math.max(value, min)) - min; |
||
5665 | }; |
||
5666 | var findValueOf = function (args) { |
||
5667 | var min = args.min, max = args.max, range = args.range, value = args.value, step = args.step, snap = args.snap, snapStart = args.snapStart, rounded = args.rounded, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, minBound = args.minBound, maxBound = args.maxBound, screenRange = args.screenRange; |
||
5668 | var capMin = hasMinEdge ? min - 1 : min; |
||
5669 | var capMax = hasMaxEdge ? max + 1 : max; |
||
5670 | if (value < minBound) { |
||
5671 | return capMin; |
||
5672 | } else if (value > maxBound) { |
||
5673 | return capMax; |
||
5674 | } else { |
||
5675 | var offset = findOffsetOf(value, minBound, maxBound); |
||
5676 | var newValue = capValue(offset / screenRange * range + min, capMin, capMax); |
||
5677 | if (snap && newValue >= min && newValue <= max) { |
||
5678 | return snapValueOf(newValue, min, max, step, snapStart); |
||
5679 | } else if (rounded) { |
||
5680 | return Math.round(newValue); |
||
5681 | } else { |
||
5682 | return newValue; |
||
5683 | } |
||
5684 | } |
||
5685 | }; |
||
637 | daniel-mar | 5686 | var findOffsetOfValue$2 = function (args) { |
597 | daniel-mar | 5687 | var min = args.min, max = args.max, range = args.range, value = args.value, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, maxBound = args.maxBound, maxOffset = args.maxOffset, centerMinEdge = args.centerMinEdge, centerMaxEdge = args.centerMaxEdge; |
5688 | if (value < min) { |
||
5689 | return hasMinEdge ? 0 : centerMinEdge; |
||
5690 | } else if (value > max) { |
||
5691 | return hasMaxEdge ? maxBound : centerMaxEdge; |
||
5692 | } else { |
||
5693 | return (value - min) / range * maxOffset; |
||
5694 | } |
||
5695 | }; |
||
5696 | |||
5697 | var top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height'; |
||
637 | daniel-mar | 5698 | var getBounds$1 = function (component) { |
597 | daniel-mar | 5699 | return component.element.dom.getBoundingClientRect(); |
5700 | }; |
||
5701 | var getBoundsProperty = function (bounds, property) { |
||
5702 | return bounds[property]; |
||
5703 | }; |
||
5704 | var getMinXBounds = function (component) { |
||
637 | daniel-mar | 5705 | var bounds = getBounds$1(component); |
597 | daniel-mar | 5706 | return getBoundsProperty(bounds, left); |
5707 | }; |
||
5708 | var getMaxXBounds = function (component) { |
||
637 | daniel-mar | 5709 | var bounds = getBounds$1(component); |
597 | daniel-mar | 5710 | return getBoundsProperty(bounds, right); |
5711 | }; |
||
5712 | var getMinYBounds = function (component) { |
||
637 | daniel-mar | 5713 | var bounds = getBounds$1(component); |
597 | daniel-mar | 5714 | return getBoundsProperty(bounds, top); |
5715 | }; |
||
5716 | var getMaxYBounds = function (component) { |
||
637 | daniel-mar | 5717 | var bounds = getBounds$1(component); |
597 | daniel-mar | 5718 | return getBoundsProperty(bounds, bottom); |
5719 | }; |
||
5720 | var getXScreenRange = function (component) { |
||
637 | daniel-mar | 5721 | var bounds = getBounds$1(component); |
597 | daniel-mar | 5722 | return getBoundsProperty(bounds, width); |
5723 | }; |
||
5724 | var getYScreenRange = function (component) { |
||
637 | daniel-mar | 5725 | var bounds = getBounds$1(component); |
597 | daniel-mar | 5726 | return getBoundsProperty(bounds, height); |
5727 | }; |
||
5728 | var getCenterOffsetOf = function (componentMinEdge, componentMaxEdge, spectrumMinEdge) { |
||
5729 | return (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge; |
||
5730 | }; |
||
5731 | var getXCenterOffSetOf = function (component, spectrum) { |
||
637 | daniel-mar | 5732 | var componentBounds = getBounds$1(component); |
5733 | var spectrumBounds = getBounds$1(spectrum); |
||
597 | daniel-mar | 5734 | var componentMinEdge = getBoundsProperty(componentBounds, left); |
5735 | var componentMaxEdge = getBoundsProperty(componentBounds, right); |
||
5736 | var spectrumMinEdge = getBoundsProperty(spectrumBounds, left); |
||
5737 | return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge); |
||
5738 | }; |
||
5739 | var getYCenterOffSetOf = function (component, spectrum) { |
||
637 | daniel-mar | 5740 | var componentBounds = getBounds$1(component); |
5741 | var spectrumBounds = getBounds$1(spectrum); |
||
597 | daniel-mar | 5742 | var componentMinEdge = getBoundsProperty(componentBounds, top); |
5743 | var componentMaxEdge = getBoundsProperty(componentBounds, bottom); |
||
5744 | var spectrumMinEdge = getBoundsProperty(spectrumBounds, top); |
||
5745 | return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge); |
||
5746 | }; |
||
5747 | |||
637 | daniel-mar | 5748 | var fireSliderChange$2 = function (spectrum, value) { |
597 | daniel-mar | 5749 | emitWith(spectrum, sliderChangeEvent(), { value: value }); |
5750 | }; |
||
637 | daniel-mar | 5751 | var sliderValue$2 = function (x) { |
597 | daniel-mar | 5752 | return { x: x }; |
5753 | }; |
||
637 | daniel-mar | 5754 | var findValueOfOffset$1 = function (spectrum, detail, left) { |
597 | daniel-mar | 5755 | var args = { |
5756 | min: minX(detail), |
||
5757 | max: maxX(detail), |
||
5758 | range: xRange(detail), |
||
5759 | value: left, |
||
5760 | step: step(detail), |
||
5761 | snap: snap(detail), |
||
5762 | snapStart: snapStart(detail), |
||
5763 | rounded: rounded(detail), |
||
5764 | hasMinEdge: hasLEdge(detail), |
||
5765 | hasMaxEdge: hasREdge(detail), |
||
5766 | minBound: getMinXBounds(spectrum), |
||
5767 | maxBound: getMaxXBounds(spectrum), |
||
5768 | screenRange: getXScreenRange(spectrum) |
||
5769 | }; |
||
5770 | return findValueOf(args); |
||
5771 | }; |
||
637 | daniel-mar | 5772 | var setValueFrom$2 = function (spectrum, detail, value) { |
5773 | var xValue = findValueOfOffset$1(spectrum, detail, value); |
||
5774 | var sliderVal = sliderValue$2(xValue); |
||
5775 | fireSliderChange$2(spectrum, sliderVal); |
||
597 | daniel-mar | 5776 | return xValue; |
5777 | }; |
||
637 | daniel-mar | 5778 | var setToMin$2 = function (spectrum, detail) { |
597 | daniel-mar | 5779 | var min = minX(detail); |
637 | daniel-mar | 5780 | fireSliderChange$2(spectrum, sliderValue$2(min)); |
597 | daniel-mar | 5781 | }; |
637 | daniel-mar | 5782 | var setToMax$2 = function (spectrum, detail) { |
597 | daniel-mar | 5783 | var max = maxX(detail); |
637 | daniel-mar | 5784 | fireSliderChange$2(spectrum, sliderValue$2(max)); |
597 | daniel-mar | 5785 | }; |
637 | daniel-mar | 5786 | var moveBy$2 = function (direction, spectrum, detail) { |
597 | daniel-mar | 5787 | var f = direction > 0 ? increaseBy : reduceBy; |
5788 | var xValue = f(currentValue(detail).x, minX(detail), maxX(detail), step(detail)); |
||
637 | daniel-mar | 5789 | fireSliderChange$2(spectrum, sliderValue$2(xValue)); |
597 | daniel-mar | 5790 | return Optional.some(xValue); |
5791 | }; |
||
637 | daniel-mar | 5792 | var handleMovement$2 = function (direction) { |
597 | daniel-mar | 5793 | return function (spectrum, detail) { |
637 | daniel-mar | 5794 | return moveBy$2(direction, spectrum, detail).map(always); |
597 | daniel-mar | 5795 | }; |
5796 | }; |
||
637 | daniel-mar | 5797 | var getValueFromEvent$2 = function (simulatedEvent) { |
597 | daniel-mar | 5798 | var pos = getEventSource(simulatedEvent); |
5799 | return pos.map(function (p) { |
||
5800 | return p.left; |
||
5801 | }); |
||
5802 | }; |
||
5803 | var findOffsetOfValue$1 = function (spectrum, detail, value, minEdge, maxEdge) { |
||
5804 | var minOffset = 0; |
||
5805 | var maxOffset = getXScreenRange(spectrum); |
||
5806 | var centerMinEdge = minEdge.bind(function (edge) { |
||
5807 | return Optional.some(getXCenterOffSetOf(edge, spectrum)); |
||
5808 | }).getOr(minOffset); |
||
5809 | var centerMaxEdge = maxEdge.bind(function (edge) { |
||
5810 | return Optional.some(getXCenterOffSetOf(edge, spectrum)); |
||
5811 | }).getOr(maxOffset); |
||
5812 | var args = { |
||
5813 | min: minX(detail), |
||
5814 | max: maxX(detail), |
||
5815 | range: xRange(detail), |
||
5816 | value: value, |
||
5817 | hasMinEdge: hasLEdge(detail), |
||
5818 | hasMaxEdge: hasREdge(detail), |
||
5819 | minBound: getMinXBounds(spectrum), |
||
5820 | minOffset: minOffset, |
||
5821 | maxBound: getMaxXBounds(spectrum), |
||
5822 | maxOffset: maxOffset, |
||
5823 | centerMinEdge: centerMinEdge, |
||
5824 | centerMaxEdge: centerMaxEdge |
||
5825 | }; |
||
637 | daniel-mar | 5826 | return findOffsetOfValue$2(args); |
597 | daniel-mar | 5827 | }; |
637 | daniel-mar | 5828 | var findPositionOfValue$1 = function (slider, spectrum, value, minEdge, maxEdge, detail) { |
597 | daniel-mar | 5829 | var offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge); |
5830 | return getMinXBounds(spectrum) - getMinXBounds(slider) + offset; |
||
5831 | }; |
||
637 | daniel-mar | 5832 | var setPositionFromValue$2 = function (slider, thumb, detail, edges) { |
597 | daniel-mar | 5833 | var value = currentValue(detail); |
637 | daniel-mar | 5834 | var pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail); |
5835 | var thumbRadius = get$5(thumb.element) / 2; |
||
5836 | set$5(thumb.element, 'left', pos - thumbRadius + 'px'); |
||
597 | daniel-mar | 5837 | }; |
637 | daniel-mar | 5838 | var onLeft$2 = handleMovement$2(-1); |
5839 | var onRight$2 = handleMovement$2(1); |
||
5840 | var onUp$2 = Optional.none; |
||
5841 | var onDown$2 = Optional.none; |
||
5842 | var edgeActions$2 = { |
||
597 | daniel-mar | 5843 | 'top-left': Optional.none(), |
5844 | 'top': Optional.none(), |
||
5845 | 'top-right': Optional.none(), |
||
5846 | 'right': Optional.some(setToREdge), |
||
5847 | 'bottom-right': Optional.none(), |
||
5848 | 'bottom': Optional.none(), |
||
5849 | 'bottom-left': Optional.none(), |
||
5850 | 'left': Optional.some(setToLEdge) |
||
5851 | }; |
||
5852 | |||
5853 | var HorizontalModel = /*#__PURE__*/Object.freeze({ |
||
5854 | __proto__: null, |
||
637 | daniel-mar | 5855 | setValueFrom: setValueFrom$2, |
5856 | setToMin: setToMin$2, |
||
5857 | setToMax: setToMax$2, |
||
5858 | findValueOfOffset: findValueOfOffset$1, |
||
5859 | getValueFromEvent: getValueFromEvent$2, |
||
5860 | findPositionOfValue: findPositionOfValue$1, |
||
5861 | setPositionFromValue: setPositionFromValue$2, |
||
5862 | onLeft: onLeft$2, |
||
5863 | onRight: onRight$2, |
||
5864 | onUp: onUp$2, |
||
5865 | onDown: onDown$2, |
||
5866 | edgeActions: edgeActions$2 |
||
597 | daniel-mar | 5867 | }); |
5868 | |||
637 | daniel-mar | 5869 | var fireSliderChange$1 = function (spectrum, value) { |
597 | daniel-mar | 5870 | emitWith(spectrum, sliderChangeEvent(), { value: value }); |
5871 | }; |
||
5872 | var sliderValue$1 = function (y) { |
||
5873 | return { y: y }; |
||
5874 | }; |
||
637 | daniel-mar | 5875 | var findValueOfOffset = function (spectrum, detail, top) { |
597 | daniel-mar | 5876 | var args = { |
5877 | min: minY(detail), |
||
5878 | max: maxY(detail), |
||
5879 | range: yRange(detail), |
||
5880 | value: top, |
||
5881 | step: step(detail), |
||
5882 | snap: snap(detail), |
||
5883 | snapStart: snapStart(detail), |
||
5884 | rounded: rounded(detail), |
||
5885 | hasMinEdge: hasTEdge(detail), |
||
5886 | hasMaxEdge: hasBEdge(detail), |
||
5887 | minBound: getMinYBounds(spectrum), |
||
5888 | maxBound: getMaxYBounds(spectrum), |
||
5889 | screenRange: getYScreenRange(spectrum) |
||
5890 | }; |
||
5891 | return findValueOf(args); |
||
5892 | }; |
||
5893 | var setValueFrom$1 = function (spectrum, detail, value) { |
||
637 | daniel-mar | 5894 | var yValue = findValueOfOffset(spectrum, detail, value); |
597 | daniel-mar | 5895 | var sliderVal = sliderValue$1(yValue); |
637 | daniel-mar | 5896 | fireSliderChange$1(spectrum, sliderVal); |
597 | daniel-mar | 5897 | return yValue; |
5898 | }; |
||
5899 | var setToMin$1 = function (spectrum, detail) { |
||
5900 | var min = minY(detail); |
||
637 | daniel-mar | 5901 | fireSliderChange$1(spectrum, sliderValue$1(min)); |
597 | daniel-mar | 5902 | }; |
5903 | var setToMax$1 = function (spectrum, detail) { |
||
5904 | var max = maxY(detail); |
||
637 | daniel-mar | 5905 | fireSliderChange$1(spectrum, sliderValue$1(max)); |
597 | daniel-mar | 5906 | }; |
5907 | var moveBy$1 = function (direction, spectrum, detail) { |
||
5908 | var f = direction > 0 ? increaseBy : reduceBy; |
||
5909 | var yValue = f(currentValue(detail).y, minY(detail), maxY(detail), step(detail)); |
||
637 | daniel-mar | 5910 | fireSliderChange$1(spectrum, sliderValue$1(yValue)); |
597 | daniel-mar | 5911 | return Optional.some(yValue); |
5912 | }; |
||
5913 | var handleMovement$1 = function (direction) { |
||
5914 | return function (spectrum, detail) { |
||
5915 | return moveBy$1(direction, spectrum, detail).map(always); |
||
5916 | }; |
||
5917 | }; |
||
5918 | var getValueFromEvent$1 = function (simulatedEvent) { |
||
5919 | var pos = getEventSource(simulatedEvent); |
||
5920 | return pos.map(function (p) { |
||
5921 | return p.top; |
||
5922 | }); |
||
5923 | }; |
||
637 | daniel-mar | 5924 | var findOffsetOfValue = function (spectrum, detail, value, minEdge, maxEdge) { |
597 | daniel-mar | 5925 | var minOffset = 0; |
5926 | var maxOffset = getYScreenRange(spectrum); |
||
5927 | var centerMinEdge = minEdge.bind(function (edge) { |
||
5928 | return Optional.some(getYCenterOffSetOf(edge, spectrum)); |
||
5929 | }).getOr(minOffset); |
||
5930 | var centerMaxEdge = maxEdge.bind(function (edge) { |
||
5931 | return Optional.some(getYCenterOffSetOf(edge, spectrum)); |
||
5932 | }).getOr(maxOffset); |
||
5933 | var args = { |
||
5934 | min: minY(detail), |
||
5935 | max: maxY(detail), |
||
5936 | range: yRange(detail), |
||
5937 | value: value, |
||
5938 | hasMinEdge: hasTEdge(detail), |
||
5939 | hasMaxEdge: hasBEdge(detail), |
||
5940 | minBound: getMinYBounds(spectrum), |
||
5941 | minOffset: minOffset, |
||
5942 | maxBound: getMaxYBounds(spectrum), |
||
5943 | maxOffset: maxOffset, |
||
5944 | centerMinEdge: centerMinEdge, |
||
5945 | centerMaxEdge: centerMaxEdge |
||
5946 | }; |
||
637 | daniel-mar | 5947 | return findOffsetOfValue$2(args); |
597 | daniel-mar | 5948 | }; |
637 | daniel-mar | 5949 | var findPositionOfValue = function (slider, spectrum, value, minEdge, maxEdge, detail) { |
5950 | var offset = findOffsetOfValue(spectrum, detail, value, minEdge, maxEdge); |
||
597 | daniel-mar | 5951 | return getMinYBounds(spectrum) - getMinYBounds(slider) + offset; |
5952 | }; |
||
5953 | var setPositionFromValue$1 = function (slider, thumb, detail, edges) { |
||
5954 | var value = currentValue(detail); |
||
637 | daniel-mar | 5955 | var pos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail); |
5956 | var thumbRadius = get$7(thumb.element) / 2; |
||
5957 | set$5(thumb.element, 'top', pos - thumbRadius + 'px'); |
||
597 | daniel-mar | 5958 | }; |
5959 | var onLeft$1 = Optional.none; |
||
5960 | var onRight$1 = Optional.none; |
||
5961 | var onUp$1 = handleMovement$1(-1); |
||
5962 | var onDown$1 = handleMovement$1(1); |
||
5963 | var edgeActions$1 = { |
||
5964 | 'top-left': Optional.none(), |
||
5965 | 'top': Optional.some(setToTEdge), |
||
5966 | 'top-right': Optional.none(), |
||
5967 | 'right': Optional.none(), |
||
5968 | 'bottom-right': Optional.none(), |
||
5969 | 'bottom': Optional.some(setToBEdge), |
||
5970 | 'bottom-left': Optional.none(), |
||
5971 | 'left': Optional.none() |
||
5972 | }; |
||
5973 | |||
5974 | var VerticalModel = /*#__PURE__*/Object.freeze({ |
||
5975 | __proto__: null, |
||
5976 | setValueFrom: setValueFrom$1, |
||
5977 | setToMin: setToMin$1, |
||
5978 | setToMax: setToMax$1, |
||
637 | daniel-mar | 5979 | findValueOfOffset: findValueOfOffset, |
597 | daniel-mar | 5980 | getValueFromEvent: getValueFromEvent$1, |
637 | daniel-mar | 5981 | findPositionOfValue: findPositionOfValue, |
597 | daniel-mar | 5982 | setPositionFromValue: setPositionFromValue$1, |
5983 | onLeft: onLeft$1, |
||
5984 | onRight: onRight$1, |
||
5985 | onUp: onUp$1, |
||
5986 | onDown: onDown$1, |
||
5987 | edgeActions: edgeActions$1 |
||
5988 | }); |
||
5989 | |||
637 | daniel-mar | 5990 | var fireSliderChange = function (spectrum, value) { |
597 | daniel-mar | 5991 | emitWith(spectrum, sliderChangeEvent(), { value: value }); |
5992 | }; |
||
637 | daniel-mar | 5993 | var sliderValue = function (x, y) { |
597 | daniel-mar | 5994 | return { |
5995 | x: x, |
||
5996 | y: y |
||
5997 | }; |
||
5998 | }; |
||
637 | daniel-mar | 5999 | var setValueFrom = function (spectrum, detail, value) { |
6000 | var xValue = findValueOfOffset$1(spectrum, detail, value.left); |
||
6001 | var yValue = findValueOfOffset(spectrum, detail, value.top); |
||
6002 | var val = sliderValue(xValue, yValue); |
||
6003 | fireSliderChange(spectrum, val); |
||
597 | daniel-mar | 6004 | return val; |
6005 | }; |
||
637 | daniel-mar | 6006 | var moveBy = function (direction, isVerticalMovement, spectrum, detail) { |
597 | daniel-mar | 6007 | var f = direction > 0 ? increaseBy : reduceBy; |
6008 | var xValue = isVerticalMovement ? currentValue(detail).x : f(currentValue(detail).x, minX(detail), maxX(detail), step(detail)); |
||
6009 | var yValue = !isVerticalMovement ? currentValue(detail).y : f(currentValue(detail).y, minY(detail), maxY(detail), step(detail)); |
||
637 | daniel-mar | 6010 | fireSliderChange(spectrum, sliderValue(xValue, yValue)); |
597 | daniel-mar | 6011 | return Optional.some(xValue); |
6012 | }; |
||
637 | daniel-mar | 6013 | var handleMovement = function (direction, isVerticalMovement) { |
597 | daniel-mar | 6014 | return function (spectrum, detail) { |
637 | daniel-mar | 6015 | return moveBy(direction, isVerticalMovement, spectrum, detail).map(always); |
597 | daniel-mar | 6016 | }; |
6017 | }; |
||
637 | daniel-mar | 6018 | var setToMin = function (spectrum, detail) { |
597 | daniel-mar | 6019 | var mX = minX(detail); |
6020 | var mY = minY(detail); |
||
637 | daniel-mar | 6021 | fireSliderChange(spectrum, sliderValue(mX, mY)); |
597 | daniel-mar | 6022 | }; |
637 | daniel-mar | 6023 | var setToMax = function (spectrum, detail) { |
597 | daniel-mar | 6024 | var mX = maxX(detail); |
6025 | var mY = maxY(detail); |
||
637 | daniel-mar | 6026 | fireSliderChange(spectrum, sliderValue(mX, mY)); |
597 | daniel-mar | 6027 | }; |
637 | daniel-mar | 6028 | var getValueFromEvent = function (simulatedEvent) { |
597 | daniel-mar | 6029 | return getEventSource(simulatedEvent); |
6030 | }; |
||
637 | daniel-mar | 6031 | var setPositionFromValue = function (slider, thumb, detail, edges) { |
597 | daniel-mar | 6032 | var value = currentValue(detail); |
637 | daniel-mar | 6033 | var xPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail); |
6034 | var yPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail); |
||
6035 | var thumbXRadius = get$5(thumb.element) / 2; |
||
6036 | var thumbYRadius = get$7(thumb.element) / 2; |
||
6037 | set$5(thumb.element, 'left', xPos - thumbXRadius + 'px'); |
||
6038 | set$5(thumb.element, 'top', yPos - thumbYRadius + 'px'); |
||
597 | daniel-mar | 6039 | }; |
637 | daniel-mar | 6040 | var onLeft = handleMovement(-1, false); |
6041 | var onRight = handleMovement(1, false); |
||
6042 | var onUp = handleMovement(-1, true); |
||
6043 | var onDown = handleMovement(1, true); |
||
6044 | var edgeActions = { |
||
597 | daniel-mar | 6045 | 'top-left': Optional.some(setToTLEdgeXY), |
6046 | 'top': Optional.some(setToTEdgeXY), |
||
6047 | 'top-right': Optional.some(setToTREdgeXY), |
||
6048 | 'right': Optional.some(setToREdgeXY), |
||
6049 | 'bottom-right': Optional.some(setToBREdgeXY), |
||
6050 | 'bottom': Optional.some(setToBEdgeXY), |
||
6051 | 'bottom-left': Optional.some(setToBLEdgeXY), |
||
6052 | 'left': Optional.some(setToLEdgeXY) |
||
6053 | }; |
||
6054 | |||
6055 | var TwoDModel = /*#__PURE__*/Object.freeze({ |
||
6056 | __proto__: null, |
||
637 | daniel-mar | 6057 | setValueFrom: setValueFrom, |
6058 | setToMin: setToMin, |
||
6059 | setToMax: setToMax, |
||
6060 | getValueFromEvent: getValueFromEvent, |
||
6061 | setPositionFromValue: setPositionFromValue, |
||
6062 | onLeft: onLeft, |
||
6063 | onRight: onRight, |
||
6064 | onUp: onUp, |
||
6065 | onDown: onDown, |
||
6066 | edgeActions: edgeActions |
||
597 | daniel-mar | 6067 | }); |
6068 | |||
6069 | var SliderSchema = [ |
||
637 | daniel-mar | 6070 | defaulted('stepSize', 1), |
6071 | defaulted('onChange', noop), |
||
6072 | defaulted('onChoose', noop), |
||
6073 | defaulted('onInit', noop), |
||
6074 | defaulted('onDragStart', noop), |
||
6075 | defaulted('onDragEnd', noop), |
||
6076 | defaulted('snapToGrid', false), |
||
6077 | defaulted('rounded', true), |
||
597 | daniel-mar | 6078 | option('snapStart'), |
637 | daniel-mar | 6079 | requiredOf('model', choose$1('mode', { |
597 | daniel-mar | 6080 | x: [ |
637 | daniel-mar | 6081 | defaulted('minX', 0), |
6082 | defaulted('maxX', 100), |
||
6083 | customField('value', function (spec) { |
||
597 | daniel-mar | 6084 | return Cell(spec.mode.minX); |
6085 | }), |
||
637 | daniel-mar | 6086 | required$1('getInitialValue'), |
597 | daniel-mar | 6087 | output('manager', HorizontalModel) |
6088 | ], |
||
6089 | y: [ |
||
637 | daniel-mar | 6090 | defaulted('minY', 0), |
6091 | defaulted('maxY', 100), |
||
6092 | customField('value', function (spec) { |
||
597 | daniel-mar | 6093 | return Cell(spec.mode.minY); |
6094 | }), |
||
637 | daniel-mar | 6095 | required$1('getInitialValue'), |
597 | daniel-mar | 6096 | output('manager', VerticalModel) |
6097 | ], |
||
6098 | xy: [ |
||
637 | daniel-mar | 6099 | defaulted('minX', 0), |
6100 | defaulted('maxX', 100), |
||
6101 | defaulted('minY', 0), |
||
6102 | defaulted('maxY', 100), |
||
6103 | customField('value', function (spec) { |
||
597 | daniel-mar | 6104 | return Cell({ |
6105 | x: spec.mode.minX, |
||
6106 | y: spec.mode.minY |
||
6107 | }); |
||
6108 | }), |
||
637 | daniel-mar | 6109 | required$1('getInitialValue'), |
597 | daniel-mar | 6110 | output('manager', TwoDModel) |
6111 | ] |
||
6112 | })), |
||
6113 | field$1('sliderBehaviours', [ |
||
6114 | Keying, |
||
6115 | Representing |
||
6116 | ]), |
||
637 | daniel-mar | 6117 | customField('mouseIsDown', function () { |
597 | daniel-mar | 6118 | return Cell(false); |
6119 | }) |
||
6120 | ]; |
||
6121 | |||
637 | daniel-mar | 6122 | var mouseReleased = constant$1('mouse.released'); |
597 | daniel-mar | 6123 | |
637 | daniel-mar | 6124 | var sketch$9 = function (detail, components, _spec, _externals) { |
597 | daniel-mar | 6125 | var _a; |
6126 | var getThumb = function (component) { |
||
6127 | return getPartOrDie(component, detail, 'thumb'); |
||
6128 | }; |
||
6129 | var getSpectrum = function (component) { |
||
6130 | return getPartOrDie(component, detail, 'spectrum'); |
||
6131 | }; |
||
6132 | var getLeftEdge = function (component) { |
||
6133 | return getPart(component, detail, 'left-edge'); |
||
6134 | }; |
||
6135 | var getRightEdge = function (component) { |
||
6136 | return getPart(component, detail, 'right-edge'); |
||
6137 | }; |
||
6138 | var getTopEdge = function (component) { |
||
6139 | return getPart(component, detail, 'top-edge'); |
||
6140 | }; |
||
6141 | var getBottomEdge = function (component) { |
||
6142 | return getPart(component, detail, 'bottom-edge'); |
||
6143 | }; |
||
6144 | var modelDetail = detail.model; |
||
6145 | var model = modelDetail.manager; |
||
6146 | var refresh = function (slider, thumb) { |
||
6147 | model.setPositionFromValue(slider, thumb, detail, { |
||
6148 | getLeftEdge: getLeftEdge, |
||
6149 | getRightEdge: getRightEdge, |
||
6150 | getTopEdge: getTopEdge, |
||
6151 | getBottomEdge: getBottomEdge, |
||
6152 | getSpectrum: getSpectrum |
||
6153 | }); |
||
6154 | }; |
||
6155 | var setValue = function (slider, newValue) { |
||
6156 | modelDetail.value.set(newValue); |
||
6157 | var thumb = getThumb(slider); |
||
6158 | refresh(slider, thumb); |
||
6159 | }; |
||
6160 | var changeValue = function (slider, newValue) { |
||
6161 | setValue(slider, newValue); |
||
6162 | var thumb = getThumb(slider); |
||
6163 | detail.onChange(slider, thumb, newValue); |
||
6164 | return Optional.some(true); |
||
6165 | }; |
||
6166 | var resetToMin = function (slider) { |
||
6167 | model.setToMin(slider, detail); |
||
6168 | }; |
||
6169 | var resetToMax = function (slider) { |
||
6170 | model.setToMax(slider, detail); |
||
6171 | }; |
||
6172 | var choose = function (slider) { |
||
6173 | var fireOnChoose = function () { |
||
6174 | getPart(slider, detail, 'thumb').each(function (thumb) { |
||
6175 | var value = modelDetail.value.get(); |
||
6176 | detail.onChoose(slider, thumb, value); |
||
6177 | }); |
||
6178 | }; |
||
6179 | var wasDown = detail.mouseIsDown.get(); |
||
6180 | detail.mouseIsDown.set(false); |
||
6181 | if (wasDown) { |
||
6182 | fireOnChoose(); |
||
6183 | } |
||
6184 | }; |
||
6185 | var onDragStart = function (slider, simulatedEvent) { |
||
6186 | simulatedEvent.stop(); |
||
6187 | detail.mouseIsDown.set(true); |
||
6188 | detail.onDragStart(slider, getThumb(slider)); |
||
6189 | }; |
||
6190 | var onDragEnd = function (slider, simulatedEvent) { |
||
6191 | simulatedEvent.stop(); |
||
6192 | detail.onDragEnd(slider, getThumb(slider)); |
||
6193 | choose(slider); |
||
6194 | }; |
||
6195 | return { |
||
6196 | uid: detail.uid, |
||
6197 | dom: detail.dom, |
||
6198 | components: components, |
||
6199 | behaviours: augment(detail.sliderBehaviours, [ |
||
6200 | Keying.config({ |
||
6201 | mode: 'special', |
||
6202 | focusIn: function (slider) { |
||
6203 | return getPart(slider, detail, 'spectrum').map(Keying.focusIn).map(always); |
||
6204 | } |
||
6205 | }), |
||
6206 | Representing.config({ |
||
6207 | store: { |
||
6208 | mode: 'manual', |
||
6209 | getValue: function (_) { |
||
6210 | return modelDetail.value.get(); |
||
6211 | } |
||
6212 | } |
||
6213 | }), |
||
6214 | Receiving.config({ channels: (_a = {}, _a[mouseReleased()] = { onReceive: choose }, _a) }) |
||
6215 | ]), |
||
637 | daniel-mar | 6216 | events: derive$3([ |
597 | daniel-mar | 6217 | run(sliderChangeEvent(), function (slider, simulatedEvent) { |
6218 | changeValue(slider, simulatedEvent.event.value); |
||
6219 | }), |
||
6220 | runOnAttached(function (slider, _simulatedEvent) { |
||
6221 | var getInitial = modelDetail.getInitialValue(); |
||
6222 | modelDetail.value.set(getInitial); |
||
6223 | var thumb = getThumb(slider); |
||
6224 | refresh(slider, thumb); |
||
6225 | var spectrum = getSpectrum(slider); |
||
6226 | detail.onInit(slider, thumb, spectrum, modelDetail.value.get()); |
||
6227 | }), |
||
6228 | run(touchstart(), onDragStart), |
||
6229 | run(touchend(), onDragEnd), |
||
6230 | run(mousedown(), onDragStart), |
||
6231 | run(mouseup(), onDragEnd) |
||
6232 | ]), |
||
6233 | apis: { |
||
6234 | resetToMin: resetToMin, |
||
6235 | resetToMax: resetToMax, |
||
6236 | setValue: setValue, |
||
6237 | refresh: refresh |
||
6238 | }, |
||
6239 | domModification: { styles: { position: 'relative' } } |
||
6240 | }; |
||
6241 | }; |
||
6242 | |||
637 | daniel-mar | 6243 | var Slider = composite({ |
597 | daniel-mar | 6244 | name: 'Slider', |
6245 | configFields: SliderSchema, |
||
6246 | partFields: SliderParts, |
||
637 | daniel-mar | 6247 | factory: sketch$9, |
597 | daniel-mar | 6248 | apis: { |
6249 | setValue: function (apis, slider, value) { |
||
6250 | apis.setValue(slider, value); |
||
6251 | }, |
||
6252 | resetToMin: function (apis, slider) { |
||
6253 | apis.resetToMin(slider); |
||
6254 | }, |
||
6255 | resetToMax: function (apis, slider) { |
||
6256 | apis.resetToMax(slider); |
||
6257 | }, |
||
6258 | refresh: function (apis, slider) { |
||
6259 | apis.refresh(slider); |
||
6260 | } |
||
6261 | } |
||
6262 | }); |
||
6263 | |||
6264 | var button = function (realm, clazz, makeItems, editor) { |
||
6265 | return forToolbar(clazz, function () { |
||
6266 | var items = makeItems(); |
||
6267 | realm.setContextToolbar([{ |
||
6268 | label: clazz + ' group', |
||
6269 | items: items |
||
6270 | }]); |
||
6271 | }, {}, editor); |
||
6272 | }; |
||
6273 | |||
6274 | var BLACK = -1; |
||
637 | daniel-mar | 6275 | var makeSlider$1 = function (spec$1) { |
597 | daniel-mar | 6276 | var getColor = function (hue) { |
6277 | if (hue < 0) { |
||
6278 | return 'black'; |
||
6279 | } else if (hue > 360) { |
||
6280 | return 'white'; |
||
6281 | } else { |
||
6282 | return 'hsl(' + hue + ', 100%, 50%)'; |
||
6283 | } |
||
6284 | }; |
||
6285 | var onInit = function (slider, thumb, spectrum, value) { |
||
6286 | var color = getColor(value.x()); |
||
637 | daniel-mar | 6287 | set$5(thumb.element, 'background-color', color); |
597 | daniel-mar | 6288 | }; |
6289 | var onChange = function (slider, thumb, value) { |
||
6290 | var color = getColor(value.x()); |
||
637 | daniel-mar | 6291 | set$5(thumb.element, 'background-color', color); |
597 | daniel-mar | 6292 | spec$1.onChange(slider, thumb, color); |
6293 | }; |
||
6294 | return Slider.sketch({ |
||
6295 | dom: dom$1('<div class="${prefix}-slider ${prefix}-hue-slider-container"></div>'), |
||
6296 | components: [ |
||
6297 | Slider.parts['left-edge'](spec('<div class="${prefix}-hue-slider-black"></div>')), |
||
6298 | Slider.parts.spectrum({ |
||
6299 | dom: dom$1('<div class="${prefix}-slider-gradient-container"></div>'), |
||
6300 | components: [spec('<div class="${prefix}-slider-gradient"></div>')], |
||
637 | daniel-mar | 6301 | behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })]) |
597 | daniel-mar | 6302 | }), |
6303 | Slider.parts['right-edge'](spec('<div class="${prefix}-hue-slider-white"></div>')), |
||
6304 | Slider.parts.thumb({ |
||
6305 | dom: dom$1('<div class="${prefix}-slider-thumb"></div>'), |
||
637 | daniel-mar | 6306 | behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })]) |
597 | daniel-mar | 6307 | }) |
6308 | ], |
||
6309 | onChange: onChange, |
||
6310 | onDragStart: function (slider, thumb) { |
||
6311 | Toggling.on(thumb); |
||
6312 | }, |
||
6313 | onDragEnd: function (slider, thumb) { |
||
6314 | Toggling.off(thumb); |
||
6315 | }, |
||
6316 | onInit: onInit, |
||
6317 | stepSize: 10, |
||
6318 | model: { |
||
6319 | mode: 'x', |
||
6320 | minX: 0, |
||
6321 | maxX: 360, |
||
6322 | getInitialValue: function () { |
||
6323 | return { x: spec$1.getInitialValue() }; |
||
6324 | } |
||
6325 | }, |
||
637 | daniel-mar | 6326 | sliderBehaviours: derive$2([orientation(Slider.refresh)]) |
597 | daniel-mar | 6327 | }); |
6328 | }; |
||
637 | daniel-mar | 6329 | var makeItems$1 = function (spec) { |
6330 | return [makeSlider$1(spec)]; |
||
597 | daniel-mar | 6331 | }; |
637 | daniel-mar | 6332 | var sketch$8 = function (realm, editor) { |
597 | daniel-mar | 6333 | var spec = { |
6334 | onChange: function (slider, thumb, color) { |
||
6335 | editor.undoManager.transact(function () { |
||
6336 | editor.formatter.apply('forecolor', { value: color }); |
||
6337 | editor.nodeChanged(); |
||
6338 | }); |
||
6339 | }, |
||
637 | daniel-mar | 6340 | getInitialValue: constant$1(BLACK) |
597 | daniel-mar | 6341 | }; |
6342 | return button(realm, 'color-levels', function () { |
||
637 | daniel-mar | 6343 | return makeItems$1(spec); |
597 | daniel-mar | 6344 | }, editor); |
6345 | }; |
||
6346 | |||
6347 | var candidatesArray = [ |
||
6348 | '9px', |
||
6349 | '10px', |
||
6350 | '11px', |
||
6351 | '12px', |
||
6352 | '14px', |
||
6353 | '16px', |
||
6354 | '18px', |
||
6355 | '20px', |
||
6356 | '24px', |
||
6357 | '32px', |
||
6358 | '36px' |
||
6359 | ]; |
||
6360 | var defaultSize = 'medium'; |
||
6361 | var defaultIndex = 2; |
||
6362 | var indexToSize = function (index) { |
||
6363 | return Optional.from(candidatesArray[index]); |
||
6364 | }; |
||
6365 | var sizeToIndex = function (size) { |
||
637 | daniel-mar | 6366 | return findIndex$1(candidatesArray, function (v) { |
597 | daniel-mar | 6367 | return v === size; |
6368 | }); |
||
6369 | }; |
||
6370 | var getRawOrComputed = function (isRoot, rawStart) { |
||
6371 | var optStart = isElement(rawStart) ? Optional.some(rawStart) : parent(rawStart).filter(isElement); |
||
6372 | return optStart.map(function (start) { |
||
637 | daniel-mar | 6373 | var inline = closest$2(start, function (elem) { |
597 | daniel-mar | 6374 | return getRaw(elem, 'font-size').isSome(); |
6375 | }, isRoot).bind(function (elem) { |
||
6376 | return getRaw(elem, 'font-size'); |
||
6377 | }); |
||
6378 | return inline.getOrThunk(function () { |
||
637 | daniel-mar | 6379 | return get$8(start, 'font-size'); |
597 | daniel-mar | 6380 | }); |
6381 | }).getOr(''); |
||
6382 | }; |
||
6383 | var getSize = function (editor) { |
||
6384 | var node = editor.selection.getStart(); |
||
6385 | var elem = SugarElement.fromDom(node); |
||
6386 | var root = SugarElement.fromDom(editor.getBody()); |
||
6387 | var isRoot = function (e) { |
||
6388 | return eq(root, e); |
||
6389 | }; |
||
6390 | var elemSize = getRawOrComputed(isRoot, elem); |
||
637 | daniel-mar | 6391 | return find$2(candidatesArray, function (size) { |
597 | daniel-mar | 6392 | return elemSize === size; |
6393 | }).getOr(defaultSize); |
||
6394 | }; |
||
6395 | var applySize = function (editor, value) { |
||
6396 | var currentValue = getSize(editor); |
||
6397 | if (currentValue !== value) { |
||
6398 | editor.execCommand('fontSize', false, value); |
||
6399 | } |
||
6400 | }; |
||
637 | daniel-mar | 6401 | var get$4 = function (editor) { |
597 | daniel-mar | 6402 | var size = getSize(editor); |
6403 | return sizeToIndex(size).getOr(defaultIndex); |
||
6404 | }; |
||
637 | daniel-mar | 6405 | var apply = function (editor, index) { |
597 | daniel-mar | 6406 | indexToSize(index).each(function (size) { |
6407 | applySize(editor, size); |
||
6408 | }); |
||
6409 | }; |
||
637 | daniel-mar | 6410 | var candidates = constant$1(candidatesArray); |
597 | daniel-mar | 6411 | |
637 | daniel-mar | 6412 | var schema$9 = objOfOnly([ |
6413 | required$1('getInitialValue'), |
||
6414 | required$1('onChange'), |
||
6415 | required$1('category'), |
||
6416 | required$1('sizes') |
||
597 | daniel-mar | 6417 | ]); |
637 | daniel-mar | 6418 | var sketch$7 = function (rawSpec) { |
6419 | var spec$1 = asRawOrDie$1('SizeSlider', schema$9, rawSpec); |
||
597 | daniel-mar | 6420 | var isValidValue = function (valueIndex) { |
6421 | return valueIndex >= 0 && valueIndex < spec$1.sizes.length; |
||
6422 | }; |
||
6423 | var onChange = function (slider, thumb, valueIndex) { |
||
6424 | var index = valueIndex.x(); |
||
6425 | if (isValidValue(index)) { |
||
6426 | spec$1.onChange(index); |
||
6427 | } |
||
6428 | }; |
||
6429 | return Slider.sketch({ |
||
6430 | dom: { |
||
6431 | tag: 'div', |
||
6432 | classes: [ |
||
6433 | resolve('slider-' + spec$1.category + '-size-container'), |
||
6434 | resolve('slider'), |
||
6435 | resolve('slider-size-container') |
||
6436 | ] |
||
6437 | }, |
||
6438 | onChange: onChange, |
||
6439 | onDragStart: function (slider, thumb) { |
||
6440 | Toggling.on(thumb); |
||
6441 | }, |
||
6442 | onDragEnd: function (slider, thumb) { |
||
6443 | Toggling.off(thumb); |
||
6444 | }, |
||
6445 | model: { |
||
6446 | mode: 'x', |
||
6447 | minX: 0, |
||
6448 | maxX: spec$1.sizes.length - 1, |
||
6449 | getInitialValue: function () { |
||
6450 | return { x: spec$1.getInitialValue() }; |
||
6451 | } |
||
6452 | }, |
||
6453 | stepSize: 1, |
||
6454 | snapToGrid: true, |
||
637 | daniel-mar | 6455 | sliderBehaviours: derive$2([orientation(Slider.refresh)]), |
597 | daniel-mar | 6456 | components: [ |
6457 | Slider.parts.spectrum({ |
||
6458 | dom: dom$1('<div class="${prefix}-slider-size-container"></div>'), |
||
6459 | components: [spec('<div class="${prefix}-slider-size-line"></div>')] |
||
6460 | }), |
||
6461 | Slider.parts.thumb({ |
||
6462 | dom: dom$1('<div class="${prefix}-slider-thumb"></div>'), |
||
637 | daniel-mar | 6463 | behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })]) |
597 | daniel-mar | 6464 | }) |
6465 | ] |
||
6466 | }); |
||
6467 | }; |
||
6468 | |||
6469 | var sizes = candidates(); |
||
637 | daniel-mar | 6470 | var makeSlider = function (spec) { |
6471 | return sketch$7({ |
||
597 | daniel-mar | 6472 | onChange: spec.onChange, |
6473 | sizes: sizes, |
||
6474 | category: 'font', |
||
6475 | getInitialValue: spec.getInitialValue |
||
6476 | }); |
||
6477 | }; |
||
637 | daniel-mar | 6478 | var makeItems = function (spec$1) { |
597 | daniel-mar | 6479 | return [ |
6480 | spec('<span class="${prefix}-toolbar-button ${prefix}-icon-small-font ${prefix}-icon"></span>'), |
||
637 | daniel-mar | 6481 | makeSlider(spec$1), |
597 | daniel-mar | 6482 | spec('<span class="${prefix}-toolbar-button ${prefix}-icon-large-font ${prefix}-icon"></span>') |
6483 | ]; |
||
6484 | }; |
||
637 | daniel-mar | 6485 | var sketch$6 = function (realm, editor) { |
597 | daniel-mar | 6486 | var spec = { |
6487 | onChange: function (value) { |
||
637 | daniel-mar | 6488 | apply(editor, value); |
597 | daniel-mar | 6489 | }, |
6490 | getInitialValue: function () { |
||
637 | daniel-mar | 6491 | return get$4(editor); |
597 | daniel-mar | 6492 | } |
6493 | }; |
||
6494 | return button(realm, 'font-size', function () { |
||
637 | daniel-mar | 6495 | return makeItems(spec); |
597 | daniel-mar | 6496 | }, editor); |
6497 | }; |
||
6498 | |||
6499 | var record = function (spec) { |
||
637 | daniel-mar | 6500 | var uid = isSketchSpec$1(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$2('memento'); |
597 | daniel-mar | 6501 | var get = function (anyInSystem) { |
6502 | return anyInSystem.getSystem().getByUid(uid).getOrDie(); |
||
6503 | }; |
||
6504 | var getOpt = function (anyInSystem) { |
||
6505 | return anyInSystem.getSystem().getByUid(uid).toOptional(); |
||
6506 | }; |
||
6507 | var asSpec = function () { |
||
6508 | return __assign(__assign({}, spec), { uid: uid }); |
||
6509 | }; |
||
6510 | return { |
||
6511 | get: get, |
||
6512 | getOpt: getOpt, |
||
6513 | asSpec: asSpec |
||
6514 | }; |
||
6515 | }; |
||
6516 | |||
679 | daniel-mar | 6517 | var exports$1 = {}, module = { exports: exports$1 }; |
6518 | (function (define, exports, module, require) { |
||
6519 | (function (global, factory) { |
||
6520 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory()); |
||
6521 | }(this, function () { |
||
6522 | var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; |
||
6523 | var promise = { exports: {} }; |
||
6524 | (function (module) { |
||
6525 | (function (root) { |
||
6526 | var setTimeoutFunc = setTimeout; |
||
6527 | function noop() { |
||
597 | daniel-mar | 6528 | } |
679 | daniel-mar | 6529 | function bind(fn, thisArg) { |
6530 | return function () { |
||
6531 | fn.apply(thisArg, arguments); |
||
6532 | }; |
||
597 | daniel-mar | 6533 | } |
679 | daniel-mar | 6534 | function Promise(fn) { |
6535 | if (typeof this !== 'object') |
||
6536 | throw new TypeError('Promises must be constructed via new'); |
||
6537 | if (typeof fn !== 'function') |
||
6538 | throw new TypeError('not a function'); |
||
6539 | this._state = 0; |
||
6540 | this._handled = false; |
||
6541 | this._value = undefined; |
||
6542 | this._deferreds = []; |
||
6543 | doResolve(fn, this); |
||
597 | daniel-mar | 6544 | } |
679 | daniel-mar | 6545 | function handle(self, deferred) { |
6546 | while (self._state === 3) { |
||
6547 | self = self._value; |
||
6548 | } |
||
6549 | if (self._state === 0) { |
||
6550 | self._deferreds.push(deferred); |
||
6551 | return; |
||
6552 | } |
||
6553 | self._handled = true; |
||
6554 | Promise._immediateFn(function () { |
||
6555 | var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; |
||
6556 | if (cb === null) { |
||
6557 | (self._state === 1 ? resolve : reject)(deferred.promise, self._value); |
||
597 | daniel-mar | 6558 | return; |
6559 | } |
||
679 | daniel-mar | 6560 | var ret; |
6561 | try { |
||
6562 | ret = cb(self._value); |
||
6563 | } catch (e) { |
||
6564 | reject(deferred.promise, e); |
||
6565 | return; |
||
6566 | } |
||
6567 | resolve(deferred.promise, ret); |
||
6568 | }); |
||
6569 | } |
||
6570 | function resolve(self, newValue) { |
||
6571 | try { |
||
6572 | if (newValue === self) |
||
6573 | throw new TypeError('A promise cannot be resolved with itself.'); |
||
6574 | if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { |
||
6575 | var then = newValue.then; |
||
6576 | if (newValue instanceof Promise) { |
||
6577 | self._state = 3; |
||
6578 | self._value = newValue; |
||
6579 | finale(self); |
||
6580 | return; |
||
6581 | } else if (typeof then === 'function') { |
||
6582 | doResolve(bind(then, newValue), self); |
||
6583 | return; |
||
6584 | } |
||
6585 | } |
||
6586 | self._state = 1; |
||
6587 | self._value = newValue; |
||
6588 | finale(self); |
||
6589 | } catch (e) { |
||
6590 | reject(self, e); |
||
597 | daniel-mar | 6591 | } |
679 | daniel-mar | 6592 | } |
6593 | function reject(self, newValue) { |
||
6594 | self._state = 2; |
||
6595 | self._value = newValue; |
||
6596 | finale(self); |
||
6597 | } |
||
6598 | function finale(self) { |
||
6599 | if (self._state === 2 && self._deferreds.length === 0) { |
||
6600 | Promise._immediateFn(function () { |
||
6601 | if (!self._handled) { |
||
6602 | Promise._unhandledRejectionFn(self._value); |
||
6603 | } |
||
6604 | }); |
||
597 | daniel-mar | 6605 | } |
679 | daniel-mar | 6606 | for (var i = 0, len = self._deferreds.length; i < len; i++) { |
6607 | handle(self, self._deferreds[i]); |
||
6608 | } |
||
6609 | self._deferreds = null; |
||
597 | daniel-mar | 6610 | } |
679 | daniel-mar | 6611 | function Handler(onFulfilled, onRejected, promise) { |
6612 | this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; |
||
6613 | this.onRejected = typeof onRejected === 'function' ? onRejected : null; |
||
6614 | this.promise = promise; |
||
6615 | } |
||
6616 | function doResolve(fn, self) { |
||
6617 | var done = false; |
||
6618 | try { |
||
6619 | fn(function (value) { |
||
6620 | if (done) |
||
6621 | return; |
||
6622 | done = true; |
||
6623 | resolve(self, value); |
||
6624 | }, function (reason) { |
||
6625 | if (done) |
||
6626 | return; |
||
6627 | done = true; |
||
6628 | reject(self, reason); |
||
6629 | }); |
||
6630 | } catch (ex) { |
||
6631 | if (done) |
||
6632 | return; |
||
6633 | done = true; |
||
6634 | reject(self, ex); |
||
6635 | } |
||
6636 | } |
||
6637 | Promise.prototype['catch'] = function (onRejected) { |
||
6638 | return this.then(null, onRejected); |
||
6639 | }; |
||
6640 | Promise.prototype.then = function (onFulfilled, onRejected) { |
||
6641 | var prom = new this.constructor(noop); |
||
6642 | handle(this, new Handler(onFulfilled, onRejected, prom)); |
||
6643 | return prom; |
||
6644 | }; |
||
6645 | Promise.all = function (arr) { |
||
6646 | var args = Array.prototype.slice.call(arr); |
||
6647 | return new Promise(function (resolve, reject) { |
||
6648 | if (args.length === 0) |
||
6649 | return resolve([]); |
||
6650 | var remaining = args.length; |
||
6651 | function res(i, val) { |
||
6652 | try { |
||
6653 | if (val && (typeof val === 'object' || typeof val === 'function')) { |
||
6654 | var then = val.then; |
||
6655 | if (typeof then === 'function') { |
||
6656 | then.call(val, function (val) { |
||
6657 | res(i, val); |
||
6658 | }, reject); |
||
6659 | return; |
||
6660 | } |
||
6661 | } |
||
6662 | args[i] = val; |
||
6663 | if (--remaining === 0) { |
||
6664 | resolve(args); |
||
6665 | } |
||
6666 | } catch (ex) { |
||
6667 | reject(ex); |
||
6668 | } |
||
6669 | } |
||
6670 | for (var i = 0; i < args.length; i++) { |
||
6671 | res(i, args[i]); |
||
6672 | } |
||
6673 | }); |
||
6674 | }; |
||
6675 | Promise.resolve = function (value) { |
||
6676 | if (value && typeof value === 'object' && value.constructor === Promise) { |
||
6677 | return value; |
||
6678 | } |
||
6679 | return new Promise(function (resolve) { |
||
6680 | resolve(value); |
||
6681 | }); |
||
6682 | }; |
||
6683 | Promise.reject = function (value) { |
||
6684 | return new Promise(function (resolve, reject) { |
||
6685 | reject(value); |
||
6686 | }); |
||
6687 | }; |
||
6688 | Promise.race = function (values) { |
||
6689 | return new Promise(function (resolve, reject) { |
||
6690 | for (var i = 0, len = values.length; i < len; i++) { |
||
6691 | values[i].then(resolve, reject); |
||
6692 | } |
||
6693 | }); |
||
6694 | }; |
||
6695 | Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { |
||
6696 | setImmediate(fn); |
||
6697 | } : function (fn) { |
||
6698 | setTimeoutFunc(fn, 0); |
||
6699 | }; |
||
6700 | Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { |
||
6701 | if (typeof console !== 'undefined' && console) { |
||
6702 | console.warn('Possible Unhandled Promise Rejection:', err); |
||
6703 | } |
||
6704 | }; |
||
6705 | Promise._setImmediateFn = function _setImmediateFn(fn) { |
||
6706 | Promise._immediateFn = fn; |
||
6707 | }; |
||
6708 | Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { |
||
6709 | Promise._unhandledRejectionFn = fn; |
||
6710 | }; |
||
6711 | if (module.exports) { |
||
6712 | module.exports = Promise; |
||
6713 | } else if (!root.Promise) { |
||
6714 | root.Promise = Promise; |
||
6715 | } |
||
6716 | }(commonjsGlobal)); |
||
6717 | }(promise)); |
||
6718 | var promisePolyfill = promise.exports; |
||
6719 | var Global = function () { |
||
6720 | if (typeof window !== 'undefined') { |
||
6721 | return window; |
||
6722 | } else { |
||
6723 | return Function('return this;')(); |
||
597 | daniel-mar | 6724 | } |
679 | daniel-mar | 6725 | }(); |
6726 | var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill }; |
||
6727 | return promisePolyfill_1; |
||
6728 | })); |
||
6729 | }(undefined, exports$1, module)); |
||
6730 | var Promise$1 = module.exports.boltExport; |
||
597 | daniel-mar | 6731 | |
6732 | var blobToDataUri = function (blob) { |
||
679 | daniel-mar | 6733 | return new Promise$1(function (resolve) { |
597 | daniel-mar | 6734 | var reader = new FileReader(); |
6735 | reader.onloadend = function () { |
||
6736 | resolve(reader.result); |
||
6737 | }; |
||
6738 | reader.readAsDataURL(blob); |
||
6739 | }); |
||
6740 | }; |
||
637 | daniel-mar | 6741 | var blobToBase64$1 = function (blob) { |
597 | daniel-mar | 6742 | return blobToDataUri(blob).then(function (dataUri) { |
6743 | return dataUri.split(',')[1]; |
||
6744 | }); |
||
6745 | }; |
||
6746 | |||
637 | daniel-mar | 6747 | var blobToBase64 = function (blob) { |
6748 | return blobToBase64$1(blob); |
||
597 | daniel-mar | 6749 | }; |
6750 | |||
6751 | var addImage = function (editor, blob) { |
||
637 | daniel-mar | 6752 | blobToBase64(blob).then(function (base64) { |
597 | daniel-mar | 6753 | editor.undoManager.transact(function () { |
6754 | var cache = editor.editorUpload.blobCache; |
||
637 | daniel-mar | 6755 | var info = cache.create(generate$4('mceu'), blob, base64); |
597 | daniel-mar | 6756 | cache.add(info); |
6757 | var img = editor.dom.createHTML('img', { src: info.blobUri() }); |
||
6758 | editor.insertContent(img); |
||
6759 | }); |
||
6760 | }); |
||
6761 | }; |
||
6762 | var extractBlob = function (simulatedEvent) { |
||
6763 | var event = simulatedEvent.event.raw; |
||
6764 | var files = event.target.files || event.dataTransfer.files; |
||
6765 | return Optional.from(files[0]); |
||
6766 | }; |
||
637 | daniel-mar | 6767 | var sketch$5 = function (editor) { |
597 | daniel-mar | 6768 | var pickerDom = { |
6769 | tag: 'input', |
||
6770 | attributes: { |
||
6771 | accept: 'image/*', |
||
6772 | type: 'file', |
||
6773 | title: '' |
||
6774 | }, |
||
6775 | styles: { |
||
6776 | visibility: 'hidden', |
||
6777 | position: 'absolute' |
||
6778 | } |
||
6779 | }; |
||
6780 | var memPicker = record({ |
||
6781 | dom: pickerDom, |
||
637 | daniel-mar | 6782 | events: derive$3([ |
597 | daniel-mar | 6783 | cutter(click()), |
6784 | run(change(), function (picker, simulatedEvent) { |
||
6785 | extractBlob(simulatedEvent).each(function (blob) { |
||
6786 | addImage(editor, blob); |
||
6787 | }); |
||
6788 | }) |
||
6789 | ]) |
||
6790 | }); |
||
6791 | return Button.sketch({ |
||
6792 | dom: getToolbarIconButton('image', editor), |
||
6793 | components: [memPicker.asSpec()], |
||
6794 | action: function (button) { |
||
6795 | var picker = memPicker.get(button); |
||
6796 | picker.element.dom.click(); |
||
6797 | } |
||
6798 | }); |
||
6799 | }; |
||
6800 | |||
637 | daniel-mar | 6801 | var get$3 = function (element) { |
597 | daniel-mar | 6802 | return element.dom.textContent; |
6803 | }; |
||
637 | daniel-mar | 6804 | var set$3 = function (element, value) { |
597 | daniel-mar | 6805 | element.dom.textContent = value; |
6806 | }; |
||
6807 | |||
6808 | var isNotEmpty = function (val) { |
||
6809 | return val.length > 0; |
||
6810 | }; |
||
6811 | var defaultToEmpty = function (str) { |
||
6812 | return str === undefined || str === null ? '' : str; |
||
6813 | }; |
||
6814 | var noLink = function (editor) { |
||
6815 | var text = editor.selection.getContent({ format: 'text' }); |
||
6816 | return { |
||
6817 | url: '', |
||
6818 | text: text, |
||
6819 | title: '', |
||
6820 | target: '', |
||
6821 | link: Optional.none() |
||
6822 | }; |
||
6823 | }; |
||
6824 | var fromLink = function (link) { |
||
637 | daniel-mar | 6825 | var text = get$3(link); |
6826 | var url = get$b(link, 'href'); |
||
6827 | var title = get$b(link, 'title'); |
||
6828 | var target = get$b(link, 'target'); |
||
597 | daniel-mar | 6829 | return { |
6830 | url: defaultToEmpty(url), |
||
6831 | text: text !== url ? defaultToEmpty(text) : '', |
||
6832 | title: defaultToEmpty(title), |
||
6833 | target: defaultToEmpty(target), |
||
6834 | link: Optional.some(link) |
||
6835 | }; |
||
6836 | }; |
||
6837 | var getInfo = function (editor) { |
||
6838 | return query(editor).fold(function () { |
||
6839 | return noLink(editor); |
||
6840 | }, function (link) { |
||
6841 | return fromLink(link); |
||
6842 | }); |
||
6843 | }; |
||
6844 | var wasSimple = function (link) { |
||
637 | daniel-mar | 6845 | var prevHref = get$b(link, 'href'); |
6846 | var prevText = get$3(link); |
||
597 | daniel-mar | 6847 | return prevHref === prevText; |
6848 | }; |
||
6849 | var getTextToApply = function (link, url, info) { |
||
6850 | return info.text.toOptional().filter(isNotEmpty).fold(function () { |
||
6851 | return wasSimple(link) ? Optional.some(url) : Optional.none(); |
||
6852 | }, Optional.some); |
||
6853 | }; |
||
6854 | var unlinkIfRequired = function (editor, info) { |
||
6855 | var activeLink = info.link.bind(identity); |
||
6856 | activeLink.each(function (_link) { |
||
6857 | editor.execCommand('unlink'); |
||
6858 | }); |
||
6859 | }; |
||
637 | daniel-mar | 6860 | var getAttrs = function (url, info) { |
597 | daniel-mar | 6861 | var attrs = {}; |
6862 | attrs.href = url; |
||
6863 | info.title.toOptional().filter(isNotEmpty).each(function (title) { |
||
6864 | attrs.title = title; |
||
6865 | }); |
||
6866 | info.target.toOptional().filter(isNotEmpty).each(function (target) { |
||
6867 | attrs.target = target; |
||
6868 | }); |
||
6869 | return attrs; |
||
6870 | }; |
||
6871 | var applyInfo = function (editor, info) { |
||
6872 | info.url.toOptional().filter(isNotEmpty).fold(function () { |
||
6873 | unlinkIfRequired(editor, info); |
||
6874 | }, function (url) { |
||
637 | daniel-mar | 6875 | var attrs = getAttrs(url, info); |
597 | daniel-mar | 6876 | var activeLink = info.link.bind(identity); |
6877 | activeLink.fold(function () { |
||
6878 | var text = info.text.toOptional().filter(isNotEmpty).getOr(url); |
||
6879 | editor.insertContent(editor.dom.createHTML('a', attrs, editor.dom.encode(text))); |
||
6880 | }, function (link) { |
||
6881 | var text = getTextToApply(link, url, info); |
||
637 | daniel-mar | 6882 | setAll$1(link, attrs); |
597 | daniel-mar | 6883 | text.each(function (newText) { |
637 | daniel-mar | 6884 | set$3(link, newText); |
597 | daniel-mar | 6885 | }); |
6886 | }); |
||
6887 | }); |
||
6888 | }; |
||
6889 | var query = function (editor) { |
||
6890 | var start = SugarElement.fromDom(editor.selection.getStart()); |
||
637 | daniel-mar | 6891 | return closest$1(start, 'a'); |
597 | daniel-mar | 6892 | }; |
6893 | |||
637 | daniel-mar | 6894 | var platform = detect$1(); |
6895 | var preserve$1 = function (f, editor) { |
||
597 | daniel-mar | 6896 | var rng = editor.selection.getRng(); |
6897 | f(); |
||
6898 | editor.selection.setRng(rng); |
||
6899 | }; |
||
6900 | var forAndroid = function (editor, f) { |
||
637 | daniel-mar | 6901 | var wrapper = platform.os.isAndroid() ? preserve$1 : apply$1; |
597 | daniel-mar | 6902 | wrapper(f, editor); |
6903 | }; |
||
6904 | |||
637 | daniel-mar | 6905 | var events$4 = function (name, eventHandlers) { |
6906 | var events = derive$3(eventHandlers); |
||
6907 | return create$5({ |
||
6908 | fields: [required$1('enabled')], |
||
597 | daniel-mar | 6909 | name: name, |
637 | daniel-mar | 6910 | active: { events: constant$1(events) } |
597 | daniel-mar | 6911 | }); |
6912 | }; |
||
6913 | var config = function (name, eventHandlers) { |
||
637 | daniel-mar | 6914 | var me = events$4(name, eventHandlers); |
597 | daniel-mar | 6915 | return { |
6916 | key: name, |
||
6917 | value: { |
||
6918 | config: {}, |
||
6919 | me: me, |
||
637 | daniel-mar | 6920 | configAsRaw: constant$1({}), |
597 | daniel-mar | 6921 | initialConfig: {}, |
6922 | state: NoState |
||
6923 | } |
||
6924 | }; |
||
6925 | }; |
||
6926 | |||
6927 | var getCurrent = function (component, composeConfig, _composeState) { |
||
6928 | return composeConfig.find(component); |
||
6929 | }; |
||
6930 | |||
6931 | var ComposeApis = /*#__PURE__*/Object.freeze({ |
||
6932 | __proto__: null, |
||
6933 | getCurrent: getCurrent |
||
6934 | }); |
||
6935 | |||
637 | daniel-mar | 6936 | var ComposeSchema = [required$1('find')]; |
597 | daniel-mar | 6937 | |
637 | daniel-mar | 6938 | var Composing = create$5({ |
597 | daniel-mar | 6939 | fields: ComposeSchema, |
6940 | name: 'composing', |
||
6941 | apis: ComposeApis |
||
6942 | }); |
||
6943 | |||
637 | daniel-mar | 6944 | var factory$4 = function (detail) { |
597 | daniel-mar | 6945 | var _a = detail.dom, attributes = _a.attributes, domWithoutAttributes = __rest(_a, ['attributes']); |
6946 | return { |
||
6947 | uid: detail.uid, |
||
6948 | dom: __assign({ |
||
6949 | tag: 'div', |
||
6950 | attributes: __assign({ role: 'presentation' }, attributes) |
||
6951 | }, domWithoutAttributes), |
||
6952 | components: detail.components, |
||
637 | daniel-mar | 6953 | behaviours: get$6(detail.containerBehaviours), |
597 | daniel-mar | 6954 | events: detail.events, |
6955 | domModification: detail.domModification, |
||
6956 | eventOrder: detail.eventOrder |
||
6957 | }; |
||
6958 | }; |
||
637 | daniel-mar | 6959 | var Container = single({ |
597 | daniel-mar | 6960 | name: 'Container', |
637 | daniel-mar | 6961 | factory: factory$4, |
597 | daniel-mar | 6962 | configFields: [ |
637 | daniel-mar | 6963 | defaulted('components', []), |
597 | daniel-mar | 6964 | field$1('containerBehaviours', []), |
637 | daniel-mar | 6965 | defaulted('events', {}), |
6966 | defaulted('domModification', {}), |
||
6967 | defaulted('eventOrder', {}) |
||
597 | daniel-mar | 6968 | ] |
6969 | }); |
||
6970 | |||
637 | daniel-mar | 6971 | var factory$3 = function (detail) { |
597 | daniel-mar | 6972 | return { |
6973 | uid: detail.uid, |
||
6974 | dom: detail.dom, |
||
6975 | behaviours: SketchBehaviours.augment(detail.dataBehaviours, [ |
||
6976 | Representing.config({ |
||
6977 | store: { |
||
6978 | mode: 'memory', |
||
6979 | initialValue: detail.getInitialValue() |
||
6980 | } |
||
6981 | }), |
||
6982 | Composing.config({ find: Optional.some }) |
||
6983 | ]), |
||
637 | daniel-mar | 6984 | events: derive$3([runOnAttached(function (component, _simulatedEvent) { |
597 | daniel-mar | 6985 | Representing.setValue(component, detail.getInitialValue()); |
6986 | })]) |
||
6987 | }; |
||
6988 | }; |
||
637 | daniel-mar | 6989 | var DataField = single({ |
597 | daniel-mar | 6990 | name: 'DataField', |
637 | daniel-mar | 6991 | factory: factory$3, |
597 | daniel-mar | 6992 | configFields: [ |
637 | daniel-mar | 6993 | required$1('uid'), |
6994 | required$1('dom'), |
||
6995 | required$1('getInitialValue'), |
||
597 | daniel-mar | 6996 | SketchBehaviours.field('dataBehaviours', [ |
6997 | Representing, |
||
6998 | Composing |
||
6999 | ]) |
||
7000 | ] |
||
7001 | }); |
||
7002 | |||
637 | daniel-mar | 7003 | var get$2 = function (element) { |
597 | daniel-mar | 7004 | return element.dom.value; |
7005 | }; |
||
637 | daniel-mar | 7006 | var set$2 = function (element, value) { |
597 | daniel-mar | 7007 | if (value === undefined) { |
7008 | throw new Error('Value.set was undefined'); |
||
7009 | } |
||
7010 | element.dom.value = value; |
||
7011 | }; |
||
7012 | |||
637 | daniel-mar | 7013 | var schema$8 = constant$1([ |
597 | daniel-mar | 7014 | option('data'), |
637 | daniel-mar | 7015 | defaulted('inputAttributes', {}), |
7016 | defaulted('inputStyles', {}), |
||
7017 | defaulted('tag', 'input'), |
||
7018 | defaulted('inputClasses', []), |
||
597 | daniel-mar | 7019 | onHandler('onSetValue'), |
637 | daniel-mar | 7020 | defaulted('styles', {}), |
7021 | defaulted('eventOrder', {}), |
||
597 | daniel-mar | 7022 | field$1('inputBehaviours', [ |
7023 | Representing, |
||
7024 | Focusing |
||
7025 | ]), |
||
637 | daniel-mar | 7026 | defaulted('selectOnFocus', true) |
597 | daniel-mar | 7027 | ]); |
7028 | var focusBehaviours = function (detail) { |
||
637 | daniel-mar | 7029 | return derive$2([Focusing.config({ |
597 | daniel-mar | 7030 | onFocus: !detail.selectOnFocus ? noop : function (component) { |
7031 | var input = component.element; |
||
637 | daniel-mar | 7032 | var value = get$2(input); |
597 | daniel-mar | 7033 | input.dom.setSelectionRange(0, value.length); |
7034 | } |
||
7035 | })]); |
||
7036 | }; |
||
7037 | var behaviours = function (detail) { |
||
7038 | return __assign(__assign({}, focusBehaviours(detail)), augment(detail.inputBehaviours, [Representing.config({ |
||
7039 | store: __assign(__assign({ mode: 'manual' }, detail.data.map(function (data) { |
||
7040 | return { initialValue: data }; |
||
7041 | }).getOr({})), { |
||
7042 | getValue: function (input) { |
||
637 | daniel-mar | 7043 | return get$2(input.element); |
597 | daniel-mar | 7044 | }, |
7045 | setValue: function (input, data) { |
||
637 | daniel-mar | 7046 | var current = get$2(input.element); |
597 | daniel-mar | 7047 | if (current !== data) { |
637 | daniel-mar | 7048 | set$2(input.element, data); |
597 | daniel-mar | 7049 | } |
7050 | } |
||
7051 | }), |
||
7052 | onSetValue: detail.onSetValue |
||
7053 | })])); |
||
7054 | }; |
||
637 | daniel-mar | 7055 | var dom = function (detail) { |
597 | daniel-mar | 7056 | return { |
7057 | tag: detail.tag, |
||
7058 | attributes: __assign({ type: 'text' }, detail.inputAttributes), |
||
7059 | styles: detail.inputStyles, |
||
7060 | classes: detail.inputClasses |
||
7061 | }; |
||
7062 | }; |
||
7063 | |||
637 | daniel-mar | 7064 | var factory$2 = function (detail, _spec) { |
597 | daniel-mar | 7065 | return { |
7066 | uid: detail.uid, |
||
637 | daniel-mar | 7067 | dom: dom(detail), |
597 | daniel-mar | 7068 | components: [], |
7069 | behaviours: behaviours(detail), |
||
7070 | eventOrder: detail.eventOrder |
||
7071 | }; |
||
7072 | }; |
||
637 | daniel-mar | 7073 | var Input = single({ |
597 | daniel-mar | 7074 | name: 'Input', |
7075 | configFields: schema$8(), |
||
637 | daniel-mar | 7076 | factory: factory$2 |
597 | daniel-mar | 7077 | }); |
7078 | |||
637 | daniel-mar | 7079 | var exhibit$2 = function (base, tabConfig) { |
7080 | return nu$3({ |
||
7081 | attributes: wrapAll([{ |
||
597 | daniel-mar | 7082 | key: tabConfig.tabAttr, |
7083 | value: 'true' |
||
7084 | }]) |
||
7085 | }); |
||
7086 | }; |
||
7087 | |||
7088 | var ActiveTabstopping = /*#__PURE__*/Object.freeze({ |
||
7089 | __proto__: null, |
||
637 | daniel-mar | 7090 | exhibit: exhibit$2 |
597 | daniel-mar | 7091 | }); |
7092 | |||
637 | daniel-mar | 7093 | var TabstopSchema = [defaulted('tabAttr', 'data-alloy-tabstop')]; |
597 | daniel-mar | 7094 | |
637 | daniel-mar | 7095 | var Tabstopping = create$5({ |
597 | daniel-mar | 7096 | fields: TabstopSchema, |
7097 | name: 'tabstopping', |
||
7098 | active: ActiveTabstopping |
||
7099 | }); |
||
7100 | |||
7101 | var global$3 = tinymce.util.Tools.resolve('tinymce.util.I18n'); |
||
7102 | |||
7103 | var clearInputBehaviour = 'input-clearing'; |
||
637 | daniel-mar | 7104 | var field = function (name, placeholder) { |
597 | daniel-mar | 7105 | var inputSpec = record(Input.sketch({ |
7106 | inputAttributes: { placeholder: global$3.translate(placeholder) }, |
||
637 | daniel-mar | 7107 | onSetValue: function (input, _data) { |
7108 | emit(input, input$1()); |
||
597 | daniel-mar | 7109 | }, |
637 | daniel-mar | 7110 | inputBehaviours: derive$2([ |
597 | daniel-mar | 7111 | Composing.config({ find: Optional.some }), |
7112 | Tabstopping.config({}), |
||
7113 | Keying.config({ mode: 'execution' }) |
||
7114 | ]), |
||
7115 | selectOnFocus: false |
||
7116 | })); |
||
7117 | var buttonSpec = record(Button.sketch({ |
||
7118 | dom: dom$1('<button class="${prefix}-input-container-x ${prefix}-icon-cancel-circle ${prefix}-icon"></button>'), |
||
7119 | action: function (button) { |
||
7120 | var input = inputSpec.get(button); |
||
7121 | Representing.setValue(input, ''); |
||
7122 | } |
||
7123 | })); |
||
7124 | return { |
||
7125 | name: name, |
||
7126 | spec: Container.sketch({ |
||
7127 | dom: dom$1('<div class="${prefix}-input-container"></div>'), |
||
7128 | components: [ |
||
7129 | inputSpec.asSpec(), |
||
7130 | buttonSpec.asSpec() |
||
7131 | ], |
||
637 | daniel-mar | 7132 | containerBehaviours: derive$2([ |
597 | daniel-mar | 7133 | Toggling.config({ toggleClass: resolve('input-container-empty') }), |
7134 | Composing.config({ |
||
7135 | find: function (comp) { |
||
7136 | return Optional.some(inputSpec.get(comp)); |
||
7137 | } |
||
7138 | }), |
||
637 | daniel-mar | 7139 | config(clearInputBehaviour, [run(input$1(), function (iContainer) { |
597 | daniel-mar | 7140 | var input = inputSpec.get(iContainer); |
7141 | var val = Representing.getValue(input); |
||
7142 | var f = val.length > 0 ? Toggling.off : Toggling.on; |
||
7143 | f(iContainer); |
||
7144 | })]) |
||
7145 | ]) |
||
7146 | }) |
||
7147 | }; |
||
7148 | }; |
||
7149 | var hidden = function (name) { |
||
7150 | return { |
||
7151 | name: name, |
||
7152 | spec: DataField.sketch({ |
||
7153 | dom: { |
||
7154 | tag: 'span', |
||
7155 | styles: { display: 'none' } |
||
7156 | }, |
||
7157 | getInitialValue: function () { |
||
7158 | return Optional.none(); |
||
7159 | } |
||
7160 | }) |
||
7161 | }; |
||
7162 | }; |
||
7163 | |||
7164 | var nativeDisabled = [ |
||
7165 | 'input', |
||
7166 | 'button', |
||
7167 | 'textarea', |
||
7168 | 'select' |
||
7169 | ]; |
||
637 | daniel-mar | 7170 | var onLoad = function (component, disableConfig, disableState) { |
597 | daniel-mar | 7171 | var f = disableConfig.disabled() ? disable : enable; |
7172 | f(component, disableConfig); |
||
7173 | }; |
||
7174 | var hasNative = function (component, config) { |
||
637 | daniel-mar | 7175 | return config.useNative === true && contains$1(nativeDisabled, name$1(component.element)); |
597 | daniel-mar | 7176 | }; |
7177 | var nativeIsDisabled = function (component) { |
||
7178 | return has$1(component.element, 'disabled'); |
||
7179 | }; |
||
7180 | var nativeDisable = function (component) { |
||
637 | daniel-mar | 7181 | set$8(component.element, 'disabled', 'disabled'); |
597 | daniel-mar | 7182 | }; |
7183 | var nativeEnable = function (component) { |
||
637 | daniel-mar | 7184 | remove$6(component.element, 'disabled'); |
597 | daniel-mar | 7185 | }; |
7186 | var ariaIsDisabled = function (component) { |
||
637 | daniel-mar | 7187 | return get$b(component.element, 'aria-disabled') === 'true'; |
597 | daniel-mar | 7188 | }; |
7189 | var ariaDisable = function (component) { |
||
637 | daniel-mar | 7190 | set$8(component.element, 'aria-disabled', 'true'); |
597 | daniel-mar | 7191 | }; |
7192 | var ariaEnable = function (component) { |
||
637 | daniel-mar | 7193 | set$8(component.element, 'aria-disabled', 'false'); |
597 | daniel-mar | 7194 | }; |
7195 | var disable = function (component, disableConfig, _disableState) { |
||
7196 | disableConfig.disableClass.each(function (disableClass) { |
||
637 | daniel-mar | 7197 | add$1(component.element, disableClass); |
597 | daniel-mar | 7198 | }); |
7199 | var f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable; |
||
7200 | f(component); |
||
7201 | disableConfig.onDisabled(component); |
||
7202 | }; |
||
7203 | var enable = function (component, disableConfig, _disableState) { |
||
7204 | disableConfig.disableClass.each(function (disableClass) { |
||
637 | daniel-mar | 7205 | remove$3(component.element, disableClass); |
597 | daniel-mar | 7206 | }); |
7207 | var f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable; |
||
7208 | f(component); |
||
7209 | disableConfig.onEnabled(component); |
||
7210 | }; |
||
7211 | var isDisabled = function (component, disableConfig) { |
||
7212 | return hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component); |
||
7213 | }; |
||
637 | daniel-mar | 7214 | var set$1 = function (component, disableConfig, disableState, disabled) { |
597 | daniel-mar | 7215 | var f = disabled ? disable : enable; |
7216 | f(component, disableConfig); |
||
7217 | }; |
||
7218 | |||
7219 | var DisableApis = /*#__PURE__*/Object.freeze({ |
||
7220 | __proto__: null, |
||
7221 | enable: enable, |
||
7222 | disable: disable, |
||
7223 | isDisabled: isDisabled, |
||
637 | daniel-mar | 7224 | onLoad: onLoad, |
7225 | set: set$1 |
||
597 | daniel-mar | 7226 | }); |
7227 | |||
637 | daniel-mar | 7228 | var exhibit$1 = function (base, disableConfig) { |
7229 | return nu$3({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] }); |
||
597 | daniel-mar | 7230 | }; |
637 | daniel-mar | 7231 | var events$3 = function (disableConfig, disableState) { |
7232 | return derive$3([ |
||
7233 | abort(execute$5(), function (component, _simulatedEvent) { |
||
597 | daniel-mar | 7234 | return isDisabled(component, disableConfig); |
7235 | }), |
||
637 | daniel-mar | 7236 | loadEvent(disableConfig, disableState, onLoad) |
597 | daniel-mar | 7237 | ]); |
7238 | }; |
||
7239 | |||
7240 | var ActiveDisable = /*#__PURE__*/Object.freeze({ |
||
7241 | __proto__: null, |
||
637 | daniel-mar | 7242 | exhibit: exhibit$1, |
7243 | events: events$3 |
||
597 | daniel-mar | 7244 | }); |
7245 | |||
7246 | var DisableSchema = [ |
||
7247 | defaultedFunction('disabled', never), |
||
637 | daniel-mar | 7248 | defaulted('useNative', true), |
597 | daniel-mar | 7249 | option('disableClass'), |
7250 | onHandler('onDisabled'), |
||
7251 | onHandler('onEnabled') |
||
7252 | ]; |
||
7253 | |||
637 | daniel-mar | 7254 | var Disabling = create$5({ |
597 | daniel-mar | 7255 | fields: DisableSchema, |
7256 | name: 'disabling', |
||
7257 | active: ActiveDisable, |
||
7258 | apis: DisableApis |
||
7259 | }); |
||
7260 | |||
7261 | var owner$1 = 'form'; |
||
637 | daniel-mar | 7262 | var schema$7 = [field$1('formBehaviours', [Representing])]; |
597 | daniel-mar | 7263 | var getPartName = function (name) { |
7264 | return '<alloy.field.' + name + '>'; |
||
7265 | }; |
||
637 | daniel-mar | 7266 | var sketch$4 = function (fSpec) { |
597 | daniel-mar | 7267 | var parts = function () { |
7268 | var record = []; |
||
7269 | var field = function (name, config) { |
||
7270 | record.push(name); |
||
7271 | return generateOne(owner$1, getPartName(name), config); |
||
7272 | }; |
||
7273 | return { |
||
7274 | field: field, |
||
637 | daniel-mar | 7275 | record: constant$1(record) |
597 | daniel-mar | 7276 | }; |
7277 | }(); |
||
7278 | var spec = fSpec(parts); |
||
7279 | var partNames = parts.record(); |
||
637 | daniel-mar | 7280 | var fieldParts = map$2(partNames, function (n) { |
597 | daniel-mar | 7281 | return required({ |
7282 | name: n, |
||
7283 | pname: getPartName(n) |
||
7284 | }); |
||
7285 | }); |
||
637 | daniel-mar | 7286 | return composite$1(owner$1, schema$7, fieldParts, make$4, spec); |
597 | daniel-mar | 7287 | }; |
637 | daniel-mar | 7288 | var toResult = function (o, e) { |
597 | daniel-mar | 7289 | return o.fold(function () { |
7290 | return Result.error(e); |
||
7291 | }, Result.value); |
||
7292 | }; |
||
637 | daniel-mar | 7293 | var make$4 = function (detail, components) { |
597 | daniel-mar | 7294 | return { |
7295 | uid: detail.uid, |
||
7296 | dom: detail.dom, |
||
7297 | components: components, |
||
7298 | behaviours: augment(detail.formBehaviours, [Representing.config({ |
||
7299 | store: { |
||
7300 | mode: 'manual', |
||
7301 | getValue: function (form) { |
||
7302 | var resPs = getAllParts(form, detail); |
||
7303 | return map$1(resPs, function (resPThunk, pName) { |
||
7304 | return resPThunk().bind(function (v) { |
||
7305 | var opt = Composing.getCurrent(v); |
||
637 | daniel-mar | 7306 | return toResult(opt, new Error('Cannot find a current component to extract the value from for form part \'' + pName + '\': ' + element(v.element))); |
597 | daniel-mar | 7307 | }).map(Representing.getValue); |
7308 | }); |
||
7309 | }, |
||
7310 | setValue: function (form, values) { |
||
637 | daniel-mar | 7311 | each(values, function (newValue, key) { |
597 | daniel-mar | 7312 | getPart(form, detail, key).each(function (wrapper) { |
7313 | Composing.getCurrent(wrapper).each(function (field) { |
||
7314 | Representing.setValue(field, newValue); |
||
7315 | }); |
||
7316 | }); |
||
7317 | }); |
||
7318 | } |
||
7319 | } |
||
7320 | })]), |
||
7321 | apis: { |
||
7322 | getField: function (form, key) { |
||
7323 | return getPart(form, detail, key).bind(Composing.getCurrent); |
||
7324 | } |
||
7325 | } |
||
7326 | }; |
||
7327 | }; |
||
7328 | var Form = { |
||
7329 | getField: makeApi(function (apis, component, key) { |
||
7330 | return apis.getField(component, key); |
||
7331 | }), |
||
637 | daniel-mar | 7332 | sketch: sketch$4 |
597 | daniel-mar | 7333 | }; |
7334 | |||
7335 | var SWIPING_LEFT = 1; |
||
7336 | var SWIPING_RIGHT = -1; |
||
7337 | var SWIPING_NONE = 0; |
||
637 | daniel-mar | 7338 | var init$3 = function (xValue) { |
597 | daniel-mar | 7339 | return { |
7340 | xValue: xValue, |
||
7341 | points: [] |
||
7342 | }; |
||
7343 | }; |
||
637 | daniel-mar | 7344 | var move = function (model, xValue) { |
597 | daniel-mar | 7345 | if (xValue === model.xValue) { |
7346 | return model; |
||
7347 | } |
||
7348 | var currentDirection = xValue - model.xValue > 0 ? SWIPING_LEFT : SWIPING_RIGHT; |
||
7349 | var newPoint = { |
||
7350 | direction: currentDirection, |
||
7351 | xValue: xValue |
||
7352 | }; |
||
7353 | var priorPoints = function () { |
||
7354 | if (model.points.length === 0) { |
||
7355 | return []; |
||
7356 | } else { |
||
7357 | var prev = model.points[model.points.length - 1]; |
||
7358 | return prev.direction === currentDirection ? model.points.slice(0, model.points.length - 1) : model.points; |
||
7359 | } |
||
7360 | }(); |
||
7361 | return { |
||
7362 | xValue: xValue, |
||
7363 | points: priorPoints.concat([newPoint]) |
||
7364 | }; |
||
7365 | }; |
||
7366 | var complete = function (model) { |
||
7367 | if (model.points.length === 0) { |
||
7368 | return SWIPING_NONE; |
||
7369 | } else { |
||
7370 | var firstDirection = model.points[0].direction; |
||
7371 | var lastDirection = model.points[model.points.length - 1].direction; |
||
7372 | return firstDirection === SWIPING_RIGHT && lastDirection === SWIPING_RIGHT ? SWIPING_RIGHT : firstDirection === SWIPING_LEFT && lastDirection === SWIPING_LEFT ? SWIPING_LEFT : SWIPING_NONE; |
||
7373 | } |
||
7374 | }; |
||
7375 | |||
637 | daniel-mar | 7376 | var sketch$3 = function (rawSpec) { |
597 | daniel-mar | 7377 | var navigateEvent = 'navigateEvent'; |
7378 | var wrapperAdhocEvents = 'serializer-wrapper-events'; |
||
7379 | var formAdhocEvents = 'form-events'; |
||
7380 | var schema = objOf([ |
||
637 | daniel-mar | 7381 | required$1('fields'), |
7382 | defaulted('maxFieldIndex', rawSpec.fields.length - 1), |
||
7383 | required$1('onExecute'), |
||
7384 | required$1('getInitialValue'), |
||
7385 | customField('state', function () { |
||
597 | daniel-mar | 7386 | return { |
637 | daniel-mar | 7387 | dialogSwipeState: value(), |
597 | daniel-mar | 7388 | currentScreen: Cell(0) |
7389 | }; |
||
7390 | }) |
||
7391 | ]); |
||
637 | daniel-mar | 7392 | var spec$1 = asRawOrDie$1('SerialisedDialog', schema, rawSpec); |
597 | daniel-mar | 7393 | var navigationButton = function (direction, directionName, enabled) { |
7394 | return Button.sketch({ |
||
7395 | dom: dom$1('<span class="${prefix}-icon-' + directionName + ' ${prefix}-icon"></span>'), |
||
7396 | action: function (button) { |
||
7397 | emitWith(button, navigateEvent, { direction: direction }); |
||
7398 | }, |
||
637 | daniel-mar | 7399 | buttonBehaviours: derive$2([Disabling.config({ |
597 | daniel-mar | 7400 | disableClass: resolve('toolbar-navigation-disabled'), |
7401 | disabled: function () { |
||
7402 | return !enabled; |
||
7403 | } |
||
7404 | })]) |
||
7405 | }); |
||
7406 | }; |
||
7407 | var reposition = function (dialog, message) { |
||
637 | daniel-mar | 7408 | descendant(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) { |
7409 | set$5(parent, 'left', -spec$1.state.currentScreen.get() * message.width + 'px'); |
||
597 | daniel-mar | 7410 | }); |
7411 | }; |
||
7412 | var navigate = function (dialog, direction) { |
||
7413 | var screens = descendants(dialog.element, '.' + resolve('serialised-dialog-screen')); |
||
637 | daniel-mar | 7414 | descendant(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) { |
597 | daniel-mar | 7415 | if (spec$1.state.currentScreen.get() + direction >= 0 && spec$1.state.currentScreen.get() + direction < screens.length) { |
7416 | getRaw(parent, 'left').each(function (left) { |
||
7417 | var currentLeft = parseInt(left, 10); |
||
637 | daniel-mar | 7418 | var w = get$5(screens[0]); |
7419 | set$5(parent, 'left', currentLeft - direction * w + 'px'); |
||
597 | daniel-mar | 7420 | }); |
7421 | spec$1.state.currentScreen.set(spec$1.state.currentScreen.get() + direction); |
||
7422 | } |
||
7423 | }); |
||
7424 | }; |
||
7425 | var focusInput = function (dialog) { |
||
7426 | var inputs = descendants(dialog.element, 'input'); |
||
7427 | var optInput = Optional.from(inputs[spec$1.state.currentScreen.get()]); |
||
7428 | optInput.each(function (input) { |
||
7429 | dialog.getSystem().getByDom(input).each(function (inputComp) { |
||
7430 | dispatchFocus(dialog, inputComp.element); |
||
7431 | }); |
||
7432 | }); |
||
7433 | var dotitems = memDots.get(dialog); |
||
7434 | Highlighting.highlightAt(dotitems, spec$1.state.currentScreen.get()); |
||
7435 | }; |
||
7436 | var resetState = function () { |
||
7437 | spec$1.state.currentScreen.set(0); |
||
7438 | spec$1.state.dialogSwipeState.clear(); |
||
7439 | }; |
||
7440 | var memForm = record(Form.sketch(function (parts) { |
||
7441 | return { |
||
7442 | dom: dom$1('<div class="${prefix}-serialised-dialog"></div>'), |
||
7443 | components: [Container.sketch({ |
||
7444 | dom: dom$1('<div class="${prefix}-serialised-dialog-chain" style="left: 0px; position: absolute;"></div>'), |
||
637 | daniel-mar | 7445 | components: map$2(spec$1.fields, function (field, i) { |
597 | daniel-mar | 7446 | return i <= spec$1.maxFieldIndex ? Container.sketch({ |
7447 | dom: dom$1('<div class="${prefix}-serialised-dialog-screen"></div>'), |
||
7448 | components: [ |
||
7449 | navigationButton(-1, 'previous', i > 0), |
||
7450 | parts.field(field.name, field.spec), |
||
7451 | navigationButton(+1, 'next', i < spec$1.maxFieldIndex) |
||
7452 | ] |
||
7453 | }) : parts.field(field.name, field.spec); |
||
7454 | }) |
||
7455 | })], |
||
637 | daniel-mar | 7456 | formBehaviours: derive$2([ |
597 | daniel-mar | 7457 | orientation(function (dialog, message) { |
7458 | reposition(dialog, message); |
||
7459 | }), |
||
7460 | Keying.config({ |
||
7461 | mode: 'special', |
||
7462 | focusIn: function (dialog, _specialInfo) { |
||
7463 | focusInput(dialog); |
||
7464 | }, |
||
7465 | onTab: function (dialog, _specialInfo) { |
||
7466 | navigate(dialog, +1); |
||
7467 | return Optional.some(true); |
||
7468 | }, |
||
7469 | onShiftTab: function (dialog, _specialInfo) { |
||
7470 | navigate(dialog, -1); |
||
7471 | return Optional.some(true); |
||
7472 | } |
||
7473 | }), |
||
7474 | config(formAdhocEvents, [ |
||
7475 | runOnAttached(function (dialog, _simulatedEvent) { |
||
7476 | resetState(); |
||
7477 | var dotitems = memDots.get(dialog); |
||
7478 | Highlighting.highlightFirst(dotitems); |
||
7479 | spec$1.getInitialValue(dialog).each(function (v) { |
||
7480 | Representing.setValue(dialog, v); |
||
7481 | }); |
||
7482 | }), |
||
7483 | runOnExecute(spec$1.onExecute), |
||
7484 | run(transitionend(), function (dialog, simulatedEvent) { |
||
7485 | var event = simulatedEvent.event; |
||
7486 | if (event.raw.propertyName === 'left') { |
||
7487 | focusInput(dialog); |
||
7488 | } |
||
7489 | }), |
||
7490 | run(navigateEvent, function (dialog, simulatedEvent) { |
||
7491 | var event = simulatedEvent.event; |
||
7492 | var direction = event.direction; |
||
7493 | navigate(dialog, direction); |
||
7494 | }) |
||
7495 | ]) |
||
7496 | ]) |
||
7497 | }; |
||
7498 | })); |
||
7499 | var memDots = record({ |
||
7500 | dom: dom$1('<div class="${prefix}-dot-container"></div>'), |
||
637 | daniel-mar | 7501 | behaviours: derive$2([Highlighting.config({ |
597 | daniel-mar | 7502 | highlightClass: resolve('dot-active'), |
7503 | itemClass: resolve('dot-item') |
||
7504 | })]), |
||
637 | daniel-mar | 7505 | components: bind$3(spec$1.fields, function (_f, i) { |
597 | daniel-mar | 7506 | return i <= spec$1.maxFieldIndex ? [spec('<div class="${prefix}-dot-item ${prefix}-icon-full-dot ${prefix}-icon"></div>')] : []; |
7507 | }) |
||
7508 | }); |
||
7509 | return { |
||
7510 | dom: dom$1('<div class="${prefix}-serializer-wrapper"></div>'), |
||
7511 | components: [ |
||
7512 | memForm.asSpec(), |
||
7513 | memDots.asSpec() |
||
7514 | ], |
||
637 | daniel-mar | 7515 | behaviours: derive$2([ |
597 | daniel-mar | 7516 | Keying.config({ |
7517 | mode: 'special', |
||
7518 | focusIn: function (wrapper) { |
||
7519 | var form = memForm.get(wrapper); |
||
7520 | Keying.focusIn(form); |
||
7521 | } |
||
7522 | }), |
||
7523 | config(wrapperAdhocEvents, [ |
||
7524 | run(touchstart(), function (_wrapper, simulatedEvent) { |
||
7525 | var event = simulatedEvent.event; |
||
637 | daniel-mar | 7526 | spec$1.state.dialogSwipeState.set(init$3(event.raw.touches[0].clientX)); |
597 | daniel-mar | 7527 | }), |
7528 | run(touchmove(), function (_wrapper, simulatedEvent) { |
||
7529 | var event = simulatedEvent.event; |
||
7530 | spec$1.state.dialogSwipeState.on(function (state) { |
||
7531 | simulatedEvent.event.prevent(); |
||
637 | daniel-mar | 7532 | spec$1.state.dialogSwipeState.set(move(state, event.raw.touches[0].clientX)); |
597 | daniel-mar | 7533 | }); |
7534 | }), |
||
7535 | run(touchend(), function (wrapper, _simulatedEvent) { |
||
7536 | spec$1.state.dialogSwipeState.on(function (state) { |
||
7537 | var dialog = memForm.get(wrapper); |
||
7538 | var direction = -1 * complete(state); |
||
7539 | navigate(dialog, direction); |
||
7540 | }); |
||
7541 | }) |
||
7542 | ]) |
||
7543 | ]) |
||
7544 | }; |
||
7545 | }; |
||
7546 | |||
7547 | var getGroups = cached(function (realm, editor) { |
||
7548 | return [{ |
||
7549 | label: 'the link group', |
||
637 | daniel-mar | 7550 | items: [sketch$3({ |
597 | daniel-mar | 7551 | fields: [ |
637 | daniel-mar | 7552 | field('url', 'Type or paste URL'), |
7553 | field('text', 'Link text'), |
||
7554 | field('title', 'Link title'), |
||
7555 | field('target', 'Link target'), |
||
597 | daniel-mar | 7556 | hidden('link') |
7557 | ], |
||
7558 | maxFieldIndex: [ |
||
7559 | 'url', |
||
7560 | 'text', |
||
7561 | 'title', |
||
7562 | 'target' |
||
7563 | ].length - 1, |
||
7564 | getInitialValue: function () { |
||
7565 | return Optional.some(getInfo(editor)); |
||
7566 | }, |
||
7567 | onExecute: function (dialog, _simulatedEvent) { |
||
7568 | var info = Representing.getValue(dialog); |
||
7569 | applyInfo(editor, info); |
||
7570 | realm.restoreToolbar(); |
||
7571 | editor.focus(); |
||
7572 | } |
||
7573 | })] |
||
7574 | }]; |
||
7575 | }); |
||
637 | daniel-mar | 7576 | var sketch$2 = function (realm, editor) { |
597 | daniel-mar | 7577 | return forToolbarStateAction(editor, 'link', 'link', function () { |
7578 | var groups = getGroups(realm, editor); |
||
7579 | realm.setContextToolbar(groups); |
||
7580 | forAndroid(editor, function () { |
||
7581 | realm.focusToolbar(); |
||
7582 | }); |
||
7583 | query(editor).each(function (link) { |
||
7584 | editor.selection.select(link.dom); |
||
7585 | }); |
||
7586 | }); |
||
7587 | }; |
||
7588 | |||
7589 | var isRecursive = function (component, originator, target) { |
||
7590 | return eq(originator, component.element) && !eq(originator, target); |
||
7591 | }; |
||
637 | daniel-mar | 7592 | var events$2 = derive$3([can(focus$4(), function (component, simulatedEvent) { |
597 | daniel-mar | 7593 | var event = simulatedEvent.event; |
7594 | var originator = event.originator; |
||
7595 | var target = event.target; |
||
7596 | if (isRecursive(component, originator, target)) { |
||
637 | daniel-mar | 7597 | console.warn(focus$4() + ' did not get interpreted by the desired target. ' + '\nOriginator: ' + element(originator) + '\nTarget: ' + element(target) + '\nCheck the ' + focus$4() + ' event handlers'); |
597 | daniel-mar | 7598 | return false; |
7599 | } else { |
||
7600 | return true; |
||
7601 | } |
||
7602 | })]); |
||
7603 | |||
7604 | var DefaultEvents = /*#__PURE__*/Object.freeze({ |
||
7605 | __proto__: null, |
||
637 | daniel-mar | 7606 | events: events$2 |
597 | daniel-mar | 7607 | }); |
7608 | |||
637 | daniel-mar | 7609 | var make$3 = identity; |
597 | daniel-mar | 7610 | |
7611 | var NoContextApi = function (getComp) { |
||
637 | daniel-mar | 7612 | var getMessage = function (event) { |
7613 | return 'The component must be in a context to execute: ' + event + (getComp ? '\n' + element(getComp().element) + ' is not in context.' : ''); |
||
7614 | }; |
||
597 | daniel-mar | 7615 | var fail = function (event) { |
7616 | return function () { |
||
637 | daniel-mar | 7617 | throw new Error(getMessage(event)); |
597 | daniel-mar | 7618 | }; |
7619 | }; |
||
637 | daniel-mar | 7620 | var warn = function (event) { |
7621 | return function () { |
||
7622 | console.warn(getMessage(event)); |
||
7623 | }; |
||
7624 | }; |
||
597 | daniel-mar | 7625 | return { |
637 | daniel-mar | 7626 | debugInfo: constant$1('fake'), |
7627 | triggerEvent: warn('triggerEvent'), |
||
7628 | triggerFocus: warn('triggerFocus'), |
||
7629 | triggerEscape: warn('triggerEscape'), |
||
7630 | broadcast: warn('broadcast'), |
||
7631 | broadcastOn: warn('broadcastOn'), |
||
7632 | broadcastEvent: warn('broadcastEvent'), |
||
597 | daniel-mar | 7633 | build: fail('build'), |
7634 | addToWorld: fail('addToWorld'), |
||
7635 | removeFromWorld: fail('removeFromWorld'), |
||
7636 | addToGui: fail('addToGui'), |
||
7637 | removeFromGui: fail('removeFromGui'), |
||
7638 | getByUid: fail('getByUid'), |
||
7639 | getByDom: fail('getByDom'), |
||
7640 | isConnected: never |
||
7641 | }; |
||
7642 | }; |
||
7643 | var singleton = NoContextApi(); |
||
7644 | |||
637 | daniel-mar | 7645 | var generateFrom$1 = function (spec, all) { |
7646 | var schema = map$2(all, function (a) { |
||
597 | daniel-mar | 7647 | return optionObjOf(a.name(), [ |
637 | daniel-mar | 7648 | required$1('config'), |
7649 | defaulted('state', NoState) |
||
597 | daniel-mar | 7650 | ]); |
7651 | }); |
||
7652 | var validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(function (errInfo) { |
||
7653 | throw new Error(formatError(errInfo) + '\nComplete spec:\n' + JSON.stringify(spec, null, 2)); |
||
637 | daniel-mar | 7654 | }, identity); |
597 | daniel-mar | 7655 | return { |
7656 | list: all, |
||
7657 | data: map$1(validated, function (optBlobThunk) { |
||
7658 | var output = optBlobThunk.map(function (blob) { |
||
7659 | return { |
||
7660 | config: blob.config, |
||
7661 | state: blob.state.init(blob.config) |
||
7662 | }; |
||
7663 | }); |
||
637 | daniel-mar | 7664 | return constant$1(output); |
597 | daniel-mar | 7665 | }) |
7666 | }; |
||
7667 | }; |
||
637 | daniel-mar | 7668 | var getBehaviours$1 = function (bData) { |
597 | daniel-mar | 7669 | return bData.list; |
7670 | }; |
||
7671 | var getData = function (bData) { |
||
7672 | return bData.data; |
||
7673 | }; |
||
7674 | |||
7675 | var byInnerKey = function (data, tuple) { |
||
7676 | var r = {}; |
||
637 | daniel-mar | 7677 | each(data, function (detail, key) { |
7678 | each(detail, function (value, indexKey) { |
||
7679 | var chain = get$c(r, indexKey).getOr([]); |
||
597 | daniel-mar | 7680 | r[indexKey] = chain.concat([tuple(key, value)]); |
7681 | }); |
||
7682 | }); |
||
7683 | return r; |
||
7684 | }; |
||
7685 | |||
7686 | var combine$1 = function (info, baseMod, behaviours, base) { |
||
7687 | var modsByBehaviour = __assign({}, baseMod); |
||
637 | daniel-mar | 7688 | each$1(behaviours, function (behaviour) { |
597 | daniel-mar | 7689 | modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base); |
7690 | }); |
||
7691 | var byAspect = byInnerKey(modsByBehaviour, function (name, modification) { |
||
7692 | return { |
||
7693 | name: name, |
||
7694 | modification: modification |
||
7695 | }; |
||
7696 | }); |
||
7697 | var combineObjects = function (objects) { |
||
7698 | return foldr(objects, function (b, a) { |
||
7699 | return __assign(__assign({}, a.modification), b); |
||
7700 | }, {}); |
||
7701 | }; |
||
7702 | var combinedClasses = foldr(byAspect.classes, function (b, a) { |
||
7703 | return a.modification.concat(b); |
||
7704 | }, []); |
||
7705 | var combinedAttributes = combineObjects(byAspect.attributes); |
||
7706 | var combinedStyles = combineObjects(byAspect.styles); |
||
637 | daniel-mar | 7707 | return nu$3({ |
597 | daniel-mar | 7708 | classes: combinedClasses, |
7709 | attributes: combinedAttributes, |
||
7710 | styles: combinedStyles |
||
7711 | }); |
||
7712 | }; |
||
7713 | |||
7714 | var sortKeys = function (label, keyName, array, order) { |
||
7715 | try { |
||
7716 | var sorted = sort(array, function (a, b) { |
||
7717 | var aKey = a[keyName]; |
||
7718 | var bKey = b[keyName]; |
||
7719 | var aIndex = order.indexOf(aKey); |
||
7720 | var bIndex = order.indexOf(bKey); |
||
7721 | if (aIndex === -1) { |
||
7722 | throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2)); |
||
7723 | } |
||
7724 | if (bIndex === -1) { |
||
7725 | throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2)); |
||
7726 | } |
||
7727 | if (aIndex < bIndex) { |
||
7728 | return -1; |
||
7729 | } else if (bIndex < aIndex) { |
||
7730 | return 1; |
||
7731 | } else { |
||
7732 | return 0; |
||
7733 | } |
||
7734 | }); |
||
7735 | return Result.value(sorted); |
||
7736 | } catch (err) { |
||
7737 | return Result.error([err]); |
||
7738 | } |
||
7739 | }; |
||
7740 | |||
7741 | var uncurried = function (handler, purpose) { |
||
7742 | return { |
||
7743 | handler: handler, |
||
7744 | purpose: purpose |
||
7745 | }; |
||
7746 | }; |
||
7747 | var curried = function (handler, purpose) { |
||
7748 | return { |
||
7749 | cHandler: handler, |
||
7750 | purpose: purpose |
||
7751 | }; |
||
7752 | }; |
||
7753 | var curryArgs = function (descHandler, extraArgs) { |
||
7754 | return curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose); |
||
7755 | }; |
||
7756 | var getCurried = function (descHandler) { |
||
7757 | return descHandler.cHandler; |
||
7758 | }; |
||
7759 | |||
7760 | var behaviourTuple = function (name, handler) { |
||
7761 | return { |
||
7762 | name: name, |
||
7763 | handler: handler |
||
7764 | }; |
||
7765 | }; |
||
7766 | var nameToHandlers = function (behaviours, info) { |
||
7767 | var r = {}; |
||
637 | daniel-mar | 7768 | each$1(behaviours, function (behaviour) { |
597 | daniel-mar | 7769 | r[behaviour.name()] = behaviour.handlers(info); |
7770 | }); |
||
7771 | return r; |
||
7772 | }; |
||
7773 | var groupByEvents = function (info, behaviours, base) { |
||
7774 | var behaviourEvents = __assign(__assign({}, base), nameToHandlers(behaviours, info)); |
||
7775 | return byInnerKey(behaviourEvents, behaviourTuple); |
||
7776 | }; |
||
637 | daniel-mar | 7777 | var combine = function (info, eventOrder, behaviours, base) { |
597 | daniel-mar | 7778 | var byEventName = groupByEvents(info, behaviours, base); |
7779 | return combineGroups(byEventName, eventOrder); |
||
7780 | }; |
||
7781 | var assemble = function (rawHandler) { |
||
7782 | var handler = read$1(rawHandler); |
||
7783 | return function (component, simulatedEvent) { |
||
7784 | var rest = []; |
||
7785 | for (var _i = 2; _i < arguments.length; _i++) { |
||
7786 | rest[_i - 2] = arguments[_i]; |
||
7787 | } |
||
7788 | var args = [ |
||
7789 | component, |
||
7790 | simulatedEvent |
||
7791 | ].concat(rest); |
||
7792 | if (handler.abort.apply(undefined, args)) { |
||
7793 | simulatedEvent.stop(); |
||
7794 | } else if (handler.can.apply(undefined, args)) { |
||
7795 | handler.run.apply(undefined, args); |
||
7796 | } |
||
7797 | }; |
||
7798 | }; |
||
7799 | var missingOrderError = function (eventName, tuples) { |
||
637 | daniel-mar | 7800 | return Result.error(['The event (' + eventName + ') has more than one behaviour that listens to it.\nWhen this occurs, you must ' + 'specify an event ordering for the behaviours in your spec (e.g. [ "listing", "toggling" ]).\nThe behaviours that ' + 'can trigger it are: ' + JSON.stringify(map$2(tuples, function (c) { |
597 | daniel-mar | 7801 | return c.name; |
7802 | }), null, 2)]); |
||
7803 | }; |
||
637 | daniel-mar | 7804 | var fuse = function (tuples, eventOrder, eventName) { |
597 | daniel-mar | 7805 | var order = eventOrder[eventName]; |
7806 | if (!order) { |
||
7807 | return missingOrderError(eventName, tuples); |
||
7808 | } else { |
||
7809 | return sortKeys('Event: ' + eventName, 'name', tuples, order).map(function (sortedTuples) { |
||
637 | daniel-mar | 7810 | var handlers = map$2(sortedTuples, function (tuple) { |
597 | daniel-mar | 7811 | return tuple.handler; |
7812 | }); |
||
637 | daniel-mar | 7813 | return fuse$1(handlers); |
597 | daniel-mar | 7814 | }); |
7815 | } |
||
7816 | }; |
||
7817 | var combineGroups = function (byEventName, eventOrder) { |
||
7818 | var r = mapToArray(byEventName, function (tuples, eventName) { |
||
637 | daniel-mar | 7819 | var combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse(tuples, eventOrder, eventName); |
597 | daniel-mar | 7820 | return combined.map(function (handler) { |
7821 | var assembled = assemble(handler); |
||
637 | daniel-mar | 7822 | var purpose = tuples.length > 1 ? filter$2(eventOrder[eventName], function (o) { |
597 | daniel-mar | 7823 | return exists(tuples, function (t) { |
7824 | return t.name === o; |
||
7825 | }); |
||
7826 | }).join(' > ') : tuples[0].name; |
||
637 | daniel-mar | 7827 | return wrap(eventName, uncurried(assembled, purpose)); |
597 | daniel-mar | 7828 | }); |
7829 | }); |
||
7830 | return consolidate(r, {}); |
||
7831 | }; |
||
7832 | |||
637 | daniel-mar | 7833 | var _a; |
597 | daniel-mar | 7834 | var baseBehaviour = 'alloy.base.behaviour'; |
637 | daniel-mar | 7835 | var schema$6 = objOf([ |
7836 | field$2('dom', 'dom', required$2(), objOf([ |
||
7837 | required$1('tag'), |
||
7838 | defaulted('styles', {}), |
||
7839 | defaulted('classes', []), |
||
7840 | defaulted('attributes', {}), |
||
7841 | option('value'), |
||
7842 | option('innerHtml') |
||
7843 | ])), |
||
7844 | required$1('components'), |
||
7845 | required$1('uid'), |
||
7846 | defaulted('events', {}), |
||
7847 | defaulted('apis', {}), |
||
7848 | field$2('eventOrder', 'eventOrder', mergeWith((_a = {}, _a[execute$5()] = [ |
||
7849 | 'disabling', |
||
7850 | baseBehaviour, |
||
7851 | 'toggling', |
||
7852 | 'typeaheadevents' |
||
7853 | ], _a[focus$4()] = [ |
||
7854 | baseBehaviour, |
||
7855 | 'focusing', |
||
7856 | 'keying' |
||
7857 | ], _a[systemInit()] = [ |
||
7858 | baseBehaviour, |
||
7859 | 'disabling', |
||
7860 | 'toggling', |
||
7861 | 'representing' |
||
7862 | ], _a[input$1()] = [ |
||
7863 | baseBehaviour, |
||
7864 | 'representing', |
||
7865 | 'streaming', |
||
7866 | 'invalidating' |
||
7867 | ], _a[detachedFromDom()] = [ |
||
7868 | baseBehaviour, |
||
7869 | 'representing', |
||
7870 | 'item-events', |
||
7871 | 'tooltipping' |
||
7872 | ], _a[mousedown()] = [ |
||
7873 | 'focusing', |
||
7874 | baseBehaviour, |
||
7875 | 'item-type-events' |
||
7876 | ], _a[touchstart()] = [ |
||
7877 | 'focusing', |
||
7878 | baseBehaviour, |
||
7879 | 'item-type-events' |
||
7880 | ], _a[mouseover()] = [ |
||
7881 | 'item-type-events', |
||
7882 | 'tooltipping' |
||
7883 | ], _a[receive$1()] = [ |
||
7884 | 'receiving', |
||
7885 | 'reflecting', |
||
7886 | 'tooltipping' |
||
7887 | ], _a)), anyValue()), |
||
7888 | option('domModification') |
||
7889 | ]); |
||
597 | daniel-mar | 7890 | var toInfo = function (spec) { |
637 | daniel-mar | 7891 | return asRaw('custom.definition', schema$6, spec); |
597 | daniel-mar | 7892 | }; |
7893 | var toDefinition = function (detail) { |
||
7894 | return __assign(__assign({}, detail.dom), { |
||
7895 | uid: detail.uid, |
||
637 | daniel-mar | 7896 | domChildren: map$2(detail.components, function (comp) { |
597 | daniel-mar | 7897 | return comp.element; |
7898 | }) |
||
7899 | }); |
||
7900 | }; |
||
7901 | var toModification = function (detail) { |
||
7902 | return detail.domModification.fold(function () { |
||
637 | daniel-mar | 7903 | return nu$3({}); |
7904 | }, nu$3); |
||
597 | daniel-mar | 7905 | }; |
7906 | var toEvents = function (info) { |
||
7907 | return info.events; |
||
7908 | }; |
||
7909 | |||
637 | daniel-mar | 7910 | var add = function (element, classes) { |
7911 | each$1(classes, function (x) { |
||
7912 | add$1(element, x); |
||
597 | daniel-mar | 7913 | }); |
7914 | }; |
||
637 | daniel-mar | 7915 | var remove$1 = function (element, classes) { |
7916 | each$1(classes, function (x) { |
||
7917 | remove$3(element, x); |
||
597 | daniel-mar | 7918 | }); |
7919 | }; |
||
7920 | |||
7921 | var renderToDom = function (definition) { |
||
7922 | var subject = SugarElement.fromTag(definition.tag); |
||
637 | daniel-mar | 7923 | setAll$1(subject, definition.attributes); |
7924 | add(subject, definition.classes); |
||
7925 | setAll(subject, definition.styles); |
||
597 | daniel-mar | 7926 | definition.innerHtml.each(function (html) { |
637 | daniel-mar | 7927 | return set$7(subject, html); |
597 | daniel-mar | 7928 | }); |
7929 | var children = definition.domChildren; |
||
7930 | append$1(subject, children); |
||
7931 | definition.value.each(function (value) { |
||
637 | daniel-mar | 7932 | set$2(subject, value); |
597 | daniel-mar | 7933 | }); |
7934 | if (!definition.uid) { |
||
7935 | debugger; |
||
7936 | } |
||
7937 | writeOnly(subject, definition.uid); |
||
7938 | return subject; |
||
7939 | }; |
||
7940 | |||
637 | daniel-mar | 7941 | var getBehaviours = function (spec) { |
7942 | var behaviours = get$c(spec, 'behaviours').getOr({}); |
||
679 | daniel-mar | 7943 | return bind$3(keys(behaviours), function (name) { |
7944 | var behaviour = behaviours[name]; |
||
7945 | return isNonNullable(behaviour) ? [behaviour.me] : []; |
||
597 | daniel-mar | 7946 | }); |
7947 | }; |
||
637 | daniel-mar | 7948 | var generateFrom = function (spec, all) { |
7949 | return generateFrom$1(spec, all); |
||
7950 | }; |
||
7951 | var generate$1 = function (spec) { |
||
7952 | var all = getBehaviours(spec); |
||
597 | daniel-mar | 7953 | return generateFrom(spec, all); |
7954 | }; |
||
7955 | |||
7956 | var getDomDefinition = function (info, bList, bData) { |
||
7957 | var definition = toDefinition(info); |
||
7958 | var infoModification = toModification(info); |
||
7959 | var baseModification = { 'alloy.base.modification': infoModification }; |
||
7960 | var modification = bList.length > 0 ? combine$1(bData, baseModification, bList, definition) : infoModification; |
||
637 | daniel-mar | 7961 | return merge(definition, modification); |
597 | daniel-mar | 7962 | }; |
7963 | var getEvents = function (info, bList, bData) { |
||
7964 | var baseEvents = { 'alloy.base.behaviour': toEvents(info) }; |
||
637 | daniel-mar | 7965 | return combine(bData, info.eventOrder, bList, baseEvents).getOrDie(); |
597 | daniel-mar | 7966 | }; |
637 | daniel-mar | 7967 | var build$2 = function (spec) { |
597 | daniel-mar | 7968 | var getMe = function () { |
7969 | return me; |
||
7970 | }; |
||
7971 | var systemApi = Cell(singleton); |
||
7972 | var info = getOrDie(toInfo(spec)); |
||
637 | daniel-mar | 7973 | var bBlob = generate$1(spec); |
7974 | var bList = getBehaviours$1(bBlob); |
||
597 | daniel-mar | 7975 | var bData = getData(bBlob); |
7976 | var modDefinition = getDomDefinition(info, bList, bData); |
||
7977 | var item = renderToDom(modDefinition); |
||
7978 | var events = getEvents(info, bList, bData); |
||
7979 | var subcomponents = Cell(info.components); |
||
7980 | var connect = function (newApi) { |
||
7981 | systemApi.set(newApi); |
||
7982 | }; |
||
7983 | var disconnect = function () { |
||
7984 | systemApi.set(NoContextApi(getMe)); |
||
7985 | }; |
||
7986 | var syncComponents = function () { |
||
7987 | var children$1 = children(item); |
||
637 | daniel-mar | 7988 | var subs = bind$3(children$1, function (child) { |
597 | daniel-mar | 7989 | return systemApi.get().getByDom(child).fold(function () { |
7990 | return []; |
||
637 | daniel-mar | 7991 | }, pure$2); |
597 | daniel-mar | 7992 | }); |
7993 | subcomponents.set(subs); |
||
7994 | }; |
||
7995 | var config = function (behaviour) { |
||
7996 | var b = bData; |
||
7997 | var f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : function () { |
||
7998 | throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2)); |
||
7999 | }; |
||
8000 | return f(); |
||
8001 | }; |
||
8002 | var hasConfigured = function (behaviour) { |
||
8003 | return isFunction(bData[behaviour.name()]); |
||
8004 | }; |
||
8005 | var getApis = function () { |
||
8006 | return info.apis; |
||
8007 | }; |
||
8008 | var readState = function (behaviourName) { |
||
8009 | return bData[behaviourName]().map(function (b) { |
||
8010 | return b.state.readState(); |
||
8011 | }).getOr('not enabled'); |
||
8012 | }; |
||
8013 | var me = { |
||
637 | daniel-mar | 8014 | uid: spec.uid, |
597 | daniel-mar | 8015 | getSystem: systemApi.get, |
8016 | config: config, |
||
8017 | hasConfigured: hasConfigured, |
||
8018 | spec: spec, |
||
8019 | readState: readState, |
||
8020 | getApis: getApis, |
||
8021 | connect: connect, |
||
8022 | disconnect: disconnect, |
||
8023 | element: item, |
||
8024 | syncComponents: syncComponents, |
||
8025 | components: subcomponents.get, |
||
8026 | events: events |
||
8027 | }; |
||
8028 | return me; |
||
8029 | }; |
||
8030 | |||
8031 | var buildSubcomponents = function (spec) { |
||
637 | daniel-mar | 8032 | var components = get$c(spec, 'components').getOr([]); |
8033 | return map$2(components, build$1); |
||
597 | daniel-mar | 8034 | }; |
8035 | var buildFromSpec = function (userSpec) { |
||
637 | daniel-mar | 8036 | var _a = make$3(userSpec), specEvents = _a.events, spec = __rest(_a, ['events']); |
597 | daniel-mar | 8037 | var components = buildSubcomponents(spec); |
8038 | var completeSpec = __assign(__assign({}, spec), { |
||
8039 | events: __assign(__assign({}, DefaultEvents), specEvents), |
||
8040 | components: components |
||
8041 | }); |
||
637 | daniel-mar | 8042 | return Result.value(build$2(completeSpec)); |
597 | daniel-mar | 8043 | }; |
8044 | var text = function (textContent) { |
||
8045 | var element = SugarElement.fromText(textContent); |
||
637 | daniel-mar | 8046 | return external({ element: element }); |
597 | daniel-mar | 8047 | }; |
637 | daniel-mar | 8048 | var external = function (spec) { |
8049 | var extSpec = asRawOrDie$1('external.component', objOfOnly([ |
||
8050 | required$1('element'), |
||
597 | daniel-mar | 8051 | option('uid') |
8052 | ]), spec); |
||
8053 | var systemApi = Cell(NoContextApi()); |
||
8054 | var connect = function (newApi) { |
||
8055 | systemApi.set(newApi); |
||
8056 | }; |
||
8057 | var disconnect = function () { |
||
8058 | systemApi.set(NoContextApi(function () { |
||
8059 | return me; |
||
8060 | })); |
||
8061 | }; |
||
637 | daniel-mar | 8062 | var uid = extSpec.uid.getOrThunk(function () { |
8063 | return generate$2('external'); |
||
597 | daniel-mar | 8064 | }); |
637 | daniel-mar | 8065 | writeOnly(extSpec.element, uid); |
597 | daniel-mar | 8066 | var me = { |
637 | daniel-mar | 8067 | uid: uid, |
597 | daniel-mar | 8068 | getSystem: systemApi.get, |
8069 | config: Optional.none, |
||
8070 | hasConfigured: never, |
||
8071 | connect: connect, |
||
8072 | disconnect: disconnect, |
||
8073 | getApis: function () { |
||
8074 | return {}; |
||
8075 | }, |
||
8076 | element: extSpec.element, |
||
8077 | spec: spec, |
||
637 | daniel-mar | 8078 | readState: constant$1('No state'), |
597 | daniel-mar | 8079 | syncComponents: noop, |
637 | daniel-mar | 8080 | components: constant$1([]), |
597 | daniel-mar | 8081 | events: {} |
8082 | }; |
||
637 | daniel-mar | 8083 | return premade$1(me); |
597 | daniel-mar | 8084 | }; |
637 | daniel-mar | 8085 | var uids = generate$2; |
8086 | var isSketchSpec = function (spec) { |
||
8087 | return has$2(spec, 'uid'); |
||
8088 | }; |
||
597 | daniel-mar | 8089 | var build$1 = function (spec) { |
637 | daniel-mar | 8090 | return getPremade(spec).getOrThunk(function () { |
8091 | var userSpecWithUid = isSketchSpec(spec) ? spec : __assign({ uid: uids('') }, spec); |
||
597 | daniel-mar | 8092 | return buildFromSpec(userSpecWithUid).getOrDie(); |
8093 | }); |
||
8094 | }; |
||
637 | daniel-mar | 8095 | var premade = premade$1; |
597 | daniel-mar | 8096 | |
8097 | var hoverEvent = 'alloy.item-hover'; |
||
8098 | var focusEvent = 'alloy.item-focus'; |
||
8099 | var onHover = function (item) { |
||
8100 | if (search(item.element).isNone() || Focusing.isFocused(item)) { |
||
8101 | if (!Focusing.isFocused(item)) { |
||
8102 | Focusing.focus(item); |
||
8103 | } |
||
8104 | emitWith(item, hoverEvent, { item: item }); |
||
8105 | } |
||
8106 | }; |
||
8107 | var onFocus = function (item) { |
||
8108 | emitWith(item, focusEvent, { item: item }); |
||
8109 | }; |
||
637 | daniel-mar | 8110 | var hover = constant$1(hoverEvent); |
8111 | var focus$1 = constant$1(focusEvent); |
||
597 | daniel-mar | 8112 | |
637 | daniel-mar | 8113 | var builder$2 = function (detail) { |
597 | daniel-mar | 8114 | return { |
8115 | dom: detail.dom, |
||
8116 | domModification: __assign(__assign({}, detail.domModification), { attributes: __assign(__assign(__assign({ 'role': detail.toggling.isSome() ? 'menuitemcheckbox' : 'menuitem' }, detail.domModification.attributes), { 'aria-haspopup': detail.hasSubmenu }), detail.hasSubmenu ? { 'aria-expanded': false } : {}) }), |
||
8117 | behaviours: SketchBehaviours.augment(detail.itemBehaviours, [ |
||
8118 | detail.toggling.fold(Toggling.revoke, function (tConfig) { |
||
8119 | return Toggling.config(__assign({ aria: { mode: 'checked' } }, tConfig)); |
||
8120 | }), |
||
8121 | Focusing.config({ |
||
8122 | ignore: detail.ignoreFocus, |
||
8123 | stopMousedown: detail.ignoreFocus, |
||
8124 | onFocus: function (component) { |
||
8125 | onFocus(component); |
||
8126 | } |
||
8127 | }), |
||
8128 | Keying.config({ mode: 'execution' }), |
||
8129 | Representing.config({ |
||
8130 | store: { |
||
8131 | mode: 'memory', |
||
8132 | initialValue: detail.data |
||
8133 | } |
||
8134 | }), |
||
679 | daniel-mar | 8135 | config('item-type-events', __spreadArray(__spreadArray([], pointerEvents(), true), [ |
597 | daniel-mar | 8136 | run(mouseover(), onHover), |
8137 | run(focusItem(), Focusing.focus) |
||
679 | daniel-mar | 8138 | ], false)) |
597 | daniel-mar | 8139 | ]), |
8140 | components: detail.components, |
||
8141 | eventOrder: detail.eventOrder |
||
8142 | }; |
||
8143 | }; |
||
637 | daniel-mar | 8144 | var schema$5 = [ |
8145 | required$1('data'), |
||
8146 | required$1('components'), |
||
8147 | required$1('dom'), |
||
8148 | defaulted('hasSubmenu', false), |
||
597 | daniel-mar | 8149 | option('toggling'), |
8150 | SketchBehaviours.field('itemBehaviours', [ |
||
8151 | Toggling, |
||
8152 | Focusing, |
||
8153 | Keying, |
||
8154 | Representing |
||
8155 | ]), |
||
637 | daniel-mar | 8156 | defaulted('ignoreFocus', false), |
8157 | defaulted('domModification', {}), |
||
8158 | output('builder', builder$2), |
||
8159 | defaulted('eventOrder', {}) |
||
597 | daniel-mar | 8160 | ]; |
8161 | |||
8162 | var builder$1 = function (detail) { |
||
8163 | return { |
||
8164 | dom: detail.dom, |
||
8165 | components: detail.components, |
||
637 | daniel-mar | 8166 | events: derive$3([stopper(focusItem())]) |
597 | daniel-mar | 8167 | }; |
8168 | }; |
||
637 | daniel-mar | 8169 | var schema$4 = [ |
8170 | required$1('dom'), |
||
8171 | required$1('components'), |
||
597 | daniel-mar | 8172 | output('builder', builder$1) |
8173 | ]; |
||
8174 | |||
637 | daniel-mar | 8175 | var owner = constant$1('item-widget'); |
8176 | var parts$3 = constant$1([required({ |
||
597 | daniel-mar | 8177 | name: 'widget', |
8178 | overrides: function (detail) { |
||
8179 | return { |
||
637 | daniel-mar | 8180 | behaviours: derive$2([Representing.config({ |
597 | daniel-mar | 8181 | store: { |
8182 | mode: 'manual', |
||
8183 | getValue: function (_component) { |
||
8184 | return detail.data; |
||
8185 | }, |
||
8186 | setValue: noop |
||
8187 | } |
||
8188 | })]) |
||
8189 | }; |
||
8190 | } |
||
8191 | })]); |
||
8192 | |||
637 | daniel-mar | 8193 | var builder = function (detail) { |
8194 | var subs = substitutes(owner(), detail, parts$3()); |
||
8195 | var components$1 = components(owner(), detail, subs.internals()); |
||
597 | daniel-mar | 8196 | var focusWidget = function (component) { |
8197 | return getPart(component, detail, 'widget').map(function (widget) { |
||
8198 | Keying.focusIn(widget); |
||
8199 | return widget; |
||
8200 | }); |
||
8201 | }; |
||
8202 | var onHorizontalArrow = function (component, simulatedEvent) { |
||
8203 | return inside(simulatedEvent.event.target) ? Optional.none() : function () { |
||
8204 | if (detail.autofocus) { |
||
8205 | simulatedEvent.setSource(component.element); |
||
8206 | return Optional.none(); |
||
8207 | } else { |
||
8208 | return Optional.none(); |
||
8209 | } |
||
8210 | }(); |
||
8211 | }; |
||
8212 | return { |
||
8213 | dom: detail.dom, |
||
8214 | components: components$1, |
||
8215 | domModification: detail.domModification, |
||
637 | daniel-mar | 8216 | events: derive$3([ |
597 | daniel-mar | 8217 | runOnExecute(function (component, simulatedEvent) { |
8218 | focusWidget(component).each(function (_widget) { |
||
8219 | simulatedEvent.stop(); |
||
8220 | }); |
||
8221 | }), |
||
8222 | run(mouseover(), onHover), |
||
8223 | run(focusItem(), function (component, _simulatedEvent) { |
||
8224 | if (detail.autofocus) { |
||
8225 | focusWidget(component); |
||
8226 | } else { |
||
8227 | Focusing.focus(component); |
||
8228 | } |
||
8229 | }) |
||
8230 | ]), |
||
8231 | behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [ |
||
8232 | Representing.config({ |
||
8233 | store: { |
||
8234 | mode: 'memory', |
||
8235 | initialValue: detail.data |
||
8236 | } |
||
8237 | }), |
||
8238 | Focusing.config({ |
||
8239 | ignore: detail.ignoreFocus, |
||
8240 | onFocus: function (component) { |
||
8241 | onFocus(component); |
||
8242 | } |
||
8243 | }), |
||
8244 | Keying.config({ |
||
8245 | mode: 'special', |
||
8246 | focusIn: detail.autofocus ? function (component) { |
||
8247 | focusWidget(component); |
||
8248 | } : revoke(), |
||
8249 | onLeft: onHorizontalArrow, |
||
8250 | onRight: onHorizontalArrow, |
||
8251 | onEscape: function (component, simulatedEvent) { |
||
8252 | if (!Focusing.isFocused(component) && !detail.autofocus) { |
||
8253 | Focusing.focus(component); |
||
8254 | return Optional.some(true); |
||
8255 | } else if (detail.autofocus) { |
||
8256 | simulatedEvent.setSource(component.element); |
||
8257 | return Optional.none(); |
||
8258 | } else { |
||
8259 | return Optional.none(); |
||
8260 | } |
||
8261 | } |
||
8262 | }) |
||
8263 | ]) |
||
8264 | }; |
||
8265 | }; |
||
637 | daniel-mar | 8266 | var schema$3 = [ |
8267 | required$1('uid'), |
||
8268 | required$1('data'), |
||
8269 | required$1('components'), |
||
8270 | required$1('dom'), |
||
8271 | defaulted('autofocus', false), |
||
8272 | defaulted('ignoreFocus', false), |
||
597 | daniel-mar | 8273 | SketchBehaviours.field('widgetBehaviours', [ |
8274 | Representing, |
||
8275 | Focusing, |
||
8276 | Keying |
||
8277 | ]), |
||
637 | daniel-mar | 8278 | defaulted('domModification', {}), |
8279 | defaultUidsSchema(parts$3()), |
||
8280 | output('builder', builder) |
||
597 | daniel-mar | 8281 | ]; |
8282 | |||
637 | daniel-mar | 8283 | var itemSchema = choose$1('type', { |
8284 | widget: schema$3, |
||
8285 | item: schema$5, |
||
8286 | separator: schema$4 |
||
597 | daniel-mar | 8287 | }); |
8288 | var configureGrid = function (detail, movementInfo) { |
||
8289 | return { |
||
8290 | mode: 'flatgrid', |
||
8291 | selector: '.' + detail.markers.item, |
||
8292 | initSize: { |
||
8293 | numColumns: movementInfo.initSize.numColumns, |
||
8294 | numRows: movementInfo.initSize.numRows |
||
8295 | }, |
||
8296 | focusManager: detail.focusManager |
||
8297 | }; |
||
8298 | }; |
||
8299 | var configureMatrix = function (detail, movementInfo) { |
||
8300 | return { |
||
8301 | mode: 'matrix', |
||
8302 | selectors: { |
||
8303 | row: movementInfo.rowSelector, |
||
8304 | cell: '.' + detail.markers.item |
||
8305 | }, |
||
8306 | focusManager: detail.focusManager |
||
8307 | }; |
||
8308 | }; |
||
8309 | var configureMenu = function (detail, movementInfo) { |
||
8310 | return { |
||
8311 | mode: 'menu', |
||
8312 | selector: '.' + detail.markers.item, |
||
8313 | moveOnTab: movementInfo.moveOnTab, |
||
8314 | focusManager: detail.focusManager |
||
8315 | }; |
||
8316 | }; |
||
637 | daniel-mar | 8317 | var parts$2 = constant$1([group({ |
597 | daniel-mar | 8318 | factory: { |
8319 | sketch: function (spec) { |
||
637 | daniel-mar | 8320 | var itemInfo = asRawOrDie$1('menu.spec item', itemSchema, spec); |
597 | daniel-mar | 8321 | return itemInfo.builder(itemInfo); |
8322 | } |
||
8323 | }, |
||
8324 | name: 'items', |
||
8325 | unit: 'item', |
||
8326 | defaults: function (detail, u) { |
||
637 | daniel-mar | 8327 | return has$2(u, 'uid') ? u : __assign(__assign({}, u), { uid: generate$2('item') }); |
597 | daniel-mar | 8328 | }, |
8329 | overrides: function (detail, u) { |
||
8330 | return { |
||
8331 | type: u.type, |
||
8332 | ignoreFocus: detail.fakeFocus, |
||
8333 | domModification: { classes: [detail.markers.item] } |
||
8334 | }; |
||
8335 | } |
||
8336 | })]); |
||
637 | daniel-mar | 8337 | var schema$2 = constant$1([ |
8338 | required$1('value'), |
||
8339 | required$1('items'), |
||
8340 | required$1('dom'), |
||
8341 | required$1('components'), |
||
8342 | defaulted('eventOrder', {}), |
||
597 | daniel-mar | 8343 | field$1('menuBehaviours', [ |
8344 | Highlighting, |
||
8345 | Representing, |
||
8346 | Composing, |
||
8347 | Keying |
||
8348 | ]), |
||
8349 | defaultedOf('movement', { |
||
8350 | mode: 'menu', |
||
8351 | moveOnTab: true |
||
8352 | }, choose$1('mode', { |
||
8353 | grid: [ |
||
8354 | initSize(), |
||
8355 | output('config', configureGrid) |
||
8356 | ], |
||
8357 | matrix: [ |
||
8358 | output('config', configureMatrix), |
||
637 | daniel-mar | 8359 | required$1('rowSelector') |
597 | daniel-mar | 8360 | ], |
8361 | menu: [ |
||
637 | daniel-mar | 8362 | defaulted('moveOnTab', true), |
597 | daniel-mar | 8363 | output('config', configureMenu) |
8364 | ] |
||
8365 | })), |
||
8366 | itemMarkers(), |
||
637 | daniel-mar | 8367 | defaulted('fakeFocus', false), |
8368 | defaulted('focusManager', dom$2()), |
||
597 | daniel-mar | 8369 | onHandler('onHighlight') |
8370 | ]); |
||
8371 | |||
637 | daniel-mar | 8372 | var focus = constant$1('alloy.menu-focus'); |
597 | daniel-mar | 8373 | |
8374 | var make$2 = function (detail, components, _spec, _externals) { |
||
8375 | return { |
||
8376 | uid: detail.uid, |
||
8377 | dom: detail.dom, |
||
8378 | markers: detail.markers, |
||
8379 | behaviours: augment(detail.menuBehaviours, [ |
||
8380 | Highlighting.config({ |
||
8381 | highlightClass: detail.markers.selectedItem, |
||
8382 | itemClass: detail.markers.item, |
||
8383 | onHighlight: detail.onHighlight |
||
8384 | }), |
||
8385 | Representing.config({ |
||
8386 | store: { |
||
8387 | mode: 'memory', |
||
8388 | initialValue: detail.value |
||
8389 | } |
||
8390 | }), |
||
8391 | Composing.config({ find: Optional.some }), |
||
8392 | Keying.config(detail.movement.config(detail, detail.movement)) |
||
8393 | ]), |
||
637 | daniel-mar | 8394 | events: derive$3([ |
8395 | run(focus$1(), function (menu, simulatedEvent) { |
||
597 | daniel-mar | 8396 | var event = simulatedEvent.event; |
8397 | menu.getSystem().getByDom(event.target).each(function (item) { |
||
8398 | Highlighting.highlight(menu, item); |
||
8399 | simulatedEvent.stop(); |
||
637 | daniel-mar | 8400 | emitWith(menu, focus(), { |
597 | daniel-mar | 8401 | menu: menu, |
8402 | item: item |
||
8403 | }); |
||
8404 | }); |
||
8405 | }), |
||
8406 | run(hover(), function (menu, simulatedEvent) { |
||
8407 | var item = simulatedEvent.event.item; |
||
8408 | Highlighting.highlight(menu, item); |
||
8409 | }) |
||
8410 | ]), |
||
8411 | components: components, |
||
8412 | eventOrder: detail.eventOrder, |
||
8413 | domModification: { attributes: { role: 'menu' } } |
||
8414 | }; |
||
8415 | }; |
||
8416 | |||
637 | daniel-mar | 8417 | var Menu = composite({ |
597 | daniel-mar | 8418 | name: 'Menu', |
637 | daniel-mar | 8419 | configFields: schema$2(), |
8420 | partFields: parts$2(), |
||
597 | daniel-mar | 8421 | factory: make$2 |
8422 | }); |
||
8423 | |||
637 | daniel-mar | 8424 | var preserve = function (f, container) { |
597 | daniel-mar | 8425 | var dos = getRootNode(container); |
8426 | var refocus = active(dos).bind(function (focused) { |
||
8427 | var hasFocus = function (elem) { |
||
8428 | return eq(focused, elem); |
||
8429 | }; |
||
637 | daniel-mar | 8430 | return hasFocus(container) ? Optional.some(container) : descendant$1(container, hasFocus); |
597 | daniel-mar | 8431 | }); |
8432 | var result = f(container); |
||
8433 | refocus.each(function (oldFocus) { |
||
8434 | active(dos).filter(function (newFocus) { |
||
8435 | return eq(newFocus, oldFocus); |
||
8436 | }).fold(function () { |
||
637 | daniel-mar | 8437 | focus$3(oldFocus); |
597 | daniel-mar | 8438 | }, noop); |
8439 | }); |
||
8440 | return result; |
||
8441 | }; |
||
8442 | |||
637 | daniel-mar | 8443 | var set = function (component, replaceConfig, replaceState, data) { |
8444 | preserve(function () { |
||
8445 | var newChildren = map$2(data, component.getSystem().build); |
||
597 | daniel-mar | 8446 | replaceChildren(component, newChildren); |
8447 | }, component.element); |
||
8448 | }; |
||
8449 | var insert = function (component, replaceConfig, insertion, childSpec) { |
||
8450 | var child = component.getSystem().build(childSpec); |
||
8451 | attachWith(component, child, insertion); |
||
8452 | }; |
||
637 | daniel-mar | 8453 | var append = function (component, replaceConfig, replaceState, appendee) { |
8454 | insert(component, replaceConfig, append$2, appendee); |
||
597 | daniel-mar | 8455 | }; |
637 | daniel-mar | 8456 | var prepend = function (component, replaceConfig, replaceState, prependee) { |
8457 | insert(component, replaceConfig, prepend$1, prependee); |
||
597 | daniel-mar | 8458 | }; |
637 | daniel-mar | 8459 | var remove = function (component, replaceConfig, replaceState, removee) { |
597 | daniel-mar | 8460 | var children = contents(component); |
637 | daniel-mar | 8461 | var foundChild = find$2(children, function (child) { |
597 | daniel-mar | 8462 | return eq(removee.element, child.element); |
8463 | }); |
||
8464 | foundChild.each(detach); |
||
8465 | }; |
||
8466 | var contents = function (component, _replaceConfig) { |
||
8467 | return component.components(); |
||
8468 | }; |
||
8469 | var replaceAt = function (component, replaceConfig, replaceState, replaceeIndex, replacer) { |
||
8470 | var children = contents(component); |
||
8471 | return Optional.from(children[replaceeIndex]).map(function (replacee) { |
||
637 | daniel-mar | 8472 | remove(component, replaceConfig, replaceState, replacee); |
597 | daniel-mar | 8473 | replacer.each(function (r) { |
8474 | insert(component, replaceConfig, function (p, c) { |
||
8475 | appendAt(p, c, replaceeIndex); |
||
8476 | }, r); |
||
8477 | }); |
||
8478 | return replacee; |
||
8479 | }); |
||
8480 | }; |
||
8481 | var replaceBy = function (component, replaceConfig, replaceState, replaceePred, replacer) { |
||
8482 | var children = contents(component); |
||
637 | daniel-mar | 8483 | return findIndex$1(children, replaceePred).bind(function (replaceeIndex) { |
597 | daniel-mar | 8484 | return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer); |
8485 | }); |
||
8486 | }; |
||
8487 | |||
8488 | var ReplaceApis = /*#__PURE__*/Object.freeze({ |
||
8489 | __proto__: null, |
||
637 | daniel-mar | 8490 | append: append, |
8491 | prepend: prepend, |
||
8492 | remove: remove, |
||
597 | daniel-mar | 8493 | replaceAt: replaceAt, |
8494 | replaceBy: replaceBy, |
||
637 | daniel-mar | 8495 | set: set, |
597 | daniel-mar | 8496 | contents: contents |
8497 | }); |
||
8498 | |||
637 | daniel-mar | 8499 | var Replacing = create$5({ |
597 | daniel-mar | 8500 | fields: [], |
8501 | name: 'replacing', |
||
8502 | apis: ReplaceApis |
||
8503 | }); |
||
8504 | |||
8505 | var transpose = function (obj) { |
||
8506 | return tupleMap(obj, function (v, k) { |
||
8507 | return { |
||
8508 | k: v, |
||
8509 | v: k |
||
8510 | }; |
||
8511 | }); |
||
8512 | }; |
||
8513 | var trace = function (items, byItem, byMenu, finish) { |
||
637 | daniel-mar | 8514 | return get$c(byMenu, finish).bind(function (triggerItem) { |
8515 | return get$c(items, triggerItem).bind(function (triggerMenu) { |
||
597 | daniel-mar | 8516 | var rest = trace(items, byItem, byMenu, triggerMenu); |
8517 | return Optional.some([triggerMenu].concat(rest)); |
||
8518 | }); |
||
8519 | }).getOr([]); |
||
8520 | }; |
||
637 | daniel-mar | 8521 | var generate = function (menus, expansions) { |
597 | daniel-mar | 8522 | var items = {}; |
637 | daniel-mar | 8523 | each(menus, function (menuItems, menu) { |
8524 | each$1(menuItems, function (item) { |
||
597 | daniel-mar | 8525 | items[item] = menu; |
8526 | }); |
||
8527 | }); |
||
8528 | var byItem = expansions; |
||
8529 | var byMenu = transpose(expansions); |
||
8530 | var menuPaths = map$1(byMenu, function (_triggerItem, submenu) { |
||
8531 | return [submenu].concat(trace(items, byItem, byMenu, submenu)); |
||
8532 | }); |
||
8533 | return map$1(items, function (menu) { |
||
637 | daniel-mar | 8534 | return get$c(menuPaths, menu).getOr([menu]); |
597 | daniel-mar | 8535 | }); |
8536 | }; |
||
8537 | |||
637 | daniel-mar | 8538 | var init$2 = function () { |
597 | daniel-mar | 8539 | var expansions = Cell({}); |
8540 | var menus = Cell({}); |
||
8541 | var paths = Cell({}); |
||
637 | daniel-mar | 8542 | var primary = value(); |
597 | daniel-mar | 8543 | var directory = Cell({}); |
8544 | var clear = function () { |
||
8545 | expansions.set({}); |
||
8546 | menus.set({}); |
||
8547 | paths.set({}); |
||
637 | daniel-mar | 8548 | primary.clear(); |
597 | daniel-mar | 8549 | }; |
8550 | var isClear = function () { |
||
8551 | return primary.get().isNone(); |
||
8552 | }; |
||
8553 | var setMenuBuilt = function (menuName, built) { |
||
8554 | var _a; |
||
8555 | menus.set(__assign(__assign({}, menus.get()), (_a = {}, _a[menuName] = { |
||
8556 | type: 'prepared', |
||
8557 | menu: built |
||
8558 | }, _a))); |
||
8559 | }; |
||
8560 | var setContents = function (sPrimary, sMenus, sExpansions, dir) { |
||
637 | daniel-mar | 8561 | primary.set(sPrimary); |
597 | daniel-mar | 8562 | expansions.set(sExpansions); |
8563 | menus.set(sMenus); |
||
8564 | directory.set(dir); |
||
637 | daniel-mar | 8565 | var sPaths = generate(dir, sExpansions); |
597 | daniel-mar | 8566 | paths.set(sPaths); |
8567 | }; |
||
8568 | var getTriggeringItem = function (menuValue) { |
||
637 | daniel-mar | 8569 | return find(expansions.get(), function (v, _k) { |
597 | daniel-mar | 8570 | return v === menuValue; |
8571 | }); |
||
8572 | }; |
||
8573 | var getTriggerData = function (menuValue, getItemByValue, path) { |
||
8574 | return getPreparedMenu(menuValue).bind(function (menu) { |
||
8575 | return getTriggeringItem(menuValue).bind(function (triggeringItemValue) { |
||
8576 | return getItemByValue(triggeringItemValue).map(function (triggeredItem) { |
||
8577 | return { |
||
8578 | triggeredMenu: menu, |
||
8579 | triggeringItem: triggeredItem, |
||
8580 | triggeringPath: path |
||
8581 | }; |
||
8582 | }); |
||
8583 | }); |
||
8584 | }); |
||
8585 | }; |
||
8586 | var getTriggeringPath = function (itemValue, getItemByValue) { |
||
637 | daniel-mar | 8587 | var extraPath = filter$2(lookupItem(itemValue).toArray(), function (menuValue) { |
597 | daniel-mar | 8588 | return getPreparedMenu(menuValue).isSome(); |
8589 | }); |
||
637 | daniel-mar | 8590 | return get$c(paths.get(), itemValue).bind(function (path) { |
597 | daniel-mar | 8591 | var revPath = reverse(extraPath.concat(path)); |
637 | daniel-mar | 8592 | var triggers = bind$3(revPath, function (menuValue, menuIndex) { |
597 | daniel-mar | 8593 | return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () { |
637 | daniel-mar | 8594 | return is(primary.get(), menuValue) ? [] : [Optional.none()]; |
597 | daniel-mar | 8595 | }, function (data) { |
8596 | return [Optional.some(data)]; |
||
8597 | }); |
||
8598 | }); |
||
8599 | return sequence(triggers); |
||
8600 | }); |
||
8601 | }; |
||
8602 | var expand = function (itemValue) { |
||
637 | daniel-mar | 8603 | return get$c(expansions.get(), itemValue).map(function (menu) { |
8604 | var current = get$c(paths.get(), itemValue).getOr([]); |
||
597 | daniel-mar | 8605 | return [menu].concat(current); |
8606 | }); |
||
8607 | }; |
||
8608 | var collapse = function (itemValue) { |
||
637 | daniel-mar | 8609 | return get$c(paths.get(), itemValue).bind(function (path) { |
597 | daniel-mar | 8610 | return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none(); |
8611 | }); |
||
8612 | }; |
||
8613 | var refresh = function (itemValue) { |
||
637 | daniel-mar | 8614 | return get$c(paths.get(), itemValue); |
597 | daniel-mar | 8615 | }; |
8616 | var getPreparedMenu = function (menuValue) { |
||
8617 | return lookupMenu(menuValue).bind(extractPreparedMenu); |
||
8618 | }; |
||
8619 | var lookupMenu = function (menuValue) { |
||
637 | daniel-mar | 8620 | return get$c(menus.get(), menuValue); |
597 | daniel-mar | 8621 | }; |
8622 | var lookupItem = function (itemValue) { |
||
637 | daniel-mar | 8623 | return get$c(expansions.get(), itemValue); |
597 | daniel-mar | 8624 | }; |
8625 | var otherMenus = function (path) { |
||
8626 | var menuValues = directory.get(); |
||
8627 | return difference(keys(menuValues), path); |
||
8628 | }; |
||
8629 | var getPrimary = function () { |
||
8630 | return primary.get().bind(getPreparedMenu); |
||
8631 | }; |
||
8632 | var getMenus = function () { |
||
8633 | return menus.get(); |
||
8634 | }; |
||
8635 | return { |
||
8636 | setMenuBuilt: setMenuBuilt, |
||
8637 | setContents: setContents, |
||
8638 | expand: expand, |
||
8639 | refresh: refresh, |
||
8640 | collapse: collapse, |
||
8641 | lookupMenu: lookupMenu, |
||
8642 | lookupItem: lookupItem, |
||
8643 | otherMenus: otherMenus, |
||
8644 | getPrimary: getPrimary, |
||
8645 | getMenus: getMenus, |
||
8646 | clear: clear, |
||
8647 | isClear: isClear, |
||
8648 | getTriggeringPath: getTriggeringPath |
||
8649 | }; |
||
8650 | }; |
||
8651 | var extractPreparedMenu = function (prep) { |
||
8652 | return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none(); |
||
8653 | }; |
||
8654 | var LayeredState = { |
||
637 | daniel-mar | 8655 | init: init$2, |
597 | daniel-mar | 8656 | extractPreparedMenu: extractPreparedMenu |
8657 | }; |
||
8658 | |||
637 | daniel-mar | 8659 | var make$1 = function (detail, _rawUiSpec) { |
8660 | var submenuParentItems = value(); |
||
597 | daniel-mar | 8661 | var buildMenus = function (container, primaryName, menus) { |
8662 | return map$1(menus, function (spec, name) { |
||
8663 | var makeSketch = function () { |
||
8664 | return Menu.sketch(__assign(__assign({}, spec), { |
||
8665 | value: name, |
||
8666 | markers: detail.markers, |
||
8667 | fakeFocus: detail.fakeFocus, |
||
8668 | onHighlight: detail.onHighlight, |
||
637 | daniel-mar | 8669 | focusManager: detail.fakeFocus ? highlights() : dom$2() |
597 | daniel-mar | 8670 | })); |
8671 | }; |
||
8672 | return name === primaryName ? { |
||
8673 | type: 'prepared', |
||
8674 | menu: container.getSystem().build(makeSketch()) |
||
8675 | } : { |
||
8676 | type: 'notbuilt', |
||
8677 | nbMenu: makeSketch |
||
8678 | }; |
||
8679 | }); |
||
8680 | }; |
||
8681 | var layeredState = LayeredState.init(); |
||
8682 | var setup = function (container) { |
||
8683 | var componentMap = buildMenus(container, detail.data.primary, detail.data.menus); |
||
8684 | var directory = toDirectory(); |
||
8685 | layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory); |
||
8686 | return layeredState.getPrimary(); |
||
8687 | }; |
||
8688 | var getItemValue = function (item) { |
||
8689 | return Representing.getValue(item).value; |
||
8690 | }; |
||
8691 | var getItemByValue = function (_container, menus, itemValue) { |
||
8692 | return findMap(menus, function (menu) { |
||
8693 | if (!menu.getSystem().isConnected()) { |
||
8694 | return Optional.none(); |
||
8695 | } |
||
8696 | var candidates = Highlighting.getCandidates(menu); |
||
637 | daniel-mar | 8697 | return find$2(candidates, function (c) { |
597 | daniel-mar | 8698 | return getItemValue(c) === itemValue; |
8699 | }); |
||
8700 | }); |
||
8701 | }; |
||
8702 | var toDirectory = function (_container) { |
||
8703 | return map$1(detail.data.menus, function (data, _menuName) { |
||
637 | daniel-mar | 8704 | return bind$3(data.items, function (item) { |
597 | daniel-mar | 8705 | return item.type === 'separator' ? [] : [item.data.value]; |
8706 | }); |
||
8707 | }); |
||
8708 | }; |
||
8709 | var setActiveMenu = function (container, menu) { |
||
8710 | Highlighting.highlight(container, menu); |
||
8711 | Highlighting.getHighlighted(menu).orThunk(function () { |
||
8712 | return Highlighting.getFirst(menu); |
||
8713 | }).each(function (item) { |
||
8714 | dispatch(container, item.element, focusItem()); |
||
8715 | }); |
||
8716 | }; |
||
8717 | var getMenus = function (state, menuValues) { |
||
637 | daniel-mar | 8718 | return cat(map$2(menuValues, function (mv) { |
597 | daniel-mar | 8719 | return state.lookupMenu(mv).bind(function (prep) { |
8720 | return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none(); |
||
8721 | }); |
||
8722 | })); |
||
8723 | }; |
||
8724 | var closeOthers = function (container, state, path) { |
||
8725 | var others = getMenus(state, state.otherMenus(path)); |
||
637 | daniel-mar | 8726 | each$1(others, function (o) { |
8727 | remove$1(o.element, [detail.markers.backgroundMenu]); |
||
597 | daniel-mar | 8728 | if (!detail.stayInDom) { |
8729 | Replacing.remove(container, o); |
||
8730 | } |
||
8731 | }); |
||
8732 | }; |
||
8733 | var getSubmenuParents = function (container) { |
||
8734 | return submenuParentItems.get().getOrThunk(function () { |
||
8735 | var r = {}; |
||
8736 | var items = descendants(container.element, '.' + detail.markers.item); |
||
637 | daniel-mar | 8737 | var parentItems = filter$2(items, function (i) { |
8738 | return get$b(i, 'aria-haspopup') === 'true'; |
||
597 | daniel-mar | 8739 | }); |
637 | daniel-mar | 8740 | each$1(parentItems, function (i) { |
597 | daniel-mar | 8741 | container.getSystem().getByDom(i).each(function (itemComp) { |
8742 | var key = getItemValue(itemComp); |
||
8743 | r[key] = itemComp; |
||
8744 | }); |
||
8745 | }); |
||
637 | daniel-mar | 8746 | submenuParentItems.set(r); |
597 | daniel-mar | 8747 | return r; |
8748 | }); |
||
8749 | }; |
||
8750 | var updateAriaExpansions = function (container, path) { |
||
8751 | var parentItems = getSubmenuParents(container); |
||
637 | daniel-mar | 8752 | each(parentItems, function (v, k) { |
8753 | var expanded = contains$1(path, k); |
||
8754 | set$8(v.element, 'aria-expanded', expanded); |
||
597 | daniel-mar | 8755 | }); |
8756 | }; |
||
8757 | var updateMenuPath = function (container, state, path) { |
||
8758 | return Optional.from(path[0]).bind(function (latestMenuName) { |
||
8759 | return state.lookupMenu(latestMenuName).bind(function (menuPrep) { |
||
8760 | if (menuPrep.type === 'notbuilt') { |
||
8761 | return Optional.none(); |
||
8762 | } else { |
||
8763 | var activeMenu = menuPrep.menu; |
||
8764 | var rest = getMenus(state, path.slice(1)); |
||
637 | daniel-mar | 8765 | each$1(rest, function (r) { |
8766 | add$1(r.element, detail.markers.backgroundMenu); |
||
597 | daniel-mar | 8767 | }); |
8768 | if (!inBody(activeMenu.element)) { |
||
637 | daniel-mar | 8769 | Replacing.append(container, premade(activeMenu)); |
597 | daniel-mar | 8770 | } |
637 | daniel-mar | 8771 | remove$1(activeMenu.element, [detail.markers.backgroundMenu]); |
597 | daniel-mar | 8772 | setActiveMenu(container, activeMenu); |
8773 | closeOthers(container, state, path); |
||
8774 | return Optional.some(activeMenu); |
||
8775 | } |
||
8776 | }); |
||
8777 | }); |
||
8778 | }; |
||
8779 | var ExpandHighlightDecision; |
||
8780 | (function (ExpandHighlightDecision) { |
||
8781 | ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu'; |
||
8782 | ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent'; |
||
8783 | }(ExpandHighlightDecision || (ExpandHighlightDecision = {}))); |
||
8784 | var buildIfRequired = function (container, menuName, menuPrep) { |
||
8785 | if (menuPrep.type === 'notbuilt') { |
||
8786 | var menu = container.getSystem().build(menuPrep.nbMenu()); |
||
8787 | layeredState.setMenuBuilt(menuName, menu); |
||
8788 | return menu; |
||
8789 | } else { |
||
8790 | return menuPrep.menu; |
||
8791 | } |
||
8792 | }; |
||
8793 | var expandRight = function (container, item, decision) { |
||
8794 | if (decision === void 0) { |
||
8795 | decision = ExpandHighlightDecision.HighlightSubmenu; |
||
8796 | } |
||
637 | daniel-mar | 8797 | if (item.hasConfigured(Disabling) && Disabling.isDisabled(item)) { |
8798 | return Optional.some(item); |
||
8799 | } else { |
||
8800 | var value = getItemValue(item); |
||
8801 | return layeredState.expand(value).bind(function (path) { |
||
8802 | updateAriaExpansions(container, path); |
||
8803 | return Optional.from(path[0]).bind(function (menuName) { |
||
8804 | return layeredState.lookupMenu(menuName).bind(function (activeMenuPrep) { |
||
8805 | var activeMenu = buildIfRequired(container, menuName, activeMenuPrep); |
||
8806 | if (!inBody(activeMenu.element)) { |
||
8807 | Replacing.append(container, premade(activeMenu)); |
||
8808 | } |
||
8809 | detail.onOpenSubmenu(container, item, activeMenu, reverse(path)); |
||
8810 | if (decision === ExpandHighlightDecision.HighlightSubmenu) { |
||
8811 | Highlighting.highlightFirst(activeMenu); |
||
8812 | return updateMenuPath(container, layeredState, path); |
||
8813 | } else { |
||
8814 | Highlighting.dehighlightAll(activeMenu); |
||
8815 | return Optional.some(item); |
||
8816 | } |
||
8817 | }); |
||
597 | daniel-mar | 8818 | }); |
8819 | }); |
||
637 | daniel-mar | 8820 | } |
597 | daniel-mar | 8821 | }; |
8822 | var collapseLeft = function (container, item) { |
||
8823 | var value = getItemValue(item); |
||
8824 | return layeredState.collapse(value).bind(function (path) { |
||
8825 | updateAriaExpansions(container, path); |
||
8826 | return updateMenuPath(container, layeredState, path).map(function (activeMenu) { |
||
8827 | detail.onCollapseMenu(container, item, activeMenu); |
||
8828 | return activeMenu; |
||
8829 | }); |
||
8830 | }); |
||
8831 | }; |
||
8832 | var updateView = function (container, item) { |
||
8833 | var value = getItemValue(item); |
||
8834 | return layeredState.refresh(value).bind(function (path) { |
||
8835 | updateAriaExpansions(container, path); |
||
8836 | return updateMenuPath(container, layeredState, path); |
||
8837 | }); |
||
8838 | }; |
||
8839 | var onRight = function (container, item) { |
||
8840 | return inside(item.element) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu); |
||
8841 | }; |
||
8842 | var onLeft = function (container, item) { |
||
8843 | return inside(item.element) ? Optional.none() : collapseLeft(container, item); |
||
8844 | }; |
||
8845 | var onEscape = function (container, item) { |
||
8846 | return collapseLeft(container, item).orThunk(function () { |
||
8847 | return detail.onEscape(container, item).map(function () { |
||
8848 | return container; |
||
8849 | }); |
||
8850 | }); |
||
8851 | }; |
||
8852 | var keyOnItem = function (f) { |
||
8853 | return function (container, simulatedEvent) { |
||
637 | daniel-mar | 8854 | return closest$1(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) { |
597 | daniel-mar | 8855 | return container.getSystem().getByDom(target).toOptional().bind(function (item) { |
8856 | return f(container, item).map(always); |
||
8857 | }); |
||
8858 | }); |
||
8859 | }; |
||
8860 | }; |
||
637 | daniel-mar | 8861 | var events = derive$3([ |
8862 | run(focus(), function (sandbox, simulatedEvent) { |
||
597 | daniel-mar | 8863 | var item = simulatedEvent.event.item; |
8864 | layeredState.lookupItem(getItemValue(item)).each(function () { |
||
8865 | var menu = simulatedEvent.event.menu; |
||
8866 | Highlighting.highlight(sandbox, menu); |
||
8867 | var value = getItemValue(simulatedEvent.event.item); |
||
8868 | layeredState.refresh(value).each(function (path) { |
||
8869 | return closeOthers(sandbox, layeredState, path); |
||
8870 | }); |
||
8871 | }); |
||
8872 | }), |
||
8873 | runOnExecute(function (component, simulatedEvent) { |
||
8874 | var target = simulatedEvent.event.target; |
||
8875 | component.getSystem().getByDom(target).each(function (item) { |
||
8876 | var itemValue = getItemValue(item); |
||
8877 | if (itemValue.indexOf('collapse-item') === 0) { |
||
8878 | collapseLeft(component, item); |
||
8879 | } |
||
8880 | expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(function () { |
||
8881 | detail.onExecute(component, item); |
||
8882 | }, noop); |
||
8883 | }); |
||
8884 | }), |
||
8885 | runOnAttached(function (container, _simulatedEvent) { |
||
8886 | setup(container).each(function (primary) { |
||
637 | daniel-mar | 8887 | Replacing.append(container, premade(primary)); |
597 | daniel-mar | 8888 | detail.onOpenMenu(container, primary); |
8889 | if (detail.highlightImmediately) { |
||
8890 | setActiveMenu(container, primary); |
||
8891 | } |
||
8892 | }); |
||
8893 | }) |
||
8894 | ].concat(detail.navigateOnHover ? [run(hover(), function (sandbox, simulatedEvent) { |
||
8895 | var item = simulatedEvent.event.item; |
||
8896 | updateView(sandbox, item); |
||
8897 | expandRight(sandbox, item, ExpandHighlightDecision.HighlightParent); |
||
8898 | detail.onHover(sandbox, item); |
||
8899 | })] : [])); |
||
8900 | var getActiveItem = function (container) { |
||
8901 | return Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted); |
||
8902 | }; |
||
8903 | var collapseMenuApi = function (container) { |
||
8904 | getActiveItem(container).each(function (currentItem) { |
||
8905 | collapseLeft(container, currentItem); |
||
8906 | }); |
||
8907 | }; |
||
8908 | var highlightPrimary = function (container) { |
||
8909 | layeredState.getPrimary().each(function (primary) { |
||
8910 | setActiveMenu(container, primary); |
||
8911 | }); |
||
8912 | }; |
||
8913 | var extractMenuFromContainer = function (container) { |
||
8914 | return Optional.from(container.components()[0]).filter(function (comp) { |
||
637 | daniel-mar | 8915 | return get$b(comp.element, 'role') === 'menu'; |
597 | daniel-mar | 8916 | }); |
8917 | }; |
||
8918 | var repositionMenus = function (container) { |
||
8919 | var maybeActivePrimary = layeredState.getPrimary().bind(function (primary) { |
||
8920 | return getActiveItem(container).bind(function (currentItem) { |
||
8921 | var itemValue = getItemValue(currentItem); |
||
8922 | var allMenus = values(layeredState.getMenus()); |
||
637 | daniel-mar | 8923 | var preparedMenus = cat(map$2(allMenus, LayeredState.extractPreparedMenu)); |
597 | daniel-mar | 8924 | return layeredState.getTriggeringPath(itemValue, function (v) { |
8925 | return getItemByValue(container, preparedMenus, v); |
||
8926 | }); |
||
8927 | }).map(function (triggeringPath) { |
||
8928 | return { |
||
8929 | primary: primary, |
||
8930 | triggeringPath: triggeringPath |
||
8931 | }; |
||
8932 | }); |
||
8933 | }); |
||
8934 | maybeActivePrimary.fold(function () { |
||
8935 | extractMenuFromContainer(container).each(function (primaryMenu) { |
||
8936 | detail.onRepositionMenu(container, primaryMenu, []); |
||
8937 | }); |
||
8938 | }, function (_a) { |
||
8939 | var primary = _a.primary, triggeringPath = _a.triggeringPath; |
||
8940 | detail.onRepositionMenu(container, primary, triggeringPath); |
||
8941 | }); |
||
8942 | }; |
||
8943 | var apis = { |
||
8944 | collapseMenu: collapseMenuApi, |
||
8945 | highlightPrimary: highlightPrimary, |
||
8946 | repositionMenus: repositionMenus |
||
8947 | }; |
||
8948 | return { |
||
8949 | uid: detail.uid, |
||
8950 | dom: detail.dom, |
||
8951 | markers: detail.markers, |
||
8952 | behaviours: augment(detail.tmenuBehaviours, [ |
||
8953 | Keying.config({ |
||
8954 | mode: 'special', |
||
8955 | onRight: keyOnItem(onRight), |
||
8956 | onLeft: keyOnItem(onLeft), |
||
8957 | onEscape: keyOnItem(onEscape), |
||
8958 | focusIn: function (container, _keyInfo) { |
||
8959 | layeredState.getPrimary().each(function (primary) { |
||
8960 | dispatch(container, primary.element, focusItem()); |
||
8961 | }); |
||
8962 | } |
||
8963 | }), |
||
8964 | Highlighting.config({ |
||
8965 | highlightClass: detail.markers.selectedMenu, |
||
8966 | itemClass: detail.markers.menu |
||
8967 | }), |
||
8968 | Composing.config({ |
||
8969 | find: function (container) { |
||
8970 | return Highlighting.getHighlighted(container); |
||
8971 | } |
||
8972 | }), |
||
8973 | Replacing.config({}) |
||
8974 | ]), |
||
8975 | eventOrder: detail.eventOrder, |
||
8976 | apis: apis, |
||
8977 | events: events |
||
8978 | }; |
||
8979 | }; |
||
637 | daniel-mar | 8980 | var collapseItem$1 = constant$1('collapse-item'); |
597 | daniel-mar | 8981 | |
8982 | var tieredData = function (primary, menus, expansions) { |
||
8983 | return { |
||
8984 | primary: primary, |
||
8985 | menus: menus, |
||
8986 | expansions: expansions |
||
8987 | }; |
||
8988 | }; |
||
8989 | var singleData = function (name, menu) { |
||
8990 | return { |
||
8991 | primary: name, |
||
637 | daniel-mar | 8992 | menus: wrap(name, menu), |
597 | daniel-mar | 8993 | expansions: {} |
8994 | }; |
||
8995 | }; |
||
637 | daniel-mar | 8996 | var collapseItem = function (text) { |
597 | daniel-mar | 8997 | return { |
637 | daniel-mar | 8998 | value: generate$4(collapseItem$1()), |
597 | daniel-mar | 8999 | meta: { text: text } |
9000 | }; |
||
9001 | }; |
||
637 | daniel-mar | 9002 | var tieredMenu = single({ |
597 | daniel-mar | 9003 | name: 'TieredMenu', |
9004 | configFields: [ |
||
9005 | onStrictKeyboardHandler('onExecute'), |
||
9006 | onStrictKeyboardHandler('onEscape'), |
||
9007 | onStrictHandler('onOpenMenu'), |
||
9008 | onStrictHandler('onOpenSubmenu'), |
||
9009 | onHandler('onRepositionMenu'), |
||
9010 | onHandler('onCollapseMenu'), |
||
637 | daniel-mar | 9011 | defaulted('highlightImmediately', true), |
9012 | requiredObjOf('data', [ |
||
9013 | required$1('primary'), |
||
9014 | required$1('menus'), |
||
9015 | required$1('expansions') |
||
597 | daniel-mar | 9016 | ]), |
637 | daniel-mar | 9017 | defaulted('fakeFocus', false), |
597 | daniel-mar | 9018 | onHandler('onHighlight'), |
9019 | onHandler('onHover'), |
||
9020 | tieredMenuMarkers(), |
||
637 | daniel-mar | 9021 | required$1('dom'), |
9022 | defaulted('navigateOnHover', true), |
||
9023 | defaulted('stayInDom', false), |
||
597 | daniel-mar | 9024 | field$1('tmenuBehaviours', [ |
9025 | Keying, |
||
9026 | Highlighting, |
||
9027 | Composing, |
||
9028 | Replacing |
||
9029 | ]), |
||
637 | daniel-mar | 9030 | defaulted('eventOrder', {}) |
597 | daniel-mar | 9031 | ], |
9032 | apis: { |
||
9033 | collapseMenu: function (apis, tmenu) { |
||
9034 | apis.collapseMenu(tmenu); |
||
9035 | }, |
||
9036 | highlightPrimary: function (apis, tmenu) { |
||
9037 | apis.highlightPrimary(tmenu); |
||
9038 | }, |
||
9039 | repositionMenus: function (apis, tmenu) { |
||
9040 | apis.repositionMenus(tmenu); |
||
9041 | } |
||
9042 | }, |
||
637 | daniel-mar | 9043 | factory: make$1, |
597 | daniel-mar | 9044 | extraApis: { |
9045 | tieredData: tieredData, |
||
9046 | singleData: singleData, |
||
637 | daniel-mar | 9047 | collapseItem: collapseItem |
597 | daniel-mar | 9048 | } |
9049 | }); |
||
9050 | |||
9051 | var findRoute = function (component, transConfig, transState, route) { |
||
637 | daniel-mar | 9052 | return get$c(transConfig.routes, route.start).bind(function (sConfig) { |
9053 | return get$c(sConfig, route.destination); |
||
597 | daniel-mar | 9054 | }); |
9055 | }; |
||
9056 | var getTransition = function (comp, transConfig, transState) { |
||
9057 | var route = getCurrentRoute(comp, transConfig); |
||
9058 | return route.bind(function (r) { |
||
9059 | return getTransitionOf(comp, transConfig, transState, r); |
||
9060 | }); |
||
9061 | }; |
||
9062 | var getTransitionOf = function (comp, transConfig, transState, route) { |
||
9063 | return findRoute(comp, transConfig, transState, route).bind(function (r) { |
||
9064 | return r.transition.map(function (t) { |
||
9065 | return { |
||
9066 | transition: t, |
||
9067 | route: r |
||
9068 | }; |
||
9069 | }); |
||
9070 | }); |
||
9071 | }; |
||
9072 | var disableTransition = function (comp, transConfig, transState) { |
||
9073 | getTransition(comp, transConfig, transState).each(function (routeTransition) { |
||
9074 | var t = routeTransition.transition; |
||
637 | daniel-mar | 9075 | remove$3(comp.element, t.transitionClass); |
9076 | remove$6(comp.element, transConfig.destinationAttr); |
||
597 | daniel-mar | 9077 | }); |
9078 | }; |
||
9079 | var getNewRoute = function (comp, transConfig, transState, destination) { |
||
9080 | return { |
||
637 | daniel-mar | 9081 | start: get$b(comp.element, transConfig.stateAttr), |
597 | daniel-mar | 9082 | destination: destination |
9083 | }; |
||
9084 | }; |
||
9085 | var getCurrentRoute = function (comp, transConfig, _transState) { |
||
9086 | var el = comp.element; |
||
9087 | return getOpt(el, transConfig.destinationAttr).map(function (destination) { |
||
9088 | return { |
||
637 | daniel-mar | 9089 | start: get$b(comp.element, transConfig.stateAttr), |
597 | daniel-mar | 9090 | destination: destination |
9091 | }; |
||
9092 | }); |
||
9093 | }; |
||
9094 | var jumpTo = function (comp, transConfig, transState, destination) { |
||
9095 | disableTransition(comp, transConfig, transState); |
||
637 | daniel-mar | 9096 | if (has$1(comp.element, transConfig.stateAttr) && get$b(comp.element, transConfig.stateAttr) !== destination) { |
597 | daniel-mar | 9097 | transConfig.onFinish(comp, destination); |
9098 | } |
||
637 | daniel-mar | 9099 | set$8(comp.element, transConfig.stateAttr, destination); |
597 | daniel-mar | 9100 | }; |
9101 | var fasttrack = function (comp, transConfig, _transState, _destination) { |
||
9102 | if (has$1(comp.element, transConfig.destinationAttr)) { |
||
9103 | getOpt(comp.element, transConfig.destinationAttr).each(function (destination) { |
||
637 | daniel-mar | 9104 | set$8(comp.element, transConfig.stateAttr, destination); |
597 | daniel-mar | 9105 | }); |
637 | daniel-mar | 9106 | remove$6(comp.element, transConfig.destinationAttr); |
597 | daniel-mar | 9107 | } |
9108 | }; |
||
9109 | var progressTo = function (comp, transConfig, transState, destination) { |
||
9110 | fasttrack(comp, transConfig); |
||
9111 | var route = getNewRoute(comp, transConfig, transState, destination); |
||
9112 | getTransitionOf(comp, transConfig, transState, route).fold(function () { |
||
9113 | jumpTo(comp, transConfig, transState, destination); |
||
9114 | }, function (routeTransition) { |
||
9115 | disableTransition(comp, transConfig, transState); |
||
9116 | var t = routeTransition.transition; |
||
637 | daniel-mar | 9117 | add$1(comp.element, t.transitionClass); |
9118 | set$8(comp.element, transConfig.destinationAttr, destination); |
||
597 | daniel-mar | 9119 | }); |
9120 | }; |
||
637 | daniel-mar | 9121 | var getState = function (comp, transConfig, _transState) { |
597 | daniel-mar | 9122 | return getOpt(comp.element, transConfig.stateAttr); |
9123 | }; |
||
9124 | |||
9125 | var TransitionApis = /*#__PURE__*/Object.freeze({ |
||
9126 | __proto__: null, |
||
9127 | findRoute: findRoute, |
||
9128 | disableTransition: disableTransition, |
||
9129 | getCurrentRoute: getCurrentRoute, |
||
9130 | jumpTo: jumpTo, |
||
9131 | progressTo: progressTo, |
||
637 | daniel-mar | 9132 | getState: getState |
597 | daniel-mar | 9133 | }); |
9134 | |||
637 | daniel-mar | 9135 | var events$1 = function (transConfig, transState) { |
9136 | return derive$3([ |
||
597 | daniel-mar | 9137 | run(transitionend(), function (component, simulatedEvent) { |
9138 | var raw = simulatedEvent.event.raw; |
||
9139 | getCurrentRoute(component, transConfig).each(function (route) { |
||
9140 | findRoute(component, transConfig, transState, route).each(function (rInfo) { |
||
9141 | rInfo.transition.each(function (rTransition) { |
||
9142 | if (raw.propertyName === rTransition.property) { |
||
9143 | jumpTo(component, transConfig, transState, route.destination); |
||
9144 | transConfig.onTransition(component, route); |
||
9145 | } |
||
9146 | }); |
||
9147 | }); |
||
9148 | }); |
||
9149 | }), |
||
9150 | runOnAttached(function (comp, _se) { |
||
9151 | jumpTo(comp, transConfig, transState, transConfig.initialState); |
||
9152 | }) |
||
9153 | ]); |
||
9154 | }; |
||
9155 | |||
9156 | var ActiveTransitioning = /*#__PURE__*/Object.freeze({ |
||
9157 | __proto__: null, |
||
637 | daniel-mar | 9158 | events: events$1 |
597 | daniel-mar | 9159 | }); |
9160 | |||
9161 | var TransitionSchema = [ |
||
637 | daniel-mar | 9162 | defaulted('destinationAttr', 'data-transitioning-destination'), |
9163 | defaulted('stateAttr', 'data-transitioning-state'), |
||
9164 | required$1('initialState'), |
||
597 | daniel-mar | 9165 | onHandler('onTransition'), |
9166 | onHandler('onFinish'), |
||
637 | daniel-mar | 9167 | requiredOf('routes', setOf(Result.value, setOf(Result.value, objOfOnly([optionObjOfOnly('transition', [ |
9168 | required$1('property'), |
||
9169 | required$1('transitionClass') |
||
597 | daniel-mar | 9170 | ])])))) |
9171 | ]; |
||
9172 | |||
9173 | var createRoutes = function (routes) { |
||
9174 | var r = {}; |
||
637 | daniel-mar | 9175 | each(routes, function (v, k) { |
597 | daniel-mar | 9176 | var waypoints = k.split('<->'); |
637 | daniel-mar | 9177 | r[waypoints[0]] = wrap(waypoints[1], v); |
9178 | r[waypoints[1]] = wrap(waypoints[0], v); |
||
597 | daniel-mar | 9179 | }); |
9180 | return r; |
||
9181 | }; |
||
9182 | var createBistate = function (first, second, transitions) { |
||
637 | daniel-mar | 9183 | return wrapAll([ |
597 | daniel-mar | 9184 | { |
9185 | key: first, |
||
637 | daniel-mar | 9186 | value: wrap(second, transitions) |
597 | daniel-mar | 9187 | }, |
9188 | { |
||
9189 | key: second, |
||
637 | daniel-mar | 9190 | value: wrap(first, transitions) |
597 | daniel-mar | 9191 | } |
9192 | ]); |
||
9193 | }; |
||
9194 | var createTristate = function (first, second, third, transitions) { |
||
637 | daniel-mar | 9195 | return wrapAll([ |
597 | daniel-mar | 9196 | { |
9197 | key: first, |
||
637 | daniel-mar | 9198 | value: wrapAll([ |
597 | daniel-mar | 9199 | { |
9200 | key: second, |
||
9201 | value: transitions |
||
9202 | }, |
||
9203 | { |
||
9204 | key: third, |
||
9205 | value: transitions |
||
9206 | } |
||
9207 | ]) |
||
9208 | }, |
||
9209 | { |
||
9210 | key: second, |
||
637 | daniel-mar | 9211 | value: wrapAll([ |
597 | daniel-mar | 9212 | { |
9213 | key: first, |
||
9214 | value: transitions |
||
9215 | }, |
||
9216 | { |
||
9217 | key: third, |
||
9218 | value: transitions |
||
9219 | } |
||
9220 | ]) |
||
9221 | }, |
||
9222 | { |
||
9223 | key: third, |
||
637 | daniel-mar | 9224 | value: wrapAll([ |
597 | daniel-mar | 9225 | { |
9226 | key: first, |
||
9227 | value: transitions |
||
9228 | }, |
||
9229 | { |
||
9230 | key: second, |
||
9231 | value: transitions |
||
9232 | } |
||
9233 | ]) |
||
9234 | } |
||
9235 | ]); |
||
9236 | }; |
||
637 | daniel-mar | 9237 | var Transitioning = create$5({ |
597 | daniel-mar | 9238 | fields: TransitionSchema, |
9239 | name: 'transitioning', |
||
9240 | active: ActiveTransitioning, |
||
9241 | apis: TransitionApis, |
||
9242 | extra: { |
||
9243 | createRoutes: createRoutes, |
||
9244 | createBistate: createBistate, |
||
9245 | createTristate: createTristate |
||
9246 | } |
||
9247 | }); |
||
9248 | |||
9249 | var scrollableStyle = resolve('scrollable'); |
||
637 | daniel-mar | 9250 | var register$2 = function (element) { |
9251 | add$1(element, scrollableStyle); |
||
597 | daniel-mar | 9252 | }; |
9253 | var deregister = function (element) { |
||
637 | daniel-mar | 9254 | remove$3(element, scrollableStyle); |
597 | daniel-mar | 9255 | }; |
9256 | var scrollable = scrollableStyle; |
||
9257 | |||
637 | daniel-mar | 9258 | var getValue = function (item) { |
9259 | return get$c(item, 'format').getOr(item.title); |
||
597 | daniel-mar | 9260 | }; |
637 | daniel-mar | 9261 | var convert = function (formats, memMenuThunk) { |
9262 | var mainMenu = makeMenu('Styles', [].concat(map$2(formats.items, function (k) { |
||
9263 | return makeItem(getValue(k), k.title, k.isSelected(), k.getPreview(), hasNonNullableKey(formats.expansions, getValue(k))); |
||
597 | daniel-mar | 9264 | })), memMenuThunk, false); |
9265 | var submenus = map$1(formats.menus, function (menuItems, menuName) { |
||
637 | daniel-mar | 9266 | var items = map$2(menuItems, function (item) { |
9267 | return makeItem(getValue(item), item.title, item.isSelected !== undefined ? item.isSelected() : false, item.getPreview !== undefined ? item.getPreview() : '', hasNonNullableKey(formats.expansions, getValue(item))); |
||
597 | daniel-mar | 9268 | }); |
9269 | return makeMenu(menuName, items, memMenuThunk, true); |
||
9270 | }); |
||
637 | daniel-mar | 9271 | var menus = deepMerge(submenus, wrap('styles', mainMenu)); |
597 | daniel-mar | 9272 | var tmenu = tieredMenu.tieredData('styles', menus, formats.expansions); |
9273 | return { tmenu: tmenu }; |
||
9274 | }; |
||
9275 | var makeItem = function (value, text, selected, preview, isMenu) { |
||
9276 | return { |
||
9277 | data: { |
||
9278 | value: value, |
||
9279 | text: text |
||
9280 | }, |
||
9281 | type: 'item', |
||
9282 | dom: { |
||
9283 | tag: 'div', |
||
9284 | classes: isMenu ? [resolve('styles-item-is-menu')] : [] |
||
9285 | }, |
||
9286 | toggling: { |
||
9287 | toggleOnExecute: false, |
||
9288 | toggleClass: resolve('format-matches'), |
||
9289 | selected: selected |
||
9290 | }, |
||
637 | daniel-mar | 9291 | itemBehaviours: derive$2(isMenu ? [] : [format(value, function (comp, status) { |
597 | daniel-mar | 9292 | var toggle = status ? Toggling.on : Toggling.off; |
9293 | toggle(comp); |
||
9294 | })]), |
||
9295 | components: [{ |
||
9296 | dom: { |
||
9297 | tag: 'div', |
||
9298 | attributes: { style: preview }, |
||
9299 | innerHtml: text |
||
9300 | } |
||
9301 | }] |
||
9302 | }; |
||
9303 | }; |
||
9304 | var makeMenu = function (value, items, memMenuThunk, collapsable) { |
||
9305 | return { |
||
9306 | value: value, |
||
9307 | dom: { tag: 'div' }, |
||
9308 | components: [ |
||
9309 | Button.sketch({ |
||
9310 | dom: { |
||
9311 | tag: 'div', |
||
9312 | classes: [resolve('styles-collapser')] |
||
9313 | }, |
||
9314 | components: collapsable ? [ |
||
9315 | { |
||
9316 | dom: { |
||
9317 | tag: 'span', |
||
9318 | classes: [resolve('styles-collapse-icon')] |
||
9319 | } |
||
9320 | }, |
||
9321 | text(value) |
||
9322 | ] : [text(value)], |
||
9323 | action: function (item) { |
||
9324 | if (collapsable) { |
||
9325 | var comp = memMenuThunk().get(item); |
||
9326 | tieredMenu.collapseMenu(comp); |
||
9327 | } |
||
9328 | } |
||
9329 | }), |
||
9330 | { |
||
9331 | dom: { |
||
9332 | tag: 'div', |
||
9333 | classes: [resolve('styles-menu-items-container')] |
||
9334 | }, |
||
9335 | components: [Menu.parts.items({})], |
||
637 | daniel-mar | 9336 | behaviours: derive$2([config('adhoc-scrollable-menu', [ |
597 | daniel-mar | 9337 | runOnAttached(function (component, _simulatedEvent) { |
637 | daniel-mar | 9338 | set$5(component.element, 'overflow-y', 'auto'); |
9339 | set$5(component.element, '-webkit-overflow-scrolling', 'touch'); |
||
9340 | register$2(component.element); |
||
597 | daniel-mar | 9341 | }), |
9342 | runOnDetached(function (component) { |
||
637 | daniel-mar | 9343 | remove$2(component.element, 'overflow-y'); |
9344 | remove$2(component.element, '-webkit-overflow-scrolling'); |
||
597 | daniel-mar | 9345 | deregister(component.element); |
9346 | }) |
||
9347 | ])]) |
||
9348 | } |
||
9349 | ], |
||
9350 | items: items, |
||
637 | daniel-mar | 9351 | menuBehaviours: derive$2([Transitioning.config({ |
597 | daniel-mar | 9352 | initialState: 'after', |
9353 | routes: Transitioning.createTristate('before', 'current', 'after', { |
||
9354 | transition: { |
||
9355 | property: 'transform', |
||
9356 | transitionClass: 'transitioning' |
||
9357 | } |
||
9358 | }) |
||
9359 | })]) |
||
9360 | }; |
||
9361 | }; |
||
637 | daniel-mar | 9362 | var sketch$1 = function (settings) { |
9363 | var dataset = convert(settings.formats, function () { |
||
597 | daniel-mar | 9364 | return memMenu; |
9365 | }); |
||
9366 | var memMenu = record(tieredMenu.sketch({ |
||
9367 | dom: { |
||
9368 | tag: 'div', |
||
9369 | classes: [resolve('styles-menu')] |
||
9370 | }, |
||
9371 | components: [], |
||
9372 | fakeFocus: true, |
||
9373 | stayInDom: true, |
||
9374 | onExecute: function (_tmenu, item) { |
||
9375 | var v = Representing.getValue(item); |
||
9376 | settings.handle(item, v.value); |
||
9377 | return Optional.none(); |
||
9378 | }, |
||
9379 | onEscape: function () { |
||
9380 | return Optional.none(); |
||
9381 | }, |
||
9382 | onOpenMenu: function (container, menu) { |
||
637 | daniel-mar | 9383 | var w = get$5(container.element); |
597 | daniel-mar | 9384 | set$4(menu.element, w); |
9385 | Transitioning.jumpTo(menu, 'current'); |
||
9386 | }, |
||
9387 | onOpenSubmenu: function (container, item, submenu) { |
||
637 | daniel-mar | 9388 | var w = get$5(container.element); |
9389 | var menu = ancestor(item.element, '[role="menu"]').getOrDie('hacky'); |
||
597 | daniel-mar | 9390 | var menuComp = container.getSystem().getByDom(menu).getOrDie(); |
9391 | set$4(submenu.element, w); |
||
9392 | Transitioning.progressTo(menuComp, 'before'); |
||
9393 | Transitioning.jumpTo(submenu, 'after'); |
||
9394 | Transitioning.progressTo(submenu, 'current'); |
||
9395 | }, |
||
9396 | onCollapseMenu: function (container, item, menu) { |
||
637 | daniel-mar | 9397 | var submenu = ancestor(item.element, '[role="menu"]').getOrDie('hacky'); |
597 | daniel-mar | 9398 | var submenuComp = container.getSystem().getByDom(submenu).getOrDie(); |
9399 | Transitioning.progressTo(submenuComp, 'after'); |
||
9400 | Transitioning.progressTo(menu, 'current'); |
||
9401 | }, |
||
9402 | navigateOnHover: false, |
||
9403 | highlightImmediately: true, |
||
9404 | data: dataset.tmenu, |
||
9405 | markers: { |
||
9406 | backgroundMenu: resolve('styles-background-menu'), |
||
9407 | menu: resolve('styles-menu'), |
||
9408 | selectedMenu: resolve('styles-selected-menu'), |
||
9409 | item: resolve('styles-item'), |
||
9410 | selectedItem: resolve('styles-selected-item') |
||
9411 | } |
||
9412 | })); |
||
9413 | return memMenu.asSpec(); |
||
9414 | }; |
||
9415 | |||
9416 | var getFromExpandingItem = function (item) { |
||
637 | daniel-mar | 9417 | var newItem = deepMerge(exclude(item, ['items']), { menu: true }); |
597 | daniel-mar | 9418 | var rest = expand(item.items); |
637 | daniel-mar | 9419 | var newMenus = deepMerge(rest.menus, wrap(item.title, rest.items)); |
9420 | var newExpansions = deepMerge(rest.expansions, wrap(item.title, item.title)); |
||
597 | daniel-mar | 9421 | return { |
9422 | item: newItem, |
||
9423 | menus: newMenus, |
||
9424 | expansions: newExpansions |
||
9425 | }; |
||
9426 | }; |
||
9427 | var getFromItem = function (item) { |
||
9428 | return hasNonNullableKey(item, 'items') ? getFromExpandingItem(item) : { |
||
9429 | item: item, |
||
9430 | menus: {}, |
||
9431 | expansions: {} |
||
9432 | }; |
||
9433 | }; |
||
9434 | var expand = function (items) { |
||
9435 | return foldr(items, function (acc, item) { |
||
9436 | var newData = getFromItem(item); |
||
9437 | return { |
||
9438 | menus: deepMerge(acc.menus, newData.menus), |
||
9439 | items: [newData.item].concat(acc.items), |
||
9440 | expansions: deepMerge(acc.expansions, newData.expansions) |
||
9441 | }; |
||
9442 | }, { |
||
9443 | menus: {}, |
||
9444 | expansions: {}, |
||
9445 | items: [] |
||
9446 | }); |
||
9447 | }; |
||
9448 | |||
9449 | var register$1 = function (editor) { |
||
9450 | var isSelectedFor = function (format) { |
||
9451 | return function () { |
||
9452 | return editor.formatter.match(format); |
||
9453 | }; |
||
9454 | }; |
||
9455 | var getPreview = function (format) { |
||
9456 | return function () { |
||
9457 | return editor.formatter.getCssText(format); |
||
9458 | }; |
||
9459 | }; |
||
9460 | var enrichSupported = function (item) { |
||
9461 | return deepMerge(item, { |
||
9462 | isSelected: isSelectedFor(item.format), |
||
9463 | getPreview: getPreview(item.format) |
||
9464 | }); |
||
9465 | }; |
||
9466 | var enrichMenu = function (item) { |
||
9467 | return deepMerge(item, { |
||
9468 | isSelected: never, |
||
637 | daniel-mar | 9469 | getPreview: constant$1('') |
597 | daniel-mar | 9470 | }); |
9471 | }; |
||
9472 | var enrichCustom = function (item) { |
||
637 | daniel-mar | 9473 | var formatName = generate$4(item.title); |
597 | daniel-mar | 9474 | var newItem = deepMerge(item, { |
9475 | format: formatName, |
||
9476 | isSelected: isSelectedFor(formatName), |
||
9477 | getPreview: getPreview(formatName) |
||
9478 | }); |
||
9479 | editor.formatter.register(formatName, newItem); |
||
9480 | return newItem; |
||
9481 | }; |
||
9482 | var doEnrich = function (items) { |
||
637 | daniel-mar | 9483 | return map$2(items, function (item) { |
597 | daniel-mar | 9484 | if (hasNonNullableKey(item, 'items')) { |
9485 | var newItems = doEnrich(item.items); |
||
9486 | return deepMerge(enrichMenu(item), { items: newItems }); |
||
9487 | } else if (hasNonNullableKey(item, 'format')) { |
||
9488 | return enrichSupported(item); |
||
9489 | } else { |
||
9490 | return enrichCustom(item); |
||
9491 | } |
||
9492 | }); |
||
9493 | }; |
||
9494 | return doEnrich(getStyleFormats(editor)); |
||
9495 | }; |
||
9496 | var prune = function (editor, formats) { |
||
9497 | var doPrune = function (items) { |
||
637 | daniel-mar | 9498 | return bind$3(items, function (item) { |
597 | daniel-mar | 9499 | if (item.items !== undefined) { |
9500 | var newItems = doPrune(item.items); |
||
9501 | return newItems.length > 0 ? [item] : []; |
||
9502 | } else { |
||
9503 | var keep = hasNonNullableKey(item, 'format') ? editor.formatter.canApply(item.format) : true; |
||
9504 | return keep ? [item] : []; |
||
9505 | } |
||
9506 | }); |
||
9507 | }; |
||
9508 | var prunedItems = doPrune(formats); |
||
9509 | return expand(prunedItems); |
||
9510 | }; |
||
9511 | var ui = function (editor, formats, onDone) { |
||
9512 | var pruned = prune(editor, formats); |
||
637 | daniel-mar | 9513 | return sketch$1({ |
597 | daniel-mar | 9514 | formats: pruned, |
9515 | handle: function (item, value) { |
||
9516 | editor.undoManager.transact(function () { |
||
9517 | if (Toggling.isOn(item)) { |
||
9518 | editor.formatter.remove(value); |
||
9519 | } else { |
||
9520 | editor.formatter.apply(value); |
||
9521 | } |
||
9522 | }); |
||
9523 | onDone(); |
||
9524 | } |
||
9525 | }); |
||
9526 | }; |
||
9527 | |||
637 | daniel-mar | 9528 | var extract = function (rawToolbar) { |
597 | daniel-mar | 9529 | var toolbar = rawToolbar.replace(/\|/g, ' ').trim(); |
9530 | return toolbar.length > 0 ? toolbar.split(/\s+/) : []; |
||
9531 | }; |
||
9532 | var identifyFromArray = function (toolbar) { |
||
637 | daniel-mar | 9533 | return bind$3(toolbar, function (item) { |
9534 | return isArray(item) ? identifyFromArray(item) : extract(item); |
||
597 | daniel-mar | 9535 | }); |
9536 | }; |
||
9537 | var identify = function (editor) { |
||
9538 | var toolbar = getToolbar(editor); |
||
637 | daniel-mar | 9539 | return isArray(toolbar) ? identifyFromArray(toolbar) : extract(toolbar); |
597 | daniel-mar | 9540 | }; |
637 | daniel-mar | 9541 | var setup$3 = function (realm, editor) { |
597 | daniel-mar | 9542 | var commandSketch = function (name) { |
9543 | return function () { |
||
9544 | return forToolbarCommand(editor, name); |
||
9545 | }; |
||
9546 | }; |
||
9547 | var stateCommandSketch = function (name) { |
||
9548 | return function () { |
||
9549 | return forToolbarStateCommand(editor, name); |
||
9550 | }; |
||
9551 | }; |
||
9552 | var actionSketch = function (name, query, action) { |
||
9553 | return function () { |
||
9554 | return forToolbarStateAction(editor, name, query, action); |
||
9555 | }; |
||
9556 | }; |
||
9557 | var undo = commandSketch('undo'); |
||
9558 | var redo = commandSketch('redo'); |
||
9559 | var bold = stateCommandSketch('bold'); |
||
9560 | var italic = stateCommandSketch('italic'); |
||
9561 | var underline = stateCommandSketch('underline'); |
||
9562 | var removeformat = commandSketch('removeformat'); |
||
9563 | var link = function () { |
||
637 | daniel-mar | 9564 | return sketch$2(realm, editor); |
597 | daniel-mar | 9565 | }; |
9566 | var unlink = actionSketch('unlink', 'link', function () { |
||
9567 | editor.execCommand('unlink', null, false); |
||
9568 | }); |
||
9569 | var image = function () { |
||
637 | daniel-mar | 9570 | return sketch$5(editor); |
597 | daniel-mar | 9571 | }; |
9572 | var bullist = actionSketch('unordered-list', 'ul', function () { |
||
9573 | editor.execCommand('InsertUnorderedList', null, false); |
||
9574 | }); |
||
9575 | var numlist = actionSketch('ordered-list', 'ol', function () { |
||
9576 | editor.execCommand('InsertOrderedList', null, false); |
||
9577 | }); |
||
9578 | var fontsizeselect = function () { |
||
637 | daniel-mar | 9579 | return sketch$6(realm, editor); |
597 | daniel-mar | 9580 | }; |
9581 | var forecolor = function () { |
||
637 | daniel-mar | 9582 | return sketch$8(realm, editor); |
597 | daniel-mar | 9583 | }; |
9584 | var styleFormats = register$1(editor); |
||
9585 | var styleFormatsMenu = function () { |
||
9586 | return ui(editor, styleFormats, function () { |
||
9587 | editor.fire('scrollIntoView'); |
||
9588 | }); |
||
9589 | }; |
||
9590 | var styleselect = function () { |
||
9591 | return forToolbar('style-formats', function (button) { |
||
9592 | editor.fire('toReading'); |
||
9593 | realm.dropup.appear(styleFormatsMenu, Toggling.on, button); |
||
637 | daniel-mar | 9594 | }, derive$2([ |
597 | daniel-mar | 9595 | Toggling.config({ |
9596 | toggleClass: resolve('toolbar-button-selected'), |
||
9597 | toggleOnExecute: false, |
||
9598 | aria: { mode: 'pressed' } |
||
9599 | }), |
||
9600 | Receiving.config({ |
||
637 | daniel-mar | 9601 | channels: wrapAll([ |
9602 | receive(orientationChanged, Toggling.off), |
||
9603 | receive(dropupDismissed, Toggling.off) |
||
597 | daniel-mar | 9604 | ]) |
9605 | }) |
||
9606 | ]), editor); |
||
9607 | }; |
||
9608 | var feature = function (prereq, sketch) { |
||
9609 | return { |
||
9610 | isSupported: function () { |
||
9611 | var buttons = editor.ui.registry.getAll().buttons; |
||
9612 | return prereq.forall(function (p) { |
||
9613 | return hasNonNullableKey(buttons, p); |
||
9614 | }); |
||
9615 | }, |
||
9616 | sketch: sketch |
||
9617 | }; |
||
9618 | }; |
||
9619 | return { |
||
9620 | undo: feature(Optional.none(), undo), |
||
9621 | redo: feature(Optional.none(), redo), |
||
9622 | bold: feature(Optional.none(), bold), |
||
9623 | italic: feature(Optional.none(), italic), |
||
9624 | underline: feature(Optional.none(), underline), |
||
9625 | removeformat: feature(Optional.none(), removeformat), |
||
9626 | link: feature(Optional.none(), link), |
||
9627 | unlink: feature(Optional.none(), unlink), |
||
9628 | image: feature(Optional.none(), image), |
||
9629 | bullist: feature(Optional.some('bullist'), bullist), |
||
9630 | numlist: feature(Optional.some('numlist'), numlist), |
||
9631 | fontsizeselect: feature(Optional.none(), fontsizeselect), |
||
9632 | forecolor: feature(Optional.none(), forecolor), |
||
9633 | styleselect: feature(Optional.none(), styleselect) |
||
9634 | }; |
||
9635 | }; |
||
637 | daniel-mar | 9636 | var detect = function (editor, features) { |
597 | daniel-mar | 9637 | var itemNames = identify(editor); |
9638 | var present = {}; |
||
637 | daniel-mar | 9639 | return bind$3(itemNames, function (iName) { |
597 | daniel-mar | 9640 | var r = !hasNonNullableKey(present, iName) && hasNonNullableKey(features, iName) && features[iName].isSupported() ? [features[iName].sketch()] : []; |
9641 | present[iName] = true; |
||
9642 | return r; |
||
9643 | }); |
||
9644 | }; |
||
9645 | |||
9646 | var mkEvent = function (target, x, y, stop, prevent, kill, raw) { |
||
9647 | return { |
||
9648 | target: target, |
||
9649 | x: x, |
||
9650 | y: y, |
||
9651 | stop: stop, |
||
9652 | prevent: prevent, |
||
9653 | kill: kill, |
||
9654 | raw: raw |
||
9655 | }; |
||
9656 | }; |
||
9657 | var fromRawEvent = function (rawEvent) { |
||
9658 | var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); |
||
9659 | var stop = function () { |
||
9660 | return rawEvent.stopPropagation(); |
||
9661 | }; |
||
9662 | var prevent = function () { |
||
9663 | return rawEvent.preventDefault(); |
||
9664 | }; |
||
9665 | var kill = compose(prevent, stop); |
||
9666 | return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); |
||
9667 | }; |
||
9668 | var handle = function (filter, handler) { |
||
9669 | return function (rawEvent) { |
||
9670 | if (filter(rawEvent)) { |
||
9671 | handler(fromRawEvent(rawEvent)); |
||
9672 | } |
||
9673 | }; |
||
9674 | }; |
||
9675 | var binder = function (element, event, filter, handler, useCapture) { |
||
9676 | var wrapped = handle(filter, handler); |
||
9677 | element.dom.addEventListener(event, wrapped, useCapture); |
||
9678 | return { unbind: curry(unbind, element, event, wrapped, useCapture) }; |
||
9679 | }; |
||
637 | daniel-mar | 9680 | var bind$1 = function (element, event, filter, handler) { |
597 | daniel-mar | 9681 | return binder(element, event, filter, handler, false); |
9682 | }; |
||
637 | daniel-mar | 9683 | var capture$1 = function (element, event, filter, handler) { |
597 | daniel-mar | 9684 | return binder(element, event, filter, handler, true); |
9685 | }; |
||
9686 | var unbind = function (element, event, handler, useCapture) { |
||
9687 | element.dom.removeEventListener(event, handler, useCapture); |
||
9688 | }; |
||
9689 | |||
637 | daniel-mar | 9690 | var filter = always; |
9691 | var bind = function (element, event, handler) { |
||
9692 | return bind$1(element, event, filter, handler); |
||
597 | daniel-mar | 9693 | }; |
637 | daniel-mar | 9694 | var capture = function (element, event, handler) { |
9695 | return capture$1(element, event, filter, handler); |
||
597 | daniel-mar | 9696 | }; |
9697 | |||
637 | daniel-mar | 9698 | var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); |
597 | daniel-mar | 9699 | |
9700 | var INTERVAL = 50; |
||
9701 | var INSURANCE = 1000 / INTERVAL; |
||
637 | daniel-mar | 9702 | var get$1 = function (outerWindow) { |
597 | daniel-mar | 9703 | var isPortrait = outerWindow.matchMedia('(orientation: portrait)').matches; |
637 | daniel-mar | 9704 | return { isPortrait: constant$1(isPortrait) }; |
597 | daniel-mar | 9705 | }; |
9706 | var getActualWidth = function (outerWindow) { |
||
637 | daniel-mar | 9707 | var isIos = detect$1().os.isiOS(); |
9708 | var isPortrait = get$1(outerWindow).isPortrait(); |
||
597 | daniel-mar | 9709 | return isIos && !isPortrait ? outerWindow.screen.height : outerWindow.screen.width; |
9710 | }; |
||
9711 | var onChange = function (outerWindow, listeners) { |
||
9712 | var win = SugarElement.fromDom(outerWindow); |
||
9713 | var poller = null; |
||
9714 | var change = function () { |
||
637 | daniel-mar | 9715 | global$2.clearInterval(poller); |
9716 | var orientation = get$1(outerWindow); |
||
597 | daniel-mar | 9717 | listeners.onChange(orientation); |
9718 | onAdjustment(function () { |
||
9719 | listeners.onReady(orientation); |
||
9720 | }); |
||
9721 | }; |
||
637 | daniel-mar | 9722 | var orientationHandle = bind(win, 'orientationchange', change); |
597 | daniel-mar | 9723 | var onAdjustment = function (f) { |
637 | daniel-mar | 9724 | global$2.clearInterval(poller); |
597 | daniel-mar | 9725 | var flag = outerWindow.innerHeight; |
9726 | var insurance = 0; |
||
637 | daniel-mar | 9727 | poller = global$2.setInterval(function () { |
597 | daniel-mar | 9728 | if (flag !== outerWindow.innerHeight) { |
637 | daniel-mar | 9729 | global$2.clearInterval(poller); |
597 | daniel-mar | 9730 | f(Optional.some(outerWindow.innerHeight)); |
9731 | } else if (insurance > INSURANCE) { |
||
637 | daniel-mar | 9732 | global$2.clearInterval(poller); |
597 | daniel-mar | 9733 | f(Optional.none()); |
9734 | } |
||
9735 | insurance++; |
||
9736 | }, INTERVAL); |
||
9737 | }; |
||
9738 | var destroy = function () { |
||
9739 | orientationHandle.unbind(); |
||
9740 | }; |
||
9741 | return { |
||
9742 | onAdjustment: onAdjustment, |
||
9743 | destroy: destroy |
||
9744 | }; |
||
9745 | }; |
||
9746 | |||
9747 | var setStart = function (rng, situ) { |
||
9748 | situ.fold(function (e) { |
||
9749 | rng.setStartBefore(e.dom); |
||
9750 | }, function (e, o) { |
||
9751 | rng.setStart(e.dom, o); |
||
9752 | }, function (e) { |
||
9753 | rng.setStartAfter(e.dom); |
||
9754 | }); |
||
9755 | }; |
||
9756 | var setFinish = function (rng, situ) { |
||
9757 | situ.fold(function (e) { |
||
9758 | rng.setEndBefore(e.dom); |
||
9759 | }, function (e, o) { |
||
9760 | rng.setEnd(e.dom, o); |
||
9761 | }, function (e) { |
||
9762 | rng.setEndAfter(e.dom); |
||
9763 | }); |
||
9764 | }; |
||
9765 | var relativeToNative = function (win, startSitu, finishSitu) { |
||
9766 | var range = win.document.createRange(); |
||
9767 | setStart(range, startSitu); |
||
9768 | setFinish(range, finishSitu); |
||
9769 | return range; |
||
9770 | }; |
||
9771 | var exactToNative = function (win, start, soffset, finish, foffset) { |
||
9772 | var rng = win.document.createRange(); |
||
9773 | rng.setStart(start.dom, soffset); |
||
9774 | rng.setEnd(finish.dom, foffset); |
||
9775 | return rng; |
||
9776 | }; |
||
637 | daniel-mar | 9777 | var toRect$1 = function (rect) { |
597 | daniel-mar | 9778 | return { |
9779 | left: rect.left, |
||
9780 | top: rect.top, |
||
9781 | right: rect.right, |
||
9782 | bottom: rect.bottom, |
||
9783 | width: rect.width, |
||
9784 | height: rect.height |
||
9785 | }; |
||
9786 | }; |
||
637 | daniel-mar | 9787 | var getFirstRect$1 = function (rng) { |
597 | daniel-mar | 9788 | var rects = rng.getClientRects(); |
9789 | var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); |
||
637 | daniel-mar | 9790 | return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect$1) : Optional.none(); |
597 | daniel-mar | 9791 | }; |
9792 | |||
637 | daniel-mar | 9793 | var adt$3 = Adt.generate([ |
597 | daniel-mar | 9794 | { |
9795 | ltr: [ |
||
9796 | 'start', |
||
9797 | 'soffset', |
||
9798 | 'finish', |
||
9799 | 'foffset' |
||
9800 | ] |
||
9801 | }, |
||
9802 | { |
||
9803 | rtl: [ |
||
9804 | 'start', |
||
9805 | 'soffset', |
||
9806 | 'finish', |
||
9807 | 'foffset' |
||
9808 | ] |
||
9809 | } |
||
9810 | ]); |
||
9811 | var fromRange = function (win, type, range) { |
||
9812 | return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset); |
||
9813 | }; |
||
9814 | var getRanges = function (win, selection) { |
||
9815 | return selection.match({ |
||
9816 | domRange: function (rng) { |
||
9817 | return { |
||
637 | daniel-mar | 9818 | ltr: constant$1(rng), |
597 | daniel-mar | 9819 | rtl: Optional.none |
9820 | }; |
||
9821 | }, |
||
9822 | relative: function (startSitu, finishSitu) { |
||
9823 | return { |
||
9824 | ltr: cached(function () { |
||
9825 | return relativeToNative(win, startSitu, finishSitu); |
||
9826 | }), |
||
9827 | rtl: cached(function () { |
||
9828 | return Optional.some(relativeToNative(win, finishSitu, startSitu)); |
||
9829 | }) |
||
9830 | }; |
||
9831 | }, |
||
9832 | exact: function (start, soffset, finish, foffset) { |
||
9833 | return { |
||
9834 | ltr: cached(function () { |
||
9835 | return exactToNative(win, start, soffset, finish, foffset); |
||
9836 | }), |
||
9837 | rtl: cached(function () { |
||
9838 | return Optional.some(exactToNative(win, finish, foffset, start, soffset)); |
||
9839 | }) |
||
9840 | }; |
||
9841 | } |
||
9842 | }); |
||
9843 | }; |
||
9844 | var doDiagnose = function (win, ranges) { |
||
9845 | var rng = ranges.ltr(); |
||
9846 | if (rng.collapsed) { |
||
9847 | var reversed = ranges.rtl().filter(function (rev) { |
||
9848 | return rev.collapsed === false; |
||
9849 | }); |
||
9850 | return reversed.map(function (rev) { |
||
637 | daniel-mar | 9851 | return adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset); |
597 | daniel-mar | 9852 | }).getOrThunk(function () { |
637 | daniel-mar | 9853 | return fromRange(win, adt$3.ltr, rng); |
597 | daniel-mar | 9854 | }); |
9855 | } else { |
||
637 | daniel-mar | 9856 | return fromRange(win, adt$3.ltr, rng); |
597 | daniel-mar | 9857 | } |
9858 | }; |
||
9859 | var diagnose = function (win, selection) { |
||
9860 | var ranges = getRanges(win, selection); |
||
9861 | return doDiagnose(win, ranges); |
||
9862 | }; |
||
9863 | var asLtrRange = function (win, selection) { |
||
9864 | var diagnosis = diagnose(win, selection); |
||
9865 | return diagnosis.match({ |
||
9866 | ltr: function (start, soffset, finish, foffset) { |
||
9867 | var rng = win.document.createRange(); |
||
9868 | rng.setStart(start.dom, soffset); |
||
9869 | rng.setEnd(finish.dom, foffset); |
||
9870 | return rng; |
||
9871 | }, |
||
9872 | rtl: function (start, soffset, finish, foffset) { |
||
9873 | var rng = win.document.createRange(); |
||
9874 | rng.setStart(finish.dom, foffset); |
||
9875 | rng.setEnd(start.dom, soffset); |
||
9876 | return rng; |
||
9877 | } |
||
9878 | }); |
||
9879 | }; |
||
637 | daniel-mar | 9880 | adt$3.ltr; |
9881 | adt$3.rtl; |
||
597 | daniel-mar | 9882 | |
9883 | var create$3 = function (start, soffset, finish, foffset) { |
||
9884 | return { |
||
9885 | start: start, |
||
9886 | soffset: soffset, |
||
9887 | finish: finish, |
||
9888 | foffset: foffset |
||
9889 | }; |
||
9890 | }; |
||
9891 | var SimRange = { create: create$3 }; |
||
9892 | |||
9893 | var NodeValue = function (is, name) { |
||
9894 | var get = function (element) { |
||
9895 | if (!is(element)) { |
||
9896 | throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); |
||
9897 | } |
||
9898 | return getOption(element).getOr(''); |
||
9899 | }; |
||
9900 | var getOption = function (element) { |
||
9901 | return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none(); |
||
9902 | }; |
||
9903 | var set = function (element, value) { |
||
9904 | if (!is(element)) { |
||
9905 | throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); |
||
9906 | } |
||
9907 | element.dom.nodeValue = value; |
||
9908 | }; |
||
9909 | return { |
||
9910 | get: get, |
||
9911 | getOption: getOption, |
||
9912 | set: set |
||
9913 | }; |
||
9914 | }; |
||
9915 | |||
637 | daniel-mar | 9916 | var api = NodeValue(isText, 'text'); |
597 | daniel-mar | 9917 | var getOption = function (element) { |
637 | daniel-mar | 9918 | return api.getOption(element); |
597 | daniel-mar | 9919 | }; |
9920 | |||
9921 | var getEnd = function (element) { |
||
637 | daniel-mar | 9922 | return name$1(element) === 'img' ? 1 : getOption(element).fold(function () { |
597 | daniel-mar | 9923 | return children(element).length; |
9924 | }, function (v) { |
||
9925 | return v.length; |
||
9926 | }); |
||
9927 | }; |
||
9928 | |||
637 | daniel-mar | 9929 | var adt$2 = Adt.generate([ |
597 | daniel-mar | 9930 | { before: ['element'] }, |
9931 | { |
||
9932 | on: [ |
||
9933 | 'element', |
||
9934 | 'offset' |
||
9935 | ] |
||
9936 | }, |
||
9937 | { after: ['element'] } |
||
9938 | ]); |
||
9939 | var cata = function (subject, onBefore, onOn, onAfter) { |
||
9940 | return subject.fold(onBefore, onOn, onAfter); |
||
9941 | }; |
||
637 | daniel-mar | 9942 | var getStart$1 = function (situ) { |
597 | daniel-mar | 9943 | return situ.fold(identity, identity, identity); |
9944 | }; |
||
637 | daniel-mar | 9945 | var before = adt$2.before; |
9946 | var on = adt$2.on; |
||
9947 | var after$1 = adt$2.after; |
||
597 | daniel-mar | 9948 | var Situ = { |
637 | daniel-mar | 9949 | before: before, |
9950 | on: on, |
||
597 | daniel-mar | 9951 | after: after$1, |
9952 | cata: cata, |
||
637 | daniel-mar | 9953 | getStart: getStart$1 |
597 | daniel-mar | 9954 | }; |
9955 | |||
637 | daniel-mar | 9956 | var adt$1 = Adt.generate([ |
597 | daniel-mar | 9957 | { domRange: ['rng'] }, |
9958 | { |
||
9959 | relative: [ |
||
9960 | 'startSitu', |
||
9961 | 'finishSitu' |
||
9962 | ] |
||
9963 | }, |
||
9964 | { |
||
9965 | exact: [ |
||
9966 | 'start', |
||
9967 | 'soffset', |
||
9968 | 'finish', |
||
9969 | 'foffset' |
||
9970 | ] |
||
9971 | } |
||
9972 | ]); |
||
9973 | var exactFromRange = function (simRange) { |
||
637 | daniel-mar | 9974 | return adt$1.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset); |
597 | daniel-mar | 9975 | }; |
637 | daniel-mar | 9976 | var getStart = function (selection) { |
597 | daniel-mar | 9977 | return selection.match({ |
9978 | domRange: function (rng) { |
||
9979 | return SugarElement.fromDom(rng.startContainer); |
||
9980 | }, |
||
9981 | relative: function (startSitu, _finishSitu) { |
||
9982 | return Situ.getStart(startSitu); |
||
9983 | }, |
||
9984 | exact: function (start, _soffset, _finish, _foffset) { |
||
9985 | return start; |
||
9986 | } |
||
9987 | }); |
||
9988 | }; |
||
637 | daniel-mar | 9989 | var domRange = adt$1.domRange; |
9990 | var relative = adt$1.relative; |
||
9991 | var exact = adt$1.exact; |
||
9992 | var getWin$1 = function (selection) { |
||
9993 | var start = getStart(selection); |
||
597 | daniel-mar | 9994 | return defaultView(start); |
9995 | }; |
||
637 | daniel-mar | 9996 | var range = SimRange.create; |
597 | daniel-mar | 9997 | var SimSelection = { |
9998 | domRange: domRange, |
||
9999 | relative: relative, |
||
10000 | exact: exact, |
||
10001 | exactFromRange: exactFromRange, |
||
637 | daniel-mar | 10002 | getWin: getWin$1, |
10003 | range: range |
||
597 | daniel-mar | 10004 | }; |
10005 | |||
10006 | var beforeSpecial = function (element, offset) { |
||
637 | daniel-mar | 10007 | var name = name$1(element); |
10008 | if ('input' === name) { |
||
597 | daniel-mar | 10009 | return Situ.after(element); |
637 | daniel-mar | 10010 | } else if (!contains$1([ |
597 | daniel-mar | 10011 | 'br', |
10012 | 'img' |
||
637 | daniel-mar | 10013 | ], name)) { |
597 | daniel-mar | 10014 | return Situ.on(element, offset); |
10015 | } else { |
||
10016 | return offset === 0 ? Situ.before(element) : Situ.after(element); |
||
10017 | } |
||
10018 | }; |
||
10019 | var preprocessExact = function (start, soffset, finish, foffset) { |
||
10020 | var startSitu = beforeSpecial(start, soffset); |
||
10021 | var finishSitu = beforeSpecial(finish, foffset); |
||
10022 | return SimSelection.relative(startSitu, finishSitu); |
||
10023 | }; |
||
10024 | |||
10025 | var makeRange = function (start, soffset, finish, foffset) { |
||
637 | daniel-mar | 10026 | var doc = owner$2(start); |
597 | daniel-mar | 10027 | var rng = doc.dom.createRange(); |
10028 | rng.setStart(start.dom, soffset); |
||
10029 | rng.setEnd(finish.dom, foffset); |
||
10030 | return rng; |
||
10031 | }; |
||
637 | daniel-mar | 10032 | var after = function (start, soffset, finish, foffset) { |
597 | daniel-mar | 10033 | var r = makeRange(start, soffset, finish, foffset); |
10034 | var same = eq(start, finish) && soffset === foffset; |
||
10035 | return r.collapsed && !same; |
||
10036 | }; |
||
10037 | |||
10038 | var getNativeSelection = function (win) { |
||
10039 | return Optional.from(win.getSelection()); |
||
10040 | }; |
||
10041 | var doSetNativeRange = function (win, rng) { |
||
10042 | getNativeSelection(win).each(function (selection) { |
||
10043 | selection.removeAllRanges(); |
||
10044 | selection.addRange(rng); |
||
10045 | }); |
||
10046 | }; |
||
10047 | var doSetRange = function (win, start, soffset, finish, foffset) { |
||
10048 | var rng = exactToNative(win, start, soffset, finish, foffset); |
||
10049 | doSetNativeRange(win, rng); |
||
10050 | }; |
||
10051 | var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) { |
||
10052 | selection.collapse(start.dom, soffset); |
||
10053 | selection.extend(finish.dom, foffset); |
||
10054 | }; |
||
10055 | var setRangeFromRelative = function (win, relative) { |
||
10056 | return diagnose(win, relative).match({ |
||
10057 | ltr: function (start, soffset, finish, foffset) { |
||
10058 | doSetRange(win, start, soffset, finish, foffset); |
||
10059 | }, |
||
10060 | rtl: function (start, soffset, finish, foffset) { |
||
10061 | getNativeSelection(win).each(function (selection) { |
||
10062 | if (selection.setBaseAndExtent) { |
||
10063 | selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset); |
||
10064 | } else if (selection.extend) { |
||
10065 | try { |
||
10066 | setLegacyRtlRange(win, selection, start, soffset, finish, foffset); |
||
10067 | } catch (e) { |
||
10068 | doSetRange(win, finish, foffset, start, soffset); |
||
10069 | } |
||
10070 | } else { |
||
10071 | doSetRange(win, finish, foffset, start, soffset); |
||
10072 | } |
||
10073 | }); |
||
10074 | } |
||
10075 | }); |
||
10076 | }; |
||
10077 | var setExact = function (win, start, soffset, finish, foffset) { |
||
10078 | var relative = preprocessExact(start, soffset, finish, foffset); |
||
10079 | setRangeFromRelative(win, relative); |
||
10080 | }; |
||
10081 | var readRange = function (selection) { |
||
10082 | if (selection.rangeCount > 0) { |
||
10083 | var firstRng = selection.getRangeAt(0); |
||
10084 | var lastRng = selection.getRangeAt(selection.rangeCount - 1); |
||
10085 | return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset)); |
||
10086 | } else { |
||
10087 | return Optional.none(); |
||
10088 | } |
||
10089 | }; |
||
10090 | var doGetExact = function (selection) { |
||
10091 | if (selection.anchorNode === null || selection.focusNode === null) { |
||
10092 | return readRange(selection); |
||
10093 | } else { |
||
10094 | var anchor = SugarElement.fromDom(selection.anchorNode); |
||
10095 | var focus_1 = SugarElement.fromDom(selection.focusNode); |
||
637 | daniel-mar | 10096 | return after(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection); |
597 | daniel-mar | 10097 | } |
10098 | }; |
||
10099 | var getExact = function (win) { |
||
10100 | return getNativeSelection(win).filter(function (sel) { |
||
10101 | return sel.rangeCount > 0; |
||
10102 | }).bind(doGetExact); |
||
10103 | }; |
||
637 | daniel-mar | 10104 | var get = function (win) { |
597 | daniel-mar | 10105 | return getExact(win).map(function (range) { |
10106 | return SimSelection.exact(range.start, range.soffset, range.finish, range.foffset); |
||
10107 | }); |
||
10108 | }; |
||
637 | daniel-mar | 10109 | var getFirstRect = function (win, selection) { |
597 | daniel-mar | 10110 | var rng = asLtrRange(win, selection); |
637 | daniel-mar | 10111 | return getFirstRect$1(rng); |
597 | daniel-mar | 10112 | }; |
637 | daniel-mar | 10113 | var clear = function (win) { |
597 | daniel-mar | 10114 | getNativeSelection(win).each(function (selection) { |
10115 | return selection.removeAllRanges(); |
||
10116 | }); |
||
10117 | }; |
||
10118 | |||
10119 | var getBodyFromFrame = function (frame) { |
||
10120 | return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document.body)); |
||
10121 | }; |
||
10122 | var getDocFromFrame = function (frame) { |
||
10123 | return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document)); |
||
10124 | }; |
||
10125 | var getWinFromFrame = function (frame) { |
||
10126 | return Optional.from(frame.dom.contentWindow); |
||
10127 | }; |
||
10128 | var getSelectionFromFrame = function (frame) { |
||
10129 | var optWin = getWinFromFrame(frame); |
||
10130 | return optWin.bind(getExact); |
||
10131 | }; |
||
10132 | var getFrame = function (editor) { |
||
10133 | return editor.getFrame(); |
||
10134 | }; |
||
10135 | var getOrDerive = function (name, f) { |
||
10136 | return function (editor) { |
||
10137 | var g = editor[name].getOrThunk(function () { |
||
10138 | var frame = getFrame(editor); |
||
10139 | return function () { |
||
10140 | return f(frame); |
||
10141 | }; |
||
10142 | }); |
||
10143 | return g(); |
||
10144 | }; |
||
10145 | }; |
||
10146 | var getOrListen = function (editor, doc, name, type) { |
||
10147 | return editor[name].getOrThunk(function () { |
||
10148 | return function (handler) { |
||
637 | daniel-mar | 10149 | return bind(doc, type, handler); |
597 | daniel-mar | 10150 | }; |
10151 | }); |
||
10152 | }; |
||
10153 | var getActiveApi = function (editor) { |
||
10154 | var frame = getFrame(editor); |
||
10155 | var tryFallbackBox = function (win) { |
||
10156 | var isCollapsed = function (sel) { |
||
10157 | return eq(sel.start, sel.finish) && sel.soffset === sel.foffset; |
||
10158 | }; |
||
10159 | var toStartRect = function (sel) { |
||
10160 | var rect = sel.start.dom.getBoundingClientRect(); |
||
10161 | return rect.width > 0 || rect.height > 0 ? Optional.some(rect) : Optional.none(); |
||
10162 | }; |
||
10163 | return getExact(win).filter(isCollapsed).bind(toStartRect); |
||
10164 | }; |
||
10165 | return getBodyFromFrame(frame).bind(function (body) { |
||
10166 | return getDocFromFrame(frame).bind(function (doc) { |
||
10167 | return getWinFromFrame(frame).map(function (win) { |
||
10168 | var html = SugarElement.fromDom(doc.dom.documentElement); |
||
10169 | var getCursorBox = editor.getCursorBox.getOrThunk(function () { |
||
10170 | return function () { |
||
637 | daniel-mar | 10171 | return get(win).bind(function (sel) { |
10172 | return getFirstRect(win, sel).orThunk(function () { |
||
597 | daniel-mar | 10173 | return tryFallbackBox(win); |
10174 | }); |
||
10175 | }); |
||
10176 | }; |
||
10177 | }); |
||
10178 | var setSelection = editor.setSelection.getOrThunk(function () { |
||
10179 | return function (start, soffset, finish, foffset) { |
||
10180 | setExact(win, start, soffset, finish, foffset); |
||
10181 | }; |
||
10182 | }); |
||
10183 | var clearSelection = editor.clearSelection.getOrThunk(function () { |
||
10184 | return function () { |
||
637 | daniel-mar | 10185 | clear(win); |
597 | daniel-mar | 10186 | }; |
10187 | }); |
||
10188 | return { |
||
10189 | body: body, |
||
10190 | doc: doc, |
||
10191 | win: win, |
||
10192 | html: html, |
||
10193 | getSelection: curry(getSelectionFromFrame, frame), |
||
10194 | setSelection: setSelection, |
||
10195 | clearSelection: clearSelection, |
||
10196 | frame: frame, |
||
10197 | onKeyup: getOrListen(editor, doc, 'onKeyup', 'keyup'), |
||
10198 | onNodeChanged: getOrListen(editor, doc, 'onNodeChanged', 'SelectionChange'), |
||
10199 | onDomChanged: editor.onDomChanged, |
||
10200 | onScrollToCursor: editor.onScrollToCursor, |
||
10201 | onScrollToElement: editor.onScrollToElement, |
||
10202 | onToReading: editor.onToReading, |
||
10203 | onToEditing: editor.onToEditing, |
||
10204 | onToolbarScrollStart: editor.onToolbarScrollStart, |
||
10205 | onTouchContent: editor.onTouchContent, |
||
10206 | onTapContent: editor.onTapContent, |
||
10207 | onTouchToolstrip: editor.onTouchToolstrip, |
||
10208 | getCursorBox: getCursorBox |
||
10209 | }; |
||
10210 | }); |
||
10211 | }); |
||
10212 | }); |
||
10213 | }; |
||
637 | daniel-mar | 10214 | var getWin = getOrDerive('getWin', getWinFromFrame); |
597 | daniel-mar | 10215 | |
10216 | var tag = function () { |
||
637 | daniel-mar | 10217 | var head = first$1('head').getOrDie(); |
597 | daniel-mar | 10218 | var nu = function () { |
10219 | var meta = SugarElement.fromTag('meta'); |
||
637 | daniel-mar | 10220 | set$8(meta, 'name', 'viewport'); |
10221 | append$2(head, meta); |
||
597 | daniel-mar | 10222 | return meta; |
10223 | }; |
||
637 | daniel-mar | 10224 | var element = first$1('meta[name="viewport"]').getOrThunk(nu); |
10225 | var backup = get$b(element, 'content'); |
||
597 | daniel-mar | 10226 | var maximize = function () { |
637 | daniel-mar | 10227 | set$8(element, 'content', 'width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0'); |
597 | daniel-mar | 10228 | }; |
10229 | var restore = function () { |
||
10230 | if (backup !== undefined && backup !== null && backup.length > 0) { |
||
637 | daniel-mar | 10231 | set$8(element, 'content', backup); |
597 | daniel-mar | 10232 | } else { |
637 | daniel-mar | 10233 | set$8(element, 'content', 'user-scalable=yes'); |
597 | daniel-mar | 10234 | } |
10235 | }; |
||
10236 | return { |
||
10237 | maximize: maximize, |
||
10238 | restore: restore |
||
10239 | }; |
||
10240 | }; |
||
10241 | |||
10242 | var attr = 'data-ephox-mobile-fullscreen-style'; |
||
10243 | var siblingStyles = 'display:none!important;'; |
||
10244 | var ancestorPosition = 'position:absolute!important;'; |
||
10245 | var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; |
||
10246 | var bgFallback = 'background-color:rgb(255,255,255)!important;'; |
||
637 | daniel-mar | 10247 | var isAndroid = detect$1().os.isAndroid(); |
597 | daniel-mar | 10248 | var matchColor = function (editorBody) { |
637 | daniel-mar | 10249 | var color = get$8(editorBody, 'background-color'); |
597 | daniel-mar | 10250 | return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; |
10251 | }; |
||
10252 | var clobberStyles = function (container, editorBody) { |
||
10253 | var gatherSiblings = function (element) { |
||
637 | daniel-mar | 10254 | return siblings(element, '*'); |
597 | daniel-mar | 10255 | }; |
10256 | var clobber = function (clobberStyle) { |
||
10257 | return function (element) { |
||
637 | daniel-mar | 10258 | var styles = get$b(element, 'style'); |
597 | daniel-mar | 10259 | var backup = styles === undefined ? 'no-styles' : styles.trim(); |
10260 | if (backup === clobberStyle) { |
||
10261 | return; |
||
10262 | } else { |
||
637 | daniel-mar | 10263 | set$8(element, attr, backup); |
10264 | set$8(element, 'style', clobberStyle); |
||
597 | daniel-mar | 10265 | } |
10266 | }; |
||
10267 | }; |
||
637 | daniel-mar | 10268 | var ancestors$1 = ancestors(container, '*'); |
10269 | var siblings$1 = bind$3(ancestors$1, gatherSiblings); |
||
597 | daniel-mar | 10270 | var bgColor = matchColor(editorBody); |
637 | daniel-mar | 10271 | each$1(siblings$1, clobber(siblingStyles)); |
10272 | each$1(ancestors$1, clobber(ancestorPosition + ancestorStyles + bgColor)); |
||
597 | daniel-mar | 10273 | var containerStyles = isAndroid === true ? '' : ancestorPosition; |
10274 | clobber(containerStyles + ancestorStyles + bgColor)(container); |
||
10275 | }; |
||
10276 | var restoreStyles = function () { |
||
637 | daniel-mar | 10277 | var clobberedEls = all('[' + attr + ']'); |
10278 | each$1(clobberedEls, function (element) { |
||
10279 | var restore = get$b(element, attr); |
||
597 | daniel-mar | 10280 | if (restore !== 'no-styles') { |
637 | daniel-mar | 10281 | set$8(element, 'style', restore); |
597 | daniel-mar | 10282 | } else { |
637 | daniel-mar | 10283 | remove$6(element, 'style'); |
597 | daniel-mar | 10284 | } |
637 | daniel-mar | 10285 | remove$6(element, attr); |
597 | daniel-mar | 10286 | }); |
10287 | }; |
||
10288 | |||
10289 | var DelayedFunction = function (fun, delay) { |
||
10290 | var ref = null; |
||
10291 | var schedule = function () { |
||
10292 | var args = []; |
||
10293 | for (var _i = 0; _i < arguments.length; _i++) { |
||
10294 | args[_i] = arguments[_i]; |
||
10295 | } |
||
10296 | ref = setTimeout(function () { |
||
10297 | fun.apply(null, args); |
||
10298 | ref = null; |
||
10299 | }, delay); |
||
10300 | }; |
||
10301 | var cancel = function () { |
||
10302 | if (ref !== null) { |
||
10303 | clearTimeout(ref); |
||
10304 | ref = null; |
||
10305 | } |
||
10306 | }; |
||
10307 | return { |
||
10308 | cancel: cancel, |
||
10309 | schedule: schedule |
||
10310 | }; |
||
10311 | }; |
||
10312 | |||
10313 | var SIGNIFICANT_MOVE = 5; |
||
10314 | var LONGPRESS_DELAY = 400; |
||
10315 | var getTouch = function (event) { |
||
10316 | var raw = event.raw; |
||
10317 | if (raw.touches === undefined || raw.touches.length !== 1) { |
||
10318 | return Optional.none(); |
||
10319 | } |
||
10320 | return Optional.some(raw.touches[0]); |
||
10321 | }; |
||
10322 | var isFarEnough = function (touch, data) { |
||
10323 | var distX = Math.abs(touch.clientX - data.x); |
||
10324 | var distY = Math.abs(touch.clientY - data.y); |
||
10325 | return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE; |
||
10326 | }; |
||
637 | daniel-mar | 10327 | var monitor$1 = function (settings) { |
10328 | var startData = value(); |
||
597 | daniel-mar | 10329 | var longpressFired = Cell(false); |
10330 | var longpress$1 = DelayedFunction(function (event) { |
||
10331 | settings.triggerEvent(longpress(), event); |
||
10332 | longpressFired.set(true); |
||
10333 | }, LONGPRESS_DELAY); |
||
10334 | var handleTouchstart = function (event) { |
||
10335 | getTouch(event).each(function (touch) { |
||
10336 | longpress$1.cancel(); |
||
10337 | var data = { |
||
10338 | x: touch.clientX, |
||
10339 | y: touch.clientY, |
||
10340 | target: event.target |
||
10341 | }; |
||
10342 | longpress$1.schedule(event); |
||
10343 | longpressFired.set(false); |
||
637 | daniel-mar | 10344 | startData.set(data); |
597 | daniel-mar | 10345 | }); |
10346 | return Optional.none(); |
||
10347 | }; |
||
10348 | var handleTouchmove = function (event) { |
||
10349 | longpress$1.cancel(); |
||
10350 | getTouch(event).each(function (touch) { |
||
637 | daniel-mar | 10351 | startData.on(function (data) { |
597 | daniel-mar | 10352 | if (isFarEnough(touch, data)) { |
637 | daniel-mar | 10353 | startData.clear(); |
597 | daniel-mar | 10354 | } |
10355 | }); |
||
10356 | }); |
||
10357 | return Optional.none(); |
||
10358 | }; |
||
10359 | var handleTouchend = function (event) { |
||
10360 | longpress$1.cancel(); |
||
10361 | var isSame = function (data) { |
||
10362 | return eq(data.target, event.target); |
||
10363 | }; |
||
10364 | return startData.get().filter(isSame).map(function (_data) { |
||
10365 | if (longpressFired.get()) { |
||
10366 | event.prevent(); |
||
10367 | return false; |
||
10368 | } else { |
||
10369 | return settings.triggerEvent(tap(), event); |
||
10370 | } |
||
10371 | }); |
||
10372 | }; |
||
637 | daniel-mar | 10373 | var handlers = wrapAll([ |
597 | daniel-mar | 10374 | { |
10375 | key: touchstart(), |
||
10376 | value: handleTouchstart |
||
10377 | }, |
||
10378 | { |
||
10379 | key: touchmove(), |
||
10380 | value: handleTouchmove |
||
10381 | }, |
||
10382 | { |
||
10383 | key: touchend(), |
||
10384 | value: handleTouchend |
||
10385 | } |
||
10386 | ]); |
||
10387 | var fireIfReady = function (event, type) { |
||
637 | daniel-mar | 10388 | return get$c(handlers, type).bind(function (handler) { |
597 | daniel-mar | 10389 | return handler(event); |
10390 | }); |
||
10391 | }; |
||
10392 | return { fireIfReady: fireIfReady }; |
||
10393 | }; |
||
10394 | |||
637 | daniel-mar | 10395 | var monitor = function (editorApi) { |
10396 | var tapEvent = monitor$1({ |
||
597 | daniel-mar | 10397 | triggerEvent: function (type, evt) { |
10398 | editorApi.onTapContent(evt); |
||
10399 | } |
||
10400 | }); |
||
10401 | var onTouchend = function () { |
||
637 | daniel-mar | 10402 | return bind(editorApi.body, 'touchend', function (evt) { |
597 | daniel-mar | 10403 | tapEvent.fireIfReady(evt, 'touchend'); |
10404 | }); |
||
10405 | }; |
||
10406 | var onTouchmove = function () { |
||
637 | daniel-mar | 10407 | return bind(editorApi.body, 'touchmove', function (evt) { |
597 | daniel-mar | 10408 | tapEvent.fireIfReady(evt, 'touchmove'); |
10409 | }); |
||
10410 | }; |
||
10411 | var fireTouchstart = function (evt) { |
||
10412 | tapEvent.fireIfReady(evt, 'touchstart'); |
||
10413 | }; |
||
10414 | return { |
||
10415 | fireTouchstart: fireTouchstart, |
||
10416 | onTouchend: onTouchend, |
||
10417 | onTouchmove: onTouchmove |
||
10418 | }; |
||
10419 | }; |
||
10420 | |||
637 | daniel-mar | 10421 | var isAndroid6 = detect$1().os.version.major >= 6; |
10422 | var initEvents$1 = function (editorApi, toolstrip, alloy) { |
||
10423 | var tapping = monitor(editorApi); |
||
10424 | var outerDoc = owner$2(toolstrip); |
||
597 | daniel-mar | 10425 | var isRanged = function (sel) { |
10426 | return !eq(sel.start, sel.finish) || sel.soffset !== sel.foffset; |
||
10427 | }; |
||
10428 | var hasRangeInUi = function () { |
||
10429 | return active(outerDoc).filter(function (input) { |
||
637 | daniel-mar | 10430 | return name$1(input) === 'input'; |
597 | daniel-mar | 10431 | }).exists(function (input) { |
10432 | return input.dom.selectionStart !== input.dom.selectionEnd; |
||
10433 | }); |
||
10434 | }; |
||
10435 | var updateMargin = function () { |
||
10436 | var rangeInContent = editorApi.doc.dom.hasFocus() && editorApi.getSelection().exists(isRanged); |
||
10437 | alloy.getByDom(toolstrip).each((rangeInContent || hasRangeInUi()) === true ? Toggling.on : Toggling.off); |
||
10438 | }; |
||
10439 | var listeners = [ |
||
637 | daniel-mar | 10440 | bind(editorApi.body, 'touchstart', function (evt) { |
597 | daniel-mar | 10441 | editorApi.onTouchContent(); |
10442 | tapping.fireTouchstart(evt); |
||
10443 | }), |
||
10444 | tapping.onTouchmove(), |
||
10445 | tapping.onTouchend(), |
||
637 | daniel-mar | 10446 | bind(toolstrip, 'touchstart', function (_evt) { |
597 | daniel-mar | 10447 | editorApi.onTouchToolstrip(); |
10448 | }), |
||
10449 | editorApi.onToReading(function () { |
||
637 | daniel-mar | 10450 | blur$1(editorApi.body); |
597 | daniel-mar | 10451 | }), |
10452 | editorApi.onToEditing(noop), |
||
10453 | editorApi.onScrollToCursor(function (tinyEvent) { |
||
10454 | tinyEvent.preventDefault(); |
||
10455 | editorApi.getCursorBox().each(function (bounds) { |
||
10456 | var cWin = editorApi.win; |
||
10457 | var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight; |
||
10458 | var cScrollBy = isOutside ? bounds.bottom - cWin.innerHeight + 50 : 0; |
||
10459 | if (cScrollBy !== 0) { |
||
10460 | cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy); |
||
10461 | } |
||
10462 | }); |
||
10463 | }) |
||
10464 | ].concat(isAndroid6 === true ? [] : [ |
||
637 | daniel-mar | 10465 | bind(SugarElement.fromDom(editorApi.win), 'blur', function () { |
597 | daniel-mar | 10466 | alloy.getByDom(toolstrip).each(Toggling.off); |
10467 | }), |
||
637 | daniel-mar | 10468 | bind(outerDoc, 'select', updateMargin), |
10469 | bind(editorApi.doc, 'selectionchange', updateMargin) |
||
597 | daniel-mar | 10470 | ]); |
10471 | var destroy = function () { |
||
637 | daniel-mar | 10472 | each$1(listeners, function (l) { |
597 | daniel-mar | 10473 | l.unbind(); |
10474 | }); |
||
10475 | }; |
||
10476 | return { destroy: destroy }; |
||
10477 | }; |
||
10478 | |||
10479 | var safeParse = function (element, attribute) { |
||
637 | daniel-mar | 10480 | var parsed = parseInt(get$b(element, attribute), 10); |
597 | daniel-mar | 10481 | return isNaN(parsed) ? 0 : parsed; |
10482 | }; |
||
10483 | |||
10484 | var COLLAPSED_WIDTH = 2; |
||
10485 | var collapsedRect = function (rect) { |
||
10486 | return __assign(__assign({}, rect), { width: COLLAPSED_WIDTH }); |
||
10487 | }; |
||
637 | daniel-mar | 10488 | var toRect = function (rawRect) { |
597 | daniel-mar | 10489 | return { |
10490 | left: rawRect.left, |
||
10491 | top: rawRect.top, |
||
10492 | right: rawRect.right, |
||
10493 | bottom: rawRect.bottom, |
||
10494 | width: rawRect.width, |
||
10495 | height: rawRect.height |
||
10496 | }; |
||
10497 | }; |
||
10498 | var getRectsFromRange = function (range) { |
||
10499 | if (!range.collapsed) { |
||
637 | daniel-mar | 10500 | return map$2(range.getClientRects(), toRect); |
597 | daniel-mar | 10501 | } else { |
10502 | var start_1 = SugarElement.fromDom(range.startContainer); |
||
10503 | return parent(start_1).bind(function (parent) { |
||
10504 | var selection = SimSelection.exact(start_1, range.startOffset, parent, getEnd(parent)); |
||
637 | daniel-mar | 10505 | var optRect = getFirstRect(range.startContainer.ownerDocument.defaultView, selection); |
10506 | return optRect.map(collapsedRect).map(pure$2); |
||
597 | daniel-mar | 10507 | }).getOr([]); |
10508 | } |
||
10509 | }; |
||
10510 | var getRectangles = function (cWin) { |
||
10511 | var sel = cWin.getSelection(); |
||
10512 | return sel !== undefined && sel.rangeCount > 0 ? getRectsFromRange(sel.getRangeAt(0)) : []; |
||
10513 | }; |
||
10514 | |||
10515 | var autocompleteHack = function () { |
||
10516 | return function (f) { |
||
637 | daniel-mar | 10517 | global$2.setTimeout(function () { |
597 | daniel-mar | 10518 | f(); |
10519 | }, 0); |
||
10520 | }; |
||
10521 | }; |
||
637 | daniel-mar | 10522 | var resume$1 = function (cWin) { |
597 | daniel-mar | 10523 | cWin.focus(); |
10524 | var iBody = SugarElement.fromDom(cWin.document.body); |
||
10525 | var inInput = active().exists(function (elem) { |
||
637 | daniel-mar | 10526 | return contains$1([ |
597 | daniel-mar | 10527 | 'input', |
10528 | 'textarea' |
||
637 | daniel-mar | 10529 | ], name$1(elem)); |
597 | daniel-mar | 10530 | }); |
637 | daniel-mar | 10531 | var transaction = inInput ? autocompleteHack() : apply$1; |
597 | daniel-mar | 10532 | transaction(function () { |
637 | daniel-mar | 10533 | active().each(blur$1); |
10534 | focus$3(iBody); |
||
597 | daniel-mar | 10535 | }); |
10536 | }; |
||
10537 | |||
10538 | var EXTRA_SPACING = 50; |
||
10539 | var data = 'data-' + resolve('last-outer-height'); |
||
10540 | var setLastHeight = function (cBody, value) { |
||
637 | daniel-mar | 10541 | set$8(cBody, data, value); |
597 | daniel-mar | 10542 | }; |
10543 | var getLastHeight = function (cBody) { |
||
10544 | return safeParse(cBody, data); |
||
10545 | }; |
||
10546 | var getBoundsFrom = function (rect) { |
||
10547 | return { |
||
10548 | top: rect.top, |
||
10549 | bottom: rect.top + rect.height |
||
10550 | }; |
||
10551 | }; |
||
637 | daniel-mar | 10552 | var getBounds = function (cWin) { |
597 | daniel-mar | 10553 | var rects = getRectangles(cWin); |
10554 | return rects.length > 0 ? Optional.some(rects[0]).map(getBoundsFrom) : Optional.none(); |
||
10555 | }; |
||
10556 | var findDelta = function (outerWindow, cBody) { |
||
10557 | var last = getLastHeight(cBody); |
||
10558 | var current = outerWindow.innerHeight; |
||
10559 | return last > current ? Optional.some(last - current) : Optional.none(); |
||
10560 | }; |
||
10561 | var calculate = function (cWin, bounds, delta) { |
||
10562 | var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight; |
||
10563 | return isOutside ? Math.min(delta, bounds.bottom - cWin.innerHeight + EXTRA_SPACING) : 0; |
||
10564 | }; |
||
637 | daniel-mar | 10565 | var setup$2 = function (outerWindow, cWin) { |
597 | daniel-mar | 10566 | var cBody = SugarElement.fromDom(cWin.document.body); |
10567 | var toEditing = function () { |
||
637 | daniel-mar | 10568 | resume$1(cWin); |
597 | daniel-mar | 10569 | }; |
637 | daniel-mar | 10570 | var onResize = bind(SugarElement.fromDom(outerWindow), 'resize', function () { |
597 | daniel-mar | 10571 | findDelta(outerWindow, cBody).each(function (delta) { |
637 | daniel-mar | 10572 | getBounds(cWin).each(function (bounds) { |
597 | daniel-mar | 10573 | var cScrollBy = calculate(cWin, bounds, delta); |
10574 | if (cScrollBy !== 0) { |
||
10575 | cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy); |
||
10576 | } |
||
10577 | }); |
||
10578 | }); |
||
10579 | setLastHeight(cBody, outerWindow.innerHeight); |
||
10580 | }); |
||
10581 | setLastHeight(cBody, outerWindow.innerHeight); |
||
10582 | var destroy = function () { |
||
10583 | onResize.unbind(); |
||
10584 | }; |
||
10585 | return { |
||
10586 | toEditing: toEditing, |
||
10587 | destroy: destroy |
||
10588 | }; |
||
10589 | }; |
||
10590 | |||
637 | daniel-mar | 10591 | var create$2 = function (platform, mask) { |
597 | daniel-mar | 10592 | var meta = tag(); |
10593 | var androidApi = api$2(); |
||
10594 | var androidEvents = api$2(); |
||
10595 | var enter = function () { |
||
10596 | mask.hide(); |
||
637 | daniel-mar | 10597 | add$1(platform.container, resolve('fullscreen-maximized')); |
10598 | add$1(platform.container, resolve('android-maximized')); |
||
597 | daniel-mar | 10599 | meta.maximize(); |
637 | daniel-mar | 10600 | add$1(platform.body, resolve('android-scroll-reload')); |
10601 | androidApi.set(setup$2(platform.win, getWin(platform.editor).getOrDie('no'))); |
||
597 | daniel-mar | 10602 | getActiveApi(platform.editor).each(function (editorApi) { |
10603 | clobberStyles(platform.container, editorApi.body); |
||
637 | daniel-mar | 10604 | androidEvents.set(initEvents$1(editorApi, platform.toolstrip, platform.alloy)); |
597 | daniel-mar | 10605 | }); |
10606 | }; |
||
10607 | var exit = function () { |
||
10608 | meta.restore(); |
||
10609 | mask.show(); |
||
637 | daniel-mar | 10610 | remove$3(platform.container, resolve('fullscreen-maximized')); |
10611 | remove$3(platform.container, resolve('android-maximized')); |
||
597 | daniel-mar | 10612 | restoreStyles(); |
637 | daniel-mar | 10613 | remove$3(platform.body, resolve('android-scroll-reload')); |
597 | daniel-mar | 10614 | androidEvents.clear(); |
10615 | androidApi.clear(); |
||
10616 | }; |
||
10617 | return { |
||
10618 | enter: enter, |
||
10619 | exit: exit |
||
10620 | }; |
||
10621 | }; |
||
10622 | |||
637 | daniel-mar | 10623 | var first = function (fn, rate) { |
597 | daniel-mar | 10624 | var timer = null; |
10625 | var cancel = function () { |
||
637 | daniel-mar | 10626 | if (!isNull(timer)) { |
597 | daniel-mar | 10627 | clearTimeout(timer); |
10628 | timer = null; |
||
10629 | } |
||
10630 | }; |
||
10631 | var throttle = function () { |
||
10632 | var args = []; |
||
10633 | for (var _i = 0; _i < arguments.length; _i++) { |
||
10634 | args[_i] = arguments[_i]; |
||
10635 | } |
||
637 | daniel-mar | 10636 | if (isNull(timer)) { |
597 | daniel-mar | 10637 | timer = setTimeout(function () { |
637 | daniel-mar | 10638 | timer = null; |
597 | daniel-mar | 10639 | fn.apply(null, args); |
10640 | }, rate); |
||
10641 | } |
||
10642 | }; |
||
10643 | return { |
||
10644 | cancel: cancel, |
||
10645 | throttle: throttle |
||
10646 | }; |
||
10647 | }; |
||
10648 | var last = function (fn, rate) { |
||
10649 | var timer = null; |
||
10650 | var cancel = function () { |
||
637 | daniel-mar | 10651 | if (!isNull(timer)) { |
597 | daniel-mar | 10652 | clearTimeout(timer); |
10653 | timer = null; |
||
10654 | } |
||
10655 | }; |
||
10656 | var throttle = function () { |
||
10657 | var args = []; |
||
10658 | for (var _i = 0; _i < arguments.length; _i++) { |
||
10659 | args[_i] = arguments[_i]; |
||
10660 | } |
||
637 | daniel-mar | 10661 | cancel(); |
597 | daniel-mar | 10662 | timer = setTimeout(function () { |
637 | daniel-mar | 10663 | timer = null; |
597 | daniel-mar | 10664 | fn.apply(null, args); |
10665 | }, rate); |
||
10666 | }; |
||
10667 | return { |
||
10668 | cancel: cancel, |
||
10669 | throttle: throttle |
||
10670 | }; |
||
10671 | }; |
||
10672 | |||
637 | daniel-mar | 10673 | var sketch = function (onView, _translate) { |
597 | daniel-mar | 10674 | var memIcon = record(Container.sketch({ |
10675 | dom: dom$1('<div aria-hidden="true" class="${prefix}-mask-tap-icon"></div>'), |
||
637 | daniel-mar | 10676 | containerBehaviours: derive$2([Toggling.config({ |
597 | daniel-mar | 10677 | toggleClass: resolve('mask-tap-icon-selected'), |
10678 | toggleOnExecute: false |
||
10679 | })]) |
||
10680 | })); |
||
637 | daniel-mar | 10681 | var onViewThrottle = first(onView, 200); |
597 | daniel-mar | 10682 | return Container.sketch({ |
10683 | dom: dom$1('<div class="${prefix}-disabled-mask"></div>'), |
||
10684 | components: [Container.sketch({ |
||
10685 | dom: dom$1('<div class="${prefix}-content-container"></div>'), |
||
10686 | components: [Button.sketch({ |
||
10687 | dom: dom$1('<div class="${prefix}-content-tap-section"></div>'), |
||
10688 | components: [memIcon.asSpec()], |
||
10689 | action: function (_button) { |
||
10690 | onViewThrottle.throttle(); |
||
10691 | }, |
||
637 | daniel-mar | 10692 | buttonBehaviours: derive$2([Toggling.config({ toggleClass: resolve('mask-tap-icon-selected') })]) |
597 | daniel-mar | 10693 | })] |
10694 | })] |
||
10695 | }); |
||
10696 | }; |
||
10697 | |||
637 | daniel-mar | 10698 | var unbindNoop = constant$1({ unbind: noop }); |
597 | daniel-mar | 10699 | var MobileSchema = objOf([ |
637 | daniel-mar | 10700 | requiredObjOf('editor', [ |
10701 | required$1('getFrame'), |
||
597 | daniel-mar | 10702 | option('getBody'), |
10703 | option('getDoc'), |
||
10704 | option('getWin'), |
||
10705 | option('getSelection'), |
||
10706 | option('setSelection'), |
||
10707 | option('clearSelection'), |
||
10708 | option('cursorSaver'), |
||
10709 | option('onKeyup'), |
||
10710 | option('onNodeChanged'), |
||
10711 | option('getCursorBox'), |
||
637 | daniel-mar | 10712 | required$1('onDomChanged'), |
10713 | defaulted('onTouchContent', noop), |
||
10714 | defaulted('onTapContent', noop), |
||
10715 | defaulted('onTouchToolstrip', noop), |
||
10716 | defaulted('onScrollToCursor', unbindNoop), |
||
10717 | defaulted('onScrollToElement', unbindNoop), |
||
10718 | defaulted('onToEditing', unbindNoop), |
||
10719 | defaulted('onToReading', unbindNoop), |
||
10720 | defaulted('onToolbarScrollStart', identity) |
||
597 | daniel-mar | 10721 | ]), |
637 | daniel-mar | 10722 | required$1('socket'), |
10723 | required$1('toolstrip'), |
||
10724 | required$1('dropup'), |
||
10725 | required$1('toolbar'), |
||
10726 | required$1('container'), |
||
10727 | required$1('alloy'), |
||
10728 | customField('win', function (spec) { |
||
10729 | return owner$2(spec.socket).dom.defaultView; |
||
597 | daniel-mar | 10730 | }), |
637 | daniel-mar | 10731 | customField('body', function (spec) { |
597 | daniel-mar | 10732 | return SugarElement.fromDom(spec.socket.dom.ownerDocument.body); |
10733 | }), |
||
637 | daniel-mar | 10734 | defaulted('translate', identity), |
10735 | defaulted('setReadOnly', noop), |
||
10736 | defaulted('readOnlyOnInit', always) |
||
597 | daniel-mar | 10737 | ]); |
10738 | |||
637 | daniel-mar | 10739 | var produce$1 = function (raw) { |
10740 | var mobile = asRawOrDie$1('Getting AndroidWebapp schema', MobileSchema, raw); |
||
10741 | set$5(mobile.toolstrip, 'width', '100%'); |
||
597 | daniel-mar | 10742 | var onTap = function () { |
10743 | mobile.setReadOnly(mobile.readOnlyOnInit()); |
||
10744 | mode.enter(); |
||
10745 | }; |
||
637 | daniel-mar | 10746 | var mask = build$1(sketch(onTap, mobile.translate)); |
597 | daniel-mar | 10747 | mobile.alloy.add(mask); |
10748 | var maskApi = { |
||
10749 | show: function () { |
||
10750 | mobile.alloy.add(mask); |
||
10751 | }, |
||
10752 | hide: function () { |
||
10753 | mobile.alloy.remove(mask); |
||
10754 | } |
||
10755 | }; |
||
637 | daniel-mar | 10756 | append$2(mobile.container, mask.element); |
10757 | var mode = create$2(mobile, maskApi); |
||
597 | daniel-mar | 10758 | return { |
10759 | setReadOnly: mobile.setReadOnly, |
||
10760 | refreshStructure: noop, |
||
10761 | enter: mode.enter, |
||
10762 | exit: mode.exit, |
||
10763 | destroy: noop |
||
10764 | }; |
||
10765 | }; |
||
10766 | |||
637 | daniel-mar | 10767 | var schema$1 = constant$1([ |
10768 | required$1('dom'), |
||
10769 | defaulted('shell', true), |
||
597 | daniel-mar | 10770 | field$1('toolbarBehaviours', [Replacing]) |
10771 | ]); |
||
10772 | var enhanceGroups = function () { |
||
637 | daniel-mar | 10773 | return { behaviours: derive$2([Replacing.config({})]) }; |
597 | daniel-mar | 10774 | }; |
637 | daniel-mar | 10775 | var parts$1 = constant$1([optional({ |
597 | daniel-mar | 10776 | name: 'groups', |
10777 | overrides: enhanceGroups |
||
10778 | })]); |
||
10779 | |||
637 | daniel-mar | 10780 | var factory$1 = function (detail, components, _spec, _externals) { |
597 | daniel-mar | 10781 | var setGroups = function (toolbar, groups) { |
10782 | getGroupContainer(toolbar).fold(function () { |
||
10783 | console.error('Toolbar was defined to not be a shell, but no groups container was specified in components'); |
||
10784 | throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components'); |
||
10785 | }, function (container) { |
||
10786 | Replacing.set(container, groups); |
||
10787 | }); |
||
10788 | }; |
||
10789 | var getGroupContainer = function (component) { |
||
10790 | return detail.shell ? Optional.some(component) : getPart(component, detail, 'groups'); |
||
10791 | }; |
||
10792 | var extra = detail.shell ? { |
||
10793 | behaviours: [Replacing.config({})], |
||
10794 | components: [] |
||
10795 | } : { |
||
10796 | behaviours: [], |
||
10797 | components: components |
||
10798 | }; |
||
10799 | return { |
||
10800 | uid: detail.uid, |
||
10801 | dom: detail.dom, |
||
10802 | components: extra.components, |
||
10803 | behaviours: augment(detail.toolbarBehaviours, extra.behaviours), |
||
10804 | apis: { setGroups: setGroups }, |
||
10805 | domModification: { attributes: { role: 'group' } } |
||
10806 | }; |
||
10807 | }; |
||
637 | daniel-mar | 10808 | var Toolbar = composite({ |
597 | daniel-mar | 10809 | name: 'Toolbar', |
637 | daniel-mar | 10810 | configFields: schema$1(), |
10811 | partFields: parts$1(), |
||
10812 | factory: factory$1, |
||
597 | daniel-mar | 10813 | apis: { |
10814 | setGroups: function (apis, toolbar, groups) { |
||
10815 | apis.setGroups(toolbar, groups); |
||
10816 | } |
||
10817 | } |
||
10818 | }); |
||
10819 | |||
637 | daniel-mar | 10820 | var schema = constant$1([ |
10821 | required$1('items'), |
||
597 | daniel-mar | 10822 | markers(['itemSelector']), |
10823 | field$1('tgroupBehaviours', [Keying]) |
||
10824 | ]); |
||
637 | daniel-mar | 10825 | var parts = constant$1([group({ |
597 | daniel-mar | 10826 | name: 'items', |
10827 | unit: 'item' |
||
10828 | })]); |
||
10829 | |||
637 | daniel-mar | 10830 | var factory = function (detail, components, _spec, _externals) { |
597 | daniel-mar | 10831 | return { |
10832 | uid: detail.uid, |
||
10833 | dom: detail.dom, |
||
10834 | components: components, |
||
10835 | behaviours: augment(detail.tgroupBehaviours, [Keying.config({ |
||
10836 | mode: 'flow', |
||
10837 | selector: detail.markers.itemSelector |
||
10838 | })]), |
||
10839 | domModification: { attributes: { role: 'toolbar' } } |
||
10840 | }; |
||
10841 | }; |
||
637 | daniel-mar | 10842 | var ToolbarGroup = composite({ |
597 | daniel-mar | 10843 | name: 'ToolbarGroup', |
637 | daniel-mar | 10844 | configFields: schema(), |
10845 | partFields: parts(), |
||
10846 | factory: factory |
||
597 | daniel-mar | 10847 | }); |
10848 | |||
10849 | var dataHorizontal = 'data-' + resolve('horizontal-scroll'); |
||
10850 | var canScrollVertically = function (container) { |
||
10851 | container.dom.scrollTop = 1; |
||
10852 | var result = container.dom.scrollTop !== 0; |
||
10853 | container.dom.scrollTop = 0; |
||
10854 | return result; |
||
10855 | }; |
||
10856 | var canScrollHorizontally = function (container) { |
||
10857 | container.dom.scrollLeft = 1; |
||
10858 | var result = container.dom.scrollLeft !== 0; |
||
10859 | container.dom.scrollLeft = 0; |
||
10860 | return result; |
||
10861 | }; |
||
10862 | var hasVerticalScroll = function (container) { |
||
10863 | return container.dom.scrollTop > 0 || canScrollVertically(container); |
||
10864 | }; |
||
10865 | var hasHorizontalScroll = function (container) { |
||
10866 | return container.dom.scrollLeft > 0 || canScrollHorizontally(container); |
||
10867 | }; |
||
10868 | var markAsHorizontal = function (container) { |
||
637 | daniel-mar | 10869 | set$8(container, dataHorizontal, 'true'); |
597 | daniel-mar | 10870 | }; |
10871 | var hasScroll = function (container) { |
||
637 | daniel-mar | 10872 | return get$b(container, dataHorizontal) === 'true' ? hasHorizontalScroll(container) : hasVerticalScroll(container); |
597 | daniel-mar | 10873 | }; |
10874 | var exclusive = function (scope, selector) { |
||
637 | daniel-mar | 10875 | return bind(scope, 'touchmove', function (event) { |
10876 | closest$1(event.target, selector).filter(hasScroll).fold(function () { |
||
597 | daniel-mar | 10877 | event.prevent(); |
10878 | }, noop); |
||
10879 | }); |
||
10880 | }; |
||
10881 | |||
10882 | var ScrollingToolbar = function () { |
||
10883 | var makeGroup = function (gSpec) { |
||
10884 | var scrollClass = gSpec.scrollable === true ? '${prefix}-toolbar-scrollable-group' : ''; |
||
10885 | return { |
||
10886 | dom: dom$1('<div aria-label="' + gSpec.label + '" class="${prefix}-toolbar-group ' + scrollClass + '"></div>'), |
||
637 | daniel-mar | 10887 | tgroupBehaviours: derive$2([config('adhoc-scrollable-toolbar', gSpec.scrollable === true ? [runOnInit(function (component, _simulatedEvent) { |
10888 | set$5(component.element, 'overflow-x', 'auto'); |
||
597 | daniel-mar | 10889 | markAsHorizontal(component.element); |
637 | daniel-mar | 10890 | register$2(component.element); |
597 | daniel-mar | 10891 | })] : [])]), |
10892 | components: [Container.sketch({ components: [ToolbarGroup.parts.items({})] })], |
||
10893 | markers: { itemSelector: '.' + resolve('toolbar-group-item') }, |
||
10894 | items: gSpec.items |
||
10895 | }; |
||
10896 | }; |
||
10897 | var toolbar = build$1(Toolbar.sketch({ |
||
10898 | dom: dom$1('<div class="${prefix}-toolbar"></div>'), |
||
10899 | components: [Toolbar.parts.groups({})], |
||
637 | daniel-mar | 10900 | toolbarBehaviours: derive$2([ |
597 | daniel-mar | 10901 | Toggling.config({ |
10902 | toggleClass: resolve('context-toolbar'), |
||
10903 | toggleOnExecute: false, |
||
10904 | aria: { mode: 'none' } |
||
10905 | }), |
||
10906 | Keying.config({ mode: 'cyclic' }) |
||
10907 | ]), |
||
10908 | shell: true |
||
10909 | })); |
||
10910 | var wrapper = build$1(Container.sketch({ |
||
10911 | dom: { classes: [resolve('toolstrip')] }, |
||
637 | daniel-mar | 10912 | components: [premade(toolbar)], |
10913 | containerBehaviours: derive$2([Toggling.config({ |
||
597 | daniel-mar | 10914 | toggleClass: resolve('android-selection-context-toolbar'), |
10915 | toggleOnExecute: false |
||
10916 | })]) |
||
10917 | })); |
||
10918 | var resetGroups = function () { |
||
10919 | Toolbar.setGroups(toolbar, initGroups.get()); |
||
10920 | Toggling.off(toolbar); |
||
10921 | }; |
||
10922 | var initGroups = Cell([]); |
||
10923 | var setGroups = function (gs) { |
||
10924 | initGroups.set(gs); |
||
10925 | resetGroups(); |
||
10926 | }; |
||
10927 | var createGroups = function (gs) { |
||
637 | daniel-mar | 10928 | return map$2(gs, compose(ToolbarGroup.sketch, makeGroup)); |
597 | daniel-mar | 10929 | }; |
10930 | var refresh = function () { |
||
10931 | }; |
||
10932 | var setContextToolbar = function (gs) { |
||
10933 | Toggling.on(toolbar); |
||
10934 | Toolbar.setGroups(toolbar, gs); |
||
10935 | }; |
||
10936 | var restoreToolbar = function () { |
||
10937 | if (Toggling.isOn(toolbar)) { |
||
10938 | resetGroups(); |
||
10939 | } |
||
10940 | }; |
||
10941 | var focus = function () { |
||
10942 | Keying.focusIn(toolbar); |
||
10943 | }; |
||
10944 | return { |
||
10945 | wrapper: wrapper, |
||
10946 | toolbar: toolbar, |
||
10947 | createGroups: createGroups, |
||
10948 | setGroups: setGroups, |
||
10949 | setContextToolbar: setContextToolbar, |
||
10950 | restoreToolbar: restoreToolbar, |
||
10951 | refresh: refresh, |
||
10952 | focus: focus |
||
10953 | }; |
||
10954 | }; |
||
10955 | |||
10956 | var makeEditSwitch = function (webapp) { |
||
10957 | return build$1(Button.sketch({ |
||
10958 | dom: dom$1('<div class="${prefix}-mask-edit-icon ${prefix}-icon"></div>'), |
||
10959 | action: function () { |
||
10960 | webapp.run(function (w) { |
||
10961 | w.setReadOnly(false); |
||
10962 | }); |
||
10963 | } |
||
10964 | })); |
||
10965 | }; |
||
10966 | var makeSocket = function () { |
||
10967 | return build$1(Container.sketch({ |
||
10968 | dom: dom$1('<div class="${prefix}-editor-socket"></div>'), |
||
10969 | components: [], |
||
637 | daniel-mar | 10970 | containerBehaviours: derive$2([Replacing.config({})]) |
597 | daniel-mar | 10971 | })); |
10972 | }; |
||
10973 | var showEdit = function (socket, switchToEdit) { |
||
637 | daniel-mar | 10974 | Replacing.append(socket, premade(switchToEdit)); |
597 | daniel-mar | 10975 | }; |
10976 | var hideEdit = function (socket, switchToEdit) { |
||
10977 | Replacing.remove(socket, switchToEdit); |
||
10978 | }; |
||
10979 | var updateMode = function (socket, switchToEdit, readOnly, root) { |
||
10980 | var swap = readOnly === true ? Swapping.toAlpha : Swapping.toOmega; |
||
10981 | swap(root); |
||
10982 | var f = readOnly ? showEdit : hideEdit; |
||
10983 | f(socket, switchToEdit); |
||
10984 | }; |
||
10985 | |||
10986 | var getAnimationRoot = function (component, slideConfig) { |
||
10987 | return slideConfig.getAnimationRoot.fold(function () { |
||
10988 | return component.element; |
||
10989 | }, function (get) { |
||
10990 | return get(component); |
||
10991 | }); |
||
10992 | }; |
||
10993 | |||
10994 | var getDimensionProperty = function (slideConfig) { |
||
10995 | return slideConfig.dimension.property; |
||
10996 | }; |
||
10997 | var getDimension = function (slideConfig, elem) { |
||
10998 | return slideConfig.dimension.getDimension(elem); |
||
10999 | }; |
||
11000 | var disableTransitions = function (component, slideConfig) { |
||
11001 | var root = getAnimationRoot(component, slideConfig); |
||
637 | daniel-mar | 11002 | remove$1(root, [ |
597 | daniel-mar | 11003 | slideConfig.shrinkingClass, |
11004 | slideConfig.growingClass |
||
11005 | ]); |
||
11006 | }; |
||
11007 | var setShrunk = function (component, slideConfig) { |
||
637 | daniel-mar | 11008 | remove$3(component.element, slideConfig.openClass); |
11009 | add$1(component.element, slideConfig.closedClass); |
||
11010 | set$5(component.element, getDimensionProperty(slideConfig), '0px'); |
||
597 | daniel-mar | 11011 | reflow(component.element); |
11012 | }; |
||
11013 | var setGrown = function (component, slideConfig) { |
||
637 | daniel-mar | 11014 | remove$3(component.element, slideConfig.closedClass); |
11015 | add$1(component.element, slideConfig.openClass); |
||
11016 | remove$2(component.element, getDimensionProperty(slideConfig)); |
||
597 | daniel-mar | 11017 | }; |
11018 | var doImmediateShrink = function (component, slideConfig, slideState, _calculatedSize) { |
||
11019 | slideState.setCollapsed(); |
||
637 | daniel-mar | 11020 | set$5(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element)); |
597 | daniel-mar | 11021 | reflow(component.element); |
11022 | disableTransitions(component, slideConfig); |
||
11023 | setShrunk(component, slideConfig); |
||
11024 | slideConfig.onStartShrink(component); |
||
11025 | slideConfig.onShrunk(component); |
||
11026 | }; |
||
11027 | var doStartShrink = function (component, slideConfig, slideState, calculatedSize) { |
||
11028 | var size = calculatedSize.getOrThunk(function () { |
||
11029 | return getDimension(slideConfig, component.element); |
||
11030 | }); |
||
11031 | slideState.setCollapsed(); |
||
637 | daniel-mar | 11032 | set$5(component.element, getDimensionProperty(slideConfig), size); |
597 | daniel-mar | 11033 | reflow(component.element); |
11034 | var root = getAnimationRoot(component, slideConfig); |
||
637 | daniel-mar | 11035 | remove$3(root, slideConfig.growingClass); |
11036 | add$1(root, slideConfig.shrinkingClass); |
||
597 | daniel-mar | 11037 | setShrunk(component, slideConfig); |
11038 | slideConfig.onStartShrink(component); |
||
11039 | }; |
||
11040 | var doStartSmartShrink = function (component, slideConfig, slideState) { |
||
11041 | var size = getDimension(slideConfig, component.element); |
||
11042 | var shrinker = size === '0px' ? doImmediateShrink : doStartShrink; |
||
11043 | shrinker(component, slideConfig, slideState, Optional.some(size)); |
||
11044 | }; |
||
11045 | var doStartGrow = function (component, slideConfig, slideState) { |
||
11046 | var root = getAnimationRoot(component, slideConfig); |
||
637 | daniel-mar | 11047 | var wasShrinking = has(root, slideConfig.shrinkingClass); |
597 | daniel-mar | 11048 | var beforeSize = getDimension(slideConfig, component.element); |
11049 | setGrown(component, slideConfig); |
||
11050 | var fullSize = getDimension(slideConfig, component.element); |
||
11051 | var startPartialGrow = function () { |
||
637 | daniel-mar | 11052 | set$5(component.element, getDimensionProperty(slideConfig), beforeSize); |
597 | daniel-mar | 11053 | reflow(component.element); |
11054 | }; |
||
11055 | var startCompleteGrow = function () { |
||
11056 | setShrunk(component, slideConfig); |
||
11057 | }; |
||
11058 | var setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow; |
||
11059 | setStartSize(); |
||
637 | daniel-mar | 11060 | remove$3(root, slideConfig.shrinkingClass); |
11061 | add$1(root, slideConfig.growingClass); |
||
597 | daniel-mar | 11062 | setGrown(component, slideConfig); |
637 | daniel-mar | 11063 | set$5(component.element, getDimensionProperty(slideConfig), fullSize); |
597 | daniel-mar | 11064 | slideState.setExpanded(); |
11065 | slideConfig.onStartGrow(component); |
||
11066 | }; |
||
637 | daniel-mar | 11067 | var refresh$1 = function (component, slideConfig, slideState) { |
597 | daniel-mar | 11068 | if (slideState.isExpanded()) { |
637 | daniel-mar | 11069 | remove$2(component.element, getDimensionProperty(slideConfig)); |
597 | daniel-mar | 11070 | var fullSize = getDimension(slideConfig, component.element); |
637 | daniel-mar | 11071 | set$5(component.element, getDimensionProperty(slideConfig), fullSize); |
597 | daniel-mar | 11072 | } |
11073 | }; |
||
11074 | var grow = function (component, slideConfig, slideState) { |
||
11075 | if (!slideState.isExpanded()) { |
||
11076 | doStartGrow(component, slideConfig, slideState); |
||
11077 | } |
||
11078 | }; |
||
11079 | var shrink = function (component, slideConfig, slideState) { |
||
11080 | if (slideState.isExpanded()) { |
||
11081 | doStartSmartShrink(component, slideConfig, slideState); |
||
11082 | } |
||
11083 | }; |
||
11084 | var immediateShrink = function (component, slideConfig, slideState) { |
||
11085 | if (slideState.isExpanded()) { |
||
637 | daniel-mar | 11086 | doImmediateShrink(component, slideConfig, slideState); |
597 | daniel-mar | 11087 | } |
11088 | }; |
||
11089 | var hasGrown = function (component, slideConfig, slideState) { |
||
11090 | return slideState.isExpanded(); |
||
11091 | }; |
||
11092 | var hasShrunk = function (component, slideConfig, slideState) { |
||
11093 | return slideState.isCollapsed(); |
||
11094 | }; |
||
11095 | var isGrowing = function (component, slideConfig, _slideState) { |
||
11096 | var root = getAnimationRoot(component, slideConfig); |
||
637 | daniel-mar | 11097 | return has(root, slideConfig.growingClass) === true; |
597 | daniel-mar | 11098 | }; |
11099 | var isShrinking = function (component, slideConfig, _slideState) { |
||
11100 | var root = getAnimationRoot(component, slideConfig); |
||
637 | daniel-mar | 11101 | return has(root, slideConfig.shrinkingClass) === true; |
597 | daniel-mar | 11102 | }; |
11103 | var isTransitioning = function (component, slideConfig, slideState) { |
||
11104 | return isGrowing(component, slideConfig) || isShrinking(component, slideConfig); |
||
11105 | }; |
||
11106 | var toggleGrow = function (component, slideConfig, slideState) { |
||
11107 | var f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow; |
||
11108 | f(component, slideConfig, slideState); |
||
11109 | }; |
||
11110 | |||
11111 | var SlidingApis = /*#__PURE__*/Object.freeze({ |
||
11112 | __proto__: null, |
||
637 | daniel-mar | 11113 | refresh: refresh$1, |
597 | daniel-mar | 11114 | grow: grow, |
11115 | shrink: shrink, |
||
11116 | immediateShrink: immediateShrink, |
||
11117 | hasGrown: hasGrown, |
||
11118 | hasShrunk: hasShrunk, |
||
11119 | isGrowing: isGrowing, |
||
11120 | isShrinking: isShrinking, |
||
11121 | isTransitioning: isTransitioning, |
||
11122 | toggleGrow: toggleGrow, |
||
11123 | disableTransitions: disableTransitions |
||
11124 | }); |
||
11125 | |||
637 | daniel-mar | 11126 | var exhibit = function (base, slideConfig, _slideState) { |
597 | daniel-mar | 11127 | var expanded = slideConfig.expanded; |
637 | daniel-mar | 11128 | return expanded ? nu$3({ |
597 | daniel-mar | 11129 | classes: [slideConfig.openClass], |
11130 | styles: {} |
||
637 | daniel-mar | 11131 | }) : nu$3({ |
597 | daniel-mar | 11132 | classes: [slideConfig.closedClass], |
637 | daniel-mar | 11133 | styles: wrap(slideConfig.dimension.property, '0px') |
597 | daniel-mar | 11134 | }); |
11135 | }; |
||
637 | daniel-mar | 11136 | var events = function (slideConfig, slideState) { |
11137 | return derive$3([runOnSource(transitionend(), function (component, simulatedEvent) { |
||
597 | daniel-mar | 11138 | var raw = simulatedEvent.event.raw; |
11139 | if (raw.propertyName === slideConfig.dimension.property) { |
||
11140 | disableTransitions(component, slideConfig); |
||
11141 | if (slideState.isExpanded()) { |
||
637 | daniel-mar | 11142 | remove$2(component.element, slideConfig.dimension.property); |
597 | daniel-mar | 11143 | } |
11144 | var notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk; |
||
11145 | notify(component); |
||
11146 | } |
||
11147 | })]); |
||
11148 | }; |
||
11149 | |||
11150 | var ActiveSliding = /*#__PURE__*/Object.freeze({ |
||
11151 | __proto__: null, |
||
637 | daniel-mar | 11152 | exhibit: exhibit, |
11153 | events: events |
||
597 | daniel-mar | 11154 | }); |
11155 | |||
11156 | var SlidingSchema = [ |
||
637 | daniel-mar | 11157 | required$1('closedClass'), |
11158 | required$1('openClass'), |
||
11159 | required$1('shrinkingClass'), |
||
11160 | required$1('growingClass'), |
||
597 | daniel-mar | 11161 | option('getAnimationRoot'), |
11162 | onHandler('onShrunk'), |
||
11163 | onHandler('onStartShrink'), |
||
11164 | onHandler('onGrown'), |
||
11165 | onHandler('onStartGrow'), |
||
637 | daniel-mar | 11166 | defaulted('expanded', false), |
11167 | requiredOf('dimension', choose$1('property', { |
||
597 | daniel-mar | 11168 | width: [ |
11169 | output('property', 'width'), |
||
11170 | output('getDimension', function (elem) { |
||
637 | daniel-mar | 11171 | return get$5(elem) + 'px'; |
597 | daniel-mar | 11172 | }) |
11173 | ], |
||
11174 | height: [ |
||
11175 | output('property', 'height'), |
||
11176 | output('getDimension', function (elem) { |
||
637 | daniel-mar | 11177 | return get$7(elem) + 'px'; |
597 | daniel-mar | 11178 | }) |
11179 | ] |
||
11180 | })) |
||
11181 | ]; |
||
11182 | |||
637 | daniel-mar | 11183 | var init$1 = function (spec) { |
597 | daniel-mar | 11184 | var state = Cell(spec.expanded); |
11185 | var readState = function () { |
||
11186 | return 'expanded: ' + state.get(); |
||
11187 | }; |
||
637 | daniel-mar | 11188 | return nu$2({ |
597 | daniel-mar | 11189 | isExpanded: function () { |
11190 | return state.get() === true; |
||
11191 | }, |
||
11192 | isCollapsed: function () { |
||
11193 | return state.get() === false; |
||
11194 | }, |
||
11195 | setCollapsed: curry(state.set, false), |
||
11196 | setExpanded: curry(state.set, true), |
||
11197 | readState: readState |
||
11198 | }); |
||
11199 | }; |
||
11200 | |||
11201 | var SlidingState = /*#__PURE__*/Object.freeze({ |
||
11202 | __proto__: null, |
||
637 | daniel-mar | 11203 | init: init$1 |
597 | daniel-mar | 11204 | }); |
11205 | |||
637 | daniel-mar | 11206 | var Sliding = create$5({ |
597 | daniel-mar | 11207 | fields: SlidingSchema, |
11208 | name: 'sliding', |
||
11209 | active: ActiveSliding, |
||
11210 | apis: SlidingApis, |
||
11211 | state: SlidingState |
||
11212 | }); |
||
11213 | |||
637 | daniel-mar | 11214 | var build = function (refresh, scrollIntoView) { |
597 | daniel-mar | 11215 | var dropup = build$1(Container.sketch({ |
11216 | dom: { |
||
11217 | tag: 'div', |
||
11218 | classes: [resolve('dropup')] |
||
11219 | }, |
||
11220 | components: [], |
||
637 | daniel-mar | 11221 | containerBehaviours: derive$2([ |
597 | daniel-mar | 11222 | Replacing.config({}), |
11223 | Sliding.config({ |
||
11224 | closedClass: resolve('dropup-closed'), |
||
11225 | openClass: resolve('dropup-open'), |
||
11226 | shrinkingClass: resolve('dropup-shrinking'), |
||
11227 | growingClass: resolve('dropup-growing'), |
||
11228 | dimension: { property: 'height' }, |
||
11229 | onShrunk: function (component) { |
||
11230 | refresh(); |
||
11231 | scrollIntoView(); |
||
11232 | Replacing.set(component, []); |
||
11233 | }, |
||
11234 | onGrown: function (_component) { |
||
11235 | refresh(); |
||
11236 | scrollIntoView(); |
||
11237 | } |
||
11238 | }), |
||
11239 | orientation(function (_component, _data) { |
||
11240 | disappear(noop); |
||
11241 | }) |
||
11242 | ]) |
||
11243 | })); |
||
11244 | var appear = function (menu, update, component) { |
||
11245 | if (Sliding.hasShrunk(dropup) === true && Sliding.isTransitioning(dropup) === false) { |
||
11246 | window.requestAnimationFrame(function () { |
||
11247 | update(component); |
||
11248 | Replacing.set(dropup, [menu()]); |
||
11249 | Sliding.grow(dropup); |
||
11250 | }); |
||
11251 | } |
||
11252 | }; |
||
11253 | var disappear = function (onReadyToShrink) { |
||
11254 | window.requestAnimationFrame(function () { |
||
11255 | onReadyToShrink(); |
||
11256 | Sliding.shrink(dropup); |
||
11257 | }); |
||
11258 | }; |
||
11259 | return { |
||
11260 | appear: appear, |
||
11261 | disappear: disappear, |
||
11262 | component: dropup, |
||
11263 | element: dropup.element |
||
11264 | }; |
||
11265 | }; |
||
11266 | |||
637 | daniel-mar | 11267 | var closest = function (scope, selector, isRoot) { |
11268 | return closest$1(scope, selector, isRoot).isSome(); |
||
597 | daniel-mar | 11269 | }; |
11270 | |||
11271 | var isDangerous = function (event) { |
||
11272 | var keyEv = event.raw; |
||
637 | daniel-mar | 11273 | return keyEv.which === BACKSPACE[0] && !contains$1([ |
597 | daniel-mar | 11274 | 'input', |
11275 | 'textarea' |
||
637 | daniel-mar | 11276 | ], name$1(event.target)) && !closest(event.target, '[contenteditable="true"]'); |
597 | daniel-mar | 11277 | }; |
11278 | var isFirefox = function () { |
||
637 | daniel-mar | 11279 | return detect$1().browser.isFirefox(); |
597 | daniel-mar | 11280 | }; |
11281 | var bindFocus = function (container, handler) { |
||
11282 | if (isFirefox()) { |
||
637 | daniel-mar | 11283 | return capture(container, 'focus', handler); |
597 | daniel-mar | 11284 | } else { |
637 | daniel-mar | 11285 | return bind(container, 'focusin', handler); |
597 | daniel-mar | 11286 | } |
11287 | }; |
||
11288 | var bindBlur = function (container, handler) { |
||
11289 | if (isFirefox()) { |
||
637 | daniel-mar | 11290 | return capture(container, 'blur', handler); |
597 | daniel-mar | 11291 | } else { |
637 | daniel-mar | 11292 | return bind(container, 'focusout', handler); |
597 | daniel-mar | 11293 | } |
11294 | }; |
||
637 | daniel-mar | 11295 | var setup$1 = function (container, rawSettings) { |
679 | daniel-mar | 11296 | var settings = __assign({ stopBackspace: true }, rawSettings); |
597 | daniel-mar | 11297 | var pointerEvents = [ |
11298 | 'touchstart', |
||
11299 | 'touchmove', |
||
11300 | 'touchend', |
||
11301 | 'touchcancel', |
||
11302 | 'gesturestart', |
||
11303 | 'mousedown', |
||
11304 | 'mouseup', |
||
11305 | 'mouseover', |
||
11306 | 'mousemove', |
||
11307 | 'mouseout', |
||
11308 | 'click' |
||
11309 | ]; |
||
637 | daniel-mar | 11310 | var tapEvent = monitor$1(settings); |
11311 | var simpleEvents = map$2(pointerEvents.concat([ |
||
597 | daniel-mar | 11312 | 'selectstart', |
11313 | 'input', |
||
11314 | 'contextmenu', |
||
11315 | 'change', |
||
11316 | 'transitionend', |
||
637 | daniel-mar | 11317 | 'transitioncancel', |
597 | daniel-mar | 11318 | 'drag', |
11319 | 'dragstart', |
||
11320 | 'dragend', |
||
11321 | 'dragenter', |
||
11322 | 'dragleave', |
||
11323 | 'dragover', |
||
11324 | 'drop', |
||
11325 | 'keyup' |
||
11326 | ]), function (type) { |
||
637 | daniel-mar | 11327 | return bind(container, type, function (event) { |
597 | daniel-mar | 11328 | tapEvent.fireIfReady(event, type).each(function (tapStopped) { |
11329 | if (tapStopped) { |
||
11330 | event.kill(); |
||
11331 | } |
||
11332 | }); |
||
11333 | var stopped = settings.triggerEvent(type, event); |
||
11334 | if (stopped) { |
||
11335 | event.kill(); |
||
11336 | } |
||
11337 | }); |
||
11338 | }); |
||
637 | daniel-mar | 11339 | var pasteTimeout = value(); |
11340 | var onPaste = bind(container, 'paste', function (event) { |
||
597 | daniel-mar | 11341 | tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) { |
11342 | if (tapStopped) { |
||
11343 | event.kill(); |
||
11344 | } |
||
11345 | }); |
||
11346 | var stopped = settings.triggerEvent('paste', event); |
||
11347 | if (stopped) { |
||
11348 | event.kill(); |
||
11349 | } |
||
637 | daniel-mar | 11350 | pasteTimeout.set(setTimeout(function () { |
597 | daniel-mar | 11351 | settings.triggerEvent(postPaste(), event); |
637 | daniel-mar | 11352 | }, 0)); |
597 | daniel-mar | 11353 | }); |
637 | daniel-mar | 11354 | var onKeydown = bind(container, 'keydown', function (event) { |
597 | daniel-mar | 11355 | var stopped = settings.triggerEvent('keydown', event); |
11356 | if (stopped) { |
||
11357 | event.kill(); |
||
679 | daniel-mar | 11358 | } else if (settings.stopBackspace && isDangerous(event)) { |
597 | daniel-mar | 11359 | event.prevent(); |
11360 | } |
||
11361 | }); |
||
11362 | var onFocusIn = bindFocus(container, function (event) { |
||
11363 | var stopped = settings.triggerEvent('focusin', event); |
||
11364 | if (stopped) { |
||
11365 | event.kill(); |
||
11366 | } |
||
11367 | }); |
||
637 | daniel-mar | 11368 | var focusoutTimeout = value(); |
597 | daniel-mar | 11369 | var onFocusOut = bindBlur(container, function (event) { |
11370 | var stopped = settings.triggerEvent('focusout', event); |
||
11371 | if (stopped) { |
||
11372 | event.kill(); |
||
11373 | } |
||
637 | daniel-mar | 11374 | focusoutTimeout.set(setTimeout(function () { |
597 | daniel-mar | 11375 | settings.triggerEvent(postBlur(), event); |
637 | daniel-mar | 11376 | }, 0)); |
597 | daniel-mar | 11377 | }); |
11378 | var unbind = function () { |
||
637 | daniel-mar | 11379 | each$1(simpleEvents, function (e) { |
597 | daniel-mar | 11380 | e.unbind(); |
11381 | }); |
||
11382 | onKeydown.unbind(); |
||
11383 | onFocusIn.unbind(); |
||
11384 | onFocusOut.unbind(); |
||
11385 | onPaste.unbind(); |
||
637 | daniel-mar | 11386 | pasteTimeout.on(clearTimeout); |
11387 | focusoutTimeout.on(clearTimeout); |
||
597 | daniel-mar | 11388 | }; |
11389 | return { unbind: unbind }; |
||
11390 | }; |
||
11391 | |||
637 | daniel-mar | 11392 | var derive$1 = function (rawEvent, rawTarget) { |
11393 | var source = get$c(rawEvent, 'target').getOr(rawTarget); |
||
597 | daniel-mar | 11394 | return Cell(source); |
11395 | }; |
||
11396 | |||
11397 | var fromSource = function (event, source) { |
||
11398 | var stopper = Cell(false); |
||
11399 | var cutter = Cell(false); |
||
11400 | var stop = function () { |
||
11401 | stopper.set(true); |
||
11402 | }; |
||
11403 | var cut = function () { |
||
11404 | cutter.set(true); |
||
11405 | }; |
||
11406 | return { |
||
11407 | stop: stop, |
||
11408 | cut: cut, |
||
11409 | isStopped: stopper.get, |
||
11410 | isCut: cutter.get, |
||
11411 | event: event, |
||
11412 | setSource: source.set, |
||
11413 | getSource: source.get |
||
11414 | }; |
||
11415 | }; |
||
11416 | var fromExternal = function (event) { |
||
11417 | var stopper = Cell(false); |
||
11418 | var stop = function () { |
||
11419 | stopper.set(true); |
||
11420 | }; |
||
11421 | return { |
||
11422 | stop: stop, |
||
11423 | cut: noop, |
||
11424 | isStopped: stopper.get, |
||
11425 | isCut: never, |
||
11426 | event: event, |
||
11427 | setSource: die('Cannot set source of a broadcasted event'), |
||
11428 | getSource: die('Cannot get source of a broadcasted event') |
||
11429 | }; |
||
11430 | }; |
||
11431 | |||
637 | daniel-mar | 11432 | var adt = Adt.generate([ |
597 | daniel-mar | 11433 | { stopped: [] }, |
11434 | { resume: ['element'] }, |
||
11435 | { complete: [] } |
||
11436 | ]); |
||
11437 | var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) { |
||
11438 | var handler = lookup(eventType, target); |
||
11439 | var simulatedEvent = fromSource(rawEvent, source); |
||
11440 | return handler.fold(function () { |
||
11441 | logger.logEventNoHandlers(eventType, target); |
||
637 | daniel-mar | 11442 | return adt.complete(); |
597 | daniel-mar | 11443 | }, function (handlerInfo) { |
11444 | var descHandler = handlerInfo.descHandler; |
||
11445 | var eventHandler = getCurried(descHandler); |
||
11446 | eventHandler(simulatedEvent); |
||
11447 | if (simulatedEvent.isStopped()) { |
||
11448 | logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose); |
||
637 | daniel-mar | 11449 | return adt.stopped(); |
597 | daniel-mar | 11450 | } else if (simulatedEvent.isCut()) { |
11451 | logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose); |
||
637 | daniel-mar | 11452 | return adt.complete(); |
597 | daniel-mar | 11453 | } else { |
11454 | return parent(handlerInfo.element).fold(function () { |
||
11455 | logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose); |
||
637 | daniel-mar | 11456 | return adt.complete(); |
597 | daniel-mar | 11457 | }, function (parent) { |
11458 | logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose); |
||
637 | daniel-mar | 11459 | return adt.resume(parent); |
597 | daniel-mar | 11460 | }); |
11461 | } |
||
11462 | }); |
||
11463 | }; |
||
11464 | var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) { |
||
11465 | return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, function (parent) { |
||
11466 | return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger); |
||
11467 | }, never); |
||
11468 | }; |
||
11469 | var triggerHandler = function (lookup, eventType, rawEvent, target, logger) { |
||
637 | daniel-mar | 11470 | var source = derive$1(rawEvent, target); |
597 | daniel-mar | 11471 | return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger); |
11472 | }; |
||
11473 | var broadcast = function (listeners, rawEvent, _logger) { |
||
11474 | var simulatedEvent = fromExternal(rawEvent); |
||
637 | daniel-mar | 11475 | each$1(listeners, function (listener) { |
597 | daniel-mar | 11476 | var descHandler = listener.descHandler; |
11477 | var handler = getCurried(descHandler); |
||
11478 | handler(simulatedEvent); |
||
11479 | }); |
||
11480 | return simulatedEvent.isStopped(); |
||
11481 | }; |
||
11482 | var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) { |
||
11483 | return triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger); |
||
11484 | }; |
||
11485 | var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) { |
||
637 | daniel-mar | 11486 | var source = derive$1(rawEvent, rawTarget); |
597 | daniel-mar | 11487 | return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger); |
11488 | }; |
||
11489 | |||
11490 | var eventHandler = function (element, descHandler) { |
||
11491 | return { |
||
11492 | element: element, |
||
11493 | descHandler: descHandler |
||
11494 | }; |
||
11495 | }; |
||
11496 | var broadcastHandler = function (id, handler) { |
||
11497 | return { |
||
11498 | id: id, |
||
11499 | descHandler: handler |
||
11500 | }; |
||
11501 | }; |
||
11502 | var EventRegistry = function () { |
||
11503 | var registry = {}; |
||
11504 | var registerId = function (extraArgs, id, events) { |
||
637 | daniel-mar | 11505 | each(events, function (v, k) { |
597 | daniel-mar | 11506 | var handlers = registry[k] !== undefined ? registry[k] : {}; |
11507 | handlers[id] = curryArgs(v, extraArgs); |
||
11508 | registry[k] = handlers; |
||
11509 | }); |
||
11510 | }; |
||
11511 | var findHandler = function (handlers, elem) { |
||
679 | daniel-mar | 11512 | return read(elem).bind(function (id) { |
11513 | return get$c(handlers, id); |
||
11514 | }).map(function (descHandler) { |
||
11515 | return eventHandler(elem, descHandler); |
||
597 | daniel-mar | 11516 | }); |
11517 | }; |
||
11518 | var filterByType = function (type) { |
||
637 | daniel-mar | 11519 | return get$c(registry, type).map(function (handlers) { |
597 | daniel-mar | 11520 | return mapToArray(handlers, function (f, id) { |
11521 | return broadcastHandler(id, f); |
||
11522 | }); |
||
11523 | }).getOr([]); |
||
11524 | }; |
||
11525 | var find = function (isAboveRoot, type, target) { |
||
679 | daniel-mar | 11526 | return get$c(registry, type).bind(function (handlers) { |
11527 | return closest$3(target, function (elem) { |
||
11528 | return findHandler(handlers, elem); |
||
11529 | }, isAboveRoot); |
||
11530 | }); |
||
597 | daniel-mar | 11531 | }; |
11532 | var unregisterId = function (id) { |
||
637 | daniel-mar | 11533 | each(registry, function (handlersById, _eventName) { |
11534 | if (has$2(handlersById, id)) { |
||
597 | daniel-mar | 11535 | delete handlersById[id]; |
11536 | } |
||
11537 | }); |
||
11538 | }; |
||
11539 | return { |
||
11540 | registerId: registerId, |
||
11541 | unregisterId: unregisterId, |
||
11542 | filterByType: filterByType, |
||
11543 | find: find |
||
11544 | }; |
||
11545 | }; |
||
11546 | |||
11547 | var Registry = function () { |
||
11548 | var events = EventRegistry(); |
||
11549 | var components = {}; |
||
11550 | var readOrTag = function (component) { |
||
11551 | var elem = component.element; |
||
637 | daniel-mar | 11552 | return read(elem).getOrThunk(function () { |
597 | daniel-mar | 11553 | return write('uid-', component.element); |
11554 | }); |
||
11555 | }; |
||
11556 | var failOnDuplicate = function (component, tagId) { |
||
11557 | var conflict = components[tagId]; |
||
11558 | if (conflict === component) { |
||
11559 | unregister(component); |
||
11560 | } else { |
||
11561 | throw new Error('The tagId "' + tagId + '" is already used by: ' + element(conflict.element) + '\nCannot use it for: ' + element(component.element) + '\n' + 'The conflicting element is' + (inBody(conflict.element) ? ' ' : ' not ') + 'already in the DOM'); |
||
11562 | } |
||
11563 | }; |
||
11564 | var register = function (component) { |
||
11565 | var tagId = readOrTag(component); |
||
11566 | if (hasNonNullableKey(components, tagId)) { |
||
11567 | failOnDuplicate(component, tagId); |
||
11568 | } |
||
11569 | var extraArgs = [component]; |
||
11570 | events.registerId(extraArgs, tagId, component.events); |
||
11571 | components[tagId] = component; |
||
11572 | }; |
||
11573 | var unregister = function (component) { |
||
637 | daniel-mar | 11574 | read(component.element).each(function (tagId) { |
597 | daniel-mar | 11575 | delete components[tagId]; |
11576 | events.unregisterId(tagId); |
||
11577 | }); |
||
11578 | }; |
||
11579 | var filter = function (type) { |
||
11580 | return events.filterByType(type); |
||
11581 | }; |
||
11582 | var find = function (isAboveRoot, type, target) { |
||
11583 | return events.find(isAboveRoot, type, target); |
||
11584 | }; |
||
11585 | var getById = function (id) { |
||
637 | daniel-mar | 11586 | return get$c(components, id); |
597 | daniel-mar | 11587 | }; |
11588 | return { |
||
11589 | find: find, |
||
11590 | filter: filter, |
||
11591 | register: register, |
||
11592 | unregister: unregister, |
||
11593 | getById: getById |
||
11594 | }; |
||
11595 | }; |
||
11596 | |||
637 | daniel-mar | 11597 | var takeover$1 = function (root) { |
597 | daniel-mar | 11598 | var isAboveRoot = function (el) { |
11599 | return parent(root.element).fold(always, function (parent) { |
||
11600 | return eq(el, parent); |
||
11601 | }); |
||
11602 | }; |
||
11603 | var registry = Registry(); |
||
11604 | var lookup = function (eventName, target) { |
||
11605 | return registry.find(isAboveRoot, eventName, target); |
||
11606 | }; |
||
637 | daniel-mar | 11607 | var domEvents = setup$1(root.element, { |
597 | daniel-mar | 11608 | triggerEvent: function (eventName, event) { |
11609 | return monitorEvent(eventName, event.target, function (logger) { |
||
11610 | return triggerUntilStopped(lookup, eventName, event, logger); |
||
11611 | }); |
||
11612 | } |
||
11613 | }); |
||
11614 | var systemApi = { |
||
637 | daniel-mar | 11615 | debugInfo: constant$1('real'), |
597 | daniel-mar | 11616 | triggerEvent: function (eventName, target, data) { |
11617 | monitorEvent(eventName, target, function (logger) { |
||
11618 | return triggerOnUntilStopped(lookup, eventName, data, target, logger); |
||
11619 | }); |
||
11620 | }, |
||
11621 | triggerFocus: function (target, originator) { |
||
637 | daniel-mar | 11622 | read(target).fold(function () { |
11623 | focus$3(target); |
||
597 | daniel-mar | 11624 | }, function (_alloyId) { |
637 | daniel-mar | 11625 | monitorEvent(focus$4(), target, function (logger) { |
11626 | triggerHandler(lookup, focus$4(), { |
||
597 | daniel-mar | 11627 | originator: originator, |
11628 | kill: noop, |
||
11629 | prevent: noop, |
||
11630 | target: target |
||
11631 | }, target, logger); |
||
11632 | return false; |
||
11633 | }); |
||
11634 | }); |
||
11635 | }, |
||
11636 | triggerEscape: function (comp, simulatedEvent) { |
||
11637 | systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event); |
||
11638 | }, |
||
11639 | getByUid: function (uid) { |
||
11640 | return getByUid(uid); |
||
11641 | }, |
||
11642 | getByDom: function (elem) { |
||
11643 | return getByDom(elem); |
||
11644 | }, |
||
11645 | build: build$1, |
||
11646 | addToGui: function (c) { |
||
11647 | add(c); |
||
11648 | }, |
||
11649 | removeFromGui: function (c) { |
||
637 | daniel-mar | 11650 | remove(c); |
597 | daniel-mar | 11651 | }, |
11652 | addToWorld: function (c) { |
||
11653 | addToWorld(c); |
||
11654 | }, |
||
11655 | removeFromWorld: function (c) { |
||
11656 | removeFromWorld(c); |
||
11657 | }, |
||
11658 | broadcast: function (message) { |
||
11659 | broadcast$1(message); |
||
11660 | }, |
||
11661 | broadcastOn: function (channels, message) { |
||
11662 | broadcastOn(channels, message); |
||
11663 | }, |
||
11664 | broadcastEvent: function (eventName, event) { |
||
11665 | broadcastEvent(eventName, event); |
||
11666 | }, |
||
11667 | isConnected: always |
||
11668 | }; |
||
11669 | var addToWorld = function (component) { |
||
11670 | component.connect(systemApi); |
||
11671 | if (!isText(component.element)) { |
||
11672 | registry.register(component); |
||
637 | daniel-mar | 11673 | each$1(component.components(), addToWorld); |
597 | daniel-mar | 11674 | systemApi.triggerEvent(systemInit(), component.element, { target: component.element }); |
11675 | } |
||
11676 | }; |
||
11677 | var removeFromWorld = function (component) { |
||
11678 | if (!isText(component.element)) { |
||
637 | daniel-mar | 11679 | each$1(component.components(), removeFromWorld); |
597 | daniel-mar | 11680 | registry.unregister(component); |
11681 | } |
||
11682 | component.disconnect(); |
||
11683 | }; |
||
11684 | var add = function (component) { |
||
637 | daniel-mar | 11685 | attach(root, component); |
597 | daniel-mar | 11686 | }; |
637 | daniel-mar | 11687 | var remove = function (component) { |
597 | daniel-mar | 11688 | detach(component); |
11689 | }; |
||
11690 | var destroy = function () { |
||
11691 | domEvents.unbind(); |
||
637 | daniel-mar | 11692 | remove$7(root.element); |
597 | daniel-mar | 11693 | }; |
11694 | var broadcastData = function (data) { |
||
637 | daniel-mar | 11695 | var receivers = registry.filter(receive$1()); |
11696 | each$1(receivers, function (receiver) { |
||
597 | daniel-mar | 11697 | var descHandler = receiver.descHandler; |
11698 | var handler = getCurried(descHandler); |
||
11699 | handler(data); |
||
11700 | }); |
||
11701 | }; |
||
11702 | var broadcast$1 = function (message) { |
||
11703 | broadcastData({ |
||
11704 | universal: true, |
||
11705 | data: message |
||
11706 | }); |
||
11707 | }; |
||
11708 | var broadcastOn = function (channels, message) { |
||
11709 | broadcastData({ |
||
11710 | universal: false, |
||
11711 | channels: channels, |
||
11712 | data: message |
||
11713 | }); |
||
11714 | }; |
||
11715 | var broadcastEvent = function (eventName, event) { |
||
11716 | var listeners = registry.filter(eventName); |
||
11717 | return broadcast(listeners, event); |
||
11718 | }; |
||
11719 | var getByUid = function (uid) { |
||
11720 | return registry.getById(uid).fold(function () { |
||
11721 | return Result.error(new Error('Could not find component with uid: "' + uid + '" in system.')); |
||
11722 | }, Result.value); |
||
11723 | }; |
||
11724 | var getByDom = function (elem) { |
||
637 | daniel-mar | 11725 | var uid = read(elem).getOr('not found'); |
597 | daniel-mar | 11726 | return getByUid(uid); |
11727 | }; |
||
11728 | addToWorld(root); |
||
11729 | return { |
||
11730 | root: root, |
||
11731 | element: root.element, |
||
11732 | destroy: destroy, |
||
11733 | add: add, |
||
637 | daniel-mar | 11734 | remove: remove, |
597 | daniel-mar | 11735 | getByUid: getByUid, |
11736 | getByDom: getByDom, |
||
11737 | addToWorld: addToWorld, |
||
11738 | removeFromWorld: removeFromWorld, |
||
11739 | broadcast: broadcast$1, |
||
11740 | broadcastOn: broadcastOn, |
||
11741 | broadcastEvent: broadcastEvent |
||
11742 | }; |
||
11743 | }; |
||
11744 | |||
11745 | var READ_ONLY_MODE_CLASS = resolve('readonly-mode'); |
||
11746 | var EDIT_MODE_CLASS = resolve('edit-mode'); |
||
11747 | function OuterContainer (spec) { |
||
11748 | var root = build$1(Container.sketch({ |
||
11749 | dom: { classes: [resolve('outer-container')].concat(spec.classes) }, |
||
637 | daniel-mar | 11750 | containerBehaviours: derive$2([Swapping.config({ |
597 | daniel-mar | 11751 | alpha: READ_ONLY_MODE_CLASS, |
11752 | omega: EDIT_MODE_CLASS |
||
11753 | })]) |
||
11754 | })); |
||
637 | daniel-mar | 11755 | return takeover$1(root); |
597 | daniel-mar | 11756 | } |
11757 | |||
11758 | function AndroidRealm (scrollIntoView) { |
||
11759 | var alloy = OuterContainer({ classes: [resolve('android-container')] }); |
||
11760 | var toolbar = ScrollingToolbar(); |
||
11761 | var webapp = api$2(); |
||
11762 | var switchToEdit = makeEditSwitch(webapp); |
||
11763 | var socket = makeSocket(); |
||
637 | daniel-mar | 11764 | var dropup = build(noop, scrollIntoView); |
597 | daniel-mar | 11765 | alloy.add(toolbar.wrapper); |
11766 | alloy.add(socket); |
||
11767 | alloy.add(dropup.component); |
||
11768 | var setToolbarGroups = function (rawGroups) { |
||
11769 | var groups = toolbar.createGroups(rawGroups); |
||
11770 | toolbar.setGroups(groups); |
||
11771 | }; |
||
11772 | var setContextToolbar = function (rawGroups) { |
||
11773 | var groups = toolbar.createGroups(rawGroups); |
||
11774 | toolbar.setContextToolbar(groups); |
||
11775 | }; |
||
11776 | var focusToolbar = function () { |
||
11777 | toolbar.focus(); |
||
11778 | }; |
||
11779 | var restoreToolbar = function () { |
||
11780 | toolbar.restoreToolbar(); |
||
11781 | }; |
||
11782 | var init = function (spec) { |
||
637 | daniel-mar | 11783 | webapp.set(produce$1(spec)); |
597 | daniel-mar | 11784 | }; |
11785 | var exit = function () { |
||
11786 | webapp.run(function (w) { |
||
11787 | w.exit(); |
||
11788 | Replacing.remove(socket, switchToEdit); |
||
11789 | }); |
||
11790 | }; |
||
11791 | var updateMode$1 = function (readOnly) { |
||
11792 | updateMode(socket, switchToEdit, readOnly, alloy.root); |
||
11793 | }; |
||
11794 | return { |
||
11795 | system: alloy, |
||
11796 | element: alloy.element, |
||
11797 | init: init, |
||
11798 | exit: exit, |
||
11799 | setToolbarGroups: setToolbarGroups, |
||
11800 | setContextToolbar: setContextToolbar, |
||
11801 | focusToolbar: focusToolbar, |
||
11802 | restoreToolbar: restoreToolbar, |
||
11803 | updateMode: updateMode$1, |
||
11804 | socket: socket, |
||
11805 | dropup: dropup |
||
11806 | }; |
||
11807 | } |
||
11808 | |||
637 | daniel-mar | 11809 | var input = function (parent, operation) { |
597 | daniel-mar | 11810 | var input = SugarElement.fromTag('input'); |
637 | daniel-mar | 11811 | setAll(input, { |
597 | daniel-mar | 11812 | opacity: '0', |
11813 | position: 'absolute', |
||
11814 | top: '-1000px', |
||
11815 | left: '-1000px' |
||
11816 | }); |
||
637 | daniel-mar | 11817 | append$2(parent, input); |
11818 | focus$3(input); |
||
597 | daniel-mar | 11819 | operation(input); |
637 | daniel-mar | 11820 | remove$7(input); |
597 | daniel-mar | 11821 | }; |
11822 | |||
637 | daniel-mar | 11823 | var refresh = function (winScope) { |
597 | daniel-mar | 11824 | var sel = winScope.getSelection(); |
11825 | if (sel.rangeCount > 0) { |
||
11826 | var br = sel.getRangeAt(0); |
||
11827 | var r = winScope.document.createRange(); |
||
11828 | r.setStart(br.startContainer, br.startOffset); |
||
11829 | r.setEnd(br.endContainer, br.endOffset); |
||
11830 | sel.removeAllRanges(); |
||
11831 | sel.addRange(r); |
||
11832 | } |
||
11833 | }; |
||
11834 | |||
637 | daniel-mar | 11835 | var resume = function (cWin, frame) { |
597 | daniel-mar | 11836 | active().each(function (active) { |
11837 | if (!eq(active, frame)) { |
||
637 | daniel-mar | 11838 | blur$1(active); |
597 | daniel-mar | 11839 | } |
11840 | }); |
||
11841 | cWin.focus(); |
||
637 | daniel-mar | 11842 | focus$3(SugarElement.fromDom(cWin.document.body)); |
11843 | refresh(cWin); |
||
597 | daniel-mar | 11844 | }; |
11845 | |||
11846 | var stubborn = function (outerBody, cWin, page, frame) { |
||
11847 | var toEditing = function () { |
||
637 | daniel-mar | 11848 | resume(cWin, frame); |
597 | daniel-mar | 11849 | }; |
11850 | var toReading = function () { |
||
637 | daniel-mar | 11851 | input(outerBody, blur$1); |
597 | daniel-mar | 11852 | }; |
637 | daniel-mar | 11853 | var captureInput = bind(page, 'keydown', function (evt) { |
11854 | if (!contains$1([ |
||
597 | daniel-mar | 11855 | 'input', |
11856 | 'textarea' |
||
637 | daniel-mar | 11857 | ], name$1(evt.target))) { |
597 | daniel-mar | 11858 | toEditing(); |
11859 | } |
||
11860 | }); |
||
11861 | var onToolbarTouch = noop; |
||
11862 | var destroy = function () { |
||
11863 | captureInput.unbind(); |
||
11864 | }; |
||
11865 | return { |
||
11866 | toReading: toReading, |
||
11867 | toEditing: toEditing, |
||
11868 | onToolbarTouch: onToolbarTouch, |
||
11869 | destroy: destroy |
||
11870 | }; |
||
11871 | }; |
||
11872 | |||
637 | daniel-mar | 11873 | var initEvents = function (editorApi, iosApi, toolstrip, socket, _dropup) { |
597 | daniel-mar | 11874 | var saveSelectionFirst = function () { |
11875 | iosApi.run(function (api) { |
||
11876 | api.highlightSelection(); |
||
11877 | }); |
||
11878 | }; |
||
11879 | var refreshIosSelection = function () { |
||
11880 | iosApi.run(function (api) { |
||
11881 | api.refreshSelection(); |
||
11882 | }); |
||
11883 | }; |
||
11884 | var scrollToY = function (yTop, height) { |
||
11885 | var y = yTop - socket.dom.scrollTop; |
||
11886 | iosApi.run(function (api) { |
||
11887 | api.scrollIntoView(y, y + height); |
||
11888 | }); |
||
11889 | }; |
||
11890 | var scrollToElement = function (_target) { |
||
11891 | scrollToY(iosApi, socket); |
||
11892 | }; |
||
11893 | var scrollToCursor = function () { |
||
11894 | editorApi.getCursorBox().each(function (box) { |
||
11895 | scrollToY(box.top, box.height); |
||
11896 | }); |
||
11897 | }; |
||
11898 | var clearSelection = function () { |
||
11899 | iosApi.run(function (api) { |
||
11900 | api.clearSelection(); |
||
11901 | }); |
||
11902 | }; |
||
11903 | var clearAndRefresh = function () { |
||
11904 | clearSelection(); |
||
11905 | refreshThrottle.throttle(); |
||
11906 | }; |
||
11907 | var refreshView = function () { |
||
11908 | scrollToCursor(); |
||
11909 | iosApi.run(function (api) { |
||
11910 | api.syncHeight(); |
||
11911 | }); |
||
11912 | }; |
||
11913 | var reposition = function () { |
||
637 | daniel-mar | 11914 | var toolbarHeight = get$7(toolstrip); |
597 | daniel-mar | 11915 | iosApi.run(function (api) { |
11916 | api.setViewportOffset(toolbarHeight); |
||
11917 | }); |
||
11918 | refreshIosSelection(); |
||
11919 | refreshView(); |
||
11920 | }; |
||
11921 | var toEditing = function () { |
||
11922 | iosApi.run(function (api) { |
||
11923 | api.toEditing(); |
||
11924 | }); |
||
11925 | }; |
||
11926 | var toReading = function () { |
||
11927 | iosApi.run(function (api) { |
||
11928 | api.toReading(); |
||
11929 | }); |
||
11930 | }; |
||
11931 | var onToolbarTouch = function (event) { |
||
11932 | iosApi.run(function (api) { |
||
11933 | api.onToolbarTouch(event); |
||
11934 | }); |
||
11935 | }; |
||
637 | daniel-mar | 11936 | var tapping = monitor(editorApi); |
597 | daniel-mar | 11937 | var refreshThrottle = last(refreshView, 300); |
11938 | var listeners = [ |
||
11939 | editorApi.onKeyup(clearAndRefresh), |
||
11940 | editorApi.onNodeChanged(refreshIosSelection), |
||
11941 | editorApi.onDomChanged(refreshThrottle.throttle), |
||
11942 | editorApi.onDomChanged(refreshIosSelection), |
||
11943 | editorApi.onScrollToCursor(function (tinyEvent) { |
||
11944 | tinyEvent.preventDefault(); |
||
11945 | refreshThrottle.throttle(); |
||
11946 | }), |
||
11947 | editorApi.onScrollToElement(function (event) { |
||
11948 | scrollToElement(event.element); |
||
11949 | }), |
||
11950 | editorApi.onToEditing(toEditing), |
||
11951 | editorApi.onToReading(toReading), |
||
637 | daniel-mar | 11952 | bind(editorApi.doc, 'touchend', function (touchEvent) { |
597 | daniel-mar | 11953 | if (eq(editorApi.html, touchEvent.target) || eq(editorApi.body, touchEvent.target)) ; |
11954 | }), |
||
637 | daniel-mar | 11955 | bind(toolstrip, 'transitionend', function (transitionEvent) { |
597 | daniel-mar | 11956 | if (transitionEvent.raw.propertyName === 'height') { |
11957 | reposition(); |
||
11958 | } |
||
11959 | }), |
||
637 | daniel-mar | 11960 | capture(toolstrip, 'touchstart', function (touchEvent) { |
597 | daniel-mar | 11961 | saveSelectionFirst(); |
11962 | onToolbarTouch(touchEvent); |
||
11963 | editorApi.onTouchToolstrip(); |
||
11964 | }), |
||
637 | daniel-mar | 11965 | bind(editorApi.body, 'touchstart', function (evt) { |
597 | daniel-mar | 11966 | clearSelection(); |
11967 | editorApi.onTouchContent(); |
||
11968 | tapping.fireTouchstart(evt); |
||
11969 | }), |
||
11970 | tapping.onTouchmove(), |
||
11971 | tapping.onTouchend(), |
||
637 | daniel-mar | 11972 | bind(editorApi.body, 'click', function (event) { |
597 | daniel-mar | 11973 | event.kill(); |
11974 | }), |
||
637 | daniel-mar | 11975 | bind(toolstrip, 'touchmove', function () { |
597 | daniel-mar | 11976 | editorApi.onToolbarScrollStart(); |
11977 | }) |
||
11978 | ]; |
||
11979 | var destroy = function () { |
||
637 | daniel-mar | 11980 | each$1(listeners, function (l) { |
597 | daniel-mar | 11981 | l.unbind(); |
11982 | }); |
||
11983 | }; |
||
11984 | return { destroy: destroy }; |
||
11985 | }; |
||
11986 | |||
11987 | function FakeSelection (win, frame) { |
||
11988 | var doc = win.document; |
||
11989 | var container = SugarElement.fromTag('div'); |
||
637 | daniel-mar | 11990 | add$1(container, resolve('unfocused-selections')); |
11991 | append$2(SugarElement.fromDom(doc.documentElement), container); |
||
11992 | var onTouch = bind(container, 'touchstart', function (event) { |
||
597 | daniel-mar | 11993 | event.prevent(); |
637 | daniel-mar | 11994 | resume(win, frame); |
597 | daniel-mar | 11995 | clear(); |
11996 | }); |
||
11997 | var make = function (rectangle) { |
||
11998 | var span = SugarElement.fromTag('span'); |
||
637 | daniel-mar | 11999 | add(span, [ |
597 | daniel-mar | 12000 | resolve('layer-editor'), |
12001 | resolve('unfocused-selection') |
||
12002 | ]); |
||
637 | daniel-mar | 12003 | setAll(span, { |
597 | daniel-mar | 12004 | left: rectangle.left + 'px', |
12005 | top: rectangle.top + 'px', |
||
12006 | width: rectangle.width + 'px', |
||
12007 | height: rectangle.height + 'px' |
||
12008 | }); |
||
12009 | return span; |
||
12010 | }; |
||
12011 | var update = function () { |
||
12012 | clear(); |
||
12013 | var rectangles = getRectangles(win); |
||
637 | daniel-mar | 12014 | var spans = map$2(rectangles, make); |
597 | daniel-mar | 12015 | append$1(container, spans); |
12016 | }; |
||
12017 | var clear = function () { |
||
12018 | empty(container); |
||
12019 | }; |
||
12020 | var destroy = function () { |
||
12021 | onTouch.unbind(); |
||
637 | daniel-mar | 12022 | remove$7(container); |
597 | daniel-mar | 12023 | }; |
12024 | var isActive = function () { |
||
12025 | return children(container).length > 0; |
||
12026 | }; |
||
12027 | return { |
||
12028 | update: update, |
||
12029 | isActive: isActive, |
||
12030 | destroy: destroy, |
||
12031 | clear: clear |
||
12032 | }; |
||
12033 | } |
||
12034 | |||
637 | daniel-mar | 12035 | var nu$1 = function (baseFn) { |
597 | daniel-mar | 12036 | var data = Optional.none(); |
12037 | var callbacks = []; |
||
12038 | var map = function (f) { |
||
637 | daniel-mar | 12039 | return nu$1(function (nCallback) { |
597 | daniel-mar | 12040 | get(function (data) { |
12041 | nCallback(f(data)); |
||
12042 | }); |
||
12043 | }); |
||
12044 | }; |
||
12045 | var get = function (nCallback) { |
||
12046 | if (isReady()) { |
||
12047 | call(nCallback); |
||
12048 | } else { |
||
12049 | callbacks.push(nCallback); |
||
12050 | } |
||
12051 | }; |
||
12052 | var set = function (x) { |
||
12053 | if (!isReady()) { |
||
12054 | data = Optional.some(x); |
||
12055 | run(callbacks); |
||
12056 | callbacks = []; |
||
12057 | } |
||
12058 | }; |
||
12059 | var isReady = function () { |
||
12060 | return data.isSome(); |
||
12061 | }; |
||
12062 | var run = function (cbs) { |
||
637 | daniel-mar | 12063 | each$1(cbs, call); |
597 | daniel-mar | 12064 | }; |
12065 | var call = function (cb) { |
||
12066 | data.each(function (x) { |
||
12067 | setTimeout(function () { |
||
12068 | cb(x); |
||
12069 | }, 0); |
||
12070 | }); |
||
12071 | }; |
||
12072 | baseFn(set); |
||
12073 | return { |
||
12074 | get: get, |
||
12075 | map: map, |
||
12076 | isReady: isReady |
||
12077 | }; |
||
12078 | }; |
||
12079 | var pure$1 = function (a) { |
||
637 | daniel-mar | 12080 | return nu$1(function (callback) { |
597 | daniel-mar | 12081 | callback(a); |
12082 | }); |
||
12083 | }; |
||
12084 | var LazyValue = { |
||
637 | daniel-mar | 12085 | nu: nu$1, |
597 | daniel-mar | 12086 | pure: pure$1 |
12087 | }; |
||
12088 | |||
12089 | var errorReporter = function (err) { |
||
12090 | setTimeout(function () { |
||
12091 | throw err; |
||
12092 | }, 0); |
||
12093 | }; |
||
637 | daniel-mar | 12094 | var make = function (run) { |
597 | daniel-mar | 12095 | var get = function (callback) { |
12096 | run().then(callback, errorReporter); |
||
12097 | }; |
||
12098 | var map = function (fab) { |
||
637 | daniel-mar | 12099 | return make(function () { |
597 | daniel-mar | 12100 | return run().then(fab); |
12101 | }); |
||
12102 | }; |
||
12103 | var bind = function (aFutureB) { |
||
637 | daniel-mar | 12104 | return make(function () { |
597 | daniel-mar | 12105 | return run().then(function (v) { |
12106 | return aFutureB(v).toPromise(); |
||
12107 | }); |
||
12108 | }); |
||
12109 | }; |
||
12110 | var anonBind = function (futureB) { |
||
637 | daniel-mar | 12111 | return make(function () { |
597 | daniel-mar | 12112 | return run().then(function () { |
12113 | return futureB.toPromise(); |
||
12114 | }); |
||
12115 | }); |
||
12116 | }; |
||
12117 | var toLazy = function () { |
||
12118 | return LazyValue.nu(get); |
||
12119 | }; |
||
12120 | var toCached = function () { |
||
12121 | var cache = null; |
||
637 | daniel-mar | 12122 | return make(function () { |
597 | daniel-mar | 12123 | if (cache === null) { |
12124 | cache = run(); |
||
12125 | } |
||
12126 | return cache; |
||
12127 | }); |
||
12128 | }; |
||
12129 | var toPromise = run; |
||
12130 | return { |
||
12131 | map: map, |
||
12132 | bind: bind, |
||
12133 | anonBind: anonBind, |
||
12134 | toLazy: toLazy, |
||
12135 | toCached: toCached, |
||
12136 | toPromise: toPromise, |
||
12137 | get: get |
||
12138 | }; |
||
12139 | }; |
||
637 | daniel-mar | 12140 | var nu = function (baseFn) { |
12141 | return make(function () { |
||
597 | daniel-mar | 12142 | return new Promise$1(baseFn); |
12143 | }); |
||
12144 | }; |
||
637 | daniel-mar | 12145 | var pure = function (a) { |
12146 | return make(function () { |
||
597 | daniel-mar | 12147 | return Promise$1.resolve(a); |
12148 | }); |
||
12149 | }; |
||
12150 | var Future = { |
||
637 | daniel-mar | 12151 | nu: nu, |
12152 | pure: pure |
||
597 | daniel-mar | 12153 | }; |
12154 | |||
12155 | var adjust = function (value, destination, amount) { |
||
12156 | if (Math.abs(value - destination) <= amount) { |
||
12157 | return Optional.none(); |
||
12158 | } else if (value < destination) { |
||
12159 | return Optional.some(value + amount); |
||
12160 | } else { |
||
12161 | return Optional.some(value - amount); |
||
12162 | } |
||
12163 | }; |
||
637 | daniel-mar | 12164 | var create$1 = function () { |
597 | daniel-mar | 12165 | var interval = null; |
12166 | var animate = function (getCurrent, destination, amount, increment, doFinish, rate) { |
||
12167 | var finished = false; |
||
12168 | var finish = function (v) { |
||
12169 | finished = true; |
||
12170 | doFinish(v); |
||
12171 | }; |
||
637 | daniel-mar | 12172 | global$2.clearInterval(interval); |
597 | daniel-mar | 12173 | var abort = function (v) { |
637 | daniel-mar | 12174 | global$2.clearInterval(interval); |
597 | daniel-mar | 12175 | finish(v); |
12176 | }; |
||
637 | daniel-mar | 12177 | interval = global$2.setInterval(function () { |
597 | daniel-mar | 12178 | var value = getCurrent(); |
12179 | adjust(value, destination, amount).fold(function () { |
||
637 | daniel-mar | 12180 | global$2.clearInterval(interval); |
597 | daniel-mar | 12181 | finish(destination); |
12182 | }, function (s) { |
||
12183 | increment(s, abort); |
||
12184 | if (!finished) { |
||
12185 | var newValue = getCurrent(); |
||
12186 | if (newValue !== s || Math.abs(newValue - destination) > Math.abs(value - destination)) { |
||
637 | daniel-mar | 12187 | global$2.clearInterval(interval); |
597 | daniel-mar | 12188 | finish(destination); |
12189 | } |
||
12190 | } |
||
12191 | }); |
||
12192 | }, rate); |
||
12193 | }; |
||
12194 | return { animate: animate }; |
||
12195 | }; |
||
12196 | |||
12197 | var findDevice = function (deviceWidth, deviceHeight) { |
||
12198 | var devices = [ |
||
12199 | { |
||
12200 | width: 320, |
||
12201 | height: 480, |
||
12202 | keyboard: { |
||
12203 | portrait: 300, |
||
12204 | landscape: 240 |
||
12205 | } |
||
12206 | }, |
||
12207 | { |
||
12208 | width: 320, |
||
12209 | height: 568, |
||
12210 | keyboard: { |
||
12211 | portrait: 300, |
||
12212 | landscape: 240 |
||
12213 | } |
||
12214 | }, |
||
12215 | { |
||
12216 | width: 375, |
||
12217 | height: 667, |
||
12218 | keyboard: { |
||
12219 | portrait: 305, |
||
12220 | landscape: 240 |
||
12221 | } |
||
12222 | }, |
||
12223 | { |
||
12224 | width: 414, |
||
12225 | height: 736, |
||
12226 | keyboard: { |
||
12227 | portrait: 320, |
||
12228 | landscape: 240 |
||
12229 | } |
||
12230 | }, |
||
12231 | { |
||
12232 | width: 768, |
||
12233 | height: 1024, |
||
12234 | keyboard: { |
||
12235 | portrait: 320, |
||
12236 | landscape: 400 |
||
12237 | } |
||
12238 | }, |
||
12239 | { |
||
12240 | width: 1024, |
||
12241 | height: 1366, |
||
12242 | keyboard: { |
||
12243 | portrait: 380, |
||
12244 | landscape: 460 |
||
12245 | } |
||
12246 | } |
||
12247 | ]; |
||
12248 | return findMap(devices, function (device) { |
||
12249 | return someIf(deviceWidth <= device.width && deviceHeight <= device.height, device.keyboard); |
||
12250 | }).getOr({ |
||
12251 | portrait: deviceHeight / 5, |
||
12252 | landscape: deviceWidth / 4 |
||
12253 | }); |
||
12254 | }; |
||
12255 | |||
12256 | var softKeyboardLimits = function (outerWindow) { |
||
12257 | return findDevice(outerWindow.screen.width, outerWindow.screen.height); |
||
12258 | }; |
||
12259 | var accountableKeyboardHeight = function (outerWindow) { |
||
637 | daniel-mar | 12260 | var portrait = get$1(outerWindow).isPortrait(); |
597 | daniel-mar | 12261 | var limits = softKeyboardLimits(outerWindow); |
12262 | var keyboard = portrait ? limits.portrait : limits.landscape; |
||
12263 | var visualScreenHeight = portrait ? outerWindow.screen.height : outerWindow.screen.width; |
||
12264 | return visualScreenHeight - outerWindow.innerHeight > keyboard ? 0 : keyboard; |
||
12265 | }; |
||
12266 | var getGreenzone = function (socket, dropup) { |
||
637 | daniel-mar | 12267 | var outerWindow = owner$2(socket).dom.defaultView; |
12268 | var viewportHeight = get$7(socket) + get$7(dropup); |
||
597 | daniel-mar | 12269 | var acc = accountableKeyboardHeight(outerWindow); |
12270 | return viewportHeight - acc; |
||
12271 | }; |
||
12272 | var updatePadding = function (contentBody, socket, dropup) { |
||
12273 | var greenzoneHeight = getGreenzone(socket, dropup); |
||
637 | daniel-mar | 12274 | var deltaHeight = get$7(socket) + get$7(dropup) - greenzoneHeight; |
12275 | set$5(contentBody, 'padding-bottom', deltaHeight + 'px'); |
||
597 | daniel-mar | 12276 | }; |
12277 | |||
12278 | var fixture = Adt.generate([ |
||
12279 | { |
||
12280 | fixed: [ |
||
12281 | 'element', |
||
12282 | 'property', |
||
12283 | 'offsetY' |
||
12284 | ] |
||
12285 | }, |
||
12286 | { |
||
12287 | scroller: [ |
||
12288 | 'element', |
||
12289 | 'offsetY' |
||
12290 | ] |
||
12291 | } |
||
12292 | ]); |
||
12293 | var yFixedData = 'data-' + resolve('position-y-fixed'); |
||
12294 | var yFixedProperty = 'data-' + resolve('y-property'); |
||
12295 | var yScrollingData = 'data-' + resolve('scrolling'); |
||
12296 | var windowSizeData = 'data-' + resolve('last-window-height'); |
||
12297 | var getYFixedData = function (element) { |
||
12298 | return safeParse(element, yFixedData); |
||
12299 | }; |
||
12300 | var getYFixedProperty = function (element) { |
||
637 | daniel-mar | 12301 | return get$b(element, yFixedProperty); |
597 | daniel-mar | 12302 | }; |
12303 | var getLastWindowSize = function (element) { |
||
12304 | return safeParse(element, windowSizeData); |
||
12305 | }; |
||
12306 | var classifyFixed = function (element, offsetY) { |
||
12307 | var prop = getYFixedProperty(element); |
||
12308 | return fixture.fixed(element, prop, offsetY); |
||
12309 | }; |
||
12310 | var classifyScrolling = function (element, offsetY) { |
||
12311 | return fixture.scroller(element, offsetY); |
||
12312 | }; |
||
12313 | var classify = function (element) { |
||
12314 | var offsetY = getYFixedData(element); |
||
637 | daniel-mar | 12315 | var classifier = get$b(element, yScrollingData) === 'true' ? classifyScrolling : classifyFixed; |
597 | daniel-mar | 12316 | return classifier(element, offsetY); |
12317 | }; |
||
12318 | var findFixtures = function (container) { |
||
12319 | var candidates = descendants(container, '[' + yFixedData + ']'); |
||
637 | daniel-mar | 12320 | return map$2(candidates, classify); |
597 | daniel-mar | 12321 | }; |
12322 | var takeoverToolbar = function (toolbar) { |
||
637 | daniel-mar | 12323 | var oldToolbarStyle = get$b(toolbar, 'style'); |
12324 | setAll(toolbar, { |
||
597 | daniel-mar | 12325 | position: 'absolute', |
12326 | top: '0px' |
||
12327 | }); |
||
637 | daniel-mar | 12328 | set$8(toolbar, yFixedData, '0px'); |
12329 | set$8(toolbar, yFixedProperty, 'top'); |
||
597 | daniel-mar | 12330 | var restore = function () { |
637 | daniel-mar | 12331 | set$8(toolbar, 'style', oldToolbarStyle || ''); |
12332 | remove$6(toolbar, yFixedData); |
||
12333 | remove$6(toolbar, yFixedProperty); |
||
597 | daniel-mar | 12334 | }; |
12335 | return { restore: restore }; |
||
12336 | }; |
||
12337 | var takeoverViewport = function (toolbarHeight, height, viewport) { |
||
637 | daniel-mar | 12338 | var oldViewportStyle = get$b(viewport, 'style'); |
12339 | register$2(viewport); |
||
12340 | setAll(viewport, { |
||
597 | daniel-mar | 12341 | position: 'absolute', |
12342 | height: height + 'px', |
||
12343 | width: '100%', |
||
12344 | top: toolbarHeight + 'px' |
||
12345 | }); |
||
637 | daniel-mar | 12346 | set$8(viewport, yFixedData, toolbarHeight + 'px'); |
12347 | set$8(viewport, yScrollingData, 'true'); |
||
12348 | set$8(viewport, yFixedProperty, 'top'); |
||
597 | daniel-mar | 12349 | var restore = function () { |
12350 | deregister(viewport); |
||
637 | daniel-mar | 12351 | set$8(viewport, 'style', oldViewportStyle || ''); |
12352 | remove$6(viewport, yFixedData); |
||
12353 | remove$6(viewport, yScrollingData); |
||
12354 | remove$6(viewport, yFixedProperty); |
||
597 | daniel-mar | 12355 | }; |
12356 | return { restore: restore }; |
||
12357 | }; |
||
12358 | var takeoverDropup = function (dropup) { |
||
637 | daniel-mar | 12359 | var oldDropupStyle = get$b(dropup, 'style'); |
12360 | setAll(dropup, { |
||
597 | daniel-mar | 12361 | position: 'absolute', |
12362 | bottom: '0px' |
||
12363 | }); |
||
637 | daniel-mar | 12364 | set$8(dropup, yFixedData, '0px'); |
12365 | set$8(dropup, yFixedProperty, 'bottom'); |
||
597 | daniel-mar | 12366 | var restore = function () { |
637 | daniel-mar | 12367 | set$8(dropup, 'style', oldDropupStyle || ''); |
12368 | remove$6(dropup, yFixedData); |
||
12369 | remove$6(dropup, yFixedProperty); |
||
597 | daniel-mar | 12370 | }; |
12371 | return { restore: restore }; |
||
12372 | }; |
||
12373 | var deriveViewportHeight = function (viewport, toolbarHeight, dropupHeight) { |
||
637 | daniel-mar | 12374 | var outerWindow = owner$2(viewport).dom.defaultView; |
597 | daniel-mar | 12375 | var winH = outerWindow.innerHeight; |
637 | daniel-mar | 12376 | set$8(viewport, windowSizeData, winH + 'px'); |
597 | daniel-mar | 12377 | return winH - toolbarHeight - dropupHeight; |
12378 | }; |
||
637 | daniel-mar | 12379 | var takeover = function (viewport, contentBody, toolbar, dropup) { |
12380 | var outerWindow = owner$2(viewport).dom.defaultView; |
||
597 | daniel-mar | 12381 | var toolbarSetup = takeoverToolbar(toolbar); |
637 | daniel-mar | 12382 | var toolbarHeight = get$7(toolbar); |
12383 | var dropupHeight = get$7(dropup); |
||
597 | daniel-mar | 12384 | var viewportHeight = deriveViewportHeight(viewport, toolbarHeight, dropupHeight); |
12385 | var viewportSetup = takeoverViewport(toolbarHeight, viewportHeight, viewport); |
||
12386 | var dropupSetup = takeoverDropup(dropup); |
||
12387 | var isActive = true; |
||
12388 | var restore = function () { |
||
12389 | isActive = false; |
||
12390 | toolbarSetup.restore(); |
||
12391 | viewportSetup.restore(); |
||
12392 | dropupSetup.restore(); |
||
12393 | }; |
||
12394 | var isExpanding = function () { |
||
12395 | var currentWinHeight = outerWindow.innerHeight; |
||
12396 | var lastWinHeight = getLastWindowSize(viewport); |
||
12397 | return currentWinHeight > lastWinHeight; |
||
12398 | }; |
||
12399 | var refresh = function () { |
||
12400 | if (isActive) { |
||
637 | daniel-mar | 12401 | var newToolbarHeight = get$7(toolbar); |
12402 | var dropupHeight_1 = get$7(dropup); |
||
597 | daniel-mar | 12403 | var newHeight = deriveViewportHeight(viewport, newToolbarHeight, dropupHeight_1); |
637 | daniel-mar | 12404 | set$8(viewport, yFixedData, newToolbarHeight + 'px'); |
12405 | set$5(viewport, 'height', newHeight + 'px'); |
||
597 | daniel-mar | 12406 | updatePadding(contentBody, viewport, dropup); |
12407 | } |
||
12408 | }; |
||
12409 | var setViewportOffset = function (newYOffset) { |
||
12410 | var offsetPx = newYOffset + 'px'; |
||
637 | daniel-mar | 12411 | set$8(viewport, yFixedData, offsetPx); |
597 | daniel-mar | 12412 | refresh(); |
12413 | }; |
||
12414 | updatePadding(contentBody, viewport, dropup); |
||
12415 | return { |
||
12416 | setViewportOffset: setViewportOffset, |
||
12417 | isExpanding: isExpanding, |
||
12418 | isShrinking: not(isExpanding), |
||
12419 | refresh: refresh, |
||
12420 | restore: restore |
||
12421 | }; |
||
12422 | }; |
||
12423 | |||
637 | daniel-mar | 12424 | var animator = create$1(); |
597 | daniel-mar | 12425 | var ANIMATION_STEP = 15; |
12426 | var NUM_TOP_ANIMATION_FRAMES = 10; |
||
12427 | var ANIMATION_RATE = 10; |
||
12428 | var lastScroll = 'data-' + resolve('last-scroll-top'); |
||
12429 | var getTop = function (element) { |
||
12430 | var raw = getRaw(element, 'top').getOr('0'); |
||
12431 | return parseInt(raw, 10); |
||
12432 | }; |
||
12433 | var getScrollTop = function (element) { |
||
12434 | return parseInt(element.dom.scrollTop, 10); |
||
12435 | }; |
||
12436 | var moveScrollAndTop = function (element, destination, finalTop) { |
||
12437 | return Future.nu(function (callback) { |
||
12438 | var getCurrent = curry(getScrollTop, element); |
||
12439 | var update = function (newScroll) { |
||
12440 | element.dom.scrollTop = newScroll; |
||
637 | daniel-mar | 12441 | set$5(element, 'top', getTop(element) + ANIMATION_STEP + 'px'); |
597 | daniel-mar | 12442 | }; |
12443 | var finish = function () { |
||
12444 | element.dom.scrollTop = destination; |
||
637 | daniel-mar | 12445 | set$5(element, 'top', finalTop + 'px'); |
597 | daniel-mar | 12446 | callback(destination); |
12447 | }; |
||
12448 | animator.animate(getCurrent, destination, ANIMATION_STEP, update, finish, ANIMATION_RATE); |
||
12449 | }); |
||
12450 | }; |
||
12451 | var moveOnlyScroll = function (element, destination) { |
||
12452 | return Future.nu(function (callback) { |
||
12453 | var getCurrent = curry(getScrollTop, element); |
||
637 | daniel-mar | 12454 | set$8(element, lastScroll, getCurrent()); |
597 | daniel-mar | 12455 | var update = function (newScroll, abort) { |
12456 | var previous = safeParse(element, lastScroll); |
||
12457 | if (previous !== element.dom.scrollTop) { |
||
12458 | abort(element.dom.scrollTop); |
||
12459 | } else { |
||
12460 | element.dom.scrollTop = newScroll; |
||
637 | daniel-mar | 12461 | set$8(element, lastScroll, newScroll); |
597 | daniel-mar | 12462 | } |
12463 | }; |
||
12464 | var finish = function () { |
||
12465 | element.dom.scrollTop = destination; |
||
637 | daniel-mar | 12466 | set$8(element, lastScroll, destination); |
597 | daniel-mar | 12467 | callback(destination); |
12468 | }; |
||
12469 | var distance = Math.abs(destination - getCurrent()); |
||
12470 | var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES); |
||
12471 | animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE); |
||
12472 | }); |
||
12473 | }; |
||
12474 | var moveOnlyTop = function (element, destination) { |
||
12475 | return Future.nu(function (callback) { |
||
12476 | var getCurrent = curry(getTop, element); |
||
12477 | var update = function (newTop) { |
||
637 | daniel-mar | 12478 | set$5(element, 'top', newTop + 'px'); |
597 | daniel-mar | 12479 | }; |
12480 | var finish = function () { |
||
12481 | update(destination); |
||
12482 | callback(destination); |
||
12483 | }; |
||
12484 | var distance = Math.abs(destination - getCurrent()); |
||
12485 | var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES); |
||
12486 | animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE); |
||
12487 | }); |
||
12488 | }; |
||
12489 | var updateTop = function (element, amount) { |
||
12490 | var newTop = amount + getYFixedData(element) + 'px'; |
||
637 | daniel-mar | 12491 | set$5(element, 'top', newTop); |
597 | daniel-mar | 12492 | }; |
12493 | var moveWindowScroll = function (toolbar, viewport, destY) { |
||
637 | daniel-mar | 12494 | var outerWindow = owner$2(toolbar).dom.defaultView; |
597 | daniel-mar | 12495 | return Future.nu(function (callback) { |
12496 | updateTop(toolbar, destY); |
||
12497 | updateTop(viewport, destY); |
||
12498 | outerWindow.scrollTo(0, destY); |
||
12499 | callback(destY); |
||
12500 | }); |
||
12501 | }; |
||
12502 | |||
12503 | function BackgroundActivity (doAction) { |
||
12504 | var action = Cell(LazyValue.pure({})); |
||
12505 | var start = function (value) { |
||
12506 | var future = LazyValue.nu(function (callback) { |
||
12507 | return doAction(value).get(callback); |
||
12508 | }); |
||
12509 | action.set(future); |
||
12510 | }; |
||
12511 | var idle = function (g) { |
||
12512 | action.get().get(function () { |
||
12513 | g(); |
||
12514 | }); |
||
12515 | }; |
||
12516 | return { |
||
12517 | start: start, |
||
12518 | idle: idle |
||
12519 | }; |
||
12520 | } |
||
12521 | |||
12522 | var scrollIntoView = function (cWin, socket, dropup, top, bottom) { |
||
12523 | var greenzone = getGreenzone(socket, dropup); |
||
637 | daniel-mar | 12524 | var refreshCursor = curry(refresh, cWin); |
597 | daniel-mar | 12525 | if (top > greenzone || bottom > greenzone) { |
12526 | moveOnlyScroll(socket, socket.dom.scrollTop - greenzone + bottom).get(refreshCursor); |
||
12527 | } else if (top < 0) { |
||
12528 | moveOnlyScroll(socket, socket.dom.scrollTop + top).get(refreshCursor); |
||
12529 | } else ; |
||
12530 | }; |
||
12531 | |||
637 | daniel-mar | 12532 | var par$1 = function (asyncValues, nu) { |
597 | daniel-mar | 12533 | return nu(function (callback) { |
12534 | var r = []; |
||
12535 | var count = 0; |
||
12536 | var cb = function (i) { |
||
12537 | return function (value) { |
||
12538 | r[i] = value; |
||
12539 | count++; |
||
12540 | if (count >= asyncValues.length) { |
||
12541 | callback(r); |
||
12542 | } |
||
12543 | }; |
||
12544 | }; |
||
12545 | if (asyncValues.length === 0) { |
||
12546 | callback([]); |
||
12547 | } else { |
||
637 | daniel-mar | 12548 | each$1(asyncValues, function (asyncValue, i) { |
597 | daniel-mar | 12549 | asyncValue.get(cb(i)); |
12550 | }); |
||
12551 | } |
||
12552 | }); |
||
12553 | }; |
||
12554 | |||
637 | daniel-mar | 12555 | var par = function (futures) { |
12556 | return par$1(futures, Future.nu); |
||
597 | daniel-mar | 12557 | }; |
12558 | |||
12559 | var updateFixed = function (element, property, winY, offsetY) { |
||
12560 | var destination = winY + offsetY; |
||
637 | daniel-mar | 12561 | set$5(element, property, destination + 'px'); |
597 | daniel-mar | 12562 | return Future.pure(offsetY); |
12563 | }; |
||
12564 | var updateScrollingFixed = function (element, winY, offsetY) { |
||
12565 | var destTop = winY + offsetY; |
||
12566 | var oldProp = getRaw(element, 'top').getOr(offsetY); |
||
12567 | var delta = destTop - parseInt(oldProp, 10); |
||
12568 | var destScroll = element.dom.scrollTop + delta; |
||
12569 | return moveScrollAndTop(element, destScroll, destTop); |
||
12570 | }; |
||
12571 | var updateFixture = function (fixture, winY) { |
||
12572 | return fixture.fold(function (element, property, offsetY) { |
||
12573 | return updateFixed(element, property, winY, offsetY); |
||
12574 | }, function (element, offsetY) { |
||
12575 | return updateScrollingFixed(element, winY, offsetY); |
||
12576 | }); |
||
12577 | }; |
||
12578 | var updatePositions = function (container, winY) { |
||
12579 | var fixtures = findFixtures(container); |
||
637 | daniel-mar | 12580 | var updates = map$2(fixtures, function (fixture) { |
597 | daniel-mar | 12581 | return updateFixture(fixture, winY); |
12582 | }); |
||
637 | daniel-mar | 12583 | return par(updates); |
597 | daniel-mar | 12584 | }; |
12585 | |||
12586 | var VIEW_MARGIN = 5; |
||
637 | daniel-mar | 12587 | var register = function (toolstrip, socket, container, outerWindow, structure, cWin) { |
597 | daniel-mar | 12588 | var scroller = BackgroundActivity(function (y) { |
12589 | return moveWindowScroll(toolstrip, socket, y); |
||
12590 | }); |
||
12591 | var scrollBounds = function () { |
||
12592 | var rects = getRectangles(cWin); |
||
12593 | return Optional.from(rects[0]).bind(function (rect) { |
||
12594 | var viewTop = rect.top - socket.dom.scrollTop; |
||
12595 | var outside = viewTop > outerWindow.innerHeight + VIEW_MARGIN || viewTop < -VIEW_MARGIN; |
||
12596 | return outside ? Optional.some({ |
||
12597 | top: viewTop, |
||
12598 | bottom: viewTop + rect.height |
||
12599 | }) : Optional.none(); |
||
12600 | }); |
||
12601 | }; |
||
12602 | var scrollThrottle = last(function () { |
||
12603 | scroller.idle(function () { |
||
12604 | updatePositions(container, outerWindow.pageYOffset).get(function () { |
||
12605 | var extraScroll = scrollBounds(); |
||
12606 | extraScroll.each(function (extra) { |
||
12607 | socket.dom.scrollTop = socket.dom.scrollTop + extra.top; |
||
12608 | }); |
||
12609 | scroller.start(0); |
||
12610 | structure.refresh(); |
||
12611 | }); |
||
12612 | }); |
||
12613 | }, 1000); |
||
637 | daniel-mar | 12614 | var onScroll = bind(SugarElement.fromDom(outerWindow), 'scroll', function () { |
597 | daniel-mar | 12615 | if (outerWindow.pageYOffset < 0) { |
12616 | return; |
||
12617 | } |
||
12618 | scrollThrottle.throttle(); |
||
12619 | }); |
||
12620 | updatePositions(container, outerWindow.pageYOffset).get(identity); |
||
12621 | return { unbind: onScroll.unbind }; |
||
12622 | }; |
||
637 | daniel-mar | 12623 | var setup = function (bag) { |
597 | daniel-mar | 12624 | var cWin = bag.cWin; |
12625 | var ceBody = bag.ceBody; |
||
12626 | var socket = bag.socket; |
||
12627 | var toolstrip = bag.toolstrip; |
||
12628 | var contentElement = bag.contentElement; |
||
12629 | var keyboardType = bag.keyboardType; |
||
12630 | var outerWindow = bag.outerWindow; |
||
12631 | var dropup = bag.dropup; |
||
12632 | var outerBody = bag.outerBody; |
||
637 | daniel-mar | 12633 | var structure = takeover(socket, ceBody, toolstrip, dropup); |
597 | daniel-mar | 12634 | var keyboardModel = keyboardType(outerBody, cWin, body(), contentElement); |
12635 | var toEditing = function () { |
||
12636 | keyboardModel.toEditing(); |
||
12637 | clearSelection(); |
||
12638 | }; |
||
12639 | var toReading = function () { |
||
12640 | keyboardModel.toReading(); |
||
12641 | }; |
||
12642 | var onToolbarTouch = function (_event) { |
||
12643 | keyboardModel.onToolbarTouch(); |
||
12644 | }; |
||
12645 | var onOrientation = onChange(outerWindow, { |
||
12646 | onChange: noop, |
||
12647 | onReady: structure.refresh |
||
12648 | }); |
||
12649 | onOrientation.onAdjustment(function () { |
||
12650 | structure.refresh(); |
||
12651 | }); |
||
637 | daniel-mar | 12652 | var onResize = bind(SugarElement.fromDom(outerWindow), 'resize', function () { |
597 | daniel-mar | 12653 | if (structure.isExpanding()) { |
12654 | structure.refresh(); |
||
12655 | } |
||
12656 | }); |
||
637 | daniel-mar | 12657 | var onScroll = register(toolstrip, socket, outerBody, outerWindow, structure, cWin); |
597 | daniel-mar | 12658 | var unfocusedSelection = FakeSelection(cWin, contentElement); |
12659 | var refreshSelection = function () { |
||
12660 | if (unfocusedSelection.isActive()) { |
||
12661 | unfocusedSelection.update(); |
||
12662 | } |
||
12663 | }; |
||
12664 | var highlightSelection = function () { |
||
12665 | unfocusedSelection.update(); |
||
12666 | }; |
||
12667 | var clearSelection = function () { |
||
12668 | unfocusedSelection.clear(); |
||
12669 | }; |
||
12670 | var scrollIntoView$1 = function (top, bottom) { |
||
12671 | scrollIntoView(cWin, socket, dropup, top, bottom); |
||
12672 | }; |
||
12673 | var syncHeight = function () { |
||
637 | daniel-mar | 12674 | set$5(contentElement, 'height', contentElement.dom.contentWindow.document.body.scrollHeight + 'px'); |
597 | daniel-mar | 12675 | }; |
12676 | var setViewportOffset = function (newYOffset) { |
||
12677 | structure.setViewportOffset(newYOffset); |
||
12678 | moveOnlyTop(socket, newYOffset).get(identity); |
||
12679 | }; |
||
12680 | var destroy = function () { |
||
12681 | structure.restore(); |
||
12682 | onOrientation.destroy(); |
||
12683 | onScroll.unbind(); |
||
12684 | onResize.unbind(); |
||
12685 | keyboardModel.destroy(); |
||
12686 | unfocusedSelection.destroy(); |
||
637 | daniel-mar | 12687 | input(body(), blur$1); |
597 | daniel-mar | 12688 | }; |
12689 | return { |
||
12690 | toEditing: toEditing, |
||
12691 | toReading: toReading, |
||
12692 | onToolbarTouch: onToolbarTouch, |
||
12693 | refreshSelection: refreshSelection, |
||
12694 | clearSelection: clearSelection, |
||
12695 | highlightSelection: highlightSelection, |
||
12696 | scrollIntoView: scrollIntoView$1, |
||
12697 | updateToolbarPadding: noop, |
||
12698 | setViewportOffset: setViewportOffset, |
||
12699 | syncHeight: syncHeight, |
||
12700 | refreshStructure: structure.refresh, |
||
12701 | destroy: destroy |
||
12702 | }; |
||
12703 | }; |
||
12704 | |||
637 | daniel-mar | 12705 | var create = function (platform, mask) { |
597 | daniel-mar | 12706 | var meta = tag(); |
637 | daniel-mar | 12707 | var priorState = value(); |
12708 | var scrollEvents = value(); |
||
597 | daniel-mar | 12709 | var iosApi = api$2(); |
12710 | var iosEvents = api$2(); |
||
12711 | var enter = function () { |
||
12712 | mask.hide(); |
||
12713 | var doc = SugarElement.fromDom(document); |
||
12714 | getActiveApi(platform.editor).each(function (editorApi) { |
||
12715 | priorState.set({ |
||
12716 | socketHeight: getRaw(platform.socket, 'height'), |
||
12717 | iframeHeight: getRaw(editorApi.frame, 'height'), |
||
12718 | outerScroll: document.body.scrollTop |
||
12719 | }); |
||
12720 | scrollEvents.set({ exclusives: exclusive(doc, '.' + scrollable) }); |
||
637 | daniel-mar | 12721 | add$1(platform.container, resolve('fullscreen-maximized')); |
597 | daniel-mar | 12722 | clobberStyles(platform.container, editorApi.body); |
12723 | meta.maximize(); |
||
637 | daniel-mar | 12724 | set$5(platform.socket, 'overflow', 'scroll'); |
12725 | set$5(platform.socket, '-webkit-overflow-scrolling', 'touch'); |
||
12726 | focus$3(editorApi.body); |
||
12727 | iosApi.set(setup({ |
||
597 | daniel-mar | 12728 | cWin: editorApi.win, |
12729 | ceBody: editorApi.body, |
||
12730 | socket: platform.socket, |
||
12731 | toolstrip: platform.toolstrip, |
||
12732 | dropup: platform.dropup.element, |
||
12733 | contentElement: editorApi.frame, |
||
12734 | outerBody: platform.body, |
||
12735 | outerWindow: platform.win, |
||
12736 | keyboardType: stubborn |
||
12737 | })); |
||
12738 | iosApi.run(function (api) { |
||
12739 | api.syncHeight(); |
||
12740 | }); |
||
637 | daniel-mar | 12741 | iosEvents.set(initEvents(editorApi, iosApi, platform.toolstrip, platform.socket, platform.dropup)); |
597 | daniel-mar | 12742 | }); |
12743 | }; |
||
12744 | var exit = function () { |
||
12745 | meta.restore(); |
||
12746 | iosEvents.clear(); |
||
12747 | iosApi.clear(); |
||
12748 | mask.show(); |
||
12749 | priorState.on(function (s) { |
||
12750 | s.socketHeight.each(function (h) { |
||
637 | daniel-mar | 12751 | set$5(platform.socket, 'height', h); |
597 | daniel-mar | 12752 | }); |
12753 | s.iframeHeight.each(function (h) { |
||
637 | daniel-mar | 12754 | set$5(platform.editor.getFrame(), 'height', h); |
597 | daniel-mar | 12755 | }); |
12756 | document.body.scrollTop = s.scrollTop; |
||
12757 | }); |
||
12758 | priorState.clear(); |
||
12759 | scrollEvents.on(function (s) { |
||
12760 | s.exclusives.unbind(); |
||
12761 | }); |
||
12762 | scrollEvents.clear(); |
||
637 | daniel-mar | 12763 | remove$3(platform.container, resolve('fullscreen-maximized')); |
597 | daniel-mar | 12764 | restoreStyles(); |
12765 | deregister(platform.toolbar); |
||
637 | daniel-mar | 12766 | remove$2(platform.socket, 'overflow'); |
12767 | remove$2(platform.socket, '-webkit-overflow-scrolling'); |
||
12768 | blur$1(platform.editor.getFrame()); |
||
597 | daniel-mar | 12769 | getActiveApi(platform.editor).each(function (editorApi) { |
12770 | editorApi.clearSelection(); |
||
12771 | }); |
||
12772 | }; |
||
12773 | var refreshStructure = function () { |
||
12774 | iosApi.run(function (api) { |
||
12775 | api.refreshStructure(); |
||
12776 | }); |
||
12777 | }; |
||
12778 | return { |
||
12779 | enter: enter, |
||
12780 | refreshStructure: refreshStructure, |
||
12781 | exit: exit |
||
12782 | }; |
||
12783 | }; |
||
12784 | |||
637 | daniel-mar | 12785 | var produce = function (raw) { |
12786 | var mobile = asRawOrDie$1('Getting IosWebapp schema', MobileSchema, raw); |
||
12787 | set$5(mobile.toolstrip, 'width', '100%'); |
||
12788 | set$5(mobile.container, 'position', 'relative'); |
||
597 | daniel-mar | 12789 | var onView = function () { |
12790 | mobile.setReadOnly(mobile.readOnlyOnInit()); |
||
12791 | mode.enter(); |
||
12792 | }; |
||
637 | daniel-mar | 12793 | var mask = build$1(sketch(onView, mobile.translate)); |
597 | daniel-mar | 12794 | mobile.alloy.add(mask); |
12795 | var maskApi = { |
||
12796 | show: function () { |
||
12797 | mobile.alloy.add(mask); |
||
12798 | }, |
||
12799 | hide: function () { |
||
12800 | mobile.alloy.remove(mask); |
||
12801 | } |
||
12802 | }; |
||
637 | daniel-mar | 12803 | var mode = create(mobile, maskApi); |
597 | daniel-mar | 12804 | return { |
12805 | setReadOnly: mobile.setReadOnly, |
||
12806 | refreshStructure: mode.refreshStructure, |
||
12807 | enter: mode.enter, |
||
12808 | exit: mode.exit, |
||
12809 | destroy: noop |
||
12810 | }; |
||
12811 | }; |
||
12812 | |||
12813 | function IosRealm (scrollIntoView) { |
||
12814 | var alloy = OuterContainer({ classes: [resolve('ios-container')] }); |
||
12815 | var toolbar = ScrollingToolbar(); |
||
12816 | var webapp = api$2(); |
||
12817 | var switchToEdit = makeEditSwitch(webapp); |
||
12818 | var socket = makeSocket(); |
||
637 | daniel-mar | 12819 | var dropup = build(function () { |
597 | daniel-mar | 12820 | webapp.run(function (w) { |
12821 | w.refreshStructure(); |
||
12822 | }); |
||
12823 | }, scrollIntoView); |
||
12824 | alloy.add(toolbar.wrapper); |
||
12825 | alloy.add(socket); |
||
12826 | alloy.add(dropup.component); |
||
12827 | var setToolbarGroups = function (rawGroups) { |
||
12828 | var groups = toolbar.createGroups(rawGroups); |
||
12829 | toolbar.setGroups(groups); |
||
12830 | }; |
||
12831 | var setContextToolbar = function (rawGroups) { |
||
12832 | var groups = toolbar.createGroups(rawGroups); |
||
12833 | toolbar.setContextToolbar(groups); |
||
12834 | }; |
||
12835 | var focusToolbar = function () { |
||
12836 | toolbar.focus(); |
||
12837 | }; |
||
12838 | var restoreToolbar = function () { |
||
12839 | toolbar.restoreToolbar(); |
||
12840 | }; |
||
12841 | var init = function (spec) { |
||
637 | daniel-mar | 12842 | webapp.set(produce(spec)); |
597 | daniel-mar | 12843 | }; |
12844 | var exit = function () { |
||
12845 | webapp.run(function (w) { |
||
12846 | Replacing.remove(socket, switchToEdit); |
||
12847 | w.exit(); |
||
12848 | }); |
||
12849 | }; |
||
12850 | var updateMode$1 = function (readOnly) { |
||
12851 | updateMode(socket, switchToEdit, readOnly, alloy.root); |
||
12852 | }; |
||
12853 | return { |
||
12854 | system: alloy, |
||
12855 | element: alloy.element, |
||
12856 | init: init, |
||
12857 | exit: exit, |
||
12858 | setToolbarGroups: setToolbarGroups, |
||
12859 | setContextToolbar: setContextToolbar, |
||
12860 | focusToolbar: focusToolbar, |
||
12861 | restoreToolbar: restoreToolbar, |
||
12862 | updateMode: updateMode$1, |
||
12863 | socket: socket, |
||
12864 | dropup: dropup |
||
12865 | }; |
||
12866 | } |
||
12867 | |||
637 | daniel-mar | 12868 | var global$1 = tinymce.util.Tools.resolve('tinymce.EditorManager'); |
597 | daniel-mar | 12869 | |
637 | daniel-mar | 12870 | var derive = function (editor) { |
12871 | var base = Optional.from(getSkinUrl(editor)).getOrThunk(function () { |
||
12872 | return global$1.baseURL + '/skins/ui/oxide'; |
||
597 | daniel-mar | 12873 | }); |
12874 | return { |
||
12875 | content: base + '/content.mobile.min.css', |
||
12876 | ui: base + '/skin.mobile.min.css' |
||
12877 | }; |
||
12878 | }; |
||
12879 | |||
12880 | var fireChange = function (realm, command, state) { |
||
12881 | realm.system.broadcastOn([formatChanged], { |
||
12882 | command: command, |
||
12883 | state: state |
||
12884 | }); |
||
12885 | }; |
||
637 | daniel-mar | 12886 | var init = function (realm, editor) { |
597 | daniel-mar | 12887 | var allFormats = keys(editor.formatter.get()); |
637 | daniel-mar | 12888 | each$1(allFormats, function (command) { |
597 | daniel-mar | 12889 | editor.formatter.formatChanged(command, function (state) { |
12890 | fireChange(realm, command, state); |
||
12891 | }); |
||
12892 | }); |
||
637 | daniel-mar | 12893 | each$1([ |
597 | daniel-mar | 12894 | 'ul', |
12895 | 'ol' |
||
12896 | ], function (command) { |
||
12897 | editor.selection.selectorChanged(command, function (state, _data) { |
||
12898 | fireChange(realm, command, state); |
||
12899 | }); |
||
12900 | }); |
||
12901 | }; |
||
12902 | |||
12903 | var fireSkinLoaded = function (editor) { |
||
12904 | return function () { |
||
12905 | var done = function () { |
||
12906 | editor._skinLoaded = true; |
||
12907 | editor.fire('SkinLoaded'); |
||
12908 | }; |
||
12909 | if (editor.initialized) { |
||
12910 | done(); |
||
12911 | } else { |
||
12912 | editor.on('init', done); |
||
12913 | } |
||
12914 | }; |
||
12915 | }; |
||
12916 | |||
12917 | var READING = 'toReading'; |
||
12918 | var EDITING = 'toEditing'; |
||
12919 | var renderMobileTheme = function (editor) { |
||
12920 | var renderUI = function () { |
||
12921 | var targetNode = editor.getElement(); |
||
637 | daniel-mar | 12922 | var cssUrls = derive(editor); |
597 | daniel-mar | 12923 | if (isSkinDisabled(editor) === false) { |
637 | daniel-mar | 12924 | var styleSheetLoader_1 = global$5.DOM.styleSheetLoader; |
597 | daniel-mar | 12925 | editor.contentCSS.push(cssUrls.content); |
12926 | styleSheetLoader_1.load(cssUrls.ui, fireSkinLoaded(editor)); |
||
12927 | editor.on('remove', function () { |
||
12928 | return styleSheetLoader_1.unload(cssUrls.ui); |
||
12929 | }); |
||
12930 | } else { |
||
12931 | fireSkinLoaded(editor)(); |
||
12932 | } |
||
12933 | var doScrollIntoView = function () { |
||
12934 | editor.fire('ScrollIntoView'); |
||
12935 | }; |
||
637 | daniel-mar | 12936 | var realm = detect$1().os.isAndroid() ? AndroidRealm(doScrollIntoView) : IosRealm(doScrollIntoView); |
597 | daniel-mar | 12937 | var original = SugarElement.fromDom(targetNode); |
12938 | attachSystemAfter(original, realm.system); |
||
12939 | var findFocusIn = function (elem) { |
||
12940 | return search(elem).bind(function (focused) { |
||
12941 | return realm.system.getByDom(focused).toOptional(); |
||
12942 | }); |
||
12943 | }; |
||
12944 | var outerWindow = targetNode.ownerDocument.defaultView; |
||
12945 | var orientation = onChange(outerWindow, { |
||
12946 | onChange: function () { |
||
12947 | var alloy = realm.system; |
||
12948 | alloy.broadcastOn([orientationChanged], { width: getActualWidth(outerWindow) }); |
||
12949 | }, |
||
12950 | onReady: noop |
||
12951 | }); |
||
12952 | var setReadOnly = function (dynamicGroup, readOnlyGroups, mainGroups, ro) { |
||
12953 | if (ro === false) { |
||
12954 | editor.selection.collapse(); |
||
12955 | } |
||
12956 | var toolbars = configureToolbar(dynamicGroup, readOnlyGroups, mainGroups); |
||
12957 | realm.setToolbarGroups(ro === true ? toolbars.readOnly : toolbars.main); |
||
12958 | editor.setMode(ro === true ? 'readonly' : 'design'); |
||
12959 | editor.fire(ro === true ? READING : EDITING); |
||
12960 | realm.updateMode(ro); |
||
12961 | }; |
||
12962 | var configureToolbar = function (dynamicGroup, readOnlyGroups, mainGroups) { |
||
12963 | var dynamic = dynamicGroup.get(); |
||
12964 | var toolbars = { |
||
12965 | readOnly: dynamic.backToMask.concat(readOnlyGroups.get()), |
||
12966 | main: dynamic.backToMask.concat(mainGroups.get()) |
||
12967 | }; |
||
12968 | return toolbars; |
||
12969 | }; |
||
12970 | var bindHandler = function (label, handler) { |
||
12971 | editor.on(label, handler); |
||
12972 | return { |
||
12973 | unbind: function () { |
||
12974 | editor.off(label); |
||
12975 | } |
||
12976 | }; |
||
12977 | }; |
||
12978 | editor.on('init', function () { |
||
12979 | realm.init({ |
||
12980 | editor: { |
||
12981 | getFrame: function () { |
||
12982 | return SugarElement.fromDom(editor.contentAreaContainer.querySelector('iframe')); |
||
12983 | }, |
||
12984 | onDomChanged: function () { |
||
12985 | return { unbind: noop }; |
||
12986 | }, |
||
12987 | onToReading: function (handler) { |
||
12988 | return bindHandler(READING, handler); |
||
12989 | }, |
||
12990 | onToEditing: function (handler) { |
||
12991 | return bindHandler(EDITING, handler); |
||
12992 | }, |
||
12993 | onScrollToCursor: function (handler) { |
||
12994 | editor.on('ScrollIntoView', function (tinyEvent) { |
||
12995 | handler(tinyEvent); |
||
12996 | }); |
||
12997 | var unbind = function () { |
||
12998 | editor.off('ScrollIntoView'); |
||
12999 | orientation.destroy(); |
||
13000 | }; |
||
13001 | return { unbind: unbind }; |
||
13002 | }, |
||
13003 | onTouchToolstrip: function () { |
||
13004 | hideDropup(); |
||
13005 | }, |
||
13006 | onTouchContent: function () { |
||
13007 | var toolbar = SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar'))); |
||
13008 | findFocusIn(toolbar).each(emitExecute); |
||
13009 | realm.restoreToolbar(); |
||
13010 | hideDropup(); |
||
13011 | }, |
||
13012 | onTapContent: function (evt) { |
||
13013 | var target = evt.target; |
||
637 | daniel-mar | 13014 | if (name$1(target) === 'img') { |
597 | daniel-mar | 13015 | editor.selection.select(target.dom); |
13016 | evt.kill(); |
||
637 | daniel-mar | 13017 | } else if (name$1(target) === 'a') { |
597 | daniel-mar | 13018 | var component = realm.system.getByDom(SugarElement.fromDom(editor.editorContainer)); |
13019 | component.each(function (container) { |
||
13020 | if (Swapping.isAlpha(container)) { |
||
13021 | openLink(target.dom); |
||
13022 | } |
||
13023 | }); |
||
13024 | } |
||
13025 | } |
||
13026 | }, |
||
13027 | container: SugarElement.fromDom(editor.editorContainer), |
||
13028 | socket: SugarElement.fromDom(editor.contentAreaContainer), |
||
13029 | toolstrip: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolstrip'))), |
||
13030 | toolbar: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar'))), |
||
13031 | dropup: realm.dropup, |
||
13032 | alloy: realm.system, |
||
13033 | translate: noop, |
||
13034 | setReadOnly: function (ro) { |
||
13035 | setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, ro); |
||
13036 | }, |
||
13037 | readOnlyOnInit: function () { |
||
13038 | return readOnlyOnInit(); |
||
13039 | } |
||
13040 | }); |
||
13041 | var hideDropup = function () { |
||
13042 | realm.dropup.disappear(function () { |
||
13043 | realm.system.broadcastOn([dropupDismissed], {}); |
||
13044 | }); |
||
13045 | }; |
||
13046 | var backToMaskGroup = { |
||
13047 | label: 'The first group', |
||
13048 | scrollable: false, |
||
13049 | items: [forToolbar('back', function () { |
||
13050 | editor.selection.collapse(); |
||
13051 | realm.exit(); |
||
13052 | }, {}, editor)] |
||
13053 | }; |
||
13054 | var backToReadOnlyGroup = { |
||
13055 | label: 'Back to read only', |
||
13056 | scrollable: false, |
||
13057 | items: [forToolbar('readonly-back', function () { |
||
13058 | setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, true); |
||
13059 | }, {}, editor)] |
||
13060 | }; |
||
13061 | var readOnlyGroup = { |
||
13062 | label: 'The read only mode group', |
||
13063 | scrollable: true, |
||
13064 | items: [] |
||
13065 | }; |
||
637 | daniel-mar | 13066 | var features = setup$3(realm, editor); |
13067 | var items = detect(editor, features); |
||
597 | daniel-mar | 13068 | var actionGroup = { |
13069 | label: 'the action group', |
||
13070 | scrollable: true, |
||
13071 | items: items |
||
13072 | }; |
||
13073 | var extraGroup = { |
||
13074 | label: 'The extra group', |
||
13075 | scrollable: false, |
||
13076 | items: [] |
||
13077 | }; |
||
13078 | var mainGroups = Cell([ |
||
13079 | actionGroup, |
||
13080 | extraGroup |
||
13081 | ]); |
||
13082 | var readOnlyGroups = Cell([ |
||
13083 | readOnlyGroup, |
||
13084 | extraGroup |
||
13085 | ]); |
||
13086 | var dynamicGroup = Cell({ |
||
13087 | backToMask: [backToMaskGroup], |
||
13088 | backToReadOnly: [backToReadOnlyGroup] |
||
13089 | }); |
||
637 | daniel-mar | 13090 | init(realm, editor); |
597 | daniel-mar | 13091 | }); |
13092 | editor.on('remove', function () { |
||
13093 | realm.exit(); |
||
13094 | }); |
||
13095 | editor.on('detach', function () { |
||
13096 | detachSystem(realm.system); |
||
13097 | realm.system.destroy(); |
||
13098 | }); |
||
13099 | return { |
||
13100 | iframeContainer: realm.socket.element.dom, |
||
13101 | editorContainer: realm.element.dom |
||
13102 | }; |
||
13103 | }; |
||
13104 | return { |
||
13105 | getNotificationManagerImpl: function () { |
||
13106 | return { |
||
637 | daniel-mar | 13107 | open: constant$1({ |
597 | daniel-mar | 13108 | progressBar: { value: noop }, |
13109 | close: noop, |
||
13110 | text: noop, |
||
637 | daniel-mar | 13111 | getEl: constant$1(null), |
597 | daniel-mar | 13112 | moveTo: noop, |
13113 | moveRel: noop, |
||
13114 | settings: {} |
||
13115 | }), |
||
13116 | close: noop, |
||
13117 | reposition: noop, |
||
637 | daniel-mar | 13118 | getArgs: constant$1({}) |
597 | daniel-mar | 13119 | }; |
13120 | }, |
||
13121 | renderUI: renderUI |
||
13122 | }; |
||
13123 | }; |
||
13124 | function Theme () { |
||
637 | daniel-mar | 13125 | global$4.add('mobile', renderMobileTheme); |
597 | daniel-mar | 13126 | } |
13127 | |||
13128 | Theme(); |
||
13129 | |||
13130 | }()); |