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