Rev 637 | Rev 759 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 637 | Rev 679 | ||
---|---|---|---|
Line 2... | Line 2... | ||
2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. |
2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. |
3 | * Licensed under the LGPL or a commercial license. |
3 | * Licensed under the LGPL or a commercial license. |
4 | * For LGPL see License.txt in the project root for license information. |
4 | * For LGPL see License.txt in the project root for license information. |
5 | * For commercial licenses see https://www.tiny.cloud/ |
5 | * For commercial licenses see https://www.tiny.cloud/ |
6 | * |
6 | * |
7 | * Version: 5.9.2 (2021-09-08) |
7 | * Version: 5.10.2 (2021-11-17) |
8 | */ |
8 | */ |
9 | (function () { |
9 | (function () { |
10 | 'use strict'; |
10 | 'use strict'; |
11 | 11 | ||
12 | var Cell = function (initial) { |
12 | var Cell = function (initial) { |
Line 273... | Line 273... | ||
273 | r.push(x); |
273 | r.push(x); |
274 | } |
274 | } |
275 | } |
275 | } |
276 | return r; |
276 | return r; |
277 | }; |
277 | }; |
- | 278 | var findUntil = function (xs, pred, until) { |
|
- | 279 | for (var i = 0, len = xs.length; i < len; i++) { |
|
- | 280 | var x = xs[i]; |
|
- | 281 | if (pred(x, i)) { |
|
- | 282 | return Optional.some(x); |
|
- | 283 | } else if (until(x, i)) { |
|
- | 284 | break; |
|
- | 285 | } |
|
- | 286 | } |
|
- | 287 | return Optional.none(); |
|
- | 288 | }; |
|
- | 289 | var find$1 = function (xs, pred) { |
|
- | 290 | return findUntil(xs, pred, never); |
|
- | 291 | }; |
|
278 | var flatten = function (xs) { |
292 | var flatten = function (xs) { |
279 | var r = []; |
293 | var r = []; |
280 | for (var i = 0, len = xs.length; i < len; ++i) { |
294 | for (var i = 0, len = xs.length; i < len; ++i) { |
281 | if (!isArray(xs[i])) { |
295 | if (!isArray(xs[i])) { |
282 | throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); |
296 | throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); |
Line 292... | Line 306... | ||
292 | return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); |
306 | return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); |
293 | }; |
307 | }; |
294 | var head = function (xs) { |
308 | var head = function (xs) { |
295 | return get$4(xs, 0); |
309 | return get$4(xs, 0); |
296 | }; |
310 | }; |
- | 311 | var findMap = function (arr, f) { |
|
- | 312 | for (var i = 0; i < arr.length; i++) { |
|
- | 313 | var r = f(arr[i], i); |
|
- | 314 | if (r.isSome()) { |
|
- | 315 | return r; |
|
- | 316 | } |
|
- | 317 | } |
|
- | 318 | return Optional.none(); |
|
- | 319 | }; |
|
297 | 320 | ||
298 | var keys = Object.keys; |
321 | var keys = Object.keys; |
299 | var each = function (obj, f) { |
322 | var each = function (obj, f) { |
300 | var props = keys(obj); |
323 | var props = keys(obj); |
301 | for (var k = 0, len = props.length; k < len; k++) { |
324 | for (var k = 0, len = props.length; k < len; k++) { |
Line 303... | Line 326... | ||
303 | var x = obj[i]; |
326 | var x = obj[i]; |
304 | f(x, i); |
327 | f(x, i); |
305 | } |
328 | } |
306 | }; |
329 | }; |
307 | 330 | ||
- | 331 | var contains = function (str, substr) { |
|
- | 332 | return str.indexOf(substr) !== -1; |
|
- | 333 | }; |
|
- | 334 | ||
308 | var isSupported$1 = function (dom) { |
335 | var isSupported$1 = function (dom) { |
309 | return dom.style !== undefined && isFunction(dom.style.getPropertyValue); |
336 | return dom.style !== undefined && isFunction(dom.style.getPropertyValue); |
310 | }; |
337 | }; |
311 | 338 | ||
312 | var fromHtml = function (html, scope) { |
339 | var fromHtml = function (html, scope) { |
Line 364... | Line 391... | ||
364 | var isElement = isType(ELEMENT); |
391 | var isElement = isType(ELEMENT); |
365 | var isText = isType(TEXT); |
392 | var isText = isType(TEXT); |
366 | var isDocument = isType(DOCUMENT); |
393 | var isDocument = isType(DOCUMENT); |
367 | var isDocumentFragment = isType(DOCUMENT_FRAGMENT); |
394 | var isDocumentFragment = isType(DOCUMENT_FRAGMENT); |
368 | 395 | ||
- | 396 | var cached = function (f) { |
|
- | 397 | var called = false; |
|
- | 398 | var r; |
|
- | 399 | return function () { |
|
- | 400 | var args = []; |
|
- | 401 | for (var _i = 0; _i < arguments.length; _i++) { |
|
- | 402 | args[_i] = arguments[_i]; |
|
- | 403 | } |
|
- | 404 | if (!called) { |
|
- | 405 | called = true; |
|
- | 406 | r = f.apply(null, args); |
|
- | 407 | } |
|
- | 408 | return r; |
|
- | 409 | }; |
|
- | 410 | }; |
|
- | 411 | ||
- | 412 | var DeviceType = function (os, browser, userAgent, mediaMatch) { |
|
- | 413 | var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; |
|
- | 414 | var isiPhone = os.isiOS() && !isiPad; |
|
- | 415 | var isMobile = os.isiOS() || os.isAndroid(); |
|
- | 416 | var isTouch = isMobile || mediaMatch('(pointer:coarse)'); |
|
- | 417 | var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); |
|
- | 418 | var isPhone = isiPhone || isMobile && !isTablet; |
|
- | 419 | var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; |
|
- | 420 | var isDesktop = !isPhone && !isTablet && !iOSwebview; |
|
- | 421 | return { |
|
- | 422 | isiPad: constant(isiPad), |
|
- | 423 | isiPhone: constant(isiPhone), |
|
- | 424 | isTablet: constant(isTablet), |
|
- | 425 | isPhone: constant(isPhone), |
|
- | 426 | isTouch: constant(isTouch), |
|
- | 427 | isAndroid: os.isAndroid, |
|
- | 428 | isiOS: os.isiOS, |
|
- | 429 | isWebView: constant(iOSwebview), |
|
- | 430 | isDesktop: constant(isDesktop) |
|
- | 431 | }; |
|
- | 432 | }; |
|
- | 433 | ||
- | 434 | var firstMatch = function (regexes, s) { |
|
- | 435 | for (var i = 0; i < regexes.length; i++) { |
|
- | 436 | var x = regexes[i]; |
|
- | 437 | if (x.test(s)) { |
|
- | 438 | return x; |
|
- | 439 | } |
|
- | 440 | } |
|
- | 441 | return undefined; |
|
- | 442 | }; |
|
- | 443 | var find = function (regexes, agent) { |
|
- | 444 | var r = firstMatch(regexes, agent); |
|
- | 445 | if (!r) { |
|
- | 446 | return { |
|
- | 447 | major: 0, |
|
- | 448 | minor: 0 |
|
- | 449 | }; |
|
- | 450 | } |
|
- | 451 | var group = function (i) { |
|
- | 452 | return Number(agent.replace(r, '$' + i)); |
|
- | 453 | }; |
|
- | 454 | return nu$2(group(1), group(2)); |
|
- | 455 | }; |
|
- | 456 | var detect$3 = function (versionRegexes, agent) { |
|
- | 457 | var cleanedAgent = String(agent).toLowerCase(); |
|
- | 458 | if (versionRegexes.length === 0) { |
|
- | 459 | return unknown$2(); |
|
- | 460 | } |
|
- | 461 | return find(versionRegexes, cleanedAgent); |
|
- | 462 | }; |
|
- | 463 | var unknown$2 = function () { |
|
- | 464 | return nu$2(0, 0); |
|
- | 465 | }; |
|
- | 466 | var nu$2 = function (major, minor) { |
|
- | 467 | return { |
|
- | 468 | major: major, |
|
- | 469 | minor: minor |
|
- | 470 | }; |
|
- | 471 | }; |
|
- | 472 | var Version = { |
|
- | 473 | nu: nu$2, |
|
- | 474 | detect: detect$3, |
|
- | 475 | unknown: unknown$2 |
|
- | 476 | }; |
|
- | 477 | ||
- | 478 | var detectBrowser$1 = function (browsers, userAgentData) { |
|
- | 479 | return findMap(userAgentData.brands, function (uaBrand) { |
|
- | 480 | var lcBrand = uaBrand.brand.toLowerCase(); |
|
- | 481 | return find$1(browsers, function (browser) { |
|
- | 482 | var _a; |
|
- | 483 | return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); |
|
- | 484 | }).map(function (info) { |
|
- | 485 | return { |
|
- | 486 | current: info.name, |
|
- | 487 | version: Version.nu(parseInt(uaBrand.version, 10), 0) |
|
- | 488 | }; |
|
- | 489 | }); |
|
- | 490 | }); |
|
- | 491 | }; |
|
- | 492 | ||
- | 493 | var detect$2 = function (candidates, userAgent) { |
|
- | 494 | var agent = String(userAgent).toLowerCase(); |
|
- | 495 | return find$1(candidates, function (candidate) { |
|
- | 496 | return candidate.search(agent); |
|
- | 497 | }); |
|
- | 498 | }; |
|
- | 499 | var detectBrowser = function (browsers, userAgent) { |
|
- | 500 | return detect$2(browsers, userAgent).map(function (browser) { |
|
- | 501 | var version = Version.detect(browser.versionRegexes, userAgent); |
|
- | 502 | return { |
|
- | 503 | current: browser.name, |
|
- | 504 | version: version |
|
- | 505 | }; |
|
- | 506 | }); |
|
- | 507 | }; |
|
- | 508 | var detectOs = function (oses, userAgent) { |
|
- | 509 | return detect$2(oses, userAgent).map(function (os) { |
|
- | 510 | var version = Version.detect(os.versionRegexes, userAgent); |
|
- | 511 | return { |
|
- | 512 | current: os.name, |
|
- | 513 | version: version |
|
- | 514 | }; |
|
- | 515 | }); |
|
- | 516 | }; |
|
- | 517 | ||
- | 518 | var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; |
|
- | 519 | var checkContains = function (target) { |
|
- | 520 | return function (uastring) { |
|
- | 521 | return contains(uastring, target); |
|
- | 522 | }; |
|
- | 523 | }; |
|
- | 524 | var browsers = [ |
|
- | 525 | { |
|
- | 526 | name: 'Edge', |
|
- | 527 | versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], |
|
- | 528 | search: function (uastring) { |
|
- | 529 | return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); |
|
- | 530 | } |
|
- | 531 | }, |
|
- | 532 | { |
|
- | 533 | name: 'Chrome', |
|
- | 534 | brand: 'Chromium', |
|
- | 535 | versionRegexes: [ |
|
- | 536 | /.*?chrome\/([0-9]+)\.([0-9]+).*/, |
|
- | 537 | normalVersionRegex |
|
- | 538 | ], |
|
- | 539 | search: function (uastring) { |
|
- | 540 | return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); |
|
- | 541 | } |
|
- | 542 | }, |
|
- | 543 | { |
|
- | 544 | name: 'IE', |
|
- | 545 | versionRegexes: [ |
|
- | 546 | /.*?msie\ ?([0-9]+)\.([0-9]+).*/, |
|
- | 547 | /.*?rv:([0-9]+)\.([0-9]+).*/ |
|
- | 548 | ], |
|
- | 549 | search: function (uastring) { |
|
- | 550 | return contains(uastring, 'msie') || contains(uastring, 'trident'); |
|
- | 551 | } |
|
- | 552 | }, |
|
- | 553 | { |
|
- | 554 | name: 'Opera', |
|
- | 555 | versionRegexes: [ |
|
- | 556 | normalVersionRegex, |
|
- | 557 | /.*?opera\/([0-9]+)\.([0-9]+).*/ |
|
- | 558 | ], |
|
- | 559 | search: checkContains('opera') |
|
- | 560 | }, |
|
- | 561 | { |
|
- | 562 | name: 'Firefox', |
|
- | 563 | versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], |
|
- | 564 | search: checkContains('firefox') |
|
- | 565 | }, |
|
- | 566 | { |
|
- | 567 | name: 'Safari', |
|
- | 568 | versionRegexes: [ |
|
- | 569 | normalVersionRegex, |
|
- | 570 | /.*?cpu os ([0-9]+)_([0-9]+).*/ |
|
- | 571 | ], |
|
- | 572 | search: function (uastring) { |
|
- | 573 | return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); |
|
- | 574 | } |
|
- | 575 | } |
|
- | 576 | ]; |
|
- | 577 | var oses = [ |
|
- | 578 | { |
|
- | 579 | name: 'Windows', |
|
- | 580 | search: checkContains('win'), |
|
- | 581 | versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] |
|
- | 582 | }, |
|
- | 583 | { |
|
- | 584 | name: 'iOS', |
|
- | 585 | search: function (uastring) { |
|
- | 586 | return contains(uastring, 'iphone') || contains(uastring, 'ipad'); |
|
- | 587 | }, |
|
- | 588 | versionRegexes: [ |
|
- | 589 | /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, |
|
- | 590 | /.*cpu os ([0-9]+)_([0-9]+).*/, |
|
- | 591 | /.*cpu iphone os ([0-9]+)_([0-9]+).*/ |
|
- | 592 | ] |
|
- | 593 | }, |
|
- | 594 | { |
|
- | 595 | name: 'Android', |
|
- | 596 | search: checkContains('android'), |
|
- | 597 | versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] |
|
- | 598 | }, |
|
- | 599 | { |
|
- | 600 | name: 'OSX', |
|
- | 601 | search: checkContains('mac os x'), |
|
- | 602 | versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] |
|
- | 603 | }, |
|
- | 604 | { |
|
- | 605 | name: 'Linux', |
|
- | 606 | search: checkContains('linux'), |
|
- | 607 | versionRegexes: [] |
|
- | 608 | }, |
|
- | 609 | { |
|
- | 610 | name: 'Solaris', |
|
- | 611 | search: checkContains('sunos'), |
|
- | 612 | versionRegexes: [] |
|
- | 613 | }, |
|
- | 614 | { |
|
- | 615 | name: 'FreeBSD', |
|
- | 616 | search: checkContains('freebsd'), |
|
- | 617 | versionRegexes: [] |
|
- | 618 | }, |
|
- | 619 | { |
|
- | 620 | name: 'ChromeOS', |
|
- | 621 | search: checkContains('cros'), |
|
- | 622 | versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] |
|
- | 623 | } |
|
- | 624 | ]; |
|
- | 625 | var PlatformInfo = { |
|
- | 626 | browsers: constant(browsers), |
|
- | 627 | oses: constant(oses) |
|
- | 628 | }; |
|
- | 629 | ||
- | 630 | var edge = 'Edge'; |
|
- | 631 | var chrome = 'Chrome'; |
|
- | 632 | var ie = 'IE'; |
|
- | 633 | var opera = 'Opera'; |
|
- | 634 | var firefox = 'Firefox'; |
|
- | 635 | var safari = 'Safari'; |
|
- | 636 | var unknown$1 = function () { |
|
- | 637 | return nu$1({ |
|
- | 638 | current: undefined, |
|
- | 639 | version: Version.unknown() |
|
- | 640 | }); |
|
- | 641 | }; |
|
- | 642 | var nu$1 = function (info) { |
|
- | 643 | var current = info.current; |
|
- | 644 | var version = info.version; |
|
- | 645 | var isBrowser = function (name) { |
|
- | 646 | return function () { |
|
- | 647 | return current === name; |
|
- | 648 | }; |
|
- | 649 | }; |
|
- | 650 | return { |
|
- | 651 | current: current, |
|
- | 652 | version: version, |
|
- | 653 | isEdge: isBrowser(edge), |
|
- | 654 | isChrome: isBrowser(chrome), |
|
- | 655 | isIE: isBrowser(ie), |
|
- | 656 | isOpera: isBrowser(opera), |
|
- | 657 | isFirefox: isBrowser(firefox), |
|
- | 658 | isSafari: isBrowser(safari) |
|
- | 659 | }; |
|
- | 660 | }; |
|
- | 661 | var Browser = { |
|
- | 662 | unknown: unknown$1, |
|
- | 663 | nu: nu$1, |
|
- | 664 | edge: constant(edge), |
|
- | 665 | chrome: constant(chrome), |
|
- | 666 | ie: constant(ie), |
|
- | 667 | opera: constant(opera), |
|
- | 668 | firefox: constant(firefox), |
|
- | 669 | safari: constant(safari) |
|
- | 670 | }; |
|
- | 671 | ||
- | 672 | var windows = 'Windows'; |
|
- | 673 | var ios = 'iOS'; |
|
- | 674 | var android = 'Android'; |
|
- | 675 | var linux = 'Linux'; |
|
- | 676 | var osx = 'OSX'; |
|
- | 677 | var solaris = 'Solaris'; |
|
- | 678 | var freebsd = 'FreeBSD'; |
|
- | 679 | var chromeos = 'ChromeOS'; |
|
- | 680 | var unknown = function () { |
|
- | 681 | return nu({ |
|
- | 682 | current: undefined, |
|
- | 683 | version: Version.unknown() |
|
- | 684 | }); |
|
- | 685 | }; |
|
- | 686 | var nu = function (info) { |
|
- | 687 | var current = info.current; |
|
- | 688 | var version = info.version; |
|
- | 689 | var isOS = function (name) { |
|
- | 690 | return function () { |
|
- | 691 | return current === name; |
|
- | 692 | }; |
|
- | 693 | }; |
|
- | 694 | return { |
|
- | 695 | current: current, |
|
- | 696 | version: version, |
|
- | 697 | isWindows: isOS(windows), |
|
- | 698 | isiOS: isOS(ios), |
|
- | 699 | isAndroid: isOS(android), |
|
- | 700 | isOSX: isOS(osx), |
|
- | 701 | isLinux: isOS(linux), |
|
- | 702 | isSolaris: isOS(solaris), |
|
- | 703 | isFreeBSD: isOS(freebsd), |
|
- | 704 | isChromeOS: isOS(chromeos) |
|
- | 705 | }; |
|
- | 706 | }; |
|
- | 707 | var OperatingSystem = { |
|
- | 708 | unknown: unknown, |
|
- | 709 | nu: nu, |
|
- | 710 | windows: constant(windows), |
|
- | 711 | ios: constant(ios), |
|
- | 712 | android: constant(android), |
|
- | 713 | linux: constant(linux), |
|
- | 714 | osx: constant(osx), |
|
- | 715 | solaris: constant(solaris), |
|
- | 716 | freebsd: constant(freebsd), |
|
- | 717 | chromeos: constant(chromeos) |
|
- | 718 | }; |
|
- | 719 | ||
- | 720 | var detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) { |
|
- | 721 | var browsers = PlatformInfo.browsers(); |
|
- | 722 | var oses = PlatformInfo.oses(); |
|
- | 723 | var browser = userAgentDataOpt.bind(function (userAgentData) { |
|
- | 724 | return detectBrowser$1(browsers, userAgentData); |
|
- | 725 | }).orThunk(function () { |
|
- | 726 | return detectBrowser(browsers, userAgent); |
|
- | 727 | }).fold(Browser.unknown, Browser.nu); |
|
- | 728 | var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); |
|
- | 729 | var deviceType = DeviceType(os, browser, userAgent, mediaMatch); |
|
- | 730 | return { |
|
- | 731 | browser: browser, |
|
- | 732 | os: os, |
|
- | 733 | deviceType: deviceType |
|
- | 734 | }; |
|
- | 735 | }; |
|
- | 736 | var PlatformDetection = { detect: detect$1 }; |
|
- | 737 | ||
- | 738 | var mediaMatch = function (query) { |
|
- | 739 | return window.matchMedia(query).matches; |
|
- | 740 | }; |
|
- | 741 | var platform = cached(function () { |
|
- | 742 | return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch); |
|
- | 743 | }); |
|
- | 744 | var detect = function () { |
|
- | 745 | return platform(); |
|
- | 746 | }; |
|
- | 747 | ||
369 | var is = function (element, selector) { |
748 | var is = function (element, selector) { |
370 | var dom = element.dom; |
749 | var dom = element.dom; |
371 | if (dom.nodeType !== ELEMENT) { |
750 | if (dom.nodeType !== ELEMENT) { |
372 | return false; |
751 | return false; |
373 | } else { |
752 | } else { |
Line 594... | Line 973... | ||
594 | return SugarPosition(x, y); |
973 | return SugarPosition(x, y); |
595 | }; |
974 | }; |
596 | 975 | ||
597 | var get = function (_win) { |
976 | var get = function (_win) { |
598 | var win = _win === undefined ? window : _win; |
977 | var win = _win === undefined ? window : _win; |
- | 978 | if (detect().browser.isFirefox()) { |
|
- | 979 | return Optional.none(); |
|
- | 980 | } else { |
|
599 | return Optional.from(win['visualViewport']); |
981 | return Optional.from(win['visualViewport']); |
- | 982 | } |
|
600 | }; |
983 | }; |
601 | var bounds = function (x, y, width, height) { |
984 | var bounds = function (x, y, width, height) { |
602 | return { |
985 | return { |
603 | x: x, |
986 | x: x, |
604 | y: y, |
987 | y: y, |