1AppRegistry.registerBundle({applicationId:'limepark.webapp-overlay-button|1.4.2',bundle: {"en":{},"sv":{}}}); 2AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/module/client/focus-trap',module:function(define){'use strict';function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } 3 4function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 5 6function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 7 8define(function (require) { 9 /* eslint-disable curly, no-useless-return */ 10 var tabbable = require("/module/client/tabbable"); 11 12 var activeFocusDelay; 13 14 var activeFocusTraps = function () { 15 var trapQueue = []; 16 return { 17 activateTrap: function activateTrap(trap) { 18 if (trapQueue.length > 0) { 19 var activeTrap = trapQueue[trapQueue.length - 1]; 20 21 if (activeTrap !== trap) { 22 activeTrap.pause(); 23 } 24 } 25 26 var trapIndex = trapQueue.indexOf(trap); 27 28 if (trapIndex === -1) { 29 trapQueue.push(trap); 30 } else { 31 // move this existing trap to the front of the queue 32 trapQueue.splice(trapIndex, 1); 33 trapQueue.push(trap); 34 } 35 }, 36 deactivateTrap: function deactivateTrap(trap) { 37 var trapIndex = trapQueue.indexOf(trap); 38 39 if (trapIndex !== -1) { 40 trapQueue.splice(trapIndex, 1); 41 } 42 43 if (trapQueue.length > 0) { 44 trapQueue[trapQueue.length - 1].unpause(); 45 } 46 } 47 }; 48 }(); 49 50 function focusTrap(element, userOptions) { 51 var doc = document; 52 var container = typeof element === 'string' ? doc.querySelector(element) : element; 53 54 var config = _objectSpread({ 55 returnFocusOnDeactivate: true, 56 escapeDeactivates: true 57 }, userOptions); 58 59 var state = { 60 firstTabbableNode: null, 61 lastTabbableNode: null, 62 nodeFocusedBeforeActivation: null, 63 mostRecentlyFocusedNode: null, 64 active: false, 65 paused: false 66 }; 67 var trap = { 68 activate: activate, 69 deactivate: deactivate, 70 pause: pause, 71 unpause: unpause 72 }; 73 return trap; 74 75 function activate(activateOptions) { 76 if (state.active) return; 77 updateTabbableNodes(); 78 state.active = true; 79 state.paused = false; 80 state.nodeFocusedBeforeActivation = activateOptions.activeElement || doc.activeElement; 81 var onActivate = activateOptions && activateOptions.onActivate ? activateOptions.onActivate : config.onActivate; 82 83 if (onActivate) { 84 onActivate(); 85 } 86 87 addListeners(); 88 return trap; 89 } 90 91 function deactivate(deactivateOptions) { 92 if (!state.active) return; 93 clearTimeout(activeFocusDelay); 94 removeListeners(); 95 state.active = false; 96 state.paused = false; 97 activeFocusTraps.deactivateTrap(trap); 98 var onDeactivate = deactivateOptions && deactivateOptions.onDeactivate !== undefined ? deactivateOptions.onDeactivate : config.onDeactivate; 99 100 if (onDeactivate) { 101 onDeactivate(); 102 } 103 104 var returnFocus = deactivateOptions && deactivateOptions.returnFocus !== undefined ? deactivateOptions.returnFocus : config.returnFocusOnDeactivate; 105 106 if (returnFocus) { 107 delay(function () { 108 tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)); 109 }); 110 } 111 112 return trap; 113 } 114 115 function pause() { 116 if (state.paused || !state.active) return; 117 state.paused = true; 118 removeListeners(); 119 } 120 121 function unpause() { 122 if (!state.paused || !state.active) return; 123 state.paused = false;
124 updateTabbableNodes(); 125 addListeners(); 126 } 127 128 function addListeners() { 129 if (!state.active) return; // There can be only one listening focus trap at a time 130 131 activeFocusTraps.activateTrap(trap); // Delay ensures that the focused element doesn't capture the event 132 // that caused the focus trap activation. 133 134 activeFocusDelay = delay(function () { 135 tryFocus(getInitialFocusNode()); 136 }); 137 doc.addEventListener('focusin', checkFocusIn, true); 138 doc.addEventListener('mousedown', checkPointerDown, { 139 capture: true, 140 passive: false 141 }); 142 doc.addEventListener('touchstart', checkPointerDown, { 143 capture: true, 144 passive: false 145 }); 146 doc.addEventListener('click', checkClick, { 147 capture: true, 148 passive: false 149 }); 150 doc.addEventListener('keydown', checkKey, { 151 capture: true, 152 passive: false 153 }); 154 return trap; 155 } 156 157 function removeListeners() { 158 if (!state.active) return; 159 doc.removeEventListener('focusin', checkFocusIn, true); 160 doc.removeEventListener('mousedown', checkPointerDown, true); 161 doc.removeEventListener('touchstart', checkPointerDown, true); 162 doc.removeEventListener('click', checkClick, true); 163 doc.removeEventListener('keydown', checkKey, true); 164 return trap; 165 } 166 167 function getNodeForOption(optionName) { 168 var optionValue = config[optionName]; 169 var node = optionValue; 170 171 if (!optionValue) { 172 return null; 173 } 174 175 if (typeof optionValue === 'string') { 176 node = doc.querySelector(optionValue); 177 178 if (!node) { 179 throw new Error('`' + optionName + '` refers to no known node'); 180 } 181 } 182 183 if (typeof optionValue === 'function') { 184 node = optionValue(); 185 186 if (!node) { 187 throw new Error('`' + optionName + '` did not return a node'); 188 } 189 } 190 191 return node; 192 } 193 194 function getInitialFocusNode() { 195 var node; 196 197 if (getNodeForOption('initialFocus') !== null) { 198 node = getNodeForOption('initialFocus'); 199 } else if (container.contains(doc.activeElement)) { 200 node = doc.activeElement; 201 } else { 202 node = state.firstTabbableNode || getNodeForOption('fallbackFocus'); 203 } 204 205 if (!node) { 206 throw new Error('Your focus-trap needs to have at least one focusable element'); 207 } 208 209 return node; 210 } 211 212 function getReturnFocusNode(previousActiveElement) { 213 var node = getNodeForOption('setReturnFocus'); 214 return node ? node : previousActiveElement; 215 } // This needs to be done on mousedown and touchstart instead of click 216 // so that it precedes the focus event. 217 218 219 function checkPointerDown(e) { 220 if (container.contains(e.target)) return; 221 222 if (config.clickOutsideDeactivates) { 223 deactivate({ 224 returnFocus: !tabbable.isFocusable(e.target) 225 }); 226 return; 227 } // This is needed for mobile devices. 228 // (If we'll only let `click` events through, 229 // then on mobile they will be blocked anyways if `touchstart` is blocked.) 230 231 232 if (config.allowOutsideClick && (typeof config.allowOutsideClick === 'boolean' ? config.allowOutsideClick : config.allowOutsideClick(e))) { 233 return; 234 } 235 236 e.preventDefault(); 237 } // In case focus escapes the trap for some strange reason, pull it back in. 238 239 240 function checkFocusIn(e) { 241 // In Firefox when you Tab out of an iframe the Document is briefly focused. 242 if (container.contains(e.target) || e.target instanceof Document) { 243 return; 244 } 245 246 e.stopImmediatePropagation(); 247 tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode()); 248 } 249 250 function checkKey(e) { 251 if (config.escapeDeactivates !== false && isEscapeEvent(e)) { 252 e.preventDefault(); 253 deactivate(); 254 return; 255 } 256 257 if (isTabEvent(e)) { 258 checkTab(e); 259 return; 260 } 261 } // Hijack Tab events on the first and last focusable nodes of the trap, 262 // in order to prevent focus from escaping. If it escapes for even a 263 // moment it can end up scrolling the page and causing confusion so we 264 // kind of need to capture the action at the keydown phase. 265 266 267 function checkTab(e) { 268 updateTabbableNodes(); 269 270 if (e.shiftKey && e.target === state.firstTabbableNode) { 271 e.preventDefault(); 272 tryFocus(state.lastTabbableNode); 273 return; 274 } 275 276 if (!e.shiftKey && e.target === state.lastTabbableNode) { 277 e.preventDefault(); 278 tryFocus(state.firstTabbableNode); 279 return; 280 } 281 } 282 283 function checkClick(e) { 284 if (config.clickOutsideDeactivates) return; 285 if (container.contains(e.target)) return; 286 287 if (config.allowOutsideClick && (typeof config.allowOutsideClick === 'boolean' ? config.allowOutsideClick : config.allowOutsideClick(e))) { 288 return; 289 } 290 291 e.preventDefault(); 292 e.stopImmediatePropagation(); 293 } 294 295 function updateTabbableNodes() { 296 var tabbableNodes = tabbable.tabbable(container); 297 state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode(); 298 state.lastTabbableNode = tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode(); 299 } 300 301 function tryFocus(node) { 302 if (node === doc.activeElement) return; 303 304 if (!node || !node.focus) { 305 tryFocus(getInitialFocusNode()); 306 return; 307 } 308 309 node.focus({ 310 preventScroll: !!config.preventScroll 311 }); 312 state.mostRecentlyFocusedNode = node; 313 314 if (isSelectableInput(node)) { 315 node.select(); 316 } 317 } 318 } 319 320 function isSelectableInput(node) { 321 return node.tagName && node.tagName.toLowerCase() === 'input' && typeof node.select === 'function'; 322 } 323 324 function isEscapeEvent(e) { 325 return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27; 326 } 327 328 function isTabEvent(e) { 329 return e.key === 'Tab' || e.keyCode === 9; 330 } 331 332 function delay(fn) { 333 return setTimeout(fn, 0); 334 } 335 336 return { 337 create: focusTrap 338 }; 339});}}); 340AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/module/common/domid-util',module:function(define){'use strict';function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } 341 342function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); }
342 else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 343 344function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 345 346define(function (require) { 347 var isClient = typeof window !== 'undefined'; 348 var __req__ = require; 349 350 var escapeIdentifier = function escapeIdentifier(prefix, identifier) { 351 return prefix + identifier.replace('.', '_'); 352 }; 353 354 var portletId = function () { 355 if (isClient) { 356 return require('router').portletId; 357 } else { 358 return __req__('PortletContextUtil').getCurrentPortlet().getIdentifier(); 359 } 360 }(); 361 362 var portletDomId = escapeIdentifier('svid', portletId); 363 var properties = {}; 364 365 var addProperty = function addProperty(name, value) { 366 var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'ID'; 367 properties[name] = value; 368 properties[name + 'Selector'] = type === 'ID' ? '#' + value : '.' + value; 369 }; 370 371 addProperty('pageHidden', "lp-overlay-page--hidden-".concat(portletDomId), 'CLASS'); 372 addProperty('page', "lp-overlay-page-".concat(portletDomId), 'CLASS'); 373 addProperty('containerVisible', "".concat(portletDomId, "-container--visible"), 'CLASS'); 374 addProperty('button', portletDomId); 375 addProperty('container', portletDomId + '-container'); 376 addProperty('backdrop', portletDomId + '-backdrop'); 377 return _objectSpread({}, properties); 378});}}); 379AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/module/client/@limepark/event-api_2.0.1/EventApi',module:function(define){'use strict';define(function(require) { 380 var exports = {}; 381 var module = { 382 exports: exports 383 }; 384 385 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 386 387function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 388 389function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 390 391var DEFAULT_EVENT_PREFIX = 'lp-client-event'; 392/** 393 * @class EventApi 394 */ 395 396module.exports = /*#__PURE__*/function () { 397 function EventApi() { 398 var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 399 400 _classCallCheck(this, EventApi); 401 402 this.appIdentifier = (opts === null || opts === void 0 ? void 0 : opts.appIdentifier) || ''; 403 this.portletIdentifier = (opts === null || opts === void 0 ? void 0 : opts.portletId) || ''; 404 this.eventPrefix = DEFAULT_EVENT_PREFIX; 405 } 406 407 _createClass(EventApi, [{ 408 key: "prepareIdentifiers", 409 value: function prepareIdentifiers(identifiers) { 410 identifiers = Array.isArray(identifiers) ? identifiers : [identifiers]; 411 412 if (this.appIdentifier && identifiers.indexOf(this.appIdentifier) === -1) { 413 identifiers.push(this.appIdentifier); 414 } 415 416 if (this.portletIdentifier && identifiers.indexOf(this.portletIdentifier) === -1) { 417 identifiers.push(this.portletIdentifier); 418 } 419 420 return identifiers.filter(function (ident) { 421 return String(ident || '').trim(); 422 }); 423 } 424 /** 425 * Namespaces an event with a prefix. 426 * 427 * @param {string} key Event name to be namespaced. 428 * @returns {string} Namespaced event. 429 */ 430 431 }, { 432 key: "createEventName", 433 value: function createEventName(key) { 434 return "".concat(this.eventPrefix, ":").concat(key); 435 } 436 /** 437 * Registers events on the document and returns a function for deregistering the same events. 438 * 439 * @param {Object} events An object with events where the keys are the event names. 440 * @param {string[]} identifiers An array of identifiers for the app where the events are registered. 441 * @returns {Function} 442 */ 443 444 }, { 445 key: "registerEvents", 446 value: function registerEvents() { 447 var _this = this; 448 449 var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 450 var identifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; 451 identifiers = this.prepareIdentifiers(identifiers); 452 var listeners = []; 453 454 var _loop = function _loop(key) { 455 var eventName = _this.createEventName(key); 456 457 var listener = function listener(e) { 458 if (e.detail.identifier && identifiers.includes(e.detail.identifier)) { 459 events[key].call(null, e.detail.args); 460 } 461 }; 462 463 document.addEventListener(eventName, listener); 464 listeners.push({ 465 eventName: eventName, 466 listener: listener 467 }); 468 }; 469 470 for (var _i = 0, _Object$keys = Object.keys(events); _i < _Object$keys.length; _i++) { 471 var key = _Object$keys[_i]; 472 473 _loop(key); 474 } 475 476 return function () {
477 listeners.forEach(function (_ref) { 478 var eventName = _ref.eventName, 479 listener = _ref.listener; 480 return document.removeEventListener(eventName, listener); 481 }); 482 }; 483 } 484 /** 485 * Trigger an event 486 * 487 * @param {String} identifier 488 * @param {String} name 489 * @param {Object args 490 */ 491 492 }, { 493 key: "triggerEvent", 494 value: function triggerEvent(identifier, name) { 495 var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 496 document.dispatchEvent(new CustomEvent(this.createEventName(name), { 497 detail: { 498 identifier: identifier, 499 args: args 500 } 501 })); 502 } 503 }]); 504 505 return EventApi; 506}();; 507 508 return module.exports; 509 });}}); 510AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/template/main',module:function(define){define(function(require){var _=require('underscore');return function(obj){ 511var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');}; 512with(obj||{}){ 513__p+='<button class="lp-overlay-button '+ 514((__t=(buttonClasses))==null?'':_.escape(__t))+ 515'">'+ 516((__t=(buttonText))==null?'':__t)+ 517'</button>'; 518} 519return __p; 520};});}}); 521AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/module/client/@limepark/event-api_2.0.1/cjs',module:function(define){'use strict';define(function (require) { 522 var app = require('app'); 523 524 var EventApi = require("/module/client/@limepark/event-api_2.0.1/EventApi"); // Default instance. 525 526 527 var api = new EventApi({ 528 appIdentifier: app.webAppId, 529 portletId: app.portletId 530 }); 531 /** 532 * 533 * @param {string} identifier Identifier for the app to be triggered. 534 * @param {string} name Name of the event. 535 * @param {Object} args Arguments which should be passed to the event. 536 * @returns {Void} 537 */ 538 539 function triggerEvent(identifier, name) { 540 var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 541 return api.triggerEvent(identifier, name, args); 542 } 543 /** 544 * Creates events which can be used to communicate with the app. 545 * 546 * @param {Object} events An object with events where the keys are the event names. 547 * @param {string[]} identifiers An array of identifiers for the app where the events are registered. 548 * @returns {Function} Returns a function for deregistering the created events. Useful when registering in React.useEffect(). 549 * @example 550 * // CJS example for old webapps. 551 * define((require) => { 552 * const eventApi = require('@limepark/event-api/cjs'); 553 * 554 * // ... 555 * 556 * return Component.extend({ 557 * onAttached() { 558 * this._removeEventsCallback = eventApi.createEventApi({ 559 * setName ({ name }) { 560 * // ... 561 * } 562 * }); 563 * } 564 * }); 565 * }); 566 */ 567 568 569 function createEventApi() { 570 var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 571 var identifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; 572 return api.registerEvents(events, identifiers); 573 } 574 575 return { 576 EventApi: EventApi, 577 triggerEvent: triggerEvent, 578 createEventApi: createEventApi 579 }; 580});}}); 581AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/template/overlay',module:function(define){define(function(require){var _=require('underscore');return function(obj){ 582var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');}; 583with(obj||{}){ 584__p+='<div aria-label="'+ 585((__t=(dialogLabel))==null?'':_.escape(__t))+ 586'" class="lp-overlay__container '+ 587((__t=(containerClasses))==null?'':_.escape(__t))+ 588'" role="dialog" aria-hidden="true">\n <div class="lp-overlay__inner">\n <div class="lp-overlay__header">\n <button class="lp-overlay__close-button" data-action-close-overlay>'+ 589((__t=(closeButtonText))==null?'':__t)+ 590'</button>\n </div>\n \n <div class="lp-overlay__content"></div>\n </div>\n</div>'; 591} 592return __p; 593};});}}); 594AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/module/client/tabbable',module:function(define){'use strict';define(function (require) { 595 /** 596 * Source: https://github.com/focus-trap/tabbable 597 */ 598 var candidateSelectors = ['input', 'select', 'textarea', 'a[href]', 'button', '[tabindex]', 'audio[controls]', 'video[controls]', '[contenteditable]:not([contenteditable="false"])', 'details>summary']; 599 var candidateSelector = /* #__PURE__ */candidateSelectors.join(','); 600 var matches = typeof Element === 'undefined' ? function () {} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; 601 602 function tabbable(el, options) { 603 options = options || {}; 604 var regularTabbables = []; 605 var orderedTabbables = []; 606 var candidates = el.querySelectorAll(candidateSelector); 607 608 if (options.includeContainer) { 609 if (matches.call(el, candidateSelector)) { 610 candidates = Array.prototype.slice.apply(candidates); 611 candidates.unshift(el); 612 } 613 } 614 615 var candidate; 616 var candidateTabindex; 617 618 for (var i = 0; i < candidates.length; i++) { 619 candidate = candidates[i]; 620 621 if (!isNodeMatchingSelectorTabbable(candidate)) { 622 continue; 623 } 624 625 candidateTabindex = getTabindex(candidate); 626 627 if (candidateTabindex === 0) { 628 regularTabbables.push(candidate); 629 } else { 630 orderedTabbables.push({ 631 documentOrder: i, 632 tabIndex: candidateTabindex, 633 node: candidate 634 }); 635 } 636 } 637 638 var tabbableNodes = orderedTabbables.sort(sortOrderedTabbables).map(function (a) { 639 return a.node; 640 }).concat(regularTabbables); 641 return tabbableNodes; 642 } 643 644 function isNodeMatchingSelectorTabbable(node) { 645 if (!isNodeMatchingSelectorFocusable(node) || isNonTabbableRadio(node) || getTabindex(node) < 0) { 646 return false;
647 } 648 649 return true; 650 } 651 652 function isTabbable(node) { 653 if (!node) { 654 throw new Error('No node provided'); 655 } 656 657 if (matches.call(node, candidateSelector) === false) { 658 return false; 659 } 660 661 return isNodeMatchingSelectorTabbable(node); 662 } 663 664 function isNodeMatchingSelectorFocusable(node) { 665 if (node.disabled || isHiddenInput(node) || isHidden(node)) { 666 return false; 667 } 668 669 return true; 670 } 671 672 var focusableCandidateSelector = candidateSelectors.concat('iframe').join(','); 673 674 function isFocusable(node) { 675 if (!node) { 676 throw new Error('No node provided'); 677 } 678 679 if (matches.call(node, focusableCandidateSelector) === false) { 680 return false; 681 } 682 683 return isNodeMatchingSelectorFocusable(node); 684 } 685 686 function getTabindex(node) { 687 var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10); 688 689 if (!isNaN(tabindexAttr)) { 690 return tabindexAttr; 691 } // Browsers do not return `tabIndex` correctly for contentEditable nodes; 692 // so if they don't have a tabindex attribute specifically set, assume it's 0. 693 694 695 if (isContentEditable(node)) { 696 return 0; 697 } // in Chrome, <audio controls/> and <video controls/> elements get a default 698 // `tabIndex` of -1 when the 'tabindex' attribute isn't specified in the DOM, 699 // yet they are still part of the regular tab order; in FF, they get a default 700 // `tabIndex` of 0; since Chrome still puts those elements in the regular tab 701 // order, consider their tab index to be 0 702 703 704 if ((node.nodeName === 'AUDIO' || node.nodeName === 'VIDEO') && node.getAttribute('tabindex') === null) { 705 return 0; 706 } 707 708 return node.tabIndex; 709 } 710 711 function sortOrderedTabbables(a, b) { 712 return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex; 713 } 714 715 function isContentEditable(node) { 716 return node.contentEditable === 'true'; 717 } 718 719 function isInput(node) { 720 return node.tagName === 'INPUT'; 721 } 722 723 function isHiddenInput(node) { 724 return isInput(node) && node.type === 'hidden'; 725 } 726 727 function isRadio(node) { 728 return isInput(node) && node.type === 'radio'; 729 } 730 731 function isNonTabbableRadio(node) { 732 return isRadio(node) && !isTabbableRadio(node); 733 } 734 735 function getCheckedRadio(nodes, form) { 736 for (var i = 0; i < nodes.length; i++) { 737 if (nodes[i].checked && nodes[i].form === form) { 738 return nodes[i]; 739 } 740 } 741 } 742 743 function isTabbableRadio(node) { 744 if (!node.name) { 745 return true; 746 } 747 748 var radioScope = node.form || node.ownerDocument; 749 var radioSet = radioScope.querySelectorAll('input[type="radio"][name="' + node.name + '"]'); 750 var checked = getCheckedRadio(radioSet, node.form); 751 return !checked || checked === node; 752 } 753 754 function isHidden(node) { 755 // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element, 756 // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well. 757 return node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'; 758 } 759 760 return { 761 tabbable: tabbable, 762 isTabbable: isTabbable, 763 isFocusable: isFocusable 764 }; 765});}}); 766AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/module/common/@limepark/wdu-log_1.0.2/index',module:function(define){'use strict';/** 767 * Logger for use with the webapp dev utils `log` command. 768 * 769 * @module common/wdu-log 770 * @example 771 * const WDULog = require('!limepark:common/wdu-log'); 772 * const log = WDULog.getLogger(__filename); 773 * 774 * function doSomeWork(data) { 775 * log.debug('Trying to calculate data from', data); 776 * var result = calculateData(data); 777 * if (!data) { 778 * log.warn('Unable to calculate result from specified data.'); 779 * return null; 780 * } 781 * 782 * log.debug('Generated result', result); 783 * 784 * // 785 * //... 786 * } 787 */ 788 789/* globals require, module */ 790(function (root, factory) { 791 if (typeof define === 'function') { 792 // AMD. Register as an anonymous module. 793 define(factory); 794 } else if (typeof module === 'object' && module.exports) { 795 // Node. Does not work with strict CommonJS, but 796 // only CommonJS-like environments that support module.exports, 797 // like Node. 798 module.exports = factory(require); 799 } else { 800 // Browser globals (root is window) 801 root.wduLog = factory(); 802 } 803})(typeof self !== 'undefined' ? self : this, function (require) { 804 var _dereq_ = require; 805 var isBrowser = typeof window !== 'undefined'; 806 var logUtil = isBrowser ? console : _dereq_('LogUtil'); 807 808 if (isBrowser) { 809 logUtil.debug = logUtil.log; 810 } 811 812 var buildLogMessage = function buildLogMessage(logTag, message) { 813 var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 814 var messages = ["WDU[M#".concat("limepark.webapp-overlay-button", "/").concat(logTag, "]: ").concat(message)]; 815 816 if (data) { 817 messages.push("WDU[D#".concat("limepark.webapp-overlay-button", "/").concat(logTag, "]: ").concat(JSON.stringify(data))); 818 } 819 820 return messages; 821 }; 822 /** 823 * Creates a new Logger with a logTag 824 * 825 * @param {string} logTag The log tag 826 * @module server/wdu-log/Logger 827 */ 828 829 830 var Logger = function Logger(logTag) { 831 this.LOG_TAG = logTag; 832 }; 833 /** 834 * Logs an info message 835 * 836 * @param {String} message The message 837 * @param {Mixed}
837 data Extra data for the message, will be stringified 838 * @memberof module:server/wdu-log/Logger 839 */ 840 841 842 Logger.prototype.info = function Logger$$info(message) { 843 var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; 844 buildLogMessage(this.LOG_TAG, message, data).forEach(function (m) { 845 return logUtil.info(m); 846 }); 847 }; 848 /** 849 * Logs a debug message 850 * 851 * @param {String} message The message 852 * @param {Mixed} data Extra data for the message, will be stringified 853 * @memberof module:server/wdu-log/Logger 854 */ 855 856 857 Logger.prototype.debug = function Logger$$debug(message) { 858 var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; 859 buildLogMessage(this.LOG_TAG, message, data).forEach(function (m) { 860 return logUtil.debug(m); 861 }); 862 }; 863 /** 864 * Logs a warn message 865 * 866 * @param {String} message The message 867 * @param {Mixed} data Extra data for the message, will be stringified 868 * @memberof module:server/wdu-log/Logger 869 */ 870 871 872 Logger.prototype.warn = function Logger$$warn(message) { 873 var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; 874 buildLogMessage(this.LOG_TAG, message, data).forEach(function (m) { 875 return logUtil.warn(m); 876 }); 877 }; 878 /** 879 * Logs an error message 880 * 881 * @param {String} message The message 882 * @param {Mixed} data Extra data for the message, will be stringified 883 * @memberof module:server/wdu-log/Logger 884 */ 885 886 887 Logger.prototype.error = function Logger$$error(message) { 888 var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; 889 buildLogMessage(this.LOG_TAG, message, data).forEach(function (m) { 890 return logUtil.error(m); 891 }); 892 }; 893 894 Logger.prototype._debugReportError = function Logger$$_debugReportError(e, filename, fnName, line, col) { 895 try { 896 buildLogMessage(this.LOG_TAG, "An error occured in ".concat(filename, " (").concat(fnName, ":").concat(line, ":").concat(col, ") at ").concat(e.lineNumber, ": ").concat(e.message), e.stack).forEach(function (m) { 897 return logUtil.error(m); 898 }); 899 } catch (ex) { 900 logUtil.error('Error in wdu-log: ' + ex); 901 } 902 }; 903 /** 904 * Creates a logger with a specific LogTag 905 * 906 * @param {String} logTag The logTag, typically filename or another unique tag. 907 * @memberof module:server/wdu-log 908 * @returns {module:server/wdu-log/Logger} The logger 909 */ 910 911 912 var getLogger = function getLogger(logTag) { 913 return new Logger(logTag); 914 }; 915 916 return { 917 getLogger: getLogger 918 }; 919});}}); 920AppRegistry.registerModule({applicationId:'limepark.webapp-overlay-button|1.4.2',path:'/main',module:function(define){'use strict';function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } 921 922function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 923 924function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 925 926define(function (require) { 927 'use strict'; 928 929 var eventApi = require("/module/client/@limepark/event-api_2.0.1/cjs"); 930 931 var Component = require('Component'); 932 933 var template = require('/template/main'); 934 935 var $ = require('jquery'); 936 937 var overlayTemplate = require('/template/overlay'); 938 939 var FocusTrap = require("/module/client/focus-trap"); 940 941 var events = require('events'); 942 943 var tabbable = require("/module/client/tabbable"); 944 945 var domId = require("/module/common/domid-util"); 946 947 var CUSTOM_END_EVENT = 'overlayButton:tranimationend'; 948 var CUSTOM_EVENTS_NAMESPACE = 'lp-overlay-button'; 949 var KEYBOARD_TYPES = ['search', 'date', 'datetime-local', 'email', 'number', 'password', 'range', 'tel', 'text', 'time', 'url']; 950 951 var isOnline = function isOnline() { 952 return $('html').hasClass('sv-edit-mode'); 953 }; 954 955 return Component.extend({ 956 template: template, 957 className: 'lp-overlay-button__wrapper', 958 attributes: function attributes() { 959 var attributes = {}; 960 961 if (this.state.ariaRole) { 962 attributes.role = this.state.ariaRole; 963 } 964 965 if (this.state.ariaLabel) { 966 attributes['aria-label'] = this.state.ariaLabel; 967 } 968 969 return attributes; 970 }, 971 events: { 972 dom: { 973 'click button': 'handleButtonClick' 974 } 975 }, 976 _triggerCustomEvent: function _triggerCustomEvent(eventName) { 977 this.$el.trigger("".concat(eventName, ".").concat(CUSTOM_EVENTS_NAMESPACE), [this.$el, this._$container]); 978 events.trigger("".concat(CUSTOM_EVENTS_NAMESPACE, ":").concat(eventName), [this.$el, this._$container]); 979 }, 980 _hasMovedContent: false, 981 onAttached: function onAttached() { 982 this._ensureContainer(); 983
984 this._$pageContainer = $('body > div.sv-layout').eq(0).addClass('lp-overlay-page'); 985 986 this._$pageContainer.attr('aria-hidden', 'false'); 987 988 this._pageContainerHiddenClass = domId.pageHidden; 989 this._$button = this.$('button').attr('aria-controls', this._containerId).attr('aria-expanded', 'false'); 990 var inst = this; 991 this._removeEventsCallback = eventApi.createEventApi({ 992 close: function close(_ref) { 993 var _ref$trapOptions = _ref.trapOptions, 994 trapOptions = _ref$trapOptions === void 0 ? {} : _ref$trapOptions; 995 996 inst._hideContainer({ 997 trapOptions: trapOptions 998 }); 999 }, 1000 show: function show(_ref2) { 1001 var _ref2$firstFocusNode = _ref2.firstFocusNode, 1002 firstFocusNode = _ref2$firstFocusNode === void 0 ? null : _ref2$firstFocusNode; 1003 1004 inst._showContainer(firstFocusNode); 1005 } 1006 }); 1007 1008 this._setupAnchorLinkHijacker(); 1009 1010 this._ensureBackdrop(); 1011 1012 this._setupBreakpointListener(); 1013 1014 this._setupReducedMotionListener(); 1015 1016 this._setupResizeListener(); 1017 }, 1018 onDestroy: function onDestroy() { 1019 if (this._removeEventsCallback) { 1020 this._removeEventsCallback(); 1021 1022 this._removeEventsCallback = null; 1023 } 1024 }, 1025 _setupResizeListener: function _setupResizeListener() { 1026 var _this = this; 1027 1028 $(window).on('resize', function () { 1029 _this._$container.height($(window).innerHeight()); 1030 }).trigger('resize'); 1031 }, 1032 _setupAnchorLinkHijacker: function _setupAnchorLinkHijacker() { 1033 var _this2 = this; 1034 1035 $('body').on('click', 'a[href^="#"]', function (e) { 1036 if (!_this2._hasMovedContent) { 1037 return; 1038 } 1039 1040 var $target = $(e.target); 1041 var targetId = $target.attr('href'); 1042 1043 if (!targetId) { 1044 return; 1045 } 1046 1047 var $anchorTargetElement = null; 1048 1049 try { 1050 $anchorTargetElement = _this2._$container.find(targetId); 1051 } catch (ex) {// not handeled. 1052 } 1053 1054 if (!$anchorTargetElement || $anchorTargetElement.length === 0) { 1055 return; 1056 } 1057 1058 e.preventDefault(); 1059 1060 _this2._showContainer($anchorTargetElement.get(0)); 1061 1062 return false; 1063 }); 1064 }, 1065 _ensureBackdrop: function _ensureBackdrop() { 1066 this._$backdrop = $('#' + domId.backdrop); 1067 1068 if (!this._$backdrop.length) { 1069 this._$backdrop = $('<div class="lp-overlay__backdrop" />').hide().attr('id', domId.backdrop); 1070 $('body').append(this._$backdrop); 1071 } 1072 }, 1073 _setupReducedMotionListener: function _setupReducedMotionListener() { 1074 var _this3 = this; 1075 1076 var mql = window.matchMedia('(prefers-reduced-motion: reduce)'); 1077 1078 var onMqlChange = function onMqlChange() { 1079 if (mql.matches) { 1080 _this3._animationDuration = 1; 1081 } else { 1082 _this3._animationDuration = _this3.state.animationDuration; 1083 } 1084 }; 1085 1086 mql.addListener(onMqlChange); 1087 onMqlChange(); 1088 }, 1089 _setupBreakpointListener: function _setupBreakpointListener() { 1090 var _this4 = this; 1091 1092 var mql = window.matchMedia(this.state.breakpoints); 1093 1094 var onMqlChange = function onMqlChange() { 1095 if (mql.matches) { 1096 _this4._ensureContent(); 1097 1098 if (!isOnline()) { 1099 _this4.$el.parent().show(); 1100 } 1101 } else { 1102 if (!isOnline()) { 1103 _this4.$el.parent().hide(); 1104 } 1105 1106 _this4._hideContainer(); 1107 1108 _this4._returnContent(); 1109 } 1110 }; 1111 1112 mql.addListener(onMqlChange); 1113 onMqlChange(); 1114 }, 1115 _ensureContent: function _ensureContent() { 1116 if (this._hasMovedContent) { 1117 return; 1118 } 1119 1120 this._hasMovedContent = true; 1121 1122 var $content = this._$container.find('.lp-overlay__content'); 1123 1124 this.state.selectors.forEach(function (selector) { 1125 var $elements = $(selector); 1126 $elements.each(function () { 1127 var $elem = $(this); 1128 var $locationHolder = document.createComment("".concat(selector)); 1129 $elem.before($locationHolder); 1130 $elem.data('orig-location', $locationHolder); 1131 $content.append($elem); 1132 }); 1133 }); 1134 1135 this._triggerCustomEvent('content-moved'); 1136 }, 1137 _returnContent: function _returnContent() { 1138 if (!this._hasMovedContent) { 1139 return; 1140 } 1141 1142 this._hasMovedContent = false;
1143 1144 var $content = this._$container.find('.lp-overlay__content'); 1145 1146 $content.children().each(function () { 1147 var $elem = $(this); 1148 var $locationHolder = $elem.data('orig-location'); 1149 $elem.insertAfter($locationHolder); 1150 $elem.data('orig-location', null); 1151 $locationHolder.remove(); 1152 }); 1153 1154 this._triggerCustomEvent('content-restored'); 1155 }, 1156 _createContainer: function _createContainer() { 1157 var _this5 = this; 1158 1159 var $container = $(overlayTemplate(_objectSpread({}, this.state))).appendTo('body').hide(); 1160 $container.on('click', '[data-action-close-overlay]', function () { 1161 _this5._hideContainer(); 1162 }); 1163 this._$inner = $container.find('.lp-overlay__inner'); 1164 1165 this._$inner.on('transitionend animationend', function (e) { 1166 if (e.target === _this5._$inner.get(0)) { 1167 _this5._$inner.trigger(CUSTOM_END_EVENT); 1168 } 1169 }); 1170 1171 this._containerId = domId.container; 1172 this._containerVisibleClass = domId.containerVisible; 1173 $container.attr('aria-hidden', 'true'); 1174 $container.attr('id', this._containerId); 1175 this._focusTrap = FocusTrap.create($container.get(0), { 1176 onDeactivate: function onDeactivate() { 1177 _this5._hideContainer(); 1178 }, 1179 initialFocus: function initialFocus() { 1180 if (_this5._hasInputFocusHack) { 1181 setTimeout(function () { 1182 _this5._inputFocusHackElement.remove(); 1183 }, 20); 1184 } 1185 1186 var focusableNodes = tabbable.tabbable($container.get(0)); 1187 1188 if (focusableNodes.length === 1) { 1189 return focusableNodes[0]; 1190 } 1191 1192 return focusableNodes[1]; 1193 }, 1194 clickOutsideDeactivates: true 1195 }); 1196 return $container; 1197 }, 1198 _addAdvancedInClasses: function _addAdvancedInClasses($container) { 1199 if (!this.state.useAdvancedAnimation) { 1200 return $container; 1201 } 1202 1203 var animationClasses = 'animate__animated animate__' + this.state.animationIn; 1204 var $inner = $container.find('.lp-overlay__inner'); 1205 $inner.addClass(animationClasses).one(CUSTOM_END_EVENT, function () { 1206 $inner.removeClass(animationClasses); 1207 }); 1208 return $container; 1209 }, 1210 _addAdvancedOutClasses: function _addAdvancedOutClasses($container) { 1211 if (!this.state.useAdvancedAnimation) { 1212 return $container; 1213 } 1214 1215 var animationClasses = 'animate__animated animate__' + this.state.animationOut; 1216 var $inner = $container.find('.lp-overlay__inner'); 1217 $inner.addClass(animationClasses).one(CUSTOM_END_EVENT, function () { 1218 $inner.removeClass(animationClasses); 1219 }); 1220 return $container; 1221 }, 1222 _isKeyboardableInput: function _isKeyboardableInput(elem) { 1223 if (!elem) { 1224 return false; 1225 } 1226 1227 var $elem = $(elem); 1228 1229 if ($elem.prop("tagName") !== 'INPUT') { 1230 return false; 1231 } 1232 1233 var type = $elem.attr('type') || 'text'; 1234 return KEYBOARD_TYPES.indexOf(type) > -1; 1235 }, 1236 _createInputHackElement: function _createInputHackElement() { 1237 var $fakeInput = $("<input type='text' />").css({ 1238 position: "absolute", 1239 width: '200px', 1240 // zoom properly (iOS) 1241 height: 0, 1242 // hide cursor (font-size: 0 will zoom to quarks level) (iOS) 1243 opacity: 0 // make input transparent :] 1244 1245 }); 1246 $fakeInput.appendTo(this._$container).focus(); 1247 return $fakeInput; 1248 }, 1249 _isVisible: false, 1250 _animating: false, 1251 _hasInputFocusHack: false, 1252 _inputFocusHackElement: null, 1253 _showContainer: function _showContainer() { 1254 var _tabbable$tabbable, 1255 _this6 = this; 1256 1257 var firstFocusNode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; 1258 1259 if (this._isVisible || this._animating) { 1260 return; 1261 } 1262 1263 var scrollbarWidthPx = window.innerWidth - document.body.clientWidth; 1264 this._animating = true; 1265 $('body').addClass('lp-overlay-body--noscroll'); 1266 $('html').addClass('lp-overlay-html--noscroll').css('margin-right', scrollbarWidthPx); 1267 1268 this._addAdvancedInClasses(this._$container.addClass('lp-overlay__container--visible').show().addClass(this._containerVisibleClass).css('top', $(window).scrollTop())); 1269
1270 this._$pageContainer.addClass('lp-overlay-page--hidden').addClass(domId.page).addClass(this._pageContainerHiddenClass); 1271 1272 if (this.state.usePageTransform) { 1273 if (this.state.animationIn === 'slideInDown') { 1274 this._$pageContainer.css('transform', 'translateY(' + this._$inner.outerHeight() * this.state.pageTransformPercent + 'px)'); 1275 } else if (this.state.animationIn === 'slideInUp') { 1276 this._$pageContainer.css('transform', 'translateY(-' + this._$inner.outerHeight() * this.state.pageTransformPercent + 'px)'); 1277 } else if (this.state.animationIn === 'slideInLeft') { 1278 this._$pageContainer.css('transform', 'translateX(' + this._$inner.outerWidth() * this.state.pageTransformPercent + 'px)'); 1279 } else if (this.state.animationIn === 'slideInRight') { 1280 this._$pageContainer.css('transform', 'translateX(-' + this._$inner.outerWidth() * this.state.pageTransformPercent + 'px)'); 1281 } 1282 } 1283 1284 this._$backdrop.css('height', $(document).height()).fadeIn(this._animationDuration); 1285 1286 this._isVisible = true; 1287 var activeElement = null; 1288 1289 if (this._isKeyboardableInput((_tabbable$tabbable = tabbable.tabbable(this._$container.get(0))) === null || _tabbable$tabbable === void 0 ? void 0 : _tabbable$tabbable[1])) { 1290 if (!firstFocusNode) { 1291 activeElement = document.activeElement; 1292 } 1293 1294 this._hasInputFocusHack = true; 1295 this._inputFocusHackElement = this._createInputHackElement(); 1296 } 1297 1298 this._$inner.one(CUSTOM_END_EVENT, function () { 1299 _this6._$pageContainer.attr('aria-hidden', 'true'); 1300 1301 _this6._$container.attr('aria-hidden', 'false'); 1302 1303 _this6._$container.attr('aria-modal', 'true'); 1304 1305 _this6._$button.attr('aria-expanded', 'true'); 1306 1307 _this6._focusTrap.activate({ 1308 initialFocus: firstFocusNode, 1309 activeElement: activeElement 1310 }); 1311 1312 _this6._animating = false; 1313 1314 _this6._triggerCustomEvent('opened'); 1315 }); 1316 1317 this._triggerCustomEvent('open'); 1318 }, 1319 _hideContainer: function _hideContainer() { 1320 var _this7 = this; 1321 1322 var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 1323 1324 if (!this._isVisible || this._animating) { 1325 return; 1326 } 1327 1328 this._animating = true; 1329 1330 this._addAdvancedOutClasses(this._$container.removeClass('lp-overlay__container--visible').removeClass(this._containerVisibleClass)); 1331 1332 this._$inner.one(CUSTOM_END_EVENT, function () { 1333 _this7._$container.hide(); 1334 1335 $('body').removeClass('lp-overlay-body--noscroll'); 1336 $('html').removeClass('lp-overlay-html--noscroll').css('margin-right', 0); 1337 1338 _this7._$pageContainer.removeClass(domId.page); 1339 1340 _this7._$pageContainer.attr('aria-hidden', 'false'); 1341 1342 _this7._$container.attr('aria-hidden', 'true'); 1343 1344 _this7._$container.removeAttr('aria-modal'); 1345 1346 _this7._$button.attr('aria-expanded', 'false'); 1347 1348 _this7._focusTrap.deactivate((opts === null || opts === void 0 ? void 0 : opts.trapOptions) || {}); 1349 1350 _this7._animating = false; 1351 1352 _this7._triggerCustomEvent('closed'); 1353 }); 1354 1355 this._$pageContainer.removeClass('lp-overlay-page--hidden').css('transform', 'none').removeClass(this._pageContainerHiddenClass); 1356 1357 this._$backdrop.fadeOut(this._animationDuration); 1358 1359 this._isVisible = false; 1360 1361 this._triggerCustomEvent('close'); 1362 }, 1363 _toggleContainer: function _toggleContainer() { 1364 if (!this._isVisible) { 1365 this._showContainer(); 1366 } else { 1367 this._hideContainer(); 1368 } 1369 }, 1370 _ensureContainer: function _ensureContainer() { 1371 if (!this._$container) { 1372 this._$container = this._createContainer(); 1373 } 1374 1375 return this._$container; 1376 }, 1377 handleButtonClick: function handleButtonClick() { 1378 this._ensureContainer(); 1379 1380 this._ensureContent(); 1381 1382 this._toggleContainer(); 1383 }, 1384 filterState: function filterState(state) { 1385 return _objectSpread({}, state); 1386 } 1387 }); 1388});}});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.