vendor: 18,321 bytes, lines 1-520
1/*! bdtUIkit 3.21.7 | https://www.getuikit.com | (c) 2014 - 2024 YOOtheme | MIT License */ 2 3(function (global, factory) { 4 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 5 typeof define === 'function' && define.amd ? define('uikit', factory) : 6 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bdtUIkit = factory()); 7})(this, (function () { 'use strict'; 8 9 const { hasOwnProperty, toString } = Object.prototype; 10 function hasOwn(obj, key) { 11 return hasOwnProperty.call(obj, key); 12 } 13 const hyphenateRe = /\B([A-Z])/g; 14 const hyphenate = memoize((str) => str.replace(hyphenateRe, "-$1").toLowerCase()); 15 const camelizeRe = /-(\w)/g; 16 const camelize = memoize( 17 (str) => (str.charAt(0).toLowerCase() + str.slice(1)).replace(camelizeRe, (_, c) => c.toUpperCase()) 18 ); 19 const ucfirst = memoize((str) => str.charAt(0).toUpperCase() + str.slice(1)); 20 function startsWith(str, search) { 21 var _a; 22 return (_a = str == null ? void 0 : str.startsWith) == null ? void 0 : _a.call(str, search); 23 } 24 function endsWith(str, search) { 25 var _a; 26 return (_a = str == null ? void 0 : str.endsWith) == null ? void 0 : _a.call(str, search); 27 } 28 function includes(obj, search) { 29 var _a; 30 return (_a = obj == null ? void 0 : obj.includes) == null ? void 0 : _a.call(obj, search); 31 } 32 function findIndex(array, predicate) { 33 var _a; 34 return (_a = array == null ? void 0 : array.findIndex) == null ? void 0 : _a.call(array, predicate); 35 } 36 const { isArray, from: toArray } = Array; 37 const { assign } = Object; 38 function isFunction(obj) { 39 return typeof obj === "function"; 40 } 41 function isObject(obj) { 42 return obj !== null && typeof obj === "object"; 43 } 44 function isPlainObject(obj) { 45 return toString.call(obj) === "[object Object]"; 46 } 47 function isWindow(obj) { 48 return isObject(obj) && obj === obj.window; 49 } 50 function isDocument(obj) { 51 return nodeType(obj) === 9; 52 } 53 function isNode(obj) { 54 return nodeType(obj) >= 1; 55 } 56 function isElement(obj) { 57 return nodeType(obj) === 1; 58 } 59 function nodeType(obj) { 60 return !isWindow(obj) && isObject(obj) && obj.nodeType; 61 } 62 function isBoolean(value) { 63 return typeof value === "boolean"; 64 } 65 function isString(value) { 66 return typeof value === "string"; 67 } 68 function isNumber(value) { 69 return typeof value === "number"; 70 } 71 function isNumeric(value) { 72 return isNumber(value) || isString(value) && !isNaN(value - parseFloat(value)); 73 } 74 function isEmpty(obj) { 75 return !(isArray(obj) ? obj.length : isObject(obj) ? Object.keys(obj).length : false); 76 } 77 function isUndefined(value) { 78 return value === void 0; 79 } 80 function toBoolean(value) { 81 return isBoolean(value) ? value : value === "true" || value === "1" || value === "" ? true : value === "false" || value === "0" ? false : value; 82 } 83 function toNumber(value) { 84 const number = Number(value); 85 return isNaN(number) ? false : number; 86 } 87 function toFloat(value) { 88 return parseFloat(value) || 0; 89 } 90 function toNode(element) { 91 return element && toNodes(element)[0]; 92 } 93 function toNodes(element) { 94 return isNode(element) ? [element] : Array.from(element || []).filter(isNode); 95 } 96 function toWindow(element) { 97 if (isWindow(element)) { 98 return element; 99 } 100 element = toNode(element); 101 const document = isDocument(element) ? element : element == null ? void 0 : element.ownerDocument; 102 return (document == null ? void 0 : document.defaultView) || window; 103 } 104 function isEqual(value, other) { 105 return value === other || isObject(value) && isObject(other) && Object.keys(value).length === Object.keys(other).length && each(value, (val, key) => val === other[key]); 106 } 107 function swap(value, a, b) { 108 return value.replace(new RegExp(`${a}|${b}`, "g"), (match) => match === a ? b : a); 109 } 110 function last(array) { 111 return array[array.length - 1]; 112 } 113 function each(obj, cb) { 114 for (const key in obj) { 115 if (false === cb(obj[key], key)) { 116 return false; 117 } 118 } 119 return true; 120 } 121 function sortBy(array, prop) { 122 return array.slice().sort( 123 ({ [prop]: propA = 0 }, { [prop]: propB = 0 }) => propA > propB ? 1 : propB > propA ? -1 : 0 124 ); 125 } 126 function sumBy(array, iteratee) { 127 return array.reduce( 128 (sum, item) => sum + toFloat(isFunction(iteratee) ? iteratee(item) : item[iteratee]), 129 0 130 ); 131 } 132 function uniqueBy(array, prop) { 133 const seen = /* @__PURE__ */ new Set(); 134 return array.filter(({ [prop]: check }) => seen.has(check) ? false : seen.add(check)); 135 } 136 function pick(obj, props) { 137 return props.reduce((res, prop) => ({ ...res, [prop]: obj[prop] }), {}); 138 } 139 function clamp(number, min = 0, max = 1) { 140 return Math.min(Math.max(toNumber(number) || 0, min), max); 141 } 142 function noop() { 143 } 144 function intersectRect(...rects) { 145 return [ 146 ["bottom", "top"], 147 ["right", "left"] 148 ].every( 149 ([minProp, maxProp]) => Math.min(...rects.map(({ [minProp]: min }) => min)) - Math.max(...rects.map(({ [maxProp]: max }) => max)) > 0 150 ); 151 } 152 function pointInRect(point, rect) { 153 return point.x <= rect.right && point.x >= rect.left && point.y <= rect.bottom && point.y >= rect.top; 154 } 155 function ratio(dimensions, prop, value) { 156 const aProp = prop === "width" ? "height" : "width"; 157 return { 158 [aProp]: dimensions[prop] ? Math.round(value * dimensions[aProp] / dimensions[prop]) : dimensions[aProp], 159 [prop]: value 160 }; 161 } 162 function contain(dimensions, maxDimensions) { 163 dimensions = { ...dimensions }; 164 for (const prop in dimensions) { 165 dimensions = dimensions[prop] > maxDimensions[prop] ? ratio(dimensions, prop, maxDimensions[prop]) : dimensions; 166 } 167 return dimensions; 168 } 169 function cover$1(dimensions, maxDimensions) { 170 dimensions = contain(dimensions, maxDimensions); 171 for (const prop in dimensions) { 172 dimensions = dimensions[prop] < maxDimensions[prop] ? ratio(dimensions, prop, maxDimensions[prop]) : dimensions; 173 } 174 return dimensions; 175 } 176 const Dimensions = { ratio, contain, cover: cover$1 }; 177 function getIndex(i, elements, current = 0, finite = false) { 178 elements = toNodes(elements); 179 const { length } = elements; 180 if (!length) { 181 return -1; 182 } 183 i = isNumeric(i) ? toNumber(i) : i === "next" ? current + 1 : i === "previous" ? current - 1 : i === "last" ? length - 1 : elements.indexOf(toNode(i)); 184 if (finite) { 185 return clamp(i, 0, length - 1); 186 } 187 i %= length; 188 return i < 0 ? i + length : i; 189 } 190 function memoize(fn) { 191 const cache = /* @__PURE__ */ Object.create(null); 192 return (key, ...args) => cache[key] || (cache[key] = fn(key, ...args)); 193 } 194 195 function addClass(element, ...classes) { 196 for (const node of toNodes(element)) { 197 const add = toClasses(classes).filter((cls) => !hasClass(node, cls)); 198 if (add.length) { 199 node.classList.add(...add); 200 } 201 } 202 } 203 function removeClass(element, ...classes) { 204 for (const node of toNodes(element)) { 205 const remove = toClasses(classes).filter((cls) => hasClass(node, cls)); 206 if (remove.length) { 207 node.classList.remove(...remove); 208 } 209 } 210 } 211 function replaceClass(element, oldClass, newClass) { 212 newClass = toClasses(newClass); 213 oldClass = toClasses(oldClass).filter((cls) => !includes(newClass, cls)); 214 removeClass(element, oldClass); 215 addClass(element, newClass); 216 } 217 function hasClass(element, cls) { 218 [cls] = toClasses(cls); 219 return toNodes(element).some((node) => node.classList.contains(cls)); 220 } 221 function toggleClass(element, cls, force) { 222 const classes = toClasses(cls); 223 if (!isUndefined(force)) { 224 force = !!force; 225 } 226 for (const node of toNodes(element)) { 227 for (const cls2 of classes) { 228 node.classList.toggle(cls2, force); 229 } 230 } 231 } 232 function toClasses(str) { 233 return str ? isArray(str) ? str.map(toClasses).flat() : String(str).split(" ").filter(Boolean) : []; 234 } 235 236 function attr(element, name, value) { 237 var _a; 238 if (isObject(name)) { 239 for (const key in name) { 240 attr(element, key, name[key]); 241 } 242 return; 243 } 244 if (isUndefined(value)) { 245 return (_a = toNode(element)) == null ? void 0 : _a.getAttribute(name); 246 } else { 247 for (const el of toNodes(element)) { 248 if (isFunction(value)) { 249 value = value.call(el, attr(el, name)); 250 } 251 if (value === null) { 252 removeAttr(el, name); 253 } else { 254 el.setAttribute(name, value); 255 } 256 } 257 } 258 } 259 function hasAttr(element, name) { 260 return toNodes(element).some((element2) => element2.hasAttribute(name)); 261 } 262 function removeAttr(element, name) { 263 toNodes(element).forEach((element2) => element2.removeAttribute(name)); 264 } 265 function data(element, attribute) { 266 for (const name of [attribute, `data-${attribute}`]) { 267 if (hasAttr(element, name)) { 268 return attr(element, name); 269 } 270 } 271 } 272 273 const inBrowser = typeof window !== "undefined"; 274 const isRtl = inBrowser && document.dir === "rtl"; 275 const hasTouch = inBrowser && "ontouchstart" in window; 276 const hasPointerEvents = inBrowser && window.PointerEvent; 277 const pointerDown$1 = hasPointerEvents ? "pointerdown" : hasTouch ? "touchstart" : "mousedown"; 278 const pointerMove$1 = hasPointerEvents ? "pointermove" : hasTouch ? "touchmove" : "mousemove"; 279 const pointerUp$1 = hasPointerEvents ? "pointerup" : hasTouch ? "touchend" : "mouseup"; 280 const pointerEnter = hasPointerEvents ? "pointerenter" : hasTouch ? "" : "mouseenter"; 281 const pointerLeave = hasPointerEvents ? "pointerleave" : hasTouch ? "" : "mouseleave"; 282 const pointerCancel = hasPointerEvents ? "pointercancel" : "touchcancel"; 283 284 const voidElements = { 285 area: true, 286 base: true, 287 br: true, 288 col: true, 289 embed: true, 290 hr: true, 291 img: true, 292 input: true, 293 keygen: true, 294 link: true, 295 meta: true, 296 param: true, 297 source: true, 298 track: true, 299 wbr: true 300 }; 301 function isVoidElement(element) { 302 return toNodes(element).some((element2) => voidElements[element2.tagName.toLowerCase()]); 303 } 304 const isVisibleFn = inBrowser && Element.prototype.checkVisibility || function() { 305 return this.offsetWidth || this.offsetHeight || this.getClientRects().length; 306 }; 307 function isVisible(element) { 308 return toNodes(element).some((element2) => isVisibleFn.call(element2)); 309 } 310 const selInput = "input,select,textarea,button"; 311 function isInput(element) { 312 return toNodes(element).some((element2) => matches(element2, selInput)); 313 } 314 const selFocusable = `${selInput},a[href],[tabindex]`; 315 function isFocusable(element) { 316 return matches(element, selFocusable); 317 } 318 function parent(element) { 319 var _a; 320 return (_a = toNode(element)) == null ? void 0 : _a.parentElement; 321 } 322 function filter$1(element, selector) { 323 return toNodes(element).filter((element2) => matches(element2, selector)); 324 } 325 function matches(element, selector) { 326 return toNodes(element).some((element2) => element2.matches(selector)); 327 } 328 function parents(element, selector) { 329 const elements = []; 330 while (element = parent(element)) { 331 if (!selector || matches(element, selector)) { 332 elements.push(element); 333 } 334 } 335 return elements; 336 } 337 function children(element, selector) { 338 element = toNode(element); 339 const children2 = element ? toArray(element.children) : []; 340 return selector ? filter$1(children2, selector) : children2; 341 } 342 function index(element, ref) { 343 return ref ? toNodes(element).indexOf(toNode(ref)) : children(parent(element)).indexOf(element); 344 } 345 function isSameSiteAnchor(el) { 346 el = toNode(el); 347 return el && ["origin", "pathname", "search"].every((part) => el[part] === location[part]); 348 } 349 function getTargetedElement(el) { 350 if (isSameSiteAnchor(el)) { 351 const { hash, ownerDocument } = toNode(el); 352 const id = decodeURIComponent(hash).slice(1); 353 return ownerDocument.getElementById(id) || ownerDocument.getElementsByName(id)[0]; 354 } 355 } 356 357 function query(selector, context) { 358 return find(selector, getContext(selector, context)); 359 } 360 function queryAll(selector, context) { 361 return findAll(selector, getContext(selector, context)); 362 } 363 function find(selector, context) { 364 return toNode(_query(selector, toNode(context), "querySelector")); 365 } 366 function findAll(selector, context) { 367 return toNodes(_query(selector, toNode(context), "querySelectorAll")); 368 } 369 function getContext(selector, context = document) { 370 return isString(selector) && parseSelector(selector).isContextSelector || isDocument(context) ? context : context.ownerDocument; 371 } 372 const addStarRe = /([!>+~-])(?=\s+[!>+~-]|\s*$)/g; 373 const splitSelectorRe = /(\([^)]*\)|[^,])+/g; 374 const parseSelector = memoize((selector) => { 375 selector = selector.replace(addStarRe, "$1 *"); 376 let isContextSelector = false; 377 const selectors = []; 378 for (let sel of selector.match(splitSelectorRe)) { 379 sel = sel.trim(); 380 isContextSelector || (isContextSelector = ["!", "+", "~", "-", ">"].includes(sel[0])); 381 selectors.push(sel); 382 } 383 return { 384 selector: selectors.join(","), 385 selectors, 386 isContextSelector 387 }; 388 }); 389 const positionRe = /(\([^)]*\)|\S)*/; 390 const parsePositionSelector = memoize((selector) => { 391 selector = selector.slice(1).trim(); 392 const [position] = selector.match(positionRe); 393 return [position, selector.slice(position.length + 1)]; 394 }); 395 function _query(selector, context = document, queryFn) { 396 if (!selector || !isString(selector)) { 397 return selector; 398 } 399 const parsed = parseSelector(selector); 400 if (!parsed.isContextSelector) { 401 return _doQuery(context, queryFn, parsed.selector); 402 } 403 selector = ""; 404 const isSingle = parsed.selectors.length === 1; 405 for (let sel of parsed.selectors) { 406 let positionSel; 407 let ctx = context; 408 if (sel[0] === "!") { 409 [positionSel, sel] = parsePositionSelector(sel); 410 ctx = context.parentElement.closest(positionSel); 411 if (!sel && isSingle) { 412 return ctx; 413 } 414 } 415 if (ctx && sel[0] === "-") { 416 [positionSel, sel] = parsePositionSelector(sel); 417 ctx = ctx.previousElementSibling; 418 ctx = matches(ctx, positionSel) ? ctx : null; 419 if (!sel && isSingle) { 420 return ctx; 421 } 422 } 423 if (!ctx) { 424 continue; 425 } 426 if (isSingle) { 427 if (sel[0] === "~" || sel[0] === "+") { 428 sel = `:scope > :nth-child(${index(ctx) + 1}) ${sel}`; 429 ctx = ctx.parentElement; 430 } else if (sel[0] === ">") { 431 sel = `:scope ${sel}`; 432 } 433 return _doQuery(ctx, queryFn, sel); 434 } 435 selector += `${selector ? "," : ""}${domPath(ctx)} ${sel}`; 436 } 437 if (!isDocument(context)) { 438 context = context.ownerDocument; 439 } 440 return _doQuery(context, queryFn, selector); 441 } 442 function _doQuery(context, queryFn, selector) { 443 try { 444 return context[queryFn](selector); 445 } catch (e) { 446 return null; 447 } 448 } 449 function domPath(element) { 450 const names = []; 451 while (element.parentNode) { 452 const id = attr(element, "id"); 453 if (id) { 454 names.unshift(`#${escape(id)}`); 455 break; 456 } else { 457 let { tagName } = element; 458 if (tagName !== "HTML") { 459 tagName += `:nth-child(${index(element) + 1})`; 460 } 461 names.unshift(tagName); 462 element = element.parentNode; 463 } 464 } 465 return names.join(" > "); 466 } 467 function escape(css) { 468 return isString(css) ? CSS.escape(css) : ""; 469 } 470 471 function on(...args) { 472 let [targets, types, selector, listener, useCapture = false] = getArgs(args); 473 if (listener.length > 1) { 474 listener = detail(listener); 475 } 476 if (useCapture == null ? void 0 : useCapture.self) { 477 listener = selfFilter(listener); 478 } 479 if (selector) { 480 listener = delegate(selector, listener); 481 } 482 for (const type of types) { 483 for (const target of targets) { 484 target.addEventListener(type, listener, useCapture); 485 } 486 } 487 return () => off(targets, types, listener, useCapture); 488 } 489 function off(...args) { 490 let [targets, types, , listener, useCapture = false] = getArgs(args); 491 for (const type of types) { 492 for (const target of targets) { 493 target.removeEventListener(type, listener, useCapture); 494 } 495 } 496 } 497 function once(...args) { 498 const [element, types, selector, listener, useCapture = false, condition] = getArgs(args); 499 const off2 = on( 500 element, 501 types, 502 selector, 503 (e) => { 504 const result = !condition || condition(e); 505 if (result) { 506 off2(); 507 listener(e, result); 508 } 509 }, 510 useCapture 511 ); 512 return off2; 513 } 514 function trigger(targets, event, detail2) { 515 return toEventTargets(targets).every( 516 (target) => target.dispatchEvent(createEvent(event, true, true, detail2)) 517 ); 518 } 519 function createEvent(e, bubbles = true, cancelable = false, detail2) { 520 if (isString(e)) {
vendor: 8,006 bytes, lines 521-763
521 e = new CustomEvent(e, { bubbles, cancelable, detail: detail2 }); 522 } 523 return e; 524 } 525 function getArgs(args) { 526 args[0] = toEventTargets(args[0]); 527 if (isString(args[1])) { 528 args[1] = args[1].split(" "); 529 } 530 if (isFunction(args[2])) { 531 args.splice(2, 0, false); 532 } 533 return args; 534 } 535 function delegate(selector, listener) { 536 return (e) => { 537 const current = selector[0] === ">" ? findAll(selector, e.currentTarget).reverse().find((element) => element.contains(e.target)) : e.target.closest(selector); 538 if (current) { 539 e.current = current; 540 listener.call(this, e); 541 delete e.current; 542 } 543 }; 544 } 545 function detail(listener) { 546 return (e) => isArray(e.detail) ? listener(e, ...e.detail) : listener(e); 547 } 548 function selfFilter(listener) { 549 return function(e) { 550 if (e.target === e.currentTarget || e.target === e.current) { 551 return listener.call(null, e); 552 } 553 }; 554 } 555 function isEventTarget(target) { 556 return target && "addEventListener" in target; 557 } 558 function toEventTarget(target) { 559 return isEventTarget(target) ? target : toNode(target); 560 } 561 function toEventTargets(target) { 562 return isArray(target) ? target.map(toEventTarget).filter(Boolean) : isString(target) ? findAll(target) : isEventTarget(target) ? [target] : toNodes(target); 563 } 564 function isTouch(e) { 565 return e.pointerType === "touch" || !!e.touches; 566 } 567 function getEventPos(e) { 568 var _a, _b; 569 const { clientX: x, clientY: y } = ((_a = e.touches) == null ? void 0 : _a[0]) || ((_b = e.changedTouches) == null ? void 0 : _b[0]) || e; 570 return { x, y }; 571 } 572 573 const cssNumber = { 574 "animation-iteration-count": true, 575 "column-count": true, 576 "fill-opacity": true, 577 "flex-grow": true, 578 "flex-shrink": true, 579 "font-weight": true, 580 "line-height": true, 581 opacity: true, 582 order: true, 583 orphans: true, 584 "stroke-dasharray": true, 585 "stroke-dashoffset": true, 586 widows: true, 587 "z-index": true, 588 zoom: true 589 }; 590 function css(element, property, value, priority) { 591 const elements = toNodes(element); 592 for (const element2 of elements) { 593 if (isString(property)) { 594 property = propName(property); 595 if (isUndefined(value)) { 596 return getComputedStyle(element2).getPropertyValue(property); 597 } else { 598 element2.style.setProperty( 599 property, 600 isNumeric(value) && !cssNumber[property] ? `${value}px` : value || isNumber(value) ? value : "", 601 priority 602 ); 603 } 604 } else if (isArray(property)) { 605 const props = {}; 606 for (const prop of property) { 607 props[prop] = css(element2, prop); 608 } 609 return props; 610 } else if (isObject(property)) { 611 for (const prop in property) { 612 css(element2, prop, property[prop], value); 613 } 614 } 615 } 616 return elements[0]; 617 } 618 const propName = memoize((name) => { 619 if (startsWith(name, "--")) { 620 return name; 621 } 622 name = hyphenate(name); 623 const { style } = document.documentElement; 624 if (name in style) { 625 return name; 626 } 627 for (const prefix of ["webkit", "moz"]) { 628 const prefixedName = `-${prefix}-${name}`; 629 if (prefixedName in style) { 630 return prefixedName; 631 } 632 } 633 }); 634 635 const clsTransition = "bdt-transition"; 636 const transitionEnd = "transitionend"; 637 const transitionCanceled = "transitioncanceled"; 638 function transition$1(element, props, duration = 400, timing = "linear") { 639 duration = Math.round(duration); 640 return Promise.all( 641 toNodes(element).map( 642 (element2) => new Promise((resolve, reject) => { 643 for (const name in props) { 644 css(element2, name); 645 } 646 const timer = setTimeout(() => trigger(element2, transitionEnd), duration); 647 once( 648 element2, 649 [transitionEnd, transitionCanceled], 650 ({ type }) => { 651 clearTimeout(timer); 652 removeClass(element2, clsTransition); 653 css(element2, { 654 transitionProperty: "", 655 transitionDuration: "", 656 transitionTimingFunction: "" 657 }); 658 type === transitionCanceled ? reject() : resolve(element2); 659 }, 660 { self: true } 661 ); 662 addClass(element2, clsTransition); 663 css(element2, { 664 transitionProperty: Object.keys(props).map(propName).join(","), 665 transitionDuration: `${duration}ms`, 666 transitionTimingFunction: timing, 667 ...props 668 }); 669 }) 670 ) 671 ); 672 } 673 const Transition = { 674 start: transition$1, 675 async stop(element) { 676 trigger(element, transitionEnd); 677 await Promise.resolve(); 678 }, 679 async cancel(element) { 680 trigger(element, transitionCanceled); 681 await Promise.resolve(); 682 }, 683 inProgress(element) { 684 return hasClass(element, clsTransition); 685 } 686 }; 687 const clsAnimation = "bdt-animation"; 688 const animationEnd = "animationend"; 689 const animationCanceled = "animationcanceled"; 690 function animate$2(element, animation, duration = 200, origin, out) { 691 return Promise.all( 692 toNodes(element).map( 693 (element2) => new Promise((resolve, reject) => { 694 if (hasClass(element2, clsAnimation)) { 695 trigger(element2, animationCanceled); 696 } 697 const classes = [ 698 animation, 699 clsAnimation, 700 `${clsAnimation}-${out ? "leave" : "enter"}`, 701 origin && `bdt-transform-origin-${origin}`, 702 out && `${clsAnimation}-reverse` 703 ]; 704 const timer = setTimeout(() => trigger(element2, animationEnd), duration); 705 once( 706 element2, 707 [animationEnd, animationCanceled], 708 ({ type }) => { 709 clearTimeout(timer); 710 type === animationCanceled ? reject() : resolve(element2); 711 css(element2, "animationDuration", ""); 712 removeClass(element2, classes); 713 }, 714 { self: true } 715 ); 716 css(element2, "animationDuration", `${duration}ms`); 717 addClass(element2, classes); 718 }) 719 ) 720 ); 721 } 722 const Animation = { 723 in: animate$2, 724 out(element, animation, duration, origin) { 725 return animate$2(element, animation, duration, origin, true); 726 }, 727 inProgress(element) { 728 return hasClass(element, clsAnimation); 729 }, 730 cancel(element) { 731 trigger(element, animationCanceled); 732 } 733 }; 734 735 function ready(fn) { 736 if (document.readyState !== "loading") { 737 fn(); 738 return; 739 } 740 once(document, "DOMContentLoaded", fn); 741 } 742 function isTag(element, ...tagNames) { 743 return tagNames.some((tagName) => { 744 var _a; 745 return ((_a = element == null ? void 0 : element.tagName) == null ? void 0 : _a.toLowerCase()) === tagName.toLowerCase(); 746 }); 747 } 748 function empty(element) { 749 element = $(element); 750 element.innerHTML = ""; 751 return element; 752 } 753 function html(parent2, html2) { 754 return isUndefined(html2) ? $(parent2).innerHTML : append(empty(parent2), html2); 755 } 756 const prepend = applyFn("prepend"); 757 const append = applyFn("append"); 758 const before = applyFn("before"); 759 const after = applyFn("after"); 760 function applyFn(fn) { 761 return function(ref, element) { 762 var _a; 763 const nodes = toNodes(isString(element) ? fragment(element) : element);
vendor: 5,679 bytes, lines 764-923
764 (_a = $(ref)) == null ? void 0 : _a[fn](...nodes); 765 return unwrapSingle(nodes); 766 }; 767 } 768 function remove$1(element) { 769 toNodes(element).forEach((element2) => element2.remove()); 770 } 771 function wrapAll(element, structure) { 772 structure = toNode(before(element, structure)); 773 while (structure.firstElementChild) { 774 structure = structure.firstElementChild; 775 } 776 append(structure, element); 777 return structure; 778 } 779 function wrapInner(element, structure) { 780 return toNodes( 781 toNodes(element).map( 782 (element2) => element2.hasChildNodes() ? wrapAll(toArray(element2.childNodes), structure) : append(element2, structure) 783 ) 784 ); 785 } 786 function unwrap(element) { 787 toNodes(element).map(parent).filter((value, index, self) => self.indexOf(value) === index).forEach((parent2) => parent2.replaceWith(...parent2.childNodes)); 788 } 789 const singleTagRe = /^<(\w+)\s*\/?>(?:<\/\1>)?$/; 790 function fragment(html2) { 791 const matches = singleTagRe.exec(html2); 792 if (matches) { 793 return document.createElement(matches[1]); 794 } 795 const container = document.createElement("template"); 796 container.innerHTML = html2.trim(); 797 return unwrapSingle(container.content.childNodes); 798 } 799 function unwrapSingle(nodes) { 800 return nodes.length > 1 ? nodes : nodes[0]; 801 } 802 function apply(node, fn) { 803 if (!isElement(node)) { 804 return; 805 } 806 fn(node); 807 node = node.firstElementChild; 808 while (node) { 809 apply(node, fn); 810 node = node.nextElementSibling; 811 } 812 } 813 function $(selector, context) { 814 return isHtml(selector) ? toNode(fragment(selector)) : find(selector, context); 815 } 816 function $$(selector, context) { 817 return isHtml(selector) ? toNodes(fragment(selector)) : findAll(selector, context); 818 } 819 function isHtml(str) { 820 return isString(str) && startsWith(str.trim(), "<"); 821 } 822 823 const dirs$1 = { 824 width: ["left", "right"], 825 height: ["top", "bottom"] 826 }; 827 function dimensions$1(element) { 828 const rect = isElement(element) ? toNode(element).getBoundingClientRect() : { height: height(element), width: width(element), top: 0, left: 0 }; 829 return { 830 height: rect.height, 831 width: rect.width, 832 top: rect.top, 833 left: rect.left, 834 bottom: rect.top + rect.height, 835 right: rect.left + rect.width 836 }; 837 } 838 function offset(element, coordinates) { 839 if (coordinates) { 840 css(element, { left: 0, top: 0 }); 841 } 842 const currentOffset = dimensions$1(element); 843 if (element) { 844 const { scrollY, scrollX } = toWindow(element); 845 const offsetBy = { height: scrollY, width: scrollX }; 846 for (const dir in dirs$1) { 847 for (const prop of dirs$1[dir]) { 848 currentOffset[prop] += offsetBy[dir]; 849 } 850 } 851 } 852 if (!coordinates) { 853 return currentOffset; 854 } 855 for (const prop of ["left", "top"]) { 856 css(element, prop, coordinates[prop] - currentOffset[prop]); 857 } 858 } 859 function position(element) { 860 let { top, left } = offset(element); 861 const { 862 ownerDocument: { body, documentElement }, 863 offsetParent 864 } = toNode(element); 865 let parent = offsetParent || documentElement; 866 while (parent && (parent === body || parent === documentElement) && css(parent, "position") === "static") { 867 parent = parent.parentNode; 868 } 869 if (isElement(parent)) { 870 const parentOffset = offset(parent); 871 top -= parentOffset.top + toFloat(css(parent, "borderTopWidth")); 872 left -= parentOffset.left + toFloat(css(parent, "borderLeftWidth")); 873 } 874 return { 875 top: top - toFloat(css(element, "marginTop")), 876 left: left - toFloat(css(element, "marginLeft")) 877 }; 878 } 879 function offsetPosition(element) { 880 element = toNode(element); 881 const offset2 = [element.offsetTop, element.offsetLeft]; 882 while (element = element.offsetParent) { 883 offset2[0] += element.offsetTop + toFloat(css(element, `borderTopWidth`)); 884 offset2[1] += element.offsetLeft + toFloat(css(element, `borderLeftWidth`)); 885 if (css(element, "position") === "fixed") { 886 const win = toWindow(element); 887 offset2[0] += win.scrollY; 888 offset2[1] += win.scrollX; 889 return offset2; 890 } 891 } 892 return offset2; 893 } 894 const height = dimension("height"); 895 const width = dimension("width"); 896 function dimension(prop) { 897 const propName = ucfirst(prop); 898 return (element, value) => { 899 if (isUndefined(value)) { 900 if (isWindow(element)) { 901 return element[`inner${propName}`]; 902 } 903 if (isDocument(element)) { 904 const doc = element.documentElement; 905 return Math.max(doc[`offset${propName}`], doc[`scroll${propName}`]); 906 } 907 element = toNode(element); 908 value = css(element, prop); 909 value = value === "auto" ? element[`offset${propName}`] : toFloat(value) || 0; 910 return value - boxModelAdjust(element, prop); 911 } else { 912 return css( 913 element, 914 prop, 915 !value && value !== 0 ? "" : +value + boxModelAdjust(element, prop) + "px" 916 ); 917 } 918 }; 919 } 920 function boxModelAdjust(element, prop, sizing = "border-box") { 921 return css(element, "boxSizing") === sizing ? sumBy( 922 dirs$1[prop].map(ucfirst), 923 (prop2) => toFloat(css(element, `padding${prop2}`)) + toFloat(css(element, `border${prop2}W
vendor: 5,240 bytes, lines 923-1102
923idth`)) 924 ) : 0; 925 } 926 function flipPosition(pos) { 927 for (const dir in dirs$1) { 928 for (const i in dirs$1[dir]) { 929 if (dirs$1[dir][i] === pos) { 930 return dirs$1[dir][1 - i]; 931 } 932 } 933 } 934 return pos; 935 } 936 function toPx(value, property = "width", element = window, offsetDim = false) { 937 if (!isString(value)) { 938 return toFloat(value); 939 } 940 return sumBy(parseCalc(value), (value2) => { 941 const unit = parseUnit(value2); 942 return unit ? percent( 943 unit === "vh" ? getViewportHeight() : unit === "vw" ? width(toWindow(element)) : offsetDim ? element[`offset${ucfirst(property)}`] : dimensions$1(element)[property], 944 value2 945 ) : value2; 946 }); 947 } 948 const calcRe = /-?\d+(?:\.\d+)?(?:v[wh]|%|px)?/g; 949 const parseCalc = memoize((calc) => calc.toString().replace(/\s/g, "").match(calcRe) || []); 950 const unitRe$1 = /(?:v[hw]|%)$/; 951 const parseUnit = memoize((str) => (str.match(unitRe$1) || [])[0]); 952 function percent(base, value) { 953 return base * toFloat(value) / 100; 954 } 955 let vh; 956 let vhEl; 957 function getViewportHeight() { 958 if (vh) { 959 return vh; 960 } 961 if (!vhEl) { 962 vhEl = $("<div>"); 963 css(vhEl, { 964 height: "100vh", 965 position: "fixed" 966 }); 967 on(window, "resize", () => vh = null); 968 } 969 append(document.body, vhEl); 970 vh = vhEl.clientHeight; 971 remove$1(vhEl); 972 return vh; 973 } 974 975 const fastdom = { read, write, clear, flush }; 976 const reads = []; 977 const writes = []; 978 function read(task) { 979 reads.push(task); 980 scheduleFlush(); 981 return task; 982 } 983 function write(task) { 984 writes.push(task); 985 scheduleFlush(); 986 return task; 987 } 988 function clear(task) { 989 remove(reads, task); 990 remove(writes, task); 991 } 992 let scheduled = false; 993 function flush() { 994 runTasks(reads); 995 runTasks(writes.splice(0)); 996 scheduled = false; 997 if (reads.length || writes.length) { 998 scheduleFlush(); 999 } 1000 } 1001 function scheduleFlush() { 1002 if (!scheduled) { 1003 scheduled = true; 1004 queueMicrotask(flush); 1005 } 1006 } 1007 function runTasks(tasks) { 1008 let task; 1009 while (task = tasks.shift()) { 1010 try { 1011 task(); 1012 } catch (e) { 1013 console.error(e); 1014 } 1015 } 1016 } 1017 function remove(array, item) { 1018 const index = array.indexOf(item); 1019 return ~index && array.splice(index, 1); 1020 } 1021 1022 class MouseTracker { 1023 init() { 1024 this.positions = []; 1025 let position; 1026 this.unbind = on(document, "mousemove", (e) => position = getEventPos(e)); 1027 this.interval = setInterval(() => { 1028 if (!position) { 1029 return; 1030 } 1031 this.positions.push(position); 1032 if (this.positions.length > 5) { 1033 this.positions.shift(); 1034 } 1035 }, 50); 1036 } 1037 cancel() { 1038 var _a; 1039 (_a = this.unbind) == null ? void 0 : _a.call(this); 1040 clearInterval(this.interval); 1041 } 1042 movesTo(target) { 1043 if (!this.positions || this.positions.length < 2) { 1044 return false; 1045 } 1046 const p = dimensions$1(target); 1047 const { left, right, top, bottom } = p; 1048 const [prevPosition] = this.positions; 1049 const position = last(this.positions); 1050 const path = [prevPosition, position]; 1051 if (pointInRect(position, p)) { 1052 return false; 1053 } 1054 const diagonals = [ 1055 [ 1056 { x: left, y: top }, 1057 { x: right, y: bottom } 1058 ], 1059 [ 1060 { x: left, y: bottom }, 1061 { x: right, y: top } 1062 ] 1063 ]; 1064 return diagonals.some((diagonal) => { 1065 const intersection = intersect(path, diagonal); 1066 return intersection && pointInRect(intersection, p); 1067 }); 1068 } 1069 } 1070 function intersect([{ x: x1, y: y1 }, { x: x2, y: y2 }], [{ x: x3, y: y3 }, { x: x4, y: y4 }]) { 1071 const denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1); 1072 if (denominator === 0) { 1073 return false; 1074 } 1075 const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator; 1076 if (ua < 0) { 1077 return false; 1078 } 1079 return { x: x1 + ua * (x2 - x1), y: y1 + ua * (y2 - y1) }; 1080 } 1081 1082 function observeIntersection(targets, cb, options = {}, { intersecting = true } = {}) { 1083 const observer = new IntersectionObserver( 1084 intersecting ? (entries, observer2) => { 1085 if (entries.some((entry) => entry.isIntersecting)) { 1086 cb(entries, observer2); 1087 } 1088 } : cb, 1089 options 1090 ); 1091 for (const el of toNodes(targets)) { 1092 observer.observe(el); 1093 } 1094 return observer; 1095 } 1096 const hasResizeObserver = inBrowser && window.ResizeObserver; 1097 function observeResize(targets, cb, options = { box: "border-box" }) { 1098 if (hasResizeObserver) { 1099 return observe$1(ResizeObserver, targets, cb, options); 1100 } 1101 const off = [on(window, "load resize", cb), on(document, "loadedmetadata load", cb, true)]; 1102 return { disconnect: () => off.
vendor: 5,931 bytes, lines 1102-1271
1102map((cb2) => cb2()) }; 1103 } 1104 function observeViewportResize(cb) { 1105 return { disconnect: on([window, window.visualViewport], "resize", cb) }; 1106 } 1107 function observeMutation(targets, cb, options) { 1108 return observe$1(MutationObserver, targets, cb, options); 1109 } 1110 function observe$1(Observer, targets, cb, options) { 1111 const observer = new Observer(cb); 1112 for (const el of toNodes(targets)) { 1113 observer.observe(el, options); 1114 } 1115 return observer; 1116 } 1117 1118 function play(el) { 1119 if (isIFrame(el)) { 1120 call(el, { func: "playVideo", method: "play" }); 1121 } 1122 if (isHTML5(el)) { 1123 el.play().catch(noop); 1124 } 1125 } 1126 function pause(el) { 1127 if (isIFrame(el)) { 1128 call(el, { func: "pauseVideo", method: "pause" }); 1129 } 1130 if (isHTML5(el)) { 1131 el.pause(); 1132 } 1133 } 1134 function mute(el) { 1135 if (isIFrame(el)) { 1136 call(el, { func: "mute", method: "setVolume", value: 0 }); 1137 } 1138 if (isHTML5(el)) { 1139 el.muted = true; 1140 } 1141 } 1142 function isVideo(el) { 1143 return isHTML5(el) || isIFrame(el); 1144 } 1145 function isHTML5(el) { 1146 return isTag(el, "video"); 1147 } 1148 function isIFrame(el) { 1149 return isTag(el, "iframe") && (isYoutube(el) || isVimeo(el)); 1150 } 1151 function isYoutube(el) { 1152 return !!el.src.match( 1153 /\/\/.*?youtube(-nocookie)?\.[a-z]+\/(watch\?v=[^&\s]+|embed)|youtu\.be\/.*/ 1154 ); 1155 } 1156 function isVimeo(el) { 1157 return !!el.src.match(/vimeo\.com\/video\/.*/); 1158 } 1159 async function call(el, cmd) { 1160 await enableApi(el); 1161 post(el, cmd); 1162 } 1163 function post(el, cmd) { 1164 el.contentWindow.postMessage(JSON.stringify({ event: "command", ...cmd }), "*"); 1165 } 1166 const stateKey = "_ukPlayer"; 1167 let counter = 0; 1168 function enableApi(el) { 1169 if (el[stateKey]) { 1170 return el[stateKey]; 1171 } 1172 const youtube = isYoutube(el); 1173 const vimeo = isVimeo(el); 1174 const id = ++counter; 1175 let poller; 1176 return el[stateKey] = new Promise((resolve) => { 1177 youtube && once(el, "load", () => { 1178 const listener = () => post(el, { event: "listening", id }); 1179 poller = setInterval(listener, 100); 1180 listener(); 1181 }); 1182 once(window, "message", resolve, false, ({ data }) => { 1183 try { 1184 data = JSON.parse(data); 1185 return youtube && (data == null ? void 0 : data.id) === id && data.event === "onReady" || vimeo && Number(data == null ? void 0 : data.player_id) === id; 1186 } catch (e) { 1187 } 1188 }); 1189 el.src = `${el.src}${includes(el.src, "?") ? "&" : "?"}${youtube ? "enablejsapi=1" : `api=1&player_id=${id}`}`; 1190 }).then(() => clearInterval(poller)); 1191 } 1192 1193 function isInView(element, offsetTop = 0, offsetLeft = 0) { 1194 if (!isVisible(element)) { 1195 return false; 1196 } 1197 return intersectRect( 1198 ...overflowParents(element).map((parent2) => { 1199 const { top, left, bottom, right } = offsetViewport(parent2); 1200 return { 1201 top: top - offsetTop, 1202 left: left - offsetLeft, 1203 bottom: bottom + offsetTop, 1204 right: right + offsetLeft 1205 }; 1206 }).concat(offset(element)) 1207 ); 1208 } 1209 function scrollIntoView(element, { offset: offsetBy = 0 } = {}) { 1210 const parents2 = isVisible(element) ? scrollParents(element, false, ["hidden"]) : []; 1211 return parents2.reduce( 1212 (fn, scrollElement, i) => { 1213 const { scrollTop, scrollHeight, offsetHeight } = scrollElement; 1214 const viewport = offsetViewport(scrollElement); 1215 const maxScroll = scrollHeight - viewport.height; 1216 const { height: elHeight, top: elTop } = parents2[i - 1] ? offsetViewport(parents2[i - 1]) : offset(element); 1217 let top = Math.ceil(elTop - viewport.top - offsetBy + scrollTop); 1218 if (offsetBy > 0 && offsetHeight < elHeight + offsetBy) { 1219 top += offsetBy; 1220 } else { 1221 offsetBy = 0; 1222 } 1223 if (top > maxScroll) { 1224 offsetBy -= top - maxScroll; 1225 top = maxScroll; 1226 } else if (top < 0) { 1227 offsetBy -= top; 1228 top = 0; 1229 } 1230 return () => scrollTo(scrollElement, top - scrollTop, element, maxScroll).then(fn); 1231 }, 1232 () => Promise.resolve() 1233 )(); 1234 function scrollTo(element2, top, targetEl, maxScroll) { 1235 return new Promise((resolve) => { 1236 const scroll = element2.scrollTop; 1237 const duration = getDuration(Math.abs(top)); 1238 const start = Date.now(); 1239 const isScrollingElement = scrollingElement(element2) === element2; 1240 const targetTop = offset(targetEl).top + (isScrollingElement ? 0 : scroll); 1241 let prev = 0; 1242 let frames = 15; 1243 (function step() { 1244 const percent = ease(clamp((Date.now() - start) / duration)); 1245 let diff = 0; 1246 if (parents2[0] === element2 && scroll + top < maxScroll) { 1247 diff = offset(targetEl).top + (isScrollingElement ? 0 : element2.scrollTop) - targetTop - dimensions$1(getCoveringElement(targetEl)).height; 1248 } 1249 element2.scrollTop = scroll + (top + diff) * percent; 1250 if (percent === 1 && (prev === diff || !frames--)) { 1251 resolve(); 1252 } else { 1253 prev = diff; 1254 requestAnimationFrame(step); 1255 } 1256 })(); 1257 }); 1258 } 1259 function getDuration(dist) { 1260 return 40 * Math.pow(dist, 0.375); 1261 } 1262 function ease(k) { 1263 return 0.5 * (1 - Math.cos(Math.PI * k)); 1264 } 1265 } 1266 function scrolledOver(element, startOffset = 0, endOffset = 0) { 1267 if (!isVisible(element)) { 1268 return 0; 1269 } 1270 const scrollElement = scrollParent(element, true); 1271 const { scrollHeight, scrollTop } = scrollElement;
vendor: 12,194 bytes, lines 1272-1593
1272 const { height: viewportHeight } = offsetViewport(scrollElement); 1273 const maxScroll = scrollHeight - viewportHeight; 1274 const elementOffsetTop = offsetPosition(element)[0] - offsetPosition(scrollElement)[0]; 1275 const start = Math.max(0, elementOffsetTop - viewportHeight + startOffset); 1276 const end = Math.min(maxScroll, elementOffsetTop + element.offsetHeight - endOffset); 1277 return start < end ? clamp((scrollTop - start) / (end - start)) : 1; 1278 } 1279 function scrollParents(element, scrollable = false, props = []) { 1280 const scrollEl = scrollingElement(element); 1281 let ancestors = parents(element).reverse(); 1282 ancestors = ancestors.slice(ancestors.indexOf(scrollEl) + 1); 1283 const fixedIndex = findIndex(ancestors, (el) => css(el, "position") === "fixed"); 1284 if (~fixedIndex) { 1285 ancestors = ancestors.slice(fixedIndex); 1286 } 1287 return [scrollEl].concat( 1288 ancestors.filter( 1289 (parent2) => css(parent2, "overflow").split(" ").some((prop) => includes(["auto", "scroll", ...props], prop)) && (!scrollable || parent2.scrollHeight > offsetViewport(parent2).height) 1290 ) 1291 ).reverse(); 1292 } 1293 function scrollParent(...args) { 1294 return scrollParents(...args)[0]; 1295 } 1296 function overflowParents(element) { 1297 return scrollParents(element, false, ["hidden", "clip"]); 1298 } 1299 function offsetViewport(scrollElement) { 1300 const window = toWindow(scrollElement); 1301 const documentScrollingElement = scrollingElement(scrollElement); 1302 const useWindow = scrollElement.contains(documentScrollingElement); 1303 if (useWindow && window.visualViewport) { 1304 let { height, width, scale, pageTop: top, pageLeft: left } = window.visualViewport; 1305 height = Math.round(height * scale); 1306 width = Math.round(width * scale); 1307 return { height, width, top, left, bottom: top + height, right: left + width }; 1308 } 1309 let rect = offset(useWindow ? window : scrollElement); 1310 if (css(scrollElement, "display") === "inline") { 1311 return rect; 1312 } 1313 const { body, documentElement } = window.document; 1314 const viewportElement = useWindow ? documentScrollingElement === documentElement || // In quirks mode the scrolling element is body, even though the viewport is html 1315 documentScrollingElement.clientHeight < body.clientHeight ? documentScrollingElement : body : scrollElement; 1316 for (let [prop, dir, start, end] of [ 1317 ["width", "x", "left", "right"], 1318 ["height", "y", "top", "bottom"] 1319 ]) { 1320 const subpixel = rect[prop] % 1; 1321 rect[start] += toFloat(css(viewportElement, `border-${start}-width`)); 1322 rect[prop] = rect[dir] = viewportElement[`client${ucfirst(prop)}`] - (subpixel ? subpixel < 0.5 ? -subpixel : 1 - subpixel : 0); 1323 rect[end] = rect[prop] + rect[start]; 1324 } 1325 return rect; 1326 } 1327 function getCoveringElement(target) { 1328 const { left, width, top } = dimensions$1(target); 1329 for (const position of top ? [0, top] : [0]) { 1330 let coverEl; 1331 for (const el of toWindow(target).document.elementsFromPoint(left + width / 2, position)) { 1332 if (!el.contains(target) && // If e.g. Offcanvas is not yet closed 1333 !hasClass(el, "bdt-togglable-leave") && (hasPosition(el, "fixed") && zIndex( 1334 parents(target).reverse().find( 1335 (parent2) => !parent2.contains(el) && !hasPosition(parent2, "static") 1336 ) 1337 ) < zIndex(el) || hasPosition(el, "sticky") && parent(el).contains(target)) && (!coverEl || dimensions$1(coverEl).height < dimensions$1(el).height)) { 1338 coverEl = el; 1339 } 1340 } 1341 if (coverEl) { 1342 return coverEl; 1343 } 1344 } 1345 } 1346 function zIndex(element) { 1347 return toFloat(css(element, "zIndex")); 1348 } 1349 function hasPosition(element, position) { 1350 return css(element, "position") === position; 1351 } 1352 function scrollingElement(element) { 1353 return toWindow(element).document.scrollingElement; 1354 } 1355 1356 const dirs = [ 1357 ["width", "x", "left", "right"], 1358 ["height", "y", "top", "bottom"] 1359 ]; 1360 function positionAt(element, target, options) { 1361 options = { 1362 attach: { 1363 element: ["left", "top"], 1364 target: ["left", "top"], 1365 ...options.attach 1366 }, 1367 offset: [0, 0], 1368 placement: [], 1369 ...options 1370 }; 1371 if (!isArray(target)) { 1372 target = [target, target]; 1373 } 1374 offset(element, getPosition(element, target, options)); 1375 } 1376 function getPosition(element, target, options) { 1377 const position = attachTo(element, target, options); 1378 const { boundary, viewportOffset = 0, placement } = options; 1379 let offsetPosition = position; 1380 for (const [i, [prop, , start, end]] of Object.entries(dirs)) { 1381 const viewport = getViewport$2(element, target[i], viewportOffset, boundary, i); 1382 if (isWithin(position, viewport, i)) { 1383 continue; 1384 } 1385 let offsetBy = 0; 1386 if (placement[i] === "flip") { 1387 const attach = options.attach.target[i]; 1388 if (attach === end && position[end] <= viewport[end] || attach === start && position[start] >= viewport[start]) { 1389 continue; 1390 } 1391 offsetBy = flip(element, target, options, i)[start] - position[start]; 1392 const scrollArea = getScrollArea(element, target[i], viewportOffset, i); 1393 if (!isWithin(applyOffset(position, offsetBy, i), scrollArea, i)) { 1394 if (isWithin(position, scrollArea, i)) { 1395 continue; 1396 } 1397 if (options.recursion) { 1398 return false; 1399 } 1400 const newPos = flipAxis(element, target, options); 1401 if (newPos && isWithin(newPos, scrollArea, 1 - i)) { 1402 return newPos; 1403 } 1404 continue; 1405 } 1406 } else if (placement[i] === "shift") { 1407 const targetDim = offset(target[i]); 1408 const { offset: elOffset } = options; 1409 offsetBy = clamp( 1410 clamp(position[start], viewport[start], viewport[end] - position[prop]), 1411 targetDim[start] - position[prop] + elOffset[i], 1412 targetDim[end] - elOffset[i] 1413 ) - position[start]; 1414 } 1415 offsetPosition = applyOffset(offsetPosition, offsetBy, i); 1416 } 1417 return offsetPosition; 1418 } 1419 function attachTo(element, target, options) { 1420 let { attach, offset: offsetBy } = { 1421 attach: { 1422 element: ["left", "top"], 1423 target: ["left", "top"], 1424 ...options.attach 1425 }, 1426 offset: [0, 0], 1427 ...options 1428 }; 1429 let elOffset = offset(element); 1430 for (const [i, [prop, , start, end]] of Object.entries(dirs)) { 1431 const targetOffset = attach.target[i] === attach.element[i] ? offsetViewport(target[i]) : offset(target[i]); 1432 elOffset = applyOffset( 1433 elOffset, 1434 targetOffset[start] - elOffset[start] + moveBy(attach.target[i], end, targetOffset[prop]) - moveBy(attach.element[i], end, elOffset[prop]) + +offsetBy[i], 1435 i 1436 ); 1437 } 1438 return elOffset; 1439 } 1440 function applyOffset(position, offset2, i) { 1441 const [, dir, start, end] = dirs[i]; 1442 const newPos = { ...position }; 1443 newPos[start] = position[dir] = position[start] + offset2; 1444 newPos[end] += offset2; 1445 return newPos; 1446 } 1447 function moveBy(attach, end, dim) { 1448 return attach === "center" ? dim / 2 : attach === end ? dim : 0; 1449 } 1450 function getViewport$2(element, target, viewportOffset, boundary, i) { 1451 let viewport = getIntersectionArea(...commonScrollParents(element, target).map(offsetViewport)); 1452 if (viewportOffset) { 1453 viewport[dirs[i][2]] += viewportOffset; 1454 viewport[dirs[i][3]] -= viewportOffset; 1455 } 1456 if (boundary) { 1457 viewport = getIntersectionArea( 1458 viewport, 1459 offset(isArray(boundary) ? boundary[i] : boundary) 1460 ); 1461 } 1462 return viewport; 1463 } 1464 function getScrollArea(element, target, viewportOffset, i) { 1465 const [prop, axis, start, end] = dirs[i]; 1466 const [scrollElement] = commonScrollParents(element, target); 1467 const viewport = offsetViewport(scrollElement); 1468 if (["auto", "scroll"].includes(css(scrollElement, `overflow-${axis}`))) { 1469 viewport[start] -= scrollElement[`scroll${ucfirst(start)}`]; 1470 viewport[end] = viewport[start] + scrollElement[`scroll${ucfirst(prop)}`]; 1471 } 1472 viewport[start] += viewportOffset; 1473 viewport[end] -= viewportOffset; 1474 return viewport; 1475 } 1476 function commonScrollParents(element, target) { 1477 return overflowParents(target).filter((parent) => parent.contains(element)); 1478 } 1479 function getIntersectionArea(...rects) { 1480 let area = {}; 1481 for (const rect of rects) { 1482 for (const [, , start, end] of dirs) { 1483 area[start] = Math.max(area[start] || 0, rect[start]); 1484 area[end] = Math.min(...[area[end], rect[end]].filter(Boolean)); 1485 } 1486 } 1487 return area; 1488 } 1489 function isWithin(positionA, positionB, i) { 1490 const [, , start, end] = dirs[i]; 1491 return positionA[start] >= positionB[start] && positionA[end] <= positionB[end]; 1492 } 1493 function flip(element, target, { offset: offset2, attach }, i) { 1494 return attachTo(element, target, { 1495 attach: { 1496 element: flipAttach(attach.element, i), 1497 target: flipAttach(attach.target, i) 1498 }, 1499 offset: flipOffset(offset2, i) 1500 }); 1501 } 1502 function flipAxis(element, target, options) { 1503 return getPosition(element, target, { 1504 ...options, 1505 attach: { 1506 element: options.attach.element.map(flipAttachAxis).reverse(), 1507 target: options.attach.target.map(flipAttachAxis).reverse() 1508 }, 1509 offset: options.offset.reverse(), 1510 placement: options.placement.reverse(), 1511 recursion: true 1512 }); 1513 } 1514 function flipAttach(attach, i) { 1515 const newAttach = [...attach]; 1516 const index = dirs[i].indexOf(attach[i]); 1517 if (~index) { 1518 newAttach[i] = dirs[i][1 - index % 2 + 2]; 1519 } 1520 return newAttach; 1521 } 1522 function flipAttachAxis(prop) { 1523 for (let i = 0; i < dirs.length; i++) { 1524 const index = dirs[i].indexOf(prop); 1525 if (~index) { 1526 return dirs[1 - i][index % 2 + 2]; 1527 } 1528 } 1529 } 1530 function flipOffset(offset2, i) { 1531 offset2 = [...offset2]; 1532 offset2[i] *= -1; 1533 return offset2; 1534 } 1535 1536 var util = /*#__PURE__*/Object.freeze({ 1537 __proto__: null, 1538 $: $, 1539 $$: $$, 1540 Animation: Animation, 1541 Dimensions: Dimensions, 1542 MouseTracker: MouseTracker, 1543 Transition: Transition, 1544 addClass: addClass, 1545 after: after, 1546 append: append, 1547 apply: apply, 1548 assign: assign, 1549 attr: attr, 1550 before: before, 1551 boxModelAdjust: boxModelAdjust, 1552 camelize: camelize, 1553 children: children, 1554 clamp: clamp, 1555 createEvent: createEvent, 1556 css: css, 1557 data: data, 1558 dimensions: dimensions$1, 1559 each: each, 1560 empty: empty, 1561 endsWith: endsWith, 1562 escape: escape, 1563 fastdom: fastdom, 1564 filter: filter$1, 1565 find: find, 1566 findAll: findAll, 1567 findIndex: findIndex, 1568 flipPosition: flipPosition, 1569 fragment: fragment, 1570 getCoveringElement: getCoveringElement, 1571 getEventPos: getEventPos, 1572 getIndex: getIndex, 1573 getTargetedElement: getTargetedElement, 1574 hasAttr: hasAttr, 1575 hasClass: hasClass, 1576 hasOwn: hasOwn, 1577 hasTouch: hasTouch, 1578 height: height, 1579 html: html, 1580 hyphenate: hyphenate, 1581 inBrowser: inBrowser, 1582 includes: includes, 1583 index: index, 1584 intersectRect: intersectRect, 1585 isArray: isArray, 1586 isBoolean: isBoolean, 1587 isDocument: isDocument, 1588 isElement: isElement, 1589 isEmpty: isEmpty, 1590 isEqual: isEqual, 1591 isFocusable: isFocusable, 1592 isFunction: isFunction, 1593 isInView: isInView,
vendor: 16,488 bytes, lines 1594-2121
1594 isInput: isInput, 1595 isNode: isNode, 1596 isNumber: isNumber, 1597 isNumeric: isNumeric, 1598 isObject: isObject, 1599 isPlainObject: isPlainObject, 1600 isRtl: isRtl, 1601 isSameSiteAnchor: isSameSiteAnchor, 1602 isString: isString, 1603 isTag: isTag, 1604 isTouch: isTouch, 1605 isUndefined: isUndefined, 1606 isVideo: isVideo, 1607 isVisible: isVisible, 1608 isVoidElement: isVoidElement, 1609 isWindow: isWindow, 1610 last: last, 1611 matches: matches, 1612 memoize: memoize, 1613 mute: mute, 1614 noop: noop, 1615 observeIntersection: observeIntersection, 1616 observeMutation: observeMutation, 1617 observeResize: observeResize, 1618 observeViewportResize: observeViewportResize, 1619 off: off, 1620 offset: offset, 1621 offsetPosition: offsetPosition, 1622 offsetViewport: offsetViewport, 1623 on: on, 1624 once: once, 1625 overflowParents: overflowParents, 1626 parent: parent, 1627 parents: parents, 1628 pause: pause, 1629 pick: pick, 1630 play: play, 1631 pointInRect: pointInRect, 1632 pointerCancel: pointerCancel, 1633 pointerDown: pointerDown$1, 1634 pointerEnter: pointerEnter, 1635 pointerLeave: pointerLeave, 1636 pointerMove: pointerMove$1, 1637 pointerUp: pointerUp$1, 1638 position: position, 1639 positionAt: positionAt, 1640 prepend: prepend, 1641 propName: propName, 1642 query: query, 1643 queryAll: queryAll, 1644 ready: ready, 1645 remove: remove$1, 1646 removeAttr: removeAttr, 1647 removeClass: removeClass, 1648 replaceClass: replaceClass, 1649 scrollIntoView: scrollIntoView, 1650 scrollParent: scrollParent, 1651 scrollParents: scrollParents, 1652 scrolledOver: scrolledOver, 1653 selFocusable: selFocusable, 1654 selInput: selInput, 1655 sortBy: sortBy, 1656 startsWith: startsWith, 1657 sumBy: sumBy, 1658 swap: swap, 1659 toArray: toArray, 1660 toBoolean: toBoolean, 1661 toEventTargets: toEventTargets, 1662 toFloat: toFloat, 1663 toNode: toNode, 1664 toNodes: toNodes, 1665 toNumber: toNumber, 1666 toPx: toPx, 1667 toWindow: toWindow, 1668 toggleClass: toggleClass, 1669 trigger: trigger, 1670 ucfirst: ucfirst, 1671 uniqueBy: uniqueBy, 1672 unwrap: unwrap, 1673 width: width, 1674 wrapAll: wrapAll, 1675 wrapInner: wrapInner 1676 }); 1677 1678 var Class = { 1679 connected() { 1680 addClass(this.$el, this.$options.id); 1681 } 1682 }; 1683 1684 const units = ["days", "hours", "minutes", "seconds"]; 1685 var countdown = { 1686 mixins: [Class], 1687 props: { 1688 date: String, 1689 clsWrapper: String, 1690 role: String 1691 }, 1692 data: { 1693 date: "", 1694 clsWrapper: ".bdt-countdown-%unit%", 1695 role: "timer" 1696 }, 1697 connected() { 1698 attr(this.$el, "role", this.role); 1699 this.date = toFloat(Date.parse(this.$props.date)); 1700 this.end = false; 1701 this.start(); 1702 }, 1703 disconnected() { 1704 this.stop(); 1705 }, 1706 events: { 1707 name: "visibilitychange", 1708 el: () => document, 1709 handler() { 1710 if (document.hidden) { 1711 this.stop(); 1712 } else { 1713 this.start(); 1714 } 1715 } 1716 }, 1717 methods: { 1718 start() { 1719 this.stop(); 1720 this.update(); 1721 if (!this.timer) { 1722 trigger(this.$el, "countdownstart"); 1723 this.timer = setInterval(this.update, 1e3); 1724 } 1725 }, 1726 stop() { 1727 if (this.timer) { 1728 clearInterval(this.timer); 1729 trigger(this.$el, "countdownstop"); 1730 this.timer = null; 1731 } 1732 }, 1733 update() { 1734 const timespan = getTimeSpan(this.date); 1735 if (!timespan.total) { 1736 this.stop(); 1737 if (!this.end) { 1738 trigger(this.$el, "countdownend"); 1739 this.end = true; 1740 } 1741 } 1742 for (const unit of units) { 1743 const el = $(this.clsWrapper.replace("%unit%", unit), this.$el); 1744 if (!el) { 1745 continue; 1746 } 1747 let digits = Math.trunc(timespan[unit]).toString().padStart(2, "0"); 1748 if (el.textContent !== digits) { 1749 digits = digits.split(""); 1750 if (digits.length !== el.children.length) { 1751 html(el, digits.map(() => "<span></span>").join("")); 1752 } 1753 digits.forEach((digit, i) => el.children[i].textContent = digit); 1754 } 1755 } 1756 } 1757 } 1758 }; 1759 function getTimeSpan(date) { 1760 const total = Math.max(0, date - Date.now()) / 1e3; 1761 return { 1762 total, 1763 seconds: total % 60, 1764 minutes: total / 60 % 60, 1765 hours: total / 60 / 60 % 24, 1766 days: total / 60 / 60 / 24 1767 }; 1768 } 1769 1770 const strats = {}; 1771 strats.events = strats.watch = strats.observe = strats.created = strats.beforeConnect = strats.connected = strats.beforeDisconnect = strats.disconnected = strats.destroy = concatStrat; 1772 strats.args = function(parentVal, childVal) { 1773 return childVal !== false && concatStrat(childVal || parentVal); 1774 }; 1775 strats.update = function(parentVal, childVal) { 1776 return sortBy( 1777 concatStrat(parentVal, isFunction(childVal) ? { read: childVal } : childVal), 1778 "order" 1779 ); 1780 }; 1781 strats.props = function(parentVal, childVal) { 1782 if (isArray(childVal)) { 1783 const value = {}; 1784 for (const key of childVal) { 1785 value[key] = String; 1786 } 1787 childVal = value; 1788 } 1789 return strats.methods(parentVal, childVal); 1790 }; 1791 strats.computed = strats.methods = function(parentVal, childVal) { 1792 return childVal ? parentVal ? { ...parentVal, ...childVal } : childVal : parentVal; 1793 }; 1794 strats.i18n = strats.data = function(parentVal, childVal, vm) { 1795 if (!vm) { 1796 if (!childVal) { 1797 return parentVal; 1798 } 1799 if (!parentVal) { 1800 return childVal; 1801 } 1802 return function(vm2) { 1803 return mergeFnData(parentVal, childVal, vm2); 1804 }; 1805 } 1806 return mergeFnData(parentVal, childVal, vm); 1807 }; 1808 function mergeFnData(parentVal, childVal, vm) { 1809 return strats.computed( 1810 isFunction(parentVal) ? parentVal.call(vm, vm) : parentVal, 1811 isFunction(childVal) ? childVal.call(vm, vm) : childVal 1812 ); 1813 } 1814 function concatStrat(parentVal, childVal) { 1815 parentVal = parentVal && !isArray(parentVal) ? [parentVal] : parentVal; 1816 return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal; 1817 } 1818 function defaultStrat(parentVal, childVal) { 1819 return isUndefined(childVal) ? parentVal : childVal; 1820 } 1821 function mergeOptions(parent, child, vm) { 1822 const options = {}; 1823 if (isFunction(child)) { 1824 child = child.options; 1825 } 1826 if (child.extends) { 1827 parent = mergeOptions(parent, child.extends, vm); 1828 } 1829 if (child.mixins) { 1830 for (const mixin of child.mixins) { 1831 parent = mergeOptions(parent, mixin, vm); 1832 } 1833 } 1834 for (const key in parent) { 1835 mergeKey(key); 1836 } 1837 for (const key in child) { 1838 if (!hasOwn(parent, key)) { 1839 mergeKey(key); 1840 } 1841 } 1842 function mergeKey(key) { 1843 options[key] = (strats[key] || defaultStrat)(parent[key], child[key], vm); 1844 } 1845 return options; 1846 } 1847 function parseOptions(options, args = []) { 1848 try { 1849 return options ? startsWith(options, "{") ? JSON.parse(options) : args.length && !includes(options, ":") ? { [args[0]]: options } : options.split(";").reduce((options2, option) => { 1850 const [key, value] = option.split(/:(.*)/); 1851 if (key && !isUndefined(value)) { 1852 options2[key.trim()] = value.trim(); 1853 } 1854 return options2; 1855 }, {}) : {}; 1856 } catch (e) { 1857 return {}; 1858 } 1859 } 1860 function coerce$1(type, value) { 1861 if (type === Boolean) { 1862 return toBoolean(value); 1863 } else if (type === Number) { 1864 return toNumber(value); 1865 } else if (type === "list") { 1866 return toList(value); 1867 } else if (type === Object && isString(value)) { 1868 return parseOptions(value); 1869 } 1870 return type ? type(value) : value; 1871 } 1872 const listRe = /,(?![^(]*\))/; 1873 function toList(value) { 1874 return isArray(value) ? value : isString(value) ? value.split(listRe).map((value2) => isNumeric(value2) ? toNumber(value2) : toBoolean(value2.trim())) : [value]; 1875 } 1876 1877 function initUpdates(instance) { 1878 instance._data = {}; 1879 instance._updates = [...instance.$options.update || []]; 1880 } 1881 function prependUpdate(instance, update) { 1882 instance._updates.unshift(update); 1883 } 1884 function clearUpdateData(instance) { 1885 instance._data = null; 1886 } 1887 function callUpdate(instance, e = "update") { 1888 if (!instance._connected) { 1889 return; 1890 } 1891 if (!instance._updates.length) { 1892 return; 1893 } 1894 if (!instance._queued) { 1895 instance._queued = /* @__PURE__ */ new Set(); 1896 fastdom.read(() => { 1897 if (instance._connected) { 1898 runUpdates(instance, instance._queued); 1899 } 1900 instance._queued = null; 1901 }); 1902 } 1903 instance._queued.add(e.type || e); 1904 } 1905 function runUpdates(instance, types) { 1906 for (const { read, write, events = [] } of instance._updates) { 1907 if (!types.has("update") && !events.some((type) => types.has(type))) { 1908 continue; 1909 } 1910 let result; 1911 if (read) { 1912 result = read.call(instance, instance._data, types); 1913 if (result && isPlainObject(result)) { 1914 assign(instance._data, result); 1915 } 1916 } 1917 if (write && result !== false) { 1918 fastdom.write(() => { 1919 if (instance._connected) { 1920 write.call(instance, instance._data, types); 1921 } 1922 }); 1923 } 1924 } 1925 } 1926 1927 function resize(options) { 1928 return observe(observeResize, options, "resize"); 1929 } 1930 function intersection(options) { 1931 return observe(observeIntersection, options); 1932 } 1933 function mutation(options) { 1934 return observe(observeMutation, options); 1935 } 1936 function lazyload(options = {}) { 1937 return intersection({ 1938 handler: function(entries, observer) { 1939 const { targets = this.$el, preload = 5 } = options; 1940 for (const el of toNodes(isFunction(targets) ? targets(this) : targets)) { 1941 $$('[loading="lazy"]', el).slice(0, preload - 1).forEach((el2) => removeAttr(el2, "loading")); 1942 } 1943 for (const el of entries.filter(({ isIntersecting }) => isIntersecting).map(({ target }) => target)) { 1944 observer.unobserve(el); 1945 } 1946 }, 1947 ...options 1948 }); 1949 } 1950 function viewport(options) { 1951 return observe((target, handler) => observeViewportResize(handler), options, "resize"); 1952 } 1953 function scroll$1(options) { 1954 return observe( 1955 (target, handler) => ({ 1956 disconnect: on(toScrollTargets(target), "scroll", handler, { passive: true }) 1957 }), 1958 options, 1959 "scroll" 1960 ); 1961 } 1962 function swipe(options) { 1963 return { 1964 observe(target, handler) { 1965 return { 1966 observe: noop, 1967 unobserve: noop, 1968 disconnect: on(target, pointerDown$1, handler, { passive: true }) 1969 }; 1970 }, 1971 handler(e) { 1972 if (!isTouch(e)) { 1973 return; 1974 } 1975 const pos = getEventPos(e); 1976 const target = "tagName" in e.target ? e.target : parent(e.target); 1977 once(document, `${pointerUp$1} ${pointerCancel} scroll`, (e2) => { 1978 const { x, y } = getEventPos(e2); 1979 if (e2.type !== "scroll" && target && x && Math.abs(pos.x - x) > 100 || y && Math.abs(pos.y - y) > 100) { 1980 setTimeout(() => { 1981 trigger(target, "swipe"); 1982 trigger(target, `swipe${swipeDirection(pos.x, pos.y, x, y)}`); 1983 }); 1984 } 1985 }); 1986 }, 1987 ...options 1988 }; 1989 } 1990 function observe(observe2, options, emit) { 1991 return { 1992 observe: observe2, 1993 handler() { 1994 callUpdate(this, emit); 1995 }, 1996 ...options 1997 }; 1998 } 1999 function swipeDirection(x1, y1, x2, y2) { 2000 return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? x1 - x2 > 0 ? "Left" : "Right" : y1 - y2 > 0 ? "Up" : "Down"; 2001 } 2002 function toScrollTargets(elements) { 2003 return toNodes(elements).map((node) => { 2004 const { ownerDocument } = node; 2005 const parent2 = scrollParent(node, true); 2006 return parent2 === ownerDocument.scrollingElement ? ownerDocument : parent2; 2007 }); 2008 } 2009 2010 var Margin = { 2011 props: { 2012 margin: String, 2013 firstColumn: Boolean 2014 }, 2015 data: { 2016 margin: "bdt-margin-small-top", 2017 firstColumn: "bdt-first-column" 2018 }, 2019 observe: [ 2020 mutation({ 2021 options: { 2022 childList: true 2023 } 2024 }), 2025 mutation({ 2026 options: { 2027 attributes: true, 2028 attributeFilter: ["style"] 2029 }, 2030 target: ({ $el }) => [$el, ...children($el)] 2031 }), 2032 resize({ 2033 target: ({ $el }) => [$el, ...children($el)] 2034 }) 2035 ], 2036 update: { 2037 read() { 2038 return { 2039 rows: getRows(children(this.$el)) 2040 }; 2041 }, 2042 write({ rows }) { 2043 for (const row of rows) { 2044 for (const el of row) { 2045 toggleClass(el, this.margin, rows[0] !== row); 2046 toggleClass(el, this.firstColumn, row[isRtl ? row.length - 1 : 0] === el); 2047 } 2048 } 2049 }, 2050 events: ["resize"] 2051 } 2052 }; 2053 function getRows(elements) { 2054 const sorted = [[]]; 2055 const withOffset = elements.some( 2056 (el, i) => i && elements[i - 1].offsetParent !== el.offsetParent 2057 ); 2058 for (const el of elements) { 2059 if (!isVisible(el)) { 2060 continue; 2061 } 2062 const offset = getOffset(el, withOffset); 2063 for (let i = sorted.length - 1; i >= 0; i--) { 2064 const current = sorted[i]; 2065 if (!current[0]) { 2066 current.push(el); 2067 break; 2068 } 2069 const offsetCurrent = getOffset(current[0], withOffset); 2070 if (offset.top >= offsetCurrent.bottom - 1 && offset.top !== offsetCurrent.top) { 2071 sorted.push([el]); 2072 break; 2073 } 2074 if (offset.bottom - 1 > offsetCurrent.top || offset.top === offsetCurrent.top) { 2075 let j = current.length - 1; 2076 for (; j >= 0; j--) { 2077 const offsetCurrent2 = getOffset(current[j], withOffset); 2078 if (offset.left >= offsetCurrent2.left) { 2079 break; 2080 } 2081 } 2082 current.splice(j + 1, 0, el); 2083 break; 2084 } 2085 if (i === 0) { 2086 sorted.unshift([el]); 2087 break; 2088 } 2089 } 2090 } 2091 return sorted; 2092 } 2093 function getOffset(element, offset = false) { 2094 let { offsetTop, offsetLeft, offsetHeight, offsetWidth } = element; 2095 if (offset) { 2096 [offsetTop, offsetLeft] = offsetPosition(element); 2097 } 2098 return { 2099 top: offsetTop, 2100 left: offsetLeft, 2101 bottom: offsetTop + offsetHeight, 2102 right: offsetLeft + offsetWidth 2103 }; 2104 } 2105 2106 async function slide(action, target, duration) { 2107 await awaitFrame(); 2108 let nodes = children(target); 2109 const currentProps = nodes.map((el) => getProps$1(el, true)); 2110 const targetProps = { ...css(target, ["height", "padding"]), display: "block" }; 2111 const targets = nodes.concat(target); 2112 await Promise.all(targets.map(Transition.cancel)); 2113 css(targets, "transitionProperty", "none"); 2114 await action(); 2115 nodes = nodes.concat(children(target).filter((el) => !includes(nodes, el))); 2116 await Promise.resolve(); 2117 css(targets, "transitionProperty", ""); 2118 const targetStyle = attr(target, "style"); 2119 const targetPropsTo = css(target, ["height", "padding"]); 2120 const [propsTo, propsFrom] = getTransitionProps(target, nodes, currentProps); 2121 const attrsTo = nodes.map((el) => ({ style: attr(el, "style") }));
2122 nodes.forEach((el, i) => propsFrom[i] && css(el, propsFrom[i])); 2123 css(target, targetProps); 2124 trigger(target, "scroll"); 2125 await awaitFrame(); 2126 const transitions = nodes.map((el, i) => parent(el) === target && Transition.start(el, propsTo[i], duration, "ease")).concat(Transition.start(target, targetPropsTo, duration, "ease")); 2127 try { 2128 await Promise.all(transitions); 2129 nodes.forEach((el, i) => { 2130 attr(el, attrsTo[i]); 2131 if (parent(el) === target) { 2132 css(el, "display", propsTo[i].opacity === 0 ? "none" : ""); 2133 } 2134 }); 2135 attr(target, "style", targetStyle); 2136 } catch (e) { 2137 attr(nodes, "style", ""); 2138 resetProps(target, targetProps); 2139 } 2140 } 2141 function getProps$1(el, opacity) { 2142 const zIndex = css(el, "zIndex"); 2143 return isVisible(el) ? { 2144 display: "", 2145 opacity: opacity ? css(el, "opacity") : "0", 2146 pointerEvents: "none", 2147 position: "absolute", 2148 zIndex: zIndex === "auto" ? index(el) : zIndex, 2149 ...getPositionWithMargin(el) 2150 } : false; 2151 } 2152 function getTransitionProps(target, nodes, currentProps) { 2153 const propsTo = nodes.map( 2154 (el, i) => parent(el) && i in currentProps ? currentProps[i] ? isVisible(el) ? getPositionWithMargin(el) : { opacity: 0 } : { opacity: isVisible(el) ? 1 : 0 } : false 2155 ); 2156 const propsFrom = propsTo.map((props, i) => { 2157 const from = parent(nodes[i]) === target && (currentProps[i] || getProps$1(nodes[i])); 2158 if (!from) { 2159 return false; 2160 } 2161 if (!props) { 2162 delete from.opacity; 2163 } else if (!("opacity" in props)) { 2164 const { opacity } = from; 2165 if (opacity % 1) { 2166 props.opacity = 1; 2167 } else { 2168 delete from.opacity; 2169 } 2170 } 2171 return from; 2172 }); 2173 return [propsTo, propsFrom]; 2174 } 2175 function resetProps(el, props) { 2176 for (const prop in props) { 2177 css(el, prop, ""); 2178 } 2179 } 2180 function getPositionWithMargin(el) { 2181 const { height, width } = dimensions$1(el); 2182 return { 2183 height, 2184 width, 2185 transform: "", 2186 ...position(el), 2187 ...css(el, ["marginTop", "marginLeft"]) 2188 }; 2189 } 2190 function awaitFrame() { 2191 return new Promise((resolve) => requestAnimationFrame(resolve)); 2192 } 2193 2194 const clsLeave = "bdt-transition-leave"; 2195 const clsEnter = "bdt-transition-enter"; 2196 function fade(action, target, duration, stagger = 0) { 2197 const index = transitionIndex(target, true); 2198 const propsIn = { opacity: 1 }; 2199 const propsOut = { opacity: 0 }; 2200 const wrapIndexFn = (fn) => () => index === transitionIndex(target) ? fn() : Promise.reject(); 2201 const leaveFn = wrapIndexFn(async () => { 2202 addClass(target, clsLeave); 2203 await Promise.all( 2204 getTransitionNodes(target).map( 2205 (child, i) => new Promise( 2206 (resolve) => setTimeout( 2207 () => Transition.start(child, propsOut, duration / 2, "ease").then( 2208 resolve 2209 ), 2210 i * stagger 2211 ) 2212 ) 2213 ) 2214 ); 2215 removeClass(target, clsLeave); 2216 }); 2217 const enterFn = wrapIndexFn(async () => { 2218 const oldHeight = height(target); 2219 addClass(target, clsEnter); 2220 action(); 2221 css(children(target), { opacity: 0 }); 2222 await awaitFrame(); 2223 const nodes = children(target); 2224 const newHeight = height(target); 2225 css(target, "alignContent", "flex-start"); 2226 height(target, oldHeight); 2227 const transitionNodes = getTransitionNodes(target); 2228 css(nodes, propsOut); 2229 const transitions = transitionNodes.map(async (child, i) => { 2230 await awaitTimeout(i * stagger); 2231 await Transition.start(child, propsIn, duration / 2, "ease"); 2232 }); 2233 if (oldHeight !== newHeight) { 2234 transitions.push( 2235 Transition.start( 2236 target, 2237 { height: newHeight }, 2238 duration / 2 + transitionNodes.length * stagger, 2239 "ease" 2240 ) 2241 ); 2242 } 2243 await Promise.all(transitions).then(() => { 2244 removeClass(target, clsEnter); 2245 if (index === transitionIndex(target)) { 2246 css(target, { height: "", alignContent: "" }); 2247 css(nodes, { opacity: "" }); 2248 delete target.dataset.transition; 2249 } 2250 }); 2251 }); 2252 return hasClass(target, clsLeave) ? waitTransitionend(target).then(enterFn) : hasClass(target, clsEnter) ? waitTransitionend(target).then(leaveFn).then(enterFn) : leaveFn().then(enterFn); 2253 } 2254 function transitionIndex(target, next) { 2255 if (next) { 2256 target.dataset.transition = 1 + transitionIndex(target); 2257 } 2258 return toNumber(target.dataset.transition) || 0; 2259 } 2260 function waitTransitionend(target) { 2261 return Promise.all( 2262 children(target).filter(Transition.inProgress).map( 2263 (el) => new Promise((resolve) => once(el, "transitionend transitioncanceled", resolve)) 2264 ) 2265 ); 2266 } 2267 function getTransitionNodes(target) { 2268 return getRows(children(target)).flat().filter(isVisible); 2269 } 2270 function awaitTimeout(timeout) { 2271 return new Promise((resolve) => setTimeout(resolve, timeout)); 2272 } 2273 2274 var Animate = { 2275 props: { 2276 duration: Number, 2277 animation: Boolean 2278 }, 2279 data: { 2280 duration: 150, 2281 animation: "slide" 2282 }, 2283 methods: { 2284 animate(action, target = this.$el) { 2285 const name = this.animation; 2286 const animationFn = name === "fade" ? fade : name === "delayed-fade" ? (...args) => fade(...args, 40) : name ? slide : () => { 2287 action(); 2288 return Promise.resolve(); 2289 }; 2290 return animationFn(action, target, this.duration).catch(noop); 2291 } 2292 } 2293 }; 2294
vendor: 11,193 bytes, lines 2295-2633
2295 const keyMap = { 2296 TAB: 9, 2297 ESC: 27, 2298 SPACE: 32, 2299 END: 35, 2300 HOME: 36, 2301 LEFT: 37, 2302 UP: 38, 2303 RIGHT: 39, 2304 DOWN: 40 2305 }; 2306 2307 var filter = { 2308 mixins: [Animate], 2309 args: "target", 2310 props: { 2311 target: String, 2312 selActive: Boolean 2313 }, 2314 data: { 2315 target: "", 2316 selActive: false, 2317 attrItem: "bdt-filter-control", 2318 cls: "bdt-active", 2319 duration: 250 2320 }, 2321 computed: { 2322 children: ({ target }, $el) => $$(`${target} > *`, $el), 2323 toggles: ({ attrItem }, $el) => $$(`[${attrItem}],[data-${attrItem}]`, $el) 2324 }, 2325 watch: { 2326 toggles(toggles) { 2327 this.updateState(); 2328 const actives = $$(this.selActive, this.$el); 2329 for (const toggle of toggles) { 2330 if (this.selActive !== false) { 2331 toggleClass(toggle, this.cls, includes(actives, toggle)); 2332 } 2333 const button = findButton(toggle); 2334 if (isTag(button, "a")) { 2335 attr(button, "role", "button"); 2336 } 2337 } 2338 }, 2339 children(list, prev) { 2340 if (prev) { 2341 this.updateState(); 2342 } 2343 } 2344 }, 2345 events: { 2346 name: "click keydown", 2347 delegate: ({ attrItem }) => `[${attrItem}],[data-${attrItem}]`, 2348 handler(e) { 2349 if (e.type === "keydown" && e.keyCode !== keyMap.SPACE) { 2350 return; 2351 } 2352 if (e.target.closest("a,button")) { 2353 e.preventDefault(); 2354 this.apply(e.current); 2355 } 2356 } 2357 }, 2358 methods: { 2359 apply(el) { 2360 const prevState = this.getState(); 2361 const newState = mergeState(el, this.attrItem, this.getState()); 2362 if (!isEqualState(prevState, newState)) { 2363 this.setState(newState); 2364 } 2365 }, 2366 getState() { 2367 return this.toggles.filter((item) => hasClass(item, this.cls)).reduce((state, el) => mergeState(el, this.attrItem, state), { 2368 filter: { "": "" }, 2369 sort: [] 2370 }); 2371 }, 2372 async setState(state, animate = true) { 2373 state = { filter: { "": "" }, sort: [], ...state }; 2374 trigger(this.$el, "beforeFilter", [this, state]); 2375 for (const toggle of this.toggles) { 2376 toggleClass(toggle, this.cls, matchFilter(toggle, this.attrItem, state)); 2377 } 2378 await Promise.all( 2379 $$(this.target, this.$el).map((target) => { 2380 const filterFn = () => applyState(state, target, children(target)); 2381 return animate ? this.animate(filterFn, target) : filterFn(); 2382 }) 2383 ); 2384 trigger(this.$el, "afterFilter", [this]); 2385 }, 2386 updateState() { 2387 fastdom.write(() => this.setState(this.getState(), false)); 2388 } 2389 } 2390 }; 2391 function getFilter(el, attr2) { 2392 return parseOptions(data(el, attr2), ["filter"]); 2393 } 2394 function isEqualState(stateA, stateB) { 2395 return ["filter", "sort"].every((prop) => isEqual(stateA[prop], stateB[prop])); 2396 } 2397 function applyState(state, target, children) { 2398 const selector = Object.values(state.filter).join(""); 2399 for (const el of children) { 2400 css(el, "display", selector && !matches(el, selector) ? "none" : ""); 2401 } 2402 const [sort, order] = state.sort; 2403 if (sort) { 2404 const sorted = sortItems(children, sort, order); 2405 if (!isEqual(sorted, children)) { 2406 append(target, sorted); 2407 } 2408 } 2409 } 2410 function mergeState(el, attr2, state) { 2411 const { filter, group, sort, order = "asc" } = getFilter(el, attr2); 2412 if (filter || isUndefined(sort)) { 2413 if (group) { 2414 if (filter) { 2415 delete state.filter[""]; 2416 state.filter[group] = filter; 2417 } else { 2418 delete state.filter[group]; 2419 if (isEmpty(state.filter) || "" in state.filter) { 2420 state.filter = { "": filter || "" }; 2421 } 2422 } 2423 } else { 2424 state.filter = { "": filter || "" }; 2425 } 2426 } 2427 if (!isUndefined(sort)) { 2428 state.sort = [sort, order]; 2429 } 2430 return state; 2431 } 2432 function matchFilter(el, attr2, { filter: stateFilter = { "": "" }, sort: [stateSort, stateOrder] }) { 2433 const { filter = "", group = "", sort, order = "asc" } = getFilter(el, attr2); 2434 return isUndefined(sort) ? group in stateFilter && filter === stateFilter[group] || !filter && group && !(group in stateFilter) && !stateFilter[""] : stateSort === sort && stateOrder === order; 2435 } 2436 function sortItems(nodes, sort, order) { 2437 return [...nodes].sort( 2438 (a, b) => data(a, sort).localeCompare(data(b, sort), void 0, { numeric: true }) * (order === "asc" || -1) 2439 ); 2440 } 2441 function findButton(el) { 2442 return $("a,button", el) || el; 2443 } 2444 2445 let prevented; 2446 function preventBackgroundScroll(el) { 2447 const off = on( 2448 el, 2449 "touchstart", 2450 (e) => { 2451 if (e.targetTouches.length !== 1 || matches(e.target, 'input[type="range"')) { 2452 return; 2453 } 2454 let prev = getEventPos(e).y; 2455 const offMove = on( 2456 el, 2457 "touchmove", 2458 (e2) => { 2459 const pos = getEventPos(e2).y; 2460 if (pos === prev) { 2461 return; 2462 } 2463 prev = pos; 2464 if (!scrollParents(e2.target).some((scrollParent) => { 2465 if (!el.contains(scrollParent)) { 2466 return false; 2467 } 2468 let { scrollHeight, clientHeight } = scrollParent; 2469 return clientHeight < scrollHeight; 2470 })) { 2471 e2.preventDefault(); 2472 } 2473 }, 2474 { passive: false } 2475 ); 2476 once(el, "scroll touchend touchcanel", offMove, { capture: true }); 2477 }, 2478 { passive: true } 2479 ); 2480 if (prevented) { 2481 return off; 2482 } 2483 prevented = true; 2484 const { scrollingElement } = document; 2485 css(scrollingElement, { 2486 overflowY: CSS.supports("overflow", "clip") ? "clip" : "hidden", 2487 touchAction: "none", 2488 paddingRight: width(window) - scrollingElement.clientWidth || "" 2489 }); 2490 return () => { 2491 prevented = false; 2492 off(); 2493 css(scrollingElement, { overflowY: "", touchAction: "", paddingRight: "" }); 2494 }; 2495 } 2496 2497 var Container = { 2498 props: { 2499 container: Boolean 2500 }, 2501 data: { 2502 container: true 2503 }, 2504 computed: { 2505 container({ container }) { 2506 return container === true && this.$container || container && $(container); 2507 } 2508 } 2509 }; 2510 2511 var Togglable = { 2512 props: { 2513 cls: Boolean, 2514 animation: "list", 2515 duration: Number, 2516 velocity: Number, 2517 origin: String, 2518 transition: String 2519 }, 2520 data: { 2521 cls: false, 2522 animation: [false], 2523 duration: 200, 2524 velocity: 0.2, 2525 origin: false, 2526 transition: "ease", 2527 clsEnter: "bdt-togglable-enter", 2528 clsLeave: "bdt-togglable-leave" 2529 }, 2530 computed: { 2531 hasAnimation: ({ animation }) => !!animation[0], 2532 hasTransition: ({ animation }) => ["slide", "reveal"].some((transition) => startsWith(animation[0], transition)) 2533 }, 2534 methods: { 2535 async toggleElement(targets, toggle, animate) { 2536 try { 2537 await Promise.all( 2538 toNodes(targets).map((el) => { 2539 const show = isBoolean(toggle) ? toggle : !this.isToggled(el); 2540 if (!trigger(el, `before${show ? "show" : "hide"}`, [this])) { 2541 return Promise.reject(); 2542 } 2543 const promise = (isFunction(animate) ? animate : animate === false || !this.hasAnimation ? toggleInstant : this.hasTransition ? toggleTransition : toggleAnimation)(el, show, this); 2544 const cls = show ? this.clsEnter : this.clsLeave; 2545 addClass(el, cls); 2546 trigger(el, show ? "show" : "hide", [this]); 2547 const done = () => { 2548 removeClass(el, cls); 2549 trigger(el, show ? "shown" : "hidden", [this]); 2550 }; 2551 return promise ? promise.then(done, () => { 2552 removeClass(el, cls); 2553 return Promise.reject(); 2554 }) : done(); 2555 }) 2556 ); 2557 return true; 2558 } catch (e) { 2559 return false; 2560 } 2561 }, 2562 isToggled(el = this.$el) { 2563 el = toNode(el); 2564 return hasClass(el, this.clsEnter) ? true : hasClass(el, this.clsLeave) ? false : this.cls ? hasClass(el, this.cls.split(" ")[0]) : isVisible(el); 2565 }, 2566 _toggle(el, toggled) { 2567 if (!el) { 2568 return; 2569 } 2570 toggled = Boolean(toggled); 2571 let changed; 2572 if (this.cls) { 2573 changed = includes(this.cls, " ") || toggled !== hasClass(el, this.cls); 2574 changed && toggleClass(el, this.cls, includes(this.cls, " ") ? void 0 : toggled); 2575 } else { 2576 changed = toggled === el.hidden; 2577 changed && (el.hidden = !toggled); 2578 } 2579 $$("[autofocus]", el).some((el2) => isVisible(el2) ? el2.focus() || true : el2.blur()); 2580 if (changed) { 2581 trigger(el, "toggled", [toggled, this]); 2582 } 2583 } 2584 } 2585 }; 2586 function toggleInstant(el, show, { _toggle }) { 2587 Animation.cancel(el); 2588 Transition.cancel(el); 2589 return _toggle(el, show); 2590 } 2591 async function toggleTransition(el, show, { animation, duration, velocity, transition, _toggle }) { 2592 var _a; 2593 const [mode = "reveal", startProp = "top"] = ((_a = animation[0]) == null ? void 0 : _a.split("-")) || []; 2594 const dirs = [ 2595 ["left", "right"], 2596 ["top", "bottom"] 2597 ]; 2598 const dir = dirs[includes(dirs[0], startProp) ? 0 : 1]; 2599 const end = dir[1] === startProp; 2600 const props = ["width", "height"]; 2601 const dimProp = props[dirs.indexOf(dir)]; 2602 const marginProp = `margin-${dir[0]}`; 2603 const marginStartProp = `margin-${startProp}`; 2604 let currentDim = dimensions$1(el)[dimProp]; 2605 const inProgress = Transition.inProgress(el); 2606 await Transition.cancel(el); 2607 if (show) { 2608 _toggle(el, true); 2609 } 2610 const prevProps = Object.fromEntries( 2611 [ 2612 "padding", 2613 "border", 2614 "width", 2615 "height", 2616 "minWidth", 2617 "minHeight", 2618 "overflowY", 2619 "overflowX", 2620 marginProp, 2621 marginStartProp 2622 ].map((key) => [key, el.style[key]]) 2623 ); 2624 const dim = dimensions$1(el); 2625 const currentMargin = toFloat(css(el, marginProp)); 2626 const marginStart = toFloat(css(el, marginStartProp)); 2627 const endDim = dim[dimProp] + marginStart; 2628 if (!inProgress && !show) { 2629 currentDim += marginStart; 2630 } 2631 const [wrapper] = wrapInner(el, "<div>"); 2632 css(wrapper, { 2633 boxSizing: "border-box",
vendor: 4,175 bytes, lines 2634-2779
2634 height: dim.height, 2635 width: dim.width, 2636 ...css(el, [ 2637 "overflow", 2638 "padding", 2639 "borderTop", 2640 "borderRight", 2641 "borderBottom", 2642 "borderLeft", 2643 "borderImage", 2644 marginStartProp 2645 ]) 2646 }); 2647 css(el, { 2648 padding: 0, 2649 border: 0, 2650 minWidth: 0, 2651 minHeight: 0, 2652 [marginStartProp]: 0, 2653 width: dim.width, 2654 height: dim.height, 2655 overflow: "hidden", 2656 [dimProp]: currentDim 2657 }); 2658 const percent = currentDim / endDim; 2659 duration = (velocity * endDim + duration) * (show ? 1 - percent : percent); 2660 const endProps = { [dimProp]: show ? endDim : 0 }; 2661 if (end) { 2662 css(el, marginProp, endDim - currentDim + currentMargin); 2663 endProps[marginProp] = show ? currentMargin : endDim + currentMargin; 2664 } 2665 if (!end ^ mode === "reveal") { 2666 css(wrapper, marginProp, -endDim + currentDim); 2667 Transition.start(wrapper, { [marginProp]: show ? 0 : -endDim }, duration, transition); 2668 } 2669 try { 2670 await Transition.start(el, endProps, duration, transition); 2671 } finally { 2672 css(el, prevProps); 2673 unwrap(wrapper.firstChild); 2674 if (!show) { 2675 _toggle(el, false); 2676 } 2677 } 2678 } 2679 function toggleAnimation(el, show, cmp) { 2680 const { animation, duration, _toggle } = cmp; 2681 if (show) { 2682 _toggle(el, true); 2683 return Animation.in(el, animation[0], duration, cmp.origin); 2684 } 2685 return Animation.out(el, animation[1] || animation[0], duration, cmp.origin).then( 2686 () => _toggle(el, false) 2687 ); 2688 } 2689 2690 const active$1 = []; 2691 var Modal = { 2692 mixins: [Class, Container, Togglable], 2693 props: { 2694 selPanel: String, 2695 selClose: String, 2696 escClose: Boolean, 2697 bgClose: Boolean, 2698 stack: Boolean, 2699 role: String 2700 }, 2701 data: { 2702 cls: "bdt-open", 2703 escClose: true, 2704 bgClose: true, 2705 overlay: true, 2706 stack: false, 2707 role: "dialog" 2708 }, 2709 computed: { 2710 panel: ({ selPanel }, $el) => $(selPanel, $el), 2711 transitionElement() { 2712 return this.panel; 2713 }, 2714 bgClose({ bgClose }) { 2715 return bgClose && this.panel; 2716 } 2717 }, 2718 connected() { 2719 attr(this.panel || this.$el, "role", this.role); 2720 if (this.overlay) { 2721 attr(this.panel || this.$el, "aria-modal", true); 2722 } 2723 }, 2724 beforeDisconnect() { 2725 if (includes(active$1, this)) { 2726 this.toggleElement(this.$el, false, false); 2727 } 2728 }, 2729 events: [ 2730 { 2731 name: "click", 2732 delegate: ({ selClose }) => `${selClose},a[href*="#"]`, 2733 handler(e) { 2734 const { current, defaultPrevented } = e; 2735 const { hash } = current; 2736 if (!defaultPrevented && hash && isSameSiteAnchor(current) && !this.$el.contains($(hash))) { 2737 this.hide(); 2738 } else if (matches(current, this.selClose)) { 2739 e.preventDefault(); 2740 this.hide(); 2741 } 2742 } 2743 }, 2744 { 2745 name: "toggle", 2746 self: true, 2747 handler(e) { 2748 if (e.defaultPrevented) { 2749 return; 2750 } 2751 e.preventDefault(); 2752 if (this.isToggled() === includes(active$1, this)) { 2753 this.toggle(); 2754 } 2755 } 2756 }, 2757 { 2758 name: "beforeshow", 2759 self: true, 2760 handler(e) { 2761 if (includes(active$1, this)) { 2762 return false; 2763 } 2764 if (!this.stack && active$1.length) { 2765 Promise.all(active$1.map((modal) => modal.hide())).then(this.show); 2766 e.preventDefault(); 2767 } else { 2768 active$1.push(this); 2769 } 2770 } 2771 }, 2772 { 2773 name: "show", 2774 self: true, 2775 handler() { 2776 if (this.stack) { 2777 css(this.$el, "zIndex", toFloat(css(this.$el, "zIndex")) + active$1.length); 2778 } 2779 const handlers = [
2780 this.overlay && preventBackgroundFocus(this), 2781 this.overlay && preventBackgroundScroll(this.$el), 2782 this.bgClose && listenForBackgroundClose$1(this), 2783 this.escClose && listenForEscClose$1(this) 2784 ]; 2785 once( 2786 this.$el, 2787 "hidden", 2788 () => handlers.forEach((handler) => handler && handler()), 2789 { self: true } 2790 ); 2791 addClass(document.documentElement, this.clsPage); 2792 } 2793 }, 2794 { 2795 name: "shown", 2796 self: true, 2797 handler() { 2798 if (!isFocusable(this.$el)) { 2799 attr(this.$el, "tabindex", "-1"); 2800 } 2801 if (!matches(this.$el, ":focus-within")) { 2802 this.$el.focus(); 2803 } 2804 } 2805 }, 2806 { 2807 name: "hidden", 2808 self: true, 2809 handler() { 2810 if (includes(active$1, this)) { 2811 active$1.splice(active$1.indexOf(this), 1); 2812 } 2813 css(this.$el, "zIndex", ""); 2814 if (!active$1.some((modal) => modal.clsPage === this.clsPage)) { 2815 removeClass(document.documentElement, this.clsPage); 2816 } 2817 } 2818 } 2819 ], 2820 methods: { 2821 toggle() { 2822 return this.isToggled() ? this.hide() : this.show(); 2823 }, 2824 show() { 2825 if (this.container && parent(this.$el) !== this.container) { 2826 append(this.container, this.$el); 2827 return new Promise( 2828 (resolve) => requestAnimationFrame(() => this.show().then(resolve)) 2829 ); 2830 } 2831 return this.toggleElement(this.$el, true, animate$1); 2832 }, 2833 hide() { 2834 return this.toggleElement(this.$el, false, animate$1); 2835 } 2836 } 2837 }; 2838 function animate$1(el, show, { transitionElement, _toggle }) { 2839 return new Promise( 2840 (resolve, reject) => once(el, "show hide", () => { 2841 var _a; 2842 (_a = el._reject) == null ? void 0 : _a.call(el); 2843 el._reject = reject; 2844 _toggle(el, show); 2845 const off = once( 2846 transitionElement, 2847 "transitionstart", 2848 () => { 2849 once(transitionElement, "transitionend transitioncancel", resolve, { 2850 self: true 2851 }); 2852 clearTimeout(timer); 2853 }, 2854 { self: true } 2855 ); 2856 const timer = setTimeout( 2857 () => { 2858 off(); 2859 resolve(); 2860 }, 2861 toMs(css(transitionElement, "transitionDuration")) 2862 ); 2863 }) 2864 ).then(() => delete el._reject); 2865 } 2866 function toMs(time) { 2867 return time ? endsWith(time, "ms") ? toFloat(time) : toFloat(time) * 1e3 : 0; 2868 } 2869 function preventBackgroundFocus(modal) { 2870 return on(document, "focusin", (e) => { 2871 if (last(active$1) === modal && !modal.$el.contains(e.target)) { 2872 modal.$el.focus(); 2873 } 2874 }); 2875 }
vendor: 19,115 bytes, lines 2876-3438
2876 function listenForBackgroundClose$1(modal) { 2877 return on(document, pointerDown$1, ({ target }) => { 2878 if (last(active$1) !== modal || modal.overlay && !modal.$el.contains(target) || modal.panel.contains(target)) { 2879 return; 2880 } 2881 once( 2882 document, 2883 `${pointerUp$1} ${pointerCancel} scroll`, 2884 ({ defaultPrevented, type, target: newTarget }) => { 2885 if (!defaultPrevented && type === pointerUp$1 && target === newTarget) { 2886 modal.hide(); 2887 } 2888 }, 2889 true 2890 ); 2891 }); 2892 } 2893 function listenForEscClose$1(modal) { 2894 return on(document, "keydown", (e) => { 2895 if (e.keyCode === 27 && last(active$1) === modal) { 2896 modal.hide(); 2897 } 2898 }); 2899 } 2900 2901 var Animations$2 = { 2902 slide: { 2903 show(dir) { 2904 return [{ transform: translate(dir * -100) }, { transform: translate() }]; 2905 }, 2906 percent(current) { 2907 return translated(current); 2908 }, 2909 translate(percent, dir) { 2910 return [ 2911 { transform: translate(dir * -100 * percent) }, 2912 { transform: translate(dir * 100 * (1 - percent)) } 2913 ]; 2914 } 2915 } 2916 }; 2917 function translated(el) { 2918 return Math.abs(new DOMMatrix(css(el, "transform")).m41 / el.offsetWidth); 2919 } 2920 function translate(value = 0, unit = "%") { 2921 value += value ? unit : ""; 2922 return `translate3d(${value}, 0, 0)`; 2923 } 2924 function scale3d(value) { 2925 return `scale3d(${value}, ${value}, 1)`; 2926 } 2927 2928 function Transitioner$1(prev, next, dir, { animation, easing }) { 2929 const { percent, translate, show = noop } = animation; 2930 const props = show(dir); 2931 const { promise, resolve } = withResolvers(); 2932 return { 2933 dir, 2934 show(duration, percent2 = 0, linear) { 2935 const timing = linear ? "linear" : easing; 2936 duration -= Math.round(duration * clamp(percent2, -1, 1)); 2937 this.translate(percent2); 2938 triggerUpdate(next, "itemin", { percent: percent2, duration, timing, dir }); 2939 triggerUpdate(prev, "itemout", { percent: 1 - percent2, duration, timing, dir }); 2940 Promise.all([ 2941 Transition.start(next, props[1], duration, timing), 2942 Transition.start(prev, props[0], duration, timing) 2943 ]).then(() => { 2944 this.reset(); 2945 resolve(); 2946 }, noop); 2947 return promise; 2948 }, 2949 cancel() { 2950 return Transition.cancel([next, prev]); 2951 }, 2952 reset() { 2953 for (const prop in props[0]) { 2954 css([next, prev], prop, ""); 2955 } 2956 }, 2957 async forward(duration, percent2 = this.percent()) { 2958 await this.cancel(); 2959 return this.show(duration, percent2, true); 2960 }, 2961 translate(percent2) { 2962 this.reset(); 2963 const props2 = translate(percent2, dir); 2964 css(next, props2[1]); 2965 css(prev, props2[0]); 2966 triggerUpdate(next, "itemtranslatein", { percent: percent2, dir }); 2967 triggerUpdate(prev, "itemtranslateout", { percent: 1 - percent2, dir }); 2968 }, 2969 percent() { 2970 return percent(prev || next, next, dir); 2971 }, 2972 getDistance() { 2973 return prev == null ? void 0 : prev.offsetWidth; 2974 } 2975 }; 2976 } 2977 function triggerUpdate(el, type, data) { 2978 trigger(el, createEvent(type, false, false, data)); 2979 } 2980 function withResolvers() { 2981 let resolve; 2982 return { promise: new Promise((res) => resolve = res), resolve }; 2983 } 2984 2985 var I18n = { 2986 props: { 2987 i18n: Object 2988 }, 2989 data: { 2990 i18n: null 2991 }, 2992 methods: { 2993 t(key, ...params) { 2994 var _a, _b, _c; 2995 let i = 0; 2996 return ((_c = ((_a = this.i18n) == null ? void 0 : _a[key]) || ((_b = this.$options.i18n) == null ? void 0 : _b[key])) == null ? void 0 : _c.replace( 2997 /%s/g, 2998 () => params[i++] || "" 2999 )) || ""; 3000 } 3001 } 3002 }; 3003 3004 var SliderAutoplay = { 3005 props: { 3006 autoplay: Boolean, 3007 autoplayInterval: Number, 3008 pauseOnHover: Boolean 3009 }, 3010 data: { 3011 autoplay: false, 3012 autoplayInterval: 7e3, 3013 pauseOnHover: true 3014 }, 3015 connected() { 3016 attr(this.list, "aria-live", this.autoplay ? "off" : "polite"); 3017 this.autoplay && this.startAutoplay(); 3018 }, 3019 disconnected() { 3020 this.stopAutoplay(); 3021 }, 3022 update() { 3023 attr(this.slides, "tabindex", "-1"); 3024 }, 3025 events: [ 3026 { 3027 name: "visibilitychange", 3028 el: () => document, 3029 filter: ({ autoplay }) => autoplay, 3030 handler() { 3031 if (document.hidden) { 3032 this.stopAutoplay(); 3033 } else { 3034 this.startAutoplay(); 3035 } 3036 } 3037 } 3038 ], 3039 methods: { 3040 startAutoplay() { 3041 this.stopAutoplay(); 3042 this.interval = setInterval(() => { 3043 if (!(this.stack.length || this.draggable && matches(this.$el, ":focus-within") && !matches(this.$el, ":focus") || this.pauseOnHover && matches(this.$el, ":hover"))) { 3044 this.show("next"); 3045 } 3046 }, this.autoplayInterval); 3047 }, 3048 stopAutoplay() { 3049 clearInterval(this.interval); 3050 } 3051 } 3052 }; 3053 3054 const pointerOptions = { passive: false, capture: true }; 3055 const pointerUpOptions = { passive: true, capture: true }; 3056 const pointerDown = "touchstart mousedown"; 3057 const pointerMove = "touchmove mousemove"; 3058 const pointerUp = "touchend touchcancel mouseup click input scroll"; 3059 const preventClick = (e) => e.preventDefault(); 3060 var SliderDrag = { 3061 props: { 3062 draggable: Boolean 3063 }, 3064 data: { 3065 draggable: true, 3066 threshold: 10 3067 }, 3068 created() { 3069 for (const key of ["start", "move", "end"]) { 3070 const fn = this[key]; 3071 this[key] = (e) => { 3072 const pos = getEventPos(e).x * (isRtl ? -1 : 1); 3073 this.prevPos = pos === this.pos ? this.prevPos : this.pos; 3074 this.pos = pos; 3075 fn(e); 3076 }; 3077 } 3078 }, 3079 events: [ 3080 { 3081 name: pointerDown, 3082 passive: true, 3083 delegate: ({ selList }) => `${selList} > *`, 3084 handler(e) { 3085 if (!this.draggable || this.parallax || !isTouch(e) && hasSelectableText(e.target) || e.target.closest(selInput) || e.button > 0 || this.length < 2) { 3086 return; 3087 } 3088 this.start(e); 3089 } 3090 }, 3091 { 3092 name: "dragstart", 3093 handler(e) { 3094 e.preventDefault(); 3095 } 3096 }, 3097 { 3098 // iOS workaround for slider stopping if swiping fast 3099 name: pointerMove, 3100 el: ({ list }) => list, 3101 handler: noop, 3102 ...pointerOptions 3103 } 3104 ], 3105 methods: { 3106 start() { 3107 this.drag = this.pos; 3108 if (this._transitioner) { 3109 this.percent = this._transitioner.percent(); 3110 this.drag += this._transitioner.getDistance() * this.percent * this.dir; 3111 this._transitioner.cancel(); 3112 this._transitioner.translate(this.percent); 3113 this.dragging = true; 3114 this.stack = []; 3115 } else { 3116 this.prevIndex = this.index; 3117 } 3118 on(document, pointerMove, this.move, pointerOptions); 3119 on(document, pointerUp, this.end, pointerUpOptions); 3120 css(this.list, "userSelect", "none"); 3121 }, 3122 move(e) { 3123 const distance = this.pos - this.drag; 3124 if (distance === 0 || this.prevPos === this.pos || !this.dragging && Math.abs(distance) < this.threshold) { 3125 return; 3126 } 3127 if (!this.dragging) { 3128 on(this.list, "click", preventClick, pointerOptions); 3129 } 3130 e.cancelable && e.preventDefault(); 3131 this.dragging = true; 3132 this.dir = distance < 0 ? 1 : -1; 3133 let { slides, prevIndex } = this; 3134 let dis = Math.abs(distance); 3135 let nextIndex = this.getIndex(prevIndex + this.dir); 3136 let width = getDistance.call(this, prevIndex, nextIndex); 3137 while (nextIndex !== prevIndex && dis > width) { 3138 this.drag -= width * this.dir; 3139 prevIndex = nextIndex; 3140 dis -= width; 3141 nextIndex = this.getIndex(prevIndex + this.dir); 3142 width = getDistance.call(this, prevIndex, nextIndex); 3143 } 3144 this.percent = dis / width; 3145 const prev = slides[prevIndex]; 3146 const next = slides[nextIndex]; 3147 const changed = this.index !== nextIndex; 3148 const edge = prevIndex === nextIndex; 3149 let itemShown; 3150 for (const i of [this.index, this.prevIndex]) { 3151 if (!includes([nextIndex, prevIndex], i)) { 3152 trigger(slides[i], "itemhidden", [this]); 3153 if (edge) { 3154 itemShown = true; 3155 this.prevIndex = prevIndex; 3156 } 3157 } 3158 } 3159 if (this.index === prevIndex && this.prevIndex !== prevIndex || itemShown) { 3160 trigger(slides[this.index], "itemshown", [this]); 3161 } 3162 if (changed) { 3163 this.prevIndex = prevIndex; 3164 this.index = nextIndex; 3165 if (!edge) { 3166 trigger(prev, "beforeitemhide", [this]); 3167 trigger(prev, "itemhide", [this]); 3168 } 3169 trigger(next, "beforeitemshow", [this]); 3170 trigger(next, "itemshow", [this]); 3171 } 3172 this._transitioner = this._translate(Math.abs(this.percent), prev, !edge && next); 3173 }, 3174 end() { 3175 off(document, pointerMove, this.move, pointerOptions); 3176 off(document, pointerUp, this.end, pointerUpOptions); 3177 if (this.dragging) { 3178 this.dragging = null; 3179 if (this.index === this.prevIndex) { 3180 this.percent = 1 - this.percent; 3181 this.dir *= -1; 3182 this._show(false, this.index, true); 3183 this._transitioner = null; 3184 } else { 3185 const dirChange = (isRtl ? this.dir * (isRtl ? 1 : -1) : this.dir) < 0 === this.prevPos > this.pos; 3186 this.index = dirChange ? this.index : this.prevIndex; 3187 if (dirChange) { 3188 this.percent = 1 - this.percent; 3189 } 3190 this.show( 3191 this.dir > 0 && !dirChange || this.dir < 0 && dirChange ? "next" : "previous", 3192 true 3193 ); 3194 } 3195 } 3196 setTimeout(() => off(this.list, "click", preventClick, pointerOptions)); 3197 css(this.list, { userSelect: "" }); 3198 this.drag = this.percent = null; 3199 } 3200 } 3201 }; 3202 function getDistance(prev, next) { 3203 return this._getTransitioner(prev, prev !== next && next).getDistance() || this.slides[prev].offsetWidth; 3204 } 3205 function hasSelectableText(el) { 3206 return css(el, "userSelect") !== "none" && toArray(el.childNodes).some((el2) => el2.nodeType === 3 && el2.textContent.trim()); 3207 } 3208 3209 function initWatches(instance) { 3210 instance._watches = []; 3211 for (const watches of instance.$options.watch || []) { 3212 for (const [name, watch] of Object.entries(watches)) { 3213 registerWatch(instance, watch, name); 3214 } 3215 } 3216 instance._initial = true; 3217 } 3218 function registerWatch(instance, watch, name) { 3219 instance._watches.push({ 3220 name, 3221 ...isPlainObject(watch) ? watch : { handler: watch } 3222 }); 3223 } 3224 function runWatches(instance, values) { 3225 for (const { name, handler, immediate = true } of instance._watches) { 3226 if (instance._initial && immediate || hasOwn(values, name) && !isEqual(values[name], instance[name])) { 3227 handler.call(instance, instance[name], values[name]); 3228 } 3229 } 3230 instance._initial = false; 3231 } 3232 3233 function initComputed(instance) { 3234 const { computed } = instance.$options; 3235 instance._computed = {}; 3236 if (computed) { 3237 for (const key in computed) { 3238 registerComputed(instance, key, computed[key]); 3239 } 3240 } 3241 } 3242 const mutationOptions = { subtree: true, childList: true }; 3243 function registerComputed(instance, key, cb) { 3244 instance._hasComputed = true; 3245 Object.defineProperty(instance, key, { 3246 enumerable: true, 3247 get() { 3248 const { _computed, $props, $el } = instance; 3249 if (!hasOwn(_computed, key)) { 3250 _computed[key] = (cb.get || cb).call(instance, $props, $el); 3251 if (cb.observe && instance._computedObserver) { 3252 const selector = cb.observe.call(instance, $props); 3253 instance._computedObserver.observe( 3254 ["~", "+", "-"].includes(selector[0]) ? $el.parentElement : $el.getRootNode(), 3255 mutationOptions 3256 ); 3257 } 3258 } 3259 return _computed[key]; 3260 }, 3261 set(value) { 3262 const { _computed } = instance; 3263 _computed[key] = cb.set ? cb.set.call(instance, value) : value; 3264 if (isUndefined(_computed[key])) { 3265 delete _computed[key]; 3266 } 3267 } 3268 }); 3269 } 3270 function initComputedUpdates(instance) { 3271 if (!instance._hasComputed) { 3272 return; 3273 } 3274 prependUpdate(instance, { 3275 read: () => runWatches(instance, resetComputed(instance)), 3276 events: ["resize", "computed"] 3277 }); 3278 instance._computedObserver = observeMutation( 3279 instance.$el, 3280 () => callUpdate(instance, "computed"), 3281 mutationOptions 3282 ); 3283 } 3284 function disconnectComputedUpdates(instance) { 3285 var _a; 3286 (_a = instance._computedObserver) == null ? void 0 : _a.disconnect(); 3287 delete instance._computedObserver; 3288 resetComputed(instance); 3289 } 3290 function resetComputed(instance) { 3291 const values = { ...instance._computed }; 3292 instance._computed = {}; 3293 return values; 3294 } 3295 3296 function initEvents(instance) { 3297 instance._events = []; 3298 for (const event of instance.$options.events || []) { 3299 if (hasOwn(event, "handler")) { 3300 registerEvent(instance, event); 3301 } else { 3302 for (const key in event) { 3303 registerEvent(instance, event[key], key); 3304 } 3305 } 3306 } 3307 } 3308 function unbindEvents(instance) { 3309 instance._events.forEach((unbind) => unbind()); 3310 delete instance._events; 3311 } 3312 function registerEvent(instance, event, key) { 3313 let { name, el, handler, capture, passive, delegate, filter, self } = isPlainObject(event) ? event : { name: key, handler: event }; 3314 el = isFunction(el) ? el.call(instance, instance) : el || instance.$el; 3315 if (!el || isArray(el) && !el.length || filter && !filter.call(instance, instance)) { 3316 return; 3317 } 3318 instance._events.push( 3319 on( 3320 el, 3321 name, 3322 delegate ? isString(delegate) ? delegate : delegate.call(instance, instance) : null, 3323 isString(handler) ? instance[handler] : handler.bind(instance), 3324 { passive, capture, self } 3325 ) 3326 ); 3327 } 3328 3329 function initObservers(instance) { 3330 instance._observers = []; 3331 for (const observer of instance.$options.observe || []) { 3332 registerObservable(instance, observer); 3333 } 3334 } 3335 function registerObserver(instance, ...observer) { 3336 instance._observers.push(...observer); 3337 } 3338 function disconnectObservers(instance) { 3339 for (const observer of instance._observers) { 3340 observer.disconnect(); 3341 } 3342 } 3343 function registerObservable(instance, observable) { 3344 let { observe, target = instance.$el, handler, options, filter, args } = observable; 3345 if (filter && !filter.call(instance, instance)) { 3346 return; 3347 } 3348 const key = `_observe${instance._observers.length}`; 3349 if (isFunction(target) && !hasOwn(instance, key)) { 3350 registerComputed(instance, key, () => { 3351 const targets2 = target.call(instance, instance); 3352 return isArray(targets2) ? toNodes(targets2) : targets2; 3353 }); 3354 } 3355 handler = isString(handler) ? instance[handler] : handler.bind(instance); 3356 if (isFunction(options)) { 3357 options = options.call(instance, instance); 3358 } 3359 const targets = hasOwn(instance, key) ? instance[key] : target; 3360 const observer = observe(targets, handler, options, args); 3361 if (isFunction(target) && isArray(instance[key])) { 3362 registerWatch( 3363 instance, 3364 { handler: updateTargets(observer, options), immediate: false }, 3365 key 3366 ); 3367 } 3368 registerObserver(instance, observer); 3369 } 3370 function updateTargets(observer, options) { 3371 return (targets, prev) => { 3372 for (const target of prev) { 3373 if (!includes(targets, target)) { 3374 if (observer.unobserve) { 3375 observer.unobserve(target); 3376 } else if (observer.observe) { 3377 observer.disconnect(); 3378 } 3379 } 3380 } 3381 for (const target of targets) { 3382 if (!includes(prev, target) || !observer.unobserve) { 3383 observer.observe(target, options); 3384 } 3385 } 3386 }; 3387 } 3388 3389 function initProps(instance) { 3390 const { $options, $props } = instance; 3391 const props = getProps($options); 3392 assign($props, props); 3393 const { computed, methods } = $options; 3394 for (let key in $props) { 3395 if (key in props && (!computed || !hasOwn(computed, key)) && (!methods || !hasOwn(methods, key))) { 3396 instance[key] = $props[key]; 3397 } 3398 } 3399 } 3400 function getProps(opts) { 3401 const data$1 = {}; 3402 const { args = [], props = {}, el, id } = opts; 3403 if (!props) { 3404 return data$1; 3405 } 3406 for (const key in props) { 3407 const prop = hyphenate(key); 3408 let value = data(el, prop); 3409 if (isUndefined(value)) { 3410 continue; 3411 } 3412 value = props[key] === Boolean && value === "" ? true : coerce$1(props[key], value); 3413 if (prop === "target" && startsWith(value, "_")) { 3414 continue; 3415 } 3416 data$1[key] = value; 3417 } 3418 const options = parseOptions(data(el, id), args); 3419 for (const key in options) { 3420 const prop = camelize(key); 3421 if (!isUndefined(props[prop])) { 3422 data$1[prop] = coerce$1(props[prop], options[key]); 3423 } 3424 } 3425 return data$1; 3426 } 3427 const getAttributes = memoize((id, props) => { 3428 const attributes = Object.keys(props); 3429 const filter = attributes.concat(id).map((key) => [hyphenate(key), `data-${hyphenate(key)}`]).flat(); 3430 return { attributes, filter }; 3431 }); 3432 function initPropsObserver(instance) { 3433 const { $options, $props } = instance; 3434 const { id, props, el } = $options; 3435 if (!props) { 3436 return; 3437 } 3438 const { attributes, filter } = getAttributes(id, props);
vendor: 5,874 bytes, lines 3439-3621
3439 const observer = new MutationObserver((records) => { 3440 const data = getProps($options); 3441 if (records.some(({ attributeName }) => { 3442 const prop = attributeName.replace("data-", ""); 3443 return (prop === id ? attributes : [camelize(prop), camelize(attributeName)]).some( 3444 (prop2) => !isUndefined(data[prop2]) && data[prop2] !== $props[prop2] 3445 ); 3446 })) { 3447 instance.$reset(); 3448 } 3449 }); 3450 observer.observe(el, { 3451 attributes: true, 3452 attributeFilter: filter 3453 }); 3454 registerObserver(instance, observer); 3455 } 3456 3457 function callHook(instance, hook) { 3458 var _a; 3459 (_a = instance.$options[hook]) == null ? void 0 : _a.forEach((handler) => handler.call(instance)); 3460 } 3461 function callConnected(instance) { 3462 if (instance._connected) { 3463 return; 3464 } 3465 initProps(instance); 3466 callHook(instance, "beforeConnect"); 3467 instance._connected = true; 3468 initEvents(instance); 3469 initUpdates(instance); 3470 initWatches(instance); 3471 initObservers(instance); 3472 initPropsObserver(instance); 3473 initComputedUpdates(instance); 3474 callHook(instance, "connected"); 3475 callUpdate(instance); 3476 } 3477 function callDisconnected(instance) { 3478 if (!instance._connected) { 3479 return; 3480 } 3481 callHook(instance, "beforeDisconnect"); 3482 unbindEvents(instance); 3483 clearUpdateData(instance); 3484 disconnectObservers(instance); 3485 disconnectComputedUpdates(instance); 3486 callHook(instance, "disconnected"); 3487 instance._connected = false; 3488 } 3489 3490 let uid = 0; 3491 function init$1(instance, options = {}) { 3492 options.data = normalizeData(options, instance.constructor.options); 3493 instance.$options = mergeOptions(instance.constructor.options, options, instance); 3494 instance.$props = {}; 3495 instance._uid = uid++; 3496 initData(instance); 3497 initMethods(instance); 3498 initComputed(instance); 3499 callHook(instance, "created"); 3500 if (options.el) { 3501 instance.$mount(options.el); 3502 } 3503 } 3504 function initData(instance) { 3505 const { data = {} } = instance.$options; 3506 for (const key in data) { 3507 instance.$props[key] = instance[key] = data[key]; 3508 } 3509 } 3510 function initMethods(instance) { 3511 const { methods } = instance.$options; 3512 if (methods) { 3513 for (const key in methods) { 3514 instance[key] = methods[key].bind(instance); 3515 } 3516 } 3517 } 3518 function normalizeData({ data = {} }, { args = [], props = {} }) { 3519 if (isArray(data)) { 3520 data = data.slice(0, args.length).reduce((data2, value, index) => { 3521 if (isPlainObject(value)) { 3522 assign(data2, value); 3523 } else { 3524 data2[args[index]] = value; 3525 } 3526 return data2; 3527 }, {}); 3528 } 3529 for (const key in data) { 3530 if (isUndefined(data[key])) { 3531 delete data[key]; 3532 } else if (props[key]) { 3533 data[key] = coerce$1(props[key], data[key]); 3534 } 3535 } 3536 return data; 3537 } 3538 3539 const App = function(options) { 3540 init$1(this, options); 3541 }; 3542 App.util = util; 3543 App.options = {}; 3544 App.version = "3.21.7"; 3545 3546 const PREFIX = "bdt-"; 3547 const DATA = "__uikit__"; 3548 const components$2 = {}; 3549 function component(name, options) { 3550 var _a, _b; 3551 const id = PREFIX + hyphenate(name); 3552 if (!options) { 3553 if (!components$2[id].options) { 3554 components$2[id] = App.extend(components$2[id]); 3555 } 3556 return components$2[id]; 3557 } 3558 name = camelize(name); 3559 App[name] = (element, data) => createComponent(name, element, data); 3560 const opt = (_a = options.options) != null ? _a : { ...options }; 3561 opt.id = id; 3562 opt.name = name; 3563 (_b = opt.install) == null ? void 0 : _b.call(opt, App, opt, name); 3564 if (App._initialized && !opt.functional) { 3565 requestAnimationFrame(() => createComponent(name, `[${id}],[data-${id}]`)); 3566 } 3567 return components$2[id] = opt; 3568 } 3569 function createComponent(name, element, data, ...args) { 3570 const Component = component(name); 3571 return Component.options.functional ? new Component({ data: isPlainObject(element) ? element : [element, data, ...args] }) : element ? $$(element).map(init)[0] : init(); 3572 function init(element2) { 3573 const instance = getComponent(element2, name); 3574 if (instance) { 3575 if (data) { 3576 instance.$destroy(); 3577 } else { 3578 return instance; 3579 } 3580 } 3581 return new Component({ el: element2, data }); 3582 } 3583 } 3584 function getComponents(element) { 3585 return (element == null ? void 0 : element[DATA]) || {}; 3586 } 3587 function getComponent(element, name) { 3588 return getComponents(element)[name]; 3589 } 3590 function attachToElement(element, instance) { 3591 if (!element[DATA]) { 3592 element[DATA] = {}; 3593 } 3594 element[DATA][instance.$options.name] = instance; 3595 } 3596 function detachFromElement(element, instance) { 3597 var _a; 3598 (_a = element[DATA]) == null ? true : delete _a[instance.$options.name]; 3599 if (isEmpty(element[DATA])) { 3600 delete element[DATA]; 3601 } 3602 } 3603 3604 function globalApi(App) { 3605 App.component = component; 3606 App.getComponents = getComponents; 3607 App.getComponent = getComponent; 3608 App.update = update; 3609 App.use = function(plugin) { 3610 if (plugin.installed) { 3611 return; 3612 } 3613 plugin.call(null, this); 3614 plugin.installed = true; 3615 return this; 3616 }; 3617 App.mixin = function(mixin, component2) { 3618 component2 = (isString(component2) ? this.component(component2) : component2) || this; 3619 component2.options = mergeOptions(component2.options, mixin); 3620 }; 3621 App.extend = function(options) {
vendor: 4,049 bytes, lines 3622-3759
3622 options || (options = {}); 3623 const Super = this; 3624 const Sub = function bdtUIkitComponent(options2) { 3625 init$1(this, options2); 3626 }; 3627 Sub.prototype = Object.create(Super.prototype); 3628 Sub.prototype.constructor = Sub; 3629 Sub.options = mergeOptions(Super.options, options); 3630 Sub.super = Super; 3631 Sub.extend = Super.extend; 3632 return Sub; 3633 }; 3634 let container; 3635 Object.defineProperty(App, "container", { 3636 get() { 3637 return container || document.body; 3638 }, 3639 set(element) { 3640 container = $(element); 3641 } 3642 }); 3643 } 3644 function update(element, e) { 3645 element = element ? toNode(element) : document.body; 3646 for (const parentEl of parents(element).reverse()) { 3647 updateElement(parentEl, e); 3648 } 3649 apply(element, (element2) => updateElement(element2, e)); 3650 } 3651 function updateElement(element, e) { 3652 const components = getComponents(element); 3653 for (const name in components) { 3654 callUpdate(components[name], e); 3655 } 3656 } 3657 3658 function instanceApi(App) { 3659 App.prototype.$mount = function(el) { 3660 const instance = this; 3661 attachToElement(el, instance); 3662 instance.$options.el = el; 3663 if (document.contains(el)) { 3664 callConnected(instance); 3665 } 3666 }; 3667 App.prototype.$destroy = function(removeEl = false) { 3668 const instance = this; 3669 const { el } = instance.$options; 3670 if (el) { 3671 callDisconnected(instance); 3672 } 3673 callHook(instance, "destroy"); 3674 detachFromElement(el, instance); 3675 if (removeEl) { 3676 remove$1(instance.$el); 3677 } 3678 }; 3679 App.prototype.$create = createComponent; 3680 App.prototype.$emit = function(e) { 3681 callUpdate(this, e); 3682 }; 3683 App.prototype.$update = function(element = this.$el, e) { 3684 update(element, e); 3685 }; 3686 App.prototype.$reset = function() { 3687 callDisconnected(this); 3688 callConnected(this); 3689 }; 3690 App.prototype.$getComponent = getComponent; 3691 Object.defineProperties(App.prototype, { 3692 $el: { 3693 get() { 3694 return this.$options.el; 3695 } 3696 }, 3697 $container: Object.getOwnPropertyDescriptor(App, "container") 3698 }); 3699 } 3700 let id = 1; 3701 function generateId(instance, el = null) { 3702 return (el == null ? void 0 : el.id) || `${instance.$options.id}-${id++}`; 3703 } 3704 3705 var SliderNav = { 3706 i18n: { 3707 next: "Next slide", 3708 previous: "Previous slide", 3709 slideX: "Slide %s", 3710 slideLabel: "%s of %s", 3711 role: "String" 3712 }, 3713 data: { 3714 selNav: false, 3715 role: "region" 3716 }, 3717 computed: { 3718 nav: ({ selNav }, $el) => $(selNav, $el), 3719 navChildren() { 3720 return children(this.nav); 3721 }, 3722 selNavItem: ({ attrItem }) => `[${attrItem}],[data-${attrItem}]`, 3723 navItems(_, $el) { 3724 return $$(this.selNavItem, $el); 3725 } 3726 }, 3727 watch: { 3728 nav(nav, prev) { 3729 attr(nav, "role", "tablist"); 3730 this.padNavitems(); 3731 if (prev) { 3732 this.$emit(); 3733 } 3734 }, 3735 list(list) { 3736 if (isTag(list, "ul")) { 3737 attr(list, "role", "presentation"); 3738 } 3739 }, 3740 navChildren(children2) { 3741 attr(children2, "role", "presentation"); 3742 this.padNavitems(); 3743 this.updateNav(); 3744 }, 3745 navItems(items) { 3746 for (const el of items) { 3747 const cmd = data(el, this.attrItem); 3748 const button = $("a,button", el) || el; 3749 let ariaLabel; 3750 let ariaControls = null; 3751 if (isNumeric(cmd)) { 3752 const item = toNumber(cmd); 3753 const slide = this.slides[item]; 3754 if (slide) { 3755 if (!slide.id) { 3756 slide.id = generateId(this, slide); 3757 } 3758 ariaControls = slide.id; 3759 }
3760 ariaLabel = this.t("slideX", toFloat(cmd) + 1); 3761 attr(button, "role", "tab"); 3762 } else { 3763 if (this.list) { 3764 if (!this.list.id) { 3765 this.list.id = generateId(this, this.list); 3766 } 3767 ariaControls = this.list.id; 3768 } 3769 ariaLabel = this.t(cmd); 3770 } 3771 attr(button, { 3772 "aria-controls": ariaControls, 3773 "aria-label": attr(button, "aria-label") || ariaLabel 3774 }); 3775 } 3776 }, 3777 slides(slides) { 3778 slides.forEach( 3779 (slide, i) => attr(slide, { 3780 role: this.nav ? "tabpanel" : "group", 3781 "aria-label": this.t("slideLabel", i + 1, this.length), 3782 "aria-roledescription": this.nav ? null : "slide" 3783 }) 3784 ); 3785 this.padNavitems(); 3786 } 3787 }, 3788 connected() { 3789 attr(this.$el, { 3790 role: this.role, 3791 "aria-roledescription": "carousel" 3792 }); 3793 }, 3794 update: [ 3795 { 3796 write() { 3797 this.navItems.concat(this.nav).forEach((el) => el && (el.hidden = !this.maxIndex)); 3798 this.updateNav(); 3799 }, 3800 events: ["resize"] 3801 } 3802 ], 3803 events: [ 3804 { 3805 name: "click keydown", 3806 delegate: ({ selNavItem }) => selNavItem, 3807 filter: ({ parallax }) => !parallax, 3808 handler(e) { 3809 if (e.target.closest("a,button") && (e.type === "click" || e.keyCode === keyMap.SPACE)) { 3810 e.preventDefault(); 3811 this.show(data(e.current, this.attrItem)); 3812 } 3813 } 3814 }, 3815 { 3816 name: "itemshow", 3817 handler: "updateNav" 3818 }, 3819 { 3820 name: "keydown", 3821 delegate: ({ selNavItem }) => selNavItem, 3822 filter: ({ parallax }) => !parallax, 3823 handler(e) { 3824 const { current, keyCode } = e; 3825 const cmd = data(current, this.attrItem); 3826 if (!isNumeric(cmd)) { 3827 return; 3828 } 3829 let i = keyCode === keyMap.HOME ? 0 : keyCode === keyMap.END ? "last" : keyCode === keyMap.LEFT ? "previous" : keyCode === keyMap.RIGHT ? "next" : -1; 3830 if (~i) { 3831 e.preventDefault(); 3832 this.show(i); 3833 } 3834 } 3835 } 3836 ], 3837 methods: { 3838 updateNav() { 3839 const index = this.getValidIndex(); 3840 for (const el of this.navItems) { 3841 const cmd = data(el, this.attrItem); 3842 const button = $("a,button", el) || el; 3843 if (isNumeric(cmd)) { 3844 const item = toNumber(cmd); 3845 const active = item === index; 3846 toggleClass(el, this.clsActive, active); 3847 toggleClass(button, "bdt-disabled", this.parallax); 3848 attr(button, { 3849 "aria-selected": active, 3850 tabindex: active && !this.parallax ? null : -1 3851 }); 3852 if (active && button && matches(parent(el), ":focus-within")) { 3853 button.focus(); 3854 } 3855 } else { 3856 toggleClass( 3857 el, 3858 "bdt-invisible", 3859 this.finite && (cmd === "previous" && index === 0 || cmd === "next" && index >= this.maxIndex) 3860 ); 3861 } 3862 } 3863 }, 3864 padNavitems() { 3865 if (!this.nav) { 3866 return; 3867 } 3868 const children2 = []; 3869 for (let i = 0; i < this.length; i++) { 3870 const attr2 = `${this.attrItem}="${i}"`; 3871 children2[i] = this.navChildren.findLast((el) => el.matches(`[${attr2}]`)) || $(`<li ${attr2}><a href></a></li>`); 3872 } 3873 if (!isEqual(children2, this.navChildren)) { 3874 html(this.nav, children2); 3875 } 3876 } 3877 } 3878 }; 3879 3880 const easeOutQuad = "cubic-bezier(0.25, 0.46, 0.45, 0.94)"; 3881 const easeOutQuart = "cubic-bezier(0.165, 0.84, 0.44, 1)"; 3882 var Slider = { 3883 mixins: [SliderAutoplay, SliderDrag, SliderNav, I18n], 3884 props: { 3885 clsActivated: String, 3886 easing: String, 3887 index: Number, 3888 finite: Boolean, 3889 velocity: Number 3890 }, 3891 data: () => ({ 3892 easing: "ease", 3893 finite: false, 3894 velocity: 1, 3895 index: 0, 3896 prevIndex: -1, 3897 stack: [], 3898 percent: 0, 3899 clsActive: "bdt-active", 3900 clsActivated: "",
vendor: 30,807 bytes, lines 3901-4825
3901 clsEnter: "bdt-slide-enter", 3902 clsLeave: "bdt-slide-leave", 3903 clsSlideActive: "bdt-slide-active", 3904 Transitioner: false, 3905 transitionOptions: {} 3906 }), 3907 connected() { 3908 this.prevIndex = -1; 3909 this.index = this.getValidIndex(this.$props.index); 3910 this.stack = []; 3911 }, 3912 disconnected() { 3913 removeClass(this.slides, this.clsActive); 3914 }, 3915 computed: { 3916 duration: ({ velocity }, $el) => speedUp($el.offsetWidth / velocity), 3917 list: ({ selList }, $el) => $(selList, $el), 3918 maxIndex() { 3919 return this.length - 1; 3920 }, 3921 slides() { 3922 return children(this.list); 3923 }, 3924 length() { 3925 return this.slides.length; 3926 } 3927 }, 3928 watch: { 3929 slides(slides, prev) { 3930 if (prev) { 3931 this.$emit(); 3932 } 3933 } 3934 }, 3935 events: { 3936 itemshow({ target }) { 3937 addClass(target, this.clsEnter, this.clsSlideActive); 3938 }, 3939 itemshown({ target }) { 3940 removeClass(target, this.clsEnter); 3941 }, 3942 itemhide({ target }) { 3943 addClass(target, this.clsLeave); 3944 }, 3945 itemhidden({ target }) { 3946 removeClass(target, this.clsLeave, this.clsSlideActive); 3947 } 3948 }, 3949 methods: { 3950 show(index, force = false) { 3951 var _a; 3952 if (this.dragging || !this.length || this.parallax) { 3953 return; 3954 } 3955 const { stack } = this; 3956 const queueIndex = force ? 0 : stack.length; 3957 const reset = () => { 3958 stack.splice(queueIndex, 1); 3959 if (stack.length) { 3960 this.show(stack.shift(), true); 3961 } 3962 }; 3963 stack[force ? "unshift" : "push"](index); 3964 if (!force && stack.length > 1) { 3965 if (stack.length === 2) { 3966 (_a = this._transitioner) == null ? void 0 : _a.forward(Math.min(this.duration, 200)); 3967 } 3968 return; 3969 } 3970 const prevIndex = this.getIndex(this.index); 3971 const prev = hasClass(this.slides, this.clsActive) && this.slides[prevIndex]; 3972 const nextIndex = this.getIndex(index, this.index); 3973 const next = this.slides[nextIndex]; 3974 if (prev === next) { 3975 reset(); 3976 return; 3977 } 3978 this.dir = getDirection(index, prevIndex); 3979 this.prevIndex = prevIndex; 3980 this.index = nextIndex; 3981 if (prev && !trigger(prev, "beforeitemhide", [this]) || !trigger(next, "beforeitemshow", [this, prev])) { 3982 this.index = this.prevIndex; 3983 reset(); 3984 return; 3985 } 3986 const promise = this._show(prev, next, force).then(() => { 3987 prev && trigger(prev, "itemhidden", [this]); 3988 trigger(next, "itemshown", [this]); 3989 stack.shift(); 3990 this._transitioner = null; 3991 if (stack.length) { 3992 requestAnimationFrame(() => stack.length && this.show(stack.shift(), true)); 3993 } 3994 }); 3995 prev && trigger(prev, "itemhide", [this]); 3996 trigger(next, "itemshow", [this]); 3997 return promise; 3998 }, 3999 getIndex(index = this.index, prev = this.index) { 4000 return clamp( 4001 getIndex(index, this.slides, prev, this.finite), 4002 0, 4003 Math.max(0, this.maxIndex) 4004 ); 4005 }, 4006 getValidIndex(index = this.index, prevIndex = this.prevIndex) { 4007 return this.getIndex(index, prevIndex); 4008 }, 4009 async _show(prev, next, force) { 4010 this._transitioner = this._getTransitioner(prev, next, this.dir, { 4011 easing: force ? next.offsetWidth < 600 ? easeOutQuad : easeOutQuart : this.easing, 4012 ...this.transitionOptions 4013 }); 4014 if (!force && !prev) { 4015 this._translate(1); 4016 return; 4017 } 4018 const { length } = this.stack; 4019 return this._transitioner[length > 1 ? "forward" : "show"]( 4020 length > 1 ? Math.min(this.duration, 75 + 75 / (length - 1)) : this.duration, 4021 this.percent 4022 ); 4023 }, 4024 _translate(percent, prev = this.prevIndex, next = this.index) { 4025 const transitioner = this._getTransitioner(prev === next ? false : prev, next); 4026 transitioner.translate(percent); 4027 return transitioner; 4028 }, 4029 _getTransitioner(prev = this.prevIndex, next = this.index, dir = this.dir || 1, options = this.transitionOptions) { 4030 return new this.Transitioner( 4031 isNumber(prev) ? this.slides[prev] : prev, 4032 isNumber(next) ? this.slides[next] : next, 4033 dir * (isRtl ? -1 : 1), 4034 options 4035 ); 4036 } 4037 } 4038 }; 4039 function getDirection(index, prevIndex) { 4040 return index === "next" ? 1 : index === "previous" ? -1 : index < prevIndex ? -1 : 1; 4041 } 4042 function speedUp(x) { 4043 return 0.5 * x + 300; 4044 } 4045 4046 var Slideshow = { 4047 mixins: [Slider], 4048 props: { 4049 animation: String 4050 }, 4051 data: { 4052 animation: "slide", 4053 clsActivated: "bdt-transition-active", 4054 Animations: Animations$2, 4055 Transitioner: Transitioner$1 4056 }, 4057 computed: { 4058 animation({ animation, Animations: Animations2 }) { 4059 return { ...Animations2[animation] || Animations2.slide, name: animation }; 4060 }, 4061 transitionOptions() { 4062 return { animation: this.animation }; 4063 } 4064 }, 4065 observe: resize(), 4066 events: { 4067 beforeitemshow({ target }) { 4068 addClass(target, this.clsActive); 4069 }, 4070 itemshown({ target }) { 4071 addClass(target, this.clsActivated); 4072 }, 4073 itemhidden({ target }) { 4074 removeClass(target, this.clsActive, this.clsActivated); 4075 } 4076 } 4077 }; 4078 4079 var Animations$1 = { 4080 ...Animations$2, 4081 fade: { 4082 show() { 4083 return [{ opacity: 0 }, { opacity: 1 }]; 4084 }, 4085 percent(current) { 4086 return 1 - css(current, "opacity"); 4087 }, 4088 translate(percent) { 4089 return [{ opacity: 1 - percent }, { opacity: percent }]; 4090 } 4091 }, 4092 scale: { 4093 show() { 4094 return [ 4095 { opacity: 0, transform: scale3d(1 - 0.2) }, 4096 { opacity: 1, transform: scale3d(1) } 4097 ]; 4098 }, 4099 percent(current) { 4100 return 1 - css(current, "opacity"); 4101 }, 4102 translate(percent) { 4103 return [ 4104 { opacity: 1 - percent, transform: scale3d(1 - 0.2 * percent) }, 4105 { opacity: percent, transform: scale3d(1 - 0.2 + 0.2 * percent) } 4106 ]; 4107 } 4108 } 4109 }; 4110 4111 var LightboxPanel = { 4112 mixins: [Modal, Slideshow], 4113 functional: true, 4114 props: { 4115 delayControls: Number, 4116 preload: Number, 4117 videoAutoplay: Boolean, 4118 template: String 4119 }, 4120 data: () => ({ 4121 preload: 1, 4122 videoAutoplay: false, 4123 delayControls: 3e3, 4124 items: [], 4125 cls: "bdt-open", 4126 clsPage: "bdt-lightbox-page", 4127 selList: ".bdt-lightbox-items", 4128 attrItem: "bdt-lightbox-item", 4129 selClose: ".bdt-close-large", 4130 selCaption: ".bdt-lightbox-caption", 4131 pauseOnHover: false, 4132 velocity: 2, 4133 Animations: Animations$1, 4134 template: `<div class="bdt-lightbox bdt-overflow-hidden"> <div class="bdt-lightbox-items"></div> <div class="bdt-lightbox-toolbar bdt-position-top bdt-text-right bdt-transition-slide-top bdt-transition-opaque"> <button class="bdt-lightbox-toolbar-icon bdt-close-large" type="button" bdt-close></button> </div> <a class="bdt-lightbox-button bdt-position-center-left bdt-position-medium bdt-transition-fade" href bdt-slidenav-previous bdt-lightbox-item="previous"></a> <a class="bdt-lightbox-button bdt-position-center-right bdt-position-medium bdt-transition-fade" href bdt-slidenav-next bdt-lightbox-item="next"></a> <div class="bdt-lightbox-toolbar bdt-lightbox-caption bdt-position-bottom bdt-text-center bdt-transition-slide-bottom bdt-transition-opaque"></div> </div>` 4135 }), 4136 created() { 4137 const $el = $(this.template); 4138 const list = $(this.selList, $el); 4139 this.items.forEach(() => append(list, "<div>")); 4140 const close = $("[bdt-close]", $el); 4141 const closeLabel = this.t("close"); 4142 if (close && closeLabel) { 4143 close.dataset.i18n = JSON.stringify({ label: closeLabel }); 4144 } 4145 this.$mount(append(this.container, $el)); 4146 }, 4147 events: [ 4148 { 4149 name: `${pointerMove$1} ${pointerDown$1} keydown`, 4150 handler: "showControls" 4151 }, 4152 { 4153 name: "click", 4154 self: true, 4155 delegate: ({ selList }) => `${selList} > *`, 4156 handler(e) { 4157 if (!e.defaultPrevented) { 4158 this.hide(); 4159 } 4160 } 4161 }, 4162 { 4163 name: "shown", 4164 self: true, 4165 handler: "showControls" 4166 }, 4167 { 4168 name: "hide", 4169 self: true, 4170 handler() { 4171 this.hideControls(); 4172 removeClass(this.slides, this.clsActive); 4173 Transition.stop(this.slides); 4174 } 4175 }, 4176 { 4177 name: "hidden", 4178 self: true, 4179 handler() { 4180 this.$destroy(true); 4181 } 4182 }, 4183 { 4184 name: "keyup", 4185 el: () => document, 4186 handler({ keyCode }) { 4187 if (!this.isToggled(this.$el) || !this.draggable) { 4188 return; 4189 } 4190 let i = -1; 4191 if (keyCode === keyMap.LEFT) { 4192 i = "previous"; 4193 } else if (keyCode === keyMap.RIGHT) { 4194 i = "next"; 4195 } else if (keyCode === keyMap.HOME) { 4196 i = 0; 4197 } else if (keyCode === keyMap.END) { 4198 i = "last"; 4199 } 4200 if (~i) { 4201 this.show(i); 4202 } 4203 } 4204 }, 4205 { 4206 name: "beforeitemshow", 4207 handler(e) { 4208 if (this.isToggled()) { 4209 return; 4210 } 4211 this.draggable = false; 4212 e.preventDefault(); 4213 this.toggleElement(this.$el, true, false); 4214 this.animation = Animations$1["scale"]; 4215 removeClass(e.target, this.clsActive); 4216 this.stack.splice(1, 0, this.index); 4217 } 4218 }, 4219 { 4220 name: "itemshow", 4221 handler() { 4222 html($(this.selCaption, this.$el), this.getItem().caption || ""); 4223 for (let j = -this.preload; j <= this.preload; j++) { 4224 this.loadItem(this.index + j); 4225 } 4226 } 4227 }, 4228 { 4229 name: "itemshown", 4230 handler() { 4231 this.draggable = this.$props.draggable; 4232 } 4233 }, 4234 { 4235 name: "itemload", 4236 async handler(_, item) { 4237 const { source: src, type, alt = "", poster, attrs = {} } = item; 4238 this.setItem(item, "<span bdt-spinner></span>"); 4239 if (!src) { 4240 return; 4241 } 4242 let matches; 4243 const iframeAttrs = { 4244 allowfullscreen: "", 4245 style: "max-width: 100%; box-sizing: border-box;", 4246 "bdt-responsive": "", 4247 "bdt-video": `${this.videoAutoplay}` 4248 }; 4249 if (type === "image" || src.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|\?)/i)) { 4250 const img = createEl("img", { src, alt, ...attrs }); 4251 on(img, "load", () => this.setItem(item, img)); 4252 on(img, "error", () => this.setError(item)); 4253 } else if (type === "video" || src.match(/\.(mp4|webm|ogv)($|\?)/i)) { 4254 const video = createEl("video", { 4255 src, 4256 poster, 4257 controls: "", 4258 playsinline: "", 4259 "bdt-video": `${this.videoAutoplay}`, 4260 ...attrs 4261 }); 4262 on(video, "loadedmetadata", () => this.setItem(item, video)); 4263 on(video, "error", () => this.setError(item)); 4264 } else if (type === "iframe" || src.match(/\.(html|php)($|\?)/i)) { 4265 this.setItem( 4266 item, 4267 createEl("iframe", { 4268 src, 4269 allowfullscreen: "", 4270 class: "bdt-lightbox-iframe", 4271 ...attrs 4272 }) 4273 ); 4274 } else if (matches = src.match( 4275 /\/\/(?:.*?youtube(-nocookie)?\..*?(?:[?&]v=|\/shorts\/)|youtu\.be\/)([\w-]{11})[&?]?(.*)?/ 4276 )) { 4277 this.setItem( 4278 item, 4279 createEl("iframe", { 4280 src: `https://www.youtube${matches[1] || ""}.com/embed/${matches[2]}${matches[3] ? `?${matches[3]}` : ""}`, 4281 width: 1920, 4282 height: 1080, 4283 ...iframeAttrs, 4284 ...attrs 4285 }) 4286 ); 4287 } else if (matches = src.match(/\/\/.*?vimeo\.[a-z]+\/(\d+)[&?]?(.*)?/)) { 4288 try { 4289 const { height, width } = await (await fetch( 4290 `https://vimeo.com/api/oembed.json?maxwidth=1920&url=${encodeURI( 4291 src 4292 )}`, 4293 { credentials: "omit" } 4294 )).json(); 4295 this.setItem( 4296 item, 4297 createEl("iframe", { 4298 src: `https://player.vimeo.com/video/${matches[1]}${matches[2] ? `?${matches[2]}` : ""}`, 4299 width, 4300 height, 4301 ...iframeAttrs, 4302 ...attrs 4303 }) 4304 ); 4305 } catch (e) { 4306 this.setError(item); 4307 } 4308 } 4309 } 4310 } 4311 ], 4312 methods: { 4313 loadItem(index = this.index) { 4314 const item = this.getItem(index); 4315 if (!this.getSlide(item).childElementCount) { 4316 trigger(this.$el, "itemload", [item]); 4317 } 4318 }, 4319 getItem(index = this.index) { 4320 return this.items[getIndex(index, this.slides)]; 4321 }, 4322 setItem(item, content) { 4323 trigger(this.$el, "itemloaded", [this, html(this.getSlide(item), content)]); 4324 }, 4325 getSlide(item) { 4326 return this.slides[this.items.indexOf(item)]; 4327 }, 4328 setError(item) { 4329 this.setItem(item, '<span bdt-icon="icon: bolt; ratio: 2"></span>'); 4330 }, 4331 showControls() { 4332 clearTimeout(this.controlsTimer); 4333 this.controlsTimer = setTimeout(this.hideControls, this.delayControls); 4334 addClass(this.$el, "bdt-active", "bdt-transition-active"); 4335 }, 4336 hideControls() { 4337 removeClass(this.$el, "bdt-active", "bdt-transition-active"); 4338 } 4339 } 4340 }; 4341 function createEl(tag, attrs) { 4342 const el = fragment(`<${tag}>`); 4343 attr(el, attrs); 4344 return el; 4345 } 4346 4347 var lightbox = { 4348 install: install$3, 4349 props: { toggle: String }, 4350 data: { toggle: "a" }, 4351 computed: { 4352 toggles: ({ toggle }, $el) => $$(toggle, $el) 4353 }, 4354 watch: { 4355 toggles(toggles) { 4356 this.hide(); 4357 for (const toggle of toggles) { 4358 if (isTag(toggle, "a")) { 4359 attr(toggle, "role", "button"); 4360 } 4361 } 4362 } 4363 }, 4364 disconnected() { 4365 this.hide(); 4366 }, 4367 events: { 4368 name: "click", 4369 delegate: ({ toggle }) => `${toggle}:not(.bdt-disabled)`, 4370 handler(e) { 4371 if (!e.defaultPrevented) { 4372 e.preventDefault(); 4373 this.show(e.current); 4374 } 4375 } 4376 }, 4377 methods: { 4378 show(index) { 4379 const items = uniqueBy(this.toggles.map(toItem), "source"); 4380 if (isElement(index)) { 4381 const { source } = toItem(index); 4382 index = findIndex(items, ({ source: src }) => source === src); 4383 } 4384 this.panel = this.panel || this.$create("lightboxPanel", { ...this.$props, items }); 4385 on(this.panel.$el, "hidden", () => this.panel = null); 4386 return this.panel.show(index); 4387 }, 4388 hide() { 4389 var _a; 4390 return (_a = this.panel) == null ? void 0 : _a.hide(); 4391 } 4392 } 4393 }; 4394 function install$3(bdtUIkit, Lightbox) { 4395 if (!bdtUIkit.lightboxPanel) { 4396 bdtUIkit.component("lightboxPanel", LightboxPanel); 4397 } 4398 assign(Lightbox.props, bdtUIkit.component("lightboxPanel").options.props); 4399 } 4400 function toItem(el) { 4401 const item = {}; 4402 for (const attr2 of ["href", "caption", "type", "poster", "alt", "attrs"]) { 4403 item[attr2 === "href" ? "source" : attr2] = data(el, attr2); 4404 } 4405 item.attrs = parseOptions(item.attrs); 4406 return item; 4407 } 4408 4409 var notification = { 4410 mixins: [Container], 4411 functional: true, 4412 args: ["message", "status"], 4413 data: { 4414 message: "", 4415 status: "", 4416 timeout: 5e3, 4417 group: "", 4418 pos: "top-center", 4419 clsContainer: "bdt-notification", 4420 clsClose: "bdt-notification-close", 4421 clsMsg: "bdt-notification-message" 4422 }, 4423 install: install$2, 4424 computed: { 4425 marginProp: ({ pos }) => `margin-${pos.match(/[a-z]+(?=-)/)[0]}`, 4426 startProps() { 4427 return { opacity: 0, [this.marginProp]: -this.$el.offsetHeight }; 4428 } 4429 }, 4430 created() { 4431 const posClass = `${this.clsContainer}-${this.pos}`; 4432 const containerAttr = `data-${this.clsContainer}-container`; 4433 const container = $(`.${posClass}[${containerAttr}]`, this.container) || append( 4434 this.container, 4435 `<div class="${this.clsContainer} ${posClass}" ${containerAttr}></div>` 4436 ); 4437 this.$mount( 4438 append( 4439 container, 4440 `<div class="${this.clsMsg}${this.status ? ` ${this.clsMsg}-${this.status}` : ""}" role="alert"> <a href class="${this.clsClose}" data-bdt-close></a> <div>${this.message}</div> </div>` 4441 ) 4442 ); 4443 }, 4444 async connected() { 4445 const margin = toFloat(css(this.$el, this.marginProp)); 4446 await Transition.start(css(this.$el, this.startProps), { 4447 opacity: 1, 4448 [this.marginProp]: margin 4449 }); 4450 if (this.timeout) { 4451 this.timer = setTimeout(this.close, this.timeout); 4452 } 4453 }, 4454 events: { 4455 click(e) { 4456 if (e.target.closest('a[href="#"],a[href=""]')) { 4457 e.preventDefault(); 4458 } 4459 this.close(); 4460 }, 4461 [pointerEnter]() { 4462 if (this.timer) { 4463 clearTimeout(this.timer); 4464 } 4465 }, 4466 [pointerLeave]() { 4467 if (this.timeout) { 4468 this.timer = setTimeout(this.close, this.timeout); 4469 } 4470 } 4471 }, 4472 methods: { 4473 async close(immediate) { 4474 const removeFn = (el) => { 4475 const container = parent(el); 4476 trigger(el, "close", [this]); 4477 remove$1(el); 4478 if (!(container == null ? void 0 : container.hasChildNodes())) { 4479 remove$1(container); 4480 } 4481 }; 4482 if (this.timer) { 4483 clearTimeout(this.timer); 4484 } 4485 if (!immediate) { 4486 await Transition.start(this.$el, this.startProps); 4487 } 4488 removeFn(this.$el); 4489 } 4490 } 4491 }; 4492 function install$2(bdtUIkit) { 4493 bdtUIkit.notification.closeAll = function(group, immediate) { 4494 apply(document.body, (el) => { 4495 const notification = bdtUIkit.getComponent(el, "notification"); 4496 if (notification && (!group || group === notification.group)) { 4497 notification.close(immediate); 4498 } 4499 }); 4500 }; 4501 } 4502 4503 var Media = { 4504 props: { 4505 media: Boolean 4506 }, 4507 data: { 4508 media: false 4509 }, 4510 connected() { 4511 const media = toMedia(this.media, this.$el); 4512 this.matchMedia = true; 4513 if (media) { 4514 this.mediaObj = window.matchMedia(media); 4515 const handler = () => { 4516 this.matchMedia = this.mediaObj.matches; 4517 trigger(this.$el, createEvent("mediachange", false, true, [this.mediaObj])); 4518 }; 4519 this.offMediaObj = on(this.mediaObj, "change", () => { 4520 handler(); 4521 this.$emit("resize"); 4522 }); 4523 handler(); 4524 } 4525 }, 4526 disconnected() { 4527 var _a; 4528 (_a = this.offMediaObj) == null ? void 0 : _a.call(this); 4529 } 4530 }; 4531 function toMedia(value, element) { 4532 if (isString(value)) { 4533 if (startsWith(value, "@")) { 4534 value = toFloat(css(element, `--bdt-breakpoint-${value.slice(1)}`)); 4535 } else if (isNaN(value)) { 4536 return value; 4537 } 4538 } 4539 return value && isNumeric(value) ? `(min-width: ${value}px)` : ""; 4540 } 4541 4542 function getMaxPathLength(el) { 4543 return isVisible(el) ? Math.ceil( 4544 Math.max(0, ...$$("[stroke]", el).map((stroke) => { 4545 var _a; 4546 return ((_a = stroke.getTotalLength) == null ? void 0 : _a.call(stroke)) || 0; 4547 })) 4548 ) : 0; 4549 } 4550 4551 const props = { 4552 x: transformFn, 4553 y: transformFn, 4554 rotate: transformFn, 4555 scale: transformFn, 4556 color: colorFn, 4557 backgroundColor: colorFn, 4558 borderColor: colorFn, 4559 blur: filterFn, 4560 hue: filterFn, 4561 fopacity: filterFn, 4562 grayscale: filterFn, 4563 invert: filterFn, 4564 saturate: filterFn, 4565 sepia: filterFn, 4566 opacity: cssPropFn, 4567 stroke: strokeFn, 4568 bgx: backgroundFn, 4569 bgy: backgroundFn 4570 }; 4571 const { keys } = Object; 4572 var Parallax = { 4573 mixins: [Media], 4574 props: fillObject(keys(props), "list"), 4575 data: fillObject(keys(props), void 0), 4576 computed: { 4577 props(properties, $el) { 4578 const stops = {}; 4579 for (const prop in properties) { 4580 if (prop in props && !isUndefined(properties[prop])) { 4581 stops[prop] = properties[prop].slice(); 4582 } 4583 } 4584 const result = {}; 4585 for (const prop in stops) { 4586 result[prop] = props[prop](prop, $el, stops[prop], stops); 4587 } 4588 return result; 4589 } 4590 }, 4591 events: { 4592 load() { 4593 this.$emit(); 4594 } 4595 }, 4596 methods: { 4597 reset() { 4598 for (const prop in this.getCss(0)) { 4599 css(this.$el, prop, ""); 4600 } 4601 }, 4602 getCss(percent) { 4603 const css2 = {}; 4604 for (const prop in this.props) { 4605 this.props[prop](css2, clamp(percent)); 4606 } 4607 css2.willChange = Object.keys(css2).map(propName).join(","); 4608 return css2; 4609 } 4610 } 4611 }; 4612 function transformFn(prop, el, stops) { 4613 let unit = getUnit(stops) || { x: "px", y: "px", rotate: "deg" }[prop] || ""; 4614 let transformFn2; 4615 if (prop === "x" || prop === "y") { 4616 prop = `translate${ucfirst(prop)}`; 4617 transformFn2 = (stop) => toFloat(toFloat(stop).toFixed(unit === "px" ? 0 : 6)); 4618 } else if (prop === "scale") { 4619 unit = ""; 4620 transformFn2 = (stop) => { 4621 var _a; 4622 return getUnit([stop]) ? toPx(stop, "width", el, true) / el[`offset${((_a = stop.endsWith) == null ? void 0 : _a.call(stop, "vh")) ? "Height" : "Width"}`] : toFloat(stop); 4623 }; 4624 } 4625 if (stops.length === 1) { 4626 stops.unshift(prop === "scale" ? 1 : 0); 4627 } 4628 stops = parseStops(stops, transformFn2); 4629 return (css2, percent) => { 4630 css2.transform = `${css2.transform || ""} ${prop}(${getValue(stops, percent)}${unit})`; 4631 }; 4632 } 4633 function colorFn(prop, el, stops) { 4634 if (stops.length === 1) { 4635 stops.unshift(getCssValue(el, prop, "")); 4636 } 4637 stops = parseStops(stops, (stop) => parseColor(el, stop)); 4638 return (css2, percent) => { 4639 const [start, end, p] = getStop(stops, percent); 4640 const value = start.map((value2, i) => { 4641 value2 += p * (end[i] - value2); 4642 return i === 3 ? toFloat(value2) : parseInt(value2, 10); 4643 }).join(","); 4644 css2[prop] = `rgba(${value})`; 4645 }; 4646 } 4647 function parseColor(el, color) { 4648 return getCssValue(el, "color", color).split(/[(),]/g).slice(1, -1).concat(1).slice(0, 4).map(toFloat); 4649 } 4650 function filterFn(prop, el, stops) { 4651 if (stops.length === 1) { 4652 stops.unshift(0); 4653 } 4654 const unit = getUnit(stops) || { blur: "px", hue: "deg" }[prop] || "%"; 4655 prop = { fopacity: "opacity", hue: "hue-rotate" }[prop] || prop; 4656 stops = parseStops(stops); 4657 return (css2, percent) => { 4658 const value = getValue(stops, percent); 4659 css2.filter = `${css2.filter || ""} ${prop}(${value + unit})`; 4660 }; 4661 } 4662 function cssPropFn(prop, el, stops) { 4663 if (stops.length === 1) { 4664 stops.unshift(getCssValue(el, prop, "")); 4665 } 4666 stops = parseStops(stops); 4667 return (css2, percent) => { 4668 css2[prop] = getValue(stops, percent); 4669 }; 4670 } 4671 function strokeFn(prop, el, stops) { 4672 if (stops.length === 1) { 4673 stops.unshift(0); 4674 } 4675 const unit = getUnit(stops); 4676 const length = getMaxPathLength(el); 4677 stops = parseStops(stops.reverse(), (stop) => { 4678 stop = toFloat(stop); 4679 return unit === "%" ? stop * length / 100 : stop; 4680 }); 4681 if (!stops.some(([value]) => value)) { 4682 return noop; 4683 } 4684 css(el, "strokeDasharray", length); 4685 return (css2, percent) => { 4686 css2.strokeDashoffset = getValue(stops, percent); 4687 }; 4688 } 4689 function backgroundFn(prop, el, stops, props2) { 4690 if (stops.length === 1) { 4691 stops.unshift(0); 4692 } 4693 const attr = prop === "bgy" ? "height" : "width"; 4694 props2[prop] = parseStops(stops, (stop) => toPx(stop, attr, el)); 4695 const bgProps = ["bgx", "bgy"].filter((prop2) => prop2 in props2); 4696 if (bgProps.length === 2 && prop === "bgx") { 4697 return noop; 4698 } 4699 if (getCssValue(el, "backgroundSize", "") === "cover") { 4700 return backgroundCoverFn(prop, el, stops, props2); 4701 } 4702 const positions = {}; 4703 for (const prop2 of bgProps) { 4704 positions[prop2] = getBackgroundPos(el, prop2); 4705 } 4706 return setBackgroundPosFn(bgProps, positions, props2); 4707 } 4708 function backgroundCoverFn(prop, el, stops, props2) { 4709 const dimImage = getBackgroundImageDimensions(el); 4710 if (!dimImage.width) { 4711 return noop; 4712 } 4713 const dimEl = { 4714 width: el.offsetWidth, 4715 height: el.offsetHeight 4716 }; 4717 const bgProps = ["bgx", "bgy"].filter((prop2) => prop2 in props2); 4718 const positions = {}; 4719 for (const prop2 of bgProps) { 4720 const values = props2[prop2].map(([value]) => value); 4721 const min = Math.min(...values); 4722 const max = Math.max(...values); 4723 const down = values.indexOf(min) < values.indexOf(max); 4724 const diff = max - min; 4725 positions[prop2] = `${(down ? -diff : 0) - (down ? min : max)}px`; 4726 dimEl[prop2 === "bgy" ? "height" : "width"] += diff; 4727 } 4728 const dim = Dimensions.cover(dimImage, dimEl); 4729 for (const prop2 of bgProps) { 4730 const attr = prop2 === "bgy" ? "height" : "width"; 4731 const overflow = dim[attr] - dimEl[attr]; 4732 positions[prop2] = `max(${getBackgroundPos(el, prop2)},-${overflow}px) + ${positions[prop2]}`; 4733 } 4734 const fn = setBackgroundPosFn(bgProps, positions, props2); 4735 return (css2, percent) => { 4736 fn(css2, percent); 4737 css2.backgroundSize = `${dim.width}px ${dim.height}px`; 4738 css2.backgroundRepeat = "no-repeat"; 4739 }; 4740 } 4741 function getBackgroundPos(el, prop) { 4742 return getCssValue(el, `background-position-${prop.slice(-1)}`, ""); 4743 } 4744 function setBackgroundPosFn(bgProps, positions, props2) { 4745 return function(css2, percent) { 4746 for (const prop of bgProps) { 4747 const value = getValue(props2[prop], percent); 4748 css2[`background-position-${prop.slice(-1)}`] = `calc(${positions[prop]} + ${value}px)`; 4749 } 4750 }; 4751 } 4752 const loading = {}; 4753 const dimensions = {}; 4754 function getBackgroundImageDimensions(el) { 4755 const src = css(el, "backgroundImage").replace(/^none|url\(["']?(.+?)["']?\)$/, "$1"); 4756 if (dimensions[src]) { 4757 return dimensions[src]; 4758 } 4759 const image = new Image(); 4760 if (src) { 4761 image.src = src; 4762 if (!image.naturalWidth && !loading[src]) { 4763 once(image, "error load", () => { 4764 dimensions[src] = toDimensions(image); 4765 trigger(el, createEvent("load", false)); 4766 }); 4767 loading[src] = true; 4768 return toDimensions(image); 4769 } 4770 } 4771 return dimensions[src] = toDimensions(image); 4772 } 4773 function toDimensions(image) { 4774 return { 4775 width: image.naturalWidth, 4776 height: image.naturalHeight 4777 }; 4778 } 4779 function parseStops(stops, fn = toFloat) { 4780 const result = []; 4781 const { length } = stops; 4782 let nullIndex = 0; 4783 for (let i = 0; i < length; i++) { 4784 let [value, percent] = isString(stops[i]) ? stops[i].trim().split(/ (?![^(]*\))/) : [stops[i]]; 4785 value = fn(value); 4786 percent = percent ? toFloat(percent) / 100 : null; 4787 if (i === 0) { 4788 if (percent === null) { 4789 percent = 0; 4790 } else if (percent) { 4791 result.push([value, 0]); 4792 } 4793 } else if (i === length - 1) { 4794 if (percent === null) { 4795 percent = 1; 4796 } else if (percent !== 1) { 4797 result.push([value, percent]); 4798 percent = 1; 4799 } 4800 } 4801 result.push([value, percent]); 4802 if (percent === null) { 4803 nullIndex++; 4804 } else if (nullIndex) { 4805 const leftPercent = result[i - nullIndex - 1][1]; 4806 const p = (percent - leftPercent) / (nullIndex + 1); 4807 for (let j = nullIndex; j > 0; j--) { 4808 result[i - j][1] = leftPercent + p * (nullIndex - j + 1); 4809 } 4810 nullIndex = 0; 4811 } 4812 } 4813 return result; 4814 } 4815 function getStop(stops, percent) { 4816 const index = findIndex(stops.slice(1), ([, targetPercent]) => percent <= targetPercent) + 1; 4817 return [ 4818 stops[index - 1][0], 4819 stops[index][0], 4820 (percent - stops[index - 1][1]) / (stops[index][1] - stops[index - 1][1]) 4821 ]; 4822 } 4823 function getValue(stops, percent) { 4824 const [start, end, p] = getStop(stops, percent); 4825 return start + Math.abs(start - end) * p * (start < end ? 1 : -1)
vendor: 8,619 bytes, lines 4825-5104
4825; 4826 } 4827 const unitRe = /^-?\d+(?:\.\d+)?(\S+)?/; 4828 function getUnit(stops, defaultUnit) { 4829 var _a; 4830 for (const stop of stops) { 4831 const match = (_a = stop.match) == null ? void 0 : _a.call(stop, unitRe); 4832 if (match) { 4833 return match[1]; 4834 } 4835 } 4836 return defaultUnit; 4837 } 4838 function getCssValue(el, prop, value) { 4839 const prev = el.style[prop]; 4840 const val = css(css(el, prop, value), prop); 4841 el.style[prop] = prev; 4842 return val; 4843 } 4844 function fillObject(keys2, value) { 4845 return keys2.reduce((data, prop) => { 4846 data[prop] = value; 4847 return data; 4848 }, {}); 4849 } 4850 function ease(percent, easing) { 4851 return easing >= 0 ? Math.pow(percent, easing + 1) : 1 - Math.pow(1 - percent, 1 - easing); 4852 } 4853 4854 var parallax = { 4855 mixins: [Parallax], 4856 props: { 4857 target: String, 4858 viewport: Number, 4859 // Deprecated 4860 easing: Number, 4861 start: String, 4862 end: String 4863 }, 4864 data: { 4865 target: false, 4866 viewport: 1, 4867 easing: 1, 4868 start: 0, 4869 end: 0 4870 }, 4871 computed: { 4872 target: ({ target }, $el) => getOffsetElement(target && query(target, $el) || $el), 4873 start({ start }) { 4874 return toPx(start, "height", this.target, true); 4875 }, 4876 end({ end, viewport: viewport2 }) { 4877 return toPx( 4878 end || (viewport2 = (1 - viewport2) * 100) && `${viewport2}vh+${viewport2}%`, 4879 "height", 4880 this.target, 4881 true 4882 ); 4883 } 4884 }, 4885 observe: [ 4886 viewport(), 4887 scroll$1({ target: ({ target }) => target }), 4888 resize({ target: ({ $el, target }) => [$el, target, scrollParent(target, true)] }) 4889 ], 4890 update: { 4891 read({ percent }, types) { 4892 if (!types.has("scroll")) { 4893 percent = false; 4894 } 4895 if (!isVisible(this.$el)) { 4896 return false; 4897 } 4898 if (!this.matchMedia) { 4899 return; 4900 } 4901 const prev = percent; 4902 percent = ease(scrolledOver(this.target, this.start, this.end), this.easing); 4903 return { 4904 percent, 4905 style: prev === percent ? false : this.getCss(percent) 4906 }; 4907 }, 4908 write({ style }) { 4909 if (!this.matchMedia) { 4910 this.reset(); 4911 return; 4912 } 4913 style && css(this.$el, style); 4914 }, 4915 events: ["scroll", "resize"] 4916 } 4917 }; 4918 function getOffsetElement(el) { 4919 return el ? "offsetTop" in el ? el : getOffsetElement(parent(el)) : document.documentElement; 4920 } 4921 4922 var SliderParallax = { 4923 props: { 4924 parallax: Boolean, 4925 parallaxTarget: Boolean, 4926 parallaxStart: String, 4927 parallaxEnd: String, 4928 parallaxEasing: Number 4929 }, 4930 data: { 4931 parallax: false, 4932 parallaxTarget: false, 4933 parallaxStart: 0, 4934 parallaxEnd: 0, 4935 parallaxEasing: 0 4936 }, 4937 observe: [ 4938 resize({ 4939 target: ({ $el, parallaxTarget }) => [$el, parallaxTarget], 4940 filter: ({ parallax }) => parallax 4941 }), 4942 scroll$1({ filter: ({ parallax }) => parallax }) 4943 ], 4944 computed: { 4945 parallaxTarget({ parallaxTarget }, $el) { 4946 return parallaxTarget && query(parallaxTarget, $el) || this.list; 4947 } 4948 }, 4949 update: { 4950 read() { 4951 if (!this.parallax) { 4952 return false; 4953 } 4954 const target = this.parallaxTarget; 4955 if (!target) { 4956 return false; 4957 } 4958 const start = toPx(this.parallaxStart, "height", target, true); 4959 const end = toPx(this.parallaxEnd, "height", target, true); 4960 const percent = ease(scrolledOver(target, start, end), this.parallaxEasing); 4961 return { parallax: this.getIndexAt(percent) }; 4962 }, 4963 write({ parallax }) { 4964 const [prevIndex, slidePercent] = parallax; 4965 const nextIndex = this.getValidIndex(prevIndex + Math.ceil(slidePercent)); 4966 const prev = this.slides[prevIndex]; 4967 const next = this.slides[nextIndex]; 4968 const { triggerShow, triggerShown, triggerHide, triggerHidden } = useTriggers(this); 4969 if (~this.prevIndex) { 4970 for (const i of /* @__PURE__ */ new Set([this.index, this.prevIndex])) { 4971 if (!includes([nextIndex, prevIndex], i)) { 4972 triggerHide(this.slides[i]); 4973 triggerHidden(this.slides[i]); 4974 } 4975 } 4976 } 4977 const changed = this.prevIndex !== prevIndex || this.index !== nextIndex; 4978 this.dir = 1; 4979 this.prevIndex = prevIndex; 4980 this.index = nextIndex; 4981 if (prev !== next) { 4982 triggerHide(prev); 4983 } 4984 triggerShow(next); 4985 if (changed) { 4986 triggerShown(prev); 4987 } 4988 this._translate(prev === next ? 1 : slidePercent, prev, next); 4989 }, 4990 events: ["scroll", "resize"] 4991 }, 4992 methods: { 4993 getIndexAt(percent) { 4994 const index = percent * (this.length - 1); 4995 return [Math.floor(index), index % 1]; 4996 } 4997 } 4998 }; 4999 function useTriggers(cmp) { 5000 const { clsSlideActive, clsEnter, clsLeave } = cmp; 5001 return { triggerShow, triggerShown, triggerHide, triggerHidden }; 5002 function triggerShow(el) { 5003 if (hasClass(el, clsLeave)) { 5004 triggerHide(el); 5005 triggerHidden(el); 5006 } 5007 if (!hasClass(el, clsSlideActive)) { 5008 trigger(el, "beforeitemshow", [cmp]); 5009 trigger(el, "itemshow", [cmp]); 5010 } 5011 } 5012 function triggerShown(el) { 5013 if (hasClass(el, clsEnter)) { 5014 trigger(el, "itemshown", [cmp]); 5015 } 5016 } 5017 function triggerHide(el) { 5018 if (!hasClass(el, clsSlideActive)) { 5019 triggerShow(el); 5020 } 5021 if (hasClass(el, clsEnter)) { 5022 triggerShown(el); 5023 } 5024 if (!hasClass(el, clsLeave)) { 5025 trigger(el, "beforeitemhide", [cmp]); 5026 trigger(el, "itemhide", [cmp]); 5027 } 5028 } 5029 function triggerHidden(el) { 5030 if (hasClass(el, clsLeave)) { 5031 trigger(el, "itemhidden", [cmp]); 5032 } 5033 } 5034 } 5035 5036 var SliderReactive = { 5037 update: { 5038 write() { 5039 if (this.stack.length || this.dragging || this.parallax) { 5040 return; 5041 } 5042 const index = this.getValidIndex(); 5043 if (!~this.prevIndex || this.index !== index) { 5044 this.show(index); 5045 } else { 5046 this._translate(1); 5047 } 5048 }, 5049 events: ["resize"] 5050 } 5051 }; 5052 5053 var SliderPreload = { 5054 observe: lazyload({ 5055 target: ({ slides }) => slides, 5056 targets: (instance) => instance.getAdjacentSlides() 5057 }), 5058 methods: { 5059 getAdjacentSlides() { 5060 return [1, -1].map((i) => this.slides[this.getIndex(this.index + i)]); 5061 } 5062 } 5063 }; 5064 5065 function Transitioner(prev, next, dir, { center, easing, list }) { 5066 const from = prev ? getLeft(prev, list, center) : getLeft(next, list, center) + dimensions$1(next).width * dir; 5067 const to = next ? getLeft(next, list, center) : from + dimensions$1(prev).width * dir * (isRtl ? -1 : 1); 5068 const { promise, resolve } = withResolvers(); 5069 return { 5070 dir, 5071 show(duration, percent = 0, linear) { 5072 const timing = linear ? "linear" : easing; 5073 duration -= Math.round(duration * clamp(percent, -1, 1)); 5074 css(list, "transitionProperty", "none"); 5075 this.translate(percent); 5076 css(list, "transitionProperty", ""); 5077 percent = prev ? percent : clamp(percent, 0, 1); 5078 triggerUpdate(this.getItemIn(), "itemin", { percent, duration, timing, dir }); 5079 prev && triggerUpdate(this.getItemIn(true), "itemout", { 5080 percent: 1 - percent, 5081 duration, 5082 timing, 5083 dir 5084 }); 5085 Transition.start( 5086 list, 5087 { transform: translate(-to * (isRtl ? -1 : 1), "px") }, 5088 duration, 5089 timing 5090 ).then(resolve, noop); 5091 return promise; 5092 }, 5093 cancel() { 5094 return Transition.cancel(list); 5095 }, 5096 reset() { 5097 css(list, "transform", ""); 5098 }, 5099 async forward(duration, percent = this.percent()) { 5100 await this.cancel(); 5101 return this.show(duration, percent, true); 5102 }, 5103 translate(percent) { 5104 if (percent
vendor: 59,114 bytes, lines 5104-6943
5104=== this.percent()) { 5105 return; 5106 } 5107 const distance = this.getDistance() * dir * (isRtl ? -1 : 1); 5108 css( 5109 list, 5110 "transform", 5111 translate( 5112 clamp( 5113 -to + (distance - distance * percent), 5114 -getWidth(list), 5115 dimensions$1(list).width 5116 ) * (isRtl ? -1 : 1), 5117 "px" 5118 ) 5119 ); 5120 const actives = this.getActives(); 5121 const itemIn = this.getItemIn(); 5122 const itemOut = this.getItemIn(true); 5123 percent = prev ? clamp(percent, -1, 1) : 0; 5124 for (const slide of children(list)) { 5125 const isActive = includes(actives, slide); 5126 const isIn = slide === itemIn; 5127 const isOut = slide === itemOut; 5128 const translateIn = isIn || !isOut && (isActive || dir * (isRtl ? -1 : 1) === -1 ^ getElLeft(slide, list) > getElLeft(prev || next)); 5129 triggerUpdate(slide, `itemtranslate${translateIn ? "in" : "out"}`, { 5130 dir, 5131 percent: isOut ? 1 - percent : isIn ? percent : isActive ? 1 : 0 5132 }); 5133 } 5134 }, 5135 percent() { 5136 return Math.abs( 5137 (new DOMMatrix(css(list, "transform")).m41 * (isRtl ? -1 : 1) + from) / (to - from) 5138 ); 5139 }, 5140 getDistance() { 5141 return Math.abs(to - from); 5142 }, 5143 getItemIn(out = false) { 5144 let actives = this.getActives(); 5145 let nextActives = inView(list, getLeft(next || prev, list, center)); 5146 if (out) { 5147 const temp = actives; 5148 actives = nextActives; 5149 nextActives = temp; 5150 } 5151 return nextActives[findIndex(nextActives, (el) => !includes(actives, el))]; 5152 }, 5153 getActives() { 5154 return inView(list, getLeft(prev || next, list, center)); 5155 } 5156 }; 5157 } 5158 function getLeft(el, list, center) { 5159 const left = getElLeft(el, list); 5160 return center ? left - centerEl(el, list) : Math.min(left, getMax(list)); 5161 } 5162 function getMax(list) { 5163 return Math.max(0, getWidth(list) - dimensions$1(list).width); 5164 } 5165 function getWidth(list, index) { 5166 return sumBy(children(list).slice(0, index), (el) => dimensions$1(el).width); 5167 } 5168 function centerEl(el, list) { 5169 return dimensions$1(list).width / 2 - dimensions$1(el).width / 2; 5170 } 5171 function getElLeft(el, list) { 5172 return el && (position(el).left + (isRtl ? dimensions$1(el).width - dimensions$1(list).width : 0)) * (isRtl ? -1 : 1) || 0; 5173 } 5174 function inView(list, listLeft) { 5175 listLeft -= 1; 5176 const listWidth = dimensions$1(list).width; 5177 const listRight = listLeft + listWidth + 2; 5178 return children(list).filter((slide) => { 5179 const slideLeft = getElLeft(slide, list); 5180 const slideRight = slideLeft + Math.min(dimensions$1(slide).width, listWidth); 5181 return slideLeft >= listLeft && slideRight <= listRight; 5182 }); 5183 } 5184 5185 var slider = { 5186 mixins: [Class, Slider, SliderReactive, SliderParallax, SliderPreload], 5187 props: { 5188 center: Boolean, 5189 sets: Boolean, 5190 active: String 5191 }, 5192 data: { 5193 center: false, 5194 sets: false, 5195 attrItem: "bdt-slider-item", 5196 selList: ".bdt-slider-items", 5197 selNav: ".bdt-slider-nav", 5198 clsContainer: "bdt-slider-container", 5199 active: "all", 5200 Transitioner 5201 }, 5202 computed: { 5203 finite({ finite }) { 5204 return finite || isFinite(this.list, this.center); 5205 }, 5206 maxIndex() { 5207 if (!this.finite || this.center && !this.sets) { 5208 return this.length - 1; 5209 } 5210 if (this.center) { 5211 return last(this.sets); 5212 } 5213 let lft = 0; 5214 const max = getMax(this.list); 5215 const index = findIndex(this.slides, (el) => { 5216 if (lft >= max) { 5217 return true; 5218 } 5219 lft += dimensions$1(el).width; 5220 }); 5221 return ~index ? index : this.length - 1; 5222 }, 5223 sets({ sets: enabled }) { 5224 if (!enabled || this.parallax) { 5225 return; 5226 } 5227 let left = 0; 5228 const sets = []; 5229 const width = dimensions$1(this.list).width; 5230 for (let i = 0; i < this.length; i++) { 5231 const slideWidth = dimensions$1(this.slides[i]).width; 5232 if (left + slideWidth > width) { 5233 left = 0; 5234 } 5235 if (this.center) { 5236 if (left < width / 2 && left + slideWidth + dimensions$1(this.slides[getIndex(i + 1, this.slides)]).width / 2 > width / 2) { 5237 sets.push(i); 5238 left = width / 2 - slideWidth / 2; 5239 } 5240 } else if (left === 0) { 5241 sets.push(Math.min(i, this.maxIndex)); 5242 } 5243 left += slideWidth; 5244 } 5245 if (sets.length) { 5246 return sets; 5247 } 5248 }, 5249 transitionOptions() { 5250 return { 5251 center: this.center, 5252 list: this.list 5253 }; 5254 }, 5255 slides() { 5256 return children(this.list).filter(isVisible); 5257 } 5258 }, 5259 connected() { 5260 toggleClass(this.$el, this.clsContainer, !$(`.${this.clsContainer}`, this.$el)); 5261 }, 5262 observe: resize({ 5263 target: ({ slides, $el }) => [$el, ...slides] 5264 }), 5265 update: { 5266 write() { 5267 for (const el of this.navItems) { 5268 const index = toNumber(data(el, this.attrItem)); 5269 if (index !== false) { 5270 el.hidden = !this.maxIndex || index > this.maxIndex || this.sets && !includes(this.sets, index); 5271 } 5272 } 5273 this.reorder(); 5274 if (!this.parallax) { 5275 this._translate(1); 5276 } 5277 this.updateActiveClasses(); 5278 }, 5279 events: ["resize"] 5280 }, 5281 events: { 5282 beforeitemshow(e) { 5283 if (!this.dragging && this.sets && this.stack.length < 2 && !includes(this.sets, this.index)) { 5284 this.index = this.getValidIndex(); 5285 } 5286 const diff = Math.abs( 5287 this.index - this.prevIndex + (this.dir > 0 && this.index < this.prevIndex || this.dir < 0 && this.index > this.prevIndex ? (this.maxIndex + 1) * this.dir : 0) 5288 ); 5289 if (!this.dragging && diff > 1) { 5290 for (let i = 0; i < diff; i++) { 5291 this.stack.splice(1, 0, this.dir > 0 ? "next" : "previous"); 5292 } 5293 e.preventDefault(); 5294 return; 5295 } 5296 const index = this.dir < 0 || !this.slides[this.prevIndex] ? this.index : this.prevIndex; 5297 const avgWidth = getWidth(this.list) / this.length; 5298 this.duration = speedUp(avgWidth / this.velocity) * (dimensions$1(this.slides[index]).width / avgWidth); 5299 this.reorder(); 5300 }, 5301 itemshow() { 5302 if (~this.prevIndex) { 5303 addClass(this._getTransitioner().getItemIn(), this.clsActive); 5304 } 5305 this.updateActiveClasses(this.prevIndex); 5306 }, 5307 itemshown() { 5308 this.updateActiveClasses(); 5309 } 5310 }, 5311 methods: { 5312 reorder() { 5313 if (this.finite) { 5314 css(this.slides, "order", ""); 5315 return; 5316 } 5317 const index = this.dir > 0 && this.slides[this.prevIndex] ? this.prevIndex : this.index; 5318 this.slides.forEach( 5319 (slide, i) => css( 5320 slide, 5321 "order", 5322 this.dir > 0 && i < index ? 1 : this.dir < 0 && i >= this.index ? -1 : "" 5323 ) 5324 ); 5325 if (!this.center || !this.length) { 5326 return; 5327 } 5328 const next = this.slides[index]; 5329 let width = dimensions$1(this.list).width / 2 - dimensions$1(next).width / 2; 5330 let j = 0; 5331 while (width > 0) { 5332 const slideIndex = this.getIndex(--j + index, index); 5333 const slide = this.slides[slideIndex]; 5334 css(slide, "order", slideIndex > index ? -2 : -1); 5335 width -= dimensions$1(slide).width; 5336 } 5337 }, 5338 updateActiveClasses(currentIndex = this.index) { 5339 let actives = this._getTransitioner(currentIndex).getActives(); 5340 if (this.active !== "all") { 5341 actives = [this.slides[this.getValidIndex(currentIndex)]]; 5342 } 5343 const activeClasses = [ 5344 this.clsActive, 5345 !this.sets || includes(this.sets, toFloat(this.index)) ? this.clsActivated : "" 5346 ]; 5347 for (const slide of this.slides) { 5348 const active = includes(actives, slide); 5349 toggleClass(slide, activeClasses, active); 5350 attr(slide, "aria-hidden", !active); 5351 for (const focusable of $$(selFocusable, slide)) { 5352 if (!hasOwn(focusable, "_tabindex")) { 5353 focusable._tabindex = attr(focusable, "tabindex"); 5354 } 5355 attr(focusable, "tabindex", active ? focusable._tabindex : -1); 5356 } 5357 } 5358 }, 5359 getValidIndex(index = this.index, prevIndex = this.prevIndex) { 5360 index = this.getIndex(index, prevIndex); 5361 if (!this.sets) { 5362 return index; 5363 } 5364 let prev; 5365 do { 5366 if (includes(this.sets, index)) { 5367 return index; 5368 } 5369 prev = index; 5370 index = this.getIndex(index + this.dir, prevIndex); 5371 } while (index !== prev); 5372 return index; 5373 }, 5374 getAdjacentSlides() { 5375 const { width } = dimensions$1(this.list); 5376 const left = -width; 5377 const right = width * 2; 5378 const slideWidth = dimensions$1(this.slides[this.index]).width; 5379 const slideLeft = this.center ? width / 2 - slideWidth / 2 : 0; 5380 const slides = /* @__PURE__ */ new Set(); 5381 for (const i of [-1, 1]) { 5382 let currentLeft = slideLeft + (i > 0 ? slideWidth : 0); 5383 let j = 0; 5384 do { 5385 const slide = this.slides[this.getIndex(this.index + i + j++ * i)]; 5386 currentLeft += dimensions$1(slide).width * i; 5387 slides.add(slide); 5388 } while (this.length > j && currentLeft > left && currentLeft < right); 5389 } 5390 return Array.from(slides); 5391 }, 5392 getIndexAt(percent) { 5393 let index = -1; 5394 const scrollDist = this.center ? getWidth(this.list) - (dimensions$1(this.slides[0]).width / 2 + dimensions$1(last(this.slides)).width / 2) : getWidth(this.list, this.maxIndex); 5395 let dist = percent * scrollDist; 5396 let slidePercent = 0; 5397 do { 5398 const slideWidth = dimensions$1(this.slides[++index]).width; 5399 const slideDist = this.center ? slideWidth / 2 + dimensions$1(this.slides[index + 1]).width / 2 : slideWidth; 5400 slidePercent = dist / slideDist % 1; 5401 dist -= slideDist; 5402 } while (dist >= 0 && index < this.maxIndex); 5403 return [index, slidePercent]; 5404 } 5405 } 5406 }; 5407 function isFinite(list, center) { 5408 if (!list || list.length < 2) { 5409 return true; 5410 } 5411 const { width: listWidth } = dimensions$1(list); 5412 if (!center) { 5413 return Math.ceil(getWidth(list)) < Math.trunc(listWidth + getMaxElWidth(list)); 5414 } 5415 const slides = children(list); 5416 const listHalf = Math.trunc(listWidth / 2); 5417 for (const index in slides) { 5418 const slide = slides[index]; 5419 const slideWidth = dimensions$1(slide).width; 5420 const slidesInView = /* @__PURE__ */ new Set([slide]); 5421 let diff = 0; 5422 for (const i of [-1, 1]) { 5423 let left = slideWidth / 2; 5424 let j = 0; 5425 while (left < listHalf) { 5426 const nextSlide = slides[getIndex(+index + i + j++ * i, slides)]; 5427 if (slidesInView.has(nextSlide)) { 5428 return true; 5429 } 5430 left += dimensions$1(nextSlide).width; 5431 slidesInView.add(nextSlide); 5432 } 5433 diff = Math.max( 5434 diff, 5435 slideWidth / 2 + dimensions$1(slides[getIndex(+index + i, slides)]).width / 2 - (left - listHalf) 5436 ); 5437 } 5438 if (Math.trunc(diff) > sumBy( 5439 slides.filter((slide2) => !slidesInView.has(slide2)), 5440 (slide2) => dimensions$1(slide2).width 5441 )) { 5442 return true; 5443 } 5444 } 5445 return false; 5446 } 5447 function getMaxElWidth(list) { 5448 return Math.max(0, ...children(list).map((el) => dimensions$1(el).width)); 5449 } 5450 5451 var sliderParallax = { 5452 mixins: [Parallax], 5453 beforeConnect() { 5454 this.item = this.$el.closest(`.${this.$options.id.replace("parallax", "items")} > *`); 5455 }, 5456 disconnected() { 5457 this.item = null; 5458 }, 5459 events: [ 5460 { 5461 name: "itemin itemout", 5462 self: true, 5463 el: ({ item }) => item, 5464 handler({ type, detail: { percent, duration, timing, dir } }) { 5465 fastdom.read(() => { 5466 if (!this.matchMedia) { 5467 return; 5468 } 5469 const propsFrom = this.getCss(getCurrentPercent(type, dir, percent)); 5470 const propsTo = this.getCss(isIn(type) ? 0.5 : dir > 0 ? 1 : 0); 5471 fastdom.write(() => { 5472 css(this.$el, propsFrom); 5473 Transition.start(this.$el, propsTo, duration, timing).catch(noop); 5474 }); 5475 }); 5476 } 5477 }, 5478 { 5479 name: "transitioncanceled transitionend", 5480 self: true, 5481 el: ({ item }) => item, 5482 handler() { 5483 Transition.cancel(this.$el); 5484 } 5485 }, 5486 { 5487 name: "itemtranslatein itemtranslateout", 5488 self: true, 5489 el: ({ item }) => item, 5490 handler({ type, detail: { percent, dir } }) { 5491 fastdom.read(() => { 5492 if (!this.matchMedia) { 5493 this.reset(); 5494 return; 5495 } 5496 const props = this.getCss(getCurrentPercent(type, dir, percent)); 5497 fastdom.write(() => css(this.$el, props)); 5498 }); 5499 } 5500 } 5501 ] 5502 }; 5503 function isIn(type) { 5504 return endsWith(type, "in"); 5505 } 5506 function getCurrentPercent(type, dir, percent) { 5507 percent /= 2; 5508 return isIn(type) ^ dir < 0 ? percent : 1 - percent; 5509 } 5510 5511 var Animations = { 5512 ...Animations$2, 5513 fade: { 5514 show() { 5515 return [{ opacity: 0, zIndex: 0 }, { zIndex: -1 }]; 5516 }, 5517 percent(current) { 5518 return 1 - css(current, "opacity"); 5519 }, 5520 translate(percent) { 5521 return [{ opacity: 1 - percent, zIndex: 0 }, { zIndex: -1 }]; 5522 } 5523 }, 5524 scale: { 5525 show() { 5526 return [{ opacity: 0, transform: scale3d(1 + 0.5), zIndex: 0 }, { zIndex: -1 }]; 5527 }, 5528 percent(current) { 5529 return 1 - css(current, "opacity"); 5530 }, 5531 translate(percent) { 5532 return [ 5533 { opacity: 1 - percent, transform: scale3d(1 + 0.5 * percent), zIndex: 0 }, 5534 { zIndex: -1 } 5535 ]; 5536 } 5537 }, 5538 pull: { 5539 show(dir) { 5540 return dir < 0 ? [ 5541 { transform: translate(30), zIndex: -1 }, 5542 { transform: translate(), zIndex: 0 } 5543 ] : [ 5544 { transform: translate(-100), zIndex: 0 }, 5545 { transform: translate(), zIndex: -1 } 5546 ]; 5547 }, 5548 percent(current, next, dir) { 5549 return dir < 0 ? 1 - translated(next) : translated(current); 5550 }, 5551 translate(percent, dir) { 5552 return dir < 0 ? [ 5553 { transform: translate(30 * percent), zIndex: -1 }, 5554 { transform: translate(-100 * (1 - percent)), zIndex: 0 } 5555 ] : [ 5556 { transform: translate(-percent * 100), zIndex: 0 }, 5557 { transform: translate(30 * (1 - percent)), zIndex: -1 } 5558 ]; 5559 } 5560 }, 5561 push: { 5562 show(dir) { 5563 return dir < 0 ? [ 5564 { transform: translate(100), zIndex: 0 }, 5565 { transform: translate(), zIndex: -1 } 5566 ] : [ 5567 { transform: translate(-30), zIndex: -1 }, 5568 { transform: translate(), zIndex: 0 } 5569 ]; 5570 }, 5571 percent(current, next, dir) { 5572 return dir > 0 ? 1 - translated(next) : translated(current); 5573 }, 5574 translate(percent, dir) { 5575 return dir < 0 ? [ 5576 { transform: translate(percent * 100), zIndex: 0 }, 5577 { transform: translate(-30 * (1 - percent)), zIndex: -1 } 5578 ] : [ 5579 { transform: translate(-30 * percent), zIndex: -1 }, 5580 { transform: translate(100 * (1 - percent)), zIndex: 0 } 5581 ]; 5582 } 5583 } 5584 }; 5585 5586 var slideshow = { 5587 mixins: [Class, Slideshow, SliderReactive, SliderParallax, SliderPreload], 5588 props: { 5589 ratio: String, 5590 minHeight: String, 5591 maxHeight: String 5592 }, 5593 data: { 5594 ratio: "16:9", 5595 minHeight: void 0, 5596 maxHeight: void 0, 5597 selList: ".bdt-slideshow-items", 5598 attrItem: "bdt-slideshow-item", 5599 selNav: ".bdt-slideshow-nav", 5600 Animations 5601 }, 5602 watch: { 5603 list(list) { 5604 css(list, { 5605 aspectRatio: this.ratio ? this.ratio.replace(":", "/") : void 0, 5606 minHeight: this.minHeight, 5607 maxHeight: this.maxHeight, 5608 minWidth: "100%", 5609 maxWidth: "100%" 5610 }); 5611 } 5612 }, 5613 methods: { 5614 getAdjacentSlides() { 5615 return [1, -1].map((i) => this.slides[this.getIndex(this.index + i)]); 5616 } 5617 } 5618 }; 5619 5620 var sortable = { 5621 mixins: [Class, Animate], 5622 props: { 5623 group: String, 5624 threshold: Number, 5625 clsItem: String, 5626 clsPlaceholder: String, 5627 clsDrag: String, 5628 clsDragState: String, 5629 clsBase: String, 5630 clsNoDrag: String, 5631 clsEmpty: String, 5632 clsCustom: String, 5633 handle: String 5634 }, 5635 data: { 5636 group: false, 5637 threshold: 5, 5638 clsItem: "bdt-sortable-item", 5639 clsPlaceholder: "bdt-sortable-placeholder", 5640 clsDrag: "bdt-sortable-drag", 5641 clsDragState: "bdt-drag", 5642 clsBase: "bdt-sortable", 5643 clsNoDrag: "bdt-sortable-nodrag", 5644 clsEmpty: "bdt-sortable-empty", 5645 clsCustom: "", 5646 handle: false, 5647 pos: {} 5648 }, 5649 events: { 5650 name: pointerDown$1, 5651 passive: false, 5652 handler: "init" 5653 }, 5654 computed: { 5655 target: (_, $el) => ($el.tBodies || [$el])[0], 5656 items() { 5657 return children(this.target); 5658 }, 5659 isEmpty() { 5660 return !this.items.length; 5661 }, 5662 handles({ handle }, $el) { 5663 return handle ? $$(handle, $el) : this.items; 5664 } 5665 }, 5666 watch: { 5667 isEmpty(empty) { 5668 toggleClass(this.target, this.clsEmpty, empty); 5669 }, 5670 handles(handles, prev) { 5671 css(prev, { touchAction: "", userSelect: "" }); 5672 css(handles, { touchAction: "none", userSelect: "none" }); 5673 } 5674 }, 5675 update: { 5676 write(data) { 5677 if (!this.drag || !parent(this.placeholder)) { 5678 return; 5679 } 5680 const { 5681 pos: { x, y }, 5682 origin: { offsetTop, offsetLeft }, 5683 placeholder 5684 } = this; 5685 css(this.drag, { 5686 top: y - offsetTop, 5687 left: x - offsetLeft 5688 }); 5689 const sortable = this.getSortable(document.elementFromPoint(x, y)); 5690 if (!sortable) { 5691 return; 5692 } 5693 const { items } = sortable; 5694 if (items.some(Transition.inProgress)) { 5695 return; 5696 } 5697 const target = findTarget(items, { x, y }); 5698 if (items.length && (!target || target === placeholder)) { 5699 return; 5700 } 5701 const previous = this.getSortable(placeholder); 5702 const insertTarget = findInsertTarget( 5703 sortable.target, 5704 target, 5705 placeholder, 5706 x, 5707 y, 5708 sortable === previous && data.moved !== target 5709 ); 5710 if (insertTarget === false) { 5711 return; 5712 } 5713 if (insertTarget && placeholder === insertTarget) { 5714 return; 5715 } 5716 if (sortable !== previous) { 5717 previous.remove(placeholder); 5718 data.moved = target; 5719 } else { 5720 delete data.moved; 5721 } 5722 sortable.insert(placeholder, insertTarget); 5723 this.touched.add(sortable); 5724 }, 5725 events: ["move"] 5726 }, 5727 methods: { 5728 init(e) { 5729 const { target, button, defaultPrevented } = e; 5730 const [placeholder] = this.items.filter((el) => el.contains(target)); 5731 if (!placeholder || defaultPrevented || button > 0 || isInput(target) || target.closest(`.${this.clsNoDrag}`) || this.handle && !target.closest(this.handle)) { 5732 return; 5733 } 5734 e.preventDefault(); 5735 this.pos = getEventPos(e); 5736 this.touched = /* @__PURE__ */ new Set([this]); 5737 this.placeholder = placeholder; 5738 this.origin = { target, index: index(placeholder), ...this.pos }; 5739 on(document, pointerMove$1, this.move); 5740 on(document, pointerUp$1, this.end); 5741 if (!this.threshold) { 5742 this.start(e); 5743 } 5744 }, 5745 start(e) { 5746 this.drag = appendDrag(this.$container, this.placeholder); 5747 const { left, top } = dimensions$1(this.placeholder); 5748 assign(this.origin, { offsetLeft: this.pos.x - left, offsetTop: this.pos.y - top }); 5749 addClass(this.drag, this.clsDrag, this.clsCustom); 5750 addClass(this.placeholder, this.clsPlaceholder); 5751 addClass(this.items, this.clsItem); 5752 addClass(document.documentElement, this.clsDragState); 5753 trigger(this.$el, "start", [this, this.placeholder]); 5754 trackScroll(this.pos); 5755 this.move(e); 5756 }, 5757 move: throttle(function(e) { 5758 assign(this.pos, getEventPos(e)); 5759 if (!this.drag && (Math.abs(this.pos.x - this.origin.x) > this.threshold || Math.abs(this.pos.y - this.origin.y) > this.threshold)) { 5760 this.start(e); 5761 } 5762 this.$emit("move"); 5763 }), 5764 end() { 5765 off(document, pointerMove$1, this.move); 5766 off(document, pointerUp$1, this.end); 5767 if (!this.drag) { 5768 return; 5769 } 5770 untrackScroll(); 5771 const sortable = this.getSortable(this.placeholder); 5772 if (this === sortable) { 5773 if (this.origin.index !== index(this.placeholder)) { 5774 trigger(this.$el, "moved", [this, this.placeholder]); 5775 } 5776 } else { 5777 trigger(sortable.$el, "added", [sortable, this.placeholder]); 5778 trigger(this.$el, "removed", [this, this.placeholder]); 5779 } 5780 trigger(this.$el, "stop", [this, this.placeholder]); 5781 remove$1(this.drag); 5782 this.drag = null; 5783 for (const { clsPlaceholder, clsItem } of this.touched) { 5784 for (const sortable2 of this.touched) { 5785 removeClass(sortable2.items, clsPlaceholder, clsItem); 5786 } 5787 } 5788 this.touched = null; 5789 removeClass(document.documentElement, this.clsDragState); 5790 }, 5791 insert(element, target) { 5792 addClass(this.items, this.clsItem); 5793 if (target && target.previousElementSibling !== element) { 5794 this.animate(() => before(target, element)); 5795 } else if (!target && this.target.lastElementChild !== element) { 5796 this.animate(() => append(this.target, element)); 5797 } 5798 }, 5799 remove(element) { 5800 if (this.target.contains(element)) { 5801 this.animate(() => remove$1(element)); 5802 } 5803 }, 5804 getSortable(element) { 5805 do { 5806 const sortable = this.$getComponent(element, "sortable"); 5807 if (sortable && (sortable === this || this.group !== false && sortable.group === this.group)) { 5808 return sortable; 5809 } 5810 } while (element = parent(element)); 5811 } 5812 } 5813 }; 5814 let trackTimer; 5815 function trackScroll(pos) { 5816 let last = Date.now(); 5817 trackTimer = setInterval(() => { 5818 let { x, y } = pos; 5819 y += document.scrollingElement.scrollTop; 5820 const dist = (Date.now() - last) * 0.3; 5821 last = Date.now(); 5822 scrollParents(document.elementFromPoint(x, pos.y)).reverse().some((scrollEl) => { 5823 let { scrollTop: scroll, scrollHeight } = scrollEl; 5824 const { top, bottom, height: height2 } = offsetViewport(scrollEl); 5825 if (top < y && top + 35 > y) { 5826 scroll -= dist; 5827 } else if (bottom > y && bottom - 35 < y) { 5828 scroll += dist; 5829 } else { 5830 return; 5831 } 5832 if (scroll > 0 && scroll < scrollHeight - height2) { 5833 scrollEl.scrollTop = scroll; 5834 return true; 5835 } 5836 }); 5837 }, 15); 5838 } 5839 function untrackScroll() { 5840 clearInterval(trackTimer); 5841 } 5842 function appendDrag(container, element) { 5843 let clone; 5844 if (isTag(element, "li", "tr")) { 5845 clone = $("<div>"); 5846 append(clone, element.cloneNode(true).children); 5847 for (const attribute of element.getAttributeNames()) { 5848 attr(clone, attribute, element.getAttribute(attribute)); 5849 } 5850 } else { 5851 clone = element.cloneNode(true); 5852 } 5853 append(container, clone); 5854 css(clone, "margin", "0", "important"); 5855 css(clone, { 5856 boxSizing: "border-box", 5857 width: element.offsetWidth, 5858 height: element.offsetHeight, 5859 padding: css(element, "padding") 5860 }); 5861 height(clone.firstElementChild, height(element.firstElementChild)); 5862 return clone; 5863 } 5864 function findTarget(items, point) { 5865 return items[findIndex(items, (item) => pointInRect(point, dimensions$1(item)))]; 5866 } 5867 function findInsertTarget(list, target, placeholder, x, y, sameList) { 5868 if (!children(list).length) { 5869 return; 5870 } 5871 const rect = dimensions$1(target); 5872 if (!sameList) { 5873 if (!isHorizontal(list, placeholder)) { 5874 return y < rect.top + rect.height / 2 ? target : target.nextElementSibling; 5875 } 5876 return target; 5877 } 5878 const placeholderRect = dimensions$1(placeholder); 5879 const sameRow = linesIntersect( 5880 [rect.top, rect.bottom], 5881 [placeholderRect.top, placeholderRect.bottom] 5882 ); 5883 const [pointerPos, lengthProp, startProp, endProp] = sameRow ? [x, "width", "left", "right"] : [y, "height", "top", "bottom"]; 5884 const diff = placeholderRect[lengthProp] < rect[lengthProp] ? rect[lengthProp] - placeholderRect[lengthProp] : 0; 5885 if (placeholderRect[startProp] < rect[startProp]) { 5886 if (diff && pointerPos < rect[startProp] + diff) { 5887 return false; 5888 } 5889 return target.nextElementSibling; 5890 } 5891 if (diff && pointerPos > rect[endProp] - diff) { 5892 return false; 5893 } 5894 return target; 5895 } 5896 function isHorizontal(list, placeholder) { 5897 const single = children(list).length === 1; 5898 if (single) { 5899 append(list, placeholder); 5900 } 5901 const items = children(list); 5902 const isHorizontal2 = items.some((el, i) => { 5903 const rectA = dimensions$1(el); 5904 return items.slice(i + 1).some((el2) => { 5905 const rectB = dimensions$1(el2); 5906 return !linesIntersect([rectA.left, rectA.right], [rectB.left, rectB.right]); 5907 }); 5908 }); 5909 if (single) { 5910 remove$1(placeholder); 5911 } 5912 return isHorizontal2; 5913 } 5914 function linesIntersect(lineA, lineB) { 5915 return lineA[1] > lineB[0] && lineB[1] > lineA[0]; 5916 } 5917 function throttle(fn) { 5918 let throttled; 5919 return function(...args) { 5920 if (!throttled) { 5921 throttled = true; 5922 fn.call(this, ...args); 5923 requestAnimationFrame(() => throttled = false); 5924 } 5925 }; 5926 } 5927 5928 var Position = { 5929 props: { 5930 pos: String, 5931 offset: Boolean, 5932 flip: Boolean, 5933 shift: Boolean, 5934 inset: Boolean 5935 }, 5936 data: { 5937 pos: `bottom-${isRtl ? "right" : "left"}`, 5938 offset: false, 5939 flip: true, 5940 shift: true, 5941 inset: false 5942 }, 5943 connected() { 5944 this.pos = this.$props.pos.split("-").concat("center").slice(0, 2); 5945 [this.dir, this.align] = this.pos; 5946 this.axis = includes(["top", "bottom"], this.dir) ? "y" : "x"; 5947 }, 5948 methods: { 5949 positionAt(element, target, boundary) { 5950 let offset = [this.getPositionOffset(element), this.getShiftOffset(element)]; 5951 const placement = [this.flip && "flip", this.shift && "shift"]; 5952 const attach = { 5953 element: [this.inset ? this.dir : flipPosition(this.dir), this.align], 5954 target: [this.dir, this.align] 5955 }; 5956 if (this.axis === "y") { 5957 for (const prop in attach) { 5958 attach[prop].reverse(); 5959 } 5960 offset.reverse(); 5961 placement.reverse(); 5962 } 5963 const restoreScrollPosition = storeScrollPosition(element); 5964 const elDim = dimensions$1(element); 5965 css(element, { top: -elDim.height, left: -elDim.width }); 5966 positionAt(element, target, { 5967 attach, 5968 offset, 5969 boundary, 5970 placement, 5971 viewportOffset: this.getViewportOffset(element) 5972 }); 5973 restoreScrollPosition(); 5974 }, 5975 getPositionOffset(element = this.$el) { 5976 return toPx( 5977 this.offset === false ? css(element, "--bdt-position-offset") : this.offset, 5978 this.axis === "x" ? "width" : "height", 5979 element 5980 ) * (includes(["left", "top"], this.dir) ? -1 : 1) * (this.inset ? -1 : 1); 5981 }, 5982 getShiftOffset(element = this.$el) { 5983 return this.align === "center" ? 0 : toPx( 5984 css(element, "--bdt-position-shift-offset"), 5985 this.axis === "y" ? "width" : "height", 5986 element 5987 ) * (includes(["left", "top"], this.align) ? 1 : -1); 5988 }, 5989 getViewportOffset(element) { 5990 return toPx(css(element, "--bdt-position-viewport-offset")); 5991 } 5992 } 5993 }; 5994 function storeScrollPosition(element) { 5995 const scrollElement = scrollParent(element); 5996 const { scrollTop } = scrollElement; 5997 return () => { 5998 if (scrollTop !== scrollElement.scrollTop) { 5999 scrollElement.scrollTop = scrollTop; 6000 } 6001 }; 6002 } 6003 6004 var tooltip = { 6005 mixins: [Container, Togglable, Position], 6006 data: { 6007 pos: "top", 6008 animation: ["bdt-animation-scale-up"], 6009 duration: 100, 6010 cls: "bdt-active" 6011 }, 6012 connected() { 6013 makeFocusable(this.$el); 6014 }, 6015 disconnected() { 6016 this.hide(); 6017 }, 6018 methods: { 6019 show() { 6020 if (this.isToggled(this.tooltip || null)) { 6021 return; 6022 } 6023 const { delay = 0, title } = parseProps(this.$options); 6024 if (!title) { 6025 return; 6026 } 6027 const titleAttr = attr(this.$el, "title"); 6028 const off = on(this.$el, ["blur", pointerLeave], (e) => !isTouch(e) && this.hide()); 6029 this.reset = () => { 6030 attr(this.$el, { title: titleAttr, "aria-describedby": null }); 6031 off(); 6032 }; 6033 const id = generateId(this); 6034 attr(this.$el, { title: null, "aria-describedby": id }); 6035 clearTimeout(this.showTimer); 6036 this.showTimer = setTimeout(() => this._show(title, id), delay); 6037 }, 6038 async hide() { 6039 var _a; 6040 if (matches(this.$el, "input:focus")) { 6041 return; 6042 } 6043 clearTimeout(this.showTimer); 6044 if (this.isToggled(this.tooltip || null)) { 6045 await this.toggleElement(this.tooltip, false, false); 6046 } 6047 (_a = this.reset) == null ? void 0 : _a.call(this); 6048 remove$1(this.tooltip); 6049 this.tooltip = null; 6050 }, 6051 async _show(title, id) { 6052 this.tooltip = append( 6053 this.container, 6054 `<div id="${id}" class="bdt-${this.$options.name}" role="tooltip"> <div class="bdt-${this.$options.name}-inner">${title}</div> </div>` 6055 ); 6056 on(this.tooltip, "toggled", (e, toggled) => { 6057 if (!toggled) { 6058 return; 6059 } 6060 const update = () => this.positionAt(this.tooltip, this.$el); 6061 update(); 6062 const [dir, align] = getAlignment(this.tooltip, this.$el, this.pos); 6063 this.origin = this.axis === "y" ? `${flipPosition(dir)}-${align}` : `${align}-${flipPosition(dir)}`; 6064 const handlers = [ 6065 once( 6066 document, 6067 `keydown ${pointerDown$1}`, 6068 this.hide, 6069 false, 6070 (e2) => e2.type === pointerDown$1 && !this.$el.contains(e2.target) || e2.type === "keydown" && e2.keyCode === keyMap.ESC 6071 ), 6072 on([document, ...overflowParents(this.$el)], "scroll", update, { 6073 passive: true 6074 }) 6075 ]; 6076 once(this.tooltip, "hide", () => handlers.forEach((handler) => handler()), { 6077 self: true 6078 }); 6079 }); 6080 if (!await this.toggleElement(this.tooltip, true)) { 6081 this.hide(); 6082 } 6083 } 6084 }, 6085 events: { 6086 // Clicking a button does not give it focus on all browsers and platforms 6087 // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#clicking_and_focus 6088 [`focus ${pointerEnter} ${pointerDown$1}`](e) { 6089 if (!isTouch(e) || e.type === pointerDown$1) { 6090 this.show(); 6091 } 6092 } 6093 } 6094 }; 6095 function makeFocusable(el) { 6096 if (!isFocusable(el)) { 6097 attr(el, "tabindex", "0"); 6098 } 6099 } 6100 function getAlignment(el, target, [dir, align]) { 6101 const elOffset = offset(el); 6102 const targetOffset = offset(target); 6103 const properties = [ 6104 ["left", "right"], 6105 ["top", "bottom"] 6106 ]; 6107 for (const props2 of properties) { 6108 if (elOffset[props2[0]] >= targetOffset[props2[1]]) { 6109 dir = props2[1]; 6110 break; 6111 } 6112 if (elOffset[props2[1]] <= targetOffset[props2[0]]) { 6113 dir = props2[0]; 6114 break; 6115 } 6116 } 6117 const props = includes(properties[0], dir) ? properties[1] : properties[0]; 6118 align = props.find((prop) => elOffset[prop] === targetOffset[prop]) || "center"; 6119 return [dir, align]; 6120 } 6121 function parseProps(options) { 6122 const { el, id, data: data$1 } = options; 6123 return ["delay", "title"].reduce((obj, key) => ({ [key]: data(el, key), ...obj }), { 6124 ...parseOptions(data(el, id), ["title"]), 6125 ...data$1 6126 }); 6127 } 6128 6129 var upload = { 6130 mixins: [I18n], 6131 i18n: { 6132 invalidMime: "Invalid File Type: %s", 6133 invalidName: "Invalid File Name: %s", 6134 invalidSize: "Invalid File Size: %s Kilobytes Max" 6135 }, 6136 props: { 6137 allow: String, 6138 clsDragover: String, 6139 concurrent: Number, 6140 maxSize: Number, 6141 method: String, 6142 mime: String, 6143 multiple: Boolean, 6144 name: String, 6145 params: Object, 6146 type: String, 6147 url: String 6148 }, 6149 data: { 6150 allow: false, 6151 clsDragover: "bdt-dragover", 6152 concurrent: 1, 6153 maxSize: 0, 6154 method: "POST", 6155 mime: false, 6156 multiple: false, 6157 name: "files[]", 6158 params: {}, 6159 type: "", 6160 url: "", 6161 abort: noop, 6162 beforeAll: noop, 6163 beforeSend: noop, 6164 complete: noop, 6165 completeAll: noop, 6166 error: noop, 6167 fail: noop, 6168 load: noop, 6169 loadEnd: noop, 6170 loadStart: noop, 6171 progress: noop 6172 }, 6173 events: { 6174 change(e) { 6175 if (!matches(e.target, 'input[type="file"]')) { 6176 return; 6177 } 6178 e.preventDefault(); 6179 if (e.target.files) { 6180 this.upload(e.target.files); 6181 } 6182 e.target.value = ""; 6183 }, 6184 drop(e) { 6185 stop(e); 6186 const transfer = e.dataTransfer; 6187 if (!(transfer == null ? void 0 : transfer.files)) { 6188 return; 6189 } 6190 removeClass(this.$el, this.clsDragover); 6191 this.upload(transfer.files); 6192 }, 6193 dragenter(e) { 6194 stop(e); 6195 }, 6196 dragover(e) { 6197 stop(e); 6198 addClass(this.$el, this.clsDragover); 6199 }, 6200 dragleave(e) { 6201 stop(e); 6202 removeClass(this.$el, this.clsDragover); 6203 } 6204 }, 6205 methods: { 6206 async upload(files) { 6207 files = toArray(files); 6208 if (!files.length) { 6209 return; 6210 } 6211 trigger(this.$el, "upload", [files]); 6212 for (const file of files) { 6213 if (this.maxSize && this.maxSize * 1e3 < file.size) { 6214 this.fail(this.t("invalidSize", this.maxSize)); 6215 return; 6216 } 6217 if (this.allow && !match$1(this.allow, file.name)) { 6218 this.fail(this.t("invalidName", this.allow)); 6219 return; 6220 } 6221 if (this.mime && !match$1(this.mime, file.type)) { 6222 this.fail(this.t("invalidMime", this.mime)); 6223 return; 6224 } 6225 } 6226 if (!this.multiple) { 6227 files = files.slice(0, 1); 6228 } 6229 this.beforeAll(this, files); 6230 const chunks = chunk(files, this.concurrent); 6231 const upload = async (files2) => { 6232 const data = new FormData(); 6233 files2.forEach((file) => data.append(this.name, file)); 6234 for (const key in this.params) { 6235 data.append(key, this.params[key]); 6236 } 6237 try { 6238 const xhr = await ajax(this.url, { 6239 data, 6240 method: this.method, 6241 responseType: this.type, 6242 beforeSend: (env) => { 6243 const { xhr: xhr2 } = env; 6244 on(xhr2.upload, "progress", this.progress); 6245 for (const type of ["loadStart", "load", "loadEnd", "abort"]) { 6246 on(xhr2, type.toLowerCase(), this[type]); 6247 } 6248 return this.beforeSend(env); 6249 } 6250 }); 6251 this.complete(xhr); 6252 if (chunks.length) { 6253 await upload(chunks.shift()); 6254 } else { 6255 this.completeAll(xhr); 6256 } 6257 } catch (e) { 6258 this.error(e); 6259 } 6260 }; 6261 await upload(chunks.shift()); 6262 } 6263 } 6264 }; 6265 function match$1(pattern, path) { 6266 return path.match( 6267 new RegExp( 6268 `^${pattern.replace(/\//g, "\\/").replace(/\*\*/g, "(\\/[^\\/]+)*").replace(/\*/g, "[^\\/]+").replace(/((?!\\))\?/g, "$1.")}$`, 6269 "i" 6270 ) 6271 ); 6272 } 6273 function chunk(files, size) { 6274 const chunks = []; 6275 for (let i = 0; i < files.length; i += size) { 6276 chunks.push(files.slice(i, i + size)); 6277 } 6278 return chunks; 6279 } 6280 function stop(e) { 6281 e.preventDefault(); 6282 e.stopPropagation(); 6283 } 6284 async function ajax(url, options) { 6285 const env = { 6286 data: null, 6287 method: "GET", 6288 headers: {}, 6289 xhr: new XMLHttpRequest(), 6290 beforeSend: noop, 6291 responseType: "", 6292 ...options 6293 }; 6294 await env.beforeSend(env); 6295 return send(url, env); 6296 } 6297 function send(url, env) { 6298 return new Promise((resolve, reject) => { 6299 const { xhr } = env; 6300 for (const prop in env) { 6301 if (prop in xhr) { 6302 try { 6303 xhr[prop] = env[prop]; 6304 } catch (e) { 6305 } 6306 } 6307 } 6308 xhr.open(env.method.toUpperCase(), url); 6309 for (const header in env.headers) { 6310 xhr.setRequestHeader(header, env.headers[header]); 6311 } 6312 on(xhr, "load", () => { 6313 if (xhr.status === 0 || xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { 6314 resolve(xhr); 6315 } else { 6316 reject( 6317 assign(Error(xhr.statusText), { 6318 xhr, 6319 status: xhr.status 6320 }) 6321 ); 6322 } 6323 }); 6324 on(xhr, "error", () => reject(assign(Error("Network Error"), { xhr }))); 6325 on(xhr, "timeout", () => reject(assign(Error("Network Timeout"), { xhr }))); 6326 xhr.send(env.data); 6327 }); 6328 } 6329 6330 var components$1 = /*#__PURE__*/Object.freeze({ 6331 __proto__: null, 6332 Countdown: countdown, 6333 Filter: filter, 6334 Lightbox: lightbox, 6335 LightboxPanel: LightboxPanel, 6336 Notification: notification, 6337 Parallax: parallax, 6338 Slider: slider, 6339 SliderParallax: sliderParallax, 6340 Slideshow: slideshow, 6341 SlideshowParallax: sliderParallax, 6342 Sortable: sortable, 6343 Tooltip: tooltip, 6344 Upload: upload 6345 }); 6346 6347 function boot(App) { 6348 if (inBrowser && window.MutationObserver) { 6349 if (document.body) { 6350 requestAnimationFrame(() => init(App)); 6351 } else { 6352 new MutationObserver((records, observer) => { 6353 if (document.body) { 6354 init(App); 6355 observer.disconnect(); 6356 } 6357 }).observe(document.documentElement, { childList: true }); 6358 } 6359 } 6360 } 6361 function init(App) { 6362 trigger(document, "uikit:init", App); 6363 if (document.body) { 6364 apply(document.body, connect); 6365 } 6366 new MutationObserver((records) => records.forEach(applyChildListMutation)).observe(document, { 6367 subtree: true, 6368 childList: true 6369 }); 6370 new MutationObserver((records) => records.forEach(applyAttributeMutation)).observe(document, { 6371 subtree: true, 6372 attributes: true 6373 }); 6374 App._initialized = true; 6375 } 6376 function applyChildListMutation({ addedNodes, removedNodes }) { 6377 for (const node of addedNodes) { 6378 apply(node, connect); 6379 } 6380 for (const node of removedNodes) { 6381 apply(node, disconnect); 6382 } 6383 } 6384 function applyAttributeMutation({ target, attributeName }) { 6385 var _a; 6386 const name = getComponentName(attributeName); 6387 if (name) { 6388 if (hasAttr(target, attributeName)) { 6389 createComponent(name, target); 6390 } else { 6391 (_a = getComponent(target, name)) == null ? void 0 : _a.$destroy(); 6392 } 6393 } 6394 } 6395 function connect(node) { 6396 const components2 = getComponents(node); 6397 for (const name in components2) { 6398 callConnected(components2[name]); 6399 } 6400 for (const attributeName of node.getAttributeNames()) { 6401 const name = getComponentName(attributeName); 6402 name && createComponent(name, node); 6403 } 6404 } 6405 function disconnect(node) { 6406 const components2 = getComponents(node); 6407 for (const name in components2) { 6408 callDisconnected(components2[name]); 6409 } 6410 } 6411 function getComponentName(attribute) { 6412 if (startsWith(attribute, "data-")) { 6413 attribute = attribute.slice(5); 6414 } 6415 const cmp = components$2[attribute]; 6416 return cmp && (cmp.options || cmp).name; 6417 } 6418 6419 globalApi(App); 6420 instanceApi(App); 6421 6422 var Accordion = { 6423 mixins: [Class, Togglable], 6424 props: { 6425 animation: Boolean, 6426 targets: String, 6427 active: null, 6428 collapsible: Boolean, 6429 multiple: Boolean, 6430 toggle: String, 6431 content: String, 6432 offset: Number 6433 }, 6434 data: { 6435 targets: "> *", 6436 active: false, 6437 animation: true, 6438 collapsible: true, 6439 multiple: false, 6440 clsOpen: "bdt-open", 6441 toggle: "> .bdt-accordion-title", 6442 content: "> .bdt-accordion-content", 6443 offset: 0 6444 }, 6445 computed: { 6446 items: ({ targets }, $el) => $$(targets, $el), 6447 toggles({ toggle }) { 6448 return this.items.map((item) => $(toggle, item)); 6449 }, 6450 contents({ content }) { 6451 return this.items.map((item) => { 6452 var _a; 6453 return ((_a = item._wrapper) == null ? void 0 : _a.firstElementChild) || $(content, item); 6454 }); 6455 } 6456 }, 6457 watch: { 6458 items(items, prev) { 6459 if (prev || hasClass(items, this.clsOpen)) { 6460 return; 6461 } 6462 const active = this.active !== false && items[Number(this.active)] || !this.collapsible && items[0]; 6463 if (active) { 6464 this.toggle(active, false); 6465 } 6466 }, 6467 toggles() { 6468 this.$emit(); 6469 }, 6470 contents(items) { 6471 for (const el of items) { 6472 const isOpen = hasClass( 6473 this.items.find((item) => item.contains(el)), 6474 this.clsOpen 6475 ); 6476 hide(el, !isOpen); 6477 } 6478 this.$emit(); 6479 } 6480 }, 6481 observe: lazyload(), 6482 events: [ 6483 { 6484 name: "click keydown", 6485 delegate: ({ targets, $props }) => `${targets} ${$props.toggle}`, 6486 async handler(e) { 6487 var _a; 6488 if (e.type === "keydown" && e.keyCode !== keyMap.SPACE) { 6489 return; 6490 } 6491 e.preventDefault(); 6492 (_a = this._off) == null ? void 0 : _a.call(this); 6493 this._off = keepScrollPosition(e.target); 6494 await this.toggle(index(this.toggles, e.current)); 6495 this._off(); 6496 } 6497 }, 6498 { 6499 name: "shown hidden", 6500 self: true, 6501 delegate: ({ targets }) => targets, 6502 handler() { 6503 this.$emit(); 6504 } 6505 } 6506 ], 6507 update() { 6508 const activeItems = filter$1(this.items, `.${this.clsOpen}`); 6509 for (const index2 in this.items) { 6510 const toggle = this.toggles[index2]; 6511 const content = this.contents[index2]; 6512 if (!toggle || !content) { 6513 continue; 6514 } 6515 toggle.id = generateId(this, toggle); 6516 content.id = generateId(this, content); 6517 const active = includes(activeItems, this.items[index2]); 6518 attr(toggle, { 6519 role: isTag(toggle, "a") ? "button" : null, 6520 "aria-controls": content.id, 6521 "aria-expanded": active, 6522 "aria-disabled": !this.collapsible && activeItems.length < 2 && active 6523 }); 6524 attr(content, { role: "region", "aria-labelledby": toggle.id }); 6525 if (isTag(content, "ul")) { 6526 attr(children(content), "role", "presentation"); 6527 } 6528 } 6529 }, 6530 methods: { 6531 toggle(item, animate) { 6532 item = this.items[getIndex(item, this.items)]; 6533 let items = [item]; 6534 const activeItems = filter$1(this.items, `.${this.clsOpen}`); 6535 if (!this.multiple && !includes(activeItems, items[0])) { 6536 items = items.concat(activeItems); 6537 } 6538 if (!this.collapsible && activeItems.length < 2 && includes(activeItems, item)) { 6539 return; 6540 } 6541 return Promise.all( 6542 items.map( 6543 (el) => this.toggleElement(el, !includes(activeItems, el), (el2, show) => { 6544 toggleClass(el2, this.clsOpen, show); 6545 if (animate === false || !this.animation) { 6546 hide($(this.content, el2), !show); 6547 return; 6548 } 6549 return transition(el2, show, this); 6550 }) 6551 ) 6552 ); 6553 } 6554 } 6555 }; 6556 function hide(el, hide2) { 6557 el && (el.hidden = hide2); 6558 } 6559 async function transition(el, show, { content, duration, velocity, transition: transition2 }) { 6560 var _a; 6561 content = ((_a = el._wrapper) == null ? void 0 : _a.firstElementChild) || $(content, el); 6562 if (!el._wrapper) { 6563 el._wrapper = wrapAll(content, "<div>"); 6564 } 6565 const wrapper = el._wrapper; 6566 css(wrapper, "overflow", "hidden"); 6567 const currentHeight = toFloat(css(wrapper, "height")); 6568 await Transition.cancel(wrapper); 6569 hide(content, false); 6570 const endHeight = sumBy(["marginTop", "marginBottom"], (prop) => css(content, prop)) + dimensions$1(content).height; 6571 const percent = currentHeight / endHeight; 6572 duration = (velocity * endHeight + duration) * (show ? 1 - percent : percent); 6573 css(wrapper, "height", currentHeight); 6574 await Transition.start(wrapper, { height: show ? endHeight : 0 }, duration, transition2); 6575 unwrap(content); 6576 delete el._wrapper; 6577 if (!show) { 6578 hide(content, true); 6579 } 6580 } 6581 function keepScrollPosition(el) { 6582 const scrollElement = scrollParent(el, true); 6583 let frame; 6584 (function scroll() { 6585 frame = requestAnimationFrame(() => { 6586 const { top } = dimensions$1(el); 6587 if (top < 0) { 6588 scrollElement.scrollTop += top; 6589 } 6590 scroll(); 6591 }); 6592 })(); 6593 return () => requestAnimationFrame(() => cancelAnimationFrame(frame)); 6594 } 6595 6596 var alert = { 6597 mixins: [Class, Togglable], 6598 args: "animation", 6599 props: { 6600 animation: Boolean, 6601 close: String 6602 }, 6603 data: { 6604 animation: true, 6605 selClose: ".bdt-alert-close", 6606 duration: 150 6607 }, 6608 events: { 6609 name: "click", 6610 delegate: ({ selClose }) => selClose, 6611 handler(e) { 6612 e.preventDefault(); 6613 this.close(); 6614 } 6615 }, 6616 methods: { 6617 async close() { 6618 await this.toggleElement(this.$el, false, animate); 6619 this.$destroy(true); 6620 } 6621 } 6622 }; 6623 function animate(el, show, { duration, transition, velocity }) { 6624 const height = toFloat(css(el, "height")); 6625 css(el, "height", height); 6626 return Transition.start( 6627 el, 6628 { 6629 height: 0, 6630 marginTop: 0, 6631 marginBottom: 0, 6632 paddingTop: 0, 6633 paddingBottom: 0, 6634 borderTop: 0, 6635 borderBottom: 0, 6636 opacity: 0 6637 }, 6638 velocity * height + duration, 6639 transition 6640 ); 6641 } 6642 6643 var Video = { 6644 args: "autoplay", 6645 props: { 6646 automute: Boolean, 6647 autoplay: Boolean 6648 }, 6649 data: { 6650 automute: false, 6651 autoplay: true 6652 }, 6653 beforeConnect() { 6654 if (this.autoplay === "inview" && !hasAttr(this.$el, "preload")) { 6655 this.$el.preload = "none"; 6656 } 6657 if (isTag(this.$el, "iframe") && !hasAttr(this.$el, "allow")) { 6658 this.$el.allow = "autoplay"; 6659 } 6660 if (this.autoplay === "hover") { 6661 if (isTag(this.$el, "video")) { 6662 this.$el.tabindex = 0; 6663 } else { 6664 this.autoplay = true; 6665 } 6666 } 6667 if (this.automute) { 6668 mute(this.$el); 6669 } 6670 }, 6671 events: [ 6672 { 6673 name: `${pointerEnter} focusin`, 6674 filter: ({ autoplay }) => includes(autoplay, "hover"), 6675 handler(e) { 6676 if (!isTouch(e) || !isPlaying(this.$el)) { 6677 play(this.$el); 6678 } else { 6679 pause(this.$el); 6680 } 6681 } 6682 }, 6683 { 6684 name: `${pointerLeave} focusout`, 6685 filter: ({ autoplay }) => includes(autoplay, "hover"), 6686 handler(e) { 6687 if (!isTouch(e)) { 6688 pause(this.$el); 6689 } 6690 } 6691 } 6692 ], 6693 observe: [ 6694 intersection({ 6695 filter: ({ $el, autoplay }) => autoplay && autoplay !== "hover" && isVideo($el), 6696 handler([{ isIntersecting }]) { 6697 if (!document.fullscreenElement) { 6698 if (isIntersecting) { 6699 play(this.$el); 6700 } else { 6701 pause(this.$el); 6702 } 6703 } 6704 }, 6705 args: { intersecting: false }, 6706 options: ({ $el, autoplay }) => ({ root: autoplay === "inview" ? null : parent($el) }) 6707 }) 6708 ] 6709 }; 6710 function isPlaying(videoEl) { 6711 return !videoEl.paused && !videoEl.ended; 6712 } 6713 6714 var cover = { 6715 mixins: [Video], 6716 props: { 6717 width: Number, 6718 height: Number 6719 }, 6720 data: { 6721 automute: true 6722 }, 6723 created() { 6724 this.useObjectFit = isTag(this.$el, "img", "video"); 6725 }, 6726 observe: resize({ 6727 target: ({ $el }) => getPositionedParent($el) || parent($el), 6728 filter: ({ useObjectFit }) => !useObjectFit 6729 }), 6730 update: { 6731 read() { 6732 if (this.useObjectFit) { 6733 return false; 6734 } 6735 const { ratio, cover } = Dimensions; 6736 const { $el, width, height } = this; 6737 let dim = { width, height }; 6738 if (!width || !height) { 6739 const intrinsic = { 6740 width: $el.naturalWidth || $el.videoWidth || $el.clientWidth, 6741 height: $el.naturalHeight || $el.videoHeight || $el.clientHeight 6742 }; 6743 if (width) { 6744 dim = ratio(intrinsic, "width", width); 6745 } else if (height) { 6746 dim = ratio(intrinsic, "height", height); 6747 } else { 6748 dim = intrinsic; 6749 } 6750 } 6751 const { offsetHeight: coverHeight, offsetWidth: coverWidth } = getPositionedParent($el) || parent($el); 6752 const coverDim = cover(dim, { width: coverWidth, height: coverHeight }); 6753 if (!coverDim.width || !coverDim.height) { 6754 return false; 6755 } 6756 return coverDim; 6757 }, 6758 write({ height, width }) { 6759 css(this.$el, { height, width }); 6760 }, 6761 events: ["resize"] 6762 } 6763 }; 6764 function getPositionedParent(el) { 6765 while (el = parent(el)) { 6766 if (css(el, "position") !== "static") { 6767 return el; 6768 } 6769 } 6770 } 6771 6772 let active; 6773 var drop = { 6774 mixins: [Container, Position, Togglable], 6775 args: "pos", 6776 props: { 6777 mode: "list", 6778 toggle: Boolean, 6779 boundary: Boolean, 6780 boundaryX: Boolean, 6781 boundaryY: Boolean, 6782 target: Boolean, 6783 targetX: Boolean, 6784 targetY: Boolean, 6785 stretch: Boolean, 6786 delayShow: Number, 6787 delayHide: Number, 6788 autoUpdate: Boolean, 6789 clsDrop: String, 6790 animateOut: Boolean, 6791 bgScroll: Boolean, 6792 closeOnScroll: Boolean 6793 }, 6794 data: { 6795 mode: ["click", "hover"], 6796 toggle: "- *", 6797 boundary: false, 6798 boundaryX: false, 6799 boundaryY: false, 6800 target: false, 6801 targetX: false, 6802 targetY: false, 6803 stretch: false, 6804 delayShow: 0, 6805 delayHide: 800, 6806 autoUpdate: true, 6807 clsDrop: false, 6808 animateOut: false, 6809 bgScroll: true, 6810 animation: ["bdt-animation-fade"], 6811 cls: "bdt-open", 6812 container: false, 6813 closeOnScroll: false 6814 }, 6815 computed: { 6816 boundary({ boundary, boundaryX, boundaryY }, $el) { 6817 return [ 6818 query(boundaryX || boundary, $el) || window, 6819 query(boundaryY || boundary, $el) || window 6820 ]; 6821 }, 6822 target({ target, targetX, targetY }, $el) { 6823 targetX || (targetX = target || this.targetEl); 6824 targetY || (targetY = target || this.targetEl); 6825 return [ 6826 targetX === true ? window : query(targetX, $el), 6827 targetY === true ? window : query(targetY, $el) 6828 ]; 6829 } 6830 }, 6831 created() { 6832 this.tracker = new MouseTracker(); 6833 }, 6834 beforeConnect() { 6835 this.clsDrop = this.$props.clsDrop || this.$options.id; 6836 }, 6837 connected() { 6838 addClass(this.$el, "bdt-drop", this.clsDrop); 6839 if (this.toggle && !this.targetEl) { 6840 this.targetEl = createToggleComponent(this); 6841 } 6842 this._style = pick(this.$el.style, ["width", "height"]); 6843 }, 6844 disconnected() { 6845 if (this.isActive()) { 6846 this.hide(false); 6847 active = null; 6848 } 6849 css(this.$el, this._style); 6850 }, 6851 events: [ 6852 { 6853 name: "click", 6854 delegate: () => ".bdt-drop-close", 6855 handler(e) { 6856 e.preventDefault(); 6857 this.hide(false); 6858 } 6859 }, 6860 { 6861 name: "click", 6862 delegate: () => 'a[href*="#"]', 6863 handler({ defaultPrevented, current }) { 6864 const { hash } = current; 6865 if (!defaultPrevented && hash && isSameSiteAnchor(current) && !this.$el.contains($(hash))) { 6866 this.hide(false); 6867 } 6868 } 6869 }, 6870 { 6871 name: "beforescroll", 6872 handler() { 6873 this.hide(false); 6874 } 6875 }, 6876 { 6877 name: "toggle", 6878 self: true, 6879 handler(e, toggle) { 6880 e.preventDefault(); 6881 if (this.isToggled()) { 6882 this.hide(false); 6883 } else { 6884 this.show(toggle == null ? void 0 : toggle.$el, false); 6885 } 6886 } 6887 }, 6888 { 6889 name: "toggleshow", 6890 self: true, 6891 handler(e, toggle) { 6892 e.preventDefault(); 6893 this.show(toggle == null ? void 0 : toggle.$el); 6894 } 6895 }, 6896 { 6897 name: "togglehide", 6898 self: true, 6899 handler(e) { 6900 e.preventDefault(); 6901 if (!matches(this.$el, ":focus,:hover")) { 6902 this.hide(); 6903 } 6904 } 6905 }, 6906 { 6907 name: `${pointerEnter} focusin`, 6908 filter: ({ mode }) => includes(mode, "hover"), 6909 handler(e) { 6910 if (!isTouch(e)) { 6911 this.clearTimers(); 6912 } 6913 } 6914 }, 6915 { 6916 name: `${pointerLeave} focusout`, 6917 filter: ({ mode }) => includes(mode, "hover"), 6918 handler(e) { 6919 if (!isTouch(e) && e.relatedTarget) { 6920 this.hide(); 6921 } 6922 } 6923 }, 6924 { 6925 name: "toggled", 6926 self: true, 6927 handler(e, toggled) { 6928 if (toggled) { 6929 this.clearTimers(); 6930 this.position(); 6931 } 6932 } 6933 }, 6934 { 6935 name: "show", 6936 self: true, 6937 handler() { 6938 active = this; 6939 this.tracker.init(); 6940 attr(this.targetEl, "aria-expanded", true); 6941 const handlers = [ 6942 listenForResize(this), 6943 listenForEscClose(this),
vendor: 6,485 bytes, lines 6944-7119
6944 listenForBackgroundClose(this), 6945 this.autoUpdate && listenForScroll(this), 6946 this.closeOnScroll && listenForScrollClose(this) 6947 ]; 6948 once(this.$el, "hide", () => handlers.forEach((handler) => handler && handler()), { 6949 self: true 6950 }); 6951 if (!this.bgScroll) { 6952 once(this.$el, "hidden", preventBackgroundScroll(this.$el), { self: true }); 6953 } 6954 } 6955 }, 6956 { 6957 name: "beforehide", 6958 self: true, 6959 handler: "clearTimers" 6960 }, 6961 { 6962 name: "hide", 6963 handler({ target }) { 6964 if (this.$el !== target) { 6965 active = active === null && this.$el.contains(target) && this.isToggled() ? this : active; 6966 return; 6967 } 6968 active = this.isActive() ? null : active; 6969 this.tracker.cancel(); 6970 attr(this.targetEl, "aria-expanded", null); 6971 } 6972 } 6973 ], 6974 update: { 6975 write() { 6976 if (this.isToggled() && !hasClass(this.$el, this.clsEnter)) { 6977 this.position(); 6978 } 6979 } 6980 }, 6981 methods: { 6982 show(target = this.targetEl, delay = true) { 6983 if (this.isToggled() && target && this.targetEl && target !== this.targetEl) { 6984 this.hide(false, false); 6985 } 6986 this.targetEl = target; 6987 this.clearTimers(); 6988 if (this.isActive()) { 6989 return; 6990 } 6991 if (active) { 6992 if (delay && active.isDelaying()) { 6993 this.showTimer = setTimeout(() => matches(target, ":hover") && this.show(), 10); 6994 return; 6995 } 6996 let prev; 6997 while (active && prev !== active && !active.$el.contains(this.$el)) { 6998 prev = active; 6999 active.hide(false, false); 7000 } 7001 } 7002 if (this.container && parent(this.$el) !== this.container) { 7003 append(this.container, this.$el); 7004 } 7005 this.showTimer = setTimeout( 7006 () => this.toggleElement(this.$el, true), 7007 delay && this.delayShow || 0 7008 ); 7009 }, 7010 hide(delay = true, animate = true) { 7011 const hide = () => this.toggleElement(this.$el, false, this.animateOut && animate); 7012 this.clearTimers(); 7013 this.isDelayedHide = delay; 7014 if (delay && this.isDelaying()) { 7015 this.hideTimer = setTimeout(this.hide, 50); 7016 } else if (delay && this.delayHide) { 7017 this.hideTimer = setTimeout(hide, this.delayHide); 7018 } else { 7019 hide(); 7020 } 7021 }, 7022 clearTimers() { 7023 clearTimeout(this.showTimer); 7024 clearTimeout(this.hideTimer); 7025 this.showTimer = null; 7026 this.hideTimer = null; 7027 }, 7028 isActive() { 7029 return active === this; 7030 }, 7031 isDelaying() { 7032 return [this.$el, ...$$(".bdt-drop", this.$el)].some((el) => this.tracker.movesTo(el)); 7033 }, 7034 position() { 7035 const restoreScrollPosition = storeScrollPosition(this.$el); 7036 removeClass(this.$el, "bdt-drop-stack"); 7037 css(this.$el, this._style); 7038 this.$el.hidden = true; 7039 const viewports = this.target.map((target) => getViewport$1(this.$el, target)); 7040 const viewportOffset = this.getViewportOffset(this.$el); 7041 const dirs = [ 7042 [0, ["x", "width", "left", "right"]], 7043 [1, ["y", "height", "top", "bottom"]] 7044 ]; 7045 for (const [i, [axis, prop]] of dirs) { 7046 if (this.axis !== axis && includes([axis, true], this.stretch)) { 7047 css(this.$el, { 7048 [prop]: Math.min( 7049 offset(this.boundary[i])[prop], 7050 viewports[i][prop] - 2 * viewportOffset 7051 ), 7052 [`overflow-${axis}`]: "auto" 7053 }); 7054 } 7055 } 7056 const maxWidth = viewports[0].width - 2 * viewportOffset; 7057 this.$el.hidden = false; 7058 css(this.$el, "maxWidth", ""); 7059 if (this.$el.offsetWidth > maxWidth) { 7060 addClass(this.$el, "bdt-drop-stack"); 7061 } 7062 css(this.$el, "maxWidth", maxWidth); 7063 this.positionAt(this.$el, this.target, this.boundary); 7064 for (const [i, [axis, prop, start, end]] of dirs) { 7065 if (this.axis === axis && includes([axis, true], this.stretch)) { 7066 const positionOffset = Math.abs(this.getPositionOffset()); 7067 const targetOffset = offset(this.target[i]); 7068 const elOffset = offset(this.$el); 7069 css(this.$el, { 7070 [prop]: (targetOffset[start] > elOffset[start] ? targetOffset[this.inset ? end : start] - Math.max( 7071 offset(this.boundary[i])[start], 7072 viewports[i][start] + viewportOffset 7073 ) : Math.min( 7074 offset(this.boundary[i])[end], 7075 viewports[i][end] - viewportOffset 7076 ) - targetOffset[this.inset ? start : end]) - positionOffset, 7077 [`overflow-${axis}`]: "auto" 7078 }); 7079 this.positionAt(this.$el, this.target, this.boundary); 7080 } 7081 } 7082 restoreScrollPosition(); 7083 } 7084 } 7085 }; 7086 function getViewport$1(el, target) { 7087 return offsetViewport(overflowParents(target).find((parent2) => parent2.contains(el))); 7088 } 7089 function createToggleComponent(drop) { 7090 const { $el } = drop.$create("toggle", query(drop.toggle, drop.$el), { 7091 target: drop.$el, 7092 mode: drop.mode 7093 }); 7094 attr($el, "aria-haspopup", true); 7095 return $el; 7096 } 7097 function listenForResize(drop) { 7098 const update = () => drop.$emit(); 7099 const off = [ 7100 observeViewportResize(update), 7101 observeResize(overflowParents(drop.$el).concat(drop.target), update) 7102 ]; 7103 return () => off.map((observer) => observer.disconnect()); 7104 } 7105 function listenForScroll(drop, fn = () => drop.$emit()) { 7106 return on([document, ...overflowParents(drop.$el)], "scroll", fn, { 7107 passive: true 7108 }); 7109 } 7110 function listenForEscClose(drop) { 7111 return on(document, "keydown", (e) => { 7112 if (e.keyCode === keyMap.ESC) { 7113 drop.hide(false); 7114 } 7115 }); 7116 } 7117 function listenForScrollClose(drop) { 7118 return listenForScroll(drop, () => drop.hide(false)); 7119 }
vendor: 13,583 bytes, lines 7120-7525
7120 function listenForBackgroundClose(drop) { 7121 return on(document, pointerDown$1, ({ target }) => { 7122 if (drop.$el.contains(target)) { 7123 return; 7124 } 7125 once( 7126 document, 7127 `${pointerUp$1} ${pointerCancel} scroll`, 7128 ({ defaultPrevented, type, target: newTarget }) => { 7129 var _a; 7130 if (!defaultPrevented && type === pointerUp$1 && target === newTarget && !((_a = drop.targetEl) == null ? void 0 : _a.contains(target))) { 7131 drop.hide(false); 7132 } 7133 }, 7134 true 7135 ); 7136 }); 7137 } 7138 7139 var Dropnav = { 7140 mixins: [Class, Container], 7141 props: { 7142 align: String, 7143 clsDrop: String, 7144 boundary: Boolean, 7145 dropbar: Boolean, 7146 dropbarAnchor: Boolean, 7147 duration: Number, 7148 mode: Boolean, 7149 offset: Boolean, 7150 stretch: Boolean, 7151 delayShow: Boolean, 7152 delayHide: Boolean, 7153 target: Boolean, 7154 targetX: Boolean, 7155 targetY: Boolean, 7156 animation: Boolean, 7157 animateOut: Boolean, 7158 closeOnScroll: Boolean 7159 }, 7160 data: { 7161 align: isRtl ? "right" : "left", 7162 clsDrop: "bdt-dropdown", 7163 clsDropbar: "bdt-dropnav-dropbar", 7164 boundary: true, 7165 dropbar: false, 7166 dropbarAnchor: false, 7167 duration: 200, 7168 container: false, 7169 selNavItem: "> li > a, > ul > li > a" 7170 }, 7171 computed: { 7172 dropbarAnchor: ({ dropbarAnchor }, $el) => query(dropbarAnchor, $el) || $el, 7173 dropbar({ dropbar }) { 7174 if (!dropbar) { 7175 return null; 7176 } 7177 dropbar = this._dropbar || query(dropbar, this.$el) || $(`+ .${this.clsDropbar}`, this.$el); 7178 return dropbar ? dropbar : this._dropbar = $("<div></div>"); 7179 }, 7180 dropContainer(_, $el) { 7181 return this.container || $el; 7182 }, 7183 dropdowns({ clsDrop }, $el) { 7184 var _a; 7185 const dropdowns = $$(`.${clsDrop}`, $el); 7186 if (this.dropContainer !== $el) { 7187 for (const el of $$(`.${clsDrop}`, this.dropContainer)) { 7188 const target = (_a = this.getDropdown(el)) == null ? void 0 : _a.targetEl; 7189 if (!includes(dropdowns, el) && target && this.$el.contains(target)) { 7190 dropdowns.push(el); 7191 } 7192 } 7193 } 7194 return dropdowns; 7195 }, 7196 items({ selNavItem }, $el) { 7197 return $$(selNavItem, $el); 7198 } 7199 }, 7200 watch: { 7201 dropbar(dropbar) { 7202 addClass( 7203 dropbar, 7204 "bdt-dropbar", 7205 "bdt-dropbar-top", 7206 this.clsDropbar, 7207 `bdt-${this.$options.name}-dropbar` 7208 ); 7209 }, 7210 dropdowns() { 7211 this.initializeDropdowns(); 7212 } 7213 }, 7214 connected() { 7215 this.initializeDropdowns(); 7216 }, 7217 disconnected() { 7218 remove$1(this._dropbar); 7219 delete this._dropbar; 7220 }, 7221 events: [ 7222 { 7223 name: "mouseover focusin", 7224 delegate: ({ selNavItem }) => selNavItem, 7225 handler({ current }) { 7226 const active2 = this.getActive(); 7227 if (active2 && includes(active2.mode, "hover") && active2.targetEl && !current.contains(active2.targetEl) && !active2.isDelaying()) { 7228 active2.hide(false); 7229 } 7230 } 7231 }, 7232 { 7233 name: "keydown", 7234 self: true, 7235 delegate: ({ selNavItem }) => selNavItem, 7236 handler(e) { 7237 var _a; 7238 const { current, keyCode } = e; 7239 const active2 = this.getActive(); 7240 if (keyCode === keyMap.DOWN && (active2 == null ? void 0 : active2.targetEl) === current) { 7241 e.preventDefault(); 7242 (_a = $(selFocusable, active2.$el)) == null ? void 0 : _a.focus(); 7243 } 7244 handleNavItemNavigation(e, this.items, active2); 7245 } 7246 }, 7247 { 7248 name: "keydown", 7249 el: ({ dropContainer }) => dropContainer, 7250 delegate: ({ clsDrop }) => `.${clsDrop}`, 7251 handler(e) { 7252 var _a; 7253 const { current, keyCode, target } = e; 7254 if (isInput(target) || !includes(this.dropdowns, current)) { 7255 return; 7256 } 7257 const active2 = this.getActive(); 7258 let next = -1; 7259 if (keyCode === keyMap.HOME) { 7260 next = 0; 7261 } else if (keyCode === keyMap.END) { 7262 next = "last"; 7263 } else if (keyCode === keyMap.UP) { 7264 next = "previous"; 7265 } else if (keyCode === keyMap.DOWN) { 7266 next = "next"; 7267 } else if (keyCode === keyMap.ESC) { 7268 (_a = active2.targetEl) == null ? void 0 : _a.focus(); 7269 } 7270 if (~next) { 7271 e.preventDefault(); 7272 const elements = $$(selFocusable, current); 7273 elements[getIndex( 7274 next, 7275 elements, 7276 findIndex(elements, (el) => matches(el, ":focus")) 7277 )].focus(); 7278 } 7279 handleNavItemNavigation(e, this.items, active2); 7280 } 7281 }, 7282 { 7283 name: "mouseleave", 7284 el: ({ dropbar }) => dropbar, 7285 filter: ({ dropbar }) => dropbar, 7286 handler() { 7287 const active2 = this.getActive(); 7288 if (active2 && includes(active2.mode, "hover") && !this.dropdowns.some((el) => matches(el, ":hover"))) { 7289 active2.hide(); 7290 } 7291 } 7292 }, 7293 { 7294 name: "beforeshow", 7295 el: ({ dropContainer }) => dropContainer, 7296 filter: ({ dropbar }) => dropbar, 7297 handler({ target }) { 7298 if (!this.isDropbarDrop(target)) { 7299 return; 7300 } 7301 if (this.dropbar.previousElementSibling !== this.dropbarAnchor) { 7302 after(this.dropbarAnchor, this.dropbar); 7303 } 7304 addClass(target, `${this.clsDrop}-dropbar`); 7305 } 7306 }, 7307 { 7308 name: "show", 7309 el: ({ dropContainer }) => dropContainer, 7310 filter: ({ dropbar }) => dropbar, 7311 handler({ target }) { 7312 if (!this.isDropbarDrop(target)) { 7313 return; 7314 } 7315 const drop = this.getDropdown(target); 7316 const adjustHeight = () => { 7317 const maxBottom = Math.max( 7318 ...parents(target, `.${this.clsDrop}`).concat(target).map((el) => offset(el).bottom) 7319 ); 7320 offset(this.dropbar, { 7321 left: offset(this.dropbar).left, 7322 top: this.getDropbarOffset(drop.getPositionOffset()) 7323 }); 7324 this.transitionTo( 7325 maxBottom - offset(this.dropbar).top + toFloat(css(target, "marginBottom")), 7326 target 7327 ); 7328 }; 7329 this._observer = observeResize([drop.$el, ...drop.target], adjustHeight); 7330 adjustHeight(); 7331 } 7332 }, 7333 { 7334 name: "beforehide", 7335 el: ({ dropContainer }) => dropContainer, 7336 filter: ({ dropbar }) => dropbar, 7337 handler(e) { 7338 const active2 = this.getActive(); 7339 if (matches(this.dropbar, ":hover") && active2.$el === e.target && this.isDropbarDrop(active2.$el) && includes(active2.mode, "hover") && active2.isDelayedHide && !this.items.some((el) => active2.targetEl !== el && matches(el, ":focus"))) { 7340 e.preventDefault(); 7341 } 7342 } 7343 }, 7344 { 7345 name: "hide", 7346 el: ({ dropContainer }) => dropContainer, 7347 filter: ({ dropbar }) => dropbar, 7348 handler({ target }) { 7349 var _a; 7350 if (!this.isDropbarDrop(target)) { 7351 return; 7352 } 7353 (_a = this._observer) == null ? void 0 : _a.disconnect(); 7354 const active2 = this.getActive(); 7355 if (!active2 || active2.$el === target) { 7356 this.transitionTo(0); 7357 } 7358 } 7359 } 7360 ], 7361 methods: { 7362 getActive() { 7363 var _a; 7364 return includes(this.dropdowns, (_a = active) == null ? void 0 : _a.$el) && active; 7365 }, 7366 async transitionTo(newHeight, el) { 7367 const { dropbar } = this; 7368 const oldHeight = height(dropbar); 7369 el = oldHeight < newHeight && el; 7370 await Transition.cancel([el, dropbar]); 7371 if (el) { 7372 const diff = offset(el).top - offset(dropbar).top - oldHeight; 7373 if (diff > 0) { 7374 css(el, "transitionDelay", `${diff / newHeight * this.duration}ms`); 7375 } 7376 } 7377 css(el, "clipPath", `polygon(0 0,100% 0,100% ${oldHeight}px,0 ${oldHeight}px)`); 7378 height(dropbar, oldHeight); 7379 await Promise.all([ 7380 Transition.start(dropbar, { height: newHeight }, this.duration), 7381 Transition.start( 7382 el, 7383 { clipPath: `polygon(0 0,100% 0,100% ${newHeight}px,0 ${newHeight}px)` }, 7384 this.duration 7385 ).finally(() => css(el, { clipPath: "", transitionDelay: "" })) 7386 ]).catch(noop); 7387 }, 7388 getDropdown(el) { 7389 return this.$getComponent(el, "drop") || this.$getComponent(el, "dropdown"); 7390 }, 7391 isDropbarDrop(el) { 7392 return includes(this.dropdowns, el) && hasClass(el, this.clsDrop); 7393 }, 7394 getDropbarOffset(offsetTop) { 7395 const { $el, target, targetY } = this; 7396 const { top, height: height2 } = offset(query(targetY || target || $el, $el)); 7397 return top + height2 + offsetTop; 7398 }, 7399 initializeDropdowns() { 7400 this.$create( 7401 "drop", 7402 this.dropdowns.filter((el) => !this.getDropdown(el)), 7403 { 7404 ...this.$props, 7405 flip: false, 7406 shift: true, 7407 pos: `bottom-${this.align}`, 7408 boundary: this.boundary === true ? this.$el : this.boundary 7409 } 7410 ); 7411 } 7412 } 7413 }; 7414 function handleNavItemNavigation(e, toggles, active2) { 7415 var _a, _b, _c; 7416 const { current, keyCode } = e; 7417 let next = -1; 7418 if (keyCode === keyMap.HOME) { 7419 next = 0; 7420 } else if (keyCode === keyMap.END) { 7421 next = "last"; 7422 } else if (keyCode === keyMap.LEFT) { 7423 next = "previous"; 7424 } else if (keyCode === keyMap.RIGHT) { 7425 next = "next"; 7426 } else if (keyCode === keyMap.TAB) { 7427 (_a = active2.targetEl) == null ? void 0 : _a.focus(); 7428 (_b = active2.hide) == null ? void 0 : _b.call(active2, false); 7429 } 7430 if (~next) { 7431 e.preventDefault(); 7432 (_c = active2.hide) == null ? void 0 : _c.call(active2, false); 7433 toggles[getIndex(next, toggles, toggles.indexOf(active2.targetEl || current))].focus(); 7434 } 7435 } 7436 7437 var formCustom = { 7438 mixins: [Class], 7439 args: "target", 7440 props: { 7441 target: Boolean 7442 }, 7443 data: { 7444 target: false 7445 }, 7446 computed: { 7447 input: (_, $el) => $(selInput, $el), 7448 state() { 7449 return this.input.nextElementSibling; 7450 }, 7451 target({ target }, $el) { 7452 return target && (target === true && parent(this.input) === $el && this.input.nextElementSibling || $(target, $el)); 7453 } 7454 }, 7455 update() { 7456 var _a; 7457 const { target, input } = this; 7458 if (!target) { 7459 return; 7460 } 7461 let option; 7462 const prop = isInput(target) ? "value" : "textContent"; 7463 const prev = target[prop]; 7464 const value = ((_a = input.files) == null ? void 0 : _a[0]) ? input.files[0].name : matches(input, "select") && (option = $$("option", input).filter((el) => el.selected)[0]) ? option.textContent : input.value; 7465 if (prev !== value) { 7466 target[prop] = value; 7467 } 7468 }, 7469 events: [ 7470 { 7471 name: "change", 7472 handler() { 7473 this.$emit(); 7474 } 7475 }, 7476 { 7477 name: "reset", 7478 el: ({ $el }) => $el.closest("form"), 7479 handler() { 7480 this.$emit(); 7481 } 7482 } 7483 ] 7484 }; 7485 7486 var grid = { 7487 extends: Margin, 7488 mixins: [Class], 7489 name: "grid", 7490 props: { 7491 masonry: Boolean, 7492 parallax: String, 7493 parallaxStart: String, 7494 parallaxEnd: String, 7495 parallaxJustify: Boolean 7496 }, 7497 data: { 7498 margin: "bdt-grid-margin", 7499 clsStack: "bdt-grid-stack", 7500 masonry: false, 7501 parallax: 0, 7502 parallaxStart: 0, 7503 parallaxEnd: 0, 7504 parallaxJustify: false 7505 }, 7506 connected() { 7507 this.masonry && addClass(this.$el, "bdt-flex-top", "bdt-flex-wrap-top"); 7508 }, 7509 observe: scroll$1({ filter: ({ parallax, parallaxJustify }) => parallax || parallaxJustify }), 7510 update: [ 7511 { 7512 write({ rows }) { 7513 toggleClass(this.$el, this.clsStack, !rows.some((row) => row.length > 1)); 7514 }, 7515 events: ["resize"] 7516 }, 7517 { 7518 read(data) { 7519 const { rows } = data; 7520 let { masonry, parallax, parallaxJustify, margin } = this; 7521 parallax = Math.max(0, toPx(parallax)); 7522 if (!(masonry || parallax || parallaxJustify) || positionedAbsolute(rows) || rows[0].some( 7523 (el, i) => rows.some((row) => row[i] && row[i].offsetWidth !== el.offsetWidth) 7524 )) { 7525 return data.translates = data.scrollColumns = false;
vendor: 4,899 bytes, lines 7526-7673
7526 } 7527 let gutter = getGutter(rows, margin); 7528 let columns; 7529 let translates; 7530 if (masonry) { 7531 [columns, translates] = applyMasonry(rows, gutter, masonry === "next"); 7532 } else { 7533 columns = transpose(rows); 7534 } 7535 const columnHeights = columns.map( 7536 (column) => sumBy(column, "offsetHeight") + gutter * (column.length - 1) 7537 ); 7538 const height = Math.max(0, ...columnHeights); 7539 let scrollColumns; 7540 let parallaxStart; 7541 let parallaxEnd; 7542 if (parallax || parallaxJustify) { 7543 scrollColumns = columnHeights.map( 7544 (hgt, i) => parallaxJustify ? height - hgt + parallax : parallax / (i % 2 || 8) 7545 ); 7546 if (!parallaxJustify) { 7547 parallax = Math.max( 7548 ...columnHeights.map((hgt, i) => hgt + scrollColumns[i] - height) 7549 ); 7550 } 7551 parallaxStart = toPx(this.parallaxStart, "height", this.$el, true); 7552 parallaxEnd = toPx(this.parallaxEnd, "height", this.$el, true); 7553 } 7554 return { 7555 columns, 7556 translates, 7557 scrollColumns, 7558 parallaxStart, 7559 parallaxEnd, 7560 padding: parallax, 7561 height: translates ? height : "" 7562 }; 7563 }, 7564 write({ height, padding }) { 7565 css(this.$el, "paddingBottom", padding || ""); 7566 height !== false && css(this.$el, "height", height); 7567 }, 7568 events: ["resize"] 7569 }, 7570 { 7571 read({ rows, scrollColumns, parallaxStart, parallaxEnd }) { 7572 return { 7573 scrolled: scrollColumns && !positionedAbsolute(rows) ? scrolledOver(this.$el, parallaxStart, parallaxEnd) : false 7574 }; 7575 }, 7576 write({ columns, scrolled, scrollColumns, translates }) { 7577 if (!scrolled && !translates) { 7578 return; 7579 } 7580 columns.forEach( 7581 (column, i) => column.forEach((el, j) => { 7582 let [x, y] = translates && translates[i][j] || [0, 0]; 7583 if (scrolled) { 7584 y += scrolled * scrollColumns[i]; 7585 } 7586 css(el, "transform", `translate(${x}px, ${y}px)`); 7587 }) 7588 ); 7589 }, 7590 events: ["scroll", "resize"] 7591 } 7592 ] 7593 }; 7594 function positionedAbsolute(rows) { 7595 return rows.flat().some((el) => css(el, "position") === "absolute"); 7596 } 7597 function applyMasonry(rows, gutter, next) { 7598 const columns = []; 7599 const translates = []; 7600 const columnHeights = Array(rows[0].length).fill(0); 7601 let rowHeights = 0; 7602 for (let row of rows) { 7603 if (isRtl) { 7604 row = row.reverse(); 7605 } 7606 let height = 0; 7607 for (const j in row) { 7608 const { offsetWidth, offsetHeight } = row[j]; 7609 const index = next ? j : columnHeights.indexOf(Math.min(...columnHeights)); 7610 push(columns, index, row[j]); 7611 push(translates, index, [ 7612 (index - j) * offsetWidth * (isRtl ? -1 : 1), 7613 columnHeights[index] - rowHeights 7614 ]); 7615 columnHeights[index] += offsetHeight + gutter; 7616 height = Math.max(height, offsetHeight); 7617 } 7618 rowHeights += height + gutter; 7619 } 7620 return [columns, translates]; 7621 } 7622 function getGutter(rows, cls) { 7623 const node = rows.flat().find((el) => hasClass(el, cls)); 7624 return toFloat(node ? css(node, "marginTop") : css(rows[0][0], "paddingLeft")); 7625 } 7626 function transpose(rows) { 7627 const columns = []; 7628 for (const row of rows) { 7629 for (const i in row) { 7630 push(columns, i, row[i]); 7631 } 7632 } 7633 return columns; 7634 } 7635 function push(array, index, value) { 7636 if (!array[index]) { 7637 array[index] = []; 7638 } 7639 array[index].push(value); 7640 } 7641 7642 var heightMatch = { 7643 args: "target", 7644 props: { 7645 target: String, 7646 row: Boolean 7647 }, 7648 data: { 7649 target: "> *", 7650 row: true 7651 }, 7652 computed: { 7653 elements: ({ target }, $el) => $$(target, $el) 7654 }, 7655 observe: resize({ 7656 target: ({ $el, elements }) => elements.reduce((elements2, el) => elements2.concat(el, ...el.children), [$el]) 7657 }), 7658 events: { 7659 // Hidden elements may change height when fonts load 7660 name: "loadingdone", 7661 el: () => document.fonts, 7662 handler() { 7663 this.$emit("resize"); 7664 } 7665 }, 7666 update: { 7667 read() { 7668 return { 7669 rows: (this.row ? getRows(this.elements) : [this.elements]).map(match) 7670 }; 7671 }, 7672 write({ rows }) { 7673 for (const { heights, elements } of rows) {
vendor: 5,849 bytes, lines 7674-7807
7674 elements.forEach((el, i) => css(el, "minHeight", heights[i])); 7675 } 7676 }, 7677 events: ["resize"] 7678 } 7679 }; 7680 function match(elements) { 7681 if (elements.length < 2) { 7682 return { heights: [""], elements }; 7683 } 7684 let heights = elements.map(getHeight); 7685 const max = Math.max(...heights); 7686 return { 7687 heights: elements.map((el, i) => heights[i].toFixed(2) === max.toFixed(2) ? "" : max), 7688 elements 7689 }; 7690 } 7691 function getHeight(element) { 7692 const style = pick(element.style, ["display", "minHeight"]); 7693 if (!isVisible(element)) { 7694 css(element, "display", "block", "important"); 7695 } 7696 css(element, "minHeight", ""); 7697 const height = dimensions$1(element).height - boxModelAdjust(element, "height", "content-box"); 7698 css(element, style); 7699 return height; 7700 } 7701 7702 var heightPlaceholder = { 7703 args: "target", 7704 props: { 7705 target: String 7706 }, 7707 data: { 7708 target: "" 7709 }, 7710 computed: { 7711 target: { 7712 get: ({ target }, $el) => query(target, $el), 7713 observe: ({ target }) => target 7714 } 7715 }, 7716 observe: resize({ target: ({ target }) => target }), 7717 update: { 7718 read() { 7719 return this.target ? { height: this.target.offsetHeight } : false; 7720 }, 7721 write({ height }) { 7722 css(this.$el, { minHeight: height }); 7723 }, 7724 events: ["resize"] 7725 } 7726 }; 7727 7728 var heightViewport = { 7729 props: { 7730 expand: Boolean, 7731 offsetTop: Boolean, 7732 offsetBottom: Boolean, 7733 minHeight: Number 7734 }, 7735 data: { 7736 expand: false, 7737 offsetTop: false, 7738 offsetBottom: false, 7739 minHeight: 0 7740 }, 7741 // check for offsetTop change 7742 observe: [ 7743 viewport({ filter: ({ expand }) => expand }), 7744 resize({ target: ({ $el }) => scrollParents($el) }) 7745 ], 7746 update: { 7747 read() { 7748 if (!isVisible(this.$el)) { 7749 return false; 7750 } 7751 let minHeight = ""; 7752 const box = boxModelAdjust(this.$el, "height", "content-box"); 7753 const { body, scrollingElement } = document; 7754 const scrollElement = scrollParent(this.$el); 7755 const { height: viewportHeight } = offsetViewport( 7756 scrollElement === body ? scrollingElement : scrollElement 7757 ); 7758 const isScrollingElement = scrollingElement === scrollElement || body === scrollElement; 7759 minHeight = `calc(${isScrollingElement ? "100vh" : `${viewportHeight}px`}`; 7760 if (this.expand) { 7761 const diff = dimensions$1(scrollElement).height - dimensions$1(this.$el).height; 7762 minHeight += ` - ${diff}px`; 7763 } else { 7764 if (this.offsetTop) { 7765 if (isScrollingElement) { 7766 const offsetTopEl = this.offsetTop === true ? this.$el : query(this.offsetTop, this.$el); 7767 const { top } = offset(offsetTopEl); 7768 minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : ""; 7769 } else { 7770 minHeight += ` - ${boxModelAdjust(scrollElement, "height", css(scrollElement, "boxSizing"))}px`; 7771 } 7772 } 7773 if (this.offsetBottom === true) { 7774 minHeight += ` - ${dimensions$1(this.$el.nextElementSibling).height}px`; 7775 } else if (isNumeric(this.offsetBottom)) { 7776 minHeight += ` - ${this.offsetBottom}vh`; 7777 } else if (this.offsetBottom && endsWith(this.offsetBottom, "px")) { 7778 minHeight += ` - ${toFloat(this.offsetBottom)}px`; 7779 } else if (isString(this.offsetBottom)) { 7780 minHeight += ` - ${dimensions$1(query(this.offsetBottom, this.$el)).height}px`; 7781 } 7782 } 7783 minHeight += `${box ? ` - ${box}px` : ""})`; 7784 return { minHeight }; 7785 }, 7786 write({ minHeight }) { 7787 css(this.$el, "minHeight", `max(${this.minHeight || 0}px, ${minHeight})`); 7788 }, 7789 events: ["resize"] 7790 } 7791 }; 7792 7793 var closeIcon = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"1\" y1=\"1\" x2=\"13\" y2=\"13\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"13\" y1=\"1\" x2=\"1\" y2=\"13\"/></svg>"; 7794 7795 var closeLarge = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"1\" y1=\"1\" x2=\"19\" y2=\"19\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"19\" y1=\"1\" x2=\"1\" y2=\"19\"/></svg>"; 7796 7797 var dropParentIcon = "<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" points=\"1 3.5 6 8.5 11 3.5\"/></svg>"; 7798 7799 var marker = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><rect width=\"1\" height=\"11\" x=\"9\" y=\"4\"/><rect width=\"11\" height=\"1\" x=\"4\" y=\"9\"/></svg>"; 7800 7801 var navParentIconLarge = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" points=\"1 4 7 10 13 4\"/></svg>"; 7802 7803 var navParentIcon = "<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" points=\"1 3.5 6 8.5 11 3.5\"/></svg>"; 7804 7805 var navbarParentIcon = "<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" points=\"1 3.5 6 8.5 11 3.5\"/></svg>"; 7806 7807 var navbarToggleIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><style>.bdt-navbar-toggle-icon svg>[class*="line-"]{transition:0.2s ease-in-out;transition-property:transform, opacity;transform-origin:center;opacity:1}.bdt-navbar-toggle-icon svg>.line-3{opacity:0}
7807.bdt-navbar-toggle-animate[aria-expanded="true"] svg>.line-3{opacity:1}.bdt-navbar-toggle-animate[aria-expanded="true"] svg>.line-2{transform:rotate(45deg)}.bdt-navbar-toggle-animate[aria-expanded="true"] svg>.line-3{transform:rotate(-45deg)}.bdt-navbar-toggle-animate[aria-expanded="true"] svg>.line-1,.bdt-navbar-toggle-animate[aria-expanded="true"] svg>.line-4{opacity:0}.bdt-navbar-toggle-animate[aria-expanded="true"] svg>.line-1{transform:translateY(6px) scaleX(0)}.bdt-navbar-toggle-animate[aria-expanded="true"] svg>.line-4{transform:translateY(-6px) scaleX(0)}</style><rect width=\"20\" height=\"2\" y=\"3\" class=\"line-1\"/><rect width=\"20\" height=\"2\" y=\"9\" class=\"line-2\"/><rect width=\"20\" height=\"2\" y=\"9\" class=\"line-3\"/><rect width=\"20\" height=\"2\" y=\"15\" class=\"line-4\"/></svg>"; 7808 7809 var overlayIcon = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"><rect width=\"1\" height=\"40\" x=\"19\" y=\"0\"/><rect width=\"40\" height=\"1\" x=\"0\" y=\"19\"/></svg>"; 7810 7811 var paginationNext = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 1 6 6 1 11\"/></svg>"; 7812 7813 var paginationPrevious = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"6 1 1 6 6 11\"/></svg>"; 7814 7815 var searchIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"9\" cy=\"9\" r=\"7\"/><path fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" d=\"M14,14 L18,18 L14,14 Z\"/></svg>"; 7816 7817 var searchLarge = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" cx=\"17.5\" cy=\"17.5\" r=\"16.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" x1=\"38\" y1=\"39\" x2=\"29\" y2=\"30\"/></svg>"; 7818 7819 var searchMedium = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"10.5\" cy=\"10.5\" r=\"9.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"23\" y1=\"23\" x2=\"17\" y2=\"17\"/></svg>"; 7820 7821 var slidenavNextLarge = "<svg width=\"25\" height=\"40\" viewBox=\"0 0 25 40\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"4.002,38.547 22.527,20.024 4,1.5\"/></svg>"; 7822 7823 var slidenavNext = "<svg width=\"14\" height=\"24\" viewBox=\"0 0 14 24\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"1.225,23 12.775,12 1.225,1\"/></svg>"; 7824 7825 var slidenavPreviousLarge = "<svg width=\"25\" height=\"40\" viewBox=\"0 0 25 40\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"20.527,1.5 2,20.024 20.525,38.547\"/></svg>"; 7826 7827 var slidenavPrevious = "<svg width=\"14\" height=\"24\" viewBox=\"0 0 14 24\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"12.775,1 1.225,12 12.775,23\"/></svg>"; 7828 7829 var spinner = "<svg width=\"30\" height=\"30\" viewBox=\"0 0 30 30\"><circle fill=\"none\" stroke=\"#000\" cx=\"15\" cy=\"15\" r=\"14\"/></svg>"; 7830 7831 var totop = "<svg width=\"18\" height=\"10\" viewBox=\"0 0 18 10\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 9 9 1 17 9\"/></svg>"; 7832 7833 var Svg = { 7834 args: "src", 7835 props: { 7836 width: Number, 7837 height: Number, 7838 ratio: Number 7839 }, 7840 data: { 7841 ratio: 1 7842 }, 7843 connected() { 7844 this.svg = this.getSvg().then((el) => { 7845 if (!this._connected) { 7846 return; 7847 } 7848 const svg = insertSVG(el, this.$el); 7849 if (this.svgEl && svg !== this.svgEl) { 7850 remove$1(this.svgEl); 7851 } 7852 applyWidthAndHeight.call(this, svg, el); 7853 return this.svgEl = svg; 7854 }, noop); 7855 }, 7856 disconnected() { 7857 this.svg.then((svg) => { 7858 if (this._connected) { 7859 return; 7860 } 7861 if (isVoidElement(this.$el)) { 7862 this.$el.hidden = false;
vendor: 14,714 bytes, lines 7863-8358
7863 } 7864 remove$1(svg); 7865 this.svgEl = null; 7866 }); 7867 this.svg = null; 7868 }, 7869 methods: { 7870 async getSvg() { 7871 } 7872 } 7873 }; 7874 function insertSVG(el, root) { 7875 if (isVoidElement(root) || isTag(root, "canvas")) { 7876 root.hidden = true; 7877 const next = root.nextElementSibling; 7878 return equals(el, next) ? next : after(root, el); 7879 } 7880 const last = root.lastElementChild; 7881 return equals(el, last) ? last : append(root, el); 7882 } 7883 function equals(el, other) { 7884 return isTag(el, "svg") && isTag(other, "svg") && el.innerHTML === other.innerHTML; 7885 } 7886 function applyWidthAndHeight(el, ref) { 7887 const props = ["width", "height"]; 7888 let dimensions = props.map((prop) => this[prop]); 7889 if (!dimensions.some((val) => val)) { 7890 dimensions = props.map((prop) => attr(ref, prop)); 7891 } 7892 const viewBox = attr(ref, "viewBox"); 7893 if (viewBox && !dimensions.some((val) => val)) { 7894 dimensions = viewBox.split(" ").slice(2); 7895 } 7896 dimensions.forEach((val, i) => attr(el, props[i], toFloat(val) * this.ratio || null)); 7897 } 7898 7899 var svg = { 7900 mixins: [Svg], 7901 args: "src", 7902 props: { 7903 src: String, 7904 icon: String, 7905 attributes: "list", 7906 strokeAnimation: Boolean 7907 }, 7908 data: { 7909 strokeAnimation: false 7910 }, 7911 observe: [ 7912 mutation({ 7913 async handler() { 7914 const svg = await this.svg; 7915 if (svg) { 7916 applyAttributes.call(this, svg); 7917 } 7918 }, 7919 options: { 7920 attributes: true, 7921 attributeFilter: ["id", "class", "style"] 7922 } 7923 }) 7924 ], 7925 async connected() { 7926 if (includes(this.src, "#")) { 7927 [this.src, this.icon] = this.src.split("#"); 7928 } 7929 const svg = await this.svg; 7930 if (svg) { 7931 applyAttributes.call(this, svg); 7932 if (this.strokeAnimation) { 7933 applyAnimation(svg); 7934 } 7935 } 7936 }, 7937 methods: { 7938 async getSvg() { 7939 if (isTag(this.$el, "img") && !this.$el.complete && this.$el.loading === "lazy") { 7940 await new Promise((resolve) => once(this.$el, "load", resolve)); 7941 } 7942 return parseSVG(await loadSVG(this.src), this.icon) || Promise.reject("SVG not found."); 7943 } 7944 } 7945 }; 7946 function applyAttributes(el) { 7947 const { $el } = this; 7948 addClass(el, attr($el, "class"), "bdt-svg"); 7949 for (let i = 0; i < $el.style.length; i++) { 7950 const prop = $el.style[i]; 7951 css(el, prop, css($el, prop)); 7952 } 7953 for (const attribute in this.attributes) { 7954 const [prop, value] = this.attributes[attribute].split(":", 2); 7955 attr(el, prop, value); 7956 } 7957 if (!this.$el.id) { 7958 removeAttr(el, "id"); 7959 } 7960 } 7961 const loadSVG = memoize(async (src) => { 7962 if (src) { 7963 if (startsWith(src, "data:")) { 7964 return decodeURIComponent(src.split(",")[1]); 7965 } else { 7966 return (await fetch(src)).text(); 7967 } 7968 } else { 7969 return Promise.reject(); 7970 } 7971 }); 7972 function parseSVG(svg, icon) { 7973 if (icon && includes(svg, "<symbol")) { 7974 svg = parseSymbols(svg)[icon] || svg; 7975 } 7976 return stringToSvg(svg); 7977 } 7978 const symbolRe = /<symbol([^]*?id=(['"])(.+?)\2[^]*?<\/)symbol>/g; 7979 const parseSymbols = memoize(function(svg) { 7980 const symbols = {}; 7981 symbolRe.lastIndex = 0; 7982 let match; 7983 while (match = symbolRe.exec(svg)) { 7984 symbols[match[3]] = `<svg ${match[1]}svg>`; 7985 } 7986 return symbols; 7987 }); 7988 function applyAnimation(el) { 7989 const length = getMaxPathLength(el); 7990 if (length) { 7991 css(el, "--bdt-animation-stroke", length); 7992 } 7993 } 7994 function stringToSvg(string) { 7995 const container = document.createElement("template"); 7996 container.innerHTML = string; 7997 return container.content.firstElementChild; 7998 } 7999 8000 const icons = { 8001 spinner, 8002 totop, 8003 marker, 8004 "close-icon": closeIcon, 8005 "close-large": closeLarge, 8006 "drop-parent-icon": dropParentIcon, 8007 "nav-parent-icon": navParentIcon, 8008 "nav-parent-icon-large": navParentIconLarge, 8009 "navbar-parent-icon": navbarParentIcon, 8010 "navbar-toggle-icon": navbarToggleIcon, 8011 "overlay-icon": overlayIcon, 8012 "pagination-next": paginationNext, 8013 "pagination-previous": paginationPrevious, 8014 "search-icon": searchIcon, 8015 "search-medium": searchMedium, 8016 "search-large": searchLarge, 8017 "search-toggle-icon": searchIcon, 8018 "slidenav-next": slidenavNext, 8019 "slidenav-next-large": slidenavNextLarge, 8020 "slidenav-previous": slidenavPrevious, 8021 "slidenav-previous-large": slidenavPreviousLarge 8022 }; 8023 const Icon = { 8024 install: install$1, 8025 mixins: [Svg], 8026 args: "icon", 8027 props: { icon: String }, 8028 isIcon: true, 8029 beforeConnect() { 8030 addClass(this.$el, "bdt-icon"); 8031 }, 8032 methods: { 8033 async getSvg() { 8034 const icon = getIcon(this.icon); 8035 if (!icon) { 8036 throw "Icon not found."; 8037 } 8038 return icon; 8039 } 8040 } 8041 }; 8042 const IconComponent = { 8043 args: false, 8044 extends: Icon, 8045 data: (vm) => ({ 8046 icon: hyphenate(vm.constructor.options.name) 8047 }), 8048 beforeConnect() { 8049 addClass(this.$el, this.$options.id); 8050 } 8051 }; 8052 const NavParentIcon = { 8053 extends: IconComponent, 8054 beforeConnect() { 8055 const icon = this.$props.icon; 8056 this.icon = this.$el.closest(".bdt-nav-primary") ? `${icon}-large` : icon; 8057 } 8058 }; 8059 const Search = { 8060 extends: IconComponent, 8061 mixins: [I18n], 8062 i18n: { toggle: "Open Search", submit: "Submit Search" }, 8063 beforeConnect() { 8064 const isToggle = hasClass(this.$el, "bdt-search-toggle") || hasClass(this.$el, "bdt-navbar-toggle"); 8065 this.icon = isToggle ? "search-toggle-icon" : hasClass(this.$el, "bdt-search-icon") && this.$el.closest(".bdt-search-large") ? "search-large" : this.$el.closest(".bdt-search-medium") ? "search-medium" : this.$props.icon; 8066 if (hasAttr(this.$el, "aria-label")) { 8067 return; 8068 } 8069 if (isToggle) { 8070 const label = this.t("toggle"); 8071 attr(this.$el, "aria-label", label); 8072 } else { 8073 const button = this.$el.closest("a,button"); 8074 if (button) { 8075 const label = this.t("submit"); 8076 attr(button, "aria-label", label); 8077 } 8078 } 8079 } 8080 }; 8081 const Spinner = { 8082 extends: IconComponent, 8083 beforeConnect() { 8084 attr(this.$el, "role", "status"); 8085 }, 8086 methods: { 8087 async getSvg() { 8088 const icon = await Icon.methods.getSvg.call(this); 8089 if (this.ratio !== 1) { 8090 css($("circle", icon), "strokeWidth", 1 / this.ratio); 8091 } 8092 return icon; 8093 } 8094 } 8095 }; 8096 const ButtonComponent = { 8097 extends: IconComponent, 8098 mixins: [I18n], 8099 beforeConnect() { 8100 const button = this.$el.closest("a,button"); 8101 attr(button, "role", this.role !== null && isTag(button, "a") ? "button" : this.role); 8102 const label = this.t("label"); 8103 if (label && !hasAttr(button, "aria-label")) { 8104 attr(button, "aria-label", label); 8105 } 8106 } 8107 }; 8108 const Slidenav = { 8109 extends: ButtonComponent, 8110 beforeConnect() { 8111 addClass(this.$el, "bdt-slidenav"); 8112 const icon = this.$props.icon; 8113 this.icon = hasClass(this.$el, "bdt-slidenav-large") ? `${icon}-large` : icon; 8114 } 8115 }; 8116 const NavbarToggleIcon = { 8117 extends: ButtonComponent, 8118 i18n: { label: "Open menu" } 8119 }; 8120 const Close = { 8121 extends: ButtonComponent, 8122 i18n: { label: "Close" }, 8123 beforeConnect() { 8124 this.icon = `close-${hasClass(this.$el, "bdt-close-large") ? "large" : "icon"}`; 8125 } 8126 }; 8127 const Marker = { 8128 extends: ButtonComponent, 8129 i18n: { label: "Open" } 8130 }; 8131 const Totop = { 8132 extends: ButtonComponent, 8133 i18n: { label: "Back to top" } 8134 }; 8135 const PaginationNext = { 8136 extends: ButtonComponent, 8137 i18n: { label: "Next page" }, 8138 data: { role: null } 8139 }; 8140 const PaginationPrevious = { 8141 extends: ButtonComponent, 8142 i18n: { label: "Previous page" }, 8143 data: { role: null } 8144 }; 8145 const parsed = {}; 8146 function install$1(bdtUIkit) { 8147 bdtUIkit.icon.add = (name, svg) => { 8148 const added = isString(name) ? { [name]: svg } : name; 8149 each(added, (svg2, name2) => { 8150 icons[name2] = svg2; 8151 delete parsed[name2]; 8152 }); 8153 if (bdtUIkit._initialized) { 8154 apply( 8155 document.body, 8156 (el) => each(bdtUIkit.getComponents(el), (cmp) => { 8157 cmp.$options.isIcon && cmp.icon in added && cmp.$reset(); 8158 }) 8159 ); 8160 } 8161 }; 8162 } 8163 const aliases = { twitter: "x" }; 8164 function getIcon(icon) { 8165 icon = aliases[icon] || icon; 8166 if (!icons[icon]) { 8167 return null; 8168 } 8169 if (!parsed[icon]) { 8170 parsed[icon] = stringToSvg(icons[applyRtl(icon)] || icons[icon]); 8171 } 8172 return parsed[icon].cloneNode(true); 8173 } 8174 function applyRtl(icon) { 8175 return isRtl ? swap(swap(icon, "left", "right"), "previous", "next") : icon; 8176 } 8177 8178 var img = { 8179 args: "dataSrc", 8180 props: { 8181 dataSrc: String, 8182 sources: String, 8183 margin: String, 8184 target: String, 8185 loading: String 8186 }, 8187 data: { 8188 dataSrc: "", 8189 sources: false, 8190 margin: "50%", 8191 target: false, 8192 loading: "lazy" 8193 }, 8194 connected() { 8195 if (this.loading !== "lazy") { 8196 this.load(); 8197 } else if (isImg(this.$el)) { 8198 this.$el.loading = "lazy"; 8199 setSrcAttrs(this.$el); 8200 } 8201 }, 8202 disconnected() { 8203 if (this.img) { 8204 this.img.onload = ""; 8205 } 8206 delete this.img; 8207 }, 8208 observe: intersection({ 8209 handler(entries, observer) { 8210 this.load(); 8211 observer.disconnect(); 8212 }, 8213 options: ({ margin }) => ({ rootMargin: margin }), 8214 filter: ({ loading }) => loading === "lazy", 8215 target: ({ $el, $props }) => $props.target ? [$el, ...queryAll($props.target, $el)] : $el 8216 }), 8217 methods: { 8218 load() { 8219 if (this.img) { 8220 return this.img; 8221 } 8222 const image = isImg(this.$el) ? this.$el : getImageFromElement(this.$el, this.dataSrc, this.sources); 8223 removeAttr(image, "loading"); 8224 setSrcAttrs(this.$el, image.currentSrc); 8225 return this.img = image; 8226 } 8227 } 8228 }; 8229 function setSrcAttrs(el, src) { 8230 if (isImg(el)) { 8231 const parentNode = parent(el); 8232 const elements = isTag(parentNode, "picture") ? children(parentNode) : [el]; 8233 elements.forEach((el2) => setSourceProps(el2, el2)); 8234 } else if (src) { 8235 const change = !includes(el.style.backgroundImage, src); 8236 if (change) { 8237 css(el, "backgroundImage", `url(${escape(src)})`); 8238 trigger(el, createEvent("load", false)); 8239 } 8240 } 8241 } 8242 const srcProps = ["data-src", "data-srcset", "sizes"]; 8243 function setSourceProps(sourceEl, targetEl) { 8244 for (const prop of srcProps) { 8245 const value = data(sourceEl, prop); 8246 if (value) { 8247 attr(targetEl, prop.replace(/^(data-)+/, ""), value); 8248 } 8249 } 8250 } 8251 function getImageFromElement(el, src, sources) { 8252 const img = new Image(); 8253 wrapInPicture(img, sources); 8254 setSourceProps(el, img); 8255 img.onload = () => { 8256 setSrcAttrs(el, img.currentSrc); 8257 }; 8258 attr(img, "src", src); 8259 return img; 8260 } 8261 function wrapInPicture(img, sources) { 8262 sources = parseSources(sources); 8263 if (sources.length) { 8264 const picture = fragment("<picture>"); 8265 for (const attrs of sources) { 8266 const source = fragment("<source>"); 8267 attr(source, attrs); 8268 append(picture, source); 8269 } 8270 append(picture, img); 8271 } 8272 } 8273 function parseSources(sources) { 8274 if (!sources) { 8275 return []; 8276 } 8277 if (startsWith(sources, "[")) { 8278 try { 8279 sources = JSON.parse(sources); 8280 } catch (e) { 8281 sources = []; 8282 } 8283 } else { 8284 sources = parseOptions(sources); 8285 } 8286 if (!isArray(sources)) { 8287 sources = [sources]; 8288 } 8289 return sources.filter((source) => !isEmpty(source)); 8290 } 8291 function isImg(el) { 8292 return isTag(el, "img"); 8293 } 8294 8295 var inverse = { 8296 props: { 8297 target: String, 8298 selActive: String 8299 }, 8300 data: { 8301 target: false, 8302 selActive: false 8303 }, 8304 computed: { 8305 target: ({ target }, $el) => target ? $$(target, $el) : $el 8306 }, 8307 observe: [ 8308 intersection({ 8309 handler(entries) { 8310 this.isIntersecting = entries.some(({ isIntersecting }) => isIntersecting); 8311 this.$emit(); 8312 }, 8313 target: ({ target }) => target, 8314 args: { intersecting: false } 8315 }), 8316 mutation({ 8317 target: ({ target }) => target, 8318 options: { attributes: true, attributeFilter: ["class"], attributeOldValue: true } 8319 }), 8320 { 8321 target: ({ target }) => target, 8322 observe: (target, handler) => { 8323 const observer = observeResize( 8324 [...toNodes(target), document.documentElement], 8325 handler 8326 ); 8327 const listener = [ 8328 on(document, "scroll itemshown itemhidden", handler, { 8329 passive: true, 8330 capture: true 8331 }), 8332 on(document, "show hide transitionstart", (e) => { 8333 handler(); 8334 return observer.observe(e.target); 8335 }), 8336 on(document, "shown hidden transitionend transitioncancel", (e) => { 8337 handler(); 8338 return observer.unobserve(e.target); 8339 }) 8340 ]; 8341 return { 8342 observe: observer.observe.bind(observer), 8343 unobserve: observer.unobserve.bind(observer), 8344 disconnect() { 8345 observer.disconnect(); 8346 listener.map((off) => off()); 8347 } 8348 }; 8349 }, 8350 handler() { 8351 this.$emit(); 8352 } 8353 } 8354 ], 8355 update: { 8356 read() { 8357 if (!this.isIntersecting) { 8358 return false;
vendor: 4,930 bytes, lines 8359-8516
8359 } 8360 for (const target of toNodes(this.target)) { 8361 let color = !this.selActive || matches(target, this.selActive) ? findTargetColor(target) : ""; 8362 if (color !== false) { 8363 replaceClass(target, "bdt-light bdt-dark", color); 8364 } 8365 } 8366 } 8367 } 8368 }; 8369 function findTargetColor(target) { 8370 const dim = dimensions$1(target); 8371 const viewport = dimensions$1(window); 8372 if (!intersectRect(dim, viewport)) { 8373 return false; 8374 } 8375 const { left, top, height, width } = dim; 8376 let last; 8377 for (const percent of [0.25, 0.5, 0.75]) { 8378 const elements = target.ownerDocument.elementsFromPoint( 8379 Math.max(0, Math.min(left + width * percent, viewport.width - 1)), 8380 Math.max(0, Math.min(top + height / 2, viewport.height - 1)) 8381 ); 8382 for (const element of elements) { 8383 if (target.contains(element) || !checkVisibility(element) || element.closest('[class*="-leave"]') && elements.some((el) => element !== el && matches(el, '[class*="-enter"]'))) { 8384 continue; 8385 } 8386 const color = css(element, "--bdt-inverse"); 8387 if (color) { 8388 if (color === last) { 8389 return `bdt-${color}`; 8390 } 8391 last = color; 8392 break; 8393 } 8394 } 8395 } 8396 return last ? `bdt-${last}` : ""; 8397 } 8398 function checkVisibility(element) { 8399 if (css(element, "visibility") !== "visible") { 8400 return false; 8401 } 8402 while (element) { 8403 if (css(element, "opacity") === "0") { 8404 return false; 8405 } 8406 element = parent(element); 8407 } 8408 return true; 8409 } 8410 8411 var leader = { 8412 mixins: [Class, Media], 8413 props: { 8414 fill: String 8415 }, 8416 data: { 8417 fill: "", 8418 clsWrapper: "bdt-leader-fill", 8419 clsHide: "bdt-leader-hide", 8420 attrFill: "data-fill" 8421 }, 8422 computed: { 8423 fill: ({ fill }, $el) => fill || css($el, "--bdt-leader-fill-content") 8424 }, 8425 connected() { 8426 [this.wrapper] = wrapInner(this.$el, `<span class="${this.clsWrapper}">`); 8427 }, 8428 disconnected() { 8429 unwrap(this.wrapper.childNodes); 8430 }, 8431 observe: resize(), 8432 update: { 8433 read() { 8434 const width = Math.trunc(this.$el.offsetWidth / 2); 8435 return { 8436 width, 8437 fill: this.fill, 8438 hide: !this.matchMedia 8439 }; 8440 }, 8441 write({ width, fill, hide }) { 8442 toggleClass(this.wrapper, this.clsHide, hide); 8443 attr(this.wrapper, this.attrFill, new Array(width).join(fill)); 8444 }, 8445 events: ["resize"] 8446 } 8447 }; 8448 8449 var modal = { 8450 install, 8451 mixins: [Modal], 8452 data: { 8453 clsPage: "bdt-modal-page", 8454 selPanel: ".bdt-modal-dialog", 8455 selClose: '[class*="bdt-modal-close"]' 8456 }, 8457 events: [ 8458 { 8459 name: "fullscreenchange webkitendfullscreen", 8460 capture: true, 8461 handler(e) { 8462 if (isTag(e.target, "video") && this.isToggled() && !document.fullscreenElement) { 8463 this.hide(); 8464 } 8465 } 8466 }, 8467 { 8468 name: "show", 8469 self: true, 8470 handler() { 8471 if (hasClass(this.panel, "bdt-margin-auto-vertical")) { 8472 addClass(this.$el, "bdt-flex"); 8473 } else { 8474 css(this.$el, "display", "block"); 8475 } 8476 height(this.$el); 8477 } 8478 }, 8479 { 8480 name: "hidden", 8481 self: true, 8482 handler() { 8483 css(this.$el, "display", ""); 8484 removeClass(this.$el, "bdt-flex"); 8485 } 8486 } 8487 ] 8488 }; 8489 function install({ modal }) { 8490 modal.dialog = function(content, options) { 8491 const dialog = modal($(`<div><div class="bdt-modal-dialog">${content}</div></div>`), { 8492 stack: true, 8493 role: "alertdialog", 8494 ...options 8495 }); 8496 dialog.show(); 8497 on( 8498 dialog.$el, 8499 "hidden", 8500 async () => { 8501 await Promise.resolve(); 8502 dialog.$destroy(true); 8503 }, 8504 { self: true } 8505 ); 8506 return dialog; 8507 }; 8508 modal.alert = function(message, options) { 8509 return openDialog( 8510 ({ i18n }) => `<div class="bdt-modal-body">${isString(message) ? message : html(message)}</div> <div class="bdt-modal-footer bdt-text-right"> <button class="bdt-button bdt-button-primary bdt-modal-close" autofocus>${i18n.ok}</button> </div>`, 8511 options 8512 ); 8513 }; 8514 modal.confirm = function(message, options) { 8515 return openDialog( 8516 ({ i18n }) => `<form> <div class="bdt-modal-body">${isString(message) ? message : html(message)}</div> <div class="bdt-modal-footer bdt-text-right"> <button class="bdt-button bdt-button-default bdt-modal-close" type="button">
8516${i18n.cancel}</button> <button class="bdt-button bdt-button-primary" autofocus>${i18n.ok}</button> </div> </form>`, 8517 options, 8518 () => Promise.reject() 8519 ); 8520 }; 8521 modal.prompt = function(message, value, options) { 8522 const promise = openDialog( 8523 ({ i18n }) => `<form class="bdt-form-stacked"> <div class="bdt-modal-body"> <label>${isString(message) ? message : html(message)}</label> <input class="bdt-input" autofocus> </div> <div class="bdt-modal-footer bdt-text-right"> <button class="bdt-button bdt-button-default bdt-modal-close" type="button">${i18n.cancel}</button> <button class="bdt-button bdt-button-primary">${i18n.ok}</button> </div> </form>`, 8524 options, 8525 () => null, 8526 () => input.value 8527 ); 8528 const { $el } = promise.dialog; 8529 const input = $("input", $el); 8530 input.value = value || ""; 8531 on($el, "show", () => input.select()); 8532 return promise; 8533 }; 8534 modal.i18n = { 8535 ok: "Ok", 8536 cancel: "Cancel" 8537 }; 8538 function openDialog(tmpl, options, hideFn = noop, submitFn = noop) { 8539 options = { 8540 bgClose: false, 8541 escClose: true, 8542 ...options, 8543 i18n: { ...modal.i18n, ...options == null ? void 0 : options.i18n } 8544 }; 8545 const dialog = modal.dialog(tmpl(options), options); 8546 return assign( 8547 new Promise((resolve) => { 8548 const off = on(dialog.$el, "hide", () => resolve(hideFn())); 8549 on(dialog.$el, "submit", "form", (e) => { 8550 e.preventDefault(); 8551 resolve(submitFn(dialog)); 8552 off(); 8553 dialog.hide(); 8554 }); 8555 }), 8556 { dialog } 8557 ); 8558 } 8559 } 8560 8561 var nav = { 8562 extends: Accordion, 8563 data: { 8564 targets: "> .bdt-parent", 8565 toggle: "> a", 8566 content: "> ul" 8567 } 8568 }; 8569 8570 const clsNavbarTransparent = "bdt-navbar-transparent"; 8571 var navbar = { 8572 extends: Dropnav, 8573 props: { 8574 dropbarTransparentMode: Boolean 8575 }, 8576 data: { 8577 clsDrop: "bdt-navbar-dropdown", 8578 selNavItem: ".bdt-navbar-nav > li > a,a.bdt-navbar-item,button.bdt-navbar-item,.bdt-navbar-item a,.bdt-navbar-item button,.bdt-navbar-toggle", 8579 // Simplify with :where() selector once browser target is Safari 14+ 8580 dropbarTransparentMode: false 8581 }, 8582 computed: { 8583 navbarContainer: (_, $el) => $el.closest(".bdt-navbar-container") 8584 }, 8585 watch: { 8586 items() { 8587 const justify = hasClass(this.$el, "bdt-navbar-justify"); 8588 const containers = $$(".bdt-navbar-nav, .bdt-navbar-left, .bdt-navbar-right", this.$el); 8589 for (const container of containers) { 8590 const items = justify ? $$(".bdt-navbar-nav > li > a, .bdt-navbar-item, .bdt-navbar-toggle", container).length : ""; 8591 css(container, "flexGrow", items); 8592 } 8593 } 8594 }, 8595 events: [ 8596 { 8597 name: "show", 8598 el: ({ dropContainer }) => dropContainer, 8599 handler({ target }) { 8600 if (this.getTransparentMode(target) === "remove" && hasClass(this.navbarContainer, clsNavbarTransparent)) { 8601 removeClass(this.navbarContainer, clsNavbarTransparent); 8602 this._transparent = true; 8603 } 8604 } 8605 }, 8606 { 8607 name: "hide", 8608 el: ({ dropContainer }) => dropContainer, 8609 async handler() { 8610 await awaitMacroTask(); 8611 if (!this.getActive() && this._transparent) { 8612 addClass(this.navbarContainer, clsNavbarTransparent); 8613 this._transparent = null; 8614 } 8615 } 8616 } 8617 ], 8618 methods: { 8619 getTransparentMode(el) { 8620 if (!this.navbarContainer) { 8621 return; 8622 } 8623 if (this.dropbar && this.isDropbarDrop(el)) { 8624 return this.dropbarTransparentMode; 8625 } 8626 const drop = this.getDropdown(el); 8627 if (drop && hasClass(el, "bdt-dropbar")) { 8628 return drop.inset ? "behind" : "remove"; 8629 } 8630 }, 8631 getDropbarOffset(offsetTop) { 8632 const { top, height }
vendor: 9,206 bytes, lines 8632-8928
8632 = offset(this.navbarContainer); 8633 return top + (this.dropbarTransparentMode === "behind" ? 0 : height + offsetTop); 8634 } 8635 } 8636 }; 8637 function awaitMacroTask() { 8638 return new Promise((resolve) => setTimeout(resolve)); 8639 } 8640 8641 var offcanvas = { 8642 mixins: [Modal], 8643 args: "mode", 8644 props: { 8645 mode: String, 8646 flip: Boolean, 8647 overlay: Boolean, 8648 swiping: Boolean 8649 }, 8650 data: { 8651 mode: "slide", 8652 flip: false, 8653 overlay: false, 8654 clsPage: "bdt-offcanvas-page", 8655 clsContainer: "bdt-offcanvas-container", 8656 selPanel: ".bdt-offcanvas-bar", 8657 clsFlip: "bdt-offcanvas-flip", 8658 clsContainerAnimation: "bdt-offcanvas-container-animation", 8659 clsSidebarAnimation: "bdt-offcanvas-bar-animation", 8660 clsMode: "bdt-offcanvas", 8661 clsOverlay: "bdt-offcanvas-overlay", 8662 selClose: ".bdt-offcanvas-close", 8663 container: false, 8664 swiping: true 8665 }, 8666 computed: { 8667 clsFlip: ({ flip, clsFlip }) => flip ? clsFlip : "", 8668 clsOverlay: ({ overlay, clsOverlay }) => overlay ? clsOverlay : "", 8669 clsMode: ({ mode, clsMode }) => `${clsMode}-${mode}`, 8670 clsSidebarAnimation: ({ mode, clsSidebarAnimation }) => mode === "none" || mode === "reveal" ? "" : clsSidebarAnimation, 8671 clsContainerAnimation: ({ mode, clsContainerAnimation }) => mode !== "push" && mode !== "reveal" ? "" : clsContainerAnimation, 8672 transitionElement({ mode }) { 8673 return mode === "reveal" ? parent(this.panel) : this.panel; 8674 } 8675 }, 8676 observe: swipe({ filter: ({ swiping }) => swiping }), 8677 update: { 8678 read() { 8679 if (this.isToggled() && !isVisible(this.$el)) { 8680 this.hide(); 8681 } 8682 }, 8683 events: ["resize"] 8684 }, 8685 events: [ 8686 { 8687 name: "touchmove", 8688 self: true, 8689 passive: false, 8690 filter: ({ overlay }) => overlay, 8691 handler(e) { 8692 e.cancelable && e.preventDefault(); 8693 } 8694 }, 8695 { 8696 name: "show", 8697 self: true, 8698 handler() { 8699 if (this.mode === "reveal" && !hasClass(parent(this.panel), this.clsMode)) { 8700 wrapAll(this.panel, "<div>"); 8701 addClass(parent(this.panel), this.clsMode); 8702 } 8703 const { body, scrollingElement } = document; 8704 addClass(body, this.clsContainer, this.clsFlip); 8705 css(body, "touch-action", "pan-y pinch-zoom"); 8706 css(this.$el, "display", "block"); 8707 css(this.panel, "maxWidth", scrollingElement.clientWidth); 8708 addClass(this.$el, this.clsOverlay); 8709 addClass( 8710 this.panel, 8711 this.clsSidebarAnimation, 8712 this.mode === "reveal" ? "" : this.clsMode 8713 ); 8714 height(body); 8715 addClass(body, this.clsContainerAnimation); 8716 this.clsContainerAnimation && suppressUserScale(); 8717 } 8718 }, 8719 { 8720 name: "hide", 8721 self: true, 8722 handler() { 8723 removeClass(document.body, this.clsContainerAnimation); 8724 css(document.body, "touch-action", ""); 8725 } 8726 }, 8727 { 8728 name: "hidden", 8729 self: true, 8730 handler() { 8731 this.clsContainerAnimation && resumeUserScale(); 8732 if (this.mode === "reveal") { 8733 unwrap(this.panel); 8734 } 8735 removeClass(this.panel, this.clsSidebarAnimation, this.clsMode); 8736 removeClass(this.$el, this.clsOverlay); 8737 css(this.$el, "display", ""); 8738 css(this.panel, "maxWidth", ""); 8739 removeClass(document.body, this.clsContainer, this.clsFlip); 8740 } 8741 }, 8742 { 8743 name: "swipeLeft swipeRight", 8744 handler(e) { 8745 if (this.isToggled() && endsWith(e.type, "Left") ^ this.flip) { 8746 this.hide(); 8747 } 8748 } 8749 } 8750 ] 8751 }; 8752 function suppressUserScale() { 8753 getViewport().content += ",user-scalable=0"; 8754 } 8755 function resumeUserScale() { 8756 const viewport = getViewport(); 8757 viewport.content = viewport.content.replace(/,user-scalable=0$/, ""); 8758 } 8759 function getViewport() { 8760 return $('meta[name="viewport"]', document.head) || append(document.head, '<meta name="viewport">'); 8761 } 8762 8763 var overflowAuto = { 8764 mixins: [Class], 8765 props: { 8766 selContainer: String, 8767 selContent: String, 8768 minHeight: Number 8769 }, 8770 data: { 8771 selContainer: ".bdt-modal", 8772 selContent: ".bdt-modal-dialog", 8773 minHeight: 150 8774 }, 8775 computed: { 8776 container: ({ selContainer }, $el) => $el.closest(selContainer), 8777 content: ({ selContent }, $el) => $el.closest(selContent) 8778 }, 8779 observe: resize({ 8780 target: ({ container, content }) => [container, content] 8781 }), 8782 update: { 8783 read() { 8784 if (!this.content || !this.container || !isVisible(this.$el)) { 8785 return false; 8786 } 8787 return { 8788 max: Math.max( 8789 this.minHeight, 8790 height(this.container) - (dimensions$1(this.content).height - height(this.$el)) 8791 ) 8792 }; 8793 }, 8794 write({ max }) { 8795 css(this.$el, { minHeight: this.minHeight, maxHeight: max }); 8796 }, 8797 events: ["resize"] 8798 } 8799 }; 8800 8801 var responsive = { 8802 props: ["width", "height"], 8803 connected() { 8804 addClass(this.$el, "bdt-responsive-width"); 8805 css(this.$el, "aspectRatio", `${this.width}/${this.height}`); 8806 } 8807 }; 8808 8809 var scroll = { 8810 props: { 8811 offset: Number 8812 }, 8813 data: { 8814 offset: 0 8815 }, 8816 connected() { 8817 registerClick(this); 8818 }, 8819 disconnected() { 8820 unregisterClick(this); 8821 }, 8822 methods: { 8823 async scrollTo(el) { 8824 el = el && $(el) || document.body; 8825 if (trigger(this.$el, "beforescroll", [this, el])) { 8826 await scrollIntoView(el, { offset: this.offset }); 8827 trigger(this.$el, "scrolled", [this, el]); 8828 } 8829 } 8830 } 8831 }; 8832 const instances = /* @__PURE__ */ new Set(); 8833 function registerClick(cmp) { 8834 if (!instances.size) { 8835 on(document, "click", clickHandler); 8836 } 8837 instances.add(cmp); 8838 } 8839 function unregisterClick(cmp) { 8840 instances.delete(cmp); 8841 if (!instances.size) { 8842 off(document, "click", clickHandler); 8843 } 8844 } 8845 function clickHandler(e) { 8846 if (e.defaultPrevented) { 8847 return; 8848 } 8849 for (const instance of instances) { 8850 if (instance.$el.contains(e.target) && isSameSiteAnchor(instance.$el)) { 8851 e.preventDefault(); 8852 if (window.location.href !== instance.$el.href) { 8853 window.history.pushState({}, "", instance.$el.href); 8854 } 8855 instance.scrollTo(getTargetedElement(instance.$el)); 8856 } 8857 } 8858 } 8859 8860 const clsInView = "bdt-scrollspy-inview"; 8861 var scrollspy = { 8862 args: "cls", 8863 props: { 8864 cls: String, 8865 target: String, 8866 hidden: Boolean, 8867 margin: String, 8868 repeat: Boolean, 8869 delay: Number 8870 }, 8871 data: () => ({ 8872 cls: "", 8873 target: false, 8874 hidden: true, 8875 margin: "-1px", 8876 repeat: false, 8877 delay: 0 8878 }), 8879 computed: { 8880 elements: ({ target }, $el) => target ? $$(target, $el) : [$el] 8881 }, 8882 watch: { 8883 elements(elements) { 8884 if (this.hidden) { 8885 css(filter$1(elements, `:not(.${clsInView})`), "opacity", 0); 8886 } 8887 } 8888 }, 8889 connected() { 8890 this.elementData = /* @__PURE__ */ new Map(); 8891 }, 8892 disconnected() { 8893 for (const [el, state] of this.elementData.entries()) { 8894 removeClass(el, clsInView, (state == null ? void 0 : state.cls) || ""); 8895 } 8896 delete this.elementData; 8897 }, 8898 observe: intersection({ 8899 target: ({ elements }) => elements, 8900 handler(records) { 8901 const elements = this.elementData; 8902 for (const { target: el, isIntersecting } of records) { 8903 if (!elements.has(el)) { 8904 elements.set(el, { 8905 cls: data(el, "bdt-scrollspy-class") || this.cls 8906 }); 8907 } 8908 const state = elements.get(el); 8909 if (!this.repeat && state.show) { 8910 continue; 8911 } 8912 state.show = isIntersecting; 8913 } 8914 this.$emit(); 8915 }, 8916 options: ({ margin }) => ({ rootMargin: margin }), 8917 args: { intersecting: false } 8918 }), 8919 update: [ 8920 { 8921 write(data) { 8922 for (const [el, state] of this.elementData.entries()) { 8923 if (state.show && !state.inview && !state.queued) { 8924 state.queued = true; 8925 data.promise = (data.promise || Promise.resolve()).then(() => new Promise((resolve) => setTimeout(resolve, this.delay))).then(() => { 8926 this.toggle(el, true); 8927 setTimeout(() => { 8928 state.queued = false;
vendor: 21,327 bytes, lines 8929-9541
8929 this.$emit(); 8930 }, 300); 8931 }); 8932 } else if (!state.show && state.inview && !state.queued && this.repeat) { 8933 this.toggle(el, false); 8934 } 8935 } 8936 } 8937 } 8938 ], 8939 methods: { 8940 toggle(el, inview) { 8941 var _a, _b; 8942 const state = (_a = this.elementData) == null ? void 0 : _a.get(el); 8943 if (!state) { 8944 return; 8945 } 8946 (_b = state.off) == null ? void 0 : _b.call(state); 8947 css(el, "opacity", !inview && this.hidden ? 0 : ""); 8948 toggleClass(el, clsInView, inview); 8949 toggleClass(el, state.cls); 8950 let match; 8951 if (match = state.cls.match(/\bbdt-animation-[\w-]+/g)) { 8952 const removeAnimationClasses = () => removeClass(el, match); 8953 if (inview) { 8954 state.off = once(el, "animationcancel animationend", removeAnimationClasses, { 8955 self: true 8956 }); 8957 } else { 8958 removeAnimationClasses(); 8959 } 8960 } 8961 trigger(el, inview ? "inview" : "outview"); 8962 state.inview = inview; 8963 } 8964 } 8965 }; 8966 8967 var scrollspyNav = { 8968 props: { 8969 cls: String, 8970 closest: Boolean, 8971 scroll: Boolean, 8972 target: String, 8973 offset: Number 8974 }, 8975 data: { 8976 cls: "bdt-active", 8977 closest: false, 8978 scroll: false, 8979 target: 'a[href]:not([role="button"])', 8980 offset: 0 8981 }, 8982 computed: { 8983 links: ({ target }, $el) => $$(target, $el).filter((el) => isSameSiteAnchor(el)), 8984 elements({ closest }) { 8985 return this.links.map((el) => el.closest(closest || "*")); 8986 } 8987 }, 8988 watch: { 8989 links(links) { 8990 if (this.scroll) { 8991 this.$create("scroll", links, { offset: this.offset }); 8992 } 8993 } 8994 }, 8995 observe: [intersection(), scroll$1()], 8996 update: [ 8997 { 8998 read() { 8999 const targets = this.links.map((el) => getTargetedElement(el) || el.ownerDocument); 9000 const { length } = targets; 9001 if (!length || !isVisible(this.$el)) { 9002 return false; 9003 } 9004 const scrollElement = scrollParent(targets, true); 9005 const { scrollTop, scrollHeight } = scrollElement; 9006 const viewport = offsetViewport(scrollElement); 9007 const max = scrollHeight - viewport.height; 9008 let active = false; 9009 if (scrollTop >= max) { 9010 active = length - 1; 9011 } else { 9012 const offsetBy = this.offset + dimensions$1(getCoveringElement()).height + viewport.height * 0.1; 9013 for (let i = 0; i < targets.length; i++) { 9014 if (offset(targets[i]).top - viewport.top - offsetBy > 0) { 9015 break; 9016 } 9017 active = +i; 9018 } 9019 } 9020 return { active }; 9021 }, 9022 write({ active }) { 9023 const changed = active !== false && !hasClass(this.elements[active], this.cls); 9024 this.links.forEach((el) => el.blur()); 9025 for (let i = 0; i < this.elements.length; i++) { 9026 toggleClass(this.elements[i], this.cls, +i === active); 9027 } 9028 if (changed) { 9029 trigger(this.$el, "active", [active, this.elements[active]]); 9030 } 9031 }, 9032 events: ["scroll", "resize"] 9033 } 9034 ] 9035 }; 9036 9037 var sticky = { 9038 mixins: [Class, Media], 9039 props: { 9040 position: String, 9041 top: null, 9042 bottom: null, 9043 start: null, 9044 end: null, 9045 offset: String, 9046 overflowFlip: Boolean, 9047 animation: String, 9048 clsActive: String, 9049 clsInactive: String, 9050 clsFixed: String, 9051 clsBelow: String, 9052 selTarget: String, 9053 showOnUp: Boolean, 9054 targetOffset: Number 9055 }, 9056 data: { 9057 position: "top", 9058 top: false, 9059 bottom: false, 9060 start: false, 9061 end: false, 9062 offset: 0, 9063 overflowFlip: false, 9064 animation: "", 9065 clsActive: "bdt-active", 9066 clsInactive: "", 9067 clsFixed: "bdt-sticky-fixed", 9068 clsBelow: "bdt-sticky-below", 9069 selTarget: "", 9070 showOnUp: false, 9071 targetOffset: false 9072 }, 9073 computed: { 9074 target: ({ selTarget }, $el) => selTarget && $(selTarget, $el) || $el 9075 }, 9076 connected() { 9077 this.start = coerce(this.start || this.top); 9078 this.end = coerce(this.end || this.bottom); 9079 this.placeholder = $("+ .bdt-sticky-placeholder", this.$el) || $('<div class="bdt-sticky-placeholder"></div>'); 9080 this.isFixed = false; 9081 this.setActive(false); 9082 }, 9083 beforeDisconnect() { 9084 if (this.isFixed) { 9085 this.hide(); 9086 removeClass(this.target, this.clsInactive); 9087 } 9088 reset(this.$el); 9089 remove$1(this.placeholder); 9090 this.placeholder = null; 9091 }, 9092 observe: [ 9093 viewport(), 9094 scroll$1({ target: () => document.scrollingElement }), 9095 resize({ 9096 target: ({ $el }) => [$el, getVisibleParent($el), document.scrollingElement], 9097 handler(entries) { 9098 this.$emit( 9099 this._data.resized && entries.some(({ target }) => target === getVisibleParent(this.$el)) ? "update" : "resize" 9100 ); 9101 this._data.resized = true; 9102 } 9103 }) 9104 ], 9105 events: [ 9106 { 9107 name: "load hashchange popstate", 9108 el: () => window, 9109 filter: ({ targetOffset }) => targetOffset !== false, 9110 handler() { 9111 const { scrollingElement } = document; 9112 if (!location.hash || scrollingElement.scrollTop === 0) { 9113 return; 9114 } 9115 setTimeout(() => { 9116 const targetOffset = offset($(location.hash)); 9117 const elOffset = offset(this.$el); 9118 if (this.isFixed && intersectRect(targetOffset, elOffset)) { 9119 scrollingElement.scrollTop = Math.ceil( 9120 targetOffset.top - elOffset.height - toPx(this.targetOffset, "height", this.placeholder) - toPx(this.offset, "height", this.placeholder) 9121 ); 9122 } 9123 }); 9124 } 9125 } 9126 ], 9127 update: [ 9128 { 9129 read({ height: height$1, width, margin, sticky }, types) { 9130 this.inactive = !this.matchMedia || !isVisible(this.$el) || !this.$el.offsetHeight; 9131 if (this.inactive) { 9132 return; 9133 } 9134 const hide = this.isFixed && types.has("update"); 9135 if (hide) { 9136 preventTransition(this.target); 9137 this.hide(); 9138 } 9139 if (!this.active) { 9140 ({ height: height$1, width } = dimensions$1(this.$el)); 9141 margin = css(this.$el, "margin"); 9142 } 9143 if (hide) { 9144 this.show(); 9145 } 9146 const viewport2 = toPx("100vh", "height"); 9147 const dynamicViewport = height(window); 9148 const maxScrollHeight = Math.max( 9149 0, 9150 document.scrollingElement.scrollHeight - viewport2 9151 ); 9152 let position = this.position; 9153 if (this.overflowFlip && height$1 > viewport2) { 9154 position = position === "top" ? "bottom" : "top"; 9155 } 9156 const referenceElement = this.isFixed ? this.placeholder : this.$el; 9157 let offset$1 = toPx(this.offset, "height", sticky ? this.$el : referenceElement); 9158 if (position === "bottom" && (height$1 < dynamicViewport || this.overflowFlip)) { 9159 offset$1 += dynamicViewport - height$1; 9160 } 9161 const overflow = this.overflowFlip ? 0 : Math.max(0, height$1 + offset$1 - viewport2); 9162 const topOffset = offset(referenceElement).top; 9163 const elHeight = dimensions$1(this.$el).height; 9164 const start = (this.start === false ? topOffset : parseProp(this.start, this.$el, topOffset)) - offset$1; 9165 const end = this.end === false ? maxScrollHeight : Math.min( 9166 maxScrollHeight, 9167 parseProp(this.end, this.$el, topOffset + height$1, true) - elHeight - offset$1 + overflow 9168 ); 9169 sticky = maxScrollHeight && !this.showOnUp && start + offset$1 === topOffset && end === Math.min( 9170 maxScrollHeight, 9171 parseProp(true, this.$el, 0, true) - elHeight - offset$1 + overflow 9172 ) && css(getVisibleParent(this.$el), "overflowY") === "visible"; 9173 return { 9174 start, 9175 end, 9176 offset: offset$1, 9177 overflow, 9178 height: height$1, 9179 elHeight, 9180 width, 9181 margin, 9182 top: offsetPosition(referenceElement)[0], 9183 sticky, 9184 viewport: viewport2, 9185 maxScrollHeight 9186 }; 9187 }, 9188 write({ height, width, margin, offset, sticky }) { 9189 if (this.inactive || sticky || !this.isFixed) { 9190 reset(this.$el); 9191 } 9192 if (this.inactive) { 9193 return; 9194 } 9195 if (sticky) { 9196 height = width = margin = 0; 9197 css(this.$el, { position: "sticky", top: offset }); 9198 } 9199 const { placeholder } = this; 9200 css(placeholder, { height, width, margin }); 9201 if (parent(placeholder) !== parent(this.$el) || sticky ^ index(placeholder) < index(this.$el)) { 9202 (sticky ? before : after)(this.$el, placeholder); 9203 placeholder.hidden = true; 9204 } 9205 }, 9206 events: ["resize"] 9207 }, 9208 { 9209 read({ 9210 scroll: prevScroll = 0, 9211 dir: prevDir = "down", 9212 overflow, 9213 overflowScroll = 0, 9214 start, 9215 end, 9216 elHeight, 9217 height, 9218 sticky, 9219 maxScrollHeight 9220 }) { 9221 const scroll2 = Math.min(document.scrollingElement.scrollTop, maxScrollHeight); 9222 const dir = prevScroll <= scroll2 ? "down" : "up"; 9223 const referenceElement = this.isFixed ? this.placeholder : this.$el; 9224 return { 9225 dir, 9226 prevDir, 9227 scroll: scroll2, 9228 prevScroll, 9229 below: scroll2 > offset(referenceElement).top + (sticky ? Math.min(height, elHeight) : height), 9230 offsetParentTop: offset(referenceElement.offsetParent).top, 9231 overflowScroll: clamp( 9232 overflowScroll + clamp(scroll2, start, end) - clamp(prevScroll, start, end), 9233 0, 9234 overflow 9235 ) 9236 }; 9237 }, 9238 write(data, types) { 9239 const isScrollUpdate = types.has("scroll"); 9240 const { 9241 initTimestamp = 0, 9242 dir, 9243 prevDir, 9244 scroll: scroll2, 9245 prevScroll = 0, 9246 top, 9247 start, 9248 below 9249 } = data; 9250 if (scroll2 < 0 || scroll2 === prevScroll && isScrollUpdate || this.showOnUp && !isScrollUpdate && !this.isFixed) { 9251 return; 9252 } 9253 const now = Date.now(); 9254 if (now - initTimestamp > 300 || dir !== prevDir) { 9255 data.initScroll = scroll2; 9256 data.initTimestamp = now; 9257 } 9258 if (this.showOnUp && !this.isFixed && Math.abs(data.initScroll - scroll2) <= 30 && Math.abs(prevScroll - scroll2) <= 10) { 9259 return; 9260 } 9261 if (this.inactive || scroll2 < start || this.showOnUp && (scroll2 <= start || dir === "down" && isScrollUpdate || dir === "up" && !this.isFixed && !below)) { 9262 if (!this.isFixed) { 9263 if (Animation.inProgress(this.$el) && top > scroll2) { 9264 Animation.cancel(this.$el); 9265 this.hide(); 9266 } 9267 return; 9268 } 9269 if (this.animation && below) { 9270 if (hasClass(this.$el, "bdt-animation-leave")) { 9271 return; 9272 } 9273 Animation.out(this.$el, this.animation).then(() => this.hide(), noop); 9274 } else { 9275 this.hide(); 9276 } 9277 } else if (this.isFixed) { 9278 this.update(); 9279 } else if (this.animation && below) { 9280 this.show(); 9281 Animation.in(this.$el, this.animation).catch(noop); 9282 } else { 9283 preventTransition(this.target); 9284 this.show(); 9285 } 9286 }, 9287 events: ["resize", "resizeViewport", "scroll"] 9288 } 9289 ], 9290 methods: { 9291 show() { 9292 this.isFixed = true; 9293 this.update(); 9294 this.placeholder.hidden = false; 9295 }, 9296 hide() { 9297 const { offset, sticky } = this._data; 9298 this.setActive(false); 9299 removeClass(this.$el, this.clsFixed, this.clsBelow); 9300 if (sticky) { 9301 css(this.$el, "top", offset); 9302 } else { 9303 css(this.$el, { 9304 position: "", 9305 top: "", 9306 width: "", 9307 marginTop: "" 9308 }); 9309 } 9310 this.placeholder.hidden = true; 9311 this.isFixed = false; 9312 }, 9313 update() { 9314 let { 9315 width, 9316 scroll: scroll2 = 0, 9317 overflow, 9318 overflowScroll = 0, 9319 start, 9320 end, 9321 offset, 9322 offsetParentTop, 9323 sticky, 9324 below 9325 } = this._data; 9326 const active = start !== 0 || scroll2 > start; 9327 if (!sticky) { 9328 let position = "fixed"; 9329 if (scroll2 > end) { 9330 offset += end - offsetParentTop + overflowScroll - overflow; 9331 position = "absolute"; 9332 } 9333 css(this.$el, { position, width, marginTop: 0 }, "important"); 9334 } 9335 css(this.$el, "top", offset - overflowScroll); 9336 this.setActive(active); 9337 toggleClass(this.$el, this.clsBelow, below); 9338 addClass(this.$el, this.clsFixed); 9339 }, 9340 setActive(active) { 9341 const prev = this.active; 9342 this.active = active; 9343 if (active) { 9344 replaceClass(this.target, this.clsInactive, this.clsActive); 9345 prev !== active && trigger(this.$el, "active"); 9346 } else { 9347 replaceClass(this.target, this.clsActive, this.clsInactive); 9348 if (prev !== active) { 9349 preventTransition(this.target); 9350 trigger(this.$el, "inactive"); 9351 } 9352 } 9353 } 9354 } 9355 }; 9356 function parseProp(value, el, propOffset, padding) { 9357 if (!value) { 9358 return 0; 9359 } 9360 if (isNumeric(value) || isString(value) && value.match(/^-?\d/)) { 9361 return propOffset + toPx(value, "height", el, true); 9362 } else { 9363 const refElement = value === true ? getVisibleParent(el) : query(value, el); 9364 return offset(refElement).bottom - (padding && (refElement == null ? void 0 : refElement.contains(el)) ? toFloat(css(refElement, "paddingBottom")) : 0); 9365 } 9366 } 9367 function coerce(value) { 9368 if (value === "true") { 9369 return true; 9370 } else if (value === "false") { 9371 return false; 9372 } 9373 return value; 9374 } 9375 function reset(el) { 9376 css(el, { position: "", top: "", marginTop: "", width: "" }); 9377 } 9378 const clsTransitionDisable = "bdt-transition-disable"; 9379 function preventTransition(element) { 9380 if (!hasClass(element, clsTransitionDisable)) { 9381 addClass(element, clsTransitionDisable); 9382 requestAnimationFrame(() => removeClass(element, clsTransitionDisable)); 9383 } 9384 } 9385 function getVisibleParent(element) { 9386 while (element = parent(element)) { 9387 if (isVisible(element)) { 9388 return element; 9389 } 9390 } 9391 } 9392 9393 const selDisabled = ".bdt-disabled *, .bdt-disabled, [disabled]"; 9394 var Switcher = { 9395 mixins: [Togglable], 9396 args: "connect", 9397 props: { 9398 connect: String, 9399 toggle: String, 9400 itemNav: String, 9401 active: Number, 9402 followFocus: Boolean, 9403 swiping: Boolean 9404 }, 9405 data: { 9406 connect: "~.bdt-switcher", 9407 toggle: "> * > :first-child", 9408 itemNav: false, 9409 active: 0, 9410 cls: "bdt-active", 9411 attrItem: "bdt-switcher-item", 9412 selVertical: ".bdt-nav", 9413 followFocus: false, 9414 swiping: true 9415 }, 9416 computed: { 9417 connects: { 9418 get: ({ connect }, $el) => queryAll(connect, $el), 9419 observe: ({ connect }) => connect 9420 }, 9421 connectChildren() { 9422 return this.connects.map((el) => children(el)).flat(); 9423 }, 9424 toggles: ({ toggle }, $el) => $$(toggle, $el), 9425 children(_, $el) { 9426 return children($el).filter( 9427 (child) => this.toggles.some((toggle) => child.contains(toggle)) 9428 ); 9429 } 9430 }, 9431 watch: { 9432 connects(connects) { 9433 if (this.swiping) { 9434 css(connects, "touchAction", "pan-y pinch-zoom"); 9435 } 9436 this.$emit(); 9437 }, 9438 connectChildren() { 9439 let index = Math.max(0, this.index()); 9440 for (const el of this.connects) { 9441 children(el).forEach((child, i) => toggleClass(child, this.cls, i === index)); 9442 } 9443 this.$emit(); 9444 }, 9445 toggles(toggles) { 9446 this.$emit(); 9447 const active = this.index(); 9448 this.show(~active ? active : toggles[this.active] || toggles[0]); 9449 } 9450 }, 9451 connected() { 9452 attr(this.$el, "role", "tablist"); 9453 }, 9454 observe: [ 9455 lazyload({ targets: ({ connectChildren }) => connectChildren }), 9456 swipe({ target: ({ connects }) => connects, filter: ({ swiping }) => swiping }) 9457 ], 9458 events: [ 9459 { 9460 name: "click keydown", 9461 delegate: ({ toggle }) => toggle, 9462 handler(e) { 9463 if (!matches(e.current, selDisabled) && (e.type === "click" || e.keyCode === keyMap.SPACE)) { 9464 e.preventDefault(); 9465 this.show(e.current); 9466 } 9467 } 9468 }, 9469 { 9470 name: "keydown", 9471 delegate: ({ toggle }) => toggle, 9472 handler(e) { 9473 const { current, keyCode } = e; 9474 const isVertical = matches(this.$el, this.selVertical); 9475 let i = keyCode === keyMap.HOME ? 0 : keyCode === keyMap.END ? "last" : keyCode === keyMap.LEFT && !isVertical || keyCode === keyMap.UP && isVertical ? "previous" : keyCode === keyMap.RIGHT && !isVertical || keyCode === keyMap.DOWN && isVertical ? "next" : -1; 9476 if (~i) { 9477 e.preventDefault(); 9478 const toggles = this.toggles.filter((el) => !matches(el, selDisabled)); 9479 const next = toggles[getIndex(i, toggles, toggles.indexOf(current))]; 9480 next.focus(); 9481 if (this.followFocus) { 9482 this.show(next); 9483 } 9484 } 9485 } 9486 }, 9487 { 9488 name: "click", 9489 el: ({ $el, connects, itemNav }) => connects.concat(itemNav ? queryAll(itemNav, $el) : []), 9490 delegate: ({ attrItem }) => `[${attrItem}],[data-${attrItem}]`, 9491 handler(e) { 9492 if (e.target.closest("a,button")) { 9493 e.preventDefault(); 9494 this.show(data(e.current, this.attrItem)); 9495 } 9496 } 9497 }, 9498 { 9499 name: "swipeRight swipeLeft", 9500 filter: ({ swiping }) => swiping, 9501 el: ({ connects }) => connects, 9502 handler({ type }) { 9503 this.show(endsWith(type, "Left") ? "next" : "previous"); 9504 } 9505 } 9506 ], 9507 update() { 9508 var _a; 9509 for (const el of this.connects) { 9510 if (isTag(el, "ul")) { 9511 attr(el, "role", "presentation"); 9512 } 9513 } 9514 attr(children(this.$el), "role", "presentation"); 9515 for (const index in this.toggles) { 9516 const toggle = this.toggles[index]; 9517 const item = (_a = this.connects[0]) == null ? void 0 : _a.children[index]; 9518 attr(toggle, "role", "tab"); 9519 if (!item) { 9520 continue; 9521 } 9522 toggle.id = generateId(this, toggle); 9523 item.id = generateId(this, item); 9524 attr(toggle, "aria-controls", item.id); 9525 attr(item, { role: "tabpanel", "aria-labelledby": toggle.id }); 9526 } 9527 attr(this.$el, "aria-orientation", matches(this.$el, this.selVertical) ? "vertical" : null); 9528 }, 9529 methods: { 9530 index() { 9531 return findIndex(this.children, (el) => hasClass(el, this.cls)); 9532 }, 9533 show(item) { 9534 const toggles = this.toggles.filter((el) => !matches(el, selDisabled)); 9535 const prev = this.index(); 9536 const next = getIndex( 9537 !isNode(item) || includes(toggles, item) ? item : 0, 9538 toggles, 9539 getIndex(this.toggles[prev], toggles) 9540 ); 9541 const active = getIndex(toggles[next], this.toggles);
vendor: 1,121 bytes, lines 9542-9574
9542 this.children.forEach((child, i) => { 9543 toggleClass(child, this.cls, active === i); 9544 attr(this.toggles[i], { 9545 "aria-selected": active === i, 9546 tabindex: active === i ? null : -1 9547 }); 9548 }); 9549 const animate = prev >= 0 && prev !== next; 9550 this.connects.forEach(async ({ children: children2 }) => { 9551 const actives = toArray(children2).filter( 9552 (child, i) => i !== active && hasClass(child, this.cls) 9553 ); 9554 if (await this.toggleElement(actives, false, animate)) { 9555 await this.toggleElement(children2[active], true, animate); 9556 } 9557 }); 9558 } 9559 } 9560 }; 9561 9562 var tab = { 9563 mixins: [Class], 9564 extends: Switcher, 9565 props: { 9566 media: Boolean 9567 }, 9568 data: { 9569 media: 960, 9570 attrItem: "bdt-tab-item", 9571 selVertical: ".bdt-tab-left,.bdt-tab-right" 9572 }, 9573 connected() { 9574 const cls = hasClass(this.$el, "bdt-tab-left") ? "bdt-tab-left" : hasClass(this.$el, "bdt-tab-right") ? "bdt-tab-right" : false;
vendor: 5,607 bytes, lines 9575-9748
9575 if (cls) { 9576 this.$create("toggle", this.$el, { cls, mode: "media", media: this.media }); 9577 } 9578 } 9579 }; 9580 9581 const KEY_SPACE = 32; 9582 var toggle = { 9583 mixins: [Media, Togglable], 9584 args: "target", 9585 props: { 9586 href: String, 9587 target: null, 9588 mode: "list", 9589 queued: Boolean 9590 }, 9591 data: { 9592 href: false, 9593 target: false, 9594 mode: "click", 9595 queued: true 9596 }, 9597 computed: { 9598 target: { 9599 get: ({ target }, $el) => { 9600 target = queryAll(target || $el.hash, $el); 9601 return target.length ? target : [$el]; 9602 }, 9603 observe: ({ target }) => target 9604 } 9605 }, 9606 connected() { 9607 if (!includes(this.mode, "media")) { 9608 if (!isFocusable(this.$el)) { 9609 attr(this.$el, "tabindex", "0"); 9610 } 9611 if (!this.cls && isTag(this.$el, "a")) { 9612 attr(this.$el, "role", "button"); 9613 } 9614 } 9615 }, 9616 observe: lazyload({ targets: ({ target }) => target }), 9617 events: [ 9618 { 9619 name: pointerDown$1, 9620 filter: ({ mode }) => includes(mode, "hover"), 9621 handler(e) { 9622 this._preventClick = null; 9623 if (!isTouch(e) || isBoolean(this._showState) || this.$el.disabled) { 9624 return; 9625 } 9626 trigger(this.$el, "focus"); 9627 once( 9628 document, 9629 pointerDown$1, 9630 () => trigger(this.$el, "blur"), 9631 true, 9632 (e2) => !this.$el.contains(e2.target) 9633 ); 9634 if (includes(this.mode, "click")) { 9635 this._preventClick = true; 9636 } 9637 } 9638 }, 9639 { 9640 // mouseenter mouseleave are added because of Firefox bug, 9641 // where pointerleave is triggered immediately after pointerenter on scroll 9642 name: `mouseenter mouseleave ${pointerEnter} ${pointerLeave} focus blur`, 9643 filter: ({ mode }) => includes(mode, "hover"), 9644 handler(e) { 9645 if (isTouch(e) || this.$el.disabled) { 9646 return; 9647 } 9648 const show = includes(["mouseenter", pointerEnter, "focus"], e.type); 9649 const expanded = this.isToggled(this.target); 9650 if (!show && (!isBoolean(this._showState) || e.type !== "blur" && matches(this.$el, ":focus") || e.type === "blur" && matches(this.$el, ":hover"))) { 9651 if (expanded === this._showState) { 9652 this._showState = null; 9653 } 9654 return; 9655 } 9656 if (show && isBoolean(this._showState) && expanded !== this._showState) { 9657 return; 9658 } 9659 this._showState = show ? expanded : null; 9660 this.toggle(`toggle${show ? "show" : "hide"}`); 9661 } 9662 }, 9663 { 9664 name: "keydown", 9665 filter: ({ $el, mode }) => includes(mode, "click") && !isTag($el, "input"), 9666 handler(e) { 9667 if (e.keyCode === KEY_SPACE) { 9668 e.preventDefault(); 9669 this.$el.click(); 9670 } 9671 } 9672 }, 9673 { 9674 name: "click", 9675 filter: ({ mode }) => ["click", "hover"].some((m) => includes(mode, m)), 9676 handler(e) { 9677 let link; 9678 if (this._preventClick || e.target.closest('a[href="#"], a[href=""]') || (link = e.target.closest("a[href]")) && (!this.isToggled(this.target) || link.hash && matches(this.target, link.hash))) { 9679 e.preventDefault(); 9680 } 9681 if (!this._preventClick && includes(this.mode, "click")) { 9682 this.toggle(); 9683 } 9684 } 9685 }, 9686 { 9687 name: "mediachange", 9688 filter: ({ mode }) => includes(mode, "media"), 9689 el: ({ target }) => target, 9690 handler(e, mediaObj) { 9691 if (mediaObj.matches ^ this.isToggled(this.target)) { 9692 this.toggle(); 9693 } 9694 } 9695 } 9696 ], 9697 methods: { 9698 async toggle(type) { 9699 if (!trigger(this.target, type || "toggle", [this])) { 9700 return; 9701 } 9702 if (hasAttr(this.$el, "aria-expanded")) { 9703 attr(this.$el, "aria-expanded", !this.isToggled(this.target)); 9704 } 9705 if (!this.queued) { 9706 return this.toggleElement(this.target); 9707 } 9708 const leaving = this.target.filter((el) => hasClass(el, this.clsLeave)); 9709 if (leaving.length) { 9710 for (const el of this.target) { 9711 const isLeaving = includes(leaving, el); 9712 this.toggleElement(el, isLeaving, isLeaving); 9713 } 9714 return; 9715 } 9716 const toggled = this.target.filter(this.isToggled); 9717 if (await this.toggleElement(toggled, false)) { 9718 await this.toggleElement( 9719 this.target.filter((el) => !includes(toggled, el)), 9720 true 9721 ); 9722 } 9723 } 9724 } 9725 }; 9726 9727 var components = /*#__PURE__*/Object.freeze({ 9728 __proto__: null, 9729 Accordion: Accordion, 9730 Alert: alert, 9731 Close: Close, 9732 Cover: cover, 9733 Drop: drop, 9734 DropParentIcon: IconComponent, 9735 Dropdown: drop, 9736 Dropnav: Dropnav, 9737 FormCustom: formCustom, 9738 Grid: grid, 9739 HeightMatch: heightMatch, 9740 HeightPlaceholder: heightPlaceholder, 9741 HeightViewport: heightViewport, 9742 Icon: Icon, 9743 Img: img, 9744 Inverse: inverse, 9745 Leader: leader, 9746 Margin: Margin, 9747 Marker: Marker, 9748 Modal: modal,
9749 Nav: nav, 9750 NavParentIcon: NavParentIcon, 9751 Navbar: navbar, 9752 NavbarParentIcon: IconComponent, 9753 NavbarToggleIcon: NavbarToggleIcon, 9754 Offcanvas: offcanvas, 9755 OverflowAuto: overflowAuto, 9756 OverlayIcon: IconComponent, 9757 PaginationNext: PaginationNext, 9758 PaginationPrevious: PaginationPrevious, 9759 Responsive: responsive, 9760 Scroll: scroll, 9761 Scrollspy: scrollspy, 9762 ScrollspyNav: scrollspyNav, 9763 SearchIcon: Search, 9764 SlidenavNext: Slidenav, 9765 SlidenavPrevious: Slidenav, 9766 Spinner: Spinner, 9767 Sticky: sticky, 9768 Svg: svg, 9769 Switcher: Switcher, 9770 Tab: tab, 9771 Toggle: toggle, 9772 Totop: Totop, 9773 Video: Video 9774 }); 9775 9776 each(components, (component, name) => App.component(name, component)); 9777 boot(App); 9778 9779 each(components$1, (component, name) => App.component(name, component)); 9780 9781 return App; 9782 9783}));
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.