vendor: 1,456 bytes, lines 1-33
1"use strict"; 2(() => { 3 var __create = Object.create; 4 var __defProp = Object.defineProperty; 5 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 6 var __getOwnPropNames = Object.getOwnPropertyNames; 7 var __getProtoOf = Object.getPrototypeOf; 8 var __hasOwnProp = Object.prototype.hasOwnProperty; 9 var __commonJS = (cb, mod) => function __require() { 10 try { 11 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 12 } catch (e) { 13 throw mod = 0, e; 14 } 15 }; 16 var __copyProps = (to, from, except, desc) => { 17 if (from && typeof from === "object" || typeof from === "function") { 18 for (let key of __getOwnPropNames(from)) 19 if (!__hasOwnProp.call(to, key) && key !== except) 20 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 21 } 22 return to; 23 }; 24 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 25 // If the importer is in node compatibility mode or this is not an ESM 26 // file that has been converted to a CommonJS file using a Babel- 27 // compatible transform (i.e. "__esModule" has not been set), then set 28 // "default" to the CommonJS "module.exports" for node compatibility. 29 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 30 mod 31 )); 32 33
vendor: 28,393 bytes, lines 33-686
33// node_modules/fuzzysort/fuzzysort.js 34 var require_fuzzysort = __commonJS({ 35 "node_modules/fuzzysort/fuzzysort.js"(exports, module) { 36 ((root, UMD) => { 37 if (typeof define === "function" && define.amd) define([], UMD); 38 else if (typeof module === "object" && module.exports) module.exports = UMD(); 39 else root["fuzzysort"] = UMD(); 40 })(exports, (_) => { 41 "use strict"; 42 var single = (search, target) => { 43 if (!search || !target) return NULL; 44 var preparedSearch = getPreparedSearch(search); 45 if (!isPrepared(target)) target = getPrepared(target); 46 var searchBitflags = preparedSearch.bitflags; 47 if ((searchBitflags & target._bitflags) !== searchBitflags) return NULL; 48 return algorithm(preparedSearch, target); 49 }; 50 var go = (search, targets, options) => { 51 if (!search) return options?.all ? all(targets, options) : noResults; 52 var preparedSearch = getPreparedSearch(search); 53 var searchBitflags = preparedSearch.bitflags; 54 var containsSpace = preparedSearch.containsSpace; 55 var threshold = denormalizeScore(options?.threshold || 0); 56 var limit = options?.limit || INFINITY; 57 var resultsLen = 0; 58 var limitedCount = 0; 59 var targetsLen = targets.length; 60 function push_result(result2) { 61 if (resultsLen < limit) { 62 q.add(result2); 63 ++resultsLen; 64 } else { 65 ++limitedCount; 66 if (result2._score > q.peek()._score) q.replaceTop(result2); 67 } 68 } 69 if (options?.key) { 70 var key = options.key; 71 for (var i = 0; i < targetsLen; ++i) { 72 var obj = targets[i]; 73 var target = getValue(obj, key); 74 if (!target) continue; 75 if (!isPrepared(target)) target = getPrepared(target); 76 if ((searchBitflags & target._bitflags) !== searchBitflags) continue; 77 var result = algorithm(preparedSearch, target); 78 if (result === NULL) continue; 79 if (result._score < threshold) continue; 80 result.obj = obj; 81 push_result(result); 82 } 83 } else if (options?.keys) { 84 var keys = options.keys; 85 var keysLen = keys.length; 86 outer: for (var i = 0; i < targetsLen; ++i) { 87 var obj = targets[i]; 88 { 89 var keysBitflags = 0; 90 for (var keyI = 0; keyI < keysLen; ++keyI) { 91 var key = keys[keyI]; 92 var target = getValue(obj, key); 93 if (!target) { 94 tmpTargets[keyI] = noTarget; 95 continue; 96 } 97 if (!isPrepared(target)) target = getPrepared(target); 98 tmpTargets[keyI] = target; 99 keysBitflags |= target._bitflags; 100 } 101 if ((searchBitflags & keysBitflags) !== searchBitflags) continue; 102 } 103 if (containsSpace) for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) keysSpacesBestScores[i2] = NEGATIVE_INFINITY; 104 for (var keyI = 0; keyI < keysLen; ++keyI) { 105 target = tmpTargets[keyI]; 106 if (target === noTarget) { 107 tmpResults[keyI] = noTarget; 108 continue; 109 } 110 tmpResults[keyI] = algorithm( 111 preparedSearch, 112 target, 113 /*allowSpaces=*/ 114 false, 115 /*allowPartialMatch=*/ 116 containsSpace 117 ); 118 if (tmpResults[keyI] === NULL) { 119 tmpResults[keyI] = noTarget; 120 continue; 121 } 122 if (containsSpace) for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) { 123 if (allowPartialMatchScores[i2] > -1e3) { 124 if (keysSpacesBestScores[i2] > NEGATIVE_INFINITY) { 125 var tmp = (keysSpacesBestScores[i2] + allowPartialMatchScores[i2]) / 4; 126 if (tmp > keysSpacesBestScores[i2]) keysSpacesBestScores[i2] = tmp; 127 } 128 } 129 if (allowPartialMatchScores[i2] > keysSpacesBestScores[i2]) keysSpacesBestScores[i2] = allowPartialMatchScores[i2]; 130 } 131 } 132 if (containsSpace) { 133 for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) { 134 if (keysSpacesBestScores[i2] === NEGATIVE_INFINITY) continue outer; 135 } 136 } else { 137 var hasAtLeast1Match = false; 138 for (let i2 = 0; i2 < keysLen; i2++) { 139 if (tmpResults[i2]._score !== NEGATIVE_INFINITY) { 140 hasAtLeast1Match = true; 141 break; 142 } 143 } 144 if (!hasAtLeast1Match) continue; 145 } 146 var objResults = new KeysResult(keysLen); 147 for (let i2 = 0; i2 < keysLen; i2++) { 148 objResults[i2] = tmpResults[i2]; 149 } 150 if (containsSpace) { 151 var score = 0; 152 for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) score += keysSpacesBestScores[i2]; 153 } else { 154 var score = NEGATIVE_INFINITY; 155 for (let i2 = 0; i2 < keysLen; i2++) { 156 var result = objResults[i2]; 157 if (result._score > -1e3) { 158 if (score > NEGATIVE_INFINITY) { 159 var tmp = (score + result._score) / 4; 160 if (tmp > score) score = tmp; 161 } 162 } 163 if (result._score > score) score = result._score; 164 } 165 } 166 objResults.obj = obj; 167 objResults._score = score; 168 if (options?.scoreFn) { 169 score = options.scoreFn(objResults); 170 if (!score) continue; 171 score = denormalizeScore(score); 172 objResults._score = score; 173 } 174 if (score < threshold) continue; 175 push_result(objResults); 176 } 177 } else { 178 for (var i = 0; i < targetsLen; ++i) { 179 var target = targets[i]; 180 if (!target) continue; 181 if (!isPrepared(target)) target = getPrepared(target); 182 if ((searchBitflags & target._bitflags) !== searchBitflags) continue; 183 var result = algorithm(preparedSearch, target); 184 if (result === NULL) continue; 185 if (result._score < threshold) continue; 186 push_result(result); 187 } 188 } 189 if (resultsLen === 0) return noResults; 190 var results = new Array(resultsLen); 191 for (var i = resultsLen - 1; i >= 0; --i) results[i] = q.poll(); 192 results.total = resultsLen + limitedCount; 193 return results; 194 }; 195 var highlight = (result, open = "<b>", close = "</b>") => { 196 var callback = typeof open === "function" ? open : void 0; 197 var target = result.target; 198 var targetLen = target.length; 199 var indexes = result.indexes; 200 var highlighted = ""; 201 var matchI = 0; 202 var indexesI = 0; 203 var opened = false; 204 var parts = []; 205 for (var i = 0; i < targetLen; ++i) { 206 var char = target[i]; 207 if (indexes[indexesI] === i) { 208 ++indexesI; 209 if (!opened) { 210 opened = true; 211 if (callback) { 212 parts.push(highlighted); 213 highlighted = ""; 214 } else { 215 highlighted += open; 216 } 217 } 218 if (indexesI === indexes.length) { 219 if (callback) { 220 highlighted += char; 221 parts.push(callback(highlighted, matchI++)); 222 highlighted = ""; 223 parts.push(target.substr(i + 1)); 224 } else { 225 highlighted += char + close + target.substr(i + 1); 226 } 227 break; 228 } 229 } else { 230 if (opened) { 231 opened = false; 232 if (callback) { 233 parts.push(callback(highlighted, matchI++)); 234 highlighted = ""; 235 } else { 236 highlighted += close; 237 } 238 } 239 } 240 highlighted += char; 241 } 242 return callback ? parts : highlighted; 243 }; 244 var prepare = (target) => { 245 if (typeof target === "number") target = "" + target; 246 else if (typeof target !== "string") target = ""; 247 var info = prepareLowerInfo(target); 248 return new_result(target, { _targetLower: info._lower, _targetLowerCodes: info.lowerCodes, _bitflags: info.bitflags }); 249 }; 250 var cleanup2 = () => { 251 preparedCache.clear(); 252 preparedSearchCache.clear(); 253 }; 254 class Result { 255 get ["indexes"]() { 256 return this._indexes.slice(0, this._indexes.len).sort((a, b) => a - b); 257 } 258 set ["indexes"](indexes) { 259 return this._indexes = indexes; 260 } 261 ["highlight"](open, close) { 262 return highlight(this, open, close); 263 } 264 get ["score"]() { 265 return normalizeScore(this._score); 266 } 267 set ["score"](score) { 268 this._score = denormalizeScore(score); 269 } 270 } 271 class KeysResult extends Array { 272 get ["score"]() { 273 return normalizeScore(this._score); 274 } 275 set ["score"](score) { 276 this._score = denormalizeScore(score); 277 } 278 } 279 var new_result = (target, options) => { 280 const result = new Result(); 281 result["target"] = target; 282 result["obj"] = options.obj ?? NULL; 283 result._score = options._score ?? NEGATIVE_INFINITY; 284 result._indexes = options._indexes ?? []; 285 result._targetLower = options._targetLower ?? ""; 286 result._targetLowerCodes = options._targetLowerCodes ?? NULL; 287 result._nextBeginningIndexes = options._nextBeginningIndexes ?? NULL; 288 result._bitflags = options._bitflags ?? 0; 289 return result; 290 }; 291 var normalizeScore = (score) => { 292 if (score === NEGATIVE_INFINITY) return 0; 293 if (score > 1) return score; 294 return Math.E ** (((-score + 1) ** 0.04307 - 1) * -2); 295 }; 296 var denormalizeScore = (normalizedScore) => { 297 if (normalizedScore === 0) return NEGATIVE_INFINITY; 298 if (normalizedScore > 1) return normalizedScore; 299 return 1 - Math.pow(Math.log(normalizedScore) / -2 + 1, 1 / 0.04307); 300 }; 301 var prepareSearch = (search) => { 302 if (typeof search === "number") search = "" + search; 303 else if (typeof search !== "string") search = ""; 304 search = search.trim(); 305 var info = prepareLowerInfo(search); 306 var spaceSearches = []; 307 if (info.containsSpace) { 308 var searches = search.split(/\s+/); 309 searches = [...new Set(searches)]; 310 for (var i = 0; i < searches.length; i++) { 311 if (searches[i] === "") continue; 312 var _info = prepareLowerInfo(searches[i]); 313 spaceSearches.push({ lowerCodes: _info.lowerCodes, _lower: searches[i].toLowerCase(), containsSpace: false }); 314 } 315 } 316 return { lowerCodes: info.lowerCodes, _lower: info._lower, containsSpace: info.containsSpace, bitflags: info.bitflags, spaceSearches }; 317 }; 318 var getPrepared = (target) => { 319 if (target.length > 999) return prepare(target); 320 var targetPrepared = preparedCache.get(target); 321 if (targetPrepared !== void 0) return targetPrepared; 322 targetPrepared = prepare(target); 323 preparedCache.set(target, targetPrepared); 324 return targetPrepared; 325 }; 326 var getPreparedSearch = (search) => { 327 if (search.length > 999) return prepareSearch(search); 328 var searchPrepared = preparedSearchCache.get(search); 329 if (searchPrepared !== void 0) return searchPrepared; 330 searchPrepared = prepareSearch(search); 331 preparedSearchCache.set(search, searchPrepared); 332 return searchPrepared; 333 }; 334 var all = (targets, options) => { 335 var results = []; 336 results.total = targets.length; 337 var limit = options?.limit || INFINITY; 338 if (options?.key) { 339 for (var i = 0; i < targets.length; i++) { 340 var obj = targets[i]; 341 var target = getValue(obj, options.key); 342 if (target == NULL) continue; 343 if (!isPrepared(target)) target = getPrepared(target); 344 var result = new_result(target.target, { _score: target._score, obj }); 345 results.push(result); 346 if (results.length >= limit) return results; 347 } 348 } else if (options?.keys) { 349 for (var i = 0; i < targets.length; i++) { 350 var obj = targets[i]; 351 var objResults = new KeysResult(options.keys.length); 352 for (var keyI = options.keys.length - 1; keyI >= 0; --keyI) { 353 var target = getValue(obj, options.keys[keyI]); 354 if (!target) { 355 objResults[keyI] = noTarget; 356 continue; 357 } 358 if (!isPrepared(target)) target = getPrepared(target); 359 target._score = NEGATIVE_INFINITY; 360 target._indexes.len = 0; 361 objResults[keyI] = target; 362 } 363 objResults.obj = obj; 364 objResults._score = NEGATIVE_INFINITY; 365 results.push(objResults); 366 if (results.length >= limit) return results; 367 } 368 } else { 369 for (var i = 0; i < targets.length; i++) { 370 var target = targets[i]; 371 if (target == NULL) continue; 372 if (!isPrepared(target)) target = getPrepared(target); 373 target._score = NEGATIVE_INFINITY; 374 target._indexes.len = 0; 375 results.push(target); 376 if (results.length >= limit) return results; 377 } 378 } 379 return results; 380 }; 381 var algorithm = (preparedSearch, prepared, allowSpaces = false, allowPartialMatch = false) => { 382 if (allowSpaces === false && preparedSearch.containsSpace) return algorithmSpaces(preparedSearch, prepared, allowPartialMatch); 383 var searchLower = preparedSearch._lower; 384 var searchLowerCodes = preparedSearch.lowerCodes; 385 var searchLowerCode = searchLowerCodes[0]; 386 var targetLowerCodes = prepared._targetLowerCodes; 387 var searchLen = searchLowerCodes.length; 388 var targetLen = targetLowerCodes.length; 389 var searchI = 0; 390 var targetI = 0; 391 var matchesSimpleLen = 0; 392 for (; ; ) { 393 var isMatch = searchLowerCode === targetLowerCodes[targetI]; 394 if (isMatch) { 395 matchesSimple[matchesSimpleLen++] = targetI; 396 ++searchI; 397 if (searchI === searchLen) break; 398 searchLowerCode = searchLowerCodes[searchI]; 399 } 400 ++targetI; 401 if (targetI >= targetLen) return NULL; 402 } 403 var searchI = 0; 404 var successStrict = false; 405 var matchesStrictLen = 0; 406 var nextBeginningIndexes = prepared._nextBeginningIndexes; 407 if (nextBeginningIndexes === NULL) nextBeginningIndexes = prepared._nextBeginningIndexes = prepareNextBeginningIndexes(prepared.target); 408 targetI = matchesSimple[0] === 0 ? 0 : nextBeginningIndexes[matchesSimple[0] - 1]; 409 var backtrackCount = 0; 410 if (targetI !== targetLen) for (; ; ) { 411 if (targetI >= targetLen) { 412 if (searchI <= 0) break; 413 ++backtrackCount; 414 if (backtrackCount > 200) break; 415 --searchI; 416 var lastMatch = matchesStrict[--matchesStrictLen]; 417 targetI = nextBeginningIndexes[lastMatch]; 418 } else { 419 var isMatch = searchLowerCodes[searchI] === targetLowerCodes[targetI]; 420 if (isMatch) { 421 matchesStrict[matchesStrictLen++] = targetI; 422 ++searchI; 423 if (searchI === searchLen) { 424 successStrict = true; 425 break; 426 } 427 ++targetI; 428 } else { 429 targetI = nextBeginningIndexes[targetI]; 430 } 431 } 432 } 433 var substringIndex = searchLen <= 1 ? -1 : prepared._targetLower.indexOf(searchLower, matchesSimple[0]); 434 var isSubstring = !!~substringIndex; 435 var isSubstringBeginning = !isSubstring ? false : substringIndex === 0 || prepared._nextBeginningIndexes[substringIndex - 1] === substringIndex; 436 if (isSubstring && !isSubstringBeginning) { 437 for (var i = 0; i < nextBeginningIndexes.length; i = nextBeginningIndexes[i]) { 438 if (i <= substringIndex) continue; 439 for (var s = 0; s < searchLen; s++) if (searchLowerCodes[s] !== prepared._targetLowerCodes[i + s]) break; 440 if (s === searchLen) { 441 substringIndex = i; 442 isSubstringBeginning = true; 443 break; 444 } 445 } 446 } 447 var calculateScore = (matches2) => { 448 var score2 = 0; 449 var extraMatchGroupCount = 0; 450 for (var i2 = 1; i2 < searchLen; ++i2) { 451 if (matches2[i2] - matches2[i2 - 1] !== 1) { 452 score2 -= matches2[i2]; 453 ++extraMatchGroupCount; 454 } 455 } 456 var unmatchedDistance = matches2[searchLen - 1] - matches2[0] - (searchLen - 1); 457 score2 -= (12 + unmatchedDistance) * extraMatchGroupCount; 458 if (matches2[0] !== 0) score2 -= matches2[0] * matches2[0] * 0.2; 459 if (!successStrict) { 460 score2 *= 1e3; 461 } else { 462 var uniqueBeginningIndexes = 1; 463 for (var i2 = nextBeginningIndexes[0]; i2 < targetLen; i2 = nextBeginningIndexes[i2]) ++uniqueBeginningIndexes; 464 if (uniqueBeginningIndexes > 24) score2 *= (uniqueBeginningIndexes - 24) * 10; 465 } 466 score2 -= (targetLen - searchLen) / 2; 467 if (isSubstring) score2 /= 1 + searchLen * searchLen * 1; 468 if (isSubstringBeginning) score2 /= 1 + searchLen * searchLen * 1; 469 score2 -= (targetLen - searchLen) / 2; 470 return score2; 471 }; 472 if (!successStrict) { 473 if (isSubstring) for (var i = 0; i < searchLen; ++i) matchesSimple[i] = substringIndex + i; 474 var matchesBest = matchesSimple; 475 var score = calculateScore(matchesBest); 476 } else { 477 if (isSubstringBeginning) { 478 for (var i = 0; i < searchLen; ++i) matchesSimple[i] = substringIndex + i; 479 var matchesBest = matchesSimple; 480 var score = calculateScore(matchesSimple); 481 } else { 482 var matchesBest = matchesStrict; 483 var score = calculateScore(matchesStrict); 484 } 485 } 486 prepared._score = score; 487 for (var i = 0; i < searchLen; ++i) prepared._indexes[i] = matchesBest[i]; 488 prepared._indexes.len = searchLen; 489 const result = new Result(); 490 result.target = prepared.target; 491 result._score = prepared._score; 492 result._indexes = prepared._indexes; 493 return result; 494 }; 495 var algorithmSpaces = (preparedSearch, target, allowPartialMatch) => { 496 var seen_indexes = /* @__PURE__ */ new Set(); 497 var score = 0; 498 var result = NULL; 499 var first_seen_index_last_search = 0; 500 var searches = preparedSearch.spaceSearches; 501 var searchesLen = searches.length; 502 var changeslen = 0; 503 var resetNextBeginningIndexes = () => { 504 for (let i2 = changeslen - 1; i2 >= 0; i2--) target._nextBeginningIndexes[nextBeginningIndexesChanges[i2 * 2 + 0]] = nextBeginningIndexesChanges[i2 * 2 + 1]; 505 }; 506 var hasAtLeast1Match = false; 507 for (var i = 0; i < searchesLen; ++i) { 508 allowPartialMatchScores[i] = NEGATIVE_INFINITY; 509 var search = searches[i]; 510 result = algorithm(search, target); 511 if (allowPartialMatch) { 512 if (result === NULL) continue; 513 hasAtLeast1Match = true; 514 } else { 515 if (result === NULL) { 516 resetNextBeginningIndexes(); 517 return NULL; 518 } 519 } 520 var isTheLastSearch = i === searchesLen - 1; 521 if (!isTheLastSearch) { 522 var indexes = result._indexes; 523 var indexesIsConsecutiveSubstring = true; 524 for (let i2 = 0; i2 < indexes.len - 1; i2++) { 525 if (indexes[i2 + 1] - indexes[i2] !== 1) { 526 indexesIsConsecutiveSubstring = false; 527 break; 528 } 529 } 530 if (indexesIsConsecutiveSubstring) { 531 var newBeginningIndex = indexes[indexes.len - 1] + 1; 532 var toReplace = target._nextBeginningIndexes[newBeginningIndex - 1]; 533 for (let i2 = newBeginningIndex - 1; i2 >= 0; i2--) { 534 if (toReplace !== target._nextBeginningIndexes[i2]) break; 535 target._nextBeginningIndexes[i2] = newBeginningIndex; 536 nextBeginningIndexesChanges[changeslen * 2 + 0] = i2; 537 nextBeginningIndexesChanges[changeslen * 2 + 1] = toReplace; 538 changeslen++; 539 } 540 } 541 } 542 score += result._score / searchesLen; 543 allowPartialMatchScores[i] = result._score / searchesLen; 544 if (result._indexes[0] < first_seen_index_last_search) { 545 score -= (first_seen_index_last_search - result._indexes[0]) * 2; 546 } 547 first_seen_index_last_search = result._indexes[0]; 548 for (var j = 0; j < result._indexes.len; ++j) seen_indexes.add(result._indexes[j]); 549 } 550 if (allowPartialMatch && !hasAtLeast1Match) return NULL; 551 resetNextBeginningIndexes(); 552 var allowSpacesResult = algorithm( 553 preparedSearch, 554 target, 555 /*allowSpaces=*/ 556 true 557 ); 558 if (allowSpacesResult !== NULL && allowSpacesResult._score > score) { 559 if (allowPartialMatch) { 560 for (var i = 0; i < searchesLen; ++i) { 561 allowPartialMatchScores[i] = allowSpacesResult._score / searchesLen; 562 } 563 } 564 return allowSpacesResult; 565 } 566 if (allowPartialMatch) result = target; 567 result._score = score; 568 var i = 0; 569 for (let index2 of seen_indexes) result._indexes[i++] = index2; 570 result._indexes.len = i; 571 return result; 572 }; 573 var remove_accents = (str) => str.replace(/\p{Script=Latin}+/gu, (match) => match.normalize("NFD")).replace(/[\u0300-\u036f]/g, ""); 574 var prepareLowerInfo = (str) => { 575 str = remove_accents(str); 576 var strLen = str.length; 577 var lower = str.toLowerCase(); 578 var lowerCodes = []; 579 var bitflags = 0; 580 var containsSpace = false; 581 for (var i = 0; i < strLen; ++i) { 582 var lowerCode = lowerCodes[i] = lower.charCodeAt(i); 583 if (lowerCode === 32) { 584 containsSpace = true; 585 continue; 586 } 587 var bit = lowerCode >= 97 && lowerCode <= 122 ? lowerCode - 97 : lowerCode >= 48 && lowerCode <= 57 ? 26 : lowerCode <= 127 ? 30 : 31; 588 bitflags |= 1 << bit; 589 } 590 return { lowerCodes, bitflags, containsSpace, _lower: lower }; 591 }; 592 var prepareBeginningIndexes = (target) => { 593 var targetLen = target.length; 594 var beginningIndexes = []; 595 var beginningIndexesLen = 0; 596 var wasUpper = false; 597 var wasAlphanum = false; 598 for (var i = 0; i < targetLen; ++i) { 599 var targetCode = target.charCodeAt(i); 600 var isUpper = targetCode >= 65 && targetCode <= 90; 601 var isAlphanum = isUpper || targetCode >= 97 && targetCode <= 122 || targetCode >= 48 && targetCode <= 57; 602 var isBeginning = isUpper && !wasUpper || !wasAlphanum || !isAlphanum; 603 wasUpper = isUpper; 604 wasAlphanum = isAlphanum; 605 if (isBeginning) beginningIndexes[beginningIndexesLen++] = i; 606 } 607 return beginningIndexes; 608 }; 609 var prepareNextBeginningIndexes = (target) => { 610 target = remove_accents(target); 611 var targetLen = target.length; 612 var beginningIndexes = prepareBeginningIndexes(target); 613 var nextBeginningIndexes = []; 614 var lastIsBeginning = beginningIndexes[0]; 615 var lastIsBeginningI = 0; 616 for (var i = 0; i < targetLen; ++i) { 617 if (lastIsBeginning > i) { 618 nextBeginningIndexes[i] = lastIsBeginning; 619 } else { 620 lastIsBeginning = beginningIndexes[++lastIsBeginningI]; 621 nextBeginningIndexes[i] = lastIsBeginning === void 0 ? targetLen : lastIsBeginning; 622 } 623 } 624 return nextBeginningIndexes; 625 }; 626 var preparedCache = /* @__PURE__ */ new Map(); 627 var preparedSearchCache = /* @__PURE__ */ new Map(); 628 var matchesSimple = []; 629 var matchesStrict = []; 630 var nextBeginningIndexesChanges = []; 631 var keysSpacesBestScores = []; 632 var allowPartialMatchScores = []; 633 var tmpTargets = []; 634 var tmpResults = []; 635 var getValue = (obj, prop) => { 636 var tmp = obj[prop]; 637 if (tmp !== void 0) return tmp; 638 if (typeof prop === "function") return prop(obj); 639 var segs = prop; 640 if (!Array.isArray(prop)) segs = prop.split("."); 641 var len = segs.length; 642 var i = -1; 643 while (obj && ++i < len) obj = obj[segs[i]]; 644 return obj; 645 }; 646 var isPrepared = (x) => { 647 return typeof x === "object" && typeof x._bitflags === "number"; 648 }; 649 var INFINITY = Infinity; 650 var NEGATIVE_INFINITY = -INFINITY; 651 var noResults = []; 652 noResults.total = 0; 653 var NULL = null; 654 var noTarget = prepare(""); 655 var fastpriorityqueue = (r) => { 656 var e = [], o = 0, a = {}, v = (r2) => { 657 for (var a2 = 0, v2 = e[a2], c = 1; c < o; ) { 658 var s = c + 1; 659 a2 = c, s < o && e[s]._score < e[c]._score && (a2 = s), e[a2 - 1 >> 1] = e[a2], c = 1 + (a2 << 1); 660 } 661 for (var f = a2 - 1 >> 1; a2 > 0 && v2._score < e[f]._score; f = (a2 = f) - 1 >> 1) e[a2] = e[f]; 662 e[a2] = v2; 663 }; 664 return a.add = ((r2) => { 665 var a2 = o; 666 e[o++] = r2; 667 for (var v2 = a2 - 1 >> 1; a2 > 0 && r2._score < e[v2]._score; v2 = (a2 = v2) - 1 >> 1) e[a2] = e[v2]; 668 e[a2] = r2; 669 }), a.poll = ((r2) => { 670 if (0 !== o) { 671 var a2 = e[0]; 672 return e[0] = e[--o], v(), a2; 673 } 674 }), a.peek = ((r2) => { 675 if (0 !== o) return e[0]; 676 }), a.replaceTop = ((r2) => { 677 e[0] = r2, v(); 678 }), a; 679 }; 680 var q = fastpriorityqueue(); 681 return { "single": single, "go": go, "prepare": prepare, "cleanup": cleanup2 }; 682 }); 683 } 684 }); 685 686
vendor: 110,605 bytes, lines 686-4085
686// node_modules/alpinejs/dist/module.esm.js 687 var flushPending = false; 688 var flushing = false; 689 var queue = []; 690 var lastFlushedIndex = -1; 691 var transactionActive = false; 692 function scheduler(callback) { 693 queueJob(callback); 694 } 695 function startTransaction() { 696 transactionActive = true; 697 } 698 function commitTransaction() { 699 transactionActive = false; 700 queueFlush(); 701 } 702 function queueJob(job) { 703 if (!queue.includes(job)) 704 queue.push(job); 705 queueFlush(); 706 } 707 function dequeueJob(job) { 708 let index2 = queue.indexOf(job); 709 if (index2 !== -1 && index2 > lastFlushedIndex) 710 queue.splice(index2, 1); 711 } 712 function queueFlush() { 713 if (!flushing && !flushPending) { 714 if (transactionActive) 715 return; 716 flushPending = true; 717 queueMicrotask(flushJobs); 718 } 719 } 720 function flushJobs() { 721 flushPending = false; 722 flushing = true; 723 for (let i = 0; i < queue.length; i++) { 724 queue[i](); 725 lastFlushedIndex = i; 726 } 727 queue.length = 0; 728 lastFlushedIndex = -1; 729 flushing = false; 730 } 731 var reactive; 732 var effect; 733 var release; 734 var raw; 735 var shouldSchedule = true; 736 function disableEffectScheduling(callback) { 737 shouldSchedule = false; 738 callback(); 739 shouldSchedule = true; 740 } 741 function setReactivityEngine(engine) { 742 reactive = engine.reactive; 743 release = engine.release; 744 effect = (callback) => engine.effect(callback, { scheduler: (task) => { 745 if (shouldSchedule) { 746 scheduler(task); 747 } else { 748 task(); 749 } 750 } }); 751 raw = engine.raw; 752 } 753 function overrideEffect(override) { 754 effect = override; 755 } 756 function elementBoundEffect(el) { 757 let cleanup2 = () => { 758 }; 759 let wrappedEffect = (callback) => { 760 let effectReference = effect(callback); 761 if (!el._x_effects) { 762 el._x_effects = /* @__PURE__ */ new Set(); 763 el._x_runEffects = () => { 764 el._x_effects.forEach((i) => i()); 765 }; 766 } 767 el._x_effects.add(effectReference); 768 cleanup2 = () => { 769 if (effectReference === void 0) 770 return; 771 el._x_effects.delete(effectReference); 772 release(effectReference); 773 }; 774 return effectReference; 775 }; 776 return [wrappedEffect, () => { 777 cleanup2(); 778 }]; 779 } 780 function watch(getter, callback) { 781 let firstTime = true; 782 let oldValue; 783 let oldValueJSON; 784 let effectReference = effect(() => { 785 let value = getter(); 786 let newJSON = JSON.stringify(value); 787 if (!firstTime) { 788 if (typeof value === "object" || value !== oldValue) { 789 let previousValue = typeof oldValue === "object" ? JSON.parse(oldValueJSON) : oldValue; 790 queueMicrotask(() => { 791 callback(value, previousValue); 792 }); 793 } 794 } 795 oldValue = value; 796 oldValueJSON = newJSON; 797 firstTime = false; 798 }); 799 return () => release(effectReference); 800 } 801 async function transaction(callback) { 802 startTransaction(); 803 try { 804 await callback(); 805 await Promise.resolve(); 806 } finally { 807 commitTransaction(); 808 } 809 } 810 var onAttributeAddeds = []; 811 var onElRemoveds = []; 812 var onElAddeds = []; 813 function onElAdded(callback) { 814 onElAddeds.push(callback); 815 } 816 function onElRemoved(el, callback) { 817 if (typeof callback === "function") { 818 if (!el._x_cleanups) 819 el._x_cleanups = []; 820 el._x_cleanups.push(callback); 821 } else { 822 callback = el; 823 onElRemoveds.push(callback); 824 } 825 } 826 function onAttributesAdded(callback) { 827 onAttributeAddeds.push(callback); 828 } 829 function onAttributeRemoved(el, name, callback) { 830 if (!el._x_attributeCleanups) 831 el._x_attributeCleanups = {}; 832 if (!el._x_attributeCleanups[name]) 833 el._x_attributeCleanups[name] = []; 834 el._x_attributeCleanups[name].push(callback); 835 } 836 function cleanupAttributes(el, names) { 837 if (!el._x_attributeCleanups) 838 return; 839 Object.entries(el._x_attributeCleanups).forEach(([name, value]) => { 840 if (names === void 0 || names.includes(name)) { 841 value.forEach((i) => i()); 842 delete el._x_attributeCleanups[name]; 843 } 844 }); 845 } 846 function cleanupElement(el) { 847 el._x_effects?.forEach(dequeueJob); 848 while (el._x_cleanups?.length) 849 el._x_cleanups.pop()(); 850 } 851 var observer = new MutationObserver(onMutate); 852 var currentlyObserving = false; 853 function startObservingMutations() { 854 observer.observe(document, { subtree: true, childList: true, attributes: true, attributeOldValue: true }); 855 currentlyObserving = true; 856 } 857 function stopObservingMutations() { 858 flushObserver(); 859 observer.disconnect(); 860 currentlyObserving = false; 861 } 862 var queuedMutations = []; 863 function flushObserver() { 864 let records = observer.takeRecords(); 865 queuedMutations.push(() => records.length > 0 && onMutate(records)); 866 let queueLengthWhenTriggered = queuedMutations.length; 867 queueMicrotask(() => { 868 if (queuedMutations.length === queueLengthWhenTriggered) { 869 while (queuedMutations.length > 0) 870 queuedMutations.shift()(); 871 } 872 }); 873 } 874 function mutateDom(callback) { 875 if (!currentlyObserving) 876 return callback(); 877 stopObservingMutations(); 878 let result = callback(); 879 startObservingMutations(); 880 return result; 881 } 882 var isCollecting = false; 883 var deferredMutations = []; 884 function deferMutations() { 885 isCollecting = true; 886 } 887 function flushAndStopDeferringMutations() { 888 isCollecting = false; 889 onMutate(deferredMutations); 890 deferredMutations = []; 891 } 892 function onMutate(mutations) { 893 if (isCollecting) { 894 deferredMutations = deferredMutations.concat(mutations); 895 return; 896 } 897 let addedNodes = []; 898 let removedNodes = /* @__PURE__ */ new Set(); 899 let addedAttributes = /* @__PURE__ */ new Map(); 900 let removedAttributes = /* @__PURE__ */ new Map(); 901 for (let i = 0; i < mutations.length; i++) { 902 if (mutations[i].target._x_ignoreMutationObserver) 903 continue; 904 if (mutations[i].type === "childList") { 905 mutations[i].removedNodes.forEach((node) => { 906 if (node.nodeType !== 1) 907 return; 908 if (!node._x_marker) 909 return; 910 removedNodes.add(node); 911 }); 912 mutations[i].addedNodes.forEach((node) => { 913 if (node.nodeType !== 1) 914 return; 915 if (removedNodes.has(node)) { 916 removedNodes.delete(node); 917 return; 918 } 919 if (node._x_marker) 920 return; 921 addedNodes.push(node); 922 }); 923 } 924 if (mutations[i].type === "attributes") { 925 let el = mutations[i].target; 926 let name = mutations[i].attributeName; 927 let oldValue = mutations[i].oldValue; 928 let add2 = () => { 929 if (!addedAttributes.has(el)) 930 addedAttributes.set(el, []); 931 addedAttributes.get(el).push({ name, value: el.getAttribute(name) }); 932 }; 933 let remove = () => { 934 if (!removedAttributes.has(el)) 935 removedAttributes.set(el, []); 936 removedAttributes.get(el).push(name); 937 }; 938 if (el.hasAttribute(name) && oldValue === null) { 939 add2(); 940 } else if (el.hasAttribute(name)) { 941 remove(); 942 add2(); 943 } else { 944 remove(); 945 } 946 } 947 } 948 removedAttributes.forEach((attrs, el) => { 949 cleanupAttributes(el, attrs); 950 }); 951 addedAttributes.forEach((attrs, el) => { 952 onAttributeAddeds.forEach((i) => i(el, attrs)); 953 }); 954 for (let node of removedNodes) { 955 if (addedNodes.some((i) => i.contains(node))) 956 continue; 957 onElRemoveds.forEach((i) => i(node)); 958 } 959 for (let node of addedNodes) { 960 if (!node.isConnected) 961 continue; 962 onElAddeds.forEach((i) => i(node)); 963 } 964 addedNodes = null; 965 removedNodes = null; 966 addedAttributes = null; 967 removedAttributes = null; 968 } 969 function scope(node) { 970 return mergeProxies(closestDataStack(node)); 971 } 972 function addScopeToNode(node, data2, referenceNode) { 973 node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)]; 974 return () => { 975 node._x_dataStack = node._x_dataStack.filter((i) => i !== data2); 976 }; 977 } 978 function closestDataStack(node) { 979 if (node._x_dataStack) 980 return node._x_dataStack; 981 if (typeof ShadowRoot === "function" && node instanceof ShadowRoot) { 982 return closestDataStack(node.host); 983 } 984 if (!node.parentNode) { 985 return []; 986 } 987 return closestDataStack(node.parentNode); 988 } 989 function mergeProxies(objects) { 990 return new Proxy({ objects }, mergeProxyTrap); 991 } 992 function keyInPrototypeChain(obj, key) { 993 if (obj === null || obj === Object.prototype) 994 return null; 995 if (Object.prototype.hasOwnProperty.call(obj, key)) 996 return obj; 997 return keyInPrototypeChain(Object.getPrototypeOf(obj), key); 998 } 999 var mergeProxyTrap = { 1000 ownKeys({ objects }) { 1001 return Array.from( 1002 new Set(objects.flatMap((i) => Object.keys(i))) 1003 ); 1004 }, 1005 has({ objects }, name) { 1006 if (name == Symbol.unscopables) 1007 return false; 1008 return objects.some( 1009 (obj) => Object.prototype.hasOwnProperty.call(obj, name) || Reflect.has(obj, name) 1010 ); 1011 }, 1012 get({ objects }, name, thisProxy) { 1013 if (name == "toJSON") 1014 return collapseProxies; 1015 return Reflect.get( 1016 objects.find( 1017 (obj) => Reflect.has(obj, name) 1018 ) || {}, 1019 name, 1020 thisProxy 1021 ); 1022 }, 1023 set({ objects }, name, value, thisProxy) { 1024 let target; 1025 for (const obj of objects) { 1026 target = keyInPrototypeChain(obj, name); 1027 if (target) 1028 break; 1029 } 1030 if (!target) 1031 target = objects[objects.length - 1]; 1032 const descriptor = Object.getOwnPropertyDescriptor(target, name); 1033 if (descriptor?.set && descriptor?.get) 1034 return descriptor.set.call(thisProxy, value) || true; 1035 return Reflect.set(target, name, value); 1036 } 1037 }; 1038 function collapseProxies() { 1039 let keys = Reflect.ownKeys(this); 1040 return keys.reduce((acc, key) => { 1041 acc[key] = Reflect.get(this, key); 1042 return acc; 1043 }, {}); 1044 } 1045 function initInterceptors(data2) { 1046 let isObject3 = (val) => typeof val === "object" && !Array.isArray(val) && val !== null; 1047 let recurse = (obj, basePath = "") => { 1048 Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key, { value, enumerable }]) => { 1049 if (enumerable === false || value === void 0) 1050 return; 1051 if (typeof value === "object" && value !== null && value.__v_skip) 1052 return; 1053 let path = basePath === "" ? key : `${basePath}.${key}`; 1054 if (typeof value === "object" && value !== null && value._x_interceptor) { 1055 obj[key] = value.initialize(data2, path, key); 1056 } else { 1057 if (isObject3(value) && value !== obj && !(value instanceof Element)) { 1058 recurse(value, path); 1059 } 1060 } 1061 }); 1062 }; 1063 return recurse(data2); 1064 } 1065 function interceptor(callback, mutateObj = () => { 1066 }) { 1067 let obj = { 1068 initialValue: void 0, 1069 _x_interceptor: true, 1070 initialize(data2, path, key) { 1071 return callback(this.initialValue, () => get(data2, path), (value) => set(data2, path, value), path, key); 1072 } 1073 }; 1074 mutateObj(obj); 1075 return (initialValue) => { 1076 if (typeof initialValue === "object" && initialValue !== null && initialValue._x_interceptor) { 1077 let initialize = obj.initialize.bind(obj); 1078 obj.initialize = (data2, path, key) => { 1079 let innerValue = initialValue.initialize(data2, path, key); 1080 obj.initialValue = innerValue; 1081 return initialize(data2, path, key); 1082 }; 1083 } else { 1084 obj.initialValue = initialValue; 1085 } 1086 return obj; 1087 }; 1088 } 1089 function get(obj, path) { 1090 return path.split(".").reduce((carry, segment) => carry[segment], obj); 1091 } 1092 function set(obj, path, value) { 1093 if (typeof path === "string") 1094 path = path.split("."); 1095 if (path.length === 1) 1096 obj[path[0]] = value; 1097 else if (path.length === 0) 1098 throw error; 1099 else { 1100 if (obj[path[0]]) 1101 return set(obj[path[0]], path.slice(1), value); 1102 else { 1103 obj[path[0]] = {}; 1104 return set(obj[path[0]], path.slice(1), value); 1105 } 1106 } 1107 } 1108 var magics = {}; 1109 function magic(name, callback) { 1110 magics[name] = callback; 1111 } 1112 function injectMagics(obj, el) { 1113 let memoizedUtilities = getUtilities(el); 1114 Object.entries(magics).forEach(([name, callback]) => { 1115 Object.defineProperty(obj, `$${name}`, { 1116 get() { 1117 return callback(el, memoizedUtilities); 1118 }, 1119 enumerable: false 1120 }); 1121 }); 1122 return obj; 1123 } 1124 function getUtilities(el) { 1125 let [utilities, cleanup2] = getElementBoundUtilities(el); 1126 let utils = { interceptor, ...utilities }; 1127 onElRemoved(el, cleanup2); 1128 return utils; 1129 } 1130 function tryCatch(el, expression, callback, ...args) { 1131 try { 1132 return callback(...args); 1133 } catch (e) { 1134 handleError(e, el, expression); 1135 } 1136 } 1137 function handleError(...args) { 1138 return errorHandler(...args); 1139 } 1140 var errorHandler = normalErrorHandler; 1141 function setErrorHandler(handler4) { 1142 errorHandler = handler4; 1143 } 1144 function normalErrorHandler(error2, el, expression = void 0) { 1145 error2 = Object.assign( 1146 error2 ?? { message: "No error message given." }, 1147 { el, expression } 1148 ); 1149 console.warn(`Alpine Expression Error: ${error2.message} 1150 1151${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); 1152 setTimeout(() => { 1153 throw error2; 1154 }, 0); 1155 } 1156 var shouldAutoEvaluateFunctions = true; 1157 function dontAutoEvaluateFunctions(callback) { 1158 let cache = shouldAutoEvaluateFunctions; 1159 shouldAutoEvaluateFunctions = false; 1160 let result = callback(); 1161 shouldAutoEvaluateFunctions = cache; 1162 return result; 1163 } 1164 function evaluate(el, expression, extras = {}) { 1165 let result; 1166 evaluateLater(el, expression)((value) => result = value, extras); 1167 return result; 1168 } 1169 function evaluateLater(...args) { 1170 return theEvaluatorFunction(...args); 1171 } 1172 var theEvaluatorFunction = () => { 1173 }; 1174 function setEvaluator(newEvaluator) { 1175 theEvaluatorFunction = newEvaluator; 1176 } 1177 var theRawEvaluatorFunction; 1178 function setRawEvaluator(newEvaluator) { 1179 theRawEvaluatorFunction = newEvaluator; 1180 } 1181 function normalEvaluator(el, expression) { 1182 let overriddenMagics = {}; 1183 injectMagics(overriddenMagics, el); 1184 let dataStack = [overriddenMagics, ...closestDataStack(el)]; 1185 let evaluator = typeof expression === "function" ? generateEvaluatorFromFunction(dataStack, expression) : generateEvaluatorFromString(dataStack, expression, el); 1186 return tryCatch.bind(null, el, expression, evaluator); 1187 } 1188 function generateEvaluatorFromFunction(dataStack, func) { 1189 return (receiver = () => { 1190 }, { scope: scope2 = {}, params = [], context } = {}) => { 1191 if (!shouldAutoEvaluateFunctions) { 1192 runIfTypeOfFunction(receiver, func, mergeProxies([scope2, ...dataStack]), params); 1193 return; 1194 } 1195 let result = func.apply(mergeProxies([scope2, ...dataStack]), params); 1196 runIfTypeOfFunction(receiver, result); 1197 }; 1198 } 1199 var evaluatorMemo = {}; 1200 function generateFunctionFromString(expression, el) { 1201 if (evaluatorMemo[expression]) { 1202 return evaluatorMemo[expression]; 1203 } 1204 let AsyncFunction = Object.getPrototypeOf(async function() { 1205 }).constructor; 1206 let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression.trim()) || /^(let|const)\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression; 1207 const safeAsyncFunction = () => { 1208 try { 1209 let func2 = new AsyncFunction( 1210 ["__self", "scope"], 1211 `with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;` 1212 ); 1213 Object.defineProperty(func2, "name", { 1214 value: `[Alpine] ${expression}` 1215 }); 1216 return func2; 1217 } catch (error2) { 1218 handleError(error2, el, expression); 1219 return Promise.resolve(); 1220 } 1221 }; 1222 let func = safeAsyncFunction(); 1223 evaluatorMemo[expression] = func; 1224 return func; 1225 } 1226 function generateEvaluatorFromString(dataStack, expression, el) { 1227 let func = generateFunctionFromString(expression, el); 1228 return (receiver = () => { 1229 }, { scope: scope2 = {}, params = [], context } = {}) => { 1230 func.result = void 0; 1231 func.finished = false; 1232 let completeScope = mergeProxies([scope2, ...dataStack]); 1233 if (typeof func === "function") { 1234 let promise = func.call(context, func, completeScope).catch((error2) => handleError(error2, el, expression)); 1235 if (func.finished) { 1236 runIfTypeOfFunction(receiver, func.result, completeScope, params, el); 1237 func.result = void 0; 1238 } else { 1239 promise.then((result) => { 1240 runIfTypeOfFunction(receiver, result, completeScope, params, el); 1241 }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0); 1242 } 1243 } 1244 }; 1245 } 1246 function runIfTypeOfFunction(receiver, value, scope2, params, el) { 1247 if (shouldAutoEvaluateFunctions && typeof value === "function") { 1248 let result = value.apply(scope2, params); 1249 if (result instanceof Promise) { 1250 result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value)); 1251 } else { 1252 receiver(result); 1253 } 1254 } else if (typeof value === "object" && value instanceof Promise) { 1255 value.then((i) => receiver(i)); 1256 } else { 1257 receiver(value); 1258 } 1259 } 1260 function evaluateRaw(...args) { 1261 return theRawEvaluatorFunction(...args); 1262 } 1263 function normalRawEvaluator(el, expression, extras = {}) { 1264 let overriddenMagics = {}; 1265 injectMagics(overriddenMagics, el); 1266 let dataStack = [overriddenMagics, ...closestDataStack(el)]; 1267 let scope2 = mergeProxies([extras.scope ?? {}, ...dataStack]); 1268 let params = extras.params ?? []; 1269 if (expression.includes("await")) { 1270 let AsyncFunction = Object.getPrototypeOf(async function() { 1271 }).constructor; 1272 let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression.trim()) || /^(let|const)\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression; 1273 let func = new AsyncFunction( 1274 ["scope"], 1275 `with (scope) { let __result = ${rightSideSafeExpression}; return __result }` 1276 ); 1277 let result = func.call(extras.context, scope2); 1278 return result; 1279 } else { 1280 let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression.trim()) || /^(let|const)\s/.test(expression.trim()) ? `(()=>{ ${expression} })()` : expression; 1281 let func = new Function( 1282 ["scope"], 1283 `with (scope) { let __result = ${rightSideSafeExpression}; return __result }` 1284 ); 1285 let result = func.call(extras.context, scope2); 1286 if (typeof result === "function" && shouldAutoEvaluateFunctions) { 1287 return result.apply(scope2, params); 1288 } 1289 return result; 1290 } 1291 } 1292 var prefixAsString = "x-"; 1293 function prefix(subject = "") { 1294 return prefixAsString + subject; 1295 } 1296 function setPrefix(newPrefix) { 1297 prefixAsString = newPrefix; 1298 } 1299 var directiveHandlers = {}; 1300 function directive(name, callback) { 1301 directiveHandlers[name] = callback; 1302 return { 1303 before(directive2) { 1304 if (!directiveHandlers[directive2]) { 1305 console.warn(String.raw`Cannot find directive \`${directive2}\`. \`${name}\` will use the default order of execution`); 1306 return; 1307 } 1308 const pos = directiveOrder.indexOf(directive2); 1309 directiveOrder.splice(pos >= 0 ? pos : directiveOrder.indexOf("DEFAULT"), 0, name); 1310 } 1311 }; 1312 } 1313 function directiveExists(name) { 1314 return Object.keys(directiveHandlers).includes(name); 1315 } 1316 function directives(el, attributes, originalAttributeOverride) { 1317 attributes = Array.from(attributes); 1318 if (el._x_virtualDirectives) { 1319 let vAttributes = Object.entries(el._x_virtualDirectives).map(([name, value]) => ({ name, value })); 1320 let staticAttributes = attributesOnly(vAttributes); 1321 vAttributes = vAttributes.map((attribute) => { 1322 if (staticAttributes.find((attr) => attr.name === attribute.name)) { 1323 return { 1324 name: `x-bind:${attribute.name}`, 1325 value: `"${attribute.value}"` 1326 }; 1327 } 1328 return attribute; 1329 }); 1330 attributes = attributes.concat(vAttributes); 1331 } 1332 let transformedAttributeMap = {}; 1333 let directives2 = attributes.map(toTransformedAttributes((newName, oldName) => transformedAttributeMap[newName] = oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap, originalAttributeOverride)).sort(byPriority); 1334 return directives2.map((directive2) => { 1335 return getDirectiveHandler(el, directive2); 1336 }); 1337 } 1338 function attributesOnly(attributes) { 1339 return Array.from(attributes).map(toTransformedAttributes()).filter((attr) => !outNonAlpineAttributes(attr)); 1340 } 1341 var isDeferringHandlers = false; 1342 var directiveHandlerStacks = /* @__PURE__ */ new Map(); 1343 var currentHandlerStackKey = /* @__PURE__ */ Symbol(); 1344 function deferHandlingDirectives(callback) { 1345 isDeferringHandlers = true; 1346 let key = /* @__PURE__ */ Symbol(); 1347 currentHandlerStackKey = key; 1348 directiveHandlerStacks.set(key, []); 1349 let flushHandlers = () => { 1350 while (directiveHandlerStacks.get(key).length) 1351 directiveHandlerStacks.get(key).shift()(); 1352 directiveHandlerStacks.delete(key); 1353 }; 1354 let stopDeferring = () => { 1355 isDeferringHandlers = false; 1356 flushHandlers(); 1357 }; 1358 callback(flushHandlers); 1359 stopDeferring(); 1360 } 1361 function getElementBoundUtilities(el) { 1362 let cleanups = []; 1363 let cleanup2 = (callback) => cleanups.push(callback); 1364 let [effect3, cleanupEffect] = elementBoundEffect(el); 1365 cleanups.push(cleanupEffect); 1366 let utilities = { 1367 Alpine: alpine_default, 1368 effect: effect3, 1369 cleanup: cleanup2, 1370 evaluateLater: evaluateLater.bind(evaluateLater, el), 1371 evaluate: evaluate.bind(evaluate, el) 1372 }; 1373 let doCleanup = () => cleanups.forEach((i) => i()); 1374 return [utilities, doCleanup]; 1375 } 1376 function getDirectiveHandler(el, directive2) { 1377 let noop = () => { 1378 }; 1379 let handler4 = directiveHandlers[directive2.type] || noop; 1380 let [utilities, cleanup2] = getElementBoundUtilities(el); 1381 onAttributeRemoved(el, directive2.original, cleanup2); 1382 let fullHandler = () => { 1383 if (el._x_ignore || el._x_ignoreSelf) 1384 return; 1385 handler4.inline && handler4.inline(el, directive2, utilities); 1386 handler4 = handler4.bind(handler4, el, directive2, utilities); 1387 isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler4) : handler4(); 1388 }; 1389 fullHandler.runCleanups = cleanup2; 1390 return fullHandler; 1391 } 1392 var startingWith = (subject, replacement) => ({ name, value }) => { 1393 if (name.startsWith(subject)) 1394 name = name.replace(subject, replacement); 1395 return { name, value }; 1396 }; 1397 var into = (i) => i; 1398 function toTransformedAttributes(callback = () => { 1399 }) { 1400 return ({ name, value }) => { 1401 let { name: newName, value: newValue } = attributeTransformers.reduce((carry, transform) => { 1402 return transform(carry); 1403 }, { name, value }); 1404 if (newName !== name) 1405 callback(newName, name); 1406 return { name: newName, value: newValue }; 1407 }; 1408 } 1409 var attributeTransformers = []; 1410 function mapAttributes(callback) { 1411 attributeTransformers.push(callback); 1412 } 1413 function outNonAlpineAttributes({ name }) { 1414 return alpineAttributeRegex().test(name); 1415 } 1416 var alpineAttributeRegex = () => new RegExp(`^${prefixAsString}([^:^.]+)\\b`); 1417 function toParsedDirectives(transformedAttributeMap, originalAttributeOverride) { 1418 return ({ name, value }) => { 1419 if (name === value) 1420 value = ""; 1421 let typeMatch = name.match(alpineAttributeRegex()); 1422 let valueMatch = name.match(/:([a-zA-Z0-9\-_:]+)/); 1423 let modifiers = name.match(/\.[^.\]]+(?=[^\]]*$)/g) || []; 1424 let original = originalAttributeOverride || transformedAttributeMap[name] || name; 1425 return { 1426 type: typeMatch ? typeMatch[1] : null, 1427 value: valueMatch ? valueMatch[1] : null, 1428 modifiers: modifiers.map((i) => i.replace(".", "")), 1429 expression: value, 1430 original 1431 }; 1432 }; 1433 } 1434 var DEFAULT = "DEFAULT"; 1435 var directiveOrder = [ 1436 "ignore", 1437 "ref", 1438 "id", 1439 "data", 1440 "anchor", 1441 "bind", 1442 "init", 1443 "for", 1444 "model", 1445 "modelable", 1446 "transition", 1447 "show", 1448 "if", 1449 DEFAULT, 1450 "teleport" 1451 ]; 1452 function byPriority(a, b) { 1453 let typeA = directiveOrder.indexOf(a.type) === -1 ? DEFAULT : a.type; 1454 let typeB = directiveOrder.indexOf(b.type) === -1 ? DEFAULT : b.type; 1455 return directiveOrder.indexOf(typeA) - directiveOrder.indexOf(typeB); 1456 } 1457 function dispatch(el, name, detail = {}, options = {}) { 1458 return el.dispatchEvent( 1459 new CustomEvent(name, { 1460 detail, 1461 bubbles: true, 1462 // Allows events to pass the shadow DOM barrier. 1463 composed: true, 1464 cancelable: true, 1465 // Allows overriding the default event options. 1466 ...options 1467 }) 1468 ); 1469 } 1470 function walk(el, callback) { 1471 if (typeof ShadowRoot === "function" && el instanceof ShadowRoot) { 1472 Array.from(el.children).forEach((el2) => walk(el2, callback)); 1473 return; 1474 } 1475 let skip = false; 1476 callback(el, () => skip = true); 1477 if (skip) 1478 return; 1479 let node = el.firstElementChild; 1480 while (node) { 1481 walk(node, callback, false); 1482 node = node.nextElementSibling; 1483 } 1484 } 1485 function warn(message, ...args) { 1486 console.warn(`Alpine Warning: ${message}`, ...args); 1487 } 1488 var started = false; 1489 function start() { 1490 if (started) 1491 warn("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."); 1492 started = true; 1493 if (!document.body) 1494 warn("Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?"); 1495 dispatch(document, "alpine:init"); 1496 dispatch(document, "alpine:initializing"); 1497 startObservingMutations(); 1498 onElAdded((el) => initTree(el, walk)); 1499 onElRemoved((el) => destroyTree(el)); 1500 onAttributesAdded((el, attrs) => { 1501 directives(el, attrs).forEach((handle) => handle()); 1502 }); 1503 let outNestedComponents = (el) => !closestRoot(el.parentElement, true); 1504 Array.from(document.querySelectorAll(allSelectors().join(","))).filter(outNestedComponents).forEach((el) => { 1505 initTree(el); 1506 }); 1507 dispatch(document, "alpine:initialized"); 1508 setTimeout(() => { 1509 warnAboutMissingPlugins(); 1510 }); 1511 } 1512 var rootSelectorCallbacks = []; 1513 var initSelectorCallbacks = []; 1514 function rootSelectors() { 1515 return rootSelectorCallbacks.map((fn) => fn()); 1516 } 1517 function allSelectors() { 1518 return rootSelectorCallbacks.concat(initSelectorCallbacks).map((fn) => fn()); 1519 } 1520 function addRootSelector(selectorCallback) { 1521 rootSelectorCallbacks.push(selectorCallback); 1522 } 1523 function addInitSelector(selectorCallback) { 1524 initSelectorCallbacks.push(selectorCallback); 1525 } 1526 function closestRoot(el, includeInitSelectors = false) { 1527 return findClosest(el, (element) => { 1528 const selectors = includeInitSelectors ? allSelectors() : rootSelectors(); 1529 if (selectors.some((selector) => element.matches(selector))) 1530 return true; 1531 }); 1532 } 1533 function findClosest(el, callback) { 1534 if (!el) 1535 return; 1536 if (callback(el)) 1537 return el; 1538 if (el._x_teleportBack) 1539 return findClosest(el._x_teleportBack, callback); 1540 if (el.parentNode instanceof ShadowRoot) { 1541 return findClosest(el.parentNode.host, callback); 1542 } 1543 if (!el.parentElement) 1544 return; 1545 return findClosest(el.parentElement, callback); 1546 } 1547 function isRoot(el) { 1548 return rootSelectors().some((selector) => el.matches(selector)); 1549 } 1550 var initInterceptors2 = []; 1551 function interceptInit(callback) { 1552 initInterceptors2.push(callback); 1553 } 1554 var markerDispenser = 1; 1555 function initTree(el, walker = walk, intercept = () => { 1556 }) { 1557 if (findClosest(el, (i) => i._x_ignore)) 1558 return; 1559 deferHandlingDirectives(() => { 1560 walker(el, (el2, skip) => { 1561 if (el2._x_marker) 1562 return; 1563 intercept(el2, skip); 1564 initInterceptors2.forEach((i) => i(el2, skip)); 1565 directives(el2, el2.attributes).forEach((handle) => handle()); 1566 if (!el2._x_ignore) 1567 el2._x_marker = markerDispenser++; 1568 el2._x_ignore && skip(); 1569 }); 1570 }); 1571 } 1572 function destroyTree(root, walker = walk) { 1573 walker(root, (el) => { 1574 cleanupElement(el); 1575 cleanupAttributes(el); 1576 delete el._x_marker; 1577 }); 1578 } 1579 function warnAboutMissingPlugins() { 1580 let pluginDirectives = [ 1581 ["ui", "dialog", ["[x-dialog], [x-popover]"]], 1582 ["anchor", "anchor", ["[x-anchor]"]], 1583 ["sort", "sort", ["[x-sort]"]] 1584 ]; 1585 pluginDirectives.forEach(([plugin2, directive2, selectors]) => { 1586 if (directiveExists(directive2)) 1587 return; 1588 selectors.some((selector) => { 1589 if (document.querySelector(selector)) { 1590 warn(`found "${selector}", but missing ${plugin2} plugin`); 1591 return true; 1592 } 1593 }); 1594 }); 1595 } 1596 var tickStack = []; 1597 var isHolding = false; 1598 function nextTick(callback = () => { 1599 }) { 1600 queueMicrotask(() => { 1601 isHolding || setTimeout(() => { 1602 releaseNextTicks(); 1603 }); 1604 }); 1605 return new Promise((res) => { 1606 tickStack.push(() => { 1607 callback(); 1608 res(); 1609 }); 1610 }); 1611 } 1612 function releaseNextTicks() { 1613 isHolding = false; 1614 while (tickStack.length) 1615 tickStack.shift()(); 1616 } 1617 function holdNextTicks() { 1618 isHolding = true; 1619 } 1620 function setClasses(el, value) { 1621 if (Array.isArray(value)) { 1622 return setClassesFromString(el, value.join(" ")); 1623 } else if (typeof value === "object" && value !== null) { 1624 return setClassesFromObject(el, value); 1625 } else if (typeof value === "function") { 1626 return setClasses(el, value()); 1627 } 1628 return setClassesFromString(el, value); 1629 } 1630 function splitClasses(classString) { 1631 return classString.split(/\s/).filter(Boolean); 1632 } 1633 function setClassesFromString(el, classString) { 1634 let missingClasses = (classString2) => splitClasses(classString2).filter((i) => !el.classList.contains(i)).filter(Boolean); 1635 let addClassesAndReturnUndo = (classes) => { 1636 el.classList.add(...classes); 1637 return () => { 1638 el.classList.remove(...classes); 1639 }; 1640 }; 1641 classString = classString === true ? classString = "" : classString || ""; 1642 return addClassesAndReturnUndo(missingClasses(classString)); 1643 } 1644 function setClassesFromObject(el, classObject) { 1645 let forAdd = Object.entries(classObject).flatMap(([classString, bool]) => bool ? splitClasses(classString) : false).filter(Boolean); 1646 let forRemove = Object.entries(classObject).flatMap(([classString, bool]) => !bool ? splitClasses(classString) : false).filter(Boolean); 1647 let added = []; 1648 let removed = []; 1649 forRemove.forEach((i) => { 1650 if (el.classList.contains(i)) { 1651 el.classList.remove(i); 1652 removed.push(i); 1653 } 1654 }); 1655 forAdd.forEach((i) => { 1656 if (!el.classList.contains(i)) { 1657 el.classList.add(i); 1658 added.push(i); 1659 } 1660 }); 1661 return () => { 1662 removed.forEach((i) => el.classList.add(i)); 1663 added.forEach((i) => el.classList.remove(i)); 1664 }; 1665 } 1666 function setStyles(el, value) { 1667 if (typeof value === "object" && value !== null) { 1668 return setStylesFromObject(el, value); 1669 } 1670 return setStylesFromString(el, value); 1671 } 1672 function setStylesFromObject(el, value) { 1673 let previousStyles = {}; 1674 Object.entries(value).forEach(([key, value2]) => { 1675 previousStyles[key] = el.style[key]; 1676 if (!key.startsWith("--")) { 1677 key = kebabCase(key); 1678 } 1679 el.style.setProperty(key, value2); 1680 }); 1681 setTimeout(() => { 1682 if (el.style.length === 0) { 1683 el.removeAttribute("style"); 1684 } 1685 }); 1686 return () => { 1687 setStyles(el, previousStyles); 1688 }; 1689 } 1690 function setStylesFromString(el, value) { 1691 let cache = el.getAttribute("style", value); 1692 el.setAttribute("style", value); 1693 return () => { 1694 el.setAttribute("style", cache || ""); 1695 }; 1696 } 1697 function kebabCase(subject) { 1698 return subject.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); 1699 } 1700 function once(callback, fallback = () => { 1701 }) { 1702 let called = false; 1703 return function() { 1704 if (!called) { 1705 called = true; 1706 callback.apply(this, arguments); 1707 } else { 1708 fallback.apply(this, arguments); 1709 } 1710 }; 1711 } 1712 directive("transition", (el, { value, modifiers, expression }, { evaluate: evaluate2 }) => { 1713 if (typeof expression === "function") 1714 expression = evaluate2(expression); 1715 if (expression === false) 1716 return; 1717 if (!expression || typeof expression === "boolean") { 1718 registerTransitionsFromHelper(el, modifiers, value); 1719 } else { 1720 registerTransitionsFromClassString(el, expression, value); 1721 } 1722 }); 1723 function registerTransitionsFromClassString(el, classString, stage) { 1724 registerTransitionObject(el, setClasses, ""); 1725 let directiveStorageMap = { 1726 "enter": (classes) => { 1727 el._x_transition.enter.during = classes; 1728 }, 1729 "enter-start": (classes) => { 1730 el._x_transition.enter.start = classes; 1731 }, 1732 "enter-end": (classes) => { 1733 el._x_transition.enter.end = classes; 1734 }, 1735 "leave": (classes) => { 1736 el._x_transition.leave.during = classes; 1737 }, 1738 "leave-start": (classes) => { 1739 el._x_transition.leave.start = classes; 1740 }, 1741 "leave-end": (classes) => { 1742 el._x_transition.leave.end = classes; 1743 } 1744 }; 1745 directiveStorageMap[stage](classString); 1746 } 1747 function registerTransitionsFromHelper(el, modifiers, stage) { 1748 registerTransitionObject(el, setStyles); 1749 let doesntSpecify = !modifiers.includes("in") && !modifiers.includes("out") && !stage; 1750 let transitioningIn = doesntSpecify || modifiers.includes("in") || ["enter"].includes(stage); 1751 let transitioningOut = doesntSpecify || modifiers.includes("out") || ["leave"].includes(stage); 1752 if (modifiers.includes("in") && !doesntSpecify) { 1753 modifiers = modifiers.filter((i, index2) => index2 < modifiers.indexOf("out")); 1754 } 1755 if (modifiers.includes("out") && !doesntSpecify) { 1756 modifiers = modifiers.filter((i, index2) => index2 > modifiers.indexOf("out")); 1757 } 1758 let wantsAll = !modifiers.includes("opacity") && !modifiers.includes("scale"); 1759 let wantsOpacity = wantsAll || modifiers.includes("opacity"); 1760 let wantsScale = wantsAll || modifiers.includes("scale"); 1761 let opacityValue = wantsOpacity ? 0 : 1; 1762 let scaleValue = wantsScale ? modifierValue(modifiers, "scale", 95) / 100 : 1; 1763 let delay = modifierValue(modifiers, "delay", 0) / 1e3; 1764 let origin = modifierValue(modifiers, "origin", "center"); 1765 let property = "opacity, transform"; 1766 let durationIn = modifierValue(modifiers, "duration", 150) / 1e3; 1767 let durationOut = modifierValue(modifiers, "duration", 75) / 1e3; 1768 let easing = `cubic-bezier(0.4, 0.0, 0.2, 1)`; 1769 if (transitioningIn) { 1770 el._x_transition.enter.during = { 1771 transformOrigin: origin, 1772 transitionDelay: `${delay}s`, 1773 transitionProperty: property, 1774 transitionDuration: `${durationIn}s`, 1775 transitionTimingFunction: easing 1776 }; 1777 el._x_transition.enter.start = { 1778 opacity: opacityValue, 1779 transform: `scale(${scaleValue})` 1780 }; 1781 el._x_transition.enter.end = { 1782 opacity: 1, 1783 transform: `scale(1)` 1784 }; 1785 } 1786 if (transitioningOut) { 1787 el._x_transition.leave.during = { 1788 transformOrigin: origin, 1789 transitionDelay: `${delay}s`, 1790 transitionProperty: property, 1791 transitionDuration: `${durationOut}s`, 1792 transitionTimingFunction: easing 1793 }; 1794 el._x_transition.leave.start = { 1795 opacity: 1, 1796 transform: `scale(1)` 1797 }; 1798 el._x_transition.leave.end = { 1799 opacity: opacityValue, 1800 transform: `scale(${scaleValue})` 1801 }; 1802 } 1803 } 1804 function registerTransitionObject(el, setFunction, defaultValue = {}) { 1805 if (!el._x_transition) 1806 el._x_transition = { 1807 enter: { during: defaultValue, start: defaultValue, end: defaultValue }, 1808 leave: { during: defaultValue, start: defaultValue, end: defaultValue }, 1809 in(before = () => { 1810 }, after = () => { 1811 }) { 1812 transition(el, setFunction, { 1813 during: this.enter.during, 1814 start: this.enter.start, 1815 end: this.enter.end 1816 }, before, after); 1817 }, 1818 out(before = () => { 1819 }, after = () => { 1820 }) { 1821 transition(el, setFunction, { 1822 during: this.leave.during, 1823 start: this.leave.start, 1824 end: this.leave.end 1825 }, before, after); 1826 } 1827 }; 1828 } 1829 window.Element.prototype._x_toggleAndCascadeWithTransitions = function(el, value, show, hide) { 1830 const nextTick2 = document.visibilityState === "visible" ? requestAnimationFrame : setTimeout; 1831 let clickAwayCompatibleShow = () => nextTick2(show); 1832 if (value) { 1833 if (el._x_transition && (el._x_transition.enter || el._x_transition.leave)) { 1834 el._x_transition.enter && (Object.entries(el._x_transition.enter.during).length || Object.entries(el._x_transition.enter.start).length || Object.entries(el._x_transition.enter.end).length) ? el._x_transition.in(show) : clickAwayCompatibleShow(); 1835 } else { 1836 el._x_transition ? el._x_transition.in(show) : clickAwayCompatibleShow(); 1837 } 1838 return; 1839 } 1840 el._x_hidePromise = el._x_transition ? new Promise((resolve, reject) => { 1841 el._x_transition.out(() => { 1842 }, () => resolve(hide)); 1843 el._x_transitioning && el._x_transitioning.beforeCancel(() => reject({ isFromCancelledTransition: true })); 1844 }) : Promise.resolve(hide); 1845 queueMicrotask(() => { 1846 let closest2 = closestHide(el); 1847 if (closest2) { 1848 if (!closest2._x_hideChildren) 1849 closest2._x_hideChildren = []; 1850 closest2._x_hideChildren.push(el); 1851 } else { 1852 nextTick2(() => { 1853 let hideAfterChildren = (el2) => { 1854 let carry = Promise.all([ 1855 el2._x_hidePromise, 1856 ...(el2._x_hideChildren || []).map(hideAfterChildren) 1857 ]).then(([i]) => i?.()); 1858 delete el2._x_hidePromise; 1859 delete el2._x_hideChildren; 1860 return carry; 1861 }; 1862 hideAfterChildren(el).catch((e) => { 1863 if (!e.isFromCancelledTransition) 1864 throw e; 1865 }); 1866 }); 1867 } 1868 }); 1869 }; 1870 function closestHide(el) { 1871 let parent = el.parentNode; 1872 if (!parent) 1873 return; 1874 return parent._x_hidePromise ? parent : closestHide(parent); 1875 } 1876 function transition(el, setFunction, { during, start: start2, end } = {}, before = () => { 1877 }, after = () => { 1878 }) { 1879 if (el._x_transitioning) 1880 el._x_transitioning.cancel(); 1881 if (Object.keys(during).length === 0 && Object.keys(start2).length === 0 && Object.keys(end).length === 0) { 1882 before(); 1883 after(); 1884 return; 1885 } 1886 let undoStart, undoDuring, undoEnd; 1887 performTransition(el, { 1888 start() { 1889 undoStart = setFunction(el, start2); 1890 }, 1891 during() { 1892 undoDuring = setFunction(el, during); 1893 }, 1894 before, 1895 end() { 1896 undoStart(); 1897 undoEnd = setFunction(el, end); 1898 }, 1899 after, 1900 cleanup() { 1901 undoDuring(); 1902 undoEnd(); 1903 } 1904 }); 1905 } 1906 function performTransition(el, stages) { 1907 let interrupted, reachedBefore, reachedEnd; 1908 let finish = once(() => { 1909 mutateDom(() => { 1910 interrupted = true; 1911 if (!reachedBefore) 1912 stages.before(); 1913 if (!reachedEnd) { 1914 stages.end(); 1915 releaseNextTicks(); 1916 } 1917 stages.after(); 1918 if (el.isConnected) 1919 stages.cleanup(); 1920 delete el._x_transitioning; 1921 }); 1922 }); 1923 el._x_transitioning = { 1924 beforeCancels: [], 1925 beforeCancel(callback) { 1926 this.beforeCancels.push(callback); 1927 }, 1928 cancel: once(function() { 1929 while (this.beforeCancels.length) { 1930 this.beforeCancels.shift()(); 1931 } 1932 ; 1933 finish(); 1934 }), 1935 finish 1936 }; 1937 mutateDom(() => { 1938 stages.start(); 1939 stages.during(); 1940 }); 1941 holdNextTicks(); 1942 requestAnimationFrame(() => { 1943 if (interrupted) 1944 return; 1945 let duration = Number(getComputedStyle(el).transitionDuration.replace(/,.*/, "").replace("s", "")) * 1e3; 1946 let delay = Number(getComputedStyle(el).transitionDelay.replace(/,.*/, "").replace("s", "")) * 1e3; 1947 if (duration === 0) 1948 duration = Number(getComputedStyle(el).animationDuration.replace("s", "")) * 1e3; 1949 mutateDom(() => { 1950 stages.before(); 1951 }); 1952 reachedBefore = true; 1953 requestAnimationFrame(() => { 1954 if (interrupted) 1955 return; 1956 mutateDom(() => { 1957 stages.end(); 1958 }); 1959 releaseNextTicks(); 1960 setTimeout(el._x_transitioning.finish, duration + delay); 1961 reachedEnd = true; 1962 }); 1963 }); 1964 } 1965 function modifierValue(modifiers, key, fallback) { 1966 if (modifiers.indexOf(key) === -1) 1967 return fallback; 1968 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 1969 if (!rawValue) 1970 return fallback; 1971 if (key === "scale") { 1972 if (isNaN(rawValue)) 1973 return fallback; 1974 } 1975 if (key === "duration" || key === "delay") { 1976 let match = rawValue.match(/([0-9]+)ms/); 1977 if (match) 1978 return match[1]; 1979 } 1980 if (key === "origin") { 1981 if (["top", "right", "left", "center", "bottom"].includes(modifiers[modifiers.indexOf(key) + 2])) { 1982 return [rawValue, modifiers[modifiers.indexOf(key) + 2]].join(" "); 1983 } 1984 } 1985 return rawValue; 1986 } 1987 var isCloning = false; 1988 function skipDuringClone(callback, fallback = () => { 1989 }) { 1990 return (...args) => isCloning ? fallback(...args) : callback(...args); 1991 } 1992 function onlyDuringClone(callback) { 1993 return (...args) => isCloning && callback(...args); 1994 } 1995 var interceptors = []; 1996 function interceptClone(callback) { 1997 interceptors.push(callback); 1998 } 1999 function cloneNode(from, to) { 2000 interceptors.forEach((i) => i(from, to)); 2001 isCloning = true; 2002 dontRegisterReactiveSideEffects(() => { 2003 initTree(to, (el, callback) => { 2004 callback(el, () => { 2005 }); 2006 }); 2007 }); 2008 isCloning = false; 2009 } 2010 var isCloningLegacy = false; 2011 function clone(oldEl, newEl) { 2012 if (!newEl._x_dataStack) 2013 newEl._x_dataStack = oldEl._x_dataStack; 2014 isCloning = true; 2015 isCloningLegacy = true; 2016 dontRegisterReactiveSideEffects(() => { 2017 cloneTree(newEl); 2018 }); 2019 isCloning = false; 2020 isCloningLegacy = false; 2021 } 2022 function cloneTree(el) { 2023 let hasRunThroughFirstEl = false; 2024 let shallowWalker = (el2, callback) => { 2025 walk(el2, (el3, skip) => { 2026 if (hasRunThroughFirstEl && isRoot(el3)) 2027 return skip(); 2028 hasRunThroughFirstEl = true; 2029 callback(el3, skip); 2030 }); 2031 }; 2032 initTree(el, shallowWalker); 2033 } 2034 function dontRegisterReactiveSideEffects(callback) { 2035 let cache = effect; 2036 overrideEffect((callback2, el) => { 2037 let storedEffect = cache(callback2); 2038 release(storedEffect); 2039 return () => { 2040 }; 2041 }); 2042 callback(); 2043 overrideEffect(cache); 2044 } 2045 function bind(el, name, value, modifiers = []) { 2046 if (!el._x_bindings) 2047 el._x_bindings = reactive({}); 2048 el._x_bindings[name] = value; 2049 name = modifiers.includes("camel") ? camelCase(name) : name; 2050 switch (name) { 2051 case "value": 2052 bindInputValue(el, value); 2053 break; 2054 case "style": 2055 bindStyles(el, value); 2056 break; 2057 case "class": 2058 bindClasses(el, value); 2059 break; 2060 case "selected": 2061 case "checked": 2062 bindAttributeAndProperty(el, name, value); 2063 break; 2064 default: 2065 bindAttribute(el, name, value); 2066 break; 2067 } 2068 } 2069 function bindInputValue(el, value) { 2070 if (isRadio(el)) { 2071 if (el.attributes.value === void 0) { 2072 el.value = value; 2073 } 2074 } else if (isCheckbox(el)) { 2075 if (Number.isInteger(value)) { 2076 el.value = value; 2077 } else if (!Array.isArray(value) && typeof value !== "boolean" && ![null, void 0].includes(value)) { 2078 el.value = String(value); 2079 } else { 2080 if (Array.isArray(value)) { 2081 el.checked = value.some((val) => checkedAttrLooseCompare(val, el.value)); 2082 } else { 2083 el.checked = !!value; 2084 } 2085 } 2086 } else if (el.tagName === "SELECT") { 2087 updateSelect(el, value); 2088 } else { 2089 if (el.value === value) 2090 return; 2091 el.value = value === void 0 ? "" : value; 2092 } 2093 } 2094 function bindClasses(el, value) { 2095 if (el._x_undoAddedClasses) 2096 el._x_undoAddedClasses(); 2097 el._x_undoAddedClasses = setClasses(el, value); 2098 } 2099 function bindStyles(el, value) { 2100 if (el._x_undoAddedStyles) 2101 el._x_undoAddedStyles(); 2102 el._x_undoAddedStyles = setStyles(el, value); 2103 } 2104 function bindAttributeAndProperty(el, name, value) { 2105 bindAttribute(el, name, value); 2106 setPropertyIfChanged(el, name, value); 2107 } 2108 function bindAttribute(el, name, value) { 2109 if ([null, void 0, false].includes(value) && attributeShouldntBePreservedIfFalsy(name)) { 2110 el.removeAttribute(name); 2111 } else { 2112 if (isBooleanAttr(name)) 2113 value = name; 2114 setIfChanged(el, name, value); 2115 } 2116 } 2117 function setIfChanged(el, attrName, value) { 2118 if (el.getAttribute(attrName) != value) { 2119 el.setAttribute(attrName, value); 2120 } 2121 } 2122 function setPropertyIfChanged(el, propName, value) { 2123 if (el[propName] !== value) { 2124 el[propName] = value; 2125 } 2126 } 2127 function updateSelect(el, value) { 2128 const arrayWrappedValue = [].concat(value).map((value2) => { 2129 return value2 + ""; 2130 }); 2131 Array.from(el.options).forEach((option2) => { 2132 option2.selected = arrayWrappedValue.includes(option2.value); 2133 }); 2134 } 2135 function camelCase(subject) { 2136 return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase()); 2137 } 2138 function checkedAttrLooseCompare(valueA, valueB) { 2139 return valueA == valueB; 2140 } 2141 function safeParseBoolean(rawValue) { 2142 if ([1, "1", "true", "on", "yes", true].includes(rawValue)) { 2143 return true; 2144 } 2145 if ([0, "0", "false", "off", "no", false].includes(rawValue)) { 2146 return false; 2147 } 2148 return rawValue ? Boolean(rawValue) : null; 2149 } 2150 var booleanAttributes = /* @__PURE__ */ new Set([ 2151 "allowfullscreen", 2152 "async", 2153 "autofocus", 2154 "autoplay", 2155 "checked", 2156 "controls", 2157 "default", 2158 "defer", 2159 "disabled", 2160 "formnovalidate", 2161 "inert", 2162 "ismap", 2163 "itemscope", 2164 "loop", 2165 "multiple", 2166 "muted", 2167 "nomodule", 2168 "novalidate", 2169 "open", 2170 "playsinline", 2171 "readonly", 2172 "required", 2173 "reversed", 2174 "selected", 2175 "shadowrootclonable", 2176 "shadowrootdelegatesfocus", 2177 "shadowrootserializable" 2178 ]); 2179 function isBooleanAttr(attrName) { 2180 return booleanAttributes.has(attrName); 2181 } 2182 function attributeShouldntBePreservedIfFalsy(name) { 2183 return !["aria-pressed", "aria-checked", "aria-expanded", "aria-selected"].includes(name); 2184 } 2185 function getBinding(el, name, fallback) { 2186 if (el._x_bindings && el._x_bindings[name] !== void 0) 2187 return el._x_bindings[name]; 2188 return getAttributeBinding(el, name, fallback); 2189 } 2190 function extractProp(el, name, fallback, extract = true) { 2191 if (el._x_bindings && el._x_bindings[name] !== void 0) 2192 return el._x_bindings[name]; 2193 if (el._x_inlineBindings && el._x_inlineBindings[name] !== void 0) { 2194 let binding = el._x_inlineBindings[name]; 2195 binding.extract = extract; 2196 return dontAutoEvaluateFunctions(() => { 2197 return evaluate(el, binding.expression); 2198 }); 2199 } 2200 return getAttributeBinding(el, name, fallback); 2201 } 2202 function getAttributeBinding(el, name, fallback) { 2203 let attr = el.getAttribute(name); 2204 if (attr === null) 2205 return typeof fallback === "function" ? fallback() : fallback; 2206 if (attr === "") 2207 return true; 2208 if (isBooleanAttr(name)) { 2209 return !![name, "true"].includes(attr); 2210 } 2211 return attr; 2212 } 2213 function isCheckbox(el) { 2214 return el.type === "checkbox" || el.localName === "ui-checkbox" || el.localName === "ui-switch"; 2215 } 2216 function isRadio(el) { 2217 return el.type === "radio" || el.localName === "ui-radio"; 2218 } 2219 function debounce(func, wait) { 2220 let timeout; 2221 return function() { 2222 const context = this, args = arguments; 2223 const later = function() { 2224 timeout = null; 2225 func.apply(context, args); 2226 }; 2227 clearTimeout(timeout); 2228 timeout = setTimeout(later, wait); 2229 }; 2230 } 2231 function throttle(func, limit) { 2232 let inThrottle; 2233 return function() { 2234 let context = this, args = arguments; 2235 if (!inThrottle) { 2236 func.apply(context, args); 2237 inThrottle = true; 2238 setTimeout(() => inThrottle = false, limit); 2239 } 2240 }; 2241 } 2242 function entangle({ get: outerGet, set: outerSet }, { get: innerGet, set: innerSet }) { 2243 let firstRun = true; 2244 let outerHash; 2245 let innerHash; 2246 let reference = effect(() => { 2247 let outer = outerGet(); 2248 let inner = innerGet(); 2249 if (firstRun) { 2250 innerSet(cloneIfObject(outer)); 2251 firstRun = false; 2252 } else { 2253 let outerHashLatest = JSON.stringify(outer); 2254 let innerHashLatest = JSON.stringify(inner); 2255 if (outerHashLatest !== outerHash) { 2256 innerSet(cloneIfObject(outer)); 2257 } else if (outerHashLatest !== innerHashLatest) { 2258 outerSet(cloneIfObject(inner)); 2259 } else { 2260 } 2261 } 2262 outerHash = JSON.stringify(outerGet()); 2263 innerHash = JSON.stringify(innerGet()); 2264 }); 2265 return () => { 2266 release(reference); 2267 }; 2268 } 2269 function cloneIfObject(value) { 2270 return typeof value === "object" ? JSON.parse(JSON.stringify(value)) : value; 2271 } 2272 function plugin(callback) { 2273 let callbacks = Array.isArray(callback) ? callback : [callback]; 2274 callbacks.forEach((i) => i(alpine_default)); 2275 } 2276 var stores = {}; 2277 var isReactive = false; 2278 function store(name, value) { 2279 if (!isReactive) { 2280 stores = reactive(stores); 2281 isReactive = true; 2282 } 2283 if (value === void 0) { 2284 return stores[name]; 2285 } 2286 stores[name] = value; 2287 initInterceptors(stores[name]); 2288 if (typeof value === "object" && value !== null && value.hasOwnProperty("init") && typeof value.init === "function") { 2289 stores[name].init(); 2290 } 2291 } 2292 function getStores() { 2293 return stores; 2294 } 2295 var binds = {}; 2296 function bind2(name, bindings) { 2297 let getBindings = typeof bindings !== "function" ? () => bindings : bindings; 2298 if (name instanceof Element) { 2299 return applyBindingsObject(name, getBindings()); 2300 } else { 2301 binds[name] = getBindings; 2302 } 2303 return () => { 2304 }; 2305 } 2306 function injectBindingProviders(obj) { 2307 Object.entries(binds).forEach(([name, callback]) => { 2308 Object.defineProperty(obj, name, { 2309 get() { 2310 return (...args) => { 2311 return callback(...args); 2312 }; 2313 } 2314 }); 2315 }); 2316 return obj; 2317 } 2318 function applyBindingsObject(el, obj, original) { 2319 let cleanupRunners = []; 2320 while (cleanupRunners.length) 2321 cleanupRunners.pop()(); 2322 let attributes = Object.entries(obj).map(([name, value]) => ({ name, value })); 2323 let staticAttributes = attributesOnly(attributes); 2324 attributes = attributes.map((attribute) => { 2325 if (staticAttributes.find((attr) => attr.name === attribute.name)) { 2326 return { 2327 name: `x-bind:${attribute.name}`, 2328 value: `"${attribute.value}"` 2329 }; 2330 } 2331 return attribute; 2332 }); 2333 directives(el, attributes, original).map((handle) => { 2334 cleanupRunners.push(handle.runCleanups); 2335 handle(); 2336 }); 2337 return () => { 2338 while (cleanupRunners.length) 2339 cleanupRunners.pop()(); 2340 }; 2341 } 2342 var datas = {}; 2343 function data(name, callback) { 2344 datas[name] = callback; 2345 } 2346 function injectDataProviders(obj, context) { 2347 Object.entries(datas).forEach(([name, callback]) => { 2348 Object.defineProperty(obj, name, { 2349 get() { 2350 return (...args) => { 2351 return callback.bind(context)(...args); 2352 }; 2353 }, 2354 enumerable: false 2355 }); 2356 }); 2357 return obj; 2358 } 2359 var Alpine = { 2360 get reactive() { 2361 return reactive; 2362 }, 2363 get release() { 2364 return release; 2365 }, 2366 get effect() { 2367 return effect; 2368 }, 2369 get raw() { 2370 return raw; 2371 }, 2372 get transaction() { 2373 return transaction; 2374 }, 2375 version: "3.15.12", 2376 flushAndStopDeferringMutations, 2377 dontAutoEvaluateFunctions, 2378 disableEffectScheduling, 2379 startObservingMutations, 2380 stopObservingMutations, 2381 setReactivityEngine, 2382 onAttributeRemoved, 2383 onAttributesAdded, 2384 closestDataStack, 2385 skipDuringClone, 2386 onlyDuringClone, 2387 addRootSelector, 2388 addInitSelector, 2389 setErrorHandler, 2390 interceptClone, 2391 addScopeToNode, 2392 deferMutations, 2393 mapAttributes, 2394 evaluateLater, 2395 interceptInit, 2396 initInterceptors, 2397 injectMagics, 2398 setEvaluator, 2399 setRawEvaluator, 2400 mergeProxies, 2401 extractProp, 2402 findClosest, 2403 onElRemoved, 2404 closestRoot, 2405 destroyTree, 2406 interceptor, 2407 // INTERNAL: not public API and is subject to change without major release. 2408 transition, 2409 // INTERNAL 2410 setStyles, 2411 // INTERNAL 2412 mutateDom, 2413 directive, 2414 entangle, 2415 throttle, 2416 debounce, 2417 evaluate, 2418 evaluateRaw, 2419 initTree, 2420 nextTick, 2421 prefixed: prefix, 2422 prefix: setPrefix, 2423 plugin, 2424 magic, 2425 store, 2426 start, 2427 clone, 2428 // INTERNAL 2429 cloneNode, 2430 // INTERNAL 2431 bound: getBinding, 2432 $data: scope, 2433 watch, 2434 walk, 2435 data, 2436 bind: bind2 2437 }; 2438 var alpine_default = Alpine; 2439 function makeMap(str, expectsLowerCase) { 2440 const map = /* @__PURE__ */ Object.create(null); 2441 const list = str.split(","); 2442 for (let i = 0; i < list.length; i++) { 2443 map[list[i]] = true; 2444 } 2445 return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val]; 2446 } 2447 var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; 2448 var isBooleanAttr2 = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`); 2449 var EMPTY_OBJ = true ? Object.freeze({}) : {}; 2450 var EMPTY_ARR = true ? Object.freeze([]) : []; 2451 var hasOwnProperty = Object.prototype.hasOwnProperty; 2452 var hasOwn = (val, key) => hasOwnProperty.call(val, key); 2453 var isArray = Array.isArray; 2454 var isMap = (val) => toTypeString(val) === "[object Map]"; 2455 var isString = (val) => typeof val === "string"; 2456 var isSymbol = (val) => typeof val === "symbol"; 2457 var isObject = (val) => val !== null && typeof val === "object"; 2458 var objectToString = Object.prototype.toString; 2459 var toTypeString = (value) => objectToString.call(value); 2460 var toRawType = (value) => { 2461 return toTypeString(value).slice(8, -1); 2462 }; 2463 var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; 2464 var cacheStringFunction = (fn) => { 2465 const cache = /* @__PURE__ */ Object.create(null); 2466 return (str) => { 2467 const hit = cache[str]; 2468 return hit || (cache[str] = fn(str)); 2469 }; 2470 }; 2471 var camelizeRE = /-(\w)/g; 2472 var camelize = cacheStringFunction((str) => { 2473 return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); 2474 }); 2475 var hyphenateRE = /\B([A-Z])/g; 2476 var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase()); 2477 var capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1)); 2478 var toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``); 2479 var hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue); 2480 var targetMap = /* @__PURE__ */ new WeakMap(); 2481 var effectStack = []; 2482 var activeEffect; 2483 var ITERATE_KEY = /* @__PURE__ */ Symbol(true ? "iterate" : ""); 2484 var MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(true ? "Map key iterate" : ""); 2485 function isEffect(fn) { 2486 return fn && fn._isEffect === true; 2487 } 2488 function effect2(fn, options = EMPTY_OBJ) { 2489 if (isEffect(fn)) { 2490 fn = fn.raw; 2491 } 2492 const effect3 = createReactiveEffect(fn, options); 2493 if (!options.lazy) { 2494 effect3(); 2495 } 2496 return effect3; 2497 } 2498 function stop(effect3) { 2499 if (effect3.active) { 2500 cleanup(effect3); 2501 if (effect3.options.onStop) { 2502 effect3.options.onStop(); 2503 } 2504 effect3.active = false; 2505 } 2506 } 2507 var uid = 0; 2508 function createReactiveEffect(fn, options) { 2509 const effect3 = function reactiveEffect() { 2510 if (!effect3.active) { 2511 return fn(); 2512 } 2513 if (!effectStack.includes(effect3)) { 2514 cleanup(effect3); 2515 try { 2516 enableTracking(); 2517 effectStack.push(effect3); 2518 activeEffect = effect3; 2519 return fn(); 2520 } finally { 2521 effectStack.pop(); 2522 resetTracking(); 2523 activeEffect = effectStack[effectStack.length - 1]; 2524 } 2525 } 2526 }; 2527 effect3.id = uid++; 2528 effect3.allowRecurse = !!options.allowRecurse; 2529 effect3._isEffect = true; 2530 effect3.active = true; 2531 effect3.raw = fn; 2532 effect3.deps = []; 2533 effect3.options = options; 2534 return effect3; 2535 } 2536 function cleanup(effect3) { 2537 const { deps } = effect3; 2538 if (deps.length) { 2539 for (let i = 0; i < deps.length; i++) { 2540 deps[i].delete(effect3); 2541 } 2542 deps.length = 0; 2543 } 2544 } 2545 var shouldTrack = true; 2546 var trackStack = []; 2547 function pauseTracking() { 2548 trackStack.push(shouldTrack); 2549 shouldTrack = false; 2550 } 2551 function enableTracking() { 2552 trackStack.push(shouldTrack); 2553 shouldTrack = true; 2554 } 2555 function resetTracking() { 2556 const last = trackStack.pop(); 2557 shouldTrack = last === void 0 ? true : last; 2558 } 2559 function track(target, type, key) { 2560 if (!shouldTrack || activeEffect === void 0) { 2561 return; 2562 } 2563 let depsMap = targetMap.get(target); 2564 if (!depsMap) { 2565 targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); 2566 } 2567 let dep = depsMap.get(key); 2568 if (!dep) { 2569 depsMap.set(key, dep = /* @__PURE__ */ new Set()); 2570 } 2571 if (!dep.has(activeEffect)) { 2572 dep.add(activeEffect); 2573 activeEffect.deps.push(dep); 2574 if (activeEffect.options.onTrack) { 2575 activeEffect.options.onTrack({ 2576 effect: activeEffect, 2577 target, 2578 type, 2579 key 2580 }); 2581 } 2582 } 2583 } 2584 function trigger(target, type, key, newValue, oldValue, oldTarget) { 2585 const depsMap = targetMap.get(target); 2586 if (!depsMap) { 2587 return; 2588 } 2589 const effects = /* @__PURE__ */ new Set(); 2590 const add2 = (effectsToAdd) => { 2591 if (effectsToAdd) { 2592 effectsToAdd.forEach((effect3) => { 2593 if (effect3 !== activeEffect || effect3.allowRecurse) { 2594 effects.add(effect3); 2595 } 2596 }); 2597 } 2598 }; 2599 if (type === "clear") { 2600 depsMap.forEach(add2); 2601 } else if (key === "length" && isArray(target)) { 2602 depsMap.forEach((dep, key2) => { 2603 if (key2 === "length" || key2 >= newValue) { 2604 add2(dep); 2605 } 2606 }); 2607 } else { 2608 if (key !== void 0) { 2609 add2(depsMap.get(key)); 2610 } 2611 switch (type) { 2612 case "add": 2613 if (!isArray(target)) { 2614 add2(depsMap.get(ITERATE_KEY)); 2615 if (isMap(target)) { 2616 add2(depsMap.get(MAP_KEY_ITERATE_KEY)); 2617 } 2618 } else if (isIntegerKey(key)) { 2619 add2(depsMap.get("length")); 2620 } 2621 break; 2622 case "delete": 2623 if (!isArray(target)) { 2624 add2(depsMap.get(ITERATE_KEY)); 2625 if (isMap(target)) { 2626 add2(depsMap.get(MAP_KEY_ITERATE_KEY)); 2627 } 2628 } 2629 break; 2630 case "set": 2631 if (isMap(target)) { 2632 add2(depsMap.get(ITERATE_KEY)); 2633 } 2634 break; 2635 } 2636 } 2637 const run = (effect3) => { 2638 if (effect3.options.onTrigger) { 2639 effect3.options.onTrigger({ 2640 effect: effect3, 2641 target, 2642 key, 2643 type, 2644 newValue, 2645 oldValue, 2646 oldTarget 2647 }); 2648 } 2649 if (effect3.options.scheduler) { 2650 effect3.options.scheduler(effect3); 2651 } else { 2652 effect3(); 2653 } 2654 }; 2655 effects.forEach(run); 2656 } 2657 var isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`); 2658 var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map((key) => Symbol[key]).filter(isSymbol)); 2659 var get2 = /* @__PURE__ */ createGetter(); 2660 var readonlyGet = /* @__PURE__ */ createGetter(true); 2661 var arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations(); 2662 function createArrayInstrumentations() { 2663 const instrumentations = {}; 2664 ["includes", "indexOf", "lastIndexOf"].forEach((key) => { 2665 instrumentations[key] = function(...args) { 2666 const arr = toRaw(this); 2667 for (let i = 0, l = this.length; i < l; i++) { 2668 track(arr, "get", i + ""); 2669 } 2670 const res = arr[key](...args); 2671 if (res === -1 || res === false) { 2672 return arr[key](...args.map(toRaw)); 2673 } else { 2674 return res; 2675 } 2676 }; 2677 }); 2678 ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { 2679 instrumentations[key] = function(...args) { 2680 pauseTracking(); 2681 const res = toRaw(this)[key].apply(this, args); 2682 resetTracking(); 2683 return res; 2684 }; 2685 }); 2686 return instrumentations; 2687 } 2688 function createGetter(isReadonly = false, shallow = false) { 2689 return function get3(target, key, receiver) { 2690 if (key === "__v_isReactive") { 2691 return !isReadonly; 2692 } else if (key === "__v_isReadonly") { 2693 return isReadonly; 2694 } else if (key === "__v_raw" && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) { 2695 return target; 2696 } 2697 const targetIsArray = isArray(target); 2698 if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) { 2699 return Reflect.get(arrayInstrumentations, key, receiver); 2700 } 2701 const res = Reflect.get(target, key, receiver); 2702 if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { 2703 return res; 2704 } 2705 if (!isReadonly) { 2706 track(target, "get", key); 2707 } 2708 if (shallow) { 2709 return res; 2710 } 2711 if (isRef(res)) { 2712 const shouldUnwrap = !targetIsArray || !isIntegerKey(key); 2713 return shouldUnwrap ? res.value : res; 2714 } 2715 if (isObject(res)) { 2716 return isReadonly ? readonly(res) : reactive2(res); 2717 } 2718 return res; 2719 }; 2720 } 2721 var set2 = /* @__PURE__ */ createSetter(); 2722 function createSetter(shallow = false) { 2723 return function set3(target, key, value, receiver) { 2724 let oldValue = target[key]; 2725 if (!shallow) { 2726 value = toRaw(value); 2727 oldValue = toRaw(oldValue); 2728 if (!isArray(target) && isRef(oldValue) && !isRef(value)) { 2729 oldValue.value = value; 2730 return true; 2731 } 2732 } 2733 const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); 2734 const result = Reflect.set(target, key, value, receiver); 2735 if (target === toRaw(receiver)) { 2736 if (!hadKey) { 2737 trigger(target, "add", key, value); 2738 } else if (hasChanged(value, oldValue)) { 2739 trigger(target, "set", key, value, oldValue); 2740 } 2741 } 2742 return result; 2743 }; 2744 } 2745 function deleteProperty(target, key) { 2746 const hadKey = hasOwn(target, key); 2747 const oldValue = target[key]; 2748 const result = Reflect.deleteProperty(target, key); 2749 if (result && hadKey) { 2750 trigger(target, "delete", key, void 0, oldValue); 2751 } 2752 return result; 2753 } 2754 function has(target, key) { 2755 const result = Reflect.has(target, key); 2756 if (!isSymbol(key) || !builtInSymbols.has(key)) { 2757 track(target, "has", key); 2758 } 2759 return result; 2760 } 2761 function ownKeys(target) { 2762 track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY); 2763 return Reflect.ownKeys(target); 2764 } 2765 var mutableHandlers = { 2766 get: get2, 2767 set: set2, 2768 deleteProperty, 2769 has, 2770 ownKeys 2771 }; 2772 var readonlyHandlers = { 2773 get: readonlyGet, 2774 set(target, key) { 2775 if (true) { 2776 console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target); 2777 } 2778 return true; 2779 }, 2780 deleteProperty(target, key) { 2781 if (true) { 2782 console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target); 2783 } 2784 return true; 2785 } 2786 }; 2787 var toReactive = (value) => isObject(value) ? reactive2(value) : value; 2788 var toReadonly = (value) => isObject(value) ? readonly(value) : value; 2789 var toShallow = (value) => value; 2790 var getProto = (v) => Reflect.getPrototypeOf(v); 2791 function get$1(target, key, isReadonly = false, isShallow = false) { 2792 target = target[ 2793 "__v_raw" 2794 /* RAW */ 2795 ]; 2796 const rawTarget = toRaw(target); 2797 const rawKey = toRaw(key); 2798 if (key !== rawKey) { 2799 !isReadonly && track(rawTarget, "get", key); 2800 } 2801 !isReadonly && track(rawTarget, "get", rawKey); 2802 const { has: has2 } = getProto(rawTarget); 2803 const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; 2804 if (has2.call(rawTarget, key)) { 2805 return wrap(target.get(key)); 2806 } else if (has2.call(rawTarget, rawKey)) { 2807 return wrap(target.get(rawKey)); 2808 } else if (target !== rawTarget) { 2809 target.get(key); 2810 } 2811 } 2812 function has$1(key, isReadonly = false) { 2813 const target = this[ 2814 "__v_raw" 2815 /* RAW */ 2816 ]; 2817 const rawTarget = toRaw(target); 2818 const rawKey = toRaw(key); 2819 if (key !== rawKey) { 2820 !isReadonly && track(rawTarget, "has", key); 2821 } 2822 !isReadonly && track(rawTarget, "has", rawKey); 2823 return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); 2824 } 2825 function size(target, isReadonly = false) { 2826 target = target[ 2827 "__v_raw" 2828 /* RAW */ 2829 ]; 2830 !isReadonly && track(toRaw(target), "iterate", ITERATE_KEY); 2831 return Reflect.get(target, "size", target); 2832 } 2833 function add(value) { 2834 value = toRaw(value); 2835 const target = toRaw(this); 2836 const proto = getProto(target); 2837 const hadKey = proto.has.call(target, value); 2838 if (!hadKey) { 2839 target.add(value); 2840 trigger(target, "add", value, value); 2841 } 2842 return this; 2843 } 2844 function set$1(key, value) { 2845 value = toRaw(value); 2846 const target = toRaw(this); 2847 const { has: has2, get: get3 } = getProto(target); 2848 let hadKey = has2.call(target, key); 2849 if (!hadKey) { 2850 key = toRaw(key); 2851 hadKey = has2.call(target, key); 2852 } else if (true) { 2853 checkIdentityKeys(target, has2, key); 2854 } 2855 const oldValue = get3.call(target, key); 2856 target.set(key, value); 2857 if (!hadKey) { 2858 trigger(target, "add", key, value); 2859 } else if (hasChanged(value, oldValue)) { 2860 trigger(target, "set", key, value, oldValue); 2861 } 2862 return this; 2863 } 2864 function deleteEntry(key) { 2865 const target = toRaw(this); 2866 const { has: has2, get: get3 } = getProto(target); 2867 let hadKey = has2.call(target, key); 2868 if (!hadKey) { 2869 key = toRaw(key); 2870 hadKey = has2.call(target, key); 2871 } else if (true) { 2872 checkIdentityKeys(target, has2, key); 2873 } 2874 const oldValue = get3 ? get3.call(target, key) : void 0; 2875 const result = target.delete(key); 2876 if (hadKey) { 2877 trigger(target, "delete", key, void 0, oldValue); 2878 } 2879 return result; 2880 } 2881 function clear() { 2882 const target = toRaw(this); 2883 const hadItems = target.size !== 0; 2884 const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0; 2885 const result = target.clear(); 2886 if (hadItems) { 2887 trigger(target, "clear", void 0, void 0, oldTarget); 2888 } 2889 return result; 2890 } 2891 function createForEach(isReadonly, isShallow) { 2892 return function forEach(callback, thisArg) { 2893 const observed = this; 2894 const target = observed[ 2895 "__v_raw" 2896 /* RAW */ 2897 ]; 2898 const rawTarget = toRaw(target); 2899 const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; 2900 !isReadonly && track(rawTarget, "iterate", ITERATE_KEY); 2901 return target.forEach((value, key) => { 2902 return callback.call(thisArg, wrap(value), wrap(key), observed); 2903 }); 2904 }; 2905 } 2906 function createIterableMethod(method, isReadonly, isShallow) { 2907 return function(...args) { 2908 const target = this[ 2909 "__v_raw" 2910 /* RAW */ 2911 ]; 2912 const rawTarget = toRaw(target); 2913 const targetIsMap = isMap(rawTarget); 2914 const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; 2915 const isKeyOnly = method === "keys" && targetIsMap; 2916 const innerIterator = target[method](...args); 2917 const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; 2918 !isReadonly && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); 2919 return { 2920 // iterator protocol 2921 next() { 2922 const { value, done } = innerIterator.next(); 2923 return done ? { value, done } : { 2924 value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), 2925 done 2926 }; 2927 }, 2928 // iterable protocol 2929 [Symbol.iterator]() { 2930 return this; 2931 } 2932 }; 2933 }; 2934 } 2935 function createReadonlyMethod(type) { 2936 return function(...args) { 2937 if (true) { 2938 const key = args[0] ? `on key "${args[0]}" ` : ``; 2939 console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this)); 2940 } 2941 return type === "delete" ? false : this; 2942 }; 2943 } 2944 function createInstrumentations() { 2945 const mutableInstrumentations2 = { 2946 get(key) { 2947 return get$1(this, key); 2948 }, 2949 get size() { 2950 return size(this); 2951 }, 2952 has: has$1, 2953 add, 2954 set: set$1, 2955 delete: deleteEntry, 2956 clear, 2957 forEach: createForEach(false, false) 2958 }; 2959 const shallowInstrumentations2 = { 2960 get(key) { 2961 return get$1(this, key, false, true); 2962 }, 2963 get size() { 2964 return size(this); 2965 }, 2966 has: has$1, 2967 add, 2968 set: set$1, 2969 delete: deleteEntry, 2970 clear, 2971 forEach: createForEach(false, true) 2972 }; 2973 const readonlyInstrumentations2 = { 2974 get(key) { 2975 return get$1(this, key, true); 2976 }, 2977 get size() { 2978 return size(this, true); 2979 }, 2980 has(key) { 2981 return has$1.call(this, key, true); 2982 }, 2983 add: createReadonlyMethod( 2984 "add" 2985 /* ADD */ 2986 ), 2987 set: createReadonlyMethod( 2988 "set" 2989 /* SET */ 2990 ), 2991 delete: createReadonlyMethod( 2992 "delete" 2993 /* DELETE */ 2994 ), 2995 clear: createReadonlyMethod( 2996 "clear" 2997 /* CLEAR */ 2998 ), 2999 forEach: createForEach(true, false) 3000 }; 3001 const shallowReadonlyInstrumentations2 = { 3002 get(key) { 3003 return get$1(this, key, true, true); 3004 }, 3005 get size() { 3006 return size(this, true); 3007 }, 3008 has(key) { 3009 return has$1.call(this, key, true); 3010 }, 3011 add: createReadonlyMethod( 3012 "add" 3013 /* ADD */ 3014 ), 3015 set: createReadonlyMethod( 3016 "set" 3017 /* SET */ 3018 ), 3019 delete: createReadonlyMethod( 3020 "delete" 3021 /* DELETE */ 3022 ), 3023 clear: createReadonlyMethod( 3024 "clear" 3025 /* CLEAR */ 3026 ), 3027 forEach: createForEach(true, true) 3028 }; 3029 const iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; 3030 iteratorMethods.forEach((method) => { 3031 mutableInstrumentations2[method] = createIterableMethod(method, false, false); 3032 readonlyInstrumentations2[method] = createIterableMethod(method, true, false); 3033 shallowInstrumentations2[method] = createIterableMethod(method, false, true); 3034 shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true); 3035 }); 3036 return [ 3037 mutableInstrumentations2, 3038 readonlyInstrumentations2, 3039 shallowInstrumentations2, 3040 shallowReadonlyInstrumentations2 3041 ]; 3042 } 3043 var [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* @__PURE__ */ createInstrumentations(); 3044 function createInstrumentationGetter(isReadonly, shallow) { 3045 const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations; 3046 return (target, key, receiver) => { 3047 if (key === "__v_isReactive") { 3048 return !isReadonly; 3049 } else if (key === "__v_isReadonly") { 3050 return isReadonly; 3051 } else if (key === "__v_raw") { 3052 return target; 3053 } 3054 return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver); 3055 }; 3056 } 3057 var mutableCollectionHandlers = { 3058 get: /* @__PURE__ */ createInstrumentationGetter(false, false) 3059 }; 3060 var readonlyCollectionHandlers = { 3061 get: /* @__PURE__ */ createInstrumentationGetter(true, false) 3062 }; 3063 function checkIdentityKeys(target, has2, key) { 3064 const rawKey = toRaw(key); 3065 if (rawKey !== key && has2.call(target, rawKey)) { 3066 const type = toRawType(target); 3067 console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`); 3068 } 3069 } 3070 var reactiveMap = /* @__PURE__ */ new WeakMap(); 3071 var shallowReactiveMap = /* @__PURE__ */ new WeakMap(); 3072 var readonlyMap = /* @__PURE__ */ new WeakMap(); 3073 var shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); 3074 function targetTypeMap(rawType) { 3075 switch (rawType) { 3076 case "Object": 3077 case "Array": 3078 return 1; 3079 case "Map": 3080 case "Set": 3081 case "WeakMap": 3082 case "WeakSet": 3083 return 2; 3084 default: 3085 return 0; 3086 } 3087 } 3088 function getTargetType(value) { 3089 return value[ 3090 "__v_skip" 3091 /* SKIP */ 3092 ] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); 3093 } 3094 function reactive2(target) { 3095 if (target && target[ 3096 "__v_isReadonly" 3097 /* IS_READONLY */ 3098 ]) { 3099 return target; 3100 } 3101 return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap); 3102 } 3103 function readonly(target) { 3104 return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap); 3105 } 3106 function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) { 3107 if (!isObject(target)) { 3108 if (true) { 3109 console.warn(`value cannot be made reactive: ${String(target)}`); 3110 } 3111 return target; 3112 } 3113 if (target[ 3114 "__v_raw" 3115 /* RAW */ 3116 ] && !(isReadonly && target[ 3117 "__v_isReactive" 3118 /* IS_REACTIVE */ 3119 ])) { 3120 return target; 3121 } 3122 const existingProxy = proxyMap.get(target); 3123 if (existingProxy) { 3124 return existingProxy; 3125 } 3126 const targetType = getTargetType(target); 3127 if (targetType === 0) { 3128 return target; 3129 } 3130 const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers); 3131 proxyMap.set(target, proxy); 3132 return proxy; 3133 } 3134 function toRaw(observed) { 3135 return observed && toRaw(observed[ 3136 "__v_raw" 3137 /* RAW */ 3138 ]) || observed; 3139 } 3140 function isRef(r) { 3141 return Boolean(r && r.__v_isRef === true); 3142 } 3143 magic("nextTick", () => nextTick); 3144 magic("dispatch", (el) => dispatch.bind(dispatch, el)); 3145 magic("watch", (el, { evaluateLater: evaluateLater2, cleanup: cleanup2 }) => (key, callback) => { 3146 let evaluate2 = evaluateLater2(key); 3147 let getter = () => { 3148 let value; 3149 evaluate2((i) => value = i); 3150 return value; 3151 }; 3152 let unwatch = watch(getter, callback); 3153 cleanup2(unwatch); 3154 }); 3155 magic("store", getStores); 3156 magic("data", (el) => scope(el)); 3157 magic("root", (el) => closestRoot(el)); 3158 magic("refs", (el) => { 3159 if (el._x_refs_proxy) 3160 return el._x_refs_proxy; 3161 el._x_refs_proxy = mergeProxies(getArrayOfRefObject(el)); 3162 return el._x_refs_proxy; 3163 }); 3164 function getArrayOfRefObject(el) { 3165 let refObjects = []; 3166 findClosest(el, (i) => { 3167 if (i._x_refs) 3168 refObjects.push(i._x_refs); 3169 }); 3170 return refObjects; 3171 } 3172 var globalIdMemo = {}; 3173 function findAndIncrementId(name) { 3174 if (!globalIdMemo[name]) 3175 globalIdMemo[name] = 0; 3176 return ++globalIdMemo[name]; 3177 } 3178 function closestIdRoot(el, name) { 3179 return findClosest(el, (element) => { 3180 if (element._x_ids && element._x_ids[name]) 3181 return true; 3182 }); 3183 } 3184 function setIdRoot(el, name) { 3185 if (!el._x_ids) 3186 el._x_ids = {}; 3187 if (!el._x_ids[name]) 3188 el._x_ids[name] = findAndIncrementId(name); 3189 } 3190 magic("id", (el, { cleanup: cleanup2 }) => (name, key = null) => { 3191 let cacheKey = `${name}${key ? `-${key}` : ""}`; 3192 return cacheIdByNameOnElement(el, cacheKey, cleanup2, () => { 3193 let root = closestIdRoot(el, name); 3194 let id = root ? root._x_ids[name] : findAndIncrementId(name); 3195 return key ? `${name}-${id}-${key}` : `${name}-${id}`; 3196 }); 3197 }); 3198 interceptClone((from, to) => { 3199 if (from._x_id) { 3200 to._x_id = from._x_id; 3201 } 3202 }); 3203 function cacheIdByNameOnElement(el, cacheKey, cleanup2, callback) { 3204 if (!el._x_id) 3205 el._x_id = {}; 3206 if (el._x_id[cacheKey]) 3207 return el._x_id[cacheKey]; 3208 let output = callback(); 3209 el._x_id[cacheKey] = output; 3210 cleanup2(() => { 3211 delete el._x_id[cacheKey]; 3212 }); 3213 return output; 3214 } 3215 magic("el", (el) => el); 3216 warnMissingPluginMagic("Focus", "focus", "focus"); 3217 warnMissingPluginMagic("Persist", "persist", "persist"); 3218 function warnMissingPluginMagic(name, magicName, slug) { 3219 magic(magicName, (el) => warn(`You can't use [$${magicName}] without first installing the "${name}" plugin here: https://alpinejs.dev/plugins/${slug}`, el)); 3220 } 3221 directive("modelable", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2, cleanup: cleanup2 }) => { 3222 let func = evaluateLater2(expression); 3223 let innerGet = () => { 3224 let result; 3225 func((i) => result = i); 3226 return result; 3227 }; 3228 let evaluateInnerSet = evaluateLater2(`${expression} = __placeholder`); 3229 let innerSet = (val) => evaluateInnerSet(() => { 3230 }, { scope: { "__placeholder": val } }); 3231 let initialValue = innerGet(); 3232 innerSet(initialValue); 3233 queueMicrotask(() => { 3234 if (!el._x_model) 3235 return; 3236 el._x_removeModelListeners["default"](); 3237 let outerGet = el._x_model.get; 3238 let outerSet = el._x_model.setWithModifiers; 3239 let releaseEntanglement = entangle( 3240 { 3241 get() { 3242 return outerGet(); 3243 }, 3244 set(value) { 3245 outerSet(value); 3246 } 3247 }, 3248 { 3249 get() { 3250 return innerGet(); 3251 }, 3252 set(value) { 3253 innerSet(value); 3254 } 3255 } 3256 ); 3257 cleanup2(releaseEntanglement); 3258 }); 3259 }); 3260 directive("teleport", (el, { modifiers, expression }, { cleanup: cleanup2 }) => { 3261 if (el.tagName.toLowerCase() !== "template") 3262 warn("x-teleport can only be used on a <template> tag", el); 3263 let target = getTarget(expression); 3264 let clone22 = el.content.cloneNode(true).firstElementChild; 3265 el._x_teleport = clone22; 3266 clone22._x_teleportBack = el; 3267 el.setAttribute("data-teleport-template", true); 3268 clone22.setAttribute("data-teleport-target", true); 3269 if (el._x_forwardEvents) { 3270 el._x_forwardEvents.forEach((eventName) => { 3271 clone22.addEventListener(eventName, (e) => { 3272 e.stopPropagation(); 3273 el.dispatchEvent(new e.constructor(e.type, e)); 3274 }); 3275 }); 3276 } 3277 addScopeToNode(clone22, {}, el); 3278 let placeInDom = (clone3, target2, modifiers2) => { 3279 if (modifiers2.includes("prepend")) { 3280 target2.parentNode.insertBefore(clone3, target2); 3281 } else if (modifiers2.includes("append")) { 3282 target2.parentNode.insertBefore(clone3, target2.nextSibling); 3283 } else { 3284 target2.appendChild(clone3); 3285 } 3286 }; 3287 mutateDom(() => { 3288 skipDuringClone(() => { 3289 placeInDom(clone22, target, modifiers); 3290 initTree(clone22); 3291 })(); 3292 }); 3293 el._x_teleportPutBack = () => { 3294 let target2 = getTarget(expression); 3295 mutateDom(() => { 3296 placeInDom(el._x_teleport, target2, modifiers); 3297 }); 3298 }; 3299 cleanup2( 3300 () => mutateDom(() => { 3301 clone22.remove(); 3302 destroyTree(clone22); 3303 }) 3304 ); 3305 }); 3306 var teleportContainerDuringClone = document.createElement("div"); 3307 function getTarget(expression) { 3308 let target = skipDuringClone(() => { 3309 return document.querySelector(expression); 3310 }, () => { 3311 return teleportContainerDuringClone; 3312 })(); 3313 if (!target) 3314 warn(`Cannot find x-teleport element for selector: "${expression}"`); 3315 return target; 3316 } 3317 var handler = () => { 3318 }; 3319 handler.inline = (el, { modifiers }, { cleanup: cleanup2 }) => { 3320 modifiers.includes("self") ? el._x_ignoreSelf = true : el._x_ignore = true; 3321 cleanup2(() => { 3322 modifiers.includes("self") ? delete el._x_ignoreSelf : delete el._x_ignore; 3323 }); 3324 }; 3325 directive("ignore", handler); 3326 directive("effect", skipDuringClone((el, { expression }, { effect: effect3 }) => { 3327 effect3(evaluateLater(el, expression)); 3328 })); 3329 function on(el, event, modifiers, callback) { 3330 let listenerTarget = el; 3331 let handler4 = (e) => callback(e); 3332 let options = {}; 3333 let wrapHandler = (callback2, wrapper) => (e) => wrapper(callback2, e); 3334 if (modifiers.includes("dot")) 3335 event = dotSyntax(event); 3336 if (modifiers.includes("camel")) 3337 event = camelCase2(event); 3338 if (modifiers.includes("capture")) 3339 options.capture = true; 3340 if (modifiers.includes("window")) 3341 listenerTarget = window; 3342 if (modifiers.includes("document")) 3343 listenerTarget = document; 3344 if (modifiers.includes("passive")) { 3345 options.passive = modifiers[modifiers.indexOf("passive") + 1] !== "false"; 3346 } 3347 handler4 = addDebounceOrThrottle(modifiers, handler4); 3348 if (modifiers.includes("prevent")) 3349 handler4 = wrapHandler(handler4, (next, e) => { 3350 e.preventDefault(); 3351 next(e); 3352 }); 3353 if (modifiers.includes("stop")) 3354 handler4 = wrapHandler(handler4, (next, e) => { 3355 e.stopPropagation(); 3356 next(e); 3357 }); 3358 if (modifiers.includes("once")) { 3359 handler4 = wrapHandler(handler4, (next, e) => { 3360 next(e); 3361 listenerTarget.removeEventListener(event, handler4, options); 3362 }); 3363 } 3364 if (modifiers.includes("away") || modifiers.includes("outside")) { 3365 listenerTarget = document; 3366 handler4 = wrapHandler(handler4, (next, e) => { 3367 if (el.contains(e.target)) 3368 return; 3369 if (e.target.isConnected === false) 3370 return; 3371 if (el.offsetWidth < 1 && el.offsetHeight < 1) 3372 return; 3373 if (el._x_isShown === false) 3374 return; 3375 next(e); 3376 }); 3377 } 3378 if (modifiers.includes("self")) 3379 handler4 = wrapHandler(handler4, (next, e) => { 3380 e.target === el && next(e); 3381 }); 3382 if (event === "submit") { 3383 handler4 = wrapHandler(handler4, (next, e) => { 3384 if (e.target._x_pendingModelUpdates) { 3385 e.target._x_pendingModelUpdates.forEach((fn) => fn()); 3386 } 3387 next(e); 3388 }); 3389 } 3390 if (isKeyEvent(event) || isClickEvent(event)) { 3391 handler4 = wrapHandler(handler4, (next, e) => { 3392 if (isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers)) { 3393 return; 3394 } 3395 next(e); 3396 }); 3397 } 3398 listenerTarget.addEventListener(event, handler4, options); 3399 return () => { 3400 listenerTarget.removeEventListener(event, handler4, options); 3401 }; 3402 } 3403 function addDebounceOrThrottle(modifiers, handler4) { 3404 if (modifiers.includes("debounce")) { 3405 let nextModifier = modifiers[modifiers.indexOf("debounce") + 1] || "invalid-wait"; 3406 let wait = isNumeric(nextModifier.split("ms")[0]) ? Number(nextModifier.split("ms")[0]) : 250; 3407 handler4 = debounce(handler4, wait); 3408 } 3409 if (modifiers.includes("throttle")) { 3410 let nextModifier = modifiers[modifiers.indexOf("throttle") + 1] || "invalid-wait"; 3411 let wait = isNumeric(nextModifier.split("ms")[0]) ? Number(nextModifier.split("ms")[0]) : 250; 3412 handler4 = throttle(handler4, wait); 3413 } 3414 return handler4; 3415 } 3416 function dotSyntax(subject) { 3417 return subject.replace(/-/g, "."); 3418 } 3419 function camelCase2(subject) { 3420 return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase()); 3421 } 3422 function isNumeric(subject) { 3423 return !Array.isArray(subject) && !isNaN(subject); 3424 } 3425 function kebabCase2(subject) { 3426 if ([" ", "_"].includes( 3427 subject 3428 )) 3429 return subject; 3430 return subject.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[_\s]/, "-").toLowerCase(); 3431 } 3432 function isKeyEvent(event) { 3433 return ["keydown", "keyup"].includes(event); 3434 } 3435 function isClickEvent(event) { 3436 return ["contextmenu", "click", "mouse"].some((i) => event.includes(i)); 3437 } 3438 function isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers) { 3439 let keyModifiers = modifiers.filter((i) => { 3440 return !["window", "document", "prevent", "stop", "once", "capture", "self", "away", "outside", "passive", "preserve-scroll", "blur", "change", "lazy"].includes(i); 3441 }); 3442 if (keyModifiers.includes("debounce")) { 3443 let debounceIndex = keyModifiers.indexOf("debounce"); 3444 keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || "invalid-wait").split("ms")[0]) ? 2 : 1); 3445 } 3446 if (keyModifiers.includes("throttle")) { 3447 let debounceIndex = keyModifiers.indexOf("throttle"); 3448 keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || "invalid-wait").split("ms")[0]) ? 2 : 1); 3449 } 3450 if (keyModifiers.length === 0) 3451 return false; 3452 if (keyModifiers.length === 1 && keyToModifiers(e.key).includes(keyModifiers[0])) 3453 return false; 3454 const systemKeyModifiers = ["ctrl", "shift", "alt", "meta", "cmd", "super"]; 3455 const selectedSystemKeyModifiers = systemKeyModifiers.filter((modifier) => keyModifiers.includes(modifier)); 3456 keyModifiers = keyModifiers.filter((i) => !selectedSystemKeyModifiers.includes(i)); 3457 if (selectedSystemKeyModifiers.length > 0) { 3458 const activelyPressedKeyModifiers = selectedSystemKeyModifiers.filter((modifier) => { 3459 if (modifier === "cmd" || modifier === "super") 3460 modifier = "meta"; 3461 return e[`${modifier}Key`]; 3462 }); 3463 if (activelyPressedKeyModifiers.length === selectedSystemKeyModifiers.length) { 3464 if (isClickEvent(e.type)) 3465 return false; 3466 if (keyToModifiers(e.key).includes(keyModifiers[0])) 3467 return false; 3468 } 3469 } 3470 return true; 3471 } 3472 function keyToModifiers(key) { 3473 if (!key) 3474 return []; 3475 key = kebabCase2(key); 3476 let modifierToKeyMap = { 3477 "ctrl": "control", 3478 "slash": "/", 3479 "space": " ", 3480 "spacebar": " ", 3481 "cmd": "meta", 3482 "esc": "escape", 3483 "up": "arrow-up", 3484 "down": "arrow-down", 3485 "left": "arrow-left", 3486 "right": "arrow-right", 3487 "period": ".", 3488 "comma": ",", 3489 "equal": "=", 3490 "minus": "-", 3491 "underscore": "_" 3492 }; 3493 modifierToKeyMap[key] = key; 3494 return Object.keys(modifierToKeyMap).map((modifier) => { 3495 if (modifierToKeyMap[modifier] === key) 3496 return modifier; 3497 }).filter((modifier) => modifier); 3498 } 3499 directive("model", (el, { modifiers, expression }, { effect: effect3, cleanup: cleanup2 }) => { 3500 let scopeTarget = el; 3501 if (modifiers.includes("parent")) { 3502 scopeTarget = findClosest(el, (element) => element !== el); 3503 } 3504 let evaluateGet = evaluateLater(scopeTarget, expression); 3505 let evaluateSet; 3506 if (typeof expression === "string") { 3507 evaluateSet = evaluateLater(scopeTarget, `${expression} = __placeholder`); 3508 } else if (typeof expression === "function" && typeof expression() === "string") { 3509 evaluateSet = evaluateLater(scopeTarget, `${expression()} = __placeholder`); 3510 } else { 3511 evaluateSet = () => { 3512 }; 3513 } 3514 let getValue = () => { 3515 let result; 3516 evaluateGet((value) => result = value); 3517 return isGetterSetter(result) ? result.get() : result; 3518 }; 3519 let setValue = (value) => { 3520 let result; 3521 evaluateGet((value2) => result = value2); 3522 if (isGetterSetter(result)) { 3523 result.set(value); 3524 } else { 3525 evaluateSet(() => { 3526 }, { 3527 scope: { "__placeholder": value } 3528 }); 3529 } 3530 }; 3531 if (typeof expression === "string" && el.type === "radio") { 3532 mutateDom(() => { 3533 if (!el.hasAttribute("name")) 3534 el.setAttribute("name", expression); 3535 }); 3536 } 3537 let hasChangeModifier = modifiers.includes("change") || modifiers.includes("lazy"); 3538 let hasBlurModifier = modifiers.includes("blur"); 3539 let hasEnterModifier = modifiers.includes("enter"); 3540 let hasExplicitEventModifiers = hasChangeModifier || hasBlurModifier || hasEnterModifier; 3541 let removeListener; 3542 if (isCloning) { 3543 removeListener = () => { 3544 }; 3545 } else if (hasExplicitEventModifiers) { 3546 let listeners = []; 3547 let syncValue = (e) => setValue(getInputValue(el, modifiers, e, getValue())); 3548 if (hasChangeModifier) { 3549 listeners.push(on(el, "change", modifiers, syncValue)); 3550 } 3551 if (hasBlurModifier) { 3552 listeners.push(on(el, "blur", modifiers, syncValue)); 3553 if (el.form) { 3554 let form = el.form; 3555 let syncCallback = () => syncValue({ target: el }); 3556 if (!form._x_pendingModelUpdates) 3557 form._x_pendingModelUpdates = []; 3558 form._x_pendingModelUpdates.push(syncCallback); 3559 cleanup2(() => { 3560 if (form._x_pendingModelUpdates) { 3561 form._x_pendingModelUpdates.splice(form._x_pendingModelUpdates.indexOf(syncCallback), 1); 3562 } 3563 }); 3564 } 3565 } 3566 if (hasEnterModifier) { 3567 listeners.push(on(el, "keydown", modifiers, (e) => { 3568 if (e.key === "Enter") 3569 syncValue(e); 3570 })); 3571 } 3572 removeListener = () => listeners.forEach((remove) => remove()); 3573 } else { 3574 let event = el.tagName.toLowerCase() === "select" || ["checkbox", "radio"].includes(el.type) ? "change" : "input"; 3575 removeListener = on(el, event, modifiers, (e) => { 3576 setValue(getInputValue(el, modifiers, e, getValue())); 3577 }); 3578 } 3579 if (modifiers.includes("fill")) { 3580 if ([void 0, null, ""].includes(getValue()) || isCheckbox(el) && Array.isArray(getValue()) || el.tagName.toLowerCase() === "select" && el.multiple) { 3581 setValue( 3582 getInputValue(el, modifiers, { target: el }, getValue()) 3583 ); 3584 } 3585 } 3586 if (!el._x_removeModelListeners) 3587 el._x_removeModelListeners = {}; 3588 el._x_removeModelListeners["default"] = removeListener; 3589 cleanup2(() => el._x_removeModelListeners["default"]()); 3590 if (el.form) { 3591 let removeResetListener = on(el.form, "reset", [], (e) => { 3592 nextTick(() => el._x_model && el._x_model.set(getInputValue(el, modifiers, { target: el }, getValue()))); 3593 }); 3594 cleanup2(() => removeResetListener()); 3595 } 3596 el._x_model = { 3597 get() { 3598 return getValue(); 3599 }, 3600 set(value) { 3601 setValue(value); 3602 }, 3603 setWithModifiers: addDebounceOrThrottle(modifiers, setValue) 3604 }; 3605 el._x_forceModelUpdate = (value) => { 3606 if (value === void 0 && typeof expression === "string" && expression.match(/\./)) 3607 value = ""; 3608 mutateDom(() => { 3609 if (isCheckbox(el)) { 3610 if (Array.isArray(value)) { 3611 el.checked = value.some((val) => val == el.value); 3612 } else { 3613 el.checked = !!value; 3614 } 3615 } else if (isRadio(el)) { 3616 if (typeof value === "boolean") { 3617 el.checked = safeParseBoolean(el.value) === value; 3618 } else { 3619 el.checked = el.value == value; 3620 } 3621 } else { 3622 bind(el, "value", value); 3623 } 3624 }); 3625 }; 3626 effect3(() => { 3627 let value = getValue(); 3628 if (modifiers.includes("unintrusive") && document.activeElement.isSameNode(el)) 3629 return; 3630 el._x_forceModelUpdate(value); 3631 }); 3632 }); 3633 function getInputValue(el, modifiers, event, currentValue) { 3634 return mutateDom(() => { 3635 if (event instanceof CustomEvent && event.detail !== void 0) 3636 return event.detail !== null && event.detail !== void 0 ? event.detail : event.target.value; 3637 else if (isCheckbox(el)) { 3638 if (Array.isArray(currentValue)) { 3639 let newValue = null; 3640 if (modifiers.includes("number")) { 3641 newValue = safeParseNumber(event.target.value); 3642 } else if (modifiers.includes("boolean")) { 3643 newValue = safeParseBoolean(event.target.value); 3644 } else { 3645 newValue = event.target.value; 3646 } 3647 return event.target.checked ? currentValue.includes(newValue) ? currentValue : currentValue.concat([newValue]) : currentValue.filter((el2) => !checkedAttrLooseCompare2(el2, newValue)); 3648 } else { 3649 return event.target.checked; 3650 } 3651 } else if (el.tagName.toLowerCase() === "select" && el.multiple) { 3652 if (modifiers.includes("number")) { 3653 return Array.from(event.target.selectedOptions).map((option2) => { 3654 let rawValue = option2.value || option2.text; 3655 return safeParseNumber(rawValue); 3656 }); 3657 } else if (modifiers.includes("boolean")) { 3658 return Array.from(event.target.selectedOptions).map((option2) => { 3659 let rawValue = option2.value || option2.text; 3660 return safeParseBoolean(rawValue); 3661 }); 3662 } 3663 return Array.from(event.target.selectedOptions).map((option2) => { 3664 return option2.value || option2.text; 3665 }); 3666 } else { 3667 let newValue; 3668 if (isRadio(el)) { 3669 if (event.target.checked) { 3670 newValue = event.target.value; 3671 } else { 3672 newValue = currentValue; 3673 } 3674 } else { 3675 newValue = event.target.value; 3676 } 3677 if (modifiers.includes("number")) { 3678 return safeParseNumber(newValue); 3679 } else if (modifiers.includes("boolean")) { 3680 return safeParseBoolean(newValue); 3681 } else if (modifiers.includes("trim")) { 3682 return newValue.trim(); 3683 } else { 3684 return newValue; 3685 } 3686 } 3687 }); 3688 } 3689 function safeParseNumber(rawValue) { 3690 let number = rawValue ? parseFloat(rawValue) : null; 3691 return isNumeric2(number) ? number : rawValue; 3692 } 3693 function checkedAttrLooseCompare2(valueA, valueB) { 3694 return valueA == valueB; 3695 } 3696 function isNumeric2(subject) { 3697 return !Array.isArray(subject) && !isNaN(subject); 3698 } 3699 function isGetterSetter(value) { 3700 return value !== null && typeof value === "object" && typeof value.get === "function" && typeof value.set === "function"; 3701 } 3702 directive("cloak", (el) => queueMicrotask(() => mutateDom(() => el.removeAttribute(prefix("cloak"))))); 3703 addInitSelector(() => `[${prefix("init")}]`); 3704 directive("init", skipDuringClone((el, { expression }, { evaluate: evaluate2 }) => { 3705 if (typeof expression === "string") { 3706 return !!expression.trim() && evaluate2(expression, {}, false); 3707 } 3708 return evaluate2(expression, {}, false); 3709 })); 3710 directive("text", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => { 3711 let evaluate2 = evaluateLater2(expression); 3712 effect3(() => { 3713 evaluate2((value) => { 3714 mutateDom(() => { 3715 el.textContent = value; 3716 }); 3717 }); 3718 }); 3719 }); 3720 directive("html", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => { 3721 let evaluate2 = evaluateLater2(expression); 3722 effect3(() => { 3723 evaluate2((value) => { 3724 mutateDom(() => { 3725 el.innerHTML = value ?? ""; 3726 el._x_ignoreSelf = true; 3727 initTree(el); 3728 delete el._x_ignoreSelf; 3729 }); 3730 }); 3731 }); 3732 }); 3733 mapAttributes(startingWith(":", into(prefix("bind:")))); 3734 var handler2 = (el, { value, modifiers, expression, original }, { effect: effect3, cleanup: cleanup2 }) => { 3735 if (!value) { 3736 let bindingProviders = {}; 3737 injectBindingProviders(bindingProviders); 3738 let getBindings = evaluateLater(el, expression); 3739 getBindings((bindings) => { 3740 applyBindingsObject(el, bindings, original); 3741 }, { scope: bindingProviders }); 3742 return; 3743 } 3744 if (value === "key") 3745 return storeKeyForXFor(el, expression); 3746 if (el._x_inlineBindings && el._x_inlineBindings[value] && el._x_inlineBindings[value].extract) { 3747 return; 3748 } 3749 let evaluate2 = evaluateLater(el, expression); 3750 effect3(() => evaluate2((result) => { 3751 if (result === void 0 && typeof expression === "string" && expression.match(/\./)) { 3752 result = ""; 3753 } 3754 mutateDom(() => bind(el, value, result, modifiers)); 3755 })); 3756 cleanup2(() => { 3757 el._x_undoAddedClasses && el._x_undoAddedClasses(); 3758 el._x_undoAddedStyles && el._x_undoAddedStyles(); 3759 }); 3760 }; 3761 handler2.inline = (el, { value, modifiers, expression }) => { 3762 if (!value) 3763 return; 3764 if (!el._x_inlineBindings) 3765 el._x_inlineBindings = {}; 3766 el._x_inlineBindings[value] = { expression, extract: false }; 3767 }; 3768 directive("bind", handler2); 3769 function storeKeyForXFor(el, expression) { 3770 el._x_keyExpression = expression; 3771 } 3772 addRootSelector(() => `[${prefix("data")}]`); 3773 directive("data", (el, { expression }, { cleanup: cleanup2 }) => { 3774 if (shouldSkipRegisteringDataDuringClone(el)) 3775 return; 3776 expression = expression === "" ? "{}" : expression; 3777 let magicContext = {}; 3778 injectMagics(magicContext, el); 3779 let dataProviderContext = {}; 3780 injectDataProviders(dataProviderContext, magicContext); 3781 let data2 = evaluate(el, expression, { scope: dataProviderContext }); 3782 if (data2 === void 0 || data2 === true) 3783 data2 = {}; 3784 injectMagics(data2, el); 3785 let reactiveData = reactive(data2); 3786 initInterceptors(reactiveData); 3787 let undo = addScopeToNode(el, reactiveData); 3788 reactiveData["init"] && evaluate(el, reactiveData["init"]); 3789 cleanup2(() => { 3790 reactiveData["destroy"] && evaluate(el, reactiveData["destroy"]); 3791 undo(); 3792 }); 3793 }); 3794 interceptClone((from, to) => { 3795 if (from._x_dataStack) { 3796 to._x_dataStack = from._x_dataStack; 3797 to.setAttribute("data-has-alpine-state", true); 3798 } 3799 }); 3800 function shouldSkipRegisteringDataDuringClone(el) { 3801 if (!isCloning) 3802 return false; 3803 if (isCloningLegacy) 3804 return true; 3805 return el.hasAttribute("data-has-alpine-state"); 3806 } 3807 directive("show", (el, { modifiers, expression }, { effect: effect3 }) => { 3808 let evaluate2 = evaluateLater(el, expression); 3809 if (!el._x_doHide) 3810 el._x_doHide = () => { 3811 mutateDom(() => { 3812 el.style.setProperty("display", "none", modifiers.includes("important") ? "important" : void 0); 3813 }); 3814 }; 3815 if (!el._x_doShow) 3816 el._x_doShow = () => { 3817 mutateDom(() => { 3818 if (el.style.length === 1 && el.style.display === "none") { 3819 el.removeAttribute("style"); 3820 } else { 3821 el.style.removeProperty("display"); 3822 } 3823 }); 3824 }; 3825 let hide = () => { 3826 el._x_doHide(); 3827 el._x_isShown = false; 3828 }; 3829 let show = () => { 3830 el._x_doShow(); 3831 el._x_isShown = true; 3832 }; 3833 let clickAwayCompatibleShow = () => setTimeout(show); 3834 let toggle = once( 3835 (value) => value ? show() : hide(), 3836 (value) => { 3837 if (typeof el._x_toggleAndCascadeWithTransitions === "function") { 3838 el._x_toggleAndCascadeWithTransitions(el, value, show, hide); 3839 } else { 3840 value ? clickAwayCompatibleShow() : hide(); 3841 } 3842 } 3843 ); 3844 let oldValue; 3845 let firstTime = true; 3846 effect3(() => evaluate2((value) => { 3847 if (!firstTime && value === oldValue) 3848 return; 3849 if (modifiers.includes("immediate")) 3850 value ? clickAwayCompatibleShow() : hide(); 3851 toggle(value); 3852 oldValue = value; 3853 firstTime = false; 3854 })); 3855 }); 3856 directive("for", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => { 3857 let iteratorNames = parseForExpression(expression); 3858 let evaluateItems = evaluateLater(el, iteratorNames.items); 3859 let evaluateKey = evaluateLater( 3860 el, 3861 // the x-bind:key expression is stored for our use instead of evaluated. 3862 el._x_keyExpression || "index" 3863 ); 3864 el._x_lookup = /* @__PURE__ */ new Map(); 3865 effect3(() => loop(el, iteratorNames, evaluateItems, evaluateKey)); 3866 cleanup2(() => { 3867 el._x_lookup.forEach( 3868 (el2) => mutateDom(() => { 3869 destroyTree(el2); 3870 el2.remove(); 3871 }) 3872 ); 3873 delete el._x_lookup; 3874 }); 3875 }); 3876 function refreshScope(scope2) { 3877 return (newScope) => { 3878 Object.entries(newScope).forEach(([key, value]) => { 3879 scope2[key] = value; 3880 }); 3881 }; 3882 } 3883 function loop(templateEl, iteratorNames, evaluateItems, evaluateKey) { 3884 evaluateItems((items) => { 3885 if (isNumeric3(items)) 3886 items = Array.from({ length: items }, (_, i) => i + 1); 3887 if (items === void 0 || items === null) 3888 items = []; 3889 if (items instanceof Set) 3890 items = Array.from(items); 3891 if (items instanceof Map) 3892 items = Array.from(items); 3893 let oldLookup = templateEl._x_lookup; 3894 let lookup = /* @__PURE__ */ new Map(); 3895 templateEl._x_lookup = lookup; 3896 let hasStringKeys = isObject2(items); 3897 let scopeEntries = Object.entries(items).map(([index2, item]) => { 3898 if (!hasStringKeys) 3899 index2 = parseInt(index2); 3900 let scope2 = getIterationScopeVariables(iteratorNames, item, index2, items); 3901 let key; 3902 evaluateKey((innerKey) => { 3903 if (typeof innerKey === "object") 3904 warn("x-for key cannot be an object, it must be a string or an integer", templateEl); 3905 if (oldLookup.has(innerKey)) { 3906 lookup.set(innerKey, oldLookup.get(innerKey)); 3907 oldLookup.delete(innerKey); 3908 } 3909 key = innerKey; 3910 }, { scope: { index: index2, ...scope2 } }); 3911 return [key, scope2]; 3912 }); 3913 mutateDom(() => { 3914 oldLookup.forEach((el) => { 3915 destroyTree(el); 3916 el.remove(); 3917 }); 3918 let added = /* @__PURE__ */ new Set(); 3919 let prev = templateEl; 3920 scopeEntries.forEach(([key, scope2]) => { 3921 if (lookup.has(key)) { 3922 let el = lookup.get(key); 3923 el._x_refreshXForScope(scope2); 3924 if (prev.nextElementSibling !== el) { 3925 if (prev.nextElementSibling) 3926 el.replaceWith(prev.nextElementSibling); 3927 prev.after(el); 3928 } 3929 prev = el; 3930 if (el._x_currentIfEl) { 3931 if (el.nextElementSibling !== el._x_currentIfEl) 3932 prev.after(el._x_currentIfEl); 3933 prev = el._x_currentIfEl; 3934 } 3935 return; 3936 } 3937 if (templateEl.content.children.length > 1) 3938 warn("x-for templates require a single root element, additional elements will be ignored.", templateEl); 3939 let clone22 = document.importNode(templateEl.content, true).firstElementChild; 3940 let reactiveScope = reactive(scope2); 3941 addScopeToNode(clone22, reactiveScope, templateEl); 3942 clone22._x_refreshXForScope = refreshScope(reactiveScope); 3943 lookup.set(key, clone22); 3944 added.add(clone22); 3945 prev.after(clone22); 3946 prev = clone22; 3947 }); 3948 skipDuringClone(() => added.forEach((clone22) => initTree(clone22)))(); 3949 }); 3950 }); 3951 } 3952 function parseForExpression(expression) { 3953 let forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/; 3954 let stripParensRE = /^\s*\(|\)\s*$/g; 3955 let forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/; 3956 let inMatch = expression.match(forAliasRE); 3957 if (!inMatch) 3958 return; 3959 let res = {}; 3960 res.items = inMatch[2].trim(); 3961 let item = inMatch[1].replace(stripParensRE, "").trim(); 3962 let iteratorMatch = item.match(forIteratorRE); 3963 if (iteratorMatch) { 3964 res.item = item.replace(forIteratorRE, "").trim(); 3965 res.index = iteratorMatch[1].trim(); 3966 if (iteratorMatch[2]) { 3967 res.collection = iteratorMatch[2].trim(); 3968 } 3969 } else { 3970 res.item = item; 3971 } 3972 return res; 3973 } 3974 function getIterationScopeVariables(iteratorNames, item, index2, items) { 3975 let scopeVariables = {}; 3976 if (/^\[.*\]$/.test(iteratorNames.item) && Array.isArray(item)) { 3977 let names = iteratorNames.item.replace("[", "").replace("]", "").split(",").map((i) => i.trim()); 3978 names.forEach((name, i) => { 3979 scopeVariables[name] = item[i]; 3980 }); 3981 } else if (/^\{.*\}$/.test(iteratorNames.item) && !Array.isArray(item) && typeof item === "object") { 3982 let names = iteratorNames.item.replace("{", "").replace("}", "").split(",").map((i) => i.trim()); 3983 names.forEach((name) => { 3984 scopeVariables[name] = item[name]; 3985 }); 3986 } else { 3987 scopeVariables[iteratorNames.item] = item; 3988 } 3989 if (iteratorNames.index) 3990 scopeVariables[iteratorNames.index] = index2; 3991 if (iteratorNames.collection) 3992 scopeVariables[iteratorNames.collection] = items; 3993 return scopeVariables; 3994 } 3995 function isNumeric3(subject) { 3996 return typeof subject !== "object" && !isNaN(subject); 3997 } 3998 function isObject2(subject) { 3999 return typeof subject === "object" && !Array.isArray(subject); 4000 } 4001 function handler3() { 4002 } 4003 handler3.inline = (el, { expression }, { cleanup: cleanup2 }) => { 4004 let root = closestRoot(el); 4005 if (!root) 4006 return; 4007 if (!root._x_refs) 4008 root._x_refs = {}; 4009 root._x_refs[expression] = el; 4010 cleanup2(() => delete root._x_refs[expression]); 4011 }; 4012 directive("ref", handler3); 4013 directive("if", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => { 4014 if (el.tagName.toLowerCase() !== "template") 4015 warn("x-if can only be used on a <template> tag", el); 4016 let evaluate2 = evaluateLater(el, expression); 4017 let show = () => { 4018 if (el._x_currentIfEl) 4019 return el._x_currentIfEl; 4020 let clone22 = el.content.cloneNode(true).firstElementChild; 4021 addScopeToNode(clone22, {}, el); 4022 mutateDom(() => { 4023 el.after(clone22); 4024 skipDuringClone(() => initTree(clone22))(); 4025 }); 4026 el._x_currentIfEl = clone22; 4027 el._x_undoIf = () => { 4028 mutateDom(() => { 4029 destroyTree(clone22); 4030 clone22.remove(); 4031 }); 4032 delete el._x_currentIfEl; 4033 }; 4034 return clone22; 4035 }; 4036 let hide = () => { 4037 if (!el._x_undoIf) 4038 return; 4039 el._x_undoIf(); 4040 delete el._x_undoIf; 4041 }; 4042 effect3(() => evaluate2((value) => { 4043 value ? show() : hide(); 4044 })); 4045 cleanup2(() => el._x_undoIf && el._x_undoIf()); 4046 }); 4047 directive("id", (el, { expression }, { evaluate: evaluate2 }) => { 4048 let names = evaluate2(expression); 4049 names.forEach((name) => setIdRoot(el, name)); 4050 }); 4051 interceptClone((from, to) => { 4052 if (from._x_ids) { 4053 to._x_ids = from._x_ids; 4054 } 4055 }); 4056 mapAttributes(startingWith("@", into(prefix("on:")))); 4057 directive("on", skipDuringClone((el, { value, modifiers, expression }, { cleanup: cleanup2 }) => { 4058 let evaluate2 = expression ? evaluateLater(el, expression) : () => { 4059 }; 4060 if (el.tagName.toLowerCase() === "template") { 4061 if (!el._x_forwardEvents) 4062 el._x_forwardEvents = []; 4063 if (!el._x_forwardEvents.includes(value)) 4064 el._x_forwardEvents.push(value); 4065 } 4066 let removeListener = on(el, value, modifiers, (e) => { 4067 evaluate2(() => { 4068 }, { scope: { "$event": e }, params: [e] }); 4069 }); 4070 cleanup2(() => removeListener()); 4071 })); 4072 warnMissingPluginDirective("Collapse", "collapse", "collapse"); 4073 warnMissingPluginDirective("Intersect", "intersect", "intersect"); 4074 warnMissingPluginDirective("Focus", "trap", "focus"); 4075 warnMissingPluginDirective("Mask", "mask", "mask"); 4076 function warnMissingPluginDirective(name, directiveName, slug) { 4077 directive(directiveName, (el) => warn(`You can't use [x-${directiveName}] without first installing the "${name}" plugin here: https://alpinejs.dev/plugins/${slug}`, el)); 4078 } 4079 alpine_default.setEvaluator(normalEvaluator); 4080 alpine_default.setRawEvaluator(normalRawEvaluator); 4081 alpine_default.setReactivityEngine({ reactive: reactive2, effect: effect2, release: stop, raw: toRaw }); 4082 var src_default = alpine_default; 4083 var module_default = src_default; 4084 4085
vendor: 85,551 bytes, lines 4085-6274
4085// node_modules/sortablejs/modular/sortable.esm.js 4086 function _defineProperty(e, r, t) { 4087 return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { 4088 value: t, 4089 enumerable: true, 4090 configurable: true, 4091 writable: true 4092 }) : e[r] = t, e; 4093 } 4094 function _extends() { 4095 return _extends = Object.assign ? Object.assign.bind() : function(n) { 4096 for (var e = 1; e < arguments.length; e++) { 4097 var t = arguments[e]; 4098 for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); 4099 } 4100 return n; 4101 }, _extends.apply(null, arguments); 4102 } 4103 function ownKeys2(e, r) { 4104 var t = Object.keys(e); 4105 if (Object.getOwnPropertySymbols) { 4106 var o = Object.getOwnPropertySymbols(e); 4107 r && (o = o.filter(function(r2) { 4108 return Object.getOwnPropertyDescriptor(e, r2).enumerable; 4109 })), t.push.apply(t, o); 4110 } 4111 return t; 4112 } 4113 function _objectSpread2(e) { 4114 for (var r = 1; r < arguments.length; r++) { 4115 var t = null != arguments[r] ? arguments[r] : {}; 4116 r % 2 ? ownKeys2(Object(t), true).forEach(function(r2) { 4117 _defineProperty(e, r2, t[r2]); 4118 }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys2(Object(t)).forEach(function(r2) { 4119 Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); 4120 }); 4121 } 4122 return e; 4123 } 4124 function _objectWithoutProperties(e, t) { 4125 if (null == e) return {}; 4126 var o, r, i = _objectWithoutPropertiesLoose(e, t); 4127 if (Object.getOwnPropertySymbols) { 4128 var n = Object.getOwnPropertySymbols(e); 4129 for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); 4130 } 4131 return i; 4132 } 4133 function _objectWithoutPropertiesLoose(r, e) { 4134 if (null == r) return {}; 4135 var t = {}; 4136 for (var n in r) if ({}.hasOwnProperty.call(r, n)) { 4137 if (-1 !== e.indexOf(n)) continue; 4138 t[n] = r[n]; 4139 } 4140 return t; 4141 } 4142 function _toPrimitive(t, r) { 4143 if ("object" != typeof t || !t) return t; 4144 var e = t[Symbol.toPrimitive]; 4145 if (void 0 !== e) { 4146 var i = e.call(t, r || "default"); 4147 if ("object" != typeof i) return i; 4148 throw new TypeError("@@toPrimitive must return a primitive value."); 4149 } 4150 return ("string" === r ? String : Number)(t); 4151 } 4152 function _toPropertyKey(t) { 4153 var i = _toPrimitive(t, "string"); 4154 return "symbol" == typeof i ? i : i + ""; 4155 } 4156 function _typeof(o) { 4157 "@babel/helpers - typeof"; 4158 return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { 4159 return typeof o2; 4160 } : function(o2) { 4161 return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; 4162 }, _typeof(o); 4163 } 4164 var version = "1.15.7"; 4165 function userAgent(pattern) { 4166 if (typeof window !== "undefined" && window.navigator) { 4167 return !!/* @__PURE__ */ navigator.userAgent.match(pattern); 4168 } 4169 } 4170 var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); 4171 var Edge = userAgent(/Edge/i); 4172 var FireFox = userAgent(/firefox/i); 4173 var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i); 4174 var IOS = userAgent(/iP(ad|od|hone)/i); 4175 var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i); 4176 var captureMode = { 4177 capture: false, 4178 passive: false 4179 }; 4180 function on2(el, event, fn) { 4181 el.addEventListener(event, fn, !IE11OrLess && captureMode); 4182 } 4183 function off(el, event, fn) { 4184 el.removeEventListener(event, fn, !IE11OrLess && captureMode); 4185 } 4186 function matches(el, selector) { 4187 if (!selector) return; 4188 selector[0] === ">" && (selector = selector.substring(1)); 4189 if (el) { 4190 try { 4191 if (el.matches) { 4192 return el.matches(selector); 4193 } else if (el.msMatchesSelector) { 4194 return el.msMatchesSelector(selector); 4195 } else if (el.webkitMatchesSelector) { 4196 return el.webkitMatchesSelector(selector); 4197 } 4198 } catch (_) { 4199 return false; 4200 } 4201 } 4202 return false; 4203 } 4204 function getParentOrHost(el) { 4205 return el.host && el !== document && el.host.nodeType && el.host !== el ? el.host : el.parentNode; 4206 } 4207 function closest(el, selector, ctx, includeCTX) { 4208 if (el) { 4209 ctx = ctx || document; 4210 do { 4211 if (selector != null && (selector[0] === ">" ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { 4212 return el; 4213 } 4214 if (el === ctx) break; 4215 } while (el = getParentOrHost(el)); 4216 } 4217 return null; 4218 } 4219 var R_SPACE = /\s+/g; 4220 function toggleClass(el, name, state) { 4221 if (el && name) { 4222 if (el.classList) { 4223 el.classList[state ? "add" : "remove"](name); 4224 } else { 4225 var className = (" " + el.className + " ").replace(R_SPACE, " ").replace(" " + name + " ", " "); 4226 el.className = (className + (state ? " " + name : "")).replace(R_SPACE, " "); 4227 } 4228 } 4229 } 4230 function css(el, prop, val) { 4231 var style = el && el.style; 4232 if (style) { 4233 if (val === void 0) { 4234 if (document.defaultView && document.defaultView.getComputedStyle) { 4235 val = document.defaultView.getComputedStyle(el, ""); 4236 } else if (el.currentStyle) { 4237 val = el.currentStyle; 4238 } 4239 return prop === void 0 ? val : val[prop]; 4240 } else { 4241 if (!(prop in style) && prop.indexOf("webkit") === -1) { 4242 prop = "-webkit-" + prop; 4243 } 4244 style[prop] = val + (typeof val === "string" ? "" : "px"); 4245 } 4246 } 4247 } 4248 function matrix(el, selfOnly) { 4249 var appliedTransforms = ""; 4250 if (typeof el === "string") { 4251 appliedTransforms = el; 4252 } else { 4253 do { 4254 var transform = css(el, "transform"); 4255 if (transform && transform !== "none") { 4256 appliedTransforms = transform + " " + appliedTransforms; 4257 } 4258 } while (!selfOnly && (el = el.parentNode)); 4259 } 4260 var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; 4261 return matrixFn && new matrixFn(appliedTransforms); 4262 } 4263 function find(ctx, tagName, iterator) { 4264 if (ctx) { 4265 var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length; 4266 if (iterator) { 4267 for (; i < n; i++) { 4268 iterator(list[i], i); 4269 } 4270 } 4271 return list; 4272 } 4273 return []; 4274 } 4275 function getWindowScrollingElement() { 4276 var scrollingElement = document.scrollingElement; 4277 if (scrollingElement) { 4278 return scrollingElement; 4279 } else { 4280 return document.documentElement; 4281 } 4282 } 4283 function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { 4284 if (!el.getBoundingClientRect && el !== window) return; 4285 var elRect, top, left, bottom, right, height, width; 4286 if (el !== window && el.parentNode && el !== getWindowScrollingElement()) { 4287 elRect = el.getBoundingClientRect(); 4288 top = elRect.top; 4289 left = elRect.left; 4290 bottom = elRect.bottom; 4291 right = elRect.right; 4292 height = elRect.height; 4293 width = elRect.width; 4294 } else { 4295 top = 0; 4296 left = 0; 4297 bottom = window.innerHeight; 4298 right = window.innerWidth; 4299 height = window.innerHeight; 4300 width = window.innerWidth; 4301 } 4302 if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { 4303 container = container || el.parentNode; 4304 if (!IE11OrLess) { 4305 do { 4306 if (container && container.getBoundingClientRect && (css(container, "transform") !== "none" || relativeToNonStaticParent && css(container, "position") !== "static")) { 4307 var containerRect = container.getBoundingClientRect(); 4308 top -= containerRect.top + parseInt(css(container, "border-top-width")); 4309 left -= containerRect.left + parseInt(css(container, "border-left-width")); 4310 bottom = top + elRect.height; 4311 right = left + elRect.width; 4312 break; 4313 } 4314 } while (container = container.parentNode); 4315 } 4316 } 4317 if (undoScale && el !== window) { 4318 var elMatrix = matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d; 4319 if (elMatrix) { 4320 top /= scaleY; 4321 left /= scaleX; 4322 width /= scaleX; 4323 height /= scaleY; 4324 bottom = top + height; 4325 right = left + width; 4326 } 4327 } 4328 return { 4329 top, 4330 left, 4331 bottom, 4332 right, 4333 width, 4334 height 4335 }; 4336 } 4337 function isScrolledPast(el, elSide, parentSide) { 4338 var parent = getParentAutoScrollElement(el, true), elSideVal = getRect(el)[elSide]; 4339 while (parent) { 4340 var parentSideVal = getRect(parent)[parentSide], visible = void 0; 4341 if (parentSide === "top" || parentSide === "left") { 4342 visible = elSideVal >= parentSideVal; 4343 } else { 4344 visible = elSideVal <= parentSideVal; 4345 } 4346 if (!visible) return parent; 4347 if (parent === getWindowScrollingElement()) break; 4348 parent = getParentAutoScrollElement(parent, false); 4349 } 4350 return false; 4351 } 4352 function getChild(el, childNum, options, includeDragEl) { 4353 var currentChild = 0, i = 0, children = el.children; 4354 while (i < children.length) { 4355 if (children[i].style.display !== "none" && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) { 4356 if (currentChild === childNum) { 4357 return children[i]; 4358 } 4359 currentChild++; 4360 } 4361 i++; 4362 } 4363 return null; 4364 } 4365 function lastChild(el, selector) { 4366 var last = el.lastElementChild; 4367 while (last && (last === Sortable.ghost || css(last, "display") === "none" || selector && !matches(last, selector))) { 4368 last = last.previousElementSibling; 4369 } 4370 return last || null; 4371 } 4372 function index(el, selector) { 4373 var index2 = 0; 4374 if (!el || !el.parentNode) { 4375 return -1; 4376 } 4377 while (el = el.previousElementSibling) { 4378 if (el.nodeName.toUpperCase() !== "TEMPLATE" && el !== Sortable.clone && (!selector || matches(el, selector))) { 4379 index2++; 4380 } 4381 } 4382 return index2; 4383 } 4384 function getRelativeScrollOffset(el) { 4385 var offsetLeft = 0, offsetTop = 0, winScroller = getWindowScrollingElement(); 4386 if (el) { 4387 do { 4388 var elMatrix = matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d; 4389 offsetLeft += el.scrollLeft * scaleX; 4390 offsetTop += el.scrollTop * scaleY; 4391 } while (el !== winScroller && (el = el.parentNode)); 4392 } 4393 return [offsetLeft, offsetTop]; 4394 } 4395 function indexOfObject(arr, obj) { 4396 for (var i in arr) { 4397 if (!arr.hasOwnProperty(i)) continue; 4398 for (var key in obj) { 4399 if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i); 4400 } 4401 } 4402 return -1; 4403 } 4404 function getParentAutoScrollElement(el, includeSelf) { 4405 if (!el || !el.getBoundingClientRect) return getWindowScrollingElement(); 4406 var elem = el; 4407 var gotSelf = false; 4408 do { 4409 if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { 4410 var elemCSS = css(elem); 4411 if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll")) { 4412 if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement(); 4413 if (gotSelf || includeSelf) return elem; 4414 gotSelf = true; 4415 } 4416 } 4417 } while (elem = elem.parentNode); 4418 return getWindowScrollingElement(); 4419 } 4420 function extend(dst, src) { 4421 if (dst && src) { 4422 for (var key in src) { 4423 if (src.hasOwnProperty(key)) { 4424 dst[key] = src[key]; 4425 } 4426 } 4427 } 4428 return dst; 4429 } 4430 function isRectEqual(rect1, rect2) { 4431 return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); 4432 } 4433 var _throttleTimeout; 4434 function throttle2(callback, ms) { 4435 return function() { 4436 if (!_throttleTimeout) { 4437 var args = arguments, _this = this; 4438 if (args.length === 1) { 4439 callback.call(_this, args[0]); 4440 } else { 4441 callback.apply(_this, args); 4442 } 4443 _throttleTimeout = setTimeout(function() { 4444 _throttleTimeout = void 0; 4445 }, ms); 4446 } 4447 }; 4448 } 4449 function cancelThrottle() { 4450 clearTimeout(_throttleTimeout); 4451 _throttleTimeout = void 0; 4452 } 4453 function scrollBy(el, x, y) { 4454 el.scrollLeft += x; 4455 el.scrollTop += y; 4456 } 4457 function clone2(el) { 4458 var Polymer = window.Polymer; 4459 var $ = window.jQuery || window.Zepto; 4460 if (Polymer && Polymer.dom) { 4461 return Polymer.dom(el).cloneNode(true); 4462 } else if ($) { 4463 return $(el).clone(true)[0]; 4464 } else { 4465 return el.cloneNode(true); 4466 } 4467 } 4468 function getChildContainingRectFromElement(container, options, ghostEl2) { 4469 var rect = {}; 4470 Array.from(container.children).forEach(function(child) { 4471 var _rect$left, _rect$top, _rect$right, _rect$bottom; 4472 if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl2) return; 4473 var childRect = getRect(child); 4474 rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left); 4475 rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top); 4476 rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right); 4477 rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom); 4478 }); 4479 rect.width = rect.right - rect.left; 4480 rect.height = rect.bottom - rect.top; 4481 rect.x = rect.left; 4482 rect.y = rect.top; 4483 return rect; 4484 } 4485 var expando = "Sortable" + (/* @__PURE__ */ new Date()).getTime(); 4486 function AnimationStateManager() { 4487 var animationStates = [], animationCallbackId; 4488 return { 4489 captureAnimationState: function captureAnimationState() { 4490 animationStates = []; 4491 if (!this.options.animation) return; 4492 var children = [].slice.call(this.el.children); 4493 children.forEach(function(child) { 4494 if (css(child, "display") === "none" || child === Sortable.ghost) return; 4495 animationStates.push({ 4496 target: child, 4497 rect: getRect(child) 4498 }); 4499 var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); 4500 if (child.thisAnimationDuration) { 4501 var childMatrix = matrix(child, true); 4502 if (childMatrix) { 4503 fromRect.top -= childMatrix.f; 4504 fromRect.left -= childMatrix.e; 4505 } 4506 } 4507 child.fromRect = fromRect; 4508 }); 4509 }, 4510 addAnimationState: function addAnimationState(state) { 4511 animationStates.push(state); 4512 }, 4513 removeAnimationState: function removeAnimationState(target) { 4514 animationStates.splice(indexOfObject(animationStates, { 4515 target 4516 }), 1); 4517 }, 4518 animateAll: function animateAll(callback) { 4519 var _this = this; 4520 if (!this.options.animation) { 4521 clearTimeout(animationCallbackId); 4522 if (typeof callback === "function") callback(); 4523 return; 4524 } 4525 var animating = false, animationTime = 0; 4526 animationStates.forEach(function(state) { 4527 var time = 0, target = state.target, fromRect = target.fromRect, toRect = getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = matrix(target, true); 4528 if (targetMatrix) { 4529 toRect.top -= targetMatrix.f; 4530 toRect.left -= targetMatrix.e; 4531 } 4532 target.toRect = toRect; 4533 if (target.thisAnimationDuration) { 4534 if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect 4535 (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { 4536 time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); 4537 } 4538 } 4539 if (!isRectEqual(toRect, fromRect)) { 4540 target.prevFromRect = fromRect; 4541 target.prevToRect = toRect; 4542 if (!time) { 4543 time = _this.options.animation; 4544 } 4545 _this.animate(target, animatingRect, toRect, time); 4546 } 4547 if (time) { 4548 animating = true; 4549 animationTime = Math.max(animationTime, time); 4550 clearTimeout(target.animationResetTimer); 4551 target.animationResetTimer = setTimeout(function() { 4552 target.animationTime = 0; 4553 target.prevFromRect = null; 4554 target.fromRect = null; 4555 target.prevToRect = null; 4556 target.thisAnimationDuration = null; 4557 }, time); 4558 target.thisAnimationDuration = time; 4559 } 4560 }); 4561 clearTimeout(animationCallbackId); 4562 if (!animating) { 4563 if (typeof callback === "function") callback(); 4564 } else { 4565 animationCallbackId = setTimeout(function() { 4566 if (typeof callback === "function") callback(); 4567 }, animationTime); 4568 } 4569 animationStates = []; 4570 }, 4571 animate: function animate(target, currentRect, toRect, duration) { 4572 if (duration) { 4573 css(target, "transition", ""); 4574 css(target, "transform", ""); 4575 var elMatrix = matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1); 4576 target.animatingX = !!translateX; 4577 target.animatingY = !!translateY; 4578 css(target, "transform", "translate3d(" + translateX + "px," + translateY + "px,0)"); 4579 this.forRepaintDummy = repaint(target); 4580 css(target, "transition", "transform " + duration + "ms" + (this.options.easing ? " " + this.options.easing : "")); 4581 css(target, "transform", "translate3d(0,0,0)"); 4582 typeof target.animated === "number" && clearTimeout(target.animated); 4583 target.animated = setTimeout(function() { 4584 css(target, "transition", ""); 4585 css(target, "transform", ""); 4586 target.animated = false; 4587 target.animatingX = false; 4588 target.animatingY = false; 4589 }, duration); 4590 } 4591 } 4592 }; 4593 } 4594 function repaint(target) { 4595 return target.offsetWidth; 4596 } 4597 function calculateRealTime(animatingRect, fromRect, toRect, options) { 4598 return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; 4599 } 4600 var plugins = []; 4601 var defaults = { 4602 initializeByDefault: true 4603 }; 4604 var PluginManager = { 4605 mount: function mount(plugin2) { 4606 for (var option2 in defaults) { 4607 if (defaults.hasOwnProperty(option2) && !(option2 in plugin2)) { 4608 plugin2[option2] = defaults[option2]; 4609 } 4610 } 4611 plugins.forEach(function(p) { 4612 if (p.pluginName === plugin2.pluginName) { 4613 throw "Sortable: Cannot mount plugin ".concat(plugin2.pluginName, " more than once"); 4614 } 4615 }); 4616 plugins.push(plugin2); 4617 }, 4618 pluginEvent: function pluginEvent(eventName, sortable, evt) { 4619 var _this = this; 4620 this.eventCanceled = false; 4621 evt.cancel = function() { 4622 _this.eventCanceled = true; 4623 }; 4624 var eventNameGlobal = eventName + "Global"; 4625 plugins.forEach(function(plugin2) { 4626 if (!sortable[plugin2.pluginName]) return; 4627 if (sortable[plugin2.pluginName][eventNameGlobal]) { 4628 sortable[plugin2.pluginName][eventNameGlobal](_objectSpread2({ 4629 sortable 4630 }, evt)); 4631 } 4632 if (sortable.options[plugin2.pluginName] && sortable[plugin2.pluginName][eventName]) { 4633 sortable[plugin2.pluginName][eventName](_objectSpread2({ 4634 sortable 4635 }, evt)); 4636 } 4637 }); 4638 }, 4639 initializePlugins: function initializePlugins(sortable, el, defaults2, options) { 4640 plugins.forEach(function(plugin2) { 4641 var pluginName = plugin2.pluginName; 4642 if (!sortable.options[pluginName] && !plugin2.initializeByDefault) return; 4643 var initialized = new plugin2(sortable, el, sortable.options); 4644 initialized.sortable = sortable; 4645 initialized.options = sortable.options; 4646 sortable[pluginName] = initialized; 4647 _extends(defaults2, initialized.defaults); 4648 }); 4649 for (var option2 in sortable.options) { 4650 if (!sortable.options.hasOwnProperty(option2)) continue; 4651 var modified = this.modifyOption(sortable, option2, sortable.options[option2]); 4652 if (typeof modified !== "undefined") { 4653 sortable.options[option2] = modified; 4654 } 4655 } 4656 }, 4657 getEventProperties: function getEventProperties(name, sortable) { 4658 var eventProperties = {}; 4659 plugins.forEach(function(plugin2) { 4660 if (typeof plugin2.eventProperties !== "function") return; 4661 _extends(eventProperties, plugin2.eventProperties.call(sortable[plugin2.pluginName], name)); 4662 }); 4663 return eventProperties; 4664 }, 4665 modifyOption: function modifyOption(sortable, name, value) { 4666 var modifiedValue; 4667 plugins.forEach(function(plugin2) { 4668 if (!sortable[plugin2.pluginName]) return; 4669 if (plugin2.optionListeners && typeof plugin2.optionListeners[name] === "function") { 4670 modifiedValue = plugin2.optionListeners[name].call(sortable[plugin2.pluginName], value); 4671 } 4672 }); 4673 return modifiedValue; 4674 } 4675 }; 4676 function dispatchEvent(_ref) { 4677 var sortable = _ref.sortable, rootEl2 = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl2 = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex2 = _ref.oldIndex, newIndex2 = _ref.newIndex, oldDraggableIndex2 = _ref.oldDraggableIndex, newDraggableIndex2 = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, extraEventProperties = _ref.extraEventProperties; 4678 sortable = sortable || rootEl2 && rootEl2[expando]; 4679 if (!sortable) return; 4680 var evt, options = sortable.options, onName = "on" + name.charAt(0).toUpperCase() + name.substr(1); 4681 if (window.CustomEvent && !IE11OrLess && !Edge) { 4682 evt = new CustomEvent(name, { 4683 bubbles: true, 4684 cancelable: true 4685 }); 4686 } else { 4687 evt = document.createEvent("Event"); 4688 evt.initEvent(name, true, true); 4689 } 4690 evt.to = toEl || rootEl2; 4691 evt.from = fromEl || rootEl2; 4692 evt.item = targetEl || rootEl2; 4693 evt.clone = cloneEl2; 4694 evt.oldIndex = oldIndex2; 4695 evt.newIndex = newIndex2; 4696 evt.oldDraggableIndex = oldDraggableIndex2; 4697 evt.newDraggableIndex = newDraggableIndex2; 4698 evt.originalEvent = originalEvent; 4699 evt.pullMode = putSortable2 ? putSortable2.lastPutMode : void 0; 4700 var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable)); 4701 for (var option2 in allEventProperties) { 4702 evt[option2] = allEventProperties[option2]; 4703 } 4704 if (rootEl2) { 4705 rootEl2.dispatchEvent(evt); 4706 } 4707 if (options[onName]) { 4708 options[onName].call(sortable, evt); 4709 } 4710 } 4711 var _excluded = ["evt"]; 4712 var pluginEvent2 = function pluginEvent3(eventName, sortable) { 4713 var _ref = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, originalEvent = _ref.evt, data2 = _objectWithoutProperties(_ref, _excluded); 4714 PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({ 4715 dragEl, 4716 parentEl, 4717 ghostEl, 4718 rootEl, 4719 nextEl, 4720 lastDownEl, 4721 cloneEl, 4722 cloneHidden, 4723 dragStarted: moved, 4724 putSortable, 4725 activeSortable: Sortable.active, 4726 originalEvent, 4727 oldIndex, 4728 oldDraggableIndex, 4729 newIndex, 4730 newDraggableIndex, 4731 hideGhostForTarget: _hideGhostForTarget, 4732 unhideGhostForTarget: _unhideGhostForTarget, 4733 cloneNowHidden: function cloneNowHidden() { 4734 cloneHidden = true; 4735 }, 4736 cloneNowShown: function cloneNowShown() { 4737 cloneHidden = false; 4738 }, 4739 dispatchSortableEvent: function dispatchSortableEvent(name) { 4740 _dispatchEvent({ 4741 sortable, 4742 name, 4743 originalEvent 4744 }); 4745 } 4746 }, data2)); 4747 }; 4748 function _dispatchEvent(info) { 4749 dispatchEvent(_objectSpread2({ 4750 putSortable, 4751 cloneEl, 4752 targetEl: dragEl, 4753 rootEl, 4754 oldIndex, 4755 oldDraggableIndex, 4756 newIndex, 4757 newDraggableIndex 4758 }, info)); 4759 } 4760 var dragEl; 4761 var parentEl; 4762 var ghostEl; 4763 var rootEl; 4764 var nextEl; 4765 var lastDownEl; 4766 var cloneEl; 4767 var cloneHidden; 4768 var oldIndex; 4769 var newIndex; 4770 var oldDraggableIndex; 4771 var newDraggableIndex; 4772 var activeGroup; 4773 var putSortable; 4774 var awaitingDragStarted = false; 4775 var ignoreNextClick = false; 4776 var sortables = []; 4777 var tapEvt; 4778 var touchEvt; 4779 var lastDx; 4780 var lastDy; 4781 var tapDistanceLeft; 4782 var tapDistanceTop; 4783 var moved; 4784 var lastTarget; 4785 var lastDirection; 4786 var pastFirstInvertThresh = false; 4787 var isCircumstantialInvert = false; 4788 var targetMoveDistance; 4789 var ghostRelativeParent; 4790 var ghostRelativeParentInitialScroll = []; 4791 var _silent = false; 4792 var savedInputChecked = []; 4793 var documentExists = typeof document !== "undefined"; 4794 var PositionGhostAbsolutely = IOS; 4795 var CSSFloatProperty = Edge || IE11OrLess ? "cssFloat" : "float"; 4796 var supportDraggable = documentExists && !ChromeForAndroid && !IOS && "draggable" in document.createElement("div"); 4797 var supportCssPointerEvents = (function() { 4798 if (!documentExists) return; 4799 if (IE11OrLess) { 4800 return false; 4801 } 4802 var el = document.createElement("x"); 4803 el.style.cssText = "pointer-events:auto"; 4804 return el.style.pointerEvents === "auto"; 4805 })(); 4806 var _detectDirection = function _detectDirection2(el, options) { 4807 var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), firstChildCSS = child1 && css(child1), secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; 4808 if (elCSS.display === "flex") { 4809 return elCSS.flexDirection === "column" || elCSS.flexDirection === "column-reverse" ? "vertical" : "horizontal"; 4810 } 4811 if (elCSS.display === "grid") { 4812 return elCSS.gridTemplateColumns.split(" ").length <= 1 ? "vertical" : "horizontal"; 4813 } 4814 if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== "none") { 4815 var touchingSideChild2 = firstChildCSS["float"] === "left" ? "left" : "right"; 4816 return child2 && (secondChildCSS.clear === "both" || secondChildCSS.clear === touchingSideChild2) ? "vertical" : "horizontal"; 4817 } 4818 return child1 && (firstChildCSS.display === "block" || firstChildCSS.display === "flex" || firstChildCSS.display === "table" || firstChildCSS.display === "grid" || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === "none" || child2 && elCSS[CSSFloatProperty] === "none" && firstChildWidth + secondChildWidth > elWidth) ? "vertical" : "horizontal"; 4819 }; 4820 var _dragElInRowColumn = function _dragElInRowColumn2(dragRect, targetRect, vertical) { 4821 var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height; 4822 return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; 4823 }; 4824 var _detectNearestEmptySortable = function _detectNearestEmptySortable2(x, y) { 4825 var ret; 4826 sortables.some(function(sortable) { 4827 var threshold = sortable[expando].options.emptyInsertThreshold; 4828 if (!threshold || lastChild(sortable)) return; 4829 var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; 4830 if (insideHorizontally && insideVertically) { 4831 return ret = sortable; 4832 } 4833 }); 4834 return ret; 4835 }; 4836 var _prepareGroup = function _prepareGroup2(options) { 4837 function toFn(value, pull) { 4838 return function(to, from, dragEl2, evt) { 4839 var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; 4840 if (value == null && (pull || sameGroup)) { 4841 return true; 4842 } else if (value == null || value === false) { 4843 return false; 4844 } else if (pull && value === "clone") { 4845 return value; 4846 } else if (typeof value === "function") { 4847 return toFn(value(to, from, dragEl2, evt), pull)(to, from, dragEl2, evt); 4848 } else { 4849 var otherGroup = (pull ? to : from).options.group.name; 4850 return value === true || typeof value === "string" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; 4851 } 4852 }; 4853 } 4854 var group = {}; 4855 var originalGroup = options.group; 4856 if (!originalGroup || _typeof(originalGroup) != "object") { 4857 originalGroup = { 4858 name: originalGroup 4859 }; 4860 } 4861 group.name = originalGroup.name; 4862 group.checkPull = toFn(originalGroup.pull, true); 4863 group.checkPut = toFn(originalGroup.put); 4864 group.revertClone = originalGroup.revertClone; 4865 options.group = group; 4866 }; 4867 var _hideGhostForTarget = function _hideGhostForTarget2() { 4868 if (!supportCssPointerEvents && ghostEl) { 4869 css(ghostEl, "display", "none"); 4870 } 4871 }; 4872 var _unhideGhostForTarget = function _unhideGhostForTarget2() { 4873 if (!supportCssPointerEvents && ghostEl) { 4874 css(ghostEl, "display", ""); 4875 } 4876 }; 4877 if (documentExists && !ChromeForAndroid) { 4878 document.addEventListener("click", function(evt) { 4879 if (ignoreNextClick) { 4880 evt.preventDefault(); 4881 evt.stopPropagation && evt.stopPropagation(); 4882 evt.stopImmediatePropagation && evt.stopImmediatePropagation(); 4883 ignoreNextClick = false; 4884 return false; 4885 } 4886 }, true); 4887 } 4888 var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent2(evt) { 4889 if (dragEl) { 4890 evt = evt.touches ? evt.touches[0] : evt; 4891 var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); 4892 if (nearest) { 4893 var event = {}; 4894 for (var i in evt) { 4895 if (evt.hasOwnProperty(i)) { 4896 event[i] = evt[i]; 4897 } 4898 } 4899 event.target = event.rootEl = nearest; 4900 event.preventDefault = void 0; 4901 event.stopPropagation = void 0; 4902 nearest[expando]._onDragOver(event); 4903 } 4904 } 4905 }; 4906 var _checkOutsideTargetEl = function _checkOutsideTargetEl2(evt) { 4907 if (dragEl) { 4908 dragEl.parentNode[expando]._isOutsideThisEl(evt.target); 4909 } 4910 }; 4911 function Sortable(el, options) { 4912 if (!(el && el.nodeType && el.nodeType === 1)) { 4913 throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); 4914 } 4915 this.el = el; 4916 this.options = options = _extends({}, options); 4917 el[expando] = this; 4918 var defaults2 = { 4919 group: null, 4920 sort: true, 4921 disabled: false, 4922 store: null, 4923 handle: null, 4924 draggable: /^[uo]l$/i.test(el.nodeName) ? ">li" : ">*", 4925 swapThreshold: 1, 4926 // percentage; 0 <= x <= 1 4927 invertSwap: false, 4928 // invert always 4929 invertedSwapThreshold: null, 4930 // will be set to same as swapThreshold if default 4931 removeCloneOnHide: true, 4932 direction: function direction() { 4933 return _detectDirection(el, this.options); 4934 }, 4935 ghostClass: "sortable-ghost", 4936 chosenClass: "sortable-chosen", 4937 dragClass: "sortable-drag", 4938 ignore: "a, img", 4939 filter: null, 4940 preventOnFilter: true, 4941 animation: 0, 4942 easing: null, 4943 setData: function setData(dataTransfer, dragEl2) { 4944 dataTransfer.setData("Text", dragEl2.textContent); 4945 }, 4946 dropBubble: false, 4947 dragoverBubble: false, 4948 dataIdAttr: "data-id", 4949 delay: 0, 4950 delayOnTouchOnly: false, 4951 touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1, 4952 forceFallback: false, 4953 fallbackClass: "sortable-fallback", 4954 fallbackOnBody: false, 4955 fallbackTolerance: 0, 4956 fallbackOffset: { 4957 x: 0, 4958 y: 0 4959 }, 4960 // Disabled on Safari: #1571; Enabled on Safari IOS: #2244 4961 supportPointer: Sortable.supportPointer !== false && "PointerEvent" in window && (!Safari || IOS), 4962 emptyInsertThreshold: 5 4963 }; 4964 PluginManager.initializePlugins(this, el, defaults2); 4965 for (var name in defaults2) { 4966 !(name in options) && (options[name] = defaults2[name]); 4967 } 4968 _prepareGroup(options); 4969 for (var fn in this) { 4970 if (fn.charAt(0) === "_" && typeof this[fn] === "function") { 4971 this[fn] = this[fn].bind(this); 4972 } 4973 } 4974 this.nativeDraggable = options.forceFallback ? false : supportDraggable; 4975 if (this.nativeDraggable) { 4976 this.options.touchStartThreshold = 1; 4977 } 4978 if (options.supportPointer) { 4979 on2(el, "pointerdown", this._onTapStart); 4980 } else { 4981 on2(el, "mousedown", this._onTapStart); 4982 on2(el, "touchstart", this._onTapStart); 4983 } 4984 if (this.nativeDraggable) { 4985 on2(el, "dragover", this); 4986 on2(el, "dragenter", this); 4987 } 4988 sortables.push(this.el); 4989 options.store && options.store.get && this.sort(options.store.get(this) || []); 4990 _extends(this, AnimationStateManager()); 4991 } 4992 Sortable.prototype = /** @lends Sortable.prototype */ 4993 { 4994 constructor: Sortable, 4995 _isOutsideThisEl: function _isOutsideThisEl(target) { 4996 if (!this.el.contains(target) && target !== this.el) { 4997 lastTarget = null; 4998 } 4999 }, 5000 _getDirection: function _getDirection(evt, target) { 5001 return typeof this.options.direction === "function" ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; 5002 }, 5003 _onTapStart: function _onTapStart(evt) { 5004 if (!evt.cancelable) return; 5005 var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === "touch" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter; 5006 _saveInputCheckedState(el); 5007 if (dragEl) { 5008 return; 5009 } 5010 if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { 5011 return; 5012 } 5013 if (originalTarget.isContentEditable) { 5014 return; 5015 } 5016 if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === "SELECT") { 5017 return; 5018 } 5019 target = closest(target, options.draggable, el, false); 5020 if (target && target.animated) { 5021 return; 5022 } 5023 if (lastDownEl === target) { 5024 return; 5025 } 5026 oldIndex = index(target); 5027 oldDraggableIndex = index(target, options.draggable); 5028 if (typeof filter === "function") { 5029 if (filter.call(this, evt, target, this)) { 5030 _dispatchEvent({ 5031 sortable: _this, 5032 rootEl: originalTarget, 5033 name: "filter", 5034 targetEl: target, 5035 toEl: el, 5036 fromEl: el 5037 }); 5038 pluginEvent2("filter", _this, { 5039 evt 5040 }); 5041 preventOnFilter && evt.preventDefault(); 5042 return; 5043 } 5044 } else if (filter) { 5045 filter = filter.split(",").some(function(criteria) { 5046 criteria = closest(originalTarget, criteria.trim(), el, false); 5047 if (criteria) { 5048 _dispatchEvent({ 5049 sortable: _this, 5050 rootEl: criteria, 5051 name: "filter", 5052 targetEl: target, 5053 fromEl: el, 5054 toEl: el 5055 }); 5056 pluginEvent2("filter", _this, { 5057 evt 5058 }); 5059 return true; 5060 } 5061 }); 5062 if (filter) { 5063 preventOnFilter && evt.preventDefault(); 5064 return; 5065 } 5066 } 5067 if (options.handle && !closest(originalTarget, options.handle, el, false)) { 5068 return; 5069 } 5070 this._prepareDragStart(evt, touch, target); 5071 }, 5072 _prepareDragStart: function _prepareDragStart(evt, touch, target) { 5073 var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn; 5074 if (target && !dragEl && target.parentNode === el) { 5075 var dragRect = getRect(target); 5076 rootEl = el; 5077 dragEl = target; 5078 parentEl = dragEl.parentNode; 5079 nextEl = dragEl.nextSibling; 5080 lastDownEl = target; 5081 activeGroup = options.group; 5082 Sortable.dragged = dragEl; 5083 tapEvt = { 5084 target: dragEl, 5085 clientX: (touch || evt).clientX, 5086 clientY: (touch || evt).clientY 5087 }; 5088 tapDistanceLeft = tapEvt.clientX - dragRect.left; 5089 tapDistanceTop = tapEvt.clientY - dragRect.top; 5090 this._lastX = (touch || evt).clientX; 5091 this._lastY = (touch || evt).clientY; 5092 dragEl.style["will-change"] = "all"; 5093 dragStartFn = function dragStartFn2() { 5094 pluginEvent2("delayEnded", _this, { 5095 evt 5096 }); 5097 if (Sortable.eventCanceled) { 5098 _this._onDrop(); 5099 return; 5100 } 5101 _this._disableDelayedDragEvents(); 5102 if (!FireFox && _this.nativeDraggable) { 5103 dragEl.draggable = true; 5104 } 5105 _this._triggerDragStart(evt, touch); 5106 _dispatchEvent({ 5107 sortable: _this, 5108 name: "choose", 5109 originalEvent: evt 5110 }); 5111 toggleClass(dragEl, options.chosenClass, true); 5112 }; 5113 options.ignore.split(",").forEach(function(criteria) { 5114 find(dragEl, criteria.trim(), _disableDraggable); 5115 }); 5116 on2(ownerDocument, "dragover", nearestEmptyInsertDetectEvent); 5117 on2(ownerDocument, "mousemove", nearestEmptyInsertDetectEvent); 5118 on2(ownerDocument, "touchmove", nearestEmptyInsertDetectEvent); 5119 if (options.supportPointer) { 5120 on2(ownerDocument, "pointerup", _this._onDrop); 5121 !this.nativeDraggable && on2(ownerDocument, "pointercancel", _this._onDrop); 5122 } else { 5123 on2(ownerDocument, "mouseup", _this._onDrop); 5124 on2(ownerDocument, "touchend", _this._onDrop); 5125 on2(ownerDocument, "touchcancel", _this._onDrop); 5126 } 5127 if (FireFox && this.nativeDraggable) { 5128 this.options.touchStartThreshold = 4; 5129 dragEl.draggable = true; 5130 } 5131 pluginEvent2("delayStart", this, { 5132 evt 5133 }); 5134 if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { 5135 if (Sortable.eventCanceled) { 5136 this._onDrop(); 5137 return; 5138 } 5139 if (options.supportPointer) { 5140 on2(ownerDocument, "pointerup", _this._disableDelayedDrag); 5141 on2(ownerDocument, "pointercancel", _this._disableDelayedDrag); 5142 } else { 5143 on2(ownerDocument, "mouseup", _this._disableDelayedDrag); 5144 on2(ownerDocument, "touchend", _this._disableDelayedDrag); 5145 on2(ownerDocument, "touchcancel", _this._disableDelayedDrag); 5146 } 5147 on2(ownerDocument, "mousemove", _this._delayedDragTouchMoveHandler); 5148 on2(ownerDocument, "touchmove", _this._delayedDragTouchMoveHandler); 5149 options.supportPointer && on2(ownerDocument, "pointermove", _this._delayedDragTouchMoveHandler); 5150 _this._dragStartTimer = setTimeout(dragStartFn, options.delay); 5151 } else { 5152 dragStartFn(); 5153 } 5154 } 5155 }, 5156 _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(e) { 5157 var touch = e.touches ? e.touches[0] : e; 5158 if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { 5159 this._disableDelayedDrag(); 5160 } 5161 }, 5162 _disableDelayedDrag: function _disableDelayedDrag() { 5163 dragEl && _disableDraggable(dragEl); 5164 clearTimeout(this._dragStartTimer); 5165 this._disableDelayedDragEvents(); 5166 }, 5167 _disableDelayedDragEvents: function _disableDelayedDragEvents() { 5168 var ownerDocument = this.el.ownerDocument; 5169 off(ownerDocument, "mouseup", this._disableDelayedDrag); 5170 off(ownerDocument, "touchend", this._disableDelayedDrag); 5171 off(ownerDocument, "touchcancel", this._disableDelayedDrag); 5172 off(ownerDocument, "pointerup", this._disableDelayedDrag); 5173 off(ownerDocument, "pointercancel", this._disableDelayedDrag); 5174 off(ownerDocument, "mousemove", this._delayedDragTouchMoveHandler); 5175 off(ownerDocument, "touchmove", this._delayedDragTouchMoveHandler); 5176 off(ownerDocument, "pointermove", this._delayedDragTouchMoveHandler); 5177 }, 5178 _triggerDragStart: function _triggerDragStart(evt, touch) { 5179 touch = touch || evt.pointerType == "touch" && evt; 5180 if (!this.nativeDraggable || touch) { 5181 if (this.options.supportPointer) { 5182 on2(document, "pointermove", this._onTouchMove); 5183 } else if (touch) { 5184 on2(document, "touchmove", this._onTouchMove); 5185 } else { 5186 on2(document, "mousemove", this._onTouchMove); 5187 } 5188 } else { 5189 on2(dragEl, "dragend", this); 5190 on2(rootEl, "dragstart", this._onDragStart); 5191 } 5192 try { 5193 if (document.selection) { 5194 _nextTick(function() { 5195 document.selection.empty(); 5196 }); 5197 } else { 5198 window.getSelection().removeAllRanges(); 5199 } 5200 } catch (err) { 5201 } 5202 }, 5203 _dragStarted: function _dragStarted(fallback, evt) { 5204 awaitingDragStarted = false; 5205 if (rootEl && dragEl) { 5206 pluginEvent2("dragStarted", this, { 5207 evt 5208 }); 5209 if (this.nativeDraggable) { 5210 on2(document, "dragover", _checkOutsideTargetEl); 5211 } 5212 var options = this.options; 5213 !fallback && toggleClass(dragEl, options.dragClass, false); 5214 toggleClass(dragEl, options.ghostClass, true); 5215 Sortable.active = this; 5216 fallback && this._appendGhost(); 5217 _dispatchEvent({ 5218 sortable: this, 5219 name: "start", 5220 originalEvent: evt 5221 }); 5222 } else { 5223 this._nulling(); 5224 } 5225 }, 5226 _emulateDragOver: function _emulateDragOver() { 5227 if (touchEvt) { 5228 this._lastX = touchEvt.clientX; 5229 this._lastY = touchEvt.clientY; 5230 _hideGhostForTarget(); 5231 var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); 5232 var parent = target; 5233 while (target && target.shadowRoot) { 5234 target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); 5235 if (target === parent) break; 5236 parent = target; 5237 } 5238 dragEl.parentNode[expando]._isOutsideThisEl(target); 5239 if (parent) { 5240 do { 5241 if (parent[expando]) { 5242 var inserted = void 0; 5243 inserted = parent[expando]._onDragOver({ 5244 clientX: touchEvt.clientX, 5245 clientY: touchEvt.clientY, 5246 target, 5247 rootEl: parent 5248 }); 5249 if (inserted && !this.options.dragoverBubble) { 5250 break; 5251 } 5252 } 5253 target = parent; 5254 } while (parent = getParentOrHost(parent)); 5255 } 5256 _unhideGhostForTarget(); 5257 } 5258 }, 5259 _onTouchMove: function _onTouchMove(evt) { 5260 if (tapEvt) { 5261 var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = ghostEl && matrix(ghostEl, true), scaleX = ghostEl && ghostMatrix && ghostMatrix.a, scaleY = ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); 5262 if (!Sortable.active && !awaitingDragStarted) { 5263 if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { 5264 return; 5265 } 5266 this._onDragStart(evt, true); 5267 } 5268 if (ghostEl) { 5269 if (ghostMatrix) { 5270 ghostMatrix.e += dx - (lastDx || 0); 5271 ghostMatrix.f += dy - (lastDy || 0); 5272 } else { 5273 ghostMatrix = { 5274 a: 1, 5275 b: 0, 5276 c: 0, 5277 d: 1, 5278 e: dx, 5279 f: dy 5280 }; 5281 } 5282 var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); 5283 css(ghostEl, "webkitTransform", cssMatrix); 5284 css(ghostEl, "mozTransform", cssMatrix); 5285 css(ghostEl, "msTransform", cssMatrix); 5286 css(ghostEl, "transform", cssMatrix); 5287 lastDx = dx; 5288 lastDy = dy; 5289 touchEvt = touch; 5290 } 5291 evt.cancelable && evt.preventDefault(); 5292 } 5293 }, 5294 _appendGhost: function _appendGhost() { 5295 if (!ghostEl) { 5296 var container = this.options.fallbackOnBody ? document.body : rootEl, rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), options = this.options; 5297 if (PositionGhostAbsolutely) { 5298 ghostRelativeParent = container; 5299 while (css(ghostRelativeParent, "position") === "static" && css(ghostRelativeParent, "transform") === "none" && ghostRelativeParent !== document) { 5300 ghostRelativeParent = ghostRelativeParent.parentNode; 5301 } 5302 if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { 5303 if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement(); 5304 rect.top += ghostRelativeParent.scrollTop; 5305 rect.left += ghostRelativeParent.scrollLeft; 5306 } else { 5307 ghostRelativeParent = getWindowScrollingElement(); 5308 } 5309 ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); 5310 } 5311 ghostEl = dragEl.cloneNode(true); 5312 toggleClass(ghostEl, options.ghostClass, false); 5313 toggleClass(ghostEl, options.fallbackClass, true); 5314 toggleClass(ghostEl, options.dragClass, true); 5315 css(ghostEl, "transition", ""); 5316 css(ghostEl, "transform", ""); 5317 css(ghostEl, "box-sizing", "border-box"); 5318 css(ghostEl, "margin", 0); 5319 css(ghostEl, "top", rect.top); 5320 css(ghostEl, "left", rect.left); 5321 css(ghostEl, "width", rect.width); 5322 css(ghostEl, "height", rect.height); 5323 css(ghostEl, "opacity", "0.8"); 5324 css(ghostEl, "position", PositionGhostAbsolutely ? "absolute" : "fixed"); 5325 css(ghostEl, "zIndex", "100000"); 5326 css(ghostEl, "pointerEvents", "none"); 5327 Sortable.ghost = ghostEl; 5328 container.appendChild(ghostEl); 5329 css(ghostEl, "transform-origin", tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + "% " + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + "%"); 5330 } 5331 }, 5332 _onDragStart: function _onDragStart(evt, fallback) { 5333 var _this = this; 5334 var dataTransfer = evt.dataTransfer; 5335 var options = _this.options; 5336 pluginEvent2("dragStart", this, { 5337 evt 5338 }); 5339 if (Sortable.eventCanceled) { 5340 this._onDrop(); 5341 return; 5342 } 5343 pluginEvent2("setupClone", this); 5344 if (!Sortable.eventCanceled) { 5345 cloneEl = clone2(dragEl); 5346 cloneEl.removeAttribute("id"); 5347 cloneEl.draggable = false; 5348 cloneEl.style["will-change"] = ""; 5349 this._hideClone(); 5350 toggleClass(cloneEl, this.options.chosenClass, false); 5351 Sortable.clone = cloneEl; 5352 } 5353 _this.cloneId = _nextTick(function() { 5354 pluginEvent2("clone", _this); 5355 if (Sortable.eventCanceled) return; 5356 if (!_this.options.removeCloneOnHide) { 5357 rootEl.insertBefore(cloneEl, dragEl); 5358 } 5359 _this._hideClone(); 5360 _dispatchEvent({ 5361 sortable: _this, 5362 name: "clone" 5363 }); 5364 }); 5365 !fallback && toggleClass(dragEl, options.dragClass, true); 5366 if (fallback) { 5367 ignoreNextClick = true; 5368 _this._loopId = setInterval(_this._emulateDragOver, 50); 5369 } else { 5370 off(document, "mouseup", _this._onDrop); 5371 off(document, "touchend", _this._onDrop); 5372 off(document, "touchcancel", _this._onDrop); 5373 if (dataTransfer) { 5374 dataTransfer.effectAllowed = "move"; 5375 options.setData && options.setData.call(_this, dataTransfer, dragEl); 5376 } 5377 on2(document, "drop", _this); 5378 css(dragEl, "transform", "translateZ(0)"); 5379 } 5380 awaitingDragStarted = true; 5381 _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); 5382 on2(document, "selectstart", _this); 5383 moved = true; 5384 window.getSelection().removeAllRanges(); 5385 if (Safari) { 5386 css(document.body, "user-select", "none"); 5387 } 5388 }, 5389 // Returns true - if no further action is needed (either inserted or another condition) 5390 _onDragOver: function _onDragOver(evt) { 5391 var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = Sortable.active, isOwner = activeGroup === group, canSort = options.sort, fromSortable = putSortable || activeSortable, vertical, _this = this, completedFired = false; 5392 if (_silent) return; 5393 function dragOverEvent(name, extra) { 5394 pluginEvent2(name, _this, _objectSpread2({ 5395 evt, 5396 isOwner, 5397 axis: vertical ? "vertical" : "horizontal", 5398 revert, 5399 dragRect, 5400 targetRect, 5401 canSort, 5402 fromSortable, 5403 target, 5404 completed, 5405 onMove: function onMove(target2, after2) { 5406 return _onMove(rootEl, el, dragEl, dragRect, target2, getRect(target2), evt, after2); 5407 }, 5408 changed 5409 }, extra)); 5410 } 5411 function capture() { 5412 dragOverEvent("dragOverAnimationCapture"); 5413 _this.captureAnimationState(); 5414 if (_this !== fromSortable) { 5415 fromSortable.captureAnimationState(); 5416 } 5417 } 5418 function completed(insertion) { 5419 dragOverEvent("dragOverCompleted", { 5420 insertion 5421 }); 5422 if (insertion) { 5423 if (isOwner) { 5424 activeSortable._hideClone(); 5425 } else { 5426 activeSortable._showClone(_this); 5427 } 5428 if (_this !== fromSortable) { 5429 toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); 5430 toggleClass(dragEl, options.ghostClass, true); 5431 } 5432 if (putSortable !== _this && _this !== Sortable.active) { 5433 putSortable = _this; 5434 } else if (_this === Sortable.active && putSortable) { 5435 putSortable = null; 5436 } 5437 if (fromSortable === _this) { 5438 _this._ignoreWhileAnimating = target; 5439 } 5440 _this.animateAll(function() { 5441 dragOverEvent("dragOverAnimationComplete"); 5442 _this._ignoreWhileAnimating = null; 5443 }); 5444 if (_this !== fromSortable) { 5445 fromSortable.animateAll(); 5446 fromSortable._ignoreWhileAnimating = null; 5447 } 5448 } 5449 if (target === dragEl && !dragEl.animated || target === el && !target.animated) { 5450 lastTarget = null; 5451 } 5452 if (!options.dragoverBubble && !evt.rootEl && target !== document) { 5453 dragEl.parentNode[expando]._isOutsideThisEl(evt.target); 5454 !insertion && nearestEmptyInsertDetectEvent(evt); 5455 } 5456 !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); 5457 return completedFired = true; 5458 } 5459 function changed() { 5460 newIndex = index(dragEl); 5461 newDraggableIndex = index(dragEl, options.draggable); 5462 _dispatchEvent({ 5463 sortable: _this, 5464 name: "change", 5465 toEl: el, 5466 newIndex, 5467 newDraggableIndex, 5468 originalEvent: evt 5469 }); 5470 } 5471 if (evt.preventDefault !== void 0) { 5472 evt.cancelable && evt.preventDefault(); 5473 } 5474 target = closest(target, options.draggable, el, true); 5475 dragOverEvent("dragOver"); 5476 if (Sortable.eventCanceled) return completedFired; 5477 if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { 5478 return completed(false); 5479 } 5480 ignoreNextClick = false; 5481 if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { 5482 vertical = this._getDirection(evt, target) === "vertical"; 5483 dragRect = getRect(dragEl); 5484 dragOverEvent("dragOverValid"); 5485 if (Sortable.eventCanceled) return completedFired; 5486 if (revert) { 5487 parentEl = rootEl; 5488 capture(); 5489 this._hideClone(); 5490 dragOverEvent("revert"); 5491 if (!Sortable.eventCanceled) { 5492 if (nextEl) { 5493 rootEl.insertBefore(dragEl, nextEl); 5494 } else { 5495 rootEl.appendChild(dragEl); 5496 } 5497 } 5498 return completed(true); 5499 } 5500 var elLastChild = lastChild(el, options.draggable); 5501 if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { 5502 if (elLastChild === dragEl) { 5503 return completed(false); 5504 } 5505 if (elLastChild && el === evt.target) { 5506 target = elLastChild; 5507 } 5508 if (target) { 5509 targetRect = getRect(target); 5510 } 5511 if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { 5512 capture(); 5513 if (elLastChild && elLastChild.nextSibling) { 5514 el.insertBefore(dragEl, elLastChild.nextSibling); 5515 } else { 5516 el.appendChild(dragEl); 5517 } 5518 parentEl = el; 5519 changed(); 5520 return completed(true); 5521 } 5522 } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) { 5523 var firstChild = getChild(el, 0, options, true); 5524 if (firstChild === dragEl) { 5525 return completed(false); 5526 } 5527 target = firstChild; 5528 targetRect = getRect(target); 5529 if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) { 5530 capture(); 5531 el.insertBefore(dragEl, firstChild); 5532 parentEl = el; 5533 changed(); 5534 return completed(true); 5535 } 5536 } else if (target.parentNode === el) { 5537 targetRect = getRect(target); 5538 var direction = 0, targetBeforeFirstSwap, differentLevel = dragEl.parentNode !== el, differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? "top" : "left", scrolledPastTop = isScrolledPast(target, "top", "top") || isScrolledPast(dragEl, "top", "top"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; 5539 if (lastTarget !== target) { 5540 targetBeforeFirstSwap = targetRect[side1]; 5541 pastFirstInvertThresh = false; 5542 isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; 5543 } 5544 direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); 5545 var sibling; 5546 if (direction !== 0) { 5547 var dragIndex = index(dragEl); 5548 do { 5549 dragIndex -= direction; 5550 sibling = parentEl.children[dragIndex]; 5551 } while (sibling && (css(sibling, "display") === "none" || sibling === ghostEl)); 5552 } 5553 if (direction === 0 || sibling === target) { 5554 return completed(false); 5555 } 5556 lastTarget = target; 5557 lastDirection = direction; 5558 var nextSibling = target.nextElementSibling, after = false; 5559 after = direction === 1; 5560 var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); 5561 if (moveVector !== false) { 5562 if (moveVector === 1 || moveVector === -1) { 5563 after = moveVector === 1; 5564 } 5565 _silent = true; 5566 setTimeout(_unsilent, 30); 5567 capture(); 5568 if (after && !nextSibling) { 5569 el.appendChild(dragEl); 5570 } else { 5571 target.parentNode.insertBefore(dragEl, after ? nextSibling : target); 5572 } 5573 if (scrolledPastTop) { 5574 scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); 5575 } 5576 parentEl = dragEl.parentNode; 5577 if (targetBeforeFirstSwap !== void 0 && !isCircumstantialInvert) { 5578 targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); 5579 } 5580 changed(); 5581 return completed(true); 5582 } 5583 } 5584 if (el.contains(dragEl)) { 5585 return completed(false); 5586 } 5587 } 5588 return false; 5589 }, 5590 _ignoreWhileAnimating: null, 5591 _offMoveEvents: function _offMoveEvents() { 5592 off(document, "mousemove", this._onTouchMove); 5593 off(document, "touchmove", this._onTouchMove); 5594 off(document, "pointermove", this._onTouchMove); 5595 off(document, "dragover", nearestEmptyInsertDetectEvent); 5596 off(document, "mousemove", nearestEmptyInsertDetectEvent); 5597 off(document, "touchmove", nearestEmptyInsertDetectEvent); 5598 }, 5599 _offUpEvents: function _offUpEvents() { 5600 var ownerDocument = this.el.ownerDocument; 5601 off(ownerDocument, "mouseup", this._onDrop); 5602 off(ownerDocument, "touchend", this._onDrop); 5603 off(ownerDocument, "pointerup", this._onDrop); 5604 off(ownerDocument, "pointercancel", this._onDrop); 5605 off(ownerDocument, "touchcancel", this._onDrop); 5606 off(document, "selectstart", this); 5607 }, 5608 _onDrop: function _onDrop(evt) { 5609 var el = this.el, options = this.options; 5610 newIndex = index(dragEl); 5611 newDraggableIndex = index(dragEl, options.draggable); 5612 pluginEvent2("drop", this, { 5613 evt 5614 }); 5615 parentEl = dragEl && dragEl.parentNode; 5616 newIndex = index(dragEl); 5617 newDraggableIndex = index(dragEl, options.draggable); 5618 if (Sortable.eventCanceled) { 5619 this._nulling(); 5620 return; 5621 } 5622 awaitingDragStarted = false; 5623 isCircumstantialInvert = false; 5624 pastFirstInvertThresh = false; 5625 clearInterval(this._loopId); 5626 clearTimeout(this._dragStartTimer); 5627 _cancelNextTick(this.cloneId); 5628 _cancelNextTick(this._dragStartId); 5629 if (this.nativeDraggable) { 5630 off(document, "drop", this); 5631 off(el, "dragstart", this._onDragStart); 5632 } 5633 this._offMoveEvents(); 5634 this._offUpEvents(); 5635 if (Safari) { 5636 css(document.body, "user-select", ""); 5637 } 5638 css(dragEl, "transform", ""); 5639 if (evt) { 5640 if (moved) { 5641 evt.cancelable && evt.preventDefault(); 5642 !options.dropBubble && evt.stopPropagation(); 5643 } 5644 ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); 5645 if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== "clone") { 5646 cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); 5647 } 5648 if (dragEl) { 5649 if (this.nativeDraggable) { 5650 off(dragEl, "dragend", this); 5651 } 5652 _disableDraggable(dragEl); 5653 dragEl.style["will-change"] = ""; 5654 if (moved && !awaitingDragStarted) { 5655 toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); 5656 } 5657 toggleClass(dragEl, this.options.chosenClass, false); 5658 _dispatchEvent({ 5659 sortable: this, 5660 name: "unchoose", 5661 toEl: parentEl, 5662 newIndex: null, 5663 newDraggableIndex: null, 5664 originalEvent: evt 5665 }); 5666 if (rootEl !== parentEl) { 5667 if (newIndex >= 0) { 5668 _dispatchEvent({ 5669 rootEl: parentEl, 5670 name: "add", 5671 toEl: parentEl, 5672 fromEl: rootEl, 5673 originalEvent: evt 5674 }); 5675 _dispatchEvent({ 5676 sortable: this, 5677 name: "remove", 5678 toEl: parentEl, 5679 originalEvent: evt 5680 }); 5681 _dispatchEvent({ 5682 rootEl: parentEl, 5683 name: "sort", 5684 toEl: parentEl, 5685 fromEl: rootEl, 5686 originalEvent: evt 5687 }); 5688 _dispatchEvent({ 5689 sortable: this, 5690 name: "sort", 5691 toEl: parentEl, 5692 originalEvent: evt 5693 }); 5694 } 5695 putSortable && putSortable.save(); 5696 } else { 5697 if (newIndex !== oldIndex) { 5698 if (newIndex >= 0) { 5699 _dispatchEvent({ 5700 sortable: this, 5701 name: "update", 5702 toEl: parentEl, 5703 originalEvent: evt 5704 }); 5705 _dispatchEvent({ 5706 sortable: this, 5707 name: "sort", 5708 toEl: parentEl, 5709 originalEvent: evt 5710 }); 5711 } 5712 } 5713 } 5714 if (Sortable.active) { 5715 if (newIndex == null || newIndex === -1) { 5716 newIndex = oldIndex; 5717 newDraggableIndex = oldDraggableIndex; 5718 } 5719 _dispatchEvent({ 5720 sortable: this, 5721 name: "end", 5722 toEl: parentEl, 5723 originalEvent: evt 5724 }); 5725 this.save(); 5726 } 5727 } 5728 } 5729 this._nulling(); 5730 }, 5731 _nulling: function _nulling() { 5732 pluginEvent2("nulling", this); 5733 rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null; 5734 var el = this.el; 5735 savedInputChecked.forEach(function(checkEl) { 5736 if (el.contains(checkEl)) { 5737 checkEl.checked = true; 5738 } 5739 }); 5740 savedInputChecked.length = lastDx = lastDy = 0; 5741 }, 5742 handleEvent: function handleEvent(evt) { 5743 switch (evt.type) { 5744 case "drop": 5745 case "dragend": 5746 this._onDrop(evt); 5747 break; 5748 case "dragenter": 5749 case "dragover": 5750 if (dragEl) { 5751 this._onDragOver(evt); 5752 _globalDragOver(evt); 5753 } 5754 break; 5755 case "selectstart": 5756 evt.preventDefault(); 5757 break; 5758 } 5759 }, 5760 /** 5761 * Serializes the item into an array of string. 5762 * @returns {String[]} 5763 */ 5764 toArray: function toArray() { 5765 var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options; 5766 for (; i < n; i++) { 5767 el = children[i]; 5768 if (closest(el, options.draggable, this.el, false)) { 5769 order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); 5770 } 5771 } 5772 return order; 5773 }, 5774 /** 5775 * Sorts the elements according to the array. 5776 * @param {String[]} order order of the items 5777 */ 5778 sort: function sort(order, useAnimation) { 5779 var items = {}, rootEl2 = this.el; 5780 this.toArray().forEach(function(id, i) { 5781 var el = rootEl2.children[i]; 5782 if (closest(el, this.options.draggable, rootEl2, false)) { 5783 items[id] = el; 5784 } 5785 }, this); 5786 useAnimation && this.captureAnimationState(); 5787 order.forEach(function(id) { 5788 if (items[id]) { 5789 rootEl2.removeChild(items[id]); 5790 rootEl2.appendChild(items[id]); 5791 } 5792 }); 5793 useAnimation && this.animateAll(); 5794 }, 5795 /** 5796 * Save the current sorting 5797 */ 5798 save: function save() { 5799 var store2 = this.options.store; 5800 store2 && store2.set && store2.set(this); 5801 }, 5802 /** 5803 * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. 5804 * @param {HTMLElement} el 5805 * @param {String} [selector] default: `options.draggable` 5806 * @returns {HTMLElement|null} 5807 */ 5808 closest: function closest$1(el, selector) { 5809 return closest(el, selector || this.options.draggable, this.el, false); 5810 }, 5811 /** 5812 * Set/get option 5813 * @param {string} name 5814 * @param {*} [value] 5815 * @returns {*} 5816 */ 5817 option: function option(name, value) { 5818 var options = this.options; 5819 if (value === void 0) { 5820 return options[name]; 5821 } else { 5822 var modifiedValue = PluginManager.modifyOption(this, name, value); 5823 if (typeof modifiedValue !== "undefined") { 5824 options[name] = modifiedValue; 5825 } else { 5826 options[name] = value; 5827 } 5828 if (name === "group") { 5829 _prepareGroup(options); 5830 } 5831 } 5832 }, 5833 /** 5834 * Destroy 5835 */ 5836 destroy: function destroy() { 5837 pluginEvent2("destroy", this); 5838 var el = this.el; 5839 el[expando] = null; 5840 off(el, "mousedown", this._onTapStart); 5841 off(el, "touchstart", this._onTapStart); 5842 off(el, "pointerdown", this._onTapStart); 5843 if (this.nativeDraggable) { 5844 off(el, "dragover", this); 5845 off(el, "dragenter", this); 5846 } 5847 Array.prototype.forEach.call(el.querySelectorAll("[draggable]"), function(el2) { 5848 el2.removeAttribute("draggable"); 5849 }); 5850 this._onDrop(); 5851 this._disableDelayedDragEvents(); 5852 sortables.splice(sortables.indexOf(this.el), 1); 5853 this.el = el = null; 5854 }, 5855 _hideClone: function _hideClone() { 5856 if (!cloneHidden) { 5857 pluginEvent2("hideClone", this); 5858 if (Sortable.eventCanceled) return; 5859 css(cloneEl, "display", "none"); 5860 if (this.options.removeCloneOnHide && cloneEl.parentNode) { 5861 cloneEl.parentNode.removeChild(cloneEl); 5862 } 5863 cloneHidden = true; 5864 } 5865 }, 5866 _showClone: function _showClone(putSortable2) { 5867 if (putSortable2.lastPutMode !== "clone") { 5868 this._hideClone(); 5869 return; 5870 } 5871 if (cloneHidden) { 5872 pluginEvent2("showClone", this); 5873 if (Sortable.eventCanceled) return; 5874 if (dragEl.parentNode == rootEl && !this.options.group.revertClone) { 5875 rootEl.insertBefore(cloneEl, dragEl); 5876 } else if (nextEl) { 5877 rootEl.insertBefore(cloneEl, nextEl); 5878 } else { 5879 rootEl.appendChild(cloneEl); 5880 } 5881 if (this.options.group.revertClone) { 5882 this.animate(dragEl, cloneEl); 5883 } 5884 css(cloneEl, "display", ""); 5885 cloneHidden = false; 5886 } 5887 } 5888 }; 5889 function _globalDragOver(evt) { 5890 if (evt.dataTransfer) { 5891 evt.dataTransfer.dropEffect = "move"; 5892 } 5893 evt.cancelable && evt.preventDefault(); 5894 } 5895 function _onMove(fromEl, toEl, dragEl2, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { 5896 var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal; 5897 if (window.CustomEvent && !IE11OrLess && !Edge) { 5898 evt = new CustomEvent("move", { 5899 bubbles: true, 5900 cancelable: true 5901 }); 5902 } else { 5903 evt = document.createEvent("Event"); 5904 evt.initEvent("move", true, true); 5905 } 5906 evt.to = toEl; 5907 evt.from = fromEl; 5908 evt.dragged = dragEl2; 5909 evt.draggedRect = dragRect; 5910 evt.related = targetEl || toEl; 5911 evt.relatedRect = targetRect || getRect(toEl); 5912 evt.willInsertAfter = willInsertAfter; 5913 evt.originalEvent = originalEvent; 5914 fromEl.dispatchEvent(evt); 5915 if (onMoveFn) { 5916 retVal = onMoveFn.call(sortable, evt, originalEvent); 5917 } 5918 return retVal; 5919 } 5920 function _disableDraggable(el) { 5921 el.draggable = false; 5922 } 5923 function _unsilent() { 5924 _silent = false; 5925 } 5926 function _ghostIsFirst(evt, vertical, sortable) { 5927 var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true)); 5928 var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl); 5929 var spacer = 10; 5930 return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left; 5931 } 5932 function _ghostIsLast(evt, vertical, sortable) { 5933 var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable)); 5934 var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl); 5935 var spacer = 10; 5936 return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top; 5937 } 5938 function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { 5939 var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false; 5940 if (!invertSwap) { 5941 if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { 5942 if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) { 5943 pastFirstInvertThresh = true; 5944 } 5945 if (!pastFirstInvertThresh) { 5946 if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance : mouseOnAxis > targetS2 - targetMoveDistance) { 5947 return -lastDirection; 5948 } 5949 } else { 5950 invert = true; 5951 } 5952 } else { 5953 if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) { 5954 return _getInsertDirection(target); 5955 } 5956 } 5957 } 5958 invert = invert || invertSwap; 5959 if (invert) { 5960 if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { 5961 return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; 5962 } 5963 } 5964 return 0; 5965 } 5966 function _getInsertDirection(target) { 5967 if (index(dragEl) < index(target)) { 5968 return 1; 5969 } else { 5970 return -1; 5971 } 5972 } 5973 function _generateId(el) { 5974 var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0; 5975 while (i--) { 5976 sum += str.charCodeAt(i); 5977 } 5978 return sum.toString(36); 5979 } 5980 function _saveInputCheckedState(root) { 5981 savedInputChecked.length = 0; 5982 var inputs = root.getElementsByTagName("input"); 5983 var idx = inputs.length; 5984 while (idx--) { 5985 var el = inputs[idx]; 5986 el.checked && savedInputChecked.push(el); 5987 } 5988 } 5989 function _nextTick(fn) { 5990 return setTimeout(fn, 0); 5991 } 5992 function _cancelNextTick(id) { 5993 return clearTimeout(id); 5994 } 5995 if (documentExists) { 5996 on2(document, "touchmove", function(evt) { 5997 if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { 5998 evt.preventDefault(); 5999 } 6000 }); 6001 } 6002 Sortable.utils = { 6003 on: on2, 6004 off, 6005 css, 6006 find, 6007 is: function is(el, selector) { 6008 return !!closest(el, selector, el, false); 6009 }, 6010 extend, 6011 throttle: throttle2, 6012 closest, 6013 toggleClass, 6014 clone: clone2, 6015 index, 6016 nextTick: _nextTick, 6017 cancelNextTick: _cancelNextTick, 6018 detectDirection: _detectDirection, 6019 getChild, 6020 expando 6021 }; 6022 Sortable.get = function(element) { 6023 return element[expando]; 6024 }; 6025 Sortable.mount = function() { 6026 for (var _len = arguments.length, plugins2 = new Array(_len), _key = 0; _key < _len; _key++) { 6027 plugins2[_key] = arguments[_key]; 6028 } 6029 if (plugins2[0].constructor === Array) plugins2 = plugins2[0]; 6030 plugins2.forEach(function(plugin2) { 6031 if (!plugin2.prototype || !plugin2.prototype.constructor) { 6032 throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin2)); 6033 } 6034 if (plugin2.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin2.utils); 6035 PluginManager.mount(plugin2); 6036 }); 6037 }; 6038 Sortable.create = function(el, options) { 6039 return new Sortable(el, options); 6040 }; 6041 Sortable.version = version; 6042 var autoScrolls = []; 6043 var scrollEl; 6044 var scrollRootEl; 6045 var scrolling = false; 6046 var lastAutoScrollX; 6047 var lastAutoScrollY; 6048 var touchEvt$1; 6049 var pointerElemChangedInterval; 6050 function AutoScrollPlugin() { 6051 function AutoScroll() { 6052 this.defaults = { 6053 scroll: true, 6054 forceAutoScrollFallback: false, 6055 scrollSensitivity: 30, 6056 scrollSpeed: 10, 6057 bubbleScroll: true 6058 }; 6059 for (var fn in this) { 6060 if (fn.charAt(0) === "_" && typeof this[fn] === "function") { 6061 this[fn] = this[fn].bind(this); 6062 } 6063 } 6064 } 6065 AutoScroll.prototype = { 6066 dragStarted: function dragStarted(_ref) { 6067 var originalEvent = _ref.originalEvent; 6068 if (this.sortable.nativeDraggable) { 6069 on2(document, "dragover", this._handleAutoScroll); 6070 } else { 6071 if (this.options.supportPointer) { 6072 on2(document, "pointermove", this._handleFallbackAutoScroll); 6073 } else if (originalEvent.touches) { 6074 on2(document, "touchmove", this._handleFallbackAutoScroll); 6075 } else { 6076 on2(document, "mousemove", this._handleFallbackAutoScroll); 6077 } 6078 } 6079 }, 6080 dragOverCompleted: function dragOverCompleted(_ref2) { 6081 var originalEvent = _ref2.originalEvent; 6082 if (!this.options.dragOverBubble && !originalEvent.rootEl) { 6083 this._handleAutoScroll(originalEvent); 6084 } 6085 }, 6086 drop: function drop3() { 6087 if (this.sortable.nativeDraggable) { 6088 off(document, "dragover", this._handleAutoScroll); 6089 } else { 6090 off(document, "pointermove", this._handleFallbackAutoScroll); 6091 off(document, "touchmove", this._handleFallbackAutoScroll); 6092 off(document, "mousemove", this._handleFallbackAutoScroll); 6093 } 6094 clearPointerElemChangedInterval(); 6095 clearAutoScrolls(); 6096 cancelThrottle(); 6097 }, 6098 nulling: function nulling() { 6099 touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null; 6100 autoScrolls.length = 0; 6101 }, 6102 _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) { 6103 this._handleAutoScroll(evt, true); 6104 }, 6105 _handleAutoScroll: function _handleAutoScroll(evt, fallback) { 6106 var _this = this; 6107 var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y); 6108 touchEvt$1 = evt; 6109 if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) { 6110 autoScroll(evt, this.options, elem, fallback); 6111 var ogElemScroller = getParentAutoScrollElement(elem, true); 6112 if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { 6113 pointerElemChangedInterval && clearPointerElemChangedInterval(); 6114 pointerElemChangedInterval = setInterval(function() { 6115 var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); 6116 if (newElem !== ogElemScroller) { 6117 ogElemScroller = newElem; 6118 clearAutoScrolls(); 6119 } 6120 autoScroll(evt, _this.options, newElem, fallback); 6121 }, 10); 6122 lastAutoScrollX = x; 6123 lastAutoScrollY = y; 6124 } 6125 } else { 6126 if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) { 6127 clearAutoScrolls(); 6128 return; 6129 } 6130 autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); 6131 } 6132 } 6133 }; 6134 return _extends(AutoScroll, { 6135 pluginName: "scroll", 6136 initializeByDefault: true 6137 }); 6138 } 6139 function clearAutoScrolls() { 6140 autoScrolls.forEach(function(autoScroll2) { 6141 clearInterval(autoScroll2.pid); 6142 }); 6143 autoScrolls = []; 6144 } 6145 function clearPointerElemChangedInterval() { 6146 clearInterval(pointerElemChangedInterval); 6147 } 6148 var autoScroll = throttle2(function(evt, options, rootEl2, isFallback) { 6149 if (!options.scroll) return; 6150 var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = getWindowScrollingElement(); 6151 var scrollThisInstance = false, scrollCustomFn; 6152 if (scrollRootEl !== rootEl2) { 6153 scrollRootEl = rootEl2; 6154 clearAutoScrolls(); 6155 scrollEl = options.scroll; 6156 scrollCustomFn = options.scrollFn; 6157 if (scrollEl === true) { 6158 scrollEl = getParentAutoScrollElement(rootEl2, true); 6159 } 6160 } 6161 var layersOut = 0; 6162 var currentParent = scrollEl; 6163 do { 6164 var el = currentParent, rect = getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop; 6165 if (el === winScroller) { 6166 canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll" || elCSS.overflowX === "visible"); 6167 canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll" || elCSS.overflowY === "visible"); 6168 } else { 6169 canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll"); 6170 canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll"); 6171 } 6172 var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); 6173 var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); 6174 if (!autoScrolls[layersOut]) { 6175 for (var i = 0; i <= layersOut; i++) { 6176 if (!autoScrolls[i]) { 6177 autoScrolls[i] = {}; 6178 } 6179 } 6180 } 6181 if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { 6182 autoScrolls[layersOut].el = el; 6183 autoScrolls[layersOut].vx = vx; 6184 autoScrolls[layersOut].vy = vy; 6185 clearInterval(autoScrolls[layersOut].pid); 6186 if (vx != 0 || vy != 0) { 6187 scrollThisInstance = true; 6188 autoScrolls[layersOut].pid = setInterval(function() { 6189 if (isFallback && this.layer === 0) { 6190 Sortable.active._onTouchMove(touchEvt$1); 6191 } 6192 var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; 6193 var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; 6194 if (typeof scrollCustomFn === "function") { 6195 if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== "continue") { 6196 return; 6197 } 6198 } 6199 scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); 6200 }.bind({ 6201 layer: layersOut 6202 }), 24); 6203 } 6204 } 6205 layersOut++; 6206 } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); 6207 scrolling = scrollThisInstance; 6208 }, 30); 6209 var drop = function drop2(_ref) { 6210 var originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, dragEl2 = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget; 6211 if (!originalEvent) return; 6212 var toSortable = putSortable2 || activeSortable; 6213 hideGhostForTarget(); 6214 var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; 6215 var target = document.elementFromPoint(touch.clientX, touch.clientY); 6216 unhideGhostForTarget(); 6217 if (toSortable && !toSortable.el.contains(target)) { 6218 dispatchSortableEvent("spill"); 6219 this.onSpill({ 6220 dragEl: dragEl2, 6221 putSortable: putSortable2 6222 }); 6223 } 6224 }; 6225 function Revert() { 6226 } 6227 Revert.prototype = { 6228 startIndex: null, 6229 dragStart: function dragStart(_ref2) { 6230 var oldDraggableIndex2 = _ref2.oldDraggableIndex; 6231 this.startIndex = oldDraggableIndex2; 6232 }, 6233 onSpill: function onSpill(_ref3) { 6234 var dragEl2 = _ref3.dragEl, putSortable2 = _ref3.putSortable; 6235 this.sortable.captureAnimationState(); 6236 if (putSortable2) { 6237 putSortable2.captureAnimationState(); 6238 } 6239 var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); 6240 if (nextSibling) { 6241 this.sortable.el.insertBefore(dragEl2, nextSibling); 6242 } else { 6243 this.sortable.el.appendChild(dragEl2); 6244 } 6245 this.sortable.animateAll(); 6246 if (putSortable2) { 6247 putSortable2.animateAll(); 6248 } 6249 }, 6250 drop 6251 }; 6252 _extends(Revert, { 6253 pluginName: "revertOnSpill" 6254 }); 6255 function Remove() { 6256 } 6257 Remove.prototype = { 6258 onSpill: function onSpill2(_ref4) { 6259 var dragEl2 = _ref4.dragEl, putSortable2 = _ref4.putSortable; 6260 var parentSortable = putSortable2 || this.sortable; 6261 parentSortable.captureAnimationState(); 6262 dragEl2.parentNode && dragEl2.parentNode.removeChild(dragEl2); 6263 parentSortable.animateAll(); 6264 }, 6265 drop 6266 }; 6267 _extends(Remove, { 6268 pluginName: "removeOnSpill" 6269 }); 6270 Sortable.mount(new AutoScrollPlugin()); 6271 Sortable.mount(Remove, Revert); 6272 var sortable_esm_default = Sortable; 6273 6274
6274// Web/src/scripts/pronouncement-builder/index.ts 6275 var isEmpty = (value) => !value || value.trim() === ""; 6276 var matchesSearch = (text, searchTerm) => isEmpty(searchTerm) || text.toLowerCase().includes(searchTerm.trim().toLowerCase()); 6277 var matchesCategory = (categories, selectedCategory) => isEmpty(selectedCategory) || categories?.some((cat) => cat.id.toString() === selectedCategory) === true; 6278 var matchesFilter = (itemValue, selectedValue) => isEmpty(selectedValue) || itemValue === selectedValue; 6279 var createLanguagePreference = (isCymraeg) => isCymraeg ? "Cymraeg" : "English"; 6280 var isValidAgeGroup = (ageGroup) => ageGroup === "Adult" || ageGroup === "Youth"; 6281 var createFilterOptions = (options) => ({ 6282 searchTerm: options.searchTerm || "", 6283 categoryId: options.categoryId || "", 6284 ageGroup: isValidAgeGroup(options.ageGroup || "") ? options.ageGroup : void 0, 6285 language: createLanguagePreference(options.cymraegSelected || false) 6286 }); 6287 var textareaElement = null; 6288 var decodeHTMLEntities = (html) => { 6289 if (!html) return ""; 6290 if (!textareaElement) { 6291 textareaElement = document.createElement("textarea"); 6292 } 6293 textareaElement.innerHTML = html; 6294 return textareaElement.value; 6295 }; 6296 var hasActiveFilters = (options) => !isEmpty(options.searchTerm) || !isEmpty(options.categoryId) || !!options.ageGroup; 6297 var filterPronouncements = (pronouncements, options) => pronouncements.filter( 6298 (pronouncement) => matchesSearch(pronouncement.name, options.searchTerm || "") && matchesCategory(pronouncement.categories, options.categoryId || "") && matchesFilter(pronouncement.ageGroup, options.ageGroup || "") && matchesFilter(pronouncement.language, options.language || "") 6299 ); 6300 var sortOrderChanged = (event) => event.oldIndex !== void 0 && event.newIndex !== void 0 && event.oldIndex !== event.newIndex; 6301 var createPronouncementBuilder = (initialData = []) => { 6302 const pronouncements = Array.isArray(initialData) ? initialData : []; 6303 return { 6304 pronouncements, 6305 selectedIds: [], 6306 searchTerm: "", 6307 selectedCategory: "", 6308 selectedAgeGroup: "", 6309 cymraegLanguageSelected: false, 6310 sortableInstance: null, 6311 initSortable() { 6312 this.initializeSortable(); 6313 }, 6314 initializeSortable() { 6315 const selectedPronouncementsElement = document.getElementById( 6316 "selected-pronouncements" 6317 ); 6318 if (!selectedPronouncementsElement) return; 6319 this.sortableInstance = sortable_esm_default.create(selectedPronouncementsElement, { 6320 animation: 150, 6321 ghostClass: "opacity-100", 6322 onEnd: (evt) => { 6323 if (sortOrderChanged(evt)) { 6324 this.reorderPronouncements(evt.oldIndex, evt.newIndex); 6325 } 6326 } 6327 }); 6328 }, 6329 reorderPronouncements(oldIndex2, newIndex2) { 6330 if (oldIndex2 === newIndex2) return; 6331 const newIds = [...this.selectedIds]; 6332 const [movedItem] = newIds.splice(oldIndex2, 1); 6333 newIds.splice(newIndex2, 0, movedItem); 6334 this.selectedIds = []; 6335 setTimeout(() => { 6336 this.selectedIds = [...newIds]; 6337 }, 0); 6338 }, 6339 get hasSelectedPronouncements() { 6340 return this.selectedIds.length > 0; 6341 }, 6342 get hasActiveFilters() { 6343 return hasActiveFilters(this.getFilterOptions()); 6344 }, 6345 get selectedPronouncements() { 6346 return this.selectedIds.map((id) => this.pronouncements.find((p) => p.id === id)).filter(Boolean); 6347 }, 6348 get filteredPronouncements() { 6349 return filterPronouncements(this.pronouncements, this.getFilterOptions()); 6350 }, 6351 get noResultsVisible() { 6352 return this.hasActiveFilters && this.filteredPronouncements.length === 0; 6353 }, 6354 get showCymraeg() { 6355 return this.cymraegLanguageSelected == true; 6356 }, 6357 getFilterOptions() { 6358 return createFilterOptions({ 6359 searchTerm: this.searchTerm, 6360 categoryId: this.selectedCategory, 6361 ageGroup: this.selectedAgeGroup, 6362 cymraegSelected: this.cymraegLanguageSelected 6363 }); 6364 }, 6365 addPronouncement(selection) { 6366 const id = typeof selection === "string" ? selection : selection.id; 6367 if (!this.selectedIds.includes(id)) { 6368 this.selectedIds.push(id); 6369 } 6370 }, 6371 removePronouncement(selection) { 6372 const id = typeof selection === "string" ? selection : selection.id; 6373 this.selectedIds = this.selectedIds.filter( 6374 (selectedId) => selectedId !== id 6375 ); 6376 }, 6377 moveUp(index2) { 6378 if (index2 > 0) { 6379 [this.selectedIds[index2 - 1], this.selectedIds[index2]] = [ 6380 this.selectedIds[index2], 6381 this.selectedIds[index2 - 1] 6382 ]; 6383 } 6384 }, 6385 moveDown(index2) { 6386 if (index2 < this.selectedIds.length - 1) { 6387 [this.selectedIds[index2], this.selectedIds[index2 + 1]] = [ 6388 this.selectedIds[index2 + 1], 6389 this.selectedIds[index2] 6390 ]; 6391 } 6392 }, 6393 clearAll() { 6394 this.selectedIds = []; 6395 }, 6396 isSelected(selection) { 6397 const id = typeof selection === "string" ? selection : selection.id; 6398 return this.selectedIds.includes(id); 6399 }, 6400 canMoveUp(index2) { 6401 return this.selectedIds.length > 1 && index2 > 0; 6402 }, 6403 canMoveDown(index2) { 6404 return this.selectedIds.length > 1 && index2 < this.selectedIds.length - 1; 6405 }, 6406 selectAgeGroup(ageGroup) { 6407 const validAgeGroup = isValidAgeGroup(ageGroup) ? ageGroup : ""; 6408 if (this.selectedAgeGroup === validAgeGroup) { 6409 return; 6410 } 6411 this.selectedAgeGroup = validAgeGroup; 6412 this.clearAll(); 6413 }, 6414 decodeHTMLEntities 6415 }; 6416 }; 6417 var setupPronouncementBuilder = () => { 6418 document.addEventListener("alpine:init", () => { 6419 module_default.data("pronouncementBuilder", createPronouncementBuilder); 6420 }); 6421 }; 6422 6423
6423// Web/src/scripts/fines-calculator/constants.ts 6424 var INCOME_MULTIPLIERS = { 6425 weekly: 1, 6426 "bi-weekly": 2, 6427 monthly: 4.332755633, 6428 yearly: 52.08333333 6429 }; 6430 var PLEA_REDUCTIONS = { 6431 third: 1 / 3, 6432 // 33% -> 1/3 reduction 6433 quarter: 1 / 4, 6434 // 25% -> 1/4 reduction 6435 tenth: 1 / 10, 6436 // 10% -> 1/10 reduction 6437 none: 0 6438 // 0% -> No reduction 6439 }; 6440 var SENTENCE_LIMITS = { 6441 "level-1": 200, 6442 "level-2": 500, 6443 "level-3": 1e3, 6444 "level-4": 2500 6445 }; 6446 var BAND_DEFAULTS = { 6447 "band-a": "50", 6448 "band-b": "100", 6449 "band-c": "150", 6450 "band-d": "250", 6451 "band-e": "400", 6452 "band-f": "600", 6453 "no-fine": "0" 6454 }; 6455 var SURCHARGE_DESCRIPTIONS = { 6456 youthConditionalDischarge: "Conditional Discharge (offender under 18 at date of offence)", 6457 adultConditionalDischargeAndYouthOrders: "Conditional Discharge (offender 18 or over at date of offence). A fine, Youth Rehabilitation Order, Referral Order or Community Order (offender under 18 at date of offence)", 6458 youthSuspendedSentence: "Suspended Sentence Order or Detention and Training Order (offender under 18 at date of offence)", 6459 adultCommunityOrder: "Community Order (offender 18 or over at date of offence)", 6460 adultImprisonmentShort: "Imprisonment or Suspended Sentence Order 6 months or less (offender 18 or over at date of offence)", 6461 adultImprisonmentLong: "Imprisonment or Suspended Sentence Order over 6 months (offender 18 or over at date of offence)" 6462 }; 6463 var PERCENTAGE_SURCHARGE_LIMITS = { 6464 "10%": { 6465 before2020: { min: 32, max: 181 }, 6466 "2020to2022": { min: 34, max: 190 } 6467 }, 6468 "40%": { 6469 after2022: { min: 0, max: 2e3 } 6470 } 6471 }; 6472 var FIXED_SURCHARGE_MAPPINGS = { 6473 before2020: { 6474 16: "youthConditionalDischarge", 6475 21: "adultConditionalDischargeAndYouthOrders", 6476 32: "youthSuspendedSentence", 6477 90: "adultCommunityOrder", 6478 122: "adultImprisonmentShort", 6479 149: "adultImprisonmentLong" 6480 }, 6481 "2020to2022": { 6482 17: "youthConditionalDischarge", 6483 22: "adultConditionalDischargeAndYouthOrders", 6484 34: "youthSuspendedSentence", 6485 95: "adultCommunityOrder", 6486 128: "adultImprisonmentShort", 6487 156: "adultImprisonmentLong" 6488 }, 6489 after2022: { 6490 20: "youthConditionalDischarge", 6491 26: "adultConditionalDischargeAndYouthOrders", 6492 41: "youthSuspendedSentence", 6493 114: "adultCommunityOrder", 6494 154: "adultImprisonmentShort", 6495 187: "adultImprisonmentLong" 6496 } 6497 }; 6498 var MAX_OFFENCES = 6; 6499 var PERCENTAGE_10_LIMITS = { 6500 before2020: { min: 32, max: 181 }, 6501 "2020to2022": { min: 34, max: 190 }, 6502 after2022: { min: 0, max: 2e3 } 6503 }; 6504 var PERCENTAGE_40_MAX = 2e3; 6505 6506
6506// Web/src/scripts/fines-calculator/utils.ts 6507 var formatCurrency = (amount) => { 6508 return new Intl.NumberFormat("en-GB", { 6509 style: "currency", 6510 currency: "GBP", 6511 minimumFractionDigits: 2, 6512 maximumFractionDigits: 2 6513 }).format(amount || 0); 6514 }; 6515 var formatGuiltyPlea = (plea) => { 6516 const pleaNum = Number(plea); 6517 switch (pleaNum) { 6518 case 33: 6519 return "1/3"; 6520 case 25: 6521 return "1/4"; 6522 case 10: 6523 return "1/10"; 6524 case 0: 6525 return "No plea"; 6526 default: 6527 return `${pleaNum}%`; 6528 } 6529 }; 6530 var parseFloatOrZero = (value) => parseFloat(value) || 0; 6531 var isValidFixedSurchargeAmount = (amount, surchargeType) => { 6532 return amount in FIXED_SURCHARGE_MAPPINGS[surchargeType]; 6533 }; 6534 var isPercentageSurcharge = (value) => { 6535 return value === "10%" || value === "40%"; 6536 }; 6537 var isValidSurchargeAmount = (value) => { 6538 const num = parseFloat(value); 6539 return !isNaN(num) && num >= 0; 6540 }; 6541 6542
6542// Web/src/scripts/fines-calculator/calculations.ts 6543 var getIncomeRangeMultiplier = (period) => { 6544 return INCOME_MULTIPLIERS[period] ?? 1; 6545 }; 6546 var formatSurchargeDescription = (limits) => { 6547 const minText = limits.min > 0 ? `\xA3${limits.min}` : "no minimum"; 6548 return `Minimum amount of ${minText} and a maximum amount of \xA3${limits.max} (offender 18 or over at date of offence)`; 6549 }; 6550 var getPercentageSurchargeDescription = (surchargeValue, surchargeType) => { 6551 if (surchargeValue === "10%") { 6552 const limits = PERCENTAGE_SURCHARGE_LIMITS["10%"][surchargeType]; 6553 return limits ? formatSurchargeDescription(limits) : ""; 6554 } 6555 if (surchargeValue === "40%" && surchargeType === "after2022") { 6556 const limits = PERCENTAGE_SURCHARGE_LIMITS["40%"]["after2022"]; 6557 return formatSurchargeDescription(limits); 6558 } 6559 return ""; 6560 }; 6561 var getFixedSurchargeDescription = (surchargeValue, surchargeType) => { 6562 if (!isValidSurchargeAmount(surchargeValue)) return ""; 6563 const surchargeAmount = parseFloat(surchargeValue); 6564 if (!isValidFixedSurchargeAmount(surchargeAmount, surchargeType)) return ""; 6565 const descriptionKey = FIXED_SURCHARGE_MAPPINGS[surchargeType][surchargeAmount]; 6566 return SURCHARGE_DESCRIPTIONS[descriptionKey]; 6567 }; 6568 var getSurchargeDescription = (surchargeValue, surchargeType) => { 6569 if (!surchargeValue || surchargeValue === "0") return ""; 6570 if (isPercentageSurcharge(surchargeValue)) { 6571 return getPercentageSurchargeDescription(surchargeValue, surchargeType); 6572 } 6573 return getFixedSurchargeDescription(surchargeValue, surchargeType); 6574 }; 6575 var getBandStartingPointOptions = (band) => { 6576 switch (band) { 6577 case "band-a": 6578 return [ 6579 { value: "20", label: "20%" }, 6580 { value: "25", label: "25%" }, 6581 { value: "30", label: "30%" }, 6582 { value: "35", label: "35%" }, 6583 { value: "40", label: "40%" }, 6584 { value: "45", label: "45%" }, 6585 { value: "50", label: "50%" }, 6586 { value: "55", label: "55%" }, 6587 { value: "60", label: "60%" }, 6588 { value: "65", label: "65%" }, 6589 { value: "70", label: "70%" }, 6590 { value: "75", label: "75%" } 6591 ]; 6592 case "band-b": 6593 return [ 6594 { value: "75", label: "75%" }, 6595 { value: "80", label: "80%" }, 6596 { value: "85", label: "85%" }, 6597 { value: "90", label: "90%" }, 6598 { value: "95", label: "95%" }, 6599 { value: "100", label: "100%" }, 6600 { value: "105", label: "105%" }, 6601 { value: "110", label: "110%" }, 6602 { value: "115", label: "115%" }, 6603 { value: "120", label: "120%" }, 6604 { value: "125", label: "125%" } 6605 ]; 6606 case "band-c": 6607 return [ 6608 { value: "125", label: "125%" }, 6609 { value: "130", label: "130%" }, 6610 { value: "135", label: "135%" }, 6611 { value: "140", label: "140%" }, 6612 { value: "145", label: "145%" }, 6613 { value: "150", label: "150%" }, 6614 { value: "155", label: "155%" }, 6615 { value: "160", label: "160%" }, 6616 { value: "165", label: "165%" }, 6617 { value: "170", label: "170%" }, 6618 { value: "175", label: "175%" } 6619 ]; 6620 case "band-d": 6621 return [ 6622 { value: "200", label: "200%" }, 6623 { value: "210", label: "210%" }, 6624 { value: "220", label: "220%" }, 6625 { value: "230", label: "230%" }, 6626 { value: "240", label: "240%" }, 6627 { value: "250", label: "250%" }, 6628 { value: "260", label: "260%" }, 6629 { value: "270", label: "270%" }, 6630 { value: "280", label: "280%" }, 6631 { value: "290", label: "290%" }, 6632 { value: "300", label: "300%" } 6633 ]; 6634 case "band-e": 6635 return [ 6636 { value: "300", label: "300%" }, 6637 { value: "320", label: "320%" }, 6638 { value: "340", label: "340%" }, 6639 { value: "360", label: "360%" }, 6640 { value: "380", label: "380%" }, 6641 { value: "400", label: "400%" }, 6642 { value: "420", label: "420%" }, 6643 { value: "440", label: "440%" }, 6644 { value: "460", label: "460%" }, 6645 { value: "480", label: "480%" }, 6646 { value: "500", label: "500%" } 6647 ]; 6648 case "band-f": 6649 return [ 6650 { value: "500", label: "500%" }, 6651 { value: "520", label: "520%" }, 6652 { value: "540", label: "540%" }, 6653 { value: "560", label: "560%" }, 6654 { value: "580", label: "580%" }, 6655 { value: "600", label: "600%" }, 6656 { value: "620", label: "620%" }, 6657 { value: "640", label: "640%" }, 6658 { value: "660", label: "660%" }, 6659 { value: "680", label: "680%" }, 6660 { value: "700", label: "700%" } 6661 ]; 6662 default: 6663 return []; 6664 } 6665 }; 6666 var getBandDefaultStartingPoint = (band) => { 6667 return BAND_DEFAULTS[band] ?? "0"; 6668 }; 6669 var getPleaValue = (plea) => { 6670 const pleaMapping = { 6671 33: "third", 6672 // 33% -> 1/3 reduction 6673 25: "quarter", 6674 // 25% -> 1/4 reduction 6675 10: "tenth", 6676 // 10% -> 1/10 reduction 6677 0: "none" 6678 // 0% -> No reduction 6679 }; 6680 const pleaKey = pleaMapping[plea]; 6681 if (pleaKey) { 6682 return PLEA_REDUCTIONS[pleaKey]; 6683 } 6684 return plea / 100; 6685 }; 6686 var applyMaximumSentenceLimit = (fine, maxSentence) => { 6687 if (maxSentence === "custody" || maxSentence === "level-5") return fine;
6688 const limit = SENTENCE_LIMITS[maxSentence]; 6689 return limit ? Math.min(fine, limit) : fine; 6690 }; 6691 var calculateFineForOffence = (offence, income, incomePeriod) => { 6692 if (offence.startingPoint === "no-fine" || !offence.startingPoint) { 6693 return { beforePlea: 0, afterPlea: 0 }; 6694 } 6695 const incomeRangeMultiplier = getIncomeRangeMultiplier(incomePeriod); 6696 let startingPointPercent = 50; 6697 if (offence.startingPointPercent) { 6698 startingPointPercent = parseFloat(offence.startingPointPercent); 6699 } else { 6700 startingPointPercent = parseFloat( 6701 getBandDefaultStartingPoint(offence.startingPoint) 6702 ); 6703 } 6704 const beforePlea = income / incomeRangeMultiplier * startingPointPercent / 100; 6705 const limitedBeforePlea = applyMaximumSentenceLimit( 6706 beforePlea, 6707 offence.maximumSentence 6708 ); 6709 let afterPlea; 6710 const pleaValue = getPleaValue(offence.guiltyPlea); 6711 if (offence.guiltyPlea !== 0) { 6712 afterPlea = limitedBeforePlea - limitedBeforePlea * pleaValue; 6713 } else { 6714 afterPlea = limitedBeforePlea; 6715 } 6716 return { 6717 beforePlea: Math.floor(limitedBeforePlea), 6718 afterPlea: Math.floor(afterPlea) 6719 }; 6720 }; 6721 var calculatePercentageSurcharge = (totalFine, percentage, surchargeType) => { 6722 const rate = percentage === "10%" ? 0.1 : 0.4; 6723 const surchargeAmount = Math.round(totalFine * rate); 6724 if (percentage === "10%") { 6725 const limits = PERCENTAGE_SURCHARGE_LIMITS["10%"][surchargeType]; 6726 if (limits) { 6727 return Math.min(Math.max(surchargeAmount, limits.min), limits.max); 6728 } 6729 } else if (percentage === "40%") { 6730 return Math.min(surchargeAmount, 2e3); 6731 } 6732 return surchargeAmount; 6733 }; 6734 var calculateSurchargeForPeriod = (totalFine, surchargeType, selectedSurcharge) => { 6735 if (isPercentageSurcharge(selectedSurcharge)) { 6736 return calculatePercentageSurcharge( 6737 totalFine, 6738 selectedSurcharge, 6739 surchargeType 6740 ); 6741 } 6742 return parseFloat(selectedSurcharge) || 0; 6743 }; 6744 6745
6745// Web/src/scripts/fines-calculator/index.ts 6746 var getInitialState = () => ({ 6747 income: 120, 6748 incomePeriod: "weekly", 6749 selectedIncomeAmount: "", 6750 offences: [ 6751 { 6752 id: 1, 6753 maximumSentence: "level-5", 6754 startingPoint: "band-a", 6755 startingPointPercent: "50", 6756 guiltyPlea: 33, 6757 compensation: 0 6758 } 6759 ], 6760 activeOffenceId: 1, 6761 surchargeAdded: false, 6762 surchargeType: "after2022", 6763 selectedSurcharge: "", 6764 customSurcharge: 0, 6765 selectedProsecutionCosts: "", 6766 customProsecutionCosts: 0, 6767 tempIncome: 0 6768 }); 6769 var createNewOffence = (existingOffences) => ({ 6770 id: Math.max(...existingOffences.map((o) => o.id)) + 1, 6771 maximumSentence: "level-5", 6772 startingPoint: "band-a", 6773 startingPointPercent: "50", 6774 guiltyPlea: 33, 6775 compensation: 0 6776 }); 6777 var calculateSurcharge = (params) => { 6778 if (!params.selectedSurcharge) { 6779 return params.customSurcharge > 0 ? params.customSurcharge : 0; 6780 } 6781 if (isPercentageSurcharge(params.selectedSurcharge)) { 6782 if (params.selectedSurcharge === "10%") { 6783 const surchargeAmount = Math.round(params.totalFine / 10); 6784 const limits = PERCENTAGE_10_LIMITS[params.surchargeType]; 6785 if (params.surchargeType === "after2022") { 6786 return Math.min(surchargeAmount, limits.max); 6787 } 6788 return Math.min(Math.max(surchargeAmount, limits.min), limits.max); 6789 } 6790 if (params.selectedSurcharge === "40%") { 6791 const surchargeAmount = Math.round(params.totalFine * 40 / 100); 6792 return Math.min(surchargeAmount, PERCENTAGE_40_MAX); 6793 } 6794 } 6795 if (params.customSurcharge > 0) return params.customSurcharge; 6796 return calculateSurchargeForPeriod( 6797 params.totalFine, 6798 params.surchargeType, 6799 params.selectedSurcharge 6800 ); 6801 }; 6802 var calculateResults = (params) => { 6803 let totalFineBeforePlea = 0; 6804 let totalFineAfterPlea = 0; 6805 params.offences.forEach((offence) => { 6806 const fine = calculateFineForOffence( 6807 offence, 6808 Number(params.income), 6809 params.incomePeriod 6810 ); 6811 totalFineBeforePlea += fine.beforePlea; 6812 totalFineAfterPlea += fine.afterPlea; 6813 }); 6814 const totalCompensation = params.offences.reduce( 6815 (sum, offence) => sum + (Number(offence.compensation) || 0), 6816 0 6817 ); 6818 const surcharge = calculateSurcharge({ 6819 totalFine: totalFineAfterPlea, 6820 surchargeType: params.surchargeType, 6821 selectedSurcharge: params.selectedSurcharge, 6822 customSurcharge: params.customSurcharge 6823 }); 6824 const prosecutionCosts = params.customProsecutionCosts > 0 ? Number(params.customProsecutionCosts) : 0; 6825 const total = totalFineAfterPlea + totalCompensation + surcharge + prosecutionCosts; 6826 return { 6827 fineBeforePlea: totalFineBeforePlea, 6828 fineAfterPlea: totalFineAfterPlea, 6829 totalCompensation, 6830 surcharge, 6831 prosecutionCosts, 6832 total 6833 }; 6834 }; 6835 var getNextActiveOffenceId = (removedOffenceId, currentActiveId, offences) => { 6836 if (currentActiveId !== removedOffenceId) return currentActiveId; 6837 const removedIndex = offences.findIndex((o) => o.id === removedOffenceId); 6838 if (removedIndex === 0) { 6839 return offences.find((o) => o.id !== removedOffenceId)?.id || 1; 6840 } 6841 return offences[removedIndex - 1]?.id || 1; 6842 }; 6843 var scrollToCalculator = () => { 6844 scrollToId("fines-calculator"); 6845 }; 6846 var clampValue = (input) => { 6847 if (input.value > input.maxValue) { 6848 return { value: input.maxValue.toString(), hasChanged: true }; 6849 } 6850 if (input.value < input.minValue) { 6851 return { value: input.minValue.toString(), hasChanged: true }; 6852 } 6853 return { value: "", hasChanged: false }; 6854 }; 6855 var updateInputField = (correctedValue) => { 6856 setTimeout(() => { 6857 const activeElement = document.activeElement; 6858 if (activeElement && activeElement.type === "text") { 6859 activeElement.value = correctedValue; 6860 activeElement.dispatchEvent(new Event("input", { bubbles: true })); 6861 } 6862 }, 0); 6863 }; 6864 var createTemplate = (input) => { 6865 const delimiter = "."; 6866 const precision = 2; 6867 const minus = input.startsWith("-") ? "-" : ""; 6868 const strippedInput = input.replace( 6869 new RegExp(`[^0-9\\${delimiter}]`, "g"), 6870 "" 6871 ); 6872 let template = Array.from({ 6873 length: strippedInput.split(delimiter)[0].length 6874 }).fill("9").join(""); 6875 template = `${minus}${template}`; 6876 if (precision > 0 && input.includes(delimiter)) { 6877 template += `${delimiter}${"9".repeat(precision)}`; 6878 } 6879 return template; 6880 }; 6881 function limitedMoney(value, maxValue, minValue) { 6882 if (value === "-" && minValue < 0) return "-"; 6883 if (!value) return ""; 6884 const numericValue = parseFloat(value.replace(/[^\d.-]/g, "")); 6885 if (!isNaN(numericValue)) { 6886 const restrictedNumber = clampValue({ 6887 value: numericValue, 6888 minValue, 6889 maxValue 6890 }); 6891 if (restrictedNumber.hasChanged) { 6892 updateInputField(restrictedNumber.value); 6893 return createTemplate(restrictedNumber.value); 6894 } 6895 } 6896 return createTemplate(value); 6897 } 6898 var createFinesCalculator = () => { 6899 const initialState = getInitialState(); 6900 return { 6901 ...initialState, 6902 get calculatedResults() { 6903 return calculateResults({ 6904 offences: this.offences, 6905 income: Number(this.income), 6906 incomePeriod: this.incomePeriod, 6907 surchargeType: this.surchargeType, 6908 selectedSurcharge: this.selectedSurcharge, 6909 customSurcharge: this.customSurcharge, 6910 customProsecutionCosts: this.customProsecutionCosts 6911 }); 6912 }, 6913 get effectiveSurchargeAmount() { 6914 if (isPercentageSurcharge(this.selectedSurcharge)) { 6915 return calculateSurcharge({ 6916 totalFine: this.calculatedResults.fineAfterPlea, 6917 surchargeType: this.surchargeType, 6918 selectedSurcharge: this.selectedSurcharge, 6919 customSurcharge: this.customSurcharge 6920 }); 6921 } 6922 return this.customSurcharge; 6923 }, 6924 get canAddMoreOffences() { 6925 return this.offences.length < MAX_OFFENCES; 6926 }, 6927 get surchargeDescription() { 6928 if (!this.surchargeAdded || !this.selectedSurcharge) return ""; 6929 return getSurchargeDescription( 6930 this.selectedSurcharge, 6931 this.surchargeType 6932 ); 6933 }, 6934 getBandOptions: (offence) => getBandStartingPointOptions(offence.startingPoint), 6935 onBandChange(offence) { 6936 const defaultPercent = getBandDefaultStartingPoint(offence.startingPoint); 6937 offence.startingPointPercent = defaultPercent !== "0" ? defaultPercent : ""; 6938 }, 6939 hideFineFields: (offence) => offence.startingPoint === "no-fine" || !offence.startingPoint, 6940 calculateFineForOffence(offence) { 6941 const incomeNum = Number(this.income); 6942 if (!Number.isNaN(incomeNum) && incomeNum > 0) { 6943 return calculateFineForOffence(offence, incomeNum, this.incomePeriod); 6944 } else { 6945 return 0; 6946 } 6947 }, 6948 formatStartingPoint(offence) { 6949 if (!offence.startingPoint) return "-"; 6950 const basePoint = offence.startingPoint.replace("-", " ").toUpperCase(); 6951 const percentText = offence.startingPointPercent ? ` (${offence.startingPointPercent}%)` : ""; 6952 return basePoint + percentText; 6953 }, 6954 addOffence() { 6955 if (this.offences.length >= MAX_OFFENCES) return; 6956 const newOffence = createNewOffence(this.offences); 6957 this.offences.push(newOffence); 6958 this.activeOffenceId = newOffence.id; 6959 this.surchargeAdded = false;
6960 setTimeout(() => scrollToId("offences-section"), 50); 6961 }, 6962 removeOffence(offenceId) { 6963 if (this.offences.length <= 1) return; 6964 this.activeOffenceId = getNextActiveOffenceId( 6965 offenceId, 6966 this.activeOffenceId, 6967 this.offences 6968 ); 6969 this.offences = this.offences.filter((o) => o.id !== offenceId); 6970 }, 6971 setActiveOffence(offenceId) { 6972 this.activeOffenceId = typeof offenceId === "string" ? parseInt(offenceId) : offenceId; 6973 setTimeout(() => scrollToId("offences-section"), 50); 6974 }, 6975 addSurcharge() { 6976 this.surchargeAdded = !this.surchargeAdded; 6977 setTimeout(() => scrollToId("surcharge-section"), 50); 6978 }, 6979 startAgain() { 6980 Object.assign(this, getInitialState()); 6981 scrollToCalculator(); 6982 }, 6983 onSurchargeTypeChange() { 6984 this.selectedSurcharge = ""; 6985 this.customSurcharge = 0; 6986 }, 6987 onSurchargeSelectionChange() { 6988 if (!this.selectedSurcharge) { 6989 this.customSurcharge = 0; 6990 return; 6991 } 6992 if (isPercentageSurcharge(this.selectedSurcharge)) { 6993 this.customSurcharge = 0; 6994 } else { 6995 this.customSurcharge = parseFloatOrZero(this.selectedSurcharge); 6996 } 6997 }, 6998 onProsecutionCostsChange() { 6999 this.customProsecutionCosts = this.selectedProsecutionCosts ? parseFloatOrZero(this.selectedProsecutionCosts) : 0; 7000 }, 7001 onIncomeAmountChange() { 7002 this.income = this.selectedIncomeAmount ? parseFloatOrZero(this.selectedIncomeAmount) : 0; 7003 this.selectedIncomeAmount = ""; 7004 }, 7005 selectIncome() { 7006 const incomeNum = Number(this.income); 7007 if (!Number.isNaN(incomeNum) && incomeNum > 0) { 7008 this.tempIncome = incomeNum; 7009 } 7010 this.income = 0; 7011 }, 7012 resetIncomeIfBlank() { 7013 const incomeNum = Number(this.income); 7014 if (Number.isNaN(incomeNum)) { 7015 this.income = this.tempIncome; 7016 } 7017 }, 7018 formatCurrency, 7019 formatGuiltyPlea, 7020 limitedMoney 7021 }; 7022 }; 7023 var setupFinesCalculator = () => { 7024 document.addEventListener("alpine:init", () => { 7025 module_default.data("finesCalculator", createFinesCalculator); 7026 }); 7027 }; 7028 7029
7029// Web/src/scripts/drink-driving-calculator/utils.ts 7030 var addMonths = (date, months) => { 7031 const originalDate = new Date(date); 7032 const originalDay = originalDate.getDate(); 7033 const year = originalDate.getFullYear(); 7034 const targetMonth = originalDate.getMonth() + months; 7035 const result = new Date(year, targetMonth, originalDay); 7036 if (result.getMonth() !== (targetMonth % 12 + 12) % 12) { 7037 return new Date(year, targetMonth + 1, 0); 7038 } 7039 return result; 7040 }; 7041 var subtractMonthsPreservingEndOfMonth = (date, months) => { 7042 const originalDate = new Date(date); 7043 const originalDay = originalDate.getDate(); 7044 const targetYear = originalDate.getFullYear(); 7045 const targetMonth = originalDate.getMonth() - months; 7046 const result = new Date(targetYear, targetMonth, originalDay); 7047 if (result.getMonth() !== (targetMonth % 12 + 12) % 12) { 7048 return new Date(targetYear, targetMonth + 1, 0); 7049 } 7050 return result; 7051 }; 7052 var subtractMonthsClampToMonth = (date, months) => { 7053 const originalDate = new Date(date); 7054 const year = originalDate.getFullYear();
7055 const month = originalDate.getMonth(); 7056 const day = originalDate.getDate(); 7057 const targetMonth = month - months; 7058 const targetYear = year + Math.floor(targetMonth / 12); 7059 const normalizedTargetMonth = (targetMonth % 12 + 12) % 12; 7060 const lastDayOfTargetMonth = new Date( 7061 targetYear, 7062 normalizedTargetMonth + 1, 7063 0 7064 ).getDate(); 7065 const clampedDay = Math.min(day, lastDayOfTargetMonth); 7066 return new Date(targetYear, normalizedTargetMonth, clampedDay); 7067 }; 7068 var addDays = (date, days) => { 7069 const result = new Date(date); 7070 result.setDate(result.getDate() + days); 7071 return result; 7072 }; 7073 var formatDate = (date) => { 7074 const options = { 7075 day: "2-digit", 7076 month: "long", 7077 year: "numeric" 7078 }; 7079 return date.toLocaleDateString("en-GB", options); 7080 }; 7081 7082
7082// Web/src/scripts/drink-driving-calculator/calculations.ts 7083 var calculateLengthOfReduction = (disqualificationPeriod) => { 7084 const periodAsNumber = Number(disqualificationPeriod); 7085 if (periodAsNumber < 12) { 7086 return "No reduction"; 7087 } else if (periodAsNumber === 12) { 7088 return "3 months"; 7089 } else { 7090 return `${periodAsNumber} weeks`; 7091 } 7092 }; 7093 var calculateCustodialExtension = (custodialSentence, custodialDays, custodialWeeks) => { 7094 if (!custodialSentence) { 7095 return 0; 7096 } 7097 const totalDays = Number(custodialDays) + Number(custodialWeeks) * 7; 7098 return Math.ceil(totalDays / 3); 7099 }; 7100 var calculateDates = (disqualificationDate, disqualificationPeriod, custodialData) => { 7101 const periodAsNumber = Number(disqualificationPeriod); 7102 const sentenceDate = new Date(disqualificationDate); 7103 const extensionDays = calculateCustodialExtension( 7104 custodialData.sentence, 7105 custodialData.days, 7106 custodialData.weeks 7107 ); 7108 const disqualificationEndDate = addDays( 7109 addMonths(sentenceDate, periodAsNumber), 7110 -1 7111 ); 7112 const qualifiesForReduction = periodAsNumber >= 12; 7113 const reductionDays = qualifiesForReduction ? 7 * periodAsNumber : 0; 7114 let endDateWithoutCourse = new Date(disqualificationEndDate); 7115 endDateWithoutCourse = addDays(endDateWithoutCourse, extensionDays); 7116 let endDateWithCourse = new Date(disqualificationEndDate); 7117 if (qualifiesForReduction) { 7118 if (periodAsNumber === 12) { 7119 endDateWithCourse = subtractMonthsPreservingEndOfMonth( 7120 disqualificationEndDate, 7121 3 7122 ); 7123 } else { 7124 endDateWithCourse = addDays(endDateWithCourse, -reductionDays); 7125 } 7126 endDateWithCourse = addDays(endDateWithCourse, extensionDays); 7127 } else { 7128 endDateWithCourse = new Date(endDateWithoutCourse); 7129 } 7130 let courseDate = new Date(endDateWithCourse); 7131 if (qualifiesForReduction) { 7132 courseDate = subtractMonthsClampToMonth(courseDate, 2); 7133 } 7134 return { 7135 courseDate, 7136 endDateWithCourse, 7137 endDateWithoutCourse 7138 }; 7139 }; 7140 7141
7141// Web/src/scripts/drink-driving-calculator/index.ts 7142 var setupDrinkDrivingCalculator = () => { 7143 document.addEventListener("alpine:init", () => { 7144 module_default.data("drinkDrivingCalculator", () => { 7145 return { 7146 // Input fields 7147 disqualificationDate: (/* @__PURE__ */ new Date()).toISOString().split("T")[0], 7148 // Today's date in YYYY-MM-DD format 7149 disqualificationPeriod: 12, 7150 custodialSentence: false, 7151 custodialDays: 0, 7152 custodialWeeks: 0, 7153 // Results 7154 results: { 7155 lengthOfReduction: "No reduction", 7156 courseCompletionDate: "", 7157 endDateWithCourse: "", 7158 endDateWithoutCourse: "" 7159 }, 7160 init() { 7161 this.calculateResults(); 7162 }, 7163 resetCalculator() { 7164 this.disqualificationDate = (/* @__PURE__ */ new Date()).toISOString().split("T")[0]; 7165 this.disqualificationPeriod = 12; 7166 this.custodialSentence = false; 7167 this.custodialDays = 0; 7168 this.custodialWeeks = 0; 7169 this.calculateResults(); 7170 }, 7171 calculateResults() { 7172 if (!this.disqualificationDate) { 7173 return; 7174 } 7175 this.results.lengthOfReduction = calculateLengthOfReduction( 7176 this.disqualificationPeriod 7177 ); 7178 const dates = calculateDates( 7179 this.disqualificationDate, 7180 this.disqualificationPeriod, 7181 { 7182 sentence: this.custodialSentence, 7183 days: this.custodialDays, 7184 weeks: this.custodialWeeks 7185 } 7186 ); 7187 if (this.disqualificationPeriod < 12) { 7188 this.results.courseCompletionDate = "Not applicable"; 7189 } else { 7190 this.results.courseCompletionDate = formatDate(dates.courseDate); 7191 } 7192 this.results.endDateWithCourse = formatDate(dates.endDateWithCourse); 7193 this.results.endDateWithoutCourse = formatDate( 7194 dates.endDateWithoutCourse 7195 ); 7196 } 7197 }; 7198 }); 7199 }); 7200 }; 7201 7202
7202// Web/src/scripts/guilty-plea-calculator-days-and-weeks/calculations.ts 7203 var calculateReducedSentence = (sentenceWeeks, sentenceDays, reductionPercentage) => { 7204 const weeks = Number(sentenceWeeks) || 0; 7205 const days = Number(sentenceDays) || 0; 7206 const percentage = Number(reductionPercentage) || 0; 7207 const totalInputDays = weeks * 7 + days; 7208 const reductionFactor = Math.round((1 - percentage / 100) * 1e10) / 1e10; 7209 const resultWeeks = Math.floor(totalInputDays * reductionFactor / 7); 7210 const resultDays = Math.floor( 7211 totalInputDays * reductionFactor - resultWeeks * 7 7212 ); 7213 const totalDays = Math.floor(totalInputDays * reductionFactor); 7214 return { 7215 resultWeeks, 7216 resultDays, 7217 totalDays 7218 }; 7219 }; 7220 7221
7221// Web/src/scripts/guilty-plea-calculator-days-and-weeks/index.ts 7222 var setupGuiltyPleaCalculatorDaysAndWeeks = () => { 7223 document.addEventListener("alpine:init", () => { 7224 module_default.data( 7225 "guiltyPleaCalculatorDaysAndWeeks", 7226 () => { 7227 return { 7228 sentenceWeeks: 0, 7229 sentenceDays: 0, 7230 reductionPercentage: 0, 7231 selectedPreset: "", 7232 results: { 7233 resultWeeks: 0, 7234 resultDays: 0, 7235 totalDays: 0 7236 }, 7237 init() { 7238 this.calculateResults(); 7239 }, 7240 resetCalculator() { 7241 this.sentenceWeeks = 0; 7242 this.sentenceDays = 0; 7243 this.reductionPercentage = 0; 7244 this.selectedPreset = ""; 7245 this.calculateResults(); 7246 }, 7247 calculateResults() { 7248 const { resultWeeks, resultDays, totalDays } = calculateReducedSentence( 7249 this.sentenceWeeks, 7250 this.sentenceDays, 7251 this.reductionPercentage 7252 ); 7253 this.results.resultWeeks = resultWeeks; 7254 this.results.resultDays = resultDays; 7255 this.results.totalDays = totalDays; 7256 } 7257 }; 7258 } 7259 ); 7260 }); 7261 }; 7262 7263
7263// Web/src/scripts/guilty-plea-calculator-months-and-years/calculations.ts 7264 var calculateReducedSentence2 = (sentenceYears, sentenceMonths, reductionPercentage) => { 7265 const years = Number(sentenceYears) || 0; 7266 const months = Number(sentenceMonths) || 0; 7267 const percentage = Number(reductionPercentage) || 0; 7268 const totalInputMonths = years * 12 + months; 7269 const reductionFactor = 1 - percentage / 100; 7270 const resultYears = Math.floor(totalInputMonths * reductionFactor / 12); 7271 const resultMonths = Math.floor( 7272 totalInputMonths * reductionFactor - resultYears * 12 7273 ); 7274 const totalMonths = Math.floor(totalInputMonths * reductionFactor); 7275 return { 7276 resultYears, 7277 resultMonths, 7278 totalMonths 7279 }; 7280 }; 7281 7282
7282// Web/src/scripts/guilty-plea-calculator-months-and-years/index.ts 7283 var setupGuiltyPleaCalculatorMonthsAndYears = () => { 7284 document.addEventListener("alpine:init", () => { 7285 module_default.data( 7286 "guiltyPleaCalculatorMonthsAndYears", 7287 () => { 7288 return { 7289 sentenceYears: 0, 7290 sentenceMonths: 0, 7291 reductionPercentage: 0, 7292 selectedPreset: "", 7293 results: { 7294 resultYears: 0, 7295 resultMonths: 0, 7296 totalMonths: 0 7297 }, 7298 init() { 7299 this.calculateResults(); 7300 }, 7301 resetCalculator() { 7302 this.sentenceYears = 0; 7303 this.sentenceMonths = 0; 7304 this.reductionPercentage = 0; 7305 this.selectedPreset = ""; 7306 this.calculateResults(); 7307 }, 7308 calculateResults() { 7309 const { resultYears, resultMonths, totalMonths } = calculateReducedSentence2( 7310 this.sentenceYears, 7311 this.sentenceMonths, 7312 this.reductionPercentage 7313 ); 7314 this.results.resultYears = resultYears; 7315 this.results.resultMonths = resultMonths; 7316 this.results.totalMonths = totalMonths; 7317 } 7318 }; 7319 } 7320 ); 7321 }); 7322 }; 7323 7324
7324// Web/src/scripts/modals/index.ts 7325 var setupModals = () => { 7326 const modalContainer = document.querySelector( 7327 "[data-modal-container]" 7328 ); 7329 const modalTitle = document.getElementById("modal-title"); 7330 const modalContent = document.getElementById("modal-content"); 7331 const closeButton = document.querySelector( 7332 "[data-modal-close]" 7333 ); 7334 if (!modalContainer) return; 7335 if (!modalTitle) return; 7336 if (!modalContent) return; 7337 if (!closeButton) return; 7338 modalContainer.setAttribute("tabindex", "-1"); 7339 const modalContentElements = document.querySelectorAll( 7340 "[data-modal-content]" 7341 ); 7342 modalContentElements.forEach((element) => { 7343 element.classList.add("hidden"); 7344 }); 7345 let lastFocusedElement = null; 7346 let originalParent = null; 7347 let originalNextSibling = null; 7348 const getFocusableElements = (container) => { 7349 const focusableSelectors = [ 7350 "a[href]", 7351 "button:not([disabled])", 7352 "textarea:not([disabled])", 7353 "input:not([disabled])", 7354 "select:not([disabled])", 7355 '[tabindex]:not([tabindex="-1"])' 7356 ].join(", "); 7357 return Array.from( 7358 container.querySelectorAll(focusableSelectors) 7359 ); 7360 }; 7361 const focusFirstElement = () => { 7362 closeButton.focus(); 7363 }; 7364 const handleTabBoundary = (firstElement, lastElement, event, isBackward) => { 7365 const activeElement = document.activeElement; 7366 const shouldWrap = isBackward ? activeElement === firstElement : activeElement === lastElement; 7367 if (shouldWrap) { 7368 event.preventDefault(); 7369 const targetElement = isBackward ? lastElement : firstElement; 7370 targetElement?.focus(); 7371 } 7372 }; 7373 const trapFocus = (modal, event) => { 7374 if (event.key !== "Tab") return; 7375 const focusableElements = getFocusableElements(modal); 7376 if (focusableElements.length === 0) { 7377 event.preventDefault(); 7378 return; 7379 } 7380 const firstElement = focusableElements[0]; 7381 const lastElement = focusableElements[focusableElements.length - 1]; 7382 if (focusableElements.length === 1) { 7383 event.preventDefault(); 7384 firstElement.focus(); 7385 return; 7386 } 7387 handleTabBoundary(firstElement, lastElement, event, event.shiftKey); 7388 }; 7389 const openModal = (modalId, triggerElement) => { 7390 const contentElement = document.querySelector( 7391 `[data-modal-content="${modalId}"]` 7392 ); 7393 if (!contentElement) return; 7394 lastFocusedElement = triggerElement; 7395 const titleText = contentElement.getAttribute("data-modal-title") || "Modal"; 7396 modalTitle.textContent = titleText; 7397 modalTitle.id = `${modalId}-title`; 7398 originalParent = contentElement.parentElement; 7399 originalNextSibling = contentElement.nextElementSibling; 7400 modalContent.appendChild(contentElement); 7401 contentElement.classList.remove("hidden"); 7402 modalContainer.setAttribute("aria-labelledby", `${modalId}-title`); 7403 modalContainer.setAttribute("aria-hidden", "false"); 7404 modalContainer.classList.remove("hidden"); 7405 requestAnimationFrame(() => { 7406 focusFirstElement(); 7407 }); 7408 document.body.classList.add("overflow-hidden"); 7409 }; 7410 const closeModal = () => { 7411 modalContainer.classList.add("hidden"); 7412 modalContainer.setAttribute("aria-hidden", "true"); 7413 modalContainer.removeAttribute("aria-labelledby"); 7414 modalTitle.textContent = ""; 7415 modalTitle.id = ""; 7416 if (originalParent && modalContent.firstElementChild) { 7417 const movedElement = modalContent.firstElementChild; 7418 movedElement.classList.add("hidden"); 7419 if (originalNextSibling) { 7420 originalParent.insertBefore(movedElement, originalNextSibling); 7421 } else { 7422 originalParent.appendChild(movedElement); 7423 } 7424 } 7425 originalParent = null; 7426 originalNextSibling = null; 7427 if (lastFocusedElement) { 7428 requestAnimationFrame(() => { 7429 lastFocusedElement?.focus(); 7430 }); 7431 } 7432 lastFocusedElement = null; 7433 document.body.classList.remove("overflow-hidden"); 7434 }; 7435 document.addEventListener("click", (event) => { 7436 const target = event.target; 7437 const modalTrigger = target.closest("[data-modal-trigger]"); 7438 if (modalTrigger) { 7439 const modalId = modalTrigger.getAttribute("data-modal-trigger"); 7440 if (modalId) { 7441 event.preventDefault(); 7442 openModal(modalId, modalTrigger); 7443 } 7444 } 7445 }); 7446 closeButton.addEventListener("click", closeModal); 7447 modalContainer.addEventListener("click", (event) => { 7448 if (event.target === modalContainer) { 7449 closeModal(); 7450 } 7451 }); 7452 modalContainer.addEventListener("keydown", (event) => {
7453 const keyEvent = event; 7454 if (keyEvent.key === "Escape") { 7455 closeModal(); 7456 } else { 7457 trapFocus(modalContainer, keyEvent); 7458 } 7459 }); 7460 window.openModal = (modalContentId) => { 7461 const tempTrigger = document.activeElement || document.body; 7462 openModal(modalContentId, tempTrigger); 7463 }; 7464 }; 7465 var triggerModal = (modalContentId) => { 7466 const tempTrigger = document.activeElement || document.body; 7467 if (window.openModal) { 7468 window.openModal(modalContentId); 7469 } else { 7470 console.warn( 7471 "Modal system not initialized. Make sure setupModals() has been called." 7472 ); 7473 } 7474 }; 7475 7476
vendor: 5,458 bytes, lines 7476-7633
7476// node_modules/@alpinejs/mask/dist/module.esm.js 7477 function src_default2(Alpine2) { 7478 Alpine2.directive("mask", (el, { value, expression }, { effect: effect3, evaluateLater: evaluateLater2, cleanup: cleanup2 }) => { 7479 let templateFn = () => expression; 7480 let lastInputValue = ""; 7481 queueMicrotask(() => { 7482 if (["function", "dynamic"].includes(value)) { 7483 let evaluator = evaluateLater2(expression); 7484 effect3(() => { 7485 templateFn = (input) => { 7486 let result; 7487 Alpine2.dontAutoEvaluateFunctions(() => { 7488 evaluator((value2) => { 7489 result = typeof value2 === "function" ? value2(input) : value2; 7490 }, { scope: { 7491 // These are "magics" we'll make available to the x-mask:function: 7492 "$input": input, 7493 "$money": formatMoney.bind({ el }) 7494 } }); 7495 }); 7496 return result; 7497 }; 7498 processInputValue(el, false); 7499 }); 7500 } else { 7501 processInputValue(el, false); 7502 } 7503 if (el._x_model) { 7504 if (el._x_model.get() !== el.value) { 7505 if (!(el._x_model.get() === null && el.value === "")) { 7506 el._x_model.set(el.value); 7507 } 7508 } 7509 let updater = el._x_forceModelUpdate; 7510 el._x_forceModelUpdate = (value2) => { 7511 value2 = String(value2); 7512 let template = templateFn(value2); 7513 if (template && template !== "false") { 7514 value2 = formatInput(template, value2); 7515 } 7516 lastInputValue = value2; 7517 updater(value2); 7518 el._x_model.set(value2); 7519 }; 7520 } 7521 }); 7522 const controller = new AbortController(); 7523 cleanup2(() => { 7524 controller.abort(); 7525 }); 7526 el.addEventListener("input", () => processInputValue(el), { 7527 signal: controller.signal, 7528 // Setting this as a capture phase listener to ensure it runs 7529 // before wire:model or x-model added as a latent binding... 7530 capture: true 7531 }); 7532 el.addEventListener("blur", () => processInputValue(el, false), { signal: controller.signal }); 7533 function processInputValue(el2, shouldRestoreCursor = true) { 7534 let input = el2.value; 7535 let template = templateFn(input); 7536 if (!template || template === "false") 7537 return false; 7538 if (lastInputValue.length - el2.value.length === 1) { 7539 return lastInputValue = el2.value; 7540 } 7541 let setInput = () => { 7542 lastInputValue = el2.value = formatInput(template, input); 7543 }; 7544 if (shouldRestoreCursor) { 7545 restoreCursorPosition(el2, template, () => { 7546 setInput(); 7547 }); 7548 } else { 7549 setInput(); 7550 } 7551 } 7552 }).before("model"); 7553 } 7554 function restoreCursorPosition(el, template, callback) { 7555 let cursorPosition = el.selectionStart; 7556 let unformattedValue = el.value; 7557 callback(); 7558 let beforeLeftOfCursorBeforeFormatting = unformattedValue.slice(0, cursorPosition); 7559 let newPosition = formatInput( 7560 template, 7561 beforeLeftOfCursorBeforeFormatting 7562 ).length; 7563 el.setSelectionRange(newPosition, newPosition); 7564 } 7565 var regexes = { 7566 "9": /[0-9]/, 7567 "a": /[a-zA-Z]/, 7568 "*": /[a-zA-Z0-9]/ 7569 }; 7570 function formatInput(template, input) { 7571 let templateMark = 0; 7572 let inputMark = 0; 7573 let output = ""; 7574 while (templateMark < template.length && inputMark < input.length) { 7575 let templateChar = template[templateMark]; 7576 let inputChar = input[inputMark]; 7577 if (templateChar in regexes) { 7578 if (regexes[templateChar].test(inputChar)) { 7579 output += inputChar; 7580 templateMark++; 7581 } 7582 inputMark++; 7583 } else { 7584 output += templateChar; 7585 templateMark++; 7586 if (templateChar === input[inputMark]) 7587 inputMark++; 7588 } 7589 } 7590 return output; 7591 } 7592 function formatMoney(input, delimiter = ".", thousands, precision = 2) { 7593 if (input === "-") 7594 return "-"; 7595 if (/^\D+$/.test(input)) 7596 return "9"; 7597 if (thousands === null || thousands === void 0) { 7598 thousands = delimiter === "," ? "." : ","; 7599 } 7600 let addThousands = (input2, thousands2) => { 7601 let output = ""; 7602 let counter = 0; 7603 for (let i = input2.length - 1; i >= 0; i--) { 7604 if (input2[i] === thousands2) 7605 continue; 7606 if (counter === 3) { 7607 output = input2[i] + thousands2 + output; 7608 counter = 0; 7609 } else { 7610 output = input2[i] + output; 7611 } 7612 counter++; 7613 } 7614 return output; 7615 }; 7616 let minus = input.startsWith("-") ? "-" : ""; 7617 let strippedInput = input.replaceAll(new RegExp(`[^0-9\\${delimiter}]`, "g"), ""); 7618 let template = Array.from({ length: strippedInput.split(delimiter)[0].length }).fill("9").join(""); 7619 template = `${minus}${addThousands(template, thousands)}`; 7620 if (precision > 0 && input.includes(delimiter)) 7621 template += `${delimiter}` + "9".repeat(precision); 7622 queueMicrotask(() => { 7623 if (this.el.value.endsWith(delimiter)) 7624 return; 7625 if (this.el.value[this.el.selectionStart - 1] === delimiter) { 7626 this.el.setSelectionRange(this.el.selectionStart - 1, this.el.selectionStart - 1); 7627 } 7628 }); 7629 return template; 7630 } 7631 var module_default2 = src_default2; 7632 7633
7633// Web/src/scripts/toggles/dropdowns.ts 7634 var closeOtherDropdowns = (currentButton, allButtons, config) => { 7635 allButtons.forEach((otherButton) => { 7636 if (otherButton !== currentButton) { 7637 const otherMenu = otherButton.nextElementSibling; 7638 const otherIcon = otherButton.querySelector(config.iconSelector); 7639 const otherParentElement = config.parentSelector ? otherButton.closest(config.parentSelector) : null; 7640 otherButton.setAttribute("aria-expanded", "false"); 7641 otherIcon?.classList.remove("rotate-180"); 7642 otherMenu?.classList.remove("flex"); 7643 otherMenu?.classList.add("hidden"); 7644 otherParentElement?.classList.remove("bg-white/10"); 7645 } 7646 }); 7647 }; 7648 var toggleDropdown = (elements, isExpanded) => { 7649 elements.button.setAttribute("aria-expanded", (!isExpanded).toString()); 7650 elements.icon?.classList.toggle("rotate-180", !isExpanded); 7651 elements.menu.classList.toggle("flex", !isExpanded); 7652 elements.menu.classList.toggle("hidden", isExpanded); 7653 elements.parentElement?.classList.toggle("bg-white/10", !isExpanded); 7654 }; 7655 var setupDropdownType = (selector, config) => { 7656 const dropdownButtons = document.querySelectorAll(selector); 7657 dropdownButtons.forEach((button) => { 7658 const dropdownMenu = button.nextElementSibling; 7659 if (dropdownMenu) { 7660 button.addEventListener("click", () => { 7661 const isExpanded = button.getAttribute("aria-expanded") === "true"; 7662 const dropdownIcon = button.querySelector(config.iconSelector); 7663 const parentElement = config.parentSelector ? button.closest(config.parentSelector) : null; 7664 closeOtherDropdowns(button, dropdownButtons, config); 7665 const elements = { 7666 button, 7667 menu: dropdownMenu, 7668 icon: dropdownIcon, 7669 parentElement 7670 }; 7671 toggleDropdown(elements, isExpanded); 7672 if (button.id === "site-search-toggle") { 7673 const searchInput = document.getElementById( 7674 "site-search" 7675 ); 7676 if (searchInput) { 7677 searchInput.focus(); 7678 searchInput.setSelectionRange( 7679 searchInput.value.length, 7680 searchInput.value.length 7681 ); 7682 } 7683 } 7684 }); 7685 } 7686 }); 7687 }; 7688 var setupNavigationDropdowns = () => { 7689 const config = { 7690 iconSelector: "[data-nav-dropdown-menu-icon]", 7691 parentSelector: "[data-nav-dropdown]" 7692 }; 7693 setupDropdownType("[data-nav-dropdown-toggle]", config); 7694 }; 7695 var setupDropdowns = () => { 7696 const config = { 7697 iconSelector: "[data-dropdown-menu-icon]" 7698 }; 7699 setupDropdownType("[data-dropdown-toggle]", config); 7700 }; 7701 var setupMobileNavToggle = () => { 7702 const toggleButton = document.querySelector("[data-mobile-nav-toggle]"); 7703 const navMenu = document.querySelector("[data-mobile-nav-menu]"); 7704 const navOpenIcon = document.querySelector("[data-mobile-nav-open-icon]"); 7705 const navCloseIcon = document.querySelector("[data-mobile-nav-close-icon]"); 7706 const areNavElementsPresent = toggleButton && navMenu && navOpenIcon && navCloseIcon; 7707 if (areNavElementsPresent) { 7708 toggleButton.addEventListener("click", () => { 7709 const isExpanded = toggleButton.getAttribute("aria-expanded") === "true"; 7710 toggleButton.setAttribute("aria-expanded", (!isExpanded).toString()); 7711 navMenu.classList.toggle("hidden", isExpanded); 7712 navOpenIcon.classList.toggle("hidden", !isExpanded); 7713 navCloseIcon.classList.toggle("hidden", isExpanded); 7714 document.body.classList.toggle("md:overflow-hidden", !isExpanded); 7715 document.body.classList.toggle("xl:overflow-auto", !isExpanded); 7716 }); 7717 } 7718 }; 7719 7720
7720// Web/src/scripts/toggles/accordions.ts 7721 var toggleAccordionPanel = (toggle, panel, isExpanded) => { 7722 toggle.setAttribute("aria-expanded", (!isExpanded).toString()); 7723 if (isExpanded) { 7724 panel.classList.add("hidden"); 7725 panel.setAttribute("aria-hidden", "true"); 7726 } else { 7727 panel.classList.remove("hidden"); 7728 panel.setAttribute("aria-hidden", "false"); 7729 } 7730 const svgIcon = toggle.querySelector("svg"); 7731 svgIcon?.classList.toggle("rotate-180", !isExpanded); 7732 }; 7733 var setupAccordions = () => { 7734 const toggles = document.querySelectorAll("[data-accordion-toggle]"); 7735 toggles.forEach((toggle) => { 7736 toggle.addEventListener("click", () => { 7737 const isExpanded = toggle.getAttribute("aria-expanded") === "true"; 7738 const panel = toggle.nextElementSibling; 7739 if (panel && panel.hasAttribute("data-accordion-panel")) { 7740 toggleAccordionPanel(toggle, panel, isExpanded); 7741 } 7742 }); 7743 }); 7744 }; 7745 var hasClosedAccordions = (toggles) => { 7746 return Array.from(toggles).some( 7747 (toggle) => toggle.getAttribute("aria-expanded") !== "true" 7748 ); 7749 }; 7750 var updateAccordionState = (toggle, panel, shouldOpen) => { 7751 toggle.setAttribute("aria-expanded", shouldOpen.toString()); 7752 if (panel && panel.hasAttribute("data-accordion-panel")) { 7753 if (shouldOpen) { 7754 panel.classList.remove("hidden"); 7755 panel.setAttribute("aria-hidden", "false"); 7756 } else { 7757 panel.classList.add("hidden"); 7758 panel.setAttribute("aria-hidden", "true"); 7759 } 7760 } 7761 const svgIcon = toggle.querySelector("svg"); 7762 svgIcon?.classList.toggle("rotate-180", shouldOpen); 7763 }; 7764 var toggleAllAccordions = () => { 7765 const toggles = document.querySelectorAll("[data-accordion-toggle]"); 7766 const shouldOpenAll = hasClosedAccordions(toggles); 7767 toggles.forEach((toggle) => { 7768 const panel = toggle.nextElementSibling; 7769 updateAccordionState(toggle, panel, shouldOpenAll); 7770 }); 7771 }; 7772 var setupToggleAllAccordions = () => { 7773 const toggleAllButton = document.querySelector( 7774 "[data-toggle-all-accordions]" 7775 ); 7776 if (toggleAllButton) { 7777 toggleAllButton.addEventListener("click", () => { 7778 toggleAllAccordions(); 7779 }); 7780 } 7781 }; 7782 7783
7783// Web/src/scripts/toggles/tabs.ts 7784 var setTabVisualState = (link, isActive) => { 7785 if (isActive) { 7786 link.classList.add("bg-white", "border-b-green", "text-dark"); 7787 link.classList.remove("text-gray", "border-b-lighter-gray"); 7788 } else { 7789 link.classList.remove("bg-white", "border-b-green", "text-dark"); 7790 link.classList.add("text-gray", "border-b-lighter-gray"); 7791 } 7792 }; 7793 var setupTabPanel = (panel, index2, isActive) => { 7794 const panelId = `tab-panel-${index2}`; 7795 panel.setAttribute("role", "tabpanel"); 7796 panel.setAttribute("id", panelId); 7797 panel.setAttribute("aria-labelledby", `tab-${index2}`); 7798 panel.setAttribute("tabindex", "0"); 7799 if (isActive) { 7800 panel.classList.remove("hidden"); 7801 panel.setAttribute("aria-hidden", "false"); 7802 } else { 7803 panel.classList.add("hidden"); 7804 panel.setAttribute("aria-hidden", "true"); 7805 } 7806 }; 7807 var setupTabLink = (link, index2, isActive, tabPanels) => { 7808 link.setAttribute("role", "tab"); 7809 link.setAttribute("tabindex", isActive ? "0" : "-1"); 7810 link.setAttribute("aria-selected", isActive ? "true" : "false"); 7811 link.setAttribute("id", `tab-${index2}`); 7812 link.setAttribute("aria-controls", `tab-panel-${index2}`); 7813 setTabVisualState(link, isActive); 7814 if (tabPanels[index2]) { 7815 setupTabPanel(tabPanels[index2], index2, isActive); 7816 } 7817 }; 7818 var updateTabsAndPanels = (tabLinks, tabPanels, activeLink) => { 7819 tabLinks.forEach((otherLink, otherIndex) => { 7820 const isSelected = otherLink === activeLink; 7821 otherLink.setAttribute("aria-selected", isSelected ? "true" : "false"); 7822 otherLink.setAttribute("tabindex", isSelected ? "0" : "-1"); 7823 setTabVisualState(otherLink, isSelected); 7824 if (tabPanels[otherIndex]) { 7825 const panel = tabPanels[otherIndex]; 7826 if (isSelected) { 7827 panel.classList.remove("hidden"); 7828 panel.setAttribute("aria-hidden", "false"); 7829 } else { 7830 panel.classList.add("hidden"); 7831 panel.setAttribute("aria-hidden", "true"); 7832 } 7833 } 7834 }); 7835 }; 7836 var setupTabClickHandler = (link, tabLinks, tabPanels) => { 7837 link.addEventListener("click", (event) => { 7838 event.preventDefault(); 7839 updateTabsAndPanels(tabLinks, tabPanels, link); 7840 link.focus(); 7841 }); 7842 }; 7843 var setupTabKeyboardHandler = (link, tabLinks) => { 7844 link.addEventListener("keydown", (event) => { 7845 const keyboardEvent = event; 7846 const currentIndex = Array.from(tabLinks).indexOf(link); 7847 let targetIndex = currentIndex; 7848 switch (keyboardEvent.key) { 7849 case "ArrowLeft": 7850 keyboardEvent.preventDefault(); 7851 targetIndex = currentIndex > 0 ? currentIndex - 1 : tabLinks.length - 1; 7852 break; 7853 case "ArrowRight": 7854 keyboardEvent.preventDefault(); 7855 targetIndex = currentIndex < tabLinks.length - 1 ? currentIndex + 1 : 0; 7856 break; 7857 case "Home": 7858 keyboardEvent.preventDefault(); 7859 targetIndex = 0; 7860 break; 7861 case "End": 7862 keyboardEvent.preventDefault(); 7863 targetIndex = tabLinks.length - 1; 7864 break; 7865 default: 7866 return; 7867 } 7868 tabLinks[targetIndex].click(); 7869 }); 7870 }; 7871 var setupTabs = () => { 7872 const tabContainers = document.querySelectorAll("[data-tabs]"); 7873 tabContainers.forEach((container) => { 7874 const allLinks = container.querySelectorAll("a"); 7875 const tabLinks = Array.from(allLinks).filter( 7876 (link) => link.getAttribute("href")?.startsWith("#") 7877 ); 7878 const tabPanels = container.parentElement?.querySelectorAll("[data-tab-panel]") || []; 7879 let activeTabIndex = 0; 7880 const serverActiveTab = tabLinks.findIndex( 7881 (link) => link.hasAttribute("active") && link.getAttribute("active") !== "false" 7882 ); 7883 if (serverActiveTab !== -1) { 7884 activeTabIndex = serverActiveTab; 7885 } 7886 tabLinks.forEach((link, index2) => { 7887 const isActive = index2 === activeTabIndex; 7888 setupTabLink(link, index2, isActive, tabPanels); 7889 setupTabClickHandler(link, tabLinks, tabPanels); 7890 setupTabKeyboardHandler(link, tabLinks); 7891 }); 7892 container.setAttribute("role", "tablist"); 7893 }); 7894 }; 7895 7896
7896// Web/src/scripts/guidelines-search/index.ts 7897 var import_fuzzysort = __toESM(require_fuzzysort()); 7898 var isEmpty2 = (value) => !value || value.trim() === ""; 7899 var matchesCollection = (relevantCollections, selectedCollection) => isEmpty2(selectedCollection) || relevantCollections.some( 7900 (collection) => collection.id.toString() === selectedCollection 7901 ); 7902 var getCollectionsWithCount = (collections, guidelines) => collections.map((collection) => ({ 7903 ...collection, 7904 count: guidelines.filter( 7905 (guideline) => guideline.relevantCollections.some((rc) => rc.id === collection.id) 7906 ).length 7907 })); 7908 var hasActiveFilters2 = (criteria) => !isEmpty2(criteria.searchTerm) || !isEmpty2(criteria.collectionId); 7909 var collectionFilterGuidelines = (guidelines, collectionId) => guidelines.filter( 7910 (guideline) => matchesCollection(guideline.relevantCollections, collectionId) 7911 ); 7912 var createSearchableEntries = (guidelines) => { 7913 const entries = []; 7914 guidelines.forEach((guideline) => { 7915 entries.push({ 7916 guideline, 7917 searchField: guideline.name, 7918 fieldType: "name" 7919 }); 7920 if (guideline.tags && guideline.tags.length > 0) { 7921 guideline.tags.forEach((tag) => { 7922 entries.push({ 7923 guideline, 7924 searchField: tag, 7925 fieldType: "tag" 7926 }); 7927 }); 7928 } 7929 if (guideline.acts) { 7930 entries.push({ 7931 guideline, 7932 searchField: guideline.acts, 7933 fieldType: "acts" 7934 }); 7935 } 7936 }); 7937 return entries; 7938 }; 7939 var performFuzzySearch = (searchTerm, guidelines) => { 7940 if (isEmpty2(searchTerm)) { 7941 return guidelines; 7942 } 7943 const searchableEntries = createSearchableEntries(guidelines); 7944 const results = import_fuzzysort.default.go(searchTerm, searchableEntries, { 7945 keys: ["searchField"], 7946 threshold: 0.24, 7947 all: true, 7948 scoreFn: (result) => { 7949 if (!result || result.score === -Infinity) { 7950 return -Infinity; 7951 } 7952 let multiplier = 1; 7953 if (result.obj.fieldType === "name" && result.score > 0.6) { 7954 multiplier = 2.5; 7955 } 7956 return result.score * multiplier; 7957 } 7958 }); 7959 const guidelineMap = /* @__PURE__ */ new Map(); 7960 results.forEach((result) => { 7961 const guideline = result.obj.guideline; 7962 const score = result.score; 7963 if (!guidelineMap.has(guideline.id) || guidelineMap.get(guideline.id).bestScore < score) { 7964 guidelineMap.set(guideline.id, { guideline, bestScore: score }); 7965 } 7966 }); 7967 return Array.from(guidelineMap.values()).sort((a, b) => b.bestScore - a.bestScore).map((entry) => entry.guideline); 7968 }; 7969 var createGuidelineSearch = (initialGuidelineData = [], allCollections = []) => { 7970 const guidelines = Array.isArray(initialGuidelineData) ? initialGuidelineData : []; 7971 const collections = Array.isArray(allCollections) ? allCollections : []; 7972 return { 7973 guidelines, 7974 collections, 7975 searchTerm: "", 7976 selectedCollection: "", 7977 isInitialized: false, 7978 init() { 7979 setTimeout(() => { 7980 const searchInput = document.getElementById( 7981 "guideline-search" 7982 ); 7983 const filterSelect = document.getElementById( 7984 "guideline-search-filter" 7985 ); 7986 if (searchInput && searchInput.value) { 7987 this.searchTerm = searchInput.value; 7988 } 7989 if (filterSelect && filterSelect.value) { 7990 this.selectedCollection = filterSelect.value; 7991 } 7992 this.isInitialized = true; 7993 }, 300); 7994 }, 7995 get hasActiveFilters() { 7996 return hasActiveFilters2(this.getFilterCriteria()); 7997 }, 7998 get filteredGuidelines() { 7999 const criteria = this.getFilterCriteria(); 8000 const searchFiltered = performFuzzySearch( 8001 criteria.searchTerm, 8002 this.guidelines 8003 ); 8004 return collectionFilterGuidelines(searchFiltered, criteria.collectionId); 8005 }, 8006 get collectionsWithCount() { 8007 const criteria = this.getFilterCriteria(); 8008 const searchFiltered = performFuzzySearch( 8009 criteria.searchTerm, 8010 this.guidelines 8011 ); 8012 return getCollectionsWithCount(this.collections, searchFiltered); 8013 }, 8014 get noResultsVisible() { 8015 return this.hasActiveFilters && this.filteredGuidelines.length === 0; 8016 }, 8017 getFilterCriteria() { 8018 return { 8019 searchTerm: this.searchTerm, 8020 collectionId: this.selectedCollection 8021 }; 8022 } 8023 }; 8024 }; 8025 var setupGuidelineSearch = () => { 8026 document.addEventListener("alpine:init", () => { 8027 module_default.data("guidelineSearch", createGuidelineSearch); 8028 }); 8029 }; 8030 8031
8031// Web/src/scripts/latest-filter/index.ts 8032 var submitLatestFilterTerms = () => { 8033 submitFilterTerms("latest-filter"); 8034 }; 8035 var submitPublicationsFilterTerms = () => { 8036 submitFilterTerms("publications-filter"); 8037 }; 8038 var submitSiteSearchFilterTerms = () => { 8039 submitFilterTerms("site-search-filter"); 8040 }; 8041 var submitFilterTerms = (formId) => { 8042 const form = document.getElementById(formId); 8043 const documentTypeSelect = document.getElementById( 8044 "document-type-filter" 8045 ); 8046 const topicSelect = document.getElementById( 8047 "topic-filter" 8048 ); 8049 if (!form) return; 8050 if (documentTypeSelect) { 8051 documentTypeSelect.addEventListener("input", () => { 8052 form.submit(); 8053 }); 8054 } 8055 if (topicSelect) { 8056 topicSelect.addEventListener("change", () => { 8057 form.submit(); 8058 }); 8059 } 8060 }; 8061 8062
8062// Web/src/scripts/offline-pages/register-sw.ts 8063 function registerOfflineSW() { 8064 if ("serviceWorker" in navigator) { 8065 window.addEventListener("load", () => { 8066 navigator.serviceWorker.register("/sw.js").then((reg) => { 8067 console.log("Service worker registered at /sw.js", reg); 8068 reg.addEventListener("updatefound", () => { 8069 const newSW = reg.installing; 8070 if (newSW) { 8071 newSW.addEventListener("statechange", () => { 8072 if (newSW.state === "installed" && navigator.serviceWorker.controller) { 8073 newSW.postMessage({ type: "SKIP_WAITING" }); 8074 window.location.reload(); 8075 } 8076 }); 8077 } 8078 }); 8079 }).catch((err) => console.error("SW registration failed", err)); 8080 }); 8081 } 8082 } 8083 async function addOrRemovePageFromCache(url = window.location.href, addUrl) { 8084 try { 8085 const registration = await navigator.serviceWorker.ready; 8086 const postMessage = addUrl ? "CACHE_URL" : "REMOVE_URL"; 8087 if (registration.active) { 8088 registration.active.postMessage({ type: postMessage, url }); 8089 await waitForCacheOperation(url, addUrl); 8090 } else { 8091 console.warn("No active service worker found"); 8092 } 8093 } catch (error2) { 8094 console.error("Service worker not available:", error2); 8095 } 8096 } 8097 async function waitForCacheOperation(url, shouldExist) { 8098 const cache = await caches.open("offline-pages"); 8099 const maxAttempts = 40; 8100 let attempts = 0; 8101 return new Promise((resolve, reject) => { 8102 const checkCache = async () => { 8103 try { 8104 const cached = await cache.match(url); 8105 const exists = !!cached; 8106 if (exists === shouldExist) { 8107 resolve(); 8108 return; 8109 } 8110 attempts++; 8111 if (attempts >= maxAttempts) { 8112 reject(new Error(`Cache operation timed out for ${url}`)); 8113 return; 8114 } 8115 setTimeout(checkCache, 100); 8116 } catch (error2) { 8117 reject(error2); 8118 } 8119 }; 8120 checkCache(); 8121 }); 8122 } 8123 async function listOfflinePages() { 8124 const cache = await caches.open("offline-pages"); 8125 const requests = await cache.keys(); 8126 return requests.map((req) => req.url); 8127 } 8128 async function clearAllOfflinePages() { 8129 const cache = await caches.open("offline-pages"); 8130 const requests = await cache.keys(); 8131 const clearPromises = requests.filter((req) => !req.url.includes("bookmarks")).map((req) => cache.delete(req)); 8132 await Promise.all(clearPromises); 8133 } 8134 8135
8135// Web/src/scripts/offline-pages/utils.ts 8136 var normalizeUrl = (url) => { 8137 try { 8138 const urlObj = new URL(url, self?.location?.origin || location.origin); 8139 return urlObj.pathname + urlObj.search; 8140 } catch { 8141 return url; 8142 } 8143 }; 8144 8145
8145// Web/src/scripts/offline-pages/offline-save-display.ts 8146 var createBookmarkItem = (url, title) => { 8147 const template = document.getElementById( 8148 "bookmark-item-template" 8149 ); 8150 if (!template) return null; 8151 const clone3 = template.content.cloneNode(true); 8152 const linkElement = clone3.querySelector( 8153 "[data-bookmark-link]" 8154 ); 8155 const titleElement = clone3.querySelector( 8156 "[data-bookmark-title]" 8157 ); 8158 if (linkElement) { 8159 linkElement.href = url.replace(location.origin, ""); 8160 } 8161 if (titleElement) { 8162 titleElement.textContent = title; 8163 } 8164 return clone3; 8165 }; 8166 var getPageTitle = async (url) => { 8167 const cache = await caches.open("offline-pages"); 8168 const resp = await cache.match(url); 8169 let title = url.replace(location.origin, "") || url; 8170 if (resp) { 8171 const html = await resp.text(); 8172 const doc = new DOMParser().parseFromString(html, "text/html"); 8173 title = doc.querySelector("title")?.textContent?.trim() || title; 8174 } 8175 return title; 8176 }; 8177 var getFilteredOfflineUrls = async () => { 8178 const urls = await listOfflinePages(); 8179 return urls.filter((url) => !url.includes("bookmarks")); 8180 }; 8181 var toggleUIElements = (hasBookmarks) => { 8182 const noBookmarks = document.getElementById("no-bookmarks"); 8183 const clearAllButton = document.getElementById("clear-all-bookmarks"); 8184 if (hasBookmarks) { 8185 noBookmarks?.classList.add("hidden"); 8186 clearAllButton && (clearAllButton.style.display = "block"); 8187 return; 8188 } 8189 noBookmarks?.classList.remove("hidden"); 8190 clearAllButton && (clearAllButton.style.display = "none"); 8191 }; 8192 var renderBookmarkItems = async (urls, container) => { 8193 const template = document.getElementById( 8194 "bookmark-item-template" 8195 ); 8196 if (!template) { 8197 container.innerHTML = "<div>Error: Template not found</div>"; 8198 return; 8199 } 8200 const entries = await Promise.all( 8201 urls.map(async (url) => ({ 8202 url, 8203 title: await getPageTitle(url) 8204 })) 8205 ); 8206 entries.sort((a, b) => a.title.localeCompare(b.title)); 8207 entries.forEach(({ url, title }) => { 8208 const bookmarkItem = createBookmarkItem(url, title); 8209 if (bookmarkItem) { 8210 container.appendChild(bookmarkItem); 8211 } 8212 }); 8213 }; 8214 var getBookmarkUrl = (element) => { 8215 const parentContainer = element.closest(".guideline-selector"); 8216 if (parentContainer) { 8217 const anchorElement = parentContainer.querySelector( 8218 "a.guideline-link" 8219 ); 8220 if (anchorElement && anchorElement.href) { 8221 return anchorElement.href; 8222 } 8223 } 8224 return window.location.href; 8225 }; 8226 var setupOfflineSaveDisplay = async () => { 8227 const container = document.getElementById("offline-pages-list"); 8228 if (!container) return; 8229 container.innerHTML = "<div>Loading\u2026</div>"; 8230 try { 8231 const filteredUrls = await getFilteredOfflineUrls(); 8232 container.innerHTML = ""; 8233 const hasBookmarks = filteredUrls.length > 0; 8234 toggleUIElements(hasBookmarks); 8235 if (!hasBookmarks) return; 8236 await renderBookmarkItems(filteredUrls, container); 8237 setupClearAllBookmarks(); 8238 setupOfflineRemove(); 8239 } catch { 8240 container.innerHTML = "<div>Error loading saved pages</div>"; 8241 const clearAllButton = document.getElementById("clear-all-bookmarks"); 8242 if (clearAllButton) clearAllButton.style.display = "none"; 8243 } 8244 }; 8245 var setupOfflineToggle = () => { 8246 const offlineAddElements = document.querySelectorAll(".offline-add"); 8247 if (offlineAddElements.length === 0) return; 8248 offlineAddElements.forEach((offlineAdd) => { 8249 const offlineAddElement = offlineAdd; 8250 const parentContainer = offlineAddElement.parentElement; 8251 if (!parentContainer) return; 8252 const offlineRemove = parentContainer.querySelector( 8253 ".offline-remove" 8254 ); 8255 if (!offlineRemove) return; 8256 const guidelineUrl = getBookmarkUrl(offlineAddElement); 8257 const normalizedGuidelineUrl = normalizeUrl(guidelineUrl); 8258 const updateButton = async () => { 8259 const urls = await listOfflinePages(); 8260 const normalizedUrls = urls.map((url) => normalizeUrl(url)); 8261 const isSaved = normalizedUrls.includes(normalizedGuidelineUrl); 8262 offlineAddElement.style.display = isSaved ? "none" : "block"; 8263 offlineRemove.style.display = isSaved ? "block" : "none"; 8264 }; 8265 offlineAddElement.onclick = async () => { 8266 await addOrRemovePageFromCache(guidelineUrl, true); 8267 updateButton(); 8268 }; 8269 offlineRemove.onclick = async () => { 8270 await addOrRemovePageFromCache(guidelineUrl, false); 8271 updateButton(); 8272 }; 8273 updateButton(); 8274 }); 8275 }; 8276 var setupClearAllBookmarks = () => { 8277 const clearAllButton = document.getElementById("clear-all-bookmarks"); 8278 if (!clearAllButton) return; 8279 clearAllButton.onclick = async () => { 8280 await clearAllOfflinePages(); 8281 await setupOfflineSaveDisplay(); 8282 }; 8283 }; 8284 var setupOfflineRemove = () => { 8285 const removeButtons = document.querySelectorAll("#offline-remove-individual"); 8286 removeButtons.forEach((button) => { 8287 const offlineRemove = button; 8288 const bookmarkItem = offlineRemove.closest("div"); 8289 if (!bookmarkItem) return; 8290 const linkElement = bookmarkItem.querySelector( 8291 "[data-bookmark-link]" 8292 ); 8293 if (!linkElement) return; 8294 const pageUrl = linkElement.href; 8295 offlineRemove.onclick = async () => { 8296 await addOrRemovePageFromCache(pageUrl, false); 8297 bookmarkItem.remove(); 8298 const container = document.getElementById("offline-pages-list"); 8299 const remainingItems = container?.children.length || 0; 8300 toggleUIElements(remainingItems > 0); 8301 }; 8302 }); 8303 }; 8304 8305
8305// Web/src/scripts/guideline/index.ts 8306 var submitFormAsync = async (form, container) => { 8307 try { 8308 const formData = new FormData(form); 8309 const actionUrl = form.action || window.location.href; 8310 const response = await fetch(actionUrl, { 8311 method: "POST", 8312 body: formData, 8313 headers: { 8314 "X-Requested-With": "XMLHttpRequest" 8315 } 8316 }); 8317 if (!response.ok) { 8318 throw new Error(`HTTP error! status: ${response.status}`); 8319 } 8320 const responseText = await response.text(); 8321 handleFormResponse(container, responseText); 8322 } catch (error2) { 8323 handleFormError(container); 8324 } 8325 }; 8326 var handleFormResponse = (container, response) => { 8327 const tempDiv = document.createElement("div"); 8328 tempDiv.innerHTML = response; 8329 const responseContainer = tempDiv.querySelector( 8330 "#guideline-feedback-form-container" 8331 ); 8332 if (responseContainer) { 8333 container.innerHTML = responseContainer.innerHTML; 8334 setupAjaxFormHandler(container); 8335 } 8336 }; 8337 var handleFormError = (container) => { 8338 container.innerHTML = `Sorry, something went wrong whilst submitting your feedback. Please try again later or contact us directly.`; 8339 setupAjaxFormHandler(container); 8340 }; 8341 var setupAjaxFormHandler = (container) => { 8342 const form = container.querySelector("form"); 8343 if (!form) return; 8344 form.addEventListener("submit", async (event) => { 8345 event.preventDefault(); 8346 const submitButton = form.querySelector( 8347 'input[type="submit"]' 8348 ); 8349 if (submitButton) { 8350 submitButton.disabled = true; 8351 try { 8352 await submitFormAsync(form, container); 8353 } finally { 8354 submitButton.disabled = false; 8355 } 8356 } else { 8357 await submitFormAsync(form, container); 8358 } 8359 }); 8360 }; 8361 var setupGuidelineForm = () => { 8362 const guidelineFormContainer = document.getElementById( 8363 "guideline-feedback-form-container" 8364 ); 8365 if (guidelineFormContainer) { 8366 setupAjaxFormHandler(guidelineFormContainer); 8367 } 8368 }; 8369 8370
8370// Web/src/scripts/back-to-top/index.ts 8371 var setupBackToTop = () => { 8372 const backToTopButton = document.getElementById("back-to-top"); 8373 if (!backToTopButton) { 8374 return; 8375 } 8376 let isVisible = false; 8377 const handleScroll = () => { 8378 const shouldShow = window.scrollY > 100; 8379 if (shouldShow && !isVisible) { 8380 backToTopButton.classList.remove("hidden"); 8381 isVisible = true; 8382 } else if (!shouldShow && isVisible) { 8383 backToTopButton.classList.add("hidden"); 8384 isVisible = false; 8385 } 8386 }; 8387 const scrollToTop = () => { 8388 window.scrollTo({ 8389 top: 0, 8390 behavior: "smooth" 8391 }); 8392 }; 8393 window.addEventListener("scroll", handleScroll, { passive: true }); 8394 backToTopButton.addEventListener("click", scrollToTop); 8395 handleScroll(); 8396 }; 8397 8398
8398// Web/src/scripts/you-be-the-judge/index.ts 8399 var ON_START_FORM_MODAL_REDIRECT = "data-ybtj-on-start-form-modal-redirect"; 8400 var ON_EXIT_FORM_MODAL_REDIRECT = "data-ybtj-on-exit-form-modal-redirect"; 8401 var ON_START_COMPLETE_SESSION_ITEM_KEY = "ybtj-on-start-complete"; 8402 var ON_EXIT_COMPLETE_SESSION_ITEM_KEY = "ybtj-on-exit-complete"; 8403 var submitFormAsync2 = async (form, type) => { 8404 try { 8405 const formData = new FormData(form); 8406 const actionUrl = form.action || window.location.href; 8407 const response = await fetch(actionUrl, { 8408 method: "POST", 8409 body: formData, 8410 headers: { 8411 "X-Requested-With": "XMLHttpRequest" 8412 } 8413 }); 8414 if (!response.ok) { 8415 throw new Error(`HTTP error! status: ${response.status}`); 8416 } 8417 resetAndRedirect(form, type); 8418 } catch (error2) { 8419 alert(`Error submitting form: ${error2}`); 8420 } 8421 }; 8422 var resetAndRedirect = (form, type) => { 8423 const onStartRedirectHolder = document.querySelector( 8424 `[${ON_START_FORM_MODAL_REDIRECT}]` 8425 ); 8426 const onExitRedirectHolder = document.querySelector( 8427 `[${ON_EXIT_FORM_MODAL_REDIRECT}]` 8428 ); 8429 if (type === "on-start-form" && onStartRedirectHolder) { 8430 form.reset(); 8431 sessionStorage.setItem(ON_START_COMPLETE_SESSION_ITEM_KEY, "true"); 8432 window.location.href = onStartRedirectHolder.getAttribute(ON_START_FORM_MODAL_REDIRECT) || ""; 8433 } 8434 if (type === "on-exit-form" && onExitRedirectHolder) { 8435 form.reset(); 8436 sessionStorage.setItem(ON_EXIT_COMPLETE_SESSION_ITEM_KEY, "true"); 8437 window.location.href = onExitRedirectHolder.getAttribute(ON_EXIT_FORM_MODAL_REDIRECT) || ""; 8438 } 8439 }; 8440 var setupAjaxFormHandler2 = (container) => { 8441 const type = container.getAttribute("data-ybtj-forms-ajax"); 8442 const form = container.querySelector("form"); 8443 if (!form || !type) return; 8444 form.addEventListener("submit", async (event) => { 8445 event.preventDefault(); 8446 const submitButton = form.querySelector( 8447 'input[type="submit"]' 8448 ); 8449 if (submitButton) { 8450 submitButton.disabled = true; 8451 try { 8452 await submitFormAsync2(form, type); 8453 } finally { 8454 submitButton.disabled = false; 8455 } 8456 } else { 8457 await submitFormAsync2(form, type); 8458 } 8459 }); 8460 }; 8461 var setupYbtjAjaxForms = () => { 8462 const forms = document.querySelectorAll( 8463 "[data-ybtj-forms-ajax]" 8464 ); 8465 forms.forEach((form) => { 8466 setupAjaxFormHandler2(form); 8467 }); 8468 }; 8469 var setupYbtjModalTriggers = () => { 8470 const startTriggers = document.querySelectorAll( 8471 "[data-ybtj-start-trigger]" 8472 ); 8473 const exitTriggers = document.querySelectorAll( 8474 "[data-ybtj-exit-trigger]" 8475 ); 8476 const onStartComplete = sessionStorage.getItem( 8477 ON_START_COMPLETE_SESSION_ITEM_KEY 8478 ); 8479 const onExitComplete = sessionStorage.getItem( 8480 ON_EXIT_COMPLETE_SESSION_ITEM_KEY 8481 ); 8482 if (!onStartComplete) { 8483 startTriggers.forEach((trigger2) => { 8484 handleModalTrigger(trigger2, "on-start-form-modal"); 8485 }); 8486 } 8487 if (!onExitComplete) { 8488 exitTriggers.forEach((trigger2) => { 8489 handleModalTrigger(trigger2, "on-exit-form-modal"); 8490 }); 8491 } 8492 }; 8493 var handleModalTrigger = (trigger2, modalType) => { 8494 trigger2.addEventListener("click", (e) => { 8495 e.preventDefault(); 8496 const target = e.target.closest("a"); 8497 triggerModal(modalType); 8498 const redirect = document.querySelector( 8499 `[data-ybtj-${modalType}-redirect]` 8500 ); 8501 if (redirect && target) { 8502 redirect.setAttribute(`data-ybtj-${modalType}-redirect`, target.href); 8503 } 8504 }); 8505 }; 8506 8507
8507// Web/src/scripts/wistia/index.ts 8508 var FACADE_ATTRIBUTE = "data-wistia-facade"; 8509 var PLAY_ATTRIBUTE = "data-wistia-play"; 8510 var MOUNT_ATTRIBUTE = "data-wistia-mount"; 8511 var ID_ATTRIBUTE = "data-wistia-id"; 8512 var PLAYER_SCRIPT = "https://fast.wistia.com/assets/external/E-v1.js"; 8513 var playerRequested = false; 8514 var loadPlayer = () => { 8515 if (playerRequested) { 8516 return; 8517 } 8518 playerRequested = true; 8519 window._wq = window._wq ?? []; 8520 window._wq.push({ id: "_all", options: { doNotTrack: true } }); 8521 const script = document.createElement("script"); 8522 script.src = PLAYER_SCRIPT; 8523 script.async = true; 8524 document.head.appendChild(script); 8525 const poll = window.setInterval(() => { 8526 if (typeof window.Wistia?.consent === "function") { 8527 window.clearInterval(poll); 8528 window.Wistia.consent(false); 8529 } 8530 }, 50); 8531 window.setTimeout(() => window.clearInterval(poll), 1e4); 8532 }; 8533 var startVideo = (facade) => { 8534 const videoId = facade.getAttribute(ID_ATTRIBUTE); 8535 const mount2 = facade.querySelector(`[${MOUNT_ATTRIBUTE}]`); 8536 if (!videoId || !mount2) { 8537 return; 8538 } 8539 loadPlayer(); 8540 facade.querySelector(`[${PLAY_ATTRIBUTE}]`)?.remove(); 8541 const embed = document.createElement("div"); 8542 embed.className = `wistia_embed wistia_async_${videoId} videoFoam=true`; 8543 embed.style.height = "100%"; 8544 embed.style.width = "100%"; 8545 mount2.replaceChildren(embed); 8546 window._wq?.push({ 8547 id: videoId, 8548 onReady: (video) => video.play() 8549 }); 8550 mount2.tabIndex = -1; 8551 mount2.focus(); 8552 }; 8553 var revealPlayButtons = (root) => { 8554 root.querySelectorAll(`[${PLAY_ATTRIBUTE}]`).forEach((button) => { 8555 button.classList.remove("hidden"); 8556 button.classList.add("flex"); 8557 }); 8558 }; 8559 var setupWistiaFacades = () => { 8560 revealPlayButtons(document); 8561 document.addEventListener("click", (event) => { 8562 const button = event.target?.closest( 8563 `[${PLAY_ATTRIBUTE}]` 8564 ); 8565 if (!button) { 8566 return; 8567 } 8568 const facade = button.closest(`[${FACADE_ATTRIBUTE}]`); 8569 if (!facade) { 8570 return; 8571 } 8572 event.preventDefault(); 8573 startVideo(facade); 8574 }); 8575 const observer2 = new MutationObserver((mutations) => { 8576 mutations.forEach((mutation) => { 8577 mutation.addedNodes.forEach((node) => { 8578 if (node instanceof HTMLElement) { 8579 revealPlayButtons(node); 8580 } 8581 }); 8582 }); 8583 }); 8584 observer2.observe(document.body, { childList: true, subtree: true }); 8585 }; 8586 8587
8587// Web/src/scripts/main.ts 8588 registerOfflineSW(); 8589 var enableJsIndicator = () => { 8590 if (document.body) { 8591 document.body.classList.add("js-enabled"); 8592 } else { 8593 document.addEventListener("DOMContentLoaded", () => { 8594 document.body.classList.add("js-enabled"); 8595 }); 8596 } 8597 }; 8598 enableJsIndicator(); 8599 var setupPrintButton = () => { 8600 const printButton = document.querySelector("[data-trigger-print]"); 8601 if (printButton) { 8602 printButton.addEventListener("click", () => { 8603 window.print(); 8604 }); 8605 } 8606 }; 8607 var scrollToId = (elementId) => { 8608 const element = document.getElementById(elementId); 8609 if (!element) { 8610 return; 8611 } 8612 const footer = document.querySelector("footer"); 8613 if (!footer) { 8614 element.scrollIntoView({ behavior: "smooth", block: "start" }); 8615 return; 8616 } 8617 const elementRect = element.getBoundingClientRect(); 8618 const footerRect = footer.getBoundingClientRect(); 8619 const viewportHeight = window.innerHeight; 8620 const elementTop = elementRect.top + window.scrollY; 8621 const footerHeight = footerRect.height; 8622 const maxScrollPosition = document.documentElement.scrollHeight - viewportHeight - footerHeight; 8623 const targetScrollPosition = Math.min(elementTop, maxScrollPosition); 8624 window.scrollTo({ 8625 top: Math.max(0, targetScrollPosition), 8626 behavior: "smooth" 8627 }); 8628 }; 8629 document.addEventListener("DOMContentLoaded", () => { 8630 setupMobileNavToggle(); 8631 setupNavigationDropdowns(); 8632 setupDropdowns(); 8633 setupTabs(); 8634 setupPrintButton(); 8635 setupAccordions(); 8636 setupToggleAllAccordions(); 8637 setupModals(); 8638 setupBackToTop(); 8639 submitLatestFilterTerms(); 8640 submitPublicationsFilterTerms(); 8641 submitSiteSearchFilterTerms(); 8642 setupOfflineSaveDisplay(); 8643 setInterval(setupOfflineToggle, 500); 8644 setupGuidelineForm(); 8645 setupYbtjModalTriggers(); 8646 setupYbtjAjaxForms(); 8647 setupWistiaFacades(); 8648 setupGuidelineSearch(); 8649 setupPronouncementBuilder(); 8650 setupFinesCalculator(); 8651 setupDrinkDrivingCalculator(); 8652 setupGuiltyPleaCalculatorDaysAndWeeks(); 8653 setupGuiltyPleaCalculatorMonthsAndYears(); 8654 module_default.plugin(module_default2); 8655 module_default.start(); 8656 }); 8657})(); 8658/*! Bundled license information: 8659 8660sortablejs/modular/sortable.esm.js: 8661 (**! 8662 * Sortable 1.15.7 8663 * @author RubaXa <[email protected]> 8664 * @author owenm <[email protected]> 8665 * @license MIT 8666 *) 8667*/
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.