1(() => { 2 var __create = Object.create; 3 var __defProp = Object.defineProperty; 4 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 5 var __getOwnPropNames = Object.getOwnPropertyNames; 6 var __getProtoOf = Object.getPrototypeOf; 7 var __hasOwnProp = Object.prototype.hasOwnProperty; 8 var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; 9 var __require = /* @__PURE__ */ ((x5) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x5, { 10 get: (a4, b4) => (typeof require !== "undefined" ? require : a4)[b4] 11 }) : x5)(function(x5) { 12 if (typeof require !== "undefined") 13 return require.apply(this, arguments); 14 throw new Error('Dynamic require of "' + x5 + '" is not supported'); 15 }); 16 var __esm = (fn3, res) => function __init() { 17 return fn3 && (res = (0, fn3[__getOwnPropNames(fn3)[0]])(fn3 = 0)), res; 18 }; 19 var __commonJS = (cb, mod) => function __require2() { 20 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 21 }; 22 var __export = (target, all) => { 23 for (var name in all) 24 __defProp(target, name, { get: all[name], enumerable: true }); 25 }; 26 var __copyProps = (to2, from, except, desc) => { 27 if (from && typeof from === "object" || typeof from === "function") { 28 for (let key of __getOwnPropNames(from)) 29 if (!__hasOwnProp.call(to2, key) && key !== except) 30 __defProp(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 31 } 32 return to2; 33 }; 34 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 35 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 36 mod 37 )); 38 var __publicField = (obj, key, value) => { 39 __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); 40 return value; 41 }; 42 43
vendor: 354 bytes, lines 43-54
43// node_modules/@rails/actioncable/src/adapters.js 44 var adapters_default; 45 var init_adapters = __esm({ 46 "node_modules/@rails/actioncable/src/adapters.js"() { 47 adapters_default = { 48 logger: typeof console !== "undefined" ? console : void 0, 49 WebSocket: typeof WebSocket !== "undefined" ? WebSocket : void 0 50 }; 51 } 52 }); 53 54
vendor: 416 bytes, lines 54-70
54// node_modules/@rails/actioncable/src/logger.js 55 var logger_default; 56 var init_logger = __esm({ 57 "node_modules/@rails/actioncable/src/logger.js"() { 58 init_adapters(); 59 logger_default = { 60 log(...messages) { 61 if (this.enabled) { 62 messages.push(Date.now()); 63 adapters_default.logger.log("[ActionCable]", ...messages); 64 } 65 } 66 }; 67 } 68 }); 69 70
vendor: 4,282 bytes, lines 70-179
70// node_modules/@rails/actioncable/src/connection_monitor.js 71 var now, secondsSince, ConnectionMonitor, connection_monitor_default; 72 var init_connection_monitor = __esm({ 73 "node_modules/@rails/actioncable/src/connection_monitor.js"() { 74 init_logger(); 75 now = () => new Date().getTime(); 76 secondsSince = (time) => (now() - time) / 1e3; 77 ConnectionMonitor = class { 78 constructor(connection) { 79 this.visibilityDidChange = this.visibilityDidChange.bind(this); 80 this.connection = connection; 81 this.reconnectAttempts = 0; 82 } 83 start() { 84 if (!this.isRunning()) { 85 this.startedAt = now(); 86 delete this.stoppedAt; 87 this.startPolling(); 88 addEventListener("visibilitychange", this.visibilityDidChange); 89 logger_default.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`); 90 } 91 } 92 stop() { 93 if (this.isRunning()) { 94 this.stoppedAt = now(); 95 this.stopPolling(); 96 removeEventListener("visibilitychange", this.visibilityDidChange); 97 logger_default.log("ConnectionMonitor stopped"); 98 } 99 } 100 isRunning() { 101 return this.startedAt && !this.stoppedAt; 102 } 103 recordMessage() { 104 this.pingedAt = now(); 105 } 106 recordConnect() { 107 this.reconnectAttempts = 0; 108 delete this.disconnectedAt; 109 logger_default.log("ConnectionMonitor recorded connect"); 110 } 111 recordDisconnect() { 112 this.disconnectedAt = now(); 113 logger_default.log("ConnectionMonitor recorded disconnect"); 114 } 115 startPolling() { 116 this.stopPolling(); 117 this.poll(); 118 } 119 stopPolling() { 120 clearTimeout(this.pollTimeout); 121 } 122 poll() { 123 this.pollTimeout = setTimeout( 124 () => { 125 this.reconnectIfStale(); 126 this.poll(); 127 }, 128 this.getPollInterval() 129 ); 130 } 131 getPollInterval() { 132 const { staleThreshold, reconnectionBackoffRate } = this.constructor; 133 const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10)); 134 const jitterMax = this.reconnectAttempts === 0 ? 1 : reconnectionBackoffRate; 135 const jitter = jitterMax * Math.random(); 136 return staleThreshold * 1e3 * backoff * (1 + jitter); 137 } 138 reconnectIfStale() { 139 if (this.connectionIsStale()) { 140 logger_default.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`); 141 this.reconnectAttempts++; 142 if (this.disconnectedRecently()) { 143 logger_default.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`); 144 } else { 145 logger_default.log("ConnectionMonitor reopening"); 146 this.connection.reopen(); 147 } 148 } 149 } 150 get refreshedAt() { 151 return this.pingedAt ? this.pingedAt : this.startedAt; 152 } 153 connectionIsStale() { 154 return secondsSince(this.refreshedAt) > this.constructor.staleThreshold; 155 } 156 disconnectedRecently() { 157 return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold; 158 } 159 visibilityDidChange() { 160 if (document.visibilityState === "visible") { 161 setTimeout( 162 () => { 163 if (this.connectionIsStale() || !this.connection.isOpen()) { 164 logger_default.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`); 165 this.connection.reopen(); 166 } 167 }, 168 200 169 ); 170 } 171 } 172 }; 173 ConnectionMonitor.staleThreshold = 6; 174 ConnectionMonitor.reconnectionBackoffRate = 0.15; 175 connection_monitor_default = ConnectionMonitor; 176 } 177 }); 178 179
vendor: 793 bytes, lines 179-206
179// node_modules/@rails/actioncable/src/internal.js 180 var internal_default; 181 var init_internal = __esm({ 182 "node_modules/@rails/actioncable/src/internal.js"() { 183 internal_default = { 184 "message_types": { 185 "welcome": "welcome", 186 "disconnect": "disconnect", 187 "ping": "ping", 188 "confirmation": "confirm_subscription", 189 "rejection": "reject_subscription" 190 }, 191 "disconnect_reasons": { 192 "unauthorized": "unauthorized", 193 "invalid_request": "invalid_request", 194 "server_restart": "server_restart", 195 "remote": "remote" 196 }, 197 "default_mount_path": "/cable", 198 "protocols": [ 199 "actioncable-v1-json", 200 "actioncable-unsupported" 201 ] 202 }; 203 } 204 }); 205 206
vendor: 6,207 bytes, lines 206-374
206// node_modules/@rails/actioncable/src/connection.js 207 var message_types, protocols, supportedProtocols, indexOf, Connection, connection_default; 208 var init_connection = __esm({ 209 "node_modules/@rails/actioncable/src/connection.js"() { 210 init_adapters(); 211 init_connection_monitor(); 212 init_internal(); 213 init_logger(); 214 ({ message_types, protocols } = internal_default); 215 supportedProtocols = protocols.slice(0, protocols.length - 1); 216 indexOf = [].indexOf; 217 Connection = class { 218 constructor(consumer2) { 219 this.open = this.open.bind(this); 220 this.consumer = consumer2; 221 this.subscriptions = this.consumer.subscriptions; 222 this.monitor = new connection_monitor_default(this); 223 this.disconnected = true; 224 } 225 send(data) { 226 if (this.isOpen()) { 227 this.webSocket.send(JSON.stringify(data)); 228 return true; 229 } else { 230 return false; 231 } 232 } 233 open() { 234 if (this.isActive()) { 235 logger_default.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`); 236 return false; 237 } else { 238 const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]; 239 logger_default.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`); 240 if (this.webSocket) { 241 this.uninstallEventHandlers(); 242 } 243 this.webSocket = new adapters_default.WebSocket(this.consumer.url, socketProtocols); 244 this.installEventHandlers(); 245 this.monitor.start(); 246 return true; 247 } 248 } 249 close({ allowReconnect } = { allowReconnect: true }) { 250 if (!allowReconnect) { 251 this.monitor.stop(); 252 } 253 if (this.isOpen()) { 254 return this.webSocket.close(); 255 } 256 } 257 reopen() { 258 logger_default.log(`Reopening WebSocket, current state is ${this.getState()}`); 259 if (this.isActive()) { 260 try { 261 return this.close(); 262 } catch (error2) { 263 logger_default.log("Failed to reopen WebSocket", error2); 264 } finally { 265 logger_default.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`); 266 setTimeout(this.open, this.constructor.reopenDelay); 267 } 268 } else { 269 return this.open(); 270 } 271 } 272 getProtocol() { 273 if (this.webSocket) { 274 return this.webSocket.protocol; 275 } 276 } 277 isOpen() { 278 return this.isState("open"); 279 } 280 isActive() { 281 return this.isState("open", "connecting"); 282 } 283 triedToReconnect() { 284 return this.monitor.reconnectAttempts > 0; 285 } 286 isProtocolSupported() { 287 return indexOf.call(supportedProtocols, this.getProtocol()) >= 0; 288 } 289 isState(...states) { 290 return indexOf.call(states, this.getState()) >= 0; 291 } 292 getState() { 293 if (this.webSocket) { 294 for (let state in adapters_default.WebSocket) { 295 if (adapters_default.WebSocket[state] === this.webSocket.readyState) { 296 return state.toLowerCase(); 297 } 298 } 299 } 300 return null; 301 } 302 installEventHandlers() { 303 for (let eventName in this.events) { 304 const handler = this.events[eventName].bind(this); 305 this.webSocket[`on${eventName}`] = handler; 306 } 307 } 308 uninstallEventHandlers() { 309 for (let eventName in this.events) { 310 this.webSocket[`on${eventName}`] = function() { 311 }; 312 } 313 } 314 }; 315 Connection.reopenDelay = 500; 316 Connection.prototype.events = { 317 message(event2) { 318 if (!this.isProtocolSupported()) { 319 return; 320 } 321 const { identifier, message, reason, reconnect, type } = JSON.parse(event2.data); 322 this.monitor.recordMessage(); 323 switch (type) { 324 case message_types.welcome: 325 if (this.triedToReconnect()) { 326 this.reconnectAttempted = true; 327 } 328 this.monitor.recordConnect(); 329 return this.subscriptions.reload(); 330 case message_types.disconnect: 331 logger_default.log(`Disconnecting. Reason: ${reason}`); 332 return this.close({ allowReconnect: reconnect }); 333 case message_types.ping: 334 return null; 335 case message_types.confirmation: 336 this.subscriptions.confirmSubscription(identifier); 337 if (this.reconnectAttempted) { 338 this.reconnectAttempted = false; 339 return this.subscriptions.notify(identifier, "connected", { reconnected: true }); 340 } else { 341 return this.subscriptions.notify(identifier, "connected", { reconnected: false }); 342 } 343 case message_types.rejection: 344 return this.subscriptions.reject(identifier); 345 default: 346 return this.subscriptions.notify(identifier, "received", message); 347 } 348 }, 349 open() { 350 logger_default.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`); 351 this.disconnected = false; 352 if (!this.isProtocolSupported()) { 353 logger_default.log("Protocol is unsupported. Stopping monitor and disconnecting."); 354 return this.close({ allowReconnect: false }); 355 } 356 }, 357 close(event2) { 358 logger_default.log("WebSocket onclose event"); 359 if (this.disconnected) { 360 return; 361 } 362 this.disconnected = true; 363 this.monitor.recordDisconnect(); 364 return this.subscriptions.notifyAll("disconnected", { willAttemptReconnect: this.monitor.isRunning() }); 365 }, 366 error() { 367 logger_default.log("WebSocket onerror event"); 368 } 369 }; 370 connection_default = Connection; 371 } 372 }); 373 374
vendor: 1,020 bytes, lines 374-407
374// node_modules/@rails/actioncable/src/subscription.js 375 var extend, Subscription; 376 var init_subscription = __esm({ 377 "node_modules/@rails/actioncable/src/subscription.js"() { 378 extend = function(object, properties) { 379 if (properties != null) { 380 for (let key in properties) { 381 const value = properties[key]; 382 object[key] = value; 383 } 384 } 385 return object; 386 }; 387 Subscription = class { 388 constructor(consumer2, params = {}, mixin) { 389 this.consumer = consumer2; 390 this.identifier = JSON.stringify(params); 391 extend(this, mixin); 392 } 393 perform(action, data = {}) { 394 data.action = action; 395 return this.send(data); 396 } 397 send(data) { 398 return this.consumer.send({ command: "message", identifier: this.identifier, data: JSON.stringify(data) }); 399 } 400 unsubscribe() { 401 return this.consumer.subscriptions.remove(this); 402 } 403 }; 404 } 405 }); 406 407
vendor: 1,898 bytes, lines 407-455
407// node_modules/@rails/actioncable/src/subscription_guarantor.js 408 var SubscriptionGuarantor, subscription_guarantor_default; 409 var init_subscription_guarantor = __esm({ 410 "node_modules/@rails/actioncable/src/subscription_guarantor.js"() { 411 init_logger(); 412 SubscriptionGuarantor = class { 413 constructor(subscriptions) { 414 this.subscriptions = subscriptions; 415 this.pendingSubscriptions = []; 416 } 417 guarantee(subscription) { 418 if (this.pendingSubscriptions.indexOf(subscription) == -1) { 419 logger_default.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`); 420 this.pendingSubscriptions.push(subscription); 421 } else { 422 logger_default.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`); 423 } 424 this.startGuaranteeing(); 425 } 426 forget(subscription) { 427 logger_default.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`); 428 this.pendingSubscriptions = this.pendingSubscriptions.filter((s4) => s4 !== subscription); 429 } 430 startGuaranteeing() { 431 this.stopGuaranteeing(); 432 this.retrySubscribing(); 433 } 434 stopGuaranteeing() { 435 clearTimeout(this.retryTimeout); 436 } 437 retrySubscribing() { 438 this.retryTimeout = setTimeout( 439 () => { 440 if (this.subscriptions && typeof this.subscriptions.subscribe === "function") { 441 this.pendingSubscriptions.map((subscription) => { 442 logger_default.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`); 443 this.subscriptions.subscribe(subscription); 444 }); 445 } 446 }, 447 500 448 ); 449 } 450 }; 451 subscription_guarantor_default = SubscriptionGuarantor; 452 } 453 }); 454 455
vendor: 3,113 bytes, lines 455-535
455// node_modules/@rails/actioncable/src/subscriptions.js 456 var Subscriptions; 457 var init_subscriptions = __esm({ 458 "node_modules/@rails/actioncable/src/subscriptions.js"() { 459 init_subscription(); 460 init_subscription_guarantor(); 461 init_logger(); 462 Subscriptions = class { 463 constructor(consumer2) { 464 this.consumer = consumer2; 465 this.guarantor = new subscription_guarantor_default(this); 466 this.subscriptions = []; 467 } 468 create(channelName, mixin) { 469 const channel = channelName; 470 const params = typeof channel === "object" ? channel : { channel }; 471 const subscription = new Subscription(this.consumer, params, mixin); 472 return this.add(subscription); 473 } 474 add(subscription) { 475 this.subscriptions.push(subscription); 476 this.consumer.ensureActiveConnection(); 477 this.notify(subscription, "initialized"); 478 this.subscribe(subscription); 479 return subscription; 480 } 481 remove(subscription) { 482 this.forget(subscription); 483 if (!this.findAll(subscription.identifier).length) { 484 this.sendCommand(subscription, "unsubscribe"); 485 } 486 return subscription; 487 } 488 reject(identifier) { 489 return this.findAll(identifier).map((subscription) => { 490 this.forget(subscription); 491 this.notify(subscription, "rejected"); 492 return subscription; 493 }); 494 } 495 forget(subscription) { 496 this.guarantor.forget(subscription); 497 this.subscriptions = this.subscriptions.filter((s4) => s4 !== subscription); 498 return subscription; 499 } 500 findAll(identifier) { 501 return this.subscriptions.filter((s4) => s4.identifier === identifier); 502 } 503 reload() { 504 return this.subscriptions.map((subscription) => this.subscribe(subscription)); 505 } 506 notifyAll(callbackName, ...args) { 507 return this.subscriptions.map((subscription) => this.notify(subscription, callbackName, ...args)); 508 } 509 notify(subscription, callbackName, ...args) { 510 let subscriptions; 511 if (typeof subscription === "string") { 512 subscriptions = this.findAll(subscription); 513 } else { 514 subscriptions = [subscription]; 515 } 516 return subscriptions.map((subscription2) => typeof subscription2[callbackName] === "function" ? subscription2[callbackName](...args) : void 0); 517 } 518 subscribe(subscription) { 519 if (this.sendCommand(subscription, "subscribe")) { 520 this.guarantor.guarantee(subscription); 521 } 522 } 523 confirmSubscription(identifier) { 524 logger_default.log(`Subscription confirmed ${identifier}`); 525 this.findAll(identifier).map((subscription) => this.guarantor.forget(subscription)); 526 } 527 sendCommand(subscription, command) { 528 const { identifier } = subscription; 529 return this.consumer.send({ command, identifier }); 530 } 531 }; 532 } 533 }); 534 535
vendor: 1,402 bytes, lines 535-586
535// node_modules/@rails/actioncable/src/consumer.js 536 function createWebSocketURL(url) { 537 if (typeof url === "function") { 538 url = url(); 539 } 540 if (url && !/^wss?:/i.test(url)) { 541 const a4 = document.createElement("a"); 542 a4.href = url; 543 a4.href = a4.href; 544 a4.protocol = a4.protocol.replace("http", "ws"); 545 return a4.href; 546 } else { 547 return url; 548 } 549 } 550 var Consumer; 551 var init_consumer = __esm({ 552 "node_modules/@rails/actioncable/src/consumer.js"() { 553 init_connection(); 554 init_subscriptions(); 555 Consumer = class { 556 constructor(url) { 557 this._url = url; 558 this.subscriptions = new Subscriptions(this); 559 this.connection = new connection_default(this); 560 this.subprotocols = []; 561 } 562 get url() { 563 return createWebSocketURL(this._url); 564 } 565 send(data) { 566 return this.connection.send(data); 567 } 568 connect() { 569 return this.connection.open(); 570 } 571 disconnect() { 572 return this.connection.close({ allowReconnect: false }); 573 } 574 ensureActiveConnection() { 575 if (!this.connection.isActive()) { 576 return this.connection.open(); 577 } 578 } 579 addSubProtocol(subprotocol) { 580 this.subprotocols = [...this.subprotocols, subprotocol]; 581 } 582 }; 583 } 584 }); 585 586
vendor: 1,259 bytes, lines 586-625
586// node_modules/@rails/actioncable/src/index.js 587 var src_exports = {}; 588 __export(src_exports, { 589 Connection: () => connection_default, 590 ConnectionMonitor: () => connection_monitor_default, 591 Consumer: () => Consumer, 592 INTERNAL: () => internal_default, 593 Subscription: () => Subscription, 594 SubscriptionGuarantor: () => subscription_guarantor_default, 595 Subscriptions: () => Subscriptions, 596 adapters: () => adapters_default, 597 createConsumer: () => createConsumer, 598 createWebSocketURL: () => createWebSocketURL, 599 getConfig: () => getConfig, 600 logger: () => logger_default 601 }); 602 function createConsumer(url = getConfig("url") || internal_default.default_mount_path) { 603 return new Consumer(url); 604 } 605 function getConfig(name) { 606 const element = document.head.querySelector(`meta[name='action-cable-${name}']`); 607 if (element) { 608 return element.getAttribute("content"); 609 } 610 } 611 var init_src = __esm({ 612 "node_modules/@rails/actioncable/src/index.js"() { 613 init_connection(); 614 init_connection_monitor(); 615 init_consumer(); 616 init_internal(); 617 init_subscription(); 618 init_subscriptions(); 619 init_subscription_guarantor(); 620 init_adapters(); 621 init_logger(); 622 } 623 }); 624 625
vendor: 154,670 bytes, lines 625-4593
625// node_modules/moment/moment.js 626 var require_moment = __commonJS({ 627 "node_modules/moment/moment.js"(exports, module) { 628 (function(global, factory) { 629 typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.moment = factory(); 630 })(exports, function() { 631 "use strict"; 632 var hookCallback; 633 function hooks() { 634 return hookCallback.apply(null, arguments); 635 } 636 function setHookCallback(callback) { 637 hookCallback = callback; 638 } 639 function isArray(input) { 640 return input instanceof Array || Object.prototype.toString.call(input) === "[object Array]"; 641 } 642 function isObject3(input) { 643 return input != null && Object.prototype.toString.call(input) === "[object Object]"; 644 } 645 function hasOwnProp(a4, b4) { 646 return Object.prototype.hasOwnProperty.call(a4, b4); 647 } 648 function isObjectEmpty(obj) { 649 if (Object.getOwnPropertyNames) { 650 return Object.getOwnPropertyNames(obj).length === 0; 651 } else { 652 var k4; 653 for (k4 in obj) { 654 if (hasOwnProp(obj, k4)) { 655 return false; 656 } 657 } 658 return true; 659 } 660 } 661 function isUndefined(input) { 662 return input === void 0; 663 } 664 function isNumber(input) { 665 return typeof input === "number" || Object.prototype.toString.call(input) === "[object Number]"; 666 } 667 function isDate(input) { 668 return input instanceof Date || Object.prototype.toString.call(input) === "[object Date]"; 669 } 670 function map(arr, fn3) { 671 var res = [], i4, arrLen = arr.length; 672 for (i4 = 0; i4 < arrLen; ++i4) { 673 res.push(fn3(arr[i4], i4)); 674 } 675 return res; 676 } 677 function extend5(a4, b4) { 678 for (var i4 in b4) { 679 if (hasOwnProp(b4, i4)) { 680 a4[i4] = b4[i4]; 681 } 682 } 683 if (hasOwnProp(b4, "toString")) { 684 a4.toString = b4.toString; 685 } 686 if (hasOwnProp(b4, "valueOf")) { 687 a4.valueOf = b4.valueOf; 688 } 689 return a4; 690 } 691 function createUTC(input, format2, locale2, strict) { 692 return createLocalOrUTC(input, format2, locale2, strict, true).utc(); 693 } 694 function defaultParsingFlags() { 695 return { 696 empty: false, 697 unusedTokens: [], 698 unusedInput: [], 699 overflow: -2, 700 charsLeftOver: 0, 701 nullInput: false, 702 invalidEra: null, 703 invalidMonth: null, 704 invalidFormat: false, 705 userInvalidated: false, 706 iso: false, 707 parsedDateParts: [], 708 era: null, 709 meridiem: null, 710 rfc2822: false, 711 weekdayMismatch: false 712 }; 713 } 714 function getParsingFlags(m5) { 715 if (m5._pf == null) { 716 m5._pf = defaultParsingFlags(); 717 } 718 return m5._pf; 719 } 720 var some; 721 if (Array.prototype.some) { 722 some = Array.prototype.some; 723 } else { 724 some = function(fun) { 725 var t5 = Object(this), len = t5.length >>> 0, i4; 726 for (i4 = 0; i4 < len; i4++) { 727 if (i4 in t5 && fun.call(this, t5[i4], i4, t5)) { 728 return true; 729 } 730 } 731 return false; 732 }; 733 } 734 function isValid(m5) { 735 var flags = null, parsedParts = false, isNowValid = m5._d && !isNaN(m5._d.getTime()); 736 if (isNowValid) { 737 flags = getParsingFlags(m5); 738 parsedParts = some.call(flags.parsedDateParts, function(i4) { 739 return i4 != null; 740 }); 741 isNowValid = flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || flags.meridiem && parsedParts); 742 if (m5._strict) { 743 isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === void 0; 744 } 745 } 746 if (Object.isFrozen == null || !Object.isFrozen(m5)) { 747 m5._isValid = isNowValid; 748 } else { 749 return isNowValid; 750 } 751 return m5._isValid; 752 } 753 function createInvalid(flags) { 754 var m5 = createUTC(NaN); 755 if (flags != null) { 756 extend5(getParsingFlags(m5), flags); 757 } else { 758 getParsingFlags(m5).userInvalidated = true; 759 } 760 return m5; 761 } 762 var momentProperties = hooks.momentProperties = [], updateInProgress = false; 763 function copyConfig(to3, from2) { 764 var i4, prop, val, momentPropertiesLen = momentProperties.length; 765 if (!isUndefined(from2._isAMomentObject)) { 766 to3._isAMomentObject = from2._isAMomentObject; 767 } 768 if (!isUndefined(from2._i)) { 769 to3._i = from2._i; 770 } 771 if (!isUndefined(from2._f)) { 772 to3._f = from2._f; 773 } 774 if (!isUndefined(from2._l)) { 775 to3._l = from2._l; 776 } 777 if (!isUndefined(from2._strict)) { 778 to3._strict = from2._strict; 779 } 780 if (!isUndefined(from2._tzm)) { 781 to3._tzm = from2._tzm; 782 } 783 if (!isUndefined(from2._isUTC)) { 784 to3._isUTC = from2._isUTC; 785 } 786 if (!isUndefined(from2._offset)) { 787 to3._offset = from2._offset; 788 } 789 if (!isUndefined(from2._pf)) { 790 to3._pf = getParsingFlags(from2); 791 } 792 if (!isUndefined(from2._locale)) { 793 to3._locale = from2._locale; 794 } 795 if (momentPropertiesLen > 0) { 796 for (i4 = 0; i4 < momentPropertiesLen; i4++) { 797 prop = momentProperties[i4]; 798 val = from2[prop]; 799 if (!isUndefined(val)) { 800 to3[prop] = val; 801 } 802 } 803 } 804 return to3; 805 } 806 function Moment3(config2) { 807 copyConfig(this, config2); 808 this._d = new Date(config2._d != null ? config2._d.getTime() : NaN); 809 if (!this.isValid()) { 810 this._d = new Date(NaN); 811 } 812 if (updateInProgress === false) { 813 updateInProgress = true; 814 hooks.updateOffset(this); 815 updateInProgress = false; 816 } 817 } 818 function isMoment(obj) { 819 return obj instanceof Moment3 || obj != null && obj._isAMomentObject != null; 820 } 821 function warn(msg) { 822 if (hooks.suppressDeprecationWarnings === false && typeof console !== "undefined" && console.warn) { 823 console.warn("Deprecation warning: " + msg); 824 } 825 } 826 function deprecate(msg, fn3) { 827 var firstTime = true; 828 return extend5(function() { 829 if (hooks.deprecationHandler != null) { 830 hooks.deprecationHandler(null, msg); 831 } 832 if (firstTime) { 833 var args = [], arg, i4, key, argLen = arguments.length; 834 for (i4 = 0; i4 < argLen; i4++) { 835 arg = ""; 836 if (typeof arguments[i4] === "object") { 837 arg += "\n[" + i4 + "] "; 838 for (key in arguments[0]) { 839 if (hasOwnProp(arguments[0], key)) { 840 arg += key + ": " + arguments[0][key] + ", "; 841 } 842 } 843 arg = arg.slice(0, -2); 844 } else { 845 arg = arguments[i4]; 846 } 847 args.push(arg); 848 } 849 warn( 850 msg + "\nArguments: " + Array.prototype.slice.call(args).join("") + "\n" + new Error().stack 851 ); 852 firstTime = false; 853 } 854 return fn3.apply(this, arguments); 855 }, fn3); 856 } 857 var deprecations = {}; 858 function deprecateSimple(name, msg) { 859 if (hooks.deprecationHandler != null) { 860 hooks.deprecationHandler(name, msg); 861 } 862 if (!deprecations[name]) { 863 warn(msg); 864 deprecations[name] = true; 865 } 866 } 867 hooks.suppressDeprecationWarnings = false; 868 hooks.deprecationHandler = null; 869 function isFunction(input) { 870 return typeof Function !== "undefined" && input instanceof Function || Object.prototype.toString.call(input) === "[object Function]"; 871 } 872 function set(config2) { 873 var prop, i4; 874 for (i4 in config2) { 875 if (hasOwnProp(config2, i4)) { 876 prop = config2[i4]; 877 if (isFunction(prop)) { 878 this[i4] = prop; 879 } else { 880 this["_" + i4] = prop; 881 } 882 } 883 } 884 this._config = config2; 885 this._dayOfMonthOrdinalParseLenient = new RegExp( 886 (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source 887 ); 888 } 889 function mergeConfigs(parentConfig, childConfig) { 890 var res = extend5({}, parentConfig), prop; 891 for (prop in childConfig) { 892 if (hasOwnProp(childConfig, prop)) { 893 if (isObject3(parentConfig[prop]) && isObject3(childConfig[prop])) { 894 res[prop] = {}; 895 extend5(res[prop], parentConfig[prop]); 896 extend5(res[prop], childConfig[prop]); 897 } else if (childConfig[prop] != null) { 898 res[prop] = childConfig[prop]; 899 } else { 900 delete res[prop]; 901 } 902 } 903 } 904 for (prop in parentConfig) { 905 if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject3(parentConfig[prop])) { 906 res[prop] = extend5({}, res[prop]); 907 } 908 } 909 return res; 910 } 911 function Locale(config2) { 912 if (config2 != null) { 913 this.set(config2); 914 } 915 } 916 var keys; 917 if (Object.keys) { 918 keys = Object.keys; 919 } else { 920 keys = function(obj) { 921 var i4, res = []; 922 for (i4 in obj) { 923 if (hasOwnProp(obj, i4)) { 924 res.push(i4); 925 } 926 } 927 return res; 928 }; 929 } 930 var defaultCalendar = { 931 sameDay: "[Today at] LT", 932 nextDay: "[Tomorrow at] LT", 933 nextWeek: "dddd [at] LT", 934 lastDay: "[Yesterday at] LT", 935 lastWeek: "[Last] dddd [at] LT", 936 sameElse: "L" 937 }; 938 function calendar(key, mom, now4) { 939 var output = this._calendar[key] || this._calendar["sameElse"]; 940 return isFunction(output) ? output.call(mom, now4) : output; 941 } 942 function zeroFill(number, targetLength, forceSign) { 943 var absNumber = "" + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign2 = number >= 0; 944 return (sign2 ? forceSign ? "+" : "" : "-") + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; 945 } 946 var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; 947 function addFormatToken(token2, padded, ordinal2, callback) { 948 var func = callback; 949 if (typeof callback === "string") { 950 func = function() { 951 return this[callback](); 952 }; 953 } 954 if (token2) { 955 formatTokenFunctions[token2] = func; 956 } 957 if (padded) { 958 formatTokenFunctions[padded[0]] = function() { 959 return zeroFill(func.apply(this, arguments), padded[1], padded[2]); 960 }; 961 } 962 if (ordinal2) { 963 formatTokenFunctions[ordinal2] = function() { 964 return this.localeData().ordinal( 965 func.apply(this, arguments), 966 token2 967 ); 968 }; 969 } 970 } 971 function removeFormattingTokens(input) { 972 if (input.match(/\[[\s\S]/)) { 973 return input.replace(/^\[|\]$/g, ""); 974 } 975 return input.replace(/\\/g, ""); 976 } 977 function makeFormatFunction(format2) { 978 var array = format2.match(formattingTokens), i4, length; 979 for (i4 = 0, length = array.length; i4 < length; i4++) { 980 if (formatTokenFunctions[array[i4]]) { 981 array[i4] = formatTokenFunctions[array[i4]]; 982 } else { 983 array[i4] = removeFormattingTokens(array[i4]); 984 } 985 } 986 return function(mom) { 987 var output = "", i5; 988 for (i5 = 0; i5 < length; i5++) { 989 output += isFunction(array[i5]) ? array[i5].call(mom, format2) : array[i5]; 990 } 991 return output; 992 }; 993 } 994 function formatMoment(m5, format2) { 995 if (!m5.isValid()) { 996 return m5.localeData().invalidDate(); 997 } 998 format2 = expandFormat(format2, m5.localeData()); 999 formatFunctions[format2] = formatFunctions[format2] || makeFormatFunction(format2); 1000 return formatFunctions[format2](m5); 1001 } 1002 function expandFormat(format2, locale2) { 1003 var i4 = 5; 1004 function replaceLongDateFormatTokens(input) { 1005 return locale2.longDateFormat(input) || input; 1006 } 1007 localFormattingTokens.lastIndex = 0; 1008 while (i4 >= 0 && localFormattingTokens.test(format2)) { 1009 format2 = format2.replace( 1010 localFormattingTokens, 1011 replaceLongDateFormatTokens 1012 ); 1013 localFormattingTokens.lastIndex = 0; 1014 i4 -= 1; 1015 } 1016 return format2; 1017 } 1018 var defaultLongDateFormat = { 1019 LTS: "h:mm:ss A", 1020 LT: "h:mm A", 1021 L: "MM/DD/YYYY", 1022 LL: "MMMM D, YYYY", 1023 LLL: "MMMM D, YYYY h:mm A", 1024 LLLL: "dddd, MMMM D, YYYY h:mm A" 1025 }; 1026 function longDateFormat(key) { 1027 var format2 = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; 1028 if (format2 || !formatUpper) { 1029 return format2; 1030 } 1031 this._longDateFormat[key] = formatUpper.match(formattingTokens).map(function(tok) { 1032 if (tok === "MMMM" || tok === "MM" || tok === "DD" || tok === "dddd") { 1033 return tok.slice(1); 1034 } 1035 return tok; 1036 }).join(""); 1037 return this._longDateFormat[key]; 1038 } 1039 var defaultInvalidDate = "Invalid date"; 1040 function invalidDate() { 1041 return this._invalidDate; 1042 } 1043 var defaultOrdinal = "%d", defaultDayOfMonthOrdinalParse = /\d{1,2}/; 1044 function ordinal(number) { 1045 return this._ordinal.replace("%d", number); 1046 } 1047 var defaultRelativeTime = { 1048 future: "in %s", 1049 past: "%s ago", 1050 s: "a few seconds", 1051 ss: "%d seconds", 1052 m: "a minute", 1053 mm: "%d minutes", 1054 h: "an hour", 1055 hh: "%d hours", 1056 d: "a day", 1057 dd: "%d days", 1058 w: "a week", 1059 ww: "%d weeks", 1060 M: "a month", 1061 MM: "%d months", 1062 y: "a year", 1063 yy: "%d years" 1064 }; 1065 function relativeTime(number, withoutSuffix, string, isFuture) { 1066 var output = this._relativeTime[string]; 1067 return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); 1068 } 1069 function pastFuture(diff2, output) { 1070 var format2 = this._relativeTime[diff2 > 0 ? "future" : "past"]; 1071 return isFunction(format2) ? format2(output) : format2.replace(/%s/i, output); 1072 } 1073 var aliases = { 1074 D: "date", 1075 dates: "date", 1076 date: "date", 1077 d: "day", 1078 days: "day", 1079 day: "day", 1080 e: "weekday", 1081 weekdays: "weekday", 1082 weekday: "weekday", 1083 E: "isoWeekday", 1084 isoweekdays: "isoWeekday", 1085 isoweekday: "isoWeekday", 1086 DDD: "dayOfYear", 1087 dayofyears: "dayOfYear", 1088 dayofyear: "dayOfYear", 1089 h: "hour", 1090 hours: "hour", 1091 hour: "hour", 1092 ms: "millisecond", 1093 milliseconds: "millisecond", 1094 millisecond: "millisecond", 1095 m: "minute", 1096 minutes: "minute", 1097 minute: "minute", 1098 M: "month", 1099 months: "month", 1100 month: "month", 1101 Q: "quarter", 1102 quarters: "quarter", 1103 quarter: "quarter", 1104 s: "second", 1105 seconds: "second", 1106 second: "second", 1107 gg: "weekYear", 1108 weekyears: "weekYear", 1109 weekyear: "weekYear", 1110 GG: "isoWeekYear", 1111 isoweekyears: "isoWeekYear", 1112 isoweekyear: "isoWeekYear", 1113 w: "week", 1114 weeks: "week", 1115 week: "week", 1116 W: "isoWeek", 1117 isoweeks: "isoWeek", 1118 isoweek: "isoWeek", 1119 y: "year", 1120 years: "year", 1121 year: "year" 1122 }; 1123 function normalizeUnits(units) { 1124 return typeof units === "string" ? aliases[units] || aliases[units.toLowerCase()] : void 0; 1125 } 1126 function normalizeObjectUnits(inputObject) { 1127 var normalizedInput = {}, normalizedProp, prop; 1128 for (prop in inputObject) { 1129 if (hasOwnProp(inputObject, prop)) { 1130 normalizedProp = normalizeUnits(prop); 1131 if (normalizedProp) { 1132 normalizedInput[normalizedProp] = inputObject[prop]; 1133 } 1134 } 1135 } 1136 return normalizedInput; 1137 } 1138 var priorities = { 1139 date: 9, 1140 day: 11, 1141 weekday: 11, 1142 isoWeekday: 11, 1143 dayOfYear: 4, 1144 hour: 13, 1145 millisecond: 16, 1146 minute: 14, 1147 month: 8, 1148 quarter: 7, 1149 second: 15, 1150 weekYear: 1, 1151 isoWeekYear: 1, 1152 week: 5, 1153 isoWeek: 5, 1154 year: 1 1155 }; 1156 function getPrioritizedUnits(unitsObj) { 1157 var units = [], u4; 1158 for (u4 in unitsObj) { 1159 if (hasOwnProp(unitsObj, u4)) { 1160 units.push({ unit: u4, priority: priorities[u4] }); 1161 } 1162 } 1163 units.sort(function(a4, b4) { 1164 return a4.priority - b4.priority; 1165 }); 1166 return units; 1167 } 1168 var match1 = /\d/, match2 = /\d\d/, match3 = /\d{3}/, match4 = /\d{4}/, match6 = /[+-]?\d{6}/, match1to2 = /\d\d?/, match3to4 = /\d\d\d\d?/, match5to6 = /\d\d\d\d\d\d?/, match1to3 = /\d{1,3}/, match1to4 = /\d{1,4}/, match1to6 = /[+-]?\d{1,6}/, matchUnsigned = /\d+/, matchSigned = /[+-]?\d+/, matchOffset = /Z|[+-]\d\d:?\d\d/gi, matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, match1to2NoLeadingZero = /^[1-9]\d?/, match1to2HasZero = /^([1-9]\d|\d)/, regexes; 1169 regexes = {}; 1170 function addRegexToken(token2, regex, strictRegex) { 1171 regexes[token2] = isFunction(regex) ? regex : function(isStrict, localeData2) { 1172 return isStrict && strictRegex ? strictRegex : regex; 1173 }; 1174 } 1175 function getParseRegexForToken(token2, config2) { 1176 if (!hasOwnProp(regexes, token2)) { 1177 return new RegExp(unescapeFormat(token2)); 1178 } 1179 return regexes[token2](config2._strict, config2._locale); 1180 } 1181 function unescapeFormat(s4) { 1182 return regexEscape( 1183 s4.replace("\\", "").replace( 1184 /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, 1185 function(matched, p1, p22, p32, p4) { 1186 return p1 || p22 || p32 || p4; 1187 } 1188 ) 1189 ); 1190 } 1191 function regexEscape(s4) { 1192 return s4.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); 1193 } 1194 function absFloor(number) { 1195 if (number < 0) { 1196 return Math.ceil(number) || 0; 1197 } else { 1198 return Math.floor(number); 1199 } 1200 } 1201 function toInt(argumentForCoercion) { 1202 var coercedNumber = +argumentForCoercion, value = 0; 1203 if (coercedNumber !== 0 && isFinite(coercedNumber)) { 1204 value = absFloor(coercedNumber); 1205 } 1206 return value; 1207 } 1208 var tokens = {}; 1209 function addParseToken(token2, callback) { 1210 var i4, func = callback, tokenLen; 1211 if (typeof token2 === "string") { 1212 token2 = [token2]; 1213 } 1214 if (isNumber(callback)) { 1215 func = function(input, array) { 1216 array[callback] = toInt(input); 1217 }; 1218 } 1219 tokenLen = token2.length; 1220 for (i4 = 0; i4 < tokenLen; i4++) { 1221 tokens[token2[i4]] = func; 1222 } 1223 } 1224 function addWeekParseToken(token2, callback) { 1225 addParseToken(token2, function(input, array, config2, token3) { 1226 config2._w = config2._w || {}; 1227 callback(input, config2._w, config2, token3); 1228 }); 1229 } 1230 function addTimeToArrayFromToken(token2, input, config2) { 1231 if (input != null && hasOwnProp(tokens, token2)) { 1232 tokens[token2](input, config2._a, config2, token2); 1233 } 1234 } 1235 function isLeapYear(year) { 1236 return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; 1237 } 1238 var YEAR = 0, MONTH = 1, DATE = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6, WEEK = 7, WEEKDAY = 8; 1239 addFormatToken("Y", 0, 0, function() { 1240 var y4 = this.year(); 1241 return y4 <= 9999 ? zeroFill(y4, 4) : "+" + y4; 1242 }); 1243 addFormatToken(0, ["YY", 2], 0, function() { 1244 return this.year() % 100; 1245 }); 1246 addFormatToken(0, ["YYYY", 4], 0, "year"); 1247 addFormatToken(0, ["YYYYY", 5], 0, "year"); 1248 addFormatToken(0, ["YYYYYY", 6, true], 0, "year"); 1249 addRegexToken("Y", matchSigned); 1250 addRegexToken("YY", match1to2, match2); 1251 addRegexToken("YYYY", match1to4, match4); 1252 addRegexToken("YYYYY", match1to6, match6); 1253 addRegexToken("YYYYYY", match1to6, match6); 1254 addParseToken(["YYYYY", "YYYYYY"], YEAR); 1255 addParseToken("YYYY", function(input, array) { 1256 array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); 1257 }); 1258 addParseToken("YY", function(input, array) { 1259 array[YEAR] = hooks.parseTwoDigitYear(input); 1260 }); 1261 addParseToken("Y", function(input, array) { 1262 array[YEAR] = parseInt(input, 10); 1263 }); 1264 function daysInYear(year) { 1265 return isLeapYear(year) ? 366 : 365; 1266 } 1267 hooks.parseTwoDigitYear = function(input) { 1268 return toInt(input) + (toInt(input) > 68 ? 1900 : 2e3); 1269 }; 1270 var getSetYear = makeGetSet("FullYear", true); 1271 function getIsLeapYear() { 1272 return isLeapYear(this.year()); 1273 } 1274 function makeGetSet(unit, keepTime) { 1275 return function(value) { 1276 if (value != null) { 1277 set$1(this, unit, value); 1278 hooks.updateOffset(this, keepTime); 1279 return this; 1280 } else { 1281 return get2(this, unit); 1282 } 1283 }; 1284 } 1285 function get2(mom, unit) { 1286 if (!mom.isValid()) { 1287 return NaN; 1288 } 1289 var d3 = mom._d, isUTC = mom._isUTC; 1290 switch (unit) { 1291 case "Milliseconds": 1292 return isUTC ? d3.getUTCMilliseconds() : d3.getMilliseconds(); 1293 case "Seconds": 1294 return isUTC ? d3.getUTCSeconds() : d3.getSeconds(); 1295 case "Minutes": 1296 return isUTC ? d3.getUTCMinutes() : d3.getMinutes(); 1297 case "Hours": 1298 return isUTC ? d3.getUTCHours() : d3.getHours(); 1299 case "Date": 1300 return isUTC ? d3.getUTCDate() : d3.getDate(); 1301 case "Day": 1302 return isUTC ? d3.getUTCDay() : d3.getDay(); 1303 case "Month": 1304 return isUTC ? d3.getUTCMonth() : d3.getMonth(); 1305 case "FullYear": 1306 return isUTC ? d3.getUTCFullYear() : d3.getFullYear(); 1307 default: 1308 return NaN; 1309 } 1310 } 1311 function set$1(mom, unit, value) { 1312 var d3, isUTC, year, month, date; 1313 if (!mom.isValid() || isNaN(value)) { 1314 return; 1315 } 1316 d3 = mom._d; 1317 isUTC = mom._isUTC; 1318 switch (unit) { 1319 case "Milliseconds": 1320 return void (isUTC ? d3.setUTCMilliseconds(value) : d3.setMilliseconds(value)); 1321 case "Seconds": 1322 return void (isUTC ? d3.setUTCSeconds(value) : d3.setSeconds(value)); 1323 case "Minutes": 1324 return void (isUTC ? d3.setUTCMinutes(value) : d3.setMinutes(value)); 1325 case "Hours": 1326 return void (isUTC ? d3.setUTCHours(value) : d3.setHours(value)); 1327 case "Date": 1328 return void (isUTC ? d3.setUTCDate(value) : d3.setDate(value)); 1329 case "FullYear": 1330 break; 1331 default: 1332 return; 1333 } 1334 year = value; 1335 month = mom.month(); 1336 date = mom.date(); 1337 date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date; 1338 void (isUTC ? d3.setUTCFullYear(year, month, date) : d3.setFullYear(year, month, date)); 1339 } 1340 function stringGet(units) { 1341 units = normalizeUnits(units); 1342 if (isFunction(this[units])) { 1343 return this[units](); 1344 } 1345 return this; 1346 } 1347 function stringSet(units, value) { 1348 if (typeof units === "object") { 1349 units = normalizeObjectUnits(units); 1350 var prioritized = getPrioritizedUnits(units), i4, prioritizedLen = prioritized.length; 1351 for (i4 = 0; i4 < prioritizedLen; i4++) { 1352 this[prioritized[i4].unit](units[prioritized[i4].unit]); 1353 } 1354 } else { 1355 units = normalizeUnits(units); 1356 if (isFunction(this[units])) { 1357 return this[units](value); 1358 } 1359 } 1360 return this; 1361 } 1362 function mod(n3, x5) { 1363 return (n3 % x5 + x5) % x5; 1364 } 1365 var indexOf2; 1366 if (Array.prototype.indexOf) { 1367 indexOf2 = Array.prototype.indexOf; 1368 } else { 1369 indexOf2 = function(o3) { 1370 var i4; 1371 for (i4 = 0; i4 < this.length; ++i4) { 1372 if (this[i4] === o3) { 1373 return i4; 1374 } 1375 } 1376 return -1; 1377 }; 1378 } 1379 function daysInMonth(year, month) { 1380 if (isNaN(year) || isNaN(month)) { 1381 return NaN; 1382 } 1383 var modMonth = mod(month, 12); 1384 year += (month - modMonth) / 12; 1385 return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - modMonth % 7 % 2; 1386 } 1387 addFormatToken("M", ["MM", 2], "Mo", function() { 1388 return this.month() + 1; 1389 }); 1390 addFormatToken("MMM", 0, 0, function(format2) { 1391 return this.localeData().monthsShort(this, format2); 1392 }); 1393 addFormatToken("MMMM", 0, 0, function(format2) { 1394 return this.localeData().months(this, format2); 1395 }); 1396 addRegexToken("M", match1to2, match1to2NoLeadingZero); 1397 addRegexToken("MM", match1to2, match2); 1398 addRegexToken("MMM", function(isStrict, locale2) { 1399 return locale2.monthsShortRegex(isStrict); 1400 }); 1401 addRegexToken("MMMM", function(isStrict, locale2) { 1402 return locale2.monthsRegex(isStrict); 1403 }); 1404 addParseToken(["M", "MM"], function(input, array) { 1405 array[MONTH] = toInt(input) - 1; 1406 }); 1407 addParseToken(["MMM", "MMMM"], function(input, array, config2, token2) { 1408 var month = config2._locale.monthsParse(input, token2, config2._strict); 1409 if (month != null) { 1410 array[MONTH] = month; 1411 } else { 1412 getParsingFlags(config2).invalidMonth = input; 1413 } 1414 }); 1415 var defaultLocaleMonths = "January_February_March_April_May_June_July_August_September_October_November_December".split( 1416 "_" 1417 ), defaultLocaleMonthsShort = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord; 1418 function localeMonths(m5, format2) { 1419 if (!m5) { 1420 return isArray(this._months) ? this._months : this._months["standalone"]; 1421 } 1422 return isArray(this._months) ? this._months[m5.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format2) ? "format" : "standalone"][m5.month()]; 1423 } 1424 function localeMonthsShort(m5, format2) { 1425 if (!m5) { 1426 return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort["standalone"]; 1427 } 1428 return isArray(this._monthsShort) ? this._monthsShort[m5.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format2) ? "format" : "standalone"][m5.month()]; 1429 } 1430 function handleStrictParse(monthName, format2, strict) { 1431 var i4, ii2, mom, llc = monthName.toLocaleLowerCase(); 1432 if (!this._monthsParse) { 1433 this._monthsParse = []; 1434 this._longMonthsParse = []; 1435 this._shortMonthsParse = []; 1436 for (i4 = 0; i4 < 12; ++i4) { 1437 mom = createUTC([2e3, i4]); 1438 this._shortMonthsParse[i4] = this.monthsShort( 1439 mom, 1440 "" 1441 ).toLocaleLowerCase(); 1442 this._longMonthsParse[i4] = this.months(mom, "").toLocaleLowerCase(); 1443 } 1444 } 1445 if (strict) { 1446 if (format2 === "MMM") { 1447 ii2 = indexOf2.call(this._shortMonthsParse, llc); 1448 return ii2 !== -1 ? ii2 : null; 1449 } else { 1450 ii2 = indexOf2.call(this._longMonthsParse, llc); 1451 return ii2 !== -1 ? ii2 : null; 1452 } 1453 } else { 1454 if (format2 === "MMM") { 1455 ii2 = indexOf2.call(this._shortMonthsParse, llc); 1456 if (ii2 !== -1) { 1457 return ii2; 1458 } 1459 ii2 = indexOf2.call(this._longMonthsParse, llc); 1460 return ii2 !== -1 ? ii2 : null; 1461 } else { 1462 ii2 = indexOf2.call(this._longMonthsParse, llc); 1463 if (ii2 !== -1) { 1464 return ii2; 1465 } 1466 ii2 = indexOf2.call(this._shortMonthsParse, llc); 1467 return ii2 !== -1 ? ii2 : null; 1468 } 1469 } 1470 } 1471 function localeMonthsParse(monthName, format2, strict) { 1472 var i4, mom, regex; 1473 if (this._monthsParseExact) { 1474 return handleStrictParse.call(this, monthName, format2, strict); 1475 } 1476 if (!this._monthsParse) { 1477 this._monthsParse = []; 1478 this._longMonthsParse = []; 1479 this._shortMonthsParse = []; 1480 } 1481 for (i4 = 0; i4 < 12; i4++) { 1482 mom = createUTC([2e3, i4]); 1483 if (strict && !this._longMonthsParse[i4]) { 1484 this._longMonthsParse[i4] = new RegExp( 1485 "^" + this.months(mom, "").replace(".", "") + "$", 1486 "i" 1487 ); 1488 this._shortMonthsParse[i4] = new RegExp( 1489 "^" + this.monthsShort(mom, "").replace(".", "") + "$", 1490 "i" 1491 ); 1492 } 1493 if (!strict && !this._monthsParse[i4]) { 1494 regex = "^" + this.months(mom, "") + "|^" + this.monthsShort(mom, ""); 1495 this._monthsParse[i4] = new RegExp(regex.replace(".", ""), "i"); 1496 } 1497 if (strict && format2 === "MMMM" && this._longMonthsParse[i4].test(monthName)) { 1498 return i4; 1499 } else if (strict && format2 === "MMM" && this._shortMonthsParse[i4].test(monthName)) { 1500 return i4; 1501 } else if (!strict && this._monthsParse[i4].test(monthName)) { 1502 return i4; 1503 } 1504 } 1505 } 1506 function setMonth(mom, value) { 1507 if (!mom.isValid()) { 1508 return mom; 1509 } 1510 if (typeof value === "string") { 1511 if (/^\d+$/.test(value)) { 1512 value = toInt(value); 1513 } else { 1514 value = mom.localeData().monthsParse(value); 1515 if (!isNumber(value)) { 1516 return mom; 1517 } 1518 } 1519 } 1520 var month = value, date = mom.date(); 1521 date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month)); 1522 void (mom._isUTC ? mom._d.setUTCMonth(month, date) : mom._d.setMonth(month, date)); 1523 return mom; 1524 } 1525 function getSetMonth(value) { 1526 if (value != null) { 1527 setMonth(this, value); 1528 hooks.updateOffset(this, true); 1529 return this; 1530 } else { 1531 return get2(this, "Month"); 1532 } 1533 } 1534 function getDaysInMonth() { 1535 return daysInMonth(this.year(), this.month()); 1536 } 1537 function monthsShortRegex(isStrict) { 1538 if (this._monthsParseExact) { 1539 if (!hasOwnProp(this, "_monthsRegex")) { 1540 computeMonthsParse.call(this); 1541 } 1542 if (isStrict) { 1543 return this._monthsShortStrictRegex; 1544 } else { 1545 return this._monthsShortRegex; 1546 } 1547 } else { 1548 if (!hasOwnProp(this, "_monthsShortRegex")) { 1549 this._monthsShortRegex = defaultMonthsShortRegex; 1550 } 1551 return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; 1552 } 1553 } 1554 function monthsRegex(isStrict) { 1555 if (this._monthsParseExact) { 1556 if (!hasOwnProp(this, "_monthsRegex")) { 1557 computeMonthsParse.call(this); 1558 } 1559 if (isStrict) { 1560 return this._monthsStrictRegex; 1561 } else { 1562 return this._monthsRegex; 1563 } 1564 } else { 1565 if (!hasOwnProp(this, "_monthsRegex")) { 1566 this._monthsRegex = defaultMonthsRegex; 1567 } 1568 return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; 1569 } 1570 } 1571 function computeMonthsParse() { 1572 function cmpLenRev(a4, b4) { 1573 return b4.length - a4.length; 1574 } 1575 var shortPieces = [], longPieces = [], mixedPieces = [], i4, mom, shortP, longP; 1576 for (i4 = 0; i4 < 12; i4++) { 1577 mom = createUTC([2e3, i4]); 1578 shortP = regexEscape(this.monthsShort(mom, "")); 1579 longP = regexEscape(this.months(mom, "")); 1580 shortPieces.push(shortP); 1581 longPieces.push(longP); 1582 mixedPieces.push(longP); 1583 mixedPieces.push(shortP); 1584 } 1585 shortPieces.sort(cmpLenRev); 1586 longPieces.sort(cmpLenRev); 1587 mixedPieces.sort(cmpLenRev); 1588 this._monthsRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i"); 1589 this._monthsShortRegex = this._monthsRegex; 1590 this._monthsStrictRegex = new RegExp( 1591 "^(" + longPieces.join("|") + ")", 1592 "i" 1593 ); 1594 this._monthsShortStrictRegex = new RegExp( 1595 "^(" + shortPieces.join("|") + ")", 1596 "i" 1597 ); 1598 } 1599 function createDate(y4, m5, d3, h4, M3, s4, ms) { 1600 var date; 1601 if (y4 < 100 && y4 >= 0) { 1602 date = new Date(y4 + 400, m5, d3, h4, M3, s4, ms); 1603 if (isFinite(date.getFullYear())) { 1604 date.setFullYear(y4); 1605 } 1606 } else { 1607 date = new Date(y4, m5, d3, h4, M3, s4, ms); 1608 } 1609 return date; 1610 } 1611 function createUTCDate(y4) { 1612 var date, args; 1613 if (y4 < 100 && y4 >= 0) { 1614 args = Array.prototype.slice.call(arguments); 1615 args[0] = y4 + 400; 1616 date = new Date(Date.UTC.apply(null, args)); 1617 if (isFinite(date.getUTCFullYear())) { 1618 date.setUTCFullYear(y4); 1619 } 1620 } else { 1621 date = new Date(Date.UTC.apply(null, arguments)); 1622 } 1623 return date; 1624 } 1625 function firstWeekOffset2(year, dow, doy) { 1626 var fwd = 7 + dow - doy, fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; 1627 return -fwdlw + fwd - 1; 1628 } 1629 function dayOfYearFromWeeks(year, week, weekday, dow, doy) { 1630 var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset2(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; 1631 if (dayOfYear <= 0) { 1632 resYear = year - 1; 1633 resDayOfYear = daysInYear(resYear) + dayOfYear; 1634 } else if (dayOfYear > daysInYear(year)) { 1635 resYear = year + 1; 1636 resDayOfYear = dayOfYear - daysInYear(year); 1637 } else { 1638 resYear = year; 1639 resDayOfYear = dayOfYear; 1640 } 1641 return { 1642 year: resYear, 1643 dayOfYear: resDayOfYear 1644 }; 1645 } 1646 function weekOfYear2(mom, dow, doy) { 1647 var weekOffset = firstWeekOffset2(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; 1648 if (week < 1) { 1649 resYear = mom.year() - 1; 1650 resWeek = week + weeksInYear(resYear, dow, doy); 1651 } else if (week > weeksInYear(mom.year(), dow, doy)) { 1652 resWeek = week - weeksInYear(mom.year(), dow, doy); 1653 resYear = mom.year() + 1; 1654 } else { 1655 resYear = mom.year(); 1656 resWeek = week; 1657 } 1658 return { 1659 week: resWeek, 1660 year: resYear 1661 }; 1662 } 1663 function weeksInYear(year, dow, doy) { 1664 var weekOffset = firstWeekOffset2(year, dow, doy), weekOffsetNext = firstWeekOffset2(year + 1, dow, doy); 1665 return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; 1666 } 1667 addFormatToken("w", ["ww", 2], "wo", "week"); 1668 addFormatToken("W", ["WW", 2], "Wo", "isoWeek"); 1669 addRegexToken("w", match1to2, match1to2NoLeadingZero); 1670 addRegexToken("ww", match1to2, match2); 1671 addRegexToken("W", match1to2, match1to2NoLeadingZero); 1672 addRegexToken("WW", match1to2, match2); 1673 addWeekParseToken( 1674 ["w", "ww", "W", "WW"], 1675 function(input, week, config2, token2) { 1676 week[token2.substr(0, 1)] = toInt(input); 1677 } 1678 ); 1679 function localeWeek(mom) { 1680 return weekOfYear2(mom, this._week.dow, this._week.doy).week; 1681 } 1682 var defaultLocaleWeek = { 1683 dow: 0, 1684 doy: 6 1685 }; 1686 function localeFirstDayOfWeek() { 1687 return this._week.dow; 1688 } 1689 function localeFirstDayOfYear() { 1690 return this._week.doy; 1691 } 1692 function getSetWeek(input) { 1693 var week = this.localeData().week(this); 1694 return input == null ? week : this.add((input - week) * 7, "d"); 1695 } 1696 function getSetISOWeek(input) { 1697 var week = weekOfYear2(this, 1, 4).week; 1698 return input == null ? week : this.add((input - week) * 7, "d"); 1699 } 1700 addFormatToken("d", 0, "do", "day"); 1701 addFormatToken("dd", 0, 0, function(format2) { 1702 return this.localeData().weekdaysMin(this, format2); 1703 }); 1704 addFormatToken("ddd", 0, 0, function(format2) { 1705 return this.localeData().weekdaysShort(this, format2); 1706 }); 1707 addFormatToken("dddd", 0, 0, function(format2) { 1708 return this.localeData().weekdays(this, format2); 1709 }); 1710 addFormatToken("e", 0, 0, "weekday"); 1711 addFormatToken("E", 0, 0, "isoWeekday"); 1712 addRegexToken("d", match1to2); 1713 addRegexToken("e", match1to2); 1714 addRegexToken("E", match1to2); 1715 addRegexToken("dd", function(isStrict, locale2) { 1716 return locale2.weekdaysMinRegex(isStrict); 1717 }); 1718 addRegexToken("ddd", function(isStrict, locale2) { 1719 return locale2.weekdaysShortRegex(isStrict); 1720 }); 1721 addRegexToken("dddd", function(isStrict, locale2) { 1722 return locale2.weekdaysRegex(isStrict); 1723 }); 1724 addWeekParseToken(["dd", "ddd", "dddd"], function(input, week, config2, token2) { 1725 var weekday = config2._locale.weekdaysParse(input, token2, config2._strict); 1726 if (weekday != null) { 1727 week.d = weekday; 1728 } else { 1729 getParsingFlags(config2).invalidWeekday = input; 1730 } 1731 }); 1732 addWeekParseToken(["d", "e", "E"], function(input, week, config2, token2) { 1733 week[token2] = toInt(input); 1734 }); 1735 function parseWeekday(input, locale2) { 1736 if (typeof input !== "string") { 1737 return input; 1738 } 1739 if (!isNaN(input)) { 1740 return parseInt(input, 10); 1741 } 1742 input = locale2.weekdaysParse(input); 1743 if (typeof input === "number") { 1744 return input; 1745 } 1746 return null; 1747 } 1748 function parseIsoWeekday(input, locale2) { 1749 if (typeof input === "string") { 1750 return locale2.weekdaysParse(input) % 7 || 7; 1751 } 1752 return isNaN(input) ? null : input; 1753 } 1754 function shiftWeekdays(ws, n3) { 1755 return ws.slice(n3, 7).concat(ws.slice(0, n3)); 1756 } 1757 var defaultLocaleWeekdays = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), defaultLocaleWeekdaysShort = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), defaultLocaleWeekdaysMin = "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), defaultWeekdaysRegex = matchWord, defaultWeekdaysShortRegex = matchWord, defaultWeekdaysMinRegex = matchWord; 1758 function localeWeekdays(m5, format2) { 1759 var weekdays = isArray(this._weekdays) ? this._weekdays : this._weekdays[m5 && m5 !== true && this._weekdays.isFormat.test(format2) ? "format" : "standalone"]; 1760 return m5 === true ? shiftWeekdays(weekdays, this._week.dow) : m5 ? weekdays[m5.day()] : weekdays; 1761 } 1762 function localeWeekdaysShort(m5) { 1763 return m5 === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m5 ? this._weekdaysShort[m5.day()] : this._weekdaysShort; 1764 } 1765 function localeWeekdaysMin(m5) { 1766 return m5 === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m5 ? this._weekdaysMin[m5.day()] : this._weekdaysMin; 1767 } 1768 function handleStrictParse$1(weekdayName, format2, strict) { 1769 var i4, ii2, mom, llc = weekdayName.toLocaleLowerCase(); 1770 if (!this._weekdaysParse) { 1771 this._weekdaysParse = []; 1772 this._shortWeekdaysParse = []; 1773 this._minWeekdaysParse = []; 1774 for (i4 = 0; i4 < 7; ++i4) { 1775 mom = createUTC([2e3, 1]).day(i4); 1776 this._minWeekdaysParse[i4] = this.weekdaysMin( 1777 mom, 1778 "" 1779 ).toLocaleLowerCase(); 1780 this._shortWeekdaysParse[i4] = this.weekdaysShort( 1781 mom, 1782 "" 1783 ).toLocaleLowerCase(); 1784 this._weekdaysParse[i4] = this.weekdays(mom, "").toLocaleLowerCase(); 1785 } 1786 } 1787 if (strict) { 1788 if (format2 === "dddd") { 1789 ii2 = indexOf2.call(this._weekdaysParse, llc); 1790 return ii2 !== -1 ? ii2 : null; 1791 } else if (format2 === "ddd") { 1792 ii2 = indexOf2.call(this._shortWeekdaysParse, llc); 1793 return ii2 !== -1 ? ii2 : null; 1794 } else { 1795 ii2 = indexOf2.call(this._minWeekdaysParse, llc); 1796 return ii2 !== -1 ? ii2 : null; 1797 } 1798 } else { 1799 if (format2 === "dddd") { 1800 ii2 = indexOf2.call(this._weekdaysParse, llc); 1801 if (ii2 !== -1) { 1802 return ii2; 1803 } 1804 ii2 = indexOf2.call(this._shortWeekdaysParse, llc); 1805 if (ii2 !== -1) { 1806 return ii2; 1807 } 1808 ii2 = indexOf2.call(this._minWeekdaysParse, llc); 1809 return ii2 !== -1 ? ii2 : null; 1810 } else if (format2 === "ddd") { 1811 ii2 = indexOf2.call(this._shortWeekdaysParse, llc); 1812 if (ii2 !== -1) { 1813 return ii2; 1814 } 1815 ii2 = indexOf2.call(this._weekdaysParse, llc); 1816 if (ii2 !== -1) { 1817 return ii2; 1818 } 1819 ii2 = indexOf2.call(this._minWeekdaysParse, llc); 1820 return ii2 !== -1 ? ii2 : null; 1821 } else { 1822 ii2 = indexOf2.call(this._minWeekdaysParse, llc); 1823 if (ii2 !== -1) { 1824 return ii2; 1825 } 1826 ii2 = indexOf2.call(this._weekdaysParse, llc); 1827 if (ii2 !== -1) { 1828 return ii2; 1829 } 1830 ii2 = indexOf2.call(this._shortWeekdaysParse, llc); 1831 return ii2 !== -1 ? ii2 : null; 1832 } 1833 } 1834 } 1835 function localeWeekdaysParse(weekdayName, format2, strict) { 1836 var i4, mom, regex; 1837 if (this._weekdaysParseExact) { 1838 return handleStrictParse$1.call(this, weekdayName, format2, strict); 1839 } 1840 if (!this._weekdaysParse) { 1841 this._weekdaysParse = []; 1842 this._minWeekdaysParse = []; 1843 this._shortWeekdaysParse = []; 1844 this._fullWeekdaysParse = []; 1845 } 1846 for (i4 = 0; i4 < 7; i4++) { 1847 mom = createUTC([2e3, 1]).day(i4); 1848 if (strict && !this._fullWeekdaysParse[i4]) { 1849 this._fullWeekdaysParse[i4] = new RegExp( 1850 "^" + this.weekdays(mom, "").replace(".", "\\.?") + "$", 1851 "i" 1852 ); 1853 this._shortWeekdaysParse[i4] = new RegExp( 1854 "^" + this.weekdaysShort(mom, "").replace(".", "\\.?") + "$", 1855 "i" 1856 ); 1857 this._minWeekdaysParse[i4] = new RegExp( 1858 "^" + this.weekdaysMin(mom, "").replace(".", "\\.?") + "$", 1859 "i" 1860 ); 1861 } 1862 if (!this._weekdaysParse[i4]) { 1863 regex = "^" + this.weekdays(mom, "") + "|^" + this.weekdaysShort(mom, "") + "|^" + this.weekdaysMin(mom, ""); 1864 this._weekdaysParse[i4] = new RegExp(regex.replace(".", ""), "i"); 1865 } 1866 if (strict && format2 === "dddd" && this._fullWeekdaysParse[i4].test(weekdayName)) { 1867 return i4; 1868 } else if (strict && format2 === "ddd" && this._shortWeekdaysParse[i4].test(weekdayName)) { 1869 return i4; 1870 } else if (strict && format2 === "dd" && this._minWeekdaysParse[i4].test(weekdayName)) { 1871 return i4; 1872 } else if (!strict && this._weekdaysParse[i4].test(weekdayName)) { 1873 return i4; 1874 } 1875 } 1876 } 1877 function getSetDayOfWeek(input) { 1878 if (!this.isValid()) { 1879 return input != null ? this : NaN; 1880 } 1881 var day = get2(this, "Day"); 1882 if (input != null) { 1883 input = parseWeekday(input, this.localeData()); 1884 return this.add(input - day, "d"); 1885 } else { 1886 return day; 1887 } 1888 } 1889 function getSetLocaleDayOfWeek(input) { 1890 if (!this.isValid()) { 1891 return input != null ? this : NaN; 1892 } 1893 var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; 1894 return input == null ? weekday : this.add(input - weekday, "d"); 1895 } 1896 function getSetISODayOfWeek(input) { 1897 if (!this.isValid()) { 1898 return input != null ? this : NaN; 1899 } 1900 if (input != null) { 1901 var weekday = parseIsoWeekday(input, this.localeData()); 1902 return this.day(this.day() % 7 ? weekday : weekday - 7); 1903 } else { 1904 return this.day() || 7; 1905 } 1906 } 1907 function weekdaysRegex(isStrict) { 1908 if (this._weekdaysParseExact) { 1909 if (!hasOwnProp(this, "_weekdaysRegex")) { 1910 computeWeekdaysParse.call(this); 1911 } 1912 if (isStrict) { 1913 return this._weekdaysStrictRegex; 1914 } else { 1915 return this._weekdaysRegex; 1916 } 1917 } else { 1918 if (!hasOwnProp(this, "_weekdaysRegex")) { 1919 this._weekdaysRegex = defaultWeekdaysRegex; 1920 } 1921 return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; 1922 } 1923 } 1924 function weekdaysShortRegex(isStrict) { 1925 if (this._weekdaysParseExact) { 1926 if (!hasOwnProp(this, "_weekdaysRegex")) { 1927 computeWeekdaysParse.call(this); 1928 } 1929 if (isStrict) { 1930 return this._weekdaysShortStrictRegex; 1931 } else { 1932 return this._weekdaysShortRegex; 1933 } 1934 } else { 1935 if (!hasOwnProp(this, "_weekdaysShortRegex")) { 1936 this._weekdaysShortRegex = defaultWeekdaysShortRegex; 1937 } 1938 return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; 1939 } 1940 } 1941 function weekdaysMinRegex(isStrict) { 1942 if (this._weekdaysParseExact) { 1943 if (!hasOwnProp(this, "_weekdaysRegex")) { 1944 computeWeekdaysParse.call(this); 1945 } 1946 if (isStrict) { 1947 return this._weekdaysMinStrictRegex; 1948 } else { 1949 return this._weekdaysMinRegex; 1950 } 1951 } else { 1952 if (!hasOwnProp(this, "_weekdaysMinRegex")) { 1953 this._weekdaysMinRegex = defaultWeekdaysMinRegex; 1954 } 1955 return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; 1956 } 1957 } 1958 function computeWeekdaysParse() { 1959 function cmpLenRev(a4, b4) { 1960 return b4.length - a4.length; 1961 } 1962 var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i4, mom, minp, shortp, longp; 1963 for (i4 = 0; i4 < 7; i4++) { 1964 mom = createUTC([2e3, 1]).day(i4); 1965 minp = regexEscape(this.weekdaysMin(mom, "")); 1966 shortp = regexEscape(this.weekdaysShort(mom, "")); 1967 longp = regexEscape(this.weekdays(mom, "")); 1968 minPieces.push(minp); 1969 shortPieces.push(shortp); 1970 longPieces.push(longp); 1971 mixedPieces.push(minp); 1972 mixedPieces.push(shortp); 1973 mixedPieces.push(longp); 1974 } 1975 minPieces.sort(cmpLenRev); 1976 shortPieces.sort(cmpLenRev); 1977 longPieces.sort(cmpLenRev); 1978 mixedPieces.sort(cmpLenRev); 1979 this._weekdaysRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i"); 1980 this._weekdaysShortRegex = this._weekdaysRegex; 1981 this._weekdaysMinRegex = this._weekdaysRegex; 1982 this._weekdaysStrictRegex = new RegExp( 1983 "^(" + longPieces.join("|") + ")", 1984 "i" 1985 ); 1986 this._weekdaysShortStrictRegex = new RegExp( 1987 "^(" + shortPieces.join("|") + ")", 1988 "i" 1989 ); 1990 this._weekdaysMinStrictRegex = new RegExp( 1991 "^(" + minPieces.join("|") + ")", 1992 "i" 1993 ); 1994 } 1995 function hFormat() { 1996 return this.hours() % 12 || 12; 1997 } 1998 function kFormat() { 1999 return this.hours() || 24; 2000 } 2001 addFormatToken("H", ["HH", 2], 0, "hour"); 2002 addFormatToken("h", ["hh", 2], 0, hFormat); 2003 addFormatToken("k", ["kk", 2], 0, kFormat); 2004 addFormatToken("hmm", 0, 0, function() { 2005 return "" + hFormat.apply(this) + zeroFill(this.minutes(), 2); 2006 }); 2007 addFormatToken("hmmss", 0, 0, function() { 2008 return "" + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); 2009 }); 2010 addFormatToken("Hmm", 0, 0, function() { 2011 return "" + this.hours() + zeroFill(this.minutes(), 2); 2012 }); 2013 addFormatToken("Hmmss", 0, 0, function() { 2014 return "" + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); 2015 }); 2016 function meridiem(token2, lowercase) { 2017 addFormatToken(token2, 0, 0, function() { 2018 return this.localeData().meridiem( 2019 this.hours(), 2020 this.minutes(), 2021 lowercase 2022 ); 2023 }); 2024 } 2025 meridiem("a", true); 2026 meridiem("A", false); 2027 function matchMeridiem(isStrict, locale2) { 2028 return locale2._meridiemParse; 2029 } 2030 addRegexToken("a", matchMeridiem); 2031 addRegexToken("A", matchMeridiem); 2032 addRegexToken("H", match1to2, match1to2HasZero); 2033 addRegexToken("h", match1to2, match1to2NoLeadingZero); 2034 addRegexToken("k", match1to2, match1to2NoLeadingZero); 2035 addRegexToken("HH", match1to2, match2); 2036 addRegexToken("hh", match1to2, match2); 2037 addRegexToken("kk", match1to2, match2); 2038 addRegexToken("hmm", match3to4); 2039 addRegexToken("hmmss", match5to6); 2040 addRegexToken("Hmm", match3to4); 2041 addRegexToken("Hmmss", match5to6); 2042 addParseToken(["H", "HH"], HOUR); 2043 addParseToken(["k", "kk"], function(input, array, config2) { 2044 var kInput = toInt(input); 2045 array[HOUR] = kInput === 24 ? 0 : kInput; 2046 }); 2047 addParseToken(["a", "A"], function(input, array, config2) { 2048 config2._isPm = config2._locale.isPM(input); 2049 config2._meridiem = input; 2050 }); 2051 addParseToken(["h", "hh"], function(input, array, config2) { 2052 array[HOUR] = toInt(input); 2053 getParsingFlags(config2).bigHour = true; 2054 }); 2055 addParseToken("hmm", function(input, array, config2) { 2056 var pos = input.length - 2; 2057 array[HOUR] = toInt(input.substr(0, pos)); 2058 array[MINUTE] = toInt(input.substr(pos)); 2059 getParsingFlags(config2).bigHour = true; 2060 }); 2061 addParseToken("hmmss", function(input, array, config2) { 2062 var pos1 = input.length - 4, pos2 = input.length - 2; 2063 array[HOUR] = toInt(input.substr(0, pos1)); 2064 array[MINUTE] = toInt(input.substr(pos1, 2)); 2065 array[SECOND] = toInt(input.substr(pos2)); 2066 getParsingFlags(config2).bigHour = true; 2067 }); 2068 addParseToken("Hmm", function(input, array, config2) { 2069 var pos = input.length - 2; 2070 array[HOUR] = toInt(input.substr(0, pos)); 2071 array[MINUTE] = toInt(input.substr(pos)); 2072 }); 2073 addParseToken("Hmmss", function(input, array, config2) { 2074 var pos1 = input.length - 4, pos2 = input.length - 2; 2075 array[HOUR] = toInt(input.substr(0, pos1)); 2076 array[MINUTE] = toInt(input.substr(pos1, 2)); 2077 array[SECOND] = toInt(input.substr(pos2)); 2078 }); 2079 function localeIsPM(input) { 2080 return (input + "").toLowerCase().charAt(0) === "p"; 2081 } 2082 var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, getSetHour = makeGetSet("Hours", true); 2083 function localeMeridiem(hours2, minutes2, isLower) { 2084 if (hours2 > 11) { 2085 return isLower ? "pm" : "PM"; 2086 } else { 2087 return isLower ? "am" : "AM"; 2088 } 2089 } 2090 var baseConfig = { 2091 calendar: defaultCalendar, 2092 longDateFormat: defaultLongDateFormat, 2093 invalidDate: defaultInvalidDate, 2094 ordinal: defaultOrdinal, 2095 dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, 2096 relativeTime: defaultRelativeTime, 2097 months: defaultLocaleMonths, 2098 monthsShort: defaultLocaleMonthsShort, 2099 week: defaultLocaleWeek, 2100 weekdays: defaultLocaleWeekdays, 2101 weekdaysMin: defaultLocaleWeekdaysMin, 2102 weekdaysShort: defaultLocaleWeekdaysShort, 2103 meridiemParse: defaultLocaleMeridiemParse 2104 }; 2105 var locales = {}, localeFamilies = {}, globalLocale; 2106 function commonPrefix(arr1, arr2) { 2107 var i4, minl = Math.min(arr1.length, arr2.length); 2108 for (i4 = 0; i4 < minl; i4 += 1) { 2109 if (arr1[i4] !== arr2[i4]) { 2110 return i4; 2111 } 2112 } 2113 return minl; 2114 } 2115 function normalizeLocale(key) { 2116 return key ? key.toLowerCase().replace("_", "-") : key; 2117 } 2118 function chooseLocale(names) { 2119 var i4 = 0, j5, next, locale2, split; 2120 while (i4 < names.length) { 2121 split = normalizeLocale(names[i4]).split("-"); 2122 j5 = split.length; 2123 next = normalizeLocale(names[i4 + 1]); 2124 next = next ? next.split("-") : null; 2125 while (j5 > 0) { 2126 locale2 = loadLocale(split.slice(0, j5).join("-")); 2127 if (locale2) { 2128 return locale2; 2129 } 2130 if (next && next.length >= j5 && commonPrefix(split, next) >= j5 - 1) { 2131 break; 2132 } 2133 j5--; 2134 } 2135 i4++; 2136 } 2137 return globalLocale; 2138 } 2139 function isLocaleNameSane(name) { 2140 return !!(name && name.match("^[^/\\\\]*$")); 2141 } 2142 function loadLocale(name) { 2143 var oldLocale = null, aliasedRequire; 2144 if (locales[name] === void 0 && typeof module !== "undefined" && module && module.exports && isLocaleNameSane(name)) { 2145 try { 2146 oldLocale = globalLocale._abbr; 2147 aliasedRequire = __require; 2148 aliasedRequire("./locale/" + name); 2149 getSetGlobalLocale(oldLocale); 2150 } catch (e4) { 2151 locales[name] = null; 2152 } 2153 } 2154 return locales[name]; 2155 } 2156 function getSetGlobalLocale(key, values) { 2157 var data; 2158 if (key) { 2159 if (isUndefined(values)) { 2160 data = getLocale(key); 2161 } else { 2162 data = defineLocale(key, values); 2163 } 2164 if (data) { 2165 globalLocale = data; 2166 } else { 2167 if (typeof console !== "undefined" && console.warn) { 2168 console.warn( 2169 "Locale " + key + " not found. Did you forget to load it?" 2170 ); 2171 } 2172 } 2173 } 2174 return globalLocale._abbr; 2175 } 2176 function defineLocale(name, config2) { 2177 if (config2 !== null) { 2178 var locale2, parentConfig = baseConfig; 2179 config2.abbr = name; 2180 if (locales[name] != null) { 2181 deprecateSimple( 2182 "defineLocaleOverride", 2183 "use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info." 2184 ); 2185 parentConfig = locales[name]._config; 2186 } else if (config2.parentLocale != null) { 2187 if (locales[config2.parentLocale] != null) { 2188 parentConfig = locales[config2.parentLocale]._config; 2189 } else { 2190 locale2 = loadLocale(config2.parentLocale); 2191 if (locale2 != null) { 2192 parentConfig = locale2._config; 2193 } else { 2194 if (!localeFamilies[config2.parentLocale]) { 2195 localeFamilies[config2.parentLocale] = []; 2196 } 2197 localeFamilies[config2.parentLocale].push({ 2198 name, 2199 config: config2 2200 }); 2201 return null; 2202 } 2203 } 2204 } 2205 locales[name] = new Locale(mergeConfigs(parentConfig, config2)); 2206 if (localeFamilies[name]) { 2207 localeFamilies[name].forEach(function(x5) { 2208 defineLocale(x5.name, x5.config); 2209 }); 2210 } 2211 getSetGlobalLocale(name); 2212 return locales[name]; 2213 } else { 2214 delete locales[name]; 2215 return null; 2216 } 2217 } 2218 function updateLocale(name, config2) { 2219 if (config2 != null) { 2220 var locale2, tmpLocale, parentConfig = baseConfig; 2221 if (locales[name] != null && locales[name].parentLocale != null) { 2222 locales[name].set(mergeConfigs(locales[name]._config, config2)); 2223 } else { 2224 tmpLocale = loadLocale(name); 2225 if (tmpLocale != null) { 2226 parentConfig = tmpLocale._config; 2227 } 2228 config2 = mergeConfigs(parentConfig, config2); 2229 if (tmpLocale == null) { 2230 config2.abbr = name; 2231 } 2232 locale2 = new Locale(config2); 2233 locale2.parentLocale = locales[name]; 2234 locales[name] = locale2; 2235 } 2236 getSetGlobalLocale(name); 2237 } else { 2238 if (locales[name] != null) { 2239 if (locales[name].parentLocale != null) { 2240 locales[name] = locales[name].parentLocale; 2241 if (name === getSetGlobalLocale()) { 2242 getSetGlobalLocale(name); 2243 } 2244 } else if (locales[name] != null) { 2245 delete locales[name]; 2246 } 2247 } 2248 } 2249 return locales[name]; 2250 } 2251 function getLocale(key) { 2252 var locale2; 2253 if (key && key._locale && key._locale._abbr) { 2254 key = key._locale._abbr; 2255 } 2256 if (!key) { 2257 return globalLocale; 2258 } 2259 if (!isArray(key)) { 2260 locale2 = loadLocale(key); 2261 if (locale2) { 2262 return locale2; 2263 } 2264 key = [key]; 2265 } 2266 return chooseLocale(key); 2267 } 2268 function listLocales() { 2269 return keys(locales); 2270 } 2271 function checkOverflow2(m5) { 2272 var overflow, a4 = m5._a; 2273 if (a4 && getParsingFlags(m5).overflow === -2) { 2274 overflow = a4[MONTH] < 0 || a4[MONTH] > 11 ? MONTH : a4[DATE] < 1 || a4[DATE] > daysInMonth(a4[YEAR], a4[MONTH]) ? DATE : a4[HOUR] < 0 || a4[HOUR] > 24 || a4[HOUR] === 24 && (a4[MINUTE] !== 0 || a4[SECOND] !== 0 || a4[MILLISECOND] !== 0) ? HOUR : a4[MINUTE] < 0 || a4[MINUTE] > 59 ? MINUTE : a4[SECOND] < 0 || a4[SECOND] > 59 ? SECOND : a4[MILLISECOND] < 0 || a4[MILLISECOND] > 999 ? MILLISECOND : -1; 2275 if (getParsingFlags(m5)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { 2276 overflow = DATE; 2277 } 2278 if (getParsingFlags(m5)._overflowWeeks && overflow === -1) { 2279 overflow = WEEK; 2280 } 2281 if (getParsingFlags(m5)._overflowWeekday && overflow === -1) { 2282 overflow = WEEKDAY; 2283 } 2284 getParsingFlags(m5).overflow = overflow; 2285 } 2286 return m5; 2287 } 2288 var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [ 2289 ["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/], 2290 ["YYYY-MM-DD", /\d{4}-\d\d-\d\d/], 2291 ["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/], 2292 ["GGGG-[W]WW", /\d{4}-W\d\d/, false], 2293 ["YYYY-DDD", /\d{4}-\d{3}/], 2294 ["YYYY-MM", /\d{4}-\d\d/, false], 2295 ["YYYYYYMMDD", /[+-]\d{10}/], 2296 ["YYYYMMDD", /\d{8}/], 2297 ["GGGG[W]WWE", /\d{4}W\d{3}/], 2298 ["GGGG[W]WW", /\d{4}W\d{2}/, false], 2299 ["YYYYDDD", /\d{7}/], 2300 ["YYYYMM", /\d{6}/, false], 2301 ["YYYY", /\d{4}/, false] 2302 ], isoTimes = [ 2303 ["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/], 2304 ["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/], 2305 ["HH:mm:ss", /\d\d:\d\d:\d\d/], 2306 ["HH:mm", /\d\d:\d\d/], 2307 ["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/], 2308 ["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/], 2309 ["HHmmss", /\d\d\d\d\d\d/], 2310 ["HHmm", /\d\d\d\d/], 2311 ["HH", /\d\d/] 2312 ], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = { 2313 UT: 0, 2314 GMT: 0, 2315 EDT: -4 * 60, 2316 EST: -5 * 60, 2317 CDT: -5 * 60, 2318 CST: -6 * 60, 2319 MDT: -6 * 60, 2320 MST: -7 * 60, 2321 PDT: -7 * 60, 2322 PST: -8 * 60 2323 }; 2324 function configFromISO(config2) { 2325 var i4, l4, string = config2._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat, isoDatesLen = isoDates.length, isoTimesLen = isoTimes.length; 2326 if (match) { 2327 getParsingFlags(config2).iso = true; 2328 for (i4 = 0, l4 = isoDatesLen; i4 < l4; i4++) { 2329 if (isoDates[i4][1].exec(match[1])) { 2330 dateFormat = isoDates[i4][0]; 2331 allowTime = isoDates[i4][2] !== false; 2332 break; 2333 } 2334 } 2335 if (dateFormat == null) { 2336 config2._isValid = false; 2337 return; 2338 } 2339 if (match[3]) { 2340 for (i4 = 0, l4 = isoTimesLen; i4 < l4; i4++) { 2341 if (isoTimes[i4][1].exec(match[3])) { 2342 timeFormat = (match[2] || " ") + isoTimes[i4][0]; 2343 break; 2344 } 2345 } 2346 if (timeFormat == null) { 2347 config2._isValid = false; 2348 return; 2349 } 2350 } 2351 if (!allowTime && timeFormat != null) { 2352 config2._isValid = false; 2353 return; 2354 } 2355 if (match[4]) { 2356 if (tzRegex.exec(match[4])) { 2357 tzFormat = "Z"; 2358 } else { 2359 config2._isValid = false; 2360 return; 2361 } 2362 } 2363 config2._f = dateFormat + (timeFormat || "") + (tzFormat || ""); 2364 configFromStringAndFormat(config2); 2365 } else { 2366 config2._isValid = false; 2367 } 2368 } 2369 function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { 2370 var result = [ 2371 untruncateYear(yearStr), 2372 defaultLocaleMonthsShort.indexOf(monthStr), 2373 parseInt(dayStr, 10), 2374 parseInt(hourStr, 10), 2375 parseInt(minuteStr, 10) 2376 ]; 2377 if (secondStr) { 2378 result.push(parseInt(secondStr, 10)); 2379 } 2380 return result; 2381 } 2382 function untruncateYear(yearStr) { 2383 var year = parseInt(yearStr, 10); 2384 if (year <= 49) { 2385 return 2e3 + year; 2386 } else if (year <= 999) { 2387 return 1900 + year; 2388 } 2389 return year; 2390 } 2391 function preprocessRFC2822(s4) { 2392 return s4.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").replace(/^\s\s*/, "").replace(/\s\s*$/, ""); 2393 } 2394 function checkWeekday(weekdayStr, parsedInput, config2) { 2395 if (weekdayStr) { 2396 var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date( 2397 parsedInput[0], 2398 parsedInput[1], 2399 parsedInput[2] 2400 ).getDay(); 2401 if (weekdayProvided !== weekdayActual) { 2402 getParsingFlags(config2).weekdayMismatch = true; 2403 config2._isValid = false; 2404 return false; 2405 } 2406 } 2407 return true; 2408 } 2409 function calculateOffset(obsOffset, militaryOffset, numOffset) { 2410 if (obsOffset) { 2411 return obsOffsets[obsOffset]; 2412 } else if (militaryOffset) { 2413 return 0; 2414 } else { 2415 var hm = parseInt(numOffset, 10), m5 = hm % 100, h4 = (hm - m5) / 100; 2416 return h4 * 60 + m5; 2417 } 2418 } 2419 function configFromRFC2822(config2) { 2420 var match = rfc2822.exec(preprocessRFC2822(config2._i)), parsedArray; 2421 if (match) { 2422 parsedArray = extractFromRFC2822Strings( 2423 match[4], 2424 match[3], 2425 match[2], 2426 match[5], 2427 match[6], 2428 match[7] 2429 ); 2430 if (!checkWeekday(match[1], parsedArray, config2)) { 2431 return; 2432 } 2433 config2._a = parsedArray; 2434 config2._tzm = calculateOffset(match[8], match[9], match[10]); 2435 config2._d = createUTCDate.apply(null, config2._a); 2436 config2._d.setUTCMinutes(config2._d.getUTCMinutes() - config2._tzm); 2437 getParsingFlags(config2).rfc2822 = true; 2438 } else { 2439 config2._isValid = false; 2440 } 2441 } 2442 function configFromString(config2) { 2443 var matched = aspNetJsonRegex.exec(config2._i); 2444 if (matched !== null) { 2445 config2._d = new Date(+matched[1]); 2446 return; 2447 } 2448 configFromISO(config2); 2449 if (config2._isValid === false) { 2450 delete config2._isValid; 2451 } else { 2452 return; 2453 } 2454 configFromRFC2822(config2); 2455 if (config2._isValid === false) { 2456 delete config2._isValid; 2457 } else { 2458 return; 2459 } 2460 if (config2._strict) { 2461 config2._isValid = false; 2462 } else { 2463 hooks.createFromInputFallback(config2); 2464 } 2465 } 2466 hooks.createFromInputFallback = deprecate( 2467 "value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.", 2468 function(config2) { 2469 config2._d = new Date(config2._i + (config2._useUTC ? " UTC" : "")); 2470 } 2471 ); 2472 function defaults2(a4, b4, c4) { 2473 if (a4 != null) { 2474 return a4; 2475 } 2476 if (b4 != null) { 2477 return b4; 2478 } 2479 return c4; 2480 } 2481 function currentDateArray(config2) { 2482 var nowValue = new Date(hooks.now()); 2483 if (config2._useUTC) { 2484 return [ 2485 nowValue.getUTCFullYear(), 2486 nowValue.getUTCMonth(), 2487 nowValue.getUTCDate() 2488 ]; 2489 } 2490 return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; 2491 } 2492 function configFromArray(config2) { 2493 var i4, date, input = [], currentDate, expectedWeekday, yearToUse; 2494 if (config2._d) { 2495 return; 2496 } 2497 currentDate = currentDateArray(config2); 2498 if (config2._w && config2._a[DATE] == null && config2._a[MONTH] == null) { 2499 dayOfYearFromWeekInfo(config2); 2500 } 2501 if (config2._dayOfYear != null) { 2502 yearToUse = defaults2(config2._a[YEAR], currentDate[YEAR]); 2503 if (config2._dayOfYear > daysInYear(yearToUse) || config2._dayOfYear === 0) { 2504 getParsingFlags(config2)._overflowDayOfYear = true; 2505 } 2506 date = createUTCDate(yearToUse, 0, config2._dayOfYear); 2507 config2._a[MONTH] = date.getUTCMonth(); 2508 config2._a[DATE] = date.getUTCDate(); 2509 } 2510 for (i4 = 0; i4 < 3 && config2._a[i4] == null; ++i4) { 2511 config2._a[i4] = input[i4] = currentDate[i4]; 2512 } 2513 for (; i4 < 7; i4++) { 2514 config2._a[i4] = input[i4] = config2._a[i4] == null ? i4 === 2 ? 1 : 0 : config2._a[i4]; 2515 } 2516 if (config2._a[HOUR] === 24 && config2._a[MINUTE] === 0 && config2._a[SECOND] === 0 && config2._a[MILLISECOND] === 0) { 2517 config2._nextDay = true; 2518 config2._a[HOUR] = 0; 2519 } 2520 config2._d = (config2._useUTC ? createUTCDate : createDate).apply( 2521 null, 2522 input 2523 ); 2524 expectedWeekday = config2._useUTC ? config2._d.getUTCDay() : config2._d.getDay(); 2525 if (config2._tzm != null) { 2526 config2._d.setUTCMinutes(config2._d.getUTCMinutes() - config2._tzm); 2527 } 2528 if (config2._nextDay) { 2529 config2._a[HOUR] = 24; 2530 } 2531 if (config2._w && typeof config2._w.d !== "undefined" && config2._w.d !== expectedWeekday) { 2532 getParsingFlags(config2).weekdayMismatch = true; 2533 } 2534 } 2535 function dayOfYearFromWeekInfo(config2) { 2536 var w5, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; 2537 w5 = config2._w; 2538 if (w5.GG != null || w5.W != null || w5.E != null) { 2539 dow = 1; 2540 doy = 4; 2541 weekYear = defaults2( 2542 w5.GG, 2543 config2._a[YEAR], 2544 weekOfYear2(createLocal(), 1, 4).year 2545 ); 2546 week = defaults2(w5.W, 1); 2547 weekday = defaults2(w5.E, 1); 2548 if (weekday < 1 || weekday > 7) { 2549 weekdayOverflow = true; 2550 } 2551 } else { 2552 dow = config2._locale._week.dow; 2553 doy = config2._locale._week.doy; 2554 curWeek = weekOfYear2(createLocal(), dow, doy); 2555 weekYear = defaults2(w5.gg, config2._a[YEAR], curWeek.year); 2556 week = defaults2(w5.w, curWeek.week); 2557 if (w5.d != null) { 2558 weekday = w5.d; 2559 if (weekday < 0 || weekday > 6) { 2560 weekdayOverflow = true; 2561 } 2562 } else if (w5.e != null) { 2563 weekday = w5.e + dow; 2564 if (w5.e < 0 || w5.e > 6) { 2565 weekdayOverflow = true; 2566 } 2567 } else { 2568 weekday = dow; 2569 } 2570 } 2571 if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { 2572 getParsingFlags(config2)._overflowWeeks = true; 2573 } else if (weekdayOverflow != null) { 2574 getParsingFlags(config2)._overflowWeekday = true; 2575 } else { 2576 temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); 2577 config2._a[YEAR] = temp.year; 2578 config2._dayOfYear = temp.dayOfYear; 2579 } 2580 } 2581 hooks.ISO_8601 = function() { 2582 }; 2583 hooks.RFC_2822 = function() { 2584 }; 2585 function configFromStringAndFormat(config2) { 2586 if (config2._f === hooks.ISO_8601) { 2587 configFromISO(config2); 2588 return; 2589 } 2590 if (config2._f === hooks.RFC_2822) { 2591 configFromRFC2822(config2); 2592 return; 2593 } 2594 config2._a = []; 2595 getParsingFlags(config2).empty = true; 2596 var string = "" + config2._i, i4, parsedInput, tokens2, token2, skipped, stringLength = string.length, totalParsedInputLength = 0, era, tokenLen; 2597 tokens2 = expandFormat(config2._f, config2._locale).match(formattingTokens) || []; 2598 tokenLen = tokens2.length; 2599 for (i4 = 0; i4 < tokenLen; i4++) { 2600 token2 = tokens2[i4]; 2601 parsedInput = (string.match(getParseRegexForToken(token2, config2)) || [])[0]; 2602 if (parsedInput) { 2603 skipped = string.substr(0, string.indexOf(parsedInput)); 2604 if (skipped.length > 0) { 2605 getParsingFlags(config2).unusedInput.push(skipped); 2606 } 2607 string = string.slice( 2608 string.indexOf(parsedInput) + parsedInput.length 2609 ); 2610 totalParsedInputLength += parsedInput.length; 2611 } 2612 if (formatTokenFunctions[token2]) { 2613 if (parsedInput) { 2614 getParsingFlags(config2).empty = false; 2615 } else { 2616 getParsingFlags(config2).unusedTokens.push(token2); 2617 } 2618 addTimeToArrayFromToken(token2, parsedInput, config2); 2619 } else if (config2._strict && !parsedInput) { 2620 getParsingFlags(config2).unusedTokens.push(token2); 2621 } 2622 } 2623 getParsingFlags(config2).charsLeftOver = stringLength - totalParsedInputLength; 2624 if (string.length > 0) { 2625 getParsingFlags(config2).unusedInput.push(string); 2626 } 2627 if (config2._a[HOUR] <= 12 && getParsingFlags(config2).bigHour === true && config2._a[HOUR] > 0) { 2628 getParsingFlags(config2).bigHour = void 0; 2629 } 2630 getParsingFlags(config2).parsedDateParts = config2._a.slice(0); 2631 getParsingFlags(config2).meridiem = config2._meridiem; 2632 config2._a[HOUR] = meridiemFixWrap( 2633 config2._locale, 2634 config2._a[HOUR], 2635 config2._meridiem 2636 ); 2637 era = getParsingFlags(config2).era; 2638 if (era !== null) { 2639 config2._a[YEAR] = config2._locale.erasConvertYear(era, config2._a[YEAR]); 2640 } 2641 configFromArray(config2); 2642 checkOverflow2(config2); 2643 } 2644 function meridiemFixWrap(locale2, hour, meridiem2) { 2645 var isPm; 2646 if (meridiem2 == null) { 2647 return hour; 2648 } 2649 if (locale2.meridiemHour != null) { 2650 return locale2.meridiemHour(hour, meridiem2); 2651 } else if (locale2.isPM != null) { 2652 isPm = locale2.isPM(meridiem2); 2653 if (isPm && hour < 12) { 2654 hour += 12; 2655 } 2656 if (!isPm && hour === 12) { 2657 hour = 0; 2658 } 2659 return hour; 2660 } else { 2661 return hour; 2662 } 2663 } 2664 function configFromStringAndArray(config2) { 2665 var tempConfig, bestMoment, scoreToBeat, i4, currentScore, validFormatFound, bestFormatIsValid = false, configfLen = config2._f.length; 2666 if (configfLen === 0) { 2667 getParsingFlags(config2).invalidFormat = true; 2668 config2._d = new Date(NaN); 2669 return; 2670 } 2671 for (i4 = 0; i4 < configfLen; i4++) { 2672 currentScore = 0; 2673 validFormatFound = false; 2674 tempConfig = copyConfig({}, config2); 2675 if (config2._useUTC != null) { 2676 tempConfig._useUTC = config2._useUTC; 2677 } 2678 tempConfig._f = config2._f[i4]; 2679 configFromStringAndFormat(tempConfig); 2680 if (isValid(tempConfig)) { 2681 validFormatFound = true; 2682 } 2683 currentScore += getParsingFlags(tempConfig).charsLeftOver; 2684 currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; 2685 getParsingFlags(tempConfig).score = currentScore; 2686 if (!bestFormatIsValid) { 2687 if (scoreToBeat == null || currentScore < scoreToBeat || validFormatFound) { 2688 scoreToBeat = currentScore; 2689 bestMoment = tempConfig; 2690 if (validFormatFound) { 2691 bestFormatIsValid = true; 2692 } 2693 } 2694 } else { 2695 if (currentScore < scoreToBeat) { 2696 scoreToBeat = currentScore; 2697 bestMoment = tempConfig; 2698 } 2699 } 2700 } 2701 extend5(config2, bestMoment || tempConfig); 2702 } 2703 function configFromObject(config2) { 2704 if (config2._d) { 2705 return; 2706 } 2707 var i4 = normalizeObjectUnits(config2._i), dayOrDate = i4.day === void 0 ? i4.date : i4.day; 2708 config2._a = map( 2709 [i4.year, i4.month, dayOrDate, i4.hour, i4.minute, i4.second, i4.millisecond], 2710 function(obj) { 2711 return obj && parseInt(obj, 10); 2712 } 2713 ); 2714 configFromArray(config2); 2715 } 2716 function createFromConfig(config2) { 2717 var res = new Moment3(checkOverflow2(prepareConfig(config2))); 2718 if (res._nextDay) { 2719 res.add(1, "d"); 2720 res._nextDay = void 0; 2721 } 2722 return res; 2723 } 2724 function prepareConfig(config2) { 2725 var input = config2._i, format2 = config2._f; 2726 config2._locale = config2._locale || getLocale(config2._l); 2727 if (input === null || format2 === void 0 && input === "") { 2728 return createInvalid({ nullInput: true }); 2729 } 2730 if (typeof input === "string") { 2731 config2._i = input = config2._locale.preparse(input); 2732 } 2733 if (isMoment(input)) { 2734 return new Moment3(checkOverflow2(input)); 2735 } else if (isDate(input)) { 2736 config2._d = input; 2737 } else if (isArray(format2)) { 2738 configFromStringAndArray(config2); 2739 } else if (format2) { 2740 configFromStringAndFormat(config2); 2741 } else { 2742 configFromInput(config2); 2743 } 2744 if (!isValid(config2)) { 2745 config2._d = null; 2746 } 2747 return config2; 2748 } 2749 function configFromInput(config2) { 2750 var input = config2._i; 2751 if (isUndefined(input)) { 2752 config2._d = new Date(hooks.now()); 2753 } else if (isDate(input)) { 2754 config2._d = new Date(input.valueOf()); 2755 } else if (typeof input === "string") { 2756 configFromString(config2); 2757 } else if (isArray(input)) { 2758 config2._a = map(input.slice(0), function(obj) { 2759 return parseInt(obj, 10); 2760 }); 2761 configFromArray(config2); 2762 } else if (isObject3(input)) { 2763 configFromObject(config2); 2764 } else if (isNumber(input)) { 2765 config2._d = new Date(input); 2766 } else { 2767 hooks.createFromInputFallback(config2); 2768 } 2769 } 2770 function createLocalOrUTC(input, format2, locale2, strict, isUTC) { 2771 var c4 = {}; 2772 if (format2 === true || format2 === false) { 2773 strict = format2; 2774 format2 = void 0; 2775 } 2776 if (locale2 === true || locale2 === false) { 2777 strict = locale2; 2778 locale2 = void 0; 2779 } 2780 if (isObject3(input) && isObjectEmpty(input) || isArray(input) && input.length === 0) { 2781 input = void 0; 2782 } 2783 c4._isAMomentObject = true; 2784 c4._useUTC = c4._isUTC = isUTC; 2785 c4._l = locale2; 2786 c4._i = input; 2787 c4._f = format2; 2788 c4._strict = strict; 2789 return createFromConfig(c4); 2790 } 2791 function createLocal(input, format2, locale2, strict) { 2792 return createLocalOrUTC(input, format2, locale2, strict, false); 2793 } 2794 var prototypeMin = deprecate( 2795 "moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/", 2796 function() { 2797 var other = createLocal.apply(null, arguments); 2798 if (this.isValid() && other.isValid()) { 2799 return other < this ? this : other; 2800 } else { 2801 return createInvalid(); 2802 } 2803 } 2804 ), prototypeMax = deprecate( 2805 "moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/", 2806 function() { 2807 var other = createLocal.apply(null, arguments); 2808 if (this.isValid() && other.isValid()) { 2809 return other > this ? this : other; 2810 } else { 2811 return createInvalid(); 2812 } 2813 } 2814 ); 2815 function pickBy(fn3, moments) { 2816 var res, i4; 2817 if (moments.length === 1 && isArray(moments[0])) { 2818 moments = moments[0]; 2819 } 2820 if (!moments.length) { 2821 return createLocal(); 2822 } 2823 res = moments[0]; 2824 for (i4 = 1; i4 < moments.length; ++i4) { 2825 if (!moments[i4].isValid() || moments[i4][fn3](res)) { 2826 res = moments[i4]; 2827 } 2828 } 2829 return res; 2830 } 2831 function min2() { 2832 var args = [].slice.call(arguments, 0); 2833 return pickBy("isBefore", args); 2834 } 2835 function max2() { 2836 var args = [].slice.call(arguments, 0); 2837 return pickBy("isAfter", args); 2838 } 2839 var now3 = function() { 2840 return Date.now ? Date.now() : +new Date(); 2841 }; 2842 var ordering = [ 2843 "year", 2844 "quarter", 2845 "month", 2846 "week", 2847 "day", 2848 "hour", 2849 "minute", 2850 "second", 2851 "millisecond" 2852 ]; 2853 function isDurationValid(m5) { 2854 var key, unitHasDecimal = false, i4, orderLen = ordering.length; 2855 for (key in m5) { 2856 if (hasOwnProp(m5, key) && !(indexOf2.call(ordering, key) !== -1 && (m5[key] == null || !isNaN(m5[key])))) { 2857 return false; 2858 } 2859 } 2860 for (i4 = 0; i4 < orderLen; ++i4) { 2861 if (m5[ordering[i4]]) { 2862 if (unitHasDecimal) { 2863 return false; 2864 } 2865 if (parseFloat(m5[ordering[i4]]) !== toInt(m5[ordering[i4]])) { 2866 unitHasDecimal = true; 2867 } 2868 } 2869 } 2870 return true; 2871 } 2872 function isValid$1() { 2873 return this._isValid; 2874 } 2875 function createInvalid$1() { 2876 return createDuration2(NaN); 2877 } 2878 function Duration(duration) { 2879 var normalizedInput = normalizeObjectUnits(duration), years2 = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months2 = normalizedInput.month || 0, weeks2 = normalizedInput.week || normalizedInput.isoWeek || 0, days2 = normalizedInput.day || 0, hours2 = normalizedInput.hour || 0, minutes2 = normalizedInput.minute || 0, seconds2 = normalizedInput.second || 0, milliseconds2 = normalizedInput.millisecond || 0; 2880 this._isValid = isDurationValid(normalizedInput); 2881 this._milliseconds = +milliseconds2 + seconds2 * 1e3 + minutes2 * 6e4 + hours2 * 1e3 * 60 * 60; 2882 this._days = +days2 + weeks2 * 7; 2883 this._months = +months2 + quarters * 3 + years2 * 12; 2884 this._data = {}; 2885 this._locale = getLocale(); 2886 this._bubble(); 2887 } 2888 function isDuration(obj) { 2889 return obj instanceof Duration; 2890 } 2891 function absRound(number) { 2892 if (number < 0) { 2893 return Math.round(-1 * number) * -1; 2894 } else { 2895 return Math.round(number); 2896 } 2897 } 2898 function compareArrays(array1, array2, dontConvert) { 2899 var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i4; 2900 for (i4 = 0; i4 < len; i4++) { 2901 if (dontConvert && array1[i4] !== array2[i4] || !dontConvert && toInt(array1[i4]) !== toInt(array2[i4])) { 2902 diffs++; 2903 } 2904 } 2905 return diffs + lengthDiff; 2906 } 2907 function offset2(token2, separator) { 2908 addFormatToken(token2, 0, 0, function() { 2909 var offset3 = this.utcOffset(), sign2 = "+"; 2910 if (offset3 < 0) { 2911 offset3 = -offset3; 2912 sign2 = "-"; 2913 } 2914 return sign2 + zeroFill(~~(offset3 / 60), 2) + separator + zeroFill(~~offset3 % 60, 2); 2915 }); 2916 } 2917 offset2("Z", ":"); 2918 offset2("ZZ", ""); 2919 addRegexToken("Z", matchShortOffset); 2920 addRegexToken("ZZ", matchShortOffset); 2921 addParseToken(["Z", "ZZ"], function(input, array, config2) { 2922 config2._useUTC = true; 2923 config2._tzm = offsetFromString(matchShortOffset, input); 2924 }); 2925 var chunkOffset = /([\+\-]|\d\d)/gi; 2926 function offsetFromString(matcher, string) { 2927 var matches2 = (string || "").match(matcher), chunk, parts, minutes2; 2928 if (matches2 === null) { 2929 return null; 2930 } 2931 chunk = matches2[matches2.length - 1] || []; 2932 parts = (chunk + "").match(chunkOffset) || ["-", 0, 0]; 2933 minutes2 = +(parts[1] * 60) + toInt(parts[2]); 2934 return minutes2 === 0 ? 0 : parts[0] === "+" ? minutes2 : -minutes2; 2935 } 2936 function cloneWithOffset(input, model) { 2937 var res, diff2; 2938 if (model._isUTC) { 2939 res = model.clone(); 2940 diff2 = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); 2941 res._d.setTime(res._d.valueOf() + diff2); 2942 hooks.updateOffset(res, false); 2943 return res; 2944 } else { 2945 return createLocal(input).local(); 2946 } 2947 } 2948 function getDateOffset(m5) { 2949 return -Math.round(m5._d.getTimezoneOffset()); 2950 } 2951 hooks.updateOffset = function() { 2952 }; 2953 function getSetOffset(input, keepLocalTime, keepMinutes) { 2954 var offset3 = this._offset || 0, localAdjust; 2955 if (!this.isValid()) { 2956 return input != null ? this : NaN; 2957 } 2958 if (input != null) { 2959 if (typeof input === "string") { 2960 input = offsetFromString(matchShortOffset, input); 2961 if (input === null) { 2962 return this; 2963 } 2964 } else if (Math.abs(input) < 16 && !keepMinutes) { 2965 input = input * 60; 2966 } 2967 if (!this._isUTC && keepLocalTime) { 2968 localAdjust = getDateOffset(this); 2969 } 2970 this._offset = input; 2971 this._isUTC = true; 2972 if (localAdjust != null) { 2973 this.add(localAdjust, "m"); 2974 } 2975 if (offset3 !== input) { 2976 if (!keepLocalTime || this._changeInProgress) { 2977 addSubtract( 2978 this, 2979 createDuration2(input - offset3, "m"), 2980 1, 2981 false 2982 ); 2983 } else if (!this._changeInProgress) { 2984 this._changeInProgress = true; 2985 hooks.updateOffset(this, true); 2986 this._changeInProgress = null; 2987 } 2988 } 2989 return this; 2990 } else { 2991 return this._isUTC ? offset3 : getDateOffset(this); 2992 } 2993 } 2994 function getSetZone(input, keepLocalTime) { 2995 if (input != null) { 2996 if (typeof input !== "string") { 2997 input = -input; 2998 } 2999 this.utcOffset(input, keepLocalTime); 3000 return this; 3001 } else { 3002 return -this.utcOffset(); 3003 } 3004 } 3005 function setOffsetToUTC(keepLocalTime) { 3006 return this.utcOffset(0, keepLocalTime); 3007 } 3008 function setOffsetToLocal(keepLocalTime) { 3009 if (this._isUTC) { 3010 this.utcOffset(0, keepLocalTime); 3011 this._isUTC = false; 3012 if (keepLocalTime) { 3013 this.subtract(getDateOffset(this), "m"); 3014 } 3015 } 3016 return this; 3017 } 3018 function setOffsetToParsedOffset() { 3019 if (this._tzm != null) { 3020 this.utcOffset(this._tzm, false, true); 3021 } else if (typeof this._i === "string") { 3022 var tZone = offsetFromString(matchOffset, this._i); 3023 if (tZone != null) { 3024 this.utcOffset(tZone); 3025 } else { 3026 this.utcOffset(0, true); 3027 } 3028 } 3029 return this; 3030 } 3031 function hasAlignedHourOffset(input) { 3032 if (!this.isValid()) { 3033 return false; 3034 } 3035 input = input ? createLocal(input).utcOffset() : 0; 3036 return (this.utcOffset() - input) % 60 === 0; 3037 } 3038 function isDaylightSavingTime() { 3039 return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset(); 3040 } 3041 function isDaylightSavingTimeShifted() { 3042 if (!isUndefined(this._isDSTShifted)) { 3043 return this._isDSTShifted; 3044 } 3045 var c4 = {}, other; 3046 copyConfig(c4, this); 3047 c4 = prepareConfig(c4); 3048 if (c4._a) { 3049 other = c4._isUTC ? createUTC(c4._a) : createLocal(c4._a); 3050 this._isDSTShifted = this.isValid() && compareArrays(c4._a, other.toArray()) > 0; 3051 } else { 3052 this._isDSTShifted = false; 3053 } 3054 return this._isDSTShifted; 3055 } 3056 function isLocal() { 3057 return this.isValid() ? !this._isUTC : false; 3058 } 3059 function isUtcOffset() { 3060 return this.isValid() ? this._isUTC : false; 3061 } 3062 function isUtc() { 3063 return this.isValid() ? this._isUTC && this._offset === 0 : false; 3064 } 3065 var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; 3066 function createDuration2(input, key) { 3067 var duration = input, match = null, sign2, ret, diffRes; 3068 if (isDuration(input)) { 3069 duration = { 3070 ms: input._milliseconds, 3071 d: input._days, 3072 M: input._months 3073 }; 3074 } else if (isNumber(input) || !isNaN(+input)) { 3075 duration = {}; 3076 if (key) { 3077 duration[key] = +input; 3078 } else { 3079 duration.milliseconds = +input; 3080 } 3081 } else if (match = aspNetRegex.exec(input)) { 3082 sign2 = match[1] === "-" ? -1 : 1; 3083 duration = { 3084 y: 0, 3085 d: toInt(match[DATE]) * sign2, 3086 h: toInt(match[HOUR]) * sign2, 3087 m: toInt(match[MINUTE]) * sign2, 3088 s: toInt(match[SECOND]) * sign2, 3089 ms: toInt(absRound(match[MILLISECOND] * 1e3)) * sign2 3090 }; 3091 } else if (match = isoRegex.exec(input)) { 3092 sign2 = match[1] === "-" ? -1 : 1; 3093 duration = { 3094 y: parseIso(match[2], sign2), 3095 M: parseIso(match[3], sign2), 3096 w: parseIso(match[4], sign2), 3097 d: parseIso(match[5], sign2), 3098 h: parseIso(match[6], sign2), 3099 m: parseIso(match[7], sign2), 3100 s: parseIso(match[8], sign2) 3101 }; 3102 } else if (duration == null) { 3103 duration = {}; 3104 } else if (typeof duration === "object" && ("from" in duration || "to" in duration)) { 3105 diffRes = momentsDifference( 3106 createLocal(duration.from), 3107 createLocal(duration.to) 3108 ); 3109 duration = {}; 3110 duration.ms = diffRes.milliseconds; 3111 duration.M = diffRes.months; 3112 } 3113 ret = new Duration(duration); 3114 if (isDuration(input) && hasOwnProp(input, "_locale")) { 3115 ret._locale = input._locale; 3116 } 3117 if (isDuration(input) && hasOwnProp(input, "_isValid")) { 3118 ret._isValid = input._isValid; 3119 } 3120 return ret; 3121 } 3122 createDuration2.fn = Duration.prototype; 3123 createDuration2.invalid = createInvalid$1; 3124 function parseIso(inp, sign2) { 3125 var res = inp && parseFloat(inp.replace(",", ".")); 3126 return (isNaN(res) ? 0 : res) * sign2; 3127 } 3128 function positiveMomentsDifference(base, other) { 3129 var res = {}; 3130 res.months = other.month() - base.month() + (other.year() - base.year()) * 12; 3131 if (base.clone().add(res.months, "M").isAfter(other)) { 3132 --res.months; 3133 } 3134 res.milliseconds = +other - +base.clone().add(res.months, "M"); 3135 return res; 3136 } 3137 function momentsDifference(base, other) { 3138 var res; 3139 if (!(base.isValid() && other.isValid())) { 3140 return { milliseconds: 0, months: 0 }; 3141 } 3142 other = cloneWithOffset(other, base); 3143 if (base.isBefore(other)) { 3144 res = positiveMomentsDifference(base, other); 3145 } else { 3146 res = positiveMomentsDifference(other, base); 3147 res.milliseconds = -res.milliseconds; 3148 res.months = -res.months; 3149 } 3150 return res; 3151 } 3152 function createAdder(direction, name) { 3153 return function(val, period) { 3154 var dur, tmp; 3155 if (period !== null && !isNaN(+period)) { 3156 deprecateSimple( 3157 name, 3158 "moment()." + name + "(period, number) is deprecated. Please use moment()." + name + "(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info." 3159 ); 3160 tmp = val; 3161 val = period; 3162 period = tmp; 3163 } 3164 dur = createDuration2(val, period); 3165 addSubtract(this, dur, direction); 3166 return this; 3167 }; 3168 } 3169 function addSubtract(mom, duration, isAdding, updateOffset) { 3170 var milliseconds2 = duration._milliseconds, days2 = absRound(duration._days), months2 = absRound(duration._months); 3171 if (!mom.isValid()) { 3172 return; 3173 } 3174 updateOffset = updateOffset == null ? true : updateOffset; 3175 if (months2) { 3176 setMonth(mom, get2(mom, "Month") + months2 * isAdding); 3177 } 3178 if (days2) { 3179 set$1(mom, "Date", get2(mom, "Date") + days2 * isAdding); 3180 } 3181 if (milliseconds2) { 3182 mom._d.setTime(mom._d.valueOf() + milliseconds2 * isAdding); 3183 } 3184 if (updateOffset) { 3185 hooks.updateOffset(mom, days2 || months2); 3186 } 3187 } 3188 var add2 = createAdder(1, "add"), subtract = createAdder(-1, "subtract"); 3189 function isString(input) { 3190 return typeof input === "string" || input instanceof String; 3191 } 3192 function isMomentInput(input) { 3193 return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0; 3194 } 3195 function isMomentInputObject(input) { 3196 var objectTest = isObject3(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 3197 "years", 3198 "year", 3199 "y", 3200 "months", 3201 "month", 3202 "M", 3203 "days", 3204 "day", 3205 "d", 3206 "dates", 3207 "date", 3208 "D", 3209 "hours", 3210 "hour", 3211 "h", 3212 "minutes", 3213 "minute", 3214 "m", 3215 "seconds", 3216 "second", 3217 "s", 3218 "milliseconds", 3219 "millisecond", 3220 "ms" 3221 ], i4, property, propertyLen = properties.length; 3222 for (i4 = 0; i4 < propertyLen; i4 += 1) { 3223 property = properties[i4]; 3224 propertyTest = propertyTest || hasOwnProp(input, property); 3225 } 3226 return objectTest && propertyTest; 3227 } 3228 function isNumberOrStringArray(input) { 3229 var arrayTest = isArray(input), dataTypeTest = false; 3230 if (arrayTest) { 3231 dataTypeTest = input.filter(function(item) { 3232 return !isNumber(item) && isString(input); 3233 }).length === 0; 3234 } 3235 return arrayTest && dataTypeTest; 3236 } 3237 function isCalendarSpec(input) { 3238 var objectTest = isObject3(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 3239 "sameDay", 3240 "nextDay", 3241 "lastDay", 3242 "nextWeek", 3243 "lastWeek", 3244 "sameElse" 3245 ], i4, property; 3246 for (i4 = 0; i4 < properties.length; i4 += 1) { 3247 property = properties[i4]; 3248 propertyTest = propertyTest || hasOwnProp(input, property); 3249 } 3250 return objectTest && propertyTest; 3251 } 3252 function getCalendarFormat(myMoment, now4) { 3253 var diff2 = myMoment.diff(now4, "days", true); 3254 return diff2 < -6 ? "sameElse" : diff2 < -1 ? "lastWeek" : diff2 < 0 ? "lastDay" : diff2 < 1 ? "sameDay" : diff2 < 2 ? "nextDay" : diff2 < 7 ? "nextWeek" : "sameElse"; 3255 } 3256 function calendar$1(time, formats) { 3257 if (arguments.length === 1) { 3258 if (!arguments[0]) { 3259 time = void 0; 3260 formats = void 0; 3261 } else if (isMomentInput(arguments[0])) { 3262 time = arguments[0]; 3263 formats = void 0; 3264 } else if (isCalendarSpec(arguments[0])) { 3265 formats = arguments[0]; 3266 time = void 0; 3267 } 3268 } 3269 var now4 = time || createLocal(), sod = cloneWithOffset(now4, this).startOf("day"), format2 = hooks.calendarFormat(this, sod) || "sameElse", output = formats && (isFunction(formats[format2]) ? formats[format2].call(this, now4) : formats[format2]); 3270 return this.format( 3271 output || this.localeData().calendar(format2, this, createLocal(now4)) 3272 ); 3273 } 3274 function clone() { 3275 return new Moment3(this); 3276 } 3277 function isAfter(input, units) { 3278 var localInput = isMoment(input) ? input : createLocal(input); 3279 if (!(this.isValid() && localInput.isValid())) { 3280 return false; 3281 } 3282 units = normalizeUnits(units) || "millisecond"; 3283 if (units === "millisecond") { 3284 return this.valueOf() > localInput.valueOf(); 3285 } else { 3286 return localInput.valueOf() < this.clone().startOf(units).valueOf(); 3287 } 3288 } 3289 function isBefore(input, units) { 3290 var localInput = isMoment(input) ? input : createLocal(input); 3291 if (!(this.isValid() && localInput.isValid())) { 3292 return false; 3293 } 3294 units = normalizeUnits(units) || "millisecond"; 3295 if (units === "millisecond") { 3296 return this.valueOf() < localInput.valueOf(); 3297 } else { 3298 return this.clone().endOf(units).valueOf() < localInput.valueOf(); 3299 } 3300 } 3301 function isBetween(from2, to3, units, inclusivity) { 3302 var localFrom = isMoment(from2) ? from2 : createLocal(from2), localTo = isMoment(to3) ? to3 : createLocal(to3); 3303 if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { 3304 return false; 3305 } 3306 inclusivity = inclusivity || "()"; 3307 return (inclusivity[0] === "(" ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ")" ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); 3308 } 3309 function isSame(input, units) { 3310 var localInput = isMoment(input) ? input : createLocal(input), inputMs; 3311 if (!(this.isValid() && localInput.isValid())) { 3312 return false; 3313 } 3314 units = normalizeUnits(units) || "millisecond"; 3315 if (units === "millisecond") { 3316 return this.valueOf() === localInput.valueOf(); 3317 } else { 3318 inputMs = localInput.valueOf(); 3319 return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); 3320 } 3321 } 3322 function isSameOrAfter(input, units) { 3323 return this.isSame(input, units) || this.isAfter(input, units); 3324 } 3325 function isSameOrBefore(input, units) { 3326 return this.isSame(input, units) || this.isBefore(input, units); 3327 } 3328 function diff(input, units, asFloat) { 3329 var that, zoneDelta, output; 3330 if (!this.isValid()) { 3331 return NaN; 3332 } 3333 that = cloneWithOffset(input, this); 3334 if (!that.isValid()) { 3335 return NaN; 3336 } 3337 zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; 3338 units = normalizeUnits(units); 3339 switch (units) { 3340 case "year": 3341 output = monthDiff(this, that) / 12; 3342 break; 3343 case "month": 3344 output = monthDiff(this, that); 3345 break; 3346 case "quarter": 3347 output = monthDiff(this, that) / 3; 3348 break; 3349 case "second": 3350 output = (this - that) / 1e3; 3351 break; 3352 case "minute": 3353 output = (this - that) / 6e4; 3354 break; 3355 case "hour": 3356 output = (this - that) / 36e5; 3357 break; 3358 case "day": 3359 output = (this - that - zoneDelta) / 864e5; 3360 break; 3361 case "week": 3362 output = (this - that - zoneDelta) / 6048e5; 3363 break; 3364 default: 3365 output = this - that; 3366 } 3367 return asFloat ? output : absFloor(output); 3368 } 3369 function monthDiff(a4, b4) { 3370 if (a4.date() < b4.date()) { 3371 return -monthDiff(b4, a4); 3372 } 3373 var wholeMonthDiff = (b4.year() - a4.year()) * 12 + (b4.month() - a4.month()), anchor = a4.clone().add(wholeMonthDiff, "months"), anchor2, adjust; 3374 if (b4 - anchor < 0) { 3375 anchor2 = a4.clone().add(wholeMonthDiff - 1, "months"); 3376 adjust = (b4 - anchor) / (anchor - anchor2); 3377 } else { 3378 anchor2 = a4.clone().add(wholeMonthDiff + 1, "months"); 3379 adjust = (b4 - anchor) / (anchor2 - anchor); 3380 } 3381 return -(wholeMonthDiff + adjust) || 0; 3382 } 3383 hooks.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ"; 3384 hooks.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]"; 3385 function toString() { 3386 return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); 3387 } 3388 function toISOString(keepOffset) { 3389 if (!this.isValid()) { 3390 return null; 3391 } 3392 var utc = keepOffset !== true, m5 = utc ? this.clone().utc() : this; 3393 if (m5.year() < 0 || m5.year() > 9999) { 3394 return formatMoment( 3395 m5, 3396 utc ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ" 3397 ); 3398 } 3399 if (isFunction(Date.prototype.toISOString)) { 3400 if (utc) { 3401 return this.toDate().toISOString(); 3402 } else { 3403 return new Date(this.valueOf() + this.utcOffset() * 60 * 1e3).toISOString().replace("Z", formatMoment(m5, "Z")); 3404 } 3405 } 3406 return formatMoment( 3407 m5, 3408 utc ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ" 3409 ); 3410 } 3411 function inspect() { 3412 if (!this.isValid()) { 3413 return "moment.invalid(/* " + this._i + " */)"; 3414 } 3415 var func = "moment", zone = "", prefix, year, datetime, suffix; 3416 if (!this.isLocal()) { 3417 func = this.utcOffset() === 0 ? "moment.utc" : "moment.parseZone"; 3418 zone = "Z"; 3419 } 3420 prefix = "[" + func + '("]'; 3421 year = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY"; 3422 datetime = "-MM-DD[T]HH:mm:ss.SSS"; 3423 suffix = zone + '[")]'; 3424 return this.format(prefix + year + datetime + suffix); 3425 } 3426 function format(inputString) { 3427 if (!inputString) { 3428 inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; 3429 } 3430 var output = formatMoment(this, inputString); 3431 return this.localeData().postformat(output); 3432 } 3433 function from(time, withoutSuffix) { 3434 if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) { 3435 return createDuration2({ to: this, from: time }).locale(this.locale()).humanize(!withoutSuffix); 3436 } else { 3437 return this.localeData().invalidDate(); 3438 } 3439 } 3440 function fromNow(withoutSuffix) { 3441 return this.from(createLocal(), withoutSuffix); 3442 } 3443 function to2(time, withoutSuffix) { 3444 if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) { 3445 return createDuration2({ from: this, to: time }).locale(this.locale()).humanize(!withoutSuffix); 3446 } else { 3447 return this.localeData().invalidDate(); 3448 } 3449 } 3450 function toNow(withoutSuffix) { 3451 return this.to(createLocal(), withoutSuffix); 3452 } 3453 function locale(key) { 3454 var newLocaleData; 3455 if (key === void 0) { 3456 return this._locale._abbr; 3457 } else { 3458 newLocaleData = getLocale(key); 3459 if (newLocaleData != null) { 3460 this._locale = newLocaleData; 3461 } 3462 return this; 3463 } 3464 } 3465 var lang2 = deprecate( 3466 "moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.", 3467 function(key) { 3468 if (key === void 0) { 3469 return this.localeData(); 3470 } else { 3471 return this.locale(key); 3472 } 3473 } 3474 ); 3475 function localeData() { 3476 return this._locale; 3477 } 3478 var MS_PER_SECOND = 1e3, MS_PER_MINUTE = 60 * MS_PER_SECOND, MS_PER_HOUR = 60 * MS_PER_MINUTE, MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; 3479 function mod$1(dividend, divisor) { 3480 return (dividend % divisor + divisor) % divisor; 3481 } 3482 function localStartOfDate(y4, m5, d3) { 3483 if (y4 < 100 && y4 >= 0) { 3484 return new Date(y4 + 400, m5, d3) - MS_PER_400_YEARS; 3485 } else { 3486 return new Date(y4, m5, d3).valueOf(); 3487 } 3488 } 3489 function utcStartOfDate(y4, m5, d3) { 3490 if (y4 < 100 && y4 >= 0) { 3491 return Date.UTC(y4 + 400, m5, d3) - MS_PER_400_YEARS; 3492 } else { 3493 return Date.UTC(y4, m5, d3); 3494 } 3495 } 3496 function startOf(units) { 3497 var time, startOfDate; 3498 units = normalizeUnits(units); 3499 if (units === void 0 || units === "millisecond" || !this.isValid()) { 3500 return this; 3501 } 3502 startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 3503 switch (units) { 3504 case "year": 3505 time = startOfDate(this.year(), 0, 1); 3506 break; 3507 case "quarter": 3508 time = startOfDate( 3509 this.year(), 3510 this.month() - this.month() % 3, 3511 1 3512 ); 3513 break; 3514 case "month": 3515 time = startOfDate(this.year(), this.month(), 1); 3516 break; 3517 case "week": 3518 time = startOfDate( 3519 this.year(), 3520 this.month(), 3521 this.date() - this.weekday() 3522 ); 3523 break; 3524 case "isoWeek": 3525 time = startOfDate( 3526 this.year(), 3527 this.month(), 3528 this.date() - (this.isoWeekday() - 1) 3529 ); 3530 break; 3531 case "day": 3532 case "date": 3533 time = startOfDate(this.year(), this.month(), this.date()); 3534 break; 3535 case "hour": 3536 time = this._d.valueOf(); 3537 time -= mod$1( 3538 time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), 3539 MS_PER_HOUR 3540 ); 3541 break; 3542 case "minute": 3543 time = this._d.valueOf(); 3544 time -= mod$1(time, MS_PER_MINUTE); 3545 break; 3546 case "second": 3547 time = this._d.valueOf(); 3548 time -= mod$1(time, MS_PER_SECOND); 3549 break; 3550 } 3551 this._d.setTime(time); 3552 hooks.updateOffset(this, true); 3553 return this; 3554 } 3555 function endOf(units) { 3556 var time, startOfDate; 3557 units = normalizeUnits(units); 3558 if (units === void 0 || units === "millisecond" || !this.isValid()) { 3559 return this; 3560 } 3561 startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 3562 switch (units) { 3563 case "year": 3564 time = startOfDate(this.year() + 1, 0, 1) - 1; 3565 break; 3566 case "quarter": 3567 time = startOfDate( 3568 this.year(), 3569 this.month() - this.month() % 3 + 3, 3570 1 3571 ) - 1; 3572 break; 3573 case "month": 3574 time = startOfDate(this.year(), this.month() + 1, 1) - 1; 3575 break; 3576 case "week": 3577 time = startOfDate( 3578 this.year(), 3579 this.month(), 3580 this.date() - this.weekday() + 7 3581 ) - 1; 3582 break; 3583 case "isoWeek": 3584 time = startOfDate( 3585 this.year(), 3586 this.month(), 3587 this.date() - (this.isoWeekday() - 1) + 7 3588 ) - 1; 3589 break; 3590 case "day": 3591 case "date": 3592 time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; 3593 break; 3594 case "hour": 3595 time = this._d.valueOf(); 3596 time += MS_PER_HOUR - mod$1( 3597 time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), 3598 MS_PER_HOUR 3599 ) - 1; 3600 break; 3601 case "minute": 3602 time = this._d.valueOf(); 3603 time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; 3604 break; 3605 case "second": 3606 time = this._d.valueOf(); 3607 time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; 3608 break; 3609 } 3610 this._d.setTime(time); 3611 hooks.updateOffset(this, true); 3612 return this; 3613 } 3614 function valueOf() { 3615 return this._d.valueOf() - (this._offset || 0) * 6e4; 3616 } 3617 function unix() { 3618 return Math.floor(this.valueOf() / 1e3); 3619 } 3620 function toDate() { 3621 return new Date(this.valueOf()); 3622 } 3623 function toArray3() { 3624 var m5 = this; 3625 return [ 3626 m5.year(), 3627 m5.month(), 3628 m5.date(), 3629 m5.hour(), 3630 m5.minute(), 3631 m5.second(), 3632 m5.millisecond() 3633 ]; 3634 } 3635 function toObject() { 3636 var m5 = this; 3637 return { 3638 years: m5.year(), 3639 months: m5.month(), 3640 date: m5.date(), 3641 hours: m5.hours(), 3642 minutes: m5.minutes(), 3643 seconds: m5.seconds(), 3644 milliseconds: m5.milliseconds() 3645 }; 3646 } 3647 function toJSON() { 3648 return this.isValid() ? this.toISOString() : null; 3649 } 3650 function isValid$2() { 3651 return isValid(this); 3652 } 3653 function parsingFlags() { 3654 return extend5({}, getParsingFlags(this)); 3655 } 3656 function invalidAt() { 3657 return getParsingFlags(this).overflow; 3658 } 3659 function creationData() { 3660 return { 3661 input: this._i, 3662 format: this._f, 3663 locale: this._locale, 3664 isUTC: this._isUTC, 3665 strict: this._strict 3666 }; 3667 } 3668 addFormatToken("N", 0, 0, "eraAbbr"); 3669 addFormatToken("NN", 0, 0, "eraAbbr"); 3670 addFormatToken("NNN", 0, 0, "eraAbbr"); 3671 addFormatToken("NNNN", 0, 0, "eraName"); 3672 addFormatToken("NNNNN", 0, 0, "eraNarrow"); 3673 addFormatToken("y", ["y", 1], "yo", "eraYear"); 3674 addFormatToken("y", ["yy", 2], 0, "eraYear"); 3675 addFormatToken("y", ["yyy", 3], 0, "eraYear"); 3676 addFormatToken("y", ["yyyy", 4], 0, "eraYear"); 3677 addRegexToken("N", matchEraAbbr); 3678 addRegexToken("NN", matchEraAbbr); 3679 addRegexToken("NNN", matchEraAbbr); 3680 addRegexToken("NNNN", matchEraName); 3681 addRegexToken("NNNNN", matchEraNarrow); 3682 addParseToken( 3683 ["N", "NN", "NNN", "NNNN", "NNNNN"], 3684 function(input, array, config2, token2) { 3685 var era = config2._locale.erasParse(input, token2, config2._strict); 3686 if (era) { 3687 getParsingFlags(config2).era = era; 3688 } else { 3689 getParsingFlags(config2).invalidEra = input; 3690 } 3691 } 3692 ); 3693 addRegexToken("y", matchUnsigned); 3694 addRegexToken("yy", matchUnsigned); 3695 addRegexToken("yyy", matchUnsigned); 3696 addRegexToken("yyyy", matchUnsigned); 3697 addRegexToken("yo", matchEraYearOrdinal); 3698 addParseToken(["y", "yy", "yyy", "yyyy"], YEAR); 3699 addParseToken(["yo"], function(input, array, config2, token2) { 3700 var match; 3701 if (config2._locale._eraYearOrdinalRegex) { 3702 match = input.match(config2._locale._eraYearOrdinalRegex); 3703 } 3704 if (config2._locale.eraYearOrdinalParse) { 3705 array[YEAR] = config2._locale.eraYearOrdinalParse(input, match); 3706 } else { 3707 array[YEAR] = parseInt(input, 10); 3708 } 3709 }); 3710 function localeEras(m5, format2) { 3711 var i4, l4, date, eras = this._eras || getLocale("en")._eras; 3712 for (i4 = 0, l4 = eras.length; i4 < l4; ++i4) { 3713 switch (typeof eras[i4].since) { 3714 case "string": 3715 date = hooks(eras[i4].since).startOf("day"); 3716 eras[i4].since = date.valueOf(); 3717 break; 3718 } 3719 switch (typeof eras[i4].until) { 3720 case "undefined": 3721 eras[i4].until = Infinity; 3722 break; 3723 case "string": 3724 date = hooks(eras[i4].until).startOf("day").valueOf(); 3725 eras[i4].until = date.valueOf(); 3726 break; 3727 } 3728 } 3729 return eras; 3730 } 3731 function localeErasParse(eraName, format2, strict) { 3732 var i4, l4, eras = this.eras(), name, abbr, narrow; 3733 eraName = eraName.toUpperCase(); 3734 for (i4 = 0, l4 = eras.length; i4 < l4; ++i4) { 3735 name = eras[i4].name.toUpperCase(); 3736 abbr = eras[i4].abbr.toUpperCase(); 3737 narrow = eras[i4].narrow.toUpperCase(); 3738 if (strict) { 3739 switch (format2) { 3740 case "N": 3741 case "NN": 3742 case "NNN": 3743 if (abbr === eraName) { 3744 return eras[i4]; 3745 } 3746 break; 3747 case "NNNN": 3748 if (name === eraName) { 3749 return eras[i4]; 3750 } 3751 break; 3752 case "NNNNN": 3753 if (narrow === eraName) { 3754 return eras[i4]; 3755 } 3756 break; 3757 } 3758 } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { 3759 return eras[i4]; 3760 } 3761 } 3762 } 3763 function localeErasConvertYear(era, year) { 3764 var dir = era.since <= era.until ? 1 : -1; 3765 if (year === void 0) { 3766 return hooks(era.since).year(); 3767 } else { 3768 return hooks(era.since).year() + (year - era.offset) * dir; 3769 } 3770 } 3771 function getEraName() { 3772 var i4, l4, val, eras = this.localeData().eras(); 3773 for (i4 = 0, l4 = eras.length; i4 < l4; ++i4) { 3774 val = this.clone().startOf("day").valueOf(); 3775 if (eras[i4].since <= val && val <= eras[i4].until) { 3776 return eras[i4].name; 3777 } 3778 if (eras[i4].until <= val && val <= eras[i4].since) { 3779 return eras[i4].name; 3780 } 3781 } 3782 return ""; 3783 } 3784 function getEraNarrow() { 3785 var i4, l4, val, eras = this.localeData().eras(); 3786 for (i4 = 0, l4 = eras.length; i4 < l4; ++i4) { 3787 val = this.clone().startOf("day").valueOf(); 3788 if (eras[i4].since <= val && val <= eras[i4].until) { 3789 return eras[i4].narrow; 3790 } 3791 if (eras[i4].until <= val && val <= eras[i4].since) { 3792 return eras[i4].narrow; 3793 } 3794 } 3795 return ""; 3796 } 3797 function getEraAbbr() { 3798 var i4, l4, val, eras = this.localeData().eras(); 3799 for (i4 = 0, l4 = eras.length; i4 < l4; ++i4) { 3800 val = this.clone().startOf("day").valueOf(); 3801 if (eras[i4].since <= val && val <= eras[i4].until) { 3802 return eras[i4].abbr; 3803 } 3804 if (eras[i4].until <= val && val <= eras[i4].since) { 3805 return eras[i4].abbr; 3806 } 3807 } 3808 return ""; 3809 } 3810 function getEraYear() { 3811 var i4, l4, dir, val, eras = this.localeData().eras(); 3812 for (i4 = 0, l4 = eras.length; i4 < l4; ++i4) { 3813 dir = eras[i4].since <= eras[i4].until ? 1 : -1; 3814 val = this.clone().startOf("day").valueOf(); 3815 if (eras[i4].since <= val && val <= eras[i4].until || eras[i4].until <= val && val <= eras[i4].since) { 3816 return (this.year() - hooks(eras[i4].since).year()) * dir + eras[i4].offset; 3817 } 3818 } 3819 return this.year(); 3820 } 3821 function erasNameRegex(isStrict) { 3822 if (!hasOwnProp(this, "_erasNameRegex")) { 3823 computeErasParse.call(this); 3824 } 3825 return isStrict ? this._erasNameRegex : this._erasRegex; 3826 } 3827 function erasAbbrRegex(isStrict) { 3828 if (!hasOwnProp(this, "_erasAbbrRegex")) { 3829 computeErasParse.call(this); 3830 } 3831 return isStrict ? this._erasAbbrRegex : this._erasRegex; 3832 } 3833 function erasNarrowRegex(isStrict) { 3834 if (!hasOwnProp(this, "_erasNarrowRegex")) { 3835 computeErasParse.call(this); 3836 } 3837 return isStrict ? this._erasNarrowRegex : this._erasRegex; 3838 } 3839 function matchEraAbbr(isStrict, locale2) { 3840 return locale2.erasAbbrRegex(isStrict); 3841 } 3842 function matchEraName(isStrict, locale2) { 3843 return locale2.erasNameRegex(isStrict); 3844 } 3845 function matchEraNarrow(isStrict, locale2) { 3846 return locale2.erasNarrowRegex(isStrict); 3847 } 3848 function matchEraYearOrdinal(isStrict, locale2) { 3849 return locale2._eraYearOrdinalRegex || matchUnsigned; 3850 } 3851 function computeErasParse() { 3852 var abbrPieces = [], namePieces = [], narrowPieces = [], mixedPieces = [], i4, l4, erasName, erasAbbr, erasNarrow, eras = this.eras(); 3853 for (i4 = 0, l4 = eras.length; i4 < l4; ++i4) { 3854 erasName = regexEscape(eras[i4].name); 3855 erasAbbr = regexEscape(eras[i4].abbr); 3856 erasNarrow = regexEscape(eras[i4].narrow); 3857 namePieces.push(erasName); 3858 abbrPieces.push(erasAbbr); 3859 narrowPieces.push(erasNarrow); 3860 mixedPieces.push(erasName); 3861 mixedPieces.push(erasAbbr); 3862 mixedPieces.push(erasNarrow); 3863 } 3864 this._erasRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i"); 3865 this._erasNameRegex = new RegExp("^(" + namePieces.join("|") + ")", "i"); 3866 this._erasAbbrRegex = new RegExp("^(" + abbrPieces.join("|") + ")", "i"); 3867 this._erasNarrowRegex = new RegExp( 3868 "^(" + narrowPieces.join("|") + ")", 3869 "i" 3870 ); 3871 } 3872 addFormatToken(0, ["gg", 2], 0, function() { 3873 return this.weekYear() % 100; 3874 }); 3875 addFormatToken(0, ["GG", 2], 0, function() { 3876 return this.isoWeekYear() % 100; 3877 }); 3878 function addWeekYearFormatToken(token2, getter) { 3879 addFormatToken(0, [token2, token2.length], 0, getter); 3880 } 3881 addWeekYearFormatToken("gggg", "weekYear"); 3882 addWeekYearFormatToken("ggggg", "weekYear"); 3883 addWeekYearFormatToken("GGGG", "isoWeekYear"); 3884 addWeekYearFormatToken("GGGGG", "isoWeekYear"); 3885 addRegexToken("G", matchSigned); 3886 addRegexToken("g", matchSigned); 3887 addRegexToken("GG", match1to2, match2); 3888 addRegexToken("gg", match1to2, match2); 3889 addRegexToken("GGGG", match1to4, match4); 3890 addRegexToken("gggg", match1to4, match4); 3891 addRegexToken("GGGGG", match1to6, match6); 3892 addRegexToken("ggggg", match1to6, match6); 3893 addWeekParseToken( 3894 ["gggg", "ggggg", "GGGG", "GGGGG"], 3895 function(input, week, config2, token2) { 3896 week[token2.substr(0, 2)] = toInt(input); 3897 } 3898 ); 3899 addWeekParseToken(["gg", "GG"], function(input, week, config2, token2) { 3900 week[token2] = hooks.parseTwoDigitYear(input); 3901 }); 3902 function getSetWeekYear(input) { 3903 return getSetWeekYearHelper.call( 3904 this, 3905 input, 3906 this.week(), 3907 this.weekday() + this.localeData()._week.dow, 3908 this.localeData()._week.dow, 3909 this.localeData()._week.doy 3910 ); 3911 } 3912 function getSetISOWeekYear(input) { 3913 return getSetWeekYearHelper.call( 3914 this, 3915 input, 3916 this.isoWeek(), 3917 this.isoWeekday(), 3918 1, 3919 4 3920 ); 3921 } 3922 function getISOWeeksInYear() { 3923 return weeksInYear(this.year(), 1, 4); 3924 } 3925 function getISOWeeksInISOWeekYear() { 3926 return weeksInYear(this.isoWeekYear(), 1, 4); 3927 } 3928 function getWeeksInYear() { 3929 var weekInfo = this.localeData()._week; 3930 return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); 3931 } 3932 function getWeeksInWeekYear() { 3933 var weekInfo = this.localeData()._week; 3934 return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); 3935 } 3936 function getSetWeekYearHelper(input, week, weekday, dow, doy) { 3937 var weeksTarget; 3938 if (input == null) { 3939 return weekOfYear2(this, dow, doy).year; 3940 } else { 3941 weeksTarget = weeksInYear(input, dow, doy); 3942 if (week > weeksTarget) { 3943 week = weeksTarget; 3944 } 3945 return setWeekAll.call(this, input, week, weekday, dow, doy); 3946 } 3947 } 3948 function setWeekAll(weekYear, week, weekday, dow, doy) { 3949 var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); 3950 this.year(date.getUTCFullYear()); 3951 this.month(date.getUTCMonth()); 3952 this.date(date.getUTCDate()); 3953 return this; 3954 } 3955 addFormatToken("Q", 0, "Qo", "quarter"); 3956 addRegexToken("Q", match1); 3957 addParseToken("Q", function(input, array) { 3958 array[MONTH] = (toInt(input) - 1) * 3; 3959 }); 3960 function getSetQuarter(input) { 3961 return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); 3962 } 3963 addFormatToken("D", ["DD", 2], "Do", "date"); 3964 addRegexToken("D", match1to2, match1to2NoLeadingZero); 3965 addRegexToken("DD", match1to2, match2); 3966 addRegexToken("Do", function(isStrict, locale2) { 3967 return isStrict ? locale2._dayOfMonthOrdinalParse || locale2._ordinalParse : locale2._dayOfMonthOrdinalParseLenient; 3968 }); 3969 addParseToken(["D", "DD"], DATE); 3970 addParseToken("Do", function(input, array) { 3971 array[DATE] = toInt(input.match(match1to2)[0]); 3972 }); 3973 var getSetDayOfMonth = makeGetSet("Date", true); 3974 addFormatToken("DDD", ["DDDD", 3], "DDDo", "dayOfYear"); 3975 addRegexToken("DDD", match1to3); 3976 addRegexToken("DDDD", match3); 3977 addParseToken(["DDD", "DDDD"], function(input, array, config2) { 3978 config2._dayOfYear = toInt(input); 3979 }); 3980 function getSetDayOfYear(input) { 3981 var dayOfYear = Math.round( 3982 (this.clone().startOf("day") - this.clone().startOf("year")) / 864e5 3983 ) + 1; 3984 return input == null ? dayOfYear : this.add(input - dayOfYear, "d"); 3985 } 3986 addFormatToken("m", ["mm", 2], 0, "minute"); 3987 addRegexToken("m", match1to2, match1to2HasZero); 3988 addRegexToken("mm", match1to2, match2); 3989 addParseToken(["m", "mm"], MINUTE); 3990 var getSetMinute = makeGetSet("Minutes", false); 3991 addFormatToken("s", ["ss", 2], 0, "second"); 3992 addRegexToken("s", match1to2, match1to2HasZero); 3993 addRegexToken("ss", match1to2, match2); 3994 addParseToken(["s", "ss"], SECOND); 3995 var getSetSecond = makeGetSet("Seconds", false); 3996 addFormatToken("S", 0, 0, function() { 3997 return ~~(this.millisecond() / 100); 3998 }); 3999 addFormatToken(0, ["SS", 2], 0, function() { 4000 return ~~(this.millisecond() / 10); 4001 }); 4002 addFormatToken(0, ["SSS", 3], 0, "millisecond"); 4003 addFormatToken(0, ["SSSS", 4], 0, function() { 4004 return this.millisecond() * 10; 4005 }); 4006 addFormatToken(0, ["SSSSS", 5], 0, function() { 4007 return this.millisecond() * 100; 4008 }); 4009 addFormatToken(0, ["SSSSSS", 6], 0, function() { 4010 return this.millisecond() * 1e3; 4011 }); 4012 addFormatToken(0, ["SSSSSSS", 7], 0, function() { 4013 return this.millisecond() * 1e4; 4014 }); 4015 addFormatToken(0, ["SSSSSSSS", 8], 0, function() { 4016 return this.millisecond() * 1e5; 4017 }); 4018 addFormatToken(0, ["SSSSSSSSS", 9], 0, function() { 4019 return this.millisecond() * 1e6; 4020 }); 4021 addRegexToken("S", match1to3, match1); 4022 addRegexToken("SS", match1to3, match2); 4023 addRegexToken("SSS", match1to3, match3); 4024 var token, getSetMillisecond; 4025 for (token = "SSSS"; token.length <= 9; token += "S") { 4026 addRegexToken(token, matchUnsigned); 4027 } 4028 function parseMs(input, array) { 4029 array[MILLISECOND] = toInt(("0." + input) * 1e3); 4030 } 4031 for (token = "S"; token.length <= 9; token += "S") { 4032 addParseToken(token, parseMs); 4033 } 4034 getSetMillisecond = makeGetSet("Milliseconds", false); 4035 addFormatToken("z", 0, 0, "zoneAbbr"); 4036 addFormatToken("zz", 0, 0, "zoneName"); 4037 function getZoneAbbr() { 4038 return this._isUTC ? "UTC" : ""; 4039 } 4040 function getZoneName() { 4041 return this._isUTC ? "Coordinated Universal Time" : ""; 4042 } 4043 var proto = Moment3.prototype; 4044 proto.add = add2; 4045 proto.calendar = calendar$1; 4046 proto.clone = clone; 4047 proto.diff = diff; 4048 proto.endOf = endOf; 4049 proto.format = format; 4050 proto.from = from; 4051 proto.fromNow = fromNow; 4052 proto.to = to2; 4053 proto.toNow = toNow; 4054 proto.get = stringGet; 4055 proto.invalidAt = invalidAt; 4056 proto.isAfter = isAfter; 4057 proto.isBefore = isBefore; 4058 proto.isBetween = isBetween; 4059 proto.isSame = isSame; 4060 proto.isSameOrAfter = isSameOrAfter; 4061 proto.isSameOrBefore = isSameOrBefore; 4062 proto.isValid = isValid$2; 4063 proto.lang = lang2; 4064 proto.locale = locale; 4065 proto.localeData = localeData; 4066 proto.max = prototypeMax; 4067 proto.min = prototypeMin; 4068 proto.parsingFlags = parsingFlags; 4069 proto.set = stringSet; 4070 proto.startOf = startOf; 4071 proto.subtract = subtract; 4072 proto.toArray = toArray3; 4073 proto.toObject = toObject; 4074 proto.toDate = toDate; 4075 proto.toISOString = toISOString; 4076 proto.inspect = inspect; 4077 if (typeof Symbol !== "undefined" && Symbol.for != null) { 4078 proto[Symbol.for("nodejs.util.inspect.custom")] = function() { 4079 return "Moment<" + this.format() + ">"; 4080 }; 4081 } 4082 proto.toJSON = toJSON; 4083 proto.toString = toString; 4084 proto.unix = unix; 4085 proto.valueOf = valueOf; 4086 proto.creationData = creationData; 4087 proto.eraName = getEraName; 4088 proto.eraNarrow = getEraNarrow; 4089 proto.eraAbbr = getEraAbbr; 4090 proto.eraYear = getEraYear; 4091 proto.year = getSetYear; 4092 proto.isLeapYear = getIsLeapYear; 4093 proto.weekYear = getSetWeekYear; 4094 proto.isoWeekYear = getSetISOWeekYear; 4095 proto.quarter = proto.quarters = getSetQuarter; 4096 proto.month = getSetMonth; 4097 proto.daysInMonth = getDaysInMonth; 4098 proto.week = proto.weeks = getSetWeek; 4099 proto.isoWeek = proto.isoWeeks = getSetISOWeek; 4100 proto.weeksInYear = getWeeksInYear; 4101 proto.weeksInWeekYear = getWeeksInWeekYear; 4102 proto.isoWeeksInYear = getISOWeeksInYear; 4103 proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; 4104 proto.date = getSetDayOfMonth; 4105 proto.day = proto.days = getSetDayOfWeek; 4106 proto.weekday = getSetLocaleDayOfWeek; 4107 proto.isoWeekday = getSetISODayOfWeek; 4108 proto.dayOfYear = getSetDayOfYear; 4109 proto.hour = proto.hours = getSetHour; 4110 proto.minute = proto.minutes = getSetMinute; 4111 proto.second = proto.seconds = getSetSecond; 4112 proto.millisecond = proto.milliseconds = getSetMillisecond; 4113 proto.utcOffset = getSetOffset; 4114 proto.utc = setOffsetToUTC; 4115 proto.local = setOffsetToLocal; 4116 proto.parseZone = setOffsetToParsedOffset; 4117 proto.hasAlignedHourOffset = hasAlignedHourOffset; 4118 proto.isDST = isDaylightSavingTime; 4119 proto.isLocal = isLocal; 4120 proto.isUtcOffset = isUtcOffset; 4121 proto.isUtc = isUtc; 4122 proto.isUTC = isUtc; 4123 proto.zoneAbbr = getZoneAbbr; 4124 proto.zoneName = getZoneName; 4125 proto.dates = deprecate( 4126 "dates accessor is deprecated. Use date instead.", 4127 getSetDayOfMonth 4128 ); 4129 proto.months = deprecate( 4130 "months accessor is deprecated. Use month instead", 4131 getSetMonth 4132 ); 4133 proto.years = deprecate( 4134 "years accessor is deprecated. Use year instead", 4135 getSetYear 4136 ); 4137 proto.zone = deprecate( 4138 "moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/", 4139 getSetZone 4140 ); 4141 proto.isDSTShifted = deprecate( 4142 "isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information", 4143 isDaylightSavingTimeShifted 4144 ); 4145 function createUnix(input) { 4146 return createLocal(input * 1e3); 4147 } 4148 function createInZone() { 4149 return createLocal.apply(null, arguments).parseZone(); 4150 } 4151 function preParsePostFormat(string) { 4152 return string; 4153 } 4154 var proto$1 = Locale.prototype; 4155 proto$1.calendar = calendar; 4156 proto$1.longDateFormat = longDateFormat; 4157 proto$1.invalidDate = invalidDate; 4158 proto$1.ordinal = ordinal; 4159 proto$1.preparse = preParsePostFormat; 4160 proto$1.postformat = preParsePostFormat; 4161 proto$1.relativeTime = relativeTime; 4162 proto$1.pastFuture = pastFuture; 4163 proto$1.set = set; 4164 proto$1.eras = localeEras; 4165 proto$1.erasParse = localeErasParse; 4166 proto$1.erasConvertYear = localeErasConvertYear; 4167 proto$1.erasAbbrRegex = erasAbbrRegex; 4168 proto$1.erasNameRegex = erasNameRegex; 4169 proto$1.erasNarrowRegex = erasNarrowRegex; 4170 proto$1.months = localeMonths; 4171 proto$1.monthsShort = localeMonthsShort; 4172 proto$1.monthsParse = localeMonthsParse; 4173 proto$1.monthsRegex = monthsRegex; 4174 proto$1.monthsShortRegex = monthsShortRegex; 4175 proto$1.week = localeWeek; 4176 proto$1.firstDayOfYear = localeFirstDayOfYear; 4177 proto$1.firstDayOfWeek = localeFirstDayOfWeek; 4178 proto$1.weekdays = localeWeekdays; 4179 proto$1.weekdaysMin = localeWeekdaysMin; 4180 proto$1.weekdaysShort = localeWeekdaysShort; 4181 proto$1.weekdaysParse = localeWeekdaysParse; 4182 proto$1.weekdaysRegex = weekdaysRegex; 4183 proto$1.weekdaysShortRegex = weekdaysShortRegex; 4184 proto$1.weekdaysMinRegex = weekdaysMinRegex; 4185 proto$1.isPM = localeIsPM; 4186 proto$1.meridiem = localeMeridiem; 4187 function get$1(format2, index4, field, setter) { 4188 var locale2 = getLocale(), utc = createUTC().set(setter, index4); 4189 return locale2[field](utc, format2); 4190 } 4191 function listMonthsImpl(format2, index4, field) { 4192 if (isNumber(format2)) { 4193 index4 = format2; 4194 format2 = void 0; 4195 } 4196 format2 = format2 || ""; 4197 if (index4 != null) { 4198 return get$1(format2, index4, field, "month"); 4199 } 4200 var i4, out = []; 4201 for (i4 = 0; i4 < 12; i4++) { 4202 out[i4] = get$1(format2, i4, field, "month"); 4203 } 4204 return out; 4205 } 4206 function listWeekdaysImpl(localeSorted, format2, index4, field) { 4207 if (typeof localeSorted === "boolean") { 4208 if (isNumber(format2)) { 4209 index4 = format2; 4210 format2 = void 0; 4211 } 4212 format2 = format2 || ""; 4213 } else { 4214 format2 = localeSorted; 4215 index4 = format2; 4216 localeSorted = false; 4217 if (isNumber(format2)) { 4218 index4 = format2; 4219 format2 = void 0; 4220 } 4221 format2 = format2 || ""; 4222 } 4223 var locale2 = getLocale(), shift = localeSorted ? locale2._week.dow : 0, i4, out = []; 4224 if (index4 != null) { 4225 return get$1(format2, (index4 + shift) % 7, field, "day"); 4226 } 4227 for (i4 = 0; i4 < 7; i4++) { 4228 out[i4] = get$1(format2, (i4 + shift) % 7, field, "day"); 4229 } 4230 return out; 4231 } 4232 function listMonths(format2, index4) { 4233 return listMonthsImpl(format2, index4, "months"); 4234 } 4235 function listMonthsShort(format2, index4) { 4236 return listMonthsImpl(format2, index4, "monthsShort"); 4237 } 4238 function listWeekdays(localeSorted, format2, index4) { 4239 return listWeekdaysImpl(localeSorted, format2, index4, "weekdays"); 4240 } 4241 function listWeekdaysShort(localeSorted, format2, index4) { 4242 return listWeekdaysImpl(localeSorted, format2, index4, "weekdaysShort"); 4243 } 4244 function listWeekdaysMin(localeSorted, format2, index4) { 4245 return listWeekdaysImpl(localeSorted, format2, index4, "weekdaysMin"); 4246 } 4247 getSetGlobalLocale("en", { 4248 eras: [ 4249 { 4250 since: "0001-01-01", 4251 until: Infinity, 4252 offset: 1, 4253 name: "Anno Domini", 4254 narrow: "AD", 4255 abbr: "AD" 4256 }, 4257 { 4258 since: "0000-12-31", 4259 until: -Infinity, 4260 offset: 1, 4261 name: "Before Christ", 4262 narrow: "BC", 4263 abbr: "BC" 4264 } 4265 ], 4266 dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, 4267 ordinal: function(number) { 4268 var b4 = number % 10, output = toInt(number % 100 / 10) === 1 ? "th" : b4 === 1 ? "st" : b4 === 2 ? "nd" : b4 === 3 ? "rd" : "th"; 4269 return number + output; 4270 } 4271 }); 4272 hooks.lang = deprecate( 4273 "moment.lang is deprecated. Use moment.locale instead.", 4274 getSetGlobalLocale 4275 ); 4276 hooks.langData = deprecate( 4277 "moment.langData is deprecated. Use moment.localeData instead.", 4278 getLocale 4279 ); 4280 var mathAbs = Math.abs; 4281 function abs() { 4282 var data = this._data; 4283 this._milliseconds = mathAbs(this._milliseconds); 4284 this._days = mathAbs(this._days); 4285 this._months = mathAbs(this._months); 4286 data.milliseconds = mathAbs(data.milliseconds); 4287 data.seconds = mathAbs(data.seconds); 4288 data.minutes = mathAbs(data.minutes); 4289 data.hours = mathAbs(data.hours); 4290 data.months = mathAbs(data.months); 4291 data.years = mathAbs(data.years); 4292 return this; 4293 } 4294 function addSubtract$1(duration, input, value, direction) { 4295 var other = createDuration2(input, value); 4296 duration._milliseconds += direction * other._milliseconds; 4297 duration._days += direction * other._days; 4298 duration._months += direction * other._months; 4299 return duration._bubble(); 4300 } 4301 function add$1(input, value) { 4302 return addSubtract$1(this, input, value, 1); 4303 } 4304 function subtract$1(input, value) { 4305 return addSubtract$1(this, input, value, -1); 4306 } 4307 function absCeil(number) { 4308 if (number < 0) { 4309 return Math.floor(number); 4310 } else { 4311 return Math.ceil(number); 4312 } 4313 } 4314 function bubble() { 4315 var milliseconds2 = this._milliseconds, days2 = this._days, months2 = this._months, data = this._data, seconds2, minutes2, hours2, years2, monthsFromDays; 4316 if (!(milliseconds2 >= 0 && days2 >= 0 && months2 >= 0 || milliseconds2 <= 0 && days2 <= 0 && months2 <= 0)) { 4317 milliseconds2 += absCeil(monthsToDays(months2) + days2) * 864e5; 4318 days2 = 0; 4319 months2 = 0; 4320 } 4321 data.milliseconds = milliseconds2 % 1e3; 4322 seconds2 = absFloor(milliseconds2 / 1e3); 4323 data.seconds = seconds2 % 60; 4324 minutes2 = absFloor(seconds2 / 60); 4325 data.minutes = minutes2 % 60; 4326 hours2 = absFloor(minutes2 / 60); 4327 data.hours = hours2 % 24; 4328 days2 += absFloor(hours2 / 24); 4329 monthsFromDays = absFloor(daysToMonths(days2)); 4330 months2 += monthsFromDays; 4331 days2 -= absCeil(monthsToDays(monthsFromDays)); 4332 years2 = absFloor(months2 / 12); 4333 months2 %= 12; 4334 data.days = days2; 4335 data.months = months2; 4336 data.years = years2; 4337 return this; 4338 } 4339 function daysToMonths(days2) { 4340 return days2 * 4800 / 146097; 4341 } 4342 function monthsToDays(months2) { 4343 return months2 * 146097 / 4800; 4344 } 4345 function as(units) { 4346 if (!this.isValid()) { 4347 return NaN; 4348 } 4349 var days2, months2, milliseconds2 = this._milliseconds; 4350 units = normalizeUnits(units); 4351 if (units === "month" || units === "quarter" || units === "year") { 4352 days2 = this._days + milliseconds2 / 864e5; 4353 months2 = this._months + daysToMonths(days2); 4354 switch (units) { 4355 case "month": 4356 return months2; 4357 case "quarter": 4358 return months2 / 3; 4359 case "year": 4360 return months2 / 12; 4361 } 4362 } else { 4363 days2 = this._days + Math.round(monthsToDays(this._months)); 4364 switch (units) { 4365 case "week": 4366 return days2 / 7 + milliseconds2 / 6048e5; 4367 case "day": 4368 return days2 + milliseconds2 / 864e5; 4369 case "hour": 4370 return days2 * 24 + milliseconds2 / 36e5; 4371 case "minute": 4372 return days2 * 1440 + milliseconds2 / 6e4; 4373 case "second": 4374 return days2 * 86400 + milliseconds2 / 1e3; 4375 case "millisecond": 4376 return Math.floor(days2 * 864e5) + milliseconds2; 4377 default: 4378 throw new Error("Unknown unit " + units); 4379 } 4380 } 4381 } 4382 function makeAs(alias) { 4383 return function() { 4384 return this.as(alias); 4385 }; 4386 } 4387 var asMilliseconds = makeAs("ms"), asSeconds = makeAs("s"), asMinutes = makeAs("m"), asHours = makeAs("h"), asDays = makeAs("d"), asWeeks = makeAs("w"), asMonths = makeAs("M"), asQuarters = makeAs("Q"), asYears = makeAs("y"), valueOf$1 = asMilliseconds; 4388 function clone$1() { 4389 return createDuration2(this); 4390 } 4391 function get$2(units) { 4392 units = normalizeUnits(units); 4393 return this.isValid() ? this[units + "s"]() : NaN; 4394 } 4395 function makeGetter(name) { 4396 return function() { 4397 return this.isValid() ? this._data[name] : NaN; 4398 }; 4399 } 4400 var milliseconds = makeGetter("milliseconds"), seconds = makeGetter("seconds"), minutes = makeGetter("minutes"), hours = makeGetter("hours"), days = makeGetter("days"), months = makeGetter("months"), years = makeGetter("years"); 4401 function weeks() { 4402 return absFloor(this.days() / 7); 4403 } 4404 var round2 = Math.round, thresholds = { 4405 ss: 44, 4406 s: 45, 4407 m: 45, 4408 h: 22, 4409 d: 26, 4410 w: null, 4411 M: 11 4412 }; 4413 function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale2) { 4414 return locale2.relativeTime(number || 1, !!withoutSuffix, string, isFuture); 4415 } 4416 function relativeTime$1(posNegDuration, withoutSuffix, thresholds2, locale2) { 4417 var duration = createDuration2(posNegDuration).abs(), seconds2 = round2(duration.as("s")), minutes2 = round2(duration.as("m")), hours2 = round2(duration.as("h")), days2 = round2(duration.as("d")), months2 = round2(duration.as("M")), weeks2 = round2(duration.as("w")), years2 = round2(duration.as("y")), a4 = seconds2 <= thresholds2.ss && ["s", seconds2] || seconds2 < thresholds2.s && ["ss", seconds2] || minutes2 <= 1 && ["m"] || minutes2 < thresholds2.m && ["mm", minutes2] || hours2 <= 1 && ["h"] || hours2 < thresholds2.h && ["hh", hours2] || days2 <= 1 && ["d"] || days2 < thresholds2.d && ["dd", days2]; 4418 if (thresholds2.w != null) { 4419 a4 = a4 || weeks2 <= 1 && ["w"] || weeks2 < thresholds2.w && ["ww", weeks2]; 4420 } 4421 a4 = a4 || months2 <= 1 && ["M"] || months2 < thresholds2.M && ["MM", months2] || years2 <= 1 && ["y"] || ["yy", years2]; 4422 a4[2] = withoutSuffix; 4423 a4[3] = +posNegDuration > 0; 4424 a4[4] = locale2; 4425 return substituteTimeAgo.apply(null, a4); 4426 } 4427 function getSetRelativeTimeRounding(roundingFunction) { 4428 if (roundingFunction === void 0) { 4429 return round2; 4430 } 4431 if (typeof roundingFunction === "function") { 4432 round2 = roundingFunction; 4433 return true; 4434 } 4435 return false; 4436 } 4437 function getSetRelativeTimeThreshold(threshold, limit) { 4438 if (thresholds[threshold] === void 0) { 4439 return false; 4440 } 4441 if (limit === void 0) { 4442 return thresholds[threshold]; 4443 } 4444 thresholds[threshold] = limit; 4445 if (threshold === "s") { 4446 thresholds.ss = limit - 1; 4447 } 4448 return true; 4449 } 4450 function humanize(argWithSuffix, argThresholds) { 4451 if (!this.isValid()) { 4452 return this.localeData().invalidDate(); 4453 } 4454 var withSuffix = false, th = thresholds, locale2, output; 4455 if (typeof argWithSuffix === "object") { 4456 argThresholds = argWithSuffix; 4457 argWithSuffix = false; 4458 } 4459 if (typeof argWithSuffix === "boolean") { 4460 withSuffix = argWithSuffix; 4461 } 4462 if (typeof argThresholds === "object") { 4463 th = Object.assign({}, thresholds, argThresholds); 4464 if (argThresholds.s != null && argThresholds.ss == null) { 4465 th.ss = argThresholds.s - 1; 4466 } 4467 } 4468 locale2 = this.localeData(); 4469 output = relativeTime$1(this, !withSuffix, th, locale2); 4470 if (withSuffix) { 4471 output = locale2.pastFuture(+this, output); 4472 } 4473 return locale2.postformat(output); 4474 } 4475 var abs$1 = Math.abs; 4476 function sign(x5) { 4477 return (x5 > 0) - (x5 < 0) || +x5; 4478 } 4479 function toISOString$1() { 4480 if (!this.isValid()) { 4481 return this.localeData().invalidDate(); 4482 } 4483 var seconds2 = abs$1(this._milliseconds) / 1e3, days2 = abs$1(this._days), months2 = abs$1(this._months), minutes2, hours2, years2, s4, total = this.asSeconds(), totalSign, ymSign, daysSign, hmsSign; 4484 if (!total) { 4485 return "P0D"; 4486 } 4487 minutes2 = absFloor(seconds2 / 60); 4488 hours2 = absFloor(minutes2 / 60); 4489 seconds2 %= 60; 4490 minutes2 %= 60; 4491 years2 = absFloor(months2 / 12); 4492 months2 %= 12; 4493 s4 = seconds2 ? seconds2.toFixed(3).replace(/\.?0+$/, "") : ""; 4494 totalSign = total < 0 ? "-" : ""; 4495 ymSign = sign(this._months) !== sign(total) ? "-" : ""; 4496 daysSign = sign(this._days) !== sign(total) ? "-" : ""; 4497 hmsSign = sign(this._milliseconds) !== sign(total) ? "-" : ""; 4498 return totalSign + "P" + (years2 ? ymSign + years2 + "Y" : "") + (months2 ? ymSign + months2 + "M" : "") + (days2 ? daysSign + days2 + "D" : "") + (hours2 || minutes2 || seconds2 ? "T" : "") + (hours2 ? hmsSign + hours2 + "H" : "") + (minutes2 ? hmsSign + minutes2 + "M" : "") + (seconds2 ? hmsSign + s4 + "S" : ""); 4499 } 4500 var proto$2 = Duration.prototype; 4501 proto$2.isValid = isValid$1; 4502 proto$2.abs = abs; 4503 proto$2.add = add$1; 4504 proto$2.subtract = subtract$1; 4505 proto$2.as = as; 4506 proto$2.asMilliseconds = asMilliseconds; 4507 proto$2.asSeconds = asSeconds; 4508 proto$2.asMinutes = asMinutes; 4509 proto$2.asHours = asHours; 4510 proto$2.asDays = asDays; 4511 proto$2.asWeeks = asWeeks; 4512 proto$2.asMonths = asMonths; 4513 proto$2.asQuarters = asQuarters; 4514 proto$2.asYears = asYears; 4515 proto$2.valueOf = valueOf$1; 4516 proto$2._bubble = bubble; 4517 proto$2.clone = clone$1; 4518 proto$2.get = get$2; 4519 proto$2.milliseconds = milliseconds; 4520 proto$2.seconds = seconds; 4521 proto$2.minutes = minutes; 4522 proto$2.hours = hours; 4523 proto$2.days = days; 4524 proto$2.weeks = weeks; 4525 proto$2.months = months; 4526 proto$2.years = years; 4527 proto$2.humanize = humanize; 4528 proto$2.toISOString = toISOString$1; 4529 proto$2.toString = toISOString$1; 4530 proto$2.toJSON = toISOString$1; 4531 proto$2.locale = locale; 4532 proto$2.localeData = localeData; 4533 proto$2.toIsoString = deprecate( 4534 "toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)", 4535 toISOString$1 4536 ); 4537 proto$2.lang = lang2; 4538 addFormatToken("X", 0, 0, "unix"); 4539 addFormatToken("x", 0, 0, "valueOf"); 4540 addRegexToken("x", matchSigned); 4541 addRegexToken("X", matchTimestamp); 4542 addParseToken("X", function(input, array, config2) { 4543 config2._d = new Date(parseFloat(input) * 1e3); 4544 }); 4545 addParseToken("x", function(input, array, config2) { 4546 config2._d = new Date(toInt(input)); 4547 }); 4548 hooks.version = "2.30.1"; 4549 setHookCallback(createLocal); 4550 hooks.fn = proto; 4551 hooks.min = min2; 4552 hooks.max = max2; 4553 hooks.now = now3; 4554 hooks.utc = createUTC; 4555 hooks.unix = createUnix; 4556 hooks.months = listMonths; 4557 hooks.isDate = isDate; 4558 hooks.locale = getSetGlobalLocale; 4559 hooks.invalid = createInvalid; 4560 hooks.duration = createDuration2; 4561 hooks.isMoment = isMoment; 4562 hooks.weekdays = listWeekdays; 4563 hooks.parseZone = createInZone; 4564 hooks.localeData = getLocale; 4565 hooks.isDuration = isDuration; 4566 hooks.monthsShort = listMonthsShort; 4567 hooks.weekdaysMin = listWeekdaysMin; 4568 hooks.defineLocale = defineLocale; 4569 hooks.updateLocale = updateLocale; 4570 hooks.locales = listLocales; 4571 hooks.weekdaysShort = listWeekdaysShort; 4572 hooks.normalizeUnits = normalizeUnits; 4573 hooks.relativeTimeRounding = getSetRelativeTimeRounding; 4574 hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; 4575 hooks.calendarFormat = getCalendarFormat; 4576 hooks.prototype = proto; 4577 hooks.HTML5_FMT = { 4578 DATETIME_LOCAL: "YYYY-MM-DDTHH:mm", 4579 DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss", 4580 DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS", 4581 DATE: "YYYY-MM-DD", 4582 TIME: "HH:mm", 4583 TIME_SECONDS: "HH:mm:ss", 4584 TIME_MS: "HH:mm:ss.SSS", 4585 WEEK: "GGGG-[W]WW", 4586 MONTH: "YYYY-MM" 4587 }; 4588 return hooks; 4589 }); 4590 } 4591 }); 4592 4593
vendor: 35,866 bytes, lines 4593-5439
4593// node_modules/pikaday/pikaday.js 4594 var require_pikaday = __commonJS({ 4595 "node_modules/pikaday/pikaday.js"(exports, module) { 4596 (function(root, factory) { 4597 "use strict"; 4598 var moment; 4599 if (typeof exports === "object") { 4600 try { 4601 moment = require_moment(); 4602 } catch (e4) { 4603 } 4604 module.exports = factory(moment); 4605 } else if (typeof define === "function" && define.amd) { 4606 define(function(req) { 4607 var id2 = "moment"; 4608 try { 4609 moment = req(id2); 4610 } catch (e4) { 4611 } 4612 return factory(moment); 4613 }); 4614 } else { 4615 root.Pikaday = factory(root.moment); 4616 } 4617 })(exports, function(moment) { 4618 "use strict"; 4619 var hasMoment = typeof moment === "function", hasEventListeners = !!window.addEventListener, document2 = window.document, sto = window.setTimeout, addEvent2 = function(el, e4, callback, capture) { 4620 if (hasEventListeners) { 4621 el.addEventListener(e4, callback, !!capture); 4622 } else { 4623 el.attachEvent("on" + e4, callback); 4624 } 4625 }, removeEvent = function(el, e4, callback, capture) { 4626 if (hasEventListeners) { 4627 el.removeEventListener(e4, callback, !!capture); 4628 } else { 4629 el.detachEvent("on" + e4, callback); 4630 } 4631 }, trim = function(str) { 4632 return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ""); 4633 }, hasClass = function(el, cn2) { 4634 return (" " + el.className + " ").indexOf(" " + cn2 + " ") !== -1; 4635 }, addClass = function(el, cn2) { 4636 if (!hasClass(el, cn2)) { 4637 el.className = el.className === "" ? cn2 : el.className + " " + cn2; 4638 } 4639 }, removeClass = function(el, cn2) { 4640 el.className = trim((" " + el.className + " ").replace(" " + cn2 + " ", " ")); 4641 }, isArray = function(obj) { 4642 return /Array/.test(Object.prototype.toString.call(obj)); 4643 }, isDate = function(obj) { 4644 return /Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime()); 4645 }, isWeekend = function(date) { 4646 var day = date.getDay(); 4647 return day === 0 || day === 6; 4648 }, isLeapYear = function(year) { 4649 return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; 4650 }, getDaysInMonth = function(year, month) { 4651 return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 4652 }, setToStartOfDay = function(date) { 4653 if (isDate(date)) 4654 date.setHours(0, 0, 0, 0); 4655 }, compareDates = function(a4, b4) { 4656 return a4.getTime() === b4.getTime(); 4657 }, extend5 = function(to2, from, overwrite) { 4658 var prop, hasProp; 4659 for (prop in from) { 4660 hasProp = to2[prop] !== void 0; 4661 if (hasProp && typeof from[prop] === "object" && from[prop] !== null && from[prop].nodeName === void 0) { 4662 if (isDate(from[prop])) { 4663 if (overwrite) { 4664 to2[prop] = new Date(from[prop].getTime()); 4665 } 4666 } else if (isArray(from[prop])) { 4667 if (overwrite) { 4668 to2[prop] = from[prop].slice(0); 4669 } 4670 } else { 4671 to2[prop] = extend5({}, from[prop], overwrite); 4672 } 4673 } else if (overwrite || !hasProp) { 4674 to2[prop] = from[prop]; 4675 } 4676 } 4677 return to2; 4678 }, fireEvent = function(el, eventName, data) { 4679 var ev; 4680 if (document2.createEvent) { 4681 ev = document2.createEvent("HTMLEvents"); 4682 ev.initEvent(eventName, true, false); 4683 ev = extend5(ev, data); 4684 el.dispatchEvent(ev); 4685 } else if (document2.createEventObject) { 4686 ev = document2.createEventObject(); 4687 ev = extend5(ev, data); 4688 el.fireEvent("on" + eventName, ev); 4689 } 4690 }, adjustCalendar = function(calendar) { 4691 if (calendar.month < 0) { 4692 calendar.year -= Math.ceil(Math.abs(calendar.month) / 12); 4693 calendar.month += 12; 4694 } 4695 if (calendar.month > 11) { 4696 calendar.year += Math.floor(Math.abs(calendar.month) / 12); 4697 calendar.month -= 12; 4698 } 4699 return calendar; 4700 }, defaults2 = { 4701 field: null, 4702 bound: void 0, 4703 ariaLabel: "Use the arrow keys to pick a date", 4704 position: "bottom left", 4705 reposition: true, 4706 format: "YYYY-MM-DD", 4707 toString: null, 4708 parse: null, 4709 defaultDate: null, 4710 setDefaultDate: false, 4711 firstDay: 0, 4712 firstWeekOfYearMinDays: 4, 4713 formatStrict: false, 4714 minDate: null, 4715 maxDate: null, 4716 yearRange: 10, 4717 showWeekNumber: false, 4718 pickWholeWeek: false, 4719 minYear: 0, 4720 maxYear: 9999, 4721 minMonth: void 0, 4722 maxMonth: void 0, 4723 startRange: null, 4724 endRange: null, 4725 isRTL: false, 4726 yearSuffix: "", 4727 showMonthAfterYear: false, 4728 showDaysInNextAndPreviousMonths: false, 4729 enableSelectionDaysInNextAndPreviousMonths: false, 4730 numberOfMonths: 1, 4731 mainCalendar: "left", 4732 container: void 0, 4733 blurFieldOnSelect: true, 4734 i18n: { 4735 previousMonth: "Previous Month", 4736 nextMonth: "Next Month", 4737 months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], 4738 weekdays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], 4739 weekdaysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] 4740 }, 4741 theme: null, 4742 events: [], 4743 onSelect: null, 4744 onOpen: null, 4745 onClose: null, 4746 onDraw: null, 4747 keyboardInput: true 4748 }, renderDayName = function(opts, day, abbr) { 4749 day += opts.firstDay; 4750 while (day >= 7) { 4751 day -= 7; 4752 } 4753 return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day]; 4754 }, renderDay = function(opts) { 4755 var arr = []; 4756 var ariaSelected = "false"; 4757 if (opts.isEmpty) { 4758 if (opts.showDaysInNextAndPreviousMonths) { 4759 arr.push("is-outside-current-month"); 4760 if (!opts.enableSelectionDaysInNextAndPreviousMonths) { 4761 arr.push("is-selection-disabled"); 4762 } 4763 } else { 4764 return '<td class="is-empty"></td>'; 4765 } 4766 } 4767 if (opts.isDisabled) { 4768 arr.push("is-disabled"); 4769 } 4770 if (opts.isToday) { 4771 arr.push("is-today"); 4772 } 4773 if (opts.isSelected) { 4774 arr.push("is-selected"); 4775 ariaSelected = "true"; 4776 } 4777 if (opts.hasEvent) { 4778 arr.push("has-event"); 4779 } 4780 if (opts.isInRange) { 4781 arr.push("is-inrange"); 4782 } 4783 if (opts.isStartRange) { 4784 arr.push("is-startrange"); 4785 } 4786 if (opts.isEndRange) { 4787 arr.push("is-endrange"); 4788 } 4789 return '<td data-day="' + opts.day + '" class="' + arr.join(" ") + '" aria-selected="' + ariaSelected + '"><button class="pika-button pika-day" type="button" data-pika-year="' + opts.year + '" data-pika-month="' + opts.month + '" data-pika-day="' + opts.day + '">' + opts.day + "</button></td>"; 4790 }, isoWeek = function(date, firstWeekOfYearMinDays) { 4791 date.setHours(0, 0, 0, 0); 4792 var yearDay = date.getDate(), weekDay = date.getDay(), dayInFirstWeek = firstWeekOfYearMinDays, dayShift = dayInFirstWeek - 1, daysPerWeek = 7, prevWeekDay = function(day) { 4793 return (day + daysPerWeek - 1) % daysPerWeek; 4794 }; 4795 date.setDate(yearDay + dayShift - prevWeekDay(weekDay)); 4796 var jan4th = new Date(date.getFullYear(), 0, dayInFirstWeek), msPerDay = 24 * 60 * 60 * 1e3, daysBetween = (date.getTime() - jan4th.getTime()) / msPerDay, weekNum = 1 + Math.round((daysBetween - dayShift + prevWeekDay(jan4th.getDay())) / daysPerWeek); 4797 return weekNum; 4798 }, renderWeek = function(d3, m5, y4, firstWeekOfYearMinDays) { 4799 var date = new Date(y4, m5, d3), week = hasMoment ? moment(date).isoWeek() : isoWeek(date, firstWeekOfYearMinDays); 4800 return '<td class="pika-week">' + week + "</td>"; 4801 }, renderRow = function(days, isRTL2, pickWholeWeek, isRowSelected) { 4802 return '<tr class="pika-row' + (pickWholeWeek ? " pick-whole-week" : "") + (isRowSelected ? " is-selected" : "") + '">' + (isRTL2 ? days.reverse() : days).join("") + "</tr>"; 4803 }, renderBody = function(rows) { 4804 return "<tbody>" + rows.join("") + "</tbody>"; 4805 }, renderHead = function(opts) { 4806 var i4, arr = []; 4807 if (opts.showWeekNumber) { 4808 arr.push("<th></th>"); 4809 } 4810 for (i4 = 0; i4 < 7; i4++) { 4811 arr.push('<th scope="col"><abbr title="' + renderDayName(opts, i4) + '">' + renderDayName(opts, i4, true) + "</abbr></th>"); 4812 } 4813 return "<thead><tr>" + (opts.isRTL ? arr.reverse() : arr).join("") + "</tr></thead>"; 4814 }, renderTitle = function(instance, c4, year, month, refYear, randId) { 4815 var i4, j5, arr, opts = instance._o, isMinYear = year === opts.minYear, isMaxYear = year === opts.maxYear, html = '<div id="' + randId + '" class="pika-title" role="heading" aria-live="assertive">', monthHtml, yearHtml, prev = true, next = true; 4816 for (arr = [], i4 = 0; i4 < 12; i4++) { 4817 arr.push('<option value="' + (year === refYear ? i4 - c4 : 12 + i4 - c4) + '"' + (i4 === month ? ' selected="selected"' : "") + (isMinYear && i4 < opts.minMonth || isMaxYear && i4 > opts.maxMonth ? ' disabled="disabled"' : "") + ">" + opts.i18n.months[i4] + "</option>"); 4818 } 4819 monthHtml = '<div class="pika-label">' + opts.i18n.months[month] + '<select class="pika-select pika-select-month" tabindex="-1">' + arr.join("") + "</select></div>"; 4820 if (isArray(opts.yearRange)) { 4821 i4 = opts.yearRange[0]; 4822 j5 = opts.yearRange[1] + 1; 4823 } else { 4824 i4 = year - opts.yearRange; 4825 j5 = 1 + year + opts.yearRange; 4826 } 4827 for (arr = []; i4 < j5 && i4 <= opts.maxYear; i4++) { 4828 if (i4 >= opts.minYear) { 4829 arr.push('<option value="' + i4 + '"' + (i4 === year ? ' selected="selected"' : "") + ">" + i4 + "</option>"); 4830 } 4831 } 4832 yearHtml = '<div class="pika-label">' + year + opts.yearSuffix + '<select class="pika-select pika-select-year" tabindex="-1">' + arr.join("") + "</select></div>"; 4833 if (opts.showMonthAfterYear) { 4834 html += yearHtml + monthHtml; 4835 } else { 4836 html += monthHtml + yearHtml; 4837 } 4838 if (isMinYear && (month === 0 || opts.minMonth >= month)) { 4839 prev = false; 4840 } 4841 if (isMaxYear && (month === 11 || opts.maxMonth <= month)) { 4842 next = false; 4843 } 4844 if (c4 === 0) { 4845 html += '<button class="pika-prev' + (prev ? "" : " is-disabled") + '" type="button">' + opts.i18n.previousMonth + "</button>"; 4846 } 4847 if (c4 === instance._o.numberOfMonths - 1) { 4848 html += '<button class="pika-next' + (next ? "" : " is-disabled") + '" type="button">' + opts.i18n.nextMonth + "</button>"; 4849 } 4850 return html += "</div>"; 4851 }, renderTable = function(opts, data, randId) { 4852 return '<table cellpadding="0" cellspacing="0" class="pika-table" role="grid" aria-labelledby="' + randId + '">' + renderHead(opts) + renderBody(data) + "</table>"; 4853 }, Pikaday5 = function(options) { 4854 var self = this, opts = self.config(options); 4855 self._onMouseDown = function(e4) { 4856 if (!self._v) { 4857 return; 4858 } 4859 e4 = e4 || window.event; 4860 var target = e4.target || e4.srcElement; 4861 if (!target) { 4862 return; 4863 } 4864 if (!hasClass(target, "is-disabled")) { 4865 if (hasClass(target, "pika-button") && !hasClass(target, "is-empty") && !hasClass(target.parentNode, "is-disabled")) { 4866 self.setDate(new Date(target.getAttribute("data-pika-year"), target.getAttribute("data-pika-month"), target.getAttribute("data-pika-day"))); 4867 if (opts.bound) { 4868 sto(function() { 4869 self.hide(); 4870 if (opts.blurFieldOnSelect && opts.field) { 4871 opts.field.blur(); 4872 } 4873 }, 100); 4874 } 4875 } else if (hasClass(target, "pika-prev")) { 4876 self.prevMonth(); 4877 } else if (hasClass(target, "pika-next")) { 4878 self.nextMonth(); 4879 } 4880 } 4881 if (!hasClass(target, "pika-select")) { 4882 if (e4.preventDefault) { 4883 e4.preventDefault(); 4884 } else { 4885 e4.returnValue = false; 4886 return false; 4887 } 4888 } else { 4889 self._c = true; 4890 } 4891 }; 4892 self._onChange = function(e4) { 4893 e4 = e4 || window.event; 4894 var target = e4.target || e4.srcElement; 4895 if (!target) { 4896 return; 4897 } 4898 if (hasClass(target, "pika-select-month")) { 4899 self.gotoMonth(target.value); 4900 } else if (hasClass(target, "pika-select-year")) { 4901 self.gotoYear(target.value); 4902 } 4903 }; 4904 self._onKeyChange = function(e4) { 4905 e4 = e4 || window.event; 4906 if (self.isVisible()) { 4907 switch (e4.keyCode) { 4908 case 13: 4909 case 27: 4910 if (opts.field) { 4911 opts.field.blur(); 4912 } 4913 break; 4914 case 37: 4915 self.adjustDate("subtract", 1); 4916 break; 4917 case 38: 4918 self.adjustDate("subtract", 7); 4919 break; 4920 case 39: 4921 self.adjustDate("add", 1); 4922 break; 4923 case 40: 4924 self.adjustDate("add", 7); 4925 break; 4926 case 8: 4927 case 46: 4928 self.setDate(null); 4929 break; 4930 } 4931 } 4932 }; 4933 self._parseFieldValue = function() { 4934 if (opts.parse) { 4935 return opts.parse(opts.field.value, opts.format); 4936 } else if (hasMoment) { 4937 var date = moment(opts.field.value, opts.format, opts.formatStrict); 4938 return date && date.isValid() ? date.toDate() : null; 4939 } else { 4940 return new Date(Date.parse(opts.field.value)); 4941 } 4942 }; 4943 self._onInputChange = function(e4) { 4944 var date; 4945 if (e4.firedBy === self) { 4946 return; 4947 } 4948 date = self._parseFieldValue(); 4949 if (isDate(date)) { 4950 self.setDate(date); 4951 } 4952 if (!self._v) { 4953 self.show(); 4954 } 4955 }; 4956 self._onInputFocus = function() { 4957 self.show(); 4958 }; 4959 self._onInputClick = function() { 4960 self.show(); 4961 }; 4962 self._onInputBlur = function() { 4963 var pEl = document2.activeElement; 4964 do { 4965 if (hasClass(pEl, "pika-single")) { 4966 return; 4967 } 4968 } while (pEl = pEl.parentNode); 4969 if (!self._c) { 4970 self._b = sto(function() { 4971 self.hide(); 4972 }, 50); 4973 } 4974 self._c = false; 4975 }; 4976 self._onClick = function(e4) { 4977 e4 = e4 || window.event; 4978 var target = e4.target || e4.srcElement, pEl = target; 4979 if (!target) { 4980 return; 4981 } 4982 if (!hasEventListeners && hasClass(target, "pika-select")) { 4983 if (!target.onchange) { 4984 target.setAttribute("onchange", "return;"); 4985 addEvent2(target, "change", self._onChange); 4986 } 4987 } 4988 do { 4989 if (hasClass(pEl, "pika-single") || pEl === opts.trigger) { 4990 return; 4991 } 4992 } while (pEl = pEl.parentNode); 4993 if (self._v && target !== opts.trigger && pEl !== opts.trigger) { 4994 self.hide(); 4995 } 4996 }; 4997 self.el = document2.createElement("div"); 4998 self.el.className = "pika-single" + (opts.isRTL ? " is-rtl" : "") + (opts.theme ? " " + opts.theme : ""); 4999 addEvent2(self.el, "mousedown", self._onMouseDown, true); 5000 addEvent2(self.el, "touchend", self._onMouseDown, true); 5001 addEvent2(self.el, "change", self._onChange); 5002 if (opts.keyboardInput) { 5003 addEvent2(document2, "keydown", self._onKeyChange); 5004 } 5005 if (opts.field) { 5006 if (opts.container) { 5007 opts.container.appendChild(self.el); 5008 } else if (opts.bound) { 5009 document2.body.appendChild(self.el); 5010 } else { 5011 opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling); 5012 } 5013 addEvent2(opts.field, "change", self._onInputChange); 5014 if (!opts.defaultDate) { 5015 opts.defaultDate = self._parseFieldValue(); 5016 opts.setDefaultDate = true; 5017 } 5018 } 5019 var defDate = opts.defaultDate; 5020 if (isDate(defDate)) { 5021 if (opts.setDefaultDate) { 5022 self.setDate(defDate, true); 5023 } else { 5024 self.gotoDate(defDate); 5025 } 5026 } else { 5027 self.gotoDate(new Date()); 5028 } 5029 if (opts.bound) { 5030 this.hide(); 5031 self.el.className += " is-bound"; 5032 addEvent2(opts.trigger, "click", self._onInputClick); 5033 addEvent2(opts.trigger, "focus", self._onInputFocus); 5034 addEvent2(opts.trigger, "blur", self._onInputBlur); 5035 } else { 5036 this.show(); 5037 } 5038 }; 5039 Pikaday5.prototype = { 5040 config: function(options) { 5041 if (!this._o) { 5042 this._o = extend5({}, defaults2, true); 5043 } 5044 var opts = extend5(this._o, options, true); 5045 opts.isRTL = !!opts.isRTL; 5046 opts.field = opts.field && opts.field.nodeName ? opts.field : null; 5047 opts.theme = typeof opts.theme === "string" && opts.theme ? opts.theme : null; 5048 opts.bound = !!(opts.bound !== void 0 ? opts.field && opts.bound : opts.field); 5049 opts.trigger = opts.trigger && opts.trigger.nodeName ? opts.trigger : opts.field; 5050 opts.disableWeekends = !!opts.disableWeekends; 5051 opts.disableDayFn = typeof opts.disableDayFn === "function" ? opts.disableDayFn : null; 5052 var nom = parseInt(opts.numberOfMonths, 10) || 1; 5053 opts.numberOfMonths = nom > 4 ? 4 : nom; 5054 if (!isDate(opts.minDate)) { 5055 opts.minDate = false; 5056 } 5057 if (!isDate(opts.maxDate)) { 5058 opts.maxDate = false; 5059 } 5060 if (opts.minDate && opts.maxDate && opts.maxDate < opts.minDate) { 5061 opts.maxDate = opts.minDate = false; 5062 } 5063 if (opts.minDate) { 5064 this.setMinDate(opts.minDate); 5065 } 5066 if (opts.maxDate) { 5067 this.setMaxDate(opts.maxDate); 5068 } 5069 if (isArray(opts.yearRange)) { 5070 var fallback = new Date().getFullYear() - 10; 5071 opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback; 5072 opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback; 5073 } else { 5074 opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults2.yearRange; 5075 if (opts.yearRange > 100) { 5076 opts.yearRange = 100; 5077 } 5078 } 5079 return opts; 5080 }, 5081 toString: function(format) { 5082 format = format || this._o.format; 5083 if (!isDate(this._d)) { 5084 return ""; 5085 } 5086 if (this._o.toString) { 5087 return this._o.toString(this._d, format); 5088 } 5089 if (hasMoment) { 5090 return moment(this._d).format(format); 5091 } 5092 return this._d.toDateString(); 5093 }, 5094 getMoment: function() { 5095 return hasMoment ? moment(this._d) : null; 5096 }, 5097 setMoment: function(date, preventOnSelect) { 5098 if (hasMoment && moment.isMoment(date)) { 5099 this.setDate(date.toDate(), preventOnSelect); 5100 } 5101 }, 5102 getDate: function() { 5103 return isDate(this._d) ? new Date(this._d.getTime()) : null; 5104 }, 5105 setDate: function(date, preventOnSelect) { 5106 if (!date) { 5107 this._d = null; 5108 if (this._o.field) { 5109 this._o.field.value = ""; 5110 fireEvent(this._o.field, "change", { firedBy: this }); 5111 } 5112 return this.draw(); 5113 } 5114 if (typeof date === "string") { 5115 date = new Date(Date.parse(date)); 5116 } 5117 if (!isDate(date)) { 5118 return; 5119 } 5120 var min2 = this._o.minDate, max2 = this._o.maxDate; 5121 if (isDate(min2) && date < min2) { 5122 date = min2; 5123 } else if (isDate(max2) && date > max2) { 5124 date = max2; 5125 } 5126 this._d = new Date(date.getTime()); 5127 setToStartOfDay(this._d); 5128 this.gotoDate(this._d); 5129 if (this._o.field) { 5130 this._o.field.value = this.toString(); 5131 fireEvent(this._o.field, "change", { firedBy: this }); 5132 } 5133 if (!preventOnSelect && typeof this._o.onSelect === "function") { 5134 this._o.onSelect.call(this, this.getDate()); 5135 } 5136 }, 5137 clear: function() { 5138 this.setDate(null); 5139 }, 5140 gotoDate: function(date) { 5141 var newCalendar = true; 5142 if (!isDate(date)) { 5143 return; 5144 } 5145 if (this.calendars) { 5146 var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1), lastVisibleDate = new Date(this.calendars[this.calendars.length - 1].year, this.calendars[this.calendars.length - 1].month, 1), visibleDate = date.getTime(); 5147 lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1); 5148 lastVisibleDate.setDate(lastVisibleDate.getDate() - 1); 5149 newCalendar = visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate; 5150 } 5151 if (newCalendar) { 5152 this.calendars = [{ 5153 month: date.getMonth(), 5154 year: date.getFullYear() 5155 }]; 5156 if (this._o.mainCalendar === "right") { 5157 this.calendars[0].month += 1 - this._o.numberOfMonths; 5158 } 5159 } 5160 this.adjustCalendars(); 5161 }, 5162 adjustDate: function(sign, days) { 5163 var day = this.getDate() || new Date(); 5164 var difference = parseInt(days) * 24 * 60 * 60 * 1e3; 5165 var newDay; 5166 if (sign === "add") { 5167 newDay = new Date(day.valueOf() + difference); 5168 } else if (sign === "subtract") { 5169 newDay = new Date(day.valueOf() - difference); 5170 } 5171 this.setDate(newDay); 5172 }, 5173 adjustCalendars: function() { 5174 this.calendars[0] = adjustCalendar(this.calendars[0]); 5175 for (var c4 = 1; c4 < this._o.numberOfMonths; c4++) { 5176 this.calendars[c4] = adjustCalendar({ 5177 month: this.calendars[0].month + c4, 5178 year: this.calendars[0].year 5179 }); 5180 } 5181 this.draw(); 5182 }, 5183 gotoToday: function() { 5184 this.gotoDate(new Date()); 5185 }, 5186 gotoMonth: function(month) { 5187 if (!isNaN(month)) { 5188 this.calendars[0].month = parseInt(month, 10); 5189 this.adjustCalendars(); 5190 } 5191 }, 5192 nextMonth: function() { 5193 this.calendars[0].month++; 5194 this.adjustCalendars(); 5195 }, 5196 prevMonth: function() { 5197 this.calendars[0].month--; 5198 this.adjustCalendars(); 5199 }, 5200 gotoYear: function(year) { 5201 if (!isNaN(year)) { 5202 this.calendars[0].year = parseInt(year, 10); 5203 this.adjustCalendars(); 5204 } 5205 }, 5206 setMinDate: function(value) { 5207 if (value instanceof Date) { 5208 setToStartOfDay(value); 5209 this._o.minDate = value; 5210 this._o.minYear = value.getFullYear(); 5211 this._o.minMonth = value.getMonth(); 5212 } else { 5213 this._o.minDate = defaults2.minDate; 5214 this._o.minYear = defaults2.minYear; 5215 this._o.minMonth = defaults2.minMonth; 5216 this._o.startRange = defaults2.startRange; 5217 } 5218 this.draw(); 5219 }, 5220 setMaxDate: function(value) { 5221 if (value instanceof Date) { 5222 setToStartOfDay(value); 5223 this._o.maxDate = value; 5224 this._o.maxYear = value.getFullYear(); 5225 this._o.maxMonth = value.getMonth(); 5226 } else { 5227 this._o.maxDate = defaults2.maxDate; 5228 this._o.maxYear = defaults2.maxYear; 5229 this._o.maxMonth = defaults2.maxMonth; 5230 this._o.endRange = defaults2.endRange; 5231 } 5232 this.draw(); 5233 }, 5234 setStartRange: function(value) { 5235 this._o.startRange = value; 5236 }, 5237 setEndRange: function(value) { 5238 this._o.endRange = value; 5239 }, 5240 draw: function(force) { 5241 if (!this._v && !force) { 5242 return; 5243 } 5244 var opts = this._o, minYear = opts.minYear, maxYear = opts.maxYear, minMonth = opts.minMonth, maxMonth = opts.maxMonth, html = "", randId; 5245 if (this._y <= minYear) { 5246 this._y = minYear; 5247 if (!isNaN(minMonth) && this._m < minMonth) { 5248 this._m = minMonth; 5249 } 5250 } 5251 if (this._y >= maxYear) { 5252 this._y = maxYear; 5253 if (!isNaN(maxMonth) && this._m > maxMonth) { 5254 this._m = maxMonth; 5255 } 5256 } 5257 for (var c4 = 0; c4 < opts.numberOfMonths; c4++) { 5258 randId = "pika-title-" + Math.random().toString(36).replace(/[^a-z]+/g, "").substr(0, 2); 5259 html += '<div class="pika-lendar">' + renderTitle(this, c4, this.calendars[c4].year, this.calendars[c4].month, this.calendars[0].year, randId) + this.render(this.calendars[c4].year, this.calendars[c4].month, randId) + "</div>"; 5260 } 5261 this.el.innerHTML = html; 5262 if (opts.bound) { 5263 if (opts.field.type !== "hidden") { 5264 sto(function() { 5265 opts.trigger.focus(); 5266 }, 1); 5267 } 5268 } 5269 if (typeof this._o.onDraw === "function") { 5270 this._o.onDraw(this); 5271 } 5272 if (opts.bound) { 5273 opts.field.setAttribute("aria-label", opts.ariaLabel); 5274 } 5275 }, 5276 adjustPosition: function() { 5277 var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left2, top2, clientRect, leftAligned, bottomAligned; 5278 if (this._o.container) 5279 return; 5280 this.el.style.position = "absolute"; 5281 field = this._o.trigger; 5282 pEl = field; 5283 width = this.el.offsetWidth; 5284 height = this.el.offsetHeight; 5285 viewportWidth = window.innerWidth || document2.documentElement.clientWidth; 5286 viewportHeight = window.innerHeight || document2.documentElement.clientHeight; 5287 scrollTop = window.pageYOffset || document2.body.scrollTop || document2.documentElement.scrollTop; 5288 leftAligned = true; 5289 bottomAligned = true; 5290 if (typeof field.getBoundingClientRect === "function") { 5291 clientRect = field.getBoundingClientRect(); 5292 left2 = clientRect.left + window.pageXOffset; 5293 top2 = clientRect.bottom + window.pageYOffset; 5294 } else { 5295 left2 = pEl.offsetLeft; 5296 top2 = pEl.offsetTop + pEl.offsetHeight; 5297 while (pEl = pEl.offsetParent) { 5298 left2 += pEl.offsetLeft; 5299 top2 += pEl.offsetTop; 5300 } 5301 } 5302 if (this._o.reposition && left2 + width > viewportWidth || this._o.position.indexOf("right") > -1 && left2 - width + field.offsetWidth > 0) { 5303 left2 = left2 - width + field.offsetWidth; 5304 leftAligned = false; 5305 } 5306 if (this._o.reposition && top2 + height > viewportHeight + scrollTop || this._o.position.indexOf("top") > -1 && top2 - height - field.offsetHeight > 0) { 5307 top2 = top2 - height - field.offsetHeight; 5308 bottomAligned = false; 5309 } 5310 this.el.style.left = left2 + "px"; 5311 this.el.style.top = top2 + "px"; 5312 addClass(this.el, leftAligned ? "left-aligned" : "right-aligned"); 5313 addClass(this.el, bottomAligned ? "bottom-aligned" : "top-aligned"); 5314 removeClass(this.el, !leftAligned ? "left-aligned" : "right-aligned"); 5315 removeClass(this.el, !bottomAligned ? "bottom-aligned" : "top-aligned"); 5316 }, 5317 render: function(year, month, randId) { 5318 var opts = this._o, now3 = new Date(), days = getDaysInMonth(year, month), before = new Date(year, month, 1).getDay(), data = [], row = []; 5319 setToStartOfDay(now3); 5320 if (opts.firstDay > 0) { 5321 before -= opts.firstDay; 5322 if (before < 0) { 5323 before += 7; 5324 } 5325 } 5326 var previousMonth = month === 0 ? 11 : month - 1, nextMonth = month === 11 ? 0 : month + 1, yearOfPreviousMonth = month === 0 ? year - 1 : year, yearOfNextMonth = month === 11 ? year + 1 : year, daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth); 5327 var cells = days + before, after = cells; 5328 while (after > 7) { 5329 after -= 7; 5330 } 5331 cells += 7 - after; 5332 var isWeekSelected = false; 5333 for (var i4 = 0, r4 = 0; i4 < cells; i4++) { 5334 var day = new Date(year, month, 1 + (i4 - before)), isSelected = isDate(this._d) ? compareDates(day, this._d) : false, isToday = compareDates(day, now3), hasEvent = opts.events.indexOf(day.toDateString()) !== -1 ? true : false, isEmpty = i4 < before || i4 >= days + before, dayNumber = 1 + (i4 - before), monthNumber = month, yearNumber = year, isStartRange = opts.startRange && compareDates(opts.startRange, day), isEndRange = opts.endRange && compareDates(opts.endRange, day), isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange, isDisabled2 = opts.minDate && day < opts.minDate || opts.maxDate && day > opts.maxDate || opts.disableWeekends && isWeekend(day) || opts.disableDayFn && opts.disableDayFn(day); 5335 if (isEmpty) { 5336 if (i4 < before) { 5337 dayNumber = daysInPreviousMonth + dayNumber; 5338 monthNumber = previousMonth; 5339 yearNumber = yearOfPreviousMonth; 5340 } else { 5341 dayNumber = dayNumber - days; 5342 monthNumber = nextMonth; 5343 yearNumber = yearOfNextMonth; 5344 } 5345 } 5346 var dayConfig = { 5347 day: dayNumber, 5348 month: monthNumber, 5349 year: yearNumber, 5350 hasEvent, 5351 isSelected, 5352 isToday, 5353 isDisabled: isDisabled2, 5354 isEmpty, 5355 isStartRange, 5356 isEndRange, 5357 isInRange, 5358 showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths, 5359 enableSelectionDaysInNextAndPreviousMonths: opts.enableSelectionDaysInNextAndPreviousMonths 5360 }; 5361 if (opts.pickWholeWeek && isSelected) { 5362 isWeekSelected = true; 5363 } 5364 row.push(renderDay(dayConfig)); 5365 if (++r4 === 7) { 5366 if (opts.showWeekNumber) { 5367 row.unshift(renderWeek(i4 - before, month, year, opts.firstWeekOfYearMinDays)); 5368 } 5369 data.push(renderRow(row, opts.isRTL, opts.pickWholeWeek, isWeekSelected)); 5370 row = []; 5371 r4 = 0; 5372 isWeekSelected = false; 5373 } 5374 } 5375 return renderTable(opts, data, randId); 5376 }, 5377 isVisible: function() { 5378 return this._v; 5379 }, 5380 show: function() { 5381 if (!this.isVisible()) { 5382 this._v = true; 5383 this.draw(); 5384 removeClass(this.el, "is-hidden"); 5385 if (this._o.bound) { 5386 addEvent2(document2, "click", this._onClick); 5387 this.adjustPosition(); 5388 } 5389 if (typeof this._o.onOpen === "function") { 5390 this._o.onOpen.call(this); 5391 } 5392 } 5393 }, 5394 hide: function() { 5395 var v4 = this._v; 5396 if (v4 !== false) { 5397 if (this._o.bound) { 5398 removeEvent(document2, "click", this._onClick); 5399 } 5400 if (!this._o.container) { 5401 this.el.style.position = "static"; 5402 this.el.style.left = "auto"; 5403 this.el.style.top = "auto"; 5404 } 5405 addClass(this.el, "is-hidden"); 5406 this._v = false; 5407 if (v4 !== void 0 && typeof this._o.onClose === "function") { 5408 this._o.onClose.call(this); 5409 } 5410 } 5411 }, 5412 destroy: function() { 5413 var opts = this._o; 5414 this.hide(); 5415 removeEvent(this.el, "mousedown", this._onMouseDown, true); 5416 removeEvent(this.el, "touchend", this._onMouseDown, true); 5417 removeEvent(this.el, "change", this._onChange); 5418 if (opts.keyboardInput) { 5419 removeEvent(document2, "keydown", this._onKeyChange); 5420 } 5421 if (opts.field) { 5422 removeEvent(opts.field, "change", this._onInputChange); 5423 if (opts.bound) { 5424 removeEvent(opts.trigger, "click", this._onInputClick); 5425 removeEvent(opts.trigger, "focus", this._onInputFocus); 5426 removeEvent(opts.trigger, "blur", this._onInputBlur); 5427 } 5428 } 5429 if (this.el.parentNode) { 5430 this.el.parentNode.removeChild(this.el); 5431 } 5432 } 5433 }; 5434 return Pikaday5; 5435 }); 5436 } 5437 }); 5438 5439
vendor: 5,383 bytes, lines 5439-5549
5439// node_modules/mutation-events/src/mutation_events.min.js 5440 var require_mutation_events_min = __commonJS({ 5441 "node_modules/mutation-events/src/mutation_events.min.js"() { 5442 !function() { 5443 if (window.mutationEventsPolyfillInstalled) 5444 return; 5445 window.mutationEventsPolyfillInstalled = true; 5446 let e4 = "MutationEvent" in window; 5447 if (e4 && !window.mutationEventsUsePolyfillAlways) 5448 return; 5449 let t5 = /* @__PURE__ */ new Set(["DOMCharacterDataModified", "DOMNodeInserted", "DOMNodeInsertedIntoDocument", "DOMNodeRemoved", "DOMNodeRemovedFromDocument", "DOMSubtreeModified"]), n3 = "Polyfilled", o3 = { attrChange: 0, bubbles: true, cancelable: false, newValue: "", prevValue: "", relatedNode: null }; 5450 function r4(e5, t6, r5, a5) { 5451 let l5 = Object.assign({}, o3); 5452 r5 && (l5 = Object.assign(l5, r5)); 5453 let i5 = new Event(e5 + n3, l5); 5454 i5.attrChange = l5.attrChange, i5.newValue = l5.newValue, i5.prevValue = l5.prevValue, i5.relatedNode = l5.relatedNode, a5 && Object.defineProperty(i5, "target", { writable: false, value: a5 }), t6.dispatchEvent(i5); 5455 } 5456 function a4(e5, t6) { 5457 let n4 = document.createTreeWalker(e5, NodeFilter.SHOW_ALL); 5458 do 5459 t6(n4.currentNode); 5460 while (n4.nextNode()); 5461 } 5462 let l4 = /* @__PURE__ */ new Map(), i4 = /* @__PURE__ */ new Set(); 5463 function u4(e5) { 5464 let t6 = []; 5465 for (let n4 of (e5.forEach(function(e6) { 5466 let n5 = e6.target, o4 = e6.type; 5467 "attributes" === o4 ? (null === e6.oldValue || null === n5.getAttribute(e6.attributeName)) && r4("DOMSubtreeModified", n5, { attributeName: e6.attributeName }) : "characterData" === o4 ? (r4("DOMCharacterDataModified", n5, { prevValue: e6.oldValue, newValue: n5.textContent }), t6.push(n5)) : "childList" === o4 && (e6.removedNodes.forEach((e7) => { 5468 t6.push(n5), r4("DOMNodeRemoved", e7), r4("DOMNodeRemoved", n5, void 0, e7), a4(e7, (e8) => r4("DOMNodeRemovedFromDocument", e8, { bubbles: false })), r4("DOMNodeRemovedFromDocument", n5, { bubbles: false }, e7); 5469 }), e6.addedNodes.forEach((e7) => { 5470 t6.push(n5), r4("DOMNodeInserted", e7), a4(e7, (e8) => r4("DOMNodeInsertedIntoDocument", e8, { bubbles: false })); 5471 })); 5472 }), t6)) 5473 r4("DOMSubtreeModified", n4); 5474 } 5475 function d3(e5) { 5476 let t6 = e5.getRootNode(); 5477 for (; t6 instanceof ShadowRoot; ) 5478 t6 = t6.host.getRootNode(); 5479 return t6 instanceof Document ? t6.documentElement : t6; 5480 } 5481 function s4(e5, t6) { 5482 return e5 && e5.has && e5.has(t6); 5483 } 5484 let c4 = { subtree: true, childList: true, attributes: true, attributeOldValue: true, characterData: true, characterDataOldValue: true }, f4 = Element.prototype.addEventListener; 5485 function v4(e5, o4, r5) { 5486 return s4(t5, e5) ? { fullEventName: e5 + n3, augmentedListener(t6) { 5487 Object.defineProperty(t6, "type", { writable: false, value: e5 }), o4(t6); 5488 } } : { fullEventName: e5, augmentedListener: o4 }; 5489 } 5490 Element.prototype.addEventListener = function(e5, n4, o4) { 5491 if (s4(t5, e5)) { 5492 !function e6(t6) { 5493 if (s4(i4, t6)) 5494 return; 5495 i4.add(t6); 5496 let n5 = d3(t6); 5497 if (s4(l4, n5)) { 5498 l4.get(n5).count++; 5499 return; 5500 } 5501 let o5 = new MutationObserver(u4); 5502 l4.set(n5, { observer: o5, count: 1 }), o5.observe(n5, c4); 5503 }(this); 5504 let { augmentedListener: r5, fullEventName: a5 } = v4(e5, n4, o4); 5505 f4.apply(this, [a5, r5, o4]); 5506 return; 5507 } 5508 f4.call(this, e5, n4, o4); 5509 }; 5510 let p4 = window.removeEventListener; 5511 Element.prototype.removeEventListener = function(e5, n4, o4) { 5512 if (s4(t5, e5)) { 5513 !function e6(t6) { 5514 if (!s4(i4, t6)) 5515 return; 5516 i4.delete(t6); 5517 let n5 = d3(t6); 5518 if (s4(l4, n5) && 0 == --l4.get(n5).count) { 5519 let o5 = l4.get(n5).observer; 5520 l4.delete(n5), o5.disconnect(); 5521 } 5522 }(this); 5523 let { augmentedListener: r5, fullEventName: a5 } = v4(e5, n4, o4); 5524 p4.apply(this, [a5, r5, o4]); 5525 return; 5526 } 5527 p4.call(this, e5, n4, o4); 5528 }, window.MutationEvent = class extends CustomEvent { 5529 constructor(e5, t6) { 5530 if ("MagicString" !== e5) 5531 throw "Illegal constructor"; 5532 super("", t6); 5533 } 5534 initMutationEvent(...e5) { 5535 this.initCustomEvent(...e5); 5536 } 5537 static MODIFICATION = 1; 5538 static ADDITION = 2; 5539 static REMOVAL = 3; 5540 }, window.initMutationEvent = () => new MutationEvent(); 5541 let h4 = Document.prototype.createEvent; 5542 Document.prototype.createEvent = function(e5, ...t6) { 5543 return "MutationEvent" === e5 ? new MutationEvent("MagicString") : h4.call(this, e5, ...t6); 5544 }, console.log(`Mutation Events polyfill installed (native feature: ${e4 ? "supported" : "not present"}).`); 5545 }(); 5546 } 5547 }); 5548 5549
vendor: 132,093 bytes, lines 5549-9346
5549// node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js 5550 (function() { 5551 if (window.Reflect === void 0 || window.customElements === void 0 || window.customElements.polyfillWrapFlushCallback) { 5552 return; 5553 } 5554 const BuiltInHTMLElement = HTMLElement; 5555 const wrapperForTheName = { 5556 HTMLElement: function HTMLElement2() { 5557 return Reflect.construct(BuiltInHTMLElement, [], this.constructor); 5558 } 5559 }; 5560 window.HTMLElement = wrapperForTheName["HTMLElement"]; 5561 HTMLElement.prototype = BuiltInHTMLElement.prototype; 5562 HTMLElement.prototype.constructor = HTMLElement; 5563 Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement); 5564 })(); 5565 (function(prototype) { 5566 if (typeof prototype.requestSubmit == "function") 5567 return; 5568 prototype.requestSubmit = function(submitter) { 5569 if (submitter) { 5570 validateSubmitter(submitter, this); 5571 submitter.click(); 5572 } else { 5573 submitter = document.createElement("input"); 5574 submitter.type = "submit"; 5575 submitter.hidden = true; 5576 this.appendChild(submitter); 5577 submitter.click(); 5578 this.removeChild(submitter); 5579 } 5580 }; 5581 function validateSubmitter(submitter, form) { 5582 submitter instanceof HTMLElement || raise(TypeError, "parameter 1 is not of type 'HTMLElement'"); 5583 submitter.type == "submit" || raise(TypeError, "The specified element is not a submit button"); 5584 submitter.form == form || raise(DOMException, "The specified element is not owned by this form element", "NotFoundError"); 5585 } 5586 function raise(errorConstructor, message, name) { 5587 throw new errorConstructor("Failed to execute 'requestSubmit' on 'HTMLFormElement': " + message + ".", name); 5588 } 5589 })(HTMLFormElement.prototype); 5590 var submittersByForm = /* @__PURE__ */ new WeakMap(); 5591 function findSubmitterFromClickTarget(target) { 5592 const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null; 5593 const candidate = element ? element.closest("input, button") : null; 5594 return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == "submit" ? candidate : null; 5595 } 5596 function clickCaptured(event2) { 5597 const submitter = findSubmitterFromClickTarget(event2.target); 5598 if (submitter && submitter.form) { 5599 submittersByForm.set(submitter.form, submitter); 5600 } 5601 } 5602 (function() { 5603 if ("submitter" in Event.prototype) 5604 return; 5605 let prototype = window.Event.prototype; 5606 if ("SubmitEvent" in window && /Apple Computer/.test(navigator.vendor)) { 5607 prototype = window.SubmitEvent.prototype; 5608 } else if ("SubmitEvent" in window) { 5609 return; 5610 } 5611 addEventListener("click", clickCaptured, true); 5612 Object.defineProperty(prototype, "submitter", { 5613 get() { 5614 if (this.type == "submit" && this.target instanceof HTMLFormElement) { 5615 return submittersByForm.get(this.target); 5616 } 5617 } 5618 }); 5619 })(); 5620 var FrameLoadingStyle; 5621 (function(FrameLoadingStyle2) { 5622 FrameLoadingStyle2["eager"] = "eager"; 5623 FrameLoadingStyle2["lazy"] = "lazy"; 5624 })(FrameLoadingStyle || (FrameLoadingStyle = {})); 5625 var FrameElement = class extends HTMLElement { 5626 static get observedAttributes() { 5627 return ["disabled", "complete", "loading", "src"]; 5628 } 5629 constructor() { 5630 super(); 5631 this.loaded = Promise.resolve(); 5632 this.delegate = new FrameElement.delegateConstructor(this); 5633 } 5634 connectedCallback() { 5635 this.delegate.connect(); 5636 } 5637 disconnectedCallback() { 5638 this.delegate.disconnect(); 5639 } 5640 reload() { 5641 return this.delegate.sourceURLReloaded(); 5642 } 5643 attributeChangedCallback(name) { 5644 if (name == "loading") { 5645 this.delegate.loadingStyleChanged(); 5646 } else if (name == "complete") { 5647 this.delegate.completeChanged(); 5648 } else if (name == "src") { 5649 this.delegate.sourceURLChanged(); 5650 } else { 5651 this.delegate.disabledChanged(); 5652 } 5653 } 5654 get src() { 5655 return this.getAttribute("src"); 5656 } 5657 set src(value) { 5658 if (value) { 5659 this.setAttribute("src", value); 5660 } else { 5661 this.removeAttribute("src"); 5662 } 5663 } 5664 get loading() { 5665 return frameLoadingStyleFromString(this.getAttribute("loading") || ""); 5666 } 5667 set loading(value) { 5668 if (value) { 5669 this.setAttribute("loading", value); 5670 } else { 5671 this.removeAttribute("loading"); 5672 } 5673 } 5674 get disabled() { 5675 return this.hasAttribute("disabled"); 5676 } 5677 set disabled(value) { 5678 if (value) { 5679 this.setAttribute("disabled", ""); 5680 } else { 5681 this.removeAttribute("disabled"); 5682 } 5683 } 5684 get autoscroll() { 5685 return this.hasAttribute("autoscroll"); 5686 } 5687 set autoscroll(value) { 5688 if (value) { 5689 this.setAttribute("autoscroll", ""); 5690 } else { 5691 this.removeAttribute("autoscroll"); 5692 } 5693 } 5694 get complete() { 5695 return !this.delegate.isLoading; 5696 } 5697 get isActive() { 5698 return this.ownerDocument === document && !this.isPreview; 5699 } 5700 get isPreview() { 5701 var _a, _b; 5702 return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute("data-turbo-preview"); 5703 } 5704 }; 5705 function frameLoadingStyleFromString(style) { 5706 switch (style.toLowerCase()) { 5707 case "lazy": 5708 return FrameLoadingStyle.lazy; 5709 default: 5710 return FrameLoadingStyle.eager; 5711 } 5712 } 5713 function expandURL(locatable) { 5714 return new URL(locatable.toString(), document.baseURI); 5715 } 5716 function getAnchor(url) { 5717 let anchorMatch; 5718 if (url.hash) { 5719 return url.hash.slice(1); 5720 } else if (anchorMatch = url.href.match(/#(.*)$/)) { 5721 return anchorMatch[1]; 5722 } 5723 } 5724 function getAction(form, submitter) { 5725 const action = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("formaction")) || form.getAttribute("action") || form.action; 5726 return expandURL(action); 5727 } 5728 function getExtension(url) { 5729 return (getLastPathComponent(url).match(/\.[^.]*$/) || [])[0] || ""; 5730 } 5731 function isHTML(url) { 5732 return !!getExtension(url).match(/^(?:|\.(?:htm|html|xhtml|php))$/); 5733 } 5734 function isPrefixedBy(baseURL, url) { 5735 const prefix = getPrefix(url); 5736 return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix); 5737 } 5738 function locationIsVisitable(location2, rootLocation) { 5739 return isPrefixedBy(location2, rootLocation) && isHTML(location2); 5740 } 5741 function getRequestURL(url) { 5742 const anchor = getAnchor(url); 5743 return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href; 5744 } 5745 function toCacheKey(url) { 5746 return getRequestURL(url); 5747 } 5748 function urlsAreEqual(left2, right2) { 5749 return expandURL(left2).href == expandURL(right2).href; 5750 } 5751 function getPathComponents(url) { 5752 return url.pathname.split("/").slice(1); 5753 } 5754 function getLastPathComponent(url) { 5755 return getPathComponents(url).slice(-1)[0]; 5756 } 5757 function getPrefix(url) { 5758 return addTrailingSlash(url.origin + url.pathname); 5759 } 5760 function addTrailingSlash(value) { 5761 return value.endsWith("/") ? value : value + "/"; 5762 } 5763 var FetchResponse = class { 5764 constructor(response) { 5765 this.response = response; 5766 } 5767 get succeeded() { 5768 return this.response.ok; 5769 } 5770 get failed() { 5771 return !this.succeeded; 5772 } 5773 get clientError() { 5774 return this.statusCode >= 400 && this.statusCode <= 499; 5775 } 5776 get serverError() { 5777 return this.statusCode >= 500 && this.statusCode <= 599; 5778 } 5779 get redirected() { 5780 return this.response.redirected; 5781 } 5782 get location() { 5783 return expandURL(this.response.url); 5784 } 5785 get isHTML() { 5786 return this.contentType && this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/); 5787 } 5788 get statusCode() { 5789 return this.response.status; 5790 } 5791 get contentType() { 5792 return this.header("Content-Type"); 5793 } 5794 get responseText() { 5795 return this.response.clone().text(); 5796 } 5797 get responseHTML() { 5798 if (this.isHTML) { 5799 return this.response.clone().text(); 5800 } else { 5801 return Promise.resolve(void 0); 5802 } 5803 } 5804 header(name) { 5805 return this.response.headers.get(name); 5806 } 5807 }; 5808 function activateScriptElement(element) { 5809 if (element.getAttribute("data-turbo-eval") == "false") { 5810 return element; 5811 } else { 5812 const createdScriptElement = document.createElement("script"); 5813 const cspNonce2 = getMetaContent("csp-nonce"); 5814 if (cspNonce2) { 5815 createdScriptElement.nonce = cspNonce2; 5816 } 5817 createdScriptElement.textContent = element.textContent; 5818 createdScriptElement.async = false; 5819 copyElementAttributes(createdScriptElement, element); 5820 return createdScriptElement; 5821 } 5822 } 5823 function copyElementAttributes(destinationElement, sourceElement) { 5824 for (const { name, value } of sourceElement.attributes) { 5825 destinationElement.setAttribute(name, value); 5826 } 5827 } 5828 function createDocumentFragment(html) { 5829 const template = document.createElement("template"); 5830 template.innerHTML = html; 5831 return template.content; 5832 } 5833 function dispatch(eventName, { target, cancelable, detail } = {}) { 5834 const event2 = new CustomEvent(eventName, { 5835 cancelable, 5836 bubbles: true, 5837 composed: true, 5838 detail 5839 }); 5840 if (target && target.isConnected) { 5841 target.dispatchEvent(event2); 5842 } else { 5843 document.documentElement.dispatchEvent(event2); 5844 } 5845 return event2; 5846 } 5847 function nextAnimationFrame() { 5848 return new Promise((resolve) => requestAnimationFrame(() => resolve())); 5849 } 5850 function nextEventLoopTick() { 5851 return new Promise((resolve) => setTimeout(() => resolve(), 0)); 5852 } 5853 function nextMicrotask() { 5854 return Promise.resolve(); 5855 } 5856 function parseHTMLDocument(html = "") { 5857 return new DOMParser().parseFromString(html, "text/html"); 5858 } 5859 function unindent(strings, ...values) { 5860 const lines = interpolate(strings, values).replace(/^\n/, "").split("\n"); 5861 const match = lines[0].match(/^\s+/); 5862 const indent = match ? match[0].length : 0; 5863 return lines.map((line) => line.slice(indent)).join("\n"); 5864 } 5865 function interpolate(strings, values) { 5866 return strings.reduce((result, string, i4) => { 5867 const value = values[i4] == void 0 ? "" : values[i4]; 5868 return result + string + value; 5869 }, ""); 5870 } 5871 function uuid() { 5872 return Array.from({ length: 36 }).map((_4, i4) => { 5873 if (i4 == 8 || i4 == 13 || i4 == 18 || i4 == 23) { 5874 return "-"; 5875 } else if (i4 == 14) { 5876 return "4"; 5877 } else if (i4 == 19) { 5878 return (Math.floor(Math.random() * 4) + 8).toString(16); 5879 } else { 5880 return Math.floor(Math.random() * 15).toString(16); 5881 } 5882 }).join(""); 5883 } 5884 function getAttribute(attributeName, ...elements) { 5885 for (const value of elements.map((element) => element === null || element === void 0 ? void 0 : element.getAttribute(attributeName))) { 5886 if (typeof value == "string") 5887 return value; 5888 } 5889 return null; 5890 } 5891 function hasAttribute(attributeName, ...elements) { 5892 return elements.some((element) => element && element.hasAttribute(attributeName)); 5893 } 5894 function markAsBusy(...elements) { 5895 for (const element of elements) { 5896 if (element.localName == "turbo-frame") { 5897 element.setAttribute("busy", ""); 5898 } 5899 element.setAttribute("aria-busy", "true"); 5900 } 5901 } 5902 function clearBusyState(...elements) { 5903 for (const element of elements) { 5904 if (element.localName == "turbo-frame") { 5905 element.removeAttribute("busy"); 5906 } 5907 element.removeAttribute("aria-busy"); 5908 } 5909 } 5910 function waitForLoad(element, timeoutInMilliseconds = 2e3) { 5911 return new Promise((resolve) => { 5912 const onComplete = () => { 5913 element.removeEventListener("error", onComplete); 5914 element.removeEventListener("load", onComplete); 5915 resolve(); 5916 }; 5917 element.addEventListener("load", onComplete, { once: true }); 5918 element.addEventListener("error", onComplete, { once: true }); 5919 setTimeout(resolve, timeoutInMilliseconds); 5920 }); 5921 } 5922 function getHistoryMethodForAction(action) { 5923 switch (action) { 5924 case "replace": 5925 return history.replaceState; 5926 case "advance": 5927 case "restore": 5928 return history.pushState; 5929 } 5930 } 5931 function isAction(action) { 5932 return action == "advance" || action == "replace" || action == "restore"; 5933 } 5934 function getVisitAction(...elements) { 5935 const action = getAttribute("data-turbo-action", ...elements); 5936 return isAction(action) ? action : null; 5937 } 5938 function getMetaElement(name) { 5939 return document.querySelector(`meta[name="${name}"]`); 5940 } 5941 function getMetaContent(name) { 5942 const element = getMetaElement(name); 5943 return element && element.content; 5944 } 5945 function setMetaContent(name, content) { 5946 let element = getMetaElement(name); 5947 if (!element) { 5948 element = document.createElement("meta"); 5949 element.setAttribute("name", name); 5950 document.head.appendChild(element); 5951 } 5952 element.setAttribute("content", content); 5953 return element; 5954 } 5955 function findClosestRecursively(element, selector) { 5956 var _a; 5957 if (element instanceof Element) { 5958 return element.closest(selector) || findClosestRecursively(element.assignedSlot || ((_a = element.getRootNode()) === null || _a === void 0 ? void 0 : _a.host), selector); 5959 } 5960 } 5961 var FetchMethod; 5962 (function(FetchMethod2) { 5963 FetchMethod2[FetchMethod2["get"] = 0] = "get"; 5964 FetchMethod2[FetchMethod2["post"] = 1] = "post"; 5965 FetchMethod2[FetchMethod2["put"] = 2] = "put"; 5966 FetchMethod2[FetchMethod2["patch"] = 3] = "patch"; 5967 FetchMethod2[FetchMethod2["delete"] = 4] = "delete"; 5968 })(FetchMethod || (FetchMethod = {})); 5969 function fetchMethodFromString(method) { 5970 switch (method.toLowerCase()) { 5971 case "get": 5972 return FetchMethod.get; 5973 case "post": 5974 return FetchMethod.post; 5975 case "put": 5976 return FetchMethod.put; 5977 case "patch": 5978 return FetchMethod.patch; 5979 case "delete": 5980 return FetchMethod.delete; 5981 } 5982 } 5983 var FetchRequest = class { 5984 constructor(delegate2, method, location2, body = new URLSearchParams(), target = null) { 5985 this.abortController = new AbortController(); 5986 this.resolveRequestPromise = (_value) => { 5987 }; 5988 this.delegate = delegate2; 5989 this.method = method; 5990 this.headers = this.defaultHeaders; 5991 this.body = body; 5992 this.url = location2; 5993 this.target = target; 5994 } 5995 get location() { 5996 return this.url; 5997 } 5998 get params() { 5999 return this.url.searchParams; 6000 } 6001 get entries() { 6002 return this.body ? Array.from(this.body.entries()) : []; 6003 } 6004 cancel() { 6005 this.abortController.abort(); 6006 } 6007 async perform() { 6008 const { fetchOptions } = this; 6009 this.delegate.prepareRequest(this); 6010 await this.allowRequestToBeIntercepted(fetchOptions); 6011 try { 6012 this.delegate.requestStarted(this); 6013 const response = await fetch(this.url.href, fetchOptions); 6014 return await this.receive(response); 6015 } catch (error2) { 6016 if (error2.name !== "AbortError") { 6017 if (this.willDelegateErrorHandling(error2)) { 6018 this.delegate.requestErrored(this, error2); 6019 } 6020 throw error2; 6021 } 6022 } finally { 6023 this.delegate.requestFinished(this); 6024 } 6025 } 6026 async receive(response) { 6027 const fetchResponse = new FetchResponse(response); 6028 const event2 = dispatch("turbo:before-fetch-response", { 6029 cancelable: true, 6030 detail: { fetchResponse }, 6031 target: this.target 6032 }); 6033 if (event2.defaultPrevented) { 6034 this.delegate.requestPreventedHandlingResponse(this, fetchResponse); 6035 } else if (fetchResponse.succeeded) { 6036 this.delegate.requestSucceededWithResponse(this, fetchResponse); 6037 } else { 6038 this.delegate.requestFailedWithResponse(this, fetchResponse); 6039 } 6040 return fetchResponse; 6041 } 6042 get fetchOptions() { 6043 var _a; 6044 return { 6045 method: FetchMethod[this.method].toUpperCase(), 6046 credentials: "same-origin", 6047 headers: this.headers, 6048 redirect: "follow", 6049 body: this.isSafe ? null : this.body, 6050 signal: this.abortSignal, 6051 referrer: (_a = this.delegate.referrer) === null || _a === void 0 ? void 0 : _a.href 6052 }; 6053 } 6054 get defaultHeaders() { 6055 return { 6056 Accept: "text/html, application/xhtml+xml" 6057 }; 6058 } 6059 get isSafe() { 6060 return this.method === FetchMethod.get; 6061 } 6062 get abortSignal() { 6063 return this.abortController.signal; 6064 } 6065 acceptResponseType(mimeType) { 6066 this.headers["Accept"] = [mimeType, this.headers["Accept"]].join(", "); 6067 } 6068 async allowRequestToBeIntercepted(fetchOptions) { 6069 const requestInterception = new Promise((resolve) => this.resolveRequestPromise = resolve); 6070 const event2 = dispatch("turbo:before-fetch-request", { 6071 cancelable: true, 6072 detail: { 6073 fetchOptions, 6074 url: this.url, 6075 resume: this.resolveRequestPromise 6076 }, 6077 target: this.target 6078 }); 6079 if (event2.defaultPrevented) 6080 await requestInterception; 6081 } 6082 willDelegateErrorHandling(error2) { 6083 const event2 = dispatch("turbo:fetch-request-error", { 6084 target: this.target, 6085 cancelable: true, 6086 detail: { request: this, error: error2 } 6087 }); 6088 return !event2.defaultPrevented; 6089 } 6090 }; 6091 var AppearanceObserver = class { 6092 constructor(delegate2, element) { 6093 this.started = false; 6094 this.intersect = (entries) => { 6095 const lastEntry = entries.slice(-1)[0]; 6096 if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) { 6097 this.delegate.elementAppearedInViewport(this.element); 6098 } 6099 }; 6100 this.delegate = delegate2; 6101 this.element = element; 6102 this.intersectionObserver = new IntersectionObserver(this.intersect); 6103 } 6104 start() { 6105 if (!this.started) { 6106 this.started = true; 6107 this.intersectionObserver.observe(this.element); 6108 } 6109 } 6110 stop() { 6111 if (this.started) { 6112 this.started = false; 6113 this.intersectionObserver.unobserve(this.element); 6114 } 6115 } 6116 }; 6117 var StreamMessage = class { 6118 static wrap(message) { 6119 if (typeof message == "string") { 6120 return new this(createDocumentFragment(message)); 6121 } else { 6122 return message; 6123 } 6124 } 6125 constructor(fragment) { 6126 this.fragment = importStreamElements(fragment); 6127 } 6128 }; 6129 StreamMessage.contentType = "text/vnd.turbo-stream.html"; 6130 function importStreamElements(fragment) { 6131 for (const element of fragment.querySelectorAll("turbo-stream")) { 6132 const streamElement = document.importNode(element, true); 6133 for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll("script")) { 6134 inertScriptElement.replaceWith(activateScriptElement(inertScriptElement)); 6135 } 6136 element.replaceWith(streamElement); 6137 } 6138 return fragment; 6139 } 6140 var FormSubmissionState; 6141 (function(FormSubmissionState2) { 6142 FormSubmissionState2[FormSubmissionState2["initialized"] = 0] = "initialized"; 6143 FormSubmissionState2[FormSubmissionState2["requesting"] = 1] = "requesting"; 6144 FormSubmissionState2[FormSubmissionState2["waiting"] = 2] = "waiting"; 6145 FormSubmissionState2[FormSubmissionState2["receiving"] = 3] = "receiving"; 6146 FormSubmissionState2[FormSubmissionState2["stopping"] = 4] = "stopping"; 6147 FormSubmissionState2[FormSubmissionState2["stopped"] = 5] = "stopped"; 6148 })(FormSubmissionState || (FormSubmissionState = {})); 6149 var FormEnctype; 6150 (function(FormEnctype2) { 6151 FormEnctype2["urlEncoded"] = "application/x-www-form-urlencoded"; 6152 FormEnctype2["multipart"] = "multipart/form-data"; 6153 FormEnctype2["plain"] = "text/plain"; 6154 })(FormEnctype || (FormEnctype = {})); 6155 function formEnctypeFromString(encoding) { 6156 switch (encoding.toLowerCase()) { 6157 case FormEnctype.multipart: 6158 return FormEnctype.multipart; 6159 case FormEnctype.plain: 6160 return FormEnctype.plain; 6161 default: 6162 return FormEnctype.urlEncoded; 6163 } 6164 } 6165 var FormSubmission = class { 6166 static confirmMethod(message, _element, _submitter) { 6167 return Promise.resolve(confirm(message)); 6168 } 6169 constructor(delegate2, formElement, submitter, mustRedirect = false) { 6170 this.state = FormSubmissionState.initialized; 6171 this.delegate = delegate2; 6172 this.formElement = formElement; 6173 this.submitter = submitter; 6174 this.formData = buildFormData(formElement, submitter); 6175 this.location = expandURL(this.action); 6176 if (this.method == FetchMethod.get) { 6177 mergeFormDataEntries(this.location, [...this.body.entries()]); 6178 } 6179 this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement); 6180 this.mustRedirect = mustRedirect; 6181 } 6182 get method() { 6183 var _a; 6184 const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute("formmethod")) || this.formElement.getAttribute("method") || ""; 6185 return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get; 6186 } 6187 get action() { 6188 var _a; 6189 const formElementAction = typeof this.formElement.action === "string" ? this.formElement.action : null; 6190 if ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.hasAttribute("formaction")) { 6191 return this.submitter.getAttribute("formaction") || ""; 6192 } else { 6193 return this.formElement.getAttribute("action") || formElementAction || ""; 6194 } 6195 } 6196 get body() { 6197 if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) { 6198 return new URLSearchParams(this.stringFormData); 6199 } else { 6200 return this.formData; 6201 } 6202 } 6203 get enctype() { 6204 var _a; 6205 return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute("formenctype")) || this.formElement.enctype); 6206 } 6207 get isSafe() { 6208 return this.fetchRequest.isSafe; 6209 } 6210 get stringFormData() { 6211 return [...this.formData].reduce((entries, [name, value]) => { 6212 return entries.concat(typeof value == "string" ? [[name, value]] : []); 6213 }, []); 6214 } 6215 async start() { 6216 const { initialized, requesting } = FormSubmissionState; 6217 const confirmationMessage = getAttribute("data-turbo-confirm", this.submitter, this.formElement); 6218 if (typeof confirmationMessage === "string") { 6219 const answer = await FormSubmission.confirmMethod(confirmationMessage, this.formElement, this.submitter); 6220 if (!answer) { 6221 return; 6222 } 6223 } 6224 if (this.state == initialized) { 6225 this.state = requesting; 6226 return this.fetchRequest.perform(); 6227 } 6228 } 6229 stop() { 6230 const { stopping, stopped } = FormSubmissionState; 6231 if (this.state != stopping && this.state != stopped) { 6232 this.state = stopping; 6233 this.fetchRequest.cancel(); 6234 return true; 6235 } 6236 } 6237 prepareRequest(request) { 6238 if (!request.isSafe) { 6239 const token = getCookieValue(getMetaContent("csrf-param")) || getMetaContent("csrf-token"); 6240 if (token) { 6241 request.headers["X-CSRF-Token"] = token; 6242 } 6243 } 6244 if (this.requestAcceptsTurboStreamResponse(request)) { 6245 request.acceptResponseType(StreamMessage.contentType); 6246 } 6247 } 6248 requestStarted(_request) { 6249 var _a; 6250 this.state = FormSubmissionState.waiting; 6251 (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.setAttribute("disabled", ""); 6252 this.setSubmitsWith(); 6253 dispatch("turbo:submit-start", { 6254 target: this.formElement, 6255 detail: { formSubmission: this } 6256 }); 6257 this.delegate.formSubmissionStarted(this); 6258 } 6259 requestPreventedHandlingResponse(request, response) { 6260 this.result = { success: response.succeeded, fetchResponse: response }; 6261 } 6262 requestSucceededWithResponse(request, response) { 6263 if (response.clientError || response.serverError) { 6264 this.delegate.formSubmissionFailedWithResponse(this, response); 6265 } else if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) { 6266 const error2 = new Error("Form responses must redirect to another location"); 6267 this.delegate.formSubmissionErrored(this, error2); 6268 } else { 6269 this.state = FormSubmissionState.receiving; 6270 this.result = { success: true, fetchResponse: response }; 6271 this.delegate.formSubmissionSucceededWithResponse(this, response); 6272 } 6273 } 6274 requestFailedWithResponse(request, response) { 6275 this.result = { success: false, fetchResponse: response }; 6276 this.delegate.formSubmissionFailedWithResponse(this, response); 6277 } 6278 requestErrored(request, error2) { 6279 this.result = { success: false, error: error2 }; 6280 this.delegate.formSubmissionErrored(this, error2); 6281 } 6282 requestFinished(_request) { 6283 var _a; 6284 this.state = FormSubmissionState.stopped; 6285 (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.removeAttribute("disabled"); 6286 this.resetSubmitterText(); 6287 dispatch("turbo:submit-end", { 6288 target: this.formElement, 6289 detail: Object.assign({ formSubmission: this }, this.result) 6290 }); 6291 this.delegate.formSubmissionFinished(this); 6292 } 6293 setSubmitsWith() { 6294 if (!this.submitter || !this.submitsWith) 6295 return; 6296 if (this.submitter.matches("button")) { 6297 this.originalSubmitText = this.submitter.innerHTML; 6298 this.submitter.innerHTML = this.submitsWith; 6299 } else if (this.submitter.matches("input")) { 6300 const input = this.submitter; 6301 this.originalSubmitText = input.value; 6302 input.value = this.submitsWith; 6303 } 6304 } 6305 resetSubmitterText() { 6306 if (!this.submitter || !this.originalSubmitText) 6307 return; 6308 if (this.submitter.matches("button")) { 6309 this.submitter.innerHTML = this.originalSubmitText; 6310 } else if (this.submitter.matches("input")) { 6311 const input = this.submitter; 6312 input.value = this.originalSubmitText; 6313 } 6314 } 6315 requestMustRedirect(request) { 6316 return !request.isSafe && this.mustRedirect; 6317 } 6318 requestAcceptsTurboStreamResponse(request) { 6319 return !request.isSafe || hasAttribute("data-turbo-stream", this.submitter, this.formElement); 6320 } 6321 get submitsWith() { 6322 var _a; 6323 return (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute("data-turbo-submits-with"); 6324 } 6325 }; 6326 function buildFormData(formElement, submitter) { 6327 const formData = new FormData(formElement); 6328 const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("name"); 6329 const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("value"); 6330 if (name) { 6331 formData.append(name, value || ""); 6332 } 6333 return formData; 6334 } 6335 function getCookieValue(cookieName) { 6336 if (cookieName != null) { 6337 const cookies = document.cookie ? document.cookie.split("; ") : []; 6338 const cookie = cookies.find((cookie2) => cookie2.startsWith(cookieName)); 6339 if (cookie) { 6340 const value = cookie.split("=").slice(1).join("="); 6341 return value ? decodeURIComponent(value) : void 0; 6342 } 6343 } 6344 } 6345 function responseSucceededWithoutRedirect(response) { 6346 return response.statusCode == 200 && !response.redirected; 6347 } 6348 function mergeFormDataEntries(url, entries) { 6349 const searchParams = new URLSearchParams(); 6350 for (const [name, value] of entries) { 6351 if (value instanceof File) 6352 continue; 6353 searchParams.append(name, value); 6354 } 6355 url.search = searchParams.toString(); 6356 return url; 6357 } 6358 var Snapshot = class { 6359 constructor(element) { 6360 this.element = element; 6361 } 6362 get activeElement() { 6363 return this.element.ownerDocument.activeElement; 6364 } 6365 get children() { 6366 return [...this.element.children]; 6367 } 6368 hasAnchor(anchor) { 6369 return this.getElementForAnchor(anchor) != null; 6370 } 6371 getElementForAnchor(anchor) { 6372 return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null; 6373 } 6374 get isConnected() { 6375 return this.element.isConnected; 6376 } 6377 get firstAutofocusableElement() { 6378 const inertDisabledOrHidden = "[inert], :disabled, [hidden], details:not([open]), dialog:not([open])"; 6379 for (const element of this.element.querySelectorAll("[autofocus]")) { 6380 if (element.closest(inertDisabledOrHidden) == null) 6381 return element; 6382 else 6383 continue; 6384 } 6385 return null; 6386 } 6387 get permanentElements() { 6388 return queryPermanentElementsAll(this.element); 6389 } 6390 getPermanentElementById(id2) { 6391 return getPermanentElementById(this.element, id2); 6392 } 6393 getPermanentElementMapForSnapshot(snapshot) { 6394 const permanentElementMap = {}; 6395 for (const currentPermanentElement of this.permanentElements) { 6396 const { id: id2 } = currentPermanentElement; 6397 const newPermanentElement = snapshot.getPermanentElementById(id2); 6398 if (newPermanentElement) { 6399 permanentElementMap[id2] = [currentPermanentElement, newPermanentElement]; 6400 } 6401 } 6402 return permanentElementMap; 6403 } 6404 }; 6405 function getPermanentElementById(node, id2) { 6406 return node.querySelector(`#${id2}[data-turbo-permanent]`); 6407 } 6408 function queryPermanentElementsAll(node) { 6409 return node.querySelectorAll("[id][data-turbo-permanent]"); 6410 } 6411 var FormSubmitObserver = class { 6412 constructor(delegate2, eventTarget) { 6413 this.started = false; 6414 this.submitCaptured = () => { 6415 this.eventTarget.removeEventListener("submit", this.submitBubbled, false); 6416 this.eventTarget.addEventListener("submit", this.submitBubbled, false); 6417 }; 6418 this.submitBubbled = (event2) => { 6419 if (!event2.defaultPrevented) { 6420 const form = event2.target instanceof HTMLFormElement ? event2.target : void 0; 6421 const submitter = event2.submitter || void 0; 6422 if (form && submissionDoesNotDismissDialog(form, submitter) && submissionDoesNotTargetIFrame(form, submitter) && this.delegate.willSubmitForm(form, submitter)) { 6423 event2.preventDefault(); 6424 event2.stopImmediatePropagation(); 6425 this.delegate.formSubmitted(form, submitter); 6426 } 6427 } 6428 }; 6429 this.delegate = delegate2; 6430 this.eventTarget = eventTarget; 6431 } 6432 start() { 6433 if (!this.started) { 6434 this.eventTarget.addEventListener("submit", this.submitCaptured, true); 6435 this.started = true; 6436 } 6437 } 6438 stop() { 6439 if (this.started) { 6440 this.eventTarget.removeEventListener("submit", this.submitCaptured, true); 6441 this.started = false; 6442 } 6443 } 6444 }; 6445 function submissionDoesNotDismissDialog(form, submitter) { 6446 const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("formmethod")) || form.getAttribute("method"); 6447 return method != "dialog"; 6448 } 6449 function submissionDoesNotTargetIFrame(form, submitter) { 6450 if ((submitter === null || submitter === void 0 ? void 0 : submitter.hasAttribute("formtarget")) || form.hasAttribute("target")) { 6451 const target = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("formtarget")) || form.target; 6452 for (const element of document.getElementsByName(target)) { 6453 if (element instanceof HTMLIFrameElement) 6454 return false; 6455 } 6456 return true; 6457 } else { 6458 return true; 6459 } 6460 } 6461 var View = class { 6462 constructor(delegate2, element) { 6463 this.resolveRenderPromise = (_value) => { 6464 }; 6465 this.resolveInterceptionPromise = (_value) => { 6466 }; 6467 this.delegate = delegate2; 6468 this.element = element; 6469 } 6470 scrollToAnchor(anchor) { 6471 const element = this.snapshot.getElementForAnchor(anchor); 6472 if (element) { 6473 this.scrollToElement(element); 6474 this.focusElement(element); 6475 } else { 6476 this.scrollToPosition({ x: 0, y: 0 }); 6477 } 6478 } 6479 scrollToAnchorFromLocation(location2) { 6480 this.scrollToAnchor(getAnchor(location2)); 6481 } 6482 scrollToElement(element) { 6483 element.scrollIntoView(); 6484 } 6485 focusElement(element) { 6486 if (element instanceof HTMLElement) { 6487 if (element.hasAttribute("tabindex")) { 6488 element.focus(); 6489 } else { 6490 element.setAttribute("tabindex", "-1"); 6491 element.focus(); 6492 element.removeAttribute("tabindex"); 6493 } 6494 } 6495 } 6496 scrollToPosition({ x: x5, y: y4 }) { 6497 this.scrollRoot.scrollTo(x5, y4); 6498 } 6499 scrollToTop() { 6500 this.scrollToPosition({ x: 0, y: 0 }); 6501 } 6502 get scrollRoot() { 6503 return window; 6504 } 6505 async render(renderer) { 6506 const { isPreview, shouldRender, newSnapshot: snapshot } = renderer; 6507 if (shouldRender) { 6508 try { 6509 this.renderPromise = new Promise((resolve) => this.resolveRenderPromise = resolve); 6510 this.renderer = renderer; 6511 await this.prepareToRenderSnapshot(renderer); 6512 const renderInterception = new Promise((resolve) => this.resolveInterceptionPromise = resolve); 6513 const options = { resume: this.resolveInterceptionPromise, render: this.renderer.renderElement }; 6514 const immediateRender = this.delegate.allowsImmediateRender(snapshot, options); 6515 if (!immediateRender) 6516 await renderInterception; 6517 await this.renderSnapshot(renderer); 6518 this.delegate.viewRenderedSnapshot(snapshot, isPreview); 6519 this.delegate.preloadOnLoadLinksForView(this.element); 6520 this.finishRenderingSnapshot(renderer); 6521 } finally { 6522 delete this.renderer; 6523 this.resolveRenderPromise(void 0); 6524 delete this.renderPromise; 6525 } 6526 } else { 6527 this.invalidate(renderer.reloadReason); 6528 } 6529 } 6530 invalidate(reason) { 6531 this.delegate.viewInvalidated(reason); 6532 } 6533 async prepareToRenderSnapshot(renderer) { 6534 this.markAsPreview(renderer.isPreview); 6535 await renderer.prepareToRender(); 6536 } 6537 markAsPreview(isPreview) { 6538 if (isPreview) { 6539 this.element.setAttribute("data-turbo-preview", ""); 6540 } else { 6541 this.element.removeAttribute("data-turbo-preview"); 6542 } 6543 } 6544 async renderSnapshot(renderer) { 6545 await renderer.render(); 6546 } 6547 finishRenderingSnapshot(renderer) { 6548 renderer.finishRendering(); 6549 } 6550 }; 6551 var FrameView = class extends View { 6552 missing() { 6553 this.element.innerHTML = `<strong class="turbo-frame-error">Content missing</strong>`; 6554 } 6555 get snapshot() { 6556 return new Snapshot(this.element); 6557 } 6558 }; 6559 var LinkInterceptor = class { 6560 constructor(delegate2, element) { 6561 this.clickBubbled = (event2) => { 6562 if (this.respondsToEventTarget(event2.target)) { 6563 this.clickEvent = event2; 6564 } else { 6565 delete this.clickEvent; 6566 } 6567 }; 6568 this.linkClicked = (event2) => { 6569 if (this.clickEvent && this.respondsToEventTarget(event2.target) && event2.target instanceof Element) { 6570 if (this.delegate.shouldInterceptLinkClick(event2.target, event2.detail.url, event2.detail.originalEvent)) { 6571 this.clickEvent.preventDefault(); 6572 event2.preventDefault(); 6573 this.delegate.linkClickIntercepted(event2.target, event2.detail.url, event2.detail.originalEvent); 6574 } 6575 } 6576 delete this.clickEvent; 6577 }; 6578 this.willVisit = (_event) => { 6579 delete this.clickEvent; 6580 }; 6581 this.delegate = delegate2; 6582 this.element = element; 6583 } 6584 start() { 6585 this.element.addEventListener("click", this.clickBubbled); 6586 document.addEventListener("turbo:click", this.linkClicked); 6587 document.addEventListener("turbo:before-visit", this.willVisit); 6588 } 6589 stop() { 6590 this.element.removeEventListener("click", this.clickBubbled); 6591 document.removeEventListener("turbo:click", this.linkClicked); 6592 document.removeEventListener("turbo:before-visit", this.willVisit); 6593 } 6594 respondsToEventTarget(target) { 6595 const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null; 6596 return element && element.closest("turbo-frame, html") == this.element; 6597 } 6598 }; 6599 var LinkClickObserver = class { 6600 constructor(delegate2, eventTarget) { 6601 this.started = false; 6602 this.clickCaptured = () => { 6603 this.eventTarget.removeEventListener("click", this.clickBubbled, false); 6604 this.eventTarget.addEventListener("click", this.clickBubbled, false); 6605 }; 6606 this.clickBubbled = (event2) => { 6607 if (event2 instanceof MouseEvent && this.clickEventIsSignificant(event2)) { 6608 const target = event2.composedPath && event2.composedPath()[0] || event2.target; 6609 const link = this.findLinkFromClickTarget(target); 6610 if (link && doesNotTargetIFrame(link)) { 6611 const location2 = this.getLocationForLink(link); 6612 if (this.delegate.willFollowLinkToLocation(link, location2, event2)) { 6613 event2.preventDefault(); 6614 this.delegate.followedLinkToLocation(link, location2); 6615 } 6616 } 6617 } 6618 }; 6619 this.delegate = delegate2; 6620 this.eventTarget = eventTarget; 6621 } 6622 start() { 6623 if (!this.started) { 6624 this.eventTarget.addEventListener("click", this.clickCaptured, true); 6625 this.started = true; 6626 } 6627 } 6628 stop() { 6629 if (this.started) { 6630 this.eventTarget.removeEventListener("click", this.clickCaptured, true); 6631 this.started = false; 6632 } 6633 } 6634 clickEventIsSignificant(event2) { 6635 return !(event2.target && event2.target.isContentEditable || event2.defaultPrevented || event2.which > 1 || event2.altKey || event2.ctrlKey || event2.metaKey || event2.shiftKey); 6636 } 6637 findLinkFromClickTarget(target) { 6638 return findClosestRecursively(target, "a[href]:not([target^=_]):not([download])"); 6639 } 6640 getLocationForLink(link) { 6641 return expandURL(link.getAttribute("href") || ""); 6642 } 6643 }; 6644 function doesNotTargetIFrame(anchor) { 6645 if (anchor.hasAttribute("target")) { 6646 for (const element of document.getElementsByName(anchor.target)) { 6647 if (element instanceof HTMLIFrameElement) 6648 return false; 6649 } 6650 return true; 6651 } else { 6652 return true; 6653 } 6654 } 6655 var FormLinkClickObserver = class { 6656 constructor(delegate2, element) { 6657 this.delegate = delegate2; 6658 this.linkInterceptor = new LinkClickObserver(this, element); 6659 } 6660 start() { 6661 this.linkInterceptor.start(); 6662 } 6663 stop() { 6664 this.linkInterceptor.stop(); 6665 } 6666 willFollowLinkToLocation(link, location2, originalEvent) { 6667 return this.delegate.willSubmitFormLinkToLocation(link, location2, originalEvent) && link.hasAttribute("data-turbo-method"); 6668 } 6669 followedLinkToLocation(link, location2) { 6670 const form = document.createElement("form"); 6671 const type = "hidden"; 6672 for (const [name, value] of location2.searchParams) { 6673 form.append(Object.assign(document.createElement("input"), { type, name, value })); 6674 } 6675 const action = Object.assign(location2, { search: "" }); 6676 form.setAttribute("data-turbo", "true"); 6677 form.setAttribute("action", action.href); 6678 form.setAttribute("hidden", ""); 6679 const method = link.getAttribute("data-turbo-method"); 6680 if (method) 6681 form.setAttribute("method", method); 6682 const turboFrame = link.getAttribute("data-turbo-frame"); 6683 if (turboFrame) 6684 form.setAttribute("data-turbo-frame", turboFrame); 6685 const turboAction = getVisitAction(link); 6686 if (turboAction) 6687 form.setAttribute("data-turbo-action", turboAction); 6688 const turboConfirm = link.getAttribute("data-turbo-confirm"); 6689 if (turboConfirm) 6690 form.setAttribute("data-turbo-confirm", turboConfirm); 6691 const turboStream = link.hasAttribute("data-turbo-stream"); 6692 if (turboStream) 6693 form.setAttribute("data-turbo-stream", ""); 6694 this.delegate.submittedFormLinkToLocation(link, location2, form); 6695 document.body.appendChild(form); 6696 form.addEventListener("turbo:submit-end", () => form.remove(), { once: true }); 6697 requestAnimationFrame(() => form.requestSubmit()); 6698 } 6699 }; 6700 var Bardo = class { 6701 static async preservingPermanentElements(delegate2, permanentElementMap, callback) { 6702 const bardo = new this(delegate2, permanentElementMap); 6703 bardo.enter(); 6704 await callback(); 6705 bardo.leave(); 6706 } 6707 constructor(delegate2, permanentElementMap) { 6708 this.delegate = delegate2; 6709 this.permanentElementMap = permanentElementMap; 6710 } 6711 enter() { 6712 for (const id2 in this.permanentElementMap) { 6713 const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id2]; 6714 this.delegate.enteringBardo(currentPermanentElement, newPermanentElement); 6715 this.replaceNewPermanentElementWithPlaceholder(newPermanentElement); 6716 } 6717 } 6718 leave() { 6719 for (const id2 in this.permanentElementMap) { 6720 const [currentPermanentElement] = this.permanentElementMap[id2]; 6721 this.replaceCurrentPermanentElementWithClone(currentPermanentElement); 6722 this.replacePlaceholderWithPermanentElement(currentPermanentElement); 6723 this.delegate.leavingBardo(currentPermanentElement); 6724 } 6725 } 6726 replaceNewPermanentElementWithPlaceholder(permanentElement) { 6727 const placeholder = createPlaceholderForPermanentElement(permanentElement); 6728 permanentElement.replaceWith(placeholder); 6729 } 6730 replaceCurrentPermanentElementWithClone(permanentElement) { 6731 const clone = permanentElement.cloneNode(true); 6732 permanentElement.replaceWith(clone); 6733 } 6734 replacePlaceholderWithPermanentElement(permanentElement) { 6735 const placeholder = this.getPlaceholderById(permanentElement.id); 6736 placeholder === null || placeholder === void 0 ? void 0 : placeholder.replaceWith(permanentElement); 6737 } 6738 getPlaceholderById(id2) { 6739 return this.placeholders.find((element) => element.content == id2); 6740 } 6741 get placeholders() { 6742 return [...document.querySelectorAll("meta[name=turbo-permanent-placeholder][content]")]; 6743 } 6744 }; 6745 function createPlaceholderForPermanentElement(permanentElement) { 6746 const element = document.createElement("meta"); 6747 element.setAttribute("name", "turbo-permanent-placeholder"); 6748 element.setAttribute("content", permanentElement.id); 6749 return element; 6750 } 6751 var Renderer = class { 6752 constructor(currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) { 6753 this.activeElement = null; 6754 this.currentSnapshot = currentSnapshot; 6755 this.newSnapshot = newSnapshot; 6756 this.isPreview = isPreview; 6757 this.willRender = willRender; 6758 this.renderElement = renderElement; 6759 this.promise = new Promise((resolve, reject) => this.resolvingFunctions = { resolve, reject }); 6760 } 6761 get shouldRender() { 6762 return true; 6763 } 6764 get reloadReason() { 6765 return; 6766 } 6767 prepareToRender() { 6768 return; 6769 } 6770 finishRendering() { 6771 if (this.resolvingFunctions) { 6772 this.resolvingFunctions.resolve(); 6773 delete this.resolvingFunctions; 6774 } 6775 } 6776 async preservingPermanentElements(callback) { 6777 await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback); 6778 } 6779 focusFirstAutofocusableElement() { 6780 const element = this.connectedSnapshot.firstAutofocusableElement; 6781 if (elementIsFocusable(element)) { 6782 element.focus(); 6783 } 6784 } 6785 enteringBardo(currentPermanentElement) { 6786 if (this.activeElement) 6787 return; 6788 if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) { 6789 this.activeElement = this.currentSnapshot.activeElement; 6790 } 6791 } 6792 leavingBardo(currentPermanentElement) { 6793 if (currentPermanentElement.contains(this.activeElement) && this.activeElement instanceof HTMLElement) { 6794 this.activeElement.focus(); 6795 this.activeElement = null; 6796 } 6797 } 6798 get connectedSnapshot() { 6799 return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot; 6800 } 6801 get currentElement() { 6802 return this.currentSnapshot.element; 6803 } 6804 get newElement() { 6805 return this.newSnapshot.element; 6806 } 6807 get permanentElementMap() { 6808 return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot); 6809 } 6810 }; 6811 function elementIsFocusable(element) { 6812 return element && typeof element.focus == "function"; 6813 } 6814 var FrameRenderer = class extends Renderer { 6815 static renderElement(currentElement, newElement) { 6816 var _a; 6817 const destinationRange = document.createRange(); 6818 destinationRange.selectNodeContents(currentElement); 6819 destinationRange.deleteContents(); 6820 const frameElement = newElement; 6821 const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange(); 6822 if (sourceRange) { 6823 sourceRange.selectNodeContents(frameElement); 6824 currentElement.appendChild(sourceRange.extractContents()); 6825 } 6826 } 6827 constructor(delegate2, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) { 6828 super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender); 6829 this.delegate = delegate2; 6830 } 6831 get shouldRender() { 6832 return true; 6833 } 6834 async render() { 6835 await nextAnimationFrame(); 6836 this.preservingPermanentElements(() => { 6837 this.loadFrameElement(); 6838 }); 6839 this.scrollFrameIntoView(); 6840 await nextAnimationFrame(); 6841 this.focusFirstAutofocusableElement(); 6842 await nextAnimationFrame(); 6843 this.activateScriptElements(); 6844 } 6845 loadFrameElement() { 6846 this.delegate.willRenderFrame(this.currentElement, this.newElement); 6847 this.renderElement(this.currentElement, this.newElement); 6848 } 6849 scrollFrameIntoView() { 6850 if (this.currentElement.autoscroll || this.newElement.autoscroll) { 6851 const element = this.currentElement.firstElementChild; 6852 const block = readScrollLogicalPosition(this.currentElement.getAttribute("data-autoscroll-block"), "end"); 6853 const behavior = readScrollBehavior(this.currentElement.getAttribute("data-autoscroll-behavior"), "auto"); 6854 if (element) { 6855 element.scrollIntoView({ block, behavior }); 6856 return true; 6857 } 6858 } 6859 return false; 6860 } 6861 activateScriptElements() { 6862 for (const inertScriptElement of this.newScriptElements) { 6863 const activatedScriptElement = activateScriptElement(inertScriptElement); 6864 inertScriptElement.replaceWith(activatedScriptElement); 6865 } 6866 } 6867 get newScriptElements() { 6868 return this.currentElement.querySelectorAll("script"); 6869 } 6870 }; 6871 function readScrollLogicalPosition(value, defaultValue) { 6872 if (value == "end" || value == "start" || value == "center" || value == "nearest") { 6873 return value; 6874 } else { 6875 return defaultValue; 6876 } 6877 } 6878 function readScrollBehavior(value, defaultValue) { 6879 if (value == "auto" || value == "smooth") { 6880 return value; 6881 } else { 6882 return defaultValue; 6883 } 6884 } 6885 var ProgressBar = class { 6886 static get defaultCSS() { 6887 return unindent` 6888 .turbo-progress-bar { 6889 position: fixed; 6890 display: block; 6891 top: 0; 6892 left: 0; 6893 height: 3px; 6894 background: #0076ff; 6895 z-index: 2147483647; 6896 transition: 6897 width ${ProgressBar.animationDuration}ms ease-out, 6898 opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in; 6899 transform: translate3d(0, 0, 0); 6900 } 6901 `; 6902 } 6903 constructor() { 6904 this.hiding = false; 6905 this.value = 0; 6906 this.visible = false; 6907 this.trickle = () => { 6908 this.setValue(this.value + Math.random() / 100); 6909 }; 6910 this.stylesheetElement = this.createStylesheetElement(); 6911 this.progressElement = this.createProgressElement(); 6912 this.installStylesheetElement(); 6913 this.setValue(0); 6914 } 6915 show() { 6916 if (!this.visible) { 6917 this.visible = true; 6918 this.installProgressElement(); 6919 this.startTrickling(); 6920 } 6921 } 6922 hide() { 6923 if (this.visible && !this.hiding) { 6924 this.hiding = true; 6925 this.fadeProgressElement(() => { 6926 this.uninstallProgressElement(); 6927 this.stopTrickling(); 6928 this.visible = false; 6929 this.hiding = false; 6930 }); 6931 } 6932 } 6933 setValue(value) { 6934 this.value = value; 6935 this.refresh(); 6936 } 6937 installStylesheetElement() { 6938 document.head.insertBefore(this.stylesheetElement, document.head.firstChild); 6939 } 6940 installProgressElement() { 6941 this.progressElement.style.width = "0"; 6942 this.progressElement.style.opacity = "1"; 6943 document.documentElement.insertBefore(this.progressElement, document.body); 6944 this.refresh(); 6945 } 6946 fadeProgressElement(callback) { 6947 this.progressElement.style.opacity = "0"; 6948 setTimeout(callback, ProgressBar.animationDuration * 1.5); 6949 } 6950 uninstallProgressElement() { 6951 if (this.progressElement.parentNode) { 6952 document.documentElement.removeChild(this.progressElement); 6953 } 6954 } 6955 startTrickling() { 6956 if (!this.trickleInterval) { 6957 this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration); 6958 } 6959 } 6960 stopTrickling() { 6961 window.clearInterval(this.trickleInterval); 6962 delete this.trickleInterval; 6963 } 6964 refresh() { 6965 requestAnimationFrame(() => { 6966 this.progressElement.style.width = `${10 + this.value * 90}%`; 6967 }); 6968 } 6969 createStylesheetElement() { 6970 const element = document.createElement("style"); 6971 element.type = "text/css"; 6972 element.textContent = ProgressBar.defaultCSS; 6973 if (this.cspNonce) { 6974 element.nonce = this.cspNonce; 6975 } 6976 return element; 6977 } 6978 createProgressElement() { 6979 const element = document.createElement("div"); 6980 element.className = "turbo-progress-bar"; 6981 return element; 6982 } 6983 get cspNonce() { 6984 return getMetaContent("csp-nonce"); 6985 } 6986 }; 6987 ProgressBar.animationDuration = 300; 6988 var HeadSnapshot = class extends Snapshot { 6989 constructor() { 6990 super(...arguments); 6991 this.detailsByOuterHTML = this.children.filter((element) => !elementIsNoscript(element)).map((element) => elementWithoutNonce(element)).reduce((result, element) => { 6992 const { outerHTML } = element; 6993 const details = outerHTML in result ? result[outerHTML] : { 6994 type: elementType(element), 6995 tracked: elementIsTracked(element), 6996 elements: [] 6997 }; 6998 return Object.assign(Object.assign({}, result), { [outerHTML]: Object.assign(Object.assign({}, details), { elements: [...details.elements, element] }) }); 6999 }, {}); 7000 } 7001 get trackedElementSignature() { 7002 return Object.keys(this.detailsByOuterHTML).filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked).join(""); 7003 } 7004 getScriptElementsNotInSnapshot(snapshot) { 7005 return this.getElementsMatchingTypeNotInSnapshot("script", snapshot); 7006 } 7007 getStylesheetElementsNotInSnapshot(snapshot) { 7008 return this.getElementsMatchingTypeNotInSnapshot("stylesheet", snapshot); 7009 } 7010 getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) { 7011 return Object.keys(this.detailsByOuterHTML).filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML)).map((outerHTML) => this.detailsByOuterHTML[outerHTML]).filter(({ type }) => type == matchedType).map(({ elements: [element] }) => element); 7012 } 7013 get provisionalElements() { 7014 return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => { 7015 const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML]; 7016 if (type == null && !tracked) { 7017 return [...result, ...elements]; 7018 } else if (elements.length > 1) { 7019 return [...result, ...elements.slice(1)]; 7020 } else { 7021 return result; 7022 } 7023 }, []); 7024 } 7025 getMetaValue(name) { 7026 const element = this.findMetaElementByName(name); 7027 return element ? element.getAttribute("content") : null; 7028 } 7029 findMetaElementByName(name) { 7030 return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => { 7031 const { elements: [element] } = this.detailsByOuterHTML[outerHTML]; 7032 return elementIsMetaElementWithName(element, name) ? element : result; 7033 }, void 0); 7034 } 7035 }; 7036 function elementType(element) { 7037 if (elementIsScript(element)) { 7038 return "script"; 7039 } else if (elementIsStylesheet(element)) { 7040 return "stylesheet"; 7041 } 7042 } 7043 function elementIsTracked(element) { 7044 return element.getAttribute("data-turbo-track") == "reload"; 7045 } 7046 function elementIsScript(element) { 7047 const tagName = element.localName; 7048 return tagName == "script"; 7049 } 7050 function elementIsNoscript(element) { 7051 const tagName = element.localName; 7052 return tagName == "noscript"; 7053 } 7054 function elementIsStylesheet(element) { 7055 const tagName = element.localName; 7056 return tagName == "style" || tagName == "link" && element.getAttribute("rel") == "stylesheet"; 7057 } 7058 function elementIsMetaElementWithName(element, name) { 7059 const tagName = element.localName; 7060 return tagName == "meta" && element.getAttribute("name") == name; 7061 } 7062 function elementWithoutNonce(element) { 7063 if (element.hasAttribute("nonce")) { 7064 element.setAttribute("nonce", ""); 7065 } 7066 return element; 7067 } 7068 var PageSnapshot = class extends Snapshot { 7069 static fromHTMLString(html = "") { 7070 return this.fromDocument(parseHTMLDocument(html)); 7071 } 7072 static fromElement(element) { 7073 return this.fromDocument(element.ownerDocument); 7074 } 7075 static fromDocument({ head, body }) { 7076 return new this(body, new HeadSnapshot(head)); 7077 } 7078 constructor(element, headSnapshot) { 7079 super(element); 7080 this.headSnapshot = headSnapshot; 7081 } 7082 clone() { 7083 const clonedElement = this.element.cloneNode(true); 7084 const selectElements = this.element.querySelectorAll("select"); 7085 const clonedSelectElements = clonedElement.querySelectorAll("select"); 7086 for (const [index4, source] of selectElements.entries()) { 7087 const clone = clonedSelectElements[index4]; 7088 for (const option of clone.selectedOptions) 7089 option.selected = false; 7090 for (const option of source.selectedOptions) 7091 clone.options[option.index].selected = true; 7092 } 7093 for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type="password"]')) { 7094 clonedPasswordInput.value = ""; 7095 } 7096 return new PageSnapshot(clonedElement, this.headSnapshot); 7097 } 7098 get headElement() { 7099 return this.headSnapshot.element; 7100 } 7101 get rootLocation() { 7102 var _a; 7103 const root = (_a = this.getSetting("root")) !== null && _a !== void 0 ? _a : "/"; 7104 return expandURL(root); 7105 } 7106 get cacheControlValue() { 7107 return this.getSetting("cache-control"); 7108 } 7109 get isPreviewable() { 7110 return this.cacheControlValue != "no-preview"; 7111 } 7112 get isCacheable() { 7113 return this.cacheControlValue != "no-cache"; 7114 } 7115 get isVisitable() { 7116 return this.getSetting("visit-control") != "reload"; 7117 } 7118 getSetting(name) { 7119 return this.headSnapshot.getMetaValue(`turbo-${name}`); 7120 } 7121 }; 7122 var TimingMetric; 7123 (function(TimingMetric2) { 7124 TimingMetric2["visitStart"] = "visitStart"; 7125 TimingMetric2["requestStart"] = "requestStart"; 7126 TimingMetric2["requestEnd"] = "requestEnd"; 7127 TimingMetric2["visitEnd"] = "visitEnd"; 7128 })(TimingMetric || (TimingMetric = {})); 7129 var VisitState; 7130 (function(VisitState2) { 7131 VisitState2["initialized"] = "initialized"; 7132 VisitState2["started"] = "started"; 7133 VisitState2["canceled"] = "canceled"; 7134 VisitState2["failed"] = "failed"; 7135 VisitState2["completed"] = "completed"; 7136 })(VisitState || (VisitState = {})); 7137 var defaultOptions = { 7138 action: "advance", 7139 historyChanged: false, 7140 visitCachedSnapshot: () => { 7141 }, 7142 willRender: true, 7143 updateHistory: true, 7144 shouldCacheSnapshot: true, 7145 acceptsStreamResponse: false 7146 }; 7147 var SystemStatusCode; 7148 (function(SystemStatusCode2) { 7149 SystemStatusCode2[SystemStatusCode2["networkFailure"] = 0] = "networkFailure"; 7150 SystemStatusCode2[SystemStatusCode2["timeoutFailure"] = -1] = "timeoutFailure"; 7151 SystemStatusCode2[SystemStatusCode2["contentTypeMismatch"] = -2] = "contentTypeMismatch"; 7152 })(SystemStatusCode || (SystemStatusCode = {})); 7153 var Visit = class { 7154 constructor(delegate2, location2, restorationIdentifier, options = {}) { 7155 this.identifier = uuid(); 7156 this.timingMetrics = {}; 7157 this.followedRedirect = false; 7158 this.historyChanged = false; 7159 this.scrolled = false; 7160 this.shouldCacheSnapshot = true; 7161 this.acceptsStreamResponse = false; 7162 this.snapshotCached = false; 7163 this.state = VisitState.initialized; 7164 this.delegate = delegate2; 7165 this.location = location2; 7166 this.restorationIdentifier = restorationIdentifier || uuid(); 7167 const { action, historyChanged, referrer, snapshot, snapshotHTML, response, visitCachedSnapshot, willRender, updateHistory, shouldCacheSnapshot, acceptsStreamResponse } = Object.assign(Object.assign({}, defaultOptions), options); 7168 this.action = action; 7169 this.historyChanged = historyChanged; 7170 this.referrer = referrer; 7171 this.snapshot = snapshot; 7172 this.snapshotHTML = snapshotHTML; 7173 this.response = response; 7174 this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action); 7175 this.visitCachedSnapshot = visitCachedSnapshot; 7176 this.willRender = willRender; 7177 this.updateHistory = updateHistory; 7178 this.scrolled = !willRender; 7179 this.shouldCacheSnapshot = shouldCacheSnapshot; 7180 this.acceptsStreamResponse = acceptsStreamResponse; 7181 } 7182 get adapter() { 7183 return this.delegate.adapter; 7184 } 7185 get view() { 7186 return this.delegate.view; 7187 } 7188 get history() { 7189 return this.delegate.history; 7190 } 7191 get restorationData() { 7192 return this.history.getRestorationDataForIdentifier(this.restorationIdentifier); 7193 } 7194 get silent() { 7195 return this.isSamePage; 7196 } 7197 start() { 7198 if (this.state == VisitState.initialized) { 7199 this.recordTimingMetric(TimingMetric.visitStart); 7200 this.state = VisitState.started; 7201 this.adapter.visitStarted(this); 7202 this.delegate.visitStarted(this); 7203 } 7204 } 7205 cancel() { 7206 if (this.state == VisitState.started) { 7207 if (this.request) { 7208 this.request.cancel(); 7209 } 7210 this.cancelRender(); 7211 this.state = VisitState.canceled; 7212 } 7213 } 7214 complete() { 7215 if (this.state == VisitState.started) { 7216 this.recordTimingMetric(TimingMetric.visitEnd); 7217 this.state = VisitState.completed; 7218 this.followRedirect(); 7219 if (!this.followedRedirect) { 7220 this.adapter.visitCompleted(this); 7221 this.delegate.visitCompleted(this); 7222 } 7223 } 7224 } 7225 fail() { 7226 if (this.state == VisitState.started) { 7227 this.state = VisitState.failed; 7228 this.adapter.visitFailed(this); 7229 } 7230 } 7231 changeHistory() { 7232 var _a; 7233 if (!this.historyChanged && this.updateHistory) { 7234 const actionForHistory = this.location.href === ((_a = this.referrer) === null || _a === void 0 ? void 0 : _a.href) ? "replace" : this.action; 7235 const method = getHistoryMethodForAction(actionForHistory); 7236 this.history.update(method, this.location, this.restorationIdentifier); 7237 this.historyChanged = true; 7238 } 7239 } 7240 issueRequest() { 7241 if (this.hasPreloadedResponse()) { 7242 this.simulateRequest(); 7243 } else if (this.shouldIssueRequest() && !this.request) { 7244 this.request = new FetchRequest(this, FetchMethod.get, this.location); 7245 this.request.perform(); 7246 } 7247 } 7248 simulateRequest() { 7249 if (this.response) { 7250 this.startRequest(); 7251 this.recordResponse(); 7252 this.finishRequest(); 7253 } 7254 } 7255 startRequest() { 7256 this.recordTimingMetric(TimingMetric.requestStart); 7257 this.adapter.visitRequestStarted(this); 7258 } 7259 recordResponse(response = this.response) { 7260 this.response = response; 7261 if (response) { 7262 const { statusCode } = response; 7263 if (isSuccessful(statusCode)) { 7264 this.adapter.visitRequestCompleted(this); 7265 } else { 7266 this.adapter.visitRequestFailedWithStatusCode(this, statusCode); 7267 } 7268 } 7269 } 7270 finishRequest() { 7271 this.recordTimingMetric(TimingMetric.requestEnd); 7272 this.adapter.visitRequestFinished(this); 7273 } 7274 loadResponse() { 7275 if (this.response) { 7276 const { statusCode, responseHTML } = this.response; 7277 this.render(async () => { 7278 if (this.shouldCacheSnapshot) 7279 this.cacheSnapshot(); 7280 if (this.view.renderPromise) 7281 await this.view.renderPromise; 7282 if (isSuccessful(statusCode) && responseHTML != null) { 7283 await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender, this); 7284 this.performScroll(); 7285 this.adapter.visitRendered(this); 7286 this.complete(); 7287 } else { 7288 await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this); 7289 this.adapter.visitRendered(this); 7290 this.fail(); 7291 } 7292 }); 7293 } 7294 } 7295 getCachedSnapshot() { 7296 const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot(); 7297 if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) { 7298 if (this.action == "restore" || snapshot.isPreviewable) { 7299 return snapshot; 7300 } 7301 } 7302 } 7303 getPreloadedSnapshot() { 7304 if (this.snapshotHTML) { 7305 return PageSnapshot.fromHTMLString(this.snapshotHTML); 7306 } 7307 } 7308 hasCachedSnapshot() { 7309 return this.getCachedSnapshot() != null; 7310 } 7311 loadCachedSnapshot() { 7312 const snapshot = this.getCachedSnapshot(); 7313 if (snapshot) { 7314 const isPreview = this.shouldIssueRequest(); 7315 this.render(async () => { 7316 this.cacheSnapshot(); 7317 if (this.isSamePage) { 7318 this.adapter.visitRendered(this); 7319 } else { 7320 if (this.view.renderPromise) 7321 await this.view.renderPromise; 7322 await this.view.renderPage(snapshot, isPreview, this.willRender, this); 7323 this.performScroll(); 7324 this.adapter.visitRendered(this); 7325 if (!isPreview) { 7326 this.complete(); 7327 } 7328 } 7329 }); 7330 } 7331 } 7332 followRedirect() { 7333 var _a; 7334 if (this.redirectedToLocation && !this.followedRedirect && ((_a = this.response) === null || _a === void 0 ? void 0 : _a.redirected)) { 7335 this.adapter.visitProposedToLocation(this.redirectedToLocation, { 7336 action: "replace", 7337 response: this.response, 7338 shouldCacheSnapshot: false, 7339 willRender: false 7340 }); 7341 this.followedRedirect = true; 7342 } 7343 } 7344 goToSamePageAnchor() { 7345 if (this.isSamePage) { 7346 this.render(async () => { 7347 this.cacheSnapshot(); 7348 this.performScroll(); 7349 this.changeHistory(); 7350 this.adapter.visitRendered(this); 7351 }); 7352 } 7353 } 7354 prepareRequest(request) { 7355 if (this.acceptsStreamResponse) { 7356 request.acceptResponseType(StreamMessage.contentType); 7357 } 7358 } 7359 requestStarted() { 7360 this.startRequest(); 7361 } 7362 requestPreventedHandlingResponse(_request, _response) { 7363 } 7364 async requestSucceededWithResponse(request, response) { 7365 const responseHTML = await response.responseHTML; 7366 const { redirected, statusCode } = response; 7367 if (responseHTML == void 0) { 7368 this.recordResponse({ 7369 statusCode: SystemStatusCode.contentTypeMismatch, 7370 redirected 7371 }); 7372 } else { 7373 this.redirectedToLocation = response.redirected ? response.location : void 0; 7374 this.recordResponse({ statusCode, responseHTML, redirected }); 7375 } 7376 } 7377 async requestFailedWithResponse(request, response) { 7378 const responseHTML = await response.responseHTML; 7379 const { redirected, statusCode } = response; 7380 if (responseHTML == void 0) { 7381 this.recordResponse({ 7382 statusCode: SystemStatusCode.contentTypeMismatch, 7383 redirected 7384 }); 7385 } else { 7386 this.recordResponse({ statusCode, responseHTML, redirected }); 7387 } 7388 } 7389 requestErrored(_request, _error) { 7390 this.recordResponse({ 7391 statusCode: SystemStatusCode.networkFailure, 7392 redirected: false 7393 }); 7394 } 7395 requestFinished() { 7396 this.finishRequest(); 7397 } 7398 performScroll() { 7399 if (!this.scrolled && !this.view.forceReloaded) { 7400 if (this.action == "restore") { 7401 this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop(); 7402 } else { 7403 this.scrollToAnchor() || this.view.scrollToTop(); 7404 } 7405 if (this.isSamePage) { 7406 this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location); 7407 } 7408 this.scrolled = true; 7409 } 7410 } 7411 scrollToRestoredPosition() { 7412 const { scrollPosition } = this.restorationData; 7413 if (scrollPosition) { 7414 this.view.scrollToPosition(scrollPosition); 7415 return true; 7416 } 7417 } 7418 scrollToAnchor() { 7419 const anchor = getAnchor(this.location); 7420 if (anchor != null) { 7421 this.view.scrollToAnchor(anchor); 7422 return true; 7423 } 7424 } 7425 recordTimingMetric(metric) { 7426 this.timingMetrics[metric] = new Date().getTime(); 7427 } 7428 getTimingMetrics() { 7429 return Object.assign({}, this.timingMetrics); 7430 } 7431 getHistoryMethodForAction(action) { 7432 switch (action) { 7433 case "replace": 7434 return history.replaceState; 7435 case "advance": 7436 case "restore": 7437 return history.pushState; 7438 } 7439 } 7440 hasPreloadedResponse() { 7441 return typeof this.response == "object"; 7442 } 7443 shouldIssueRequest() { 7444 if (this.isSamePage) { 7445 return false; 7446 } else if (this.action == "restore") { 7447 return !this.hasCachedSnapshot(); 7448 } else { 7449 return this.willRender; 7450 } 7451 } 7452 cacheSnapshot() { 7453 if (!this.snapshotCached) { 7454 this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot)); 7455 this.snapshotCached = true; 7456 } 7457 } 7458 async render(callback) { 7459 this.cancelRender(); 7460 await new Promise((resolve) => { 7461 this.frame = requestAnimationFrame(() => resolve()); 7462 }); 7463 await callback(); 7464 delete this.frame; 7465 } 7466 cancelRender() { 7467 if (this.frame) { 7468 cancelAnimationFrame(this.frame); 7469 delete this.frame; 7470 } 7471 } 7472 }; 7473 function isSuccessful(statusCode) { 7474 return statusCode >= 200 && statusCode < 300; 7475 } 7476 var BrowserAdapter = class { 7477 constructor(session2) { 7478 this.progressBar = new ProgressBar(); 7479 this.showProgressBar = () => { 7480 this.progressBar.show(); 7481 }; 7482 this.session = session2; 7483 } 7484 visitProposedToLocation(location2, options) { 7485 this.navigator.startVisit(location2, (options === null || options === void 0 ? void 0 : options.restorationIdentifier) || uuid(), options); 7486 } 7487 visitStarted(visit2) { 7488 this.location = visit2.location; 7489 visit2.loadCachedSnapshot(); 7490 visit2.issueRequest(); 7491 visit2.goToSamePageAnchor(); 7492 } 7493 visitRequestStarted(visit2) { 7494 this.progressBar.setValue(0); 7495 if (visit2.hasCachedSnapshot() || visit2.action != "restore") { 7496 this.showVisitProgressBarAfterDelay(); 7497 } else { 7498 this.showProgressBar(); 7499 } 7500 } 7501 visitRequestCompleted(visit2) { 7502 visit2.loadResponse(); 7503 } 7504 visitRequestFailedWithStatusCode(visit2, statusCode) { 7505 switch (statusCode) { 7506 case SystemStatusCode.networkFailure: 7507 case SystemStatusCode.timeoutFailure: 7508 case SystemStatusCode.contentTypeMismatch: 7509 return this.reload({ 7510 reason: "request_failed", 7511 context: { 7512 statusCode 7513 } 7514 }); 7515 default: 7516 return visit2.loadResponse(); 7517 } 7518 } 7519 visitRequestFinished(_visit) { 7520 this.progressBar.setValue(1); 7521 this.hideVisitProgressBar(); 7522 } 7523 visitCompleted(_visit) { 7524 } 7525 pageInvalidated(reason) { 7526 this.reload(reason); 7527 } 7528 visitFailed(_visit) { 7529 } 7530 visitRendered(_visit) { 7531 } 7532 formSubmissionStarted(_formSubmission) { 7533 this.progressBar.setValue(0); 7534 this.showFormProgressBarAfterDelay(); 7535 } 7536 formSubmissionFinished(_formSubmission) { 7537 this.progressBar.setValue(1); 7538 this.hideFormProgressBar(); 7539 } 7540 showVisitProgressBarAfterDelay() { 7541 this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay); 7542 } 7543 hideVisitProgressBar() { 7544 this.progressBar.hide(); 7545 if (this.visitProgressBarTimeout != null) { 7546 window.clearTimeout(this.visitProgressBarTimeout); 7547 delete this.visitProgressBarTimeout; 7548 } 7549 } 7550 showFormProgressBarAfterDelay() { 7551 if (this.formProgressBarTimeout == null) { 7552 this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay); 7553 } 7554 } 7555 hideFormProgressBar() { 7556 this.progressBar.hide(); 7557 if (this.formProgressBarTimeout != null) { 7558 window.clearTimeout(this.formProgressBarTimeout); 7559 delete this.formProgressBarTimeout; 7560 } 7561 } 7562 reload(reason) { 7563 var _a; 7564 dispatch("turbo:reload", { detail: reason }); 7565 window.location.href = ((_a = this.location) === null || _a === void 0 ? void 0 : _a.toString()) || window.location.href; 7566 } 7567 get navigator() { 7568 return this.session.navigator; 7569 } 7570 }; 7571 var CacheObserver = class { 7572 constructor() { 7573 this.selector = "[data-turbo-temporary]"; 7574 this.deprecatedSelector = "[data-turbo-cache=false]"; 7575 this.started = false; 7576 this.removeTemporaryElements = (_event) => { 7577 for (const element of this.temporaryElements) { 7578 element.remove(); 7579 } 7580 }; 7581 } 7582 start() { 7583 if (!this.started) { 7584 this.started = true; 7585 addEventListener("turbo:before-cache", this.removeTemporaryElements, false); 7586 } 7587 } 7588 stop() { 7589 if (this.started) { 7590 this.started = false; 7591 removeEventListener("turbo:before-cache", this.removeTemporaryElements, false); 7592 } 7593 } 7594 get temporaryElements() { 7595 return [...document.querySelectorAll(this.selector), ...this.temporaryElementsWithDeprecation]; 7596 } 7597 get temporaryElementsWithDeprecation() { 7598 const elements = document.querySelectorAll(this.deprecatedSelector); 7599 if (elements.length) { 7600 console.warn(`The ${this.deprecatedSelector} selector is deprecated and will be removed in a future version. Use ${this.selector} instead.`); 7601 } 7602 return [...elements]; 7603 } 7604 }; 7605 var FrameRedirector = class { 7606 constructor(session2, element) { 7607 this.session = session2; 7608 this.element = element; 7609 this.linkInterceptor = new LinkInterceptor(this, element); 7610 this.formSubmitObserver = new FormSubmitObserver(this, element); 7611 } 7612 start() { 7613 this.linkInterceptor.start(); 7614 this.formSubmitObserver.start(); 7615 } 7616 stop() { 7617 this.linkInterceptor.stop(); 7618 this.formSubmitObserver.stop(); 7619 } 7620 shouldInterceptLinkClick(element, _location, _event) { 7621 return this.shouldRedirect(element); 7622 } 7623 linkClickIntercepted(element, url, event2) { 7624 const frame = this.findFrameElement(element); 7625 if (frame) { 7626 frame.delegate.linkClickIntercepted(element, url, event2); 7627 } 7628 } 7629 willSubmitForm(element, submitter) { 7630 return element.closest("turbo-frame") == null && this.shouldSubmit(element, submitter) && this.shouldRedirect(element, submitter); 7631 } 7632 formSubmitted(element, submitter) { 7633 const frame = this.findFrameElement(element, submitter); 7634 if (frame) { 7635 frame.delegate.formSubmitted(element, submitter); 7636 } 7637 } 7638 shouldSubmit(form, submitter) { 7639 var _a; 7640 const action = getAction(form, submitter); 7641 const meta = this.element.ownerDocument.querySelector(`meta[name="turbo-root"]`); 7642 const rootLocation = expandURL((_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : "/"); 7643 return this.shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation); 7644 } 7645 shouldRedirect(element, submitter) { 7646 const isNavigatable = element instanceof HTMLFormElement ? this.session.submissionIsNavigatable(element, submitter) : this.session.elementIsNavigatable(element); 7647 if (isNavigatable) { 7648 const frame = this.findFrameElement(element, submitter); 7649 return frame ? frame != element.closest("turbo-frame") : false; 7650 } else { 7651 return false; 7652 } 7653 } 7654 findFrameElement(element, submitter) { 7655 const id2 = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("data-turbo-frame")) || element.getAttribute("data-turbo-frame"); 7656 if (id2 && id2 != "_top") { 7657 const frame = this.element.querySelector(`#${id2}:not([disabled])`); 7658 if (frame instanceof FrameElement) { 7659 return frame; 7660 } 7661 } 7662 } 7663 }; 7664 var History = class { 7665 constructor(delegate2) { 7666 this.restorationIdentifier = uuid(); 7667 this.restorationData = {}; 7668 this.started = false; 7669 this.pageLoaded = false; 7670 this.onPopState = (event2) => { 7671 if (this.shouldHandlePopState()) { 7672 const { turbo } = event2.state || {}; 7673 if (turbo) { 7674 this.location = new URL(window.location.href); 7675 const { restorationIdentifier } = turbo; 7676 this.restorationIdentifier = restorationIdentifier; 7677 this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location, restorationIdentifier); 7678 } 7679 } 7680 }; 7681 this.onPageLoad = async (_event) => { 7682 await nextMicrotask(); 7683 this.pageLoaded = true; 7684 }; 7685 this.delegate = delegate2; 7686 } 7687 start() { 7688 if (!this.started) { 7689 addEventListener("popstate", this.onPopState, false); 7690 addEventListener("load", this.onPageLoad, false); 7691 this.started = true; 7692 this.replace(new URL(window.location.href)); 7693 } 7694 } 7695 stop() { 7696 if (this.started) { 7697 removeEventListener("popstate", this.onPopState, false); 7698 removeEventListener("load", this.onPageLoad, false); 7699 this.started = false; 7700 } 7701 } 7702 push(location2, restorationIdentifier) { 7703 this.update(history.pushState, location2, restorationIdentifier); 7704 } 7705 replace(location2, restorationIdentifier) { 7706 this.update(history.replaceState, location2, restorationIdentifier); 7707 } 7708 update(method, location2, restorationIdentifier = uuid()) { 7709 const state = { turbo: { restorationIdentifier } }; 7710 method.call(history, state, "", location2.href); 7711 this.location = location2; 7712 this.restorationIdentifier = restorationIdentifier; 7713 } 7714 getRestorationDataForIdentifier(restorationIdentifier) { 7715 return this.restorationData[restorationIdentifier] || {}; 7716 } 7717 updateRestorationData(additionalData) { 7718 const { restorationIdentifier } = this; 7719 const restorationData = this.restorationData[restorationIdentifier]; 7720 this.restorationData[restorationIdentifier] = Object.assign(Object.assign({}, restorationData), additionalData); 7721 } 7722 assumeControlOfScrollRestoration() { 7723 var _a; 7724 if (!this.previousScrollRestoration) { 7725 this.previousScrollRestoration = (_a = history.scrollRestoration) !== null && _a !== void 0 ? _a : "auto"; 7726 history.scrollRestoration = "manual"; 7727 } 7728 } 7729 relinquishControlOfScrollRestoration() { 7730 if (this.previousScrollRestoration) { 7731 history.scrollRestoration = this.previousScrollRestoration; 7732 delete this.previousScrollRestoration; 7733 } 7734 } 7735 shouldHandlePopState() { 7736 return this.pageIsLoaded(); 7737 } 7738 pageIsLoaded() { 7739 return this.pageLoaded || document.readyState == "complete"; 7740 } 7741 }; 7742 var Navigator = class { 7743 constructor(delegate2) { 7744 this.delegate = delegate2; 7745 } 7746 proposeVisit(location2, options = {}) { 7747 if (this.delegate.allowsVisitingLocationWithAction(location2, options.action)) { 7748 if (locationIsVisitable(location2, this.view.snapshot.rootLocation)) { 7749 this.delegate.visitProposedToLocation(location2, options); 7750 } else { 7751 window.location.href = location2.toString(); 7752 } 7753 } 7754 } 7755 startVisit(locatable, restorationIdentifier, options = {}) { 7756 this.stop(); 7757 this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, Object.assign({ referrer: this.location }, options)); 7758 this.currentVisit.start(); 7759 } 7760 submitForm(form, submitter) { 7761 this.stop(); 7762 this.formSubmission = new FormSubmission(this, form, submitter, true); 7763 this.formSubmission.start(); 7764 } 7765 stop() { 7766 if (this.formSubmission) { 7767 this.formSubmission.stop(); 7768 delete this.formSubmission; 7769 } 7770 if (this.currentVisit) { 7771 this.currentVisit.cancel(); 7772 delete this.currentVisit; 7773 } 7774 } 7775 get adapter() { 7776 return this.delegate.adapter; 7777 } 7778 get view() { 7779 return this.delegate.view; 7780 } 7781 get history() { 7782 return this.delegate.history; 7783 } 7784 formSubmissionStarted(formSubmission) { 7785 if (typeof this.adapter.formSubmissionStarted === "function") { 7786 this.adapter.formSubmissionStarted(formSubmission); 7787 } 7788 } 7789 async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) { 7790 if (formSubmission == this.formSubmission) { 7791 const responseHTML = await fetchResponse.responseHTML; 7792 if (responseHTML) { 7793 const shouldCacheSnapshot = formSubmission.isSafe; 7794 if (!shouldCacheSnapshot) { 7795 this.view.clearSnapshotCache(); 7796 } 7797 const { statusCode, redirected } = fetchResponse; 7798 const action = this.getActionForFormSubmission(formSubmission); 7799 const visitOptions = { 7800 action, 7801 shouldCacheSnapshot, 7802 response: { statusCode, responseHTML, redirected } 7803 }; 7804 this.proposeVisit(fetchResponse.location, visitOptions); 7805 } 7806 } 7807 } 7808 async formSubmissionFailedWithResponse(formSubmission, fetchResponse) { 7809 const responseHTML = await fetchResponse.responseHTML; 7810 if (responseHTML) { 7811 const snapshot = PageSnapshot.fromHTMLString(responseHTML); 7812 if (fetchResponse.serverError) { 7813 await this.view.renderError(snapshot, this.currentVisit); 7814 } else { 7815 await this.view.renderPage(snapshot, false, true, this.currentVisit); 7816 } 7817 this.view.scrollToTop(); 7818 this.view.clearSnapshotCache(); 7819 } 7820 } 7821 formSubmissionErrored(formSubmission, error2) { 7822 console.error(error2); 7823 } 7824 formSubmissionFinished(formSubmission) { 7825 if (typeof this.adapter.formSubmissionFinished === "function") { 7826 this.adapter.formSubmissionFinished(formSubmission); 7827 } 7828 } 7829 visitStarted(visit2) { 7830 this.delegate.visitStarted(visit2); 7831 } 7832 visitCompleted(visit2) { 7833 this.delegate.visitCompleted(visit2); 7834 } 7835 locationWithActionIsSamePage(location2, action) { 7836 const anchor = getAnchor(location2); 7837 const currentAnchor = getAnchor(this.view.lastRenderedLocation); 7838 const isRestorationToTop = action === "restore" && typeof anchor === "undefined"; 7839 return action !== "replace" && getRequestURL(location2) === getRequestURL(this.view.lastRenderedLocation) && (isRestorationToTop || anchor != null && anchor !== currentAnchor); 7840 } 7841 visitScrolledToSamePageLocation(oldURL, newURL) { 7842 this.delegate.visitScrolledToSamePageLocation(oldURL, newURL); 7843 } 7844 get location() { 7845 return this.history.location; 7846 } 7847 get restorationIdentifier() { 7848 return this.history.restorationIdentifier; 7849 } 7850 getActionForFormSubmission({ submitter, formElement }) { 7851 return getVisitAction(submitter, formElement) || "advance"; 7852 } 7853 }; 7854 var PageStage; 7855 (function(PageStage2) { 7856 PageStage2[PageStage2["initial"] = 0] = "initial"; 7857 PageStage2[PageStage2["loading"] = 1] = "loading"; 7858 PageStage2[PageStage2["interactive"] = 2] = "interactive"; 7859 PageStage2[PageStage2["complete"] = 3] = "complete"; 7860 })(PageStage || (PageStage = {})); 7861 var PageObserver = class { 7862 constructor(delegate2) { 7863 this.stage = PageStage.initial; 7864 this.started = false; 7865 this.interpretReadyState = () => { 7866 const { readyState } = this; 7867 if (readyState == "interactive") { 7868 this.pageIsInteractive(); 7869 } else if (readyState == "complete") { 7870 this.pageIsComplete(); 7871 } 7872 }; 7873 this.pageWillUnload = () => { 7874 this.delegate.pageWillUnload(); 7875 }; 7876 this.delegate = delegate2; 7877 } 7878 start() { 7879 if (!this.started) { 7880 if (this.stage == PageStage.initial) { 7881 this.stage = PageStage.loading; 7882 } 7883 document.addEventListener("readystatechange", this.interpretReadyState, false); 7884 addEventListener("pagehide", this.pageWillUnload, false); 7885 this.started = true; 7886 } 7887 } 7888 stop() { 7889 if (this.started) { 7890 document.removeEventListener("readystatechange", this.interpretReadyState, false); 7891 removeEventListener("pagehide", this.pageWillUnload, false); 7892 this.started = false; 7893 } 7894 } 7895 pageIsInteractive() { 7896 if (this.stage == PageStage.loading) { 7897 this.stage = PageStage.interactive; 7898 this.delegate.pageBecameInteractive(); 7899 } 7900 } 7901 pageIsComplete() { 7902 this.pageIsInteractive(); 7903 if (this.stage == PageStage.interactive) { 7904 this.stage = PageStage.complete; 7905 this.delegate.pageLoaded(); 7906 } 7907 } 7908 get readyState() { 7909 return document.readyState; 7910 } 7911 }; 7912 var ScrollObserver = class { 7913 constructor(delegate2) { 7914 this.started = false; 7915 this.onScroll = () => { 7916 this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset }); 7917 }; 7918 this.delegate = delegate2; 7919 } 7920 start() { 7921 if (!this.started) { 7922 addEventListener("scroll", this.onScroll, false); 7923 this.onScroll(); 7924 this.started = true; 7925 } 7926 } 7927 stop() { 7928 if (this.started) { 7929 removeEventListener("scroll", this.onScroll, false); 7930 this.started = false; 7931 } 7932 } 7933 updatePosition(position) { 7934 this.delegate.scrollPositionChanged(position); 7935 } 7936 }; 7937 var StreamMessageRenderer = class { 7938 render({ fragment }) { 7939 Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => document.documentElement.appendChild(fragment)); 7940 } 7941 enteringBardo(currentPermanentElement, newPermanentElement) { 7942 newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true)); 7943 } 7944 leavingBardo() { 7945 } 7946 }; 7947 function getPermanentElementMapForFragment(fragment) { 7948 const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement); 7949 const permanentElementMap = {}; 7950 for (const permanentElementInDocument of permanentElementsInDocument) { 7951 const { id: id2 } = permanentElementInDocument; 7952 for (const streamElement of fragment.querySelectorAll("turbo-stream")) { 7953 const elementInStream = getPermanentElementById(streamElement.templateElement.content, id2); 7954 if (elementInStream) { 7955 permanentElementMap[id2] = [permanentElementInDocument, elementInStream]; 7956 } 7957 } 7958 } 7959 return permanentElementMap; 7960 } 7961 var StreamObserver = class { 7962 constructor(delegate2) { 7963 this.sources = /* @__PURE__ */ new Set(); 7964 this.started = false; 7965 this.inspectFetchResponse = (event2) => { 7966 const response = fetchResponseFromEvent(event2); 7967 if (response && fetchResponseIsStream(response)) { 7968 event2.preventDefault(); 7969 this.receiveMessageResponse(response); 7970 } 7971 }; 7972 this.receiveMessageEvent = (event2) => { 7973 if (this.started && typeof event2.data == "string") { 7974 this.receiveMessageHTML(event2.data); 7975 } 7976 }; 7977 this.delegate = delegate2; 7978 } 7979 start() { 7980 if (!this.started) { 7981 this.started = true; 7982 addEventListener("turbo:before-fetch-response", this.inspectFetchResponse, false); 7983 } 7984 } 7985 stop() { 7986 if (this.started) { 7987 this.started = false; 7988 removeEventListener("turbo:before-fetch-response", this.inspectFetchResponse, false); 7989 } 7990 } 7991 connectStreamSource(source) { 7992 if (!this.streamSourceIsConnected(source)) { 7993 this.sources.add(source); 7994 source.addEventListener("message", this.receiveMessageEvent, false); 7995 } 7996 } 7997 disconnectStreamSource(source) { 7998 if (this.streamSourceIsConnected(source)) { 7999 this.sources.delete(source); 8000 source.removeEventListener("message", this.receiveMessageEvent, false); 8001 } 8002 } 8003 streamSourceIsConnected(source) { 8004 return this.sources.has(source); 8005 } 8006 async receiveMessageResponse(response) { 8007 const html = await response.responseHTML; 8008 if (html) { 8009 this.receiveMessageHTML(html); 8010 } 8011 } 8012 receiveMessageHTML(html) { 8013 this.delegate.receivedMessageFromStream(StreamMessage.wrap(html)); 8014 } 8015 }; 8016 function fetchResponseFromEvent(event2) { 8017 var _a; 8018 const fetchResponse = (_a = event2.detail) === null || _a === void 0 ? void 0 : _a.fetchResponse; 8019 if (fetchResponse instanceof FetchResponse) { 8020 return fetchResponse; 8021 } 8022 } 8023 function fetchResponseIsStream(response) { 8024 var _a; 8025 const contentType = (_a = response.contentType) !== null && _a !== void 0 ? _a : ""; 8026 return contentType.startsWith(StreamMessage.contentType); 8027 } 8028 var ErrorRenderer = class extends Renderer { 8029 static renderElement(currentElement, newElement) { 8030 const { documentElement, body } = document; 8031 documentElement.replaceChild(newElement, body); 8032 } 8033 async render() { 8034 this.replaceHeadAndBody(); 8035 this.activateScriptElements(); 8036 } 8037 replaceHeadAndBody() { 8038 const { documentElement, head } = document; 8039 documentElement.replaceChild(this.newHead, head); 8040 this.renderElement(this.currentElement, this.newElement); 8041 } 8042 activateScriptElements() { 8043 for (const replaceableElement of this.scriptElements) { 8044 const parentNode = replaceableElement.parentNode; 8045 if (parentNode) { 8046 const element = activateScriptElement(replaceableElement); 8047 parentNode.replaceChild(element, replaceableElement); 8048 } 8049 } 8050 } 8051 get newHead() { 8052 return this.newSnapshot.headSnapshot.element; 8053 } 8054 get scriptElements() { 8055 return document.documentElement.querySelectorAll("script"); 8056 } 8057 }; 8058 var PageRenderer = class extends Renderer { 8059 static renderElement(currentElement, newElement) { 8060 if (document.body && newElement instanceof HTMLBodyElement) { 8061 document.body.replaceWith(newElement); 8062 } else { 8063 document.documentElement.appendChild(newElement); 8064 } 8065 } 8066 get shouldRender() { 8067 return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical; 8068 } 8069 get reloadReason() { 8070 if (!this.newSnapshot.isVisitable) { 8071 return { 8072 reason: "turbo_visit_control_is_reload" 8073 }; 8074 } 8075 if (!this.trackedElementsAreIdentical) { 8076 return { 8077 reason: "tracked_element_mismatch" 8078 }; 8079 } 8080 } 8081 async prepareToRender() { 8082 await this.mergeHead(); 8083 } 8084 async render() { 8085 if (this.willRender) { 8086 await this.replaceBody(); 8087 } 8088 } 8089 finishRendering() { 8090 super.finishRendering(); 8091 if (!this.isPreview) { 8092 this.focusFirstAutofocusableElement(); 8093 } 8094 } 8095 get currentHeadSnapshot() { 8096 return this.currentSnapshot.headSnapshot; 8097 } 8098 get newHeadSnapshot() { 8099 return this.newSnapshot.headSnapshot; 8100 } 8101 get newElement() { 8102 return this.newSnapshot.element; 8103 } 8104 async mergeHead() { 8105 const mergedHeadElements = this.mergeProvisionalElements(); 8106 const newStylesheetElements = this.copyNewHeadStylesheetElements(); 8107 this.copyNewHeadScriptElements(); 8108 await mergedHeadElements; 8109 await newStylesheetElements; 8110 } 8111 async replaceBody() { 8112 await this.preservingPermanentElements(async () => { 8113 this.activateNewBody(); 8114 await this.assignNewBody(); 8115 }); 8116 } 8117 get trackedElementsAreIdentical() { 8118 return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature; 8119 } 8120 async copyNewHeadStylesheetElements() { 8121 const loadingElements = []; 8122 for (const element of this.newHeadStylesheetElements) { 8123 loadingElements.push(waitForLoad(element)); 8124 document.head.appendChild(element); 8125 } 8126 await Promise.all(loadingElements); 8127 } 8128 copyNewHeadScriptElements() { 8129 for (const element of this.newHeadScriptElements) { 8130 document.head.appendChild(activateScriptElement(element)); 8131 } 8132 } 8133 async mergeProvisionalElements() { 8134 const newHeadElements = [...this.newHeadProvisionalElements]; 8135 for (const element of this.currentHeadProvisionalElements) { 8136 if (!this.isCurrentElementInElementList(element, newHeadElements)) { 8137 document.head.removeChild(element); 8138 } 8139 } 8140 for (const element of newHeadElements) { 8141 document.head.appendChild(element); 8142 } 8143 } 8144 isCurrentElementInElementList(element, elementList) { 8145 for (const [index4, newElement] of elementList.entries()) { 8146 if (element.tagName == "TITLE") { 8147 if (newElement.tagName != "TITLE") { 8148 continue; 8149 } 8150 if (element.innerHTML == newElement.innerHTML) { 8151 elementList.splice(index4, 1); 8152 return true; 8153 } 8154 } 8155 if (newElement.isEqualNode(element)) { 8156 elementList.splice(index4, 1); 8157 return true; 8158 } 8159 } 8160 return false; 8161 } 8162 removeCurrentHeadProvisionalElements() { 8163 for (const element of this.currentHeadProvisionalElements) { 8164 document.head.removeChild(element); 8165 } 8166 } 8167 copyNewHeadProvisionalElements() { 8168 for (const element of this.newHeadProvisionalElements) { 8169 document.head.appendChild(element); 8170 } 8171 } 8172 activateNewBody() { 8173 document.adoptNode(this.newElement); 8174 this.activateNewBodyScriptElements(); 8175 } 8176 activateNewBodyScriptElements() { 8177 for (const inertScriptElement of this.newBodyScriptElements) { 8178 const activatedScriptElement = activateScriptElement(inertScriptElement); 8179 inertScriptElement.replaceWith(activatedScriptElement); 8180 } 8181 } 8182 async assignNewBody() { 8183 await this.renderElement(this.currentElement, this.newElement); 8184 } 8185 get newHeadStylesheetElements() { 8186 return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot); 8187 } 8188 get newHeadScriptElements() { 8189 return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot); 8190 } 8191 get currentHeadProvisionalElements() { 8192 return this.currentHeadSnapshot.provisionalElements; 8193 } 8194 get newHeadProvisionalElements() { 8195 return this.newHeadSnapshot.provisionalElements; 8196 } 8197 get newBodyScriptElements() { 8198 return this.newElement.querySelectorAll("script"); 8199 } 8200 }; 8201 var SnapshotCache = class { 8202 constructor(size) { 8203 this.keys = []; 8204 this.snapshots = {}; 8205 this.size = size; 8206 } 8207 has(location2) { 8208 return toCacheKey(location2) in this.snapshots; 8209 } 8210 get(location2) { 8211 if (this.has(location2)) { 8212 const snapshot = this.read(location2); 8213 this.touch(location2); 8214 return snapshot; 8215 } 8216 } 8217 put(location2, snapshot) { 8218 this.write(location2, snapshot); 8219 this.touch(location2); 8220 return snapshot; 8221 } 8222 clear() { 8223 this.snapshots = {}; 8224 } 8225 read(location2) { 8226 return this.snapshots[toCacheKey(location2)]; 8227 } 8228 write(location2, snapshot) { 8229 this.snapshots[toCacheKey(location2)] = snapshot; 8230 } 8231 touch(location2) { 8232 const key = toCacheKey(location2); 8233 const index4 = this.keys.indexOf(key); 8234 if (index4 > -1) 8235 this.keys.splice(index4, 1); 8236 this.keys.unshift(key); 8237 this.trim(); 8238 } 8239 trim() { 8240 for (const key of this.keys.splice(this.size)) { 8241 delete this.snapshots[key]; 8242 } 8243 } 8244 }; 8245 var PageView = class extends View { 8246 constructor() { 8247 super(...arguments); 8248 this.snapshotCache = new SnapshotCache(10); 8249 this.lastRenderedLocation = new URL(location.href); 8250 this.forceReloaded = false; 8251 } 8252 renderPage(snapshot, isPreview = false, willRender = true, visit2) { 8253 const renderer = new PageRenderer(this.snapshot, snapshot, PageRenderer.renderElement, isPreview, willRender); 8254 if (!renderer.shouldRender) { 8255 this.forceReloaded = true; 8256 } else { 8257 visit2 === null || visit2 === void 0 ? void 0 : visit2.changeHistory(); 8258 } 8259 return this.render(renderer); 8260 } 8261 renderError(snapshot, visit2) { 8262 visit2 === null || visit2 === void 0 ? void 0 : visit2.changeHistory(); 8263 const renderer = new ErrorRenderer(this.snapshot, snapshot, ErrorRenderer.renderElement, false); 8264 return this.render(renderer); 8265 } 8266 clearSnapshotCache() { 8267 this.snapshotCache.clear(); 8268 } 8269 async cacheSnapshot(snapshot = this.snapshot) { 8270 if (snapshot.isCacheable) { 8271 this.delegate.viewWillCacheSnapshot(); 8272 const { lastRenderedLocation: location2 } = this; 8273 await nextEventLoopTick(); 8274 const cachedSnapshot = snapshot.clone(); 8275 this.snapshotCache.put(location2, cachedSnapshot); 8276 return cachedSnapshot; 8277 } 8278 } 8279 getCachedSnapshotForLocation(location2) { 8280 return this.snapshotCache.get(location2); 8281 } 8282 get snapshot() { 8283 return PageSnapshot.fromElement(this.element); 8284 } 8285 }; 8286 var Preloader = class { 8287 constructor(delegate2) { 8288 this.selector = "a[data-turbo-preload]"; 8289 this.delegate = delegate2; 8290 } 8291 get snapshotCache() { 8292 return this.delegate.navigator.view.snapshotCache; 8293 } 8294 start() { 8295 if (document.readyState === "loading") { 8296 return document.addEventListener("DOMContentLoaded", () => { 8297 this.preloadOnLoadLinksForView(document.body); 8298 }); 8299 } else { 8300 this.preloadOnLoadLinksForView(document.body); 8301 } 8302 } 8303 preloadOnLoadLinksForView(element) { 8304 for (const link of element.querySelectorAll(this.selector)) { 8305 this.preloadURL(link); 8306 } 8307 } 8308 async preloadURL(link) { 8309 const location2 = new URL(link.href); 8310 if (this.snapshotCache.has(location2)) { 8311 return; 8312 } 8313 try { 8314 const response = await fetch(location2.toString(), { headers: { "VND.PREFETCH": "true", Accept: "text/html" } }); 8315 const responseText = await response.text(); 8316 const snapshot = PageSnapshot.fromHTMLString(responseText); 8317 this.snapshotCache.put(location2, snapshot); 8318 } catch (_4) { 8319 } 8320 } 8321 }; 8322 var Session = class { 8323 constructor() { 8324 this.navigator = new Navigator(this); 8325 this.history = new History(this); 8326 this.preloader = new Preloader(this); 8327 this.view = new PageView(this, document.documentElement); 8328 this.adapter = new BrowserAdapter(this); 8329 this.pageObserver = new PageObserver(this); 8330 this.cacheObserver = new CacheObserver(); 8331 this.linkClickObserver = new LinkClickObserver(this, window); 8332 this.formSubmitObserver = new FormSubmitObserver(this, document); 8333 this.scrollObserver = new ScrollObserver(this); 8334 this.streamObserver = new StreamObserver(this); 8335 this.formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement); 8336 this.frameRedirector = new FrameRedirector(this, document.documentElement); 8337 this.streamMessageRenderer = new StreamMessageRenderer(); 8338 this.drive = true; 8339 this.enabled = true; 8340 this.progressBarDelay = 500; 8341 this.started = false; 8342 this.formMode = "on"; 8343 } 8344 start() { 8345 if (!this.started) { 8346 this.pageObserver.start(); 8347 this.cacheObserver.start(); 8348 this.formLinkClickObserver.start(); 8349 this.linkClickObserver.start(); 8350 this.formSubmitObserver.start(); 8351 this.scrollObserver.start(); 8352 this.streamObserver.start(); 8353 this.frameRedirector.start(); 8354 this.history.start(); 8355 this.preloader.start(); 8356 this.started = true; 8357 this.enabled = true; 8358 } 8359 } 8360 disable() { 8361 this.enabled = false; 8362 } 8363 stop() { 8364 if (this.started) { 8365 this.pageObserver.stop(); 8366 this.cacheObserver.stop(); 8367 this.formLinkClickObserver.stop(); 8368 this.linkClickObserver.stop(); 8369 this.formSubmitObserver.stop(); 8370 this.scrollObserver.stop(); 8371 this.streamObserver.stop(); 8372 this.frameRedirector.stop(); 8373 this.history.stop(); 8374 this.started = false; 8375 } 8376 } 8377 registerAdapter(adapter) { 8378 this.adapter = adapter; 8379 } 8380 visit(location2, options = {}) { 8381 const frameElement = options.frame ? document.getElementById(options.frame) : null; 8382 if (frameElement instanceof FrameElement) { 8383 frameElement.src = location2.toString(); 8384 frameElement.loaded; 8385 } else { 8386 this.navigator.proposeVisit(expandURL(location2), options); 8387 } 8388 } 8389 connectStreamSource(source) { 8390 this.streamObserver.connectStreamSource(source); 8391 } 8392 disconnectStreamSource(source) { 8393 this.streamObserver.disconnectStreamSource(source); 8394 } 8395 renderStreamMessage(message) { 8396 this.streamMessageRenderer.render(StreamMessage.wrap(message)); 8397 } 8398 clearCache() { 8399 this.view.clearSnapshotCache(); 8400 } 8401 setProgressBarDelay(delay) { 8402 this.progressBarDelay = delay; 8403 } 8404 setFormMode(mode) { 8405 this.formMode = mode; 8406 } 8407 get location() { 8408 return this.history.location; 8409 } 8410 get restorationIdentifier() { 8411 return this.history.restorationIdentifier; 8412 } 8413 historyPoppedToLocationWithRestorationIdentifier(location2, restorationIdentifier) { 8414 if (this.enabled) { 8415 this.navigator.startVisit(location2, restorationIdentifier, { 8416 action: "restore", 8417 historyChanged: true 8418 }); 8419 } else { 8420 this.adapter.pageInvalidated({ 8421 reason: "turbo_disabled" 8422 }); 8423 } 8424 } 8425 scrollPositionChanged(position) { 8426 this.history.updateRestorationData({ scrollPosition: position }); 8427 } 8428 willSubmitFormLinkToLocation(link, location2) { 8429 return this.elementIsNavigatable(link) && locationIsVisitable(location2, this.snapshot.rootLocation); 8430 } 8431 submittedFormLinkToLocation() { 8432 } 8433 willFollowLinkToLocation(link, location2, event2) { 8434 return this.elementIsNavigatable(link) && locationIsVisitable(location2, this.snapshot.rootLocation) && this.applicationAllowsFollowingLinkToLocation(link, location2, event2); 8435 } 8436 followedLinkToLocation(link, location2) { 8437 const action = this.getActionForLink(link); 8438 const acceptsStreamResponse = link.hasAttribute("data-turbo-stream"); 8439 this.visit(location2.href, { action, acceptsStreamResponse }); 8440 } 8441 allowsVisitingLocationWithAction(location2, action) { 8442 return this.locationWithActionIsSamePage(location2, action) || this.applicationAllowsVisitingLocation(location2); 8443 } 8444 visitProposedToLocation(location2, options) { 8445 extendURLWithDeprecatedProperties(location2); 8446 this.adapter.visitProposedToLocation(location2, options); 8447 } 8448 visitStarted(visit2) { 8449 if (!visit2.acceptsStreamResponse) { 8450 markAsBusy(document.documentElement); 8451 } 8452 extendURLWithDeprecatedProperties(visit2.location); 8453 if (!visit2.silent) { 8454 this.notifyApplicationAfterVisitingLocation(visit2.location, visit2.action); 8455 } 8456 } 8457 visitCompleted(visit2) { 8458 clearBusyState(document.documentElement); 8459 this.notifyApplicationAfterPageLoad(visit2.getTimingMetrics()); 8460 } 8461 locationWithActionIsSamePage(location2, action) { 8462 return this.navigator.locationWithActionIsSamePage(location2, action); 8463 } 8464 visitScrolledToSamePageLocation(oldURL, newURL) { 8465 this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL); 8466 } 8467 willSubmitForm(form, submitter) { 8468 const action = getAction(form, submitter); 8469 return this.submissionIsNavigatable(form, submitter) && locationIsVisitable(expandURL(action), this.snapshot.rootLocation); 8470 } 8471 formSubmitted(form, submitter) { 8472 this.navigator.submitForm(form, submitter); 8473 } 8474 pageBecameInteractive() { 8475 this.view.lastRenderedLocation = this.location; 8476 this.notifyApplicationAfterPageLoad(); 8477 } 8478 pageLoaded() { 8479 this.history.assumeControlOfScrollRestoration(); 8480 } 8481 pageWillUnload() { 8482 this.history.relinquishControlOfScrollRestoration(); 8483 } 8484 receivedMessageFromStream(message) { 8485 this.renderStreamMessage(message); 8486 } 8487 viewWillCacheSnapshot() { 8488 var _a; 8489 if (!((_a = this.navigator.currentVisit) === null || _a === void 0 ? void 0 : _a.silent)) { 8490 this.notifyApplicationBeforeCachingSnapshot(); 8491 } 8492 } 8493 allowsImmediateRender({ element }, options) { 8494 const event2 = this.notifyApplicationBeforeRender(element, options); 8495 const { defaultPrevented, detail: { render } } = event2; 8496 if (this.view.renderer && render) { 8497 this.view.renderer.renderElement = render; 8498 } 8499 return !defaultPrevented; 8500 } 8501 viewRenderedSnapshot(_snapshot, _isPreview) { 8502 this.view.lastRenderedLocation = this.history.location; 8503 this.notifyApplicationAfterRender(); 8504 } 8505 preloadOnLoadLinksForView(element) { 8506 this.preloader.preloadOnLoadLinksForView(element); 8507 } 8508 viewInvalidated(reason) { 8509 this.adapter.pageInvalidated(reason); 8510 } 8511 frameLoaded(frame) { 8512 this.notifyApplicationAfterFrameLoad(frame); 8513 } 8514 frameRendered(fetchResponse, frame) { 8515 this.notifyApplicationAfterFrameRender(fetchResponse, frame); 8516 } 8517 applicationAllowsFollowingLinkToLocation(link, location2, ev) { 8518 const event2 = this.notifyApplicationAfterClickingLinkToLocation(link, location2, ev); 8519 return !event2.defaultPrevented; 8520 } 8521 applicationAllowsVisitingLocation(location2) { 8522 const event2 = this.notifyApplicationBeforeVisitingLocation(location2); 8523 return !event2.defaultPrevented; 8524 } 8525 notifyApplicationAfterClickingLinkToLocation(link, location2, event2) { 8526 return dispatch("turbo:click", { 8527 target: link, 8528 detail: { url: location2.href, originalEvent: event2 }, 8529 cancelable: true 8530 }); 8531 } 8532 notifyApplicationBeforeVisitingLocation(location2) { 8533 return dispatch("turbo:before-visit", { 8534 detail: { url: location2.href }, 8535 cancelable: true 8536 }); 8537 } 8538 notifyApplicationAfterVisitingLocation(location2, action) { 8539 return dispatch("turbo:visit", { detail: { url: location2.href, action } }); 8540 } 8541 notifyApplicationBeforeCachingSnapshot() { 8542 return dispatch("turbo:before-cache"); 8543 } 8544 notifyApplicationBeforeRender(newBody, options) { 8545 return dispatch("turbo:before-render", { 8546 detail: Object.assign({ newBody }, options), 8547 cancelable: true 8548 }); 8549 } 8550 notifyApplicationAfterRender() { 8551 return dispatch("turbo:render"); 8552 } 8553 notifyApplicationAfterPageLoad(timing = {}) { 8554 return dispatch("turbo:load", { 8555 detail: { url: this.location.href, timing } 8556 }); 8557 } 8558 notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) { 8559 dispatchEvent(new HashChangeEvent("hashchange", { 8560 oldURL: oldURL.toString(), 8561 newURL: newURL.toString() 8562 })); 8563 } 8564 notifyApplicationAfterFrameLoad(frame) { 8565 return dispatch("turbo:frame-load", { target: frame }); 8566 } 8567 notifyApplicationAfterFrameRender(fetchResponse, frame) { 8568 return dispatch("turbo:frame-render", { 8569 detail: { fetchResponse }, 8570 target: frame, 8571 cancelable: true 8572 }); 8573 } 8574 submissionIsNavigatable(form, submitter) { 8575 if (this.formMode == "off") { 8576 return false; 8577 } else { 8578 const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true; 8579 if (this.formMode == "optin") { 8580 return submitterIsNavigatable && form.closest('[data-turbo="true"]') != null; 8581 } else { 8582 return submitterIsNavigatable && this.elementIsNavigatable(form); 8583 } 8584 } 8585 } 8586 elementIsNavigatable(element) { 8587 const container = findClosestRecursively(element, "[data-turbo]"); 8588 const withinFrame = findClosestRecursively(element, "turbo-frame"); 8589 if (this.drive || withinFrame) { 8590 if (container) { 8591 return container.getAttribute("data-turbo") != "false"; 8592 } else { 8593 return true; 8594 } 8595 } else { 8596 if (container) { 8597 return container.getAttribute("data-turbo") == "true"; 8598 } else { 8599 return false; 8600 } 8601 } 8602 } 8603 getActionForLink(link) { 8604 return getVisitAction(link) || "advance"; 8605 } 8606 get snapshot() { 8607 return this.view.snapshot; 8608 } 8609 }; 8610 function extendURLWithDeprecatedProperties(url) { 8611 Object.defineProperties(url, deprecatedLocationPropertyDescriptors); 8612 } 8613 var deprecatedLocationPropertyDescriptors = { 8614 absoluteURL: { 8615 get() { 8616 return this.toString(); 8617 } 8618 } 8619 }; 8620 var Cache = class { 8621 constructor(session2) { 8622 this.session = session2; 8623 } 8624 clear() { 8625 this.session.clearCache(); 8626 } 8627 resetCacheControl() { 8628 this.setCacheControl(""); 8629 } 8630 exemptPageFromCache() { 8631 this.setCacheControl("no-cache"); 8632 } 8633 exemptPageFromPreview() { 8634 this.setCacheControl("no-preview"); 8635 } 8636 setCacheControl(value) { 8637 setMetaContent("turbo-cache-control", value); 8638 } 8639 }; 8640 var StreamActions = { 8641 after() { 8642 this.targetElements.forEach((e4) => { 8643 var _a; 8644 return (_a = e4.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e4.nextSibling); 8645 }); 8646 }, 8647 append() { 8648 this.removeDuplicateTargetChildren(); 8649 this.targetElements.forEach((e4) => e4.append(this.templateContent)); 8650 }, 8651 before() { 8652 this.targetElements.forEach((e4) => { 8653 var _a; 8654 return (_a = e4.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e4); 8655 }); 8656 }, 8657 prepend() { 8658 this.removeDuplicateTargetChildren(); 8659 this.targetElements.forEach((e4) => e4.prepend(this.templateContent)); 8660 }, 8661 remove() { 8662 this.targetElements.forEach((e4) => e4.remove()); 8663 }, 8664 replace() { 8665 this.targetElements.forEach((e4) => e4.replaceWith(this.templateContent)); 8666 }, 8667 update() { 8668 this.targetElements.forEach((targetElement) => { 8669 targetElement.innerHTML = ""; 8670 targetElement.append(this.templateContent); 8671 }); 8672 } 8673 }; 8674 var session = new Session(); 8675 var cache = new Cache(session); 8676 var { navigator: navigator$1 } = session; 8677 function start() { 8678 session.start(); 8679 } 8680 function registerAdapter(adapter) { 8681 session.registerAdapter(adapter); 8682 } 8683 function visit(location2, options) { 8684 session.visit(location2, options); 8685 } 8686 function connectStreamSource(source) { 8687 session.connectStreamSource(source); 8688 } 8689 function disconnectStreamSource(source) { 8690 session.disconnectStreamSource(source); 8691 } 8692 function renderStreamMessage(message) { 8693 session.renderStreamMessage(message); 8694 } 8695 function clearCache() { 8696 console.warn("Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`"); 8697 session.clearCache(); 8698 } 8699 function setProgressBarDelay(delay) { 8700 session.setProgressBarDelay(delay); 8701 } 8702 function setConfirmMethod(confirmMethod) { 8703 FormSubmission.confirmMethod = confirmMethod; 8704 } 8705 function setFormMode(mode) { 8706 session.setFormMode(mode); 8707 } 8708 var Turbo2 = /* @__PURE__ */ Object.freeze({ 8709 __proto__: null, 8710 navigator: navigator$1, 8711 session, 8712 cache, 8713 PageRenderer, 8714 PageSnapshot, 8715 FrameRenderer, 8716 start, 8717 registerAdapter, 8718 visit, 8719 connectStreamSource, 8720 disconnectStreamSource, 8721 renderStreamMessage, 8722 clearCache, 8723 setProgressBarDelay, 8724 setConfirmMethod, 8725 setFormMode, 8726 StreamActions 8727 }); 8728 var TurboFrameMissingError = class extends Error { 8729 }; 8730 var FrameController = class { 8731 constructor(element) { 8732 this.fetchResponseLoaded = (_fetchResponse) => { 8733 }; 8734 this.currentFetchRequest = null; 8735 this.resolveVisitPromise = () => { 8736 }; 8737 this.connected = false; 8738 this.hasBeenLoaded = false; 8739 this.ignoredAttributes = /* @__PURE__ */ new Set(); 8740 this.action = null; 8741 this.visitCachedSnapshot = ({ element: element2 }) => { 8742 const frame = element2.querySelector("#" + this.element.id); 8743 if (frame && this.previousFrameElement) { 8744 frame.replaceChildren(...this.previousFrameElement.children); 8745 } 8746 delete this.previousFrameElement; 8747 }; 8748 this.element = element; 8749 this.view = new FrameView(this, this.element); 8750 this.appearanceObserver = new AppearanceObserver(this, this.element); 8751 this.formLinkClickObserver = new FormLinkClickObserver(this, this.element); 8752 this.linkInterceptor = new LinkInterceptor(this, this.element); 8753 this.restorationIdentifier = uuid(); 8754 this.formSubmitObserver = new FormSubmitObserver(this, this.element); 8755 } 8756 connect() { 8757 if (!this.connected) { 8758 this.connected = true; 8759 if (this.loadingStyle == FrameLoadingStyle.lazy) { 8760 this.appearanceObserver.start(); 8761 } else { 8762 this.loadSourceURL(); 8763 } 8764 this.formLinkClickObserver.start(); 8765 this.linkInterceptor.start(); 8766 this.formSubmitObserver.start(); 8767 } 8768 } 8769 disconnect() { 8770 if (this.connected) { 8771 this.connected = false; 8772 this.appearanceObserver.stop(); 8773 this.formLinkClickObserver.stop(); 8774 this.linkInterceptor.stop(); 8775 this.formSubmitObserver.stop(); 8776 } 8777 } 8778 disabledChanged() { 8779 if (this.loadingStyle == FrameLoadingStyle.eager) { 8780 this.loadSourceURL(); 8781 } 8782 } 8783 sourceURLChanged() { 8784 if (this.isIgnoringChangesTo("src")) 8785 return; 8786 if (this.element.isConnected) { 8787 this.complete = false; 8788 } 8789 if (this.loadingStyle == FrameLoadingStyle.eager || this.hasBeenLoaded) { 8790 this.loadSourceURL(); 8791 } 8792 } 8793 sourceURLReloaded() { 8794 const { src } = this.element; 8795 this.ignoringChangesToAttribute("complete", () => { 8796 this.element.removeAttribute("complete"); 8797 }); 8798 this.element.src = null; 8799 this.element.src = src; 8800 return this.element.loaded; 8801 } 8802 completeChanged() { 8803 if (this.isIgnoringChangesTo("complete")) 8804 return; 8805 this.loadSourceURL(); 8806 } 8807 loadingStyleChanged() { 8808 if (this.loadingStyle == FrameLoadingStyle.lazy) { 8809 this.appearanceObserver.start(); 8810 } else { 8811 this.appearanceObserver.stop(); 8812 this.loadSourceURL(); 8813 } 8814 } 8815 async loadSourceURL() { 8816 if (this.enabled && this.isActive && !this.complete && this.sourceURL) { 8817 this.element.loaded = this.visit(expandURL(this.sourceURL)); 8818 this.appearanceObserver.stop(); 8819 await this.element.loaded; 8820 this.hasBeenLoaded = true; 8821 } 8822 } 8823 async loadResponse(fetchResponse) { 8824 if (fetchResponse.redirected || fetchResponse.succeeded && fetchResponse.isHTML) { 8825 this.sourceURL = fetchResponse.response.url; 8826 } 8827 try { 8828 const html = await fetchResponse.responseHTML; 8829 if (html) { 8830 const document2 = parseHTMLDocument(html); 8831 const pageSnapshot = PageSnapshot.fromDocument(document2); 8832 if (pageSnapshot.isVisitable) { 8833 await this.loadFrameResponse(fetchResponse, document2); 8834 } else { 8835 await this.handleUnvisitableFrameResponse(fetchResponse); 8836 } 8837 } 8838 } finally { 8839 this.fetchResponseLoaded = () => { 8840 }; 8841 } 8842 } 8843 elementAppearedInViewport(element) { 8844 this.proposeVisitIfNavigatedWithAction(element, element); 8845 this.loadSourceURL(); 8846 } 8847 willSubmitFormLinkToLocation(link) { 8848 return this.shouldInterceptNavigation(link); 8849 } 8850 submittedFormLinkToLocation(link, _location, form) { 8851 const frame = this.findFrameElement(link); 8852 if (frame) 8853 form.setAttribute("data-turbo-frame", frame.id); 8854 } 8855 shouldInterceptLinkClick(element, _location, _event) { 8856 return this.shouldInterceptNavigation(element); 8857 } 8858 linkClickIntercepted(element, location2) { 8859 this.navigateFrame(element, location2); 8860 } 8861 willSubmitForm(element, submitter) { 8862 return element.closest("turbo-frame") == this.element && this.shouldInterceptNavigation(element, submitter); 8863 } 8864 formSubmitted(element, submitter) { 8865 if (this.formSubmission) { 8866 this.formSubmission.stop(); 8867 } 8868 this.formSubmission = new FormSubmission(this, element, submitter); 8869 const { fetchRequest } = this.formSubmission; 8870 this.prepareRequest(fetchRequest); 8871 this.formSubmission.start(); 8872 } 8873 prepareRequest(request) { 8874 var _a; 8875 request.headers["Turbo-Frame"] = this.id; 8876 if ((_a = this.currentNavigationElement) === null || _a === void 0 ? void 0 : _a.hasAttribute("data-turbo-stream")) { 8877 request.acceptResponseType(StreamMessage.contentType); 8878 } 8879 } 8880 requestStarted(_request) { 8881 markAsBusy(this.element); 8882 } 8883 requestPreventedHandlingResponse(_request, _response) { 8884 this.resolveVisitPromise(); 8885 } 8886 async requestSucceededWithResponse(request, response) { 8887 await this.loadResponse(response); 8888 this.resolveVisitPromise(); 8889 } 8890 async requestFailedWithResponse(request, response) { 8891 await this.loadResponse(response); 8892 this.resolveVisitPromise(); 8893 } 8894 requestErrored(request, error2) { 8895 console.error(error2); 8896 this.resolveVisitPromise(); 8897 } 8898 requestFinished(_request) { 8899 clearBusyState(this.element); 8900 } 8901 formSubmissionStarted({ formElement }) { 8902 markAsBusy(formElement, this.findFrameElement(formElement)); 8903 } 8904 formSubmissionSucceededWithResponse(formSubmission, response) { 8905 const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter); 8906 frame.delegate.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter); 8907 frame.delegate.loadResponse(response); 8908 if (!formSubmission.isSafe) { 8909 session.clearCache(); 8910 } 8911 } 8912 formSubmissionFailedWithResponse(formSubmission, fetchResponse) { 8913 this.element.delegate.loadResponse(fetchResponse); 8914 session.clearCache(); 8915 } 8916 formSubmissionErrored(formSubmission, error2) { 8917 console.error(error2); 8918 } 8919 formSubmissionFinished({ formElement }) { 8920 clearBusyState(formElement, this.findFrameElement(formElement)); 8921 } 8922 allowsImmediateRender({ element: newFrame }, options) { 8923 const event2 = dispatch("turbo:before-frame-render", { 8924 target: this.element, 8925 detail: Object.assign({ newFrame }, options), 8926 cancelable: true 8927 }); 8928 const { defaultPrevented, detail: { render } } = event2; 8929 if (this.view.renderer && render) { 8930 this.view.renderer.renderElement = render; 8931 } 8932 return !defaultPrevented; 8933 } 8934 viewRenderedSnapshot(_snapshot, _isPreview) { 8935 } 8936 preloadOnLoadLinksForView(element) { 8937 session.preloadOnLoadLinksForView(element); 8938 } 8939 viewInvalidated() { 8940 } 8941 willRenderFrame(currentElement, _newElement) { 8942 this.previousFrameElement = currentElement.cloneNode(true); 8943 } 8944 async loadFrameResponse(fetchResponse, document2) { 8945 const newFrameElement = await this.extractForeignFrameElement(document2.body); 8946 if (newFrameElement) { 8947 const snapshot = new Snapshot(newFrameElement); 8948 const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, FrameRenderer.renderElement, false, false); 8949 if (this.view.renderPromise) 8950 await this.view.renderPromise; 8951 this.changeHistory(); 8952 await this.view.render(renderer); 8953 this.complete = true; 8954 session.frameRendered(fetchResponse, this.element); 8955 session.frameLoaded(this.element); 8956 this.fetchResponseLoaded(fetchResponse); 8957 } else if (this.willHandleFrameMissingFromResponse(fetchResponse)) { 8958 this.handleFrameMissingFromResponse(fetchResponse); 8959 } 8960 } 8961 async visit(url) { 8962 var _a; 8963 const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element); 8964 (_a = this.currentFetchRequest) === null || _a === void 0 ? void 0 : _a.cancel(); 8965 this.currentFetchRequest = request; 8966 return new Promise((resolve) => { 8967 this.resolveVisitPromise = () => { 8968 this.resolveVisitPromise = () => { 8969 }; 8970 this.currentFetchRequest = null; 8971 resolve(); 8972 }; 8973 request.perform(); 8974 }); 8975 } 8976 navigateFrame(element, url, submitter) { 8977 const frame = this.findFrameElement(element, submitter); 8978 frame.delegate.proposeVisitIfNavigatedWithAction(frame, element, submitter); 8979 this.withCurrentNavigationElement(element, () => { 8980 frame.src = url; 8981 }); 8982 } 8983 proposeVisitIfNavigatedWithAction(frame, element, submitter) { 8984 this.action = getVisitAction(submitter, element, frame); 8985 if (this.action) { 8986 const pageSnapshot = PageSnapshot.fromElement(frame).clone(); 8987 const { visitCachedSnapshot } = frame.delegate; 8988 frame.delegate.fetchResponseLoaded = (fetchResponse) => { 8989 if (frame.src) { 8990 const { statusCode, redirected } = fetchResponse; 8991 const responseHTML = frame.ownerDocument.documentElement.outerHTML; 8992 const response = { statusCode, redirected, responseHTML }; 8993 const options = { 8994 response, 8995 visitCachedSnapshot, 8996 willRender: false, 8997 updateHistory: false, 8998 restorationIdentifier: this.restorationIdentifier, 8999 snapshot: pageSnapshot 9000 }; 9001 if (this.action) 9002 options.action = this.action; 9003 session.visit(frame.src, options); 9004 } 9005 }; 9006 } 9007 } 9008 changeHistory() { 9009 if (this.action) { 9010 const method = getHistoryMethodForAction(this.action); 9011 session.history.update(method, expandURL(this.element.src || ""), this.restorationIdentifier); 9012 } 9013 } 9014 async handleUnvisitableFrameResponse(fetchResponse) { 9015 console.warn(`The response (${fetchResponse.statusCode}) from <turbo-frame id="${this.element.id}"> is performing a full page visit due to turbo-visit-control.`); 9016 await this.visitResponse(fetchResponse.response); 9017 } 9018 willHandleFrameMissingFromResponse(fetchResponse) { 9019 this.element.setAttribute("complete", ""); 9020 const response = fetchResponse.response; 9021 const visit2 = async (url, options = {}) => { 9022 if (url instanceof Response) { 9023 this.visitResponse(url); 9024 } else { 9025 session.visit(url, options); 9026 } 9027 }; 9028 const event2 = dispatch("turbo:frame-missing", { 9029 target: this.element, 9030 detail: { response, visit: visit2 }, 9031 cancelable: true 9032 }); 9033 return !event2.defaultPrevented; 9034 } 9035 handleFrameMissingFromResponse(fetchResponse) { 9036 this.view.missing(); 9037 this.throwFrameMissingError(fetchResponse); 9038 } 9039 throwFrameMissingError(fetchResponse) { 9040 const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id="${this.element.id}"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`; 9041 throw new TurboFrameMissingError(message); 9042 } 9043 async visitResponse(response) { 9044 const wrapped = new FetchResponse(response); 9045 const responseHTML = await wrapped.responseHTML; 9046 const { location: location2, redirected, statusCode } = wrapped; 9047 return session.visit(location2, { response: { redirected, statusCode, responseHTML } }); 9048 } 9049 findFrameElement(element, submitter) { 9050 var _a; 9051 const id2 = getAttribute("data-turbo-frame", submitter, element) || this.element.getAttribute("target"); 9052 return (_a = getFrameElementById(id2)) !== null && _a !== void 0 ? _a : this.element; 9053 } 9054 async extractForeignFrameElement(container) { 9055 let element; 9056 const id2 = CSS.escape(this.id); 9057 try { 9058 element = activateElement(container.querySelector(`turbo-frame#${id2}`), this.sourceURL); 9059 if (element) { 9060 return element; 9061 } 9062 element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id2}]`), this.sourceURL); 9063 if (element) { 9064 await element.loaded; 9065 return await this.extractForeignFrameElement(element); 9066 } 9067 } catch (error2) { 9068 console.error(error2); 9069 return new FrameElement(); 9070 } 9071 return null; 9072 } 9073 formActionIsVisitable(form, submitter) { 9074 const action = getAction(form, submitter); 9075 return locationIsVisitable(expandURL(action), this.rootLocation); 9076 } 9077 shouldInterceptNavigation(element, submitter) { 9078 const id2 = getAttribute("data-turbo-frame", submitter, element) || this.element.getAttribute("target"); 9079 if (element instanceof HTMLFormElement && !this.formActionIsVisitable(element, submitter)) { 9080 return false; 9081 } 9082 if (!this.enabled || id2 == "_top") { 9083 return false; 9084 } 9085 if (id2) { 9086 const frameElement = getFrameElementById(id2); 9087 if (frameElement) { 9088 return !frameElement.disabled; 9089 } 9090 } 9091 if (!session.elementIsNavigatable(element)) { 9092 return false; 9093 } 9094 if (submitter && !session.elementIsNavigatable(submitter)) { 9095 return false; 9096 } 9097 return true; 9098 } 9099 get id() { 9100 return this.element.id; 9101 } 9102 get enabled() { 9103 return !this.element.disabled; 9104 } 9105 get sourceURL() { 9106 if (this.element.src) { 9107 return this.element.src; 9108 } 9109 } 9110 set sourceURL(sourceURL) { 9111 this.ignoringChangesToAttribute("src", () => { 9112 this.element.src = sourceURL !== null && sourceURL !== void 0 ? sourceURL : null; 9113 }); 9114 } 9115 get loadingStyle() { 9116 return this.element.loading; 9117 } 9118 get isLoading() { 9119 return this.formSubmission !== void 0 || this.resolveVisitPromise() !== void 0; 9120 } 9121 get complete() { 9122 return this.element.hasAttribute("complete"); 9123 } 9124 set complete(value) { 9125 this.ignoringChangesToAttribute("complete", () => { 9126 if (value) { 9127 this.element.setAttribute("complete", ""); 9128 } else { 9129 this.element.removeAttribute("complete"); 9130 } 9131 }); 9132 } 9133 get isActive() { 9134 return this.element.isActive && this.connected; 9135 } 9136 get rootLocation() { 9137 var _a; 9138 const meta = this.element.ownerDocument.querySelector(`meta[name="turbo-root"]`); 9139 const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : "/"; 9140 return expandURL(root); 9141 } 9142 isIgnoringChangesTo(attributeName) { 9143 return this.ignoredAttributes.has(attributeName); 9144 } 9145 ignoringChangesToAttribute(attributeName, callback) { 9146 this.ignoredAttributes.add(attributeName); 9147 callback(); 9148 this.ignoredAttributes.delete(attributeName); 9149 } 9150 withCurrentNavigationElement(element, callback) { 9151 this.currentNavigationElement = element; 9152 callback(); 9153 delete this.currentNavigationElement; 9154 } 9155 }; 9156 function getFrameElementById(id2) { 9157 if (id2 != null) { 9158 const element = document.getElementById(id2); 9159 if (element instanceof FrameElement) { 9160 return element; 9161 } 9162 } 9163 } 9164 function activateElement(element, currentURL) { 9165 if (element) { 9166 const src = element.getAttribute("src"); 9167 if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) { 9168 throw new Error(`Matching <turbo-frame id="${element.id}"> element has a source URL which references itself`); 9169 } 9170 if (element.ownerDocument !== document) { 9171 element = document.importNode(element, true); 9172 } 9173 if (element instanceof FrameElement) { 9174 element.connectedCallback(); 9175 element.disconnectedCallback(); 9176 return element; 9177 } 9178 } 9179 } 9180 var StreamElement = class extends HTMLElement { 9181 static async renderElement(newElement) { 9182 await newElement.performAction(); 9183 } 9184 async connectedCallback() { 9185 try { 9186 await this.render(); 9187 } catch (error2) { 9188 console.error(error2); 9189 } finally { 9190 this.disconnect(); 9191 } 9192 } 9193 async render() { 9194 var _a; 9195 return (_a = this.renderPromise) !== null && _a !== void 0 ? _a : this.renderPromise = (async () => { 9196 const event2 = this.beforeRenderEvent; 9197 if (this.dispatchEvent(event2)) { 9198 await nextAnimationFrame(); 9199 await event2.detail.render(this); 9200 } 9201 })(); 9202 } 9203 disconnect() { 9204 try { 9205 this.remove(); 9206 } catch (_a) { 9207 } 9208 } 9209 removeDuplicateTargetChildren() { 9210 this.duplicateChildren.forEach((c4) => c4.remove()); 9211 } 9212 get duplicateChildren() { 9213 var _a; 9214 const existingChildren = this.targetElements.flatMap((e4) => [...e4.children]).filter((c4) => !!c4.id); 9215 const newChildrenIds = [...((_a = this.templateContent) === null || _a === void 0 ? void 0 : _a.children) || []].filter((c4) => !!c4.id).map((c4) => c4.id); 9216 return existingChildren.filter((c4) => newChildrenIds.includes(c4.id)); 9217 } 9218 get performAction() { 9219 if (this.action) { 9220 const actionFunction = StreamActions[this.action]; 9221 if (actionFunction) { 9222 return actionFunction; 9223 } 9224 this.raise("unknown action"); 9225 } 9226 this.raise("action attribute is missing"); 9227 } 9228 get targetElements() { 9229 if (this.target) { 9230 return this.targetElementsById; 9231 } else if (this.targets) { 9232 return this.targetElementsByQuery; 9233 } else { 9234 this.raise("target or targets attribute is missing"); 9235 } 9236 } 9237 get templateContent() { 9238 return this.templateElement.content.cloneNode(true); 9239 } 9240 get templateElement() { 9241 if (this.firstElementChild === null) { 9242 const template = this.ownerDocument.createElement("template"); 9243 this.appendChild(template); 9244 return template; 9245 } else if (this.firstElementChild instanceof HTMLTemplateElement) { 9246 return this.firstElementChild; 9247 } 9248 this.raise("first child element must be a <template> element"); 9249 } 9250 get action() { 9251 return this.getAttribute("action"); 9252 } 9253 get target() { 9254 return this.getAttribute("target"); 9255 } 9256 get targets() { 9257 return this.getAttribute("targets"); 9258 } 9259 raise(message) { 9260 throw new Error(`${this.description}: ${message}`); 9261 } 9262 get description() { 9263 var _a, _b; 9264 return (_b = ((_a = this.outerHTML.match(/<[^>]+>/)) !== null && _a !== void 0 ? _a : [])[0]) !== null && _b !== void 0 ? _b : "<turbo-stream>"; 9265 } 9266 get beforeRenderEvent() { 9267 return new CustomEvent("turbo:before-stream-render", { 9268 bubbles: true, 9269 cancelable: true, 9270 detail: { newStream: this, render: StreamElement.renderElement } 9271 }); 9272 } 9273 get targetElementsById() { 9274 var _a; 9275 const element = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.getElementById(this.target); 9276 if (element !== null) { 9277 return [element]; 9278 } else { 9279 return []; 9280 } 9281 } 9282 get targetElementsByQuery() { 9283 var _a; 9284 const elements = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.targets); 9285 if (elements.length !== 0) { 9286 return Array.prototype.slice.call(elements); 9287 } else { 9288 return []; 9289 } 9290 } 9291 }; 9292 var StreamSourceElement = class extends HTMLElement { 9293 constructor() { 9294 super(...arguments); 9295 this.streamSource = null; 9296 } 9297 connectedCallback() { 9298 this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src); 9299 connectStreamSource(this.streamSource); 9300 } 9301 disconnectedCallback() { 9302 if (this.streamSource) { 9303 disconnectStreamSource(this.streamSource); 9304 } 9305 } 9306 get src() { 9307 return this.getAttribute("src") || ""; 9308 } 9309 }; 9310 FrameElement.delegateConstructor = FrameController; 9311 if (customElements.get("turbo-frame") === void 0) { 9312 customElements.define("turbo-frame", FrameElement); 9313 } 9314 if (customElements.get("turbo-stream") === void 0) { 9315 customElements.define("turbo-stream", StreamElement); 9316 } 9317 if (customElements.get("turbo-stream-source") === void 0) { 9318 customElements.define("turbo-stream-source", StreamSourceElement); 9319 } 9320 (() => { 9321 let element = document.currentScript; 9322 if (!element) 9323 return; 9324 if (element.hasAttribute("data-turbo-suppress-warning")) 9325 return; 9326 element = element.parentElement; 9327 while (element) { 9328 if (element == document.body) { 9329 return console.warn(unindent` 9330 You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do! 9331 9332 Load your applicationâs JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change. 9333 9334 For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements 9335 9336 ââ 9337 Suppress this warning by adding a "data-turbo-suppress-warning" attribute to: %s 9338 `, element.outerHTML); 9339 } 9340 element = element.parentElement; 9341 } 9342 })(); 9343 window.Turbo = Turbo2; 9344 start(); 9345 9346
vendor: 607 bytes, lines 9346-9363
9346// node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js 9347 var consumer; 9348 async function getConsumer() { 9349 return consumer || setConsumer(createConsumer2().then(setConsumer)); 9350 } 9351 function setConsumer(newConsumer) { 9352 return consumer = newConsumer; 9353 } 9354 async function createConsumer2() { 9355 const { createConsumer: createConsumer3 } = await Promise.resolve().then(() => (init_src(), src_exports)); 9356 return createConsumer3(); 9357 } 9358 async function subscribeTo(channel, mixin) { 9359 const { subscriptions } = await getConsumer(); 9360 return subscriptions.create(channel, mixin); 9361 } 9362 9363
vendor: 552 bytes, lines 9363-9380
9363// node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js 9364 function walk(obj) { 9365 if (!obj || typeof obj !== "object") 9366 return obj; 9367 if (obj instanceof Date || obj instanceof RegExp) 9368 return obj; 9369 if (Array.isArray(obj)) 9370 return obj.map(walk); 9371 return Object.keys(obj).reduce(function(acc, key) { 9372 var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function(m5, x5) { 9373 return "_" + x5.toLowerCase(); 9374 }); 9375 acc[camel] = walk(obj[key]); 9376 return acc; 9377 }, {}); 9378 } 9379 9380
vendor: 1,308 bytes, lines 9380-9415
9380// node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js 9381 var TurboCableStreamSourceElement = class extends HTMLElement { 9382 async connectedCallback() { 9383 connectStreamSource(this); 9384 this.subscription = await subscribeTo(this.channel, { 9385 received: this.dispatchMessageEvent.bind(this), 9386 connected: this.subscriptionConnected.bind(this), 9387 disconnected: this.subscriptionDisconnected.bind(this) 9388 }); 9389 } 9390 disconnectedCallback() { 9391 disconnectStreamSource(this); 9392 if (this.subscription) 9393 this.subscription.unsubscribe(); 9394 } 9395 dispatchMessageEvent(data) { 9396 const event2 = new MessageEvent("message", { data }); 9397 return this.dispatchEvent(event2); 9398 } 9399 subscriptionConnected() { 9400 this.setAttribute("connected", ""); 9401 } 9402 subscriptionDisconnected() { 9403 this.removeAttribute("connected"); 9404 } 9405 get channel() { 9406 const channel = this.getAttribute("channel"); 9407 const signed_stream_name = this.getAttribute("signed-stream-name"); 9408 return { channel, signed_stream_name, ...walk({ ...this.dataset }) }; 9409 } 9410 }; 9411 if (customElements.get("turbo-cable-stream-source") === void 0) { 9412 customElements.define("turbo-cable-stream-source", TurboCableStreamSourceElement); 9413 } 9414 9415
vendor: 1,603 bytes, lines 9415-9460
9415// node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js 9416 function encodeMethodIntoRequestBody(event2) { 9417 if (event2.target instanceof HTMLFormElement) { 9418 const { target: form, detail: { fetchOptions } } = event2; 9419 form.addEventListener("turbo:submit-start", ({ detail: { formSubmission: { submitter } } }) => { 9420 const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams(); 9421 const method = determineFetchMethod(submitter, body, form); 9422 if (!/get/i.test(method)) { 9423 if (/post/i.test(method)) { 9424 body.delete("_method"); 9425 } else { 9426 body.set("_method", method); 9427 } 9428 fetchOptions.method = "post"; 9429 } 9430 }, { once: true }); 9431 } 9432 } 9433 function determineFetchMethod(submitter, body, form) { 9434 const formMethod = determineFormMethod(submitter); 9435 const overrideMethod = body.get("_method"); 9436 const method = form.getAttribute("method") || "get"; 9437 if (typeof formMethod == "string") { 9438 return formMethod; 9439 } else if (typeof overrideMethod == "string") { 9440 return overrideMethod; 9441 } else { 9442 return method; 9443 } 9444 } 9445 function determineFormMethod(submitter) { 9446 if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) { 9447 if (submitter.hasAttribute("formmethod")) { 9448 return submitter.formMethod; 9449 } else { 9450 return null; 9451 } 9452 } else { 9453 return null; 9454 } 9455 } 9456 function isBodyInit(body) { 9457 return body instanceof FormData || body instanceof URLSearchParams; 9458 } 9459 9460
vendor: 150 bytes, lines 9460-9463
9460// node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js 9461 addEventListener("turbo:before-fetch-request", encodeMethodIntoRequestBody); 9462 9463
vendor: 31,071 bytes, lines 9463-10323
9463// node_modules/@rails/actiontext/app/assets/javascripts/actiontext.esm.js 9464 var sparkMd5 = { 9465 exports: {} 9466 }; 9467 (function(module, exports) { 9468 (function(factory) { 9469 { 9470 module.exports = factory(); 9471 } 9472 })(function(undefined$1) { 9473 var hex_chr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; 9474 function md5cycle(x5, k4) { 9475 var a4 = x5[0], b4 = x5[1], c4 = x5[2], d3 = x5[3]; 9476 a4 += (b4 & c4 | ~b4 & d3) + k4[0] - 680876936 | 0; 9477 a4 = (a4 << 7 | a4 >>> 25) + b4 | 0; 9478 d3 += (a4 & b4 | ~a4 & c4) + k4[1] - 389564586 | 0; 9479 d3 = (d3 << 12 | d3 >>> 20) + a4 | 0; 9480 c4 += (d3 & a4 | ~d3 & b4) + k4[2] + 606105819 | 0; 9481 c4 = (c4 << 17 | c4 >>> 15) + d3 | 0; 9482 b4 += (c4 & d3 | ~c4 & a4) + k4[3] - 1044525330 | 0; 9483 b4 = (b4 << 22 | b4 >>> 10) + c4 | 0; 9484 a4 += (b4 & c4 | ~b4 & d3) + k4[4] - 176418897 | 0; 9485 a4 = (a4 << 7 | a4 >>> 25) + b4 | 0; 9486 d3 += (a4 & b4 | ~a4 & c4) + k4[5] + 1200080426 | 0; 9487 d3 = (d3 << 12 | d3 >>> 20) + a4 | 0; 9488 c4 += (d3 & a4 | ~d3 & b4) + k4[6] - 1473231341 | 0; 9489 c4 = (c4 << 17 | c4 >>> 15) + d3 | 0; 9490 b4 += (c4 & d3 | ~c4 & a4) + k4[7] - 45705983 | 0; 9491 b4 = (b4 << 22 | b4 >>> 10) + c4 | 0; 9492 a4 += (b4 & c4 | ~b4 & d3) + k4[8] + 1770035416 | 0; 9493 a4 = (a4 << 7 | a4 >>> 25) + b4 | 0; 9494 d3 += (a4 & b4 | ~a4 & c4) + k4[9] - 1958414417 | 0; 9495 d3 = (d3 << 12 | d3 >>> 20) + a4 | 0; 9496 c4 += (d3 & a4 | ~d3 & b4) + k4[10] - 42063 | 0; 9497 c4 = (c4 << 17 | c4 >>> 15) + d3 | 0; 9498 b4 += (c4 & d3 | ~c4 & a4) + k4[11] - 1990404162 | 0; 9499 b4 = (b4 << 22 | b4 >>> 10) + c4 | 0; 9500 a4 += (b4 & c4 | ~b4 & d3) + k4[12] + 1804603682 | 0; 9501 a4 = (a4 << 7 | a4 >>> 25) + b4 | 0; 9502 d3 += (a4 & b4 | ~a4 & c4) + k4[13] - 40341101 | 0; 9503 d3 = (d3 << 12 | d3 >>> 20) + a4 | 0; 9504 c4 += (d3 & a4 | ~d3 & b4) + k4[14] - 1502002290 | 0; 9505 c4 = (c4 << 17 | c4 >>> 15) + d3 | 0; 9506 b4 += (c4 & d3 | ~c4 & a4) + k4[15] + 1236535329 | 0; 9507 b4 = (b4 << 22 | b4 >>> 10) + c4 | 0; 9508 a4 += (b4 & d3 | c4 & ~d3) + k4[1] - 165796510 | 0; 9509 a4 = (a4 << 5 | a4 >>> 27) + b4 | 0; 9510 d3 += (a4 & c4 | b4 & ~c4) + k4[6] - 1069501632 | 0; 9511 d3 = (d3 << 9 | d3 >>> 23) + a4 | 0; 9512 c4 += (d3 & b4 | a4 & ~b4) + k4[11] + 643717713 | 0; 9513 c4 = (c4 << 14 | c4 >>> 18) + d3 | 0; 9514 b4 += (c4 & a4 | d3 & ~a4) + k4[0] - 373897302 | 0; 9515 b4 = (b4 << 20 | b4 >>> 12) + c4 | 0; 9516 a4 += (b4 & d3 | c4 & ~d3) + k4[5] - 701558691 | 0; 9517 a4 = (a4 << 5 | a4 >>> 27) + b4 | 0; 9518 d3 += (a4 & c4 | b4 & ~c4) + k4[10] + 38016083 | 0; 9519 d3 = (d3 << 9 | d3 >>> 23) + a4 | 0; 9520 c4 += (d3 & b4 | a4 & ~b4) + k4[15] - 660478335 | 0; 9521 c4 = (c4 << 14 | c4 >>> 18) + d3 | 0; 9522 b4 += (c4 & a4 | d3 & ~a4) + k4[4] - 405537848 | 0; 9523 b4 = (b4 << 20 | b4 >>> 12) + c4 | 0; 9524 a4 += (b4 & d3 | c4 & ~d3) + k4[9] + 568446438 | 0; 9525 a4 = (a4 << 5 | a4 >>> 27) + b4 | 0; 9526 d3 += (a4 & c4 | b4 & ~c4) + k4[14] - 1019803690 | 0; 9527 d3 = (d3 << 9 | d3 >>> 23) + a4 | 0; 9528 c4 += (d3 & b4 | a4 & ~b4) + k4[3] - 187363961 | 0; 9529 c4 = (c4 << 14 | c4 >>> 18) + d3 | 0; 9530 b4 += (c4 & a4 | d3 & ~a4) + k4[8] + 1163531501 | 0; 9531 b4 = (b4 << 20 | b4 >>> 12) + c4 | 0; 9532 a4 += (b4 & d3 | c4 & ~d3) + k4[13] - 1444681467 | 0; 9533 a4 = (a4 << 5 | a4 >>> 27) + b4 | 0; 9534 d3 += (a4 & c4 | b4 & ~c4) + k4[2] - 51403784 | 0; 9535 d3 = (d3 << 9 | d3 >>> 23) + a4 | 0; 9536 c4 += (d3 & b4 | a4 & ~b4) + k4[7] + 1735328473 | 0; 9537 c4 = (c4 << 14 | c4 >>> 18) + d3 | 0; 9538 b4 += (c4 & a4 | d3 & ~a4) + k4[12] - 1926607734 | 0; 9539 b4 = (b4 << 20 | b4 >>> 12) + c4 | 0; 9540 a4 += (b4 ^ c4 ^ d3) + k4[5] - 378558 | 0; 9541 a4 = (a4 << 4 | a4 >>> 28) + b4 | 0; 9542 d3 += (a4 ^ b4 ^ c4) + k4[8] - 2022574463 | 0; 9543 d3 = (d3 << 11 | d3 >>> 21) + a4 | 0; 9544 c4 += (d3 ^ a4 ^ b4) + k4[11] + 1839030562 | 0; 9545 c4 = (c4 << 16 | c4 >>> 16) + d3 | 0; 9546 b4 += (c4 ^ d3 ^ a4) + k4[14] - 35309556 | 0; 9547 b4 = (b4 << 23 | b4 >>> 9) + c4 | 0; 9548 a4 += (b4 ^ c4 ^ d3) + k4[1] - 1530992060 | 0; 9549 a4 = (a4 << 4 | a4 >>> 28) + b4 | 0; 9550 d3 += (a4 ^ b4 ^ c4) + k4[4] + 1272893353 | 0; 9551 d3 = (d3 << 11 | d3 >>> 21) + a4 | 0; 9552 c4 += (d3 ^ a4 ^ b4) + k4[7] - 155497632 | 0; 9553 c4 = (c4 << 16 | c4 >>> 16) + d3 | 0; 9554 b4 += (c4 ^ d3 ^ a4) + k4[10] - 1094730640 | 0; 9555 b4 = (b4 << 23 | b4 >>> 9) + c4 | 0; 9556 a4 += (b4 ^ c4 ^ d3) + k4[13] + 681279174 | 0; 9557 a4 = (a4 << 4 | a4 >>> 28) + b4 | 0; 9558 d3 += (a4 ^ b4 ^ c4) + k4[0] - 358537222 | 0; 9559 d3 = (d3 << 11 | d3 >>> 21) + a4 | 0; 9560 c4 += (d3 ^ a4 ^ b4) + k4[3] - 722521979 | 0; 9561 c4 = (c4 << 16 | c4 >>> 16) + d3 | 0; 9562 b4 += (c4 ^ d3 ^ a4) + k4[6] + 76029189 | 0; 9563 b4 = (b4 << 23 | b4 >>> 9) + c4 | 0; 9564 a4 += (b4 ^ c4 ^ d3) + k4[9] - 640364487 | 0; 9565 a4 = (a4 << 4 | a4 >>> 28) + b4 | 0; 9566 d3 += (a4 ^ b4 ^ c4) + k4[12] - 421815835 | 0; 9567 d3 = (d3 << 11 | d3 >>> 21) + a4 | 0; 9568 c4 += (d3 ^ a4 ^ b4) + k4[15] + 530742520 | 0; 9569 c4 = (c4 << 16 | c4 >>> 16) + d3 | 0; 9570 b4 += (c4 ^ d3 ^ a4) + k4[2] - 995338651 | 0; 9571 b4 = (b4 << 23 | b4 >>> 9) + c4 | 0; 9572 a4 += (c4 ^ (b4 | ~d3)) + k4[0] - 198630844 | 0; 9573 a4 = (a4 << 6 | a4 >>> 26) + b4 | 0; 9574 d3 += (b4 ^ (a4 | ~c4)) + k4[7] + 1126891415 | 0; 9575 d3 = (d3 << 10 | d3 >>> 22) + a4 | 0; 9576 c4 += (a4 ^ (d3 | ~b4)) + k4[14] - 1416354905 | 0; 9577 c4 = (c4 << 15 | c4 >>> 17) + d3 | 0; 9578 b4 += (d3 ^ (c4 | ~a4)) + k4[5] - 57434055 | 0; 9579 b4 = (b4 << 21 | b4 >>> 11) + c4 | 0; 9580 a4 += (c4 ^ (b4 | ~d3)) + k4[12] + 1700485571 | 0; 9581 a4 = (a4 << 6 | a4 >>> 26) + b4 | 0; 9582 d3 += (b4 ^ (a4 | ~c4)) + k4[3] - 1894986606 | 0; 9583 d3 = (d3 << 10 | d3 >>> 22) + a4 | 0; 9584 c4 += (a4 ^ (d3 | ~b4)) + k4[10] - 1051523 | 0; 9585 c4 = (c4 << 15 | c4 >>> 17) + d3 | 0; 9586 b4 += (d3 ^ (c4 | ~a4)) + k4[1] - 2054922799 | 0; 9587 b4 = (b4 << 21 | b4 >>> 11) + c4 | 0; 9588 a4 += (c4 ^ (b4 | ~d3)) + k4[8] + 1873313359 | 0; 9589 a4 = (a4 << 6 | a4 >>> 26) + b4 | 0; 9590 d3 += (b4 ^ (a4 | ~c4)) + k4[15] - 30611744 | 0; 9591 d3 = (d3 << 10 | d3 >>> 22) + a4 | 0; 9592 c4 += (a4 ^ (d3 | ~b4)) + k4[6] - 1560198380 | 0; 9593 c4 = (c4 << 15 | c4 >>> 17) + d3 | 0; 9594 b4 += (d3 ^ (c4 | ~a4)) + k4[13] + 1309151649 | 0; 9595 b4 = (b4 << 21 | b4 >>> 11) + c4 | 0; 9596 a4 += (c4 ^ (b4 | ~d3)) + k4[4] - 145523070 | 0; 9597 a4 = (a4 << 6 | a4 >>> 26) + b4 | 0; 9598 d3 += (b4 ^ (a4 | ~c4)) + k4[11] - 1120210379 | 0; 9599 d3 = (d3 << 10 | d3 >>> 22) + a4 | 0; 9600 c4 += (a4 ^ (d3 | ~b4)) + k4[2] + 718787259 | 0; 9601 c4 = (c4 << 15 | c4 >>> 17) + d3 | 0; 9602 b4 += (d3 ^ (c4 | ~a4)) + k4[9] - 343485551 | 0; 9603 b4 = (b4 << 21 | b4 >>> 11) + c4 | 0; 9604 x5[0] = a4 + x5[0] | 0; 9605 x5[1] = b4 + x5[1] | 0; 9606 x5[2] = c4 + x5[2] | 0; 9607 x5[3] = d3 + x5[3] | 0; 9608 } 9609 function md5blk(s4) { 9610 var md5blks = [], i4; 9611 for (i4 = 0; i4 < 64; i4 += 4) { 9612 md5blks[i4 >> 2] = s4.charCodeAt(i4) + (s4.charCodeAt(i4 + 1) << 8) + (s4.charCodeAt(i4 + 2) << 16) + (s4.charCodeAt(i4 + 3) << 24); 9613 } 9614 return md5blks; 9615 } 9616 function md5blk_array(a4) { 9617 var md5blks = [], i4; 9618 for (i4 = 0; i4 < 64; i4 += 4) { 9619 md5blks[i4 >> 2] = a4[i4] + (a4[i4 + 1] << 8) + (a4[i4 + 2] << 16) + (a4[i4 + 3] << 24); 9620 } 9621 return md5blks; 9622 } 9623 function md51(s4) { 9624 var n3 = s4.length, state = [1732584193, -271733879, -1732584194, 271733878], i4, length, tail, tmp, lo, hi2; 9625 for (i4 = 64; i4 <= n3; i4 += 64) { 9626 md5cycle(state, md5blk(s4.substring(i4 - 64, i4))); 9627 } 9628 s4 = s4.substring(i4 - 64); 9629 length = s4.length; 9630 tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 9631 for (i4 = 0; i4 < length; i4 += 1) { 9632 tail[i4 >> 2] |= s4.charCodeAt(i4) << (i4 % 4 << 3); 9633 } 9634 tail[i4 >> 2] |= 128 << (i4 % 4 << 3); 9635 if (i4 > 55) { 9636 md5cycle(state, tail); 9637 for (i4 = 0; i4 < 16; i4 += 1) { 9638 tail[i4] = 0; 9639 } 9640 } 9641 tmp = n3 * 8; 9642 tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); 9643 lo = parseInt(tmp[2], 16); 9644 hi2 = parseInt(tmp[1], 16) || 0; 9645 tail[14] = lo; 9646 tail[15] = hi2; 9647 md5cycle(state, tail); 9648 return state; 9649 } 9650 function md51_array(a4) { 9651 var n3 = a4.length, state = [1732584193, -271733879, -1732584194, 271733878], i4, length, tail, tmp, lo, hi2; 9652 for (i4 = 64; i4 <= n3; i4 += 64) { 9653 md5cycle(state, md5blk_array(a4.subarray(i4 - 64, i4))); 9654 } 9655 a4 = i4 - 64 < n3 ? a4.subarray(i4 - 64) : new Uint8Array(0); 9656 length = a4.length; 9657 tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 9658 for (i4 = 0; i4 < length; i4 += 1) { 9659 tail[i4 >> 2] |= a4[i4] << (i4 % 4 << 3); 9660 } 9661 tail[i4 >> 2] |= 128 << (i4 % 4 << 3); 9662 if (i4 > 55) { 9663 md5cycle(state, tail); 9664 for (i4 = 0; i4 < 16; i4 += 1) { 9665 tail[i4] = 0; 9666 } 9667 } 9668 tmp = n3 * 8; 9669 tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); 9670 lo = parseInt(tmp[2], 16); 9671 hi2 = parseInt(tmp[1], 16) || 0; 9672 tail[14] = lo; 9673 tail[15] = hi2; 9674 md5cycle(state, tail); 9675 return state; 9676 } 9677 function rhex(n3) { 9678 var s4 = "", j5; 9679 for (j5 = 0; j5 < 4; j5 += 1) { 9680 s4 += hex_chr[n3 >> j5 * 8 + 4 & 15] + hex_chr[n3 >> j5 * 8 & 15]; 9681 } 9682 return s4; 9683 } 9684 function hex(x5) { 9685 var i4; 9686 for (i4 = 0; i4 < x5.length; i4 += 1) { 9687 x5[i4] = rhex(x5[i4]); 9688 } 9689 return x5.join(""); 9690 } 9691 if (hex(md51("hello")) !== "5d41402abc4b2a76b9719d911017c592") 9692 ; 9693 if (typeof ArrayBuffer !== "undefined" && !ArrayBuffer.prototype.slice) { 9694 (function() { 9695 function clamp(val, length) { 9696 val = val | 0 || 0; 9697 if (val < 0) { 9698 return Math.max(val + length, 0); 9699 } 9700 return Math.min(val, length); 9701 } 9702 ArrayBuffer.prototype.slice = function(from, to2) { 9703 var length = this.byteLength, begin = clamp(from, length), end2 = length, num, target, targetArray, sourceArray; 9704 if (to2 !== undefined$1) { 9705 end2 = clamp(to2, length); 9706 } 9707 if (begin > end2) { 9708 return new ArrayBuffer(0); 9709 } 9710 num = end2 - begin; 9711 target = new ArrayBuffer(num); 9712 targetArray = new Uint8Array(target); 9713 sourceArray = new Uint8Array(this, begin, num); 9714 targetArray.set(sourceArray); 9715 return target; 9716 }; 9717 })(); 9718 } 9719 function toUtf8(str) { 9720 if (/[\u0080-\uFFFF]/.test(str)) { 9721 str = unescape(encodeURIComponent(str)); 9722 } 9723 return str; 9724 } 9725 function utf8Str2ArrayBuffer(str, returnUInt8Array) { 9726 var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i4; 9727 for (i4 = 0; i4 < length; i4 += 1) { 9728 arr[i4] = str.charCodeAt(i4); 9729 } 9730 return returnUInt8Array ? arr : buff; 9731 } 9732 function arrayBuffer2Utf8Str(buff) { 9733 return String.fromCharCode.apply(null, new Uint8Array(buff)); 9734 } 9735 function concatenateArrayBuffers(first, second, returnUInt8Array) { 9736 var result = new Uint8Array(first.byteLength + second.byteLength); 9737 result.set(new Uint8Array(first)); 9738 result.set(new Uint8Array(second), first.byteLength); 9739 return returnUInt8Array ? result : result.buffer; 9740 } 9741 function hexToBinaryString(hex2) { 9742 var bytes = [], length = hex2.length, x5; 9743 for (x5 = 0; x5 < length - 1; x5 += 2) { 9744 bytes.push(parseInt(hex2.substr(x5, 2), 16)); 9745 } 9746 return String.fromCharCode.apply(String, bytes); 9747 } 9748 function SparkMD52() { 9749 this.reset(); 9750 } 9751 SparkMD52.prototype.append = function(str) { 9752 this.appendBinary(toUtf8(str)); 9753 return this; 9754 }; 9755 SparkMD52.prototype.appendBinary = function(contents) { 9756 this._buff += contents; 9757 this._length += contents.length; 9758 var length = this._buff.length, i4; 9759 for (i4 = 64; i4 <= length; i4 += 64) { 9760 md5cycle(this._hash, md5blk(this._buff.substring(i4 - 64, i4))); 9761 } 9762 this._buff = this._buff.substring(i4 - 64); 9763 return this; 9764 }; 9765 SparkMD52.prototype.end = function(raw) { 9766 var buff = this._buff, length = buff.length, i4, tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ret; 9767 for (i4 = 0; i4 < length; i4 += 1) { 9768 tail[i4 >> 2] |= buff.charCodeAt(i4) << (i4 % 4 << 3); 9769 } 9770 this._finish(tail, length); 9771 ret = hex(this._hash); 9772 if (raw) { 9773 ret = hexToBinaryString(ret); 9774 } 9775 this.reset(); 9776 return ret; 9777 }; 9778 SparkMD52.prototype.reset = function() { 9779 this._buff = ""; 9780 this._length = 0; 9781 this._hash = [1732584193, -271733879, -1732584194, 271733878]; 9782 return this; 9783 }; 9784 SparkMD52.prototype.getState = function() { 9785 return { 9786 buff: this._buff, 9787 length: this._length, 9788 hash: this._hash.slice() 9789 }; 9790 }; 9791 SparkMD52.prototype.setState = function(state) { 9792 this._buff = state.buff; 9793 this._length = state.length; 9794 this._hash = state.hash; 9795 return this; 9796 }; 9797 SparkMD52.prototype.destroy = function() { 9798 delete this._hash; 9799 delete this._buff; 9800 delete this._length; 9801 }; 9802 SparkMD52.prototype._finish = function(tail, length) { 9803 var i4 = length, tmp, lo, hi2; 9804 tail[i4 >> 2] |= 128 << (i4 % 4 << 3); 9805 if (i4 > 55) { 9806 md5cycle(this._hash, tail); 9807 for (i4 = 0; i4 < 16; i4 += 1) { 9808 tail[i4] = 0; 9809 } 9810 } 9811 tmp = this._length * 8; 9812 tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); 9813 lo = parseInt(tmp[2], 16); 9814 hi2 = parseInt(tmp[1], 16) || 0; 9815 tail[14] = lo; 9816 tail[15] = hi2; 9817 md5cycle(this._hash, tail); 9818 }; 9819 SparkMD52.hash = function(str, raw) { 9820 return SparkMD52.hashBinary(toUtf8(str), raw); 9821 }; 9822 SparkMD52.hashBinary = function(content, raw) { 9823 var hash3 = md51(content), ret = hex(hash3); 9824 return raw ? hexToBinaryString(ret) : ret; 9825 }; 9826 SparkMD52.ArrayBuffer = function() { 9827 this.reset(); 9828 }; 9829 SparkMD52.ArrayBuffer.prototype.append = function(arr) { 9830 var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i4; 9831 this._length += arr.byteLength; 9832 for (i4 = 64; i4 <= length; i4 += 64) { 9833 md5cycle(this._hash, md5blk_array(buff.subarray(i4 - 64, i4))); 9834 } 9835 this._buff = i4 - 64 < length ? new Uint8Array(buff.buffer.slice(i4 - 64)) : new Uint8Array(0); 9836 return this; 9837 }; 9838 SparkMD52.ArrayBuffer.prototype.end = function(raw) { 9839 var buff = this._buff, length = buff.length, tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], i4, ret; 9840 for (i4 = 0; i4 < length; i4 += 1) { 9841 tail[i4 >> 2] |= buff[i4] << (i4 % 4 << 3); 9842 } 9843 this._finish(tail, length); 9844 ret = hex(this._hash); 9845 if (raw) { 9846 ret = hexToBinaryString(ret); 9847 } 9848 this.reset(); 9849 return ret; 9850 }; 9851 SparkMD52.ArrayBuffer.prototype.reset = function() { 9852 this._buff = new Uint8Array(0); 9853 this._length = 0; 9854 this._hash = [1732584193, -271733879, -1732584194, 271733878]; 9855 return this; 9856 }; 9857 SparkMD52.ArrayBuffer.prototype.getState = function() { 9858 var state = SparkMD52.prototype.getState.call(this); 9859 state.buff = arrayBuffer2Utf8Str(state.buff); 9860 return state; 9861 }; 9862 SparkMD52.ArrayBuffer.prototype.setState = function(state) { 9863 state.buff = utf8Str2ArrayBuffer(state.buff, true); 9864 return SparkMD52.prototype.setState.call(this, state); 9865 }; 9866 SparkMD52.ArrayBuffer.prototype.destroy = SparkMD52.prototype.destroy; 9867 SparkMD52.ArrayBuffer.prototype._finish = SparkMD52.prototype._finish; 9868 SparkMD52.ArrayBuffer.hash = function(arr, raw) { 9869 var hash3 = md51_array(new Uint8Array(arr)), ret = hex(hash3); 9870 return raw ? hexToBinaryString(ret) : ret; 9871 }; 9872 return SparkMD52; 9873 }); 9874 })(sparkMd5); 9875 var SparkMD5 = sparkMd5.exports; 9876 var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; 9877 var FileChecksum = class { 9878 static create(file, callback) { 9879 const instance = new FileChecksum(file); 9880 instance.create(callback); 9881 } 9882 constructor(file) { 9883 this.file = file; 9884 this.chunkSize = 2097152; 9885 this.chunkCount = Math.ceil(this.file.size / this.chunkSize); 9886 this.chunkIndex = 0; 9887 } 9888 create(callback) { 9889 this.callback = callback; 9890 this.md5Buffer = new SparkMD5.ArrayBuffer(); 9891 this.fileReader = new FileReader(); 9892 this.fileReader.addEventListener("load", (event2) => this.fileReaderDidLoad(event2)); 9893 this.fileReader.addEventListener("error", (event2) => this.fileReaderDidError(event2)); 9894 this.readNextChunk(); 9895 } 9896 fileReaderDidLoad(event2) { 9897 this.md5Buffer.append(event2.target.result); 9898 if (!this.readNextChunk()) { 9899 const binaryDigest = this.md5Buffer.end(true); 9900 const base64digest = btoa(binaryDigest); 9901 this.callback(null, base64digest); 9902 } 9903 } 9904 fileReaderDidError(event2) { 9905 this.callback(`Error reading ${this.file.name}`); 9906 } 9907 readNextChunk() { 9908 if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) { 9909 const start5 = this.chunkIndex * this.chunkSize; 9910 const end2 = Math.min(start5 + this.chunkSize, this.file.size); 9911 const bytes = fileSlice.call(this.file, start5, end2); 9912 this.fileReader.readAsArrayBuffer(bytes); 9913 this.chunkIndex++; 9914 return true; 9915 } else { 9916 return false; 9917 } 9918 } 9919 }; 9920 function getMetaValue(name) { 9921 const element = findElement(document.head, `meta[name="${name}"]`); 9922 if (element) { 9923 return element.getAttribute("content"); 9924 } 9925 } 9926 function findElements(root, selector) { 9927 if (typeof root == "string") { 9928 selector = root; 9929 root = document; 9930 } 9931 const elements = root.querySelectorAll(selector); 9932 return toArray(elements); 9933 } 9934 function findElement(root, selector) { 9935 if (typeof root == "string") { 9936 selector = root; 9937 root = document; 9938 } 9939 return root.querySelector(selector); 9940 } 9941 function dispatchEvent2(element, type, eventInit = {}) { 9942 const { disabled } = element; 9943 const { bubbles, cancelable, detail } = eventInit; 9944 const event2 = document.createEvent("Event"); 9945 event2.initEvent(type, bubbles || true, cancelable || true); 9946 event2.detail = detail || {}; 9947 try { 9948 element.disabled = false; 9949 element.dispatchEvent(event2); 9950 } finally { 9951 element.disabled = disabled; 9952 } 9953 return event2; 9954 } 9955 function toArray(value) { 9956 if (Array.isArray(value)) { 9957 return value; 9958 } else if (Array.from) { 9959 return Array.from(value); 9960 } else { 9961 return [].slice.call(value); 9962 } 9963 } 9964 var BlobRecord = class { 9965 constructor(file, checksum, url, customHeaders = {}) { 9966 this.file = file; 9967 this.attributes = { 9968 filename: file.name, 9969 content_type: file.type || "application/octet-stream", 9970 byte_size: file.size, 9971 checksum 9972 }; 9973 this.xhr = new XMLHttpRequest(); 9974 this.xhr.open("POST", url, true); 9975 this.xhr.responseType = "json"; 9976 this.xhr.setRequestHeader("Content-Type", "application/json"); 9977 this.xhr.setRequestHeader("Accept", "application/json"); 9978 this.xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 9979 Object.keys(customHeaders).forEach((headerKey) => { 9980 this.xhr.setRequestHeader(headerKey, customHeaders[headerKey]); 9981 }); 9982 const csrfToken2 = getMetaValue("csrf-token"); 9983 if (csrfToken2 != void 0) { 9984 this.xhr.setRequestHeader("X-CSRF-Token", csrfToken2); 9985 } 9986 this.xhr.addEventListener("load", (event2) => this.requestDidLoad(event2)); 9987 this.xhr.addEventListener("error", (event2) => this.requestDidError(event2)); 9988 } 9989 get status() { 9990 return this.xhr.status; 9991 } 9992 get response() { 9993 const { responseType, response } = this.xhr; 9994 if (responseType == "json") { 9995 return response; 9996 } else { 9997 return JSON.parse(response); 9998 } 9999 } 10000 create(callback) { 10001 this.callback = callback; 10002 this.xhr.send(JSON.stringify({ 10003 blob: this.attributes 10004 })); 10005 } 10006 requestDidLoad(event2) { 10007 if (this.status >= 200 && this.status < 300) { 10008 const { response } = this; 10009 const { direct_upload } = response; 10010 delete response.direct_upload; 10011 this.attributes = response; 10012 this.directUploadData = direct_upload; 10013 this.callback(null, this.toJSON()); 10014 } else { 10015 this.requestDidError(event2); 10016 } 10017 } 10018 requestDidError(event2) { 10019 this.callback(`Error creating Blob for "${this.file.name}". Status: ${this.status}`); 10020 } 10021 toJSON() { 10022 const result = {}; 10023 for (const key in this.attributes) { 10024 result[key] = this.attributes[key]; 10025 } 10026 return result; 10027 } 10028 }; 10029 var BlobUpload = class { 10030 constructor(blob) { 10031 this.blob = blob; 10032 this.file = blob.file; 10033 const { url, headers } = blob.directUploadData; 10034 this.xhr = new XMLHttpRequest(); 10035 this.xhr.open("PUT", url, true); 10036 this.xhr.responseType = "text"; 10037 for (const key in headers) { 10038 this.xhr.setRequestHeader(key, headers[key]); 10039 } 10040 this.xhr.addEventListener("load", (event2) => this.requestDidLoad(event2)); 10041 this.xhr.addEventListener("error", (event2) => this.requestDidError(event2)); 10042 } 10043 create(callback) { 10044 this.callback = callback; 10045 this.xhr.send(this.file.slice()); 10046 } 10047 requestDidLoad(event2) { 10048 const { status, response } = this.xhr; 10049 if (status >= 200 && status < 300) { 10050 this.callback(null, response); 10051 } else { 10052 this.requestDidError(event2); 10053 } 10054 } 10055 requestDidError(event2) { 10056 this.callback(`Error storing "${this.file.name}". Status: ${this.xhr.status}`); 10057 } 10058 }; 10059 var id = 0; 10060 var DirectUpload = class { 10061 constructor(file, url, delegate2, customHeaders = {}) { 10062 this.id = ++id; 10063 this.file = file; 10064 this.url = url; 10065 this.delegate = delegate2; 10066 this.customHeaders = customHeaders; 10067 } 10068 create(callback) { 10069 FileChecksum.create(this.file, (error2, checksum) => { 10070 if (error2) { 10071 callback(error2); 10072 return; 10073 } 10074 const blob = new BlobRecord(this.file, checksum, this.url, this.customHeaders); 10075 notify(this.delegate, "directUploadWillCreateBlobWithXHR", blob.xhr); 10076 blob.create((error3) => { 10077 if (error3) { 10078 callback(error3); 10079 } else { 10080 const upload = new BlobUpload(blob); 10081 notify(this.delegate, "directUploadWillStoreFileWithXHR", upload.xhr); 10082 upload.create((error4) => { 10083 if (error4) { 10084 callback(error4); 10085 } else { 10086 callback(null, blob.toJSON()); 10087 } 10088 }); 10089 } 10090 }); 10091 }); 10092 } 10093 }; 10094 function notify(object, methodName, ...messages) { 10095 if (object && typeof object[methodName] == "function") { 10096 return object[methodName](...messages); 10097 } 10098 } 10099 var DirectUploadController = class { 10100 constructor(input, file) { 10101 this.input = input; 10102 this.file = file; 10103 this.directUpload = new DirectUpload(this.file, this.url, this); 10104 this.dispatch("initialize"); 10105 } 10106 start(callback) { 10107 const hiddenInput = document.createElement("input"); 10108 hiddenInput.type = "hidden"; 10109 hiddenInput.name = this.input.name; 10110 this.input.insertAdjacentElement("beforebegin", hiddenInput); 10111 this.dispatch("start"); 10112 this.directUpload.create((error2, attributes) => { 10113 if (error2) { 10114 hiddenInput.parentNode.removeChild(hiddenInput); 10115 this.dispatchError(error2); 10116 } else { 10117 hiddenInput.value = attributes.signed_id; 10118 } 10119 this.dispatch("end"); 10120 callback(error2); 10121 }); 10122 } 10123 uploadRequestDidProgress(event2) { 10124 const progress = event2.loaded / event2.total * 100; 10125 if (progress) { 10126 this.dispatch("progress", { 10127 progress 10128 }); 10129 } 10130 } 10131 get url() { 10132 return this.input.getAttribute("data-direct-upload-url"); 10133 } 10134 dispatch(name, detail = {}) { 10135 detail.file = this.file; 10136 detail.id = this.directUpload.id; 10137 return dispatchEvent2(this.input, `direct-upload:${name}`, { 10138 detail 10139 }); 10140 } 10141 dispatchError(error2) { 10142 const event2 = this.dispatch("error", { 10143 error: error2 10144 }); 10145 if (!event2.defaultPrevented) { 10146 alert(error2); 10147 } 10148 } 10149 directUploadWillCreateBlobWithXHR(xhr) { 10150 this.dispatch("before-blob-request", { 10151 xhr 10152 }); 10153 } 10154 directUploadWillStoreFileWithXHR(xhr) { 10155 this.dispatch("before-storage-request", { 10156 xhr 10157 }); 10158 xhr.upload.addEventListener("progress", (event2) => this.uploadRequestDidProgress(event2)); 10159 } 10160 }; 10161 var inputSelector = "input[type=file][data-direct-upload-url]:not([disabled])"; 10162 var DirectUploadsController = class { 10163 constructor(form) { 10164 this.form = form; 10165 this.inputs = findElements(form, inputSelector).filter((input) => input.files.length); 10166 } 10167 start(callback) { 10168 const controllers = this.createDirectUploadControllers(); 10169 const startNextController = () => { 10170 const controller = controllers.shift(); 10171 if (controller) { 10172 controller.start((error2) => { 10173 if (error2) { 10174 callback(error2); 10175 this.dispatch("end"); 10176 } else { 10177 startNextController(); 10178 } 10179 }); 10180 } else { 10181 callback(); 10182 this.dispatch("end"); 10183 } 10184 }; 10185 this.dispatch("start"); 10186 startNextController(); 10187 } 10188 createDirectUploadControllers() { 10189 const controllers = []; 10190 this.inputs.forEach((input) => { 10191 toArray(input.files).forEach((file) => { 10192 const controller = new DirectUploadController(input, file); 10193 controllers.push(controller); 10194 }); 10195 }); 10196 return controllers; 10197 } 10198 dispatch(name, detail = {}) { 10199 return dispatchEvent2(this.form, `direct-uploads:${name}`, { 10200 detail 10201 }); 10202 } 10203 }; 10204 var processingAttribute = "data-direct-uploads-processing"; 10205 var submitButtonsByForm = /* @__PURE__ */ new WeakMap(); 10206 var started = false; 10207 function start2() { 10208 if (!started) { 10209 started = true; 10210 document.addEventListener("click", didClick, true); 10211 document.addEventListener("submit", didSubmitForm, true); 10212 document.addEventListener("ajax:before", didSubmitRemoteElement); 10213 } 10214 } 10215 function didClick(event2) { 10216 const button = event2.target.closest("button, input"); 10217 if (button && button.type === "submit" && button.form) { 10218 submitButtonsByForm.set(button.form, button); 10219 } 10220 } 10221 function didSubmitForm(event2) { 10222 handleFormSubmissionEvent(event2); 10223 } 10224 function didSubmitRemoteElement(event2) { 10225 if (event2.target.tagName == "FORM") { 10226 handleFormSubmissionEvent(event2); 10227 } 10228 } 10229 function handleFormSubmissionEvent(event2) { 10230 const form = event2.target; 10231 if (form.hasAttribute(processingAttribute)) { 10232 event2.preventDefault(); 10233 return; 10234 } 10235 const controller = new DirectUploadsController(form); 10236 const { inputs } = controller; 10237 if (inputs.length) { 10238 event2.preventDefault(); 10239 form.setAttribute(processingAttribute, ""); 10240 inputs.forEach(disable); 10241 controller.start((error2) => { 10242 form.removeAttribute(processingAttribute); 10243 if (error2) { 10244 inputs.forEach(enable); 10245 } else { 10246 submitForm(form); 10247 } 10248 }); 10249 } 10250 } 10251 function submitForm(form) { 10252 let button = submitButtonsByForm.get(form) || findElement(form, "input[type=submit], button[type=submit]"); 10253 if (button) { 10254 const { disabled } = button; 10255 button.disabled = false; 10256 button.focus(); 10257 button.click(); 10258 button.disabled = disabled; 10259 } else { 10260 button = document.createElement("input"); 10261 button.type = "submit"; 10262 button.style.display = "none"; 10263 form.appendChild(button); 10264 button.click(); 10265 form.removeChild(button); 10266 } 10267 submitButtonsByForm.delete(form); 10268 } 10269 function disable(input) { 10270 input.disabled = true; 10271 } 10272 function enable(input) { 10273 input.disabled = false; 10274 } 10275 function autostart() { 10276 if (window.ActiveStorage) { 10277 start2(); 10278 } 10279 } 10280 setTimeout(autostart, 1); 10281 var AttachmentUpload = class { 10282 constructor(attachment, element) { 10283 this.attachment = attachment; 10284 this.element = element; 10285 this.directUpload = new DirectUpload(attachment.file, this.directUploadUrl, this); 10286 } 10287 start() { 10288 this.directUpload.create(this.directUploadDidComplete.bind(this)); 10289 } 10290 directUploadWillStoreFileWithXHR(xhr) { 10291 xhr.upload.addEventListener("progress", (event2) => { 10292 const progress = event2.loaded / event2.total * 100; 10293 this.attachment.setUploadProgress(progress); 10294 }); 10295 } 10296 directUploadDidComplete(error2, attributes) { 10297 if (error2) { 10298 throw new Error(`Direct upload failed: ${error2}`); 10299 } 10300 this.attachment.setAttributes({ 10301 sgid: attributes.attachable_sgid, 10302 url: this.createBlobUrl(attributes.signed_id, attributes.filename) 10303 }); 10304 } 10305 createBlobUrl(signedId, filename) { 10306 return this.blobUrlTemplate.replace(":signed_id", signedId).replace(":filename", encodeURIComponent(filename)); 10307 } 10308 get directUploadUrl() { 10309 return this.element.dataset.directUploadUrl; 10310 } 10311 get blobUrlTemplate() { 10312 return this.element.dataset.blobUrlTemplate; 10313 } 10314 }; 10315 addEventListener("trix-attachment-add", (event2) => { 10316 const { attachment, target } = event2; 10317 if (attachment.file) { 10318 const upload = new AttachmentUpload(attachment, target); 10319 upload.start(); 10320 } 10321 }); 10322 10323
vendor: 270,774 bytes, lines 10323-16245
10323// node_modules/trix/dist/trix.esm.min.js 10324 var t = "2.1.11"; 10325 var e = "[data-trix-attachment]"; 10326 var i = { preview: { presentation: "gallery", caption: { name: true, size: true } }, file: { caption: { size: true } } }; 10327 var n = { default: { tagName: "div", parse: false }, quote: { tagName: "blockquote", nestable: true }, heading1: { tagName: "h1", terminal: true, breakOnReturn: true, group: false }, code: { tagName: "pre", terminal: true, htmlAttributes: ["language"], text: { plaintext: true } }, bulletList: { tagName: "ul", parse: false }, bullet: { tagName: "li", listAttribute: "bulletList", group: false, nestable: true, test(t5) { 10328 return r(t5.parentNode) === n[this.listAttribute].tagName; 10329 } }, numberList: { tagName: "ol", parse: false }, number: { tagName: "li", listAttribute: "numberList", group: false, nestable: true, test(t5) { 10330 return r(t5.parentNode) === n[this.listAttribute].tagName; 10331 } }, attachmentGallery: { tagName: "div", exclusive: true, terminal: true, parse: false, group: false } }; 10332 var r = (t5) => { 10333 var e4; 10334 return null == t5 || null === (e4 = t5.tagName) || void 0 === e4 ? void 0 : e4.toLowerCase(); 10335 }; 10336 var o = navigator.userAgent.match(/android\s([0-9]+.*Chrome)/i); 10337 var s = o && parseInt(o[1]); 10338 var a = { composesExistingText: /Android.*Chrome/.test(navigator.userAgent), recentAndroid: s && s > 12, samsungAndroid: s && navigator.userAgent.match(/Android.*SM-/), forcesObjectResizing: /Trident.*rv:11/.test(navigator.userAgent), supportsInputEvents: "undefined" != typeof InputEvent && ["data", "getTargetRanges", "inputType"].every((t5) => t5 in InputEvent.prototype) }; 10339 var l = { ADD_ATTR: ["language"], SAFE_FOR_XML: false, RETURN_DOM: true }; 10340 var c = { attachFiles: "Attach Files", bold: "Bold", bullets: "Bullets", byte: "Byte", bytes: "Bytes", captionPlaceholder: "Add a caption\u2026", code: "Code", heading1: "Heading", indent: "Increase Level", italic: "Italic", link: "Link", numbers: "Numbers", outdent: "Decrease Level", quote: "Quote", redo: "Redo", remove: "Remove", strike: "Strikethrough", undo: "Undo", unlink: "Unlink", url: "URL", urlPlaceholder: "Enter a URL\u2026", GB: "GB", KB: "KB", MB: "MB", PB: "PB", TB: "TB" }; 10341 var u = [c.bytes, c.KB, c.MB, c.GB, c.TB, c.PB]; 10342 var h = { prefix: "IEC", precision: 2, formatter(t5) { 10343 switch (t5) { 10344 case 0: 10345 return "0 ".concat(c.bytes); 10346 case 1: 10347 return "1 ".concat(c.byte); 10348 default: 10349 let e4; 10350 "SI" === this.prefix ? e4 = 1e3 : "IEC" === this.prefix && (e4 = 1024); 10351 const i4 = Math.floor(Math.log(t5) / Math.log(e4)), n3 = (t5 / Math.pow(e4, i4)).toFixed(this.precision).replace(/0*$/, "").replace(/\.$/, ""); 10352 return "".concat(n3, " ").concat(u[i4]); 10353 } 10354 } }; 10355 var d = "\uFEFF"; 10356 var g = "\xA0"; 10357 var m = function(t5) { 10358 for (const e4 in t5) { 10359 const i4 = t5[e4]; 10360 this[e4] = i4; 10361 } 10362 return this; 10363 }; 10364 var p = document.documentElement; 10365 var f = p.matches; 10366 var b = function(t5) { 10367 let { onElement: e4, matchingSelector: i4, withCallback: n3, inPhase: r4, preventDefault: o3, times: s4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10368 const a4 = e4 || p, l4 = i4, c4 = "capturing" === r4, u4 = function(t6) { 10369 null != s4 && 0 == --s4 && u4.destroy(); 10370 const e5 = y(t6.target, { matchingSelector: l4 }); 10371 null != e5 && (null == n3 || n3.call(e5, t6, e5), o3 && t6.preventDefault()); 10372 }; 10373 return u4.destroy = () => a4.removeEventListener(t5, u4, c4), a4.addEventListener(t5, u4, c4), u4; 10374 }; 10375 var v = function(t5) { 10376 let { onElement: e4, bubbles: i4, cancelable: n3, attributes: r4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10377 const o3 = null != e4 ? e4 : p; 10378 i4 = false !== i4, n3 = false !== n3; 10379 const s4 = document.createEvent("Events"); 10380 return s4.initEvent(t5, i4, n3), null != r4 && m.call(s4, r4), o3.dispatchEvent(s4); 10381 }; 10382 var A = function(t5, e4) { 10383 if (1 === (null == t5 ? void 0 : t5.nodeType)) 10384 return f.call(t5, e4); 10385 }; 10386 var y = function(t5) { 10387 let { matchingSelector: e4, untilNode: i4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10388 for (; t5 && t5.nodeType !== Node.ELEMENT_NODE; ) 10389 t5 = t5.parentNode; 10390 if (null != t5) { 10391 if (null == e4) 10392 return t5; 10393 if (t5.closest && null == i4) 10394 return t5.closest(e4); 10395 for (; t5 && t5 !== i4; ) { 10396 if (A(t5, e4)) 10397 return t5; 10398 t5 = t5.parentNode; 10399 } 10400 } 10401 }; 10402 var x = (t5) => document.activeElement !== t5 && C(t5, document.activeElement); 10403 var C = function(t5, e4) { 10404 if (t5 && e4) 10405 for (; e4; ) { 10406 if (e4 === t5) 10407 return true; 10408 e4 = e4.parentNode; 10409 } 10410 }; 10411 var E = function(t5) { 10412 var e4; 10413 if (null === (e4 = t5) || void 0 === e4 || !e4.parentNode) 10414 return; 10415 let i4 = 0; 10416 for (t5 = t5.previousSibling; t5; ) 10417 i4++, t5 = t5.previousSibling; 10418 return i4; 10419 }; 10420 var S = (t5) => { 10421 var e4; 10422 return null == t5 || null === (e4 = t5.parentNode) || void 0 === e4 ? void 0 : e4.removeChild(t5); 10423 }; 10424 var R = function(t5) { 10425 let { onlyNodesOfType: e4, usingFilter: i4, expandEntityReferences: n3 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10426 const r4 = (() => { 10427 switch (e4) { 10428 case "element": 10429 return NodeFilter.SHOW_ELEMENT; 10430 case "text": 10431 return NodeFilter.SHOW_TEXT; 10432 case "comment": 10433 return NodeFilter.SHOW_COMMENT; 10434 default: 10435 return NodeFilter.SHOW_ALL; 10436 } 10437 })(); 10438 return document.createTreeWalker(t5, r4, null != i4 ? i4 : null, true === n3); 10439 }; 10440 var k = (t5) => { 10441 var e4; 10442 return null == t5 || null === (e4 = t5.tagName) || void 0 === e4 ? void 0 : e4.toLowerCase(); 10443 }; 10444 var T = function(t5) { 10445 let e4, i4, n3 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10446 "object" == typeof t5 ? (n3 = t5, t5 = n3.tagName) : n3 = { attributes: n3 }; 10447 const r4 = document.createElement(t5); 10448 if (null != n3.editable && (null == n3.attributes && (n3.attributes = {}), n3.attributes.contenteditable = n3.editable), n3.attributes) 10449 for (e4 in n3.attributes) 10450 i4 = n3.attributes[e4], r4.setAttribute(e4, i4); 10451 if (n3.style) 10452 for (e4 in n3.style) 10453 i4 = n3.style[e4], r4.style[e4] = i4; 10454 if (n3.data) 10455 for (e4 in n3.data) 10456 i4 = n3.data[e4], r4.dataset[e4] = i4; 10457 return n3.className && n3.className.split(" ").forEach((t6) => { 10458 r4.classList.add(t6); 10459 }), n3.textContent && (r4.textContent = n3.textContent), n3.childNodes && [].concat(n3.childNodes).forEach((t6) => { 10460 r4.appendChild(t6); 10461 }), r4; 10462 }; 10463 var w; 10464 var L = function() { 10465 if (null != w) 10466 return w; 10467 w = []; 10468 for (const t5 in n) { 10469 const e4 = n[t5]; 10470 e4.tagName && w.push(e4.tagName); 10471 } 10472 return w; 10473 }; 10474 var D = (t5) => I(null == t5 ? void 0 : t5.firstChild); 10475 var N = function(t5) { 10476 let { strict: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { strict: true }; 10477 return e4 ? I(t5) : I(t5) || !I(t5.firstChild) && function(t6) { 10478 return L().includes(k(t6)) && !L().includes(k(t6.firstChild)); 10479 }(t5); 10480 }; 10481 var I = (t5) => O(t5) && "block" === (null == t5 ? void 0 : t5.data); 10482 var O = (t5) => (null == t5 ? void 0 : t5.nodeType) === Node.COMMENT_NODE; 10483 var F = function(t5) { 10484 let { name: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10485 if (t5) 10486 return B(t5) ? t5.data === d ? !e4 || t5.parentNode.dataset.trixCursorTarget === e4 : void 0 : F(t5.firstChild); 10487 }; 10488 var P = (t5) => A(t5, e); 10489 var M = (t5) => B(t5) && "" === (null == t5 ? void 0 : t5.data); 10490 var B = (t5) => (null == t5 ? void 0 : t5.nodeType) === Node.TEXT_NODE; 10491 var _ = { level2Enabled: true, getLevel() { 10492 return this.level2Enabled && a.supportsInputEvents ? 2 : 0; 10493 }, pickFiles(t5) { 10494 const e4 = T("input", { type: "file", multiple: true, hidden: true, id: this.fileInputId }); 10495 e4.addEventListener("change", () => { 10496 t5(e4.files), S(e4); 10497 }), S(document.getElementById(this.fileInputId)), document.body.appendChild(e4), e4.click(); 10498 } }; 10499 var j = { removeBlankTableCells: false, tableCellSeparator: " | ", tableRowSeparator: "\n" }; 10500 var W = { bold: { tagName: "strong", inheritable: true, parser(t5) { 10501 const e4 = window.getComputedStyle(t5); 10502 return "bold" === e4.fontWeight || e4.fontWeight >= 600; 10503 } }, italic: { tagName: "em", inheritable: true, parser: (t5) => "italic" === window.getComputedStyle(t5).fontStyle }, href: { groupTagName: "a", parser(t5) { 10504 const i4 = "a:not(".concat(e, ")"), n3 = t5.closest(i4); 10505 if (n3) 10506 return n3.getAttribute("href"); 10507 } }, strike: { tagName: "del", inheritable: true }, frozen: { style: { backgroundColor: "highlight" } } }; 10508 var U = { getDefaultHTML: () => '<div class="trix-button-row">\n <span class="trix-button-group trix-button-group--text-tools" data-trix-button-group="text-tools">\n <button type="button" class="trix-button trix-button--icon trix-button--icon-bold" data-trix-attribute="bold" data-trix-key="b" title="'.concat(c.bold, '" tabindex="-1">').concat(c.bold, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-italic" data-trix-attribute="italic" data-trix-key="i" title="').concat(c.italic, '" tabindex="-1">').concat(c.italic, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-strike" data-trix-attribute="strike" title="').concat(c.strike, '" tabindex="-1">').concat(c.strike, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-link" data-trix-attribute="href" data-trix-action="link" data-trix-key="k" title="').concat(c.link, '" tabindex="-1">').concat(c.link, '</button>\n </span>\n\n <span class="trix-button-group trix-button-group--block-tools" data-trix-button-group="block-tools">\n <button type="button" class="trix-button trix-button--icon trix-button--icon-heading-1" data-trix-attribute="heading1" title="').concat(c.heading1, '" tabindex="-1">').concat(c.heading1, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-quote" data-trix-attribute="quote" title="').concat(c.quote, '" tabindex="-1">').concat(c.quote, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-code" data-trix-attribute="code" title="').concat(c.code, '" tabindex="-1">').concat(c.code, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-bullet-list" data-trix-attribute="bullet" title="').concat(c.bullets, '" tabindex="-1">').concat(c.bullets, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-number-list" data-trix-attribute="number" title="').concat(c.numbers, '" tabindex="-1">').concat(c.numbers, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-decrease-nesting-level" data-trix-action="decreaseNestingLevel" title="').concat(c.outdent, '" tabindex="-1">').concat(c.outdent, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-increase-nesting-level" data-trix-action="increaseNestingLevel" title="').concat(c.indent, '" tabindex="-1">').concat(c.indent, '</button>\n </span>\n\n <span class="trix-button-group trix-button-group--file-tools" data-trix-button-group="file-tools">\n <button type="button" class="trix-button trix-button--icon trix-button--icon-attach" data-trix-action="attachFiles" title="').concat(c.attachFiles, '" tabindex="-1">').concat(c.attachFiles, '</button>\n </span>\n\n <span class="trix-button-group-spacer"></span>\n\n <span class="trix-button-group trix-button-group--history-tools" data-trix-button-group="history-tools">\n <button type="button" class="trix-button trix-button--icon trix-button--icon-undo" data-trix-action="undo" data-trix-key="z" title="').concat(c.undo, '" tabindex="-1">').concat(c.undo, '</button>\n <button type="button" class="trix-button trix-button--icon trix-button--icon-redo" data-trix-action="redo" data-trix-key="shift+z" title="').concat(c.redo, '" tabindex="-1">').concat(c.redo, '</button>\n </span>\n </div>\n\n <div class="trix-dialogs" data-trix-dialogs>\n <div class="trix-dialog trix-dialog--link" data-trix-dialog="href" data-trix-dialog-attribute="href">\n <div class="trix-dialog__link-fields">\n <input type="url" name="href" class="trix-input trix-input--dialog" placeholder="').concat(c.urlPlaceholder, '" aria-label="').concat(c.url, '" required data-trix-input>\n <div class="trix-button-group">\n <input type="button" class="trix-button trix-button--dialog" value="').concat(c.link, '" data-trix-method="setAttribute">\n <input type="button" class="trix-button trix-button--dialog" value="').concat(c.unlink, '" data-trix-method="removeAttribute">\n </div>\n </div>\n </div>\n </div>') }; 10509 var V = { interval: 5e3 }; 10510 var z = Object.freeze({ __proto__: null, attachments: i, blockAttributes: n, browser: a, css: { attachment: "attachment", attachmentCaption: "attachment__caption", attachmentCaptionEditor: "attachment__caption-editor", attachmentMetadata: "attachment__metadata", attachmentMetadataContainer: "attachment__metadata-container", attachmentName: "attachment__name", attachmentProgress: "attachment__progress", attachmentSize: "attachment__size", attachmentToolbar: "attachment__toolbar", attachmentGallery: "attachment-gallery" }, dompurify: l, fileSize: h, input: _, keyNames: { 8: "backspace", 9: "tab", 13: "return", 27: "escape", 37: "left", 39: "right", 46: "delete", 68: "d", 72: "h", 79: "o" }, lang: c, parser: j, textAttributes: W, toolbar: U, undo: V }); 10511 var q = class { 10512 static proxyMethod(t5) { 10513 const { name: e4, toMethod: i4, toProperty: n3, optional: r4 } = H(t5); 10514 this.prototype[e4] = function() { 10515 let t6, o3; 10516 var s4, a4; 10517 i4 ? o3 = r4 ? null === (s4 = this[i4]) || void 0 === s4 ? void 0 : s4.call(this) : this[i4]() : n3 && (o3 = this[n3]); 10518 return r4 ? (t6 = null === (a4 = o3) || void 0 === a4 ? void 0 : a4[e4], t6 ? J.call(t6, o3, arguments) : void 0) : (t6 = o3[e4], J.call(t6, o3, arguments)); 10519 }; 10520 } 10521 }; 10522 var H = function(t5) { 10523 const e4 = t5.match(K); 10524 if (!e4) 10525 throw new Error("can't parse @proxyMethod expression: ".concat(t5)); 10526 const i4 = { name: e4[4] }; 10527 return null != e4[2] ? i4.toMethod = e4[1] : i4.toProperty = e4[1], null != e4[3] && (i4.optional = true), i4; 10528 }; 10529 var { apply: J } = Function.prototype; 10530 var K = new RegExp("^(.+?)(\\(\\))?(\\?)?\\.(.+?)$"); 10531 var G; 10532 var Y; 10533 var $; 10534 var X = class extends q { 10535 static box() { 10536 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ""; 10537 return t5 instanceof this ? t5 : this.fromUCS2String(null == t5 ? void 0 : t5.toString()); 10538 } 10539 static fromUCS2String(t5) { 10540 return new this(t5, et(t5)); 10541 } 10542 static fromCodepoints(t5) { 10543 return new this(it(t5), t5); 10544 } 10545 constructor(t5, e4) { 10546 super(...arguments), this.ucs2String = t5, this.codepoints = e4, this.length = this.codepoints.length, this.ucs2Length = this.ucs2String.length; 10547 } 10548 offsetToUCS2Offset(t5) { 10549 return it(this.codepoints.slice(0, Math.max(0, t5))).length; 10550 } 10551 offsetFromUCS2Offset(t5) { 10552 return et(this.ucs2String.slice(0, Math.max(0, t5))).length; 10553 } 10554 slice() { 10555 return this.constructor.fromCodepoints(this.codepoints.slice(...arguments)); 10556 } 10557 charAt(t5) { 10558 return this.slice(t5, t5 + 1); 10559 } 10560 isEqualTo(t5) { 10561 return this.constructor.box(t5).ucs2String === this.ucs2String; 10562 } 10563 toJSON() { 10564 return this.ucs2String; 10565 } 10566 getCacheKey() { 10567 return this.ucs2String; 10568 } 10569 toString() { 10570 return this.ucs2String; 10571 } 10572 }; 10573 var Z = 1 === (null === (G = Array.from) || void 0 === G ? void 0 : G.call(Array, "\u{1F47C}").length); 10574 var Q = null != (null === (Y = " ".codePointAt) || void 0 === Y ? void 0 : Y.call(" ", 0)); 10575 var tt = " \u{1F47C}" === (null === ($ = String.fromCodePoint) || void 0 === $ ? void 0 : $.call(String, 32, 128124)); 10576 var et; 10577 var it; 10578 et = Z && Q ? (t5) => Array.from(t5).map((t6) => t6.codePointAt(0)) : function(t5) { 10579 const e4 = []; 10580 let i4 = 0; 10581 const { length: n3 } = t5; 10582 for (; i4 < n3; ) { 10583 let r4 = t5.charCodeAt(i4++); 10584 if (55296 <= r4 && r4 <= 56319 && i4 < n3) { 10585 const e5 = t5.charCodeAt(i4++); 10586 56320 == (64512 & e5) ? r4 = ((1023 & r4) << 10) + (1023 & e5) + 65536 : i4--; 10587 } 10588 e4.push(r4); 10589 } 10590 return e4; 10591 }, it = tt ? (t5) => String.fromCodePoint(...Array.from(t5 || [])) : function(t5) { 10592 return (() => { 10593 const e4 = []; 10594 return Array.from(t5).forEach((t6) => { 10595 let i4 = ""; 10596 t6 > 65535 && (t6 -= 65536, i4 += String.fromCharCode(t6 >>> 10 & 1023 | 55296), t6 = 56320 | 1023 & t6), e4.push(i4 + String.fromCharCode(t6)); 10597 }), e4; 10598 })().join(""); 10599 }; 10600 var nt = 0; 10601 var rt = class extends q { 10602 static fromJSONString(t5) { 10603 return this.fromJSON(JSON.parse(t5)); 10604 } 10605 constructor() { 10606 super(...arguments), this.id = ++nt; 10607 } 10608 hasSameConstructorAs(t5) { 10609 return this.constructor === (null == t5 ? void 0 : t5.constructor); 10610 } 10611 isEqualTo(t5) { 10612 return this === t5; 10613 } 10614 inspect() { 10615 const t5 = [], e4 = this.contentsForInspection() || {}; 10616 for (const i4 in e4) { 10617 const n3 = e4[i4]; 10618 t5.push("".concat(i4, "=").concat(n3)); 10619 } 10620 return "#<".concat(this.constructor.name, ":").concat(this.id).concat(t5.length ? " ".concat(t5.join(", ")) : "", ">"); 10621 } 10622 contentsForInspection() { 10623 } 10624 toJSONString() { 10625 return JSON.stringify(this); 10626 } 10627 toUTF16String() { 10628 return X.box(this); 10629 } 10630 getCacheKey() { 10631 return this.id.toString(); 10632 } 10633 }; 10634 var ot = function() { 10635 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : []; 10636 if (t5.length !== e4.length) 10637 return false; 10638 for (let i4 = 0; i4 < t5.length; i4++) { 10639 if (t5[i4] !== e4[i4]) 10640 return false; 10641 } 10642 return true; 10643 }; 10644 var st = function(t5) { 10645 const e4 = t5.slice(0); 10646 for (var i4 = arguments.length, n3 = new Array(i4 > 1 ? i4 - 1 : 0), r4 = 1; r4 < i4; r4++) 10647 n3[r4 - 1] = arguments[r4]; 10648 return e4.splice(...n3), e4; 10649 }; 10650 var at = /[\u05BE\u05C0\u05C3\u05D0-\u05EA\u05F0-\u05F4\u061B\u061F\u0621-\u063A\u0640-\u064A\u066D\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D5\u06E5\u06E6\u200F\u202B\u202E\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE72\uFE74\uFE76-\uFEFC]/; 10651 var lt = function() { 10652 const t5 = T("input", { dir: "auto", name: "x", dirName: "x.dir" }), e4 = T("textarea", { dir: "auto", name: "y", dirName: "y.dir" }), i4 = T("form"); 10653 i4.appendChild(t5), i4.appendChild(e4); 10654 const n3 = function() { 10655 try { 10656 return new FormData(i4).has(e4.dirName); 10657 } catch (t6) { 10658 return false; 10659 } 10660 }(), r4 = function() { 10661 try { 10662 return t5.matches(":dir(ltr),:dir(rtl)"); 10663 } catch (t6) { 10664 return false; 10665 } 10666 }(); 10667 return n3 ? function(t6) { 10668 return e4.value = t6, new FormData(i4).get(e4.dirName); 10669 } : r4 ? function(e5) { 10670 return t5.value = e5, t5.matches(":dir(rtl)") ? "rtl" : "ltr"; 10671 } : function(t6) { 10672 const e5 = t6.trim().charAt(0); 10673 return at.test(e5) ? "rtl" : "ltr"; 10674 }; 10675 }(); 10676 var ct = null; 10677 var ut = null; 10678 var ht = null; 10679 var dt = null; 10680 var gt = () => (ct || (ct = bt().concat(pt())), ct); 10681 var mt = (t5) => n[t5]; 10682 var pt = () => (ut || (ut = Object.keys(n)), ut); 10683 var ft = (t5) => W[t5]; 10684 var bt = () => (ht || (ht = Object.keys(W)), ht); 10685 var vt = function(t5, e4) { 10686 At(t5).textContent = e4.replace(/%t/g, t5); 10687 }; 10688 var At = function(t5) { 10689 const e4 = document.createElement("style"); 10690 e4.setAttribute("type", "text/css"), e4.setAttribute("data-tag-name", t5.toLowerCase()); 10691 const i4 = yt(); 10692 return i4 && e4.setAttribute("nonce", i4), document.head.insertBefore(e4, document.head.firstChild), e4; 10693 }; 10694 var yt = function() { 10695 const t5 = xt("trix-csp-nonce") || xt("csp-nonce"); 10696 if (t5) { 10697 const { nonce: e4, content: i4 } = t5; 10698 return "" == e4 ? i4 : e4; 10699 } 10700 }; 10701 var xt = (t5) => document.head.querySelector("meta[name=".concat(t5, "]")); 10702 var Ct = { "application/x-trix-feature-detection": "test" }; 10703 var Et = function(t5) { 10704 const e4 = t5.getData("text/plain"), i4 = t5.getData("text/html"); 10705 if (!e4 || !i4) 10706 return null == e4 ? void 0 : e4.length; 10707 { 10708 const { body: t6 } = new DOMParser().parseFromString(i4, "text/html"); 10709 if (t6.textContent === e4) 10710 return !t6.querySelector("*"); 10711 } 10712 }; 10713 var St = /Mac|^iP/.test(navigator.platform) ? (t5) => t5.metaKey : (t5) => t5.ctrlKey; 10714 var Rt = (t5) => setTimeout(t5, 1); 10715 var kt = function() { 10716 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 10717 const e4 = {}; 10718 for (const i4 in t5) { 10719 const n3 = t5[i4]; 10720 e4[i4] = n3; 10721 } 10722 return e4; 10723 }; 10724 var Tt = function() { 10725 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10726 if (Object.keys(t5).length !== Object.keys(e4).length) 10727 return false; 10728 for (const i4 in t5) { 10729 if (t5[i4] !== e4[i4]) 10730 return false; 10731 } 10732 return true; 10733 }; 10734 var wt = function(t5) { 10735 if (null != t5) 10736 return Array.isArray(t5) || (t5 = [t5, t5]), [Nt(t5[0]), Nt(null != t5[1] ? t5[1] : t5[0])]; 10737 }; 10738 var Lt = function(t5) { 10739 if (null == t5) 10740 return; 10741 const [e4, i4] = wt(t5); 10742 return It(e4, i4); 10743 }; 10744 var Dt = function(t5, e4) { 10745 if (null == t5 || null == e4) 10746 return; 10747 const [i4, n3] = wt(t5), [r4, o3] = wt(e4); 10748 return It(i4, r4) && It(n3, o3); 10749 }; 10750 var Nt = function(t5) { 10751 return "number" == typeof t5 ? t5 : kt(t5); 10752 }; 10753 var It = function(t5, e4) { 10754 return "number" == typeof t5 ? t5 === e4 : Tt(t5, e4); 10755 }; 10756 var Ot = class extends q { 10757 constructor() { 10758 super(...arguments), this.update = this.update.bind(this), this.selectionManagers = []; 10759 } 10760 start() { 10761 this.started || (this.started = true, document.addEventListener("selectionchange", this.update, true)); 10762 } 10763 stop() { 10764 if (this.started) 10765 return this.started = false, document.removeEventListener("selectionchange", this.update, true); 10766 } 10767 registerSelectionManager(t5) { 10768 if (!this.selectionManagers.includes(t5)) 10769 return this.selectionManagers.push(t5), this.start(); 10770 } 10771 unregisterSelectionManager(t5) { 10772 if (this.selectionManagers = this.selectionManagers.filter((e4) => e4 !== t5), 0 === this.selectionManagers.length) 10773 return this.stop(); 10774 } 10775 notifySelectionManagersOfSelectionChange() { 10776 return this.selectionManagers.map((t5) => t5.selectionDidChange()); 10777 } 10778 update() { 10779 this.notifySelectionManagersOfSelectionChange(); 10780 } 10781 reset() { 10782 this.update(); 10783 } 10784 }; 10785 var Ft = new Ot(); 10786 var Pt = function() { 10787 const t5 = window.getSelection(); 10788 if (t5.rangeCount > 0) 10789 return t5; 10790 }; 10791 var Mt = function() { 10792 var t5; 10793 const e4 = null === (t5 = Pt()) || void 0 === t5 ? void 0 : t5.getRangeAt(0); 10794 if (e4 && !_t(e4)) 10795 return e4; 10796 }; 10797 var Bt = function(t5) { 10798 const e4 = window.getSelection(); 10799 return e4.removeAllRanges(), e4.addRange(t5), Ft.update(); 10800 }; 10801 var _t = (t5) => jt(t5.startContainer) || jt(t5.endContainer); 10802 var jt = (t5) => !Object.getPrototypeOf(t5); 10803 var Wt = (t5) => t5.replace(new RegExp("".concat(d), "g"), "").replace(new RegExp("".concat(g), "g"), " "); 10804 var Ut = new RegExp("[^\\S".concat(g, "]")); 10805 var Vt = (t5) => t5.replace(new RegExp("".concat(Ut.source), "g"), " ").replace(/\ {2,}/g, " "); 10806 var zt = function(t5, e4) { 10807 if (t5.isEqualTo(e4)) 10808 return ["", ""]; 10809 const i4 = qt(t5, e4), { length: n3 } = i4.utf16String; 10810 let r4; 10811 if (n3) { 10812 const { offset: o3 } = i4, s4 = t5.codepoints.slice(0, o3).concat(t5.codepoints.slice(o3 + n3)); 10813 r4 = qt(e4, X.fromCodepoints(s4)); 10814 } else 10815 r4 = qt(e4, t5); 10816 return [i4.utf16String.toString(), r4.utf16String.toString()]; 10817 }; 10818 var qt = function(t5, e4) { 10819 let i4 = 0, n3 = t5.length, r4 = e4.length; 10820 for (; i4 < n3 && t5.charAt(i4).isEqualTo(e4.charAt(i4)); ) 10821 i4++; 10822 for (; n3 > i4 + 1 && t5.charAt(n3 - 1).isEqualTo(e4.charAt(r4 - 1)); ) 10823 n3--, r4--; 10824 return { utf16String: t5.slice(i4, n3), offset: i4 }; 10825 }; 10826 var Ht = class extends rt { 10827 static fromCommonAttributesOfObjects() { 10828 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 10829 if (!t5.length) 10830 return new this(); 10831 let e4 = Yt(t5[0]), i4 = e4.getKeys(); 10832 return t5.slice(1).forEach((t6) => { 10833 i4 = e4.getKeysCommonToHash(Yt(t6)), e4 = e4.slice(i4); 10834 }), e4; 10835 } 10836 static box(t5) { 10837 return Yt(t5); 10838 } 10839 constructor() { 10840 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 10841 super(...arguments), this.values = Gt(t5); 10842 } 10843 add(t5, e4) { 10844 return this.merge(Jt(t5, e4)); 10845 } 10846 remove(t5) { 10847 return new Ht(Gt(this.values, t5)); 10848 } 10849 get(t5) { 10850 return this.values[t5]; 10851 } 10852 has(t5) { 10853 return t5 in this.values; 10854 } 10855 merge(t5) { 10856 return new Ht(Kt(this.values, $t(t5))); 10857 } 10858 slice(t5) { 10859 const e4 = {}; 10860 return Array.from(t5).forEach((t6) => { 10861 this.has(t6) && (e4[t6] = this.values[t6]); 10862 }), new Ht(e4); 10863 } 10864 getKeys() { 10865 return Object.keys(this.values); 10866 } 10867 getKeysCommonToHash(t5) { 10868 return t5 = Yt(t5), this.getKeys().filter((e4) => this.values[e4] === t5.values[e4]); 10869 } 10870 isEqualTo(t5) { 10871 return ot(this.toArray(), Yt(t5).toArray()); 10872 } 10873 isEmpty() { 10874 return 0 === this.getKeys().length; 10875 } 10876 toArray() { 10877 if (!this.array) { 10878 const t5 = []; 10879 for (const e4 in this.values) { 10880 const i4 = this.values[e4]; 10881 t5.push(t5.push(e4, i4)); 10882 } 10883 this.array = t5.slice(0); 10884 } 10885 return this.array; 10886 } 10887 toObject() { 10888 return Gt(this.values); 10889 } 10890 toJSON() { 10891 return this.toObject(); 10892 } 10893 contentsForInspection() { 10894 return { values: JSON.stringify(this.values) }; 10895 } 10896 }; 10897 var Jt = function(t5, e4) { 10898 const i4 = {}; 10899 return i4[t5] = e4, i4; 10900 }; 10901 var Kt = function(t5, e4) { 10902 const i4 = Gt(t5); 10903 for (const t6 in e4) { 10904 const n3 = e4[t6]; 10905 i4[t6] = n3; 10906 } 10907 return i4; 10908 }; 10909 var Gt = function(t5, e4) { 10910 const i4 = {}; 10911 return Object.keys(t5).sort().forEach((n3) => { 10912 n3 !== e4 && (i4[n3] = t5[n3]); 10913 }), i4; 10914 }; 10915 var Yt = function(t5) { 10916 return t5 instanceof Ht ? t5 : new Ht(t5); 10917 }; 10918 var $t = function(t5) { 10919 return t5 instanceof Ht ? t5.values : t5; 10920 }; 10921 var Xt = class { 10922 static groupObjects() { 10923 let t5, e4 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], { depth: i4, asTree: n3 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 10924 n3 && null == i4 && (i4 = 0); 10925 const r4 = []; 10926 return Array.from(e4).forEach((e5) => { 10927 var o3; 10928 if (t5) { 10929 var s4, a4, l4; 10930 if (null !== (s4 = e5.canBeGrouped) && void 0 !== s4 && s4.call(e5, i4) && null !== (a4 = (l4 = t5[t5.length - 1]).canBeGroupedWith) && void 0 !== a4 && a4.call(l4, e5, i4)) 10931 return void t5.push(e5); 10932 r4.push(new this(t5, { depth: i4, asTree: n3 })), t5 = null; 10933 } 10934 null !== (o3 = e5.canBeGrouped) && void 0 !== o3 && o3.call(e5, i4) ? t5 = [e5] : r4.push(e5); 10935 }), t5 && r4.push(new this(t5, { depth: i4, asTree: n3 })), r4; 10936 } 10937 constructor() { 10938 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], { depth: e4, asTree: i4 } = arguments.length > 1 ? arguments[1] : void 0; 10939 this.objects = t5, i4 && (this.depth = e4, this.objects = this.constructor.groupObjects(this.objects, { asTree: i4, depth: this.depth + 1 })); 10940 } 10941 getObjects() { 10942 return this.objects; 10943 } 10944 getDepth() { 10945 return this.depth; 10946 } 10947 getCacheKey() { 10948 const t5 = ["objectGroup"]; 10949 return Array.from(this.getObjects()).forEach((e4) => { 10950 t5.push(e4.getCacheKey()); 10951 }), t5.join("/"); 10952 } 10953 }; 10954 var Zt = class extends q { 10955 constructor() { 10956 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 10957 super(...arguments), this.objects = {}, Array.from(t5).forEach((t6) => { 10958 const e4 = JSON.stringify(t6); 10959 null == this.objects[e4] && (this.objects[e4] = t6); 10960 }); 10961 } 10962 find(t5) { 10963 const e4 = JSON.stringify(t5); 10964 return this.objects[e4]; 10965 } 10966 }; 10967 var Qt = class { 10968 constructor(t5) { 10969 this.reset(t5); 10970 } 10971 add(t5) { 10972 const e4 = te(t5); 10973 this.elements[e4] = t5; 10974 } 10975 remove(t5) { 10976 const e4 = te(t5), i4 = this.elements[e4]; 10977 if (i4) 10978 return delete this.elements[e4], i4; 10979 } 10980 reset() { 10981 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 10982 return this.elements = {}, Array.from(t5).forEach((t6) => { 10983 this.add(t6); 10984 }), t5; 10985 } 10986 }; 10987 var te = (t5) => t5.dataset.trixStoreKey; 10988 var ee = class extends q { 10989 isPerforming() { 10990 return true === this.performing; 10991 } 10992 hasPerformed() { 10993 return true === this.performed; 10994 } 10995 hasSucceeded() { 10996 return this.performed && this.succeeded; 10997 } 10998 hasFailed() { 10999 return this.performed && !this.succeeded; 11000 } 11001 getPromise() { 11002 return this.promise || (this.promise = new Promise((t5, e4) => (this.performing = true, this.perform((i4, n3) => { 11003 this.succeeded = i4, this.performing = false, this.performed = true, this.succeeded ? t5(n3) : e4(n3); 11004 })))), this.promise; 11005 } 11006 perform(t5) { 11007 return t5(false); 11008 } 11009 release() { 11010 var t5, e4; 11011 null === (t5 = this.promise) || void 0 === t5 || null === (e4 = t5.cancel) || void 0 === e4 || e4.call(t5), this.promise = null, this.performing = null, this.performed = null, this.succeeded = null; 11012 } 11013 }; 11014 ee.proxyMethod("getPromise().then"), ee.proxyMethod("getPromise().catch"); 11015 var ie = class extends q { 11016 constructor(t5) { 11017 let e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 11018 super(...arguments), this.object = t5, this.options = e4, this.childViews = [], this.rootView = this; 11019 } 11020 getNodes() { 11021 return this.nodes || (this.nodes = this.createNodes()), this.nodes.map((t5) => t5.cloneNode(true)); 11022 } 11023 invalidate() { 11024 var t5; 11025 return this.nodes = null, this.childViews = [], null === (t5 = this.parentView) || void 0 === t5 ? void 0 : t5.invalidate(); 11026 } 11027 invalidateViewForObject(t5) { 11028 var e4; 11029 return null === (e4 = this.findViewForObject(t5)) || void 0 === e4 ? void 0 : e4.invalidate(); 11030 } 11031 findOrCreateCachedChildView(t5, e4, i4) { 11032 let n3 = this.getCachedViewForObject(e4); 11033 return n3 ? this.recordChildView(n3) : (n3 = this.createChildView(...arguments), this.cacheViewForObject(n3, e4)), n3; 11034 } 11035 createChildView(t5, e4) { 11036 let i4 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; 11037 e4 instanceof Xt && (i4.viewClass = t5, t5 = ne); 11038 const n3 = new t5(e4, i4); 11039 return this.recordChildView(n3); 11040 } 11041 recordChildView(t5) { 11042 return t5.parentView = this, t5.rootView = this.rootView, this.childViews.push(t5), t5; 11043 } 11044 getAllChildViews() { 11045 let t5 = []; 11046 return this.childViews.forEach((e4) => { 11047 t5.push(e4), t5 = t5.concat(e4.getAllChildViews()); 11048 }), t5; 11049 } 11050 findElement() { 11051 return this.findElementForObject(this.object); 11052 } 11053 findElementForObject(t5) { 11054 const e4 = null == t5 ? void 0 : t5.id; 11055 if (e4) 11056 return this.rootView.element.querySelector("[data-trix-id='".concat(e4, "']")); 11057 } 11058 findViewForObject(t5) { 11059 for (const e4 of this.getAllChildViews()) 11060 if (e4.object === t5) 11061 return e4; 11062 } 11063 getViewCache() { 11064 return this.rootView !== this ? this.rootView.getViewCache() : this.isViewCachingEnabled() ? (this.viewCache || (this.viewCache = {}), this.viewCache) : void 0; 11065 } 11066 isViewCachingEnabled() { 11067 return false !== this.shouldCacheViews; 11068 } 11069 enableViewCaching() { 11070 this.shouldCacheViews = true; 11071 } 11072 disableViewCaching() { 11073 this.shouldCacheViews = false; 11074 } 11075 getCachedViewForObject(t5) { 11076 var e4; 11077 return null === (e4 = this.getViewCache()) || void 0 === e4 ? void 0 : e4[t5.getCacheKey()]; 11078 } 11079 cacheViewForObject(t5, e4) { 11080 const i4 = this.getViewCache(); 11081 i4 && (i4[e4.getCacheKey()] = t5); 11082 } 11083 garbageCollectCachedViews() { 11084 const t5 = this.getViewCache(); 11085 if (t5) { 11086 const e4 = this.getAllChildViews().concat(this).map((t6) => t6.object.getCacheKey()); 11087 for (const i4 in t5) 11088 e4.includes(i4) || delete t5[i4]; 11089 } 11090 } 11091 }; 11092 var ne = class extends ie { 11093 constructor() { 11094 super(...arguments), this.objectGroup = this.object, this.viewClass = this.options.viewClass, delete this.options.viewClass; 11095 } 11096 getChildViews() { 11097 return this.childViews.length || Array.from(this.objectGroup.getObjects()).forEach((t5) => { 11098 this.findOrCreateCachedChildView(this.viewClass, t5, this.options); 11099 }), this.childViews; 11100 } 11101 createNodes() { 11102 const t5 = this.createContainerElement(); 11103 return this.getChildViews().forEach((e4) => { 11104 Array.from(e4.getNodes()).forEach((e5) => { 11105 t5.appendChild(e5); 11106 }); 11107 }), [t5]; 11108 } 11109 createContainerElement() { 11110 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.objectGroup.getDepth(); 11111 return this.getChildViews()[0].createContainerElement(t5); 11112 } 11113 }; 11114 var { entries: re, setPrototypeOf: oe, isFrozen: se, getPrototypeOf: ae, getOwnPropertyDescriptor: le } = Object; 11115 var { freeze: ce, seal: ue, create: he } = Object; 11116 var { apply: de, construct: ge } = "undefined" != typeof Reflect && Reflect; 11117 ce || (ce = function(t5) { 11118 return t5; 11119 }), ue || (ue = function(t5) { 11120 return t5; 11121 }), de || (de = function(t5, e4, i4) { 11122 return t5.apply(e4, i4); 11123 }), ge || (ge = function(t5, e4) { 11124 return new t5(...e4); 11125 }); 11126 var me = Te(Array.prototype.forEach); 11127 var pe = Te(Array.prototype.pop); 11128 var fe = Te(Array.prototype.push); 11129 var be = Te(String.prototype.toLowerCase); 11130 var ve = Te(String.prototype.toString); 11131 var Ae = Te(String.prototype.match); 11132 var ye = Te(String.prototype.replace); 11133 var xe = Te(String.prototype.indexOf); 11134 var Ce = Te(String.prototype.trim); 11135 var Ee = Te(Object.prototype.hasOwnProperty); 11136 var Se = Te(RegExp.prototype.test); 11137 var Re = (ke = TypeError, function() { 11138 for (var t5 = arguments.length, e4 = new Array(t5), i4 = 0; i4 < t5; i4++) 11139 e4[i4] = arguments[i4]; 11140 return ge(ke, e4); 11141 }); 11142 var ke; 11143 function Te(t5) { 11144 return function(e4) { 11145 for (var i4 = arguments.length, n3 = new Array(i4 > 1 ? i4 - 1 : 0), r4 = 1; r4 < i4; r4++) 11146 n3[r4 - 1] = arguments[r4]; 11147 return de(t5, e4, n3); 11148 }; 11149 } 11150 function we(t5, e4) { 11151 let i4 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : be; 11152 oe && oe(t5, null); 11153 let n3 = e4.length; 11154 for (; n3--; ) { 11155 let r4 = e4[n3]; 11156 if ("string" == typeof r4) { 11157 const t6 = i4(r4); 11158 t6 !== r4 && (se(e4) || (e4[n3] = t6), r4 = t6); 11159 } 11160 t5[r4] = true; 11161 } 11162 return t5; 11163 } 11164 function Le(t5) { 11165 for (let e4 = 0; e4 < t5.length; e4++) { 11166 Ee(t5, e4) || (t5[e4] = null); 11167 } 11168 return t5; 11169 } 11170 function De(t5) { 11171 const e4 = he(null); 11172 for (const [i4, n3] of re(t5)) { 11173 Ee(t5, i4) && (Array.isArray(n3) ? e4[i4] = Le(n3) : n3 && "object" == typeof n3 && n3.constructor === Object ? e4[i4] = De(n3) : e4[i4] = n3); 11174 } 11175 return e4; 11176 } 11177 function Ne(t5, e4) { 11178 for (; null !== t5; ) { 11179 const i4 = le(t5, e4); 11180 if (i4) { 11181 if (i4.get) 11182 return Te(i4.get); 11183 if ("function" == typeof i4.value) 11184 return Te(i4.value); 11185 } 11186 t5 = ae(t5); 11187 } 11188 return function() { 11189 return null; 11190 }; 11191 } 11192 var Ie = ce(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "section", "select", "shadow", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]); 11193 var Oe = ce(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]); 11194 var Fe = ce(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]); 11195 var Pe = ce(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]); 11196 var Me = ce(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]); 11197 var Be = ce(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]); 11198 var _e = ce(["#text"]); 11199 var je = ce(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "pattern", "placeholder", "playsinline", "popover", "popovertarget", "popovertargetaction", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "wrap", "xmlns", "slot"]); 11200 var We = ce(["accent-height", "accumulate", "additive", "alignment-baseline", "amplitude", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dur", "edgemode", "elevation", "end", "exponent", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "intercept", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "slope", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "tablevalues", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]); 11201 var Ue = ce(["accent", "accentunder", "align", "bevelled", "close", "columnsalign", "columnlines", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lspace", "lquote", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]); 11202 var Ve = ce(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]); 11203 var ze = ue(/\{\{[\w\W]*|[\w\W]*\}\}/gm); 11204 var qe = ue(/<%[\w\W]*|[\w\W]*%>/gm); 11205 var He = ue(/\$\{[\w\W]*}/gm); 11206 var Je = ue(/^data-[\-\w.\u00B7-\uFFFF]+$/); 11207 var Ke = ue(/^aria-[\-\w]+$/); 11208 var Ge = ue(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i); 11209 var Ye = ue(/^(?:\w+script|data):/i); 11210 var $e = ue(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g); 11211 var Xe = ue(/^html$/i); 11212 var Ze = ue(/^[a-z][.\w]*(-[.\w]+)+$/i); 11213 var Qe = Object.freeze({ __proto__: null, ARIA_ATTR: Ke, ATTR_WHITESPACE: $e, CUSTOM_ELEMENT: Ze, DATA_ATTR: Je, DOCTYPE_NAME: Xe, ERB_EXPR: qe, IS_ALLOWED_URI: Ge, IS_SCRIPT_OR_DATA: Ye, MUSTACHE_EXPR: ze, TMPLIT_EXPR: He }); 11214 var ti = 1; 11215 var ei = 3; 11216 var ii = 7; 11217 var ni = 8; 11218 var ri = 9; 11219 var oi = function() { 11220 return "undefined" == typeof window ? null : window; 11221 }; 11222 var si = function t2() { 11223 let e4 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : oi(); 11224 const i4 = (e5) => t2(e5); 11225 if (i4.version = "3.2.3", i4.removed = [], !e4 || !e4.document || e4.document.nodeType !== ri) 11226 return i4.isSupported = false, i4; 11227 let { document: n3 } = e4; 11228 const r4 = n3, o3 = r4.currentScript, { DocumentFragment: s4, HTMLTemplateElement: a4, Node: l4, Element: c4, NodeFilter: u4, NamedNodeMap: h4 = e4.NamedNodeMap || e4.MozNamedAttrMap, HTMLFormElement: d3, DOMParser: g5, trustedTypes: m5 } = e4, p4 = c4.prototype, f4 = Ne(p4, "cloneNode"), b4 = Ne(p4, "remove"), v4 = Ne(p4, "nextSibling"), A4 = Ne(p4, "childNodes"), y4 = Ne(p4, "parentNode"); 11229 if ("function" == typeof a4) { 11230 const t5 = n3.createElement("template"); 11231 t5.content && t5.content.ownerDocument && (n3 = t5.content.ownerDocument); 11232 } 11233 let x5, C4 = ""; 11234 const { implementation: E3, createNodeIterator: S3, createDocumentFragment: R2, getElementsByTagName: k4 } = n3, { importNode: T5 } = r4; 11235 let w5 = { afterSanitizeAttributes: [], afterSanitizeElements: [], afterSanitizeShadowDOM: [], beforeSanitizeAttributes: [], beforeSanitizeElements: [], beforeSanitizeShadowDOM: [], uponSanitizeAttribute: [], uponSanitizeElement: [], uponSanitizeShadowNode: [] }; 11236 i4.isSupported = "function" == typeof re && "function" == typeof y4 && E3 && void 0 !== E3.createHTMLDocument; 11237 const { MUSTACHE_EXPR: L4, ERB_EXPR: D4, TMPLIT_EXPR: N4, DATA_ATTR: I4, ARIA_ATTR: O3, IS_SCRIPT_OR_DATA: F5, ATTR_WHITESPACE: P4, CUSTOM_ELEMENT: M3 } = Qe; 11238 let { IS_ALLOWED_URI: B4 } = Qe, _4 = null; 11239 const j5 = we({}, [...Ie, ...Oe, ...Fe, ...Me, ..._e]); 11240 let W3 = null; 11241 const U3 = we({}, [...je, ...We, ...Ue, ...Ve]); 11242 let V4 = Object.seal(he(null, { tagNameCheck: { writable: true, configurable: false, enumerable: true, value: null }, attributeNameCheck: { writable: true, configurable: false, enumerable: true, value: null }, allowCustomizedBuiltInElements: { writable: true, configurable: false, enumerable: true, value: false } })), z4 = null, q4 = null, H4 = true, J3 = true, K3 = false, G4 = true, Y2 = false, $5 = true, X3 = false, Z3 = false, Q3 = false, tt2 = false, et2 = false, it2 = false, nt2 = true, rt2 = false, ot2 = true, st2 = false, at2 = {}, lt2 = null; 11243 const ct2 = we({}, ["annotation-xml", "audio", "colgroup", "desc", "foreignobject", "head", "iframe", "math", "mi", "mn", "mo", "ms", "mtext", "noembed", "noframes", "noscript", "plaintext", "script", "style", "svg", "template", "thead", "title", "video", "xmp"]); 11244 let ut2 = null; 11245 const ht2 = we({}, ["audio", "video", "img", "source", "image", "track"]); 11246 let dt2 = null; 11247 const gt2 = we({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]), mt2 = "http://www.w3.org/1998/Math/MathML", pt2 = "http://www.w3.org/2000/svg", ft2 = "http://www.w3.org/1999/xhtml"; 11248 let bt2 = ft2, vt2 = false, At2 = null; 11249 const yt2 = we({}, [mt2, pt2, ft2], ve); 11250 let xt2 = we({}, ["mi", "mo", "mn", "ms", "mtext"]), Ct2 = we({}, ["annotation-xml"]); 11251 const Et2 = we({}, ["title", "style", "font", "a", "script"]); 11252 let St2 = null; 11253 const Rt2 = ["application/xhtml+xml", "text/html"]; 11254 let kt2 = null, Tt2 = null; 11255 const wt2 = n3.createElement("form"), Lt2 = function(t5) { 11256 return t5 instanceof RegExp || t5 instanceof Function; 11257 }, Dt2 = function() { 11258 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 11259 if (!Tt2 || Tt2 !== t5) { 11260 if (t5 && "object" == typeof t5 || (t5 = {}), t5 = De(t5), St2 = -1 === Rt2.indexOf(t5.PARSER_MEDIA_TYPE) ? "text/html" : t5.PARSER_MEDIA_TYPE, kt2 = "application/xhtml+xml" === St2 ? ve : be, _4 = Ee(t5, "ALLOWED_TAGS") ? we({}, t5.ALLOWED_TAGS, kt2) : j5, W3 = Ee(t5, "ALLOWED_ATTR") ? we({}, t5.ALLOWED_ATTR, kt2) : U3, At2 = Ee(t5, "ALLOWED_NAMESPACES") ? we({}, t5.ALLOWED_NAMESPACES, ve) : yt2, dt2 = Ee(t5, "ADD_URI_SAFE_ATTR") ? we(De(gt2), t5.ADD_URI_SAFE_ATTR, kt2) : gt2, ut2 = Ee(t5, "ADD_DATA_URI_TAGS") ? we(De(ht2), t5.ADD_DATA_URI_TAGS, kt2) : ht2, lt2 = Ee(t5, "FORBID_CONTENTS") ? we({}, t5.FORBID_CONTENTS, kt2) : ct2, z4 = Ee(t5, "FORBID_TAGS") ? we({}, t5.FORBID_TAGS, kt2) : {}, q4 = Ee(t5, "FORBID_ATTR") ? we({}, t5.FORBID_ATTR, kt2) : {}, at2 = !!Ee(t5, "USE_PROFILES") && t5.USE_PROFILES, H4 = false !== t5.ALLOW_ARIA_ATTR, J3 = false !== t5.ALLOW_DATA_ATTR, K3 = t5.ALLOW_UNKNOWN_PROTOCOLS || false, G4 = false !== t5.ALLOW_SELF_CLOSE_IN_ATTR, Y2 = t5.SAFE_FOR_TEMPLATES || false, $5 = false !== t5.SAFE_FOR_XML, X3 = t5.WHOLE_DOCUMENT || false, tt2 = t5.RETURN_DOM || false, et2 = t5.RETURN_DOM_FRAGMENT || false, it2 = t5.RETURN_TRUSTED_TYPE || false, Q3 = t5.FORCE_BODY || false, nt2 = false !== t5.SANITIZE_DOM, rt2 = t5.SANITIZE_NAMED_PROPS || false, ot2 = false !== t5.KEEP_CONTENT, st2 = t5.IN_PLACE || false, B4 = t5.ALLOWED_URI_REGEXP || Ge, bt2 = t5.NAMESPACE || ft2, xt2 = t5.MATHML_TEXT_INTEGRATION_POINTS || xt2, Ct2 = t5.HTML_INTEGRATION_POINTS || Ct2, V4 = t5.CUSTOM_ELEMENT_HANDLING || {}, t5.CUSTOM_ELEMENT_HANDLING && Lt2(t5.CUSTOM_ELEMENT_HANDLING.tagNameCheck) && (V4.tagNameCheck = t5.CUSTOM_ELEMENT_HANDLING.tagNameCheck), t5.CUSTOM_ELEMENT_HANDLING && Lt2(t5.CUSTOM_ELEMENT_HANDLING.attributeNameCheck) && (V4.attributeNameCheck = t5.CUSTOM_ELEMENT_HANDLING.attributeNameCheck), t5.CUSTOM_ELEMENT_HANDLING && "boolean" == typeof t5.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (V4.allowCustomizedBuiltInElements = t5.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements), Y2 && (J3 = false), et2 && (tt2 = true), at2 && (_4 = we({}, _e), W3 = [], true === at2.html && (we(_4, Ie), we(W3, je)), true === at2.svg && (we(_4, Oe), we(W3, We), we(W3, Ve)), true === at2.svgFilters && (we(_4, Fe), we(W3, We), we(W3, Ve)), true === at2.mathMl && (we(_4, Me), we(W3, Ue), we(W3, Ve))), t5.ADD_TAGS && (_4 === j5 && (_4 = De(_4)), we(_4, t5.ADD_TAGS, kt2)), t5.ADD_ATTR && (W3 === U3 && (W3 = De(W3)), we(W3, t5.ADD_ATTR, kt2)), t5.ADD_URI_SAFE_ATTR && we(dt2, t5.ADD_URI_SAFE_ATTR, kt2), t5.FORBID_CONTENTS && (lt2 === ct2 && (lt2 = De(lt2)), we(lt2, t5.FORBID_CONTENTS, kt2)), ot2 && (_4["#text"] = true), X3 && we(_4, ["html", "head", "body"]), _4.table && (we(_4, ["tbody"]), delete z4.tbody), t5.TRUSTED_TYPES_POLICY) { 11261 if ("function" != typeof t5.TRUSTED_TYPES_POLICY.createHTML) 11262 throw Re('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); 11263 if ("function" != typeof t5.TRUSTED_TYPES_POLICY.createScriptURL) 11264 throw Re('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); 11265 x5 = t5.TRUSTED_TYPES_POLICY, C4 = x5.createHTML(""); 11266 } else 11267 void 0 === x5 && (x5 = function(t6, e5) { 11268 if ("object" != typeof t6 || "function" != typeof t6.createPolicy) 11269 return null; 11270 let i5 = null; 11271 const n4 = "data-tt-policy-suffix"; 11272 e5 && e5.hasAttribute(n4) && (i5 = e5.getAttribute(n4)); 11273 const r5 = "dompurify" + (i5 ? "#" + i5 : ""); 11274 try { 11275 return t6.createPolicy(r5, { createHTML: (t7) => t7, createScriptURL: (t7) => t7 }); 11276 } catch (t7) { 11277 return console.warn("TrustedTypes policy " + r5 + " could not be created."), null; 11278 } 11279 }(m5, o3)), null !== x5 && "string" == typeof C4 && (C4 = x5.createHTML("")); 11280 ce && ce(t5), Tt2 = t5; 11281 } 11282 }, Nt2 = we({}, [...Oe, ...Fe, ...Pe]), It2 = we({}, [...Me, ...Be]), Ot2 = function(t5) { 11283 fe(i4.removed, { element: t5 }); 11284 try { 11285 y4(t5).removeChild(t5); 11286 } catch (e5) { 11287 b4(t5); 11288 } 11289 }, Ft2 = function(t5, e5) { 11290 try { 11291 fe(i4.removed, { attribute: e5.getAttributeNode(t5), from: e5 }); 11292 } catch (t6) { 11293 fe(i4.removed, { attribute: null, from: e5 }); 11294 } 11295 if (e5.removeAttribute(t5), "is" === t5) 11296 if (tt2 || et2) 11297 try { 11298 Ot2(e5); 11299 } catch (t6) { 11300 } 11301 else 11302 try { 11303 e5.setAttribute(t5, ""); 11304 } catch (t6) { 11305 } 11306 }, Pt2 = function(t5) { 11307 let e5 = null, i5 = null; 11308 if (Q3) 11309 t5 = "<remove></remove>" + t5; 11310 else { 11311 const e6 = Ae(t5, /^[\r\n\t ]+/); 11312 i5 = e6 && e6[0]; 11313 } 11314 "application/xhtml+xml" === St2 && bt2 === ft2 && (t5 = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + t5 + "</body></html>"); 11315 const r5 = x5 ? x5.createHTML(t5) : t5; 11316 if (bt2 === ft2) 11317 try { 11318 e5 = new g5().parseFromString(r5, St2); 11319 } catch (t6) { 11320 } 11321 if (!e5 || !e5.documentElement) { 11322 e5 = E3.createDocument(bt2, "template", null); 11323 try { 11324 e5.documentElement.innerHTML = vt2 ? C4 : r5; 11325 } catch (t6) { 11326 } 11327 } 11328 const o4 = e5.body || e5.documentElement; 11329 return t5 && i5 && o4.insertBefore(n3.createTextNode(i5), o4.childNodes[0] || null), bt2 === ft2 ? k4.call(e5, X3 ? "html" : "body")[0] : X3 ? e5.documentElement : o4; 11330 }, Mt2 = function(t5) { 11331 return S3.call(t5.ownerDocument || t5, t5, u4.SHOW_ELEMENT | u4.SHOW_COMMENT | u4.SHOW_TEXT | u4.SHOW_PROCESSING_INSTRUCTION | u4.SHOW_CDATA_SECTION, null); 11332 }, Bt2 = function(t5) { 11333 return t5 instanceof d3 && ("string" != typeof t5.nodeName || "string" != typeof t5.textContent || "function" != typeof t5.removeChild || !(t5.attributes instanceof h4) || "function" != typeof t5.removeAttribute || "function" != typeof t5.setAttribute || "string" != typeof t5.namespaceURI || "function" != typeof t5.insertBefore || "function" != typeof t5.hasChildNodes); 11334 }, _t2 = function(t5) { 11335 return "function" == typeof l4 && t5 instanceof l4; 11336 }; 11337 function jt2(t5, e5, n4) { 11338 me(t5, (t6) => { 11339 t6.call(i4, e5, n4, Tt2); 11340 }); 11341 } 11342 const Wt2 = function(t5) { 11343 let e5 = null; 11344 if (jt2(w5.beforeSanitizeElements, t5, null), Bt2(t5)) 11345 return Ot2(t5), true; 11346 const n4 = kt2(t5.nodeName); 11347 if (jt2(w5.uponSanitizeElement, t5, { tagName: n4, allowedTags: _4 }), t5.hasChildNodes() && !_t2(t5.firstElementChild) && Se(/<[/\w]/g, t5.innerHTML) && Se(/<[/\w]/g, t5.textContent)) 11348 return Ot2(t5), true; 11349 if (t5.nodeType === ii) 11350 return Ot2(t5), true; 11351 if ($5 && t5.nodeType === ni && Se(/<[/\w]/g, t5.data)) 11352 return Ot2(t5), true; 11353 if (!_4[n4] || z4[n4]) { 11354 if (!z4[n4] && Vt2(n4)) { 11355 if (V4.tagNameCheck instanceof RegExp && Se(V4.tagNameCheck, n4)) 11356 return false; 11357 if (V4.tagNameCheck instanceof Function && V4.tagNameCheck(n4)) 11358 return false; 11359 } 11360 if (ot2 && !lt2[n4]) { 11361 const e6 = y4(t5) || t5.parentNode, i5 = A4(t5) || t5.childNodes; 11362 if (i5 && e6) { 11363 for (let n5 = i5.length - 1; n5 >= 0; --n5) { 11364 const r5 = f4(i5[n5], true); 11365 r5.__removalCount = (t5.__removalCount || 0) + 1, e6.insertBefore(r5, v4(t5)); 11366 } 11367 } 11368 } 11369 return Ot2(t5), true; 11370 } 11371 return t5 instanceof c4 && !function(t6) { 11372 let e6 = y4(t6); 11373 e6 && e6.tagName || (e6 = { namespaceURI: bt2, tagName: "template" }); 11374 const i5 = be(t6.tagName), n5 = be(e6.tagName); 11375 return !!At2[t6.namespaceURI] && (t6.namespaceURI === pt2 ? e6.namespaceURI === ft2 ? "svg" === i5 : e6.namespaceURI === mt2 ? "svg" === i5 && ("annotation-xml" === n5 || xt2[n5]) : Boolean(Nt2[i5]) : t6.namespaceURI === mt2 ? e6.namespaceURI === ft2 ? "math" === i5 : e6.namespaceURI === pt2 ? "math" === i5 && Ct2[n5] : Boolean(It2[i5]) : t6.namespaceURI === ft2 ? !(e6.namespaceURI === pt2 && !Ct2[n5]) && !(e6.namespaceURI === mt2 && !xt2[n5]) && !It2[i5] && (Et2[i5] || !Nt2[i5]) : !("application/xhtml+xml" !== St2 || !At2[t6.namespaceURI])); 11376 }(t5) ? (Ot2(t5), true) : "noscript" !== n4 && "noembed" !== n4 && "noframes" !== n4 || !Se(/<\/no(script|embed|frames)/i, t5.innerHTML) ? (Y2 && t5.nodeType === ei && (e5 = t5.textContent, me([L4, D4, N4], (t6) => { 11377 e5 = ye(e5, t6, " "); 11378 }), t5.textContent !== e5 && (fe(i4.removed, { element: t5.cloneNode() }), t5.textContent = e5)), jt2(w5.afterSanitizeElements, t5, null), false) : (Ot2(t5), true); 11379 }, Ut2 = function(t5, e5, i5) { 11380 if (nt2 && ("id" === e5 || "name" === e5) && (i5 in n3 || i5 in wt2)) 11381 return false; 11382 if (J3 && !q4[e5] && Se(I4, e5)) 11383 ; 11384 else if (H4 && Se(O3, e5)) 11385 ; 11386 else if (!W3[e5] || q4[e5]) { 11387 if (!(Vt2(t5) && (V4.tagNameCheck instanceof RegExp && Se(V4.tagNameCheck, t5) || V4.tagNameCheck instanceof Function && V4.tagNameCheck(t5)) && (V4.attributeNameCheck instanceof RegExp && Se(V4.attributeNameCheck, e5) || V4.attributeNameCheck instanceof Function && V4.attributeNameCheck(e5)) || "is" === e5 && V4.allowCustomizedBuiltInElements && (V4.tagNameCheck instanceof RegExp && Se(V4.tagNameCheck, i5) || V4.tagNameCheck instanceof Function && V4.tagNameCheck(i5)))) 11388 return false; 11389 } else if (dt2[e5]) 11390 ; 11391 else if (Se(B4, ye(i5, P4, ""))) 11392 ; 11393 else if ("src" !== e5 && "xlink:href" !== e5 && "href" !== e5 || "script" === t5 || 0 !== xe(i5, "data:") || !ut2[t5]) { 11394 if (K3 && !Se(F5, ye(i5, P4, ""))) 11395 ; 11396 else if (i5) 11397 return false; 11398 } else 11399 ; 11400 return true; 11401 }, Vt2 = function(t5) { 11402 return "annotation-xml" !== t5 && Ae(t5, M3); 11403 }, zt2 = function(t5) { 11404 jt2(w5.beforeSanitizeAttributes, t5, null); 11405 const { attributes: e5 } = t5; 11406 if (!e5 || Bt2(t5)) 11407 return; 11408 const n4 = { attrName: "", attrValue: "", keepAttr: true, allowedAttributes: W3, forceKeepAttr: void 0 }; 11409 let r5 = e5.length; 11410 for (; r5--; ) { 11411 const o4 = e5[r5], { name: s5, namespaceURI: a5, value: l5 } = o4, c5 = kt2(s5); 11412 let u5 = "value" === s5 ? l5 : Ce(l5); 11413 if (n4.attrName = c5, n4.attrValue = u5, n4.keepAttr = true, n4.forceKeepAttr = void 0, jt2(w5.uponSanitizeAttribute, t5, n4), u5 = n4.attrValue, !rt2 || "id" !== c5 && "name" !== c5 || (Ft2(s5, t5), u5 = "user-content-" + u5), $5 && Se(/((--!?|])>)|<\/(style|title)/i, u5)) { 11414 Ft2(s5, t5); 11415 continue; 11416 } 11417 if (n4.forceKeepAttr) 11418 continue; 11419 if (Ft2(s5, t5), !n4.keepAttr) 11420 continue; 11421 if (!G4 && Se(/\/>/i, u5)) { 11422 Ft2(s5, t5); 11423 continue; 11424 } 11425 Y2 && me([L4, D4, N4], (t6) => { 11426 u5 = ye(u5, t6, " "); 11427 }); 11428 const h5 = kt2(t5.nodeName); 11429 if (Ut2(h5, c5, u5)) { 11430 if (x5 && "object" == typeof m5 && "function" == typeof m5.getAttributeType) 11431 if (a5) 11432 ; 11433 else 11434 switch (m5.getAttributeType(h5, c5)) { 11435 case "TrustedHTML": 11436 u5 = x5.createHTML(u5); 11437 break; 11438 case "TrustedScriptURL": 11439 u5 = x5.createScriptURL(u5); 11440 } 11441 try { 11442 a5 ? t5.setAttributeNS(a5, s5, u5) : t5.setAttribute(s5, u5), Bt2(t5) ? Ot2(t5) : pe(i4.removed); 11443 } catch (t6) { 11444 } 11445 } 11446 } 11447 jt2(w5.afterSanitizeAttributes, t5, null); 11448 }, qt2 = function t5(e5) { 11449 let i5 = null; 11450 const n4 = Mt2(e5); 11451 for (jt2(w5.beforeSanitizeShadowDOM, e5, null); i5 = n4.nextNode(); ) 11452 jt2(w5.uponSanitizeShadowNode, i5, null), Wt2(i5), zt2(i5), i5.content instanceof s4 && t5(i5.content); 11453 jt2(w5.afterSanitizeShadowDOM, e5, null); 11454 }; 11455 return i4.sanitize = function(t5) { 11456 let e5 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n4 = null, o4 = null, a5 = null, c5 = null; 11457 if (vt2 = !t5, vt2 && (t5 = "<!-->"), "string" != typeof t5 && !_t2(t5)) { 11458 if ("function" != typeof t5.toString) 11459 throw Re("toString is not a function"); 11460 if ("string" != typeof (t5 = t5.toString())) 11461 throw Re("dirty is not a string, aborting"); 11462 } 11463 if (!i4.isSupported) 11464 return t5; 11465 if (Z3 || Dt2(e5), i4.removed = [], "string" == typeof t5 && (st2 = false), st2) { 11466 if (t5.nodeName) { 11467 const e6 = kt2(t5.nodeName); 11468 if (!_4[e6] || z4[e6]) 11469 throw Re("root node is forbidden and cannot be sanitized in-place"); 11470 } 11471 } else if (t5 instanceof l4) 11472 n4 = Pt2("<!---->"), o4 = n4.ownerDocument.importNode(t5, true), o4.nodeType === ti && "BODY" === o4.nodeName || "HTML" === o4.nodeName ? n4 = o4 : n4.appendChild(o4); 11473 else { 11474 if (!tt2 && !Y2 && !X3 && -1 === t5.indexOf("<")) 11475 return x5 && it2 ? x5.createHTML(t5) : t5; 11476 if (n4 = Pt2(t5), !n4) 11477 return tt2 ? null : it2 ? C4 : ""; 11478 } 11479 n4 && Q3 && Ot2(n4.firstChild); 11480 const u5 = Mt2(st2 ? t5 : n4); 11481 for (; a5 = u5.nextNode(); ) 11482 Wt2(a5), zt2(a5), a5.content instanceof s4 && qt2(a5.content); 11483 if (st2) 11484 return t5; 11485 if (tt2) { 11486 if (et2) 11487 for (c5 = R2.call(n4.ownerDocument); n4.firstChild; ) 11488 c5.appendChild(n4.firstChild); 11489 else 11490 c5 = n4; 11491 return (W3.shadowroot || W3.shadowrootmode) && (c5 = T5.call(r4, c5, true)), c5; 11492 } 11493 let h5 = X3 ? n4.outerHTML : n4.innerHTML; 11494 return X3 && _4["!doctype"] && n4.ownerDocument && n4.ownerDocument.doctype && n4.ownerDocument.doctype.name && Se(Xe, n4.ownerDocument.doctype.name) && (h5 = "<!DOCTYPE " + n4.ownerDocument.doctype.name + ">\n" + h5), Y2 && me([L4, D4, N4], (t6) => { 11495 h5 = ye(h5, t6, " "); 11496 }), x5 && it2 ? x5.createHTML(h5) : h5; 11497 }, i4.setConfig = function() { 11498 Dt2(arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}), Z3 = true; 11499 }, i4.clearConfig = function() { 11500 Tt2 = null, Z3 = false; 11501 }, i4.isValidAttribute = function(t5, e5, i5) { 11502 Tt2 || Dt2({}); 11503 const n4 = kt2(t5), r5 = kt2(e5); 11504 return Ut2(n4, r5, i5); 11505 }, i4.addHook = function(t5, e5) { 11506 "function" == typeof e5 && fe(w5[t5], e5); 11507 }, i4.removeHook = function(t5) { 11508 return pe(w5[t5]); 11509 }, i4.removeHooks = function(t5) { 11510 w5[t5] = []; 11511 }, i4.removeAllHooks = function() { 11512 w5 = { afterSanitizeAttributes: [], afterSanitizeElements: [], afterSanitizeShadowDOM: [], beforeSanitizeAttributes: [], beforeSanitizeElements: [], beforeSanitizeShadowDOM: [], uponSanitizeAttribute: [], uponSanitizeElement: [], uponSanitizeShadowNode: [] }; 11513 }, i4; 11514 }(); 11515 si.addHook("uponSanitizeAttribute", function(t5, e4) { 11516 /^data-trix-/.test(e4.attrName) && (e4.forceKeepAttr = true); 11517 }); 11518 var ai = "style href src width height language class".split(" "); 11519 var li = "javascript:".split(" "); 11520 var ci = "script iframe form noscript".split(" "); 11521 var ui = class extends q { 11522 static setHTML(t5, e4) { 11523 const i4 = new this(e4).sanitize(), n3 = i4.getHTML ? i4.getHTML() : i4.outerHTML; 11524 t5.innerHTML = n3; 11525 } 11526 static sanitize(t5, e4) { 11527 const i4 = new this(t5, e4); 11528 return i4.sanitize(), i4; 11529 } 11530 constructor(t5) { 11531 let { allowedAttributes: e4, forbiddenProtocols: i4, forbiddenElements: n3 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 11532 super(...arguments), this.allowedAttributes = e4 || ai, this.forbiddenProtocols = i4 || li, this.forbiddenElements = n3 || ci, this.body = hi(t5); 11533 } 11534 sanitize() { 11535 return this.sanitizeElements(), this.normalizeListElementNesting(), si.setConfig(l), this.body = si.sanitize(this.body), this.body; 11536 } 11537 getHTML() { 11538 return this.body.innerHTML; 11539 } 11540 getBody() { 11541 return this.body; 11542 } 11543 sanitizeElements() { 11544 const t5 = R(this.body), e4 = []; 11545 for (; t5.nextNode(); ) { 11546 const i4 = t5.currentNode; 11547 switch (i4.nodeType) { 11548 case Node.ELEMENT_NODE: 11549 this.elementIsRemovable(i4) ? e4.push(i4) : this.sanitizeElement(i4); 11550 break; 11551 case Node.COMMENT_NODE: 11552 e4.push(i4); 11553 } 11554 } 11555 return e4.forEach((t6) => S(t6)), this.body; 11556 } 11557 sanitizeElement(t5) { 11558 return t5.hasAttribute("href") && this.forbiddenProtocols.includes(t5.protocol) && t5.removeAttribute("href"), Array.from(t5.attributes).forEach((e4) => { 11559 let { name: i4 } = e4; 11560 this.allowedAttributes.includes(i4) || 0 === i4.indexOf("data-trix") || t5.removeAttribute(i4); 11561 }), t5; 11562 } 11563 normalizeListElementNesting() { 11564 return Array.from(this.body.querySelectorAll("ul,ol")).forEach((t5) => { 11565 const e4 = t5.previousElementSibling; 11566 e4 && "li" === k(e4) && e4.appendChild(t5); 11567 }), this.body; 11568 } 11569 elementIsRemovable(t5) { 11570 if ((null == t5 ? void 0 : t5.nodeType) === Node.ELEMENT_NODE) 11571 return this.elementIsForbidden(t5) || this.elementIsntSerializable(t5); 11572 } 11573 elementIsForbidden(t5) { 11574 return this.forbiddenElements.includes(k(t5)); 11575 } 11576 elementIsntSerializable(t5) { 11577 return "false" === t5.getAttribute("data-trix-serialize") && !P(t5); 11578 } 11579 }; 11580 var hi = function() { 11581 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ""; 11582 t5 = t5.replace(/<\/html[^>]*>[^]*$/i, "</html>"); 11583 const e4 = document.implementation.createHTMLDocument(""); 11584 return e4.documentElement.innerHTML = t5, Array.from(e4.head.querySelectorAll("style")).forEach((t6) => { 11585 e4.body.appendChild(t6); 11586 }), e4.body; 11587 }; 11588 var { css: di } = z; 11589 var gi = class extends ie { 11590 constructor() { 11591 super(...arguments), this.attachment = this.object, this.attachment.uploadProgressDelegate = this, this.attachmentPiece = this.options.piece; 11592 } 11593 createContentNodes() { 11594 return []; 11595 } 11596 createNodes() { 11597 let t5; 11598 const e4 = t5 = T({ tagName: "figure", className: this.getClassName(), data: this.getData(), editable: false }), i4 = this.getHref(); 11599 return i4 && (t5 = T({ tagName: "a", editable: false, attributes: { href: i4, tabindex: -1 } }), e4.appendChild(t5)), this.attachment.hasContent() ? ui.setHTML(t5, this.attachment.getContent()) : this.createContentNodes().forEach((e5) => { 11600 t5.appendChild(e5); 11601 }), t5.appendChild(this.createCaptionElement()), this.attachment.isPending() && (this.progressElement = T({ tagName: "progress", attributes: { class: di.attachmentProgress, value: this.attachment.getUploadProgress(), max: 100 }, data: { trixMutable: true, trixStoreKey: ["progressElement", this.attachment.id].join("/") } }), e4.appendChild(this.progressElement)), [mi("left"), e4, mi("right")]; 11602 } 11603 createCaptionElement() { 11604 const t5 = T({ tagName: "figcaption", className: di.attachmentCaption }), e4 = this.attachmentPiece.getCaption(); 11605 if (e4) 11606 t5.classList.add("".concat(di.attachmentCaption, "--edited")), t5.textContent = e4; 11607 else { 11608 let e5, i4; 11609 const n3 = this.getCaptionConfig(); 11610 if (n3.name && (e5 = this.attachment.getFilename()), n3.size && (i4 = this.attachment.getFormattedFilesize()), e5) { 11611 const i5 = T({ tagName: "span", className: di.attachmentName, textContent: e5 }); 11612 t5.appendChild(i5); 11613 } 11614 if (i4) { 11615 e5 && t5.appendChild(document.createTextNode(" ")); 11616 const n4 = T({ tagName: "span", className: di.attachmentSize, textContent: i4 }); 11617 t5.appendChild(n4); 11618 } 11619 } 11620 return t5; 11621 } 11622 getClassName() { 11623 const t5 = [di.attachment, "".concat(di.attachment, "--").concat(this.attachment.getType())], e4 = this.attachment.getExtension(); 11624 return e4 && t5.push("".concat(di.attachment, "--").concat(e4)), t5.join(" "); 11625 } 11626 getData() { 11627 const t5 = { trixAttachment: JSON.stringify(this.attachment), trixContentType: this.attachment.getContentType(), trixId: this.attachment.id }, { attributes: e4 } = this.attachmentPiece; 11628 return e4.isEmpty() || (t5.trixAttributes = JSON.stringify(e4)), this.attachment.isPending() && (t5.trixSerialize = false), t5; 11629 } 11630 getHref() { 11631 if (!pi(this.attachment.getContent(), "a")) 11632 return this.attachment.getHref(); 11633 } 11634 getCaptionConfig() { 11635 var t5; 11636 const e4 = this.attachment.getType(), n3 = kt(null === (t5 = i[e4]) || void 0 === t5 ? void 0 : t5.caption); 11637 return "file" === e4 && (n3.name = true), n3; 11638 } 11639 findProgressElement() { 11640 var t5; 11641 return null === (t5 = this.findElement()) || void 0 === t5 ? void 0 : t5.querySelector("progress"); 11642 } 11643 attachmentDidChangeUploadProgress() { 11644 const t5 = this.attachment.getUploadProgress(), e4 = this.findProgressElement(); 11645 e4 && (e4.value = t5); 11646 } 11647 }; 11648 var mi = (t5) => T({ tagName: "span", textContent: d, data: { trixCursorTarget: t5, trixSerialize: false } }); 11649 var pi = function(t5, e4) { 11650 const i4 = T("div"); 11651 return ui.setHTML(i4, t5 || ""), i4.querySelector(e4); 11652 }; 11653 var fi = class extends gi { 11654 constructor() { 11655 super(...arguments), this.attachment.previewDelegate = this; 11656 } 11657 createContentNodes() { 11658 return this.image = T({ tagName: "img", attributes: { src: "" }, data: { trixMutable: true } }), this.refresh(this.image), [this.image]; 11659 } 11660 createCaptionElement() { 11661 const t5 = super.createCaptionElement(...arguments); 11662 return t5.textContent || t5.setAttribute("data-trix-placeholder", c.captionPlaceholder), t5; 11663 } 11664 refresh(t5) { 11665 var e4; 11666 t5 || (t5 = null === (e4 = this.findElement()) || void 0 === e4 ? void 0 : e4.querySelector("img")); 11667 if (t5) 11668 return this.updateAttributesForImage(t5); 11669 } 11670 updateAttributesForImage(t5) { 11671 const e4 = this.attachment.getURL(), i4 = this.attachment.getPreviewURL(); 11672 if (t5.src = i4 || e4, i4 === e4) 11673 t5.removeAttribute("data-trix-serialized-attributes"); 11674 else { 11675 const i5 = JSON.stringify({ src: e4 }); 11676 t5.setAttribute("data-trix-serialized-attributes", i5); 11677 } 11678 const n3 = this.attachment.getWidth(), r4 = this.attachment.getHeight(); 11679 null != n3 && (t5.width = n3), null != r4 && (t5.height = r4); 11680 const o3 = ["imageElement", this.attachment.id, t5.src, t5.width, t5.height].join("/"); 11681 t5.dataset.trixStoreKey = o3; 11682 } 11683 attachmentDidChangeAttributes() { 11684 return this.refresh(this.image), this.refresh(); 11685 } 11686 }; 11687 var bi = class extends ie { 11688 constructor() { 11689 super(...arguments), this.piece = this.object, this.attributes = this.piece.getAttributes(), this.textConfig = this.options.textConfig, this.context = this.options.context, this.piece.attachment ? this.attachment = this.piece.attachment : this.string = this.piece.toString(); 11690 } 11691 createNodes() { 11692 let t5 = this.attachment ? this.createAttachmentNodes() : this.createStringNodes(); 11693 const e4 = this.createElement(); 11694 if (e4) { 11695 const i4 = function(t6) { 11696 for (; null !== (e5 = t6) && void 0 !== e5 && e5.firstElementChild; ) { 11697 var e5; 11698 t6 = t6.firstElementChild; 11699 } 11700 return t6; 11701 }(e4); 11702 Array.from(t5).forEach((t6) => { 11703 i4.appendChild(t6); 11704 }), t5 = [e4]; 11705 } 11706 return t5; 11707 } 11708 createAttachmentNodes() { 11709 const t5 = this.attachment.isPreviewable() ? fi : gi; 11710 return this.createChildView(t5, this.piece.attachment, { piece: this.piece }).getNodes(); 11711 } 11712 createStringNodes() { 11713 var t5; 11714 if (null !== (t5 = this.textConfig) && void 0 !== t5 && t5.plaintext) 11715 return [document.createTextNode(this.string)]; 11716 { 11717 const t6 = [], e4 = this.string.split("\n"); 11718 for (let i4 = 0; i4 < e4.length; i4++) { 11719 const n3 = e4[i4]; 11720 if (i4 > 0) { 11721 const e5 = T("br"); 11722 t6.push(e5); 11723 } 11724 if (n3.length) { 11725 const e5 = document.createTextNode(this.preserveSpaces(n3)); 11726 t6.push(e5); 11727 } 11728 } 11729 return t6; 11730 } 11731 } 11732 createElement() { 11733 let t5, e4, i4; 11734 const n3 = {}; 11735 for (e4 in this.attributes) { 11736 i4 = this.attributes[e4]; 11737 const o3 = ft(e4); 11738 if (o3) { 11739 if (o3.tagName) { 11740 var r4; 11741 const e5 = T(o3.tagName); 11742 r4 ? (r4.appendChild(e5), r4 = e5) : t5 = r4 = e5; 11743 } 11744 if (o3.styleProperty && (n3[o3.styleProperty] = i4), o3.style) 11745 for (e4 in o3.style) 11746 i4 = o3.style[e4], n3[e4] = i4; 11747 } 11748 } 11749 if (Object.keys(n3).length) 11750 for (e4 in t5 || (t5 = T("span")), n3) 11751 i4 = n3[e4], t5.style[e4] = i4; 11752 return t5; 11753 } 11754 createContainerElement() { 11755 for (const t5 in this.attributes) { 11756 const e4 = this.attributes[t5], i4 = ft(t5); 11757 if (i4 && i4.groupTagName) { 11758 const n3 = {}; 11759 return n3[t5] = e4, T(i4.groupTagName, n3); 11760 } 11761 } 11762 } 11763 preserveSpaces(t5) { 11764 return this.context.isLast && (t5 = t5.replace(/\ $/, g)), t5 = t5.replace(/(\S)\ {3}(\S)/g, "$1 ".concat(g, " $2")).replace(/\ {2}/g, "".concat(g, " ")).replace(/\ {2}/g, " ".concat(g)), (this.context.isFirst || this.context.followsWhitespace) && (t5 = t5.replace(/^\ /, g)), t5; 11765 } 11766 }; 11767 var vi = class extends ie { 11768 constructor() { 11769 super(...arguments), this.text = this.object, this.textConfig = this.options.textConfig; 11770 } 11771 createNodes() { 11772 const t5 = [], e4 = Xt.groupObjects(this.getPieces()), i4 = e4.length - 1; 11773 for (let r4 = 0; r4 < e4.length; r4++) { 11774 const o3 = e4[r4], s4 = {}; 11775 0 === r4 && (s4.isFirst = true), r4 === i4 && (s4.isLast = true), Ai(n3) && (s4.followsWhitespace = true); 11776 const a4 = this.findOrCreateCachedChildView(bi, o3, { textConfig: this.textConfig, context: s4 }); 11777 t5.push(...Array.from(a4.getNodes() || [])); 11778 var n3 = o3; 11779 } 11780 return t5; 11781 } 11782 getPieces() { 11783 return Array.from(this.text.getPieces()).filter((t5) => !t5.hasAttribute("blockBreak")); 11784 } 11785 }; 11786 var Ai = (t5) => /\s$/.test(null == t5 ? void 0 : t5.toString()); 11787 var { css: yi } = z; 11788 var xi = class extends ie { 11789 constructor() { 11790 super(...arguments), this.block = this.object, this.attributes = this.block.getAttributes(); 11791 } 11792 createNodes() { 11793 const t5 = [document.createComment("block")]; 11794 if (this.block.isEmpty()) 11795 t5.push(T("br")); 11796 else { 11797 var e4; 11798 const i4 = null === (e4 = mt(this.block.getLastAttribute())) || void 0 === e4 ? void 0 : e4.text, n3 = this.findOrCreateCachedChildView(vi, this.block.text, { textConfig: i4 }); 11799 t5.push(...Array.from(n3.getNodes() || [])), this.shouldAddExtraNewlineElement() && t5.push(T("br")); 11800 } 11801 if (this.attributes.length) 11802 return t5; 11803 { 11804 let e5; 11805 const { tagName: i4 } = n.default; 11806 this.block.isRTL() && (e5 = { dir: "rtl" }); 11807 const r4 = T({ tagName: i4, attributes: e5 }); 11808 return t5.forEach((t6) => r4.appendChild(t6)), [r4]; 11809 } 11810 } 11811 createContainerElement(t5) { 11812 const e4 = {}; 11813 let i4; 11814 const n3 = this.attributes[t5], { tagName: r4, htmlAttributes: o3 = [] } = mt(n3); 11815 if (0 === t5 && this.block.isRTL() && Object.assign(e4, { dir: "rtl" }), "attachmentGallery" === n3) { 11816 const t6 = this.block.getBlockBreakPosition(); 11817 i4 = "".concat(yi.attachmentGallery, " ").concat(yi.attachmentGallery, "--").concat(t6); 11818 } 11819 return Object.entries(this.block.htmlAttributes).forEach((t6) => { 11820 let [i5, n4] = t6; 11821 o3.includes(i5) && (e4[i5] = n4); 11822 }), T({ tagName: r4, className: i4, attributes: e4 }); 11823 } 11824 shouldAddExtraNewlineElement() { 11825 return /\n\n$/.test(this.block.toString()); 11826 } 11827 }; 11828 var Ci = class extends ie { 11829 static render(t5) { 11830 const e4 = T("div"), i4 = new this(t5, { element: e4 }); 11831 return i4.render(), i4.sync(), e4; 11832 } 11833 constructor() { 11834 super(...arguments), this.element = this.options.element, this.elementStore = new Qt(), this.setDocument(this.object); 11835 } 11836 setDocument(t5) { 11837 t5.isEqualTo(this.document) || (this.document = this.object = t5); 11838 } 11839 render() { 11840 if (this.childViews = [], this.shadowElement = T("div"), !this.document.isEmpty()) { 11841 const t5 = Xt.groupObjects(this.document.getBlocks(), { asTree: true }); 11842 Array.from(t5).forEach((t6) => { 11843 const e4 = this.findOrCreateCachedChildView(xi, t6); 11844 Array.from(e4.getNodes()).map((t7) => this.shadowElement.appendChild(t7)); 11845 }); 11846 } 11847 } 11848 isSynced() { 11849 return Si(this.shadowElement, this.element); 11850 } 11851 sync() { 11852 const t5 = this.createDocumentFragmentForSync(); 11853 for (; this.element.lastChild; ) 11854 this.element.removeChild(this.element.lastChild); 11855 return this.element.appendChild(t5), this.didSync(); 11856 } 11857 didSync() { 11858 return this.elementStore.reset(Ei(this.element)), Rt(() => this.garbageCollectCachedViews()); 11859 } 11860 createDocumentFragmentForSync() { 11861 const t5 = document.createDocumentFragment(); 11862 return Array.from(this.shadowElement.childNodes).forEach((e4) => { 11863 t5.appendChild(e4.cloneNode(true)); 11864 }), Array.from(Ei(t5)).forEach((t6) => { 11865 const e4 = this.elementStore.remove(t6); 11866 e4 && t6.parentNode.replaceChild(e4, t6); 11867 }), t5; 11868 } 11869 }; 11870 var Ei = (t5) => t5.querySelectorAll("[data-trix-store-key]"); 11871 var Si = (t5, e4) => Ri(t5.innerHTML) === Ri(e4.innerHTML); 11872 var Ri = (t5) => t5.replace(/ /g, " "); 11873 function ki(t5) { 11874 var e4, i4; 11875 function n3(e5, i5) { 11876 try { 11877 var o3 = t5[e5](i5), s4 = o3.value, a4 = s4 instanceof Ti; 11878 Promise.resolve(a4 ? s4.v : s4).then(function(i6) { 11879 if (a4) { 11880 var l4 = "return" === e5 ? "return" : "next"; 11881 if (!s4.k || i6.done) 11882 return n3(l4, i6); 11883 i6 = t5[l4](i6).value; 11884 } 11885 r4(o3.done ? "return" : "normal", i6); 11886 }, function(t6) { 11887 n3("throw", t6); 11888 }); 11889 } catch (t6) { 11890 r4("throw", t6); 11891 } 11892 } 11893 function r4(t6, r5) { 11894 switch (t6) { 11895 case "return": 11896 e4.resolve({ value: r5, done: true }); 11897 break; 11898 case "throw": 11899 e4.reject(r5); 11900 break; 11901 default: 11902 e4.resolve({ value: r5, done: false }); 11903 } 11904 (e4 = e4.next) ? n3(e4.key, e4.arg) : i4 = null; 11905 } 11906 this._invoke = function(t6, r5) { 11907 return new Promise(function(o3, s4) { 11908 var a4 = { key: t6, arg: r5, resolve: o3, reject: s4, next: null }; 11909 i4 ? i4 = i4.next = a4 : (e4 = i4 = a4, n3(t6, r5)); 11910 }); 11911 }, "function" != typeof t5.return && (this.return = void 0); 11912 } 11913 function Ti(t5, e4) { 11914 this.v = t5, this.k = e4; 11915 } 11916 function wi(t5, e4, i4) { 11917 return (e4 = Li(e4)) in t5 ? Object.defineProperty(t5, e4, { value: i4, enumerable: true, configurable: true, writable: true }) : t5[e4] = i4, t5; 11918 } 11919 function Li(t5) { 11920 var e4 = function(t6, e5) { 11921 if ("object" != typeof t6 || null === t6) 11922 return t6; 11923 var i4 = t6[Symbol.toPrimitive]; 11924 if (void 0 !== i4) { 11925 var n3 = i4.call(t6, e5 || "default"); 11926 if ("object" != typeof n3) 11927 return n3; 11928 throw new TypeError("@@toPrimitive must return a primitive value."); 11929 } 11930 return ("string" === e5 ? String : Number)(t6); 11931 }(t5, "string"); 11932 return "symbol" == typeof e4 ? e4 : String(e4); 11933 } 11934 ki.prototype["function" == typeof Symbol && Symbol.asyncIterator || "@@asyncIterator"] = function() { 11935 return this; 11936 }, ki.prototype.next = function(t5) { 11937 return this._invoke("next", t5); 11938 }, ki.prototype.throw = function(t5) { 11939 return this._invoke("throw", t5); 11940 }, ki.prototype.return = function(t5) { 11941 return this._invoke("return", t5); 11942 }; 11943 function Di(t5, e4) { 11944 return Oi(t5, Ii(t5, e4, "get")); 11945 } 11946 function Ni(t5, e4, i4) { 11947 return Fi(t5, Ii(t5, e4, "set"), i4), i4; 11948 } 11949 function Ii(t5, e4, i4) { 11950 if (!e4.has(t5)) 11951 throw new TypeError("attempted to " + i4 + " private field on non-instance"); 11952 return e4.get(t5); 11953 } 11954 function Oi(t5, e4) { 11955 return e4.get ? e4.get.call(t5) : e4.value; 11956 } 11957 function Fi(t5, e4, i4) { 11958 if (e4.set) 11959 e4.set.call(t5, i4); 11960 else { 11961 if (!e4.writable) 11962 throw new TypeError("attempted to set read only private field"); 11963 e4.value = i4; 11964 } 11965 } 11966 function Pi(t5, e4, i4) { 11967 if (!e4.has(t5)) 11968 throw new TypeError("attempted to get private field on non-instance"); 11969 return i4; 11970 } 11971 function Mi(t5, e4) { 11972 if (e4.has(t5)) 11973 throw new TypeError("Cannot initialize the same private elements twice on an object"); 11974 } 11975 function Bi(t5, e4, i4) { 11976 Mi(t5, e4), e4.set(t5, i4); 11977 } 11978 var _i = class extends rt { 11979 static registerType(t5, e4) { 11980 e4.type = t5, this.types[t5] = e4; 11981 } 11982 static fromJSON(t5) { 11983 const e4 = this.types[t5.type]; 11984 if (e4) 11985 return e4.fromJSON(t5); 11986 } 11987 constructor(t5) { 11988 let e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 11989 super(...arguments), this.attributes = Ht.box(e4); 11990 } 11991 copyWithAttributes(t5) { 11992 return new this.constructor(this.getValue(), t5); 11993 } 11994 copyWithAdditionalAttributes(t5) { 11995 return this.copyWithAttributes(this.attributes.merge(t5)); 11996 } 11997 copyWithoutAttribute(t5) { 11998 return this.copyWithAttributes(this.attributes.remove(t5)); 11999 } 12000 copy() { 12001 return this.copyWithAttributes(this.attributes); 12002 } 12003 getAttribute(t5) { 12004 return this.attributes.get(t5); 12005 } 12006 getAttributesHash() { 12007 return this.attributes; 12008 } 12009 getAttributes() { 12010 return this.attributes.toObject(); 12011 } 12012 hasAttribute(t5) { 12013 return this.attributes.has(t5); 12014 } 12015 hasSameStringValueAsPiece(t5) { 12016 return t5 && this.toString() === t5.toString(); 12017 } 12018 hasSameAttributesAsPiece(t5) { 12019 return t5 && (this.attributes === t5.attributes || this.attributes.isEqualTo(t5.attributes)); 12020 } 12021 isBlockBreak() { 12022 return false; 12023 } 12024 isEqualTo(t5) { 12025 return super.isEqualTo(...arguments) || this.hasSameConstructorAs(t5) && this.hasSameStringValueAsPiece(t5) && this.hasSameAttributesAsPiece(t5); 12026 } 12027 isEmpty() { 12028 return 0 === this.length; 12029 } 12030 isSerializable() { 12031 return true; 12032 } 12033 toJSON() { 12034 return { type: this.constructor.type, attributes: this.getAttributes() }; 12035 } 12036 contentsForInspection() { 12037 return { type: this.constructor.type, attributes: this.attributes.inspect() }; 12038 } 12039 canBeGrouped() { 12040 return this.hasAttribute("href"); 12041 } 12042 canBeGroupedWith(t5) { 12043 return this.getAttribute("href") === t5.getAttribute("href"); 12044 } 12045 getLength() { 12046 return this.length; 12047 } 12048 canBeConsolidatedWith(t5) { 12049 return false; 12050 } 12051 }; 12052 wi(_i, "types", {}); 12053 var ji = class extends ee { 12054 constructor(t5) { 12055 super(...arguments), this.url = t5; 12056 } 12057 perform(t5) { 12058 const e4 = new Image(); 12059 e4.onload = () => (e4.width = this.width = e4.naturalWidth, e4.height = this.height = e4.naturalHeight, t5(true, e4)), e4.onerror = () => t5(false), e4.src = this.url; 12060 } 12061 }; 12062 var Wi = class extends rt { 12063 static attachmentForFile(t5) { 12064 const e4 = new this(this.attributesForFile(t5)); 12065 return e4.setFile(t5), e4; 12066 } 12067 static attributesForFile(t5) { 12068 return new Ht({ filename: t5.name, filesize: t5.size, contentType: t5.type }); 12069 } 12070 static fromJSON(t5) { 12071 return new this(t5); 12072 } 12073 constructor() { 12074 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 12075 super(t5), this.releaseFile = this.releaseFile.bind(this), this.attributes = Ht.box(t5), this.didChangeAttributes(); 12076 } 12077 getAttribute(t5) { 12078 return this.attributes.get(t5); 12079 } 12080 hasAttribute(t5) { 12081 return this.attributes.has(t5); 12082 } 12083 getAttributes() { 12084 return this.attributes.toObject(); 12085 } 12086 setAttributes() { 12087 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 12088 const e4 = this.attributes.merge(t5); 12089 var i4, n3, r4, o3; 12090 if (!this.attributes.isEqualTo(e4)) 12091 return this.attributes = e4, this.didChangeAttributes(), null === (i4 = this.previewDelegate) || void 0 === i4 || null === (n3 = i4.attachmentDidChangeAttributes) || void 0 === n3 || n3.call(i4, this), null === (r4 = this.delegate) || void 0 === r4 || null === (o3 = r4.attachmentDidChangeAttributes) || void 0 === o3 ? void 0 : o3.call(r4, this); 12092 } 12093 didChangeAttributes() { 12094 if (this.isPreviewable()) 12095 return this.preloadURL(); 12096 } 12097 isPending() { 12098 return null != this.file && !(this.getURL() || this.getHref()); 12099 } 12100 isPreviewable() { 12101 return this.attributes.has("previewable") ? this.attributes.get("previewable") : Wi.previewablePattern.test(this.getContentType()); 12102 } 12103 getType() { 12104 return this.hasContent() ? "content" : this.isPreviewable() ? "preview" : "file"; 12105 } 12106 getURL() { 12107 return this.attributes.get("url"); 12108 } 12109 getHref() { 12110 return this.attributes.get("href"); 12111 } 12112 getFilename() { 12113 return this.attributes.get("filename") || ""; 12114 } 12115 getFilesize() { 12116 return this.attributes.get("filesize"); 12117 } 12118 getFormattedFilesize() { 12119 const t5 = this.attributes.get("filesize"); 12120 return "number" == typeof t5 ? h.formatter(t5) : ""; 12121 } 12122 getExtension() { 12123 var t5; 12124 return null === (t5 = this.getFilename().match(/\.(\w+)$/)) || void 0 === t5 ? void 0 : t5[1].toLowerCase(); 12125 } 12126 getContentType() { 12127 return this.attributes.get("contentType"); 12128 } 12129 hasContent() { 12130 return this.attributes.has("content"); 12131 } 12132 getContent() { 12133 return this.attributes.get("content"); 12134 } 12135 getWidth() { 12136 return this.attributes.get("width"); 12137 } 12138 getHeight() { 12139 return this.attributes.get("height"); 12140 } 12141 getFile() { 12142 return this.file; 12143 } 12144 setFile(t5) { 12145 if (this.file = t5, this.isPreviewable()) 12146 return this.preloadFile(); 12147 } 12148 releaseFile() { 12149 this.releasePreloadedFile(), this.file = null; 12150 } 12151 getUploadProgress() { 12152 return null != this.uploadProgress ? this.uploadProgress : 0; 12153 } 12154 setUploadProgress(t5) { 12155 var e4, i4; 12156 if (this.uploadProgress !== t5) 12157 return this.uploadProgress = t5, null === (e4 = this.uploadProgressDelegate) || void 0 === e4 || null === (i4 = e4.attachmentDidChangeUploadProgress) || void 0 === i4 ? void 0 : i4.call(e4, this); 12158 } 12159 toJSON() { 12160 return this.getAttributes(); 12161 } 12162 getCacheKey() { 12163 return [super.getCacheKey(...arguments), this.attributes.getCacheKey(), this.getPreviewURL()].join("/"); 12164 } 12165 getPreviewURL() { 12166 return this.previewURL || this.preloadingURL; 12167 } 12168 setPreviewURL(t5) { 12169 var e4, i4, n3, r4; 12170 if (t5 !== this.getPreviewURL()) 12171 return this.previewURL = t5, null === (e4 = this.previewDelegate) || void 0 === e4 || null === (i4 = e4.attachmentDidChangeAttributes) || void 0 === i4 || i4.call(e4, this), null === (n3 = this.delegate) || void 0 === n3 || null === (r4 = n3.attachmentDidChangePreviewURL) || void 0 === r4 ? void 0 : r4.call(n3, this); 12172 } 12173 preloadURL() { 12174 return this.preload(this.getURL(), this.releaseFile); 12175 } 12176 preloadFile() { 12177 if (this.file) 12178 return this.fileObjectURL = URL.createObjectURL(this.file), this.preload(this.fileObjectURL); 12179 } 12180 releasePreloadedFile() { 12181 this.fileObjectURL && (URL.revokeObjectURL(this.fileObjectURL), this.fileObjectURL = null); 12182 } 12183 preload(t5, e4) { 12184 if (t5 && t5 !== this.getPreviewURL()) { 12185 this.preloadingURL = t5; 12186 return new ji(t5).then((i4) => { 12187 let { width: n3, height: r4 } = i4; 12188 return this.getWidth() && this.getHeight() || this.setAttributes({ width: n3, height: r4 }), this.preloadingURL = null, this.setPreviewURL(t5), null == e4 ? void 0 : e4(); 12189 }).catch(() => (this.preloadingURL = null, null == e4 ? void 0 : e4())); 12190 } 12191 } 12192 }; 12193 wi(Wi, "previewablePattern", /^image(\/(gif|png|webp|jpe?g)|$)/); 12194 var Ui = class extends _i { 12195 static fromJSON(t5) { 12196 return new this(Wi.fromJSON(t5.attachment), t5.attributes); 12197 } 12198 constructor(t5) { 12199 super(...arguments), this.attachment = t5, this.length = 1, this.ensureAttachmentExclusivelyHasAttribute("href"), this.attachment.hasContent() || this.removeProhibitedAttributes(); 12200 } 12201 ensureAttachmentExclusivelyHasAttribute(t5) { 12202 this.hasAttribute(t5) && (this.attachment.hasAttribute(t5) || this.attachment.setAttributes(this.attributes.slice([t5])), this.attributes = this.attributes.remove(t5)); 12203 } 12204 removeProhibitedAttributes() { 12205 const t5 = this.attributes.slice(Ui.permittedAttributes); 12206 t5.isEqualTo(this.attributes) || (this.attributes = t5); 12207 } 12208 getValue() { 12209 return this.attachment; 12210 } 12211 isSerializable() { 12212 return !this.attachment.isPending(); 12213 } 12214 getCaption() { 12215 return this.attributes.get("caption") || ""; 12216 } 12217 isEqualTo(t5) { 12218 var e4; 12219 return super.isEqualTo(t5) && this.attachment.id === (null == t5 || null === (e4 = t5.attachment) || void 0 === e4 ? void 0 : e4.id); 12220 } 12221 toString() { 12222 return "\uFFFC"; 12223 } 12224 toJSON() { 12225 const t5 = super.toJSON(...arguments); 12226 return t5.attachment = this.attachment, t5; 12227 } 12228 getCacheKey() { 12229 return [super.getCacheKey(...arguments), this.attachment.getCacheKey()].join("/"); 12230 } 12231 toConsole() { 12232 return JSON.stringify(this.toString()); 12233 } 12234 }; 12235 wi(Ui, "permittedAttributes", ["caption", "presentation"]), _i.registerType("attachment", Ui); 12236 var Vi = class extends _i { 12237 static fromJSON(t5) { 12238 return new this(t5.string, t5.attributes); 12239 } 12240 constructor(t5) { 12241 super(...arguments), this.string = ((t6) => t6.replace(/\r\n?/g, "\n"))(t5), this.length = this.string.length; 12242 } 12243 getValue() { 12244 return this.string; 12245 } 12246 toString() { 12247 return this.string.toString(); 12248 } 12249 isBlockBreak() { 12250 return "\n" === this.toString() && true === this.getAttribute("blockBreak"); 12251 } 12252 toJSON() { 12253 const t5 = super.toJSON(...arguments); 12254 return t5.string = this.string, t5; 12255 } 12256 canBeConsolidatedWith(t5) { 12257 return t5 && this.hasSameConstructorAs(t5) && this.hasSameAttributesAsPiece(t5); 12258 } 12259 consolidateWith(t5) { 12260 return new this.constructor(this.toString() + t5.toString(), this.attributes); 12261 } 12262 splitAtOffset(t5) { 12263 let e4, i4; 12264 return 0 === t5 ? (e4 = null, i4 = this) : t5 === this.length ? (e4 = this, i4 = null) : (e4 = new this.constructor(this.string.slice(0, t5), this.attributes), i4 = new this.constructor(this.string.slice(t5), this.attributes)), [e4, i4]; 12265 } 12266 toConsole() { 12267 let { string: t5 } = this; 12268 return t5.length > 15 && (t5 = t5.slice(0, 14) + "\u2026"), JSON.stringify(t5.toString()); 12269 } 12270 }; 12271 _i.registerType("string", Vi); 12272 var zi = class extends rt { 12273 static box(t5) { 12274 return t5 instanceof this ? t5 : new this(t5); 12275 } 12276 constructor() { 12277 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 12278 super(...arguments), this.objects = t5.slice(0), this.length = this.objects.length; 12279 } 12280 indexOf(t5) { 12281 return this.objects.indexOf(t5); 12282 } 12283 splice() { 12284 for (var t5 = arguments.length, e4 = new Array(t5), i4 = 0; i4 < t5; i4++) 12285 e4[i4] = arguments[i4]; 12286 return new this.constructor(st(this.objects, ...e4)); 12287 } 12288 eachObject(t5) { 12289 return this.objects.map((e4, i4) => t5(e4, i4)); 12290 } 12291 insertObjectAtIndex(t5, e4) { 12292 return this.splice(e4, 0, t5); 12293 } 12294 insertSplittableListAtIndex(t5, e4) { 12295 return this.splice(e4, 0, ...t5.objects); 12296 } 12297 insertSplittableListAtPosition(t5, e4) { 12298 const [i4, n3] = this.splitObjectAtPosition(e4); 12299 return new this.constructor(i4).insertSplittableListAtIndex(t5, n3); 12300 } 12301 editObjectAtIndex(t5, e4) { 12302 return this.replaceObjectAtIndex(e4(this.objects[t5]), t5); 12303 } 12304 replaceObjectAtIndex(t5, e4) { 12305 return this.splice(e4, 1, t5); 12306 } 12307 removeObjectAtIndex(t5) { 12308 return this.splice(t5, 1); 12309 } 12310 getObjectAtIndex(t5) { 12311 return this.objects[t5]; 12312 } 12313 getSplittableListInRange(t5) { 12314 const [e4, i4, n3] = this.splitObjectsAtRange(t5); 12315 return new this.constructor(e4.slice(i4, n3 + 1)); 12316 } 12317 selectSplittableList(t5) { 12318 const e4 = this.objects.filter((e5) => t5(e5)); 12319 return new this.constructor(e4); 12320 } 12321 removeObjectsInRange(t5) { 12322 const [e4, i4, n3] = this.splitObjectsAtRange(t5); 12323 return new this.constructor(e4).splice(i4, n3 - i4 + 1); 12324 } 12325 transformObjectsInRange(t5, e4) { 12326 const [i4, n3, r4] = this.splitObjectsAtRange(t5), o3 = i4.map((t6, i5) => n3 <= i5 && i5 <= r4 ? e4(t6) : t6); 12327 return new this.constructor(o3); 12328 } 12329 splitObjectsAtRange(t5) { 12330 let e4, [i4, n3, r4] = this.splitObjectAtPosition(Hi(t5)); 12331 return [i4, e4] = new this.constructor(i4).splitObjectAtPosition(Ji(t5) + r4), [i4, n3, e4 - 1]; 12332 } 12333 getObjectAtPosition(t5) { 12334 const { index: e4 } = this.findIndexAndOffsetAtPosition(t5); 12335 return this.objects[e4]; 12336 } 12337 splitObjectAtPosition(t5) { 12338 let e4, i4; 12339 const { index: n3, offset: r4 } = this.findIndexAndOffsetAtPosition(t5), o3 = this.objects.slice(0); 12340 if (null != n3) 12341 if (0 === r4) 12342 e4 = n3, i4 = 0; 12343 else { 12344 const t6 = this.getObjectAtIndex(n3), [s4, a4] = t6.splitAtOffset(r4); 12345 o3.splice(n3, 1, s4, a4), e4 = n3 + 1, i4 = s4.getLength() - r4; 12346 } 12347 else 12348 e4 = o3.length, i4 = 0; 12349 return [o3, e4, i4]; 12350 } 12351 consolidate() { 12352 const t5 = []; 12353 let e4 = this.objects[0]; 12354 return this.objects.slice(1).forEach((i4) => { 12355 var n3, r4; 12356 null !== (n3 = (r4 = e4).canBeConsolidatedWith) && void 0 !== n3 && n3.call(r4, i4) ? e4 = e4.consolidateWith(i4) : (t5.push(e4), e4 = i4); 12357 }), e4 && t5.push(e4), new this.constructor(t5); 12358 } 12359 consolidateFromIndexToIndex(t5, e4) { 12360 const i4 = this.objects.slice(0).slice(t5, e4 + 1), n3 = new this.constructor(i4).consolidate().toArray(); 12361 return this.splice(t5, i4.length, ...n3); 12362 } 12363 findIndexAndOffsetAtPosition(t5) { 12364 let e4, i4 = 0; 12365 for (e4 = 0; e4 < this.objects.length; e4++) { 12366 const n3 = i4 + this.objects[e4].getLength(); 12367 if (i4 <= t5 && t5 < n3) 12368 return { index: e4, offset: t5 - i4 }; 12369 i4 = n3; 12370 } 12371 return { index: null, offset: null }; 12372 } 12373 findPositionAtIndexAndOffset(t5, e4) { 12374 let i4 = 0; 12375 for (let n3 = 0; n3 < this.objects.length; n3++) { 12376 const r4 = this.objects[n3]; 12377 if (n3 < t5) 12378 i4 += r4.getLength(); 12379 else if (n3 === t5) { 12380 i4 += e4; 12381 break; 12382 } 12383 } 12384 return i4; 12385 } 12386 getEndPosition() { 12387 return null == this.endPosition && (this.endPosition = 0, this.objects.forEach((t5) => this.endPosition += t5.getLength())), this.endPosition; 12388 } 12389 toString() { 12390 return this.objects.join(""); 12391 } 12392 toArray() { 12393 return this.objects.slice(0); 12394 } 12395 toJSON() { 12396 return this.toArray(); 12397 } 12398 isEqualTo(t5) { 12399 return super.isEqualTo(...arguments) || qi(this.objects, null == t5 ? void 0 : t5.objects); 12400 } 12401 contentsForInspection() { 12402 return { objects: "[".concat(this.objects.map((t5) => t5.inspect()).join(", "), "]") }; 12403 } 12404 }; 12405 var qi = function(t5) { 12406 let e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : []; 12407 if (t5.length !== e4.length) 12408 return false; 12409 let i4 = true; 12410 for (let n3 = 0; n3 < t5.length; n3++) { 12411 const r4 = t5[n3]; 12412 i4 && !r4.isEqualTo(e4[n3]) && (i4 = false); 12413 } 12414 return i4; 12415 }; 12416 var Hi = (t5) => t5[0]; 12417 var Ji = (t5) => t5[1]; 12418 var Ki = class extends rt { 12419 static textForAttachmentWithAttributes(t5, e4) { 12420 return new this([new Ui(t5, e4)]); 12421 } 12422 static textForStringWithAttributes(t5, e4) { 12423 return new this([new Vi(t5, e4)]); 12424 } 12425 static fromJSON(t5) { 12426 return new this(Array.from(t5).map((t6) => _i.fromJSON(t6))); 12427 } 12428 constructor() { 12429 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 12430 super(...arguments); 12431 const e4 = t5.filter((t6) => !t6.isEmpty()); 12432 this.pieceList = new zi(e4); 12433 } 12434 copy() { 12435 return this.copyWithPieceList(this.pieceList); 12436 } 12437 copyWithPieceList(t5) { 12438 return new this.constructor(t5.consolidate().toArray()); 12439 } 12440 copyUsingObjectMap(t5) { 12441 const e4 = this.getPieces().map((e5) => t5.find(e5) || e5); 12442 return new this.constructor(e4); 12443 } 12444 appendText(t5) { 12445 return this.insertTextAtPosition(t5, this.getLength()); 12446 } 12447 insertTextAtPosition(t5, e4) { 12448 return this.copyWithPieceList(this.pieceList.insertSplittableListAtPosition(t5.pieceList, e4)); 12449 } 12450 removeTextAtRange(t5) { 12451 return this.copyWithPieceList(this.pieceList.removeObjectsInRange(t5)); 12452 } 12453 replaceTextAtRange(t5, e4) { 12454 return this.removeTextAtRange(e4).insertTextAtPosition(t5, e4[0]); 12455 } 12456 moveTextFromRangeToPosition(t5, e4) { 12457 if (t5[0] <= e4 && e4 <= t5[1]) 12458 return; 12459 const i4 = this.getTextAtRange(t5), n3 = i4.getLength(); 12460 return t5[0] < e4 && (e4 -= n3), this.removeTextAtRange(t5).insertTextAtPosition(i4, e4); 12461 } 12462 addAttributeAtRange(t5, e4, i4) { 12463 const n3 = {}; 12464 return n3[t5] = e4, this.addAttributesAtRange(n3, i4); 12465 } 12466 addAttributesAtRange(t5, e4) { 12467 return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e4, (e5) => e5.copyWithAdditionalAttributes(t5))); 12468 } 12469 removeAttributeAtRange(t5, e4) { 12470 return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e4, (e5) => e5.copyWithoutAttribute(t5))); 12471 } 12472 setAttributesAtRange(t5, e4) { 12473 return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e4, (e5) => e5.copyWithAttributes(t5))); 12474 } 12475 getAttributesAtPosition(t5) { 12476 var e4; 12477 return (null === (e4 = this.pieceList.getObjectAtPosition(t5)) || void 0 === e4 ? void 0 : e4.getAttributes()) || {}; 12478 } 12479 getCommonAttributes() { 12480 const t5 = Array.from(this.pieceList.toArray()).map((t6) => t6.getAttributes()); 12481 return Ht.fromCommonAttributesOfObjects(t5).toObject(); 12482 } 12483 getCommonAttributesAtRange(t5) { 12484 return this.getTextAtRange(t5).getCommonAttributes() || {}; 12485 } 12486 getExpandedRangeForAttributeAtOffset(t5, e4) { 12487 let i4, n3 = i4 = e4; 12488 const r4 = this.getLength(); 12489 for (; n3 > 0 && this.getCommonAttributesAtRange([n3 - 1, i4])[t5]; ) 12490 n3--; 12491 for (; i4 < r4 && this.getCommonAttributesAtRange([e4, i4 + 1])[t5]; ) 12492 i4++; 12493 return [n3, i4]; 12494 } 12495 getTextAtRange(t5) { 12496 return this.copyWithPieceList(this.pieceList.getSplittableListInRange(t5)); 12497 } 12498 getStringAtRange(t5) { 12499 return this.pieceList.getSplittableListInRange(t5).toString(); 12500 } 12501 getStringAtPosition(t5) { 12502 return this.getStringAtRange([t5, t5 + 1]); 12503 } 12504 startsWithString(t5) { 12505 return this.getStringAtRange([0, t5.length]) === t5; 12506 } 12507 endsWithString(t5) { 12508 const e4 = this.getLength(); 12509 return this.getStringAtRange([e4 - t5.length, e4]) === t5; 12510 } 12511 getAttachmentPieces() { 12512 return this.pieceList.toArray().filter((t5) => !!t5.attachment); 12513 } 12514 getAttachments() { 12515 return this.getAttachmentPieces().map((t5) => t5.attachment); 12516 } 12517 getAttachmentAndPositionById(t5) { 12518 let e4 = 0; 12519 for (const n3 of this.pieceList.toArray()) { 12520 var i4; 12521 if ((null === (i4 = n3.attachment) || void 0 === i4 ? void 0 : i4.id) === t5) 12522 return { attachment: n3.attachment, position: e4 }; 12523 e4 += n3.length; 12524 } 12525 return { attachment: null, position: null }; 12526 } 12527 getAttachmentById(t5) { 12528 const { attachment: e4 } = this.getAttachmentAndPositionById(t5); 12529 return e4; 12530 } 12531 getRangeOfAttachment(t5) { 12532 const e4 = this.getAttachmentAndPositionById(t5.id), i4 = e4.position; 12533 if (t5 = e4.attachment) 12534 return [i4, i4 + 1]; 12535 } 12536 updateAttributesForAttachment(t5, e4) { 12537 const i4 = this.getRangeOfAttachment(e4); 12538 return i4 ? this.addAttributesAtRange(t5, i4) : this; 12539 } 12540 getLength() { 12541 return this.pieceList.getEndPosition(); 12542 } 12543 isEmpty() { 12544 return 0 === this.getLength(); 12545 } 12546 isEqualTo(t5) { 12547 var e4; 12548 return super.isEqualTo(t5) || (null == t5 || null === (e4 = t5.pieceList) || void 0 === e4 ? void 0 : e4.isEqualTo(this.pieceList)); 12549 } 12550 isBlockBreak() { 12551 return 1 === this.getLength() && this.pieceList.getObjectAtIndex(0).isBlockBreak(); 12552 } 12553 eachPiece(t5) { 12554 return this.pieceList.eachObject(t5); 12555 } 12556 getPieces() { 12557 return this.pieceList.toArray(); 12558 } 12559 getPieceAtPosition(t5) { 12560 return this.pieceList.getObjectAtPosition(t5); 12561 } 12562 contentsForInspection() { 12563 return { pieceList: this.pieceList.inspect() }; 12564 } 12565 toSerializableText() { 12566 const t5 = this.pieceList.selectSplittableList((t6) => t6.isSerializable()); 12567 return this.copyWithPieceList(t5); 12568 } 12569 toString() { 12570 return this.pieceList.toString(); 12571 } 12572 toJSON() { 12573 return this.pieceList.toJSON(); 12574 } 12575 toConsole() { 12576 return JSON.stringify(this.pieceList.toArray().map((t5) => JSON.parse(t5.toConsole()))); 12577 } 12578 getDirection() { 12579 return lt(this.toString()); 12580 } 12581 isRTL() { 12582 return "rtl" === this.getDirection(); 12583 } 12584 }; 12585 var Gi = class extends rt { 12586 static fromJSON(t5) { 12587 return new this(Ki.fromJSON(t5.text), t5.attributes, t5.htmlAttributes); 12588 } 12589 constructor(t5, e4, i4) { 12590 super(...arguments), this.text = Yi(t5 || new Ki()), this.attributes = e4 || [], this.htmlAttributes = i4 || {}; 12591 } 12592 isEmpty() { 12593 return this.text.isBlockBreak(); 12594 } 12595 isEqualTo(t5) { 12596 return !!super.isEqualTo(t5) || this.text.isEqualTo(null == t5 ? void 0 : t5.text) && ot(this.attributes, null == t5 ? void 0 : t5.attributes) && Tt(this.htmlAttributes, null == t5 ? void 0 : t5.htmlAttributes); 12597 } 12598 copyWithText(t5) { 12599 return new Gi(t5, this.attributes, this.htmlAttributes); 12600 } 12601 copyWithoutText() { 12602 return this.copyWithText(null); 12603 } 12604 copyWithAttributes(t5) { 12605 return new Gi(this.text, t5, this.htmlAttributes); 12606 } 12607 copyWithoutAttributes() { 12608 return this.copyWithAttributes(null); 12609 } 12610 copyUsingObjectMap(t5) { 12611 const e4 = t5.find(this.text); 12612 return e4 ? this.copyWithText(e4) : this.copyWithText(this.text.copyUsingObjectMap(t5)); 12613 } 12614 addAttribute(t5) { 12615 const e4 = this.attributes.concat(en(t5)); 12616 return this.copyWithAttributes(e4); 12617 } 12618 addHTMLAttribute(t5, e4) { 12619 const i4 = Object.assign({}, this.htmlAttributes, { [t5]: e4 }); 12620 return new Gi(this.text, this.attributes, i4); 12621 } 12622 removeAttribute(t5) { 12623 const { listAttribute: e4 } = mt(t5), i4 = rn(rn(this.attributes, t5), e4); 12624 return this.copyWithAttributes(i4); 12625 } 12626 removeLastAttribute() { 12627 return this.removeAttribute(this.getLastAttribute()); 12628 } 12629 getLastAttribute() { 12630 return nn(this.attributes); 12631 } 12632 getAttributes() { 12633 return this.attributes.slice(0); 12634 } 12635 getAttributeLevel() { 12636 return this.attributes.length; 12637 } 12638 getAttributeAtLevel(t5) { 12639 return this.attributes[t5 - 1]; 12640 } 12641 hasAttribute(t5) { 12642 return this.attributes.includes(t5); 12643 } 12644 hasAttributes() { 12645 return this.getAttributeLevel() > 0; 12646 } 12647 getLastNestableAttribute() { 12648 return nn(this.getNestableAttributes()); 12649 } 12650 getNestableAttributes() { 12651 return this.attributes.filter((t5) => mt(t5).nestable); 12652 } 12653 getNestingLevel() { 12654 return this.getNestableAttributes().length; 12655 } 12656 decreaseNestingLevel() { 12657 const t5 = this.getLastNestableAttribute(); 12658 return t5 ? this.removeAttribute(t5) : this; 12659 } 12660 increaseNestingLevel() { 12661 const t5 = this.getLastNestableAttribute(); 12662 if (t5) { 12663 const e4 = this.attributes.lastIndexOf(t5), i4 = st(this.attributes, e4 + 1, 0, ...en(t5)); 12664 return this.copyWithAttributes(i4); 12665 } 12666 return this; 12667 } 12668 getListItemAttributes() { 12669 return this.attributes.filter((t5) => mt(t5).listAttribute); 12670 } 12671 isListItem() { 12672 var t5; 12673 return null === (t5 = mt(this.getLastAttribute())) || void 0 === t5 ? void 0 : t5.listAttribute; 12674 } 12675 isTerminalBlock() { 12676 var t5; 12677 return null === (t5 = mt(this.getLastAttribute())) || void 0 === t5 ? void 0 : t5.terminal; 12678 } 12679 breaksOnReturn() { 12680 var t5; 12681 return null === (t5 = mt(this.getLastAttribute())) || void 0 === t5 ? void 0 : t5.breakOnReturn; 12682 } 12683 findLineBreakInDirectionFromPosition(t5, e4) { 12684 const i4 = this.toString(); 12685 let n3; 12686 switch (t5) { 12687 case "forward": 12688 n3 = i4.indexOf("\n", e4); 12689 break; 12690 case "backward": 12691 n3 = i4.slice(0, e4).lastIndexOf("\n"); 12692 } 12693 if (-1 !== n3) 12694 return n3; 12695 } 12696 contentsForInspection() { 12697 return { text: this.text.inspect(), attributes: this.attributes }; 12698 } 12699 toString() { 12700 return this.text.toString(); 12701 } 12702 toJSON() { 12703 return { text: this.text, attributes: this.attributes, htmlAttributes: this.htmlAttributes }; 12704 } 12705 getDirection() { 12706 return this.text.getDirection(); 12707 } 12708 isRTL() { 12709 return this.text.isRTL(); 12710 } 12711 getLength() { 12712 return this.text.getLength(); 12713 } 12714 canBeConsolidatedWith(t5) { 12715 return !this.hasAttributes() && !t5.hasAttributes() && this.getDirection() === t5.getDirection(); 12716 } 12717 consolidateWith(t5) { 12718 const e4 = Ki.textForStringWithAttributes("\n"), i4 = this.getTextWithoutBlockBreak().appendText(e4); 12719 return this.copyWithText(i4.appendText(t5.text)); 12720 } 12721 splitAtOffset(t5) { 12722 let e4, i4; 12723 return 0 === t5 ? (e4 = null, i4 = this) : t5 === this.getLength() ? (e4 = this, i4 = null) : (e4 = this.copyWithText(this.text.getTextAtRange([0, t5])), i4 = this.copyWithText(this.text.getTextAtRange([t5, this.getLength()]))), [e4, i4]; 12724 } 12725 getBlockBreakPosition() { 12726 return this.text.getLength() - 1; 12727 } 12728 getTextWithoutBlockBreak() { 12729 return Qi(this.text) ? this.text.getTextAtRange([0, this.getBlockBreakPosition()]) : this.text.copy(); 12730 } 12731 canBeGrouped(t5) { 12732 return this.attributes[t5]; 12733 } 12734 canBeGroupedWith(t5, e4) { 12735 const i4 = t5.getAttributes(), r4 = i4[e4], o3 = this.attributes[e4]; 12736 return o3 === r4 && !(false === mt(o3).group && !(() => { 12737 if (!dt) { 12738 dt = []; 12739 for (const t6 in n) { 12740 const { listAttribute: e5 } = n[t6]; 12741 null != e5 && dt.push(e5); 12742 } 12743 } 12744 return dt; 12745 })().includes(i4[e4 + 1])) && (this.getDirection() === t5.getDirection() || t5.isEmpty()); 12746 } 12747 }; 12748 var Yi = function(t5) { 12749 return t5 = $i(t5), t5 = Zi(t5); 12750 }; 12751 var $i = function(t5) { 12752 let e4 = false; 12753 const i4 = t5.getPieces(); 12754 let n3 = i4.slice(0, i4.length - 1); 12755 const r4 = i4[i4.length - 1]; 12756 return r4 ? (n3 = n3.map((t6) => t6.isBlockBreak() ? (e4 = true, tn(t6)) : t6), e4 ? new Ki([...n3, r4]) : t5) : t5; 12757 }; 12758 var Xi = Ki.textForStringWithAttributes("\n", { blockBreak: true }); 12759 var Zi = function(t5) { 12760 return Qi(t5) ? t5 : t5.appendText(Xi); 12761 }; 12762 var Qi = function(t5) { 12763 const e4 = t5.getLength(); 12764 if (0 === e4) 12765 return false; 12766 return t5.getTextAtRange([e4 - 1, e4]).isBlockBreak(); 12767 }; 12768 var tn = (t5) => t5.copyWithoutAttribute("blockBreak"); 12769 var en = function(t5) { 12770 const { listAttribute: e4 } = mt(t5); 12771 return e4 ? [e4, t5] : [t5]; 12772 }; 12773 var nn = (t5) => t5.slice(-1)[0]; 12774 var rn = function(t5, e4) { 12775 const i4 = t5.lastIndexOf(e4); 12776 return -1 === i4 ? t5 : st(t5, i4, 1); 12777 }; 12778 var on = class extends rt { 12779 static fromJSON(t5) { 12780 return new this(Array.from(t5).map((t6) => Gi.fromJSON(t6))); 12781 } 12782 static fromString(t5, e4) { 12783 const i4 = Ki.textForStringWithAttributes(t5, e4); 12784 return new this([new Gi(i4)]); 12785 } 12786 constructor() { 12787 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 12788 super(...arguments), 0 === t5.length && (t5 = [new Gi()]), this.blockList = zi.box(t5); 12789 } 12790 isEmpty() { 12791 const t5 = this.getBlockAtIndex(0); 12792 return 1 === this.blockList.length && t5.isEmpty() && !t5.hasAttributes(); 12793 } 12794 copy() { 12795 const t5 = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).consolidateBlocks ? this.blockList.consolidate().toArray() : this.blockList.toArray(); 12796 return new this.constructor(t5); 12797 } 12798 copyUsingObjectsFromDocument(t5) { 12799 const e4 = new Zt(t5.getObjects()); 12800 return this.copyUsingObjectMap(e4); 12801 } 12802 copyUsingObjectMap(t5) { 12803 const e4 = this.getBlocks().map((e5) => t5.find(e5) || e5.copyUsingObjectMap(t5)); 12804 return new this.constructor(e4); 12805 } 12806 copyWithBaseBlockAttributes() { 12807 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 12808 const e4 = this.getBlocks().map((e5) => { 12809 const i4 = t5.concat(e5.getAttributes()); 12810 return e5.copyWithAttributes(i4); 12811 }); 12812 return new this.constructor(e4); 12813 } 12814 replaceBlock(t5, e4) { 12815 const i4 = this.blockList.indexOf(t5); 12816 return -1 === i4 ? this : new this.constructor(this.blockList.replaceObjectAtIndex(e4, i4)); 12817 } 12818 insertDocumentAtRange(t5, e4) { 12819 const { blockList: i4 } = t5; 12820 e4 = wt(e4); 12821 let [n3] = e4; 12822 const { index: r4, offset: o3 } = this.locationFromPosition(n3); 12823 let s4 = this; 12824 const a4 = this.getBlockAtPosition(n3); 12825 return Lt(e4) && a4.isEmpty() && !a4.hasAttributes() ? s4 = new this.constructor(s4.blockList.removeObjectAtIndex(r4)) : a4.getBlockBreakPosition() === o3 && n3++, s4 = s4.removeTextAtRange(e4), new this.constructor(s4.blockList.insertSplittableListAtPosition(i4, n3)); 12826 } 12827 mergeDocumentAtRange(t5, e4) { 12828 let i4, n3; 12829 e4 = wt(e4); 12830 const [r4] = e4, o3 = this.locationFromPosition(r4), s4 = this.getBlockAtIndex(o3.index).getAttributes(), a4 = t5.getBaseBlockAttributes(), l4 = s4.slice(-a4.length); 12831 if (ot(a4, l4)) { 12832 const e5 = s4.slice(0, -a4.length); 12833 i4 = t5.copyWithBaseBlockAttributes(e5); 12834 } else 12835 i4 = t5.copy({ consolidateBlocks: true }).copyWithBaseBlockAttributes(s4); 12836 const c4 = i4.getBlockCount(), u4 = i4.getBlockAtIndex(0); 12837 if (ot(s4, u4.getAttributes())) { 12838 const t6 = u4.getTextWithoutBlockBreak(); 12839 if (n3 = this.insertTextAtRange(t6, e4), c4 > 1) { 12840 i4 = new this.constructor(i4.getBlocks().slice(1)); 12841 const e5 = r4 + t6.getLength(); 12842 n3 = n3.insertDocumentAtRange(i4, e5); 12843 } 12844 } else 12845 n3 = this.insertDocumentAtRange(i4, e4); 12846 return n3; 12847 } 12848 insertTextAtRange(t5, e4) { 12849 e4 = wt(e4); 12850 const [i4] = e4, { index: n3, offset: r4 } = this.locationFromPosition(i4), o3 = this.removeTextAtRange(e4); 12851 return new this.constructor(o3.blockList.editObjectAtIndex(n3, (e5) => e5.copyWithText(e5.text.insertTextAtPosition(t5, r4)))); 12852 } 12853 removeTextAtRange(t5) { 12854 let e4; 12855 t5 = wt(t5); 12856 const [i4, n3] = t5; 12857 if (Lt(t5)) 12858 return this; 12859 const [r4, o3] = Array.from(this.locationRangeFromRange(t5)), s4 = r4.index, a4 = r4.offset, l4 = this.getBlockAtIndex(s4), c4 = o3.index, u4 = o3.offset, h4 = this.getBlockAtIndex(c4); 12860 if (n3 - i4 == 1 && l4.getBlockBreakPosition() === a4 && h4.getBlockBreakPosition() !== u4 && "\n" === h4.text.getStringAtPosition(u4)) 12861 e4 = this.blockList.editObjectAtIndex(c4, (t6) => t6.copyWithText(t6.text.removeTextAtRange([u4, u4 + 1]))); 12862 else { 12863 let t6; 12864 const i5 = l4.text.getTextAtRange([0, a4]), n4 = h4.text.getTextAtRange([u4, h4.getLength()]), r5 = i5.appendText(n4); 12865 t6 = s4 !== c4 && 0 === a4 && l4.getAttributeLevel() >= h4.getAttributeLevel() ? h4.copyWithText(r5) : l4.copyWithText(r5); 12866 const o4 = c4 + 1 - s4; 12867 e4 = this.blockList.splice(s4, o4, t6); 12868 } 12869 return new this.constructor(e4); 12870 } 12871 moveTextFromRangeToPosition(t5, e4) { 12872 let i4; 12873 t5 = wt(t5); 12874 const [n3, r4] = t5; 12875 if (n3 <= e4 && e4 <= r4) 12876 return this; 12877 let o3 = this.getDocumentAtRange(t5), s4 = this.removeTextAtRange(t5); 12878 const a4 = n3 < e4; 12879 a4 && (e4 -= o3.getLength()); 12880 const [l4, ...c4] = o3.getBlocks(); 12881 return 0 === c4.length ? (i4 = l4.getTextWithoutBlockBreak(), a4 && (e4 += 1)) : i4 = l4.text, s4 = s4.insertTextAtRange(i4, e4), 0 === c4.length ? s4 : (o3 = new this.constructor(c4), e4 += i4.getLength(), s4.insertDocumentAtRange(o3, e4)); 12882 } 12883 addAttributeAtRange(t5, e4, i4) { 12884 let { blockList: n3 } = this; 12885 return this.eachBlockAtRange(i4, (i5, r4, o3) => n3 = n3.editObjectAtIndex(o3, function() { 12886 return mt(t5) ? i5.addAttribute(t5, e4) : r4[0] === r4[1] ? i5 : i5.copyWithText(i5.text.addAttributeAtRange(t5, e4, r4)); 12887 })), new this.constructor(n3); 12888 } 12889 addAttribute(t5, e4) { 12890 let { blockList: i4 } = this; 12891 return this.eachBlock((n3, r4) => i4 = i4.editObjectAtIndex(r4, () => n3.addAttribute(t5, e4))), new this.constructor(i4); 12892 } 12893 removeAttributeAtRange(t5, e4) { 12894 let { blockList: i4 } = this; 12895 return this.eachBlockAtRange(e4, function(e5, n3, r4) { 12896 mt(t5) ? i4 = i4.editObjectAtIndex(r4, () => e5.removeAttribute(t5)) : n3[0] !== n3[1] && (i4 = i4.editObjectAtIndex(r4, () => e5.copyWithText(e5.text.removeAttributeAtRange(t5, n3)))); 12897 }), new this.constructor(i4); 12898 } 12899 updateAttributesForAttachment(t5, e4) { 12900 const i4 = this.getRangeOfAttachment(e4), [n3] = Array.from(i4), { index: r4 } = this.locationFromPosition(n3), o3 = this.getTextAtIndex(r4); 12901 return new this.constructor(this.blockList.editObjectAtIndex(r4, (i5) => i5.copyWithText(o3.updateAttributesForAttachment(t5, e4)))); 12902 } 12903 removeAttributeForAttachment(t5, e4) { 12904 const i4 = this.getRangeOfAttachment(e4); 12905 return this.removeAttributeAtRange(t5, i4); 12906 } 12907 setHTMLAttributeAtPosition(t5, e4, i4) { 12908 const n3 = this.getBlockAtPosition(t5), r4 = n3.addHTMLAttribute(e4, i4); 12909 return this.replaceBlock(n3, r4); 12910 } 12911 insertBlockBreakAtRange(t5) { 12912 let e4; 12913 t5 = wt(t5); 12914 const [i4] = t5, { offset: n3 } = this.locationFromPosition(i4), r4 = this.removeTextAtRange(t5); 12915 return 0 === n3 && (e4 = [new Gi()]), new this.constructor(r4.blockList.insertSplittableListAtPosition(new zi(e4), i4)); 12916 } 12917 applyBlockAttributeAtRange(t5, e4, i4) { 12918 const n3 = this.expandRangeToLineBreaksAndSplitBlocks(i4); 12919 let r4 = n3.document; 12920 i4 = n3.range; 12921 const o3 = mt(t5); 12922 if (o3.listAttribute) { 12923 r4 = r4.removeLastListAttributeAtRange(i4, { exceptAttributeName: t5 }); 12924 const e5 = r4.convertLineBreaksToBlockBreaksInRange(i4); 12925 r4 = e5.document, i4 = e5.range; 12926 } else 12927 r4 = o3.exclusive ? r4.removeBlockAttributesAtRange(i4) : o3.terminal ? r4.removeLastTerminalAttributeAtRange(i4) : r4.consolidateBlocksAtRange(i4); 12928 return r4.addAttributeAtRange(t5, e4, i4); 12929 } 12930 removeLastListAttributeAtRange(t5) { 12931 let e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, { blockList: i4 } = this; 12932 return this.eachBlockAtRange(t5, function(t6, n3, r4) { 12933 const o3 = t6.getLastAttribute(); 12934 o3 && mt(o3).listAttribute && o3 !== e4.exceptAttributeName && (i4 = i4.editObjectAtIndex(r4, () => t6.removeAttribute(o3))); 12935 }), new this.constructor(i4); 12936 } 12937 removeLastTerminalAttributeAtRange(t5) { 12938 let { blockList: e4 } = this; 12939 return this.eachBlockAtRange(t5, function(t6, i4, n3) { 12940 const r4 = t6.getLastAttribute(); 12941 r4 && mt(r4).terminal && (e4 = e4.editObjectAtIndex(n3, () => t6.removeAttribute(r4))); 12942 }), new this.constructor(e4); 12943 } 12944 removeBlockAttributesAtRange(t5) { 12945 let { blockList: e4 } = this; 12946 return this.eachBlockAtRange(t5, function(t6, i4, n3) { 12947 t6.hasAttributes() && (e4 = e4.editObjectAtIndex(n3, () => t6.copyWithoutAttributes())); 12948 }), new this.constructor(e4); 12949 } 12950 expandRangeToLineBreaksAndSplitBlocks(t5) { 12951 let e4; 12952 t5 = wt(t5); 12953 let [i4, n3] = t5; 12954 const r4 = this.locationFromPosition(i4), o3 = this.locationFromPosition(n3); 12955 let s4 = this; 12956 const a4 = s4.getBlockAtIndex(r4.index); 12957 if (r4.offset = a4.findLineBreakInDirectionFromPosition("backward", r4.offset), null != r4.offset && (e4 = s4.positionFromLocation(r4), s4 = s4.insertBlockBreakAtRange([e4, e4 + 1]), o3.index += 1, o3.offset -= s4.getBlockAtIndex(r4.index).getLength(), r4.index += 1), r4.offset = 0, 0 === o3.offset && o3.index > r4.index) 12958 o3.index -= 1, o3.offset = s4.getBlockAtIndex(o3.index).getBlockBreakPosition(); 12959 else { 12960 const t6 = s4.getBlockAtIndex(o3.index); 12961 "\n" === t6.text.getStringAtRange([o3.offset - 1, o3.offset]) ? o3.offset -= 1 : o3.offset = t6.findLineBreakInDirectionFromPosition("forward", o3.offset), o3.offset !== t6.getBlockBreakPosition() && (e4 = s4.positionFromLocation(o3), s4 = s4.insertBlockBreakAtRange([e4, e4 + 1])); 12962 } 12963 return i4 = s4.positionFromLocation(r4), n3 = s4.positionFromLocation(o3), { document: s4, range: t5 = wt([i4, n3]) }; 12964 } 12965 convertLineBreaksToBlockBreaksInRange(t5) { 12966 t5 = wt(t5); 12967 let [e4] = t5; 12968 const i4 = this.getStringAtRange(t5).slice(0, -1); 12969 let n3 = this; 12970 return i4.replace(/.*?\n/g, function(t6) { 12971 e4 += t6.length, n3 = n3.insertBlockBreakAtRange([e4 - 1, e4]); 12972 }), { document: n3, range: t5 }; 12973 } 12974 consolidateBlocksAtRange(t5) { 12975 t5 = wt(t5); 12976 const [e4, i4] = t5, n3 = this.locationFromPosition(e4).index, r4 = this.locationFromPosition(i4).index; 12977 return new this.constructor(this.blockList.consolidateFromIndexToIndex(n3, r4)); 12978 } 12979 getDocumentAtRange(t5) { 12980 t5 = wt(t5); 12981 const e4 = this.blockList.getSplittableListInRange(t5).toArray(); 12982 return new this.constructor(e4); 12983 } 12984 getStringAtRange(t5) { 12985 let e4; 12986 const i4 = t5 = wt(t5); 12987 return i4[i4.length - 1] !== this.getLength() && (e4 = -1), this.getDocumentAtRange(t5).toString().slice(0, e4); 12988 } 12989 getBlockAtIndex(t5) { 12990 return this.blockList.getObjectAtIndex(t5); 12991 } 12992 getBlockAtPosition(t5) { 12993 const { index: e4 } = this.locationFromPosition(t5); 12994 return this.getBlockAtIndex(e4); 12995 } 12996 getTextAtIndex(t5) { 12997 var e4; 12998 return null === (e4 = this.getBlockAtIndex(t5)) || void 0 === e4 ? void 0 : e4.text; 12999 } 13000 getTextAtPosition(t5) { 13001 const { index: e4 } = this.locationFromPosition(t5); 13002 return this.getTextAtIndex(e4); 13003 } 13004 getPieceAtPosition(t5) { 13005 const { index: e4, offset: i4 } = this.locationFromPosition(t5); 13006 return this.getTextAtIndex(e4).getPieceAtPosition(i4); 13007 } 13008 getCharacterAtPosition(t5) { 13009 const { index: e4, offset: i4 } = this.locationFromPosition(t5); 13010 return this.getTextAtIndex(e4).getStringAtRange([i4, i4 + 1]); 13011 } 13012 getLength() { 13013 return this.blockList.getEndPosition(); 13014 } 13015 getBlocks() { 13016 return this.blockList.toArray(); 13017 } 13018 getBlockCount() { 13019 return this.blockList.length; 13020 } 13021 getEditCount() { 13022 return this.editCount; 13023 } 13024 eachBlock(t5) { 13025 return this.blockList.eachObject(t5); 13026 } 13027 eachBlockAtRange(t5, e4) { 13028 let i4, n3; 13029 t5 = wt(t5); 13030 const [r4, o3] = t5, s4 = this.locationFromPosition(r4), a4 = this.locationFromPosition(o3); 13031 if (s4.index === a4.index) 13032 return i4 = this.getBlockAtIndex(s4.index), n3 = [s4.offset, a4.offset], e4(i4, n3, s4.index); 13033 for (let t6 = s4.index; t6 <= a4.index; t6++) 13034 if (i4 = this.getBlockAtIndex(t6), i4) { 13035 switch (t6) { 13036 case s4.index: 13037 n3 = [s4.offset, i4.text.getLength()]; 13038 break; 13039 case a4.index: 13040 n3 = [0, a4.offset]; 13041 break; 13042 default: 13043 n3 = [0, i4.text.getLength()]; 13044 } 13045 e4(i4, n3, t6); 13046 } 13047 } 13048 getCommonAttributesAtRange(t5) { 13049 t5 = wt(t5); 13050 const [e4] = t5; 13051 if (Lt(t5)) 13052 return this.getCommonAttributesAtPosition(e4); 13053 { 13054 const e5 = [], i4 = []; 13055 return this.eachBlockAtRange(t5, function(t6, n3) { 13056 if (n3[0] !== n3[1]) 13057 return e5.push(t6.text.getCommonAttributesAtRange(n3)), i4.push(sn(t6)); 13058 }), Ht.fromCommonAttributesOfObjects(e5).merge(Ht.fromCommonAttributesOfObjects(i4)).toObject(); 13059 } 13060 } 13061 getCommonAttributesAtPosition(t5) { 13062 let e4, i4; 13063 const { index: n3, offset: r4 } = this.locationFromPosition(t5), o3 = this.getBlockAtIndex(n3); 13064 if (!o3) 13065 return {}; 13066 const s4 = sn(o3), a4 = o3.text.getAttributesAtPosition(r4), l4 = o3.text.getAttributesAtPosition(r4 - 1), c4 = Object.keys(W).filter((t6) => W[t6].inheritable); 13067 for (e4 in l4) 13068 i4 = l4[e4], (i4 === a4[e4] || c4.includes(e4)) && (s4[e4] = i4); 13069 return s4; 13070 } 13071 getRangeOfCommonAttributeAtPosition(t5, e4) { 13072 const { index: i4, offset: n3 } = this.locationFromPosition(e4), r4 = this.getTextAtIndex(i4), [o3, s4] = Array.from(r4.getExpandedRangeForAttributeAtOffset(t5, n3)), a4 = this.positionFromLocation({ index: i4, offset: o3 }), l4 = this.positionFromLocation({ index: i4, offset: s4 }); 13073 return wt([a4, l4]); 13074 } 13075 getBaseBlockAttributes() { 13076 let t5 = this.getBlockAtIndex(0).getAttributes(); 13077 for (let e4 = 1; e4 < this.getBlockCount(); e4++) { 13078 const i4 = this.getBlockAtIndex(e4).getAttributes(), n3 = Math.min(t5.length, i4.length); 13079 t5 = (() => { 13080 const e5 = []; 13081 for (let r4 = 0; r4 < n3 && i4[r4] === t5[r4]; r4++) 13082 e5.push(i4[r4]); 13083 return e5; 13084 })(); 13085 } 13086 return t5; 13087 } 13088 getAttachmentById(t5) { 13089 for (const e4 of this.getAttachments()) 13090 if (e4.id === t5) 13091 return e4; 13092 } 13093 getAttachmentPieces() { 13094 let t5 = []; 13095 return this.blockList.eachObject((e4) => { 13096 let { text: i4 } = e4; 13097 return t5 = t5.concat(i4.getAttachmentPieces()); 13098 }), t5; 13099 } 13100 getAttachments() { 13101 return this.getAttachmentPieces().map((t5) => t5.attachment); 13102 } 13103 getRangeOfAttachment(t5) { 13104 let e4 = 0; 13105 const i4 = this.blockList.toArray(); 13106 for (let n3 = 0; n3 < i4.length; n3++) { 13107 const { text: r4 } = i4[n3], o3 = r4.getRangeOfAttachment(t5); 13108 if (o3) 13109 return wt([e4 + o3[0], e4 + o3[1]]); 13110 e4 += r4.getLength(); 13111 } 13112 } 13113 getLocationRangeOfAttachment(t5) { 13114 const e4 = this.getRangeOfAttachment(t5); 13115 return this.locationRangeFromRange(e4); 13116 } 13117 getAttachmentPieceForAttachment(t5) { 13118 for (const e4 of this.getAttachmentPieces()) 13119 if (e4.attachment === t5) 13120 return e4; 13121 } 13122 findRangesForBlockAttribute(t5) { 13123 let e4 = 0; 13124 const i4 = []; 13125 return this.getBlocks().forEach((n3) => { 13126 const r4 = n3.getLength(); 13127 n3.hasAttribute(t5) && i4.push([e4, e4 + r4]), e4 += r4; 13128 }), i4; 13129 } 13130 findRangesForTextAttribute(t5) { 13131 let { withValue: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, i4 = 0, n3 = []; 13132 const r4 = []; 13133 return this.getPieces().forEach((o3) => { 13134 const s4 = o3.getLength(); 13135 (function(i5) { 13136 return e4 ? i5.getAttribute(t5) === e4 : i5.hasAttribute(t5); 13137 })(o3) && (n3[1] === i4 ? n3[1] = i4 + s4 : r4.push(n3 = [i4, i4 + s4])), i4 += s4; 13138 }), r4; 13139 } 13140 locationFromPosition(t5) { 13141 const e4 = this.blockList.findIndexAndOffsetAtPosition(Math.max(0, t5)); 13142 if (null != e4.index) 13143 return e4; 13144 { 13145 const t6 = this.getBlocks(); 13146 return { index: t6.length - 1, offset: t6[t6.length - 1].getLength() }; 13147 } 13148 } 13149 positionFromLocation(t5) { 13150 return this.blockList.findPositionAtIndexAndOffset(t5.index, t5.offset); 13151 } 13152 locationRangeFromPosition(t5) { 13153 return wt(this.locationFromPosition(t5)); 13154 } 13155 locationRangeFromRange(t5) { 13156 if (!(t5 = wt(t5))) 13157 return; 13158 const [e4, i4] = Array.from(t5), n3 = this.locationFromPosition(e4), r4 = this.locationFromPosition(i4); 13159 return wt([n3, r4]); 13160 } 13161 rangeFromLocationRange(t5) { 13162 let e4; 13163 t5 = wt(t5); 13164 const i4 = this.positionFromLocation(t5[0]); 13165 return Lt(t5) || (e4 = this.positionFromLocation(t5[1])), wt([i4, e4]); 13166 } 13167 isEqualTo(t5) { 13168 return this.blockList.isEqualTo(null == t5 ? void 0 : t5.blockList); 13169 } 13170 getTexts() { 13171 return this.getBlocks().map((t5) => t5.text); 13172 } 13173 getPieces() { 13174 const t5 = []; 13175 return Array.from(this.getTexts()).forEach((e4) => { 13176 t5.push(...Array.from(e4.getPieces() || [])); 13177 }), t5; 13178 } 13179 getObjects() { 13180 return this.getBlocks().concat(this.getTexts()).concat(this.getPieces()); 13181 } 13182 toSerializableDocument() { 13183 const t5 = []; 13184 return this.blockList.eachObject((e4) => t5.push(e4.copyWithText(e4.text.toSerializableText()))), new this.constructor(t5); 13185 } 13186 toString() { 13187 return this.blockList.toString(); 13188 } 13189 toJSON() { 13190 return this.blockList.toJSON(); 13191 } 13192 toConsole() { 13193 return JSON.stringify(this.blockList.toArray().map((t5) => JSON.parse(t5.text.toConsole()))); 13194 } 13195 }; 13196 var sn = function(t5) { 13197 const e4 = {}, i4 = t5.getLastAttribute(); 13198 return i4 && (e4[i4] = true), e4; 13199 }; 13200 var an = function(t5) { 13201 let e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 13202 return { string: t5 = Wt(t5), attributes: e4, type: "string" }; 13203 }; 13204 var ln = (t5, e4) => { 13205 try { 13206 return JSON.parse(t5.getAttribute("data-trix-".concat(e4))); 13207 } catch (t6) { 13208 return {}; 13209 } 13210 }; 13211 var cn = class extends q { 13212 static parse(t5, e4) { 13213 const i4 = new this(t5, e4); 13214 return i4.parse(), i4; 13215 } 13216 constructor(t5) { 13217 let { referenceElement: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 13218 super(...arguments), this.html = t5, this.referenceElement = e4, this.blocks = [], this.blockElements = [], this.processedElements = []; 13219 } 13220 getDocument() { 13221 return on.fromJSON(this.blocks); 13222 } 13223 parse() { 13224 try { 13225 this.createHiddenContainer(), ui.setHTML(this.containerElement, this.html); 13226 const t5 = R(this.containerElement, { usingFilter: gn }); 13227 for (; t5.nextNode(); ) 13228 this.processNode(t5.currentNode); 13229 return this.translateBlockElementMarginsToNewlines(); 13230 } finally { 13231 this.removeHiddenContainer(); 13232 } 13233 } 13234 createHiddenContainer() { 13235 return this.referenceElement ? (this.containerElement = this.referenceElement.cloneNode(false), this.containerElement.removeAttribute("id"), this.containerElement.setAttribute("data-trix-internal", ""), this.containerElement.style.display = "none", this.referenceElement.parentNode.insertBefore(this.containerElement, this.referenceElement.nextSibling)) : (this.containerElement = T({ tagName: "div", style: { display: "none" } }), document.body.appendChild(this.containerElement)); 13236 } 13237 removeHiddenContainer() { 13238 return S(this.containerElement); 13239 } 13240 processNode(t5) { 13241 switch (t5.nodeType) { 13242 case Node.TEXT_NODE: 13243 if (!this.isInsignificantTextNode(t5)) 13244 return this.appendBlockForTextNode(t5), this.processTextNode(t5); 13245 break; 13246 case Node.ELEMENT_NODE: 13247 return this.appendBlockForElement(t5), this.processElement(t5); 13248 } 13249 } 13250 appendBlockForTextNode(t5) { 13251 const e4 = t5.parentNode; 13252 if (e4 === this.currentBlockElement && this.isBlockElement(t5.previousSibling)) 13253 return this.appendStringWithAttributes("\n"); 13254 if (e4 === this.containerElement || this.isBlockElement(e4)) { 13255 var i4; 13256 const t6 = this.getBlockAttributes(e4), n3 = this.getBlockHTMLAttributes(e4); 13257 ot(t6, null === (i4 = this.currentBlock) || void 0 === i4 ? void 0 : i4.attributes) || (this.currentBlock = this.appendBlockForAttributesWithElement(t6, e4, n3), this.currentBlockElement = e4); 13258 } 13259 } 13260 appendBlockForElement(t5) { 13261 const e4 = this.isBlockElement(t5), i4 = C(this.currentBlockElement, t5); 13262 if (e4 && !this.isBlockElement(t5.firstChild)) { 13263 if (!this.isInsignificantTextNode(t5.firstChild) || !this.isBlockElement(t5.firstElementChild)) { 13264 const e5 = this.getBlockAttributes(t5), n3 = this.getBlockHTMLAttributes(t5); 13265 if (t5.firstChild) { 13266 if (i4 && ot(e5, this.currentBlock.attributes)) 13267 return this.appendStringWithAttributes("\n"); 13268 this.currentBlock = this.appendBlockForAttributesWithElement(e5, t5, n3), this.currentBlockElement = t5; 13269 } 13270 } 13271 } else if (this.currentBlockElement && !i4 && !e4) { 13272 const e5 = this.findParentBlockElement(t5); 13273 if (e5) 13274 return this.appendBlockForElement(e5); 13275 this.currentBlock = this.appendEmptyBlock(), this.currentBlockElement = null; 13276 } 13277 } 13278 findParentBlockElement(t5) { 13279 let { parentElement: e4 } = t5; 13280 for (; e4 && e4 !== this.containerElement; ) { 13281 if (this.isBlockElement(e4) && this.blockElements.includes(e4)) 13282 return e4; 13283 e4 = e4.parentElement; 13284 } 13285 return null; 13286 } 13287 processTextNode(t5) { 13288 let e4 = t5.data; 13289 var i4; 13290 un(t5.parentNode) || (e4 = Vt(e4), fn(null === (i4 = t5.previousSibling) || void 0 === i4 ? void 0 : i4.textContent) && (e4 = mn(e4))); 13291 return this.appendStringWithAttributes(e4, this.getTextAttributes(t5.parentNode)); 13292 } 13293 processElement(t5) { 13294 let e4; 13295 if (P(t5)) { 13296 if (e4 = ln(t5, "attachment"), Object.keys(e4).length) { 13297 const i4 = this.getTextAttributes(t5); 13298 this.appendAttachmentWithAttributes(e4, i4), t5.innerHTML = ""; 13299 } 13300 return this.processedElements.push(t5); 13301 } 13302 switch (k(t5)) { 13303 case "br": 13304 return this.isExtraBR(t5) || this.isBlockElement(t5.nextSibling) || this.appendStringWithAttributes("\n", this.getTextAttributes(t5)), this.processedElements.push(t5); 13305 case "img": 13306 e4 = { url: t5.getAttribute("src"), contentType: "image" }; 13307 const i4 = ((t6) => { 13308 const e5 = t6.getAttribute("width"), i5 = t6.getAttribute("height"), n3 = {}; 13309 return e5 && (n3.width = parseInt(e5, 10)), i5 && (n3.height = parseInt(i5, 10)), n3; 13310 })(t5); 13311 for (const t6 in i4) { 13312 const n3 = i4[t6]; 13313 e4[t6] = n3; 13314 } 13315 return this.appendAttachmentWithAttributes(e4, this.getTextAttributes(t5)), this.processedElements.push(t5); 13316 case "tr": 13317 if (this.needsTableSeparator(t5)) 13318 return this.appendStringWithAttributes(j.tableRowSeparator); 13319 break; 13320 case "td": 13321 if (this.needsTableSeparator(t5)) 13322 return this.appendStringWithAttributes(j.tableCellSeparator); 13323 } 13324 } 13325 appendBlockForAttributesWithElement(t5, e4) { 13326 let i4 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; 13327 this.blockElements.push(e4); 13328 const n3 = function() { 13329 return { text: [], attributes: arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, htmlAttributes: arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {} }; 13330 }(t5, i4); 13331 return this.blocks.push(n3), n3; 13332 } 13333 appendEmptyBlock() { 13334 return this.appendBlockForAttributesWithElement([], null); 13335 } 13336 appendStringWithAttributes(t5, e4) { 13337 return this.appendPiece(an(t5, e4)); 13338 } 13339 appendAttachmentWithAttributes(t5, e4) { 13340 return this.appendPiece(function(t6) { 13341 return { attachment: t6, attributes: arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, type: "attachment" }; 13342 }(t5, e4)); 13343 } 13344 appendPiece(t5) { 13345 return 0 === this.blocks.length && this.appendEmptyBlock(), this.blocks[this.blocks.length - 1].text.push(t5); 13346 } 13347 appendStringToTextAtIndex(t5, e4) { 13348 const { text: i4 } = this.blocks[e4], n3 = i4[i4.length - 1]; 13349 if ("string" !== (null == n3 ? void 0 : n3.type)) 13350 return i4.push(an(t5)); 13351 n3.string += t5; 13352 } 13353 prependStringToTextAtIndex(t5, e4) { 13354 const { text: i4 } = this.blocks[e4], n3 = i4[0]; 13355 if ("string" !== (null == n3 ? void 0 : n3.type)) 13356 return i4.unshift(an(t5)); 13357 n3.string = t5 + n3.string; 13358 } 13359 getTextAttributes(t5) { 13360 let e4; 13361 const i4 = {}; 13362 for (const n3 in W) { 13363 const r4 = W[n3]; 13364 if (r4.tagName && y(t5, { matchingSelector: r4.tagName, untilNode: this.containerElement })) 13365 i4[n3] = true; 13366 else if (r4.parser) { 13367 if (e4 = r4.parser(t5), e4) { 13368 let o3 = false; 13369 for (const i5 of this.findBlockElementAncestors(t5)) 13370 if (r4.parser(i5) === e4) { 13371 o3 = true; 13372 break; 13373 } 13374 o3 || (i4[n3] = e4); 13375 } 13376 } else 13377 r4.styleProperty && (e4 = t5.style[r4.styleProperty], e4 && (i4[n3] = e4)); 13378 } 13379 if (P(t5)) { 13380 const n3 = ln(t5, "attributes"); 13381 for (const t6 in n3) 13382 e4 = n3[t6], i4[t6] = e4; 13383 } 13384 return i4; 13385 } 13386 getBlockAttributes(t5) { 13387 const e4 = []; 13388 for (; t5 && t5 !== this.containerElement; ) { 13389 for (const r4 in n) { 13390 const o3 = n[r4]; 13391 var i4; 13392 if (false !== o3.parse) { 13393 if (k(t5) === o3.tagName) 13394 (null !== (i4 = o3.test) && void 0 !== i4 && i4.call(o3, t5) || !o3.test) && (e4.push(r4), o3.listAttribute && e4.push(o3.listAttribute)); 13395 } 13396 } 13397 t5 = t5.parentNode; 13398 } 13399 return e4.reverse(); 13400 } 13401 getBlockHTMLAttributes(t5) { 13402 const e4 = {}, i4 = Object.values(n).find((e5) => e5.tagName === k(t5)); 13403 return ((null == i4 ? void 0 : i4.htmlAttributes) || []).forEach((i5) => { 13404 t5.hasAttribute(i5) && (e4[i5] = t5.getAttribute(i5)); 13405 }), e4; 13406 } 13407 findBlockElementAncestors(t5) { 13408 const e4 = []; 13409 for (; t5 && t5 !== this.containerElement; ) { 13410 const i4 = k(t5); 13411 L().includes(i4) && e4.push(t5), t5 = t5.parentNode; 13412 } 13413 return e4; 13414 } 13415 isBlockElement(t5) { 13416 if ((null == t5 ? void 0 : t5.nodeType) === Node.ELEMENT_NODE && !P(t5) && !y(t5, { matchingSelector: "td", untilNode: this.containerElement })) 13417 return L().includes(k(t5)) || "block" === window.getComputedStyle(t5).display; 13418 } 13419 isInsignificantTextNode(t5) { 13420 if ((null == t5 ? void 0 : t5.nodeType) !== Node.TEXT_NODE) 13421 return; 13422 if (!pn(t5.data)) 13423 return; 13424 const { parentNode: e4, previousSibling: i4, nextSibling: n3 } = t5; 13425 return hn(e4.previousSibling) && !this.isBlockElement(e4.previousSibling) || un(e4) ? void 0 : !i4 || this.isBlockElement(i4) || !n3 || this.isBlockElement(n3); 13426 } 13427 isExtraBR(t5) { 13428 return "br" === k(t5) && this.isBlockElement(t5.parentNode) && t5.parentNode.lastChild === t5; 13429 } 13430 needsTableSeparator(t5) { 13431 if (j.removeBlankTableCells) { 13432 var e4; 13433 const i4 = null === (e4 = t5.previousSibling) || void 0 === e4 ? void 0 : e4.textContent; 13434 return i4 && /\S/.test(i4); 13435 } 13436 return t5.previousSibling; 13437 } 13438 translateBlockElementMarginsToNewlines() { 13439 const t5 = this.getMarginOfDefaultBlockElement(); 13440 for (let e4 = 0; e4 < this.blocks.length; e4++) { 13441 const i4 = this.getMarginOfBlockElementAtIndex(e4); 13442 i4 && (i4.top > 2 * t5.top && this.prependStringToTextAtIndex("\n", e4), i4.bottom > 2 * t5.bottom && this.appendStringToTextAtIndex("\n", e4)); 13443 } 13444 } 13445 getMarginOfBlockElementAtIndex(t5) { 13446 const e4 = this.blockElements[t5]; 13447 if (e4 && e4.textContent && !L().includes(k(e4)) && !this.processedElements.includes(e4)) 13448 return dn(e4); 13449 } 13450 getMarginOfDefaultBlockElement() { 13451 const t5 = T(n.default.tagName); 13452 return this.containerElement.appendChild(t5), dn(t5); 13453 } 13454 }; 13455 var un = function(t5) { 13456 const { whiteSpace: e4 } = window.getComputedStyle(t5); 13457 return ["pre", "pre-wrap", "pre-line"].includes(e4); 13458 }; 13459 var hn = (t5) => t5 && !fn(t5.textContent); 13460 var dn = function(t5) { 13461 const e4 = window.getComputedStyle(t5); 13462 if ("block" === e4.display) 13463 return { top: parseInt(e4.marginTop), bottom: parseInt(e4.marginBottom) }; 13464 }; 13465 var gn = function(t5) { 13466 return "style" === k(t5) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; 13467 }; 13468 var mn = (t5) => t5.replace(new RegExp("^".concat(Ut.source, "+")), ""); 13469 var pn = (t5) => new RegExp("^".concat(Ut.source, "*$")).test(t5); 13470 var fn = (t5) => /\s$/.test(t5); 13471 var bn = ["contenteditable", "data-trix-id", "data-trix-store-key", "data-trix-mutable", "data-trix-placeholder", "tabindex"]; 13472 var vn = "data-trix-serialized-attributes"; 13473 var An = "[".concat(vn, "]"); 13474 var yn = new RegExp("<!--block-->", "g"); 13475 var xn = { "application/json": function(t5) { 13476 let e4; 13477 if (t5 instanceof on) 13478 e4 = t5; 13479 else { 13480 if (!(t5 instanceof HTMLElement)) 13481 throw new Error("unserializable object"); 13482 e4 = cn.parse(t5.innerHTML).getDocument(); 13483 } 13484 return e4.toSerializableDocument().toJSONString(); 13485 }, "text/html": function(t5) { 13486 let e4; 13487 if (t5 instanceof on) 13488 e4 = Ci.render(t5); 13489 else { 13490 if (!(t5 instanceof HTMLElement)) 13491 throw new Error("unserializable object"); 13492 e4 = t5.cloneNode(true); 13493 } 13494 return Array.from(e4.querySelectorAll("[data-trix-serialize=false]")).forEach((t6) => { 13495 S(t6); 13496 }), bn.forEach((t6) => { 13497 Array.from(e4.querySelectorAll("[".concat(t6, "]"))).forEach((e5) => { 13498 e5.removeAttribute(t6); 13499 }); 13500 }), Array.from(e4.querySelectorAll(An)).forEach((t6) => { 13501 try { 13502 const e5 = JSON.parse(t6.getAttribute(vn)); 13503 t6.removeAttribute(vn); 13504 for (const i4 in e5) { 13505 const n3 = e5[i4]; 13506 t6.setAttribute(i4, n3); 13507 } 13508 } catch (t7) { 13509 } 13510 }), e4.innerHTML.replace(yn, ""); 13511 } }; 13512 var Cn = Object.freeze({ __proto__: null }); 13513 var En = class extends q { 13514 constructor(t5, e4) { 13515 super(...arguments), this.attachmentManager = t5, this.attachment = e4, this.id = this.attachment.id, this.file = this.attachment.file; 13516 } 13517 remove() { 13518 return this.attachmentManager.requestRemovalOfAttachment(this.attachment); 13519 } 13520 }; 13521 En.proxyMethod("attachment.getAttribute"), En.proxyMethod("attachment.hasAttribute"), En.proxyMethod("attachment.setAttribute"), En.proxyMethod("attachment.getAttributes"), En.proxyMethod("attachment.setAttributes"), En.proxyMethod("attachment.isPending"), En.proxyMethod("attachment.isPreviewable"), En.proxyMethod("attachment.getURL"), En.proxyMethod("attachment.getHref"), En.proxyMethod("attachment.getFilename"), En.proxyMethod("attachment.getFilesize"), En.proxyMethod("attachment.getFormattedFilesize"), En.proxyMethod("attachment.getExtension"), En.proxyMethod("attachment.getContentType"), En.proxyMethod("attachment.getFile"), En.proxyMethod("attachment.setFile"), En.proxyMethod("attachment.releaseFile"), En.proxyMethod("attachment.getUploadProgress"), En.proxyMethod("attachment.setUploadProgress"); 13522 var Sn = class extends q { 13523 constructor() { 13524 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 13525 super(...arguments), this.managedAttachments = {}, Array.from(t5).forEach((t6) => { 13526 this.manageAttachment(t6); 13527 }); 13528 } 13529 getAttachments() { 13530 const t5 = []; 13531 for (const e4 in this.managedAttachments) { 13532 const i4 = this.managedAttachments[e4]; 13533 t5.push(i4); 13534 } 13535 return t5; 13536 } 13537 manageAttachment(t5) { 13538 return this.managedAttachments[t5.id] || (this.managedAttachments[t5.id] = new En(this, t5)), this.managedAttachments[t5.id]; 13539 } 13540 attachmentIsManaged(t5) { 13541 return t5.id in this.managedAttachments; 13542 } 13543 requestRemovalOfAttachment(t5) { 13544 var e4, i4; 13545 if (this.attachmentIsManaged(t5)) 13546 return null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.attachmentManagerDidRequestRemovalOfAttachment) || void 0 === i4 ? void 0 : i4.call(e4, t5); 13547 } 13548 unmanageAttachment(t5) { 13549 const e4 = this.managedAttachments[t5.id]; 13550 return delete this.managedAttachments[t5.id], e4; 13551 } 13552 }; 13553 var Rn = class { 13554 constructor(t5) { 13555 this.composition = t5, this.document = this.composition.document; 13556 const e4 = this.composition.getSelectedRange(); 13557 this.startPosition = e4[0], this.endPosition = e4[1], this.startLocation = this.document.locationFromPosition(this.startPosition), this.endLocation = this.document.locationFromPosition(this.endPosition), this.block = this.document.getBlockAtIndex(this.endLocation.index), this.breaksOnReturn = this.block.breaksOnReturn(), this.previousCharacter = this.block.text.getStringAtPosition(this.endLocation.offset - 1), this.nextCharacter = this.block.text.getStringAtPosition(this.endLocation.offset); 13558 } 13559 shouldInsertBlockBreak() { 13560 return this.block.hasAttributes() && this.block.isListItem() && !this.block.isEmpty() ? 0 !== this.startLocation.offset : this.breaksOnReturn && "\n" !== this.nextCharacter; 13561 } 13562 shouldBreakFormattedBlock() { 13563 return this.block.hasAttributes() && !this.block.isListItem() && (this.breaksOnReturn && "\n" === this.nextCharacter || "\n" === this.previousCharacter); 13564 } 13565 shouldDecreaseListLevel() { 13566 return this.block.hasAttributes() && this.block.isListItem() && this.block.isEmpty(); 13567 } 13568 shouldPrependListItem() { 13569 return this.block.isListItem() && 0 === this.startLocation.offset && !this.block.isEmpty(); 13570 } 13571 shouldRemoveLastBlockAttribute() { 13572 return this.block.hasAttributes() && !this.block.isListItem() && this.block.isEmpty(); 13573 } 13574 }; 13575 var kn = class extends q { 13576 constructor() { 13577 super(...arguments), this.document = new on(), this.attachments = [], this.currentAttributes = {}, this.revision = 0; 13578 } 13579 setDocument(t5) { 13580 var e4, i4; 13581 if (!t5.isEqualTo(this.document)) 13582 return this.document = t5, this.refreshAttachments(), this.revision++, null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionDidChangeDocument) || void 0 === i4 ? void 0 : i4.call(e4, t5); 13583 } 13584 getSnapshot() { 13585 return { document: this.document, selectedRange: this.getSelectedRange() }; 13586 } 13587 loadSnapshot(t5) { 13588 var e4, i4, n3, r4; 13589 let { document: o3, selectedRange: s4 } = t5; 13590 return null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionWillLoadSnapshot) || void 0 === i4 || i4.call(e4), this.setDocument(null != o3 ? o3 : new on()), this.setSelection(null != s4 ? s4 : [0, 0]), null === (n3 = this.delegate) || void 0 === n3 || null === (r4 = n3.compositionDidLoadSnapshot) || void 0 === r4 ? void 0 : r4.call(n3); 13591 } 13592 insertText(t5) { 13593 let { updatePosition: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { updatePosition: true }; 13594 const i4 = this.getSelectedRange(); 13595 this.setDocument(this.document.insertTextAtRange(t5, i4)); 13596 const n3 = i4[0], r4 = n3 + t5.getLength(); 13597 return e4 && this.setSelection(r4), this.notifyDelegateOfInsertionAtRange([n3, r4]); 13598 } 13599 insertBlock() { 13600 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : new Gi(); 13601 const e4 = new on([t5]); 13602 return this.insertDocument(e4); 13603 } 13604 insertDocument() { 13605 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : new on(); 13606 const e4 = this.getSelectedRange(); 13607 this.setDocument(this.document.insertDocumentAtRange(t5, e4)); 13608 const i4 = e4[0], n3 = i4 + t5.getLength(); 13609 return this.setSelection(n3), this.notifyDelegateOfInsertionAtRange([i4, n3]); 13610 } 13611 insertString(t5, e4) { 13612 const i4 = this.getCurrentTextAttributes(), n3 = Ki.textForStringWithAttributes(t5, i4); 13613 return this.insertText(n3, e4); 13614 } 13615 insertBlockBreak() { 13616 const t5 = this.getSelectedRange(); 13617 this.setDocument(this.document.insertBlockBreakAtRange(t5)); 13618 const e4 = t5[0], i4 = e4 + 1; 13619 return this.setSelection(i4), this.notifyDelegateOfInsertionAtRange([e4, i4]); 13620 } 13621 insertLineBreak() { 13622 const t5 = new Rn(this); 13623 if (t5.shouldDecreaseListLevel()) 13624 return this.decreaseListLevel(), this.setSelection(t5.startPosition); 13625 if (t5.shouldPrependListItem()) { 13626 const e4 = new on([t5.block.copyWithoutText()]); 13627 return this.insertDocument(e4); 13628 } 13629 return t5.shouldInsertBlockBreak() ? this.insertBlockBreak() : t5.shouldRemoveLastBlockAttribute() ? this.removeLastBlockAttribute() : t5.shouldBreakFormattedBlock() ? this.breakFormattedBlock(t5) : this.insertString("\n"); 13630 } 13631 insertHTML(t5) { 13632 const e4 = cn.parse(t5).getDocument(), i4 = this.getSelectedRange(); 13633 this.setDocument(this.document.mergeDocumentAtRange(e4, i4)); 13634 const n3 = i4[0], r4 = n3 + e4.getLength() - 1; 13635 return this.setSelection(r4), this.notifyDelegateOfInsertionAtRange([n3, r4]); 13636 } 13637 replaceHTML(t5) { 13638 const e4 = cn.parse(t5).getDocument().copyUsingObjectsFromDocument(this.document), i4 = this.getLocationRange({ strict: false }), n3 = this.document.rangeFromLocationRange(i4); 13639 return this.setDocument(e4), this.setSelection(n3); 13640 } 13641 insertFile(t5) { 13642 return this.insertFiles([t5]); 13643 } 13644 insertFiles(t5) { 13645 const e4 = []; 13646 return Array.from(t5).forEach((t6) => { 13647 var i4; 13648 if (null !== (i4 = this.delegate) && void 0 !== i4 && i4.compositionShouldAcceptFile(t6)) { 13649 const i5 = Wi.attachmentForFile(t6); 13650 e4.push(i5); 13651 } 13652 }), this.insertAttachments(e4); 13653 } 13654 insertAttachment(t5) { 13655 return this.insertAttachments([t5]); 13656 } 13657 insertAttachments(t5) { 13658 let e4 = new Ki(); 13659 return Array.from(t5).forEach((t6) => { 13660 var n3; 13661 const r4 = t6.getType(), o3 = null === (n3 = i[r4]) || void 0 === n3 ? void 0 : n3.presentation, s4 = this.getCurrentTextAttributes(); 13662 o3 && (s4.presentation = o3); 13663 const a4 = Ki.textForAttachmentWithAttributes(t6, s4); 13664 e4 = e4.appendText(a4); 13665 }), this.insertText(e4); 13666 } 13667 shouldManageDeletingInDirection(t5) { 13668 const e4 = this.getLocationRange(); 13669 if (Lt(e4)) { 13670 if ("backward" === t5 && 0 === e4[0].offset) 13671 return true; 13672 if (this.shouldManageMovingCursorInDirection(t5)) 13673 return true; 13674 } else if (e4[0].index !== e4[1].index) 13675 return true; 13676 return false; 13677 } 13678 deleteInDirection(t5) { 13679 let e4, i4, n3, { length: r4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 13680 const o3 = this.getLocationRange(); 13681 let s4 = this.getSelectedRange(); 13682 const a4 = Lt(s4); 13683 if (a4 ? i4 = "backward" === t5 && 0 === o3[0].offset : n3 = o3[0].index !== o3[1].index, i4 && this.canDecreaseBlockAttributeLevel()) { 13684 const t6 = this.getBlock(); 13685 if (t6.isListItem() ? this.decreaseListLevel() : this.decreaseBlockAttributeLevel(), this.setSelection(s4[0]), t6.isEmpty()) 13686 return false; 13687 } 13688 return a4 && (s4 = this.getExpandedRangeInDirection(t5, { length: r4 }), "backward" === t5 && (e4 = this.getAttachmentAtRange(s4))), e4 ? (this.editAttachment(e4), false) : (this.setDocument(this.document.removeTextAtRange(s4)), this.setSelection(s4[0]), !i4 && !n3 && void 0); 13689 } 13690 moveTextFromRange(t5) { 13691 const [e4] = Array.from(this.getSelectedRange()); 13692 return this.setDocument(this.document.moveTextFromRangeToPosition(t5, e4)), this.setSelection(e4); 13693 } 13694 removeAttachment(t5) { 13695 const e4 = this.document.getRangeOfAttachment(t5); 13696 if (e4) 13697 return this.stopEditingAttachment(), this.setDocument(this.document.removeTextAtRange(e4)), this.setSelection(e4[0]); 13698 } 13699 removeLastBlockAttribute() { 13700 const [t5, e4] = Array.from(this.getSelectedRange()), i4 = this.document.getBlockAtPosition(e4); 13701 return this.removeCurrentAttribute(i4.getLastAttribute()), this.setSelection(t5); 13702 } 13703 insertPlaceholder() { 13704 return this.placeholderPosition = this.getPosition(), this.insertString(" "); 13705 } 13706 selectPlaceholder() { 13707 if (null != this.placeholderPosition) 13708 return this.setSelectedRange([this.placeholderPosition, this.placeholderPosition + 1]), this.getSelectedRange(); 13709 } 13710 forgetPlaceholder() { 13711 this.placeholderPosition = null; 13712 } 13713 hasCurrentAttribute(t5) { 13714 const e4 = this.currentAttributes[t5]; 13715 return null != e4 && false !== e4; 13716 } 13717 toggleCurrentAttribute(t5) { 13718 const e4 = !this.currentAttributes[t5]; 13719 return e4 ? this.setCurrentAttribute(t5, e4) : this.removeCurrentAttribute(t5); 13720 } 13721 canSetCurrentAttribute(t5) { 13722 return mt(t5) ? this.canSetCurrentBlockAttribute(t5) : this.canSetCurrentTextAttribute(t5); 13723 } 13724 canSetCurrentTextAttribute(t5) { 13725 const e4 = this.getSelectedDocument(); 13726 if (e4) { 13727 for (const t6 of Array.from(e4.getAttachments())) 13728 if (!t6.hasContent()) 13729 return false; 13730 return true; 13731 } 13732 } 13733 canSetCurrentBlockAttribute(t5) { 13734 const e4 = this.getBlock(); 13735 if (e4) 13736 return !e4.isTerminalBlock(); 13737 } 13738 setCurrentAttribute(t5, e4) { 13739 return mt(t5) ? this.setBlockAttribute(t5, e4) : (this.setTextAttribute(t5, e4), this.currentAttributes[t5] = e4, this.notifyDelegateOfCurrentAttributesChange()); 13740 } 13741 setHTMLAtributeAtPosition(t5, e4, i4) { 13742 var n3; 13743 const r4 = this.document.getBlockAtPosition(t5), o3 = null === (n3 = mt(r4.getLastAttribute())) || void 0 === n3 ? void 0 : n3.htmlAttributes; 13744 if (r4 && null != o3 && o3.includes(e4)) { 13745 const n4 = this.document.setHTMLAttributeAtPosition(t5, e4, i4); 13746 this.setDocument(n4); 13747 } 13748 } 13749 setTextAttribute(t5, e4) { 13750 const i4 = this.getSelectedRange(); 13751 if (!i4) 13752 return; 13753 const [n3, r4] = Array.from(i4); 13754 if (n3 !== r4) 13755 return this.setDocument(this.document.addAttributeAtRange(t5, e4, i4)); 13756 if ("href" === t5) { 13757 const t6 = Ki.textForStringWithAttributes(e4, { href: e4 }); 13758 return this.insertText(t6); 13759 } 13760 } 13761 setBlockAttribute(t5, e4) { 13762 const i4 = this.getSelectedRange(); 13763 if (this.canSetCurrentAttribute(t5)) 13764 return this.setDocument(this.document.applyBlockAttributeAtRange(t5, e4, i4)), this.setSelection(i4); 13765 } 13766 removeCurrentAttribute(t5) { 13767 return mt(t5) ? (this.removeBlockAttribute(t5), this.updateCurrentAttributes()) : (this.removeTextAttribute(t5), delete this.currentAttributes[t5], this.notifyDelegateOfCurrentAttributesChange()); 13768 } 13769 removeTextAttribute(t5) { 13770 const e4 = this.getSelectedRange(); 13771 if (e4) 13772 return this.setDocument(this.document.removeAttributeAtRange(t5, e4)); 13773 } 13774 removeBlockAttribute(t5) { 13775 const e4 = this.getSelectedRange(); 13776 if (e4) 13777 return this.setDocument(this.document.removeAttributeAtRange(t5, e4)); 13778 } 13779 canDecreaseNestingLevel() { 13780 var t5; 13781 return (null === (t5 = this.getBlock()) || void 0 === t5 ? void 0 : t5.getNestingLevel()) > 0; 13782 } 13783 canIncreaseNestingLevel() { 13784 var t5; 13785 const e4 = this.getBlock(); 13786 if (e4) { 13787 if (null === (t5 = mt(e4.getLastNestableAttribute())) || void 0 === t5 || !t5.listAttribute) 13788 return e4.getNestingLevel() > 0; 13789 { 13790 const t6 = this.getPreviousBlock(); 13791 if (t6) 13792 return function() { 13793 let t7 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : []; 13794 return ot((arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []).slice(0, t7.length), t7); 13795 }(t6.getListItemAttributes(), e4.getListItemAttributes()); 13796 } 13797 } 13798 } 13799 decreaseNestingLevel() { 13800 const t5 = this.getBlock(); 13801 if (t5) 13802 return this.setDocument(this.document.replaceBlock(t5, t5.decreaseNestingLevel())); 13803 } 13804 increaseNestingLevel() { 13805 const t5 = this.getBlock(); 13806 if (t5) 13807 return this.setDocument(this.document.replaceBlock(t5, t5.increaseNestingLevel())); 13808 } 13809 canDecreaseBlockAttributeLevel() { 13810 var t5; 13811 return (null === (t5 = this.getBlock()) || void 0 === t5 ? void 0 : t5.getAttributeLevel()) > 0; 13812 } 13813 decreaseBlockAttributeLevel() { 13814 var t5; 13815 const e4 = null === (t5 = this.getBlock()) || void 0 === t5 ? void 0 : t5.getLastAttribute(); 13816 if (e4) 13817 return this.removeCurrentAttribute(e4); 13818 } 13819 decreaseListLevel() { 13820 let [t5] = Array.from(this.getSelectedRange()); 13821 const { index: e4 } = this.document.locationFromPosition(t5); 13822 let i4 = e4; 13823 const n3 = this.getBlock().getAttributeLevel(); 13824 let r4 = this.document.getBlockAtIndex(i4 + 1); 13825 for (; r4 && r4.isListItem() && !(r4.getAttributeLevel() <= n3); ) 13826 i4++, r4 = this.document.getBlockAtIndex(i4 + 1); 13827 t5 = this.document.positionFromLocation({ index: e4, offset: 0 }); 13828 const o3 = this.document.positionFromLocation({ index: i4, offset: 0 }); 13829 return this.setDocument(this.document.removeLastListAttributeAtRange([t5, o3])); 13830 } 13831 updateCurrentAttributes() { 13832 const t5 = this.getSelectedRange({ ignoreLock: true }); 13833 if (t5) { 13834 const e4 = this.document.getCommonAttributesAtRange(t5); 13835 if (Array.from(gt()).forEach((t6) => { 13836 e4[t6] || this.canSetCurrentAttribute(t6) || (e4[t6] = false); 13837 }), !Tt(e4, this.currentAttributes)) 13838 return this.currentAttributes = e4, this.notifyDelegateOfCurrentAttributesChange(); 13839 } 13840 } 13841 getCurrentAttributes() { 13842 return m.call({}, this.currentAttributes); 13843 } 13844 getCurrentTextAttributes() { 13845 const t5 = {}; 13846 for (const e4 in this.currentAttributes) { 13847 const i4 = this.currentAttributes[e4]; 13848 false !== i4 && ft(e4) && (t5[e4] = i4); 13849 } 13850 return t5; 13851 } 13852 freezeSelection() { 13853 return this.setCurrentAttribute("frozen", true); 13854 } 13855 thawSelection() { 13856 return this.removeCurrentAttribute("frozen"); 13857 } 13858 hasFrozenSelection() { 13859 return this.hasCurrentAttribute("frozen"); 13860 } 13861 setSelection(t5) { 13862 var e4; 13863 const i4 = this.document.locationRangeFromRange(t5); 13864 return null === (e4 = this.delegate) || void 0 === e4 ? void 0 : e4.compositionDidRequestChangingSelectionToLocationRange(i4); 13865 } 13866 getSelectedRange() { 13867 const t5 = this.getLocationRange(); 13868 if (t5) 13869 return this.document.rangeFromLocationRange(t5); 13870 } 13871 setSelectedRange(t5) { 13872 const e4 = this.document.locationRangeFromRange(t5); 13873 return this.getSelectionManager().setLocationRange(e4); 13874 } 13875 getPosition() { 13876 const t5 = this.getLocationRange(); 13877 if (t5) 13878 return this.document.positionFromLocation(t5[0]); 13879 } 13880 getLocationRange(t5) { 13881 return this.targetLocationRange ? this.targetLocationRange : this.getSelectionManager().getLocationRange(t5) || wt({ index: 0, offset: 0 }); 13882 } 13883 withTargetLocationRange(t5, e4) { 13884 let i4; 13885 this.targetLocationRange = t5; 13886 try { 13887 i4 = e4(); 13888 } finally { 13889 this.targetLocationRange = null; 13890 } 13891 return i4; 13892 } 13893 withTargetRange(t5, e4) { 13894 const i4 = this.document.locationRangeFromRange(t5); 13895 return this.withTargetLocationRange(i4, e4); 13896 } 13897 withTargetDOMRange(t5, e4) { 13898 const i4 = this.createLocationRangeFromDOMRange(t5, { strict: false }); 13899 return this.withTargetLocationRange(i4, e4); 13900 } 13901 getExpandedRangeInDirection(t5) { 13902 let { length: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, [i4, n3] = Array.from(this.getSelectedRange()); 13903 return "backward" === t5 ? e4 ? i4 -= e4 : i4 = this.translateUTF16PositionFromOffset(i4, -1) : e4 ? n3 += e4 : n3 = this.translateUTF16PositionFromOffset(n3, 1), wt([i4, n3]); 13904 } 13905 shouldManageMovingCursorInDirection(t5) { 13906 if (this.editingAttachment) 13907 return true; 13908 const e4 = this.getExpandedRangeInDirection(t5); 13909 return null != this.getAttachmentAtRange(e4); 13910 } 13911 moveCursorInDirection(t5) { 13912 let e4, i4; 13913 if (this.editingAttachment) 13914 i4 = this.document.getRangeOfAttachment(this.editingAttachment); 13915 else { 13916 const n3 = this.getSelectedRange(); 13917 i4 = this.getExpandedRangeInDirection(t5), e4 = !Dt(n3, i4); 13918 } 13919 if ("backward" === t5 ? this.setSelectedRange(i4[0]) : this.setSelectedRange(i4[1]), e4) { 13920 const t6 = this.getAttachmentAtRange(i4); 13921 if (t6) 13922 return this.editAttachment(t6); 13923 } 13924 } 13925 expandSelectionInDirection(t5) { 13926 let { length: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 13927 const i4 = this.getExpandedRangeInDirection(t5, { length: e4 }); 13928 return this.setSelectedRange(i4); 13929 } 13930 expandSelectionForEditing() { 13931 if (this.hasCurrentAttribute("href")) 13932 return this.expandSelectionAroundCommonAttribute("href"); 13933 } 13934 expandSelectionAroundCommonAttribute(t5) { 13935 const e4 = this.getPosition(), i4 = this.document.getRangeOfCommonAttributeAtPosition(t5, e4); 13936 return this.setSelectedRange(i4); 13937 } 13938 selectionContainsAttachments() { 13939 var t5; 13940 return (null === (t5 = this.getSelectedAttachments()) || void 0 === t5 ? void 0 : t5.length) > 0; 13941 } 13942 selectionIsInCursorTarget() { 13943 return this.editingAttachment || this.positionIsCursorTarget(this.getPosition()); 13944 } 13945 positionIsCursorTarget(t5) { 13946 const e4 = this.document.locationFromPosition(t5); 13947 if (e4) 13948 return this.locationIsCursorTarget(e4); 13949 } 13950 positionIsBlockBreak(t5) { 13951 var e4; 13952 return null === (e4 = this.document.getPieceAtPosition(t5)) || void 0 === e4 ? void 0 : e4.isBlockBreak(); 13953 } 13954 getSelectedDocument() { 13955 const t5 = this.getSelectedRange(); 13956 if (t5) 13957 return this.document.getDocumentAtRange(t5); 13958 } 13959 getSelectedAttachments() { 13960 var t5; 13961 return null === (t5 = this.getSelectedDocument()) || void 0 === t5 ? void 0 : t5.getAttachments(); 13962 } 13963 getAttachments() { 13964 return this.attachments.slice(0); 13965 } 13966 refreshAttachments() { 13967 const t5 = this.document.getAttachments(), { added: e4, removed: i4 } = function() { 13968 let t6 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], e5 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : []; 13969 const i5 = [], n3 = [], r4 = /* @__PURE__ */ new Set(); 13970 t6.forEach((t7) => { 13971 r4.add(t7); 13972 }); 13973 const o3 = /* @__PURE__ */ new Set(); 13974 return e5.forEach((t7) => { 13975 o3.add(t7), r4.has(t7) || i5.push(t7); 13976 }), t6.forEach((t7) => { 13977 o3.has(t7) || n3.push(t7); 13978 }), { added: i5, removed: n3 }; 13979 }(this.attachments, t5); 13980 return this.attachments = t5, Array.from(i4).forEach((t6) => { 13981 var e5, i5; 13982 t6.delegate = null, null === (e5 = this.delegate) || void 0 === e5 || null === (i5 = e5.compositionDidRemoveAttachment) || void 0 === i5 || i5.call(e5, t6); 13983 }), (() => { 13984 const t6 = []; 13985 return Array.from(e4).forEach((e5) => { 13986 var i5, n3; 13987 e5.delegate = this, t6.push(null === (i5 = this.delegate) || void 0 === i5 || null === (n3 = i5.compositionDidAddAttachment) || void 0 === n3 ? void 0 : n3.call(i5, e5)); 13988 }), t6; 13989 })(); 13990 } 13991 attachmentDidChangeAttributes(t5) { 13992 var e4, i4; 13993 return this.revision++, null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionDidEditAttachment) || void 0 === i4 ? void 0 : i4.call(e4, t5); 13994 } 13995 attachmentDidChangePreviewURL(t5) { 13996 var e4, i4; 13997 return this.revision++, null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionDidChangeAttachmentPreviewURL) || void 0 === i4 ? void 0 : i4.call(e4, t5); 13998 } 13999 editAttachment(t5, e4) { 14000 var i4, n3; 14001 if (t5 !== this.editingAttachment) 14002 return this.stopEditingAttachment(), this.editingAttachment = t5, null === (i4 = this.delegate) || void 0 === i4 || null === (n3 = i4.compositionDidStartEditingAttachment) || void 0 === n3 ? void 0 : n3.call(i4, this.editingAttachment, e4); 14003 } 14004 stopEditingAttachment() { 14005 var t5, e4; 14006 this.editingAttachment && (null === (t5 = this.delegate) || void 0 === t5 || null === (e4 = t5.compositionDidStopEditingAttachment) || void 0 === e4 || e4.call(t5, this.editingAttachment), this.editingAttachment = null); 14007 } 14008 updateAttributesForAttachment(t5, e4) { 14009 return this.setDocument(this.document.updateAttributesForAttachment(t5, e4)); 14010 } 14011 removeAttributeForAttachment(t5, e4) { 14012 return this.setDocument(this.document.removeAttributeForAttachment(t5, e4)); 14013 } 14014 breakFormattedBlock(t5) { 14015 let { document: e4 } = t5; 14016 const { block: i4 } = t5; 14017 let n3 = t5.startPosition, r4 = [n3 - 1, n3]; 14018 i4.getBlockBreakPosition() === t5.startLocation.offset ? (i4.breaksOnReturn() && "\n" === t5.nextCharacter ? n3 += 1 : e4 = e4.removeTextAtRange(r4), r4 = [n3, n3]) : "\n" === t5.nextCharacter ? "\n" === t5.previousCharacter ? r4 = [n3 - 1, n3 + 1] : (r4 = [n3, n3 + 1], n3 += 1) : t5.startLocation.offset - 1 != 0 && (n3 += 1); 14019 const o3 = new on([i4.removeLastAttribute().copyWithoutText()]); 14020 return this.setDocument(e4.insertDocumentAtRange(o3, r4)), this.setSelection(n3); 14021 } 14022 getPreviousBlock() { 14023 const t5 = this.getLocationRange(); 14024 if (t5) { 14025 const { index: e4 } = t5[0]; 14026 if (e4 > 0) 14027 return this.document.getBlockAtIndex(e4 - 1); 14028 } 14029 } 14030 getBlock() { 14031 const t5 = this.getLocationRange(); 14032 if (t5) 14033 return this.document.getBlockAtIndex(t5[0].index); 14034 } 14035 getAttachmentAtRange(t5) { 14036 const e4 = this.document.getDocumentAtRange(t5); 14037 if (e4.toString() === "".concat("\uFFFC", "\n")) 14038 return e4.getAttachments()[0]; 14039 } 14040 notifyDelegateOfCurrentAttributesChange() { 14041 var t5, e4; 14042 return null === (t5 = this.delegate) || void 0 === t5 || null === (e4 = t5.compositionDidChangeCurrentAttributes) || void 0 === e4 ? void 0 : e4.call(t5, this.currentAttributes); 14043 } 14044 notifyDelegateOfInsertionAtRange(t5) { 14045 var e4, i4; 14046 return null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionDidPerformInsertionAtRange) || void 0 === i4 ? void 0 : i4.call(e4, t5); 14047 } 14048 translateUTF16PositionFromOffset(t5, e4) { 14049 const i4 = this.document.toUTF16String(), n3 = i4.offsetFromUCS2Offset(t5); 14050 return i4.offsetToUCS2Offset(n3 + e4); 14051 } 14052 }; 14053 kn.proxyMethod("getSelectionManager().getPointRange"), kn.proxyMethod("getSelectionManager().setLocationRangeFromPointRange"), kn.proxyMethod("getSelectionManager().createLocationRangeFromDOMRange"), kn.proxyMethod("getSelectionManager().locationIsCursorTarget"), kn.proxyMethod("getSelectionManager().selectionIsExpanded"), kn.proxyMethod("delegate?.getSelectionManager"); 14054 var Tn = class extends q { 14055 constructor(t5) { 14056 super(...arguments), this.composition = t5, this.undoEntries = [], this.redoEntries = []; 14057 } 14058 recordUndoEntry(t5) { 14059 let { context: e4, consolidatable: i4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 14060 const n3 = this.undoEntries.slice(-1)[0]; 14061 if (!i4 || !wn(n3, t5, e4)) { 14062 const i5 = this.createEntry({ description: t5, context: e4 }); 14063 this.undoEntries.push(i5), this.redoEntries = []; 14064 } 14065 } 14066 undo() { 14067 const t5 = this.undoEntries.pop(); 14068 if (t5) { 14069 const e4 = this.createEntry(t5); 14070 return this.redoEntries.push(e4), this.composition.loadSnapshot(t5.snapshot); 14071 } 14072 } 14073 redo() { 14074 const t5 = this.redoEntries.pop(); 14075 if (t5) { 14076 const e4 = this.createEntry(t5); 14077 return this.undoEntries.push(e4), this.composition.loadSnapshot(t5.snapshot); 14078 } 14079 } 14080 canUndo() { 14081 return this.undoEntries.length > 0; 14082 } 14083 canRedo() { 14084 return this.redoEntries.length > 0; 14085 } 14086 createEntry() { 14087 let { description: t5, context: e4 } = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 14088 return { description: null == t5 ? void 0 : t5.toString(), context: JSON.stringify(e4), snapshot: this.composition.getSnapshot() }; 14089 } 14090 }; 14091 var wn = (t5, e4, i4) => (null == t5 ? void 0 : t5.description) === (null == e4 ? void 0 : e4.toString()) && (null == t5 ? void 0 : t5.context) === JSON.stringify(i4); 14092 var Ln = "attachmentGallery"; 14093 var Dn = class { 14094 constructor(t5) { 14095 this.document = t5.document, this.selectedRange = t5.selectedRange; 14096 } 14097 perform() { 14098 return this.removeBlockAttribute(), this.applyBlockAttribute(); 14099 } 14100 getSnapshot() { 14101 return { document: this.document, selectedRange: this.selectedRange }; 14102 } 14103 removeBlockAttribute() { 14104 return this.findRangesOfBlocks().map((t5) => this.document = this.document.removeAttributeAtRange(Ln, t5)); 14105 } 14106 applyBlockAttribute() { 14107 let t5 = 0; 14108 this.findRangesOfPieces().forEach((e4) => { 14109 e4[1] - e4[0] > 1 && (e4[0] += t5, e4[1] += t5, "\n" !== this.document.getCharacterAtPosition(e4[1]) && (this.document = this.document.insertBlockBreakAtRange(e4[1]), e4[1] < this.selectedRange[1] && this.moveSelectedRangeForward(), e4[1]++, t5++), 0 !== e4[0] && "\n" !== this.document.getCharacterAtPosition(e4[0] - 1) && (this.document = this.document.insertBlockBreakAtRange(e4[0]), e4[0] < this.selectedRange[0] && this.moveSelectedRangeForward(), e4[0]++, t5++), this.document = this.document.applyBlockAttributeAtRange(Ln, true, e4)); 14110 }); 14111 } 14112 findRangesOfBlocks() { 14113 return this.document.findRangesForBlockAttribute(Ln); 14114 } 14115 findRangesOfPieces() { 14116 return this.document.findRangesForTextAttribute("presentation", { withValue: "gallery" }); 14117 } 14118 moveSelectedRangeForward() { 14119 this.selectedRange[0] += 1, this.selectedRange[1] += 1; 14120 } 14121 }; 14122 var Nn = function(t5) { 14123 const e4 = new Dn(t5); 14124 return e4.perform(), e4.getSnapshot(); 14125 }; 14126 var In = [Nn]; 14127 var On = class { 14128 constructor(t5, e4, i4) { 14129 this.insertFiles = this.insertFiles.bind(this), this.composition = t5, this.selectionManager = e4, this.element = i4, this.undoManager = new Tn(this.composition), this.filters = In.slice(0); 14130 } 14131 loadDocument(t5) { 14132 return this.loadSnapshot({ document: t5, selectedRange: [0, 0] }); 14133 } 14134 loadHTML() { 14135 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ""; 14136 const e4 = cn.parse(t5, { referenceElement: this.element }).getDocument(); 14137 return this.loadDocument(e4); 14138 } 14139 loadJSON(t5) { 14140 let { document: e4, selectedRange: i4 } = t5; 14141 return e4 = on.fromJSON(e4), this.loadSnapshot({ document: e4, selectedRange: i4 }); 14142 } 14143 loadSnapshot(t5) { 14144 return this.undoManager = new Tn(this.composition), this.composition.loadSnapshot(t5); 14145 } 14146 getDocument() { 14147 return this.composition.document; 14148 } 14149 getSelectedDocument() { 14150 return this.composition.getSelectedDocument(); 14151 } 14152 getSnapshot() { 14153 return this.composition.getSnapshot(); 14154 } 14155 toJSON() { 14156 return this.getSnapshot(); 14157 } 14158 deleteInDirection(t5) { 14159 return this.composition.deleteInDirection(t5); 14160 } 14161 insertAttachment(t5) { 14162 return this.composition.insertAttachment(t5); 14163 } 14164 insertAttachments(t5) { 14165 return this.composition.insertAttachments(t5); 14166 } 14167 insertDocument(t5) { 14168 return this.composition.insertDocument(t5); 14169 } 14170 insertFile(t5) { 14171 return this.composition.insertFile(t5); 14172 } 14173 insertFiles(t5) { 14174 return this.composition.insertFiles(t5); 14175 } 14176 insertHTML(t5) { 14177 return this.composition.insertHTML(t5); 14178 } 14179 insertString(t5) { 14180 return this.composition.insertString(t5); 14181 } 14182 insertText(t5) { 14183 return this.composition.insertText(t5); 14184 } 14185 insertLineBreak() { 14186 return this.composition.insertLineBreak(); 14187 } 14188 getSelectedRange() { 14189 return this.composition.getSelectedRange(); 14190 } 14191 getPosition() { 14192 return this.composition.getPosition(); 14193 } 14194 getClientRectAtPosition(t5) { 14195 const e4 = this.getDocument().locationRangeFromRange([t5, t5 + 1]); 14196 return this.selectionManager.getClientRectAtLocationRange(e4); 14197 } 14198 expandSelectionInDirection(t5) { 14199 return this.composition.expandSelectionInDirection(t5); 14200 } 14201 moveCursorInDirection(t5) { 14202 return this.composition.moveCursorInDirection(t5); 14203 } 14204 setSelectedRange(t5) { 14205 return this.composition.setSelectedRange(t5); 14206 } 14207 activateAttribute(t5) { 14208 let e4 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1]; 14209 return this.composition.setCurrentAttribute(t5, e4); 14210 } 14211 attributeIsActive(t5) { 14212 return this.composition.hasCurrentAttribute(t5); 14213 } 14214 canActivateAttribute(t5) { 14215 return this.composition.canSetCurrentAttribute(t5); 14216 } 14217 deactivateAttribute(t5) { 14218 return this.composition.removeCurrentAttribute(t5); 14219 } 14220 setHTMLAtributeAtPosition(t5, e4, i4) { 14221 this.composition.setHTMLAtributeAtPosition(t5, e4, i4); 14222 } 14223 canDecreaseNestingLevel() { 14224 return this.composition.canDecreaseNestingLevel(); 14225 } 14226 canIncreaseNestingLevel() { 14227 return this.composition.canIncreaseNestingLevel(); 14228 } 14229 decreaseNestingLevel() { 14230 if (this.canDecreaseNestingLevel()) 14231 return this.composition.decreaseNestingLevel(); 14232 } 14233 increaseNestingLevel() { 14234 if (this.canIncreaseNestingLevel()) 14235 return this.composition.increaseNestingLevel(); 14236 } 14237 canRedo() { 14238 return this.undoManager.canRedo(); 14239 } 14240 canUndo() { 14241 return this.undoManager.canUndo(); 14242 } 14243 recordUndoEntry(t5) { 14244 let { context: e4, consolidatable: i4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 14245 return this.undoManager.recordUndoEntry(t5, { context: e4, consolidatable: i4 }); 14246 } 14247 redo() { 14248 if (this.canRedo()) 14249 return this.undoManager.redo(); 14250 } 14251 undo() { 14252 if (this.canUndo()) 14253 return this.undoManager.undo(); 14254 } 14255 }; 14256 var Fn = class { 14257 constructor(t5) { 14258 this.element = t5; 14259 } 14260 findLocationFromContainerAndOffset(t5, e4) { 14261 let { strict: i4 } = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { strict: true }, n3 = 0, r4 = false; 14262 const o3 = { index: 0, offset: 0 }, s4 = this.findAttachmentElementParentForNode(t5); 14263 s4 && (t5 = s4.parentNode, e4 = E(s4)); 14264 const a4 = R(this.element, { usingFilter: _n }); 14265 for (; a4.nextNode(); ) { 14266 const s5 = a4.currentNode; 14267 if (s5 === t5 && B(t5)) { 14268 F(s5) || (o3.offset += e4); 14269 break; 14270 } 14271 if (s5.parentNode === t5) { 14272 if (n3++ === e4) 14273 break; 14274 } else if (!C(t5, s5) && n3 > 0) 14275 break; 14276 N(s5, { strict: i4 }) ? (r4 && o3.index++, o3.offset = 0, r4 = true) : o3.offset += Pn(s5); 14277 } 14278 return o3; 14279 } 14280 findContainerAndOffsetFromLocation(t5) { 14281 let e4, i4; 14282 if (0 === t5.index && 0 === t5.offset) { 14283 for (e4 = this.element, i4 = 0; e4.firstChild; ) 14284 if (e4 = e4.firstChild, D(e4)) { 14285 i4 = 1; 14286 break; 14287 } 14288 return [e4, i4]; 14289 } 14290 let [n3, r4] = this.findNodeAndOffsetFromLocation(t5); 14291 if (n3) { 14292 if (B(n3)) 14293 0 === Pn(n3) ? (e4 = n3.parentNode.parentNode, i4 = E(n3.parentNode), F(n3, { name: "right" }) && i4++) : (e4 = n3, i4 = t5.offset - r4); 14294 else { 14295 if (e4 = n3.parentNode, !N(n3.previousSibling) && !D(e4)) 14296 for (; n3 === e4.lastChild && (n3 = e4, e4 = e4.parentNode, !D(e4)); ) 14297 ; 14298 i4 = E(n3), 0 !== t5.offset && i4++; 14299 } 14300 return [e4, i4]; 14301 } 14302 } 14303 findNodeAndOffsetFromLocation(t5) { 14304 let e4, i4, n3 = 0; 14305 for (const r4 of this.getSignificantNodesForIndex(t5.index)) { 14306 const o3 = Pn(r4); 14307 if (t5.offset <= n3 + o3) 14308 if (B(r4)) { 14309 if (e4 = r4, i4 = n3, t5.offset === i4 && F(e4)) 14310 break; 14311 } else 14312 e4 || (e4 = r4, i4 = n3); 14313 if (n3 += o3, n3 > t5.offset) 14314 break; 14315 } 14316 return [e4, i4]; 14317 } 14318 findAttachmentElementParentForNode(t5) { 14319 for (; t5 && t5 !== this.element; ) { 14320 if (P(t5)) 14321 return t5; 14322 t5 = t5.parentNode; 14323 } 14324 } 14325 getSignificantNodesForIndex(t5) { 14326 const e4 = [], i4 = R(this.element, { usingFilter: Mn }); 14327 let n3 = false; 14328 for (; i4.nextNode(); ) { 14329 const o3 = i4.currentNode; 14330 var r4; 14331 if (I(o3)) { 14332 if (null != r4 ? r4++ : r4 = 0, r4 === t5) 14333 n3 = true; 14334 else if (n3) 14335 break; 14336 } else 14337 n3 && e4.push(o3); 14338 } 14339 return e4; 14340 } 14341 }; 14342 var Pn = function(t5) { 14343 if (t5.nodeType === Node.TEXT_NODE) { 14344 if (F(t5)) 14345 return 0; 14346 return t5.textContent.length; 14347 } 14348 return "br" === k(t5) || P(t5) ? 1 : 0; 14349 }; 14350 var Mn = function(t5) { 14351 return Bn(t5) === NodeFilter.FILTER_ACCEPT ? _n(t5) : NodeFilter.FILTER_REJECT; 14352 }; 14353 var Bn = function(t5) { 14354 return M(t5) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; 14355 }; 14356 var _n = function(t5) { 14357 return P(t5.parentNode) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; 14358 }; 14359 var jn = class { 14360 createDOMRangeFromPoint(t5) { 14361 let e4, { x: i4, y: n3 } = t5; 14362 if (document.caretPositionFromPoint) { 14363 const { offsetNode: t6, offset: r4 } = document.caretPositionFromPoint(i4, n3); 14364 return e4 = document.createRange(), e4.setStart(t6, r4), e4; 14365 } 14366 if (document.caretRangeFromPoint) 14367 return document.caretRangeFromPoint(i4, n3); 14368 if (document.body.createTextRange) { 14369 const t6 = Mt(); 14370 try { 14371 const t7 = document.body.createTextRange(); 14372 t7.moveToPoint(i4, n3), t7.select(); 14373 } catch (t7) { 14374 } 14375 return e4 = Mt(), Bt(t6), e4; 14376 } 14377 } 14378 getClientRectsForDOMRange(t5) { 14379 const e4 = Array.from(t5.getClientRects()); 14380 return [e4[0], e4[e4.length - 1]]; 14381 } 14382 }; 14383 var Wn = class extends q { 14384 constructor(t5) { 14385 super(...arguments), this.didMouseDown = this.didMouseDown.bind(this), this.selectionDidChange = this.selectionDidChange.bind(this), this.element = t5, this.locationMapper = new Fn(this.element), this.pointMapper = new jn(), this.lockCount = 0, b("mousedown", { onElement: this.element, withCallback: this.didMouseDown }); 14386 } 14387 getLocationRange() { 14388 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 14389 return false === t5.strict ? this.createLocationRangeFromDOMRange(Mt()) : t5.ignoreLock ? this.currentLocationRange : this.lockedLocationRange ? this.lockedLocationRange : this.currentLocationRange; 14390 } 14391 setLocationRange(t5) { 14392 if (this.lockedLocationRange) 14393 return; 14394 t5 = wt(t5); 14395 const e4 = this.createDOMRangeFromLocationRange(t5); 14396 e4 && (Bt(e4), this.updateCurrentLocationRange(t5)); 14397 } 14398 setLocationRangeFromPointRange(t5) { 14399 t5 = wt(t5); 14400 const e4 = this.getLocationAtPoint(t5[0]), i4 = this.getLocationAtPoint(t5[1]); 14401 this.setLocationRange([e4, i4]); 14402 } 14403 getClientRectAtLocationRange(t5) { 14404 const e4 = this.createDOMRangeFromLocationRange(t5); 14405 if (e4) 14406 return this.getClientRectsForDOMRange(e4)[1]; 14407 } 14408 locationIsCursorTarget(t5) { 14409 const e4 = Array.from(this.findNodeAndOffsetFromLocation(t5))[0]; 14410 return F(e4); 14411 } 14412 lock() { 14413 0 == this.lockCount++ && (this.updateCurrentLocationRange(), this.lockedLocationRange = this.getLocationRange()); 14414 } 14415 unlock() { 14416 if (0 == --this.lockCount) { 14417 const { lockedLocationRange: t5 } = this; 14418 if (this.lockedLocationRange = null, null != t5) 14419 return this.setLocationRange(t5); 14420 } 14421 } 14422 clearSelection() { 14423 var t5; 14424 return null === (t5 = Pt()) || void 0 === t5 ? void 0 : t5.removeAllRanges(); 14425 } 14426 selectionIsCollapsed() { 14427 var t5; 14428 return true === (null === (t5 = Mt()) || void 0 === t5 ? void 0 : t5.collapsed); 14429 } 14430 selectionIsExpanded() { 14431 return !this.selectionIsCollapsed(); 14432 } 14433 createLocationRangeFromDOMRange(t5, e4) { 14434 if (null == t5 || !this.domRangeWithinElement(t5)) 14435 return; 14436 const i4 = this.findLocationFromContainerAndOffset(t5.startContainer, t5.startOffset, e4); 14437 if (!i4) 14438 return; 14439 const n3 = t5.collapsed ? void 0 : this.findLocationFromContainerAndOffset(t5.endContainer, t5.endOffset, e4); 14440 return wt([i4, n3]); 14441 } 14442 didMouseDown() { 14443 return this.pauseTemporarily(); 14444 } 14445 pauseTemporarily() { 14446 let t5; 14447 this.paused = true; 14448 const e4 = () => { 14449 if (this.paused = false, clearTimeout(i4), Array.from(t5).forEach((t6) => { 14450 t6.destroy(); 14451 }), C(document, this.element)) 14452 return this.selectionDidChange(); 14453 }, i4 = setTimeout(e4, 200); 14454 t5 = ["mousemove", "keydown"].map((t6) => b(t6, { onElement: document, withCallback: e4 })); 14455 } 14456 selectionDidChange() { 14457 if (!this.paused && !x(this.element)) 14458 return this.updateCurrentLocationRange(); 14459 } 14460 updateCurrentLocationRange(t5) { 14461 var e4, i4; 14462 if ((null != t5 ? t5 : t5 = this.createLocationRangeFromDOMRange(Mt())) && !Dt(t5, this.currentLocationRange)) 14463 return this.currentLocationRange = t5, null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.locationRangeDidChange) || void 0 === i4 ? void 0 : i4.call(e4, this.currentLocationRange.slice(0)); 14464 } 14465 createDOMRangeFromLocationRange(t5) { 14466 const e4 = this.findContainerAndOffsetFromLocation(t5[0]), i4 = Lt(t5) ? e4 : this.findContainerAndOffsetFromLocation(t5[1]) || e4; 14467 if (null != e4 && null != i4) { 14468 const t6 = document.createRange(); 14469 return t6.setStart(...Array.from(e4 || [])), t6.setEnd(...Array.from(i4 || [])), t6; 14470 } 14471 } 14472 getLocationAtPoint(t5) { 14473 const e4 = this.createDOMRangeFromPoint(t5); 14474 var i4; 14475 if (e4) 14476 return null === (i4 = this.createLocationRangeFromDOMRange(e4)) || void 0 === i4 ? void 0 : i4[0]; 14477 } 14478 domRangeWithinElement(t5) { 14479 return t5.collapsed ? C(this.element, t5.startContainer) : C(this.element, t5.startContainer) && C(this.element, t5.endContainer); 14480 } 14481 }; 14482 Wn.proxyMethod("locationMapper.findLocationFromContainerAndOffset"), Wn.proxyMethod("locationMapper.findContainerAndOffsetFromLocation"), Wn.proxyMethod("locationMapper.findNodeAndOffsetFromLocation"), Wn.proxyMethod("pointMapper.createDOMRangeFromPoint"), Wn.proxyMethod("pointMapper.getClientRectsForDOMRange"); 14483 var Un = Object.freeze({ __proto__: null, Attachment: Wi, AttachmentManager: Sn, AttachmentPiece: Ui, Block: Gi, Composition: kn, Document: on, Editor: On, HTMLParser: cn, HTMLSanitizer: ui, LineBreakInsertion: Rn, LocationMapper: Fn, ManagedAttachment: En, Piece: _i, PointMapper: jn, SelectionManager: Wn, SplittableList: zi, StringPiece: Vi, Text: Ki, UndoManager: Tn }); 14484 var Vn = Object.freeze({ __proto__: null, ObjectView: ie, AttachmentView: gi, BlockView: xi, DocumentView: Ci, PieceView: bi, PreviewableAttachmentView: fi, TextView: vi }); 14485 var { lang: zn, css: qn, keyNames: Hn } = z; 14486 var Jn = function(t5) { 14487 return function() { 14488 const e4 = t5.apply(this, arguments); 14489 e4.do(), this.undos || (this.undos = []), this.undos.push(e4.undo); 14490 }; 14491 }; 14492 var Kn = class extends q { 14493 constructor(t5, e4, i4) { 14494 let n3 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}; 14495 super(...arguments), wi(this, "makeElementMutable", Jn(() => ({ do: () => { 14496 this.element.dataset.trixMutable = true; 14497 }, undo: () => delete this.element.dataset.trixMutable }))), wi(this, "addToolbar", Jn(() => { 14498 const t6 = T({ tagName: "div", className: qn.attachmentToolbar, data: { trixMutable: true }, childNodes: T({ tagName: "div", className: "trix-button-row", childNodes: T({ tagName: "span", className: "trix-button-group trix-button-group--actions", childNodes: T({ tagName: "button", className: "trix-button trix-button--remove", textContent: zn.remove, attributes: { title: zn.remove }, data: { trixAction: "remove" } }) }) }) }); 14499 return this.attachment.isPreviewable() && t6.appendChild(T({ tagName: "div", className: qn.attachmentMetadataContainer, childNodes: T({ tagName: "span", className: qn.attachmentMetadata, childNodes: [T({ tagName: "span", className: qn.attachmentName, textContent: this.attachment.getFilename(), attributes: { title: this.attachment.getFilename() } }), T({ tagName: "span", className: qn.attachmentSize, textContent: this.attachment.getFormattedFilesize() })] }) })), b("click", { onElement: t6, withCallback: this.didClickToolbar }), b("click", { onElement: t6, matchingSelector: "[data-trix-action]", withCallback: this.didClickActionButton }), v("trix-attachment-before-toolbar", { onElement: this.element, attributes: { toolbar: t6, attachment: this.attachment } }), { do: () => this.element.appendChild(t6), undo: () => S(t6) }; 14500 })), wi(this, "installCaptionEditor", Jn(() => { 14501 const t6 = T({ tagName: "textarea", className: qn.attachmentCaptionEditor, attributes: { placeholder: zn.captionPlaceholder }, data: { trixMutable: true } }); 14502 t6.value = this.attachmentPiece.getCaption(); 14503 const e5 = t6.cloneNode(); 14504 e5.classList.add("trix-autoresize-clone"), e5.tabIndex = -1; 14505 const i5 = function() { 14506 e5.value = t6.value, t6.style.height = e5.scrollHeight + "px"; 14507 }; 14508 b("input", { onElement: t6, withCallback: i5 }), b("input", { onElement: t6, withCallback: this.didInputCaption }), b("keydown", { onElement: t6, withCallback: this.didKeyDownCaption }), b("change", { onElement: t6, withCallback: this.didChangeCaption }), b("blur", { onElement: t6, withCallback: this.didBlurCaption }); 14509 const n4 = this.element.querySelector("figcaption"), r4 = n4.cloneNode(); 14510 return { do: () => { 14511 if (n4.style.display = "none", r4.appendChild(t6), r4.appendChild(e5), r4.classList.add("".concat(qn.attachmentCaption, "--editing")), n4.parentElement.insertBefore(r4, n4), i5(), this.options.editCaption) 14512 return Rt(() => t6.focus()); 14513 }, undo() { 14514 S(r4), n4.style.display = null; 14515 } }; 14516 })), this.didClickToolbar = this.didClickToolbar.bind(this), this.didClickActionButton = this.didClickActionButton.bind(this), this.didKeyDownCaption = this.didKeyDownCaption.bind(this), this.didInputCaption = this.didInputCaption.bind(this), this.didChangeCaption = this.didChangeCaption.bind(this), this.didBlurCaption = this.didBlurCaption.bind(this), this.attachmentPiece = t5, this.element = e4, this.container = i4, this.options = n3, this.attachment = this.attachmentPiece.attachment, "a" === k(this.element) && (this.element = this.element.firstChild), this.install(); 14517 } 14518 install() { 14519 this.makeElementMutable(), this.addToolbar(), this.attachment.isPreviewable() && this.installCaptionEditor(); 14520 } 14521 uninstall() { 14522 var t5; 14523 let e4 = this.undos.pop(); 14524 for (this.savePendingCaption(); e4; ) 14525 e4(), e4 = this.undos.pop(); 14526 null === (t5 = this.delegate) || void 0 === t5 || t5.didUninstallAttachmentEditor(this); 14527 } 14528 savePendingCaption() { 14529 if (null != this.pendingCaption) { 14530 const r4 = this.pendingCaption; 14531 var t5, e4, i4, n3; 14532 if (this.pendingCaption = null, r4) 14533 null === (t5 = this.delegate) || void 0 === t5 || null === (e4 = t5.attachmentEditorDidRequestUpdatingAttributesForAttachment) || void 0 === e4 || e4.call(t5, { caption: r4 }, this.attachment); 14534 else 14535 null === (i4 = this.delegate) || void 0 === i4 || null === (n3 = i4.attachmentEditorDidRequestRemovingAttributeForAttachment) || void 0 === n3 || n3.call(i4, "caption", this.attachment); 14536 } 14537 } 14538 didClickToolbar(t5) { 14539 return t5.preventDefault(), t5.stopPropagation(); 14540 } 14541 didClickActionButton(t5) { 14542 var e4; 14543 if ("remove" === t5.target.getAttribute("data-trix-action")) 14544 return null === (e4 = this.delegate) || void 0 === e4 ? void 0 : e4.attachmentEditorDidRequestRemovalOfAttachment(this.attachment); 14545 } 14546 didKeyDownCaption(t5) { 14547 var e4, i4; 14548 if ("return" === Hn[t5.keyCode]) 14549 return t5.preventDefault(), this.savePendingCaption(), null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.attachmentEditorDidRequestDeselectingAttachment) || void 0 === i4 ? void 0 : i4.call(e4, this.attachment); 14550 } 14551 didInputCaption(t5) { 14552 this.pendingCaption = t5.target.value.replace(/\s/g, " ").trim(); 14553 } 14554 didChangeCaption(t5) { 14555 return this.savePendingCaption(); 14556 } 14557 didBlurCaption(t5) { 14558 return this.savePendingCaption(); 14559 } 14560 }; 14561 var Gn = class extends q { 14562 constructor(t5, i4) { 14563 super(...arguments), this.didFocus = this.didFocus.bind(this), this.didBlur = this.didBlur.bind(this), this.didClickAttachment = this.didClickAttachment.bind(this), this.element = t5, this.composition = i4, this.documentView = new Ci(this.composition.document, { element: this.element }), b("focus", { onElement: this.element, withCallback: this.didFocus }), b("blur", { onElement: this.element, withCallback: this.didBlur }), b("click", { onElement: this.element, matchingSelector: "a[contenteditable=false]", preventDefault: true }), b("mousedown", { onElement: this.element, matchingSelector: e, withCallback: this.didClickAttachment }), b("click", { onElement: this.element, matchingSelector: "a".concat(e), preventDefault: true }); 14564 } 14565 didFocus(t5) { 14566 var e4; 14567 const i4 = () => { 14568 var t6, e5; 14569 if (!this.focused) 14570 return this.focused = true, null === (t6 = this.delegate) || void 0 === t6 || null === (e5 = t6.compositionControllerDidFocus) || void 0 === e5 ? void 0 : e5.call(t6); 14571 }; 14572 return (null === (e4 = this.blurPromise) || void 0 === e4 ? void 0 : e4.then(i4)) || i4(); 14573 } 14574 didBlur(t5) { 14575 this.blurPromise = new Promise((t6) => Rt(() => { 14576 var e4, i4; 14577 x(this.element) || (this.focused = null, null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionControllerDidBlur) || void 0 === i4 || i4.call(e4)); 14578 return this.blurPromise = null, t6(); 14579 })); 14580 } 14581 didClickAttachment(t5, e4) { 14582 var i4, n3; 14583 const r4 = this.findAttachmentForElement(e4), o3 = !!y(t5.target, { matchingSelector: "figcaption" }); 14584 return null === (i4 = this.delegate) || void 0 === i4 || null === (n3 = i4.compositionControllerDidSelectAttachment) || void 0 === n3 ? void 0 : n3.call(i4, r4, { editCaption: o3 }); 14585 } 14586 getSerializableElement() { 14587 return this.isEditingAttachment() ? this.documentView.shadowElement : this.element; 14588 } 14589 render() { 14590 var t5, e4, i4, n3, r4, o3; 14591 (this.revision !== this.composition.revision && (this.documentView.setDocument(this.composition.document), this.documentView.render(), this.revision = this.composition.revision), this.canSyncDocumentView() && !this.documentView.isSynced()) && (null === (i4 = this.delegate) || void 0 === i4 || null === (n3 = i4.compositionControllerWillSyncDocumentView) || void 0 === n3 || n3.call(i4), this.documentView.sync(), null === (r4 = this.delegate) || void 0 === r4 || null === (o3 = r4.compositionControllerDidSyncDocumentView) || void 0 === o3 || o3.call(r4)); 14592 return null === (t5 = this.delegate) || void 0 === t5 || null === (e4 = t5.compositionControllerDidRender) || void 0 === e4 ? void 0 : e4.call(t5); 14593 } 14594 rerenderViewForObject(t5) { 14595 return this.invalidateViewForObject(t5), this.render(); 14596 } 14597 invalidateViewForObject(t5) { 14598 return this.documentView.invalidateViewForObject(t5); 14599 } 14600 isViewCachingEnabled() { 14601 return this.documentView.isViewCachingEnabled(); 14602 } 14603 enableViewCaching() { 14604 return this.documentView.enableViewCaching(); 14605 } 14606 disableViewCaching() { 14607 return this.documentView.disableViewCaching(); 14608 } 14609 refreshViewCache() { 14610 return this.documentView.garbageCollectCachedViews(); 14611 } 14612 isEditingAttachment() { 14613 return !!this.attachmentEditor; 14614 } 14615 installAttachmentEditorForAttachment(t5, e4) { 14616 var i4; 14617 if ((null === (i4 = this.attachmentEditor) || void 0 === i4 ? void 0 : i4.attachment) === t5) 14618 return; 14619 const n3 = this.documentView.findElementForObject(t5); 14620 if (!n3) 14621 return; 14622 this.uninstallAttachmentEditor(); 14623 const r4 = this.composition.document.getAttachmentPieceForAttachment(t5); 14624 this.attachmentEditor = new Kn(r4, n3, this.element, e4), this.attachmentEditor.delegate = this; 14625 } 14626 uninstallAttachmentEditor() { 14627 var t5; 14628 return null === (t5 = this.attachmentEditor) || void 0 === t5 ? void 0 : t5.uninstall(); 14629 } 14630 didUninstallAttachmentEditor() { 14631 return this.attachmentEditor = null, this.render(); 14632 } 14633 attachmentEditorDidRequestUpdatingAttributesForAttachment(t5, e4) { 14634 var i4, n3; 14635 return null === (i4 = this.delegate) || void 0 === i4 || null === (n3 = i4.compositionControllerWillUpdateAttachment) || void 0 === n3 || n3.call(i4, e4), this.composition.updateAttributesForAttachment(t5, e4); 14636 } 14637 attachmentEditorDidRequestRemovingAttributeForAttachment(t5, e4) { 14638 var i4, n3; 14639 return null === (i4 = this.delegate) || void 0 === i4 || null === (n3 = i4.compositionControllerWillUpdateAttachment) || void 0 === n3 || n3.call(i4, e4), this.composition.removeAttributeForAttachment(t5, e4); 14640 } 14641 attachmentEditorDidRequestRemovalOfAttachment(t5) { 14642 var e4, i4; 14643 return null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionControllerDidRequestRemovalOfAttachment) || void 0 === i4 ? void 0 : i4.call(e4, t5); 14644 } 14645 attachmentEditorDidRequestDeselectingAttachment(t5) { 14646 var e4, i4; 14647 return null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.compositionControllerDidRequestDeselectingAttachment) || void 0 === i4 ? void 0 : i4.call(e4, t5); 14648 } 14649 canSyncDocumentView() { 14650 return !this.isEditingAttachment(); 14651 } 14652 findAttachmentForElement(t5) { 14653 return this.composition.document.getAttachmentById(parseInt(t5.dataset.trixId, 10)); 14654 } 14655 }; 14656 var Yn = class extends q { 14657 }; 14658 var $n = "data-trix-mutable"; 14659 var Xn = "[".concat($n, "]"); 14660 var Zn = { attributes: true, childList: true, characterData: true, characterDataOldValue: true, subtree: true }; 14661 var Qn = class extends q { 14662 constructor(t5) { 14663 super(t5), this.didMutate = this.didMutate.bind(this), this.element = t5, this.observer = new window.MutationObserver(this.didMutate), this.start(); 14664 } 14665 start() { 14666 return this.reset(), this.observer.observe(this.element, Zn); 14667 } 14668 stop() { 14669 return this.observer.disconnect(); 14670 } 14671 didMutate(t5) { 14672 var e4, i4; 14673 if (this.mutations.push(...Array.from(this.findSignificantMutations(t5) || [])), this.mutations.length) 14674 return null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.elementDidMutate) || void 0 === i4 || i4.call(e4, this.getMutationSummary()), this.reset(); 14675 } 14676 reset() { 14677 this.mutations = []; 14678 } 14679 findSignificantMutations(t5) { 14680 return t5.filter((t6) => this.mutationIsSignificant(t6)); 14681 } 14682 mutationIsSignificant(t5) { 14683 if (this.nodeIsMutable(t5.target)) 14684 return false; 14685 for (const e4 of Array.from(this.nodesModifiedByMutation(t5))) 14686 if (this.nodeIsSignificant(e4)) 14687 return true; 14688 return false; 14689 } 14690 nodeIsSignificant(t5) { 14691 return t5 !== this.element && !this.nodeIsMutable(t5) && !M(t5); 14692 } 14693 nodeIsMutable(t5) { 14694 return y(t5, { matchingSelector: Xn }); 14695 } 14696 nodesModifiedByMutation(t5) { 14697 const e4 = []; 14698 switch (t5.type) { 14699 case "attributes": 14700 t5.attributeName !== $n && e4.push(t5.target); 14701 break; 14702 case "characterData": 14703 e4.push(t5.target.parentNode), e4.push(t5.target); 14704 break; 14705 case "childList": 14706 e4.push(...Array.from(t5.addedNodes || [])), e4.push(...Array.from(t5.removedNodes || [])); 14707 } 14708 return e4; 14709 } 14710 getMutationSummary() { 14711 return this.getTextMutationSummary(); 14712 } 14713 getTextMutationSummary() { 14714 const { additions: t5, deletions: e4 } = this.getTextChangesFromCharacterData(), i4 = this.getTextChangesFromChildList(); 14715 Array.from(i4.additions).forEach((e5) => { 14716 Array.from(t5).includes(e5) || t5.push(e5); 14717 }), e4.push(...Array.from(i4.deletions || [])); 14718 const n3 = {}, r4 = t5.join(""); 14719 r4 && (n3.textAdded = r4); 14720 const o3 = e4.join(""); 14721 return o3 && (n3.textDeleted = o3), n3; 14722 } 14723 getMutationsByType(t5) { 14724 return Array.from(this.mutations).filter((e4) => e4.type === t5); 14725 } 14726 getTextChangesFromChildList() { 14727 let t5, e4; 14728 const i4 = [], n3 = []; 14729 Array.from(this.getMutationsByType("childList")).forEach((t6) => { 14730 i4.push(...Array.from(t6.addedNodes || [])), n3.push(...Array.from(t6.removedNodes || [])); 14731 }); 14732 0 === i4.length && 1 === n3.length && I(n3[0]) ? (t5 = [], e4 = ["\n"]) : (t5 = tr(i4), e4 = tr(n3)); 14733 const r4 = t5.filter((t6, i5) => t6 !== e4[i5]).map(Wt), o3 = e4.filter((e5, i5) => e5 !== t5[i5]).map(Wt); 14734 return { additions: r4, deletions: o3 }; 14735 } 14736 getTextChangesFromCharacterData() { 14737 let t5, e4; 14738 const i4 = this.getMutationsByType("characterData"); 14739 if (i4.length) { 14740 const n3 = i4[0], r4 = i4[i4.length - 1], o3 = function(t6, e5) { 14741 let i5, n4; 14742 return t6 = X.box(t6), (e5 = X.box(e5)).length < t6.length ? [n4, i5] = zt(t6, e5) : [i5, n4] = zt(e5, t6), { added: i5, removed: n4 }; 14743 }(Wt(n3.oldValue), Wt(r4.target.data)); 14744 t5 = o3.added, e4 = o3.removed; 14745 } 14746 return { additions: t5 ? [t5] : [], deletions: e4 ? [e4] : [] }; 14747 } 14748 }; 14749 var tr = function() { 14750 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; 14751 const e4 = []; 14752 for (const i4 of Array.from(t5)) 14753 switch (i4.nodeType) { 14754 case Node.TEXT_NODE: 14755 e4.push(i4.data); 14756 break; 14757 case Node.ELEMENT_NODE: 14758 "br" === k(i4) ? e4.push("\n") : e4.push(...Array.from(tr(i4.childNodes) || [])); 14759 } 14760 return e4; 14761 }; 14762 var er = class extends ee { 14763 constructor(t5) { 14764 super(...arguments), this.file = t5; 14765 } 14766 perform(t5) { 14767 const e4 = new FileReader(); 14768 return e4.onerror = () => t5(false), e4.onload = () => { 14769 e4.onerror = null; 14770 try { 14771 e4.abort(); 14772 } catch (t6) { 14773 } 14774 return t5(true, this.file); 14775 }, e4.readAsArrayBuffer(this.file); 14776 } 14777 }; 14778 var ir = class { 14779 constructor(t5) { 14780 this.element = t5; 14781 } 14782 shouldIgnore(t5) { 14783 return !!a.samsungAndroid && (this.previousEvent = this.event, this.event = t5, this.checkSamsungKeyboardBuggyModeStart(), this.checkSamsungKeyboardBuggyModeEnd(), this.buggyMode); 14784 } 14785 checkSamsungKeyboardBuggyModeStart() { 14786 this.insertingLongTextAfterUnidentifiedChar() && nr(this.element.innerText, this.event.data) && (this.buggyMode = true, this.event.preventDefault()); 14787 } 14788 checkSamsungKeyboardBuggyModeEnd() { 14789 this.buggyMode && "insertText" !== this.event.inputType && (this.buggyMode = false); 14790 } 14791 insertingLongTextAfterUnidentifiedChar() { 14792 var t5; 14793 return this.isBeforeInputInsertText() && this.previousEventWasUnidentifiedKeydown() && (null === (t5 = this.event.data) || void 0 === t5 ? void 0 : t5.length) > 50; 14794 } 14795 isBeforeInputInsertText() { 14796 return "beforeinput" === this.event.type && "insertText" === this.event.inputType; 14797 } 14798 previousEventWasUnidentifiedKeydown() { 14799 var t5, e4; 14800 return "keydown" === (null === (t5 = this.previousEvent) || void 0 === t5 ? void 0 : t5.type) && "Unidentified" === (null === (e4 = this.previousEvent) || void 0 === e4 ? void 0 : e4.key); 14801 } 14802 }; 14803 var nr = (t5, e4) => or(t5) === or(e4); 14804 var rr = new RegExp("(".concat("\uFFFC", "|").concat(d, "|").concat(g, "|\\s)+"), "g"); 14805 var or = (t5) => t5.replace(rr, " ").trim(); 14806 var sr = class extends q { 14807 constructor(t5) { 14808 super(...arguments), this.element = t5, this.mutationObserver = new Qn(this.element), this.mutationObserver.delegate = this, this.flakyKeyboardDetector = new ir(this.element); 14809 for (const t6 in this.constructor.events) 14810 b(t6, { onElement: this.element, withCallback: this.handlerFor(t6) }); 14811 } 14812 elementDidMutate(t5) { 14813 } 14814 editorWillSyncDocumentView() { 14815 return this.mutationObserver.stop(); 14816 } 14817 editorDidSyncDocumentView() { 14818 return this.mutationObserver.start(); 14819 } 14820 requestRender() { 14821 var t5, e4; 14822 return null === (t5 = this.delegate) || void 0 === t5 || null === (e4 = t5.inputControllerDidRequestRender) || void 0 === e4 ? void 0 : e4.call(t5); 14823 } 14824 requestReparse() { 14825 var t5, e4; 14826 return null === (t5 = this.delegate) || void 0 === t5 || null === (e4 = t5.inputControllerDidRequestReparse) || void 0 === e4 || e4.call(t5), this.requestRender(); 14827 } 14828 attachFiles(t5) { 14829 const e4 = Array.from(t5).map((t6) => new er(t6)); 14830 return Promise.all(e4).then((t6) => { 14831 this.handleInput(function() { 14832 var e5, i4; 14833 return null === (e5 = this.delegate) || void 0 === e5 || e5.inputControllerWillAttachFiles(), null === (i4 = this.responder) || void 0 === i4 || i4.insertFiles(t6), this.requestRender(); 14834 }); 14835 }); 14836 } 14837 handlerFor(t5) { 14838 return (e4) => { 14839 e4.defaultPrevented || this.handleInput(() => { 14840 if (!x(this.element)) { 14841 if (this.flakyKeyboardDetector.shouldIgnore(e4)) 14842 return; 14843 this.eventName = t5, this.constructor.events[t5].call(this, e4); 14844 } 14845 }); 14846 }; 14847 } 14848 handleInput(t5) { 14849 try { 14850 var e4; 14851 null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillHandleInput(), t5.call(this); 14852 } finally { 14853 var i4; 14854 null === (i4 = this.delegate) || void 0 === i4 || i4.inputControllerDidHandleInput(); 14855 } 14856 } 14857 createLinkHTML(t5, e4) { 14858 const i4 = document.createElement("a"); 14859 return i4.href = t5, i4.textContent = e4 || t5, i4.outerHTML; 14860 } 14861 }; 14862 var ar; 14863 wi(sr, "events", {}); 14864 var { browser: lr, keyNames: cr } = z; 14865 var ur = 0; 14866 var hr = class extends sr { 14867 constructor() { 14868 super(...arguments), this.resetInputSummary(); 14869 } 14870 setInputSummary() { 14871 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; 14872 this.inputSummary.eventName = this.eventName; 14873 for (const e4 in t5) { 14874 const i4 = t5[e4]; 14875 this.inputSummary[e4] = i4; 14876 } 14877 return this.inputSummary; 14878 } 14879 resetInputSummary() { 14880 this.inputSummary = {}; 14881 } 14882 reset() { 14883 return this.resetInputSummary(), Ft.reset(); 14884 } 14885 elementDidMutate(t5) { 14886 var e4, i4; 14887 return this.isComposing() ? null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.inputControllerDidAllowUnhandledInput) || void 0 === i4 ? void 0 : i4.call(e4) : this.handleInput(function() { 14888 return this.mutationIsSignificant(t5) && (this.mutationIsExpected(t5) ? this.requestRender() : this.requestReparse()), this.reset(); 14889 }); 14890 } 14891 mutationIsExpected(t5) { 14892 let { textAdded: e4, textDeleted: i4 } = t5; 14893 if (this.inputSummary.preferDocument) 14894 return true; 14895 const n3 = null != e4 ? e4 === this.inputSummary.textAdded : !this.inputSummary.textAdded, r4 = null != i4 ? this.inputSummary.didDelete : !this.inputSummary.didDelete, o3 = ["\n", " \n"].includes(e4) && !n3, s4 = "\n" === i4 && !r4; 14896 if (o3 && !s4 || s4 && !o3) { 14897 const t6 = this.getSelectedRange(); 14898 if (t6) { 14899 var a4; 14900 const i5 = o3 ? e4.replace(/\n$/, "").length || -1 : (null == e4 ? void 0 : e4.length) || 1; 14901 if (null !== (a4 = this.responder) && void 0 !== a4 && a4.positionIsBlockBreak(t6[1] + i5)) 14902 return true; 14903 } 14904 } 14905 return n3 && r4; 14906 } 14907 mutationIsSignificant(t5) { 14908 var e4; 14909 const i4 = Object.keys(t5).length > 0, n3 = "" === (null === (e4 = this.compositionInput) || void 0 === e4 ? void 0 : e4.getEndData()); 14910 return i4 || !n3; 14911 } 14912 getCompositionInput() { 14913 if (this.isComposing()) 14914 return this.compositionInput; 14915 this.compositionInput = new fr(this); 14916 } 14917 isComposing() { 14918 return this.compositionInput && !this.compositionInput.isEnded(); 14919 } 14920 deleteInDirection(t5, e4) { 14921 var i4; 14922 return false !== (null === (i4 = this.responder) || void 0 === i4 ? void 0 : i4.deleteInDirection(t5)) ? this.setInputSummary({ didDelete: true }) : e4 ? (e4.preventDefault(), this.requestRender()) : void 0; 14923 } 14924 serializeSelectionToDataTransfer(t5) { 14925 var e4; 14926 if (!function(t6) { 14927 if (null == t6 || !t6.setData) 14928 return false; 14929 for (const e5 in Ct) { 14930 const i5 = Ct[e5]; 14931 try { 14932 if (t6.setData(e5, i5), !t6.getData(e5) === i5) 14933 return false; 14934 } catch (t7) { 14935 return false; 14936 } 14937 } 14938 return true; 14939 }(t5)) 14940 return; 14941 const i4 = null === (e4 = this.responder) || void 0 === e4 ? void 0 : e4.getSelectedDocument().toSerializableDocument(); 14942 return t5.setData("application/x-trix-document", JSON.stringify(i4)), t5.setData("text/html", Ci.render(i4).innerHTML), t5.setData("text/plain", i4.toString().replace(/\n$/, "")), true; 14943 } 14944 canAcceptDataTransfer(t5) { 14945 const e4 = {}; 14946 return Array.from((null == t5 ? void 0 : t5.types) || []).forEach((t6) => { 14947 e4[t6] = true; 14948 }), e4.Files || e4["application/x-trix-document"] || e4["text/html"] || e4["text/plain"]; 14949 } 14950 getPastedHTMLUsingHiddenElement(t5) { 14951 const e4 = this.getSelectedRange(), i4 = { position: "absolute", left: "".concat(window.pageXOffset, "px"), top: "".concat(window.pageYOffset, "px"), opacity: 0 }, n3 = T({ style: i4, tagName: "div", editable: true }); 14952 return document.body.appendChild(n3), n3.focus(), requestAnimationFrame(() => { 14953 const i5 = n3.innerHTML; 14954 return S(n3), this.setSelectedRange(e4), t5(i5); 14955 }); 14956 } 14957 }; 14958 wi(hr, "events", { keydown(t5) { 14959 this.isComposing() || this.resetInputSummary(), this.inputSummary.didInput = true; 14960 const e4 = cr[t5.keyCode]; 14961 if (e4) { 14962 var i4; 14963 let n4 = this.keys; 14964 ["ctrl", "alt", "shift", "meta"].forEach((e5) => { 14965 var i5; 14966 t5["".concat(e5, "Key")] && ("ctrl" === e5 && (e5 = "control"), n4 = null === (i5 = n4) || void 0 === i5 ? void 0 : i5[e5]); 14967 }), null != (null === (i4 = n4) || void 0 === i4 ? void 0 : i4[e4]) && (this.setInputSummary({ keyName: e4 }), Ft.reset(), n4[e4].call(this, t5)); 14968 } 14969 if (St(t5)) { 14970 const e5 = String.fromCharCode(t5.keyCode).toLowerCase(); 14971 if (e5) { 14972 var n3; 14973 const i5 = ["alt", "shift"].map((e6) => { 14974 if (t5["".concat(e6, "Key")]) 14975 return e6; 14976 }).filter((t6) => t6); 14977 i5.push(e5), null !== (n3 = this.delegate) && void 0 !== n3 && n3.inputControllerDidReceiveKeyboardCommand(i5) && t5.preventDefault(); 14978 } 14979 } 14980 }, keypress(t5) { 14981 if (null != this.inputSummary.eventName) 14982 return; 14983 if (t5.metaKey) 14984 return; 14985 if (t5.ctrlKey && !t5.altKey) 14986 return; 14987 const e4 = mr(t5); 14988 var i4, n3; 14989 return e4 ? (null === (i4 = this.delegate) || void 0 === i4 || i4.inputControllerWillPerformTyping(), null === (n3 = this.responder) || void 0 === n3 || n3.insertString(e4), this.setInputSummary({ textAdded: e4, didDelete: this.selectionIsExpanded() })) : void 0; 14990 }, textInput(t5) { 14991 const { data: e4 } = t5, { textAdded: i4 } = this.inputSummary; 14992 if (i4 && i4 !== e4 && i4.toUpperCase() === e4) { 14993 var n3; 14994 const t6 = this.getSelectedRange(); 14995 return this.setSelectedRange([t6[0], t6[1] + i4.length]), null === (n3 = this.responder) || void 0 === n3 || n3.insertString(e4), this.setInputSummary({ textAdded: e4 }), this.setSelectedRange(t6); 14996 } 14997 }, dragenter(t5) { 14998 t5.preventDefault(); 14999 }, dragstart(t5) { 15000 var e4, i4; 15001 return this.serializeSelectionToDataTransfer(t5.dataTransfer), this.draggedRange = this.getSelectedRange(), null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.inputControllerDidStartDrag) || void 0 === i4 ? void 0 : i4.call(e4); 15002 }, dragover(t5) { 15003 if (this.draggedRange || this.canAcceptDataTransfer(t5.dataTransfer)) { 15004 t5.preventDefault(); 15005 const n3 = { x: t5.clientX, y: t5.clientY }; 15006 var e4, i4; 15007 if (!Tt(n3, this.draggingPoint)) 15008 return this.draggingPoint = n3, null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.inputControllerDidReceiveDragOverPoint) || void 0 === i4 ? void 0 : i4.call(e4, this.draggingPoint); 15009 } 15010 }, dragend(t5) { 15011 var e4, i4; 15012 null === (e4 = this.delegate) || void 0 === e4 || null === (i4 = e4.inputControllerDidCancelDrag) || void 0 === i4 || i4.call(e4), this.draggedRange = null, this.draggingPoint = null; 15013 }, drop(t5) { 15014 var e4, i4; 15015 t5.preventDefault(); 15016 const n3 = null === (e4 = t5.dataTransfer) || void 0 === e4 ? void 0 : e4.files, r4 = t5.dataTransfer.getData("application/x-trix-document"), o3 = { x: t5.clientX, y: t5.clientY }; 15017 if (null === (i4 = this.responder) || void 0 === i4 || i4.setLocationRangeFromPointRange(o3), null != n3 && n3.length) 15018 this.attachFiles(n3); 15019 else if (this.draggedRange) { 15020 var s4, a4; 15021 null === (s4 = this.delegate) || void 0 === s4 || s4.inputControllerWillMoveText(), null === (a4 = this.responder) || void 0 === a4 || a4.moveTextFromRange(this.draggedRange), this.draggedRange = null, this.requestRender(); 15022 } else if (r4) { 15023 var l4; 15024 const t6 = on.fromJSONString(r4); 15025 null === (l4 = this.responder) || void 0 === l4 || l4.insertDocument(t6), this.requestRender(); 15026 } 15027 this.draggedRange = null, this.draggingPoint = null; 15028 }, cut(t5) { 15029 var e4, i4; 15030 if (null !== (e4 = this.responder) && void 0 !== e4 && e4.selectionIsExpanded() && (this.serializeSelectionToDataTransfer(t5.clipboardData) && t5.preventDefault(), null === (i4 = this.delegate) || void 0 === i4 || i4.inputControllerWillCutText(), this.deleteInDirection("backward"), t5.defaultPrevented)) 15031 return this.requestRender(); 15032 }, copy(t5) { 15033 var e4; 15034 null !== (e4 = this.responder) && void 0 !== e4 && e4.selectionIsExpanded() && this.serializeSelectionToDataTransfer(t5.clipboardData) && t5.preventDefault(); 15035 }, paste(t5) { 15036 const e4 = t5.clipboardData || t5.testClipboardData, i4 = { clipboard: e4 }; 15037 if (!e4 || pr(t5)) 15038 return void this.getPastedHTMLUsingHiddenElement((t6) => { 15039 var e5, n4, r5; 15040 return i4.type = "text/html", i4.html = t6, null === (e5 = this.delegate) || void 0 === e5 || e5.inputControllerWillPaste(i4), null === (n4 = this.responder) || void 0 === n4 || n4.insertHTML(i4.html), this.requestRender(), null === (r5 = this.delegate) || void 0 === r5 ? void 0 : r5.inputControllerDidPaste(i4); 15041 }); 15042 const n3 = e4.getData("URL"), r4 = e4.getData("text/html"), o3 = e4.getData("public.url-name"); 15043 if (n3) { 15044 var s4, a4, l4; 15045 let t6; 15046 i4.type = "text/html", t6 = o3 ? Vt(o3).trim() : n3, i4.html = this.createLinkHTML(n3, t6), null === (s4 = this.delegate) || void 0 === s4 || s4.inputControllerWillPaste(i4), this.setInputSummary({ textAdded: t6, didDelete: this.selectionIsExpanded() }), null === (a4 = this.responder) || void 0 === a4 || a4.insertHTML(i4.html), this.requestRender(), null === (l4 = this.delegate) || void 0 === l4 || l4.inputControllerDidPaste(i4); 15047 } else if (Et(e4)) { 15048 var c4, u4, h4; 15049 i4.type = "text/plain", i4.string = e4.getData("text/plain"), null === (c4 = this.delegate) || void 0 === c4 || c4.inputControllerWillPaste(i4), this.setInputSummary({ textAdded: i4.string, didDelete: this.selectionIsExpanded() }), null === (u4 = this.responder) || void 0 === u4 || u4.insertString(i4.string), this.requestRender(), null === (h4 = this.delegate) || void 0 === h4 || h4.inputControllerDidPaste(i4); 15050 } else if (r4) { 15051 var d3, g5, m5; 15052 i4.type = "text/html", i4.html = r4, null === (d3 = this.delegate) || void 0 === d3 || d3.inputControllerWillPaste(i4), null === (g5 = this.responder) || void 0 === g5 || g5.insertHTML(i4.html), this.requestRender(), null === (m5 = this.delegate) || void 0 === m5 || m5.inputControllerDidPaste(i4); 15053 } else if (Array.from(e4.types).includes("Files")) { 15054 var p4, f4; 15055 const t6 = null === (p4 = e4.items) || void 0 === p4 || null === (p4 = p4[0]) || void 0 === p4 || null === (f4 = p4.getAsFile) || void 0 === f4 ? void 0 : f4.call(p4); 15056 if (t6) { 15057 var b4, v4, A4; 15058 const e5 = dr(t6); 15059 !t6.name && e5 && (t6.name = "pasted-file-".concat(++ur, ".").concat(e5)), i4.type = "File", i4.file = t6, null === (b4 = this.delegate) || void 0 === b4 || b4.inputControllerWillAttachFiles(), null === (v4 = this.responder) || void 0 === v4 || v4.insertFile(i4.file), this.requestRender(), null === (A4 = this.delegate) || void 0 === A4 || A4.inputControllerDidPaste(i4); 15060 } 15061 } 15062 t5.preventDefault(); 15063 }, compositionstart(t5) { 15064 return this.getCompositionInput().start(t5.data); 15065 }, compositionupdate(t5) { 15066 return this.getCompositionInput().update(t5.data); 15067 }, compositionend(t5) { 15068 return this.getCompositionInput().end(t5.data); 15069 }, beforeinput(t5) { 15070 this.inputSummary.didInput = true; 15071 }, input(t5) { 15072 return this.inputSummary.didInput = true, t5.stopPropagation(); 15073 } }), wi(hr, "keys", { backspace(t5) { 15074 var e4; 15075 return null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), this.deleteInDirection("backward", t5); 15076 }, delete(t5) { 15077 var e4; 15078 return null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), this.deleteInDirection("forward", t5); 15079 }, return(t5) { 15080 var e4, i4; 15081 return this.setInputSummary({ preferDocument: true }), null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), null === (i4 = this.responder) || void 0 === i4 ? void 0 : i4.insertLineBreak(); 15082 }, tab(t5) { 15083 var e4, i4; 15084 null !== (e4 = this.responder) && void 0 !== e4 && e4.canIncreaseNestingLevel() && (null === (i4 = this.responder) || void 0 === i4 || i4.increaseNestingLevel(), this.requestRender(), t5.preventDefault()); 15085 }, left(t5) { 15086 var e4; 15087 if (this.selectionIsInCursorTarget()) 15088 return t5.preventDefault(), null === (e4 = this.responder) || void 0 === e4 ? void 0 : e4.moveCursorInDirection("backward"); 15089 }, right(t5) { 15090 var e4; 15091 if (this.selectionIsInCursorTarget()) 15092 return t5.preventDefault(), null === (e4 = this.responder) || void 0 === e4 ? void 0 : e4.moveCursorInDirection("forward"); 15093 }, control: { d(t5) { 15094 var e4; 15095 return null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), this.deleteInDirection("forward", t5); 15096 }, h(t5) { 15097 var e4; 15098 return null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), this.deleteInDirection("backward", t5); 15099 }, o(t5) { 15100 var e4, i4; 15101 return t5.preventDefault(), null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), null === (i4 = this.responder) || void 0 === i4 || i4.insertString("\n", { updatePosition: false }), this.requestRender(); 15102 } }, shift: { return(t5) { 15103 var e4, i4; 15104 null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), null === (i4 = this.responder) || void 0 === i4 || i4.insertString("\n"), this.requestRender(), t5.preventDefault(); 15105 }, tab(t5) { 15106 var e4, i4; 15107 null !== (e4 = this.responder) && void 0 !== e4 && e4.canDecreaseNestingLevel() && (null === (i4 = this.responder) || void 0 === i4 || i4.decreaseNestingLevel(), this.requestRender(), t5.preventDefault()); 15108 }, left(t5) { 15109 if (this.selectionIsInCursorTarget()) 15110 return t5.preventDefault(), this.expandSelectionInDirection("backward"); 15111 }, right(t5) { 15112 if (this.selectionIsInCursorTarget()) 15113 return t5.preventDefault(), this.expandSelectionInDirection("forward"); 15114 } }, alt: { backspace(t5) { 15115 var e4; 15116 return this.setInputSummary({ preferDocument: false }), null === (e4 = this.delegate) || void 0 === e4 ? void 0 : e4.inputControllerWillPerformTyping(); 15117 } }, meta: { backspace(t5) { 15118 var e4; 15119 return this.setInputSummary({ preferDocument: false }), null === (e4 = this.delegate) || void 0 === e4 ? void 0 : e4.inputControllerWillPerformTyping(); 15120 } } }), hr.proxyMethod("responder?.getSelectedRange"), hr.proxyMethod("responder?.setSelectedRange"), hr.proxyMethod("responder?.expandSelectionInDirection"), hr.proxyMethod("responder?.selectionIsInCursorTarget"), hr.proxyMethod("responder?.selectionIsExpanded"); 15121 var dr = (t5) => { 15122 var e4; 15123 return null === (e4 = t5.type) || void 0 === e4 || null === (e4 = e4.match(/\/(\w+)$/)) || void 0 === e4 ? void 0 : e4[1]; 15124 }; 15125 var gr = !(null === (ar = " ".codePointAt) || void 0 === ar || !ar.call(" ", 0)); 15126 var mr = function(t5) { 15127 if (t5.key && gr && t5.key.codePointAt(0) === t5.keyCode) 15128 return t5.key; 15129 { 15130 let e4; 15131 if (null === t5.which ? e4 = t5.keyCode : 0 !== t5.which && 0 !== t5.charCode && (e4 = t5.charCode), null != e4 && "escape" !== cr[e4]) 15132 return X.fromCodepoints([e4]).toString(); 15133 } 15134 }; 15135 var pr = function(t5) { 15136 const e4 = t5.clipboardData; 15137 if (e4) { 15138 if (e4.types.includes("text/html")) { 15139 for (const t6 of e4.types) { 15140 const i4 = /^CorePasteboardFlavorType/.test(t6), n3 = /^dyn\./.test(t6) && e4.getData(t6); 15141 if (i4 || n3) 15142 return true; 15143 } 15144 return false; 15145 } 15146 { 15147 const t6 = e4.types.includes("com.apple.webarchive"), i4 = e4.types.includes("com.apple.flat-rtfd"); 15148 return t6 || i4; 15149 } 15150 } 15151 }; 15152 var fr = class extends q { 15153 constructor(t5) { 15154 super(...arguments), this.inputController = t5, this.responder = this.inputController.responder, this.delegate = this.inputController.delegate, this.inputSummary = this.inputController.inputSummary, this.data = {}; 15155 } 15156 start(t5) { 15157 if (this.data.start = t5, this.isSignificant()) { 15158 var e4, i4; 15159 if ("keypress" === this.inputSummary.eventName && this.inputSummary.textAdded) 15160 null === (i4 = this.responder) || void 0 === i4 || i4.deleteInDirection("left"); 15161 this.selectionIsExpanded() || (this.insertPlaceholder(), this.requestRender()), this.range = null === (e4 = this.responder) || void 0 === e4 ? void 0 : e4.getSelectedRange(); 15162 } 15163 } 15164 update(t5) { 15165 if (this.data.update = t5, this.isSignificant()) { 15166 const t6 = this.selectPlaceholder(); 15167 t6 && (this.forgetPlaceholder(), this.range = t6); 15168 } 15169 } 15170 end(t5) { 15171 return this.data.end = t5, this.isSignificant() ? (this.forgetPlaceholder(), this.canApplyToDocument() ? (this.setInputSummary({ preferDocument: true, didInput: false }), null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), null === (i4 = this.responder) || void 0 === i4 || i4.setSelectedRange(this.range), null === (n3 = this.responder) || void 0 === n3 || n3.insertString(this.data.end), null === (r4 = this.responder) || void 0 === r4 ? void 0 : r4.setSelectedRange(this.range[0] + this.data.end.length)) : null != this.data.start || null != this.data.update ? (this.requestReparse(), this.inputController.reset()) : void 0) : this.inputController.reset(); 15172 var e4, i4, n3, r4; 15173 } 15174 getEndData() { 15175 return this.data.end; 15176 } 15177 isEnded() { 15178 return null != this.getEndData(); 15179 } 15180 isSignificant() { 15181 return !lr.composesExistingText || this.inputSummary.didInput; 15182 } 15183 canApplyToDocument() { 15184 var t5, e4; 15185 return 0 === (null === (t5 = this.data.start) || void 0 === t5 ? void 0 : t5.length) && (null === (e4 = this.data.end) || void 0 === e4 ? void 0 : e4.length) > 0 && this.range; 15186 } 15187 }; 15188 fr.proxyMethod("inputController.setInputSummary"), fr.proxyMethod("inputController.requestRender"), fr.proxyMethod("inputController.requestReparse"), fr.proxyMethod("responder?.selectionIsExpanded"), fr.proxyMethod("responder?.insertPlaceholder"), fr.proxyMethod("responder?.selectPlaceholder"), fr.proxyMethod("responder?.forgetPlaceholder"); 15189 var br = class extends sr { 15190 constructor() { 15191 super(...arguments), this.render = this.render.bind(this); 15192 } 15193 elementDidMutate() { 15194 return this.scheduledRender ? this.composing ? null === (t5 = this.delegate) || void 0 === t5 || null === (e4 = t5.inputControllerDidAllowUnhandledInput) || void 0 === e4 ? void 0 : e4.call(t5) : void 0 : this.reparse(); 15195 var t5, e4; 15196 } 15197 scheduleRender() { 15198 return this.scheduledRender ? this.scheduledRender : this.scheduledRender = requestAnimationFrame(this.render); 15199 } 15200 render() { 15201 var t5, e4; 15202 (cancelAnimationFrame(this.scheduledRender), this.scheduledRender = null, this.composing) || (null === (e4 = this.delegate) || void 0 === e4 || e4.render()); 15203 null === (t5 = this.afterRender) || void 0 === t5 || t5.call(this), this.afterRender = null; 15204 } 15205 reparse() { 15206 var t5; 15207 return null === (t5 = this.delegate) || void 0 === t5 ? void 0 : t5.reparse(); 15208 } 15209 insertString() { 15210 var t5; 15211 let e4 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "", i4 = arguments.length > 1 ? arguments[1] : void 0; 15212 return null === (t5 = this.delegate) || void 0 === t5 || t5.inputControllerWillPerformTyping(), this.withTargetDOMRange(function() { 15213 var t6; 15214 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.insertString(e4, i4); 15215 }); 15216 } 15217 toggleAttributeIfSupported(t5) { 15218 var e4; 15219 if (gt().includes(t5)) 15220 return null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformFormatting(t5), this.withTargetDOMRange(function() { 15221 var e5; 15222 return null === (e5 = this.responder) || void 0 === e5 ? void 0 : e5.toggleCurrentAttribute(t5); 15223 }); 15224 } 15225 activateAttributeIfSupported(t5, e4) { 15226 var i4; 15227 if (gt().includes(t5)) 15228 return null === (i4 = this.delegate) || void 0 === i4 || i4.inputControllerWillPerformFormatting(t5), this.withTargetDOMRange(function() { 15229 var i5; 15230 return null === (i5 = this.responder) || void 0 === i5 ? void 0 : i5.setCurrentAttribute(t5, e4); 15231 }); 15232 } 15233 deleteInDirection(t5) { 15234 let { recordUndoEntry: e4 } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { recordUndoEntry: true }; 15235 var i4; 15236 e4 && (null === (i4 = this.delegate) || void 0 === i4 || i4.inputControllerWillPerformTyping()); 15237 const n3 = () => { 15238 var e5; 15239 return null === (e5 = this.responder) || void 0 === e5 ? void 0 : e5.deleteInDirection(t5); 15240 }, r4 = this.getTargetDOMRange({ minLength: this.composing ? 1 : 2 }); 15241 return r4 ? this.withTargetDOMRange(r4, n3) : n3(); 15242 } 15243 withTargetDOMRange(t5, e4) { 15244 var i4; 15245 return "function" == typeof t5 && (e4 = t5, t5 = this.getTargetDOMRange()), t5 ? null === (i4 = this.responder) || void 0 === i4 ? void 0 : i4.withTargetDOMRange(t5, e4.bind(this)) : (Ft.reset(), e4.call(this)); 15246 } 15247 getTargetDOMRange() { 15248 var t5, e4; 15249 let { minLength: i4 } = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : { minLength: 0 }; 15250 const n3 = null === (t5 = (e4 = this.event).getTargetRanges) || void 0 === t5 ? void 0 : t5.call(e4); 15251 if (n3 && n3.length) { 15252 const t6 = vr(n3[0]); 15253 if (0 === i4 || t6.toString().length >= i4) 15254 return t6; 15255 } 15256 } 15257 withEvent(t5, e4) { 15258 let i4; 15259 this.event = t5; 15260 try { 15261 i4 = e4.call(this); 15262 } finally { 15263 this.event = null; 15264 } 15265 return i4; 15266 } 15267 }; 15268 wi(br, "events", { keydown(t5) { 15269 if (St(t5)) { 15270 var e4; 15271 const i4 = Er(t5); 15272 null !== (e4 = this.delegate) && void 0 !== e4 && e4.inputControllerDidReceiveKeyboardCommand(i4) && t5.preventDefault(); 15273 } else { 15274 let e5 = t5.key; 15275 t5.altKey && (e5 += "+Alt"), t5.shiftKey && (e5 += "+Shift"); 15276 const i4 = this.constructor.keys[e5]; 15277 if (i4) 15278 return this.withEvent(t5, i4); 15279 } 15280 }, paste(t5) { 15281 var e4; 15282 let i4; 15283 const n3 = null === (e4 = t5.clipboardData) || void 0 === e4 ? void 0 : e4.getData("URL"); 15284 return xr(t5) ? (t5.preventDefault(), this.attachFiles(t5.clipboardData.files)) : Cr(t5) ? (t5.preventDefault(), i4 = { type: "text/plain", string: t5.clipboardData.getData("text/plain") }, null === (r4 = this.delegate) || void 0 === r4 || r4.inputControllerWillPaste(i4), null === (o3 = this.responder) || void 0 === o3 || o3.insertString(i4.string), this.render(), null === (s4 = this.delegate) || void 0 === s4 ? void 0 : s4.inputControllerDidPaste(i4)) : n3 ? (t5.preventDefault(), i4 = { type: "text/html", html: this.createLinkHTML(n3) }, null === (a4 = this.delegate) || void 0 === a4 || a4.inputControllerWillPaste(i4), null === (l4 = this.responder) || void 0 === l4 || l4.insertHTML(i4.html), this.render(), null === (c4 = this.delegate) || void 0 === c4 ? void 0 : c4.inputControllerDidPaste(i4)) : void 0; 15285 var r4, o3, s4, a4, l4, c4; 15286 }, beforeinput(t5) { 15287 const e4 = this.constructor.inputTypes[t5.inputType], i4 = (n3 = t5, !(!/iPhone|iPad/.test(navigator.userAgent) || n3.inputType && "insertParagraph" !== n3.inputType)); 15288 var n3; 15289 e4 && (this.withEvent(t5, e4), i4 || this.scheduleRender()), i4 && this.render(); 15290 }, input(t5) { 15291 Ft.reset(); 15292 }, dragstart(t5) { 15293 var e4, i4; 15294 null !== (e4 = this.responder) && void 0 !== e4 && e4.selectionContainsAttachments() && (t5.dataTransfer.setData("application/x-trix-dragging", true), this.dragging = { range: null === (i4 = this.responder) || void 0 === i4 ? void 0 : i4.getSelectedRange(), point: Sr(t5) }); 15295 }, dragenter(t5) { 15296 Ar(t5) && t5.preventDefault(); 15297 }, dragover(t5) { 15298 if (this.dragging) { 15299 t5.preventDefault(); 15300 const i4 = Sr(t5); 15301 var e4; 15302 if (!Tt(i4, this.dragging.point)) 15303 return this.dragging.point = i4, null === (e4 = this.responder) || void 0 === e4 ? void 0 : e4.setLocationRangeFromPointRange(i4); 15304 } else 15305 Ar(t5) && t5.preventDefault(); 15306 }, drop(t5) { 15307 var e4, i4; 15308 if (this.dragging) 15309 return t5.preventDefault(), null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillMoveText(), null === (i4 = this.responder) || void 0 === i4 || i4.moveTextFromRange(this.dragging.range), this.dragging = null, this.scheduleRender(); 15310 if (Ar(t5)) { 15311 var n3; 15312 t5.preventDefault(); 15313 const e5 = Sr(t5); 15314 return null === (n3 = this.responder) || void 0 === n3 || n3.setLocationRangeFromPointRange(e5), this.attachFiles(t5.dataTransfer.files); 15315 } 15316 }, dragend() { 15317 var t5; 15318 this.dragging && (null === (t5 = this.responder) || void 0 === t5 || t5.setSelectedRange(this.dragging.range), this.dragging = null); 15319 }, compositionend(t5) { 15320 this.composing && (this.composing = false, a.recentAndroid || this.scheduleRender()); 15321 } }), wi(br, "keys", { ArrowLeft() { 15322 var t5, e4; 15323 if (null !== (t5 = this.responder) && void 0 !== t5 && t5.shouldManageMovingCursorInDirection("backward")) 15324 return this.event.preventDefault(), null === (e4 = this.responder) || void 0 === e4 ? void 0 : e4.moveCursorInDirection("backward"); 15325 }, ArrowRight() { 15326 var t5, e4; 15327 if (null !== (t5 = this.responder) && void 0 !== t5 && t5.shouldManageMovingCursorInDirection("forward")) 15328 return this.event.preventDefault(), null === (e4 = this.responder) || void 0 === e4 ? void 0 : e4.moveCursorInDirection("forward"); 15329 }, Backspace() { 15330 var t5, e4, i4; 15331 if (null !== (t5 = this.responder) && void 0 !== t5 && t5.shouldManageDeletingInDirection("backward")) 15332 return this.event.preventDefault(), null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillPerformTyping(), null === (i4 = this.responder) || void 0 === i4 || i4.deleteInDirection("backward"), this.render(); 15333 }, Tab() { 15334 var t5, e4; 15335 if (null !== (t5 = this.responder) && void 0 !== t5 && t5.canIncreaseNestingLevel()) 15336 return this.event.preventDefault(), null === (e4 = this.responder) || void 0 === e4 || e4.increaseNestingLevel(), this.render(); 15337 }, "Tab+Shift"() { 15338 var t5, e4; 15339 if (null !== (t5 = this.responder) && void 0 !== t5 && t5.canDecreaseNestingLevel()) 15340 return this.event.preventDefault(), null === (e4 = this.responder) || void 0 === e4 || e4.decreaseNestingLevel(), this.render(); 15341 } }), wi(br, "inputTypes", { deleteByComposition() { 15342 return this.deleteInDirection("backward", { recordUndoEntry: false }); 15343 }, deleteByCut() { 15344 return this.deleteInDirection("backward"); 15345 }, deleteByDrag() { 15346 return this.event.preventDefault(), this.withTargetDOMRange(function() { 15347 var t5; 15348 this.deleteByDragRange = null === (t5 = this.responder) || void 0 === t5 ? void 0 : t5.getSelectedRange(); 15349 }); 15350 }, deleteCompositionText() { 15351 return this.deleteInDirection("backward", { recordUndoEntry: false }); 15352 }, deleteContent() { 15353 return this.deleteInDirection("backward"); 15354 }, deleteContentBackward() { 15355 return this.deleteInDirection("backward"); 15356 }, deleteContentForward() { 15357 return this.deleteInDirection("forward"); 15358 }, deleteEntireSoftLine() { 15359 return this.deleteInDirection("forward"); 15360 }, deleteHardLineBackward() { 15361 return this.deleteInDirection("backward"); 15362 }, deleteHardLineForward() { 15363 return this.deleteInDirection("forward"); 15364 }, deleteSoftLineBackward() { 15365 return this.deleteInDirection("backward"); 15366 }, deleteSoftLineForward() { 15367 return this.deleteInDirection("forward"); 15368 }, deleteWordBackward() { 15369 return this.deleteInDirection("backward"); 15370 }, deleteWordForward() { 15371 return this.deleteInDirection("forward"); 15372 }, formatBackColor() { 15373 return this.activateAttributeIfSupported("backgroundColor", this.event.data); 15374 }, formatBold() { 15375 return this.toggleAttributeIfSupported("bold"); 15376 }, formatFontColor() { 15377 return this.activateAttributeIfSupported("color", this.event.data); 15378 }, formatFontName() { 15379 return this.activateAttributeIfSupported("font", this.event.data); 15380 }, formatIndent() { 15381 var t5; 15382 if (null !== (t5 = this.responder) && void 0 !== t5 && t5.canIncreaseNestingLevel()) 15383 return this.withTargetDOMRange(function() { 15384 var t6; 15385 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.increaseNestingLevel(); 15386 }); 15387 }, formatItalic() { 15388 return this.toggleAttributeIfSupported("italic"); 15389 }, formatJustifyCenter() { 15390 return this.toggleAttributeIfSupported("justifyCenter"); 15391 }, formatJustifyFull() { 15392 return this.toggleAttributeIfSupported("justifyFull"); 15393 }, formatJustifyLeft() { 15394 return this.toggleAttributeIfSupported("justifyLeft"); 15395 }, formatJustifyRight() { 15396 return this.toggleAttributeIfSupported("justifyRight"); 15397 }, formatOutdent() { 15398 var t5; 15399 if (null !== (t5 = this.responder) && void 0 !== t5 && t5.canDecreaseNestingLevel()) 15400 return this.withTargetDOMRange(function() { 15401 var t6; 15402 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.decreaseNestingLevel(); 15403 }); 15404 }, formatRemove() { 15405 this.withTargetDOMRange(function() { 15406 for (const i4 in null === (t5 = this.responder) || void 0 === t5 ? void 0 : t5.getCurrentAttributes()) { 15407 var t5, e4; 15408 null === (e4 = this.responder) || void 0 === e4 || e4.removeCurrentAttribute(i4); 15409 } 15410 }); 15411 }, formatSetBlockTextDirection() { 15412 return this.activateAttributeIfSupported("blockDir", this.event.data); 15413 }, formatSetInlineTextDirection() { 15414 return this.activateAttributeIfSupported("textDir", this.event.data); 15415 }, formatStrikeThrough() { 15416 return this.toggleAttributeIfSupported("strike"); 15417 }, formatSubscript() { 15418 return this.toggleAttributeIfSupported("sub"); 15419 }, formatSuperscript() { 15420 return this.toggleAttributeIfSupported("sup"); 15421 }, formatUnderline() { 15422 return this.toggleAttributeIfSupported("underline"); 15423 }, historyRedo() { 15424 var t5; 15425 return null === (t5 = this.delegate) || void 0 === t5 ? void 0 : t5.inputControllerWillPerformRedo(); 15426 }, historyUndo() { 15427 var t5; 15428 return null === (t5 = this.delegate) || void 0 === t5 ? void 0 : t5.inputControllerWillPerformUndo(); 15429 }, insertCompositionText() { 15430 return this.composing = true, this.insertString(this.event.data); 15431 }, insertFromComposition() { 15432 return this.composing = false, this.insertString(this.event.data); 15433 }, insertFromDrop() { 15434 const t5 = this.deleteByDragRange; 15435 var e4; 15436 if (t5) 15437 return this.deleteByDragRange = null, null === (e4 = this.delegate) || void 0 === e4 || e4.inputControllerWillMoveText(), this.withTargetDOMRange(function() { 15438 var e5; 15439 return null === (e5 = this.responder) || void 0 === e5 ? void 0 : e5.moveTextFromRange(t5); 15440 }); 15441 }, insertFromPaste() { 15442 const { dataTransfer: t5 } = this.event, e4 = { dataTransfer: t5 }, i4 = t5.getData("URL"), n3 = t5.getData("text/html"); 15443 if (i4) { 15444 var r4; 15445 let n4; 15446 this.event.preventDefault(), e4.type = "text/html"; 15447 const o4 = t5.getData("public.url-name"); 15448 n4 = o4 ? Vt(o4).trim() : i4, e4.html = this.createLinkHTML(i4, n4), null === (r4 = this.delegate) || void 0 === r4 || r4.inputControllerWillPaste(e4), this.withTargetDOMRange(function() { 15449 var t6; 15450 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.insertHTML(e4.html); 15451 }), this.afterRender = () => { 15452 var t6; 15453 return null === (t6 = this.delegate) || void 0 === t6 ? void 0 : t6.inputControllerDidPaste(e4); 15454 }; 15455 } else if (Et(t5)) { 15456 var o3; 15457 e4.type = "text/plain", e4.string = t5.getData("text/plain"), null === (o3 = this.delegate) || void 0 === o3 || o3.inputControllerWillPaste(e4), this.withTargetDOMRange(function() { 15458 var t6; 15459 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.insertString(e4.string); 15460 }), this.afterRender = () => { 15461 var t6; 15462 return null === (t6 = this.delegate) || void 0 === t6 ? void 0 : t6.inputControllerDidPaste(e4); 15463 }; 15464 } else if (yr(this.event)) { 15465 var s4; 15466 e4.type = "File", e4.file = t5.files[0], null === (s4 = this.delegate) || void 0 === s4 || s4.inputControllerWillPaste(e4), this.withTargetDOMRange(function() { 15467 var t6; 15468 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.insertFile(e4.file); 15469 }), this.afterRender = () => { 15470 var t6; 15471 return null === (t6 = this.delegate) || void 0 === t6 ? void 0 : t6.inputControllerDidPaste(e4); 15472 }; 15473 } else if (n3) { 15474 var a4; 15475 this.event.preventDefault(), e4.type = "text/html", e4.html = n3, null === (a4 = this.delegate) || void 0 === a4 || a4.inputControllerWillPaste(e4), this.withTargetDOMRange(function() { 15476 var t6; 15477 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.insertHTML(e4.html); 15478 }), this.afterRender = () => { 15479 var t6; 15480 return null === (t6 = this.delegate) || void 0 === t6 ? void 0 : t6.inputControllerDidPaste(e4); 15481 }; 15482 } 15483 }, insertFromYank() { 15484 return this.insertString(this.event.data); 15485 }, insertLineBreak() { 15486 return this.insertString("\n"); 15487 }, insertLink() { 15488 return this.activateAttributeIfSupported("href", this.event.data); 15489 }, insertOrderedList() { 15490 return this.toggleAttributeIfSupported("number"); 15491 }, insertParagraph() { 15492 var t5; 15493 return null === (t5 = this.delegate) || void 0 === t5 || t5.inputControllerWillPerformTyping(), this.withTargetDOMRange(function() { 15494 var t6; 15495 return null === (t6 = this.responder) || void 0 === t6 ? void 0 : t6.insertLineBreak(); 15496 }); 15497 }, insertReplacementText() { 15498 const t5 = this.event.dataTransfer.getData("text/plain"), e4 = this.event.getTargetRanges()[0]; 15499 this.withTargetDOMRange(e4, () => { 15500 this.insertString(t5, { updatePosition: false }); 15501 }); 15502 }, insertText() { 15503 var t5; 15504 return this.insertString(this.event.data || (null === (t5 = this.event.dataTransfer) || void 0 === t5 ? void 0 : t5.getData("text/plain"))); 15505 }, insertTranspose() { 15506 return this.insertString(this.event.data); 15507 }, insertUnorderedList() { 15508 return this.toggleAttributeIfSupported("bullet"); 15509 } }); 15510 var vr = function(t5) { 15511 const e4 = document.createRange(); 15512 return e4.setStart(t5.startContainer, t5.startOffset), e4.setEnd(t5.endContainer, t5.endOffset), e4; 15513 }; 15514 var Ar = (t5) => { 15515 var e4; 15516 return Array.from((null === (e4 = t5.dataTransfer) || void 0 === e4 ? void 0 : e4.types) || []).includes("Files"); 15517 }; 15518 var yr = (t5) => { 15519 var e4; 15520 return (null === (e4 = t5.dataTransfer.files) || void 0 === e4 ? void 0 : e4[0]) && !xr(t5) && !((t6) => { 15521 let { dataTransfer: e5 } = t6; 15522 return e5.types.includes("Files") && e5.types.includes("text/html") && e5.getData("text/html").includes("urn:schemas-microsoft-com:office:office"); 15523 })(t5); 15524 }; 15525 var xr = function(t5) { 15526 const e4 = t5.clipboardData; 15527 if (e4) { 15528 return Array.from(e4.types).filter((t6) => t6.match(/file/i)).length === e4.types.length && e4.files.length >= 1; 15529 } 15530 }; 15531 var Cr = function(t5) { 15532 const e4 = t5.clipboardData; 15533 if (e4) 15534 return e4.types.includes("text/plain") && 1 === e4.types.length; 15535 }; 15536 var Er = function(t5) { 15537 const e4 = []; 15538 return t5.altKey && e4.push("alt"), t5.shiftKey && e4.push("shift"), e4.push(t5.key), e4; 15539 }; 15540 var Sr = (t5) => ({ x: t5.clientX, y: t5.clientY }); 15541 var Rr = "[data-trix-attribute]"; 15542 var kr = "[data-trix-action]"; 15543 var Tr = "".concat(Rr, ", ").concat(kr); 15544 var wr = "[data-trix-dialog]"; 15545 var Lr = "".concat(wr, "[data-trix-active]"); 15546 var Dr = "".concat(wr, " [data-trix-method]"); 15547 var Nr = "".concat(wr, " [data-trix-input]"); 15548 var Ir = (t5, e4) => (e4 || (e4 = Fr(t5)), t5.querySelector("[data-trix-input][name='".concat(e4, "']"))); 15549 var Or = (t5) => t5.getAttribute("data-trix-action"); 15550 var Fr = (t5) => t5.getAttribute("data-trix-attribute") || t5.getAttribute("data-trix-dialog-attribute"); 15551 var Pr = class extends q { 15552 constructor(t5) { 15553 super(t5), this.didClickActionButton = this.didClickActionButton.bind(this), this.didClickAttributeButton = this.didClickAttributeButton.bind(this), this.didClickDialogButton = this.didClickDialogButton.bind(this), this.didKeyDownDialogInput = this.didKeyDownDialogInput.bind(this), this.element = t5, this.attributes = {}, this.actions = {}, this.resetDialogInputs(), b("mousedown", { onElement: this.element, matchingSelector: kr, withCallback: this.didClickActionButton }), b("mousedown", { onElement: this.element, matchingSelector: Rr, withCallback: this.didClickAttributeButton }), b("click", { onElement: this.element, matchingSelector: Tr, preventDefault: true }), b("click", { onElement: this.element, matchingSelector: Dr, withCallback: this.didClickDialogButton }), b("keydown", { onElement: this.element, matchingSelector: Nr, withCallback: this.didKeyDownDialogInput }); 15554 } 15555 didClickActionButton(t5, e4) { 15556 var i4; 15557 null === (i4 = this.delegate) || void 0 === i4 || i4.toolbarDidClickButton(), t5.preventDefault(); 15558 const n3 = Or(e4); 15559 return this.getDialog(n3) ? this.toggleDialog(n3) : null === (r4 = this.delegate) || void 0 === r4 ? void 0 : r4.toolbarDidInvokeAction(n3, e4); 15560 var r4; 15561 } 15562 didClickAttributeButton(t5, e4) { 15563 var i4; 15564 null === (i4 = this.delegate) || void 0 === i4 || i4.toolbarDidClickButton(), t5.preventDefault(); 15565 const n3 = Fr(e4); 15566 var r4; 15567 this.getDialog(n3) ? this.toggleDialog(n3) : null === (r4 = this.delegate) || void 0 === r4 || r4.toolbarDidToggleAttribute(n3); 15568 return this.refreshAttributeButtons(); 15569 } 15570 didClickDialogButton(t5, e4) { 15571 const i4 = y(e4, { matchingSelector: wr }); 15572 return this[e4.getAttribute("data-trix-method")].call(this, i4); 15573 } 15574 didKeyDownDialogInput(t5, e4) { 15575 if (13 === t5.keyCode) { 15576 t5.preventDefault(); 15577 const i4 = e4.getAttribute("name"), n3 = this.getDialog(i4); 15578 this.setAttribute(n3); 15579 } 15580 if (27 === t5.keyCode) 15581 return t5.preventDefault(), this.hideDialog(); 15582 } 15583 updateActions(t5) { 15584 return this.actions = t5, this.refreshActionButtons(); 15585 } 15586 refreshActionButtons() { 15587 return this.eachActionButton((t5, e4) => { 15588 t5.disabled = false === this.actions[e4]; 15589 }); 15590 } 15591 eachActionButton(t5) { 15592 return Array.from(this.element.querySelectorAll(kr)).map((e4) => t5(e4, Or(e4))); 15593 } 15594 updateAttributes(t5) { 15595 return this.attributes = t5, this.refreshAttributeButtons(); 15596 } 15597 refreshAttributeButtons() { 15598 return this.eachAttributeButton((t5, e4) => (t5.disabled = false === this.attributes[e4], this.attributes[e4] || this.dialogIsVisible(e4) ? (t5.setAttribute("data-trix-active", ""), t5.classList.add("trix-active")) : (t5.removeAttribute("data-trix-active"), t5.classList.remove("trix-active")))); 15599 } 15600 eachAttributeButton(t5) { 15601 return Array.from(this.element.querySelectorAll(Rr)).map((e4) => t5(e4, Fr(e4))); 15602 } 15603 applyKeyboardCommand(t5) { 15604 const e4 = JSON.stringify(t5.sort()); 15605 for (const t6 of Array.from(this.element.querySelectorAll("[data-trix-key]"))) { 15606 const i4 = t6.getAttribute("data-trix-key").split("+"); 15607 if (JSON.stringify(i4.sort()) === e4) 15608 return v("mousedown", { onElement: t6 }), true; 15609 } 15610 return false; 15611 } 15612 dialogIsVisible(t5) { 15613 const e4 = this.getDialog(t5); 15614 if (e4) 15615 return e4.hasAttribute("data-trix-active"); 15616 } 15617 toggleDialog(t5) { 15618 return this.dialogIsVisible(t5) ? this.hideDialog() : this.showDialog(t5); 15619 } 15620 showDialog(t5) { 15621 var e4, i4; 15622 this.hideDialog(), null === (e4 = this.delegate) || void 0 === e4 || e4.toolbarWillShowDialog(); 15623 const n3 = this.getDialog(t5); 15624 n3.setAttribute("data-trix-active", ""), n3.classList.add("trix-active"), Array.from(n3.querySelectorAll("input[disabled]")).forEach((t6) => { 15625 t6.removeAttribute("disabled"); 15626 }); 15627 const r4 = Fr(n3); 15628 if (r4) { 15629 const e5 = Ir(n3, t5); 15630 e5 && (e5.value = this.attributes[r4] || "", e5.select()); 15631 } 15632 return null === (i4 = this.delegate) || void 0 === i4 ? void 0 : i4.toolbarDidShowDialog(t5); 15633 } 15634 setAttribute(t5) { 15635 const e4 = Fr(t5), i4 = Ir(t5, e4); 15636 return i4.willValidate && !i4.checkValidity() ? (i4.setAttribute("data-trix-validate", ""), i4.classList.add("trix-validate"), i4.focus()) : (null === (n3 = this.delegate) || void 0 === n3 || n3.toolbarDidUpdateAttribute(e4, i4.value), this.hideDialog()); 15637 var n3; 15638 } 15639 removeAttribute(t5) { 15640 var e4; 15641 const i4 = Fr(t5); 15642 return null === (e4 = this.delegate) || void 0 === e4 || e4.toolbarDidRemoveAttribute(i4), this.hideDialog(); 15643 } 15644 hideDialog() { 15645 const t5 = this.element.querySelector(Lr); 15646 var e4; 15647 if (t5) 15648 return t5.removeAttribute("data-trix-active"), t5.classList.remove("trix-active"), this.resetDialogInputs(), null === (e4 = this.delegate) || void 0 === e4 ? void 0 : e4.toolbarDidHideDialog(((t6) => t6.getAttribute("data-trix-dialog"))(t5)); 15649 } 15650 resetDialogInputs() { 15651 Array.from(this.element.querySelectorAll(Nr)).forEach((t5) => { 15652 t5.setAttribute("disabled", "disabled"), t5.removeAttribute("data-trix-validate"), t5.classList.remove("trix-validate"); 15653 }); 15654 } 15655 getDialog(t5) { 15656 return this.element.querySelector("[data-trix-dialog=".concat(t5, "]")); 15657 } 15658 }; 15659 var Mr = class extends Yn { 15660 constructor(t5) { 15661 let { editorElement: e4, document: i4, html: n3 } = t5; 15662 super(...arguments), this.editorElement = e4, this.selectionManager = new Wn(this.editorElement), this.selectionManager.delegate = this, this.composition = new kn(), this.composition.delegate = this, this.attachmentManager = new Sn(this.composition.getAttachments()), this.attachmentManager.delegate = this, this.inputController = 2 === _.getLevel() ? new br(this.editorElement) : new hr(this.editorElement), this.inputController.delegate = this, this.inputController.responder = this.composition, this.compositionController = new Gn(this.editorElement, this.composition), this.compositionController.delegate = this, this.toolbarController = new Pr(this.editorElement.toolbarElement), this.toolbarController.delegate = this, this.editor = new On(this.composition, this.selectionManager, this.editorElement), i4 ? this.editor.loadDocument(i4) : this.editor.loadHTML(n3); 15663 } 15664 registerSelectionManager() { 15665 return Ft.registerSelectionManager(this.selectionManager); 15666 } 15667 unregisterSelectionManager() { 15668 return Ft.unregisterSelectionManager(this.selectionManager); 15669 } 15670 render() { 15671 return this.compositionController.render(); 15672 } 15673 reparse() { 15674 return this.composition.replaceHTML(this.editorElement.innerHTML); 15675 } 15676 compositionDidChangeDocument(t5) { 15677 if (this.notifyEditorElement("document-change"), !this.handlingInput) 15678 return this.render(); 15679 } 15680 compositionDidChangeCurrentAttributes(t5) { 15681 return this.currentAttributes = t5, this.toolbarController.updateAttributes(this.currentAttributes), this.updateCurrentActions(), this.notifyEditorElement("attributes-change", { attributes: this.currentAttributes }); 15682 } 15683 compositionDidPerformInsertionAtRange(t5) { 15684 this.pasting && (this.pastedRange = t5); 15685 } 15686 compositionShouldAcceptFile(t5) { 15687 return this.notifyEditorElement("file-accept", { file: t5 }); 15688 } 15689 compositionDidAddAttachment(t5) { 15690 const e4 = this.attachmentManager.manageAttachment(t5); 15691 return this.notifyEditorElement("attachment-add", { attachment: e4 }); 15692 } 15693 compositionDidEditAttachment(t5) { 15694 this.compositionController.rerenderViewForObject(t5); 15695 const e4 = this.attachmentManager.manageAttachment(t5); 15696 return this.notifyEditorElement("attachment-edit", { attachment: e4 }), this.notifyEditorElement("change"); 15697 } 15698 compositionDidChangeAttachmentPreviewURL(t5) { 15699 return this.compositionController.invalidateViewForObject(t5), this.notifyEditorElement("change"); 15700 } 15701 compositionDidRemoveAttachment(t5) { 15702 const e4 = this.attachmentManager.unmanageAttachment(t5); 15703 return this.notifyEditorElement("attachment-remove", { attachment: e4 }); 15704 } 15705 compositionDidStartEditingAttachment(t5, e4) { 15706 return this.attachmentLocationRange = this.composition.document.getLocationRangeOfAttachment(t5), this.compositionController.installAttachmentEditorForAttachment(t5, e4), this.selectionManager.setLocationRange(this.attachmentLocationRange); 15707 } 15708 compositionDidStopEditingAttachment(t5) { 15709 this.compositionController.uninstallAttachmentEditor(), this.attachmentLocationRange = null; 15710 } 15711 compositionDidRequestChangingSelectionToLocationRange(t5) { 15712 if (!this.loadingSnapshot || this.isFocused()) 15713 return this.requestedLocationRange = t5, this.compositionRevisionWhenLocationRangeRequested = this.composition.revision, this.handlingInput ? void 0 : this.render(); 15714 } 15715 compositionWillLoadSnapshot() { 15716 this.loadingSnapshot = true; 15717 } 15718 compositionDidLoadSnapshot() { 15719 this.compositionController.refreshViewCache(), this.render(), this.loadingSnapshot = false; 15720 } 15721 getSelectionManager() { 15722 return this.selectionManager; 15723 } 15724 attachmentManagerDidRequestRemovalOfAttachment(t5) { 15725 return this.removeAttachment(t5); 15726 } 15727 compositionControllerWillSyncDocumentView() { 15728 return this.inputController.editorWillSyncDocumentView(), this.selectionManager.lock(), this.selectionManager.clearSelection(); 15729 } 15730 compositionControllerDidSyncDocumentView() { 15731 return this.inputController.editorDidSyncDocumentView(), this.selectionManager.unlock(), this.updateCurrentActions(), this.notifyEditorElement("sync"); 15732 } 15733 compositionControllerDidRender() { 15734 this.requestedLocationRange && (this.compositionRevisionWhenLocationRangeRequested === this.composition.revision && this.selectionManager.setLocationRange(this.requestedLocationRange), this.requestedLocationRange = null, this.compositionRevisionWhenLocationRangeRequested = null), this.renderedCompositionRevision !== this.composition.revision && (this.runEditorFilters(), this.composition.updateCurrentAttributes(), this.notifyEditorElement("render")), this.renderedCompositionRevision = this.composition.revision; 15735 } 15736 compositionControllerDidFocus() { 15737 return this.isFocusedInvisibly() && this.setLocationRange({ index: 0, offset: 0 }), this.toolbarController.hideDialog(), this.notifyEditorElement("focus"); 15738 } 15739 compositionControllerDidBlur() { 15740 return this.notifyEditorElement("blur"); 15741 } 15742 compositionControllerDidSelectAttachment(t5, e4) { 15743 return this.toolbarController.hideDialog(), this.composition.editAttachment(t5, e4); 15744 } 15745 compositionControllerDidRequestDeselectingAttachment(t5) { 15746 const e4 = this.attachmentLocationRange || this.composition.document.getLocationRangeOfAttachment(t5); 15747 return this.selectionManager.setLocationRange(e4[1]); 15748 } 15749 compositionControllerWillUpdateAttachment(t5) { 15750 return this.editor.recordUndoEntry("Edit Attachment", { context: t5.id, consolidatable: true }); 15751 } 15752 compositionControllerDidRequestRemovalOfAttachment(t5) { 15753 return this.removeAttachment(t5); 15754 } 15755 inputControllerWillHandleInput() { 15756 this.handlingInput = true, this.requestedRender = false; 15757 } 15758 inputControllerDidRequestRender() { 15759 this.requestedRender = true; 15760 } 15761 inputControllerDidHandleInput() { 15762 if (this.handlingInput = false, this.requestedRender) 15763 return this.requestedRender = false, this.render(); 15764 } 15765 inputControllerDidAllowUnhandledInput() { 15766 return this.notifyEditorElement("change"); 15767 } 15768 inputControllerDidRequestReparse() { 15769 return this.reparse(); 15770 } 15771 inputControllerWillPerformTyping() { 15772 return this.recordTypingUndoEntry(); 15773 } 15774 inputControllerWillPerformFormatting(t5) { 15775 return this.recordFormattingUndoEntry(t5); 15776 } 15777 inputControllerWillCutText() { 15778 return this.editor.recordUndoEntry("Cut"); 15779 } 15780 inputControllerWillPaste(t5) { 15781 return this.editor.recordUndoEntry("Paste"), this.pasting = true, this.notifyEditorElement("before-paste", { paste: t5 }); 15782 } 15783 inputControllerDidPaste(t5) { 15784 return t5.range = this.pastedRange, this.pastedRange = null, this.pasting = null, this.notifyEditorElement("paste", { paste: t5 }); 15785 } 15786 inputControllerWillMoveText() { 15787 return this.editor.recordUndoEntry("Move"); 15788 } 15789 inputControllerWillAttachFiles() { 15790 return this.editor.recordUndoEntry("Drop Files"); 15791 } 15792 inputControllerWillPerformUndo() { 15793 return this.editor.undo(); 15794 } 15795 inputControllerWillPerformRedo() { 15796 return this.editor.redo(); 15797 } 15798 inputControllerDidReceiveKeyboardCommand(t5) { 15799 return this.toolbarController.applyKeyboardCommand(t5); 15800 } 15801 inputControllerDidStartDrag() { 15802 this.locationRangeBeforeDrag = this.selectionManager.getLocationRange(); 15803 } 15804 inputControllerDidReceiveDragOverPoint(t5) { 15805 return this.selectionManager.setLocationRangeFromPointRange(t5); 15806 } 15807 inputControllerDidCancelDrag() { 15808 this.selectionManager.setLocationRange(this.locationRangeBeforeDrag), this.locationRangeBeforeDrag = null; 15809 } 15810 locationRangeDidChange(t5) { 15811 return this.composition.updateCurrentAttributes(), this.updateCurrentActions(), this.attachmentLocationRange && !Dt(this.attachmentLocationRange, t5) && this.composition.stopEditingAttachment(), this.notifyEditorElement("selection-change"); 15812 } 15813 toolbarDidClickButton() { 15814 if (!this.getLocationRange()) 15815 return this.setLocationRange({ index: 0, offset: 0 }); 15816 } 15817 toolbarDidInvokeAction(t5, e4) { 15818 return this.invokeAction(t5, e4); 15819 } 15820 toolbarDidToggleAttribute(t5) { 15821 if (this.recordFormattingUndoEntry(t5), this.composition.toggleCurrentAttribute(t5), this.render(), !this.selectionFrozen) 15822 return this.editorElement.focus(); 15823 } 15824 toolbarDidUpdateAttribute(t5, e4) { 15825 if (this.recordFormattingUndoEntry(t5), this.composition.setCurrentAttribute(t5, e4), this.render(), !this.selectionFrozen) 15826 return this.editorElement.focus(); 15827 } 15828 toolbarDidRemoveAttribute(t5) { 15829 if (this.recordFormattingUndoEntry(t5), this.composition.removeCurrentAttribute(t5), this.render(), !this.selectionFrozen) 15830 return this.editorElement.focus(); 15831 } 15832 toolbarWillShowDialog(t5) { 15833 return this.composition.expandSelectionForEditing(), this.freezeSelection(); 15834 } 15835 toolbarDidShowDialog(t5) { 15836 return this.notifyEditorElement("toolbar-dialog-show", { dialogName: t5 }); 15837 } 15838 toolbarDidHideDialog(t5) { 15839 return this.thawSelection(), this.editorElement.focus(), this.notifyEditorElement("toolbar-dialog-hide", { dialogName: t5 }); 15840 } 15841 freezeSelection() { 15842 if (!this.selectionFrozen) 15843 return this.selectionManager.lock(), this.composition.freezeSelection(), this.selectionFrozen = true, this.render(); 15844 } 15845 thawSelection() { 15846 if (this.selectionFrozen) 15847 return this.composition.thawSelection(), this.selectionManager.unlock(), this.selectionFrozen = false, this.render(); 15848 } 15849 canInvokeAction(t5) { 15850 return !!this.actionIsExternal(t5) || !(null === (e4 = this.actions[t5]) || void 0 === e4 || null === (e4 = e4.test) || void 0 === e4 || !e4.call(this)); 15851 var e4; 15852 } 15853 invokeAction(t5, e4) { 15854 return this.actionIsExternal(t5) ? this.notifyEditorElement("action-invoke", { actionName: t5, invokingElement: e4 }) : null === (i4 = this.actions[t5]) || void 0 === i4 || null === (i4 = i4.perform) || void 0 === i4 ? void 0 : i4.call(this); 15855 var i4; 15856 } 15857 actionIsExternal(t5) { 15858 return /^x-./.test(t5); 15859 } 15860 getCurrentActions() { 15861 const t5 = {}; 15862 for (const e4 in this.actions) 15863 t5[e4] = this.canInvokeAction(e4); 15864 return t5; 15865 } 15866 updateCurrentActions() { 15867 const t5 = this.getCurrentActions(); 15868 if (!Tt(t5, this.currentActions)) 15869 return this.currentActions = t5, this.toolbarController.updateActions(this.currentActions), this.notifyEditorElement("actions-change", { actions: this.currentActions }); 15870 } 15871 runEditorFilters() { 15872 let t5 = this.composition.getSnapshot(); 15873 if (Array.from(this.editor.filters).forEach((e5) => { 15874 const { document: i5, selectedRange: n3 } = t5; 15875 t5 = e5.call(this.editor, t5) || {}, t5.document || (t5.document = i5), t5.selectedRange || (t5.selectedRange = n3); 15876 }), e4 = t5, i4 = this.composition.getSnapshot(), !Dt(e4.selectedRange, i4.selectedRange) || !e4.document.isEqualTo(i4.document)) 15877 return this.composition.loadSnapshot(t5); 15878 var e4, i4; 15879 } 15880 updateInputElement() { 15881 const t5 = function(t6, e4) { 15882 const i4 = xn[e4]; 15883 if (i4) 15884 return i4(t6); 15885 throw new Error("unknown content type: ".concat(e4)); 15886 }(this.compositionController.getSerializableElement(), "text/html"); 15887 return this.editorElement.setFormValue(t5); 15888 } 15889 notifyEditorElement(t5, e4) { 15890 switch (t5) { 15891 case "document-change": 15892 this.documentChangedSinceLastRender = true; 15893 break; 15894 case "render": 15895 this.documentChangedSinceLastRender && (this.documentChangedSinceLastRender = false, this.notifyEditorElement("change")); 15896 break; 15897 case "change": 15898 case "attachment-add": 15899 case "attachment-edit": 15900 case "attachment-remove": 15901 this.updateInputElement(); 15902 } 15903 return this.editorElement.notify(t5, e4); 15904 } 15905 removeAttachment(t5) { 15906 return this.editor.recordUndoEntry("Delete Attachment"), this.composition.removeAttachment(t5), this.render(); 15907 } 15908 recordFormattingUndoEntry(t5) { 15909 const e4 = mt(t5), i4 = this.selectionManager.getLocationRange(); 15910 if (e4 || !Lt(i4)) 15911 return this.editor.recordUndoEntry("Formatting", { context: this.getUndoContext(), consolidatable: true }); 15912 } 15913 recordTypingUndoEntry() { 15914 return this.editor.recordUndoEntry("Typing", { context: this.getUndoContext(this.currentAttributes), consolidatable: true }); 15915 } 15916 getUndoContext() { 15917 for (var t5 = arguments.length, e4 = new Array(t5), i4 = 0; i4 < t5; i4++) 15918 e4[i4] = arguments[i4]; 15919 return [this.getLocationContext(), this.getTimeContext(), ...Array.from(e4)]; 15920 } 15921 getLocationContext() { 15922 const t5 = this.selectionManager.getLocationRange(); 15923 return Lt(t5) ? t5[0].index : t5; 15924 } 15925 getTimeContext() { 15926 return V.interval > 0 ? Math.floor(new Date().getTime() / V.interval) : 0; 15927 } 15928 isFocused() { 15929 var t5; 15930 return this.editorElement === (null === (t5 = this.editorElement.ownerDocument) || void 0 === t5 ? void 0 : t5.activeElement); 15931 } 15932 isFocusedInvisibly() { 15933 return this.isFocused() && !this.getLocationRange(); 15934 } 15935 get actions() { 15936 return this.constructor.actions; 15937 } 15938 }; 15939 wi(Mr, "actions", { undo: { test() { 15940 return this.editor.canUndo(); 15941 }, perform() { 15942 return this.editor.undo(); 15943 } }, redo: { test() { 15944 return this.editor.canRedo(); 15945 }, perform() { 15946 return this.editor.redo(); 15947 } }, link: { test() { 15948 return this.editor.canActivateAttribute("href"); 15949 } }, increaseNestingLevel: { test() { 15950 return this.editor.canIncreaseNestingLevel(); 15951 }, perform() { 15952 return this.editor.increaseNestingLevel() && this.render(); 15953 } }, decreaseNestingLevel: { test() { 15954 return this.editor.canDecreaseNestingLevel(); 15955 }, perform() { 15956 return this.editor.decreaseNestingLevel() && this.render(); 15957 } }, attachFiles: { test: () => true, perform() { 15958 return _.pickFiles(this.editor.insertFiles); 15959 } } }), Mr.proxyMethod("getSelectionManager().setLocationRange"), Mr.proxyMethod("getSelectionManager().getLocationRange"); 15960 var Br = Object.freeze({ __proto__: null, AttachmentEditorController: Kn, CompositionController: Gn, Controller: Yn, EditorController: Mr, InputController: sr, Level0InputController: hr, Level2InputController: br, ToolbarController: Pr }); 15961 var _r = Object.freeze({ __proto__: null, MutationObserver: Qn, SelectionChangeObserver: Ot }); 15962 var jr = Object.freeze({ __proto__: null, FileVerificationOperation: er, ImagePreloadOperation: ji }); 15963 vt("trix-toolbar", "%t {\n display: block;\n}\n\n%t {\n white-space: nowrap;\n}\n\n%t [data-trix-dialog] {\n display: none;\n}\n\n%t [data-trix-dialog][data-trix-active] {\n display: block;\n}\n\n%t [data-trix-dialog] [data-trix-validate]:invalid {\n background-color: #ffdddd;\n}"); 15964 var Wr = class extends HTMLElement { 15965 connectedCallback() { 15966 "" === this.innerHTML && (this.innerHTML = U.getDefaultHTML()); 15967 } 15968 }; 15969 var Ur = 0; 15970 var Vr = function(t5) { 15971 if (!t5.hasAttribute("contenteditable")) 15972 return t5.setAttribute("contenteditable", ""), function(t6) { 15973 let e4 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; 15974 return e4.times = 1, b(t6, e4); 15975 }("focus", { onElement: t5, withCallback: () => zr(t5) }); 15976 }; 15977 var zr = function(t5) { 15978 return qr(t5), Hr(t5); 15979 }; 15980 var qr = function(t5) { 15981 var e4, i4; 15982 if (null !== (e4 = (i4 = document).queryCommandSupported) && void 0 !== e4 && e4.call(i4, "enableObjectResizing")) 15983 return document.execCommand("enableObjectResizing", false, false), b("mscontrolselect", { onElement: t5, preventDefault: true }); 15984 }; 15985 var Hr = function(t5) { 15986 var e4, i4; 15987 if (null !== (e4 = (i4 = document).queryCommandSupported) && void 0 !== e4 && e4.call(i4, "DefaultParagraphSeparator")) { 15988 const { tagName: t6 } = n.default; 15989 if (["div", "p"].includes(t6)) 15990 return document.execCommand("DefaultParagraphSeparator", false, t6); 15991 } 15992 }; 15993 var Jr = a.forcesObjectResizing ? { display: "inline", width: "auto" } : { display: "inline-block", width: "1px" }; 15994 vt("trix-editor", "%t {\n display: block;\n}\n\n%t:empty::before {\n content: attr(placeholder);\n color: graytext;\n cursor: text;\n pointer-events: none;\n white-space: pre-line;\n}\n\n%t a[contenteditable=false] {\n cursor: text;\n}\n\n%t img {\n max-width: 100%;\n height: auto;\n}\n\n%t ".concat(e, " figcaption textarea {\n resize: none;\n}\n\n%t ").concat(e, " figcaption textarea.trix-autoresize-clone {\n position: absolute;\n left: -9999px;\n max-height: 0px;\n}\n\n%t ").concat(e, " figcaption[data-trix-placeholder]:empty::before {\n content: attr(data-trix-placeholder);\n color: graytext;\n}\n\n%t [data-trix-cursor-target] {\n display: ").concat(Jr.display, " !important;\n width: ").concat(Jr.width, " !important;\n padding: 0 !important;\n margin: 0 !important;\n border: none !important;\n}\n\n%t [data-trix-cursor-target=left] {\n vertical-align: top !important;\n margin-left: -1px !important;\n}\n\n%t [data-trix-cursor-target=right] {\n vertical-align: bottom !important;\n margin-right: -1px !important;\n}")); 15995 var Kr = /* @__PURE__ */ new WeakMap(); 15996 var Gr = /* @__PURE__ */ new WeakSet(); 15997 var Yr = class { 15998 constructor(t5) { 15999 var e4, i4; 16000 Mi(e4 = this, i4 = Gr), i4.add(e4), Bi(this, Kr, { writable: true, value: void 0 }), this.element = t5, Ni(this, Kr, t5.attachInternals()); 16001 } 16002 connectedCallback() { 16003 Pi(this, Gr, $r).call(this); 16004 } 16005 disconnectedCallback() { 16006 } 16007 get labels() { 16008 return Di(this, Kr).labels; 16009 } 16010 get disabled() { 16011 var t5; 16012 return null === (t5 = this.element.inputElement) || void 0 === t5 ? void 0 : t5.disabled; 16013 } 16014 set disabled(t5) { 16015 this.element.toggleAttribute("disabled", t5); 16016 } 16017 get required() { 16018 return this.element.hasAttribute("required"); 16019 } 16020 set required(t5) { 16021 this.element.toggleAttribute("required", t5), Pi(this, Gr, $r).call(this); 16022 } 16023 get validity() { 16024 return Di(this, Kr).validity; 16025 } 16026 get validationMessage() { 16027 return Di(this, Kr).validationMessage; 16028 } 16029 get willValidate() { 16030 return Di(this, Kr).willValidate; 16031 } 16032 setFormValue(t5) { 16033 Pi(this, Gr, $r).call(this); 16034 } 16035 checkValidity() { 16036 return Di(this, Kr).checkValidity(); 16037 } 16038 reportValidity() { 16039 return Di(this, Kr).reportValidity(); 16040 } 16041 setCustomValidity(t5) { 16042 Pi(this, Gr, $r).call(this, t5); 16043 } 16044 }; 16045 function $r() { 16046 let t5 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ""; 16047 const { required: e4, value: i4 } = this.element, n3 = e4 && !i4, r4 = !!t5, o3 = T("input", { required: e4 }), s4 = t5 || o3.validationMessage; 16048 Di(this, Kr).setValidity({ valueMissing: n3, customError: r4 }, s4); 16049 } 16050 var Xr = /* @__PURE__ */ new WeakMap(); 16051 var Zr = /* @__PURE__ */ new WeakMap(); 16052 var Qr = /* @__PURE__ */ new WeakMap(); 16053 var to = class { 16054 constructor(t5) { 16055 Bi(this, Xr, { writable: true, value: void 0 }), Bi(this, Zr, { writable: true, value: (t6) => { 16056 t6.defaultPrevented || t6.target === this.element.form && this.element.reset(); 16057 } }), Bi(this, Qr, { writable: true, value: (t6) => { 16058 if (t6.defaultPrevented) 16059 return; 16060 if (this.element.contains(t6.target)) 16061 return; 16062 const e4 = y(t6.target, { matchingSelector: "label" }); 16063 e4 && Array.from(this.labels).includes(e4) && this.element.focus(); 16064 } }), this.element = t5; 16065 } 16066 connectedCallback() { 16067 Ni(this, Xr, function(t5) { 16068 if (t5.hasAttribute("aria-label") || t5.hasAttribute("aria-labelledby")) 16069 return; 16070 const e4 = function() { 16071 const e5 = Array.from(t5.labels).map((e6) => { 16072 if (!e6.contains(t5)) 16073 return e6.textContent; 16074 }).filter((t6) => t6), i4 = e5.join(" "); 16075 return i4 ? t5.setAttribute("aria-label", i4) : t5.removeAttribute("aria-label"); 16076 }; 16077 return e4(), b("focus", { onElement: t5, withCallback: e4 }); 16078 }(this.element)), window.addEventListener("reset", Di(this, Zr), false), window.addEventListener("click", Di(this, Qr), false); 16079 } 16080 disconnectedCallback() { 16081 var t5; 16082 null === (t5 = Di(this, Xr)) || void 0 === t5 || t5.destroy(), window.removeEventListener("reset", Di(this, Zr), false), window.removeEventListener("click", Di(this, Qr), false); 16083 } 16084 get labels() { 16085 const t5 = []; 16086 this.element.id && this.element.ownerDocument && t5.push(...Array.from(this.element.ownerDocument.querySelectorAll("label[for='".concat(this.element.id, "']")) || [])); 16087 const e4 = y(this.element, { matchingSelector: "label" }); 16088 return e4 && [this.element, null].includes(e4.control) && t5.push(e4), t5; 16089 } 16090 get disabled() { 16091 return console.warn("This browser does not support the [disabled] attribute for trix-editor elements."), false; 16092 } 16093 set disabled(t5) { 16094 console.warn("This browser does not support the [disabled] attribute for trix-editor elements."); 16095 } 16096 get required() { 16097 return console.warn("This browser does not support the [required] attribute for trix-editor elements."), false; 16098 } 16099 set required(t5) { 16100 console.warn("This browser does not support the [required] attribute for trix-editor elements."); 16101 } 16102 get validity() { 16103 return console.warn("This browser does not support the validity property for trix-editor elements."), null; 16104 } 16105 get validationMessage() { 16106 return console.warn("This browser does not support the validationMessage property for trix-editor elements."), ""; 16107 } 16108 get willValidate() { 16109 return console.warn("This browser does not support the willValidate property for trix-editor elements."), false; 16110 } 16111 setFormValue(t5) { 16112 } 16113 checkValidity() { 16114 return console.warn("This browser does not support checkValidity() for trix-editor elements."), true; 16115 } 16116 reportValidity() { 16117 return console.warn("This browser does not support reportValidity() for trix-editor elements."), true; 16118 } 16119 setCustomValidity(t5) { 16120 console.warn("This browser does not support setCustomValidity(validationMessage) for trix-editor elements."); 16121 } 16122 }; 16123 var eo = /* @__PURE__ */ new WeakMap(); 16124 var io = class extends HTMLElement { 16125 constructor() { 16126 super(), Bi(this, eo, { writable: true, value: void 0 }), Ni(this, eo, this.constructor.formAssociated ? new Yr(this) : new to(this)); 16127 } 16128 get trixId() { 16129 return this.hasAttribute("trix-id") ? this.getAttribute("trix-id") : (this.setAttribute("trix-id", ++Ur), this.trixId); 16130 } 16131 get labels() { 16132 return Di(this, eo).labels; 16133 } 16134 get disabled() { 16135 return Di(this, eo).disabled; 16136 } 16137 set disabled(t5) { 16138 Di(this, eo).disabled = t5; 16139 } 16140 get required() { 16141 return Di(this, eo).required; 16142 } 16143 set required(t5) { 16144 Di(this, eo).required = t5; 16145 } 16146 get validity() { 16147 return Di(this, eo).validity; 16148 } 16149 get validationMessage() { 16150 return Di(this, eo).validationMessage; 16151 } 16152 get willValidate() { 16153 return Di(this, eo).willValidate; 16154 } 16155 get type() { 16156 return this.localName; 16157 } 16158 get toolbarElement() { 16159 var t5; 16160 if (this.hasAttribute("toolbar")) 16161 return null === (t5 = this.ownerDocument) || void 0 === t5 ? void 0 : t5.getElementById(this.getAttribute("toolbar")); 16162 if (this.parentNode) { 16163 const t6 = "trix-toolbar-".concat(this.trixId); 16164 this.setAttribute("toolbar", t6); 16165 const e4 = T("trix-toolbar", { id: t6 }); 16166 return this.parentNode.insertBefore(e4, this), e4; 16167 } 16168 } 16169 get form() { 16170 var t5; 16171 return null === (t5 = this.inputElement) || void 0 === t5 ? void 0 : t5.form; 16172 } 16173 get inputElement() { 16174 var t5; 16175 if (this.hasAttribute("input")) 16176 return null === (t5 = this.ownerDocument) || void 0 === t5 ? void 0 : t5.getElementById(this.getAttribute("input")); 16177 if (this.parentNode) { 16178 const t6 = "trix-input-".concat(this.trixId); 16179 this.setAttribute("input", t6); 16180 const e4 = T("input", { type: "hidden", id: t6 }); 16181 return this.parentNode.insertBefore(e4, this.nextElementSibling), e4; 16182 } 16183 } 16184 get editor() { 16185 var t5; 16186 return null === (t5 = this.editorController) || void 0 === t5 ? void 0 : t5.editor; 16187 } 16188 get name() { 16189 var t5; 16190 return null === (t5 = this.inputElement) || void 0 === t5 ? void 0 : t5.name; 16191 } 16192 get value() { 16193 var t5; 16194 return null === (t5 = this.inputElement) || void 0 === t5 ? void 0 : t5.value; 16195 } 16196 set value(t5) { 16197 var e4; 16198 this.defaultValue = t5, null === (e4 = this.editor) || void 0 === e4 || e4.loadHTML(this.defaultValue); 16199 } 16200 notify(t5, e4) { 16201 if (this.editorController) 16202 return v("trix-".concat(t5), { onElement: this, attributes: e4 }); 16203 } 16204 setFormValue(t5) { 16205 this.inputElement && (this.inputElement.value = t5, Di(this, eo).setFormValue(t5)); 16206 } 16207 connectedCallback() { 16208 this.hasAttribute("data-trix-internal") || (Vr(this), function(t5) { 16209 if (!t5.hasAttribute("role")) 16210 t5.setAttribute("role", "textbox"); 16211 }(this), this.editorController || (v("trix-before-initialize", { onElement: this }), this.editorController = new Mr({ editorElement: this, html: this.defaultValue = this.value }), requestAnimationFrame(() => v("trix-initialize", { onElement: this }))), this.editorController.registerSelectionManager(), Di(this, eo).connectedCallback(), function(t5) { 16212 if (!document.querySelector(":focus") && t5.hasAttribute("autofocus") && document.querySelector("[autofocus]") === t5) 16213 t5.focus(); 16214 }(this)); 16215 } 16216 disconnectedCallback() { 16217 var t5; 16218 null === (t5 = this.editorController) || void 0 === t5 || t5.unregisterSelectionManager(), Di(this, eo).disconnectedCallback(); 16219 } 16220 checkValidity() { 16221 return Di(this, eo).checkValidity(); 16222 } 16223 reportValidity() { 16224 return Di(this, eo).reportValidity(); 16225 } 16226 setCustomValidity(t5) { 16227 Di(this, eo).setCustomValidity(t5); 16228 } 16229 formDisabledCallback(t5) { 16230 this.inputElement && (this.inputElement.disabled = t5), this.toggleAttribute("contenteditable", !t5); 16231 } 16232 formResetCallback() { 16233 this.reset(); 16234 } 16235 reset() { 16236 this.value = this.defaultValue; 16237 } 16238 }; 16239 wi(io, "formAssociated", "ElementInternals" in window); 16240 var no = { VERSION: t, config: z, core: Cn, models: Un, views: Vn, controllers: Br, observers: _r, operations: jr, elements: Object.freeze({ __proto__: null, TrixEditorElement: io, TrixToolbarElement: Wr }), filters: Object.freeze({ __proto__: null, Filter: Dn, attachmentGalleryFilter: Nn }) }; 16241 Object.assign(no, Un), window.Trix = no, setTimeout(function() { 16242 customElements.get("trix-toolbar") || customElements.define("trix-toolbar", Wr), customElements.get("trix-editor") || customElements.define("trix-editor", io); 16243 }, 0); 16244 16245
vendor: 84,501 bytes, lines 16245-18693
16245// node_modules/@hotwired/stimulus/dist/stimulus.js 16246 var EventListener = class { 16247 constructor(eventTarget, eventName, eventOptions) { 16248 this.eventTarget = eventTarget; 16249 this.eventName = eventName; 16250 this.eventOptions = eventOptions; 16251 this.unorderedBindings = /* @__PURE__ */ new Set(); 16252 } 16253 connect() { 16254 this.eventTarget.addEventListener(this.eventName, this, this.eventOptions); 16255 } 16256 disconnect() { 16257 this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions); 16258 } 16259 bindingConnected(binding) { 16260 this.unorderedBindings.add(binding); 16261 } 16262 bindingDisconnected(binding) { 16263 this.unorderedBindings.delete(binding); 16264 } 16265 handleEvent(event2) { 16266 const extendedEvent = extendEvent(event2); 16267 for (const binding of this.bindings) { 16268 if (extendedEvent.immediatePropagationStopped) { 16269 break; 16270 } else { 16271 binding.handleEvent(extendedEvent); 16272 } 16273 } 16274 } 16275 hasBindings() { 16276 return this.unorderedBindings.size > 0; 16277 } 16278 get bindings() { 16279 return Array.from(this.unorderedBindings).sort((left2, right2) => { 16280 const leftIndex = left2.index, rightIndex = right2.index; 16281 return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0; 16282 }); 16283 } 16284 }; 16285 function extendEvent(event2) { 16286 if ("immediatePropagationStopped" in event2) { 16287 return event2; 16288 } else { 16289 const { stopImmediatePropagation } = event2; 16290 return Object.assign(event2, { 16291 immediatePropagationStopped: false, 16292 stopImmediatePropagation() { 16293 this.immediatePropagationStopped = true; 16294 stopImmediatePropagation.call(this); 16295 } 16296 }); 16297 } 16298 } 16299 var Dispatcher = class { 16300 constructor(application2) { 16301 this.application = application2; 16302 this.eventListenerMaps = /* @__PURE__ */ new Map(); 16303 this.started = false; 16304 } 16305 start() { 16306 if (!this.started) { 16307 this.started = true; 16308 this.eventListeners.forEach((eventListener) => eventListener.connect()); 16309 } 16310 } 16311 stop() { 16312 if (this.started) { 16313 this.started = false; 16314 this.eventListeners.forEach((eventListener) => eventListener.disconnect()); 16315 } 16316 } 16317 get eventListeners() { 16318 return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []); 16319 } 16320 bindingConnected(binding) { 16321 this.fetchEventListenerForBinding(binding).bindingConnected(binding); 16322 } 16323 bindingDisconnected(binding, clearEventListeners = false) { 16324 this.fetchEventListenerForBinding(binding).bindingDisconnected(binding); 16325 if (clearEventListeners) 16326 this.clearEventListenersForBinding(binding); 16327 } 16328 handleError(error2, message, detail = {}) { 16329 this.application.handleError(error2, `Error ${message}`, detail); 16330 } 16331 clearEventListenersForBinding(binding) { 16332 const eventListener = this.fetchEventListenerForBinding(binding); 16333 if (!eventListener.hasBindings()) { 16334 eventListener.disconnect(); 16335 this.removeMappedEventListenerFor(binding); 16336 } 16337 } 16338 removeMappedEventListenerFor(binding) { 16339 const { eventTarget, eventName, eventOptions } = binding; 16340 const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget); 16341 const cacheKey = this.cacheKey(eventName, eventOptions); 16342 eventListenerMap.delete(cacheKey); 16343 if (eventListenerMap.size == 0) 16344 this.eventListenerMaps.delete(eventTarget); 16345 } 16346 fetchEventListenerForBinding(binding) { 16347 const { eventTarget, eventName, eventOptions } = binding; 16348 return this.fetchEventListener(eventTarget, eventName, eventOptions); 16349 } 16350 fetchEventListener(eventTarget, eventName, eventOptions) { 16351 const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget); 16352 const cacheKey = this.cacheKey(eventName, eventOptions); 16353 let eventListener = eventListenerMap.get(cacheKey); 16354 if (!eventListener) { 16355 eventListener = this.createEventListener(eventTarget, eventName, eventOptions); 16356 eventListenerMap.set(cacheKey, eventListener); 16357 } 16358 return eventListener; 16359 } 16360 createEventListener(eventTarget, eventName, eventOptions) { 16361 const eventListener = new EventListener(eventTarget, eventName, eventOptions); 16362 if (this.started) { 16363 eventListener.connect(); 16364 } 16365 return eventListener; 16366 } 16367 fetchEventListenerMapForEventTarget(eventTarget) { 16368 let eventListenerMap = this.eventListenerMaps.get(eventTarget); 16369 if (!eventListenerMap) { 16370 eventListenerMap = /* @__PURE__ */ new Map(); 16371 this.eventListenerMaps.set(eventTarget, eventListenerMap); 16372 } 16373 return eventListenerMap; 16374 } 16375 cacheKey(eventName, eventOptions) { 16376 const parts = [eventName]; 16377 Object.keys(eventOptions).sort().forEach((key) => { 16378 parts.push(`${eventOptions[key] ? "" : "!"}${key}`); 16379 }); 16380 return parts.join(":"); 16381 } 16382 }; 16383 var defaultActionDescriptorFilters = { 16384 stop({ event: event2, value }) { 16385 if (value) 16386 event2.stopPropagation(); 16387 return true; 16388 }, 16389 prevent({ event: event2, value }) { 16390 if (value) 16391 event2.preventDefault(); 16392 return true; 16393 }, 16394 self({ event: event2, value, element }) { 16395 if (value) { 16396 return element === event2.target; 16397 } else { 16398 return true; 16399 } 16400 } 16401 }; 16402 var descriptorPattern = /^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/; 16403 function parseActionDescriptorString(descriptorString) { 16404 const source = descriptorString.trim(); 16405 const matches2 = source.match(descriptorPattern) || []; 16406 let eventName = matches2[2]; 16407 let keyFilter = matches2[3]; 16408 if (keyFilter && !["keydown", "keyup", "keypress"].includes(eventName)) { 16409 eventName += `.${keyFilter}`; 16410 keyFilter = ""; 16411 } 16412 return { 16413 eventTarget: parseEventTarget(matches2[4]), 16414 eventName, 16415 eventOptions: matches2[7] ? parseEventOptions(matches2[7]) : {}, 16416 identifier: matches2[5], 16417 methodName: matches2[6], 16418 keyFilter: matches2[1] || keyFilter 16419 }; 16420 } 16421 function parseEventTarget(eventTargetName) { 16422 if (eventTargetName == "window") { 16423 return window; 16424 } else if (eventTargetName == "document") { 16425 return document; 16426 } 16427 } 16428 function parseEventOptions(eventOptions) { 16429 return eventOptions.split(":").reduce((options, token) => Object.assign(options, { [token.replace(/^!/, "")]: !/^!/.test(token) }), {}); 16430 } 16431 function stringifyEventTarget(eventTarget) { 16432 if (eventTarget == window) { 16433 return "window"; 16434 } else if (eventTarget == document) { 16435 return "document"; 16436 } 16437 } 16438 function camelize(value) { 16439 return value.replace(/(?:[_-])([a-z0-9])/g, (_4, char) => char.toUpperCase()); 16440 } 16441 function namespaceCamelize(value) { 16442 return camelize(value.replace(/--/g, "-").replace(/__/g, "_")); 16443 } 16444 function capitalize(value) { 16445 return value.charAt(0).toUpperCase() + value.slice(1); 16446 } 16447 function dasherize(value) { 16448 return value.replace(/([A-Z])/g, (_4, char) => `-${char.toLowerCase()}`); 16449 } 16450 function tokenize(value) { 16451 return value.match(/[^\s]+/g) || []; 16452 } 16453 function isSomething(object) { 16454 return object !== null && object !== void 0; 16455 } 16456 function hasProperty(object, property) { 16457 return Object.prototype.hasOwnProperty.call(object, property); 16458 } 16459 var allModifiers = ["meta", "ctrl", "alt", "shift"]; 16460 var Action = class { 16461 constructor(element, index4, descriptor, schema) { 16462 this.element = element; 16463 this.index = index4; 16464 this.eventTarget = descriptor.eventTarget || element; 16465 this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error("missing event name"); 16466 this.eventOptions = descriptor.eventOptions || {}; 16467 this.identifier = descriptor.identifier || error("missing identifier"); 16468 this.methodName = descriptor.methodName || error("missing method name"); 16469 this.keyFilter = descriptor.keyFilter || ""; 16470 this.schema = schema; 16471 } 16472 static forToken(token, schema) { 16473 return new this(token.element, token.index, parseActionDescriptorString(token.content), schema); 16474 } 16475 toString() { 16476 const eventFilter = this.keyFilter ? `.${this.keyFilter}` : ""; 16477 const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : ""; 16478 return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`; 16479 } 16480 shouldIgnoreKeyboardEvent(event2) { 16481 if (!this.keyFilter) { 16482 return false; 16483 } 16484 const filters = this.keyFilter.split("+"); 16485 if (this.keyFilterDissatisfied(event2, filters)) { 16486 return true; 16487 } 16488 const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0]; 16489 if (!standardFilter) { 16490 return false; 16491 } 16492 if (!hasProperty(this.keyMappings, standardFilter)) { 16493 error(`contains unknown key filter: ${this.keyFilter}`); 16494 } 16495 return this.keyMappings[standardFilter].toLowerCase() !== event2.key.toLowerCase(); 16496 } 16497 shouldIgnoreMouseEvent(event2) { 16498 if (!this.keyFilter) { 16499 return false; 16500 } 16501 const filters = [this.keyFilter]; 16502 if (this.keyFilterDissatisfied(event2, filters)) { 16503 return true; 16504 } 16505 return false; 16506 } 16507 get params() { 16508 const params = {}; 16509 const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, "i"); 16510 for (const { name, value } of Array.from(this.element.attributes)) { 16511 const match = name.match(pattern); 16512 const key = match && match[1]; 16513 if (key) { 16514 params[camelize(key)] = typecast(value); 16515 } 16516 } 16517 return params; 16518 } 16519 get eventTargetName() { 16520 return stringifyEventTarget(this.eventTarget); 16521 } 16522 get keyMappings() { 16523 return this.schema.keyMappings; 16524 } 16525 keyFilterDissatisfied(event2, filters) { 16526 const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier)); 16527 return event2.metaKey !== meta || event2.ctrlKey !== ctrl || event2.altKey !== alt || event2.shiftKey !== shift; 16528 } 16529 }; 16530 var defaultEventNames = { 16531 a: () => "click", 16532 button: () => "click", 16533 form: () => "submit", 16534 details: () => "toggle", 16535 input: (e4) => e4.getAttribute("type") == "submit" ? "click" : "input", 16536 select: () => "change", 16537 textarea: () => "input" 16538 }; 16539 function getDefaultEventNameForElement(element) { 16540 const tagName = element.tagName.toLowerCase(); 16541 if (tagName in defaultEventNames) { 16542 return defaultEventNames[tagName](element); 16543 } 16544 } 16545 function error(message) { 16546 throw new Error(message); 16547 } 16548 function typecast(value) { 16549 try { 16550 return JSON.parse(value); 16551 } catch (o_O) { 16552 return value; 16553 } 16554 } 16555 var Binding = class { 16556 constructor(context, action) { 16557 this.context = context; 16558 this.action = action; 16559 } 16560 get index() { 16561 return this.action.index; 16562 } 16563 get eventTarget() { 16564 return this.action.eventTarget; 16565 } 16566 get eventOptions() { 16567 return this.action.eventOptions; 16568 } 16569 get identifier() { 16570 return this.context.identifier; 16571 } 16572 handleEvent(event2) { 16573 const actionEvent = this.prepareActionEvent(event2); 16574 if (this.willBeInvokedByEvent(event2) && this.applyEventModifiers(actionEvent)) { 16575 this.invokeWithEvent(actionEvent); 16576 } 16577 } 16578 get eventName() { 16579 return this.action.eventName; 16580 } 16581 get method() { 16582 const method = this.controller[this.methodName]; 16583 if (typeof method == "function") { 16584 return method; 16585 } 16586 throw new Error(`Action "${this.action}" references undefined method "${this.methodName}"`); 16587 } 16588 applyEventModifiers(event2) { 16589 const { element } = this.action; 16590 const { actionDescriptorFilters } = this.context.application; 16591 const { controller } = this.context; 16592 let passes = true; 16593 for (const [name, value] of Object.entries(this.eventOptions)) { 16594 if (name in actionDescriptorFilters) { 16595 const filter = actionDescriptorFilters[name]; 16596 passes = passes && filter({ name, value, event: event2, element, controller }); 16597 } else { 16598 continue; 16599 } 16600 } 16601 return passes; 16602 } 16603 prepareActionEvent(event2) { 16604 return Object.assign(event2, { params: this.action.params }); 16605 } 16606 invokeWithEvent(event2) { 16607 const { target, currentTarget } = event2; 16608 try { 16609 this.method.call(this.controller, event2); 16610 this.context.logDebugActivity(this.methodName, { event: event2, target, currentTarget, action: this.methodName }); 16611 } catch (error2) { 16612 const { identifier, controller, element, index: index4 } = this; 16613 const detail = { identifier, controller, element, index: index4, event: event2 }; 16614 this.context.handleError(error2, `invoking action "${this.action}"`, detail); 16615 } 16616 } 16617 willBeInvokedByEvent(event2) { 16618 const eventTarget = event2.target; 16619 if (event2 instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event2)) { 16620 return false; 16621 } 16622 if (event2 instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event2)) { 16623 return false; 16624 } 16625 if (this.element === eventTarget) { 16626 return true; 16627 } else if (eventTarget instanceof Element && this.element.contains(eventTarget)) { 16628 return this.scope.containsElement(eventTarget); 16629 } else { 16630 return this.scope.containsElement(this.action.element); 16631 } 16632 } 16633 get controller() { 16634 return this.context.controller; 16635 } 16636 get methodName() { 16637 return this.action.methodName; 16638 } 16639 get element() { 16640 return this.scope.element; 16641 } 16642 get scope() { 16643 return this.context.scope; 16644 } 16645 }; 16646 var ElementObserver = class { 16647 constructor(element, delegate2) { 16648 this.mutationObserverInit = { attributes: true, childList: true, subtree: true }; 16649 this.element = element; 16650 this.started = false; 16651 this.delegate = delegate2; 16652 this.elements = /* @__PURE__ */ new Set(); 16653 this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations)); 16654 } 16655 start() { 16656 if (!this.started) { 16657 this.started = true; 16658 this.mutationObserver.observe(this.element, this.mutationObserverInit); 16659 this.refresh(); 16660 } 16661 } 16662 pause(callback) { 16663 if (this.started) { 16664 this.mutationObserver.disconnect(); 16665 this.started = false; 16666 } 16667 callback(); 16668 if (!this.started) { 16669 this.mutationObserver.observe(this.element, this.mutationObserverInit); 16670 this.started = true; 16671 } 16672 } 16673 stop() { 16674 if (this.started) { 16675 this.mutationObserver.takeRecords(); 16676 this.mutationObserver.disconnect(); 16677 this.started = false; 16678 } 16679 } 16680 refresh() { 16681 if (this.started) { 16682 const matches2 = new Set(this.matchElementsInTree()); 16683 for (const element of Array.from(this.elements)) { 16684 if (!matches2.has(element)) { 16685 this.removeElement(element); 16686 } 16687 } 16688 for (const element of Array.from(matches2)) { 16689 this.addElement(element); 16690 } 16691 } 16692 } 16693 processMutations(mutations) { 16694 if (this.started) { 16695 for (const mutation of mutations) { 16696 this.processMutation(mutation); 16697 } 16698 } 16699 } 16700 processMutation(mutation) { 16701 if (mutation.type == "attributes") { 16702 this.processAttributeChange(mutation.target, mutation.attributeName); 16703 } else if (mutation.type == "childList") { 16704 this.processRemovedNodes(mutation.removedNodes); 16705 this.processAddedNodes(mutation.addedNodes); 16706 } 16707 } 16708 processAttributeChange(element, attributeName) { 16709 if (this.elements.has(element)) { 16710 if (this.delegate.elementAttributeChanged && this.matchElement(element)) { 16711 this.delegate.elementAttributeChanged(element, attributeName); 16712 } else { 16713 this.removeElement(element); 16714 } 16715 } else if (this.matchElement(element)) { 16716 this.addElement(element); 16717 } 16718 } 16719 processRemovedNodes(nodes) { 16720 for (const node of Array.from(nodes)) { 16721 const element = this.elementFromNode(node); 16722 if (element) { 16723 this.processTree(element, this.removeElement); 16724 } 16725 } 16726 } 16727 processAddedNodes(nodes) { 16728 for (const node of Array.from(nodes)) { 16729 const element = this.elementFromNode(node); 16730 if (element && this.elementIsActive(element)) { 16731 this.processTree(element, this.addElement); 16732 } 16733 } 16734 } 16735 matchElement(element) { 16736 return this.delegate.matchElement(element); 16737 } 16738 matchElementsInTree(tree = this.element) { 16739 return this.delegate.matchElementsInTree(tree); 16740 } 16741 processTree(tree, processor) { 16742 for (const element of this.matchElementsInTree(tree)) { 16743 processor.call(this, element); 16744 } 16745 } 16746 elementFromNode(node) { 16747 if (node.nodeType == Node.ELEMENT_NODE) { 16748 return node; 16749 } 16750 } 16751 elementIsActive(element) { 16752 if (element.isConnected != this.element.isConnected) { 16753 return false; 16754 } else { 16755 return this.element.contains(element); 16756 } 16757 } 16758 addElement(element) { 16759 if (!this.elements.has(element)) { 16760 if (this.elementIsActive(element)) { 16761 this.elements.add(element); 16762 if (this.delegate.elementMatched) { 16763 this.delegate.elementMatched(element); 16764 } 16765 } 16766 } 16767 } 16768 removeElement(element) { 16769 if (this.elements.has(element)) { 16770 this.elements.delete(element); 16771 if (this.delegate.elementUnmatched) { 16772 this.delegate.elementUnmatched(element); 16773 } 16774 } 16775 } 16776 }; 16777 var AttributeObserver = class { 16778 constructor(element, attributeName, delegate2) { 16779 this.attributeName = attributeName; 16780 this.delegate = delegate2; 16781 this.elementObserver = new ElementObserver(element, this); 16782 } 16783 get element() { 16784 return this.elementObserver.element; 16785 } 16786 get selector() { 16787 return `[${this.attributeName}]`; 16788 } 16789 start() { 16790 this.elementObserver.start(); 16791 } 16792 pause(callback) { 16793 this.elementObserver.pause(callback); 16794 } 16795 stop() { 16796 this.elementObserver.stop(); 16797 } 16798 refresh() { 16799 this.elementObserver.refresh(); 16800 } 16801 get started() { 16802 return this.elementObserver.started; 16803 } 16804 matchElement(element) { 16805 return element.hasAttribute(this.attributeName); 16806 } 16807 matchElementsInTree(tree) { 16808 const match = this.matchElement(tree) ? [tree] : []; 16809 const matches2 = Array.from(tree.querySelectorAll(this.selector)); 16810 return match.concat(matches2); 16811 } 16812 elementMatched(element) { 16813 if (this.delegate.elementMatchedAttribute) { 16814 this.delegate.elementMatchedAttribute(element, this.attributeName); 16815 } 16816 } 16817 elementUnmatched(element) { 16818 if (this.delegate.elementUnmatchedAttribute) { 16819 this.delegate.elementUnmatchedAttribute(element, this.attributeName); 16820 } 16821 } 16822 elementAttributeChanged(element, attributeName) { 16823 if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) { 16824 this.delegate.elementAttributeValueChanged(element, attributeName); 16825 } 16826 } 16827 }; 16828 function add(map, key, value) { 16829 fetch2(map, key).add(value); 16830 } 16831 function del(map, key, value) { 16832 fetch2(map, key).delete(value); 16833 prune(map, key); 16834 } 16835 function fetch2(map, key) { 16836 let values = map.get(key); 16837 if (!values) { 16838 values = /* @__PURE__ */ new Set(); 16839 map.set(key, values); 16840 } 16841 return values; 16842 } 16843 function prune(map, key) { 16844 const values = map.get(key); 16845 if (values != null && values.size == 0) { 16846 map.delete(key); 16847 } 16848 } 16849 var Multimap = class { 16850 constructor() { 16851 this.valuesByKey = /* @__PURE__ */ new Map(); 16852 } 16853 get keys() { 16854 return Array.from(this.valuesByKey.keys()); 16855 } 16856 get values() { 16857 const sets = Array.from(this.valuesByKey.values()); 16858 return sets.reduce((values, set) => values.concat(Array.from(set)), []); 16859 } 16860 get size() { 16861 const sets = Array.from(this.valuesByKey.values()); 16862 return sets.reduce((size, set) => size + set.size, 0); 16863 } 16864 add(key, value) { 16865 add(this.valuesByKey, key, value); 16866 } 16867 delete(key, value) { 16868 del(this.valuesByKey, key, value); 16869 } 16870 has(key, value) { 16871 const values = this.valuesByKey.get(key); 16872 return values != null && values.has(value); 16873 } 16874 hasKey(key) { 16875 return this.valuesByKey.has(key); 16876 } 16877 hasValue(value) { 16878 const sets = Array.from(this.valuesByKey.values()); 16879 return sets.some((set) => set.has(value)); 16880 } 16881 getValuesForKey(key) { 16882 const values = this.valuesByKey.get(key); 16883 return values ? Array.from(values) : []; 16884 } 16885 getKeysForValue(value) { 16886 return Array.from(this.valuesByKey).filter(([_key, values]) => values.has(value)).map(([key, _values]) => key); 16887 } 16888 }; 16889 var SelectorObserver = class { 16890 constructor(element, selector, delegate2, details) { 16891 this._selector = selector; 16892 this.details = details; 16893 this.elementObserver = new ElementObserver(element, this); 16894 this.delegate = delegate2; 16895 this.matchesByElement = new Multimap(); 16896 } 16897 get started() { 16898 return this.elementObserver.started; 16899 } 16900 get selector() { 16901 return this._selector; 16902 } 16903 set selector(selector) { 16904 this._selector = selector; 16905 this.refresh(); 16906 } 16907 start() { 16908 this.elementObserver.start(); 16909 } 16910 pause(callback) { 16911 this.elementObserver.pause(callback); 16912 } 16913 stop() { 16914 this.elementObserver.stop(); 16915 } 16916 refresh() { 16917 this.elementObserver.refresh(); 16918 } 16919 get element() { 16920 return this.elementObserver.element; 16921 } 16922 matchElement(element) { 16923 const { selector } = this; 16924 if (selector) { 16925 const matches2 = element.matches(selector); 16926 if (this.delegate.selectorMatchElement) { 16927 return matches2 && this.delegate.selectorMatchElement(element, this.details); 16928 } 16929 return matches2; 16930 } else { 16931 return false; 16932 } 16933 } 16934 matchElementsInTree(tree) { 16935 const { selector } = this; 16936 if (selector) { 16937 const match = this.matchElement(tree) ? [tree] : []; 16938 const matches2 = Array.from(tree.querySelectorAll(selector)).filter((match2) => this.matchElement(match2)); 16939 return match.concat(matches2); 16940 } else { 16941 return []; 16942 } 16943 } 16944 elementMatched(element) { 16945 const { selector } = this; 16946 if (selector) { 16947 this.selectorMatched(element, selector); 16948 } 16949 } 16950 elementUnmatched(element) { 16951 const selectors = this.matchesByElement.getKeysForValue(element); 16952 for (const selector of selectors) { 16953 this.selectorUnmatched(element, selector); 16954 } 16955 } 16956 elementAttributeChanged(element, _attributeName) { 16957 const { selector } = this; 16958 if (selector) { 16959 const matches2 = this.matchElement(element); 16960 const matchedBefore = this.matchesByElement.has(selector, element); 16961 if (matches2 && !matchedBefore) { 16962 this.selectorMatched(element, selector); 16963 } else if (!matches2 && matchedBefore) { 16964 this.selectorUnmatched(element, selector); 16965 } 16966 } 16967 } 16968 selectorMatched(element, selector) { 16969 this.delegate.selectorMatched(element, selector, this.details); 16970 this.matchesByElement.add(selector, element); 16971 } 16972 selectorUnmatched(element, selector) { 16973 this.delegate.selectorUnmatched(element, selector, this.details); 16974 this.matchesByElement.delete(selector, element); 16975 } 16976 }; 16977 var StringMapObserver = class { 16978 constructor(element, delegate2) { 16979 this.element = element; 16980 this.delegate = delegate2; 16981 this.started = false; 16982 this.stringMap = /* @__PURE__ */ new Map(); 16983 this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations)); 16984 } 16985 start() { 16986 if (!this.started) { 16987 this.started = true; 16988 this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true }); 16989 this.refresh(); 16990 } 16991 } 16992 stop() { 16993 if (this.started) { 16994 this.mutationObserver.takeRecords(); 16995 this.mutationObserver.disconnect(); 16996 this.started = false; 16997 } 16998 } 16999 refresh() { 17000 if (this.started) { 17001 for (const attributeName of this.knownAttributeNames) { 17002 this.refreshAttribute(attributeName, null); 17003 } 17004 } 17005 } 17006 processMutations(mutations) { 17007 if (this.started) { 17008 for (const mutation of mutations) { 17009 this.processMutation(mutation); 17010 } 17011 } 17012 } 17013 processMutation(mutation) { 17014 const attributeName = mutation.attributeName; 17015 if (attributeName) { 17016 this.refreshAttribute(attributeName, mutation.oldValue); 17017 } 17018 } 17019 refreshAttribute(attributeName, oldValue) { 17020 const key = this.delegate.getStringMapKeyForAttribute(attributeName); 17021 if (key != null) { 17022 if (!this.stringMap.has(attributeName)) { 17023 this.stringMapKeyAdded(key, attributeName); 17024 } 17025 const value = this.element.getAttribute(attributeName); 17026 if (this.stringMap.get(attributeName) != value) { 17027 this.stringMapValueChanged(value, key, oldValue); 17028 } 17029 if (value == null) { 17030 const oldValue2 = this.stringMap.get(attributeName); 17031 this.stringMap.delete(attributeName); 17032 if (oldValue2) 17033 this.stringMapKeyRemoved(key, attributeName, oldValue2); 17034 } else { 17035 this.stringMap.set(attributeName, value); 17036 } 17037 } 17038 } 17039 stringMapKeyAdded(key, attributeName) { 17040 if (this.delegate.stringMapKeyAdded) { 17041 this.delegate.stringMapKeyAdded(key, attributeName); 17042 } 17043 } 17044 stringMapValueChanged(value, key, oldValue) { 17045 if (this.delegate.stringMapValueChanged) { 17046 this.delegate.stringMapValueChanged(value, key, oldValue); 17047 } 17048 } 17049 stringMapKeyRemoved(key, attributeName, oldValue) { 17050 if (this.delegate.stringMapKeyRemoved) { 17051 this.delegate.stringMapKeyRemoved(key, attributeName, oldValue); 17052 } 17053 } 17054 get knownAttributeNames() { 17055 return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames))); 17056 } 17057 get currentAttributeNames() { 17058 return Array.from(this.element.attributes).map((attribute) => attribute.name); 17059 } 17060 get recordedAttributeNames() { 17061 return Array.from(this.stringMap.keys()); 17062 } 17063 }; 17064 var TokenListObserver = class { 17065 constructor(element, attributeName, delegate2) { 17066 this.attributeObserver = new AttributeObserver(element, attributeName, this); 17067 this.delegate = delegate2; 17068 this.tokensByElement = new Multimap(); 17069 } 17070 get started() { 17071 return this.attributeObserver.started; 17072 } 17073 start() { 17074 this.attributeObserver.start(); 17075 } 17076 pause(callback) { 17077 this.attributeObserver.pause(callback); 17078 } 17079 stop() { 17080 this.attributeObserver.stop(); 17081 } 17082 refresh() { 17083 this.attributeObserver.refresh(); 17084 } 17085 get element() { 17086 return this.attributeObserver.element; 17087 } 17088 get attributeName() { 17089 return this.attributeObserver.attributeName; 17090 } 17091 elementMatchedAttribute(element) { 17092 this.tokensMatched(this.readTokensForElement(element)); 17093 } 17094 elementAttributeValueChanged(element) { 17095 const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element); 17096 this.tokensUnmatched(unmatchedTokens); 17097 this.tokensMatched(matchedTokens); 17098 } 17099 elementUnmatchedAttribute(element) { 17100 this.tokensUnmatched(this.tokensByElement.getValuesForKey(element)); 17101 } 17102 tokensMatched(tokens) { 17103 tokens.forEach((token) => this.tokenMatched(token)); 17104 } 17105 tokensUnmatched(tokens) { 17106 tokens.forEach((token) => this.tokenUnmatched(token)); 17107 } 17108 tokenMatched(token) { 17109 this.delegate.tokenMatched(token); 17110 this.tokensByElement.add(token.element, token); 17111 } 17112 tokenUnmatched(token) { 17113 this.delegate.tokenUnmatched(token); 17114 this.tokensByElement.delete(token.element, token); 17115 } 17116 refreshTokensForElement(element) { 17117 const previousTokens = this.tokensByElement.getValuesForKey(element); 17118 const currentTokens = this.readTokensForElement(element); 17119 const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken)); 17120 if (firstDifferingIndex == -1) { 17121 return [[], []]; 17122 } else { 17123 return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)]; 17124 } 17125 } 17126 readTokensForElement(element) { 17127 const attributeName = this.attributeName; 17128 const tokenString = element.getAttribute(attributeName) || ""; 17129 return parseTokenString(tokenString, element, attributeName); 17130 } 17131 }; 17132 function parseTokenString(tokenString, element, attributeName) { 17133 return tokenString.trim().split(/\s+/).filter((content) => content.length).map((content, index4) => ({ element, attributeName, content, index: index4 })); 17134 } 17135 function zip(left2, right2) { 17136 const length = Math.max(left2.length, right2.length); 17137 return Array.from({ length }, (_4, index4) => [left2[index4], right2[index4]]); 17138 } 17139 function tokensAreEqual(left2, right2) { 17140 return left2 && right2 && left2.index == right2.index && left2.content == right2.content; 17141 } 17142 var ValueListObserver = class { 17143 constructor(element, attributeName, delegate2) { 17144 this.tokenListObserver = new TokenListObserver(element, attributeName, this); 17145 this.delegate = delegate2; 17146 this.parseResultsByToken = /* @__PURE__ */ new WeakMap(); 17147 this.valuesByTokenByElement = /* @__PURE__ */ new WeakMap(); 17148 } 17149 get started() { 17150 return this.tokenListObserver.started; 17151 } 17152 start() { 17153 this.tokenListObserver.start(); 17154 } 17155 stop() { 17156 this.tokenListObserver.stop(); 17157 } 17158 refresh() { 17159 this.tokenListObserver.refresh(); 17160 } 17161 get element() { 17162 return this.tokenListObserver.element; 17163 } 17164 get attributeName() { 17165 return this.tokenListObserver.attributeName; 17166 } 17167 tokenMatched(token) { 17168 const { element } = token; 17169 const { value } = this.fetchParseResultForToken(token); 17170 if (value) { 17171 this.fetchValuesByTokenForElement(element).set(token, value); 17172 this.delegate.elementMatchedValue(element, value); 17173 } 17174 } 17175 tokenUnmatched(token) { 17176 const { element } = token; 17177 const { value } = this.fetchParseResultForToken(token); 17178 if (value) { 17179 this.fetchValuesByTokenForElement(element).delete(token); 17180 this.delegate.elementUnmatchedValue(element, value); 17181 } 17182 } 17183 fetchParseResultForToken(token) { 17184 let parseResult = this.parseResultsByToken.get(token); 17185 if (!parseResult) { 17186 parseResult = this.parseToken(token); 17187 this.parseResultsByToken.set(token, parseResult); 17188 } 17189 return parseResult; 17190 } 17191 fetchValuesByTokenForElement(element) { 17192 let valuesByToken = this.valuesByTokenByElement.get(element); 17193 if (!valuesByToken) { 17194 valuesByToken = /* @__PURE__ */ new Map(); 17195 this.valuesByTokenByElement.set(element, valuesByToken); 17196 } 17197 return valuesByToken; 17198 } 17199 parseToken(token) { 17200 try { 17201 const value = this.delegate.parseValueForToken(token); 17202 return { value }; 17203 } catch (error2) { 17204 return { error: error2 }; 17205 } 17206 } 17207 }; 17208 var BindingObserver = class { 17209 constructor(context, delegate2) { 17210 this.context = context; 17211 this.delegate = delegate2; 17212 this.bindingsByAction = /* @__PURE__ */ new Map(); 17213 } 17214 start() { 17215 if (!this.valueListObserver) { 17216 this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this); 17217 this.valueListObserver.start(); 17218 } 17219 } 17220 stop() { 17221 if (this.valueListObserver) { 17222 this.valueListObserver.stop(); 17223 delete this.valueListObserver; 17224 this.disconnectAllActions(); 17225 } 17226 } 17227 get element() { 17228 return this.context.element; 17229 } 17230 get identifier() { 17231 return this.context.identifier; 17232 } 17233 get actionAttribute() { 17234 return this.schema.actionAttribute; 17235 } 17236 get schema() { 17237 return this.context.schema; 17238 } 17239 get bindings() { 17240 return Array.from(this.bindingsByAction.values()); 17241 } 17242 connectAction(action) { 17243 const binding = new Binding(this.context, action); 17244 this.bindingsByAction.set(action, binding); 17245 this.delegate.bindingConnected(binding); 17246 } 17247 disconnectAction(action) { 17248 const binding = this.bindingsByAction.get(action); 17249 if (binding) { 17250 this.bindingsByAction.delete(action); 17251 this.delegate.bindingDisconnected(binding); 17252 } 17253 } 17254 disconnectAllActions() { 17255 this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true)); 17256 this.bindingsByAction.clear(); 17257 } 17258 parseValueForToken(token) { 17259 const action = Action.forToken(token, this.schema); 17260 if (action.identifier == this.identifier) { 17261 return action; 17262 } 17263 } 17264 elementMatchedValue(element, action) { 17265 this.connectAction(action); 17266 } 17267 elementUnmatchedValue(element, action) { 17268 this.disconnectAction(action); 17269 } 17270 }; 17271 var ValueObserver = class { 17272 constructor(context, receiver) { 17273 this.context = context; 17274 this.receiver = receiver; 17275 this.stringMapObserver = new StringMapObserver(this.element, this); 17276 this.valueDescriptorMap = this.controller.valueDescriptorMap; 17277 } 17278 start() { 17279 this.stringMapObserver.start(); 17280 this.invokeChangedCallbacksForDefaultValues(); 17281 } 17282 stop() { 17283 this.stringMapObserver.stop(); 17284 } 17285 get element() { 17286 return this.context.element; 17287 } 17288 get controller() { 17289 return this.context.controller; 17290 } 17291 getStringMapKeyForAttribute(attributeName) { 17292 if (attributeName in this.valueDescriptorMap) { 17293 return this.valueDescriptorMap[attributeName].name; 17294 } 17295 } 17296 stringMapKeyAdded(key, attributeName) { 17297 const descriptor = this.valueDescriptorMap[attributeName]; 17298 if (!this.hasValue(key)) { 17299 this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue)); 17300 } 17301 } 17302 stringMapValueChanged(value, name, oldValue) { 17303 const descriptor = this.valueDescriptorNameMap[name]; 17304 if (value === null) 17305 return; 17306 if (oldValue === null) { 17307 oldValue = descriptor.writer(descriptor.defaultValue); 17308 } 17309 this.invokeChangedCallback(name, value, oldValue); 17310 } 17311 stringMapKeyRemoved(key, attributeName, oldValue) { 17312 const descriptor = this.valueDescriptorNameMap[key]; 17313 if (this.hasValue(key)) { 17314 this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue); 17315 } else { 17316 this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue); 17317 } 17318 } 17319 invokeChangedCallbacksForDefaultValues() { 17320 for (const { key, name, defaultValue, writer } of this.valueDescriptors) { 17321 if (defaultValue != void 0 && !this.controller.data.has(key)) { 17322 this.invokeChangedCallback(name, writer(defaultValue), void 0); 17323 } 17324 } 17325 } 17326 invokeChangedCallback(name, rawValue, rawOldValue) { 17327 const changedMethodName = `${name}Changed`; 17328 const changedMethod = this.receiver[changedMethodName]; 17329 if (typeof changedMethod == "function") { 17330 const descriptor = this.valueDescriptorNameMap[name]; 17331 try { 17332 const value = descriptor.reader(rawValue); 17333 let oldValue = rawOldValue; 17334 if (rawOldValue) { 17335 oldValue = descriptor.reader(rawOldValue); 17336 } 17337 changedMethod.call(this.receiver, value, oldValue); 17338 } catch (error2) { 17339 if (error2 instanceof TypeError) { 17340 error2.message = `Stimulus Value "${this.context.identifier}.${descriptor.name}" - ${error2.message}`; 17341 } 17342 throw error2; 17343 } 17344 } 17345 } 17346 get valueDescriptors() { 17347 const { valueDescriptorMap } = this; 17348 return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]); 17349 } 17350 get valueDescriptorNameMap() { 17351 const descriptors = {}; 17352 Object.keys(this.valueDescriptorMap).forEach((key) => { 17353 const descriptor = this.valueDescriptorMap[key]; 17354 descriptors[descriptor.name] = descriptor; 17355 }); 17356 return descriptors; 17357 } 17358 hasValue(attributeName) { 17359 const descriptor = this.valueDescriptorNameMap[attributeName]; 17360 const hasMethodName = `has${capitalize(descriptor.name)}`; 17361 return this.receiver[hasMethodName]; 17362 } 17363 }; 17364 var TargetObserver = class { 17365 constructor(context, delegate2) { 17366 this.context = context; 17367 this.delegate = delegate2; 17368 this.targetsByName = new Multimap(); 17369 } 17370 start() { 17371 if (!this.tokenListObserver) { 17372 this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this); 17373 this.tokenListObserver.start(); 17374 } 17375 } 17376 stop() { 17377 if (this.tokenListObserver) { 17378 this.disconnectAllTargets(); 17379 this.tokenListObserver.stop(); 17380 delete this.tokenListObserver; 17381 } 17382 } 17383 tokenMatched({ element, content: name }) { 17384 if (this.scope.containsElement(element)) { 17385 this.connectTarget(element, name); 17386 } 17387 } 17388 tokenUnmatched({ element, content: name }) { 17389 this.disconnectTarget(element, name); 17390 } 17391 connectTarget(element, name) { 17392 var _a; 17393 if (!this.targetsByName.has(name, element)) { 17394 this.targetsByName.add(name, element); 17395 (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name)); 17396 } 17397 } 17398 disconnectTarget(element, name) { 17399 var _a; 17400 if (this.targetsByName.has(name, element)) { 17401 this.targetsByName.delete(name, element); 17402 (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name)); 17403 } 17404 } 17405 disconnectAllTargets() { 17406 for (const name of this.targetsByName.keys) { 17407 for (const element of this.targetsByName.getValuesForKey(name)) { 17408 this.disconnectTarget(element, name); 17409 } 17410 } 17411 } 17412 get attributeName() { 17413 return `data-${this.context.identifier}-target`; 17414 } 17415 get element() { 17416 return this.context.element; 17417 } 17418 get scope() { 17419 return this.context.scope; 17420 } 17421 }; 17422 function readInheritableStaticArrayValues(constructor, propertyName) { 17423 const ancestors = getAncestorsForConstructor(constructor); 17424 return Array.from(ancestors.reduce((values, constructor2) => { 17425 getOwnStaticArrayValues(constructor2, propertyName).forEach((name) => values.add(name)); 17426 return values; 17427 }, /* @__PURE__ */ new Set())); 17428 } 17429 function readInheritableStaticObjectPairs(constructor, propertyName) { 17430 const ancestors = getAncestorsForConstructor(constructor); 17431 return ancestors.reduce((pairs, constructor2) => { 17432 pairs.push(...getOwnStaticObjectPairs(constructor2, propertyName)); 17433 return pairs; 17434 }, []); 17435 } 17436 function getAncestorsForConstructor(constructor) { 17437 const ancestors = []; 17438 while (constructor) { 17439 ancestors.push(constructor); 17440 constructor = Object.getPrototypeOf(constructor); 17441 } 17442 return ancestors.reverse(); 17443 } 17444 function getOwnStaticArrayValues(constructor, propertyName) { 17445 const definition = constructor[propertyName]; 17446 return Array.isArray(definition) ? definition : []; 17447 } 17448 function getOwnStaticObjectPairs(constructor, propertyName) { 17449 const definition = constructor[propertyName]; 17450 return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : []; 17451 } 17452 var OutletObserver = class { 17453 constructor(context, delegate2) { 17454 this.started = false; 17455 this.context = context; 17456 this.delegate = delegate2; 17457 this.outletsByName = new Multimap(); 17458 this.outletElementsByName = new Multimap(); 17459 this.selectorObserverMap = /* @__PURE__ */ new Map(); 17460 this.attributeObserverMap = /* @__PURE__ */ new Map(); 17461 } 17462 start() { 17463 if (!this.started) { 17464 this.outletDefinitions.forEach((outletName) => { 17465 this.setupSelectorObserverForOutlet(outletName); 17466 this.setupAttributeObserverForOutlet(outletName); 17467 }); 17468 this.started = true; 17469 this.dependentContexts.forEach((context) => context.refresh()); 17470 } 17471 } 17472 refresh() { 17473 this.selectorObserverMap.forEach((observer) => observer.refresh()); 17474 this.attributeObserverMap.forEach((observer) => observer.refresh()); 17475 } 17476 stop() { 17477 if (this.started) { 17478 this.started = false; 17479 this.disconnectAllOutlets(); 17480 this.stopSelectorObservers(); 17481 this.stopAttributeObservers(); 17482 } 17483 } 17484 stopSelectorObservers() { 17485 if (this.selectorObserverMap.size > 0) { 17486 this.selectorObserverMap.forEach((observer) => observer.stop()); 17487 this.selectorObserverMap.clear(); 17488 } 17489 } 17490 stopAttributeObservers() { 17491 if (this.attributeObserverMap.size > 0) { 17492 this.attributeObserverMap.forEach((observer) => observer.stop()); 17493 this.attributeObserverMap.clear(); 17494 } 17495 } 17496 selectorMatched(element, _selector, { outletName }) { 17497 const outlet = this.getOutlet(element, outletName); 17498 if (outlet) { 17499 this.connectOutlet(outlet, element, outletName); 17500 } 17501 } 17502 selectorUnmatched(element, _selector, { outletName }) { 17503 const outlet = this.getOutletFromMap(element, outletName); 17504 if (outlet) { 17505 this.disconnectOutlet(outlet, element, outletName); 17506 } 17507 } 17508 selectorMatchElement(element, { outletName }) { 17509 const selector = this.selector(outletName); 17510 const hasOutlet = this.hasOutlet(element, outletName); 17511 const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`); 17512 if (selector) { 17513 return hasOutlet && hasOutletController && element.matches(selector); 17514 } else { 17515 return false; 17516 } 17517 } 17518 elementMatchedAttribute(_element, attributeName) { 17519 const outletName = this.getOutletNameFromOutletAttributeName(attributeName); 17520 if (outletName) { 17521 this.updateSelectorObserverForOutlet(outletName); 17522 } 17523 } 17524 elementAttributeValueChanged(_element, attributeName) { 17525 const outletName = this.getOutletNameFromOutletAttributeName(attributeName); 17526 if (outletName) { 17527 this.updateSelectorObserverForOutlet(outletName); 17528 } 17529 } 17530 elementUnmatchedAttribute(_element, attributeName) { 17531 const outletName = this.getOutletNameFromOutletAttributeName(attributeName); 17532 if (outletName) { 17533 this.updateSelectorObserverForOutlet(outletName); 17534 } 17535 } 17536 connectOutlet(outlet, element, outletName) { 17537 var _a; 17538 if (!this.outletElementsByName.has(outletName, element)) { 17539 this.outletsByName.add(outletName, outlet); 17540 this.outletElementsByName.add(outletName, element); 17541 (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName)); 17542 } 17543 } 17544 disconnectOutlet(outlet, element, outletName) { 17545 var _a; 17546 if (this.outletElementsByName.has(outletName, element)) { 17547 this.outletsByName.delete(outletName, outlet); 17548 this.outletElementsByName.delete(outletName, element); 17549 (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName)); 17550 } 17551 } 17552 disconnectAllOutlets() { 17553 for (const outletName of this.outletElementsByName.keys) { 17554 for (const element of this.outletElementsByName.getValuesForKey(outletName)) { 17555 for (const outlet of this.outletsByName.getValuesForKey(outletName)) { 17556 this.disconnectOutlet(outlet, element, outletName); 17557 } 17558 } 17559 } 17560 } 17561 updateSelectorObserverForOutlet(outletName) { 17562 const observer = this.selectorObserverMap.get(outletName); 17563 if (observer) { 17564 observer.selector = this.selector(outletName); 17565 } 17566 } 17567 setupSelectorObserverForOutlet(outletName) { 17568 const selector = this.selector(outletName); 17569 const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName }); 17570 this.selectorObserverMap.set(outletName, selectorObserver); 17571 selectorObserver.start(); 17572 } 17573 setupAttributeObserverForOutlet(outletName) { 17574 const attributeName = this.attributeNameForOutletName(outletName); 17575 const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this); 17576 this.attributeObserverMap.set(outletName, attributeObserver); 17577 attributeObserver.start(); 17578 } 17579 selector(outletName) { 17580 return this.scope.outlets.getSelectorForOutletName(outletName); 17581 } 17582 attributeNameForOutletName(outletName) { 17583 return this.scope.schema.outletAttributeForScope(this.identifier, outletName); 17584 } 17585 getOutletNameFromOutletAttributeName(attributeName) { 17586 return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName); 17587 } 17588 get outletDependencies() { 17589 const dependencies = new Multimap(); 17590 this.router.modules.forEach((module) => { 17591 const constructor = module.definition.controllerConstructor; 17592 const outlets = readInheritableStaticArrayValues(constructor, "outlets"); 17593 outlets.forEach((outlet) => dependencies.add(outlet, module.identifier)); 17594 }); 17595 return dependencies; 17596 } 17597 get outletDefinitions() { 17598 return this.outletDependencies.getKeysForValue(this.identifier); 17599 } 17600 get dependentControllerIdentifiers() { 17601 return this.outletDependencies.getValuesForKey(this.identifier); 17602 } 17603 get dependentContexts() { 17604 const identifiers = this.dependentControllerIdentifiers; 17605 return this.router.contexts.filter((context) => identifiers.includes(context.identifier)); 17606 } 17607 hasOutlet(element, outletName) { 17608 return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName); 17609 } 17610 getOutlet(element, outletName) { 17611 return this.application.getControllerForElementAndIdentifier(element, outletName); 17612 } 17613 getOutletFromMap(element, outletName) { 17614 return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element); 17615 } 17616 get scope() { 17617 return this.context.scope; 17618 } 17619 get schema() { 17620 return this.context.schema; 17621 } 17622 get identifier() { 17623 return this.context.identifier; 17624 } 17625 get application() { 17626 return this.context.application; 17627 } 17628 get router() { 17629 return this.application.router; 17630 } 17631 }; 17632 var Context = class { 17633 constructor(module, scope) { 17634 this.logDebugActivity = (functionName, detail = {}) => { 17635 const { identifier, controller, element } = this; 17636 detail = Object.assign({ identifier, controller, element }, detail); 17637 this.application.logDebugActivity(this.identifier, functionName, detail); 17638 }; 17639 this.module = module; 17640 this.scope = scope; 17641 this.controller = new module.controllerConstructor(this); 17642 this.bindingObserver = new BindingObserver(this, this.dispatcher); 17643 this.valueObserver = new ValueObserver(this, this.controller); 17644 this.targetObserver = new TargetObserver(this, this); 17645 this.outletObserver = new OutletObserver(this, this); 17646 try { 17647 this.controller.initialize(); 17648 this.logDebugActivity("initialize"); 17649 } catch (error2) { 17650 this.handleError(error2, "initializing controller"); 17651 } 17652 } 17653 connect() { 17654 this.bindingObserver.start(); 17655 this.valueObserver.start(); 17656 this.targetObserver.start(); 17657 this.outletObserver.start(); 17658 try { 17659 this.controller.connect(); 17660 this.logDebugActivity("connect"); 17661 } catch (error2) { 17662 this.handleError(error2, "connecting controller"); 17663 } 17664 } 17665 refresh() { 17666 this.outletObserver.refresh(); 17667 } 17668 disconnect() { 17669 try { 17670 this.controller.disconnect(); 17671 this.logDebugActivity("disconnect"); 17672 } catch (error2) { 17673 this.handleError(error2, "disconnecting controller"); 17674 } 17675 this.outletObserver.stop(); 17676 this.targetObserver.stop(); 17677 this.valueObserver.stop(); 17678 this.bindingObserver.stop(); 17679 } 17680 get application() { 17681 return this.module.application; 17682 } 17683 get identifier() { 17684 return this.module.identifier; 17685 } 17686 get schema() { 17687 return this.application.schema; 17688 } 17689 get dispatcher() { 17690 return this.application.dispatcher; 17691 } 17692 get element() { 17693 return this.scope.element; 17694 } 17695 get parentElement() { 17696 return this.element.parentElement; 17697 } 17698 handleError(error2, message, detail = {}) { 17699 const { identifier, controller, element } = this; 17700 detail = Object.assign({ identifier, controller, element }, detail); 17701 this.application.handleError(error2, `Error ${message}`, detail); 17702 } 17703 targetConnected(element, name) { 17704 this.invokeControllerMethod(`${name}TargetConnected`, element); 17705 } 17706 targetDisconnected(element, name) { 17707 this.invokeControllerMethod(`${name}TargetDisconnected`, element); 17708 } 17709 outletConnected(outlet, element, name) { 17710 this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element); 17711 } 17712 outletDisconnected(outlet, element, name) { 17713 this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element); 17714 } 17715 invokeControllerMethod(methodName, ...args) { 17716 const controller = this.controller; 17717 if (typeof controller[methodName] == "function") { 17718 controller[methodName](...args); 17719 } 17720 } 17721 }; 17722 function bless(constructor) { 17723 return shadow(constructor, getBlessedProperties(constructor)); 17724 } 17725 function shadow(constructor, properties) { 17726 const shadowConstructor = extend2(constructor); 17727 const shadowProperties = getShadowProperties(constructor.prototype, properties); 17728 Object.defineProperties(shadowConstructor.prototype, shadowProperties); 17729 return shadowConstructor; 17730 } 17731 function getBlessedProperties(constructor) { 17732 const blessings = readInheritableStaticArrayValues(constructor, "blessings"); 17733 return blessings.reduce((blessedProperties, blessing) => { 17734 const properties = blessing(constructor); 17735 for (const key in properties) { 17736 const descriptor = blessedProperties[key] || {}; 17737 blessedProperties[key] = Object.assign(descriptor, properties[key]); 17738 } 17739 return blessedProperties; 17740 }, {}); 17741 } 17742 function getShadowProperties(prototype, properties) { 17743 return getOwnKeys(properties).reduce((shadowProperties, key) => { 17744 const descriptor = getShadowedDescriptor(prototype, properties, key); 17745 if (descriptor) { 17746 Object.assign(shadowProperties, { [key]: descriptor }); 17747 } 17748 return shadowProperties; 17749 }, {}); 17750 } 17751 function getShadowedDescriptor(prototype, properties, key) { 17752 const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key); 17753 const shadowedByValue = shadowingDescriptor && "value" in shadowingDescriptor; 17754 if (!shadowedByValue) { 17755 const descriptor = Object.getOwnPropertyDescriptor(properties, key).value; 17756 if (shadowingDescriptor) { 17757 descriptor.get = shadowingDescriptor.get || descriptor.get; 17758 descriptor.set = shadowingDescriptor.set || descriptor.set; 17759 } 17760 return descriptor; 17761 } 17762 } 17763 var getOwnKeys = (() => { 17764 if (typeof Object.getOwnPropertySymbols == "function") { 17765 return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)]; 17766 } else { 17767 return Object.getOwnPropertyNames; 17768 } 17769 })(); 17770 var extend2 = (() => { 17771 function extendWithReflect(constructor) { 17772 function extended() { 17773 return Reflect.construct(constructor, arguments, new.target); 17774 } 17775 extended.prototype = Object.create(constructor.prototype, { 17776 constructor: { value: extended } 17777 }); 17778 Reflect.setPrototypeOf(extended, constructor); 17779 return extended; 17780 } 17781 function testReflectExtension() { 17782 const a4 = function() { 17783 this.a.call(this); 17784 }; 17785 const b4 = extendWithReflect(a4); 17786 b4.prototype.a = function() { 17787 }; 17788 return new b4(); 17789 } 17790 try { 17791 testReflectExtension(); 17792 return extendWithReflect; 17793 } catch (error2) { 17794 return (constructor) => class extended extends constructor { 17795 }; 17796 } 17797 })(); 17798 function blessDefinition(definition) { 17799 return { 17800 identifier: definition.identifier, 17801 controllerConstructor: bless(definition.controllerConstructor) 17802 }; 17803 } 17804 var Module = class { 17805 constructor(application2, definition) { 17806 this.application = application2; 17807 this.definition = blessDefinition(definition); 17808 this.contextsByScope = /* @__PURE__ */ new WeakMap(); 17809 this.connectedContexts = /* @__PURE__ */ new Set(); 17810 } 17811 get identifier() { 17812 return this.definition.identifier; 17813 } 17814 get controllerConstructor() { 17815 return this.definition.controllerConstructor; 17816 } 17817 get contexts() { 17818 return Array.from(this.connectedContexts); 17819 } 17820 connectContextForScope(scope) { 17821 const context = this.fetchContextForScope(scope); 17822 this.connectedContexts.add(context); 17823 context.connect(); 17824 } 17825 disconnectContextForScope(scope) { 17826 const context = this.contextsByScope.get(scope); 17827 if (context) { 17828 this.connectedContexts.delete(context); 17829 context.disconnect(); 17830 } 17831 } 17832 fetchContextForScope(scope) { 17833 let context = this.contextsByScope.get(scope); 17834 if (!context) { 17835 context = new Context(this, scope); 17836 this.contextsByScope.set(scope, context); 17837 } 17838 return context; 17839 } 17840 }; 17841 var ClassMap = class { 17842 constructor(scope) { 17843 this.scope = scope; 17844 } 17845 has(name) { 17846 return this.data.has(this.getDataKey(name)); 17847 } 17848 get(name) { 17849 return this.getAll(name)[0]; 17850 } 17851 getAll(name) { 17852 const tokenString = this.data.get(this.getDataKey(name)) || ""; 17853 return tokenize(tokenString); 17854 } 17855 getAttributeName(name) { 17856 return this.data.getAttributeNameForKey(this.getDataKey(name)); 17857 } 17858 getDataKey(name) { 17859 return `${name}-class`; 17860 } 17861 get data() { 17862 return this.scope.data; 17863 } 17864 }; 17865 var DataMap = class { 17866 constructor(scope) { 17867 this.scope = scope; 17868 } 17869 get element() { 17870 return this.scope.element; 17871 } 17872 get identifier() { 17873 return this.scope.identifier; 17874 } 17875 get(key) { 17876 const name = this.getAttributeNameForKey(key); 17877 return this.element.getAttribute(name); 17878 } 17879 set(key, value) { 17880 const name = this.getAttributeNameForKey(key); 17881 this.element.setAttribute(name, value); 17882 return this.get(key); 17883 } 17884 has(key) { 17885 const name = this.getAttributeNameForKey(key); 17886 return this.element.hasAttribute(name); 17887 } 17888 delete(key) { 17889 if (this.has(key)) { 17890 const name = this.getAttributeNameForKey(key); 17891 this.element.removeAttribute(name); 17892 return true; 17893 } else { 17894 return false; 17895 } 17896 } 17897 getAttributeNameForKey(key) { 17898 return `data-${this.identifier}-${dasherize(key)}`; 17899 } 17900 }; 17901 var Guide = class { 17902 constructor(logger) { 17903 this.warnedKeysByObject = /* @__PURE__ */ new WeakMap(); 17904 this.logger = logger; 17905 } 17906 warn(object, key, message) { 17907 let warnedKeys = this.warnedKeysByObject.get(object); 17908 if (!warnedKeys) { 17909 warnedKeys = /* @__PURE__ */ new Set(); 17910 this.warnedKeysByObject.set(object, warnedKeys); 17911 } 17912 if (!warnedKeys.has(key)) { 17913 warnedKeys.add(key); 17914 this.logger.warn(message, object); 17915 } 17916 } 17917 }; 17918 function attributeValueContainsToken(attributeName, token) { 17919 return `[${attributeName}~="${token}"]`; 17920 } 17921 var TargetSet = class { 17922 constructor(scope) { 17923 this.scope = scope; 17924 } 17925 get element() { 17926 return this.scope.element; 17927 } 17928 get identifier() { 17929 return this.scope.identifier; 17930 } 17931 get schema() { 17932 return this.scope.schema; 17933 } 17934 has(targetName) { 17935 return this.find(targetName) != null; 17936 } 17937 find(...targetNames) { 17938 return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), void 0); 17939 } 17940 findAll(...targetNames) { 17941 return targetNames.reduce((targets, targetName) => [ 17942 ...targets, 17943 ...this.findAllTargets(targetName), 17944 ...this.findAllLegacyTargets(targetName) 17945 ], []); 17946 } 17947 findTarget(targetName) { 17948 const selector = this.getSelectorForTargetName(targetName); 17949 return this.scope.findElement(selector); 17950 } 17951 findAllTargets(targetName) { 17952 const selector = this.getSelectorForTargetName(targetName); 17953 return this.scope.findAllElements(selector); 17954 } 17955 getSelectorForTargetName(targetName) { 17956 const attributeName = this.schema.targetAttributeForScope(this.identifier); 17957 return attributeValueContainsToken(attributeName, targetName); 17958 } 17959 findLegacyTarget(targetName) { 17960 const selector = this.getLegacySelectorForTargetName(targetName); 17961 return this.deprecate(this.scope.findElement(selector), targetName); 17962 } 17963 findAllLegacyTargets(targetName) { 17964 const selector = this.getLegacySelectorForTargetName(targetName); 17965 return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName)); 17966 } 17967 getLegacySelectorForTargetName(targetName) { 17968 const targetDescriptor = `${this.identifier}.${targetName}`; 17969 return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor); 17970 } 17971 deprecate(element, targetName) { 17972 if (element) { 17973 const { identifier } = this; 17974 const attributeName = this.schema.targetAttribute; 17975 const revisedAttributeName = this.schema.targetAttributeForScope(identifier); 17976 this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}="${identifier}.${targetName}" with ${revisedAttributeName}="${targetName}". The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`); 17977 } 17978 return element; 17979 } 17980 get guide() { 17981 return this.scope.guide; 17982 } 17983 }; 17984 var OutletSet = class { 17985 constructor(scope, controllerElement) { 17986 this.scope = scope; 17987 this.controllerElement = controllerElement; 17988 } 17989 get element() { 17990 return this.scope.element; 17991 } 17992 get identifier() { 17993 return this.scope.identifier; 17994 } 17995 get schema() { 17996 return this.scope.schema; 17997 } 17998 has(outletName) { 17999 return this.find(outletName) != null; 18000 } 18001 find(...outletNames) { 18002 return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), void 0); 18003 } 18004 findAll(...outletNames) { 18005 return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []); 18006 } 18007 getSelectorForOutletName(outletName) { 18008 const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName); 18009 return this.controllerElement.getAttribute(attributeName); 18010 } 18011 findOutlet(outletName) { 18012 const selector = this.getSelectorForOutletName(outletName); 18013 if (selector) 18014 return this.findElement(selector, outletName); 18015 } 18016 findAllOutlets(outletName) { 18017 const selector = this.getSelectorForOutletName(outletName); 18018 return selector ? this.findAllElements(selector, outletName) : []; 18019 } 18020 findElement(selector, outletName) { 18021 const elements = this.scope.queryElements(selector); 18022 return elements.filter((element) => this.matchesElement(element, selector, outletName))[0]; 18023 } 18024 findAllElements(selector, outletName) { 18025 const elements = this.scope.queryElements(selector); 18026 return elements.filter((element) => this.matchesElement(element, selector, outletName)); 18027 } 18028 matchesElement(element, selector, outletName) { 18029 const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || ""; 18030 return element.matches(selector) && controllerAttribute.split(" ").includes(outletName); 18031 } 18032 }; 18033 var Scope = class { 18034 constructor(schema, element, identifier, logger) { 18035 this.targets = new TargetSet(this); 18036 this.classes = new ClassMap(this); 18037 this.data = new DataMap(this); 18038 this.containsElement = (element2) => { 18039 return element2.closest(this.controllerSelector) === this.element; 18040 }; 18041 this.schema = schema; 18042 this.element = element; 18043 this.identifier = identifier; 18044 this.guide = new Guide(logger); 18045 this.outlets = new OutletSet(this.documentScope, element); 18046 } 18047 findElement(selector) { 18048 return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement); 18049 } 18050 findAllElements(selector) { 18051 return [ 18052 ...this.element.matches(selector) ? [this.element] : [], 18053 ...this.queryElements(selector).filter(this.containsElement) 18054 ]; 18055 } 18056 queryElements(selector) { 18057 return Array.from(this.element.querySelectorAll(selector)); 18058 } 18059 get controllerSelector() { 18060 return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier); 18061 } 18062 get isDocumentScope() { 18063 return this.element === document.documentElement; 18064 } 18065 get documentScope() { 18066 return this.isDocumentScope ? this : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger); 18067 } 18068 }; 18069 var ScopeObserver = class { 18070 constructor(element, schema, delegate2) { 18071 this.element = element; 18072 this.schema = schema; 18073 this.delegate = delegate2; 18074 this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this); 18075 this.scopesByIdentifierByElement = /* @__PURE__ */ new WeakMap(); 18076 this.scopeReferenceCounts = /* @__PURE__ */ new WeakMap(); 18077 } 18078 start() { 18079 this.valueListObserver.start(); 18080 } 18081 stop() { 18082 this.valueListObserver.stop(); 18083 } 18084 get controllerAttribute() { 18085 return this.schema.controllerAttribute; 18086 } 18087 parseValueForToken(token) { 18088 const { element, content: identifier } = token; 18089 return this.parseValueForElementAndIdentifier(element, identifier); 18090 } 18091 parseValueForElementAndIdentifier(element, identifier) { 18092 const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element); 18093 let scope = scopesByIdentifier.get(identifier); 18094 if (!scope) { 18095 scope = this.delegate.createScopeForElementAndIdentifier(element, identifier); 18096 scopesByIdentifier.set(identifier, scope); 18097 } 18098 return scope; 18099 } 18100 elementMatchedValue(element, value) { 18101 const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1; 18102 this.scopeReferenceCounts.set(value, referenceCount); 18103 if (referenceCount == 1) { 18104 this.delegate.scopeConnected(value); 18105 } 18106 } 18107 elementUnmatchedValue(element, value) { 18108 const referenceCount = this.scopeReferenceCounts.get(value); 18109 if (referenceCount) { 18110 this.scopeReferenceCounts.set(value, referenceCount - 1); 18111 if (referenceCount == 1) { 18112 this.delegate.scopeDisconnected(value); 18113 } 18114 } 18115 } 18116 fetchScopesByIdentifierForElement(element) { 18117 let scopesByIdentifier = this.scopesByIdentifierByElement.get(element); 18118 if (!scopesByIdentifier) { 18119 scopesByIdentifier = /* @__PURE__ */ new Map(); 18120 this.scopesByIdentifierByElement.set(element, scopesByIdentifier); 18121 } 18122 return scopesByIdentifier; 18123 } 18124 }; 18125 var Router = class { 18126 constructor(application2) { 18127 this.application = application2; 18128 this.scopeObserver = new ScopeObserver(this.element, this.schema, this); 18129 this.scopesByIdentifier = new Multimap(); 18130 this.modulesByIdentifier = /* @__PURE__ */ new Map(); 18131 } 18132 get element() { 18133 return this.application.element; 18134 } 18135 get schema() { 18136 return this.application.schema; 18137 } 18138 get logger() { 18139 return this.application.logger; 18140 } 18141 get controllerAttribute() { 18142 return this.schema.controllerAttribute; 18143 } 18144 get modules() { 18145 return Array.from(this.modulesByIdentifier.values()); 18146 } 18147 get contexts() { 18148 return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []); 18149 } 18150 start() { 18151 this.scopeObserver.start(); 18152 } 18153 stop() { 18154 this.scopeObserver.stop(); 18155 } 18156 loadDefinition(definition) { 18157 this.unloadIdentifier(definition.identifier); 18158 const module = new Module(this.application, definition); 18159 this.connectModule(module); 18160 const afterLoad = definition.controllerConstructor.afterLoad; 18161 if (afterLoad) { 18162 afterLoad.call(definition.controllerConstructor, definition.identifier, this.application); 18163 } 18164 } 18165 unloadIdentifier(identifier) { 18166 const module = this.modulesByIdentifier.get(identifier); 18167 if (module) { 18168 this.disconnectModule(module); 18169 } 18170 } 18171 getContextForElementAndIdentifier(element, identifier) { 18172 const module = this.modulesByIdentifier.get(identifier); 18173 if (module) { 18174 return module.contexts.find((context) => context.element == element); 18175 } 18176 } 18177 proposeToConnectScopeForElementAndIdentifier(element, identifier) { 18178 const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier); 18179 if (scope) { 18180 this.scopeObserver.elementMatchedValue(scope.element, scope); 18181 } else { 18182 console.error(`Couldn't find or create scope for identifier: "${identifier}" and element:`, element); 18183 } 18184 } 18185 handleError(error2, message, detail) { 18186 this.application.handleError(error2, message, detail); 18187 } 18188 createScopeForElementAndIdentifier(element, identifier) { 18189 return new Scope(this.schema, element, identifier, this.logger); 18190 } 18191 scopeConnected(scope) { 18192 this.scopesByIdentifier.add(scope.identifier, scope); 18193 const module = this.modulesByIdentifier.get(scope.identifier); 18194 if (module) { 18195 module.connectContextForScope(scope); 18196 } 18197 } 18198 scopeDisconnected(scope) { 18199 this.scopesByIdentifier.delete(scope.identifier, scope); 18200 const module = this.modulesByIdentifier.get(scope.identifier); 18201 if (module) { 18202 module.disconnectContextForScope(scope); 18203 } 18204 } 18205 connectModule(module) { 18206 this.modulesByIdentifier.set(module.identifier, module); 18207 const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier); 18208 scopes.forEach((scope) => module.connectContextForScope(scope)); 18209 } 18210 disconnectModule(module) { 18211 this.modulesByIdentifier.delete(module.identifier); 18212 const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier); 18213 scopes.forEach((scope) => module.disconnectContextForScope(scope)); 18214 } 18215 }; 18216 var defaultSchema = { 18217 controllerAttribute: "data-controller", 18218 actionAttribute: "data-action", 18219 targetAttribute: "data-target", 18220 targetAttributeForScope: (identifier) => `data-${identifier}-target`, 18221 outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`, 18222 keyMappings: Object.assign(Object.assign({ enter: "Enter", tab: "Tab", esc: "Escape", space: " ", up: "ArrowUp", down: "ArrowDown", left: "ArrowLeft", right: "ArrowRight", home: "Home", end: "End", page_up: "PageUp", page_down: "PageDown" }, objectFromEntries("abcdefghijklmnopqrstuvwxyz".split("").map((c4) => [c4, c4]))), objectFromEntries("0123456789".split("").map((n3) => [n3, n3]))) 18223 }; 18224 function objectFromEntries(array) { 18225 return array.reduce((memo, [k4, v4]) => Object.assign(Object.assign({}, memo), { [k4]: v4 }), {}); 18226 } 18227 var Application = class { 18228 constructor(element = document.documentElement, schema = defaultSchema) { 18229 this.logger = console; 18230 this.debug = false; 18231 this.logDebugActivity = (identifier, functionName, detail = {}) => { 18232 if (this.debug) { 18233 this.logFormattedMessage(identifier, functionName, detail); 18234 } 18235 }; 18236 this.element = element; 18237 this.schema = schema; 18238 this.dispatcher = new Dispatcher(this); 18239 this.router = new Router(this); 18240 this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters); 18241 } 18242 static start(element, schema) { 18243 const application2 = new this(element, schema); 18244 application2.start(); 18245 return application2; 18246 } 18247 async start() { 18248 await domReady(); 18249 this.logDebugActivity("application", "starting"); 18250 this.dispatcher.start(); 18251 this.router.start(); 18252 this.logDebugActivity("application", "start"); 18253 } 18254 stop() { 18255 this.logDebugActivity("application", "stopping"); 18256 this.dispatcher.stop(); 18257 this.router.stop(); 18258 this.logDebugActivity("application", "stop"); 18259 } 18260 register(identifier, controllerConstructor) { 18261 this.load({ identifier, controllerConstructor }); 18262 } 18263 registerActionOption(name, filter) { 18264 this.actionDescriptorFilters[name] = filter; 18265 } 18266 load(head, ...rest) { 18267 const definitions = Array.isArray(head) ? head : [head, ...rest]; 18268 definitions.forEach((definition) => { 18269 if (definition.controllerConstructor.shouldLoad) { 18270 this.router.loadDefinition(definition); 18271 } 18272 }); 18273 } 18274 unload(head, ...rest) { 18275 const identifiers = Array.isArray(head) ? head : [head, ...rest]; 18276 identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier)); 18277 } 18278 get controllers() { 18279 return this.router.contexts.map((context) => context.controller); 18280 } 18281 getControllerForElementAndIdentifier(element, identifier) { 18282 const context = this.router.getContextForElementAndIdentifier(element, identifier); 18283 return context ? context.controller : null; 18284 } 18285 handleError(error2, message, detail) { 18286 var _a; 18287 this.logger.error(`%s 18288 18289%o 18290 18291%o`, message, error2, detail); 18292 (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, "", 0, 0, error2); 18293 } 18294 logFormattedMessage(identifier, functionName, detail = {}) { 18295 detail = Object.assign({ application: this }, detail); 18296 this.logger.groupCollapsed(`${identifier} #${functionName}`); 18297 this.logger.log("details:", Object.assign({}, detail)); 18298 this.logger.groupEnd(); 18299 } 18300 }; 18301 function domReady() { 18302 return new Promise((resolve) => { 18303 if (document.readyState == "loading") { 18304 document.addEventListener("DOMContentLoaded", () => resolve()); 18305 } else { 18306 resolve(); 18307 } 18308 }); 18309 } 18310 function ClassPropertiesBlessing(constructor) { 18311 const classes2 = readInheritableStaticArrayValues(constructor, "classes"); 18312 return classes2.reduce((properties, classDefinition) => { 18313 return Object.assign(properties, propertiesForClassDefinition(classDefinition)); 18314 }, {}); 18315 } 18316 function propertiesForClassDefinition(key) { 18317 return { 18318 [`${key}Class`]: { 18319 get() { 18320 const { classes: classes2 } = this; 18321 if (classes2.has(key)) { 18322 return classes2.get(key); 18323 } else { 18324 const attribute = classes2.getAttributeName(key); 18325 throw new Error(`Missing attribute "${attribute}"`); 18326 } 18327 } 18328 }, 18329 [`${key}Classes`]: { 18330 get() { 18331 return this.classes.getAll(key); 18332 } 18333 }, 18334 [`has${capitalize(key)}Class`]: { 18335 get() { 18336 return this.classes.has(key); 18337 } 18338 } 18339 }; 18340 } 18341 function OutletPropertiesBlessing(constructor) { 18342 const outlets = readInheritableStaticArrayValues(constructor, "outlets"); 18343 return outlets.reduce((properties, outletDefinition) => { 18344 return Object.assign(properties, propertiesForOutletDefinition(outletDefinition)); 18345 }, {}); 18346 } 18347 function getOutletController(controller, element, identifier) { 18348 return controller.application.getControllerForElementAndIdentifier(element, identifier); 18349 } 18350 function getControllerAndEnsureConnectedScope(controller, element, outletName) { 18351 let outletController = getOutletController(controller, element, outletName); 18352 if (outletController) 18353 return outletController; 18354 controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName); 18355 outletController = getOutletController(controller, element, outletName); 18356 if (outletController) 18357 return outletController; 18358 } 18359 function propertiesForOutletDefinition(name) { 18360 const camelizedName = namespaceCamelize(name); 18361 return { 18362 [`${camelizedName}Outlet`]: { 18363 get() { 18364 const outletElement = this.outlets.find(name); 18365 const selector = this.outlets.getSelectorForOutletName(name); 18366 if (outletElement) { 18367 const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name); 18368 if (outletController) 18369 return outletController; 18370 throw new Error(`The provided outlet element is missing an outlet controller "${name}" instance for host controller "${this.identifier}"`); 18371 } 18372 throw new Error(`Missing outlet element "${name}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${selector}".`); 18373 } 18374 }, 18375 [`${camelizedName}Outlets`]: { 18376 get() { 18377 const outlets = this.outlets.findAll(name); 18378 if (outlets.length > 0) { 18379 return outlets.map((outletElement) => { 18380 const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name); 18381 if (outletController) 18382 return outletController; 18383 console.warn(`The provided outlet element is missing an outlet controller "${name}" instance for host controller "${this.identifier}"`, outletElement); 18384 }).filter((controller) => controller); 18385 } 18386 return []; 18387 } 18388 }, 18389 [`${camelizedName}OutletElement`]: { 18390 get() { 18391 const outletElement = this.outlets.find(name); 18392 const selector = this.outlets.getSelectorForOutletName(name); 18393 if (outletElement) { 18394 return outletElement; 18395 } else { 18396 throw new Error(`Missing outlet element "${name}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${selector}".`); 18397 } 18398 } 18399 }, 18400 [`${camelizedName}OutletElements`]: { 18401 get() { 18402 return this.outlets.findAll(name); 18403 } 18404 }, 18405 [`has${capitalize(camelizedName)}Outlet`]: { 18406 get() { 18407 return this.outlets.has(name); 18408 } 18409 } 18410 }; 18411 } 18412 function TargetPropertiesBlessing(constructor) { 18413 const targets = readInheritableStaticArrayValues(constructor, "targets"); 18414 return targets.reduce((properties, targetDefinition) => { 18415 return Object.assign(properties, propertiesForTargetDefinition(targetDefinition)); 18416 }, {}); 18417 } 18418 function propertiesForTargetDefinition(name) { 18419 return { 18420 [`${name}Target`]: { 18421 get() { 18422 const target = this.targets.find(name); 18423 if (target) { 18424 return target; 18425 } else { 18426 throw new Error(`Missing target element "${name}" for "${this.identifier}" controller`); 18427 } 18428 } 18429 }, 18430 [`${name}Targets`]: { 18431 get() { 18432 return this.targets.findAll(name); 18433 } 18434 }, 18435 [`has${capitalize(name)}Target`]: { 18436 get() { 18437 return this.targets.has(name); 18438 } 18439 } 18440 }; 18441 } 18442 function ValuePropertiesBlessing(constructor) { 18443 const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, "values"); 18444 const propertyDescriptorMap = { 18445 valueDescriptorMap: { 18446 get() { 18447 return valueDefinitionPairs.reduce((result, valueDefinitionPair) => { 18448 const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier); 18449 const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key); 18450 return Object.assign(result, { [attributeName]: valueDescriptor }); 18451 }, {}); 18452 } 18453 } 18454 }; 18455 return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => { 18456 return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair)); 18457 }, propertyDescriptorMap); 18458 } 18459 function propertiesForValueDefinitionPair(valueDefinitionPair, controller) { 18460 const definition = parseValueDefinitionPair(valueDefinitionPair, controller); 18461 const { key, name, reader: read2, writer: write2 } = definition; 18462 return { 18463 [name]: { 18464 get() { 18465 const value = this.data.get(key); 18466 if (value !== null) { 18467 return read2(value); 18468 } else { 18469 return definition.defaultValue; 18470 } 18471 }, 18472 set(value) { 18473 if (value === void 0) { 18474 this.data.delete(key); 18475 } else { 18476 this.data.set(key, write2(value)); 18477 } 18478 } 18479 }, 18480 [`has${capitalize(name)}`]: { 18481 get() { 18482 return this.data.has(key) || definition.hasCustomDefaultValue; 18483 } 18484 } 18485 }; 18486 } 18487 function parseValueDefinitionPair([token, typeDefinition], controller) { 18488 return valueDescriptorForTokenAndTypeDefinition({ 18489 controller, 18490 token, 18491 typeDefinition 18492 }); 18493 } 18494 function parseValueTypeConstant(constant) { 18495 switch (constant) { 18496 case Array: 18497 return "array"; 18498 case Boolean: 18499 return "boolean"; 18500 case Number: 18501 return "number"; 18502 case Object: 18503 return "object"; 18504 case String: 18505 return "string"; 18506 } 18507 } 18508 function parseValueTypeDefault(defaultValue) { 18509 switch (typeof defaultValue) { 18510 case "boolean": 18511 return "boolean"; 18512 case "number": 18513 return "number"; 18514 case "string": 18515 return "string"; 18516 } 18517 if (Array.isArray(defaultValue)) 18518 return "array"; 18519 if (Object.prototype.toString.call(defaultValue) === "[object Object]") 18520 return "object"; 18521 } 18522 function parseValueTypeObject(payload) { 18523 const { controller, token, typeObject } = payload; 18524 const hasType = isSomething(typeObject.type); 18525 const hasDefault = isSomething(typeObject.default); 18526 const fullObject = hasType && hasDefault; 18527 const onlyType = hasType && !hasDefault; 18528 const onlyDefault = !hasType && hasDefault; 18529 const typeFromObject = parseValueTypeConstant(typeObject.type); 18530 const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default); 18531 if (onlyType) 18532 return typeFromObject; 18533 if (onlyDefault) 18534 return typeFromDefaultValue; 18535 if (typeFromObject !== typeFromDefaultValue) { 18536 const propertyPath = controller ? `${controller}.${token}` : token; 18537 throw new Error(`The specified default value for the Stimulus Value "${propertyPath}" must match the defined type "${typeFromObject}". The provided default value of "${typeObject.default}" is of type "${typeFromDefaultValue}".`); 18538 } 18539 if (fullObject) 18540 return typeFromObject; 18541 } 18542 function parseValueTypeDefinition(payload) { 18543 const { controller, token, typeDefinition } = payload; 18544 const typeObject = { controller, token, typeObject: typeDefinition }; 18545 const typeFromObject = parseValueTypeObject(typeObject); 18546 const typeFromDefaultValue = parseValueTypeDefault(typeDefinition); 18547 const typeFromConstant = parseValueTypeConstant(typeDefinition); 18548 const type = typeFromObject || typeFromDefaultValue || typeFromConstant; 18549 if (type) 18550 return type; 18551 const propertyPath = controller ? `${controller}.${typeDefinition}` : token; 18552 throw new Error(`Unknown value type "${propertyPath}" for "${token}" value`); 18553 } 18554 function defaultValueForDefinition(typeDefinition) { 18555 const constant = parseValueTypeConstant(typeDefinition); 18556 if (constant) 18557 return defaultValuesByType[constant]; 18558 const hasDefault = hasProperty(typeDefinition, "default"); 18559 const hasType = hasProperty(typeDefinition, "type"); 18560 const typeObject = typeDefinition; 18561 if (hasDefault) 18562 return typeObject.default; 18563 if (hasType) { 18564 const { type } = typeObject; 18565 const constantFromType = parseValueTypeConstant(type); 18566 if (constantFromType) 18567 return defaultValuesByType[constantFromType]; 18568 } 18569 return typeDefinition; 18570 } 18571 function valueDescriptorForTokenAndTypeDefinition(payload) { 18572 const { token, typeDefinition } = payload; 18573 const key = `${dasherize(token)}-value`; 18574 const type = parseValueTypeDefinition(payload); 18575 return { 18576 type, 18577 key, 18578 name: camelize(key), 18579 get defaultValue() { 18580 return defaultValueForDefinition(typeDefinition); 18581 }, 18582 get hasCustomDefaultValue() { 18583 return parseValueTypeDefault(typeDefinition) !== void 0; 18584 }, 18585 reader: readers[type], 18586 writer: writers[type] || writers.default 18587 }; 18588 } 18589 var defaultValuesByType = { 18590 get array() { 18591 return []; 18592 }, 18593 boolean: false, 18594 number: 0, 18595 get object() { 18596 return {}; 18597 }, 18598 string: "" 18599 }; 18600 var readers = { 18601 array(value) { 18602 const array = JSON.parse(value); 18603 if (!Array.isArray(array)) { 18604 throw new TypeError(`expected value of type "array" but instead got value "${value}" of type "${parseValueTypeDefault(array)}"`); 18605 } 18606 return array; 18607 }, 18608 boolean(value) { 18609 return !(value == "0" || String(value).toLowerCase() == "false"); 18610 }, 18611 number(value) { 18612 return Number(value.replace(/_/g, "")); 18613 }, 18614 object(value) { 18615 const object = JSON.parse(value); 18616 if (object === null || typeof object != "object" || Array.isArray(object)) { 18617 throw new TypeError(`expected value of type "object" but instead got value "${value}" of type "${parseValueTypeDefault(object)}"`); 18618 } 18619 return object; 18620 }, 18621 string(value) { 18622 return value; 18623 } 18624 }; 18625 var writers = { 18626 default: writeString, 18627 array: writeJSON, 18628 object: writeJSON 18629 }; 18630 function writeJSON(value) { 18631 return JSON.stringify(value); 18632 } 18633 function writeString(value) { 18634 return `${value}`; 18635 } 18636 var Controller = class { 18637 constructor(context) { 18638 this.context = context; 18639 } 18640 static get shouldLoad() { 18641 return true; 18642 } 18643 static afterLoad(_identifier, _application) { 18644 return; 18645 } 18646 get application() { 18647 return this.context.application; 18648 } 18649 get scope() { 18650 return this.context.scope; 18651 } 18652 get element() { 18653 return this.scope.element; 18654 } 18655 get identifier() { 18656 return this.scope.identifier; 18657 } 18658 get targets() { 18659 return this.scope.targets; 18660 } 18661 get outlets() { 18662 return this.scope.outlets; 18663 } 18664 get classes() { 18665 return this.scope.classes; 18666 } 18667 get data() { 18668 return this.scope.data; 18669 } 18670 initialize() { 18671 } 18672 connect() { 18673 } 18674 disconnect() { 18675 } 18676 dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true } = {}) { 18677 const type = prefix ? `${prefix}:${eventName}` : eventName; 18678 const event2 = new CustomEvent(type, { detail, bubbles, cancelable }); 18679 target.dispatchEvent(event2); 18680 return event2; 18681 } 18682 }; 18683 Controller.blessings = [ 18684 ClassPropertiesBlessing, 18685 TargetPropertiesBlessing, 18686 ValuePropertiesBlessing, 18687 OutletPropertiesBlessing 18688 ]; 18689 Controller.targets = []; 18690 Controller.outlets = []; 18691 Controller.values = {}; 18692 18693
18693// app/javascript/controllers/application.js 18694 var application = Application.start(); 18695 application.debug = false; 18696 window.Stimulus = application; 18697 18698
18698// app/javascript/controllers/action_text_character_limiter_controller.js 18699 var action_text_character_limiter_controller_default = class extends Controller { 18700 connect() { 18701 this.updateCounter(); 18702 this.inputTarget.addEventListener("input", this.updateCounter.bind(this)); 18703 this.inputTarget.addEventListener("paste", this.handlePaste.bind(this)); 18704 } 18705 disconnect() { 18706 this.inputTarget.removeEventListener("input", this.updateCounter.bind(this)); 18707 this.inputTarget.removeEventListener("paste", this.updateCounter.bind(this)); 18708 } 18709 handlePaste(event2) { 18710 const pastedText = (event2.clipboardData || window.clipboardData).getData("text"); 18711 const plainText = pastedText.replace(/<[^>]*>/g, ""); 18712 let currentLength = this.inputTarget.value.length; 18713 let remaining; 18714 if (currentLength) { 18715 remaining = 500 - currentLength; 18716 } 18717 if (plainText.length > remaining) { 18718 event2.preventDefault(); 18719 this.inputTarget.value += plainText.substring(0, remaining); 18720 this.updateCounter(); 18721 } else { 18722 this.inputTarget.value += plainText; 18723 this.updateCounter(); 18724 } 18725 } 18726 updateCounter() { 18727 let currentLength; 18728 let remaining; 18729 if (this.inputTarget.value) { 18730 const tempDiv = document.createElement("div"); 18731 tempDiv.innerHTML = this.inputTarget.value; 18732 const plainText = tempDiv.textContent || tempDiv.innerText || ""; 18733 currentLength = plainText.length; 18734 } 18735 if (currentLength) { 18736 remaining = 500 - currentLength; 18737 } else { 18738 remaining = 500; 18739 } 18740 this.counterTarget.textContent = `${remaining} characters remaining`; 18741 if (remaining < 0) { 18742 this.counterTarget.classList.add("text-red-500"); 18743 this.inputTarget.classList.add("border-red-500"); 18744 this.inputTarget.value = this.inputTarget.value.substring(0, 500); 18745 } else { 18746 this.counterTarget.classList.remove("text-red-500"); 18747 this.inputTarget.classList.remove("border-red-500"); 18748 } 18749 } 18750 }; 18751 __publicField(action_text_character_limiter_controller_default, "targets", ["input", "counter"]); 18752 18753
18753// app/javascript/controllers/activities_pika_controller.js 18754 var import_pikaday = __toESM(require_pikaday()); 18755 var activities_pika_controller_default = class extends Controller { 18756 connect() { 18757 const activitiesPicker = new import_pikaday.default({ 18758 field: document.getElementById("timetables_item_search_date"), 18759 bound: false, 18760 container: document.getElementById("activities-calendar") 18761 }); 18762 } 18763 }; 18764 18765
18765// app/javascript/controllers/adv_search_controller.js 18766 var adv_search_controller_default = class extends Controller { 18767 connect() { 18768 const modal = document.querySelector(".advanced-search-modal"); 18769 const content = document.querySelector(".advanced-search-modal__content"); 18770 modal.addEventListener("click", (e4) => { 18771 if (e4.target !== content) { 18772 modal.classList.remove("open"); 18773 } 18774 }); 18775 } 18776 open() { 18777 const modal = document.querySelector(".advanced-search-modal"); 18778 modal.classList.add("open"); 18779 } 18780 close() { 18781 const modal = document.querySelector(".advanced-search-modal"); 18782 modal.classList.remove("open"); 18783 } 18784 }; 18785 18786
18786// app/javascript/controllers/aft_occ_controller.js 18787 var aft_occ_controller_default = class extends Controller { 18788 connect() { 18789 let radio = this.element.querySelector("input[type=radio]"); 18790 let field; 18791 let endAfter = this.element.querySelector(".item-group__end-occurences"); 18792 let endOn = this.element.querySelector(".item-group__end-date"); 18793 if (endAfter) { 18794 field = this.element.querySelector("input[type=number]"); 18795 } else if (endOn) { 18796 field = this.element.querySelector("input[type=text]"); 18797 } 18798 field.addEventListener("change", () => { 18799 radio.checked = true; 18800 }); 18801 } 18802 }; 18803 18804
18804// app/javascript/controllers/alerts_controller.js 18805 var alerts_controller_default = class extends Controller { 18806 connect() { 18807 let alert2 = document.querySelector("section.alert"); 18808 let alertColor; 18809 let alertControls = document.querySelector(".alerts-holder>.grey-panel"); 18810 let alertRow = document.querySelector(".alerts-holder>div:nth-child(2)"); 18811 let toggleBtn = document.querySelector(".alerts-holder__btn"); 18812 if (alert2) { 18813 alertColor = window.getComputedStyle(alert2).backgroundColor; 18814 } 18815 if (alertControls) { 18816 if (alert2) { 18817 alertControls.style.backgroundColor = alertColor; 18818 } 18819 ; 18820 toggleBtn.addEventListener("click", () => { 18821 alertControls.classList.toggle("alert-controls--expanded"); 18822 alertRow.classList.toggle("alerts-row-expanded"); 18823 if (alertControls.style.backgroundColor == alertColor) { 18824 alertControls.style.backgroundColor = "white"; 18825 toggleBtn.innerHTML = "Hide Alerts"; 18826 } else { 18827 alertControls.style.backgroundColor = alertColor; 18828 toggleBtn.innerHTML = "Service updates are available at this location"; 18829 } 18830 ; 18831 }); 18832 } 18833 ; 18834 } 18835 }; 18836 18837
18837// app/javascript/controllers/alerts_toggle_controller.js 18838 var alerts_toggle_controller_default = class extends Controller { 18839 connect() { 18840 document.addEventListener("click", (e4) => { 18841 if (!this.btnTarget.contains(e4.target) && !this.modalTarget.contains(e4.target)) { 18842 this.close(); 18843 } 18844 }); 18845 } 18846 toggle() { 18847 this.modalTarget.classList.toggle("open"); 18848 } 18849 close() { 18850 this.modalTarget.classList.remove("open"); 18851 } 18852 }; 18853 __publicField(alerts_toggle_controller_default, "targets", ["modal", "btn"]); 18854 18855
18855// app/javascript/controllers/amount_amend_controller.js 18856 var amount_amend_controller_default = class extends Controller { 18857 connect() { 18858 if (this.inputTarget.value === "") { 18859 this.inputTarget.value = 0; 18860 } 18861 } 18862 decrease() { 18863 const submit = document.querySelector("input.btn"); 18864 if (this.inputTarget.value > 0) { 18865 this.inputTarget.value--; 18866 this.submit(); 18867 } 18868 } 18869 increase() { 18870 this.inputTarget.value++; 18871 this.submit(); 18872 } 18873 submit() { 18874 const submitEvent = new CustomEvent("submit", { bubbles: true, cancelable: true }); 18875 this.inputTarget.form.dispatchEvent(submitEvent); 18876 } 18877 }; 18878 __publicField(amount_amend_controller_default, "targets", ["input", "submit"]); 18879 18880
18880// app/javascript/controllers/asset_grid_controller.js 18881 var asset_grid_controller_default = class extends Controller { 18882 connect() { 18883 if (window.innerWidth >= 1023) { 18884 const imgs = document.querySelector(".multi-pane-video__asset-grid").querySelectorAll("img"); 18885 imgs.forEach((img) => { 18886 img.addEventListener("click", () => { 18887 img.classList.toggle("expanded"); 18888 }); 18889 }); 18890 } 18891 } 18892 }; 18893 18894
18894// app/javascript/controllers/attd_val_controller.js 18895 var attd_val_controller_default = class extends Controller { 18896 connect() { 18897 const input = this.element.querySelector("#spaces_finder_capacity"); 18898 const dummyInput = this.element.querySelector(".attendees__dummy"); 18899 const incr = this.element.querySelector(".attendees__incr"); 18900 const decr = this.element.querySelector(".attendees__decr"); 18901 let i4 = this.capacityValue; 18902 input.addEventListener("change", () => { 18903 i4 = input.value; 18904 dummyInput.value = input.value; 18905 }); 18906 dummyInput.addEventListener("change", () => { 18907 i4 = dummyInput.value; 18908 input.value = dummyInput.value; 18909 }); 18910 incr.addEventListener("click", () => { 18911 if (i4 < 150) { 18912 i4++; 18913 input.value = i4; 18914 dummyInput.value = i4; 18915 input.dispatchEvent(new Event("input", { bubbles: true })); 18916 } 18917 }); 18918 decr.addEventListener("click", () => { 18919 if (i4 >= 2) { 18920 i4--; 18921 input.value = i4; 18922 dummyInput.value = i4; 18923 input.dispatchEvent(new Event("input", { bubbles: true })); 18924 } 18925 }); 18926 } 18927 open() { 18928 this.modalTarget.classList.add("open"); 18929 } 18930 close() { 18931 this.modalTarget.classList.remove("open"); 18932 } 18933 }; 18934 __publicField(attd_val_controller_default, "values", { capacity: Number }); 18935 __publicField(attd_val_controller_default, "targets", ["modal"]); 18936 18937
18937// app/javascript/controllers/auto_submit_controller.js 18938 var auto_submit_controller_default = class extends Controller { 18939 submit(_event) { 18940 const form = this.formValue ? document.getElementById(this.formValue) : this.element; 18941 if (form?.requestSubmit) { 18942 form.requestSubmit(); 18943 } else { 18944 form?.submit(); 18945 } 18946 } 18947 }; 18948 __publicField(auto_submit_controller_default, "values", { form: String }); 18949 18950
18950// app/javascript/controllers/availability_all_day_toggle_controller.js 18951 var availability_all_day_toggle_controller_default = class extends Controller { 18952 connect() { 18953 } 18954 clearAllDay(event2) { 18955 this.allDayTarget.checked = false; 18956 } 18957 setAllDayTimes(event2) { 18958 if (this.allDayTarget.checked) { 18959 this.startHourTarget.value = "00"; 18960 this.startMinuteTarget.value = "00"; 18961 this.finishHourTarget.value = "23"; 18962 this.finishMinuteTarget.value = "59"; 18963 } 18964 } 18965 get startHourTarget() { 18966 return this.startTimeTarget.querySelector('select[id$="_4i"]'); 18967 } 18968 get startMinuteTarget() { 18969 return this.startTimeTarget.querySelector('select[id$="_5i"]'); 18970 } 18971 get finishHourTarget() { 18972 return this.finishTimeTarget.querySelector('select[id$="_4i"]'); 18973 } 18974 get finishMinuteTarget() { 18975 return this.finishTimeTarget.querySelector('select[id$="_5i"]'); 18976 } 18977 }; 18978 __publicField(availability_all_day_toggle_controller_default, "targets", ["allDay", "finishTime", "startTime"]); 18979 18980
18980// app/javascript/controllers/banner_img_controller.js 18981 var banner_img_controller_default = class extends Controller { 18982 connect() { 18983 this.containerTarget; 18984 const mobileImg = new String(this.containerTarget.getAttribute("data-image-url-mobile")); 18985 const tabletImg = new String(this.containerTarget.getAttribute("data-image-url-tablet")); 18986 const desktopImg = new String(this.containerTarget.getAttribute("data-image-url-desktop")); 18987 if (window.innerWidth > 1024) { 18988 if (desktopImg.length > 0) { 18989 this.containerTarget.style.backgroundImage = `url('${desktopImg}')`; 18990 } else if (tabletImg.length > 0) { 18991 this.containerTarget.style.backgroundImage = `url('${tabletImg}')`; 18992 } else { 18993 this.containerTarget.style.backgroundImage = `url('${mobileImg}')`; 18994 } 18995 } else if (window.innerWidth < 1025 && window.innerWidth > 501) { 18996 if (tabletImg.length > 0) { 18997 this.containerTarget.style.backgroundImage = `url('${tabletImg}')`; 18998 } else if (mobileImg.length > 0) { 18999 this.containerTarget.style.backgroundImage = `url('${mobileImg}')`; 19000 } else { 19001 this.containerTarget.style.backgroundImage = `url('${desktopImg}')`; 19002 } 19003 } else { 19004 if (mobileImg.length > 0) { 19005 this.containerTarget.style.backgroundImage = `url('${mobileImg}')`; 19006 } else if (tabletImg.length > 0) { 19007 this.containerTarget.style.backgroundImage = `url('${tabletImg}')`; 19008 } else { 19009 this.containerTarget.style.backgroundImage = `url('${desktopImg}')`; 19010 } 19011 } 19012 } 19013 }; 19014 __publicField(banner_img_controller_default, "targets", ["container"]); 19015 19016
19016// app/javascript/controllers/billing_address_form_controller.js 19017 var billing_address_form_controller_default = class extends Controller { 19018 connect() { 19019 this.blankForm(); 19020 } 19021 change(_event) { 19022 var value = this.billingAddressIdTarget.value; 19023 if (value === "") { 19024 this.showForm(); 19025 } else { 19026 this.hideForm(); 19027 } 19028 } 19029 blankForm() { 19030 this.firstnameTarget.value = ""; 19031 this.lastnameTarget.value = ""; 19032 this.emailTarget.value = ""; 19033 this.phoneTarget.value = ""; 19034 this.address1Target.value = ""; 19035 this.address2Target.value = ""; 19036 this.address3Target.value = ""; 19037 this.townTarget.value = ""; 19038 this.countyTarget.value = ""; 19039 this.postcodeTarget.value = ""; 19040 } 19041 hideForm() { 19042 this.firstnameWrapperTarget.classList.add("hidden"); 19043 this.lastnameWrapperTarget.classList.add("hidden"); 19044 this.emailWrapperTarget.classList.add("hidden"); 19045 this.phoneWrapperTarget.classList.add("hidden"); 19046 this.address1WrapperTarget.classList.add("hidden"); 19047 this.address2WrapperTarget.classList.add("hidden"); 19048 this.address3WrapperTarget.classList.add("hidden"); 19049 this.townWrapperTarget.classList.add("hidden"); 19050 this.countyWrapperTarget.classList.add("hidden"); 19051 this.postcodeWrapperTarget.classList.add("hidden"); 19052 this.blankForm(); 19053 } 19054 showForm() { 19055 this.firstnameWrapperTarget.classList.remove("hidden"); 19056 this.lastnameWrapperTarget.classList.remove("hidden"); 19057 this.emailWrapperTarget.classList.remove("hidden"); 19058 this.phoneWrapperTarget.classList.remove("hidden"); 19059 this.address1WrapperTarget.classList.remove("hidden"); 19060 this.address2WrapperTarget.classList.remove("hidden"); 19061 this.address3WrapperTarget.classList.remove("hidden"); 19062 this.townWrapperTarget.classList.remove("hidden"); 19063 this.countyWrapperTarget.classList.remove("hidden"); 19064 this.postcodeWrapperTarget.classList.remove("hidden"); 19065 } 19066 }; 19067 __publicField(billing_address_form_controller_default, "targets", ["id", "firstname", "lastname", "email", "phone", "address1", "address2", "address3", "town", "county", "postcode", "addressFields", "billingAddressId", "form", "firstnameWrapper", "lastnameWrapper", "emailWrapper", "phoneWrapper", "address1Wrapper", "address2Wrapper", "address3Wrapper", "townWrapper", "countyWrapper", "postcodeWrapper"]); 19068 19069
19069// app/javascript/controllers/blocked_delete_controller.js 19070 var blocked_delete_controller_default = class extends Controller { 19071 alert(event2) { 19072 event2.preventDefault(); 19073 window.alert(this.messageValue); 19074 } 19075 }; 19076 __publicField(blocked_delete_controller_default, "values", { message: String }); 19077 19078
19078// app/javascript/controllers/booking_button_enabler_controller.js 19079 var booking_button_enabler_controller_default = class extends Controller { 19080 connect() { 19081 this.checkInputs(); 19082 this.inputTargets.forEach((input) => { 19083 console.log(input, input.value); 19084 input.addEventListener("input", () => this.checkInputs()); 19085 input.addEventListener("change", () => this.checkInputs()); 19086 }); 19087 } 19088 checkInputs() { 19089 const allFilled = this.inputTargets.every((input) => input.value && input.value.trim() !== ""); 19090 if (allFilled) { 19091 this.buttonTarget.classList.remove("btn-disabled"); 19092 } else { 19093 this.buttonTarget.classList.add("btn-disabled"); 19094 } 19095 } 19096 }; 19097 __publicField(booking_button_enabler_controller_default, "targets", ["input", "button"]); 19098 19099
19099// app/javascript/controllers/borough_reload_controller.js 19100 var borough_reload_controller_default = class extends Controller { 19101 reload(event2) { 19102 const form = event2.target.closest("form"); 19103 const query = form?.querySelector('[name="prism_works_search[query]"]')?.value || ""; 19104 const params = new URLSearchParams({ 19105 "prism_works_search[borough_id]": event2.target.value, 19106 "prism_works_search[query]": query 19107 }); 19108 window.location.assign(`${this.urlValue}?${params}`); 19109 } 19110 }; 19111 __publicField(borough_reload_controller_default, "values", { url: String }); 19112 19113
19113// app/javascript/controllers/booking_form_controller.js 19114 var booking_form_controller_default = class extends Controller { 19115 connect() { 19116 const dateField = document.getElementById("booking_date"); 19117 const inputs = [...document.querySelectorAll("input:not([type=submit]):not([type=hidden]):not(.trix-input):not(.trix-button)")]; 19118 const selects = [...document.querySelectorAll("select")]; 19119 let formElements2 = inputs.concat(selects); 19120 const submit = document.querySelector("input.btn"); 19121 inputs.forEach((el) => { 19122 el.addEventListener("input", () => { 19123 submit.click(); 19124 }); 19125 }); 19126 selects.forEach((el) => { 19127 el.addEventListener("change", () => { 19128 submit.click(); 19129 }); 19130 }); 19131 const attendees = document.querySelector("#booking_attendee_count"); 19132 if (attendees.value == "") { 19133 attendees.value = 1; 19134 } 19135 } 19136 }; 19137 19138
19138// app/javascript/controllers/booking_form_section_controller.js 19139 var booking_form_section_controller_default = class extends Controller { 19140 connect() { 19141 this.formSectionTarget.value = "event_type"; 19142 } 19143 open(target) { 19144 target.classList.add("open"); 19145 target.classList.remove("closed"); 19146 } 19147 openDate() { 19148 this.open(this.dateBodyTarget); 19149 this.close(this.dateHeaderTarget); 19150 } 19151 openFloorplans() { 19152 this.formSectionTarget.value = "floorplans"; 19153 this.closeDate(); 19154 this.open(this.floorplansBodyTarget); 19155 this.close(this.floorplansHeaderTarget); 19156 } 19157 close(target) { 19158 target.classList.add("closed"); 19159 target.classList.remove("open"); 19160 } 19161 closeEventType() { 19162 this.close(this.eventTypeBodyTarget); 19163 this.open(this.eventTypeHeaderTarget); 19164 } 19165 closeDate() { 19166 this.close(this.dateBodyTarget); 19167 this.open(this.dateHeaderTarget); 19168 } 19169 closeFloorplans() { 19170 this.close(this.floorplansBodyTarget); 19171 this.open(this.floorplansHeaderTarget); 19172 } 19173 confirmEventType() { 19174 if (this.formSectionTarget.value === "event_type") { 19175 this.formSectionTarget.value = "date"; 19176 } 19177 this.closeEventType(); 19178 this.openDate(); 19179 } 19180 confirmDate() { 19181 if (this.formSectionTarget.value === "date") { 19182 this.formSectionTarget.value = "floorplans"; 19183 } 19184 this.closeDate(); 19185 this.openFloorplans(); 19186 } 19187 confirmFloorplans() { 19188 if (this.formSectionTarget.value = "floorplans") { 19189 this.formSectionTarget.value = "extras"; 19190 } 19191 this.closeFloorplans(); 19192 this.open(this.extrasBodyTarget); 19193 this.close(this.extrasHeaderTarget); 19194 } 19195 confirmExtras() { 19196 if (this.formSectionTarget.value === "extras") { 19197 this.formSectionTarget.value = ""; 19198 } 19199 this.close(this.extrasBodyTarget); 19200 this.open(this.extrasHeaderTarget); 19201 } 19202 keepExtras() { 19203 this.formSectionTarget.value = "extras"; 19204 } 19205 }; 19206 __publicField(booking_form_section_controller_default, "targets", [ 19207 "dateBody", 19208 "dateHeader", 19209 "extrasBody", 19210 "extrasHeader", 19211 "floorplansBody", 19212 "floorplansHeader", 19213 "formSection", 19214 "eventTypeBody", 19215 "eventTypeHeader" 19216 ]); 19217 19218
19218// app/javascript/controllers/booking_form_submit_button_controller.js 19219 var booking_form_submit_button_controller_default = class extends Controller { 19220 connect() { 19221 } 19222 removeCheckDate() { 19223 this.checkDateTarget.value = ""; 19224 } 19225 }; 19226 __publicField(booking_form_submit_button_controller_default, "targets", ["checkDate"]); 19227 19228
19228// app/javascript/controllers/booking_form_time_and_duration_button_enabler_controller.js 19229 var booking_form_time_and_duration_button_enabler_controller_default = class extends Controller { 19230 connect() { 19231 if (this.errorsTarget.innerHTML.trim() != "") { 19232 this.buttonTarget.classList.add("btn-disabled"); 19233 } 19234 } 19235 }; 19236 __publicField(booking_form_time_and_duration_button_enabler_controller_default, "targets", ["errors", "button"]); 19237 19238
19238// app/javascript/controllers/booking_summary_controller.js 19239 var booking_summary_controller_default = class extends Controller { 19240 connect() { 19241 } 19242 toggle() { 19243 this.element.classList.toggle("closed"); 19244 } 19245 }; 19246 19247
19247// app/javascript/controllers/booking_type_reason_controller.js 19248 var booking_type_reason_controller_default = class extends Controller { 19249 connect() { 19250 this.enableButton(); 19251 this.addManualConfirmationListener(); 19252 } 19253 toggleOtherReasonSection() { 19254 const required = this.reasonSelectTarget.options[this.reasonSelectTarget.selectedIndex].getAttribute("data-reason-required"); 19255 if (required === "true") { 19256 this.otherReasonSectionTarget.classList.add("open"); 19257 } else { 19258 this.otherReasonSectionTarget.classList.remove("open"); 19259 } 19260 this.updateSummarySelect(); 19261 } 19262 enableButton() { 19263 const required = this.reasonSelectTarget.options[this.reasonSelectTarget.selectedIndex].getAttribute("data-reason-required"); 19264 const selectValue = this.reasonSelectTarget.value; 19265 const reason = this.otherReasonInputTarget.value; 19266 const checkbox = this.manualConfirmationInputTarget.querySelector("#booking_manual_confirmation_understood"); 19267 const checkboxChecked = checkbox && checkbox.checked; 19268 if (selectValue && selectValue !== "" && required !== "true") { 19269 this.confirmButtonTarget.classList.remove("btn-disabled"); 19270 } else if (required == "true" && reason.trim() !== "" && checkboxChecked) { 19271 this.confirmButtonTarget.classList.remove("btn-disabled"); 19272 } else { 19273 this.confirmButtonTarget.classList.add("btn-disabled"); 19274 } 19275 } 19276 addManualConfirmationListener() { 19277 if (this.manualConfirmationInputTarget) { 19278 const checkbox = this.manualConfirmationInputTarget.querySelector("#booking_manual_confirmation_understood"); 19279 if (checkbox) { 19280 checkbox.addEventListener("change", () => this.enableButton()); 19281 } 19282 } 19283 } 19284 updateSummarySelect() { 19285 const selectedOption = this.reasonSelectTarget.options[this.reasonSelectTarget.selectedIndex]; 19286 const required = selectedOption.getAttribute("data-reason-required"); 19287 const value = selectedOption ? selectedOption.text : ""; 19288 this.summarySelectValueTarget.textContent = value; 19289 this.toggleSummarySelectContainer(value); 19290 this.toggleSummaryOtherInfoContainer(required); 19291 } 19292 toggleSummarySelectContainer(value) { 19293 if (value && value !== "" && value !== "Select...") { 19294 this.summarySelectContainerTarget.classList.add("open"); 19295 } else { 19296 this.summarySelectContainerTarget.classList.remove("open"); 19297 } 19298 } 19299 updateSummaryOtherInfo() { 19300 const info = this.otherReasonInputTarget.value.trim(); 19301 this.summaryOtherInfoValueTarget.textContent = info; 19302 this.toggleSummaryOtherInfoContainer(); 19303 } 19304 toggleSummaryOtherInfoContainer(required) { 19305 if (!required) { 19306 required = this.reasonSelectTarget.options[this.reasonSelectTarget.selectedIndex].getAttribute("data-reason-required"); 19307 } 19308 if (required === "true") { 19309 this.summaryOtherInfoContainerTarget.classList.add("open"); 19310 } else { 19311 this.summaryOtherInfoContainerTarget.classList.remove("open"); 19312 } 19313 } 19314 }; 19315 __publicField(booking_type_reason_controller_default, "targets", [ 19316 "reasonSelect", 19317 "otherReasonSection", 19318 "otherReasonInput", 19319 "manualConfirmationInput", 19320 "confirmButton", 19321 "summarySelectContainer", 19322 "summarySelectValue", 19323 "summaryOtherInfoContainer", 19324 "summaryOtherInfoValue" 19325 ]); 19326 19327
vendor: 16,340 bytes, lines 19327-19671
19327// node_modules/preact/dist/preact.module.js 19328 var n2; 19329 var l2; 19330 var u2; 19331 var i2; 19332 var t3; 19333 var r2; 19334 var o2; 19335 var f2; 19336 var e2; 19337 var c2 = {}; 19338 var s2 = []; 19339 var a2 = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; 19340 function h2(n3, l4) { 19341 for (var u4 in l4) 19342 n3[u4] = l4[u4]; 19343 return n3; 19344 } 19345 function v2(n3) { 19346 var l4 = n3.parentNode; 19347 l4 && l4.removeChild(n3); 19348 } 19349 function y2(l4, u4, i4) { 19350 var t5, r4, o3, f4 = {}; 19351 for (o3 in u4) 19352 "key" == o3 ? t5 = u4[o3] : "ref" == o3 ? r4 = u4[o3] : f4[o3] = u4[o3]; 19353 if (arguments.length > 2 && (f4.children = arguments.length > 3 ? n2.call(arguments, 2) : i4), "function" == typeof l4 && null != l4.defaultProps) 19354 for (o3 in l4.defaultProps) 19355 void 0 === f4[o3] && (f4[o3] = l4.defaultProps[o3]); 19356 return p2(l4, f4, t5, r4, null); 19357 } 19358 function p2(n3, i4, t5, r4, o3) { 19359 var f4 = { type: n3, props: i4, key: t5, ref: r4, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: null == o3 ? ++u2 : o3 }; 19360 return null == o3 && null != l2.vnode && l2.vnode(f4), f4; 19361 } 19362 function d2() { 19363 return { current: null }; 19364 } 19365 function _2(n3) { 19366 return n3.children; 19367 } 19368 function k2(n3, l4, u4, i4, t5) { 19369 var r4; 19370 for (r4 in u4) 19371 "children" === r4 || "key" === r4 || r4 in l4 || g2(n3, r4, null, u4[r4], i4); 19372 for (r4 in l4) 19373 t5 && "function" != typeof l4[r4] || "children" === r4 || "key" === r4 || "value" === r4 || "checked" === r4 || u4[r4] === l4[r4] || g2(n3, r4, l4[r4], u4[r4], i4); 19374 } 19375 function b2(n3, l4, u4) { 19376 "-" === l4[0] ? n3.setProperty(l4, null == u4 ? "" : u4) : n3[l4] = null == u4 ? "" : "number" != typeof u4 || a2.test(l4) ? u4 : u4 + "px"; 19377 } 19378 function g2(n3, l4, u4, i4, t5) { 19379 var r4; 19380 n: 19381 if ("style" === l4) 19382 if ("string" == typeof u4) 19383 n3.style.cssText = u4; 19384 else { 19385 if ("string" == typeof i4 && (n3.style.cssText = i4 = ""), i4) 19386 for (l4 in i4) 19387 u4 && l4 in u4 || b2(n3.style, l4, ""); 19388 if (u4) 19389 for (l4 in u4) 19390 i4 && u4[l4] === i4[l4] || b2(n3.style, l4, u4[l4]); 19391 } 19392 else if ("o" === l4[0] && "n" === l4[1]) 19393 r4 = l4 !== (l4 = l4.replace(/Capture$/, "")), l4 = l4.toLowerCase() in n3 ? l4.toLowerCase().slice(2) : l4.slice(2), n3.l || (n3.l = {}), n3.l[l4 + r4] = u4, u4 ? i4 || n3.addEventListener(l4, r4 ? w2 : m2, r4) : n3.removeEventListener(l4, r4 ? w2 : m2, r4); 19394 else if ("dangerouslySetInnerHTML" !== l4) { 19395 if (t5) 19396 l4 = l4.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s"); 19397 else if ("width" !== l4 && "height" !== l4 && "href" !== l4 && "list" !== l4 && "form" !== l4 && "tabIndex" !== l4 && "download" !== l4 && l4 in n3) 19398 try { 19399 n3[l4] = null == u4 ? "" : u4; 19400 break n; 19401 } catch (n4) { 19402 } 19403 "function" == typeof u4 || (null == u4 || false === u4 && -1 == l4.indexOf("-") ? n3.removeAttribute(l4) : n3.setAttribute(l4, u4)); 19404 } 19405 } 19406 function m2(n3) { 19407 t3 = true; 19408 try { 19409 return this.l[n3.type + false](l2.event ? l2.event(n3) : n3); 19410 } finally { 19411 t3 = false; 19412 } 19413 } 19414 function w2(n3) { 19415 t3 = true; 19416 try { 19417 return this.l[n3.type + true](l2.event ? l2.event(n3) : n3); 19418 } finally { 19419 t3 = false; 19420 } 19421 } 19422 function x2(n3, l4) { 19423 this.props = n3, this.context = l4; 19424 } 19425 function A2(n3, l4) { 19426 if (null == l4) 19427 return n3.__ ? A2(n3.__, n3.__.__k.indexOf(n3) + 1) : null; 19428 for (var u4; l4 < n3.__k.length; l4++) 19429 if (null != (u4 = n3.__k[l4]) && null != u4.__e) 19430 return u4.__e; 19431 return "function" == typeof n3.type ? A2(n3) : null; 19432 } 19433 function P2(n3) { 19434 var l4, u4; 19435 if (null != (n3 = n3.__) && null != n3.__c) { 19436 for (n3.__e = n3.__c.base = null, l4 = 0; l4 < n3.__k.length; l4++) 19437 if (null != (u4 = n3.__k[l4]) && null != u4.__e) { 19438 n3.__e = n3.__c.base = u4.__e; 19439 break; 19440 } 19441 return P2(n3); 19442 } 19443 } 19444 function C2(n3) { 19445 t3 ? setTimeout(n3) : f2(n3); 19446 } 19447 function T2(n3) { 19448 (!n3.__d && (n3.__d = true) && r2.push(n3) && !$2.__r++ || o2 !== l2.debounceRendering) && ((o2 = l2.debounceRendering) || C2)($2); 19449 } 19450 function $2() { 19451 var n3, l4, u4, i4, t5, o3, f4, e4; 19452 for (r2.sort(function(n4, l5) { 19453 return n4.__v.__b - l5.__v.__b; 19454 }); n3 = r2.shift(); ) 19455 n3.__d && (l4 = r2.length, i4 = void 0, t5 = void 0, f4 = (o3 = (u4 = n3).__v).__e, (e4 = u4.__P) && (i4 = [], (t5 = h2({}, o3)).__v = o3.__v + 1, M2(e4, o3, t5, u4.__n, void 0 !== e4.ownerSVGElement, null != o3.__h ? [f4] : null, i4, null == f4 ? A2(o3) : f4, o3.__h), N2(i4, o3), o3.__e != f4 && P2(o3)), r2.length > l4 && r2.sort(function(n4, l5) { 19456 return n4.__v.__b - l5.__v.__b; 19457 })); 19458 $2.__r = 0; 19459 } 19460 function H2(n3, l4, u4, i4, t5, r4, o3, f4, e4, a4) { 19461 var h4, v4, y4, d3, k4, b4, g5, m5 = i4 && i4.__k || s2, w5 = m5.length; 19462 for (u4.__k = [], h4 = 0; h4 < l4.length; h4++) 19463 if (null != (d3 = u4.__k[h4] = null == (d3 = l4[h4]) || "boolean" == typeof d3 ? null : "string" == typeof d3 || "number" == typeof d3 || "bigint" == typeof d3 ? p2(null, d3, null, null, d3) : Array.isArray(d3) ? p2(_2, { children: d3 }, null, null, null) : d3.__b > 0 ? p2(d3.type, d3.props, d3.key, d3.ref ? d3.ref : null, d3.__v) : d3)) { 19464 if (d3.__ = u4, d3.__b = u4.__b + 1, null === (y4 = m5[h4]) || y4 && d3.key == y4.key && d3.type === y4.type) 19465 m5[h4] = void 0; 19466 else 19467 for (v4 = 0; v4 < w5; v4++) { 19468 if ((y4 = m5[v4]) && d3.key == y4.key && d3.type === y4.type) { 19469 m5[v4] = void 0; 19470 break; 19471 } 19472 y4 = null; 19473 } 19474 M2(n3, d3, y4 = y4 || c2, t5, r4, o3, f4, e4, a4), k4 = d3.__e, (v4 = d3.ref) && y4.ref != v4 && (g5 || (g5 = []), y4.ref && g5.push(y4.ref, null, d3), g5.push(v4, d3.__c || k4, d3)), null != k4 ? (null == b4 && (b4 = k4), "function" == typeof d3.type && d3.__k === y4.__k ? d3.__d = e4 = I2(d3, e4, n3) : e4 = z2(n3, d3, y4, m5, k4, e4), "function" == typeof u4.type && (u4.__d = e4)) : e4 && y4.__e == e4 && e4.parentNode != n3 && (e4 = A2(y4)); 19475 } 19476 for (u4.__e = b4, h4 = w5; h4--; ) 19477 null != m5[h4] && ("function" == typeof u4.type && null != m5[h4].__e && m5[h4].__e == u4.__d && (u4.__d = L2(i4).nextSibling), q2(m5[h4], m5[h4])); 19478 if (g5) 19479 for (h4 = 0; h4 < g5.length; h4++) 19480 S2(g5[h4], g5[++h4], g5[++h4]); 19481 } 19482 function I2(n3, l4, u4) { 19483 for (var i4, t5 = n3.__k, r4 = 0; t5 && r4 < t5.length; r4++) 19484 (i4 = t5[r4]) && (i4.__ = n3, l4 = "function" == typeof i4.type ? I2(i4, l4, u4) : z2(u4, i4, i4, t5, i4.__e, l4)); 19485 return l4; 19486 } 19487 function j2(n3, l4) { 19488 return l4 = l4 || [], null == n3 || "boolean" == typeof n3 || (Array.isArray(n3) ? n3.some(function(n4) { 19489 j2(n4, l4); 19490 }) : l4.push(n3)), l4; 19491 } 19492 function z2(n3, l4, u4, i4, t5, r4) { 19493 var o3, f4, e4; 19494 if (void 0 !== l4.__d) 19495 o3 = l4.__d, l4.__d = void 0; 19496 else if (null == u4 || t5 != r4 || null == t5.parentNode) 19497 n: 19498 if (null == r4 || r4.parentNode !== n3) 19499 n3.appendChild(t5), o3 = null; 19500 else { 19501 for (f4 = r4, e4 = 0; (f4 = f4.nextSibling) && e4 < i4.length; e4 += 1) 19502 if (f4 == t5) 19503 break n; 19504 n3.insertBefore(t5, r4), o3 = r4; 19505 } 19506 return void 0 !== o3 ? o3 : t5.nextSibling; 19507 } 19508 function L2(n3) { 19509 var l4, u4, i4; 19510 if (null == n3.type || "string" == typeof n3.type) 19511 return n3.__e; 19512 if (n3.__k) { 19513 for (l4 = n3.__k.length - 1; l4 >= 0; l4--) 19514 if ((u4 = n3.__k[l4]) && (i4 = L2(u4))) 19515 return i4; 19516 } 19517 return null; 19518 } 19519 function M2(n3, u4, i4, t5, r4, o3, f4, e4, c4) { 19520 var s4, a4, v4, y4, p4, d3, k4, b4, g5, m5, w5, A4, P4, C4, T5, $5 = u4.type; 19521 if (void 0 !== u4.constructor) 19522 return null; 19523 null != i4.__h && (c4 = i4.__h, e4 = u4.__e = i4.__e, u4.__h = null, o3 = [e4]), (s4 = l2.__b) && s4(u4); 19524 try { 19525 n: 19526 if ("function" == typeof $5) { 19527 if (b4 = u4.props, g5 = (s4 = $5.contextType) && t5[s4.__c], m5 = s4 ? g5 ? g5.props.value : s4.__ : t5, i4.__c ? k4 = (a4 = u4.__c = i4.__c).__ = a4.__E : ("prototype" in $5 && $5.prototype.render ? u4.__c = a4 = new $5(b4, m5) : (u4.__c = a4 = new x2(b4, m5), a4.constructor = $5, a4.render = B2), g5 && g5.sub(a4), a4.props = b4, a4.state || (a4.state = {}), a4.context = m5, a4.__n = t5, v4 = a4.__d = true, a4.__h = [], a4._sb = []), null == a4.__s && (a4.__s = a4.state), null != $5.getDerivedStateFromProps && (a4.__s == a4.state && (a4.__s = h2({}, a4.__s)), h2(a4.__s, $5.getDerivedStateFromProps(b4, a4.__s))), y4 = a4.props, p4 = a4.state, a4.__v = u4, v4) 19528 null == $5.getDerivedStateFromProps && null != a4.componentWillMount && a4.componentWillMount(), null != a4.componentDidMount && a4.__h.push(a4.componentDidMount); 19529 else { 19530 if (null == $5.getDerivedStateFromProps && b4 !== y4 && null != a4.componentWillReceiveProps && a4.componentWillReceiveProps(b4, m5), !a4.__e && null != a4.shouldComponentUpdate && false === a4.shouldComponentUpdate(b4, a4.__s, m5) || u4.__v === i4.__v) { 19531 for (u4.__v !== i4.__v && (a4.props = b4, a4.state = a4.__s, a4.__d = false), u4.__e = i4.__e, u4.__k = i4.__k, u4.__k.forEach(function(n4) { 19532 n4 && (n4.__ = u4); 19533 }), w5 = 0; w5 < a4._sb.length; w5++) 19534 a4.__h.push(a4._sb[w5]); 19535 a4._sb = [], a4.__h.length && f4.push(a4); 19536 break n; 19537 } 19538 null != a4.componentWillUpdate && a4.componentWillUpdate(b4, a4.__s, m5), null != a4.componentDidUpdate && a4.__h.push(function() { 19539 a4.componentDidUpdate(y4, p4, d3); 19540 }); 19541 } 19542 if (a4.context = m5, a4.props = b4, a4.__P = n3, A4 = l2.__r, P4 = 0, "prototype" in $5 && $5.prototype.render) { 19543 for (a4.state = a4.__s, a4.__d = false, A4 && A4(u4), s4 = a4.render(a4.props, a4.state, a4.context), C4 = 0; C4 < a4._sb.length; C4++) 19544 a4.__h.push(a4._sb[C4]); 19545 a4._sb = []; 19546 } else 19547 do { 19548 a4.__d = false, A4 && A4(u4), s4 = a4.render(a4.props, a4.state, a4.context), a4.state = a4.__s; 19549 } while (a4.__d && ++P4 < 25); 19550 a4.state = a4.__s, null != a4.getChildContext && (t5 = h2(h2({}, t5), a4.getChildContext())), v4 || null == a4.getSnapshotBeforeUpdate || (d3 = a4.getSnapshotBeforeUpdate(y4, p4)), T5 = null != s4 && s4.type === _2 && null == s4.key ? s4.props.children : s4, H2(n3, Array.isArray(T5) ? T5 : [T5], u4, i4, t5, r4, o3, f4, e4, c4), a4.base = u4.__e, u4.__h = null, a4.__h.length && f4.push(a4), k4 && (a4.__E = a4.__ = null), a4.__e = false; 19551 } else 19552 null == o3 && u4.__v === i4.__v ? (u4.__k = i4.__k, u4.__e = i4.__e) : u4.__e = O2(i4.__e, u4, i4, t5, r4, o3, f4, c4); 19553 (s4 = l2.diffed) && s4(u4); 19554 } catch (n4) { 19555 u4.__v = null, (c4 || null != o3) && (u4.__e = e4, u4.__h = !!c4, o3[o3.indexOf(e4)] = null), l2.__e(n4, u4, i4); 19556 } 19557 } 19558 function N2(n3, u4) { 19559 l2.__c && l2.__c(u4, n3), n3.some(function(u5) { 19560 try { 19561 n3 = u5.__h, u5.__h = [], n3.some(function(n4) { 19562 n4.call(u5); 19563 }); 19564 } catch (n4) { 19565 l2.__e(n4, u5.__v); 19566 } 19567 }); 19568 } 19569 function O2(l4, u4, i4, t5, r4, o3, f4, e4) { 19570 var s4, a4, h4, y4 = i4.props, p4 = u4.props, d3 = u4.type, _4 = 0; 19571 if ("svg" === d3 && (r4 = true), null != o3) { 19572 for (; _4 < o3.length; _4++) 19573 if ((s4 = o3[_4]) && "setAttribute" in s4 == !!d3 && (d3 ? s4.localName === d3 : 3 === s4.nodeType)) { 19574 l4 = s4, o3[_4] = null; 19575 break; 19576 } 19577 } 19578 if (null == l4) { 19579 if (null === d3) 19580 return document.createTextNode(p4); 19581 l4 = r4 ? document.createElementNS("http://www.w3.org/2000/svg", d3) : document.createElement(d3, p4.is && p4), o3 = null, e4 = false; 19582 } 19583 if (null === d3) 19584 y4 === p4 || e4 && l4.data === p4 || (l4.data = p4); 19585 else { 19586 if (o3 = o3 && n2.call(l4.childNodes), a4 = (y4 = i4.props || c2).dangerouslySetInnerHTML, h4 = p4.dangerouslySetInnerHTML, !e4) { 19587 if (null != o3) 19588 for (y4 = {}, _4 = 0; _4 < l4.attributes.length; _4++) 19589 y4[l4.attributes[_4].name] = l4.attributes[_4].value; 19590 (h4 || a4) && (h4 && (a4 && h4.__html == a4.__html || h4.__html === l4.innerHTML) || (l4.innerHTML = h4 && h4.__html || "")); 19591 } 19592 if (k2(l4, p4, y4, r4, e4), h4) 19593 u4.__k = []; 19594 else if (_4 = u4.props.children, H2(l4, Array.isArray(_4) ? _4 : [_4], u4, i4, t5, r4 && "foreignObject" !== d3, o3, f4, o3 ? o3[0] : i4.__k && A2(i4, 0), e4), null != o3) 19595 for (_4 = o3.length; _4--; ) 19596 null != o3[_4] && v2(o3[_4]); 19597 e4 || ("value" in p4 && void 0 !== (_4 = p4.value) && (_4 !== l4.value || "progress" === d3 && !_4 || "option" === d3 && _4 !== y4.value) && g2(l4, "value", _4, y4.value, false), "checked" in p4 && void 0 !== (_4 = p4.checked) && _4 !== l4.checked && g2(l4, "checked", _4, y4.checked, false)); 19598 } 19599 return l4; 19600 } 19601 function S2(n3, u4, i4) { 19602 try { 19603 "function" == typeof n3 ? n3(u4) : n3.current = u4; 19604 } catch (n4) { 19605 l2.__e(n4, i4); 19606 } 19607 } 19608 function q2(n3, u4, i4) { 19609 var t5, r4; 19610 if (l2.unmount && l2.unmount(n3), (t5 = n3.ref) && (t5.current && t5.current !== n3.__e || S2(t5, null, u4)), null != (t5 = n3.__c)) { 19611 if (t5.componentWillUnmount) 19612 try { 19613 t5.componentWillUnmount(); 19614 } catch (n4) { 19615 l2.__e(n4, u4); 19616 } 19617 t5.base = t5.__P = null, n3.__c = void 0; 19618 } 19619 if (t5 = n3.__k) 19620 for (r4 = 0; r4 < t5.length; r4++) 19621 t5[r4] && q2(t5[r4], u4, i4 || "function" != typeof n3.type); 19622 i4 || null == n3.__e || v2(n3.__e), n3.__ = n3.__e = n3.__d = void 0; 19623 } 19624 function B2(n3, l4, u4) { 19625 return this.constructor(n3, u4); 19626 } 19627 function D2(u4, i4, t5) { 19628 var r4, o3, f4; 19629 l2.__ && l2.__(u4, i4), o3 = (r4 = "function" == typeof t5) ? null : t5 && t5.__k || i4.__k, f4 = [], M2(i4, u4 = (!r4 && t5 || i4).__k = y2(_2, null, [u4]), o3 || c2, c2, void 0 !== i4.ownerSVGElement, !r4 && t5 ? [t5] : o3 ? null : i4.firstChild ? n2.call(i4.childNodes) : null, f4, !r4 && t5 ? t5 : o3 ? o3.__e : i4.firstChild, r4), N2(f4, u4); 19630 } 19631 function G2(n3, l4) { 19632 var u4 = { __c: l4 = "__cC" + e2++, __: n3, Consumer: function(n4, l5) { 19633 return n4.children(l5); 19634 }, Provider: function(n4) { 19635 var u5, i4; 19636 return this.getChildContext || (u5 = [], (i4 = {})[l4] = this, this.getChildContext = function() { 19637 return i4; 19638 }, this.shouldComponentUpdate = function(n5) { 19639 this.props.value !== n5.value && u5.some(function(n6) { 19640 n6.__e = true, T2(n6); 19641 }); 19642 }, this.sub = function(n5) { 19643 u5.push(n5); 19644 var l5 = n5.componentWillUnmount; 19645 n5.componentWillUnmount = function() { 19646 u5.splice(u5.indexOf(n5), 1), l5 && l5.call(n5); 19647 }; 19648 }), n4.children; 19649 } }; 19650 return u4.Provider.__ = u4.Consumer.contextType = u4; 19651 } 19652 n2 = s2.slice, l2 = { __e: function(n3, l4, u4, i4) { 19653 for (var t5, r4, o3; l4 = l4.__; ) 19654 if ((t5 = l4.__c) && !t5.__) 19655 try { 19656 if ((r4 = t5.constructor) && null != r4.getDerivedStateFromError && (t5.setState(r4.getDerivedStateFromError(n3)), o3 = t5.__d), null != t5.componentDidCatch && (t5.componentDidCatch(n3, i4 || {}), o3 = t5.__d), o3) 19657 return t5.__E = t5; 19658 } catch (l5) { 19659 n3 = l5; 19660 } 19661 throw n3; 19662 } }, u2 = 0, i2 = function(n3) { 19663 return null != n3 && void 0 === n3.constructor; 19664 }, t3 = false, x2.prototype.setState = function(n3, l4) { 19665 var u4; 19666 u4 = null != this.__s && this.__s !== this.state ? this.__s : this.__s = h2({}, this.state), "function" == typeof n3 && (n3 = n3(h2({}, u4), this.props)), n3 && h2(u4, n3), null != n3 && this.__v && (l4 && this._sb.push(l4), T2(this)); 19667 }, x2.prototype.forceUpdate = function(n3) { 19668 this.__v && (this.__e = true, n3 && this.__h.push(n3), T2(this)); 19669 }, x2.prototype.render = _2, r2 = [], f2 = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, $2.__r = 0, e2 = 0; 19670 19671
vendor: 2,272 bytes, lines 19671-19745
19671// node_modules/preact/hooks/dist/hooks.module.js 19672 var t4; 19673 var r3; 19674 var u3; 19675 var i3; 19676 var f3 = []; 19677 var c3 = []; 19678 var e3 = l2.__b; 19679 var a3 = l2.__r; 19680 var v3 = l2.diffed; 19681 var l3 = l2.__c; 19682 var m3 = l2.unmount; 19683 function b3() { 19684 for (var t5; t5 = f3.shift(); ) 19685 if (t5.__P && t5.__H) 19686 try { 19687 t5.__H.__h.forEach(k3), t5.__H.__h.forEach(w3), t5.__H.__h = []; 19688 } catch (r4) { 19689 t5.__H.__h = [], l2.__e(r4, t5.__v); 19690 } 19691 } 19692 l2.__b = function(n3) { 19693 r3 = null, e3 && e3(n3); 19694 }, l2.__r = function(n3) { 19695 a3 && a3(n3), t4 = 0; 19696 var i4 = (r3 = n3.__c).__H; 19697 i4 && (u3 === r3 ? (i4.__h = [], r3.__h = [], i4.__.forEach(function(n4) { 19698 n4.__N && (n4.__ = n4.__N), n4.__V = c3, n4.__N = n4.i = void 0; 19699 })) : (i4.__h.forEach(k3), i4.__h.forEach(w3), i4.__h = [])), u3 = r3; 19700 }, l2.diffed = function(t5) { 19701 v3 && v3(t5); 19702 var o3 = t5.__c; 19703 o3 && o3.__H && (o3.__H.__h.length && (1 !== f3.push(o3) && i3 === l2.requestAnimationFrame || ((i3 = l2.requestAnimationFrame) || j3)(b3)), o3.__H.__.forEach(function(n3) { 19704 n3.i && (n3.__H = n3.i), n3.__V !== c3 && (n3.__ = n3.__V), n3.i = void 0, n3.__V = c3; 19705 })), u3 = r3 = null; 19706 }, l2.__c = function(t5, r4) { 19707 r4.some(function(t6) { 19708 try { 19709 t6.__h.forEach(k3), t6.__h = t6.__h.filter(function(n3) { 19710 return !n3.__ || w3(n3); 19711 }); 19712 } catch (u4) { 19713 r4.some(function(n3) { 19714 n3.__h && (n3.__h = []); 19715 }), r4 = [], l2.__e(u4, t6.__v); 19716 } 19717 }), l3 && l3(t5, r4); 19718 }, l2.unmount = function(t5) { 19719 m3 && m3(t5); 19720 var r4, u4 = t5.__c; 19721 u4 && u4.__H && (u4.__H.__.forEach(function(n3) { 19722 try { 19723 k3(n3); 19724 } catch (n4) { 19725 r4 = n4; 19726 } 19727 }), u4.__H = void 0, r4 && l2.__e(r4, u4.__v)); 19728 }; 19729 var g3 = "function" == typeof requestAnimationFrame; 19730 function j3(n3) { 19731 var t5, r4 = function() { 19732 clearTimeout(u4), g3 && cancelAnimationFrame(t5), setTimeout(n3); 19733 }, u4 = setTimeout(r4, 100); 19734 g3 && (t5 = requestAnimationFrame(r4)); 19735 } 19736 function k3(n3) { 19737 var t5 = r3, u4 = n3.__c; 19738 "function" == typeof u4 && (n3.__c = void 0, u4()), r3 = t5; 19739 } 19740 function w3(n3) { 19741 var t5 = r3; 19742 n3.__c = n3.__(), r3 = t5; 19743 } 19744 19745
vendor: 8,323 bytes, lines 19745-19941
19745// node_modules/preact/compat/dist/compat.module.js 19746 function g4(n3, t5) { 19747 for (var e4 in t5) 19748 n3[e4] = t5[e4]; 19749 return n3; 19750 } 19751 function C3(n3, t5) { 19752 for (var e4 in n3) 19753 if ("__source" !== e4 && !(e4 in t5)) 19754 return true; 19755 for (var r4 in t5) 19756 if ("__source" !== r4 && n3[r4] !== t5[r4]) 19757 return true; 19758 return false; 19759 } 19760 function w4(n3) { 19761 this.props = n3; 19762 } 19763 (w4.prototype = new x2()).isPureReactComponent = true, w4.prototype.shouldComponentUpdate = function(n3, t5) { 19764 return C3(this.props, n3) || C3(this.state, t5); 19765 }; 19766 var x4 = l2.__b; 19767 l2.__b = function(n3) { 19768 n3.type && n3.type.__f && n3.ref && (n3.props.ref = n3.ref, n3.ref = null), x4 && x4(n3); 19769 }; 19770 var N3 = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.forward_ref") || 3911; 19771 var T4 = l2.__e; 19772 l2.__e = function(n3, t5, e4, r4) { 19773 if (n3.then) { 19774 for (var u4, o3 = t5; o3 = o3.__; ) 19775 if ((u4 = o3.__c) && u4.__c) 19776 return null == t5.__e && (t5.__e = e4.__e, t5.__k = e4.__k), u4.__c(n3, t5); 19777 } 19778 T4(n3, t5, e4, r4); 19779 }; 19780 var I3 = l2.unmount; 19781 function L3(n3, t5, e4) { 19782 return n3 && (n3.__c && n3.__c.__H && (n3.__c.__H.__.forEach(function(n4) { 19783 "function" == typeof n4.__c && n4.__c(); 19784 }), n3.__c.__H = null), null != (n3 = g4({}, n3)).__c && (n3.__c.__P === e4 && (n3.__c.__P = t5), n3.__c = null), n3.__k = n3.__k && n3.__k.map(function(n4) { 19785 return L3(n4, t5, e4); 19786 })), n3; 19787 } 19788 function U2(n3, t5, e4) { 19789 return n3 && (n3.__v = null, n3.__k = n3.__k && n3.__k.map(function(n4) { 19790 return U2(n4, t5, e4); 19791 }), n3.__c && n3.__c.__P === t5 && (n3.__e && e4.insertBefore(n3.__e, n3.__d), n3.__c.__e = true, n3.__c.__P = e4)), n3; 19792 } 19793 function D3() { 19794 this.__u = 0, this.t = null, this.__b = null; 19795 } 19796 function F4(n3) { 19797 var t5 = n3.__.__c; 19798 return t5 && t5.__a && t5.__a(n3); 19799 } 19800 function V3() { 19801 this.u = null, this.o = null; 19802 } 19803 l2.unmount = function(n3) { 19804 var t5 = n3.__c; 19805 t5 && t5.__R && t5.__R(), t5 && true === n3.__h && (n3.type = null), I3 && I3(n3); 19806 }, (D3.prototype = new x2()).__c = function(n3, t5) { 19807 var e4 = t5.__c, r4 = this; 19808 null == r4.t && (r4.t = []), r4.t.push(e4); 19809 var u4 = F4(r4.__v), o3 = false, i4 = function() { 19810 o3 || (o3 = true, e4.__R = null, u4 ? u4(l4) : l4()); 19811 }; 19812 e4.__R = i4; 19813 var l4 = function() { 19814 if (!--r4.__u) { 19815 if (r4.state.__a) { 19816 var n4 = r4.state.__a; 19817 r4.__v.__k[0] = U2(n4, n4.__c.__P, n4.__c.__O); 19818 } 19819 var t6; 19820 for (r4.setState({ __a: r4.__b = null }); t6 = r4.t.pop(); ) 19821 t6.forceUpdate(); 19822 } 19823 }, c4 = true === t5.__h; 19824 r4.__u++ || c4 || r4.setState({ __a: r4.__b = r4.__v.__k[0] }), n3.then(i4, i4); 19825 }, D3.prototype.componentWillUnmount = function() { 19826 this.t = []; 19827 }, D3.prototype.render = function(n3, e4) { 19828 if (this.__b) { 19829 if (this.__v.__k) { 19830 var r4 = document.createElement("div"), o3 = this.__v.__k[0].__c; 19831 this.__v.__k[0] = L3(this.__b, r4, o3.__O = o3.__P); 19832 } 19833 this.__b = null; 19834 } 19835 var i4 = e4.__a && y2(_2, null, n3.fallback); 19836 return i4 && (i4.__h = null), [y2(_2, null, e4.__a ? null : n3.children), i4]; 19837 }; 19838 var W2 = function(n3, t5, e4) { 19839 if (++e4[1] === e4[0] && n3.o.delete(t5), n3.props.revealOrder && ("t" !== n3.props.revealOrder[0] || !n3.o.size)) 19840 for (e4 = n3.u; e4; ) { 19841 for (; e4.length > 3; ) 19842 e4.pop()(); 19843 if (e4[1] < e4[0]) 19844 break; 19845 n3.u = e4 = e4[2]; 19846 } 19847 }; 19848 function P3(n3) { 19849 return this.getChildContext = function() { 19850 return n3.context; 19851 }, n3.children; 19852 } 19853 function $3(n3) { 19854 var e4 = this, r4 = n3.i; 19855 e4.componentWillUnmount = function() { 19856 D2(null, e4.l), e4.l = null, e4.i = null; 19857 }, e4.i && e4.i !== r4 && e4.componentWillUnmount(), n3.__v ? (e4.l || (e4.i = r4, e4.l = { nodeType: 1, parentNode: r4, childNodes: [], appendChild: function(n4) { 19858 this.childNodes.push(n4), e4.i.appendChild(n4); 19859 }, insertBefore: function(n4, t5) { 19860 this.childNodes.push(n4), e4.i.appendChild(n4); 19861 }, removeChild: function(n4) { 19862 this.childNodes.splice(this.childNodes.indexOf(n4) >>> 1, 1), e4.i.removeChild(n4); 19863 } }), D2(y2(P3, { context: e4.context }, n3.__v), e4.l)) : e4.l && e4.componentWillUnmount(); 19864 } 19865 function j4(n3, e4) { 19866 var r4 = y2($3, { __v: n3, i: e4 }); 19867 return r4.containerInfo = e4, r4; 19868 } 19869 (V3.prototype = new x2()).__a = function(n3) { 19870 var t5 = this, e4 = F4(t5.__v), r4 = t5.o.get(n3); 19871 return r4[0]++, function(u4) { 19872 var o3 = function() { 19873 t5.props.revealOrder ? (r4.push(u4), W2(t5, n3, r4)) : u4(); 19874 }; 19875 e4 ? e4(o3) : o3(); 19876 }; 19877 }, V3.prototype.render = function(n3) { 19878 this.u = null, this.o = /* @__PURE__ */ new Map(); 19879 var t5 = j2(n3.children); 19880 n3.revealOrder && "b" === n3.revealOrder[0] && t5.reverse(); 19881 for (var e4 = t5.length; e4--; ) 19882 this.o.set(t5[e4], this.u = [1, 0, this.u]); 19883 return n3.children; 19884 }, V3.prototype.componentDidUpdate = V3.prototype.componentDidMount = function() { 19885 var n3 = this; 19886 this.o.forEach(function(t5, e4) { 19887 W2(n3, e4, t5); 19888 }); 19889 }; 19890 var z3 = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103; 19891 var B3 = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/; 19892 var H3 = "undefined" != typeof document; 19893 var Z2 = function(n3) { 19894 return ("undefined" != typeof Symbol && "symbol" == typeof Symbol() ? /fil|che|rad/i : /fil|che|ra/i).test(n3); 19895 }; 19896 x2.prototype.isReactComponent = {}, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t5) { 19897 Object.defineProperty(x2.prototype, t5, { configurable: true, get: function() { 19898 return this["UNSAFE_" + t5]; 19899 }, set: function(n3) { 19900 Object.defineProperty(this, t5, { configurable: true, writable: true, value: n3 }); 19901 } }); 19902 }); 19903 var G3 = l2.event; 19904 function J2() { 19905 } 19906 function K2() { 19907 return this.cancelBubble; 19908 } 19909 function Q2() { 19910 return this.defaultPrevented; 19911 } 19912 l2.event = function(n3) { 19913 return G3 && (n3 = G3(n3)), n3.persist = J2, n3.isPropagationStopped = K2, n3.isDefaultPrevented = Q2, n3.nativeEvent = n3; 19914 }; 19915 var X2; 19916 var nn2 = { configurable: true, get: function() { 19917 return this.class; 19918 } }; 19919 var tn2 = l2.vnode; 19920 l2.vnode = function(n3) { 19921 var t5 = n3.type, e4 = n3.props, u4 = e4; 19922 if ("string" == typeof t5) { 19923 var o3 = -1 === t5.indexOf("-"); 19924 for (var i4 in u4 = {}, e4) { 19925 var l4 = e4[i4]; 19926 H3 && "children" === i4 && "noscript" === t5 || "value" === i4 && "defaultValue" in e4 && null == l4 || ("defaultValue" === i4 && "value" in e4 && null == e4.value ? i4 = "value" : "download" === i4 && true === l4 ? l4 = "" : /ondoubleclick/i.test(i4) ? i4 = "ondblclick" : /^onchange(textarea|input)/i.test(i4 + t5) && !Z2(e4.type) ? i4 = "oninput" : /^onfocus$/i.test(i4) ? i4 = "onfocusin" : /^onblur$/i.test(i4) ? i4 = "onfocusout" : /^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i4) ? i4 = i4.toLowerCase() : o3 && B3.test(i4) ? i4 = i4.replace(/[A-Z0-9]/g, "-$&").toLowerCase() : null === l4 && (l4 = void 0), /^oninput$/i.test(i4) && (i4 = i4.toLowerCase(), u4[i4] && (i4 = "oninputCapture")), u4[i4] = l4); 19927 } 19928 "select" == t5 && u4.multiple && Array.isArray(u4.value) && (u4.value = j2(e4.children).forEach(function(n4) { 19929 n4.props.selected = -1 != u4.value.indexOf(n4.props.value); 19930 })), "select" == t5 && null != u4.defaultValue && (u4.value = j2(e4.children).forEach(function(n4) { 19931 n4.props.selected = u4.multiple ? -1 != u4.defaultValue.indexOf(n4.props.value) : u4.defaultValue == n4.props.value; 19932 })), n3.props = u4, e4.class != e4.className && (nn2.enumerable = "className" in e4, null != e4.className && (u4.class = e4.className), Object.defineProperty(u4, "className", nn2)); 19933 } 19934 n3.$$typeof = z3, tn2 && tn2(n3); 19935 }; 19936 var en2 = l2.__r; 19937 l2.__r = function(n3) { 19938 en2 && en2(n3), X2 = n3.__c; 19939 }; 19940 19941
vendor: 223,513 bytes, lines 19941-26065
19941// node_modules/@fullcalendar/core/internal-common.js 19942 var styleTexts = []; 19943 var styleEls = /* @__PURE__ */ new Map(); 19944 function injectStyles(styleText) { 19945 styleTexts.push(styleText); 19946 styleEls.forEach((styleEl) => { 19947 appendStylesTo(styleEl, styleText); 19948 }); 19949 } 19950 function ensureElHasStyles(el) { 19951 if (el.isConnected && el.getRootNode) { 19952 registerStylesRoot(el.getRootNode()); 19953 } 19954 } 19955 function registerStylesRoot(rootNode) { 19956 let styleEl = styleEls.get(rootNode); 19957 if (!styleEl || !styleEl.isConnected) { 19958 styleEl = rootNode.querySelector("style[data-fullcalendar]"); 19959 if (!styleEl) { 19960 styleEl = document.createElement("style"); 19961 styleEl.setAttribute("data-fullcalendar", ""); 19962 const nonce2 = getNonceValue(); 19963 if (nonce2) { 19964 styleEl.nonce = nonce2; 19965 } 19966 const parentEl = rootNode === document ? document.head : rootNode; 19967 const insertBefore = rootNode === document ? parentEl.querySelector("script,link[rel=stylesheet],link[as=style],style") : parentEl.firstChild; 19968 parentEl.insertBefore(styleEl, insertBefore); 19969 } 19970 styleEls.set(rootNode, styleEl); 19971 hydrateStylesRoot(styleEl); 19972 } 19973 } 19974 function hydrateStylesRoot(styleEl) { 19975 for (const styleText of styleTexts) { 19976 appendStylesTo(styleEl, styleText); 19977 } 19978 } 19979 function appendStylesTo(styleEl, styleText) { 19980 const { sheet } = styleEl; 19981 const ruleCnt = sheet.cssRules.length; 19982 styleText.split("}").forEach((styleStr, i4) => { 19983 styleStr = styleStr.trim(); 19984 if (styleStr) { 19985 sheet.insertRule(styleStr + "}", ruleCnt + i4); 19986 } 19987 }); 19988 } 19989 var queriedNonceValue; 19990 function getNonceValue() { 19991 if (queriedNonceValue === void 0) { 19992 queriedNonceValue = queryNonceValue(); 19993 } 19994 return queriedNonceValue; 19995 } 19996 function queryNonceValue() { 19997 const metaWithNonce = document.querySelector('meta[name="csp-nonce"]'); 19998 if (metaWithNonce && metaWithNonce.hasAttribute("content")) { 19999 return metaWithNonce.getAttribute("content"); 20000 } 20001 const elWithNonce = document.querySelector("script[nonce]"); 20002 if (elWithNonce) { 20003 return elWithNonce.nonce || ""; 20004 } 20005 return ""; 20006 } 20007 if (typeof document !== "undefined") { 20008 registerStylesRoot(document); 20009 } 20010 var css_248z = ':root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:"\\e900"}.fc-icon-chevron-right:before{content:"\\e901"}.fc-icon-chevrons-left:before{content:"\\e902"}.fc-icon-chevrons-right:before{content:"\\e903"}.fc-icon-minus-square:before{content:"\\e904"}.fc-icon-plus-square:before{content:"\\e905"}.fc-icon-x:before{content:"\\e906"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}'; 20011 injectStyles(css_248z); 20012 var DelayedRunner = class { 20013 constructor(drainedOption) { 20014 this.drainedOption = drainedOption; 20015 this.isRunning = false; 20016 this.isDirty = false; 20017 this.pauseDepths = {}; 20018 this.timeoutId = 0; 20019 } 20020 request(delay) { 20021 this.isDirty = true; 20022 if (!this.isPaused()) { 20023 this.clearTimeout(); 20024 if (delay == null) { 20025 this.tryDrain(); 20026 } else { 20027 this.timeoutId = setTimeout( 20028 this.tryDrain.bind(this), 20029 delay 20030 ); 20031 } 20032 } 20033 } 20034 pause(scope = "") { 20035 let { pauseDepths } = this; 20036 pauseDepths[scope] = (pauseDepths[scope] || 0) + 1; 20037 this.clearTimeout(); 20038 } 20039 resume(scope = "", force) { 20040 let { pauseDepths } = this; 20041 if (scope in pauseDepths) { 20042 if (force) { 20043 delete pauseDepths[scope]; 20044 } else { 20045 pauseDepths[scope] -= 1; 20046 let depth = pauseDepths[scope]; 20047 if (depth <= 0) { 20048 delete pauseDepths[scope]; 20049 } 20050 } 20051 this.tryDrain(); 20052 } 20053 } 20054 isPaused() { 20055 return Object.keys(this.pauseDepths).length; 20056 } 20057 tryDrain() { 20058 if (!this.isRunning && !this.isPaused()) { 20059 this.isRunning = true; 20060 while (this.isDirty) { 20061 this.isDirty = false; 20062 this.drained(); 20063 } 20064 this.isRunning = false; 20065 } 20066 } 20067 clear() { 20068 this.clearTimeout(); 20069 this.isDirty = false; 20070 this.pauseDepths = {}; 20071 } 20072 clearTimeout() { 20073 if (this.timeoutId) { 20074 clearTimeout(this.timeoutId); 20075 this.timeoutId = 0; 20076 } 20077 } 20078 drained() { 20079 if (this.drainedOption) { 20080 this.drainedOption(); 20081 } 20082 } 20083 }; 20084 function removeElement(el) { 20085 if (el.parentNode) { 20086 el.parentNode.removeChild(el); 20087 } 20088 } 20089 function elementClosest(el, selector) { 20090 if (el.closest) { 20091 return el.closest(selector); 20092 } 20093 if (!document.documentElement.contains(el)) { 20094 return null; 20095 } 20096 do { 20097 if (elementMatches(el, selector)) { 20098 return el; 20099 } 20100 el = el.parentElement || el.parentNode; 20101 } while (el !== null && el.nodeType === 1); 20102 return null; 20103 } 20104 function elementMatches(el, selector) { 20105 let method = el.matches || el.matchesSelector || el.msMatchesSelector; 20106 return method.call(el, selector); 20107 } 20108 function findElements2(container, selector) { 20109 let containers = container instanceof HTMLElement ? [container] : container; 20110 let allMatches = []; 20111 for (let i4 = 0; i4 < containers.length; i4 += 1) { 20112 let matches2 = containers[i4].querySelectorAll(selector); 20113 for (let j5 = 0; j5 < matches2.length; j5 += 1) { 20114 allMatches.push(matches2[j5]); 20115 } 20116 } 20117 return allMatches; 20118 } 20119 var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i; 20120 function applyStyle(el, props) { 20121 for (let propName in props) { 20122 applyStyleProp(el, propName, props[propName]); 20123 } 20124 } 20125 function applyStyleProp(el, name, val) { 20126 if (val == null) { 20127 el.style[name] = ""; 20128 } else if (typeof val === "number" && PIXEL_PROP_RE.test(name)) { 20129 el.style[name] = `${val}px`; 20130 } else { 20131 el.style[name] = val; 20132 } 20133 } 20134 function getEventTargetViaRoot(ev) { 20135 var _a, _b; 20136 return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target; 20137 } 20138 var guid$1 = 0; 20139 function getUniqueDomId() { 20140 guid$1 += 1; 20141 return "fc-dom-" + guid$1; 20142 } 20143 function buildDelegationHandler(selector, handler) { 20144 return (ev) => { 20145 let matchedChild = elementClosest(ev.target, selector); 20146 if (matchedChild) { 20147 handler.call(matchedChild, ev, matchedChild); 20148 } 20149 }; 20150 } 20151 function listenBySelector(container, eventType, selector, handler) { 20152 let attachedHandler = buildDelegationHandler(selector, handler); 20153 container.addEventListener(eventType, attachedHandler); 20154 return () => { 20155 container.removeEventListener(eventType, attachedHandler); 20156 }; 20157 } 20158 function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) { 20159 let currentMatchedChild; 20160 return listenBySelector(container, "mouseover", selector, (mouseOverEv, matchedChild) => { 20161 if (matchedChild !== currentMatchedChild) { 20162 currentMatchedChild = matchedChild; 20163 onMouseEnter(mouseOverEv, matchedChild); 20164 let realOnMouseLeave = (mouseLeaveEv) => { 20165 currentMatchedChild = null; 20166 onMouseLeave(mouseLeaveEv, matchedChild); 20167 matchedChild.removeEventListener("mouseleave", realOnMouseLeave); 20168 }; 20169 matchedChild.addEventListener("mouseleave", realOnMouseLeave); 20170 } 20171 }); 20172 } 20173 function createAriaClickAttrs(handler) { 20174 return Object.assign({ onClick: handler }, createAriaKeyboardAttrs(handler)); 20175 } 20176 function createAriaKeyboardAttrs(handler) { 20177 return { 20178 tabIndex: 0, 20179 onKeyDown(ev) { 20180 if (ev.key === "Enter" || ev.key === " ") { 20181 handler(ev); 20182 ev.preventDefault(); 20183 } 20184 } 20185 }; 20186 } 20187 var guidNumber = 0; 20188 function guid() { 20189 guidNumber += 1; 20190 return String(guidNumber); 20191 } 20192 function parseFieldSpecs(input) { 20193 let specs = []; 20194 let tokens = []; 20195 let i4; 20196 let token; 20197 if (typeof input === "string") { 20198 tokens = input.split(/\s*,\s*/); 20199 } else if (typeof input === "function") { 20200 tokens = [input]; 20201 } else if (Array.isArray(input)) { 20202 tokens = input; 20203 } 20204 for (i4 = 0; i4 < tokens.length; i4 += 1) { 20205 token = tokens[i4]; 20206 if (typeof token === "string") { 20207 specs.push(token.charAt(0) === "-" ? { field: token.substring(1), order: -1 } : { field: token, order: 1 }); 20208 } else if (typeof token === "function") { 20209 specs.push({ func: token }); 20210 } 20211 } 20212 return specs; 20213 } 20214 function compareByFieldSpecs(obj0, obj1, fieldSpecs) { 20215 let i4; 20216 let cmp; 20217 for (i4 = 0; i4 < fieldSpecs.length; i4 += 1) { 20218 cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i4]); 20219 if (cmp) { 20220 return cmp; 20221 } 20222 } 20223 return 0; 20224 } 20225 function compareByFieldSpec(obj0, obj1, fieldSpec) { 20226 if (fieldSpec.func) { 20227 return fieldSpec.func(obj0, obj1); 20228 } 20229 return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) * (fieldSpec.order || 1); 20230 } 20231 function flexibleCompare(a4, b4) { 20232 if (!a4 && !b4) { 20233 return 0; 20234 } 20235 if (b4 == null) { 20236 return -1; 20237 } 20238 if (a4 == null) { 20239 return 1; 20240 } 20241 if (typeof a4 === "string" || typeof b4 === "string") { 20242 return String(a4).localeCompare(String(b4)); 20243 } 20244 return a4 - b4; 20245 } 20246 function padStart(val, len) { 20247 let s4 = String(val); 20248 return "000".substr(0, len - s4.length) + s4; 20249 } 20250 function formatWithOrdinals(formatter, args, fallbackText) { 20251 if (typeof formatter === "function") { 20252 return formatter(...args); 20253 } 20254 if (typeof formatter === "string") { 20255 return args.reduce((str, arg, index4) => str.replace("$" + index4, arg || ""), formatter); 20256 } 20257 return fallbackText; 20258 } 20259 function isInt(n3) { 20260 return n3 % 1 === 0; 20261 } 20262 function computeSmallestCellWidth(cellEl) { 20263 let allWidthEl = cellEl.querySelector(".fc-scrollgrid-shrink-frame"); 20264 let contentWidthEl = cellEl.querySelector(".fc-scrollgrid-shrink-cushion"); 20265 if (!allWidthEl) { 20266 throw new Error("needs fc-scrollgrid-shrink-frame className"); 20267 } 20268 if (!contentWidthEl) { 20269 throw new Error("needs fc-scrollgrid-shrink-cushion className"); 20270 } 20271 return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + contentWidthEl.getBoundingClientRect().width; 20272 } 20273 var INTERNAL_UNITS = ["years", "months", "days", "milliseconds"]; 20274 var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; 20275 function createDuration(input, unit) { 20276 if (typeof input === "string") { 20277 return parseString(input); 20278 } 20279 if (typeof input === "object" && input) { 20280 return parseObject(input); 20281 } 20282 if (typeof input === "number") { 20283 return parseObject({ [unit || "milliseconds"]: input }); 20284 } 20285 return null; 20286 } 20287 function parseString(s4) { 20288 let m5 = PARSE_RE.exec(s4); 20289 if (m5) { 20290 let sign = m5[1] ? -1 : 1; 20291 return { 20292 years: 0, 20293 months: 0, 20294 days: sign * (m5[2] ? parseInt(m5[2], 10) : 0), 20295 milliseconds: sign * ((m5[3] ? parseInt(m5[3], 10) : 0) * 60 * 60 * 1e3 + (m5[4] ? parseInt(m5[4], 10) : 0) * 60 * 1e3 + (m5[5] ? parseInt(m5[5], 10) : 0) * 1e3 + (m5[6] ? parseInt(m5[6], 10) : 0)) 20296 }; 20297 } 20298 return null; 20299 } 20300 function parseObject(obj) { 20301 let duration = { 20302 years: obj.years || obj.year || 0, 20303 months: obj.months || obj.month || 0, 20304 days: obj.days || obj.day || 0, 20305 milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1e3 + (obj.minutes || obj.minute || 0) * 60 * 1e3 + (obj.seconds || obj.second || 0) * 1e3 + (obj.milliseconds || obj.millisecond || obj.ms || 0) 20306 }; 20307 let weeks = obj.weeks || obj.week; 20308 if (weeks) { 20309 duration.days += weeks * 7; 20310 duration.specifiedWeeks = true; 20311 } 20312 return duration; 20313 } 20314 function durationsEqual(d0, d1) { 20315 return d0.years === d1.years && d0.months === d1.months && d0.days === d1.days && d0.milliseconds === d1.milliseconds; 20316 } 20317 function addDurations(d0, d1) { 20318 return { 20319 years: d0.years + d1.years, 20320 months: d0.months + d1.months, 20321 days: d0.days + d1.days, 20322 milliseconds: d0.milliseconds + d1.milliseconds 20323 }; 20324 } 20325 function subtractDurations(d1, d0) { 20326 return { 20327 years: d1.years - d0.years, 20328 months: d1.months - d0.months, 20329 days: d1.days - d0.days, 20330 milliseconds: d1.milliseconds - d0.milliseconds 20331 }; 20332 } 20333 function multiplyDuration(d3, n3) { 20334 return { 20335 years: d3.years * n3, 20336 months: d3.months * n3, 20337 days: d3.days * n3, 20338 milliseconds: d3.milliseconds * n3 20339 }; 20340 } 20341 function asRoughYears(dur) { 20342 return asRoughDays(dur) / 365; 20343 } 20344 function asRoughMonths(dur) { 20345 return asRoughDays(dur) / 30; 20346 } 20347 function asRoughDays(dur) { 20348 return asRoughMs(dur) / 864e5; 20349 } 20350 function asRoughMs(dur) { 20351 return dur.years * (365 * 864e5) + dur.months * (30 * 864e5) + dur.days * 864e5 + dur.milliseconds; 20352 } 20353 function wholeDivideDurations(numerator, denominator) { 20354 let res = null; 20355 for (let i4 = 0; i4 < INTERNAL_UNITS.length; i4 += 1) { 20356 let unit = INTERNAL_UNITS[i4]; 20357 if (denominator[unit]) { 20358 let localRes = numerator[unit] / denominator[unit]; 20359 if (!isInt(localRes) || res !== null && res !== localRes) { 20360 return null; 20361 } 20362 res = localRes; 20363 } else if (numerator[unit]) { 20364 return null; 20365 } 20366 } 20367 return res; 20368 } 20369 function greatestDurationDenominator(dur) { 20370 let ms = dur.milliseconds; 20371 if (ms) { 20372 if (ms % 1e3 !== 0) { 20373 return { unit: "millisecond", value: ms }; 20374 } 20375 if (ms % (1e3 * 60) !== 0) { 20376 return { unit: "second", value: ms / 1e3 }; 20377 } 20378 if (ms % (1e3 * 60 * 60) !== 0) { 20379 return { unit: "minute", value: ms / (1e3 * 60) }; 20380 } 20381 if (ms) { 20382 return { unit: "hour", value: ms / (1e3 * 60 * 60) }; 20383 } 20384 } 20385 if (dur.days) { 20386 if (dur.specifiedWeeks && dur.days % 7 === 0) { 20387 return { unit: "week", value: dur.days / 7 }; 20388 } 20389 return { unit: "day", value: dur.days }; 20390 } 20391 if (dur.months) { 20392 return { unit: "month", value: dur.months }; 20393 } 20394 if (dur.years) { 20395 return { unit: "year", value: dur.years }; 20396 } 20397 return { unit: "millisecond", value: 0 }; 20398 } 20399 function isArraysEqual(a0, a1, equalityFunc) { 20400 if (a0 === a1) { 20401 return true; 20402 } 20403 let len = a0.length; 20404 let i4; 20405 if (len !== a1.length) { 20406 return false; 20407 } 20408 for (i4 = 0; i4 < len; i4 += 1) { 20409 if (!(equalityFunc ? equalityFunc(a0[i4], a1[i4]) : a0[i4] === a1[i4])) { 20410 return false; 20411 } 20412 } 20413 return true; 20414 } 20415 var DAY_IDS = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]; 20416 function addWeeks(m5, n3) { 20417 let a4 = dateToUtcArray(m5); 20418 a4[2] += n3 * 7; 20419 return arrayToUtcDate(a4); 20420 } 20421 function addDays(m5, n3) { 20422 let a4 = dateToUtcArray(m5); 20423 a4[2] += n3; 20424 return arrayToUtcDate(a4); 20425 } 20426 function addMs(m5, n3) { 20427 let a4 = dateToUtcArray(m5); 20428 a4[6] += n3; 20429 return arrayToUtcDate(a4); 20430 } 20431 function diffWeeks(m0, m1) { 20432 return diffDays(m0, m1) / 7; 20433 } 20434 function diffDays(m0, m1) { 20435 return (m1.valueOf() - m0.valueOf()) / (1e3 * 60 * 60 * 24); 20436 } 20437 function diffHours(m0, m1) { 20438 return (m1.valueOf() - m0.valueOf()) / (1e3 * 60 * 60); 20439 } 20440 function diffMinutes(m0, m1) { 20441 return (m1.valueOf() - m0.valueOf()) / (1e3 * 60); 20442 } 20443 function diffSeconds(m0, m1) { 20444 return (m1.valueOf() - m0.valueOf()) / 1e3; 20445 } 20446 function diffDayAndTime(m0, m1) { 20447 let m0day = startOfDay(m0); 20448 let m1day = startOfDay(m1); 20449 return { 20450 years: 0, 20451 months: 0, 20452 days: Math.round(diffDays(m0day, m1day)), 20453 milliseconds: m1.valueOf() - m1day.valueOf() - (m0.valueOf() - m0day.valueOf()) 20454 }; 20455 } 20456 function diffWholeWeeks(m0, m1) { 20457 let d3 = diffWholeDays(m0, m1); 20458 if (d3 !== null && d3 % 7 === 0) { 20459 return d3 / 7; 20460 } 20461 return null; 20462 } 20463 function diffWholeDays(m0, m1) { 20464 if (timeAsMs(m0) === timeAsMs(m1)) { 20465 return Math.round(diffDays(m0, m1)); 20466 } 20467 return null; 20468 } 20469 function startOfDay(m5) { 20470 return arrayToUtcDate([ 20471 m5.getUTCFullYear(), 20472 m5.getUTCMonth(), 20473 m5.getUTCDate() 20474 ]); 20475 } 20476 function startOfHour(m5) { 20477 return arrayToUtcDate([ 20478 m5.getUTCFullYear(), 20479 m5.getUTCMonth(), 20480 m5.getUTCDate(), 20481 m5.getUTCHours() 20482 ]); 20483 } 20484 function startOfMinute(m5) { 20485 return arrayToUtcDate([ 20486 m5.getUTCFullYear(), 20487 m5.getUTCMonth(), 20488 m5.getUTCDate(), 20489 m5.getUTCHours(), 20490 m5.getUTCMinutes() 20491 ]); 20492 } 20493 function startOfSecond(m5) { 20494 return arrayToUtcDate([ 20495 m5.getUTCFullYear(), 20496 m5.getUTCMonth(), 20497 m5.getUTCDate(), 20498 m5.getUTCHours(), 20499 m5.getUTCMinutes(), 20500 m5.getUTCSeconds() 20501 ]); 20502 } 20503 function weekOfYear(marker, dow, doy) { 20504 let y4 = marker.getUTCFullYear(); 20505 let w5 = weekOfGivenYear(marker, y4, dow, doy); 20506 if (w5 < 1) { 20507 return weekOfGivenYear(marker, y4 - 1, dow, doy); 20508 } 20509 let nextW = weekOfGivenYear(marker, y4 + 1, dow, doy); 20510 if (nextW >= 1) { 20511 return Math.min(w5, nextW); 20512 } 20513 return w5; 20514 } 20515 function weekOfGivenYear(marker, year, dow, doy) { 20516 let firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); 20517 let dayStart = startOfDay(marker); 20518 let days = Math.round(diffDays(firstWeekStart, dayStart)); 20519 return Math.floor(days / 7) + 1; 20520 } 20521 function firstWeekOffset(year, dow, doy) { 20522 let fwd = 7 + dow - doy; 20523 let fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; 20524 return -fwdlw + fwd - 1; 20525 } 20526 function dateToLocalArray(date) { 20527 return [ 20528 date.getFullYear(), 20529 date.getMonth(), 20530 date.getDate(), 20531 date.getHours(), 20532 date.getMinutes(), 20533 date.getSeconds(), 20534 date.getMilliseconds() 20535 ]; 20536 } 20537 function arrayToLocalDate(a4) { 20538 return new Date( 20539 a4[0], 20540 a4[1] || 0, 20541 a4[2] == null ? 1 : a4[2], 20542 a4[3] || 0, 20543 a4[4] || 0, 20544 a4[5] || 0 20545 ); 20546 } 20547 function dateToUtcArray(date) { 20548 return [ 20549 date.getUTCFullYear(), 20550 date.getUTCMonth(), 20551 date.getUTCDate(), 20552 date.getUTCHours(), 20553 date.getUTCMinutes(), 20554 date.getUTCSeconds(), 20555 date.getUTCMilliseconds() 20556 ]; 20557 } 20558 function arrayToUtcDate(a4) { 20559 if (a4.length === 1) { 20560 a4 = a4.concat([0]); 20561 } 20562 return new Date(Date.UTC(...a4)); 20563 } 20564 function isValidDate(m5) { 20565 return !isNaN(m5.valueOf()); 20566 } 20567 function timeAsMs(m5) { 20568 return m5.getUTCHours() * 1e3 * 60 * 60 + m5.getUTCMinutes() * 1e3 * 60 + m5.getUTCSeconds() * 1e3 + m5.getUTCMilliseconds(); 20569 } 20570 function buildIsoString(marker, timeZoneOffset, stripZeroTime = false) { 20571 let s4 = marker.toISOString(); 20572 s4 = s4.replace(".000", ""); 20573 if (stripZeroTime) { 20574 s4 = s4.replace("T00:00:00Z", ""); 20575 } 20576 if (s4.length > 10) { 20577 if (timeZoneOffset == null) { 20578 s4 = s4.replace("Z", ""); 20579 } else if (timeZoneOffset !== 0) { 20580 s4 = s4.replace("Z", formatTimeZoneOffset(timeZoneOffset, true)); 20581 } 20582 } 20583 return s4; 20584 } 20585 function formatDayString(marker) { 20586 return marker.toISOString().replace(/T.*$/, ""); 20587 } 20588 function formatIsoMonthStr(marker) { 20589 return marker.toISOString().match(/^\d{4}-\d{2}/)[0]; 20590 } 20591 function formatIsoTimeString(marker) { 20592 return padStart(marker.getUTCHours(), 2) + ":" + padStart(marker.getUTCMinutes(), 2) + ":" + padStart(marker.getUTCSeconds(), 2); 20593 } 20594 function formatTimeZoneOffset(minutes, doIso = false) { 20595 let sign = minutes < 0 ? "-" : "+"; 20596 let abs = Math.abs(minutes); 20597 let hours = Math.floor(abs / 60); 20598 let mins = Math.round(abs % 60); 20599 if (doIso) { 20600 return `${sign + padStart(hours, 2)}:${padStart(mins, 2)}`; 20601 } 20602 return `GMT${sign}${hours}${mins ? `:${padStart(mins, 2)}` : ""}`; 20603 } 20604 function memoize(workerFunc, resEquality, teardownFunc) { 20605 let currentArgs; 20606 let currentRes; 20607 return function(...newArgs) { 20608 if (!currentArgs) { 20609 currentRes = workerFunc.apply(this, newArgs); 20610 } else if (!isArraysEqual(currentArgs, newArgs)) { 20611 if (teardownFunc) { 20612 teardownFunc(currentRes); 20613 } 20614 let res = workerFunc.apply(this, newArgs); 20615 if (!resEquality || !resEquality(res, currentRes)) { 20616 currentRes = res; 20617 } 20618 } 20619 currentArgs = newArgs; 20620 return currentRes; 20621 }; 20622 } 20623 function memoizeObjArg(workerFunc, resEquality, teardownFunc) { 20624 let currentArg; 20625 let currentRes; 20626 return (newArg) => { 20627 if (!currentArg) { 20628 currentRes = workerFunc.call(this, newArg); 20629 } else if (!isPropsEqual(currentArg, newArg)) { 20630 if (teardownFunc) { 20631 teardownFunc(currentRes); 20632 } 20633 let res = workerFunc.call(this, newArg); 20634 if (!resEquality || !resEquality(res, currentRes)) { 20635 currentRes = res; 20636 } 20637 } 20638 currentArg = newArg; 20639 return currentRes; 20640 }; 20641 } 20642 var EXTENDED_SETTINGS_AND_SEVERITIES = { 20643 week: 3, 20644 separator: 0, 20645 omitZeroMinute: 0, 20646 meridiem: 0, 20647 omitCommas: 0 20648 }; 20649 var STANDARD_DATE_PROP_SEVERITIES = { 20650 timeZoneName: 7, 20651 era: 6, 20652 year: 5, 20653 month: 4, 20654 day: 2, 20655 weekday: 2, 20656 hour: 1, 20657 minute: 1, 20658 second: 1 20659 }; 20660 var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; 20661 var COMMA_RE = /,/g; 20662 var MULTI_SPACE_RE = /\s+/g; 20663 var LTR_RE = /\u200e/g; 20664 var UTC_RE = /UTC|GMT/; 20665 var NativeFormatter = class { 20666 constructor(formatSettings) { 20667 let standardDateProps = {}; 20668 let extendedSettings = {}; 20669 let severity = 0; 20670 for (let name in formatSettings) { 20671 if (name in EXTENDED_SETTINGS_AND_SEVERITIES) { 20672 extendedSettings[name] = formatSettings[name]; 20673 severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name], severity); 20674 } else { 20675 standardDateProps[name] = formatSettings[name]; 20676 if (name in STANDARD_DATE_PROP_SEVERITIES) { 20677 severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name], severity); 20678 } 20679 } 20680 } 20681 this.standardDateProps = standardDateProps; 20682 this.extendedSettings = extendedSettings; 20683 this.severity = severity; 20684 this.buildFormattingFunc = memoize(buildFormattingFunc); 20685 } 20686 format(date, context) { 20687 return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); 20688 } 20689 formatRange(start5, end2, context, betterDefaultSeparator) { 20690 let { standardDateProps, extendedSettings } = this; 20691 let diffSeverity = computeMarkerDiffSeverity(start5.marker, end2.marker, context.calendarSystem); 20692 if (!diffSeverity) { 20693 return this.format(start5, context); 20694 } 20695 let biggestUnitForPartial = diffSeverity; 20696 if (biggestUnitForPartial > 1 && (standardDateProps.year === "numeric" || standardDateProps.year === "2-digit") && (standardDateProps.month === "numeric" || standardDateProps.month === "2-digit") && (standardDateProps.day === "numeric" || standardDateProps.day === "2-digit")) { 20697 biggestUnitForPartial = 1; 20698 } 20699 let full0 = this.format(start5, context); 20700 let full1 = this.format(end2, context); 20701 if (full0 === full1) { 20702 return full0; 20703 } 20704 let partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); 20705 let partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); 20706 let partial0 = partialFormattingFunc(start5); 20707 let partial1 = partialFormattingFunc(end2); 20708 let insertion = findCommonInsertion(full0, partial0, full1, partial1); 20709 let separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || ""; 20710 if (insertion) { 20711 return insertion.before + partial0 + separator + partial1 + insertion.after; 20712 } 20713 return full0 + separator + full1; 20714 } 20715 getLargestUnit() { 20716 switch (this.severity) { 20717 case 7: 20718 case 6: 20719 case 5: 20720 return "year"; 20721 case 4: 20722 return "month"; 20723 case 3: 20724 return "week"; 20725 case 2: 20726 return "day"; 20727 default: 20728 return "time"; 20729 } 20730 } 20731 }; 20732 function buildFormattingFunc(standardDateProps, extendedSettings, context) { 20733 let standardDatePropCnt = Object.keys(standardDateProps).length; 20734 if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === "short") { 20735 return (date) => formatTimeZoneOffset(date.timeZoneOffset); 20736 } 20737 if (standardDatePropCnt === 0 && extendedSettings.week) { 20738 return (date) => formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week); 20739 } 20740 return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); 20741 } 20742 function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { 20743 standardDateProps = Object.assign({}, standardDateProps); 20744 extendedSettings = Object.assign({}, extendedSettings); 20745 sanitizeSettings(standardDateProps, extendedSettings); 20746 standardDateProps.timeZone = "UTC"; 20747 let normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); 20748 let zeroFormat; 20749 if (extendedSettings.omitZeroMinute) { 20750 let zeroProps = Object.assign({}, standardDateProps); 20751 delete zeroProps.minute; 20752 zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); 20753 } 20754 return (date) => { 20755 let { marker } = date; 20756 let format; 20757 if (zeroFormat && !marker.getUTCMinutes()) { 20758 format = zeroFormat; 20759 } else { 20760 format = normalFormat; 20761 } 20762 let s4 = format.format(marker); 20763 return postProcess(s4, date, standardDateProps, extendedSettings, context); 20764 }; 20765 } 20766 function sanitizeSettings(standardDateProps, extendedSettings) { 20767 if (standardDateProps.timeZoneName) { 20768 if (!standardDateProps.hour) { 20769 standardDateProps.hour = "2-digit"; 20770 } 20771 if (!standardDateProps.minute) { 20772 standardDateProps.minute = "2-digit"; 20773 } 20774 } 20775 if (standardDateProps.timeZoneName === "long") { 20776 standardDateProps.timeZoneName = "short"; 20777 } 20778 if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { 20779 delete extendedSettings.omitZeroMinute; 20780 } 20781 } 20782 function postProcess(s4, date, standardDateProps, extendedSettings, context) { 20783 s4 = s4.replace(LTR_RE, ""); 20784 if (standardDateProps.timeZoneName === "short") { 20785 s4 = injectTzoStr(s4, context.timeZone === "UTC" || date.timeZoneOffset == null ? "UTC" : formatTimeZoneOffset(date.timeZoneOffset)); 20786 } 20787 if (extendedSettings.omitCommas) { 20788 s4 = s4.replace(COMMA_RE, "").trim(); 20789 } 20790 if (extendedSettings.omitZeroMinute) { 20791 s4 = s4.replace(":00", ""); 20792 } 20793 if (extendedSettings.meridiem === false) { 20794 s4 = s4.replace(MERIDIEM_RE, "").trim(); 20795 } else if (extendedSettings.meridiem === "narrow") { 20796 s4 = s4.replace(MERIDIEM_RE, (m0, m1) => m1.toLocaleLowerCase()); 20797 } else if (extendedSettings.meridiem === "short") { 20798 s4 = s4.replace(MERIDIEM_RE, (m0, m1) => `${m1.toLocaleLowerCase()}m`); 20799 } else if (extendedSettings.meridiem === "lowercase") { 20800 s4 = s4.replace(MERIDIEM_RE, (m0) => m0.toLocaleLowerCase()); 20801 } 20802 s4 = s4.replace(MULTI_SPACE_RE, " "); 20803 s4 = s4.trim(); 20804 return s4; 20805 } 20806 function injectTzoStr(s4, tzoStr) { 20807 let replaced = false; 20808 s4 = s4.replace(UTC_RE, () => { 20809 replaced = true; 20810 return tzoStr; 20811 }); 20812 if (!replaced) { 20813 s4 += ` ${tzoStr}`; 20814 } 20815 return s4; 20816 } 20817 function formatWeekNumber(num, weekText, weekTextLong, locale, display) { 20818 let parts = []; 20819 if (display === "long") { 20820 parts.push(weekTextLong); 20821 } else if (display === "short" || display === "narrow") { 20822 parts.push(weekText); 20823 } 20824 if (display === "long" || display === "short") { 20825 parts.push(" "); 20826 } 20827 parts.push(locale.simpleNumberFormat.format(num)); 20828 if (locale.options.direction === "rtl") { 20829 parts.reverse(); 20830 } 20831 return parts.join(""); 20832 } 20833 function computeMarkerDiffSeverity(d0, d1, ca) { 20834 if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { 20835 return 5; 20836 } 20837 if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { 20838 return 4; 20839 } 20840 if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { 20841 return 2; 20842 } 20843 if (timeAsMs(d0) !== timeAsMs(d1)) { 20844 return 1; 20845 } 20846 return 0; 20847 } 20848 function computePartialFormattingOptions(options, biggestUnit) { 20849 let partialOptions = {}; 20850 for (let name in options) { 20851 if (!(name in STANDARD_DATE_PROP_SEVERITIES) || STANDARD_DATE_PROP_SEVERITIES[name] <= biggestUnit) { 20852 partialOptions[name] = options[name]; 20853 } 20854 } 20855 return partialOptions; 20856 } 20857 function findCommonInsertion(full0, partial0, full1, partial1) { 20858 let i0 = 0; 20859 while (i0 < full0.length) { 20860 let found0 = full0.indexOf(partial0, i0); 20861 if (found0 === -1) { 20862 break; 20863 } 20864 let before0 = full0.substr(0, found0); 20865 i0 = found0 + partial0.length; 20866 let after0 = full0.substr(i0); 20867 let i1 = 0; 20868 while (i1 < full1.length) { 20869 let found1 = full1.indexOf(partial1, i1); 20870 if (found1 === -1) { 20871 break; 20872 } 20873 let before1 = full1.substr(0, found1); 20874 i1 = found1 + partial1.length; 20875 let after1 = full1.substr(i1); 20876 if (before0 === before1 && after0 === after1) { 20877 return { 20878 before: before0, 20879 after: after0 20880 }; 20881 } 20882 } 20883 } 20884 return null; 20885 } 20886 function expandZonedMarker(dateInfo, calendarSystem) { 20887 let a4 = calendarSystem.markerToArray(dateInfo.marker); 20888 return { 20889 marker: dateInfo.marker, 20890 timeZoneOffset: dateInfo.timeZoneOffset, 20891 array: a4, 20892 year: a4[0], 20893 month: a4[1], 20894 day: a4[2], 20895 hour: a4[3], 20896 minute: a4[4], 20897 second: a4[5], 20898 millisecond: a4[6] 20899 }; 20900 } 20901 function createVerboseFormattingArg(start5, end2, context, betterDefaultSeparator) { 20902 let startInfo = expandZonedMarker(start5, context.calendarSystem); 20903 let endInfo = end2 ? expandZonedMarker(end2, context.calendarSystem) : null; 20904 return { 20905 date: startInfo, 20906 start: startInfo, 20907 end: endInfo, 20908 timeZone: context.timeZone, 20909 localeCodes: context.locale.codes, 20910 defaultSeparator: betterDefaultSeparator || context.defaultSeparator 20911 }; 20912 } 20913 var CmdFormatter = class { 20914 constructor(cmdStr) { 20915 this.cmdStr = cmdStr; 20916 } 20917 format(date, context, betterDefaultSeparator) { 20918 return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); 20919 } 20920 formatRange(start5, end2, context, betterDefaultSeparator) { 20921 return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start5, end2, context, betterDefaultSeparator)); 20922 } 20923 }; 20924 var FuncFormatter = class { 20925 constructor(func) { 20926 this.func = func; 20927 } 20928 format(date, context, betterDefaultSeparator) { 20929 return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); 20930 } 20931 formatRange(start5, end2, context, betterDefaultSeparator) { 20932 return this.func(createVerboseFormattingArg(start5, end2, context, betterDefaultSeparator)); 20933 } 20934 }; 20935 function createFormatter(input) { 20936 if (typeof input === "object" && input) { 20937 return new NativeFormatter(input); 20938 } 20939 if (typeof input === "string") { 20940 return new CmdFormatter(input); 20941 } 20942 if (typeof input === "function") { 20943 return new FuncFormatter(input); 20944 } 20945 return null; 20946 } 20947 var BASE_OPTION_REFINERS = { 20948 navLinkDayClick: identity, 20949 navLinkWeekClick: identity, 20950 duration: createDuration, 20951 bootstrapFontAwesome: identity, 20952 buttonIcons: identity, 20953 customButtons: identity, 20954 defaultAllDayEventDuration: createDuration, 20955 defaultTimedEventDuration: createDuration, 20956 nextDayThreshold: createDuration, 20957 scrollTime: createDuration, 20958 scrollTimeReset: Boolean, 20959 slotMinTime: createDuration, 20960 slotMaxTime: createDuration, 20961 dayPopoverFormat: createFormatter, 20962 slotDuration: createDuration, 20963 snapDuration: createDuration, 20964 headerToolbar: identity, 20965 footerToolbar: identity, 20966 defaultRangeSeparator: String, 20967 titleRangeSeparator: String, 20968 forceEventDuration: Boolean, 20969 dayHeaders: Boolean, 20970 dayHeaderFormat: createFormatter, 20971 dayHeaderClassNames: identity, 20972 dayHeaderContent: identity, 20973 dayHeaderDidMount: identity, 20974 dayHeaderWillUnmount: identity, 20975 dayCellClassNames: identity, 20976 dayCellContent: identity, 20977 dayCellDidMount: identity, 20978 dayCellWillUnmount: identity, 20979 initialView: String, 20980 aspectRatio: Number, 20981 weekends: Boolean, 20982 weekNumberCalculation: identity, 20983 weekNumbers: Boolean, 20984 weekNumberClassNames: identity, 20985 weekNumberContent: identity, 20986 weekNumberDidMount: identity, 20987 weekNumberWillUnmount: identity, 20988 editable: Boolean, 20989 viewClassNames: identity, 20990 viewDidMount: identity, 20991 viewWillUnmount: identity, 20992 nowIndicator: Boolean, 20993 nowIndicatorClassNames: identity, 20994 nowIndicatorContent: identity, 20995 nowIndicatorDidMount: identity, 20996 nowIndicatorWillUnmount: identity, 20997 showNonCurrentDates: Boolean, 20998 lazyFetching: Boolean, 20999 startParam: String, 21000 endParam: String, 21001 timeZoneParam: String, 21002 timeZone: String, 21003 locales: identity, 21004 locale: identity, 21005 themeSystem: String, 21006 dragRevertDuration: Number, 21007 dragScroll: Boolean, 21008 allDayMaintainDuration: Boolean, 21009 unselectAuto: Boolean, 21010 dropAccept: identity, 21011 eventOrder: parseFieldSpecs, 21012 eventOrderStrict: Boolean, 21013 handleWindowResize: Boolean, 21014 windowResizeDelay: Number, 21015 longPressDelay: Number, 21016 eventDragMinDistance: Number, 21017 expandRows: Boolean, 21018 height: identity, 21019 contentHeight: identity, 21020 direction: String, 21021 weekNumberFormat: createFormatter, 21022 eventResizableFromStart: Boolean, 21023 displayEventTime: Boolean, 21024 displayEventEnd: Boolean, 21025 weekText: String, 21026 weekTextLong: String, 21027 progressiveEventRendering: Boolean, 21028 businessHours: identity, 21029 initialDate: identity, 21030 now: identity, 21031 eventDataTransform: identity, 21032 stickyHeaderDates: identity, 21033 stickyFooterScrollbar: identity, 21034 viewHeight: identity, 21035 defaultAllDay: Boolean, 21036 eventSourceFailure: identity, 21037 eventSourceSuccess: identity, 21038 eventDisplay: String, 21039 eventStartEditable: Boolean, 21040 eventDurationEditable: Boolean, 21041 eventOverlap: identity, 21042 eventConstraint: identity, 21043 eventAllow: identity, 21044 eventBackgroundColor: String, 21045 eventBorderColor: String, 21046 eventTextColor: String, 21047 eventColor: String, 21048 eventClassNames: identity, 21049 eventContent: identity, 21050 eventDidMount: identity, 21051 eventWillUnmount: identity, 21052 selectConstraint: identity, 21053 selectOverlap: identity, 21054 selectAllow: identity, 21055 droppable: Boolean, 21056 unselectCancel: String, 21057 slotLabelFormat: identity, 21058 slotLaneClassNames: identity, 21059 slotLaneContent: identity, 21060 slotLaneDidMount: identity, 21061 slotLaneWillUnmount: identity, 21062 slotLabelClassNames: identity, 21063 slotLabelContent: identity, 21064 slotLabelDidMount: identity, 21065 slotLabelWillUnmount: identity, 21066 dayMaxEvents: identity, 21067 dayMaxEventRows: identity, 21068 dayMinWidth: Number, 21069 slotLabelInterval: createDuration, 21070 allDayText: String, 21071 allDayClassNames: identity, 21072 allDayContent: identity, 21073 allDayDidMount: identity, 21074 allDayWillUnmount: identity, 21075 slotMinWidth: Number, 21076 navLinks: Boolean, 21077 eventTimeFormat: createFormatter, 21078 rerenderDelay: Number, 21079 moreLinkText: identity, 21080 moreLinkHint: identity, 21081 selectMinDistance: Number, 21082 selectable: Boolean, 21083 selectLongPressDelay: Number, 21084 eventLongPressDelay: Number, 21085 selectMirror: Boolean, 21086 eventMaxStack: Number, 21087 eventMinHeight: Number, 21088 eventMinWidth: Number, 21089 eventShortHeight: Number, 21090 slotEventOverlap: Boolean, 21091 plugins: identity, 21092 firstDay: Number, 21093 dayCount: Number, 21094 dateAlignment: String, 21095 dateIncrement: createDuration, 21096 hiddenDays: identity, 21097 fixedWeekCount: Boolean, 21098 validRange: identity, 21099 visibleRange: identity, 21100 titleFormat: identity, 21101 eventInteractive: Boolean, 21102 noEventsText: String, 21103 viewHint: identity, 21104 navLinkHint: identity, 21105 closeHint: String, 21106 timeHint: String, 21107 eventHint: String, 21108 moreLinkClick: identity, 21109 moreLinkClassNames: identity, 21110 moreLinkContent: identity, 21111 moreLinkDidMount: identity, 21112 moreLinkWillUnmount: identity, 21113 monthStartFormat: createFormatter, 21114 handleCustomRendering: identity, 21115 customRenderingMetaMap: identity, 21116 customRenderingReplaces: Boolean 21117 }; 21118 var BASE_OPTION_DEFAULTS = { 21119 eventDisplay: "auto", 21120 defaultRangeSeparator: " - ", 21121 titleRangeSeparator: " \u2013 ", 21122 defaultTimedEventDuration: "01:00:00", 21123 defaultAllDayEventDuration: { day: 1 }, 21124 forceEventDuration: false, 21125 nextDayThreshold: "00:00:00", 21126 dayHeaders: true, 21127 initialView: "", 21128 aspectRatio: 1.35, 21129 headerToolbar: { 21130 start: "title", 21131 center: "", 21132 end: "today prev,next" 21133 }, 21134 weekends: true, 21135 weekNumbers: false, 21136 weekNumberCalculation: "local", 21137 editable: false, 21138 nowIndicator: false, 21139 scrollTime: "06:00:00", 21140 scrollTimeReset: true, 21141 slotMinTime: "00:00:00", 21142 slotMaxTime: "24:00:00", 21143 showNonCurrentDates: true, 21144 lazyFetching: true, 21145 startParam: "start", 21146 endParam: "end", 21147 timeZoneParam: "timeZone", 21148 timeZone: "local", 21149 locales: [], 21150 locale: "", 21151 themeSystem: "standard", 21152 dragRevertDuration: 500, 21153 dragScroll: true, 21154 allDayMaintainDuration: false, 21155 unselectAuto: true, 21156 dropAccept: "*", 21157 eventOrder: "start,-duration,allDay,title", 21158 dayPopoverFormat: { month: "long", day: "numeric", year: "numeric" }, 21159 handleWindowResize: true, 21160 windowResizeDelay: 100, 21161 longPressDelay: 1e3, 21162 eventDragMinDistance: 5, 21163 expandRows: false, 21164 navLinks: false, 21165 selectable: false, 21166 eventMinHeight: 15, 21167 eventMinWidth: 30, 21168 eventShortHeight: 30, 21169 monthStartFormat: { month: "long", day: "numeric" } 21170 }; 21171 var CALENDAR_LISTENER_REFINERS = { 21172 datesSet: identity, 21173 eventsSet: identity, 21174 eventAdd: identity, 21175 eventChange: identity, 21176 eventRemove: identity, 21177 windowResize: identity, 21178 eventClick: identity, 21179 eventMouseEnter: identity, 21180 eventMouseLeave: identity, 21181 select: identity, 21182 unselect: identity, 21183 loading: identity, 21184 _unmount: identity, 21185 _beforeprint: identity, 21186 _afterprint: identity, 21187 _noEventDrop: identity, 21188 _noEventResize: identity, 21189 _resize: identity, 21190 _scrollRequest: identity 21191 }; 21192 var CALENDAR_OPTION_REFINERS = { 21193 buttonText: identity, 21194 buttonHints: identity, 21195 views: identity, 21196 plugins: identity, 21197 initialEvents: identity, 21198 events: identity, 21199 eventSources: identity 21200 }; 21201 var COMPLEX_OPTION_COMPARATORS = { 21202 headerToolbar: isMaybeObjectsEqual, 21203 footerToolbar: isMaybeObjectsEqual, 21204 buttonText: isMaybeObjectsEqual, 21205 buttonHints: isMaybeObjectsEqual, 21206 buttonIcons: isMaybeObjectsEqual, 21207 dateIncrement: isMaybeObjectsEqual, 21208 plugins: isMaybeArraysEqual, 21209 events: isMaybeArraysEqual, 21210 eventSources: isMaybeArraysEqual, 21211 ["resources"]: isMaybeArraysEqual 21212 }; 21213 function isMaybeObjectsEqual(a4, b4) { 21214 if (typeof a4 === "object" && typeof b4 === "object" && a4 && b4) { 21215 return isPropsEqual(a4, b4); 21216 } 21217 return a4 === b4; 21218 } 21219 function isMaybeArraysEqual(a4, b4) { 21220 if (Array.isArray(a4) && Array.isArray(b4)) { 21221 return isArraysEqual(a4, b4); 21222 } 21223 return a4 === b4; 21224 } 21225 var VIEW_OPTION_REFINERS = { 21226 type: String, 21227 component: identity, 21228 buttonText: String, 21229 buttonTextKey: String, 21230 dateProfileGeneratorClass: identity, 21231 usesMinMaxTime: Boolean, 21232 classNames: identity, 21233 content: identity, 21234 didMount: identity, 21235 willUnmount: identity 21236 }; 21237 function mergeRawOptions(optionSets) { 21238 return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS); 21239 } 21240 function refineProps(input, refiners) { 21241 let refined = {}; 21242 let extra = {}; 21243 for (let propName in refiners) { 21244 if (propName in input) { 21245 refined[propName] = refiners[propName](input[propName]); 21246 } 21247 } 21248 for (let propName in input) { 21249 if (!(propName in refiners)) { 21250 extra[propName] = input[propName]; 21251 } 21252 } 21253 return { refined, extra }; 21254 } 21255 function identity(raw) { 21256 return raw; 21257 } 21258 var { hasOwnProperty } = Object.prototype; 21259 function mergeProps(propObjs, complexPropsMap) { 21260 let dest = {}; 21261 if (complexPropsMap) { 21262 for (let name in complexPropsMap) { 21263 if (complexPropsMap[name] === isMaybeObjectsEqual) { 21264 let complexObjs = []; 21265 for (let i4 = propObjs.length - 1; i4 >= 0; i4 -= 1) { 21266 let val = propObjs[i4][name]; 21267 if (typeof val === "object" && val) { 21268 complexObjs.unshift(val); 21269 } else if (val !== void 0) { 21270 dest[name] = val; 21271 break; 21272 } 21273 } 21274 if (complexObjs.length) { 21275 dest[name] = mergeProps(complexObjs); 21276 } 21277 } 21278 } 21279 } 21280 for (let i4 = propObjs.length - 1; i4 >= 0; i4 -= 1) { 21281 let props = propObjs[i4]; 21282 for (let name in props) { 21283 if (!(name in dest)) { 21284 dest[name] = props[name]; 21285 } 21286 } 21287 } 21288 return dest; 21289 } 21290 function filterHash(hash3, func) { 21291 let filtered = {}; 21292 for (let key in hash3) { 21293 if (func(hash3[key], key)) { 21294 filtered[key] = hash3[key]; 21295 } 21296 } 21297 return filtered; 21298 } 21299 function mapHash(hash3, func) { 21300 let newHash = {}; 21301 for (let key in hash3) { 21302 newHash[key] = func(hash3[key], key); 21303 } 21304 return newHash; 21305 } 21306 function arrayToHash(a4) { 21307 let hash3 = {}; 21308 for (let item of a4) { 21309 hash3[item] = true; 21310 } 21311 return hash3; 21312 } 21313 function hashValuesToArray(obj) { 21314 let a4 = []; 21315 for (let key in obj) { 21316 a4.push(obj[key]); 21317 } 21318 return a4; 21319 } 21320 function isPropsEqual(obj0, obj1) { 21321 if (obj0 === obj1) { 21322 return true; 21323 } 21324 for (let key in obj0) { 21325 if (hasOwnProperty.call(obj0, key)) { 21326 if (!(key in obj1)) { 21327 return false; 21328 } 21329 } 21330 } 21331 for (let key in obj1) { 21332 if (hasOwnProperty.call(obj1, key)) { 21333 if (obj0[key] !== obj1[key]) { 21334 return false; 21335 } 21336 } 21337 } 21338 return true; 21339 } 21340 var HANDLER_RE = /^on[A-Z]/; 21341 function isNonHandlerPropsEqual(obj0, obj1) { 21342 const keys = getUnequalProps(obj0, obj1); 21343 for (let key of keys) { 21344 if (!HANDLER_RE.test(key)) { 21345 return false; 21346 } 21347 } 21348 return true; 21349 } 21350 function getUnequalProps(obj0, obj1) { 21351 let keys = []; 21352 for (let key in obj0) { 21353 if (hasOwnProperty.call(obj0, key)) { 21354 if (!(key in obj1)) { 21355 keys.push(key); 21356 } 21357 } 21358 } 21359 for (let key in obj1) { 21360 if (hasOwnProperty.call(obj1, key)) { 21361 if (obj0[key] !== obj1[key]) { 21362 keys.push(key); 21363 } 21364 } 21365 } 21366 return keys; 21367 } 21368 function compareObjs(oldProps, newProps, equalityFuncs = {}) { 21369 if (oldProps === newProps) { 21370 return true; 21371 } 21372 for (let key in newProps) { 21373 if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) 21374 ; 21375 else { 21376 return false; 21377 } 21378 } 21379 for (let key in oldProps) { 21380 if (!(key in newProps)) { 21381 return false; 21382 } 21383 } 21384 return true; 21385 } 21386 function isObjValsEqual(val0, val1, comparator) { 21387 if (val0 === val1 || comparator === true) { 21388 return true; 21389 } 21390 if (comparator) { 21391 return comparator(val0, val1); 21392 } 21393 return false; 21394 } 21395 function collectFromHash(hash3, startIndex = 0, endIndex, step = 1) { 21396 let res = []; 21397 if (endIndex == null) { 21398 endIndex = Object.keys(hash3).length; 21399 } 21400 for (let i4 = startIndex; i4 < endIndex; i4 += step) { 21401 let val = hash3[i4]; 21402 if (val !== void 0) { 21403 res.push(val); 21404 } 21405 } 21406 return res; 21407 } 21408 var calendarSystemClassMap = {}; 21409 function registerCalendarSystem(name, theClass) { 21410 calendarSystemClassMap[name] = theClass; 21411 } 21412 function createCalendarSystem(name) { 21413 return new calendarSystemClassMap[name](); 21414 } 21415 var GregorianCalendarSystem = class { 21416 getMarkerYear(d3) { 21417 return d3.getUTCFullYear(); 21418 } 21419 getMarkerMonth(d3) { 21420 return d3.getUTCMonth(); 21421 } 21422 getMarkerDay(d3) { 21423 return d3.getUTCDate(); 21424 } 21425 arrayToMarker(arr) { 21426 return arrayToUtcDate(arr); 21427 } 21428 markerToArray(marker) { 21429 return dateToUtcArray(marker); 21430 } 21431 }; 21432 registerCalendarSystem("gregory", GregorianCalendarSystem); 21433 var ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; 21434 function parse(str) { 21435 let m5 = ISO_RE.exec(str); 21436 if (m5) { 21437 let marker = new Date(Date.UTC(Number(m5[1]), m5[3] ? Number(m5[3]) - 1 : 0, Number(m5[5] || 1), Number(m5[7] || 0), Number(m5[8] || 0), Number(m5[10] || 0), m5[12] ? Number(`0.${m5[12]}`) * 1e3 : 0)); 21438 if (isValidDate(marker)) { 21439 let timeZoneOffset = null; 21440 if (m5[13]) { 21441 timeZoneOffset = (m5[15] === "-" ? -1 : 1) * (Number(m5[16] || 0) * 60 + Number(m5[18] || 0)); 21442 } 21443 return { 21444 marker, 21445 isTimeUnspecified: !m5[6], 21446 timeZoneOffset 21447 }; 21448 } 21449 } 21450 return null; 21451 } 21452 var DateEnv = class { 21453 constructor(settings) { 21454 let timeZone = this.timeZone = settings.timeZone; 21455 let isNamedTimeZone = timeZone !== "local" && timeZone !== "UTC"; 21456 if (settings.namedTimeZoneImpl && isNamedTimeZone) { 21457 this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); 21458 } 21459 this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); 21460 this.calendarSystem = createCalendarSystem(settings.calendarSystem); 21461 this.locale = settings.locale; 21462 this.weekDow = settings.locale.week.dow; 21463 this.weekDoy = settings.locale.week.doy; 21464 if (settings.weekNumberCalculation === "ISO") { 21465 this.weekDow = 1; 21466 this.weekDoy = 4; 21467 } 21468 if (typeof settings.firstDay === "number") { 21469 this.weekDow = settings.firstDay; 21470 } 21471 if (typeof settings.weekNumberCalculation === "function") { 21472 this.weekNumberFunc = settings.weekNumberCalculation; 21473 } 21474 this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText; 21475 this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText; 21476 this.cmdFormatter = settings.cmdFormatter; 21477 this.defaultSeparator = settings.defaultSeparator; 21478 } 21479 createMarker(input) { 21480 let meta = this.createMarkerMeta(input); 21481 if (meta === null) { 21482 return null; 21483 } 21484 return meta.marker; 21485 } 21486 createNowMarker() { 21487 if (this.canComputeOffset) { 21488 return this.timestampToMarker(new Date().valueOf()); 21489 } 21490 return arrayToUtcDate(dateToLocalArray(new Date())); 21491 } 21492 createMarkerMeta(input) { 21493 if (typeof input === "string") { 21494 return this.parse(input); 21495 } 21496 let marker = null; 21497 if (typeof input === "number") { 21498 marker = this.timestampToMarker(input); 21499 } else if (input instanceof Date) { 21500 input = input.valueOf(); 21501 if (!isNaN(input)) { 21502 marker = this.timestampToMarker(input); 21503 } 21504 } else if (Array.isArray(input)) { 21505 marker = arrayToUtcDate(input); 21506 } 21507 if (marker === null || !isValidDate(marker)) { 21508 return null; 21509 } 21510 return { marker, isTimeUnspecified: false, forcedTzo: null }; 21511 } 21512 parse(s4) { 21513 let parts = parse(s4); 21514 if (parts === null) { 21515 return null; 21516 } 21517 let { marker } = parts; 21518 let forcedTzo = null; 21519 if (parts.timeZoneOffset !== null) { 21520 if (this.canComputeOffset) { 21521 marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1e3); 21522 } else { 21523 forcedTzo = parts.timeZoneOffset; 21524 } 21525 } 21526 return { marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo }; 21527 } 21528 getYear(marker) { 21529 return this.calendarSystem.getMarkerYear(marker); 21530 } 21531 getMonth(marker) { 21532 return this.calendarSystem.getMarkerMonth(marker); 21533 } 21534 getDay(marker) { 21535 return this.calendarSystem.getMarkerDay(marker); 21536 } 21537 add(marker, dur) { 21538 let a4 = this.calendarSystem.markerToArray(marker); 21539 a4[0] += dur.years; 21540 a4[1] += dur.months; 21541 a4[2] += dur.days; 21542 a4[6] += dur.milliseconds; 21543 return this.calendarSystem.arrayToMarker(a4); 21544 } 21545 subtract(marker, dur) { 21546 let a4 = this.calendarSystem.markerToArray(marker); 21547 a4[0] -= dur.years; 21548 a4[1] -= dur.months; 21549 a4[2] -= dur.days; 21550 a4[6] -= dur.milliseconds; 21551 return this.calendarSystem.arrayToMarker(a4); 21552 } 21553 addYears(marker, n3) { 21554 let a4 = this.calendarSystem.markerToArray(marker); 21555 a4[0] += n3; 21556 return this.calendarSystem.arrayToMarker(a4); 21557 } 21558 addMonths(marker, n3) { 21559 let a4 = this.calendarSystem.markerToArray(marker); 21560 a4[1] += n3; 21561 return this.calendarSystem.arrayToMarker(a4); 21562 } 21563 diffWholeYears(m0, m1) { 21564 let { calendarSystem } = this; 21565 if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { 21566 return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); 21567 } 21568 return null; 21569 } 21570 diffWholeMonths(m0, m1) { 21571 let { calendarSystem } = this; 21572 if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { 21573 return calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0) + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; 21574 } 21575 return null; 21576 } 21577 greatestWholeUnit(m0, m1) { 21578 let n3 = this.diffWholeYears(m0, m1); 21579 if (n3 !== null) { 21580 return { unit: "year", value: n3 }; 21581 } 21582 n3 = this.diffWholeMonths(m0, m1); 21583 if (n3 !== null) { 21584 return { unit: "month", value: n3 }; 21585 } 21586 n3 = diffWholeWeeks(m0, m1); 21587 if (n3 !== null) { 21588 return { unit: "week", value: n3 }; 21589 } 21590 n3 = diffWholeDays(m0, m1); 21591 if (n3 !== null) { 21592 return { unit: "day", value: n3 }; 21593 } 21594 n3 = diffHours(m0, m1); 21595 if (isInt(n3)) { 21596 return { unit: "hour", value: n3 }; 21597 } 21598 n3 = diffMinutes(m0, m1); 21599 if (isInt(n3)) { 21600 return { unit: "minute", value: n3 }; 21601 } 21602 n3 = diffSeconds(m0, m1); 21603 if (isInt(n3)) { 21604 return { unit: "second", value: n3 }; 21605 } 21606 return { unit: "millisecond", value: m1.valueOf() - m0.valueOf() }; 21607 } 21608 countDurationsBetween(m0, m1, d3) { 21609 let diff; 21610 if (d3.years) { 21611 diff = this.diffWholeYears(m0, m1); 21612 if (diff !== null) { 21613 return diff / asRoughYears(d3); 21614 } 21615 } 21616 if (d3.months) { 21617 diff = this.diffWholeMonths(m0, m1); 21618 if (diff !== null) { 21619 return diff / asRoughMonths(d3); 21620 } 21621 } 21622 if (d3.days) { 21623 diff = diffWholeDays(m0, m1); 21624 if (diff !== null) { 21625 return diff / asRoughDays(d3); 21626 } 21627 } 21628 return (m1.valueOf() - m0.valueOf()) / asRoughMs(d3); 21629 } 21630 startOf(m5, unit) { 21631 if (unit === "year") { 21632 return this.startOfYear(m5); 21633 } 21634 if (unit === "month") { 21635 return this.startOfMonth(m5); 21636 } 21637 if (unit === "week") { 21638 return this.startOfWeek(m5); 21639 } 21640 if (unit === "day") { 21641 return startOfDay(m5); 21642 } 21643 if (unit === "hour") { 21644 return startOfHour(m5); 21645 } 21646 if (unit === "minute") { 21647 return startOfMinute(m5); 21648 } 21649 if (unit === "second") { 21650 return startOfSecond(m5); 21651 } 21652 return null; 21653 } 21654 startOfYear(m5) { 21655 return this.calendarSystem.arrayToMarker([ 21656 this.calendarSystem.getMarkerYear(m5) 21657 ]); 21658 } 21659 startOfMonth(m5) { 21660 return this.calendarSystem.arrayToMarker([ 21661 this.calendarSystem.getMarkerYear(m5), 21662 this.calendarSystem.getMarkerMonth(m5) 21663 ]); 21664 } 21665 startOfWeek(m5) { 21666 return this.calendarSystem.arrayToMarker([ 21667 this.calendarSystem.getMarkerYear(m5), 21668 this.calendarSystem.getMarkerMonth(m5), 21669 m5.getUTCDate() - (m5.getUTCDay() - this.weekDow + 7) % 7 21670 ]); 21671 } 21672 computeWeekNumber(marker) { 21673 if (this.weekNumberFunc) { 21674 return this.weekNumberFunc(this.toDate(marker)); 21675 } 21676 return weekOfYear(marker, this.weekDow, this.weekDoy); 21677 } 21678 format(marker, formatter, dateOptions = {}) { 21679 return formatter.format({ 21680 marker, 21681 timeZoneOffset: dateOptions.forcedTzo != null ? dateOptions.forcedTzo : this.offsetForMarker(marker) 21682 }, this); 21683 } 21684 formatRange(start5, end2, formatter, dateOptions = {}) { 21685 if (dateOptions.isEndExclusive) { 21686 end2 = addMs(end2, -1); 21687 } 21688 return formatter.formatRange({ 21689 marker: start5, 21690 timeZoneOffset: dateOptions.forcedStartTzo != null ? dateOptions.forcedStartTzo : this.offsetForMarker(start5) 21691 }, { 21692 marker: end2, 21693 timeZoneOffset: dateOptions.forcedEndTzo != null ? dateOptions.forcedEndTzo : this.offsetForMarker(end2) 21694 }, this, dateOptions.defaultSeparator); 21695 } 21696 formatIso(marker, extraOptions = {}) { 21697 let timeZoneOffset = null; 21698 if (!extraOptions.omitTimeZoneOffset) { 21699 if (extraOptions.forcedTzo != null) { 21700 timeZoneOffset = extraOptions.forcedTzo; 21701 } else { 21702 timeZoneOffset = this.offsetForMarker(marker); 21703 } 21704 } 21705 return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); 21706 } 21707 timestampToMarker(ms) { 21708 if (this.timeZone === "local") { 21709 return arrayToUtcDate(dateToLocalArray(new Date(ms))); 21710 } 21711 if (this.timeZone === "UTC" || !this.namedTimeZoneImpl) { 21712 return new Date(ms); 21713 } 21714 return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); 21715 } 21716 offsetForMarker(m5) { 21717 if (this.timeZone === "local") { 21718 return -arrayToLocalDate(dateToUtcArray(m5)).getTimezoneOffset(); 21719 } 21720 if (this.timeZone === "UTC") { 21721 return 0; 21722 } 21723 if (this.namedTimeZoneImpl) { 21724 return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m5)); 21725 } 21726 return null; 21727 } 21728 toDate(m5, forcedTzo) { 21729 if (this.timeZone === "local") { 21730 return arrayToLocalDate(dateToUtcArray(m5)); 21731 } 21732 if (this.timeZone === "UTC") { 21733 return new Date(m5.valueOf()); 21734 } 21735 if (!this.namedTimeZoneImpl) { 21736 return new Date(m5.valueOf() - (forcedTzo || 0)); 21737 } 21738 return new Date(m5.valueOf() - this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m5)) * 1e3 * 60); 21739 } 21740 }; 21741 var Theme = class { 21742 constructor(calendarOptions) { 21743 if (this.iconOverrideOption) { 21744 this.setIconOverride(calendarOptions[this.iconOverrideOption]); 21745 } 21746 } 21747 setIconOverride(iconOverrideHash) { 21748 let iconClassesCopy; 21749 let buttonName; 21750 if (typeof iconOverrideHash === "object" && iconOverrideHash) { 21751 iconClassesCopy = Object.assign({}, this.iconClasses); 21752 for (buttonName in iconOverrideHash) { 21753 iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); 21754 } 21755 this.iconClasses = iconClassesCopy; 21756 } else if (iconOverrideHash === false) { 21757 this.iconClasses = {}; 21758 } 21759 } 21760 applyIconOverridePrefix(className) { 21761 let prefix = this.iconOverridePrefix; 21762 if (prefix && className.indexOf(prefix) !== 0) { 21763 className = prefix + className; 21764 } 21765 return className; 21766 } 21767 getClass(key) { 21768 return this.classes[key] || ""; 21769 } 21770 getIconClass(buttonName, isRtl) { 21771 let className; 21772 if (isRtl && this.rtlIconClasses) { 21773 className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName]; 21774 } else { 21775 className = this.iconClasses[buttonName]; 21776 } 21777 if (className) { 21778 return `${this.baseIconClass} ${className}`; 21779 } 21780 return ""; 21781 } 21782 getCustomButtonIconClass(customButtonProps) { 21783 let className; 21784 if (this.iconOverrideCustomButtonOption) { 21785 className = customButtonProps[this.iconOverrideCustomButtonOption]; 21786 if (className) { 21787 return `${this.baseIconClass} ${this.applyIconOverridePrefix(className)}`; 21788 } 21789 } 21790 return ""; 21791 } 21792 }; 21793 Theme.prototype.classes = {}; 21794 Theme.prototype.iconClasses = {}; 21795 Theme.prototype.baseIconClass = ""; 21796 Theme.prototype.iconOverridePrefix = ""; 21797 function flushSync(runBeforeFlush) { 21798 runBeforeFlush(); 21799 let oldDebounceRendering = l2.debounceRendering; 21800 let callbackQ = []; 21801 function execCallbackSync(callback) { 21802 callbackQ.push(callback); 21803 } 21804 l2.debounceRendering = execCallbackSync; 21805 D2(y2(FakeComponent, {}), document.createElement("div")); 21806 while (callbackQ.length) { 21807 callbackQ.shift()(); 21808 } 21809 l2.debounceRendering = oldDebounceRendering; 21810 } 21811 var FakeComponent = class extends x2 { 21812 render() { 21813 return y2("div", {}); 21814 } 21815 componentDidMount() { 21816 this.setState({}); 21817 } 21818 }; 21819 function createContext(defaultValue) { 21820 let ContextType = G2(defaultValue); 21821 let origProvider = ContextType.Provider; 21822 ContextType.Provider = function() { 21823 let isNew = !this.getChildContext; 21824 let children = origProvider.apply(this, arguments); 21825 if (isNew) { 21826 let subs = []; 21827 this.shouldComponentUpdate = (_props) => { 21828 if (this.props.value !== _props.value) { 21829 subs.forEach((c4) => { 21830 c4.context = _props.value; 21831 c4.forceUpdate(); 21832 }); 21833 } 21834 }; 21835 this.sub = (c4) => { 21836 subs.push(c4); 21837 let old = c4.componentWillUnmount; 21838 c4.componentWillUnmount = () => { 21839 subs.splice(subs.indexOf(c4), 1); 21840 old && old.call(c4); 21841 }; 21842 }; 21843 } 21844 return children; 21845 }; 21846 return ContextType; 21847 } 21848 var ScrollResponder = class { 21849 constructor(execFunc, emitter, scrollTime, scrollTimeReset) { 21850 this.execFunc = execFunc; 21851 this.emitter = emitter; 21852 this.scrollTime = scrollTime; 21853 this.scrollTimeReset = scrollTimeReset; 21854 this.handleScrollRequest = (request) => { 21855 this.queuedRequest = Object.assign({}, this.queuedRequest || {}, request); 21856 this.drain(); 21857 }; 21858 emitter.on("_scrollRequest", this.handleScrollRequest); 21859 this.fireInitialScroll(); 21860 } 21861 detach() { 21862 this.emitter.off("_scrollRequest", this.handleScrollRequest); 21863 } 21864 update(isDatesNew) { 21865 if (isDatesNew && this.scrollTimeReset) { 21866 this.fireInitialScroll(); 21867 } else { 21868 this.drain(); 21869 } 21870 } 21871 fireInitialScroll() { 21872 this.handleScrollRequest({ 21873 time: this.scrollTime 21874 }); 21875 } 21876 drain() { 21877 if (this.queuedRequest && this.execFunc(this.queuedRequest)) { 21878 this.queuedRequest = null; 21879 } 21880 } 21881 }; 21882 var ViewContextType = createContext({}); 21883 function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch2, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) { 21884 return { 21885 dateEnv, 21886 options: viewOptions, 21887 pluginHooks, 21888 emitter, 21889 dispatch: dispatch2, 21890 getCurrentData, 21891 calendarApi, 21892 viewSpec, 21893 viewApi, 21894 dateProfileGenerator, 21895 theme, 21896 isRtl: viewOptions.direction === "rtl", 21897 addResizeHandler(handler) { 21898 emitter.on("_resize", handler); 21899 }, 21900 removeResizeHandler(handler) { 21901 emitter.off("_resize", handler); 21902 }, 21903 createScrollResponder(execFunc) { 21904 return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset); 21905 }, 21906 registerInteractiveComponent, 21907 unregisterInteractiveComponent 21908 }; 21909 } 21910 var PureComponent = class extends x2 { 21911 shouldComponentUpdate(nextProps, nextState) { 21912 if (this.debug) { 21913 console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state)); 21914 } 21915 return !compareObjs(this.props, nextProps, this.propEquality) || !compareObjs(this.state, nextState, this.stateEquality); 21916 } 21917 safeSetState(newState) { 21918 if (!compareObjs(this.state, Object.assign(Object.assign({}, this.state), newState), this.stateEquality)) { 21919 this.setState(newState); 21920 } 21921 } 21922 }; 21923 PureComponent.addPropsEquality = addPropsEquality; 21924 PureComponent.addStateEquality = addStateEquality; 21925 PureComponent.contextType = ViewContextType; 21926 PureComponent.prototype.propEquality = {}; 21927 PureComponent.prototype.stateEquality = {}; 21928 var BaseComponent = class extends PureComponent { 21929 }; 21930 BaseComponent.contextType = ViewContextType; 21931 function addPropsEquality(propEquality) { 21932 let hash3 = Object.create(this.prototype.propEquality); 21933 Object.assign(hash3, propEquality); 21934 this.prototype.propEquality = hash3; 21935 } 21936 function addStateEquality(stateEquality) { 21937 let hash3 = Object.create(this.prototype.stateEquality); 21938 Object.assign(hash3, stateEquality); 21939 this.prototype.stateEquality = hash3; 21940 } 21941 function setRef(ref, current) { 21942 if (typeof ref === "function") { 21943 ref(current); 21944 } else if (ref) { 21945 ref.current = current; 21946 } 21947 } 21948 var ContentInjector = class extends BaseComponent { 21949 constructor() { 21950 super(...arguments); 21951 this.id = guid(); 21952 this.queuedDomNodes = []; 21953 this.currentDomNodes = []; 21954 this.handleEl = (el) => { 21955 const { options } = this.context; 21956 const { generatorName } = this.props; 21957 if (!options.customRenderingReplaces || !hasCustomRenderingHandler(generatorName, options)) { 21958 this.updateElRef(el); 21959 } 21960 }; 21961 this.updateElRef = (el) => { 21962 if (this.props.elRef) { 21963 setRef(this.props.elRef, el); 21964 } 21965 }; 21966 } 21967 render() { 21968 const { props, context } = this; 21969 const { options } = context; 21970 const { customGenerator, defaultGenerator, renderProps } = props; 21971 const attrs = buildElAttrs(props, [], this.handleEl); 21972 let useDefault = false; 21973 let innerContent; 21974 let queuedDomNodes = []; 21975 let currentGeneratorMeta; 21976 if (customGenerator != null) { 21977 const customGeneratorRes = typeof customGenerator === "function" ? customGenerator(renderProps, y2) : customGenerator; 21978 if (customGeneratorRes === true) { 21979 useDefault = true; 21980 } else { 21981 const isObject3 = customGeneratorRes && typeof customGeneratorRes === "object"; 21982 if (isObject3 && "html" in customGeneratorRes) { 21983 attrs.dangerouslySetInnerHTML = { __html: customGeneratorRes.html }; 21984 } else if (isObject3 && "domNodes" in customGeneratorRes) { 21985 queuedDomNodes = Array.prototype.slice.call(customGeneratorRes.domNodes); 21986 } else if (isObject3 ? i2(customGeneratorRes) : typeof customGeneratorRes !== "function") { 21987 innerContent = customGeneratorRes; 21988 } else { 21989 currentGeneratorMeta = customGeneratorRes; 21990 } 21991 } 21992 } else { 21993 useDefault = !hasCustomRenderingHandler(props.generatorName, options); 21994 } 21995 if (useDefault && defaultGenerator) { 21996 innerContent = defaultGenerator(renderProps); 21997 } 21998 this.queuedDomNodes = queuedDomNodes; 21999 this.currentGeneratorMeta = currentGeneratorMeta; 22000 return y2(props.elTag, attrs, innerContent); 22001 } 22002 componentDidMount() { 22003 this.applyQueueudDomNodes(); 22004 this.triggerCustomRendering(true); 22005 } 22006 componentDidUpdate() { 22007 this.applyQueueudDomNodes(); 22008 this.triggerCustomRendering(true); 22009 } 22010 componentWillUnmount() { 22011 this.triggerCustomRendering(false); 22012 } 22013 triggerCustomRendering(isActive) { 22014 var _a; 22015 const { props, context } = this; 22016 const { handleCustomRendering, customRenderingMetaMap } = context.options; 22017 if (handleCustomRendering) { 22018 const generatorMeta = (_a = this.currentGeneratorMeta) !== null && _a !== void 0 ? _a : customRenderingMetaMap === null || customRenderingMetaMap === void 0 ? void 0 : customRenderingMetaMap[props.generatorName]; 22019 if (generatorMeta) { 22020 handleCustomRendering(Object.assign(Object.assign({ 22021 id: this.id, 22022 isActive, 22023 containerEl: this.base, 22024 reportNewContainerEl: this.updateElRef, 22025 generatorMeta 22026 }, props), { elClasses: (props.elClasses || []).filter(isTruthy) })); 22027 } 22028 } 22029 } 22030 applyQueueudDomNodes() { 22031 const { queuedDomNodes, currentDomNodes } = this; 22032 const el = this.base; 22033 if (!isArraysEqual(queuedDomNodes, currentDomNodes)) { 22034 currentDomNodes.forEach(removeElement); 22035 for (let newNode of queuedDomNodes) { 22036 el.appendChild(newNode); 22037 } 22038 this.currentDomNodes = queuedDomNodes; 22039 } 22040 } 22041 }; 22042 ContentInjector.addPropsEquality({ 22043 elClasses: isArraysEqual, 22044 elStyle: isPropsEqual, 22045 elAttrs: isNonHandlerPropsEqual, 22046 renderProps: isPropsEqual 22047 }); 22048 function hasCustomRenderingHandler(generatorName, options) { 22049 var _a; 22050 return Boolean(options.handleCustomRendering && generatorName && ((_a = options.customRenderingMetaMap) === null || _a === void 0 ? void 0 : _a[generatorName])); 22051 } 22052 function buildElAttrs(props, extraClassNames, elRef) { 22053 const attrs = Object.assign(Object.assign({}, props.elAttrs), { ref: elRef }); 22054 if (props.elClasses || extraClassNames) { 22055 attrs.className = (props.elClasses || []).concat(extraClassNames || []).concat(attrs.className || []).filter(Boolean).join(" "); 22056 } 22057 if (props.elStyle) { 22058 attrs.style = props.elStyle; 22059 } 22060 return attrs; 22061 } 22062 function isTruthy(val) { 22063 return Boolean(val); 22064 } 22065 var RenderId = createContext(0); 22066 var ContentContainer = class extends x2 { 22067 constructor() { 22068 super(...arguments); 22069 this.InnerContent = InnerContentInjector.bind(void 0, this); 22070 this.handleEl = (el) => { 22071 this.el = el; 22072 if (this.props.elRef) { 22073 setRef(this.props.elRef, el); 22074 if (el && this.didMountMisfire) { 22075 this.componentDidMount(); 22076 } 22077 } 22078 }; 22079 } 22080 render() { 22081 const { props } = this; 22082 const generatedClassNames = generateClassNames(props.classNameGenerator, props.renderProps); 22083 if (props.children) { 22084 const elAttrs = buildElAttrs(props, generatedClassNames, this.handleEl); 22085 const children = props.children(this.InnerContent, props.renderProps, elAttrs); 22086 if (props.elTag) { 22087 return y2(props.elTag, elAttrs, children); 22088 } else { 22089 return children; 22090 } 22091 } else { 22092 return y2(ContentInjector, Object.assign(Object.assign({}, props), { elRef: this.handleEl, elTag: props.elTag || "div", elClasses: (props.elClasses || []).concat(generatedClassNames), renderId: this.context })); 22093 } 22094 } 22095 componentDidMount() { 22096 var _a, _b; 22097 if (this.el) { 22098 (_b = (_a = this.props).didMount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.el })); 22099 } else { 22100 this.didMountMisfire = true; 22101 } 22102 } 22103 componentWillUnmount() { 22104 var _a, _b; 22105 (_b = (_a = this.props).willUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.el })); 22106 } 22107 }; 22108 ContentContainer.contextType = RenderId; 22109 function InnerContentInjector(containerComponent, props) { 22110 const parentProps = containerComponent.props; 22111 return y2(ContentInjector, Object.assign({ renderProps: parentProps.renderProps, generatorName: parentProps.generatorName, customGenerator: parentProps.customGenerator, defaultGenerator: parentProps.defaultGenerator, renderId: containerComponent.context }, props)); 22112 } 22113 function generateClassNames(classNameGenerator, renderProps) { 22114 const classNames = typeof classNameGenerator === "function" ? classNameGenerator(renderProps) : classNameGenerator || []; 22115 return typeof classNames === "string" ? [classNames] : classNames; 22116 } 22117 var ViewContainer = class extends BaseComponent { 22118 render() { 22119 let { props, context } = this; 22120 let { options } = context; 22121 let renderProps = { view: context.viewApi }; 22122 return y2(ContentContainer, Object.assign({}, props, { elTag: props.elTag || "div", elClasses: [ 22123 ...buildViewClassNames(props.viewSpec), 22124 ...props.elClasses || [] 22125 ], renderProps, classNameGenerator: options.viewClassNames, generatorName: void 0, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children); 22126 } 22127 }; 22128 function buildViewClassNames(viewSpec) { 22129 return [ 22130 `fc-${viewSpec.type}-view`, 22131 "fc-view" 22132 ]; 22133 } 22134 function parseRange(input, dateEnv) { 22135 let start5 = null; 22136 let end2 = null; 22137 if (input.start) { 22138 start5 = dateEnv.createMarker(input.start); 22139 } 22140 if (input.end) { 22141 end2 = dateEnv.createMarker(input.end); 22142 } 22143 if (!start5 && !end2) { 22144 return null; 22145 } 22146 if (start5 && end2 && end2 < start5) { 22147 return null; 22148 } 22149 return { start: start5, end: end2 }; 22150 } 22151 function invertRanges(ranges, constraintRange) { 22152 let invertedRanges = []; 22153 let { start: start5 } = constraintRange; 22154 let i4; 22155 let dateRange; 22156 ranges.sort(compareRanges); 22157 for (i4 = 0; i4 < ranges.length; i4 += 1) { 22158 dateRange = ranges[i4]; 22159 if (dateRange.start > start5) { 22160 invertedRanges.push({ start: start5, end: dateRange.start }); 22161 } 22162 if (dateRange.end > start5) { 22163 start5 = dateRange.end; 22164 } 22165 } 22166 if (start5 < constraintRange.end) { 22167 invertedRanges.push({ start: start5, end: constraintRange.end }); 22168 } 22169 return invertedRanges; 22170 } 22171 function compareRanges(range0, range1) { 22172 return range0.start.valueOf() - range1.start.valueOf(); 22173 } 22174 function intersectRanges(range0, range1) { 22175 let { start: start5, end: end2 } = range0; 22176 let newRange = null; 22177 if (range1.start !== null) { 22178 if (start5 === null) { 22179 start5 = range1.start; 22180 } else { 22181 start5 = new Date(Math.max(start5.valueOf(), range1.start.valueOf())); 22182 } 22183 } 22184 if (range1.end != null) { 22185 if (end2 === null) { 22186 end2 = range1.end; 22187 } else { 22188 end2 = new Date(Math.min(end2.valueOf(), range1.end.valueOf())); 22189 } 22190 } 22191 if (start5 === null || end2 === null || start5 < end2) { 22192 newRange = { start: start5, end: end2 }; 22193 } 22194 return newRange; 22195 } 22196 function rangesIntersect(range0, range1) { 22197 return (range0.end === null || range1.start === null || range0.end > range1.start) && (range0.start === null || range1.end === null || range0.start < range1.end); 22198 } 22199 function rangeContainsMarker(range, date) { 22200 return (range.start === null || date >= range.start) && (range.end === null || date < range.end); 22201 } 22202 function constrainMarkerToRange(date, range) { 22203 if (range.start != null && date < range.start) { 22204 return range.start; 22205 } 22206 if (range.end != null && date >= range.end) { 22207 return new Date(range.end.valueOf() - 1); 22208 } 22209 return date; 22210 } 22211 function computeAlignedDayRange(timedRange) { 22212 let dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; 22213 let start5 = startOfDay(timedRange.start); 22214 let end2 = addDays(start5, dayCnt); 22215 return { start: start5, end: end2 }; 22216 } 22217 function computeVisibleDayRange(timedRange, nextDayThreshold = createDuration(0)) { 22218 let startDay = null; 22219 let endDay = null; 22220 if (timedRange.end) { 22221 endDay = startOfDay(timedRange.end); 22222 let endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); 22223 if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { 22224 endDay = addDays(endDay, 1); 22225 } 22226 } 22227 if (timedRange.start) { 22228 startDay = startOfDay(timedRange.start); 22229 if (endDay && endDay <= startDay) { 22230 endDay = addDays(startDay, 1); 22231 } 22232 } 22233 return { start: startDay, end: endDay }; 22234 } 22235 function isMultiDayRange(range) { 22236 let visibleRange = computeVisibleDayRange(range); 22237 return diffDays(visibleRange.start, visibleRange.end) > 1; 22238 } 22239 function diffDates(date0, date1, dateEnv, largeUnit) { 22240 if (largeUnit === "year") { 22241 return createDuration(dateEnv.diffWholeYears(date0, date1), "year"); 22242 } 22243 if (largeUnit === "month") { 22244 return createDuration(dateEnv.diffWholeMonths(date0, date1), "month"); 22245 } 22246 return diffDayAndTime(date0, date1); 22247 } 22248 function reduceCurrentDate(currentDate, action) { 22249 switch (action.type) { 22250 case "CHANGE_DATE": 22251 return action.dateMarker; 22252 default: 22253 return currentDate; 22254 } 22255 } 22256 function getInitialDate(options, dateEnv) { 22257 let initialDateInput = options.initialDate; 22258 if (initialDateInput != null) { 22259 return dateEnv.createMarker(initialDateInput); 22260 } 22261 return getNow(options.now, dateEnv); 22262 } 22263 function getNow(nowInput, dateEnv) { 22264 if (typeof nowInput === "function") { 22265 nowInput = nowInput(); 22266 } 22267 if (nowInput == null) { 22268 return dateEnv.createNowMarker(); 22269 } 22270 return dateEnv.createMarker(nowInput); 22271 } 22272 var DateProfileGenerator = class { 22273 constructor(props) { 22274 this.props = props; 22275 this.nowDate = getNow(props.nowInput, props.dateEnv); 22276 this.initHiddenDays(); 22277 } 22278 buildPrev(currentDateProfile, currentDate, forceToValid) { 22279 let { dateEnv } = this.props; 22280 let prevDate = dateEnv.subtract( 22281 dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), 22282 currentDateProfile.dateIncrement 22283 ); 22284 return this.build(prevDate, -1, forceToValid); 22285 } 22286 buildNext(currentDateProfile, currentDate, forceToValid) { 22287 let { dateEnv } = this.props; 22288 let nextDate = dateEnv.add( 22289 dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), 22290 currentDateProfile.dateIncrement 22291 ); 22292 return this.build(nextDate, 1, forceToValid); 22293 } 22294 build(currentDate, direction, forceToValid = true) { 22295 let { props } = this; 22296 let validRange; 22297 let currentInfo; 22298 let isRangeAllDay; 22299 let renderRange; 22300 let activeRange; 22301 let isValid; 22302 validRange = this.buildValidRange(); 22303 validRange = this.trimHiddenDays(validRange); 22304 if (forceToValid) { 22305 currentDate = constrainMarkerToRange(currentDate, validRange); 22306 } 22307 currentInfo = this.buildCurrentRangeInfo(currentDate, direction); 22308 isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); 22309 renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); 22310 renderRange = this.trimHiddenDays(renderRange); 22311 activeRange = renderRange; 22312 if (!props.showNonCurrentDates) { 22313 activeRange = intersectRanges(activeRange, currentInfo.range); 22314 } 22315 activeRange = this.adjustActiveRange(activeRange); 22316 activeRange = intersectRanges(activeRange, validRange); 22317 isValid = rangesIntersect(currentInfo.range, validRange); 22318 if (!rangeContainsMarker(renderRange, currentDate)) { 22319 currentDate = renderRange.start; 22320 } 22321 return { 22322 currentDate, 22323 validRange, 22324 currentRange: currentInfo.range, 22325 currentRangeUnit: currentInfo.unit, 22326 isRangeAllDay, 22327 activeRange, 22328 renderRange, 22329 slotMinTime: props.slotMinTime, 22330 slotMaxTime: props.slotMaxTime, 22331 isValid, 22332 dateIncrement: this.buildDateIncrement(currentInfo.duration) 22333 }; 22334 } 22335 buildValidRange() { 22336 let input = this.props.validRangeInput; 22337 let simpleInput = typeof input === "function" ? input.call(this.props.calendarApi, this.nowDate) : input; 22338 return this.refineRange(simpleInput) || { start: null, end: null }; 22339 } 22340 buildCurrentRangeInfo(date, direction) { 22341 let { props } = this; 22342 let duration = null; 22343 let unit = null; 22344 let range = null; 22345 let dayCount; 22346 if (props.duration) { 22347 duration = props.duration; 22348 unit = props.durationUnit; 22349 range = this.buildRangeFromDuration(date, direction, duration, unit); 22350 } else if (dayCount = this.props.dayCount) { 22351 unit = "day"; 22352 range = this.buildRangeFromDayCount(date, direction, dayCount); 22353 } else if (range = this.buildCustomVisibleRange(date)) { 22354 unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit; 22355 } else { 22356 duration = this.getFallbackDuration(); 22357 unit = greatestDurationDenominator(duration).unit; 22358 range = this.buildRangeFromDuration(date, direction, duration, unit); 22359 } 22360 return { duration, unit, range }; 22361 } 22362 getFallbackDuration() { 22363 return createDuration({ day: 1 }); 22364 } 22365 adjustActiveRange(range) { 22366 let { dateEnv, usesMinMaxTime, slotMinTime, slotMaxTime } = this.props; 22367 let { start: start5, end: end2 } = range; 22368 if (usesMinMaxTime) { 22369 if (asRoughDays(slotMinTime) < 0) { 22370 start5 = startOfDay(start5); 22371 start5 = dateEnv.add(start5, slotMinTime); 22372 } 22373 if (asRoughDays(slotMaxTime) > 1) { 22374 end2 = startOfDay(end2); 22375 end2 = addDays(end2, -1); 22376 end2 = dateEnv.add(end2, slotMaxTime); 22377 } 22378 } 22379 return { start: start5, end: end2 }; 22380 } 22381 buildRangeFromDuration(date, direction, duration, unit) { 22382 let { dateEnv, dateAlignment } = this.props; 22383 let start5; 22384 let end2; 22385 let res; 22386 if (!dateAlignment) { 22387 let { dateIncrement } = this.props; 22388 if (dateIncrement) { 22389 if (asRoughMs(dateIncrement) < asRoughMs(duration)) { 22390 dateAlignment = greatestDurationDenominator(dateIncrement).unit; 22391 } else { 22392 dateAlignment = unit; 22393 } 22394 } else { 22395 dateAlignment = unit; 22396 } 22397 } 22398 if (asRoughDays(duration) <= 1) { 22399 if (this.isHiddenDay(start5)) { 22400 start5 = this.skipHiddenDays(start5, direction); 22401 start5 = startOfDay(start5); 22402 } 22403 } 22404 function computeRes() { 22405 start5 = dateEnv.startOf(date, dateAlignment); 22406 end2 = dateEnv.add(start5, duration); 22407 res = { start: start5, end: end2 }; 22408 } 22409 computeRes(); 22410 if (!this.trimHiddenDays(res)) { 22411 date = this.skipHiddenDays(date, direction); 22412 computeRes(); 22413 } 22414 return res; 22415 } 22416 buildRangeFromDayCount(date, direction, dayCount) { 22417 let { dateEnv, dateAlignment } = this.props; 22418 let runningCount = 0; 22419 let start5 = date; 22420 let end2; 22421 if (dateAlignment) { 22422 start5 = dateEnv.startOf(start5, dateAlignment); 22423 } 22424 start5 = startOfDay(start5); 22425 start5 = this.skipHiddenDays(start5, direction); 22426 end2 = start5; 22427 do { 22428 end2 = addDays(end2, 1); 22429 if (!this.isHiddenDay(end2)) { 22430 runningCount += 1; 22431 } 22432 } while (runningCount < dayCount); 22433 return { start: start5, end: end2 }; 22434 } 22435 buildCustomVisibleRange(date) { 22436 let { props } = this; 22437 let input = props.visibleRangeInput; 22438 let simpleInput = typeof input === "function" ? input.call(props.calendarApi, props.dateEnv.toDate(date)) : input; 22439 let range = this.refineRange(simpleInput); 22440 if (range && (range.start == null || range.end == null)) { 22441 return null; 22442 } 22443 return range; 22444 } 22445 buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { 22446 return currentRange; 22447 } 22448 buildDateIncrement(fallback) { 22449 let { dateIncrement } = this.props; 22450 let customAlignment; 22451 if (dateIncrement) { 22452 return dateIncrement; 22453 } 22454 if (customAlignment = this.props.dateAlignment) { 22455 return createDuration(1, customAlignment); 22456 } 22457 if (fallback) { 22458 return fallback; 22459 } 22460 return createDuration({ days: 1 }); 22461 } 22462 refineRange(rangeInput) { 22463 if (rangeInput) { 22464 let range = parseRange(rangeInput, this.props.dateEnv); 22465 if (range) { 22466 range = computeVisibleDayRange(range); 22467 } 22468 return range; 22469 } 22470 return null; 22471 } 22472 initHiddenDays() { 22473 let hiddenDays = this.props.hiddenDays || []; 22474 let isHiddenDayHash = []; 22475 let dayCnt = 0; 22476 let i4; 22477 if (this.props.weekends === false) { 22478 hiddenDays.push(0, 6); 22479 } 22480 for (i4 = 0; i4 < 7; i4 += 1) { 22481 if (!(isHiddenDayHash[i4] = hiddenDays.indexOf(i4) !== -1)) { 22482 dayCnt += 1; 22483 } 22484 } 22485 if (!dayCnt) { 22486 throw new Error("invalid hiddenDays"); 22487 } 22488 this.isHiddenDayHash = isHiddenDayHash; 22489 } 22490 trimHiddenDays(range) { 22491 let { start: start5, end: end2 } = range; 22492 if (start5) { 22493 start5 = this.skipHiddenDays(start5); 22494 } 22495 if (end2) { 22496 end2 = this.skipHiddenDays(end2, -1, true); 22497 } 22498 if (start5 == null || end2 == null || start5 < end2) { 22499 return { start: start5, end: end2 }; 22500 } 22501 return null; 22502 } 22503 isHiddenDay(day) { 22504 if (day instanceof Date) { 22505 day = day.getUTCDay(); 22506 } 22507 return this.isHiddenDayHash[day]; 22508 } 22509 skipHiddenDays(date, inc = 1, isExclusive = false) { 22510 while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { 22511 date = addDays(date, inc); 22512 } 22513 return date; 22514 } 22515 }; 22516 function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { 22517 return { 22518 instanceId: guid(), 22519 defId, 22520 range, 22521 forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, 22522 forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo 22523 }; 22524 } 22525 function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) { 22526 for (let i4 = 0; i4 < recurringTypes.length; i4 += 1) { 22527 let parsed = recurringTypes[i4].parse(refined, dateEnv); 22528 if (parsed) { 22529 let { allDay } = refined; 22530 if (allDay == null) { 22531 allDay = defaultAllDay; 22532 if (allDay == null) { 22533 allDay = parsed.allDayGuess; 22534 if (allDay == null) { 22535 allDay = false; 22536 } 22537 } 22538 } 22539 return { 22540 allDay, 22541 duration: parsed.duration, 22542 typeData: parsed.typeData, 22543 typeId: i4 22544 }; 22545 } 22546 } 22547 return null; 22548 } 22549 function expandRecurring(eventStore, framingRange, context) { 22550 let { dateEnv, pluginHooks, options } = context; 22551 let { defs, instances } = eventStore; 22552 instances = filterHash(instances, (instance) => !defs[instance.defId].recurringDef); 22553 for (let defId in defs) { 22554 let def = defs[defId]; 22555 if (def.recurringDef) { 22556 let { duration } = def.recurringDef; 22557 if (!duration) { 22558 duration = def.allDay ? options.defaultAllDayEventDuration : options.defaultTimedEventDuration; 22559 } 22560 let starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes); 22561 for (let start5 of starts) { 22562 let instance = createEventInstance(defId, { 22563 start: start5, 22564 end: dateEnv.add(start5, duration) 22565 }); 22566 instances[instance.instanceId] = instance; 22567 } 22568 } 22569 } 22570 return { defs, instances }; 22571 } 22572 function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { 22573 let typeDef = recurringTypes[eventDef.recurringDef.typeId]; 22574 let markers = typeDef.expand(eventDef.recurringDef.typeData, { 22575 start: dateEnv.subtract(framingRange.start, duration), 22576 end: framingRange.end 22577 }, dateEnv); 22578 if (eventDef.allDay) { 22579 markers = markers.map(startOfDay); 22580 } 22581 return markers; 22582 } 22583 var EVENT_NON_DATE_REFINERS = { 22584 id: String, 22585 groupId: String, 22586 title: String, 22587 url: String, 22588 interactive: Boolean 22589 }; 22590 var EVENT_DATE_REFINERS = { 22591 start: identity, 22592 end: identity, 22593 date: identity, 22594 allDay: Boolean 22595 }; 22596 var EVENT_REFINERS = Object.assign(Object.assign(Object.assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity }); 22597 function parseEvent(raw, eventSource, context, allowOpenRange, refiners = buildEventRefiners(context), defIdMap, instanceIdMap) { 22598 let { refined, extra } = refineEventDef(raw, context, refiners); 22599 let defaultAllDay = computeIsDefaultAllDay(eventSource, context); 22600 let recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes); 22601 if (recurringRes) { 22602 let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : "", recurringRes.allDay, Boolean(recurringRes.duration), context, defIdMap); 22603 def.recurringDef = { 22604 typeId: recurringRes.typeId, 22605 typeData: recurringRes.typeData, 22606 duration: recurringRes.duration 22607 }; 22608 return { def, instance: null }; 22609 } 22610 let singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange); 22611 if (singleRes) { 22612 let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : "", singleRes.allDay, singleRes.hasEnd, context, defIdMap); 22613 let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); 22614 if (instanceIdMap && def.publicId && instanceIdMap[def.publicId]) { 22615 instance.instanceId = instanceIdMap[def.publicId]; 22616 } 22617 return { def, instance }; 22618 } 22619 return null; 22620 } 22621 function refineEventDef(raw, context, refiners = buildEventRefiners(context)) { 22622 return refineProps(raw, refiners); 22623 } 22624 function buildEventRefiners(context) { 22625 return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners); 22626 } 22627 function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context, defIdMap) { 22628 let def = { 22629 title: refined.title || "", 22630 groupId: refined.groupId || "", 22631 publicId: refined.id || "", 22632 url: refined.url || "", 22633 recurringDef: null, 22634 defId: (defIdMap && refined.id ? defIdMap[refined.id] : "") || guid(), 22635 sourceId, 22636 allDay, 22637 hasEnd, 22638 interactive: refined.interactive, 22639 ui: createEventUi(refined, context), 22640 extendedProps: Object.assign(Object.assign({}, refined.extendedProps || {}), extra) 22641 }; 22642 for (let memberAdder of context.pluginHooks.eventDefMemberAdders) { 22643 Object.assign(def, memberAdder(refined)); 22644 } 22645 Object.freeze(def.ui.classNames); 22646 Object.freeze(def.extendedProps); 22647 return def; 22648 } 22649 function parseSingle(refined, defaultAllDay, context, allowOpenRange) { 22650 let { allDay } = refined; 22651 let startMeta; 22652 let startMarker = null; 22653 let hasEnd = false; 22654 let endMeta; 22655 let endMarker = null; 22656 let startInput = refined.start != null ? refined.start : refined.date; 22657 startMeta = context.dateEnv.createMarkerMeta(startInput); 22658 if (startMeta) { 22659 startMarker = startMeta.marker; 22660 } else if (!allowOpenRange) { 22661 return null; 22662 } 22663 if (refined.end != null) { 22664 endMeta = context.dateEnv.createMarkerMeta(refined.end); 22665 } 22666 if (allDay == null) { 22667 if (defaultAllDay != null) { 22668 allDay = defaultAllDay; 22669 } else { 22670 allDay = (!startMeta || startMeta.isTimeUnspecified) && (!endMeta || endMeta.isTimeUnspecified); 22671 } 22672 } 22673 if (allDay && startMarker) { 22674 startMarker = startOfDay(startMarker); 22675 } 22676 if (endMeta) { 22677 endMarker = endMeta.marker; 22678 if (allDay) { 22679 endMarker = startOfDay(endMarker); 22680 } 22681 if (startMarker && endMarker <= startMarker) { 22682 endMarker = null; 22683 } 22684 } 22685 if (endMarker) { 22686 hasEnd = true; 22687 } else if (!allowOpenRange) { 22688 hasEnd = context.options.forceEventDuration || false; 22689 endMarker = context.dateEnv.add(startMarker, allDay ? context.options.defaultAllDayEventDuration : context.options.defaultTimedEventDuration); 22690 } 22691 return { 22692 allDay, 22693 hasEnd, 22694 range: { start: startMarker, end: endMarker }, 22695 forcedStartTzo: startMeta ? startMeta.forcedTzo : null, 22696 forcedEndTzo: endMeta ? endMeta.forcedTzo : null 22697 }; 22698 } 22699 function computeIsDefaultAllDay(eventSource, context) { 22700 let res = null; 22701 if (eventSource) { 22702 res = eventSource.defaultAllDay; 22703 } 22704 if (res == null) { 22705 res = context.options.defaultAllDay; 22706 } 22707 return res; 22708 } 22709 function parseEvents(rawEvents, eventSource, context, allowOpenRange, defIdMap, instanceIdMap) { 22710 let eventStore = createEmptyEventStore(); 22711 let eventRefiners = buildEventRefiners(context); 22712 for (let rawEvent of rawEvents) { 22713 let tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners, defIdMap, instanceIdMap); 22714 if (tuple) { 22715 eventTupleToStore(tuple, eventStore); 22716 } 22717 } 22718 return eventStore; 22719 } 22720 function eventTupleToStore(tuple, eventStore = createEmptyEventStore()) { 22721 eventStore.defs[tuple.def.defId] = tuple.def; 22722 if (tuple.instance) { 22723 eventStore.instances[tuple.instance.instanceId] = tuple.instance; 22724 } 22725 return eventStore; 22726 } 22727 function getRelevantEvents(eventStore, instanceId) { 22728 let instance = eventStore.instances[instanceId]; 22729 if (instance) { 22730 let def = eventStore.defs[instance.defId]; 22731 let newStore = filterEventStoreDefs(eventStore, (lookDef) => isEventDefsGrouped(def, lookDef)); 22732 newStore.defs[def.defId] = def; 22733 newStore.instances[instance.instanceId] = instance; 22734 return newStore; 22735 } 22736 return createEmptyEventStore(); 22737 } 22738 function isEventDefsGrouped(def0, def1) { 22739 return Boolean(def0.groupId && def0.groupId === def1.groupId); 22740 } 22741 function createEmptyEventStore() { 22742 return { defs: {}, instances: {} }; 22743 } 22744 function mergeEventStores(store0, store1) { 22745 return { 22746 defs: Object.assign(Object.assign({}, store0.defs), store1.defs), 22747 instances: Object.assign(Object.assign({}, store0.instances), store1.instances) 22748 }; 22749 } 22750 function filterEventStoreDefs(eventStore, filterFunc) { 22751 let defs = filterHash(eventStore.defs, filterFunc); 22752 let instances = filterHash(eventStore.instances, (instance) => defs[instance.defId]); 22753 return { defs, instances }; 22754 } 22755 function excludeSubEventStore(master, sub) { 22756 let { defs, instances } = master; 22757 let filteredDefs = {}; 22758 let filteredInstances = {}; 22759 for (let defId in defs) { 22760 if (!sub.defs[defId]) { 22761 filteredDefs[defId] = defs[defId]; 22762 } 22763 } 22764 for (let instanceId in instances) { 22765 if (!sub.instances[instanceId] && filteredDefs[instances[instanceId].defId]) { 22766 filteredInstances[instanceId] = instances[instanceId]; 22767 } 22768 } 22769 return { 22770 defs: filteredDefs, 22771 instances: filteredInstances 22772 }; 22773 } 22774 function normalizeConstraint(input, context) { 22775 if (Array.isArray(input)) { 22776 return parseEvents(input, null, context, true); 22777 } 22778 if (typeof input === "object" && input) { 22779 return parseEvents([input], null, context, true); 22780 } 22781 if (input != null) { 22782 return String(input); 22783 } 22784 return null; 22785 } 22786 function parseClassNames(raw) { 22787 if (Array.isArray(raw)) { 22788 return raw; 22789 } 22790 if (typeof raw === "string") { 22791 return raw.split(/\s+/); 22792 } 22793 return []; 22794 } 22795 var EVENT_UI_REFINERS = { 22796 display: String, 22797 editable: Boolean, 22798 startEditable: Boolean, 22799 durationEditable: Boolean, 22800 constraint: identity, 22801 overlap: identity, 22802 allow: identity, 22803 className: parseClassNames, 22804 classNames: parseClassNames, 22805 color: String, 22806 backgroundColor: String, 22807 borderColor: String, 22808 textColor: String 22809 }; 22810 var EMPTY_EVENT_UI = { 22811 display: null, 22812 startEditable: null, 22813 durationEditable: null, 22814 constraints: [], 22815 overlap: null, 22816 allows: [], 22817 backgroundColor: "", 22818 borderColor: "", 22819 textColor: "", 22820 classNames: [] 22821 }; 22822 function createEventUi(refined, context) { 22823 let constraint = normalizeConstraint(refined.constraint, context); 22824 return { 22825 display: refined.display || null, 22826 startEditable: refined.startEditable != null ? refined.startEditable : refined.editable, 22827 durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable, 22828 constraints: constraint != null ? [constraint] : [], 22829 overlap: refined.overlap != null ? refined.overlap : null, 22830 allows: refined.allow != null ? [refined.allow] : [], 22831 backgroundColor: refined.backgroundColor || refined.color || "", 22832 borderColor: refined.borderColor || refined.color || "", 22833 textColor: refined.textColor || "", 22834 classNames: (refined.className || []).concat(refined.classNames || []) 22835 }; 22836 } 22837 function combineEventUis(uis) { 22838 return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); 22839 } 22840 function combineTwoEventUis(item0, item1) { 22841 return { 22842 display: item1.display != null ? item1.display : item0.display, 22843 startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, 22844 durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, 22845 constraints: item0.constraints.concat(item1.constraints), 22846 overlap: typeof item1.overlap === "boolean" ? item1.overlap : item0.overlap, 22847 allows: item0.allows.concat(item1.allows), 22848 backgroundColor: item1.backgroundColor || item0.backgroundColor, 22849 borderColor: item1.borderColor || item0.borderColor, 22850 textColor: item1.textColor || item0.textColor, 22851 classNames: item0.classNames.concat(item1.classNames) 22852 }; 22853 } 22854 var EVENT_SOURCE_REFINERS = { 22855 id: String, 22856 defaultAllDay: Boolean, 22857 url: String, 22858 format: String, 22859 events: identity, 22860 eventDataTransform: identity, 22861 success: identity, 22862 failure: identity 22863 }; 22864 function parseEventSource(raw, context, refiners = buildEventSourceRefiners(context)) { 22865 let rawObj; 22866 if (typeof raw === "string") { 22867 rawObj = { url: raw }; 22868 } else if (typeof raw === "function" || Array.isArray(raw)) { 22869 rawObj = { events: raw }; 22870 } else if (typeof raw === "object" && raw) { 22871 rawObj = raw; 22872 } 22873 if (rawObj) { 22874 let { refined, extra } = refineProps(rawObj, refiners); 22875 let metaRes = buildEventSourceMeta(refined, context); 22876 if (metaRes) { 22877 return { 22878 _raw: raw, 22879 isFetching: false, 22880 latestFetchId: "", 22881 fetchRange: null, 22882 defaultAllDay: refined.defaultAllDay, 22883 eventDataTransform: refined.eventDataTransform, 22884 success: refined.success, 22885 failure: refined.failure, 22886 publicId: refined.id || "", 22887 sourceId: guid(), 22888 sourceDefId: metaRes.sourceDefId, 22889 meta: metaRes.meta, 22890 ui: createEventUi(refined, context), 22891 extendedProps: extra 22892 }; 22893 } 22894 } 22895 return null; 22896 } 22897 function buildEventSourceRefiners(context) { 22898 return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners); 22899 } 22900 function buildEventSourceMeta(raw, context) { 22901 let defs = context.pluginHooks.eventSourceDefs; 22902 for (let i4 = defs.length - 1; i4 >= 0; i4 -= 1) { 22903 let def = defs[i4]; 22904 let meta = def.parseMeta(raw); 22905 if (meta) { 22906 return { sourceDefId: i4, meta }; 22907 } 22908 } 22909 return null; 22910 } 22911 function reduceEventStore(eventStore, action, eventSources, dateProfile, context) { 22912 switch (action.type) { 22913 case "RECEIVE_EVENTS": 22914 return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context); 22915 case "RESET_RAW_EVENTS": 22916 return resetRawEvents(eventStore, eventSources[action.sourceId], action.rawEvents, dateProfile.activeRange, context); 22917 case "ADD_EVENTS": 22918 return addEvent( 22919 eventStore, 22920 action.eventStore, 22921 dateProfile ? dateProfile.activeRange : null, 22922 context 22923 ); 22924 case "RESET_EVENTS": 22925 return action.eventStore; 22926 case "MERGE_EVENTS": 22927 return mergeEventStores(eventStore, action.eventStore); 22928 case "PREV": 22929 case "NEXT": 22930 case "CHANGE_DATE": 22931 case "CHANGE_VIEW_TYPE": 22932 if (dateProfile) { 22933 return expandRecurring(eventStore, dateProfile.activeRange, context); 22934 } 22935 return eventStore; 22936 case "REMOVE_EVENTS": 22937 return excludeSubEventStore(eventStore, action.eventStore); 22938 case "REMOVE_EVENT_SOURCE": 22939 return excludeEventsBySourceId(eventStore, action.sourceId); 22940 case "REMOVE_ALL_EVENT_SOURCES": 22941 return filterEventStoreDefs(eventStore, (eventDef) => !eventDef.sourceId); 22942 case "REMOVE_ALL_EVENTS": 22943 return createEmptyEventStore(); 22944 default: 22945 return eventStore; 22946 } 22947 } 22948 function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) { 22949 if (eventSource && fetchId === eventSource.latestFetchId) { 22950 let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context); 22951 if (fetchRange) { 22952 subset = expandRecurring(subset, fetchRange, context); 22953 } 22954 return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); 22955 } 22956 return eventStore; 22957 } 22958 function resetRawEvents(existingEventStore, eventSource, rawEvents, activeRange, context) { 22959 const { defIdMap, instanceIdMap } = buildPublicIdMaps(existingEventStore); 22960 let newEventStore = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context, false, defIdMap, instanceIdMap); 22961 return expandRecurring(newEventStore, activeRange, context); 22962 } 22963 function transformRawEvents(rawEvents, eventSource, context) { 22964 let calEachTransform = context.options.eventDataTransform; 22965 let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; 22966 if (sourceEachTransform) { 22967 rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); 22968 } 22969 if (calEachTransform) { 22970 rawEvents = transformEachRawEvent(rawEvents, calEachTransform); 22971 } 22972 return rawEvents; 22973 } 22974 function transformEachRawEvent(rawEvents, func) { 22975 let refinedEvents; 22976 if (!func) { 22977 refinedEvents = rawEvents; 22978 } else { 22979 refinedEvents = []; 22980 for (let rawEvent of rawEvents) { 22981 let refinedEvent = func(rawEvent); 22982 if (refinedEvent) { 22983 refinedEvents.push(refinedEvent); 22984 } else if (refinedEvent == null) { 22985 refinedEvents.push(rawEvent); 22986 } 22987 } 22988 } 22989 return refinedEvents; 22990 } 22991 function addEvent(eventStore, subset, expandRange, context) { 22992 if (expandRange) { 22993 subset = expandRecurring(subset, expandRange, context); 22994 } 22995 return mergeEventStores(eventStore, subset); 22996 } 22997 function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) { 22998 let { defs } = eventStore; 22999 let instances = mapHash(eventStore.instances, (instance) => { 23000 let def = defs[instance.defId]; 23001 if (def.allDay) { 23002 return instance; 23003 } 23004 return Object.assign(Object.assign({}, instance), { range: { 23005 start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), 23006 end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)) 23007 }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); 23008 }); 23009 return { defs, instances }; 23010 } 23011 function excludeEventsBySourceId(eventStore, sourceId) { 23012 return filterEventStoreDefs(eventStore, (eventDef) => eventDef.sourceId !== sourceId); 23013 } 23014 function buildPublicIdMaps(eventStore) { 23015 const { defs, instances } = eventStore; 23016 const defIdMap = {}; 23017 const instanceIdMap = {}; 23018 for (let defId in defs) { 23019 const def = defs[defId]; 23020 const { publicId } = def; 23021 if (publicId) { 23022 defIdMap[publicId] = defId; 23023 } 23024 } 23025 for (let instanceId in instances) { 23026 const instance = instances[instanceId]; 23027 const def = defs[instance.defId]; 23028 const { publicId } = def; 23029 if (publicId) { 23030 instanceIdMap[publicId] = instanceId; 23031 } 23032 } 23033 return { defIdMap, instanceIdMap }; 23034 } 23035 var Emitter = class { 23036 constructor() { 23037 this.handlers = {}; 23038 this.thisContext = null; 23039 } 23040 setThisContext(thisContext) { 23041 this.thisContext = thisContext; 23042 } 23043 setOptions(options) { 23044 this.options = options; 23045 } 23046 on(type, handler) { 23047 addToHash(this.handlers, type, handler); 23048 } 23049 off(type, handler) { 23050 removeFromHash(this.handlers, type, handler); 23051 } 23052 trigger(type, ...args) { 23053 let attachedHandlers = this.handlers[type] || []; 23054 let optionHandler = this.options && this.options[type]; 23055 let handlers = [].concat(optionHandler || [], attachedHandlers); 23056 for (let handler of handlers) { 23057 handler.apply(this.thisContext, args); 23058 } 23059 } 23060 hasHandlers(type) { 23061 return Boolean(this.handlers[type] && this.handlers[type].length || this.options && this.options[type]); 23062 } 23063 }; 23064 function addToHash(hash3, type, handler) { 23065 (hash3[type] || (hash3[type] = [])).push(handler); 23066 } 23067 function removeFromHash(hash3, type, handler) { 23068 if (handler) { 23069 if (hash3[type]) { 23070 hash3[type] = hash3[type].filter((func) => func !== handler); 23071 } 23072 } else { 23073 delete hash3[type]; 23074 } 23075 } 23076 var DEF_DEFAULTS = { 23077 startTime: "09:00", 23078 endTime: "17:00", 23079 daysOfWeek: [1, 2, 3, 4, 5], 23080 display: "inverse-background", 23081 classNames: "fc-non-business", 23082 groupId: "_businessHours" 23083 }; 23084 function parseBusinessHours(input, context) { 23085 return parseEvents(refineInputs(input), null, context); 23086 } 23087 function refineInputs(input) { 23088 let rawDefs; 23089 if (input === true) { 23090 rawDefs = [{}]; 23091 } else if (Array.isArray(input)) { 23092 rawDefs = input.filter((rawDef) => rawDef.daysOfWeek); 23093 } else if (typeof input === "object" && input) { 23094 rawDefs = [input]; 23095 } else { 23096 rawDefs = []; 23097 } 23098 rawDefs = rawDefs.map((rawDef) => Object.assign(Object.assign({}, DEF_DEFAULTS), rawDef)); 23099 return rawDefs; 23100 } 23101 function triggerDateSelect(selection, pev, context) { 23102 context.emitter.trigger("select", Object.assign(Object.assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view })); 23103 } 23104 function triggerDateUnselect(pev, context) { 23105 context.emitter.trigger("unselect", { 23106 jsEvent: pev ? pev.origEvent : null, 23107 view: context.viewApi || context.calendarApi.view 23108 }); 23109 } 23110 function buildDateSpanApiWithContext(dateSpan, context) { 23111 let props = {}; 23112 for (let transform of context.pluginHooks.dateSpanTransforms) { 23113 Object.assign(props, transform(dateSpan, context)); 23114 } 23115 Object.assign(props, buildDateSpanApi(dateSpan, context.dateEnv)); 23116 return props; 23117 } 23118 function getDefaultEventEnd(allDay, marker, context) { 23119 let { dateEnv, options } = context; 23120 let end2 = marker; 23121 if (allDay) { 23122 end2 = startOfDay(end2); 23123 end2 = dateEnv.add(end2, options.defaultAllDayEventDuration); 23124 } else { 23125 end2 = dateEnv.add(end2, options.defaultTimedEventDuration); 23126 } 23127 return end2; 23128 } 23129 function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) { 23130 let eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); 23131 let dest = createEmptyEventStore(); 23132 for (let defId in eventStore.defs) { 23133 let def = eventStore.defs[defId]; 23134 dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context); 23135 } 23136 for (let instanceId in eventStore.instances) { 23137 let instance = eventStore.instances[instanceId]; 23138 let def = dest.defs[instance.defId]; 23139 dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context); 23140 } 23141 return dest; 23142 } 23143 function applyMutationToEventDef(eventDef, eventConfig, mutation, context) { 23144 let standardProps = mutation.standardProps || {}; 23145 if (standardProps.hasEnd == null && eventConfig.durationEditable && (mutation.startDelta || mutation.endDelta)) { 23146 standardProps.hasEnd = true; 23147 } 23148 let copy = Object.assign(Object.assign(Object.assign({}, eventDef), standardProps), { ui: Object.assign(Object.assign({}, eventDef.ui), standardProps.ui) }); 23149 if (mutation.extendedProps) { 23150 copy.extendedProps = Object.assign(Object.assign({}, copy.extendedProps), mutation.extendedProps); 23151 } 23152 for (let applier of context.pluginHooks.eventDefMutationAppliers) { 23153 applier(copy, mutation, context); 23154 } 23155 if (!copy.hasEnd && context.options.forceEventDuration) { 23156 copy.hasEnd = true; 23157 } 23158 return copy; 23159 } 23160 function applyMutationToEventInstance(eventInstance, eventDef, eventConfig, mutation, context) { 23161 let { dateEnv } = context; 23162 let forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; 23163 let clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; 23164 let copy = Object.assign({}, eventInstance); 23165 if (forceAllDay) { 23166 copy.range = computeAlignedDayRange(copy.range); 23167 } 23168 if (mutation.datesDelta && eventConfig.startEditable) { 23169 copy.range = { 23170 start: dateEnv.add(copy.range.start, mutation.datesDelta), 23171 end: dateEnv.add(copy.range.end, mutation.datesDelta) 23172 }; 23173 } 23174 if (mutation.startDelta && eventConfig.durationEditable) { 23175 copy.range = { 23176 start: dateEnv.add(copy.range.start, mutation.startDelta), 23177 end: copy.range.end 23178 }; 23179 } 23180 if (mutation.endDelta && eventConfig.durationEditable) { 23181 copy.range = { 23182 start: copy.range.start, 23183 end: dateEnv.add(copy.range.end, mutation.endDelta) 23184 }; 23185 } 23186 if (clearEnd) { 23187 copy.range = { 23188 start: copy.range.start, 23189 end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context) 23190 }; 23191 } 23192 if (eventDef.allDay) { 23193 copy.range = { 23194 start: startOfDay(copy.range.start), 23195 end: startOfDay(copy.range.end) 23196 }; 23197 } 23198 if (copy.range.end < copy.range.start) { 23199 copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context); 23200 } 23201 return copy; 23202 } 23203 var EventSourceImpl = class { 23204 constructor(context, internalEventSource) { 23205 this.context = context; 23206 this.internalEventSource = internalEventSource; 23207 } 23208 remove() { 23209 this.context.dispatch({ 23210 type: "REMOVE_EVENT_SOURCE", 23211 sourceId: this.internalEventSource.sourceId 23212 }); 23213 } 23214 refetch() { 23215 this.context.dispatch({ 23216 type: "FETCH_EVENT_SOURCES", 23217 sourceIds: [this.internalEventSource.sourceId], 23218 isRefetch: true 23219 }); 23220 } 23221 get id() { 23222 return this.internalEventSource.publicId; 23223 } 23224 get url() { 23225 return this.internalEventSource.meta.url; 23226 } 23227 get format() { 23228 return this.internalEventSource.meta.format; 23229 } 23230 }; 23231 var EventImpl = class { 23232 constructor(context, def, instance) { 23233 this._context = context; 23234 this._def = def; 23235 this._instance = instance || null; 23236 } 23237 setProp(name, val) { 23238 if (name in EVENT_DATE_REFINERS) { 23239 console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead."); 23240 } else if (name === "id") { 23241 val = EVENT_NON_DATE_REFINERS[name](val); 23242 this.mutate({ 23243 standardProps: { publicId: val } 23244 }); 23245 } else if (name in EVENT_NON_DATE_REFINERS) { 23246 val = EVENT_NON_DATE_REFINERS[name](val); 23247 this.mutate({ 23248 standardProps: { [name]: val } 23249 }); 23250 } else if (name in EVENT_UI_REFINERS) { 23251 let ui2 = EVENT_UI_REFINERS[name](val); 23252 if (name === "color") { 23253 ui2 = { backgroundColor: val, borderColor: val }; 23254 } else if (name === "editable") { 23255 ui2 = { startEditable: val, durationEditable: val }; 23256 } else { 23257 ui2 = { [name]: val }; 23258 } 23259 this.mutate({ 23260 standardProps: { ui: ui2 } 23261 }); 23262 } else { 23263 console.warn(`Could not set prop '${name}'. Use setExtendedProp instead.`); 23264 } 23265 } 23266 setExtendedProp(name, val) { 23267 this.mutate({ 23268 extendedProps: { [name]: val } 23269 }); 23270 } 23271 setStart(startInput, options = {}) { 23272 let { dateEnv } = this._context; 23273 let start5 = dateEnv.createMarker(startInput); 23274 if (start5 && this._instance) { 23275 let instanceRange = this._instance.range; 23276 let startDelta = diffDates(instanceRange.start, start5, dateEnv, options.granularity); 23277 if (options.maintainDuration) { 23278 this.mutate({ datesDelta: startDelta }); 23279 } else { 23280 this.mutate({ startDelta }); 23281 } 23282 } 23283 } 23284 setEnd(endInput, options = {}) { 23285 let { dateEnv } = this._context; 23286 let end2; 23287 if (endInput != null) { 23288 end2 = dateEnv.createMarker(endInput); 23289 if (!end2) { 23290 return; 23291 } 23292 } 23293 if (this._instance) { 23294 if (end2) { 23295 let endDelta = diffDates(this._instance.range.end, end2, dateEnv, options.granularity); 23296 this.mutate({ endDelta }); 23297 } else { 23298 this.mutate({ standardProps: { hasEnd: false } }); 23299 } 23300 } 23301 } 23302 setDates(startInput, endInput, options = {}) { 23303 let { dateEnv } = this._context; 23304 let standardProps = { allDay: options.allDay }; 23305 let start5 = dateEnv.createMarker(startInput); 23306 let end2; 23307 if (!start5) { 23308 return; 23309 } 23310 if (endInput != null) { 23311 end2 = dateEnv.createMarker(endInput); 23312 if (!end2) { 23313 return; 23314 } 23315 } 23316 if (this._instance) { 23317 let instanceRange = this._instance.range; 23318 if (options.allDay === true) { 23319 instanceRange = computeAlignedDayRange(instanceRange); 23320 } 23321 let startDelta = diffDates(instanceRange.start, start5, dateEnv, options.granularity); 23322 if (end2) { 23323 let endDelta = diffDates(instanceRange.end, end2, dateEnv, options.granularity); 23324 if (durationsEqual(startDelta, endDelta)) { 23325 this.mutate({ datesDelta: startDelta, standardProps }); 23326 } else { 23327 this.mutate({ startDelta, endDelta, standardProps }); 23328 } 23329 } else { 23330 standardProps.hasEnd = false; 23331 this.mutate({ datesDelta: startDelta, standardProps }); 23332 } 23333 } 23334 } 23335 moveStart(deltaInput) { 23336 let delta = createDuration(deltaInput); 23337 if (delta) { 23338 this.mutate({ startDelta: delta }); 23339 } 23340 } 23341 moveEnd(deltaInput) { 23342 let delta = createDuration(deltaInput); 23343 if (delta) { 23344 this.mutate({ endDelta: delta }); 23345 } 23346 } 23347 moveDates(deltaInput) { 23348 let delta = createDuration(deltaInput); 23349 if (delta) { 23350 this.mutate({ datesDelta: delta }); 23351 } 23352 } 23353 setAllDay(allDay, options = {}) { 23354 let standardProps = { allDay }; 23355 let { maintainDuration } = options; 23356 if (maintainDuration == null) { 23357 maintainDuration = this._context.options.allDayMaintainDuration; 23358 } 23359 if (this._def.allDay !== allDay) { 23360 standardProps.hasEnd = maintainDuration; 23361 } 23362 this.mutate({ standardProps }); 23363 } 23364 formatRange(formatInput) { 23365 let { dateEnv } = this._context; 23366 let instance = this._instance; 23367 let formatter = createFormatter(formatInput); 23368 if (this._def.hasEnd) { 23369 return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { 23370 forcedStartTzo: instance.forcedStartTzo, 23371 forcedEndTzo: instance.forcedEndTzo 23372 }); 23373 } 23374 return dateEnv.format(instance.range.start, formatter, { 23375 forcedTzo: instance.forcedStartTzo 23376 }); 23377 } 23378 mutate(mutation) { 23379 let instance = this._instance; 23380 if (instance) { 23381 let def = this._def; 23382 let context = this._context; 23383 let { eventStore } = context.getCurrentData(); 23384 let relevantEvents = getRelevantEvents(eventStore, instance.instanceId); 23385 let eventConfigBase = { 23386 "": { 23387 display: "", 23388 startEditable: true, 23389 durationEditable: true, 23390 constraints: [], 23391 overlap: null, 23392 allows: [], 23393 backgroundColor: "", 23394 borderColor: "", 23395 textColor: "", 23396 classNames: [] 23397 } 23398 }; 23399 relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context); 23400 let oldEvent = new EventImpl(context, def, instance); 23401 this._def = relevantEvents.defs[def.defId]; 23402 this._instance = relevantEvents.instances[instance.instanceId]; 23403 context.dispatch({ 23404 type: "MERGE_EVENTS", 23405 eventStore: relevantEvents 23406 }); 23407 context.emitter.trigger("eventChange", { 23408 oldEvent, 23409 event: this, 23410 relatedEvents: buildEventApis(relevantEvents, context, instance), 23411 revert() { 23412 context.dispatch({ 23413 type: "RESET_EVENTS", 23414 eventStore 23415 }); 23416 } 23417 }); 23418 } 23419 } 23420 remove() { 23421 let context = this._context; 23422 let asStore = eventApiToStore(this); 23423 context.dispatch({ 23424 type: "REMOVE_EVENTS", 23425 eventStore: asStore 23426 }); 23427 context.emitter.trigger("eventRemove", { 23428 event: this, 23429 relatedEvents: [], 23430 revert() { 23431 context.dispatch({ 23432 type: "MERGE_EVENTS", 23433 eventStore: asStore 23434 }); 23435 } 23436 }); 23437 } 23438 get source() { 23439 let { sourceId } = this._def; 23440 if (sourceId) { 23441 return new EventSourceImpl(this._context, this._context.getCurrentData().eventSources[sourceId]); 23442 } 23443 return null; 23444 } 23445 get start() { 23446 return this._instance ? this._context.dateEnv.toDate(this._instance.range.start) : null; 23447 } 23448 get end() { 23449 return this._instance && this._def.hasEnd ? this._context.dateEnv.toDate(this._instance.range.end) : null; 23450 } 23451 get startStr() { 23452 let instance = this._instance; 23453 if (instance) { 23454 return this._context.dateEnv.formatIso(instance.range.start, { 23455 omitTime: this._def.allDay, 23456 forcedTzo: instance.forcedStartTzo 23457 }); 23458 } 23459 return ""; 23460 } 23461 get endStr() { 23462 let instance = this._instance; 23463 if (instance && this._def.hasEnd) { 23464 return this._context.dateEnv.formatIso(instance.range.end, { 23465 omitTime: this._def.allDay, 23466 forcedTzo: instance.forcedEndTzo 23467 }); 23468 } 23469 return ""; 23470 } 23471 get id() { 23472 return this._def.publicId; 23473 } 23474 get groupId() { 23475 return this._def.groupId; 23476 } 23477 get allDay() { 23478 return this._def.allDay; 23479 } 23480 get title() { 23481 return this._def.title; 23482 } 23483 get url() { 23484 return this._def.url; 23485 } 23486 get display() { 23487 return this._def.ui.display || "auto"; 23488 } 23489 get startEditable() { 23490 return this._def.ui.startEditable; 23491 } 23492 get durationEditable() { 23493 return this._def.ui.durationEditable; 23494 } 23495 get constraint() { 23496 return this._def.ui.constraints[0] || null; 23497 } 23498 get overlap() { 23499 return this._def.ui.overlap; 23500 } 23501 get allow() { 23502 return this._def.ui.allows[0] || null; 23503 } 23504 get backgroundColor() { 23505 return this._def.ui.backgroundColor; 23506 } 23507 get borderColor() { 23508 return this._def.ui.borderColor; 23509 } 23510 get textColor() { 23511 return this._def.ui.textColor; 23512 } 23513 get classNames() { 23514 return this._def.ui.classNames; 23515 } 23516 get extendedProps() { 23517 return this._def.extendedProps; 23518 } 23519 toPlainObject(settings = {}) { 23520 let def = this._def; 23521 let { ui: ui2 } = def; 23522 let { startStr, endStr } = this; 23523 let res = { 23524 allDay: def.allDay 23525 }; 23526 if (def.title) { 23527 res.title = def.title; 23528 } 23529 if (startStr) { 23530 res.start = startStr; 23531 } 23532 if (endStr) { 23533 res.end = endStr; 23534 } 23535 if (def.publicId) { 23536 res.id = def.publicId; 23537 } 23538 if (def.groupId) { 23539 res.groupId = def.groupId; 23540 } 23541 if (def.url) { 23542 res.url = def.url; 23543 } 23544 if (ui2.display && ui2.display !== "auto") { 23545 res.display = ui2.display; 23546 } 23547 if (settings.collapseColor && ui2.backgroundColor && ui2.backgroundColor === ui2.borderColor) { 23548 res.color = ui2.backgroundColor; 23549 } else { 23550 if (ui2.backgroundColor) { 23551 res.backgroundColor = ui2.backgroundColor; 23552 } 23553 if (ui2.borderColor) { 23554 res.borderColor = ui2.borderColor; 23555 } 23556 } 23557 if (ui2.textColor) { 23558 res.textColor = ui2.textColor; 23559 } 23560 if (ui2.classNames.length) { 23561 res.classNames = ui2.classNames; 23562 } 23563 if (Object.keys(def.extendedProps).length) { 23564 if (settings.collapseExtendedProps) { 23565 Object.assign(res, def.extendedProps); 23566 } else { 23567 res.extendedProps = def.extendedProps; 23568 } 23569 } 23570 return res; 23571 } 23572 toJSON() { 23573 return this.toPlainObject(); 23574 } 23575 }; 23576 function eventApiToStore(eventApi) { 23577 let def = eventApi._def; 23578 let instance = eventApi._instance; 23579 return { 23580 defs: { [def.defId]: def }, 23581 instances: instance ? { [instance.instanceId]: instance } : {} 23582 }; 23583 } 23584 function buildEventApis(eventStore, context, excludeInstance) { 23585 let { defs, instances } = eventStore; 23586 let eventApis = []; 23587 let excludeInstanceId = excludeInstance ? excludeInstance.instanceId : ""; 23588 for (let id2 in instances) { 23589 let instance = instances[id2]; 23590 let def = defs[instance.defId]; 23591 if (instance.instanceId !== excludeInstanceId) { 23592 eventApis.push(new EventImpl(context, def, instance)); 23593 } 23594 } 23595 return eventApis; 23596 } 23597 function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { 23598 let inverseBgByGroupId = {}; 23599 let inverseBgByDefId = {}; 23600 let defByGroupId = {}; 23601 let bgRanges = []; 23602 let fgRanges = []; 23603 let eventUis = compileEventUis(eventStore.defs, eventUiBases); 23604 for (let defId in eventStore.defs) { 23605 let def = eventStore.defs[defId]; 23606 let ui2 = eventUis[def.defId]; 23607 if (ui2.display === "inverse-background") { 23608 if (def.groupId) { 23609 inverseBgByGroupId[def.groupId] = []; 23610 if (!defByGroupId[def.groupId]) { 23611 defByGroupId[def.groupId] = def; 23612 } 23613 } else { 23614 inverseBgByDefId[defId] = []; 23615 } 23616 } 23617 } 23618 for (let instanceId in eventStore.instances) { 23619 let instance = eventStore.instances[instanceId]; 23620 let def = eventStore.defs[instance.defId]; 23621 let ui2 = eventUis[def.defId]; 23622 let origRange = instance.range; 23623 let normalRange = !def.allDay && nextDayThreshold ? computeVisibleDayRange(origRange, nextDayThreshold) : origRange; 23624 let slicedRange = intersectRanges(normalRange, framingRange); 23625 if (slicedRange) { 23626 if (ui2.display === "inverse-background") { 23627 if (def.groupId) { 23628 inverseBgByGroupId[def.groupId].push(slicedRange); 23629 } else { 23630 inverseBgByDefId[instance.defId].push(slicedRange); 23631 } 23632 } else if (ui2.display !== "none") { 23633 (ui2.display === "background" ? bgRanges : fgRanges).push({ 23634 def, 23635 ui: ui2, 23636 instance, 23637 range: slicedRange, 23638 isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), 23639 isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf() 23640 }); 23641 } 23642 } 23643 } 23644 for (let groupId in inverseBgByGroupId) { 23645 let ranges = inverseBgByGroupId[groupId]; 23646 let invertedRanges = invertRanges(ranges, framingRange); 23647 for (let invertedRange of invertedRanges) { 23648 let def = defByGroupId[groupId]; 23649 let ui2 = eventUis[def.defId]; 23650 bgRanges.push({ 23651 def, 23652 ui: ui2, 23653 instance: null, 23654 range: invertedRange, 23655 isStart: false, 23656 isEnd: false 23657 }); 23658 } 23659 } 23660 for (let defId in inverseBgByDefId) { 23661 let ranges = inverseBgByDefId[defId]; 23662 let invertedRanges = invertRanges(ranges, framingRange); 23663 for (let invertedRange of invertedRanges) { 23664 bgRanges.push({ 23665 def: eventStore.defs[defId], 23666 ui: eventUis[defId], 23667 instance: null, 23668 range: invertedRange, 23669 isStart: false, 23670 isEnd: false 23671 }); 23672 } 23673 } 23674 return { bg: bgRanges, fg: fgRanges }; 23675 } 23676 function hasBgRendering(def) { 23677 return def.ui.display === "background" || def.ui.display === "inverse-background"; 23678 } 23679 function setElSeg(el, seg) { 23680 el.fcSeg = seg; 23681 } 23682 function getElSeg(el) { 23683 return el.fcSeg || el.parentNode.fcSeg || null; 23684 } 23685 function compileEventUis(eventDefs, eventUiBases) { 23686 return mapHash(eventDefs, (eventDef) => compileEventUi(eventDef, eventUiBases)); 23687 } 23688 function compileEventUi(eventDef, eventUiBases) { 23689 let uis = []; 23690 if (eventUiBases[""]) { 23691 uis.push(eventUiBases[""]); 23692 } 23693 if (eventUiBases[eventDef.defId]) { 23694 uis.push(eventUiBases[eventDef.defId]); 23695 } 23696 uis.push(eventDef.ui); 23697 return combineEventUis(uis); 23698 } 23699 function sortEventSegs(segs, eventOrderSpecs) { 23700 let objs = segs.map(buildSegCompareObj); 23701 objs.sort((obj0, obj1) => compareByFieldSpecs(obj0, obj1, eventOrderSpecs)); 23702 return objs.map((c4) => c4._seg); 23703 } 23704 function buildSegCompareObj(seg) { 23705 let { eventRange } = seg; 23706 let eventDef = eventRange.def; 23707 let range = eventRange.instance ? eventRange.instance.range : eventRange.range; 23708 let start5 = range.start ? range.start.valueOf() : 0; 23709 let end2 = range.end ? range.end.valueOf() : 0; 23710 return Object.assign(Object.assign(Object.assign({}, eventDef.extendedProps), eventDef), { 23711 id: eventDef.publicId, 23712 start: start5, 23713 end: end2, 23714 duration: end2 - start5, 23715 allDay: Number(eventDef.allDay), 23716 _seg: seg 23717 }); 23718 } 23719 function computeSegDraggable(seg, context) { 23720 let { pluginHooks } = context; 23721 let transformers = pluginHooks.isDraggableTransformers; 23722 let { def, ui: ui2 } = seg.eventRange; 23723 let val = ui2.startEditable; 23724 for (let transformer of transformers) { 23725 val = transformer(val, def, ui2, context); 23726 } 23727 return val; 23728 } 23729 function computeSegStartResizable(seg, context) { 23730 return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart; 23731 } 23732 function computeSegEndResizable(seg, context) { 23733 return seg.isEnd && seg.eventRange.ui.durationEditable; 23734 } 23735 function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, defaultDisplayEventEnd, startOverride, endOverride) { 23736 let { dateEnv, options } = context; 23737 let { displayEventTime, displayEventEnd } = options; 23738 let eventDef = seg.eventRange.def; 23739 let eventInstance = seg.eventRange.instance; 23740 if (displayEventTime == null) { 23741 displayEventTime = defaultDisplayEventTime !== false; 23742 } 23743 if (displayEventEnd == null) { 23744 displayEventEnd = defaultDisplayEventEnd !== false; 23745 } 23746 let wholeEventStart = eventInstance.range.start; 23747 let wholeEventEnd = eventInstance.range.end; 23748 let segStart = startOverride || seg.start || seg.eventRange.range.start; 23749 let segEnd = endOverride || seg.end || seg.eventRange.range.end; 23750 let isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf(); 23751 let isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf(); 23752 if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) { 23753 segStart = isStartDay ? wholeEventStart : segStart; 23754 segEnd = isEndDay ? wholeEventEnd : segEnd; 23755 if (displayEventEnd && eventDef.hasEnd) { 23756 return dateEnv.formatRange(segStart, segEnd, timeFormat, { 23757 forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo, 23758 forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo 23759 }); 23760 } 23761 return dateEnv.format(segStart, timeFormat, { 23762 forcedTzo: startOverride ? null : eventInstance.forcedStartTzo 23763 }); 23764 } 23765 return ""; 23766 } 23767 function getSegMeta(seg, todayRange, nowDate) { 23768 let segRange = seg.eventRange.range; 23769 return { 23770 isPast: segRange.end <= (nowDate || todayRange.start), 23771 isFuture: segRange.start >= (nowDate || todayRange.end), 23772 isToday: todayRange && rangeContainsMarker(todayRange, segRange.start) 23773 }; 23774 } 23775 function getEventClassNames(props) { 23776 let classNames = ["fc-event"]; 23777 if (props.isMirror) { 23778 classNames.push("fc-event-mirror"); 23779 } 23780 if (props.isDraggable) { 23781 classNames.push("fc-event-draggable"); 23782 } 23783 if (props.isStartResizable || props.isEndResizable) { 23784 classNames.push("fc-event-resizable"); 23785 } 23786 if (props.isDragging) { 23787 classNames.push("fc-event-dragging"); 23788 } 23789 if (props.isResizing) { 23790 classNames.push("fc-event-resizing"); 23791 } 23792 if (props.isSelected) { 23793 classNames.push("fc-event-selected"); 23794 } 23795 if (props.isStart) { 23796 classNames.push("fc-event-start"); 23797 } 23798 if (props.isEnd) { 23799 classNames.push("fc-event-end"); 23800 } 23801 if (props.isPast) { 23802 classNames.push("fc-event-past"); 23803 } 23804 if (props.isToday) { 23805 classNames.push("fc-event-today"); 23806 } 23807 if (props.isFuture) { 23808 classNames.push("fc-event-future"); 23809 } 23810 return classNames; 23811 } 23812 function buildEventRangeKey(eventRange) { 23813 return eventRange.instance ? eventRange.instance.instanceId : `${eventRange.def.defId}:${eventRange.range.start.toISOString()}`; 23814 } 23815 function getSegAnchorAttrs(seg, context) { 23816 let { def, instance } = seg.eventRange; 23817 let { url } = def; 23818 if (url) { 23819 return { href: url }; 23820 } 23821 let { emitter, options } = context; 23822 let { eventInteractive } = options; 23823 if (eventInteractive == null) { 23824 eventInteractive = def.interactive; 23825 if (eventInteractive == null) { 23826 eventInteractive = Boolean(emitter.hasHandlers("eventClick")); 23827 } 23828 } 23829 if (eventInteractive) { 23830 return createAriaKeyboardAttrs((ev) => { 23831 emitter.trigger("eventClick", { 23832 el: ev.target, 23833 event: new EventImpl(context, def, instance), 23834 jsEvent: ev, 23835 view: context.viewApi 23836 }); 23837 }); 23838 } 23839 return {}; 23840 } 23841 var STANDARD_PROPS = { 23842 start: identity, 23843 end: identity, 23844 allDay: Boolean 23845 }; 23846 function parseDateSpan(raw, dateEnv, defaultDuration) { 23847 let span = parseOpenDateSpan(raw, dateEnv); 23848 let { range } = span; 23849 if (!range.start) { 23850 return null; 23851 } 23852 if (!range.end) { 23853 if (defaultDuration == null) { 23854 return null; 23855 } 23856 range.end = dateEnv.add(range.start, defaultDuration); 23857 } 23858 return span; 23859 } 23860 function parseOpenDateSpan(raw, dateEnv) { 23861 let { refined: standardProps, extra } = refineProps(raw, STANDARD_PROPS); 23862 let startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; 23863 let endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; 23864 let { allDay } = standardProps; 23865 if (allDay == null) { 23866 allDay = startMeta && startMeta.isTimeUnspecified && (!endMeta || endMeta.isTimeUnspecified); 23867 } 23868 return Object.assign({ range: { 23869 start: startMeta ? startMeta.marker : null, 23870 end: endMeta ? endMeta.marker : null 23871 }, allDay }, extra); 23872 } 23873 function buildDateSpanApi(span, dateEnv) { 23874 return Object.assign(Object.assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay }); 23875 } 23876 function buildRangeApiWithTimeZone(range, dateEnv, omitTime) { 23877 return Object.assign(Object.assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone }); 23878 } 23879 function buildRangeApi(range, dateEnv, omitTime) { 23880 return { 23881 start: dateEnv.toDate(range.start), 23882 end: dateEnv.toDate(range.end), 23883 startStr: dateEnv.formatIso(range.start, { omitTime }), 23884 endStr: dateEnv.formatIso(range.end, { omitTime }) 23885 }; 23886 } 23887 function fabricateEventRange(dateSpan, eventUiBases, context) { 23888 let res = refineEventDef({ editable: false }, context); 23889 let def = parseEventDef( 23890 res.refined, 23891 res.extra, 23892 "", 23893 dateSpan.allDay, 23894 true, 23895 context 23896 ); 23897 return { 23898 def, 23899 ui: compileEventUi(def, eventUiBases), 23900 instance: createEventInstance(def.defId, dateSpan.range), 23901 range: dateSpan.range, 23902 isStart: true, 23903 isEnd: true 23904 }; 23905 } 23906 function unpromisify(func, normalizedSuccessCallback, normalizedFailureCallback) { 23907 let isResolved = false; 23908 let wrappedSuccess = function(res2) { 23909 if (!isResolved) { 23910 isResolved = true; 23911 normalizedSuccessCallback(res2); 23912 } 23913 }; 23914 let wrappedFailure = function(error2) { 23915 if (!isResolved) { 23916 isResolved = true; 23917 normalizedFailureCallback(error2); 23918 } 23919 }; 23920 let res = func(wrappedSuccess, wrappedFailure); 23921 if (res && typeof res.then === "function") { 23922 res.then(wrappedSuccess, wrappedFailure); 23923 } 23924 } 23925 var JsonRequestError = class extends Error { 23926 constructor(message, response) { 23927 super(message); 23928 this.response = response; 23929 } 23930 }; 23931 function requestJson(method, url, params) { 23932 method = method.toUpperCase(); 23933 const fetchOptions = { 23934 method 23935 }; 23936 if (method === "GET") { 23937 url += (url.indexOf("?") === -1 ? "?" : "&") + new URLSearchParams(params); 23938 } else { 23939 fetchOptions.body = new URLSearchParams(params); 23940 fetchOptions.headers = { 23941 "Content-Type": "application/x-www-form-urlencoded" 23942 }; 23943 } 23944 return fetch(url, fetchOptions).then((fetchRes) => { 23945 if (fetchRes.ok) { 23946 return fetchRes.json().then((parsedResponse) => { 23947 return [parsedResponse, fetchRes]; 23948 }, () => { 23949 throw new JsonRequestError("Failure parsing JSON", fetchRes); 23950 }); 23951 } else { 23952 throw new JsonRequestError("Request failed", fetchRes); 23953 } 23954 }); 23955 } 23956 var canVGrowWithinCell; 23957 function getCanVGrowWithinCell() { 23958 if (canVGrowWithinCell == null) { 23959 canVGrowWithinCell = computeCanVGrowWithinCell(); 23960 } 23961 return canVGrowWithinCell; 23962 } 23963 function computeCanVGrowWithinCell() { 23964 if (typeof document === "undefined") { 23965 return true; 23966 } 23967 let el = document.createElement("div"); 23968 el.style.position = "absolute"; 23969 el.style.top = "0px"; 23970 el.style.left = "0px"; 23971 el.innerHTML = "<table><tr><td><div></div></td></tr></table>"; 23972 el.querySelector("table").style.height = "100px"; 23973 el.querySelector("div").style.height = "100%"; 23974 document.body.appendChild(el); 23975 let div = el.querySelector("div"); 23976 let possible = div.offsetHeight > 0; 23977 document.body.removeChild(el); 23978 return possible; 23979 } 23980 var CalendarRoot = class extends BaseComponent { 23981 constructor() { 23982 super(...arguments); 23983 this.state = { 23984 forPrint: false 23985 }; 23986 this.handleBeforePrint = () => { 23987 flushSync(() => { 23988 this.setState({ forPrint: true }); 23989 }); 23990 }; 23991 this.handleAfterPrint = () => { 23992 flushSync(() => { 23993 this.setState({ forPrint: false }); 23994 }); 23995 }; 23996 } 23997 render() { 23998 let { props } = this; 23999 let { options } = props; 24000 let { forPrint } = this.state; 24001 let isHeightAuto = forPrint || options.height === "auto" || options.contentHeight === "auto"; 24002 let height = !isHeightAuto && options.height != null ? options.height : ""; 24003 let classNames = [ 24004 "fc", 24005 forPrint ? "fc-media-print" : "fc-media-screen", 24006 `fc-direction-${options.direction}`, 24007 props.theme.getClass("root") 24008 ]; 24009 if (!getCanVGrowWithinCell()) { 24010 classNames.push("fc-liquid-hack"); 24011 } 24012 return props.children(classNames, height, isHeightAuto, forPrint); 24013 } 24014 componentDidMount() { 24015 let { emitter } = this.props; 24016 emitter.on("_beforeprint", this.handleBeforePrint); 24017 emitter.on("_afterprint", this.handleAfterPrint); 24018 } 24019 componentWillUnmount() { 24020 let { emitter } = this.props; 24021 emitter.off("_beforeprint", this.handleBeforePrint); 24022 emitter.off("_afterprint", this.handleAfterPrint); 24023 } 24024 }; 24025 var Interaction = class { 24026 constructor(settings) { 24027 this.component = settings.component; 24028 this.isHitComboAllowed = settings.isHitComboAllowed || null; 24029 } 24030 destroy() { 24031 } 24032 }; 24033 function parseInteractionSettings(component, input) { 24034 return { 24035 component, 24036 el: input.el, 24037 useEventCenter: input.useEventCenter != null ? input.useEventCenter : true, 24038 isHitComboAllowed: input.isHitComboAllowed || null 24039 }; 24040 } 24041 var interactionSettingsStore = {}; 24042 var CalendarImpl = class { 24043 getCurrentData() { 24044 return this.currentDataManager.getCurrentData(); 24045 } 24046 dispatch(action) { 24047 this.currentDataManager.dispatch(action); 24048 } 24049 get view() { 24050 return this.getCurrentData().viewApi; 24051 } 24052 batchRendering(callback) { 24053 callback(); 24054 } 24055 updateSize() { 24056 this.trigger("_resize", true); 24057 } 24058 setOption(name, val) { 24059 this.dispatch({ 24060 type: "SET_OPTION", 24061 optionName: name, 24062 rawOptionValue: val 24063 }); 24064 } 24065 getOption(name) { 24066 return this.currentDataManager.currentCalendarOptionsInput[name]; 24067 } 24068 getAvailableLocaleCodes() { 24069 return Object.keys(this.getCurrentData().availableRawLocales); 24070 } 24071 on(handlerName, handler) { 24072 let { currentDataManager } = this; 24073 if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) { 24074 currentDataManager.emitter.on(handlerName, handler); 24075 } else { 24076 console.warn(`Unknown listener name '${handlerName}'`); 24077 } 24078 } 24079 off(handlerName, handler) { 24080 this.currentDataManager.emitter.off(handlerName, handler); 24081 } 24082 trigger(handlerName, ...args) { 24083 this.currentDataManager.emitter.trigger(handlerName, ...args); 24084 } 24085 changeView(viewType, dateOrRange) { 24086 this.batchRendering(() => { 24087 this.unselect(); 24088 if (dateOrRange) { 24089 if (dateOrRange.start && dateOrRange.end) { 24090 this.dispatch({ 24091 type: "CHANGE_VIEW_TYPE", 24092 viewType 24093 }); 24094 this.dispatch({ 24095 type: "SET_OPTION", 24096 optionName: "visibleRange", 24097 rawOptionValue: dateOrRange 24098 }); 24099 } else { 24100 let { dateEnv } = this.getCurrentData(); 24101 this.dispatch({ 24102 type: "CHANGE_VIEW_TYPE", 24103 viewType, 24104 dateMarker: dateEnv.createMarker(dateOrRange) 24105 }); 24106 } 24107 } else { 24108 this.dispatch({ 24109 type: "CHANGE_VIEW_TYPE", 24110 viewType 24111 }); 24112 } 24113 }); 24114 } 24115 zoomTo(dateMarker, viewType) { 24116 let state = this.getCurrentData(); 24117 let spec; 24118 viewType = viewType || "day"; 24119 spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType); 24120 this.unselect(); 24121 if (spec) { 24122 this.dispatch({ 24123 type: "CHANGE_VIEW_TYPE", 24124 viewType: spec.type, 24125 dateMarker 24126 }); 24127 } else { 24128 this.dispatch({ 24129 type: "CHANGE_DATE", 24130 dateMarker 24131 }); 24132 } 24133 } 24134 getUnitViewSpec(unit) { 24135 let { viewSpecs, toolbarConfig } = this.getCurrentData(); 24136 let viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []); 24137 let i4; 24138 let spec; 24139 for (let viewType in viewSpecs) { 24140 viewTypes.push(viewType); 24141 } 24142 for (i4 = 0; i4 < viewTypes.length; i4 += 1) { 24143 spec = viewSpecs[viewTypes[i4]]; 24144 if (spec) { 24145 if (spec.singleUnit === unit) { 24146 return spec; 24147 } 24148 } 24149 } 24150 return null; 24151 } 24152 prev() { 24153 this.unselect(); 24154 this.dispatch({ type: "PREV" }); 24155 } 24156 next() { 24157 this.unselect(); 24158 this.dispatch({ type: "NEXT" }); 24159 } 24160 prevYear() { 24161 let state = this.getCurrentData(); 24162 this.unselect(); 24163 this.dispatch({ 24164 type: "CHANGE_DATE", 24165 dateMarker: state.dateEnv.addYears(state.currentDate, -1) 24166 }); 24167 } 24168 nextYear() { 24169 let state = this.getCurrentData(); 24170 this.unselect(); 24171 this.dispatch({ 24172 type: "CHANGE_DATE", 24173 dateMarker: state.dateEnv.addYears(state.currentDate, 1) 24174 }); 24175 } 24176 today() { 24177 let state = this.getCurrentData(); 24178 this.unselect(); 24179 this.dispatch({ 24180 type: "CHANGE_DATE", 24181 dateMarker: getNow(state.calendarOptions.now, state.dateEnv) 24182 }); 24183 } 24184 gotoDate(zonedDateInput) { 24185 let state = this.getCurrentData(); 24186 this.unselect(); 24187 this.dispatch({ 24188 type: "CHANGE_DATE", 24189 dateMarker: state.dateEnv.createMarker(zonedDateInput) 24190 }); 24191 } 24192 incrementDate(deltaInput) { 24193 let state = this.getCurrentData(); 24194 let delta = createDuration(deltaInput); 24195 if (delta) { 24196 this.unselect(); 24197 this.dispatch({ 24198 type: "CHANGE_DATE", 24199 dateMarker: state.dateEnv.add(state.currentDate, delta) 24200 }); 24201 } 24202 } 24203 getDate() { 24204 let state = this.getCurrentData(); 24205 return state.dateEnv.toDate(state.currentDate); 24206 } 24207 formatDate(d3, formatter) { 24208 let { dateEnv } = this.getCurrentData(); 24209 return dateEnv.format(dateEnv.createMarker(d3), createFormatter(formatter)); 24210 } 24211 formatRange(d0, d1, settings) { 24212 let { dateEnv } = this.getCurrentData(); 24213 return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings); 24214 } 24215 formatIso(d3, omitTime) { 24216 let { dateEnv } = this.getCurrentData(); 24217 return dateEnv.formatIso(dateEnv.createMarker(d3), { omitTime }); 24218 } 24219 select(dateOrObj, endDate) { 24220 let selectionInput; 24221 if (endDate == null) { 24222 if (dateOrObj.start != null) { 24223 selectionInput = dateOrObj; 24224 } else { 24225 selectionInput = { 24226 start: dateOrObj, 24227 end: null 24228 }; 24229 } 24230 } else { 24231 selectionInput = { 24232 start: dateOrObj, 24233 end: endDate 24234 }; 24235 } 24236 let state = this.getCurrentData(); 24237 let selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 })); 24238 if (selection) { 24239 this.dispatch({ type: "SELECT_DATES", selection }); 24240 triggerDateSelect(selection, null, state); 24241 } 24242 } 24243 unselect(pev) { 24244 let state = this.getCurrentData(); 24245 if (state.dateSelection) { 24246 this.dispatch({ type: "UNSELECT_DATES" }); 24247 triggerDateUnselect(pev, state); 24248 } 24249 } 24250 addEvent(eventInput, sourceInput) { 24251 if (eventInput instanceof EventImpl) { 24252 let def = eventInput._def; 24253 let instance = eventInput._instance; 24254 let currentData = this.getCurrentData(); 24255 if (!currentData.eventStore.defs[def.defId]) { 24256 this.dispatch({ 24257 type: "ADD_EVENTS", 24258 eventStore: eventTupleToStore({ def, instance }) 24259 }); 24260 this.triggerEventAdd(eventInput); 24261 } 24262 return eventInput; 24263 } 24264 let state = this.getCurrentData(); 24265 let eventSource; 24266 if (sourceInput instanceof EventSourceImpl) { 24267 eventSource = sourceInput.internalEventSource; 24268 } else if (typeof sourceInput === "boolean") { 24269 if (sourceInput) { 24270 [eventSource] = hashValuesToArray(state.eventSources); 24271 } 24272 } else if (sourceInput != null) { 24273 let sourceApi = this.getEventSourceById(sourceInput); 24274 if (!sourceApi) { 24275 console.warn(`Could not find an event source with ID "${sourceInput}"`); 24276 return null; 24277 } 24278 eventSource = sourceApi.internalEventSource; 24279 } 24280 let tuple = parseEvent(eventInput, eventSource, state, false); 24281 if (tuple) { 24282 let newEventApi = new EventImpl(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance); 24283 this.dispatch({ 24284 type: "ADD_EVENTS", 24285 eventStore: eventTupleToStore(tuple) 24286 }); 24287 this.triggerEventAdd(newEventApi); 24288 return newEventApi; 24289 } 24290 return null; 24291 } 24292 triggerEventAdd(eventApi) { 24293 let { emitter } = this.getCurrentData(); 24294 emitter.trigger("eventAdd", { 24295 event: eventApi, 24296 relatedEvents: [], 24297 revert: () => { 24298 this.dispatch({ 24299 type: "REMOVE_EVENTS", 24300 eventStore: eventApiToStore(eventApi) 24301 }); 24302 } 24303 }); 24304 } 24305 getEventById(id2) { 24306 let state = this.getCurrentData(); 24307 let { defs, instances } = state.eventStore; 24308 id2 = String(id2); 24309 for (let defId in defs) { 24310 let def = defs[defId]; 24311 if (def.publicId === id2) { 24312 if (def.recurringDef) { 24313 return new EventImpl(state, def, null); 24314 } 24315 for (let instanceId in instances) { 24316 let instance = instances[instanceId]; 24317 if (instance.defId === def.defId) { 24318 return new EventImpl(state, def, instance); 24319 } 24320 } 24321 } 24322 } 24323 return null; 24324 } 24325 getEvents() { 24326 let currentData = this.getCurrentData(); 24327 return buildEventApis(currentData.eventStore, currentData); 24328 } 24329 removeAllEvents() { 24330 this.dispatch({ type: "REMOVE_ALL_EVENTS" }); 24331 } 24332 getEventSources() { 24333 let state = this.getCurrentData(); 24334 let sourceHash = state.eventSources; 24335 let sourceApis = []; 24336 for (let internalId in sourceHash) { 24337 sourceApis.push(new EventSourceImpl(state, sourceHash[internalId])); 24338 } 24339 return sourceApis; 24340 } 24341 getEventSourceById(id2) { 24342 let state = this.getCurrentData(); 24343 let sourceHash = state.eventSources; 24344 id2 = String(id2); 24345 for (let sourceId in sourceHash) { 24346 if (sourceHash[sourceId].publicId === id2) { 24347 return new EventSourceImpl(state, sourceHash[sourceId]); 24348 } 24349 } 24350 return null; 24351 } 24352 addEventSource(sourceInput) { 24353 let state = this.getCurrentData(); 24354 if (sourceInput instanceof EventSourceImpl) { 24355 if (!state.eventSources[sourceInput.internalEventSource.sourceId]) { 24356 this.dispatch({ 24357 type: "ADD_EVENT_SOURCES", 24358 sources: [sourceInput.internalEventSource] 24359 }); 24360 } 24361 return sourceInput; 24362 } 24363 let eventSource = parseEventSource(sourceInput, state); 24364 if (eventSource) { 24365 this.dispatch({ type: "ADD_EVENT_SOURCES", sources: [eventSource] }); 24366 return new EventSourceImpl(state, eventSource); 24367 } 24368 return null; 24369 } 24370 removeAllEventSources() { 24371 this.dispatch({ type: "REMOVE_ALL_EVENT_SOURCES" }); 24372 } 24373 refetchEvents() { 24374 this.dispatch({ type: "FETCH_EVENT_SOURCES", isRefetch: true }); 24375 } 24376 scrollToTime(timeInput) { 24377 let time = createDuration(timeInput); 24378 if (time) { 24379 this.trigger("_scrollRequest", { time }); 24380 } 24381 } 24382 }; 24383 function intersectRects(rect1, rect2) { 24384 let res = { 24385 left: Math.max(rect1.left, rect2.left), 24386 right: Math.min(rect1.right, rect2.right), 24387 top: Math.max(rect1.top, rect2.top), 24388 bottom: Math.min(rect1.bottom, rect2.bottom) 24389 }; 24390 if (res.left < res.right && res.top < res.bottom) { 24391 return res; 24392 } 24393 return false; 24394 } 24395 var EMPTY_EVENT_STORE = createEmptyEventStore(); 24396 var Splitter = class { 24397 constructor() { 24398 this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); 24399 this.splitDateSelection = memoize(this._splitDateSpan); 24400 this.splitEventStore = memoize(this._splitEventStore); 24401 this.splitIndividualUi = memoize(this._splitIndividualUi); 24402 this.splitEventDrag = memoize(this._splitInteraction); 24403 this.splitEventResize = memoize(this._splitInteraction); 24404 this.eventUiBuilders = {}; 24405 } 24406 splitProps(props) { 24407 let keyInfos = this.getKeyInfo(props); 24408 let defKeys = this.getKeysForEventDefs(props.eventStore); 24409 let dateSelections = this.splitDateSelection(props.dateSelection); 24410 let individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); 24411 let eventStores = this.splitEventStore(props.eventStore, defKeys); 24412 let eventDrags = this.splitEventDrag(props.eventDrag); 24413 let eventResizes = this.splitEventResize(props.eventResize); 24414 let splitProps = {}; 24415 this.eventUiBuilders = mapHash(keyInfos, (info, key) => this.eventUiBuilders[key] || memoize(buildEventUiForKey)); 24416 for (let key in keyInfos) { 24417 let keyInfo = keyInfos[key]; 24418 let eventStore = eventStores[key] || EMPTY_EVENT_STORE; 24419 let buildEventUi = this.eventUiBuilders[key]; 24420 splitProps[key] = { 24421 businessHours: keyInfo.businessHours || props.businessHours, 24422 dateSelection: dateSelections[key] || null, 24423 eventStore, 24424 eventUiBases: buildEventUi(props.eventUiBases[""], keyInfo.ui, individualUi[key]), 24425 eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : "", 24426 eventDrag: eventDrags[key] || null, 24427 eventResize: eventResizes[key] || null 24428 }; 24429 } 24430 return splitProps; 24431 } 24432 _splitDateSpan(dateSpan) { 24433 let dateSpans = {}; 24434 if (dateSpan) { 24435 let keys = this.getKeysForDateSpan(dateSpan); 24436 for (let key of keys) { 24437 dateSpans[key] = dateSpan; 24438 } 24439 } 24440 return dateSpans; 24441 } 24442 _getKeysForEventDefs(eventStore) { 24443 return mapHash(eventStore.defs, (eventDef) => this.getKeysForEventDef(eventDef)); 24444 } 24445 _splitEventStore(eventStore, defKeys) { 24446 let { defs, instances } = eventStore; 24447 let splitStores = {}; 24448 for (let defId in defs) { 24449 for (let key of defKeys[defId]) { 24450 if (!splitStores[key]) { 24451 splitStores[key] = createEmptyEventStore(); 24452 } 24453 splitStores[key].defs[defId] = defs[defId]; 24454 } 24455 } 24456 for (let instanceId in instances) { 24457 let instance = instances[instanceId]; 24458 for (let key of defKeys[instance.defId]) { 24459 if (splitStores[key]) { 24460 splitStores[key].instances[instanceId] = instance; 24461 } 24462 } 24463 } 24464 return splitStores; 24465 } 24466 _splitIndividualUi(eventUiBases, defKeys) { 24467 let splitHashes = {}; 24468 for (let defId in eventUiBases) { 24469 if (defId) { 24470 for (let key of defKeys[defId]) { 24471 if (!splitHashes[key]) { 24472 splitHashes[key] = {}; 24473 } 24474 splitHashes[key][defId] = eventUiBases[defId]; 24475 } 24476 } 24477 } 24478 return splitHashes; 24479 } 24480 _splitInteraction(interaction) { 24481 let splitStates = {}; 24482 if (interaction) { 24483 let affectedStores = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents)); 24484 let mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); 24485 let mutatedStores = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); 24486 let populate = (key) => { 24487 if (!splitStates[key]) { 24488 splitStates[key] = { 24489 affectedEvents: affectedStores[key] || EMPTY_EVENT_STORE, 24490 mutatedEvents: mutatedStores[key] || EMPTY_EVENT_STORE, 24491 isEvent: interaction.isEvent 24492 }; 24493 } 24494 }; 24495 for (let key in affectedStores) { 24496 populate(key); 24497 } 24498 for (let key in mutatedStores) { 24499 populate(key); 24500 } 24501 } 24502 return splitStates; 24503 } 24504 }; 24505 function buildEventUiForKey(allUi, eventUiForKey, individualUi) { 24506 let baseParts = []; 24507 if (allUi) { 24508 baseParts.push(allUi); 24509 } 24510 if (eventUiForKey) { 24511 baseParts.push(eventUiForKey); 24512 } 24513 let stuff = { 24514 "": combineEventUis(baseParts) 24515 }; 24516 if (individualUi) { 24517 Object.assign(stuff, individualUi); 24518 } 24519 return stuff; 24520 } 24521 function getDateMeta(date, todayRange, nowDate, dateProfile) { 24522 return { 24523 dow: date.getUTCDay(), 24524 isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)), 24525 isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)), 24526 isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)), 24527 isPast: Boolean(nowDate ? date < nowDate : todayRange ? date < todayRange.start : false), 24528 isFuture: Boolean(nowDate ? date > nowDate : todayRange ? date >= todayRange.end : false) 24529 }; 24530 } 24531 function getDayClassNames(meta, theme) { 24532 let classNames = [ 24533 "fc-day", 24534 `fc-day-${DAY_IDS[meta.dow]}` 24535 ]; 24536 if (meta.isDisabled) { 24537 classNames.push("fc-day-disabled"); 24538 } else { 24539 if (meta.isToday) { 24540 classNames.push("fc-day-today"); 24541 classNames.push(theme.getClass("today")); 24542 } 24543 if (meta.isPast) { 24544 classNames.push("fc-day-past"); 24545 } 24546 if (meta.isFuture) { 24547 classNames.push("fc-day-future"); 24548 } 24549 if (meta.isOther) { 24550 classNames.push("fc-day-other"); 24551 } 24552 } 24553 return classNames; 24554 } 24555 var DAY_FORMAT = createFormatter({ year: "numeric", month: "long", day: "numeric" }); 24556 var WEEK_FORMAT = createFormatter({ week: "long" }); 24557 function buildNavLinkAttrs(context, dateMarker, viewType = "day", isTabbable = true) { 24558 const { dateEnv, options, calendarApi } = context; 24559 let dateStr = dateEnv.format(dateMarker, viewType === "week" ? WEEK_FORMAT : DAY_FORMAT); 24560 if (options.navLinks) { 24561 let zonedDate = dateEnv.toDate(dateMarker); 24562 const handleInteraction = (ev) => { 24563 let customAction = viewType === "day" ? options.navLinkDayClick : viewType === "week" ? options.navLinkWeekClick : null; 24564 if (typeof customAction === "function") { 24565 customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev); 24566 } else { 24567 if (typeof customAction === "string") { 24568 viewType = customAction; 24569 } 24570 calendarApi.zoomTo(dateMarker, viewType); 24571 } 24572 }; 24573 return Object.assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), "data-navlink": "" }, isTabbable ? createAriaClickAttrs(handleInteraction) : { onClick: handleInteraction }); 24574 } 24575 return { "aria-label": dateStr }; 24576 } 24577 var _scrollbarWidths; 24578 function getScrollbarWidths() { 24579 if (!_scrollbarWidths) { 24580 _scrollbarWidths = computeScrollbarWidths(); 24581 } 24582 return _scrollbarWidths; 24583 } 24584 function computeScrollbarWidths() { 24585 let el = document.createElement("div"); 24586 el.style.overflow = "scroll"; 24587 el.style.position = "absolute"; 24588 el.style.top = "-9999px"; 24589 el.style.left = "-9999px"; 24590 document.body.appendChild(el); 24591 let res = computeScrollbarWidthsForEl(el); 24592 document.body.removeChild(el); 24593 return res; 24594 } 24595 function computeScrollbarWidthsForEl(el) { 24596 return { 24597 x: el.offsetHeight - el.clientHeight, 24598 y: el.offsetWidth - el.clientWidth 24599 }; 24600 } 24601 function computeClippedClientRect(el) { 24602 let clippingParents2 = getClippingParents(el); 24603 let rect = el.getBoundingClientRect(); 24604 for (let clippingParent of clippingParents2) { 24605 let intersection = intersectRects(rect, clippingParent.getBoundingClientRect()); 24606 if (intersection) { 24607 rect = intersection; 24608 } else { 24609 return null; 24610 } 24611 } 24612 return rect; 24613 } 24614 function getClippingParents(el) { 24615 let parents = []; 24616 while (el instanceof HTMLElement) { 24617 let computedStyle = window.getComputedStyle(el); 24618 if (computedStyle.position === "fixed") { 24619 break; 24620 } 24621 if (/(auto|scroll)/.test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { 24622 parents.push(el); 24623 } 24624 el = el.parentNode; 24625 } 24626 return parents; 24627 } 24628 var PositionCache = class { 24629 constructor(originEl, els, isHorizontal, isVertical) { 24630 this.els = els; 24631 let originClientRect = this.originClientRect = originEl.getBoundingClientRect(); 24632 if (isHorizontal) { 24633 this.buildElHorizontals(originClientRect.left); 24634 } 24635 if (isVertical) { 24636 this.buildElVerticals(originClientRect.top); 24637 } 24638 } 24639 buildElHorizontals(originClientLeft) { 24640 let lefts = []; 24641 let rights = []; 24642 for (let el of this.els) { 24643 let rect = el.getBoundingClientRect(); 24644 lefts.push(rect.left - originClientLeft); 24645 rights.push(rect.right - originClientLeft); 24646 } 24647 this.lefts = lefts; 24648 this.rights = rights; 24649 } 24650 buildElVerticals(originClientTop) { 24651 let tops = []; 24652 let bottoms = []; 24653 for (let el of this.els) { 24654 let rect = el.getBoundingClientRect(); 24655 tops.push(rect.top - originClientTop); 24656 bottoms.push(rect.bottom - originClientTop); 24657 } 24658 this.tops = tops; 24659 this.bottoms = bottoms; 24660 } 24661 leftToIndex(leftPosition) { 24662 let { lefts, rights } = this; 24663 let len = lefts.length; 24664 let i4; 24665 for (i4 = 0; i4 < len; i4 += 1) { 24666 if (leftPosition >= lefts[i4] && leftPosition < rights[i4]) { 24667 return i4; 24668 } 24669 } 24670 return void 0; 24671 } 24672 topToIndex(topPosition) { 24673 let { tops, bottoms } = this; 24674 let len = tops.length; 24675 let i4; 24676 for (i4 = 0; i4 < len; i4 += 1) { 24677 if (topPosition >= tops[i4] && topPosition < bottoms[i4]) { 24678 return i4; 24679 } 24680 } 24681 return void 0; 24682 } 24683 getWidth(leftIndex) { 24684 return this.rights[leftIndex] - this.lefts[leftIndex]; 24685 } 24686 getHeight(topIndex) { 24687 return this.bottoms[topIndex] - this.tops[topIndex]; 24688 } 24689 similarTo(otherCache) { 24690 return similarNumArrays(this.tops || [], otherCache.tops || []) && similarNumArrays(this.bottoms || [], otherCache.bottoms || []) && similarNumArrays(this.lefts || [], otherCache.lefts || []) && similarNumArrays(this.rights || [], otherCache.rights || []); 24691 } 24692 }; 24693 function similarNumArrays(a4, b4) { 24694 const len = a4.length; 24695 if (len !== b4.length) { 24696 return false; 24697 } 24698 for (let i4 = 0; i4 < len; i4++) { 24699 if (Math.round(a4[i4]) !== Math.round(b4[i4])) { 24700 return false; 24701 } 24702 } 24703 return true; 24704 } 24705 var DateComponent = class extends BaseComponent { 24706 constructor() { 24707 super(...arguments); 24708 this.uid = guid(); 24709 } 24710 prepareHits() { 24711 } 24712 queryHit(positionLeft, positionTop, elWidth, elHeight) { 24713 return null; 24714 } 24715 isValidSegDownEl(el) { 24716 return !this.props.eventDrag && !this.props.eventResize && !elementClosest(el, ".fc-event-mirror"); 24717 } 24718 isValidDateDownEl(el) { 24719 return !elementClosest(el, ".fc-event:not(.fc-bg-event)") && !elementClosest(el, ".fc-more-link") && !elementClosest(el, "a[data-navlink]") && !elementClosest(el, ".fc-popover"); 24720 } 24721 }; 24722 var SegHierarchy = class { 24723 constructor(getEntryThickness = (entry) => { 24724 return entry.thickness || 1; 24725 }) { 24726 this.getEntryThickness = getEntryThickness; 24727 this.strictOrder = false; 24728 this.allowReslicing = false; 24729 this.maxCoord = -1; 24730 this.maxStackCnt = -1; 24731 this.levelCoords = []; 24732 this.entriesByLevel = []; 24733 this.stackCnts = {}; 24734 } 24735 addSegs(inputs) { 24736 let hiddenEntries = []; 24737 for (let input of inputs) { 24738 this.insertEntry(input, hiddenEntries); 24739 } 24740 return hiddenEntries; 24741 } 24742 insertEntry(entry, hiddenEntries) { 24743 let insertion = this.findInsertion(entry); 24744 if (this.isInsertionValid(insertion, entry)) { 24745 this.insertEntryAt(entry, insertion); 24746 } else { 24747 this.handleInvalidInsertion(insertion, entry, hiddenEntries); 24748 } 24749 } 24750 isInsertionValid(insertion, entry) { 24751 return (this.maxCoord === -1 || insertion.levelCoord + this.getEntryThickness(entry) <= this.maxCoord) && (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt); 24752 } 24753 handleInvalidInsertion(insertion, entry, hiddenEntries) { 24754 if (this.allowReslicing && insertion.touchingEntry) { 24755 const hiddenEntry = Object.assign(Object.assign({}, entry), { span: intersectSpans(entry.span, insertion.touchingEntry.span) }); 24756 hiddenEntries.push(hiddenEntry); 24757 this.splitEntry(entry, insertion.touchingEntry, hiddenEntries); 24758 } else { 24759 hiddenEntries.push(entry); 24760 } 24761 } 24762 splitEntry(entry, barrier, hiddenEntries) { 24763 let entrySpan = entry.span; 24764 let barrierSpan = barrier.span; 24765 if (entrySpan.start < barrierSpan.start) { 24766 this.insertEntry({ 24767 index: entry.index, 24768 thickness: entry.thickness, 24769 span: { start: entrySpan.start, end: barrierSpan.start } 24770 }, hiddenEntries); 24771 } 24772 if (entrySpan.end > barrierSpan.end) { 24773 this.insertEntry({ 24774 index: entry.index, 24775 thickness: entry.thickness, 24776 span: { start: barrierSpan.end, end: entrySpan.end } 24777 }, hiddenEntries); 24778 } 24779 } 24780 insertEntryAt(entry, insertion) { 24781 let { entriesByLevel, levelCoords } = this; 24782 if (insertion.lateral === -1) { 24783 insertAt(levelCoords, insertion.level, insertion.levelCoord); 24784 insertAt(entriesByLevel, insertion.level, [entry]); 24785 } else { 24786 insertAt(entriesByLevel[insertion.level], insertion.lateral, entry); 24787 } 24788 this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt; 24789 } 24790 findInsertion(newEntry) { 24791 let { levelCoords, entriesByLevel, strictOrder, stackCnts } = this; 24792 let levelCnt = levelCoords.length; 24793 let candidateCoord = 0; 24794 let touchingLevel = -1; 24795 let touchingLateral = -1; 24796 let touchingEntry = null; 24797 let stackCnt = 0; 24798 for (let trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) { 24799 const trackingCoord = levelCoords[trackingLevel]; 24800 if (!strictOrder && trackingCoord >= candidateCoord + this.getEntryThickness(newEntry)) { 24801 break; 24802 } 24803 let trackingEntries = entriesByLevel[trackingLevel]; 24804 let trackingEntry; 24805 let searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); 24806 let lateralIndex = searchRes[0] + searchRes[1]; 24807 while ((trackingEntry = trackingEntries[lateralIndex]) && trackingEntry.span.start < newEntry.span.end) { 24808 let trackingEntryBottom = trackingCoord + this.getEntryThickness(trackingEntry); 24809 if (trackingEntryBottom > candidateCoord) { 24810 candidateCoord = trackingEntryBottom; 24811 touchingEntry = trackingEntry; 24812 touchingLevel = trackingLevel; 24813 touchingLateral = lateralIndex; 24814 } 24815 if (trackingEntryBottom === candidateCoord) { 24816 stackCnt = Math.max(stackCnt, stackCnts[buildEntryKey(trackingEntry)] + 1); 24817 } 24818 lateralIndex += 1; 24819 } 24820 } 24821 let destLevel = 0; 24822 if (touchingEntry) { 24823 destLevel = touchingLevel + 1; 24824 while (destLevel < levelCnt && levelCoords[destLevel] < candidateCoord) { 24825 destLevel += 1; 24826 } 24827 } 24828 let destLateral = -1; 24829 if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) { 24830 destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0]; 24831 } 24832 return { 24833 touchingLevel, 24834 touchingLateral, 24835 touchingEntry, 24836 stackCnt, 24837 levelCoord: candidateCoord, 24838 level: destLevel, 24839 lateral: destLateral 24840 }; 24841 } 24842 toRects() { 24843 let { entriesByLevel, levelCoords } = this; 24844 let levelCnt = entriesByLevel.length; 24845 let rects = []; 24846 for (let level = 0; level < levelCnt; level += 1) { 24847 let entries = entriesByLevel[level]; 24848 let levelCoord = levelCoords[level]; 24849 for (let entry of entries) { 24850 rects.push(Object.assign(Object.assign({}, entry), { thickness: this.getEntryThickness(entry), levelCoord })); 24851 } 24852 } 24853 return rects; 24854 } 24855 }; 24856 function getEntrySpanEnd(entry) { 24857 return entry.span.end; 24858 } 24859 function buildEntryKey(entry) { 24860 return entry.index + ":" + entry.span.start; 24861 } 24862 function groupIntersectingEntries(entries) { 24863 let merges = []; 24864 for (let entry of entries) { 24865 let filteredMerges = []; 24866 let hungryMerge = { 24867 span: entry.span, 24868 entries: [entry] 24869 }; 24870 for (let merge of merges) { 24871 if (intersectSpans(merge.span, hungryMerge.span)) { 24872 hungryMerge = { 24873 entries: merge.entries.concat(hungryMerge.entries), 24874 span: joinSpans(merge.span, hungryMerge.span) 24875 }; 24876 } else { 24877 filteredMerges.push(merge); 24878 } 24879 } 24880 filteredMerges.push(hungryMerge); 24881 merges = filteredMerges; 24882 } 24883 return merges; 24884 } 24885 function joinSpans(span0, span1) { 24886 return { 24887 start: Math.min(span0.start, span1.start), 24888 end: Math.max(span0.end, span1.end) 24889 }; 24890 } 24891 function intersectSpans(span0, span1) { 24892 let start5 = Math.max(span0.start, span1.start); 24893 let end2 = Math.min(span0.end, span1.end); 24894 if (start5 < end2) { 24895 return { start: start5, end: end2 }; 24896 } 24897 return null; 24898 } 24899 function insertAt(arr, index4, item) { 24900 arr.splice(index4, 0, item); 24901 } 24902 function binarySearch(a4, searchVal, getItemVal) { 24903 let startIndex = 0; 24904 let endIndex = a4.length; 24905 if (!endIndex || searchVal < getItemVal(a4[startIndex])) { 24906 return [0, 0]; 24907 } 24908 if (searchVal > getItemVal(a4[endIndex - 1])) { 24909 return [endIndex, 0]; 24910 } 24911 while (startIndex < endIndex) { 24912 let middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2); 24913 let middleVal = getItemVal(a4[middleIndex]); 24914 if (searchVal < middleVal) { 24915 endIndex = middleIndex; 24916 } else if (searchVal > middleVal) { 24917 startIndex = middleIndex + 1; 24918 } else { 24919 return [middleIndex, 1]; 24920 } 24921 } 24922 return [startIndex, 0]; 24923 } 24924 function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { 24925 if (!datesRepDistinctDays || dayCnt > 10) { 24926 return createFormatter({ weekday: "short" }); 24927 } 24928 if (dayCnt > 1) { 24929 return createFormatter({ weekday: "short", month: "numeric", day: "numeric", omitCommas: true }); 24930 } 24931 return createFormatter({ weekday: "long" }); 24932 } 24933 var CLASS_NAME = "fc-col-header-cell"; 24934 function renderInner$1(renderProps) { 24935 return renderProps.text; 24936 } 24937 var TableDateCell = class extends BaseComponent { 24938 render() { 24939 let { dateEnv, options, theme, viewApi } = this.context; 24940 let { props } = this; 24941 let { date, dateProfile } = props; 24942 let dayMeta = getDateMeta(date, props.todayRange, null, dateProfile); 24943 let classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme)); 24944 let text = dateEnv.format(date, props.dayHeaderFormat); 24945 let navLinkAttrs = !dayMeta.isDisabled && props.colCnt > 1 ? buildNavLinkAttrs(this.context, date) : {}; 24946 let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta); 24947 return y2(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: "columnheader", colSpan: props.colSpan, "data-date": !dayMeta.isDisabled ? formatDayString(date) : void 0 }, props.extraDataAttrs), renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => y2("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && y2(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [ 24948 "fc-col-header-cell-cushion", 24949 props.isSticky && "fc-sticky" 24950 ] }))); 24951 } 24952 }; 24953 var WEEKDAY_FORMAT = createFormatter({ weekday: "long" }); 24954 var TableDowCell = class extends BaseComponent { 24955 render() { 24956 let { props } = this; 24957 let { dateEnv, theme, viewApi, options } = this.context; 24958 let date = addDays(new Date(2592e5), props.dow); 24959 let dateMeta = { 24960 dow: props.dow, 24961 isDisabled: false, 24962 isFuture: false, 24963 isPast: false, 24964 isToday: false, 24965 isOther: false 24966 }; 24967 let text = dateEnv.format(date, props.dayHeaderFormat); 24968 let renderProps = Object.assign(Object.assign(Object.assign(Object.assign({ 24969 date 24970 }, dateMeta), { view: viewApi }), props.extraRenderProps), { text }); 24971 return y2(ContentContainer, { elTag: "th", elClasses: [ 24972 CLASS_NAME, 24973 ...getDayClassNames(dateMeta, theme), 24974 ...props.extraClassNames || [] 24975 ], elAttrs: Object.assign({ role: "columnheader", colSpan: props.colSpan }, props.extraDataAttrs), renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => y2( 24976 "div", 24977 { className: "fc-scrollgrid-sync-inner" }, 24978 y2(InnerContent, { elTag: "a", elClasses: [ 24979 "fc-col-header-cell-cushion", 24980 props.isSticky && "fc-sticky" 24981 ], elAttrs: { 24982 "aria-label": dateEnv.format(date, WEEKDAY_FORMAT) 24983 } }) 24984 )); 24985 } 24986 }; 24987 var NowTimer = class extends x2 { 24988 constructor(props, context) { 24989 super(props, context); 24990 this.initialNowDate = getNow(context.options.now, context.dateEnv); 24991 this.initialNowQueriedMs = new Date().valueOf(); 24992 this.state = this.computeTiming().currentState; 24993 } 24994 render() { 24995 let { props, state } = this; 24996 return props.children(state.nowDate, state.todayRange); 24997 } 24998 componentDidMount() { 24999 this.setTimeout(); 25000 } 25001 componentDidUpdate(prevProps) { 25002 if (prevProps.unit !== this.props.unit) { 25003 this.clearTimeout(); 25004 this.setTimeout(); 25005 } 25006 } 25007 componentWillUnmount() { 25008 this.clearTimeout(); 25009 } 25010 computeTiming() { 25011 let { props, context } = this; 25012 let unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs); 25013 let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit); 25014 let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit)); 25015 let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf(); 25016 waitMs = Math.min(1e3 * 60 * 60 * 24, waitMs); 25017 return { 25018 currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) }, 25019 nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) }, 25020 waitMs 25021 }; 25022 } 25023 setTimeout() { 25024 let { nextState, waitMs } = this.computeTiming(); 25025 this.timeoutId = setTimeout(() => { 25026 this.setState(nextState, () => { 25027 this.setTimeout(); 25028 }); 25029 }, waitMs); 25030 } 25031 clearTimeout() { 25032 if (this.timeoutId) { 25033 clearTimeout(this.timeoutId); 25034 } 25035 } 25036 }; 25037 NowTimer.contextType = ViewContextType; 25038 function buildDayRange(date) { 25039 let start5 = startOfDay(date); 25040 let end2 = addDays(start5, 1); 25041 return { start: start5, end: end2 }; 25042 } 25043 var DayHeader = class extends BaseComponent { 25044 constructor() { 25045 super(...arguments); 25046 this.createDayHeaderFormatter = memoize(createDayHeaderFormatter); 25047 } 25048 render() { 25049 let { context } = this; 25050 let { dates, dateProfile, datesRepDistinctDays, renderIntro } = this.props; 25051 let dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); 25052 return y2(NowTimer, { unit: "day" }, (nowDate, todayRange) => y2( 25053 "tr", 25054 { role: "row" }, 25055 renderIntro && renderIntro("day"), 25056 dates.map((date) => datesRepDistinctDays ? y2(TableDateCell, { key: date.toISOString(), date, dateProfile, todayRange, colCnt: dates.length, dayHeaderFormat }) : y2(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat })) 25057 )); 25058 } 25059 }; 25060 function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) { 25061 return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt); 25062 } 25063 var DaySeriesModel = class { 25064 constructor(range, dateProfileGenerator) { 25065 let date = range.start; 25066 let { end: end2 } = range; 25067 let indices = []; 25068 let dates = []; 25069 let dayIndex = -1; 25070 while (date < end2) { 25071 if (dateProfileGenerator.isHiddenDay(date)) { 25072 indices.push(dayIndex + 0.5); 25073 } else { 25074 dayIndex += 1; 25075 indices.push(dayIndex); 25076 dates.push(date); 25077 } 25078 date = addDays(date, 1); 25079 } 25080 this.dates = dates; 25081 this.indices = indices; 25082 this.cnt = dates.length; 25083 } 25084 sliceRange(range) { 25085 let firstIndex = this.getDateDayIndex(range.start); 25086 let lastIndex = this.getDateDayIndex(addDays(range.end, -1)); 25087 let clippedFirstIndex = Math.max(0, firstIndex); 25088 let clippedLastIndex = Math.min(this.cnt - 1, lastIndex); 25089 clippedFirstIndex = Math.ceil(clippedFirstIndex); 25090 clippedLastIndex = Math.floor(clippedLastIndex); 25091 if (clippedFirstIndex <= clippedLastIndex) { 25092 return { 25093 firstIndex: clippedFirstIndex, 25094 lastIndex: clippedLastIndex, 25095 isStart: firstIndex === clippedFirstIndex, 25096 isEnd: lastIndex === clippedLastIndex 25097 }; 25098 } 25099 return null; 25100 } 25101 getDateDayIndex(date) { 25102 let { indices } = this; 25103 let dayOffset = Math.floor(diffDays(this.dates[0], date)); 25104 if (dayOffset < 0) { 25105 return indices[0] - 1; 25106 } 25107 if (dayOffset >= indices.length) { 25108 return indices[indices.length - 1] + 1; 25109 } 25110 return indices[dayOffset]; 25111 } 25112 }; 25113 var DayTableModel = class { 25114 constructor(daySeries, breakOnWeeks) { 25115 let { dates } = daySeries; 25116 let daysPerRow; 25117 let firstDay; 25118 let rowCnt; 25119 if (breakOnWeeks) { 25120 firstDay = dates[0].getUTCDay(); 25121 for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) { 25122 if (dates[daysPerRow].getUTCDay() === firstDay) { 25123 break; 25124 } 25125 } 25126 rowCnt = Math.ceil(dates.length / daysPerRow); 25127 } else { 25128 rowCnt = 1; 25129 daysPerRow = dates.length; 25130 } 25131 this.rowCnt = rowCnt; 25132 this.colCnt = daysPerRow; 25133 this.daySeries = daySeries; 25134 this.cells = this.buildCells(); 25135 this.headerDates = this.buildHeaderDates(); 25136 } 25137 buildCells() { 25138 let rows = []; 25139 for (let row = 0; row < this.rowCnt; row += 1) { 25140 let cells = []; 25141 for (let col = 0; col < this.colCnt; col += 1) { 25142 cells.push(this.buildCell(row, col)); 25143 } 25144 rows.push(cells); 25145 } 25146 return rows; 25147 } 25148 buildCell(row, col) { 25149 let date = this.daySeries.dates[row * this.colCnt + col]; 25150 return { 25151 key: date.toISOString(), 25152 date 25153 }; 25154 } 25155 buildHeaderDates() { 25156 let dates = []; 25157 for (let col = 0; col < this.colCnt; col += 1) { 25158 dates.push(this.cells[0][col].date); 25159 } 25160 return dates; 25161 } 25162 sliceRange(range) { 25163 let { colCnt } = this; 25164 let seriesSeg = this.daySeries.sliceRange(range); 25165 let segs = []; 25166 if (seriesSeg) { 25167 let { firstIndex, lastIndex } = seriesSeg; 25168 let index4 = firstIndex; 25169 while (index4 <= lastIndex) { 25170 let row = Math.floor(index4 / colCnt); 25171 let nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); 25172 segs.push({ 25173 row, 25174 firstCol: index4 % colCnt, 25175 lastCol: (nextIndex - 1) % colCnt, 25176 isStart: seriesSeg.isStart && index4 === firstIndex, 25177 isEnd: seriesSeg.isEnd && nextIndex - 1 === lastIndex 25178 }); 25179 index4 = nextIndex; 25180 } 25181 } 25182 return segs; 25183 } 25184 }; 25185 var Slicer = class { 25186 constructor() { 25187 this.sliceBusinessHours = memoize(this._sliceBusinessHours); 25188 this.sliceDateSelection = memoize(this._sliceDateSpan); 25189 this.sliceEventStore = memoize(this._sliceEventStore); 25190 this.sliceEventDrag = memoize(this._sliceInteraction); 25191 this.sliceEventResize = memoize(this._sliceInteraction); 25192 this.forceDayIfListItem = false; 25193 } 25194 sliceProps(props, dateProfile, nextDayThreshold, context, ...extraArgs) { 25195 let { eventUiBases } = props; 25196 let eventSegs = this.sliceEventStore(props.eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs); 25197 return { 25198 dateSelectionSegs: this.sliceDateSelection(props.dateSelection, dateProfile, nextDayThreshold, eventUiBases, context, ...extraArgs), 25199 businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, context, ...extraArgs), 25200 fgEventSegs: eventSegs.fg, 25201 bgEventSegs: eventSegs.bg, 25202 eventDrag: this.sliceEventDrag(props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs), 25203 eventResize: this.sliceEventResize(props.eventResize, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs), 25204 eventSelection: props.eventSelection 25205 }; 25206 } 25207 sliceNowDate(date, dateProfile, nextDayThreshold, context, ...extraArgs) { 25208 return this._sliceDateSpan( 25209 { range: { start: date, end: addMs(date, 1) }, allDay: false }, 25210 dateProfile, 25211 nextDayThreshold, 25212 {}, 25213 context, 25214 ...extraArgs 25215 ); 25216 } 25217 _sliceBusinessHours(businessHours, dateProfile, nextDayThreshold, context, ...extraArgs) { 25218 if (!businessHours) { 25219 return []; 25220 } 25221 return this._sliceEventStore(expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), {}, dateProfile, nextDayThreshold, ...extraArgs).bg; 25222 } 25223 _sliceEventStore(eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) { 25224 if (eventStore) { 25225 let rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); 25226 return { 25227 bg: this.sliceEventRanges(rangeRes.bg, extraArgs), 25228 fg: this.sliceEventRanges(rangeRes.fg, extraArgs) 25229 }; 25230 } 25231 return { bg: [], fg: [] }; 25232 } 25233 _sliceInteraction(interaction, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) { 25234 if (!interaction) { 25235 return null; 25236 } 25237 let rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); 25238 return { 25239 segs: this.sliceEventRanges(rangeRes.fg, extraArgs), 25240 affectedInstances: interaction.affectedEvents.instances, 25241 isEvent: interaction.isEvent 25242 }; 25243 } 25244 _sliceDateSpan(dateSpan, dateProfile, nextDayThreshold, eventUiBases, context, ...extraArgs) { 25245 if (!dateSpan) { 25246 return []; 25247 } 25248 let activeRange = computeActiveRange(dateProfile, Boolean(nextDayThreshold)); 25249 let activeDateSpanRange = intersectRanges(dateSpan.range, activeRange); 25250 if (activeDateSpanRange) { 25251 dateSpan = Object.assign(Object.assign({}, dateSpan), { range: activeDateSpanRange }); 25252 let eventRange = fabricateEventRange(dateSpan, eventUiBases, context); 25253 let segs = this.sliceRange(dateSpan.range, ...extraArgs); 25254 for (let seg of segs) { 25255 seg.eventRange = eventRange; 25256 } 25257 return segs; 25258 } 25259 return []; 25260 } 25261 sliceEventRanges(eventRanges, extraArgs) { 25262 let segs = []; 25263 for (let eventRange of eventRanges) { 25264 segs.push(...this.sliceEventRange(eventRange, extraArgs)); 25265 } 25266 return segs; 25267 } 25268 sliceEventRange(eventRange, extraArgs) { 25269 let dateRange = eventRange.range; 25270 if (this.forceDayIfListItem && eventRange.ui.display === "list-item") { 25271 dateRange = { 25272 start: dateRange.start, 25273 end: addDays(dateRange.start, 1) 25274 }; 25275 } 25276 let segs = this.sliceRange(dateRange, ...extraArgs); 25277 for (let seg of segs) { 25278 seg.eventRange = eventRange; 25279 seg.isStart = eventRange.isStart && seg.isStart; 25280 seg.isEnd = eventRange.isEnd && seg.isEnd; 25281 } 25282 return segs; 25283 } 25284 }; 25285 function computeActiveRange(dateProfile, isComponentAllDay) { 25286 let range = dateProfile.activeRange; 25287 if (isComponentAllDay) { 25288 return range; 25289 } 25290 return { 25291 start: addMs(range.start, dateProfile.slotMinTime.milliseconds), 25292 end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5) 25293 }; 25294 } 25295 var VISIBLE_HIDDEN_RE = /^(visible|hidden)$/; 25296 var Scroller = class extends BaseComponent { 25297 constructor() { 25298 super(...arguments); 25299 this.handleEl = (el) => { 25300 this.el = el; 25301 setRef(this.props.elRef, el); 25302 }; 25303 } 25304 render() { 25305 let { props } = this; 25306 let { liquid, liquidIsAbsolute } = props; 25307 let isAbsolute = liquid && liquidIsAbsolute; 25308 let className = ["fc-scroller"]; 25309 if (liquid) { 25310 if (liquidIsAbsolute) { 25311 className.push("fc-scroller-liquid-absolute"); 25312 } else { 25313 className.push("fc-scroller-liquid"); 25314 } 25315 } 25316 return y2("div", { ref: this.handleEl, className: className.join(" "), style: { 25317 overflowX: props.overflowX, 25318 overflowY: props.overflowY, 25319 left: isAbsolute && -(props.overcomeLeft || 0) || "", 25320 right: isAbsolute && -(props.overcomeRight || 0) || "", 25321 bottom: isAbsolute && -(props.overcomeBottom || 0) || "", 25322 marginLeft: !isAbsolute && -(props.overcomeLeft || 0) || "", 25323 marginRight: !isAbsolute && -(props.overcomeRight || 0) || "", 25324 marginBottom: !isAbsolute && -(props.overcomeBottom || 0) || "", 25325 maxHeight: props.maxHeight || "" 25326 } }, props.children); 25327 } 25328 needsXScrolling() { 25329 if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { 25330 return false; 25331 } 25332 let { el } = this; 25333 let realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth(); 25334 let { children } = el; 25335 for (let i4 = 0; i4 < children.length; i4 += 1) { 25336 let childEl = children[i4]; 25337 if (childEl.getBoundingClientRect().width > realClientWidth) { 25338 return true; 25339 } 25340 } 25341 return false; 25342 } 25343 needsYScrolling() { 25344 if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { 25345 return false; 25346 } 25347 let { el } = this; 25348 let realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth(); 25349 let { children } = el; 25350 for (let i4 = 0; i4 < children.length; i4 += 1) { 25351 let childEl = children[i4]; 25352 if (childEl.getBoundingClientRect().height > realClientHeight) { 25353 return true; 25354 } 25355 } 25356 return false; 25357 } 25358 getXScrollbarWidth() { 25359 if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { 25360 return 0; 25361 } 25362 return this.el.offsetHeight - this.el.clientHeight; 25363 } 25364 getYScrollbarWidth() { 25365 if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { 25366 return 0; 25367 } 25368 return this.el.offsetWidth - this.el.clientWidth; 25369 } 25370 }; 25371 var RefMap = class { 25372 constructor(masterCallback) { 25373 this.masterCallback = masterCallback; 25374 this.currentMap = {}; 25375 this.depths = {}; 25376 this.callbackMap = {}; 25377 this.handleValue = (val, key) => { 25378 let { depths, currentMap } = this; 25379 let removed = false; 25380 let added = false; 25381 if (val !== null) { 25382 removed = key in currentMap; 25383 currentMap[key] = val; 25384 depths[key] = (depths[key] || 0) + 1; 25385 added = true; 25386 } else { 25387 depths[key] -= 1; 25388 if (!depths[key]) { 25389 delete currentMap[key]; 25390 delete this.callbackMap[key]; 25391 removed = true; 25392 } 25393 } 25394 if (this.masterCallback) { 25395 if (removed) { 25396 this.masterCallback(null, String(key)); 25397 } 25398 if (added) { 25399 this.masterCallback(val, String(key)); 25400 } 25401 } 25402 }; 25403 } 25404 createRef(key) { 25405 let refCallback = this.callbackMap[key]; 25406 if (!refCallback) { 25407 refCallback = this.callbackMap[key] = (val) => { 25408 this.handleValue(val, String(key)); 25409 }; 25410 } 25411 return refCallback; 25412 } 25413 collect(startIndex, endIndex, step) { 25414 return collectFromHash(this.currentMap, startIndex, endIndex, step); 25415 } 25416 getAll() { 25417 return hashValuesToArray(this.currentMap); 25418 } 25419 }; 25420 function computeShrinkWidth(chunkEls) { 25421 let shrinkCells = findElements2(chunkEls, ".fc-scrollgrid-shrink"); 25422 let largestWidth = 0; 25423 for (let shrinkCell of shrinkCells) { 25424 largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell)); 25425 } 25426 return Math.ceil(largestWidth); 25427 } 25428 function getSectionHasLiquidHeight(props, sectionConfig) { 25429 return props.liquid && sectionConfig.liquid; 25430 } 25431 function getAllowYScrolling(props, sectionConfig) { 25432 return sectionConfig.maxHeight != null || getSectionHasLiquidHeight(props, sectionConfig); 25433 } 25434 function renderChunkContent(sectionConfig, chunkConfig, arg, isHeader) { 25435 let { expandRows } = arg; 25436 let content = typeof chunkConfig.content === "function" ? chunkConfig.content(arg) : y2("table", { 25437 role: "presentation", 25438 className: [ 25439 chunkConfig.tableClassName, 25440 sectionConfig.syncRowHeights ? "fc-scrollgrid-sync-table" : "" 25441 ].join(" "), 25442 style: { 25443 minWidth: arg.tableMinWidth, 25444 width: arg.clientWidth, 25445 height: expandRows ? arg.clientHeight : "" 25446 } 25447 }, arg.tableColGroupNode, y2(isHeader ? "thead" : "tbody", { 25448 role: "presentation" 25449 }, typeof chunkConfig.rowContent === "function" ? chunkConfig.rowContent(arg) : chunkConfig.rowContent)); 25450 return content; 25451 } 25452 function isColPropsEqual(cols0, cols1) { 25453 return isArraysEqual(cols0, cols1, isPropsEqual); 25454 } 25455 function renderMicroColGroup(cols, shrinkWidth) { 25456 let colNodes = []; 25457 for (let colProps of cols) { 25458 let span = colProps.span || 1; 25459 for (let i4 = 0; i4 < span; i4 += 1) { 25460 colNodes.push(y2("col", { style: { 25461 width: colProps.width === "shrink" ? sanitizeShrinkWidth(shrinkWidth) : colProps.width || "", 25462 minWidth: colProps.minWidth || "" 25463 } })); 25464 } 25465 } 25466 return y2("colgroup", {}, ...colNodes); 25467 } 25468 function sanitizeShrinkWidth(shrinkWidth) { 25469 return shrinkWidth == null ? 4 : shrinkWidth; 25470 } 25471 function hasShrinkWidth(cols) { 25472 for (let col of cols) { 25473 if (col.width === "shrink") { 25474 return true; 25475 } 25476 } 25477 return false; 25478 } 25479 function getScrollGridClassNames(liquid, context) { 25480 let classNames = [ 25481 "fc-scrollgrid", 25482 context.theme.getClass("table") 25483 ]; 25484 if (liquid) { 25485 classNames.push("fc-scrollgrid-liquid"); 25486 } 25487 return classNames; 25488 } 25489 function getSectionClassNames(sectionConfig, wholeTableVGrow) { 25490 let classNames = [ 25491 "fc-scrollgrid-section", 25492 `fc-scrollgrid-section-${sectionConfig.type}`, 25493 sectionConfig.className 25494 ]; 25495 if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) { 25496 classNames.push("fc-scrollgrid-section-liquid"); 25497 } 25498 if (sectionConfig.isSticky) { 25499 classNames.push("fc-scrollgrid-section-sticky"); 25500 } 25501 return classNames; 25502 } 25503 function renderScrollShim(arg) { 25504 return y2("div", { className: "fc-scrollgrid-sticky-shim", style: { 25505 width: arg.clientWidth, 25506 minWidth: arg.tableMinWidth 25507 } }); 25508 } 25509 function getStickyHeaderDates(options) { 25510 let { stickyHeaderDates } = options; 25511 if (stickyHeaderDates == null || stickyHeaderDates === "auto") { 25512 stickyHeaderDates = options.height === "auto" || options.viewHeight === "auto"; 25513 } 25514 return stickyHeaderDates; 25515 } 25516 function getStickyFooterScrollbar(options) { 25517 let { stickyFooterScrollbar } = options; 25518 if (stickyFooterScrollbar == null || stickyFooterScrollbar === "auto") { 25519 stickyFooterScrollbar = options.height === "auto" || options.viewHeight === "auto"; 25520 } 25521 return stickyFooterScrollbar; 25522 } 25523 var SimpleScrollGrid = class extends BaseComponent { 25524 constructor() { 25525 super(...arguments); 25526 this.processCols = memoize((a4) => a4, isColPropsEqual); 25527 this.renderMicroColGroup = memoize(renderMicroColGroup); 25528 this.scrollerRefs = new RefMap(); 25529 this.scrollerElRefs = new RefMap(this._handleScrollerEl.bind(this)); 25530 this.state = { 25531 shrinkWidth: null, 25532 forceYScrollbars: false, 25533 scrollerClientWidths: {}, 25534 scrollerClientHeights: {} 25535 }; 25536 this.handleSizing = () => { 25537 this.safeSetState(Object.assign({ shrinkWidth: this.computeShrinkWidth() }, this.computeScrollerDims())); 25538 }; 25539 } 25540 render() { 25541 let { props, state, context } = this; 25542 let sectionConfigs = props.sections || []; 25543 let cols = this.processCols(props.cols); 25544 let microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth); 25545 let classNames = getScrollGridClassNames(props.liquid, context); 25546 if (props.collapsibleWidth) { 25547 classNames.push("fc-scrollgrid-collapsible"); 25548 } 25549 let configCnt = sectionConfigs.length; 25550 let configI = 0; 25551 let currentConfig; 25552 let headSectionNodes = []; 25553 let bodySectionNodes = []; 25554 let footSectionNodes = []; 25555 while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === "header") { 25556 headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); 25557 configI += 1; 25558 } 25559 while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === "body") { 25560 bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false)); 25561 configI += 1; 25562 } 25563 while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === "footer") { 25564 footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); 25565 configI += 1; 25566 } 25567 let isBuggy = !getCanVGrowWithinCell(); 25568 const roleAttrs = { role: "rowgroup" }; 25569 return y2("table", { 25570 role: "grid", 25571 className: classNames.join(" "), 25572 style: { height: props.height } 25573 }, Boolean(!isBuggy && headSectionNodes.length) && y2("thead", roleAttrs, ...headSectionNodes), Boolean(!isBuggy && bodySectionNodes.length) && y2("tbody", roleAttrs, ...bodySectionNodes), Boolean(!isBuggy && footSectionNodes.length) && y2("tfoot", roleAttrs, ...footSectionNodes), isBuggy && y2("tbody", roleAttrs, ...headSectionNodes, ...bodySectionNodes, ...footSectionNodes)); 25574 } 25575 renderSection(sectionConfig, microColGroupNode, isHeader) { 25576 if ("outerContent" in sectionConfig) { 25577 return y2(_2, { key: sectionConfig.key }, sectionConfig.outerContent); 25578 } 25579 return y2("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(" ") }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader)); 25580 } 25581 renderChunkTd(sectionConfig, microColGroupNode, chunkConfig, isHeader) { 25582 if ("outerContent" in chunkConfig) { 25583 return chunkConfig.outerContent; 25584 } 25585 let { props } = this; 25586 let { forceYScrollbars, scrollerClientWidths, scrollerClientHeights } = this.state; 25587 let needsYScrolling = getAllowYScrolling(props, sectionConfig); 25588 let isLiquid = getSectionHasLiquidHeight(props, sectionConfig); 25589 let overflowY = !props.liquid ? "visible" : forceYScrollbars ? "scroll" : !needsYScrolling ? "hidden" : "auto"; 25590 let sectionKey = sectionConfig.key; 25591 let content = renderChunkContent(sectionConfig, chunkConfig, { 25592 tableColGroupNode: microColGroupNode, 25593 tableMinWidth: "", 25594 clientWidth: !props.collapsibleWidth && scrollerClientWidths[sectionKey] !== void 0 ? scrollerClientWidths[sectionKey] : null, 25595 clientHeight: scrollerClientHeights[sectionKey] !== void 0 ? scrollerClientHeights[sectionKey] : null, 25596 expandRows: sectionConfig.expandRows, 25597 syncRowHeights: false, 25598 rowSyncHeights: [], 25599 reportRowHeightChange: () => { 25600 } 25601 }, isHeader); 25602 return y2(isHeader ? "th" : "td", { 25603 ref: chunkConfig.elRef, 25604 role: "presentation" 25605 }, y2( 25606 "div", 25607 { className: `fc-scroller-harness${isLiquid ? " fc-scroller-harness-liquid" : ""}` }, 25608 y2(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY, overflowX: !props.liquid ? "visible" : "hidden", maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute: true }, content) 25609 )); 25610 } 25611 _handleScrollerEl(scrollerEl, key) { 25612 let section = getSectionByKey(this.props.sections, key); 25613 if (section) { 25614 setRef(section.chunk.scrollerElRef, scrollerEl); 25615 } 25616 } 25617 componentDidMount() { 25618 this.handleSizing(); 25619 this.context.addResizeHandler(this.handleSizing); 25620 } 25621 componentDidUpdate() { 25622 this.handleSizing(); 25623 } 25624 componentWillUnmount() { 25625 this.context.removeResizeHandler(this.handleSizing); 25626 } 25627 computeShrinkWidth() { 25628 return hasShrinkWidth(this.props.cols) ? computeShrinkWidth(this.scrollerElRefs.getAll()) : 0; 25629 } 25630 computeScrollerDims() { 25631 let scrollbarWidth = getScrollbarWidths(); 25632 let { scrollerRefs, scrollerElRefs } = this; 25633 let forceYScrollbars = false; 25634 let scrollerClientWidths = {}; 25635 let scrollerClientHeights = {}; 25636 for (let sectionKey in scrollerRefs.currentMap) { 25637 let scroller = scrollerRefs.currentMap[sectionKey]; 25638 if (scroller && scroller.needsYScrolling()) { 25639 forceYScrollbars = true; 25640 break; 25641 } 25642 } 25643 for (let section of this.props.sections) { 25644 let sectionKey = section.key; 25645 let scrollerEl = scrollerElRefs.currentMap[sectionKey]; 25646 if (scrollerEl) { 25647 let harnessEl = scrollerEl.parentNode; 25648 scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars ? scrollbarWidth.y : 0)); 25649 scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height); 25650 } 25651 } 25652 return { forceYScrollbars, scrollerClientWidths, scrollerClientHeights }; 25653 } 25654 }; 25655 SimpleScrollGrid.addStateEquality({ 25656 scrollerClientWidths: isPropsEqual, 25657 scrollerClientHeights: isPropsEqual 25658 }); 25659 function getSectionByKey(sections, key) { 25660 for (let section of sections) { 25661 if (section.key === key) { 25662 return section; 25663 } 25664 } 25665 return null; 25666 } 25667 var EventContainer = class extends BaseComponent { 25668 constructor() { 25669 super(...arguments); 25670 this.handleEl = (el) => { 25671 this.el = el; 25672 if (el) { 25673 setElSeg(el, this.props.seg); 25674 } 25675 }; 25676 } 25677 render() { 25678 const { props, context } = this; 25679 const { options } = context; 25680 const { seg } = props; 25681 const { eventRange } = seg; 25682 const { ui: ui2 } = eventRange; 25683 const renderProps = { 25684 event: new EventImpl(context, eventRange.def, eventRange.instance), 25685 view: context.viewApi, 25686 timeText: props.timeText, 25687 textColor: ui2.textColor, 25688 backgroundColor: ui2.backgroundColor, 25689 borderColor: ui2.borderColor, 25690 isDraggable: !props.disableDragging && computeSegDraggable(seg, context), 25691 isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context), 25692 isEndResizable: !props.disableResizing && computeSegEndResizable(seg), 25693 isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting), 25694 isStart: Boolean(seg.isStart), 25695 isEnd: Boolean(seg.isEnd), 25696 isPast: Boolean(props.isPast), 25697 isFuture: Boolean(props.isFuture), 25698 isToday: Boolean(props.isToday), 25699 isSelected: Boolean(props.isSelected), 25700 isDragging: Boolean(props.isDragging), 25701 isResizing: Boolean(props.isResizing) 25702 }; 25703 return y2(ContentContainer, Object.assign({}, props, { elRef: this.handleEl, elClasses: [ 25704 ...getEventClassNames(renderProps), 25705 ...seg.eventRange.ui.classNames, 25706 ...props.elClasses || [] 25707 ], renderProps, generatorName: "eventContent", customGenerator: options.eventContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount })); 25708 } 25709 componentDidUpdate(prevProps) { 25710 if (this.el && this.props.seg !== prevProps.seg) { 25711 setElSeg(this.el, this.props.seg); 25712 } 25713 } 25714 }; 25715 var StandardEvent = class extends BaseComponent { 25716 render() { 25717 let { props, context } = this; 25718 let { options } = context; 25719 let { seg } = props; 25720 let { ui: ui2 } = seg.eventRange; 25721 let timeFormat = options.eventTimeFormat || props.defaultTimeFormat; 25722 let timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); 25723 return y2(EventContainer, Object.assign({}, props, { elTag: "a", elStyle: { 25724 borderColor: ui2.borderColor, 25725 backgroundColor: ui2.backgroundColor 25726 }, elAttrs: getSegAnchorAttrs(seg, context), defaultGenerator: renderInnerContent$1, timeText }), (InnerContent, eventContentArg) => y2( 25727 _2, 25728 null, 25729 y2(InnerContent, { elTag: "div", elClasses: ["fc-event-main"], elStyle: { color: eventContentArg.textColor } }), 25730 Boolean(eventContentArg.isStartResizable) && y2("div", { className: "fc-event-resizer fc-event-resizer-start" }), 25731 Boolean(eventContentArg.isEndResizable) && y2("div", { className: "fc-event-resizer fc-event-resizer-end" }) 25732 )); 25733 } 25734 }; 25735 function renderInnerContent$1(innerProps) { 25736 return y2( 25737 "div", 25738 { className: "fc-event-main-frame" }, 25739 innerProps.timeText && y2("div", { className: "fc-event-time" }, innerProps.timeText), 25740 y2( 25741 "div", 25742 { className: "fc-event-title-container" }, 25743 y2("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || y2(_2, null, "\xA0")) 25744 ) 25745 ); 25746 } 25747 var NowIndicatorContainer = (props) => y2(ViewContextType.Consumer, null, (context) => { 25748 let { options } = context; 25749 let renderProps = { 25750 isAxis: props.isAxis, 25751 date: context.dateEnv.toDate(props.date), 25752 view: context.viewApi 25753 }; 25754 return y2(ContentContainer, Object.assign({}, props, { elTag: props.elTag || "div", renderProps, generatorName: "nowIndicatorContent", customGenerator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount })); 25755 }); 25756 var DAY_NUM_FORMAT = createFormatter({ day: "numeric" }); 25757 var DayCellContainer = class extends BaseComponent { 25758 constructor() { 25759 super(...arguments); 25760 this.refineRenderProps = memoizeObjArg(refineRenderProps); 25761 } 25762 render() { 25763 let { props, context } = this; 25764 let { options } = context; 25765 let renderProps = this.refineRenderProps({ 25766 date: props.date, 25767 dateProfile: props.dateProfile, 25768 todayRange: props.todayRange, 25769 isMonthStart: props.isMonthStart || false, 25770 showDayNumber: props.showDayNumber, 25771 extraRenderProps: props.extraRenderProps, 25772 viewApi: context.viewApi, 25773 dateEnv: context.dateEnv, 25774 monthStartFormat: options.monthStartFormat 25775 }); 25776 return y2(ContentContainer, Object.assign({}, props, { elClasses: [ 25777 ...getDayClassNames(renderProps, context.theme), 25778 ...props.elClasses || [] 25779 ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), renderProps.isDisabled ? {} : { "data-date": formatDayString(props.date) }), renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator: renderProps.isDisabled ? void 0 : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount })); 25780 } 25781 }; 25782 function hasCustomDayCellContent(options) { 25783 return Boolean(options.dayCellContent || hasCustomRenderingHandler("dayCellContent", options)); 25784 } 25785 function refineRenderProps(raw) { 25786 let { date, dateEnv, dateProfile, isMonthStart } = raw; 25787 let dayMeta = getDateMeta(date, raw.todayRange, null, dateProfile); 25788 let dayNumberText = raw.showDayNumber ? dateEnv.format(date, isMonthStart ? raw.monthStartFormat : DAY_NUM_FORMAT) : ""; 25789 return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { 25790 isMonthStart, 25791 dayNumberText 25792 }), raw.extraRenderProps); 25793 } 25794 var BgEvent = class extends BaseComponent { 25795 render() { 25796 let { props } = this; 25797 let { seg } = props; 25798 return y2(EventContainer, { elTag: "div", elClasses: ["fc-bg-event"], elStyle: { backgroundColor: seg.eventRange.ui.backgroundColor }, defaultGenerator: renderInnerContent, seg, timeText: "", isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, disableDragging: true, disableResizing: true }); 25799 } 25800 }; 25801 function renderInnerContent(props) { 25802 let { title } = props.event; 25803 return title && y2("div", { className: "fc-event-title" }, props.event.title); 25804 } 25805 function renderFill(fillType) { 25806 return y2("div", { className: `fc-${fillType}` }); 25807 } 25808 var WeekNumberContainer = (props) => y2(ViewContextType.Consumer, null, (context) => { 25809 let { dateEnv, options } = context; 25810 let { date } = props; 25811 let format = options.weekNumberFormat || props.defaultFormat; 25812 let num = dateEnv.computeWeekNumber(date); 25813 let text = dateEnv.format(date, format); 25814 let renderProps = { num, text, date }; 25815 return y2( 25816 ContentContainer, 25817 Object.assign({}, props, { renderProps, generatorName: "weekNumberContent", customGenerator: options.weekNumberContent, defaultGenerator: renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }) 25818 ); 25819 }); 25820 function renderInner(innerProps) { 25821 return innerProps.text; 25822 } 25823 var PADDING_FROM_VIEWPORT = 10; 25824 var Popover = class extends BaseComponent { 25825 constructor() { 25826 super(...arguments); 25827 this.state = { 25828 titleId: getUniqueDomId() 25829 }; 25830 this.handleRootEl = (el) => { 25831 this.rootEl = el; 25832 if (this.props.elRef) { 25833 setRef(this.props.elRef, el); 25834 } 25835 }; 25836 this.handleDocumentMouseDown = (ev) => { 25837 const target = getEventTargetViaRoot(ev); 25838 if (!this.rootEl.contains(target)) { 25839 this.handleCloseClick(); 25840 } 25841 }; 25842 this.handleDocumentKeyDown = (ev) => { 25843 if (ev.key === "Escape") { 25844 this.handleCloseClick(); 25845 } 25846 }; 25847 this.handleCloseClick = () => { 25848 let { onClose } = this.props; 25849 if (onClose) { 25850 onClose(); 25851 } 25852 }; 25853 } 25854 render() { 25855 let { theme, options } = this.context; 25856 let { props, state } = this; 25857 let classNames = [ 25858 "fc-popover", 25859 theme.getClass("popover") 25860 ].concat(props.extraClassNames || []); 25861 return j4(y2( 25862 "div", 25863 Object.assign({}, props.extraAttrs, { id: props.id, className: classNames.join(" "), "aria-labelledby": state.titleId, ref: this.handleRootEl }), 25864 y2( 25865 "div", 25866 { className: "fc-popover-header " + theme.getClass("popoverHeader") }, 25867 y2("span", { className: "fc-popover-title", id: state.titleId }, props.title), 25868 y2("span", { className: "fc-popover-close " + theme.getIconClass("close"), title: options.closeHint, onClick: this.handleCloseClick }) 25869 ), 25870 y2("div", { className: "fc-popover-body " + theme.getClass("popoverContent") }, props.children) 25871 ), props.parentEl); 25872 } 25873 componentDidMount() { 25874 document.addEventListener("mousedown", this.handleDocumentMouseDown); 25875 document.addEventListener("keydown", this.handleDocumentKeyDown); 25876 this.updateSize(); 25877 } 25878 componentWillUnmount() { 25879 document.removeEventListener("mousedown", this.handleDocumentMouseDown); 25880 document.removeEventListener("keydown", this.handleDocumentKeyDown); 25881 } 25882 updateSize() { 25883 let { isRtl } = this.context; 25884 let { alignmentEl, alignGridTop } = this.props; 25885 let { rootEl } = this; 25886 let alignmentRect = computeClippedClientRect(alignmentEl); 25887 if (alignmentRect) { 25888 let popoverDims = rootEl.getBoundingClientRect(); 25889 let popoverTop = alignGridTop ? elementClosest(alignmentEl, ".fc-scrollgrid").getBoundingClientRect().top : alignmentRect.top; 25890 let popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left; 25891 popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT); 25892 popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width); 25893 popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT); 25894 let origin = rootEl.offsetParent.getBoundingClientRect(); 25895 applyStyle(rootEl, { 25896 top: popoverTop - origin.top, 25897 left: popoverLeft - origin.left 25898 }); 25899 } 25900 } 25901 }; 25902 var MorePopover = class extends DateComponent { 25903 constructor() { 25904 super(...arguments); 25905 this.handleRootEl = (rootEl) => { 25906 this.rootEl = rootEl; 25907 if (rootEl) { 25908 this.context.registerInteractiveComponent(this, { 25909 el: rootEl, 25910 useEventCenter: false 25911 }); 25912 } else { 25913 this.context.unregisterInteractiveComponent(this); 25914 } 25915 }; 25916 } 25917 render() { 25918 let { options, dateEnv } = this.context; 25919 let { props } = this; 25920 let { startDate, todayRange, dateProfile } = props; 25921 let title = dateEnv.format(startDate, options.dayPopoverFormat); 25922 return y2(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile, todayRange }, (InnerContent, renderProps, elAttrs) => y2( 25923 Popover, 25924 { elRef: elAttrs.ref, id: props.id, title, extraClassNames: ["fc-more-popover"].concat(elAttrs.className || []), extraAttrs: elAttrs, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, 25925 hasCustomDayCellContent(options) && y2(InnerContent, { elTag: "div", elClasses: ["fc-more-popover-misc"] }), 25926 props.children 25927 )); 25928 } 25929 queryHit(positionLeft, positionTop, elWidth, elHeight) { 25930 let { rootEl, props } = this; 25931 if (positionLeft >= 0 && positionLeft < elWidth && positionTop >= 0 && positionTop < elHeight) { 25932 return { 25933 dateProfile: props.dateProfile, 25934 dateSpan: Object.assign({ allDay: !props.forceTimed, range: { 25935 start: props.startDate, 25936 end: props.endDate 25937 } }, props.extraDateSpan), 25938 dayEl: rootEl, 25939 rect: { 25940 left: 0, 25941 top: 0, 25942 right: elWidth, 25943 bottom: elHeight 25944 }, 25945 layer: 1 25946 }; 25947 } 25948 return null; 25949 } 25950 }; 25951 var MoreLinkContainer = class extends BaseComponent { 25952 constructor() { 25953 super(...arguments); 25954 this.state = { 25955 isPopoverOpen: false, 25956 popoverId: getUniqueDomId() 25957 }; 25958 this.handleLinkEl = (linkEl) => { 25959 this.linkEl = linkEl; 25960 if (this.props.elRef) { 25961 setRef(this.props.elRef, linkEl); 25962 } 25963 }; 25964 this.handleClick = (ev) => { 25965 let { props, context } = this; 25966 let { moreLinkClick } = context.options; 25967 let date = computeRange(props).start; 25968 function buildPublicSeg(seg) { 25969 let { def, instance, range } = seg.eventRange; 25970 return { 25971 event: new EventImpl(context, def, instance), 25972 start: context.dateEnv.toDate(range.start), 25973 end: context.dateEnv.toDate(range.end), 25974 isStart: seg.isStart, 25975 isEnd: seg.isEnd 25976 }; 25977 } 25978 if (typeof moreLinkClick === "function") { 25979 moreLinkClick = moreLinkClick({ 25980 date, 25981 allDay: Boolean(props.allDayDate), 25982 allSegs: props.allSegs.map(buildPublicSeg), 25983 hiddenSegs: props.hiddenSegs.map(buildPublicSeg), 25984 jsEvent: ev, 25985 view: context.viewApi 25986 }); 25987 } 25988 if (!moreLinkClick || moreLinkClick === "popover") { 25989 this.setState({ isPopoverOpen: true }); 25990 } else if (typeof moreLinkClick === "string") { 25991 context.calendarApi.zoomTo(date, moreLinkClick); 25992 } 25993 }; 25994 this.handlePopoverClose = () => { 25995 this.setState({ isPopoverOpen: false }); 25996 }; 25997 } 25998 render() { 25999 let { props, state } = this; 26000 return y2(ViewContextType.Consumer, null, (context) => { 26001 let { viewApi, options, calendarApi } = context; 26002 let { moreLinkText } = options; 26003 let { moreCnt } = props; 26004 let range = computeRange(props); 26005 let text = typeof moreLinkText === "function" ? moreLinkText.call(calendarApi, moreCnt) : `+${moreCnt} ${moreLinkText}`; 26006 let hint = formatWithOrdinals(options.moreLinkHint, [moreCnt], text); 26007 let renderProps = { 26008 num: moreCnt, 26009 shortText: `+${moreCnt}`, 26010 text, 26011 view: viewApi 26012 }; 26013 return y2( 26014 _2, 26015 null, 26016 Boolean(props.moreCnt) && y2(ContentContainer, { elTag: props.elTag || "a", elRef: this.handleLinkEl, elClasses: [ 26017 ...props.elClasses || [], 26018 "fc-more-link" 26019 ], elStyle: props.elStyle, elAttrs: Object.assign(Object.assign(Object.assign({}, props.elAttrs), createAriaClickAttrs(this.handleClick)), { title: hint, "aria-expanded": state.isPopoverOpen, "aria-controls": state.isPopoverOpen ? state.popoverId : "" }), renderProps, generatorName: "moreLinkContent", customGenerator: options.moreLinkContent, defaultGenerator: props.defaultGenerator || renderMoreLinkInner, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children), 26020 state.isPopoverOpen && y2(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: this.parentEl, alignmentEl: props.alignmentElRef ? props.alignmentElRef.current : this.linkEl, alignGridTop: props.alignGridTop, forceTimed: props.forceTimed, onClose: this.handlePopoverClose }, props.popoverContent()) 26021 ); 26022 }); 26023 } 26024 componentDidMount() { 26025 this.updateParentEl(); 26026 } 26027 componentDidUpdate() { 26028 this.updateParentEl(); 26029 } 26030 updateParentEl() { 26031 if (this.linkEl) { 26032 this.parentEl = elementClosest(this.linkEl, ".fc-view-harness"); 26033 } 26034 } 26035 }; 26036 function renderMoreLinkInner(props) { 26037 return props.text; 26038 } 26039 function computeRange(props) { 26040 if (props.allDayDate) { 26041 return { 26042 start: props.allDayDate, 26043 end: addDays(props.allDayDate, 1) 26044 }; 26045 } 26046 let { hiddenSegs } = props; 26047 return { 26048 start: computeEarliestSegStart(hiddenSegs), 26049 end: computeLatestSegEnd(hiddenSegs) 26050 }; 26051 } 26052 function computeEarliestSegStart(segs) { 26053 return segs.reduce(pickEarliestStart).eventRange.range.start; 26054 } 26055 function pickEarliestStart(seg0, seg1) { 26056 return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1; 26057 } 26058 function computeLatestSegEnd(segs) { 26059 return segs.reduce(pickLatestEnd).eventRange.range.end; 26060 } 26061 function pickLatestEnd(seg0, seg1) { 26062 return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1; 26063 } 26064 26065
vendor: 77,560 bytes, lines 26065-27992
26065// node_modules/@fullcalendar/core/index.js 26066 var globalLocales = []; 26067 var MINIMAL_RAW_EN_LOCALE = { 26068 code: "en", 26069 week: { 26070 dow: 0, 26071 doy: 4 26072 }, 26073 direction: "ltr", 26074 buttonText: { 26075 prev: "prev", 26076 next: "next", 26077 prevYear: "prev year", 26078 nextYear: "next year", 26079 year: "year", 26080 today: "today", 26081 month: "month", 26082 week: "week", 26083 day: "day", 26084 list: "list" 26085 }, 26086 weekText: "W", 26087 weekTextLong: "Week", 26088 closeHint: "Close", 26089 timeHint: "Time", 26090 eventHint: "Event", 26091 allDayText: "all-day", 26092 moreLinkText: "more", 26093 noEventsText: "No events to display" 26094 }; 26095 var RAW_EN_LOCALE = Object.assign(Object.assign({}, MINIMAL_RAW_EN_LOCALE), { 26096 buttonHints: { 26097 prev: "Previous $0", 26098 next: "Next $0", 26099 today(buttonText, unit) { 26100 return unit === "day" ? "Today" : `This ${buttonText}`; 26101 } 26102 }, 26103 viewHint: "$0 view", 26104 navLinkHint: "Go to $0", 26105 moreLinkHint(eventCnt) { 26106 return `Show ${eventCnt} more event${eventCnt === 1 ? "" : "s"}`; 26107 } 26108 }); 26109 function organizeRawLocales(explicitRawLocales) { 26110 let defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : "en"; 26111 let allRawLocales = globalLocales.concat(explicitRawLocales); 26112 let rawLocaleMap = { 26113 en: RAW_EN_LOCALE 26114 }; 26115 for (let rawLocale of allRawLocales) { 26116 rawLocaleMap[rawLocale.code] = rawLocale; 26117 } 26118 return { 26119 map: rawLocaleMap, 26120 defaultCode 26121 }; 26122 } 26123 function buildLocale(inputSingular, available) { 26124 if (typeof inputSingular === "object" && !Array.isArray(inputSingular)) { 26125 return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); 26126 } 26127 return queryLocale(inputSingular, available); 26128 } 26129 function queryLocale(codeArg, available) { 26130 let codes = [].concat(codeArg || []); 26131 let raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; 26132 return parseLocale(codeArg, codes, raw); 26133 } 26134 function queryRawLocale(codes, available) { 26135 for (let i4 = 0; i4 < codes.length; i4 += 1) { 26136 let parts = codes[i4].toLocaleLowerCase().split("-"); 26137 for (let j5 = parts.length; j5 > 0; j5 -= 1) { 26138 let simpleId = parts.slice(0, j5).join("-"); 26139 if (available[simpleId]) { 26140 return available[simpleId]; 26141 } 26142 } 26143 } 26144 return null; 26145 } 26146 function parseLocale(codeArg, codes, raw) { 26147 let merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ["buttonText"]); 26148 delete merged.code; 26149 let { week } = merged; 26150 delete merged.week; 26151 return { 26152 codeArg, 26153 codes, 26154 week, 26155 simpleNumberFormat: new Intl.NumberFormat(codeArg), 26156 options: merged 26157 }; 26158 } 26159 function createPlugin(input) { 26160 return { 26161 id: guid(), 26162 name: input.name, 26163 premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : void 0, 26164 deps: input.deps || [], 26165 reducers: input.reducers || [], 26166 isLoadingFuncs: input.isLoadingFuncs || [], 26167 contextInit: [].concat(input.contextInit || []), 26168 eventRefiners: input.eventRefiners || {}, 26169 eventDefMemberAdders: input.eventDefMemberAdders || [], 26170 eventSourceRefiners: input.eventSourceRefiners || {}, 26171 isDraggableTransformers: input.isDraggableTransformers || [], 26172 eventDragMutationMassagers: input.eventDragMutationMassagers || [], 26173 eventDefMutationAppliers: input.eventDefMutationAppliers || [], 26174 dateSelectionTransformers: input.dateSelectionTransformers || [], 26175 datePointTransforms: input.datePointTransforms || [], 26176 dateSpanTransforms: input.dateSpanTransforms || [], 26177 views: input.views || {}, 26178 viewPropsTransformers: input.viewPropsTransformers || [], 26179 isPropsValid: input.isPropsValid || null, 26180 externalDefTransforms: input.externalDefTransforms || [], 26181 viewContainerAppends: input.viewContainerAppends || [], 26182 eventDropTransformers: input.eventDropTransformers || [], 26183 componentInteractions: input.componentInteractions || [], 26184 calendarInteractions: input.calendarInteractions || [], 26185 themeClasses: input.themeClasses || {}, 26186 eventSourceDefs: input.eventSourceDefs || [], 26187 cmdFormatter: input.cmdFormatter, 26188 recurringTypes: input.recurringTypes || [], 26189 namedTimeZonedImpl: input.namedTimeZonedImpl, 26190 initialView: input.initialView || "", 26191 elementDraggingImpl: input.elementDraggingImpl, 26192 optionChangeHandlers: input.optionChangeHandlers || {}, 26193 scrollGridImpl: input.scrollGridImpl || null, 26194 listenerRefiners: input.listenerRefiners || {}, 26195 optionRefiners: input.optionRefiners || {}, 26196 propSetHandlers: input.propSetHandlers || {} 26197 }; 26198 } 26199 function buildPluginHooks(pluginDefs, globalDefs) { 26200 let currentPluginIds = {}; 26201 let hooks = { 26202 premiumReleaseDate: void 0, 26203 reducers: [], 26204 isLoadingFuncs: [], 26205 contextInit: [], 26206 eventRefiners: {}, 26207 eventDefMemberAdders: [], 26208 eventSourceRefiners: {}, 26209 isDraggableTransformers: [], 26210 eventDragMutationMassagers: [], 26211 eventDefMutationAppliers: [], 26212 dateSelectionTransformers: [], 26213 datePointTransforms: [], 26214 dateSpanTransforms: [], 26215 views: {}, 26216 viewPropsTransformers: [], 26217 isPropsValid: null, 26218 externalDefTransforms: [], 26219 viewContainerAppends: [], 26220 eventDropTransformers: [], 26221 componentInteractions: [], 26222 calendarInteractions: [], 26223 themeClasses: {}, 26224 eventSourceDefs: [], 26225 cmdFormatter: null, 26226 recurringTypes: [], 26227 namedTimeZonedImpl: null, 26228 initialView: "", 26229 elementDraggingImpl: null, 26230 optionChangeHandlers: {}, 26231 scrollGridImpl: null, 26232 listenerRefiners: {}, 26233 optionRefiners: {}, 26234 propSetHandlers: {} 26235 }; 26236 function addDefs(defs) { 26237 for (let def of defs) { 26238 const pluginName = def.name; 26239 const currentId = currentPluginIds[pluginName]; 26240 if (currentId === void 0) { 26241 currentPluginIds[pluginName] = def.id; 26242 addDefs(def.deps); 26243 hooks = combineHooks(hooks, def); 26244 } else if (currentId !== def.id) { 26245 console.warn(`Duplicate plugin '${pluginName}'`); 26246 } 26247 } 26248 } 26249 if (pluginDefs) { 26250 addDefs(pluginDefs); 26251 } 26252 addDefs(globalDefs); 26253 return hooks; 26254 } 26255 function buildBuildPluginHooks() { 26256 let currentOverrideDefs = []; 26257 let currentGlobalDefs = []; 26258 let currentHooks; 26259 return (overrideDefs, globalDefs) => { 26260 if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) { 26261 currentHooks = buildPluginHooks(overrideDefs, globalDefs); 26262 } 26263 currentOverrideDefs = overrideDefs; 26264 currentGlobalDefs = globalDefs; 26265 return currentHooks; 26266 }; 26267 } 26268 function combineHooks(hooks0, hooks1) { 26269 return { 26270 premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate), 26271 reducers: hooks0.reducers.concat(hooks1.reducers), 26272 isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs), 26273 contextInit: hooks0.contextInit.concat(hooks1.contextInit), 26274 eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners), 26275 eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders), 26276 eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners), 26277 isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), 26278 eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), 26279 eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), 26280 dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), 26281 datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), 26282 dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), 26283 views: Object.assign(Object.assign({}, hooks0.views), hooks1.views), 26284 viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), 26285 isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, 26286 externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), 26287 viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends), 26288 eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), 26289 calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), 26290 componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), 26291 themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses), 26292 eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), 26293 cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, 26294 recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), 26295 namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, 26296 initialView: hooks0.initialView || hooks1.initialView, 26297 elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, 26298 optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers), 26299 scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl, 26300 listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners), 26301 optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners), 26302 propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers) 26303 }; 26304 } 26305 function compareOptionalDates(date0, date1) { 26306 if (date0 === void 0) { 26307 return date1; 26308 } 26309 if (date1 === void 0) { 26310 return date0; 26311 } 26312 return new Date(Math.max(date0.valueOf(), date1.valueOf())); 26313 } 26314 var StandardTheme = class extends Theme { 26315 }; 26316 StandardTheme.prototype.classes = { 26317 root: "fc-theme-standard", 26318 tableCellShaded: "fc-cell-shaded", 26319 buttonGroup: "fc-button-group", 26320 button: "fc-button fc-button-primary", 26321 buttonActive: "fc-button-active" 26322 }; 26323 StandardTheme.prototype.baseIconClass = "fc-icon"; 26324 StandardTheme.prototype.iconClasses = { 26325 close: "fc-icon-x", 26326 prev: "fc-icon-chevron-left", 26327 next: "fc-icon-chevron-right", 26328 prevYear: "fc-icon-chevrons-left", 26329 nextYear: "fc-icon-chevrons-right" 26330 }; 26331 StandardTheme.prototype.rtlIconClasses = { 26332 prev: "fc-icon-chevron-right", 26333 next: "fc-icon-chevron-left", 26334 prevYear: "fc-icon-chevrons-right", 26335 nextYear: "fc-icon-chevrons-left" 26336 }; 26337 StandardTheme.prototype.iconOverrideOption = "buttonIcons"; 26338 StandardTheme.prototype.iconOverrideCustomButtonOption = "icon"; 26339 StandardTheme.prototype.iconOverridePrefix = "fc-icon-"; 26340 function compileViewDefs(defaultConfigs, overrideConfigs) { 26341 let hash3 = {}; 26342 let viewType; 26343 for (viewType in defaultConfigs) { 26344 ensureViewDef(viewType, hash3, defaultConfigs, overrideConfigs); 26345 } 26346 for (viewType in overrideConfigs) { 26347 ensureViewDef(viewType, hash3, defaultConfigs, overrideConfigs); 26348 } 26349 return hash3; 26350 } 26351 function ensureViewDef(viewType, hash3, defaultConfigs, overrideConfigs) { 26352 if (hash3[viewType]) { 26353 return hash3[viewType]; 26354 } 26355 let viewDef = buildViewDef(viewType, hash3, defaultConfigs, overrideConfigs); 26356 if (viewDef) { 26357 hash3[viewType] = viewDef; 26358 } 26359 return viewDef; 26360 } 26361 function buildViewDef(viewType, hash3, defaultConfigs, overrideConfigs) { 26362 let defaultConfig = defaultConfigs[viewType]; 26363 let overrideConfig = overrideConfigs[viewType]; 26364 let queryProp = (name) => defaultConfig && defaultConfig[name] !== null ? defaultConfig[name] : overrideConfig && overrideConfig[name] !== null ? overrideConfig[name] : null; 26365 let theComponent = queryProp("component"); 26366 let superType = queryProp("superType"); 26367 let superDef = null; 26368 if (superType) { 26369 if (superType === viewType) { 26370 throw new Error("Can't have a custom view type that references itself"); 26371 } 26372 superDef = ensureViewDef(superType, hash3, defaultConfigs, overrideConfigs); 26373 } 26374 if (!theComponent && superDef) { 26375 theComponent = superDef.component; 26376 } 26377 if (!theComponent) { 26378 return null; 26379 } 26380 return { 26381 type: viewType, 26382 component: theComponent, 26383 defaults: Object.assign(Object.assign({}, superDef ? superDef.defaults : {}), defaultConfig ? defaultConfig.rawOptions : {}), 26384 overrides: Object.assign(Object.assign({}, superDef ? superDef.overrides : {}), overrideConfig ? overrideConfig.rawOptions : {}) 26385 }; 26386 } 26387 function parseViewConfigs(inputs) { 26388 return mapHash(inputs, parseViewConfig); 26389 } 26390 function parseViewConfig(input) { 26391 let rawOptions = typeof input === "function" ? { component: input } : input; 26392 let { component } = rawOptions; 26393 if (rawOptions.content) { 26394 component = createViewHookComponent(rawOptions); 26395 } else if (component && !(component.prototype instanceof BaseComponent)) { 26396 component = createViewHookComponent(Object.assign(Object.assign({}, rawOptions), { content: component })); 26397 } 26398 return { 26399 superType: rawOptions.type, 26400 component, 26401 rawOptions 26402 }; 26403 } 26404 function createViewHookComponent(options) { 26405 return (viewProps) => y2(ViewContextType.Consumer, null, (context) => y2(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: void 0, customGenerator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount })); 26406 } 26407 function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) { 26408 let defaultConfigs = parseViewConfigs(defaultInputs); 26409 let overrideConfigs = parseViewConfigs(optionOverrides.views); 26410 let viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); 26411 return mapHash(viewDefs, (viewDef) => buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults)); 26412 } 26413 function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) { 26414 let durationInput = viewDef.overrides.duration || viewDef.defaults.duration || dynamicOptionOverrides.duration || optionOverrides.duration; 26415 let duration = null; 26416 let durationUnit = ""; 26417 let singleUnit = ""; 26418 let singleUnitOverrides = {}; 26419 if (durationInput) { 26420 duration = createDurationCached(durationInput); 26421 if (duration) { 26422 let denom = greatestDurationDenominator(duration); 26423 durationUnit = denom.unit; 26424 if (denom.value === 1) { 26425 singleUnit = durationUnit; 26426 singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {}; 26427 } 26428 } 26429 } 26430 let queryButtonText = (optionsSubset) => { 26431 let buttonTextMap = optionsSubset.buttonText || {}; 26432 let buttonTextKey = viewDef.defaults.buttonTextKey; 26433 if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { 26434 return buttonTextMap[buttonTextKey]; 26435 } 26436 if (buttonTextMap[viewDef.type] != null) { 26437 return buttonTextMap[viewDef.type]; 26438 } 26439 if (buttonTextMap[singleUnit] != null) { 26440 return buttonTextMap[singleUnit]; 26441 } 26442 return null; 26443 }; 26444 let queryButtonTitle = (optionsSubset) => { 26445 let buttonHints = optionsSubset.buttonHints || {}; 26446 let buttonKey = viewDef.defaults.buttonTextKey; 26447 if (buttonKey != null && buttonHints[buttonKey] != null) { 26448 return buttonHints[buttonKey]; 26449 } 26450 if (buttonHints[viewDef.type] != null) { 26451 return buttonHints[viewDef.type]; 26452 } 26453 if (buttonHints[singleUnit] != null) { 26454 return buttonHints[singleUnit]; 26455 } 26456 return null; 26457 }; 26458 return { 26459 type: viewDef.type, 26460 component: viewDef.component, 26461 duration, 26462 durationUnit, 26463 singleUnit, 26464 optionDefaults: viewDef.defaults, 26465 optionOverrides: Object.assign(Object.assign({}, singleUnitOverrides), viewDef.overrides), 26466 buttonTextOverride: queryButtonText(dynamicOptionOverrides) || queryButtonText(optionOverrides) || viewDef.overrides.buttonText, 26467 buttonTextDefault: queryButtonText(localeDefaults) || viewDef.defaults.buttonText || queryButtonText(BASE_OPTION_DEFAULTS) || viewDef.type, 26468 buttonTitleOverride: queryButtonTitle(dynamicOptionOverrides) || queryButtonTitle(optionOverrides) || viewDef.overrides.buttonHint, 26469 buttonTitleDefault: queryButtonTitle(localeDefaults) || viewDef.defaults.buttonHint || queryButtonTitle(BASE_OPTION_DEFAULTS) 26470 }; 26471 } 26472 var durationInputMap = {}; 26473 function createDurationCached(durationInput) { 26474 let json = JSON.stringify(durationInput); 26475 let res = durationInputMap[json]; 26476 if (res === void 0) { 26477 res = createDuration(durationInput); 26478 durationInputMap[json] = res; 26479 } 26480 return res; 26481 } 26482 function reduceViewType(viewType, action) { 26483 switch (action.type) { 26484 case "CHANGE_VIEW_TYPE": 26485 viewType = action.viewType; 26486 } 26487 return viewType; 26488 } 26489 function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) { 26490 switch (action.type) { 26491 case "SET_OPTION": 26492 return Object.assign(Object.assign({}, dynamicOptionOverrides), { [action.optionName]: action.rawOptionValue }); 26493 default: 26494 return dynamicOptionOverrides; 26495 } 26496 } 26497 function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) { 26498 let dp; 26499 switch (action.type) { 26500 case "CHANGE_VIEW_TYPE": 26501 return dateProfileGenerator.build(action.dateMarker || currentDate); 26502 case "CHANGE_DATE": 26503 return dateProfileGenerator.build(action.dateMarker); 26504 case "PREV": 26505 dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate); 26506 if (dp.isValid) { 26507 return dp; 26508 } 26509 break; 26510 case "NEXT": 26511 dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate); 26512 if (dp.isValid) { 26513 return dp; 26514 } 26515 break; 26516 } 26517 return currentDateProfile; 26518 } 26519 function initEventSources(calendarOptions, dateProfile, context) { 26520 let activeRange = dateProfile ? dateProfile.activeRange : null; 26521 return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context); 26522 } 26523 function reduceEventSources(eventSources, action, dateProfile, context) { 26524 let activeRange = dateProfile ? dateProfile.activeRange : null; 26525 switch (action.type) { 26526 case "ADD_EVENT_SOURCES": 26527 return addSources(eventSources, action.sources, activeRange, context); 26528 case "REMOVE_EVENT_SOURCE": 26529 return removeSource(eventSources, action.sourceId); 26530 case "PREV": 26531 case "NEXT": 26532 case "CHANGE_DATE": 26533 case "CHANGE_VIEW_TYPE": 26534 if (dateProfile) { 26535 return fetchDirtySources(eventSources, activeRange, context); 26536 } 26537 return eventSources; 26538 case "FETCH_EVENT_SOURCES": 26539 return fetchSourcesByIds(eventSources, action.sourceIds ? arrayToHash(action.sourceIds) : excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context); 26540 case "RECEIVE_EVENTS": 26541 case "RECEIVE_EVENT_ERROR": 26542 return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); 26543 case "REMOVE_ALL_EVENT_SOURCES": 26544 return {}; 26545 default: 26546 return eventSources; 26547 } 26548 } 26549 function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) { 26550 let activeRange = dateProfile ? dateProfile.activeRange : null; 26551 return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context); 26552 } 26553 function computeEventSourcesLoading(eventSources) { 26554 for (let sourceId in eventSources) { 26555 if (eventSources[sourceId].isFetching) { 26556 return true; 26557 } 26558 } 26559 return false; 26560 } 26561 function addSources(eventSourceHash, sources, fetchRange, context) { 26562 let hash3 = {}; 26563 for (let source of sources) { 26564 hash3[source.sourceId] = source; 26565 } 26566 if (fetchRange) { 26567 hash3 = fetchDirtySources(hash3, fetchRange, context); 26568 } 26569 return Object.assign(Object.assign({}, eventSourceHash), hash3); 26570 } 26571 function removeSource(eventSourceHash, sourceId) { 26572 return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId); 26573 } 26574 function fetchDirtySources(sourceHash, fetchRange, context) { 26575 return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context); 26576 } 26577 function isSourceDirty(eventSource, fetchRange, context) { 26578 if (!doesSourceNeedRange(eventSource, context)) { 26579 return !eventSource.latestFetchId; 26580 } 26581 return !context.options.lazyFetching || !eventSource.fetchRange || eventSource.isFetching || fetchRange.start < eventSource.fetchRange.start || fetchRange.end > eventSource.fetchRange.end; 26582 } 26583 function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) { 26584 let nextSources = {}; 26585 for (let sourceId in prevSources) { 26586 let source = prevSources[sourceId]; 26587 if (sourceIdHash[sourceId]) { 26588 nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context); 26589 } else { 26590 nextSources[sourceId] = source; 26591 } 26592 } 26593 return nextSources; 26594 } 26595 function fetchSource(eventSource, fetchRange, isRefetch, context) { 26596 let { options, calendarApi } = context; 26597 let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId]; 26598 let fetchId = guid(); 26599 sourceDef.fetch({ 26600 eventSource, 26601 range: fetchRange, 26602 isRefetch, 26603 context 26604 }, (res) => { 26605 let { rawEvents } = res; 26606 if (options.eventSourceSuccess) { 26607 rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents; 26608 } 26609 if (eventSource.success) { 26610 rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents; 26611 } 26612 context.dispatch({ 26613 type: "RECEIVE_EVENTS", 26614 sourceId: eventSource.sourceId, 26615 fetchId, 26616 fetchRange, 26617 rawEvents 26618 }); 26619 }, (error2) => { 26620 let errorHandled = false; 26621 if (options.eventSourceFailure) { 26622 options.eventSourceFailure.call(calendarApi, error2); 26623 errorHandled = true; 26624 } 26625 if (eventSource.failure) { 26626 eventSource.failure(error2); 26627 errorHandled = true; 26628 } 26629 if (!errorHandled) { 26630 console.warn(error2.message, error2); 26631 } 26632 context.dispatch({ 26633 type: "RECEIVE_EVENT_ERROR", 26634 sourceId: eventSource.sourceId, 26635 fetchId, 26636 fetchRange, 26637 error: error2 26638 }); 26639 }); 26640 return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId }); 26641 } 26642 function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { 26643 let eventSource = sourceHash[sourceId]; 26644 if (eventSource && fetchId === eventSource.latestFetchId) { 26645 return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) }); 26646 } 26647 return sourceHash; 26648 } 26649 function excludeStaticSources(eventSources, context) { 26650 return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context)); 26651 } 26652 function parseInitialSources(rawOptions, context) { 26653 let refiners = buildEventSourceRefiners(context); 26654 let rawSources = [].concat(rawOptions.eventSources || []); 26655 let sources = []; 26656 if (rawOptions.initialEvents) { 26657 rawSources.unshift(rawOptions.initialEvents); 26658 } 26659 if (rawOptions.events) { 26660 rawSources.unshift(rawOptions.events); 26661 } 26662 for (let rawSource of rawSources) { 26663 let source = parseEventSource(rawSource, context, refiners); 26664 if (source) { 26665 sources.push(source); 26666 } 26667 } 26668 return sources; 26669 } 26670 function doesSourceNeedRange(eventSource, context) { 26671 let defs = context.pluginHooks.eventSourceDefs; 26672 return !defs[eventSource.sourceDefId].ignoreRange; 26673 } 26674 function reduceDateSelection(currentSelection, action) { 26675 switch (action.type) { 26676 case "UNSELECT_DATES": 26677 return null; 26678 case "SELECT_DATES": 26679 return action.selection; 26680 default: 26681 return currentSelection; 26682 } 26683 } 26684 function reduceSelectedEvent(currentInstanceId, action) { 26685 switch (action.type) { 26686 case "UNSELECT_EVENT": 26687 return ""; 26688 case "SELECT_EVENT": 26689 return action.eventInstanceId; 26690 default: 26691 return currentInstanceId; 26692 } 26693 } 26694 function reduceEventDrag(currentDrag, action) { 26695 let newDrag; 26696 switch (action.type) { 26697 case "UNSET_EVENT_DRAG": 26698 return null; 26699 case "SET_EVENT_DRAG": 26700 newDrag = action.state; 26701 return { 26702 affectedEvents: newDrag.affectedEvents, 26703 mutatedEvents: newDrag.mutatedEvents, 26704 isEvent: newDrag.isEvent 26705 }; 26706 default: 26707 return currentDrag; 26708 } 26709 } 26710 function reduceEventResize(currentResize, action) { 26711 let newResize; 26712 switch (action.type) { 26713 case "UNSET_EVENT_RESIZE": 26714 return null; 26715 case "SET_EVENT_RESIZE": 26716 newResize = action.state; 26717 return { 26718 affectedEvents: newResize.affectedEvents, 26719 mutatedEvents: newResize.mutatedEvents, 26720 isEvent: newResize.isEvent 26721 }; 26722 default: 26723 return currentResize; 26724 } 26725 } 26726 function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { 26727 let header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; 26728 let footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; 26729 return { header, footer }; 26730 } 26731 function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { 26732 let sectionWidgets = {}; 26733 let viewsWithButtons = []; 26734 let hasTitle = false; 26735 for (let sectionName in sectionStrHash) { 26736 let sectionStr = sectionStrHash[sectionName]; 26737 let sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi); 26738 sectionWidgets[sectionName] = sectionRes.widgets; 26739 viewsWithButtons.push(...sectionRes.viewsWithButtons); 26740 hasTitle = hasTitle || sectionRes.hasTitle; 26741 } 26742 return { sectionWidgets, viewsWithButtons, hasTitle }; 26743 } 26744 function parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { 26745 let isRtl = calendarOptions.direction === "rtl"; 26746 let calendarCustomButtons = calendarOptions.customButtons || {}; 26747 let calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {}; 26748 let calendarButtonText = calendarOptions.buttonText || {}; 26749 let calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {}; 26750 let calendarButtonHints = calendarOptions.buttonHints || {}; 26751 let sectionSubstrs = sectionStr ? sectionStr.split(" ") : []; 26752 let viewsWithButtons = []; 26753 let hasTitle = false; 26754 let widgets = sectionSubstrs.map((buttonGroupStr) => buttonGroupStr.split(",").map((buttonName) => { 26755 if (buttonName === "title") { 26756 hasTitle = true; 26757 return { buttonName }; 26758 } 26759 let customButtonProps; 26760 let viewSpec; 26761 let buttonClick; 26762 let buttonIcon; 26763 let buttonText; 26764 let buttonHint; 26765 if (customButtonProps = calendarCustomButtons[buttonName]) { 26766 buttonClick = (ev) => { 26767 if (customButtonProps.click) { 26768 customButtonProps.click.call(ev.target, ev, ev.target); 26769 } 26770 }; 26771 (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = customButtonProps.text); 26772 buttonHint = customButtonProps.hint || customButtonProps.text; 26773 } else if (viewSpec = viewSpecs[buttonName]) { 26774 viewsWithButtons.push(buttonName); 26775 buttonClick = () => { 26776 calendarApi.changeView(buttonName); 26777 }; 26778 (buttonText = viewSpec.buttonTextOverride) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = viewSpec.buttonTextDefault); 26779 let textFallback = viewSpec.buttonTextOverride || viewSpec.buttonTextDefault; 26780 buttonHint = formatWithOrdinals( 26781 viewSpec.buttonTitleOverride || viewSpec.buttonTitleDefault || calendarOptions.viewHint, 26782 [textFallback, buttonName], 26783 textFallback 26784 ); 26785 } else if (calendarApi[buttonName]) { 26786 buttonClick = () => { 26787 calendarApi[buttonName](); 26788 }; 26789 (buttonText = calendarButtonTextOverrides[buttonName]) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = calendarButtonText[buttonName]); 26790 if (buttonName === "prevYear" || buttonName === "nextYear") { 26791 let prevOrNext = buttonName === "prevYear" ? "prev" : "next"; 26792 buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || calendarButtonHints[prevOrNext], [ 26793 calendarButtonText.year || "year", 26794 "year" 26795 ], calendarButtonText[buttonName]); 26796 } else { 26797 buttonHint = (navUnit) => formatWithOrdinals(calendarButtonHintOverrides[buttonName] || calendarButtonHints[buttonName], [ 26798 calendarButtonText[navUnit] || navUnit, 26799 navUnit 26800 ], calendarButtonText[buttonName]); 26801 } 26802 } 26803 return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint }; 26804 })); 26805 return { widgets, viewsWithButtons, hasTitle }; 26806 } 26807 var ViewImpl = class { 26808 constructor(type, getCurrentData, dateEnv) { 26809 this.type = type; 26810 this.getCurrentData = getCurrentData; 26811 this.dateEnv = dateEnv; 26812 } 26813 get calendar() { 26814 return this.getCurrentData().calendarApi; 26815 } 26816 get title() { 26817 return this.getCurrentData().viewTitle; 26818 } 26819 get activeStart() { 26820 return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start); 26821 } 26822 get activeEnd() { 26823 return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end); 26824 } 26825 get currentStart() { 26826 return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start); 26827 } 26828 get currentEnd() { 26829 return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end); 26830 } 26831 getOption(name) { 26832 return this.getCurrentData().options[name]; 26833 } 26834 }; 26835 var eventSourceDef$2 = { 26836 ignoreRange: true, 26837 parseMeta(refined) { 26838 if (Array.isArray(refined.events)) { 26839 return refined.events; 26840 } 26841 return null; 26842 }, 26843 fetch(arg, successCallback) { 26844 successCallback({ 26845 rawEvents: arg.eventSource.meta 26846 }); 26847 } 26848 }; 26849 var arrayEventSourcePlugin = createPlugin({ 26850 name: "array-event-source", 26851 eventSourceDefs: [eventSourceDef$2] 26852 }); 26853 var eventSourceDef$1 = { 26854 parseMeta(refined) { 26855 if (typeof refined.events === "function") { 26856 return refined.events; 26857 } 26858 return null; 26859 }, 26860 fetch(arg, successCallback, errorCallback) { 26861 const { dateEnv } = arg.context; 26862 const func = arg.eventSource.meta; 26863 unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback); 26864 } 26865 }; 26866 var funcEventSourcePlugin = createPlugin({ 26867 name: "func-event-source", 26868 eventSourceDefs: [eventSourceDef$1] 26869 }); 26870 var JSON_FEED_EVENT_SOURCE_REFINERS = { 26871 method: String, 26872 extraParams: identity, 26873 startParam: String, 26874 endParam: String, 26875 timeZoneParam: String 26876 }; 26877 var eventSourceDef = { 26878 parseMeta(refined) { 26879 if (refined.url && (refined.format === "json" || !refined.format)) { 26880 return { 26881 url: refined.url, 26882 format: "json", 26883 method: (refined.method || "GET").toUpperCase(), 26884 extraParams: refined.extraParams, 26885 startParam: refined.startParam, 26886 endParam: refined.endParam, 26887 timeZoneParam: refined.timeZoneParam 26888 }; 26889 } 26890 return null; 26891 }, 26892 fetch(arg, successCallback, errorCallback) { 26893 const { meta } = arg.eventSource; 26894 const requestParams = buildRequestParams(meta, arg.range, arg.context); 26895 requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => { 26896 successCallback({ rawEvents, response }); 26897 }, errorCallback); 26898 } 26899 }; 26900 var jsonFeedEventSourcePlugin = createPlugin({ 26901 name: "json-event-source", 26902 eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS, 26903 eventSourceDefs: [eventSourceDef] 26904 }); 26905 function buildRequestParams(meta, range, context) { 26906 let { dateEnv, options } = context; 26907 let startParam; 26908 let endParam; 26909 let timeZoneParam; 26910 let customRequestParams; 26911 let params = {}; 26912 startParam = meta.startParam; 26913 if (startParam == null) { 26914 startParam = options.startParam; 26915 } 26916 endParam = meta.endParam; 26917 if (endParam == null) { 26918 endParam = options.endParam; 26919 } 26920 timeZoneParam = meta.timeZoneParam; 26921 if (timeZoneParam == null) { 26922 timeZoneParam = options.timeZoneParam; 26923 } 26924 if (typeof meta.extraParams === "function") { 26925 customRequestParams = meta.extraParams(); 26926 } else { 26927 customRequestParams = meta.extraParams || {}; 26928 } 26929 Object.assign(params, customRequestParams); 26930 params[startParam] = dateEnv.formatIso(range.start); 26931 params[endParam] = dateEnv.formatIso(range.end); 26932 if (dateEnv.timeZone !== "local") { 26933 params[timeZoneParam] = dateEnv.timeZone; 26934 } 26935 return params; 26936 } 26937 var SIMPLE_RECURRING_REFINERS = { 26938 daysOfWeek: identity, 26939 startTime: createDuration, 26940 endTime: createDuration, 26941 duration: createDuration, 26942 startRecur: identity, 26943 endRecur: identity 26944 }; 26945 var recurring = { 26946 parse(refined, dateEnv) { 26947 if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) { 26948 let recurringData = { 26949 daysOfWeek: refined.daysOfWeek || null, 26950 startTime: refined.startTime || null, 26951 endTime: refined.endTime || null, 26952 startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null, 26953 endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null 26954 }; 26955 let duration; 26956 if (refined.duration) { 26957 duration = refined.duration; 26958 } 26959 if (!duration && refined.startTime && refined.endTime) { 26960 duration = subtractDurations(refined.endTime, refined.startTime); 26961 } 26962 return { 26963 allDayGuess: Boolean(!refined.startTime && !refined.endTime), 26964 duration, 26965 typeData: recurringData 26966 }; 26967 } 26968 return null; 26969 }, 26970 expand(typeData, framingRange, dateEnv) { 26971 let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); 26972 if (clippedFramingRange) { 26973 return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); 26974 } 26975 return []; 26976 } 26977 }; 26978 var simpleRecurringEventsPlugin = createPlugin({ 26979 name: "simple-recurring-event", 26980 recurringTypes: [recurring], 26981 eventRefiners: SIMPLE_RECURRING_REFINERS 26982 }); 26983 function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { 26984 let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; 26985 let dayMarker = startOfDay(framingRange.start); 26986 let endMarker = framingRange.end; 26987 let instanceStarts = []; 26988 while (dayMarker < endMarker) { 26989 let instanceStart; 26990 if (!dowHash || dowHash[dayMarker.getUTCDay()]) { 26991 if (startTime) { 26992 instanceStart = dateEnv.add(dayMarker, startTime); 26993 } else { 26994 instanceStart = dayMarker; 26995 } 26996 instanceStarts.push(instanceStart); 26997 } 26998 dayMarker = addDays(dayMarker, 1); 26999 } 27000 return instanceStarts; 27001 } 27002 var changeHandlerPlugin = createPlugin({ 27003 name: "change-handler", 27004 optionChangeHandlers: { 27005 events(events2, context) { 27006 handleEventSources([events2], context); 27007 }, 27008 eventSources: handleEventSources 27009 } 27010 }); 27011 function handleEventSources(inputs, context) { 27012 let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources); 27013 if (unfoundSources.length === 1 && inputs.length === 1 && Array.isArray(unfoundSources[0]._raw) && Array.isArray(inputs[0])) { 27014 context.dispatch({ 27015 type: "RESET_RAW_EVENTS", 27016 sourceId: unfoundSources[0].sourceId, 27017 rawEvents: inputs[0] 27018 }); 27019 return; 27020 } 27021 let newInputs = []; 27022 for (let input of inputs) { 27023 let inputFound = false; 27024 for (let i4 = 0; i4 < unfoundSources.length; i4 += 1) { 27025 if (unfoundSources[i4]._raw === input) { 27026 unfoundSources.splice(i4, 1); 27027 inputFound = true; 27028 break; 27029 } 27030 } 27031 if (!inputFound) { 27032 newInputs.push(input); 27033 } 27034 } 27035 for (let unfoundSource of unfoundSources) { 27036 context.dispatch({ 27037 type: "REMOVE_EVENT_SOURCE", 27038 sourceId: unfoundSource.sourceId 27039 }); 27040 } 27041 for (let newInput of newInputs) { 27042 context.calendarApi.addEventSource(newInput); 27043 } 27044 } 27045 function handleDateProfile(dateProfile, context) { 27046 context.emitter.trigger("datesSet", Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi })); 27047 } 27048 function handleEventStore(eventStore, context) { 27049 let { emitter } = context; 27050 if (emitter.hasHandlers("eventsSet")) { 27051 emitter.trigger("eventsSet", buildEventApis(eventStore, context)); 27052 } 27053 } 27054 var globalPlugins = [ 27055 arrayEventSourcePlugin, 27056 funcEventSourcePlugin, 27057 jsonFeedEventSourcePlugin, 27058 simpleRecurringEventsPlugin, 27059 changeHandlerPlugin, 27060 createPlugin({ 27061 name: "misc", 27062 isLoadingFuncs: [ 27063 (state) => computeEventSourcesLoading(state.eventSources) 27064 ], 27065 propSetHandlers: { 27066 dateProfile: handleDateProfile, 27067 eventStore: handleEventStore 27068 } 27069 }) 27070 ]; 27071 var TaskRunner = class { 27072 constructor(runTaskOption, drainedOption) { 27073 this.runTaskOption = runTaskOption; 27074 this.drainedOption = drainedOption; 27075 this.queue = []; 27076 this.delayedRunner = new DelayedRunner(this.drain.bind(this)); 27077 } 27078 request(task, delay) { 27079 this.queue.push(task); 27080 this.delayedRunner.request(delay); 27081 } 27082 pause(scope) { 27083 this.delayedRunner.pause(scope); 27084 } 27085 resume(scope, force) { 27086 this.delayedRunner.resume(scope, force); 27087 } 27088 drain() { 27089 let { queue } = this; 27090 while (queue.length) { 27091 let completedTasks = []; 27092 let task; 27093 while (task = queue.shift()) { 27094 this.runTask(task); 27095 completedTasks.push(task); 27096 } 27097 this.drained(completedTasks); 27098 } 27099 } 27100 runTask(task) { 27101 if (this.runTaskOption) { 27102 this.runTaskOption(task); 27103 } 27104 } 27105 drained(completedTasks) { 27106 if (this.drainedOption) { 27107 this.drainedOption(completedTasks); 27108 } 27109 } 27110 }; 27111 function buildTitle(dateProfile, viewOptions, dateEnv) { 27112 let range; 27113 if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { 27114 range = dateProfile.currentRange; 27115 } else { 27116 range = dateProfile.activeRange; 27117 } 27118 return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), { 27119 isEndExclusive: dateProfile.isRangeAllDay, 27120 defaultSeparator: viewOptions.titleRangeSeparator 27121 }); 27122 } 27123 function buildTitleFormat(dateProfile) { 27124 let { currentRangeUnit } = dateProfile; 27125 if (currentRangeUnit === "year") { 27126 return { year: "numeric" }; 27127 } 27128 if (currentRangeUnit === "month") { 27129 return { year: "numeric", month: "long" }; 27130 } 27131 let days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); 27132 if (days !== null && days > 1) { 27133 return { year: "numeric", month: "short", day: "numeric" }; 27134 } 27135 return { year: "numeric", month: "long", day: "numeric" }; 27136 } 27137 var CalendarDataManager = class { 27138 constructor(props) { 27139 this.computeCurrentViewData = memoize(this._computeCurrentViewData); 27140 this.organizeRawLocales = memoize(organizeRawLocales); 27141 this.buildLocale = memoize(buildLocale); 27142 this.buildPluginHooks = buildBuildPluginHooks(); 27143 this.buildDateEnv = memoize(buildDateEnv$1); 27144 this.buildTheme = memoize(buildTheme); 27145 this.parseToolbars = memoize(parseToolbars); 27146 this.buildViewSpecs = memoize(buildViewSpecs); 27147 this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator); 27148 this.buildViewApi = memoize(buildViewApi); 27149 this.buildViewUiProps = memoizeObjArg(buildViewUiProps); 27150 this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual); 27151 this.buildEventUiBases = memoize(buildEventUiBases); 27152 this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours); 27153 this.buildTitle = memoize(buildTitle); 27154 this.emitter = new Emitter(); 27155 this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this)); 27156 this.currentCalendarOptionsInput = {}; 27157 this.currentCalendarOptionsRefined = {}; 27158 this.currentViewOptionsInput = {}; 27159 this.currentViewOptionsRefined = {}; 27160 this.currentCalendarOptionsRefiners = {}; 27161 this.optionsForRefining = []; 27162 this.optionsForHandling = []; 27163 this.getCurrentData = () => this.data; 27164 this.dispatch = (action) => { 27165 this.actionRunner.request(action); 27166 }; 27167 this.props = props; 27168 this.actionRunner.pause(); 27169 let dynamicOptionOverrides = {}; 27170 let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); 27171 let currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView; 27172 let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); 27173 props.calendarApi.currentDataManager = this; 27174 this.emitter.setThisContext(props.calendarApi); 27175 this.emitter.setOptions(currentViewData.options); 27176 let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv); 27177 let dateProfile = currentViewData.dateProfileGenerator.build(currentDate); 27178 if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) { 27179 currentDate = dateProfile.currentRange.start; 27180 } 27181 let calendarContext = { 27182 dateEnv: optionsData.dateEnv, 27183 options: optionsData.calendarOptions, 27184 pluginHooks: optionsData.pluginHooks, 27185 calendarApi: props.calendarApi, 27186 dispatch: this.dispatch, 27187 emitter: this.emitter, 27188 getCurrentData: this.getCurrentData 27189 }; 27190 for (let callback of optionsData.pluginHooks.contextInit) { 27191 callback(calendarContext); 27192 } 27193 let eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext); 27194 let initialState = { 27195 dynamicOptionOverrides, 27196 currentViewType, 27197 currentDate, 27198 dateProfile, 27199 businessHours: this.parseContextBusinessHours(calendarContext), 27200 eventSources, 27201 eventUiBases: {}, 27202 eventStore: createEmptyEventStore(), 27203 renderableEventStore: createEmptyEventStore(), 27204 dateSelection: null, 27205 eventSelection: "", 27206 eventDrag: null, 27207 eventResize: null, 27208 selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig 27209 }; 27210 let contextAndState = Object.assign(Object.assign({}, calendarContext), initialState); 27211 for (let reducer of optionsData.pluginHooks.reducers) { 27212 Object.assign(initialState, reducer(null, null, contextAndState)); 27213 } 27214 if (computeIsLoading(initialState, calendarContext)) { 27215 this.emitter.trigger("loading", true); 27216 } 27217 this.state = initialState; 27218 this.updateData(); 27219 this.actionRunner.resume(); 27220 } 27221 resetOptions(optionOverrides, changedOptionNames) { 27222 let { props } = this; 27223 if (changedOptionNames === void 0) { 27224 props.optionOverrides = optionOverrides; 27225 } else { 27226 props.optionOverrides = Object.assign(Object.assign({}, props.optionOverrides || {}), optionOverrides); 27227 this.optionsForRefining.push(...changedOptionNames); 27228 } 27229 if (changedOptionNames === void 0 || changedOptionNames.length) { 27230 this.actionRunner.request({ 27231 type: "NOTHING" 27232 }); 27233 } 27234 } 27235 _handleAction(action) { 27236 let { props, state, emitter } = this; 27237 let dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action); 27238 let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); 27239 let currentViewType = reduceViewType(state.currentViewType, action); 27240 let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); 27241 props.calendarApi.currentDataManager = this; 27242 emitter.setThisContext(props.calendarApi); 27243 emitter.setOptions(currentViewData.options); 27244 let calendarContext = { 27245 dateEnv: optionsData.dateEnv, 27246 options: optionsData.calendarOptions, 27247 pluginHooks: optionsData.pluginHooks, 27248 calendarApi: props.calendarApi, 27249 dispatch: this.dispatch, 27250 emitter, 27251 getCurrentData: this.getCurrentData 27252 }; 27253 let { currentDate, dateProfile } = state; 27254 if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { 27255 dateProfile = currentViewData.dateProfileGenerator.build(currentDate); 27256 } 27257 currentDate = reduceCurrentDate(currentDate, action); 27258 dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator); 27259 if (action.type === "PREV" || action.type === "NEXT" || !rangeContainsMarker(dateProfile.currentRange, currentDate)) { 27260 currentDate = dateProfile.currentRange.start; 27261 } 27262 let eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext); 27263 let eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext); 27264 let isEventsLoading = computeEventSourcesLoading(eventSources); 27265 let renderableEventStore = isEventsLoading && !currentViewData.options.progressiveEventRendering ? state.renderableEventStore || eventStore : eventStore; 27266 let { eventUiSingleBase, selectionConfig } = this.buildViewUiProps(calendarContext); 27267 let eventUiBySource = this.buildEventUiBySource(eventSources); 27268 let eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); 27269 let newState = { 27270 dynamicOptionOverrides, 27271 currentViewType, 27272 currentDate, 27273 dateProfile, 27274 eventSources, 27275 eventStore, 27276 renderableEventStore, 27277 selectionConfig, 27278 eventUiBases, 27279 businessHours: this.parseContextBusinessHours(calendarContext), 27280 dateSelection: reduceDateSelection(state.dateSelection, action), 27281 eventSelection: reduceSelectedEvent(state.eventSelection, action), 27282 eventDrag: reduceEventDrag(state.eventDrag, action), 27283 eventResize: reduceEventResize(state.eventResize, action) 27284 }; 27285 let contextAndState = Object.assign(Object.assign({}, calendarContext), newState); 27286 for (let reducer of optionsData.pluginHooks.reducers) { 27287 Object.assign(newState, reducer(state, action, contextAndState)); 27288 } 27289 let wasLoading = computeIsLoading(state, calendarContext); 27290 let isLoading = computeIsLoading(newState, calendarContext); 27291 if (!wasLoading && isLoading) { 27292 emitter.trigger("loading", true); 27293 } else if (wasLoading && !isLoading) { 27294 emitter.trigger("loading", false); 27295 } 27296 this.state = newState; 27297 if (props.onAction) { 27298 props.onAction(action); 27299 } 27300 } 27301 updateData() { 27302 let { props, state } = this; 27303 let oldData = this.data; 27304 let optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi); 27305 let currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides); 27306 let data = this.data = Object.assign(Object.assign(Object.assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state); 27307 let changeHandlers = optionsData.pluginHooks.optionChangeHandlers; 27308 let oldCalendarOptions = oldData && oldData.calendarOptions; 27309 let newCalendarOptions = optionsData.calendarOptions; 27310 if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) { 27311 if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) { 27312 state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data); 27313 state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv); 27314 state.renderableEventStore = data.renderableEventStore = rezoneEventStoreDates(data.renderableEventStore, oldData.dateEnv, data.dateEnv); 27315 } 27316 for (let optionName in changeHandlers) { 27317 if (this.optionsForHandling.indexOf(optionName) !== -1 || oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { 27318 changeHandlers[optionName](newCalendarOptions[optionName], data); 27319 } 27320 } 27321 } 27322 this.optionsForHandling = []; 27323 if (props.onData) { 27324 props.onData(data); 27325 } 27326 } 27327 computeOptionsData(optionOverrides, dynamicOptionOverrides, calendarApi) { 27328 if (!this.optionsForRefining.length && optionOverrides === this.stableOptionOverrides && dynamicOptionOverrides === this.stableDynamicOptionOverrides) { 27329 return this.stableCalendarOptionsData; 27330 } 27331 let { refinedOptions, pluginHooks, localeDefaults, availableLocaleData, extra } = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides); 27332 warnUnknownOptions(extra); 27333 let dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator); 27334 let viewSpecs = this.buildViewSpecs(pluginHooks.views, this.stableOptionOverrides, this.stableDynamicOptionOverrides, localeDefaults); 27335 let theme = this.buildTheme(refinedOptions, pluginHooks); 27336 let toolbarConfig = this.parseToolbars(refinedOptions, this.stableOptionOverrides, theme, viewSpecs, calendarApi); 27337 return this.stableCalendarOptionsData = { 27338 calendarOptions: refinedOptions, 27339 pluginHooks, 27340 dateEnv, 27341 viewSpecs, 27342 theme, 27343 toolbarConfig, 27344 localeDefaults, 27345 availableRawLocales: availableLocaleData.map 27346 }; 27347 } 27348 processRawCalendarOptions(optionOverrides, dynamicOptionOverrides) { 27349 let { locales, locale } = mergeRawOptions([ 27350 BASE_OPTION_DEFAULTS, 27351 optionOverrides, 27352 dynamicOptionOverrides 27353 ]); 27354 let availableLocaleData = this.organizeRawLocales(locales); 27355 let availableRawLocales = availableLocaleData.map; 27356 let localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options; 27357 let pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins); 27358 let refiners = this.currentCalendarOptionsRefiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); 27359 let extra = {}; 27360 let raw = mergeRawOptions([ 27361 BASE_OPTION_DEFAULTS, 27362 localeDefaults, 27363 optionOverrides, 27364 dynamicOptionOverrides 27365 ]); 27366 let refined = {}; 27367 let currentRaw = this.currentCalendarOptionsInput; 27368 let currentRefined = this.currentCalendarOptionsRefined; 27369 let anyChanges = false; 27370 for (let optionName in raw) { 27371 if (this.optionsForRefining.indexOf(optionName) === -1 && (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && optionName in currentRaw && COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) { 27372 refined[optionName] = currentRefined[optionName]; 27373 } else if (refiners[optionName]) { 27374 refined[optionName] = refiners[optionName](raw[optionName]); 27375 anyChanges = true; 27376 } else { 27377 extra[optionName] = currentRaw[optionName]; 27378 } 27379 } 27380 if (anyChanges) { 27381 this.currentCalendarOptionsInput = raw; 27382 this.currentCalendarOptionsRefined = refined; 27383 this.stableOptionOverrides = optionOverrides; 27384 this.stableDynamicOptionOverrides = dynamicOptionOverrides; 27385 } 27386 this.optionsForHandling.push(...this.optionsForRefining); 27387 this.optionsForRefining = []; 27388 return { 27389 rawOptions: this.currentCalendarOptionsInput, 27390 refinedOptions: this.currentCalendarOptionsRefined, 27391 pluginHooks, 27392 availableLocaleData, 27393 localeDefaults, 27394 extra 27395 }; 27396 } 27397 _computeCurrentViewData(viewType, optionsData, optionOverrides, dynamicOptionOverrides) { 27398 let viewSpec = optionsData.viewSpecs[viewType]; 27399 if (!viewSpec) { 27400 throw new Error(`viewType "${viewType}" is not available. Please make sure you've loaded all neccessary plugins`); 27401 } 27402 let { refinedOptions, extra } = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides); 27403 warnUnknownOptions(extra); 27404 let dateProfileGenerator = this.buildDateProfileGenerator({ 27405 dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass, 27406 duration: viewSpec.duration, 27407 durationUnit: viewSpec.durationUnit, 27408 usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime, 27409 dateEnv: optionsData.dateEnv, 27410 calendarApi: this.props.calendarApi, 27411 slotMinTime: refinedOptions.slotMinTime, 27412 slotMaxTime: refinedOptions.slotMaxTime, 27413 showNonCurrentDates: refinedOptions.showNonCurrentDates, 27414 dayCount: refinedOptions.dayCount, 27415 dateAlignment: refinedOptions.dateAlignment, 27416 dateIncrement: refinedOptions.dateIncrement, 27417 hiddenDays: refinedOptions.hiddenDays, 27418 weekends: refinedOptions.weekends, 27419 nowInput: refinedOptions.now, 27420 validRangeInput: refinedOptions.validRange, 27421 visibleRangeInput: refinedOptions.visibleRange, 27422 fixedWeekCount: refinedOptions.fixedWeekCount 27423 }); 27424 let viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv); 27425 return { viewSpec, options: refinedOptions, dateProfileGenerator, viewApi }; 27426 } 27427 processRawViewOptions(viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) { 27428 let raw = mergeRawOptions([ 27429 BASE_OPTION_DEFAULTS, 27430 viewSpec.optionDefaults, 27431 localeDefaults, 27432 optionOverrides, 27433 viewSpec.optionOverrides, 27434 dynamicOptionOverrides 27435 ]); 27436 let refiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); 27437 let refined = {}; 27438 let currentRaw = this.currentViewOptionsInput; 27439 let currentRefined = this.currentViewOptionsRefined; 27440 let anyChanges = false; 27441 let extra = {}; 27442 for (let optionName in raw) { 27443 if (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName])) { 27444 refined[optionName] = currentRefined[optionName]; 27445 } else { 27446 if (raw[optionName] === this.currentCalendarOptionsInput[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName])) { 27447 if (optionName in this.currentCalendarOptionsRefined) { 27448 refined[optionName] = this.currentCalendarOptionsRefined[optionName]; 27449 } 27450 } else if (refiners[optionName]) { 27451 refined[optionName] = refiners[optionName](raw[optionName]); 27452 } else { 27453 extra[optionName] = raw[optionName]; 27454 } 27455 anyChanges = true; 27456 } 27457 } 27458 if (anyChanges) { 27459 this.currentViewOptionsInput = raw; 27460 this.currentViewOptionsRefined = refined; 27461 } 27462 return { 27463 rawOptions: this.currentViewOptionsInput, 27464 refinedOptions: this.currentViewOptionsRefined, 27465 extra 27466 }; 27467 } 27468 }; 27469 function buildDateEnv$1(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) { 27470 let locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map); 27471 return new DateEnv({ 27472 calendarSystem: "gregory", 27473 timeZone, 27474 namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl, 27475 locale, 27476 weekNumberCalculation, 27477 firstDay, 27478 weekText, 27479 cmdFormatter: pluginHooks.cmdFormatter, 27480 defaultSeparator 27481 }); 27482 } 27483 function buildTheme(options, pluginHooks) { 27484 let ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme; 27485 return new ThemeClass(options); 27486 } 27487 function buildDateProfileGenerator(props) { 27488 let DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator; 27489 return new DateProfileGeneratorClass(props); 27490 } 27491 function buildViewApi(type, getCurrentData, dateEnv) { 27492 return new ViewImpl(type, getCurrentData, dateEnv); 27493 } 27494 function buildEventUiBySource(eventSources) { 27495 return mapHash(eventSources, (eventSource) => eventSource.ui); 27496 } 27497 function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { 27498 let eventUiBases = { "": eventUiSingleBase }; 27499 for (let defId in eventDefs) { 27500 let def = eventDefs[defId]; 27501 if (def.sourceId && eventUiBySource[def.sourceId]) { 27502 eventUiBases[defId] = eventUiBySource[def.sourceId]; 27503 } 27504 } 27505 return eventUiBases; 27506 } 27507 function buildViewUiProps(calendarContext) { 27508 let { options } = calendarContext; 27509 return { 27510 eventUiSingleBase: createEventUi({ 27511 display: options.eventDisplay, 27512 editable: options.editable, 27513 startEditable: options.eventStartEditable, 27514 durationEditable: options.eventDurationEditable, 27515 constraint: options.eventConstraint, 27516 overlap: typeof options.eventOverlap === "boolean" ? options.eventOverlap : void 0, 27517 allow: options.eventAllow, 27518 backgroundColor: options.eventBackgroundColor, 27519 borderColor: options.eventBorderColor, 27520 textColor: options.eventTextColor, 27521 color: options.eventColor 27522 }, calendarContext), 27523 selectionConfig: createEventUi({ 27524 constraint: options.selectConstraint, 27525 overlap: typeof options.selectOverlap === "boolean" ? options.selectOverlap : void 0, 27526 allow: options.selectAllow 27527 }, calendarContext) 27528 }; 27529 } 27530 function computeIsLoading(state, context) { 27531 for (let isLoadingFunc of context.pluginHooks.isLoadingFuncs) { 27532 if (isLoadingFunc(state)) { 27533 return true; 27534 } 27535 } 27536 return false; 27537 } 27538 function parseContextBusinessHours(calendarContext) { 27539 return parseBusinessHours(calendarContext.options.businessHours, calendarContext); 27540 } 27541 function warnUnknownOptions(options, viewName) { 27542 for (let optionName in options) { 27543 console.warn(`Unknown option '${optionName}'` + (viewName ? ` for view '${viewName}'` : "")); 27544 } 27545 } 27546 var ToolbarSection = class extends BaseComponent { 27547 render() { 27548 let children = this.props.widgetGroups.map((widgetGroup) => this.renderWidgetGroup(widgetGroup)); 27549 return y2("div", { className: "fc-toolbar-chunk" }, ...children); 27550 } 27551 renderWidgetGroup(widgetGroup) { 27552 let { props } = this; 27553 let { theme } = this.context; 27554 let children = []; 27555 let isOnlyButtons = true; 27556 for (let widget of widgetGroup) { 27557 let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget; 27558 if (buttonName === "title") { 27559 isOnlyButtons = false; 27560 children.push(y2("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); 27561 } else { 27562 let isPressed = buttonName === props.activeButton; 27563 let isDisabled2 = !props.isTodayEnabled && buttonName === "today" || !props.isPrevEnabled && buttonName === "prev" || !props.isNextEnabled && buttonName === "next"; 27564 let buttonClasses = [`fc-${buttonName}-button`, theme.getClass("button")]; 27565 if (isPressed) { 27566 buttonClasses.push(theme.getClass("buttonActive")); 27567 } 27568 children.push(y2("button", { type: "button", title: typeof buttonHint === "function" ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled2, "aria-pressed": isPressed, className: buttonClasses.join(" "), onClick: buttonClick }, buttonText || (buttonIcon ? y2("span", { className: buttonIcon, role: "img" }) : ""))); 27569 } 27570 } 27571 if (children.length > 1) { 27572 let groupClassName = isOnlyButtons && theme.getClass("buttonGroup") || ""; 27573 return y2("div", { className: groupClassName }, ...children); 27574 } 27575 return children[0]; 27576 } 27577 }; 27578 var Toolbar = class extends BaseComponent { 27579 render() { 27580 let { model, extraClassName } = this.props; 27581 let forceLtr = false; 27582 let startContent; 27583 let endContent; 27584 let sectionWidgets = model.sectionWidgets; 27585 let centerContent = sectionWidgets.center; 27586 if (sectionWidgets.left) { 27587 forceLtr = true; 27588 startContent = sectionWidgets.left; 27589 } else { 27590 startContent = sectionWidgets.start; 27591 } 27592 if (sectionWidgets.right) { 27593 forceLtr = true; 27594 endContent = sectionWidgets.right; 27595 } else { 27596 endContent = sectionWidgets.end; 27597 } 27598 let classNames = [ 27599 extraClassName || "", 27600 "fc-toolbar", 27601 forceLtr ? "fc-toolbar-ltr" : "" 27602 ]; 27603 return y2( 27604 "div", 27605 { className: classNames.join(" ") }, 27606 this.renderSection("start", startContent || []), 27607 this.renderSection("center", centerContent || []), 27608 this.renderSection("end", endContent || []) 27609 ); 27610 } 27611 renderSection(key, widgetGroups) { 27612 let { props } = this; 27613 return y2(ToolbarSection, { key, widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId }); 27614 } 27615 }; 27616 var ViewHarness = class extends BaseComponent { 27617 constructor() { 27618 super(...arguments); 27619 this.state = { 27620 availableWidth: null 27621 }; 27622 this.handleEl = (el) => { 27623 this.el = el; 27624 setRef(this.props.elRef, el); 27625 this.updateAvailableWidth(); 27626 }; 27627 this.handleResize = () => { 27628 this.updateAvailableWidth(); 27629 }; 27630 } 27631 render() { 27632 let { props, state } = this; 27633 let { aspectRatio } = props; 27634 let classNames = [ 27635 "fc-view-harness", 27636 aspectRatio || props.liquid || props.height ? "fc-view-harness-active" : "fc-view-harness-passive" 27637 ]; 27638 let height = ""; 27639 let paddingBottom = ""; 27640 if (aspectRatio) { 27641 if (state.availableWidth !== null) { 27642 height = state.availableWidth / aspectRatio; 27643 } else { 27644 paddingBottom = `${1 / aspectRatio * 100}%`; 27645 } 27646 } else { 27647 height = props.height || ""; 27648 } 27649 return y2("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(" "), style: { height, paddingBottom } }, props.children); 27650 } 27651 componentDidMount() { 27652 this.context.addResizeHandler(this.handleResize); 27653 } 27654 componentWillUnmount() { 27655 this.context.removeResizeHandler(this.handleResize); 27656 } 27657 updateAvailableWidth() { 27658 if (this.el && this.props.aspectRatio) { 27659 this.setState({ availableWidth: this.el.offsetWidth }); 27660 } 27661 } 27662 }; 27663 var EventClicking = class extends Interaction { 27664 constructor(settings) { 27665 super(settings); 27666 this.handleSegClick = (ev, segEl) => { 27667 let { component } = this; 27668 let { context } = component; 27669 let seg = getElSeg(segEl); 27670 if (seg && component.isValidSegDownEl(ev.target)) { 27671 let hasUrlContainer = elementClosest(ev.target, ".fc-event-forced-url"); 27672 let url = hasUrlContainer ? hasUrlContainer.querySelector("a[href]").href : ""; 27673 context.emitter.trigger("eventClick", { 27674 el: segEl, 27675 event: new EventImpl(component.context, seg.eventRange.def, seg.eventRange.instance), 27676 jsEvent: ev, 27677 view: context.viewApi 27678 }); 27679 if (url && !ev.defaultPrevented) { 27680 window.location.href = url; 27681 } 27682 } 27683 }; 27684 this.destroy = listenBySelector( 27685 settings.el, 27686 "click", 27687 ".fc-event", 27688 this.handleSegClick 27689 ); 27690 } 27691 }; 27692 var EventHovering = class extends Interaction { 27693 constructor(settings) { 27694 super(settings); 27695 this.handleEventElRemove = (el) => { 27696 if (el === this.currentSegEl) { 27697 this.handleSegLeave(null, this.currentSegEl); 27698 } 27699 }; 27700 this.handleSegEnter = (ev, segEl) => { 27701 if (getElSeg(segEl)) { 27702 this.currentSegEl = segEl; 27703 this.triggerEvent("eventMouseEnter", ev, segEl); 27704 } 27705 }; 27706 this.handleSegLeave = (ev, segEl) => { 27707 if (this.currentSegEl) { 27708 this.currentSegEl = null; 27709 this.triggerEvent("eventMouseLeave", ev, segEl); 27710 } 27711 }; 27712 this.removeHoverListeners = listenToHoverBySelector( 27713 settings.el, 27714 ".fc-event", 27715 this.handleSegEnter, 27716 this.handleSegLeave 27717 ); 27718 } 27719 destroy() { 27720 this.removeHoverListeners(); 27721 } 27722 triggerEvent(publicEvName, ev, segEl) { 27723 let { component } = this; 27724 let { context } = component; 27725 let seg = getElSeg(segEl); 27726 if (!ev || component.isValidSegDownEl(ev.target)) { 27727 context.emitter.trigger(publicEvName, { 27728 el: segEl, 27729 event: new EventImpl(context, seg.eventRange.def, seg.eventRange.instance), 27730 jsEvent: ev, 27731 view: context.viewApi 27732 }); 27733 } 27734 } 27735 }; 27736 var CalendarContent = class extends PureComponent { 27737 constructor() { 27738 super(...arguments); 27739 this.buildViewContext = memoize(buildViewContext); 27740 this.buildViewPropTransformers = memoize(buildViewPropTransformers); 27741 this.buildToolbarProps = memoize(buildToolbarProps); 27742 this.headerRef = d2(); 27743 this.footerRef = d2(); 27744 this.interactionsStore = {}; 27745 this.state = { 27746 viewLabelId: getUniqueDomId() 27747 }; 27748 this.registerInteractiveComponent = (component, settingsInput) => { 27749 let settings = parseInteractionSettings(component, settingsInput); 27750 let DEFAULT_INTERACTIONS = [ 27751 EventClicking, 27752 EventHovering 27753 ]; 27754 let interactionClasses = DEFAULT_INTERACTIONS.concat(this.props.pluginHooks.componentInteractions); 27755 let interactions = interactionClasses.map((TheInteractionClass) => new TheInteractionClass(settings)); 27756 this.interactionsStore[component.uid] = interactions; 27757 interactionSettingsStore[component.uid] = settings; 27758 }; 27759 this.unregisterInteractiveComponent = (component) => { 27760 let listeners = this.interactionsStore[component.uid]; 27761 if (listeners) { 27762 for (let listener of listeners) { 27763 listener.destroy(); 27764 } 27765 delete this.interactionsStore[component.uid]; 27766 } 27767 delete interactionSettingsStore[component.uid]; 27768 }; 27769 this.resizeRunner = new DelayedRunner(() => { 27770 this.props.emitter.trigger("_resize", true); 27771 this.props.emitter.trigger("windowResize", { view: this.props.viewApi }); 27772 }); 27773 this.handleWindowResize = (ev) => { 27774 let { options } = this.props; 27775 if (options.handleWindowResize && ev.target === window) { 27776 this.resizeRunner.request(options.windowResizeDelay); 27777 } 27778 }; 27779 } 27780 render() { 27781 let { props } = this; 27782 let { toolbarConfig, options } = props; 27783 let toolbarProps = this.buildToolbarProps( 27784 props.viewSpec, 27785 props.dateProfile, 27786 props.dateProfileGenerator, 27787 props.currentDate, 27788 getNow(props.options.now, props.dateEnv), 27789 props.viewTitle 27790 ); 27791 let viewVGrow = false; 27792 let viewHeight = ""; 27793 let viewAspectRatio; 27794 if (props.isHeightAuto || props.forPrint) { 27795 viewHeight = ""; 27796 } else if (options.height != null) { 27797 viewVGrow = true; 27798 } else if (options.contentHeight != null) { 27799 viewHeight = options.contentHeight; 27800 } else { 27801 viewAspectRatio = Math.max(options.aspectRatio, 0.5); 27802 } 27803 let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent); 27804 let viewLabelId = toolbarConfig.header && toolbarConfig.header.hasTitle ? this.state.viewLabelId : void 0; 27805 return y2( 27806 ViewContextType.Provider, 27807 { value: viewContext }, 27808 toolbarConfig.header && y2(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps)), 27809 y2( 27810 ViewHarness, 27811 { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, 27812 this.renderView(props), 27813 this.buildAppendContent() 27814 ), 27815 toolbarConfig.footer && y2(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps)) 27816 ); 27817 } 27818 componentDidMount() { 27819 let { props } = this; 27820 this.calendarInteractions = props.pluginHooks.calendarInteractions.map((CalendarInteractionClass) => new CalendarInteractionClass(props)); 27821 window.addEventListener("resize", this.handleWindowResize); 27822 let { propSetHandlers } = props.pluginHooks; 27823 for (let propName in propSetHandlers) { 27824 propSetHandlers[propName](props[propName], props); 27825 } 27826 } 27827 componentDidUpdate(prevProps) { 27828 let { props } = this; 27829 let { propSetHandlers } = props.pluginHooks; 27830 for (let propName in propSetHandlers) { 27831 if (props[propName] !== prevProps[propName]) { 27832 propSetHandlers[propName](props[propName], props); 27833 } 27834 } 27835 } 27836 componentWillUnmount() { 27837 window.removeEventListener("resize", this.handleWindowResize); 27838 this.resizeRunner.clear(); 27839 for (let interaction of this.calendarInteractions) { 27840 interaction.destroy(); 27841 } 27842 this.props.emitter.trigger("_unmount"); 27843 } 27844 buildAppendContent() { 27845 let { props } = this; 27846 let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props)); 27847 return y2(_2, {}, ...children); 27848 } 27849 renderView(props) { 27850 let { pluginHooks } = props; 27851 let { viewSpec } = props; 27852 let viewProps = { 27853 dateProfile: props.dateProfile, 27854 businessHours: props.businessHours, 27855 eventStore: props.renderableEventStore, 27856 eventUiBases: props.eventUiBases, 27857 dateSelection: props.dateSelection, 27858 eventSelection: props.eventSelection, 27859 eventDrag: props.eventDrag, 27860 eventResize: props.eventResize, 27861 isHeightAuto: props.isHeightAuto, 27862 forPrint: props.forPrint 27863 }; 27864 let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers); 27865 for (let transformer of transformers) { 27866 Object.assign(viewProps, transformer.transform(viewProps, props)); 27867 } 27868 let ViewComponent = viewSpec.component; 27869 return y2(ViewComponent, Object.assign({}, viewProps)); 27870 } 27871 }; 27872 function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now3, title) { 27873 let todayInfo = dateProfileGenerator.build(now3, void 0, false); 27874 let prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false); 27875 let nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false); 27876 return { 27877 title, 27878 activeButton: viewSpec.type, 27879 navUnit: viewSpec.singleUnit, 27880 isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now3), 27881 isPrevEnabled: prevInfo.isValid, 27882 isNextEnabled: nextInfo.isValid 27883 }; 27884 } 27885 function buildViewPropTransformers(theClasses) { 27886 return theClasses.map((TheClass) => new TheClass()); 27887 } 27888 var Calendar = class extends CalendarImpl { 27889 constructor(el, optionOverrides = {}) { 27890 super(); 27891 this.isRendering = false; 27892 this.isRendered = false; 27893 this.currentClassNames = []; 27894 this.customContentRenderId = 0; 27895 this.handleAction = (action) => { 27896 switch (action.type) { 27897 case "SET_EVENT_DRAG": 27898 case "SET_EVENT_RESIZE": 27899 this.renderRunner.tryDrain(); 27900 } 27901 }; 27902 this.handleData = (data) => { 27903 this.currentData = data; 27904 this.renderRunner.request(data.calendarOptions.rerenderDelay); 27905 }; 27906 this.handleRenderRequest = () => { 27907 if (this.isRendering) { 27908 this.isRendered = true; 27909 let { currentData } = this; 27910 flushSync(() => { 27911 D2(y2(CalendarRoot, { options: currentData.calendarOptions, theme: currentData.theme, emitter: currentData.emitter }, (classNames, height, isHeightAuto, forPrint) => { 27912 this.setClassNames(classNames); 27913 this.setHeight(height); 27914 return y2( 27915 RenderId.Provider, 27916 { value: this.customContentRenderId }, 27917 y2(CalendarContent, Object.assign({ isHeightAuto, forPrint }, currentData)) 27918 ); 27919 }), this.el); 27920 }); 27921 } else if (this.isRendered) { 27922 this.isRendered = false; 27923 D2(null, this.el); 27924 this.setClassNames([]); 27925 this.setHeight(""); 27926 } 27927 }; 27928 ensureElHasStyles(el); 27929 this.el = el; 27930 this.renderRunner = new DelayedRunner(this.handleRenderRequest); 27931 new CalendarDataManager({ 27932 optionOverrides, 27933 calendarApi: this, 27934 onAction: this.handleAction, 27935 onData: this.handleData 27936 }); 27937 } 27938 render() { 27939 let wasRendering = this.isRendering; 27940 if (!wasRendering) { 27941 this.isRendering = true; 27942 } else { 27943 this.customContentRenderId += 1; 27944 } 27945 this.renderRunner.request(); 27946 if (wasRendering) { 27947 this.updateSize(); 27948 } 27949 } 27950 destroy() { 27951 if (this.isRendering) { 27952 this.isRendering = false; 27953 this.renderRunner.request(); 27954 } 27955 } 27956 updateSize() { 27957 flushSync(() => { 27958 super.updateSize(); 27959 }); 27960 } 27961 batchRendering(func) { 27962 this.renderRunner.pause("batchRendering"); 27963 func(); 27964 this.renderRunner.resume("batchRendering"); 27965 } 27966 pauseRendering() { 27967 this.renderRunner.pause("pauseRendering"); 27968 } 27969 resumeRendering() { 27970 this.renderRunner.resume("pauseRendering", true); 27971 } 27972 resetOptions(optionOverrides, changedOptionNames) { 27973 this.currentDataManager.resetOptions(optionOverrides, changedOptionNames); 27974 } 27975 setClassNames(classNames) { 27976 if (!isArraysEqual(classNames, this.currentClassNames)) { 27977 let { classList } = this.el; 27978 for (let className of this.currentClassNames) { 27979 classList.remove(className); 27980 } 27981 for (let className of classNames) { 27982 classList.add(className); 27983 } 27984 this.currentClassNames = classNames; 27985 } 27986 } 27987 setHeight(height) { 27988 applyStyleProp(this.el, "height", height); 27989 } 27990 }; 27991 27992
vendor: 44,146 bytes, lines 27992-28944
27992// node_modules/@fullcalendar/daygrid/internal.js 27993 var TableView = class extends DateComponent { 27994 constructor() { 27995 super(...arguments); 27996 this.headerElRef = d2(); 27997 } 27998 renderSimpleLayout(headerRowContent, bodyContent) { 27999 let { props, context } = this; 28000 let sections = []; 28001 let stickyHeaderDates = getStickyHeaderDates(context.options); 28002 if (headerRowContent) { 28003 sections.push({ 28004 type: "header", 28005 key: "header", 28006 isSticky: stickyHeaderDates, 28007 chunk: { 28008 elRef: this.headerElRef, 28009 tableClassName: "fc-col-header", 28010 rowContent: headerRowContent 28011 } 28012 }); 28013 } 28014 sections.push({ 28015 type: "body", 28016 key: "body", 28017 liquid: true, 28018 chunk: { content: bodyContent } 28019 }); 28020 return y2( 28021 ViewContainer, 28022 { elClasses: ["fc-daygrid"], viewSpec: context.viewSpec }, 28023 y2(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [], sections }) 28024 ); 28025 } 28026 renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) { 28027 let ScrollGrid = this.context.pluginHooks.scrollGridImpl; 28028 if (!ScrollGrid) { 28029 throw new Error("No ScrollGrid implementation"); 28030 } 28031 let { props, context } = this; 28032 let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); 28033 let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); 28034 let sections = []; 28035 if (headerRowContent) { 28036 sections.push({ 28037 type: "header", 28038 key: "header", 28039 isSticky: stickyHeaderDates, 28040 chunks: [{ 28041 key: "main", 28042 elRef: this.headerElRef, 28043 tableClassName: "fc-col-header", 28044 rowContent: headerRowContent 28045 }] 28046 }); 28047 } 28048 sections.push({ 28049 type: "body", 28050 key: "body", 28051 liquid: true, 28052 chunks: [{ 28053 key: "main", 28054 content: bodyContent 28055 }] 28056 }); 28057 if (stickyFooterScrollbar) { 28058 sections.push({ 28059 type: "footer", 28060 key: "footer", 28061 isSticky: true, 28062 chunks: [{ 28063 key: "main", 28064 content: renderScrollShim 28065 }] 28066 }); 28067 } 28068 return y2( 28069 ViewContainer, 28070 { elClasses: ["fc-daygrid"], viewSpec: context.viewSpec }, 28071 y2(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, forPrint: props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections }) 28072 ); 28073 } 28074 }; 28075 function splitSegsByRow(segs, rowCnt) { 28076 let byRow = []; 28077 for (let i4 = 0; i4 < rowCnt; i4 += 1) { 28078 byRow[i4] = []; 28079 } 28080 for (let seg of segs) { 28081 byRow[seg.row].push(seg); 28082 } 28083 return byRow; 28084 } 28085 function splitSegsByFirstCol(segs, colCnt) { 28086 let byCol = []; 28087 for (let i4 = 0; i4 < colCnt; i4 += 1) { 28088 byCol[i4] = []; 28089 } 28090 for (let seg of segs) { 28091 byCol[seg.firstCol].push(seg); 28092 } 28093 return byCol; 28094 } 28095 function splitInteractionByRow(ui2, rowCnt) { 28096 let byRow = []; 28097 if (!ui2) { 28098 for (let i4 = 0; i4 < rowCnt; i4 += 1) { 28099 byRow[i4] = null; 28100 } 28101 } else { 28102 for (let i4 = 0; i4 < rowCnt; i4 += 1) { 28103 byRow[i4] = { 28104 affectedInstances: ui2.affectedInstances, 28105 isEvent: ui2.isEvent, 28106 segs: [] 28107 }; 28108 } 28109 for (let seg of ui2.segs) { 28110 byRow[seg.row].segs.push(seg); 28111 } 28112 } 28113 return byRow; 28114 } 28115 var DEFAULT_TABLE_EVENT_TIME_FORMAT = createFormatter({ 28116 hour: "numeric", 28117 minute: "2-digit", 28118 omitZeroMinute: true, 28119 meridiem: "narrow" 28120 }); 28121 function hasListItemDisplay(seg) { 28122 let { display } = seg.eventRange.ui; 28123 return display === "list-item" || display === "auto" && !seg.eventRange.def.allDay && seg.firstCol === seg.lastCol && seg.isStart && seg.isEnd; 28124 } 28125 var TableBlockEvent = class extends BaseComponent { 28126 render() { 28127 let { props } = this; 28128 return y2(StandardEvent, Object.assign({}, props, { elClasses: ["fc-daygrid-event", "fc-daygrid-block-event", "fc-h-event"], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay })); 28129 } 28130 }; 28131 var TableListItemEvent = class extends BaseComponent { 28132 render() { 28133 let { props, context } = this; 28134 let { options } = context; 28135 let { seg } = props; 28136 let timeFormat = options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; 28137 let timeText = buildSegTimeText(seg, timeFormat, context, true, props.defaultDisplayEventEnd); 28138 return y2(EventContainer, Object.assign({}, props, { elTag: "a", elClasses: ["fc-daygrid-event", "fc-daygrid-dot-event"], elAttrs: getSegAnchorAttrs(props.seg, context), defaultGenerator: renderInnerContent2, timeText, isResizing: false, isDateSelecting: false })); 28139 } 28140 }; 28141 function renderInnerContent2(renderProps) { 28142 return y2( 28143 _2, 28144 null, 28145 y2("div", { className: "fc-daygrid-event-dot", style: { borderColor: renderProps.borderColor || renderProps.backgroundColor } }), 28146 renderProps.timeText && y2("div", { className: "fc-event-time" }, renderProps.timeText), 28147 y2("div", { className: "fc-event-title" }, renderProps.event.title || y2(_2, null, "\xA0")) 28148 ); 28149 } 28150 var TableCellMoreLink = class extends BaseComponent { 28151 constructor() { 28152 super(...arguments); 28153 this.compileSegs = memoize(compileSegs); 28154 } 28155 render() { 28156 let { props } = this; 28157 let { allSegs, invisibleSegs } = this.compileSegs(props.singlePlacements); 28158 return y2(MoreLinkContainer, { elClasses: ["fc-daygrid-more-link"], dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: () => { 28159 let isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || (props.eventResize ? props.eventResize.affectedInstances : null) || {}; 28160 return y2(_2, null, allSegs.map((seg) => { 28161 let instanceId = seg.eventRange.instance.instanceId; 28162 return y2("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { 28163 visibility: isForcedInvisible[instanceId] ? "hidden" : "" 28164 } }, hasListItemDisplay(seg) ? y2(TableListItemEvent, Object.assign({ seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange))) : y2(TableBlockEvent, Object.assign({ seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))); 28165 })); 28166 } }); 28167 } 28168 }; 28169 function compileSegs(singlePlacements) { 28170 let allSegs = []; 28171 let invisibleSegs = []; 28172 for (let placement of singlePlacements) { 28173 allSegs.push(placement.seg); 28174 if (!placement.isVisible) { 28175 invisibleSegs.push(placement.seg); 28176 } 28177 } 28178 return { allSegs, invisibleSegs }; 28179 } 28180 var DEFAULT_WEEK_NUM_FORMAT = createFormatter({ week: "narrow" }); 28181 var TableCell = class extends DateComponent { 28182 constructor() { 28183 super(...arguments); 28184 this.rootElRef = d2(); 28185 this.state = { 28186 dayNumberId: getUniqueDomId() 28187 }; 28188 this.handleRootEl = (el) => { 28189 setRef(this.rootElRef, el); 28190 setRef(this.props.elRef, el); 28191 }; 28192 } 28193 render() { 28194 let { context, props, state, rootElRef } = this; 28195 let { options, dateEnv } = context; 28196 let { date, dateProfile } = props; 28197 const isMonthStart = props.showDayNumber && shouldDisplayMonthStart(date, dateProfile.currentRange, dateEnv); 28198 return y2(DayCellContainer, { elTag: "td", elRef: this.handleRootEl, elClasses: [ 28199 "fc-daygrid-day", 28200 ...props.extraClassNames || [] 28201 ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.extraDataAttrs), props.showDayNumber ? { "aria-labelledby": state.dayNumberId } : {}), { role: "gridcell" }), defaultGenerator: renderTopInner, date, dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, isMonthStart, extraRenderProps: props.extraRenderProps }, (InnerContent, renderProps) => y2( 28202 "div", 28203 { ref: props.innerElRef, className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", style: { minHeight: props.minHeight } }, 28204 props.showWeekNumber && y2(WeekNumberContainer, { elTag: "a", elClasses: ["fc-daygrid-week-number"], elAttrs: buildNavLinkAttrs(context, date, "week"), date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }), 28205 !renderProps.isDisabled && (props.showDayNumber || hasCustomDayCellContent(options) || props.forceDayTop) ? y2( 28206 "div", 28207 { className: "fc-daygrid-day-top" }, 28208 y2(InnerContent, { elTag: "a", elClasses: [ 28209 "fc-daygrid-day-number", 28210 isMonthStart && "fc-daygrid-month-start" 28211 ], elAttrs: Object.assign(Object.assign({}, buildNavLinkAttrs(context, date)), { id: state.dayNumberId }) }) 28212 ) : props.showDayNumber ? y2( 28213 "div", 28214 { className: "fc-daygrid-day-top", style: { visibility: "hidden" } }, 28215 y2("a", { className: "fc-daygrid-day-number" }, "\xA0") 28216 ) : void 0, 28217 y2( 28218 "div", 28219 { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, 28220 props.fgContent, 28221 y2( 28222 "div", 28223 { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, 28224 y2(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }) 28225 ) 28226 ), 28227 y2("div", { className: "fc-daygrid-day-bg" }, props.bgContent) 28228 )); 28229 } 28230 }; 28231 function renderTopInner(props) { 28232 return props.dayNumberText || y2(_2, null, "\xA0"); 28233 } 28234 function shouldDisplayMonthStart(date, currentRange, dateEnv) { 28235 const { start: currentStart, end: currentEnd } = currentRange; 28236 const currentEndIncl = addMs(currentEnd, -1); 28237 const currentFirstYear = dateEnv.getYear(currentStart); 28238 const currentFirstMonth = dateEnv.getMonth(currentStart); 28239 const currentLastYear = dateEnv.getYear(currentEndIncl); 28240 const currentLastMonth = dateEnv.getMonth(currentEndIncl); 28241 return !(currentFirstYear === currentLastYear && currentFirstMonth === currentLastMonth) && Boolean( 28242 date.valueOf() === currentStart.valueOf() || dateEnv.getDay(date) === 1 && date.valueOf() < currentEnd.valueOf() 28243 ); 28244 } 28245 function generateSegKey(seg) { 28246 return seg.eventRange.instance.instanceId + ":" + seg.firstCol; 28247 } 28248 function generateSegUid(seg) { 28249 return generateSegKey(seg) + ":" + seg.lastCol; 28250 } 28251 function computeFgSegPlacement(segs, dayMaxEvents, dayMaxEventRows, strictOrder, segHeights, maxContentHeight, cells) { 28252 let hierarchy = new DayGridSegHierarchy((segEntry) => { 28253 let segUid = segs[segEntry.index].eventRange.instance.instanceId + ":" + segEntry.span.start + ":" + (segEntry.span.end - 1); 28254 return segHeights[segUid] || 1; 28255 }); 28256 hierarchy.allowReslicing = true; 28257 hierarchy.strictOrder = strictOrder; 28258 if (dayMaxEvents === true || dayMaxEventRows === true) { 28259 hierarchy.maxCoord = maxContentHeight; 28260 hierarchy.hiddenConsumes = true; 28261 } else if (typeof dayMaxEvents === "number") { 28262 hierarchy.maxStackCnt = dayMaxEvents; 28263 } else if (typeof dayMaxEventRows === "number") { 28264 hierarchy.maxStackCnt = dayMaxEventRows; 28265 hierarchy.hiddenConsumes = true; 28266 } 28267 let segInputs = []; 28268 let unknownHeightSegs = []; 28269 for (let i4 = 0; i4 < segs.length; i4 += 1) { 28270 let seg = segs[i4]; 28271 let segUid = generateSegUid(seg); 28272 let eventHeight = segHeights[segUid]; 28273 if (eventHeight != null) { 28274 segInputs.push({ 28275 index: i4, 28276 span: { 28277 start: seg.firstCol, 28278 end: seg.lastCol + 1 28279 } 28280 }); 28281 } else { 28282 unknownHeightSegs.push(seg); 28283 } 28284 } 28285 let hiddenEntries = hierarchy.addSegs(segInputs); 28286 let segRects = hierarchy.toRects(); 28287 let { singleColPlacements, multiColPlacements, leftoverMargins } = placeRects(segRects, segs, cells); 28288 let moreCnts = []; 28289 let moreMarginTops = []; 28290 for (let seg of unknownHeightSegs) { 28291 multiColPlacements[seg.firstCol].push({ 28292 seg, 28293 isVisible: false, 28294 isAbsolute: true, 28295 absoluteTop: 0, 28296 marginTop: 0 28297 }); 28298 for (let col = seg.firstCol; col <= seg.lastCol; col += 1) { 28299 singleColPlacements[col].push({ 28300 seg: resliceSeg(seg, col, col + 1, cells), 28301 isVisible: false, 28302 isAbsolute: false, 28303 absoluteTop: 0, 28304 marginTop: 0 28305 }); 28306 } 28307 } 28308 for (let col = 0; col < cells.length; col += 1) { 28309 moreCnts.push(0); 28310 } 28311 for (let hiddenEntry of hiddenEntries) { 28312 let seg = segs[hiddenEntry.index]; 28313 let hiddenSpan = hiddenEntry.span; 28314 multiColPlacements[hiddenSpan.start].push({ 28315 seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells), 28316 isVisible: false, 28317 isAbsolute: true, 28318 absoluteTop: 0, 28319 marginTop: 0 28320 }); 28321 for (let col = hiddenSpan.start; col < hiddenSpan.end; col += 1) { 28322 moreCnts[col] += 1; 28323 singleColPlacements[col].push({ 28324 seg: resliceSeg(seg, col, col + 1, cells), 28325 isVisible: false, 28326 isAbsolute: false, 28327 absoluteTop: 0, 28328 marginTop: 0 28329 }); 28330 } 28331 } 28332 for (let col = 0; col < cells.length; col += 1) { 28333 moreMarginTops.push(leftoverMargins[col]); 28334 } 28335 return { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops }; 28336 } 28337 function placeRects(allRects, segs, cells) { 28338 let rectsByEachCol = groupRectsByEachCol(allRects, cells.length); 28339 let singleColPlacements = []; 28340 let multiColPlacements = []; 28341 let leftoverMargins = []; 28342 for (let col = 0; col < cells.length; col += 1) { 28343 let rects = rectsByEachCol[col]; 28344 let singlePlacements = []; 28345 let currentHeight = 0; 28346 let currentMarginTop = 0; 28347 for (let rect of rects) { 28348 let seg = segs[rect.index]; 28349 singlePlacements.push({ 28350 seg: resliceSeg(seg, col, col + 1, cells), 28351 isVisible: true, 28352 isAbsolute: false, 28353 absoluteTop: rect.levelCoord, 28354 marginTop: rect.levelCoord - currentHeight 28355 }); 28356 currentHeight = rect.levelCoord + rect.thickness; 28357 } 28358 let multiPlacements = []; 28359 currentHeight = 0; 28360 currentMarginTop = 0; 28361 for (let rect of rects) { 28362 let seg = segs[rect.index]; 28363 let isAbsolute = rect.span.end - rect.span.start > 1; 28364 let isFirstCol = rect.span.start === col; 28365 currentMarginTop += rect.levelCoord - currentHeight; 28366 currentHeight = rect.levelCoord + rect.thickness; 28367 if (isAbsolute) { 28368 currentMarginTop += rect.thickness; 28369 if (isFirstCol) { 28370 multiPlacements.push({ 28371 seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), 28372 isVisible: true, 28373 isAbsolute: true, 28374 absoluteTop: rect.levelCoord, 28375 marginTop: 0 28376 }); 28377 } 28378 } else if (isFirstCol) { 28379 multiPlacements.push({ 28380 seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), 28381 isVisible: true, 28382 isAbsolute: false, 28383 absoluteTop: rect.levelCoord, 28384 marginTop: currentMarginTop 28385 }); 28386 currentMarginTop = 0; 28387 } 28388 } 28389 singleColPlacements.push(singlePlacements); 28390 multiColPlacements.push(multiPlacements); 28391 leftoverMargins.push(currentMarginTop); 28392 } 28393 return { singleColPlacements, multiColPlacements, leftoverMargins }; 28394 } 28395 function groupRectsByEachCol(rects, colCnt) { 28396 let rectsByEachCol = []; 28397 for (let col = 0; col < colCnt; col += 1) { 28398 rectsByEachCol.push([]); 28399 } 28400 for (let rect of rects) { 28401 for (let col = rect.span.start; col < rect.span.end; col += 1) { 28402 rectsByEachCol[col].push(rect); 28403 } 28404 } 28405 return rectsByEachCol; 28406 } 28407 function resliceSeg(seg, spanStart, spanEnd, cells) { 28408 if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) { 28409 return seg; 28410 } 28411 let eventRange = seg.eventRange; 28412 let origRange = eventRange.range; 28413 let slicedRange = intersectRanges(origRange, { 28414 start: cells[spanStart].date, 28415 end: addDays(cells[spanEnd - 1].date, 1) 28416 }); 28417 return Object.assign(Object.assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: { 28418 def: eventRange.def, 28419 ui: Object.assign(Object.assign({}, eventRange.ui), { durationEditable: false }), 28420 instance: eventRange.instance, 28421 range: slicedRange 28422 }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }); 28423 } 28424 var DayGridSegHierarchy = class extends SegHierarchy { 28425 constructor() { 28426 super(...arguments); 28427 this.hiddenConsumes = false; 28428 this.forceHidden = {}; 28429 } 28430 addSegs(segInputs) { 28431 const hiddenSegs = super.addSegs(segInputs); 28432 const { entriesByLevel } = this; 28433 const excludeHidden = (entry) => !this.forceHidden[buildEntryKey(entry)]; 28434 for (let level = 0; level < entriesByLevel.length; level += 1) { 28435 entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden); 28436 } 28437 return hiddenSegs; 28438 } 28439 handleInvalidInsertion(insertion, entry, hiddenEntries) { 28440 const { entriesByLevel, forceHidden } = this; 28441 const { touchingEntry, touchingLevel, touchingLateral } = insertion; 28442 if (this.hiddenConsumes && touchingEntry) { 28443 const touchingEntryId = buildEntryKey(touchingEntry); 28444 if (!forceHidden[touchingEntryId]) { 28445 if (this.allowReslicing) { 28446 const hiddenEntry = Object.assign(Object.assign({}, touchingEntry), { span: intersectSpans(touchingEntry.span, entry.span) }); 28447 const hiddenEntryId = buildEntryKey(hiddenEntry); 28448 forceHidden[hiddenEntryId] = true; 28449 entriesByLevel[touchingLevel][touchingLateral] = hiddenEntry; 28450 hiddenEntries.push(hiddenEntry); 28451 this.splitEntry(touchingEntry, entry, hiddenEntries); 28452 } else { 28453 forceHidden[touchingEntryId] = true; 28454 hiddenEntries.push(touchingEntry); 28455 } 28456 } 28457 } 28458 super.handleInvalidInsertion(insertion, entry, hiddenEntries); 28459 } 28460 }; 28461 var TableRow = class extends DateComponent { 28462 constructor() { 28463 super(...arguments); 28464 this.cellElRefs = new RefMap(); 28465 this.frameElRefs = new RefMap(); 28466 this.fgElRefs = new RefMap(); 28467 this.segHarnessRefs = new RefMap(); 28468 this.rootElRef = d2(); 28469 this.state = { 28470 framePositions: null, 28471 maxContentHeight: null, 28472 segHeights: {} 28473 }; 28474 this.handleResize = (isForced) => { 28475 if (isForced) { 28476 this.updateSizing(true); 28477 } 28478 }; 28479 } 28480 render() { 28481 let { props, state, context } = this; 28482 let { options } = context; 28483 let colCnt = props.cells.length; 28484 let businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt); 28485 let bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt); 28486 let highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt); 28487 let mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt); 28488 let { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops } = computeFgSegPlacement(sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.segHeights, state.maxContentHeight, props.cells); 28489 let isForcedInvisible = props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}; 28490 return y2( 28491 "tr", 28492 { ref: this.rootElRef, role: "row" }, 28493 props.renderIntro && props.renderIntro(), 28494 props.cells.map((cell, col) => { 28495 let normalFgNodes = this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); 28496 let mirrorFgNodes = this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); 28497 return y2(TableCell, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), innerElRef: this.frameElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers, todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: this.fgElRefs.createRef(cell.key), fgContent: y2( 28498 _2, 28499 null, 28500 y2(_2, null, normalFgNodes), 28501 y2(_2, null, mirrorFgNodes) 28502 ), bgContent: y2( 28503 _2, 28504 null, 28505 this.renderFillSegs(highlightSegsByCol[col], "highlight"), 28506 this.renderFillSegs(businessHoursByCol[col], "non-business"), 28507 this.renderFillSegs(bgEventSegsByCol[col], "bg-event") 28508 ), minHeight: props.cellMinHeight }); 28509 }) 28510 ); 28511 } 28512 componentDidMount() { 28513 this.updateSizing(true); 28514 this.context.addResizeHandler(this.handleResize); 28515 } 28516 componentDidUpdate(prevProps, prevState) { 28517 let currentProps = this.props; 28518 this.updateSizing(!isPropsEqual(prevProps, currentProps)); 28519 } 28520 componentWillUnmount() { 28521 this.context.removeResizeHandler(this.handleResize); 28522 } 28523 getHighlightSegs() { 28524 let { props } = this; 28525 if (props.eventDrag && props.eventDrag.segs.length) { 28526 return props.eventDrag.segs; 28527 } 28528 if (props.eventResize && props.eventResize.segs.length) { 28529 return props.eventResize.segs; 28530 } 28531 return props.dateSelectionSegs; 28532 } 28533 getMirrorSegs() { 28534 let { props } = this; 28535 if (props.eventResize && props.eventResize.segs.length) { 28536 return props.eventResize.segs; 28537 } 28538 return []; 28539 } 28540 renderFgSegs(col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) { 28541 let { context } = this; 28542 let { eventSelection } = this.props; 28543 let { framePositions } = this.state; 28544 let defaultDisplayEventEnd = this.props.cells.length === 1; 28545 let isMirror = isDragging || isResizing || isDateSelecting; 28546 let nodes = []; 28547 if (framePositions) { 28548 for (let placement of segPlacements) { 28549 let { seg } = placement; 28550 let { instanceId } = seg.eventRange.instance; 28551 let isVisible2 = placement.isVisible && !isForcedInvisible[instanceId]; 28552 let isAbsolute = placement.isAbsolute; 28553 let left2 = ""; 28554 let right2 = ""; 28555 if (isAbsolute) { 28556 if (context.isRtl) { 28557 right2 = 0; 28558 left2 = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]; 28559 } else { 28560 left2 = 0; 28561 right2 = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]; 28562 } 28563 } 28564 nodes.push(y2("div", { className: "fc-daygrid-event-harness" + (isAbsolute ? " fc-daygrid-event-harness-abs" : ""), key: generateSegKey(seg), ref: isMirror ? null : this.segHarnessRefs.createRef(generateSegUid(seg)), style: { 28565 visibility: isVisible2 ? "" : "hidden", 28566 marginTop: isAbsolute ? "" : placement.marginTop, 28567 top: isAbsolute ? placement.absoluteTop : "", 28568 left: left2, 28569 right: right2 28570 } }, hasListItemDisplay(seg) ? y2(TableListItemEvent, Object.assign({ seg, isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd }, getSegMeta(seg, todayRange))) : y2(TableBlockEvent, Object.assign({ seg, isDragging, isResizing, isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd }, getSegMeta(seg, todayRange))))); 28571 } 28572 } 28573 return nodes; 28574 } 28575 renderFillSegs(segs, fillType) { 28576 let { isRtl } = this.context; 28577 let { todayRange } = this.props; 28578 let { framePositions } = this.state; 28579 let nodes = []; 28580 if (framePositions) { 28581 for (let seg of segs) { 28582 let leftRightCss = isRtl ? { 28583 right: 0, 28584 left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol] 28585 } : { 28586 left: 0, 28587 right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol] 28588 }; 28589 nodes.push(y2("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === "bg-event" ? y2(BgEvent, Object.assign({ seg }, getSegMeta(seg, todayRange))) : renderFill(fillType))); 28590 } 28591 } 28592 return y2(_2, {}, ...nodes); 28593 } 28594 updateSizing(isExternalSizingChange) { 28595 let { props, state, frameElRefs } = this; 28596 if (!props.forPrint && props.clientWidth !== null) { 28597 if (isExternalSizingChange) { 28598 let frameEls = props.cells.map((cell) => frameElRefs.currentMap[cell.key]); 28599 if (frameEls.length) { 28600 let originEl = this.rootElRef.current; 28601 let newPositionCache = new PositionCache( 28602 originEl, 28603 frameEls, 28604 true, 28605 false 28606 ); 28607 if (!state.framePositions || !state.framePositions.similarTo(newPositionCache)) { 28608 this.setState({ 28609 framePositions: new PositionCache( 28610 originEl, 28611 frameEls, 28612 true, 28613 false 28614 ) 28615 }); 28616 } 28617 } 28618 } 28619 const oldSegHeights = this.state.segHeights; 28620 const newSegHeights = this.querySegHeights(); 28621 const limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true; 28622 this.safeSetState({ 28623 segHeights: Object.assign(Object.assign({}, oldSegHeights), newSegHeights), 28624 maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null 28625 }); 28626 } 28627 } 28628 querySegHeights() { 28629 let segElMap = this.segHarnessRefs.currentMap; 28630 let segHeights = {}; 28631 for (let segUid in segElMap) { 28632 let height = Math.round(segElMap[segUid].getBoundingClientRect().height); 28633 segHeights[segUid] = Math.max(segHeights[segUid] || 0, height); 28634 } 28635 return segHeights; 28636 } 28637 computeMaxContentHeight() { 28638 let firstKey = this.props.cells[0].key; 28639 let cellEl = this.cellElRefs.currentMap[firstKey]; 28640 let fcContainerEl = this.fgElRefs.currentMap[firstKey]; 28641 return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top; 28642 } 28643 getCellEls() { 28644 let elMap = this.cellElRefs.currentMap; 28645 return this.props.cells.map((cell) => elMap[cell.key]); 28646 } 28647 }; 28648 TableRow.addStateEquality({ 28649 segHeights: isPropsEqual 28650 }); 28651 function buildMirrorPlacements(mirrorSegs, colPlacements) { 28652 if (!mirrorSegs.length) { 28653 return []; 28654 } 28655 let topsByInstanceId = buildAbsoluteTopHash(colPlacements); 28656 return mirrorSegs.map((seg) => ({ 28657 seg, 28658 isVisible: true, 28659 isAbsolute: true, 28660 absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId], 28661 marginTop: 0 28662 })); 28663 } 28664 function buildAbsoluteTopHash(colPlacements) { 28665 let topsByInstanceId = {}; 28666 for (let placements2 of colPlacements) { 28667 for (let placement of placements2) { 28668 topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop; 28669 } 28670 } 28671 return topsByInstanceId; 28672 } 28673 var TableRows = class extends DateComponent { 28674 constructor() { 28675 super(...arguments); 28676 this.splitBusinessHourSegs = memoize(splitSegsByRow); 28677 this.splitBgEventSegs = memoize(splitSegsByRow); 28678 this.splitFgEventSegs = memoize(splitSegsByRow); 28679 this.splitDateSelectionSegs = memoize(splitSegsByRow); 28680 this.splitEventDrag = memoize(splitInteractionByRow); 28681 this.splitEventResize = memoize(splitInteractionByRow); 28682 this.rowRefs = new RefMap(); 28683 } 28684 render() { 28685 let { props, context } = this; 28686 let rowCnt = props.cells.length; 28687 let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt); 28688 let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt); 28689 let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt); 28690 let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt); 28691 let eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt); 28692 let eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt); 28693 let cellMinHeight = rowCnt >= 7 && props.clientWidth ? props.clientWidth / context.options.aspectRatio / 6 : null; 28694 return y2(NowTimer, { unit: "day" }, (nowDate, todayRange) => y2(_2, null, props.cells.map((cells, row) => y2(TableRow, { 28695 ref: this.rowRefs.createRef(row), 28696 key: cells.length ? cells[0].date.toISOString() : row, 28697 showDayNumbers: rowCnt > 1, 28698 showWeekNumbers: props.showWeekNumbers, 28699 todayRange, 28700 dateProfile: props.dateProfile, 28701 cells, 28702 renderIntro: props.renderRowIntro, 28703 businessHourSegs: businessHourSegsByRow[row], 28704 eventSelection: props.eventSelection, 28705 bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay), 28706 fgEventSegs: fgEventSegsByRow[row], 28707 dateSelectionSegs: dateSelectionSegsByRow[row], 28708 eventDrag: eventDragByRow[row], 28709 eventResize: eventResizeByRow[row], 28710 dayMaxEvents: props.dayMaxEvents, 28711 dayMaxEventRows: props.dayMaxEventRows, 28712 clientWidth: props.clientWidth, 28713 clientHeight: props.clientHeight, 28714 cellMinHeight, 28715 forPrint: props.forPrint 28716 })))); 28717 } 28718 componentDidMount() { 28719 this.registerInteractiveComponent(); 28720 } 28721 componentDidUpdate() { 28722 this.registerInteractiveComponent(); 28723 } 28724 registerInteractiveComponent() { 28725 if (!this.rootEl) { 28726 const firstCellEl = this.rowRefs.currentMap[0].getCellEls()[0]; 28727 const rootEl = firstCellEl ? firstCellEl.closest(".fc-daygrid-body") : null; 28728 if (rootEl) { 28729 this.rootEl = rootEl; 28730 this.context.registerInteractiveComponent(this, { 28731 el: rootEl, 28732 isHitComboAllowed: this.props.isHitComboAllowed 28733 }); 28734 } 28735 } 28736 } 28737 componentWillUnmount() { 28738 if (this.rootEl) { 28739 this.context.unregisterInteractiveComponent(this); 28740 this.rootEl = null; 28741 } 28742 } 28743 prepareHits() { 28744 this.rowPositions = new PositionCache( 28745 this.rootEl, 28746 this.rowRefs.collect().map((rowObj) => rowObj.getCellEls()[0]), 28747 false, 28748 true 28749 ); 28750 this.colPositions = new PositionCache( 28751 this.rootEl, 28752 this.rowRefs.currentMap[0].getCellEls(), 28753 true, 28754 false 28755 ); 28756 } 28757 queryHit(positionLeft, positionTop) { 28758 let { colPositions, rowPositions } = this; 28759 let col = colPositions.leftToIndex(positionLeft); 28760 let row = rowPositions.topToIndex(positionTop); 28761 if (row != null && col != null) { 28762 let cell = this.props.cells[row][col]; 28763 return { 28764 dateProfile: this.props.dateProfile, 28765 dateSpan: Object.assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan), 28766 dayEl: this.getCellEl(row, col), 28767 rect: { 28768 left: colPositions.lefts[col], 28769 right: colPositions.rights[col], 28770 top: rowPositions.tops[row], 28771 bottom: rowPositions.bottoms[row] 28772 }, 28773 layer: 0 28774 }; 28775 } 28776 return null; 28777 } 28778 getCellEl(row, col) { 28779 return this.rowRefs.currentMap[row].getCellEls()[col]; 28780 } 28781 getCellRange(row, col) { 28782 let start5 = this.props.cells[row][col].date; 28783 let end2 = addDays(start5, 1); 28784 return { start: start5, end: end2 }; 28785 } 28786 }; 28787 function isSegAllDay(seg) { 28788 return seg.eventRange.def.allDay; 28789 } 28790 var Table = class extends DateComponent { 28791 constructor() { 28792 super(...arguments); 28793 this.elRef = d2(); 28794 this.needsScrollReset = false; 28795 } 28796 render() { 28797 let { props } = this; 28798 let { dayMaxEventRows, dayMaxEvents, expandRows } = props; 28799 let limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; 28800 if (limitViaBalanced && !expandRows) { 28801 limitViaBalanced = false; 28802 dayMaxEventRows = null; 28803 dayMaxEvents = null; 28804 } 28805 let classNames = [ 28806 "fc-daygrid-body", 28807 limitViaBalanced ? "fc-daygrid-body-balanced" : "fc-daygrid-body-unbalanced", 28808 expandRows ? "" : "fc-daygrid-body-natural" 28809 ]; 28810 return y2( 28811 "div", 28812 { ref: this.elRef, className: classNames.join(" "), style: { 28813 width: props.clientWidth, 28814 minWidth: props.tableMinWidth 28815 } }, 28816 y2( 28817 "table", 28818 { role: "presentation", className: "fc-scrollgrid-sync-table", style: { 28819 width: props.clientWidth, 28820 minWidth: props.tableMinWidth, 28821 height: expandRows ? props.clientHeight : "" 28822 } }, 28823 props.colGroupNode, 28824 y2( 28825 "tbody", 28826 { role: "presentation" }, 28827 y2(TableRows, { dateProfile: props.dateProfile, cells: props.cells, renderRowIntro: props.renderRowIntro, showWeekNumbers: props.showWeekNumbers, clientWidth: props.clientWidth, clientHeight: props.clientHeight, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, dayMaxEvents, dayMaxEventRows, forPrint: props.forPrint, isHitComboAllowed: props.isHitComboAllowed }) 28828 ) 28829 ) 28830 ); 28831 } 28832 componentDidMount() { 28833 this.requestScrollReset(); 28834 } 28835 componentDidUpdate(prevProps) { 28836 if (prevProps.dateProfile !== this.props.dateProfile) { 28837 this.requestScrollReset(); 28838 } else { 28839 this.flushScrollReset(); 28840 } 28841 } 28842 requestScrollReset() { 28843 this.needsScrollReset = true; 28844 this.flushScrollReset(); 28845 } 28846 flushScrollReset() { 28847 if (this.needsScrollReset && this.props.clientWidth) { 28848 const subjectEl = getScrollSubjectEl(this.elRef.current, this.props.dateProfile); 28849 if (subjectEl) { 28850 const originEl = subjectEl.closest(".fc-daygrid-body"); 28851 const scrollEl = originEl.closest(".fc-scroller"); 28852 const scrollTop = subjectEl.getBoundingClientRect().top - originEl.getBoundingClientRect().top; 28853 scrollEl.scrollTop = scrollTop ? scrollTop + 1 : 0; 28854 } 28855 this.needsScrollReset = false; 28856 } 28857 } 28858 }; 28859 function getScrollSubjectEl(containerEl, dateProfile) { 28860 let el; 28861 if (dateProfile.currentRangeUnit.match(/year|month/)) { 28862 el = containerEl.querySelector(`[data-date="${formatIsoMonthStr(dateProfile.currentDate)}-01"]`); 28863 } 28864 if (!el) { 28865 el = containerEl.querySelector(`[data-date="${formatDayString(dateProfile.currentDate)}"]`); 28866 } 28867 return el; 28868 } 28869 var DayTableSlicer = class extends Slicer { 28870 constructor() { 28871 super(...arguments); 28872 this.forceDayIfListItem = true; 28873 } 28874 sliceRange(dateRange, dayTableModel) { 28875 return dayTableModel.sliceRange(dateRange); 28876 } 28877 }; 28878 var DayTable = class extends DateComponent { 28879 constructor() { 28880 super(...arguments); 28881 this.slicer = new DayTableSlicer(); 28882 this.tableRef = d2(); 28883 } 28884 render() { 28885 let { props, context } = this; 28886 return y2(Table, Object.assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })); 28887 } 28888 }; 28889 var DayTableView = class extends TableView { 28890 constructor() { 28891 super(...arguments); 28892 this.buildDayTableModel = memoize(buildDayTableModel); 28893 this.headerRef = d2(); 28894 this.tableRef = d2(); 28895 } 28896 render() { 28897 let { options, dateProfileGenerator } = this.context; 28898 let { props } = this; 28899 let dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator); 28900 let headerContent = options.dayHeaders && y2(DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 }); 28901 let bodyContent = (contentArg) => y2(DayTable, { ref: this.tableRef, dateProfile: props.dateProfile, dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }); 28902 return options.dayMinWidth ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth) : this.renderSimpleLayout(headerContent, bodyContent); 28903 } 28904 }; 28905 function buildDayTableModel(dateProfile, dateProfileGenerator) { 28906 let daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); 28907 return new DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); 28908 } 28909 var TableDateProfileGenerator = class extends DateProfileGenerator { 28910 buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { 28911 let renderRange = super.buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay); 28912 let { props } = this; 28913 return buildDayTableRenderRange({ 28914 currentRange: renderRange, 28915 snapToWeek: /^(year|month)$/.test(currentRangeUnit), 28916 fixedWeekCount: props.fixedWeekCount, 28917 dateEnv: props.dateEnv 28918 }); 28919 } 28920 }; 28921 function buildDayTableRenderRange(props) { 28922 let { dateEnv, currentRange } = props; 28923 let { start: start5, end: end2 } = currentRange; 28924 let endOfWeek; 28925 if (props.snapToWeek) { 28926 start5 = dateEnv.startOfWeek(start5); 28927 endOfWeek = dateEnv.startOfWeek(end2); 28928 if (endOfWeek.valueOf() !== end2.valueOf()) { 28929 end2 = addWeeks(endOfWeek, 1); 28930 } 28931 } 28932 if (props.fixedWeekCount) { 28933 let lastMonthRenderStart = dateEnv.startOfWeek(dateEnv.startOfMonth(addDays(currentRange.end, -1))); 28934 let rowCnt = Math.ceil( 28935 diffWeeks(lastMonthRenderStart, end2) 28936 ); 28937 end2 = addWeeks(end2, 6 - rowCnt); 28938 } 28939 return { start: start5, end: end2 }; 28940 } 28941 var css_248z2 = ':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:0 2px}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{border-radius:3px;cursor:pointer;line-height:1;margin-top:1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap;z-index:4}.fc .fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-more-link{float:left}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-more-link{float:right}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}'; 28942 injectStyles(css_248z2); 28943 28944
vendor: 665 bytes, lines 28944-28973
28944// node_modules/@fullcalendar/daygrid/index.js 28945 var index = createPlugin({ 28946 name: "@fullcalendar/daygrid", 28947 initialView: "dayGridMonth", 28948 views: { 28949 dayGrid: { 28950 component: DayTableView, 28951 dateProfileGeneratorClass: TableDateProfileGenerator 28952 }, 28953 dayGridDay: { 28954 type: "dayGrid", 28955 duration: { days: 1 } 28956 }, 28957 dayGridWeek: { 28958 type: "dayGrid", 28959 duration: { weeks: 1 } 28960 }, 28961 dayGridMonth: { 28962 type: "dayGrid", 28963 duration: { months: 1 }, 28964 fixedWeekCount: true 28965 }, 28966 dayGridYear: { 28967 type: "dayGrid", 28968 duration: { years: 1 } 28969 } 28970 } 28971 }); 28972 28973
vendor: 51,896 bytes, lines 28973-30098
28973// node_modules/@fullcalendar/timegrid/internal.js 28974 var AllDaySplitter = class extends Splitter { 28975 getKeyInfo() { 28976 return { 28977 allDay: {}, 28978 timed: {} 28979 }; 28980 } 28981 getKeysForDateSpan(dateSpan) { 28982 if (dateSpan.allDay) { 28983 return ["allDay"]; 28984 } 28985 return ["timed"]; 28986 } 28987 getKeysForEventDef(eventDef) { 28988 if (!eventDef.allDay) { 28989 return ["timed"]; 28990 } 28991 if (hasBgRendering(eventDef)) { 28992 return ["timed", "allDay"]; 28993 } 28994 return ["allDay"]; 28995 } 28996 }; 28997 var DEFAULT_SLAT_LABEL_FORMAT = createFormatter({ 28998 hour: "numeric", 28999 minute: "2-digit", 29000 omitZeroMinute: true, 29001 meridiem: "short" 29002 }); 29003 function TimeColsAxisCell(props) { 29004 let classNames = [ 29005 "fc-timegrid-slot", 29006 "fc-timegrid-slot-label", 29007 props.isLabeled ? "fc-scrollgrid-shrink" : "fc-timegrid-slot-minor" 29008 ]; 29009 return y2(ViewContextType.Consumer, null, (context) => { 29010 if (!props.isLabeled) { 29011 return y2("td", { className: classNames.join(" "), "data-time": props.isoTimeStr }); 29012 } 29013 let { dateEnv, options, viewApi } = context; 29014 let labelFormat = options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : Array.isArray(options.slotLabelFormat) ? createFormatter(options.slotLabelFormat[0]) : createFormatter(options.slotLabelFormat); 29015 let renderProps = { 29016 level: 0, 29017 time: props.time, 29018 date: dateEnv.toDate(props.date), 29019 view: viewApi, 29020 text: dateEnv.format(props.date, labelFormat) 29021 }; 29022 return y2(ContentContainer, { elTag: "td", elClasses: classNames, elAttrs: { 29023 "data-time": props.isoTimeStr 29024 }, renderProps, generatorName: "slotLabelContent", customGenerator: options.slotLabelContent, defaultGenerator: renderInnerContent3, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => y2( 29025 "div", 29026 { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, 29027 y2(InnerContent, { elTag: "div", elClasses: [ 29028 "fc-timegrid-slot-label-cushion", 29029 "fc-scrollgrid-shrink-cushion" 29030 ] }) 29031 )); 29032 }); 29033 } 29034 function renderInnerContent3(props) { 29035 return props.text; 29036 } 29037 var TimeBodyAxis = class extends BaseComponent { 29038 render() { 29039 return this.props.slatMetas.map((slatMeta) => y2( 29040 "tr", 29041 { key: slatMeta.key }, 29042 y2(TimeColsAxisCell, Object.assign({}, slatMeta)) 29043 )); 29044 } 29045 }; 29046 var DEFAULT_WEEK_NUM_FORMAT2 = createFormatter({ week: "short" }); 29047 var AUTO_ALL_DAY_MAX_EVENT_ROWS = 5; 29048 var TimeColsView = class extends DateComponent { 29049 constructor() { 29050 super(...arguments); 29051 this.allDaySplitter = new AllDaySplitter(); 29052 this.headerElRef = d2(); 29053 this.rootElRef = d2(); 29054 this.scrollerElRef = d2(); 29055 this.state = { 29056 slatCoords: null 29057 }; 29058 this.handleScrollTopRequest = (scrollTop) => { 29059 let scrollerEl = this.scrollerElRef.current; 29060 if (scrollerEl) { 29061 scrollerEl.scrollTop = scrollTop; 29062 } 29063 }; 29064 this.renderHeadAxis = (rowKey, frameHeight = "") => { 29065 let { options } = this.context; 29066 let { dateProfile } = this.props; 29067 let range = dateProfile.renderRange; 29068 let dayCnt = diffDays(range.start, range.end); 29069 let navLinkAttrs = dayCnt === 1 ? buildNavLinkAttrs(this.context, range.start, "week") : {}; 29070 if (options.weekNumbers && rowKey === "day") { 29071 return y2(WeekNumberContainer, { elTag: "th", elClasses: [ 29072 "fc-timegrid-axis", 29073 "fc-scrollgrid-shrink" 29074 ], elAttrs: { 29075 "aria-hidden": true 29076 }, date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT2 }, (InnerContent) => y2( 29077 "div", 29078 { className: [ 29079 "fc-timegrid-axis-frame", 29080 "fc-scrollgrid-shrink-frame", 29081 "fc-timegrid-axis-frame-liquid" 29082 ].join(" "), style: { height: frameHeight } }, 29083 y2(InnerContent, { elTag: "a", elClasses: [ 29084 "fc-timegrid-axis-cushion", 29085 "fc-scrollgrid-shrink-cushion", 29086 "fc-scrollgrid-sync-inner" 29087 ], elAttrs: navLinkAttrs }) 29088 )); 29089 } 29090 return y2( 29091 "th", 29092 { "aria-hidden": true, className: "fc-timegrid-axis" }, 29093 y2("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } }) 29094 ); 29095 }; 29096 this.renderTableRowAxis = (rowHeight) => { 29097 let { options, viewApi } = this.context; 29098 let renderProps = { 29099 text: options.allDayText, 29100 view: viewApi 29101 }; 29102 return y2(ContentContainer, { elTag: "td", elClasses: [ 29103 "fc-timegrid-axis", 29104 "fc-scrollgrid-shrink" 29105 ], elAttrs: { 29106 "aria-hidden": true 29107 }, renderProps, generatorName: "allDayContent", customGenerator: options.allDayContent, defaultGenerator: renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, (InnerContent) => y2( 29108 "div", 29109 { className: [ 29110 "fc-timegrid-axis-frame", 29111 "fc-scrollgrid-shrink-frame", 29112 rowHeight == null ? " fc-timegrid-axis-frame-liquid" : "" 29113 ].join(" "), style: { height: rowHeight } }, 29114 y2(InnerContent, { elTag: "span", elClasses: [ 29115 "fc-timegrid-axis-cushion", 29116 "fc-scrollgrid-shrink-cushion", 29117 "fc-scrollgrid-sync-inner" 29118 ] }) 29119 )); 29120 }; 29121 this.handleSlatCoords = (slatCoords) => { 29122 this.setState({ slatCoords }); 29123 }; 29124 } 29125 renderSimpleLayout(headerRowContent, allDayContent, timeContent) { 29126 let { context, props } = this; 29127 let sections = []; 29128 let stickyHeaderDates = getStickyHeaderDates(context.options); 29129 if (headerRowContent) { 29130 sections.push({ 29131 type: "header", 29132 key: "header", 29133 isSticky: stickyHeaderDates, 29134 chunk: { 29135 elRef: this.headerElRef, 29136 tableClassName: "fc-col-header", 29137 rowContent: headerRowContent 29138 } 29139 }); 29140 } 29141 if (allDayContent) { 29142 sections.push({ 29143 type: "body", 29144 key: "all-day", 29145 chunk: { content: allDayContent } 29146 }); 29147 sections.push({ 29148 type: "body", 29149 key: "all-day-divider", 29150 outerContent: y2( 29151 "tr", 29152 { role: "presentation", className: "fc-scrollgrid-section" }, 29153 y2("td", { className: "fc-timegrid-divider " + context.theme.getClass("tableCellShaded") }) 29154 ) 29155 }); 29156 } 29157 sections.push({ 29158 type: "body", 29159 key: "body", 29160 liquid: true, 29161 expandRows: Boolean(context.options.expandRows), 29162 chunk: { 29163 scrollerElRef: this.scrollerElRef, 29164 content: timeContent 29165 } 29166 }); 29167 return y2( 29168 ViewContainer, 29169 { elRef: this.rootElRef, elClasses: ["fc-timegrid"], viewSpec: context.viewSpec }, 29170 y2(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: "shrink" }], sections }) 29171 ); 29172 } 29173 renderHScrollLayout(headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) { 29174 let ScrollGrid = this.context.pluginHooks.scrollGridImpl; 29175 if (!ScrollGrid) { 29176 throw new Error("No ScrollGrid implementation"); 29177 } 29178 let { context, props } = this; 29179 let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); 29180 let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); 29181 let sections = []; 29182 if (headerRowContent) { 29183 sections.push({ 29184 type: "header", 29185 key: "header", 29186 isSticky: stickyHeaderDates, 29187 syncRowHeights: true, 29188 chunks: [ 29189 { 29190 key: "axis", 29191 rowContent: (arg) => y2("tr", { role: "presentation" }, this.renderHeadAxis("day", arg.rowSyncHeights[0])) 29192 }, 29193 { 29194 key: "cols", 29195 elRef: this.headerElRef, 29196 tableClassName: "fc-col-header", 29197 rowContent: headerRowContent 29198 } 29199 ] 29200 }); 29201 } 29202 if (allDayContent) { 29203 sections.push({ 29204 type: "body", 29205 key: "all-day", 29206 syncRowHeights: true, 29207 chunks: [ 29208 { 29209 key: "axis", 29210 rowContent: (contentArg) => y2("tr", { role: "presentation" }, this.renderTableRowAxis(contentArg.rowSyncHeights[0])) 29211 }, 29212 { 29213 key: "cols", 29214 content: allDayContent 29215 } 29216 ] 29217 }); 29218 sections.push({ 29219 key: "all-day-divider", 29220 type: "body", 29221 outerContent: y2( 29222 "tr", 29223 { role: "presentation", className: "fc-scrollgrid-section" }, 29224 y2("td", { colSpan: 2, className: "fc-timegrid-divider " + context.theme.getClass("tableCellShaded") }) 29225 ) 29226 }); 29227 } 29228 let isNowIndicator = context.options.nowIndicator; 29229 sections.push({ 29230 type: "body", 29231 key: "body", 29232 liquid: true, 29233 expandRows: Boolean(context.options.expandRows), 29234 chunks: [ 29235 { 29236 key: "axis", 29237 content: (arg) => y2( 29238 "div", 29239 { className: "fc-timegrid-axis-chunk" }, 29240 y2( 29241 "table", 29242 { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : "" } }, 29243 arg.tableColGroupNode, 29244 y2( 29245 "tbody", 29246 null, 29247 y2(TimeBodyAxis, { slatMetas }) 29248 ) 29249 ), 29250 y2( 29251 "div", 29252 { className: "fc-timegrid-now-indicator-container" }, 29253 y2(NowTimer, { unit: isNowIndicator ? "minute" : "day" }, (nowDate) => { 29254 let nowIndicatorTop = isNowIndicator && slatCoords && slatCoords.safeComputeTop(nowDate); 29255 if (typeof nowIndicatorTop === "number") { 29256 return y2(NowIndicatorContainer, { elClasses: ["fc-timegrid-now-indicator-arrow"], elStyle: { top: nowIndicatorTop }, isAxis: true, date: nowDate }); 29257 } 29258 return null; 29259 }) 29260 ) 29261 ) 29262 }, 29263 { 29264 key: "cols", 29265 scrollerElRef: this.scrollerElRef, 29266 content: timeContent 29267 } 29268 ] 29269 }); 29270 if (stickyFooterScrollbar) { 29271 sections.push({ 29272 key: "footer", 29273 type: "footer", 29274 isSticky: true, 29275 chunks: [ 29276 { 29277 key: "axis", 29278 content: renderScrollShim 29279 }, 29280 { 29281 key: "cols", 29282 content: renderScrollShim 29283 } 29284 ] 29285 }); 29286 } 29287 return y2( 29288 ViewContainer, 29289 { elRef: this.rootElRef, elClasses: ["fc-timegrid"], viewSpec: context.viewSpec }, 29290 y2(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, forPrint: props.forPrint, collapsibleWidth: false, colGroups: [ 29291 { width: "shrink", cols: [{ width: "shrink" }] }, 29292 { cols: [{ span: colCnt, minWidth: dayMinWidth }] } 29293 ], sections }) 29294 ); 29295 } 29296 getAllDayMaxEventProps() { 29297 let { dayMaxEvents, dayMaxEventRows } = this.context.options; 29298 if (dayMaxEvents === true || dayMaxEventRows === true) { 29299 dayMaxEvents = void 0; 29300 dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; 29301 } 29302 return { dayMaxEvents, dayMaxEventRows }; 29303 } 29304 }; 29305 function renderAllDayInner(renderProps) { 29306 return renderProps.text; 29307 } 29308 var TimeColsSlatsCoords = class { 29309 constructor(positions, dateProfile, slotDuration) { 29310 this.positions = positions; 29311 this.dateProfile = dateProfile; 29312 this.slotDuration = slotDuration; 29313 } 29314 safeComputeTop(date) { 29315 let { dateProfile } = this; 29316 if (rangeContainsMarker(dateProfile.currentRange, date)) { 29317 let startOfDayDate = startOfDay(date); 29318 let timeMs = date.valueOf() - startOfDayDate.valueOf(); 29319 if (timeMs >= asRoughMs(dateProfile.slotMinTime) && timeMs < asRoughMs(dateProfile.slotMaxTime)) { 29320 return this.computeTimeTop(createDuration(timeMs)); 29321 } 29322 } 29323 return null; 29324 } 29325 computeDateTop(when, startOfDayDate) { 29326 if (!startOfDayDate) { 29327 startOfDayDate = startOfDay(when); 29328 } 29329 return this.computeTimeTop(createDuration(when.valueOf() - startOfDayDate.valueOf())); 29330 } 29331 computeTimeTop(duration) { 29332 let { positions, dateProfile } = this; 29333 let len = positions.els.length; 29334 let slatCoverage = (duration.milliseconds - asRoughMs(dateProfile.slotMinTime)) / asRoughMs(this.slotDuration); 29335 let slatIndex; 29336 let slatRemainder; 29337 slatCoverage = Math.max(0, slatCoverage); 29338 slatCoverage = Math.min(len, slatCoverage); 29339 slatIndex = Math.floor(slatCoverage); 29340 slatIndex = Math.min(slatIndex, len - 1); 29341 slatRemainder = slatCoverage - slatIndex; 29342 return positions.tops[slatIndex] + positions.getHeight(slatIndex) * slatRemainder; 29343 } 29344 }; 29345 var TimeColsSlatsBody = class extends BaseComponent { 29346 render() { 29347 let { props, context } = this; 29348 let { options } = context; 29349 let { slatElRefs } = props; 29350 return y2("tbody", null, props.slatMetas.map((slatMeta, i4) => { 29351 let renderProps = { 29352 time: slatMeta.time, 29353 date: context.dateEnv.toDate(slatMeta.date), 29354 view: context.viewApi 29355 }; 29356 return y2( 29357 "tr", 29358 { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, 29359 props.axis && y2(TimeColsAxisCell, Object.assign({}, slatMeta)), 29360 y2(ContentContainer, { elTag: "td", elClasses: [ 29361 "fc-timegrid-slot", 29362 "fc-timegrid-slot-lane", 29363 !slatMeta.isLabeled && "fc-timegrid-slot-minor" 29364 ], elAttrs: { 29365 "data-time": slatMeta.isoTimeStr 29366 }, renderProps, generatorName: "slotLaneContent", customGenerator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }) 29367 ); 29368 })); 29369 } 29370 }; 29371 var TimeColsSlats = class extends BaseComponent { 29372 constructor() { 29373 super(...arguments); 29374 this.rootElRef = d2(); 29375 this.slatElRefs = new RefMap(); 29376 } 29377 render() { 29378 let { props, context } = this; 29379 return y2( 29380 "div", 29381 { ref: this.rootElRef, className: "fc-timegrid-slots" }, 29382 y2( 29383 "table", 29384 { "aria-hidden": true, className: context.theme.getClass("table"), style: { 29385 minWidth: props.tableMinWidth, 29386 width: props.clientWidth, 29387 height: props.minHeight 29388 } }, 29389 props.tableColGroupNode, 29390 y2(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas }) 29391 ) 29392 ); 29393 } 29394 componentDidMount() { 29395 this.updateSizing(); 29396 } 29397 componentDidUpdate() { 29398 this.updateSizing(); 29399 } 29400 componentWillUnmount() { 29401 if (this.props.onCoords) { 29402 this.props.onCoords(null); 29403 } 29404 } 29405 updateSizing() { 29406 let { context, props } = this; 29407 if (props.onCoords && props.clientWidth !== null) { 29408 let rootEl = this.rootElRef.current; 29409 if (rootEl.offsetHeight) { 29410 props.onCoords(new TimeColsSlatsCoords(new PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration)); 29411 } 29412 } 29413 } 29414 }; 29415 function collectSlatEls(elMap, slatMetas) { 29416 return slatMetas.map((slatMeta) => elMap[slatMeta.key]); 29417 } 29418 function splitSegsByCol(segs, colCnt) { 29419 let segsByCol = []; 29420 let i4; 29421 for (i4 = 0; i4 < colCnt; i4 += 1) { 29422 segsByCol.push([]); 29423 } 29424 if (segs) { 29425 for (i4 = 0; i4 < segs.length; i4 += 1) { 29426 segsByCol[segs[i4].col].push(segs[i4]); 29427 } 29428 } 29429 return segsByCol; 29430 } 29431 function splitInteractionByCol(ui2, colCnt) { 29432 let byRow = []; 29433 if (!ui2) { 29434 for (let i4 = 0; i4 < colCnt; i4 += 1) { 29435 byRow[i4] = null; 29436 } 29437 } else { 29438 for (let i4 = 0; i4 < colCnt; i4 += 1) { 29439 byRow[i4] = { 29440 affectedInstances: ui2.affectedInstances, 29441 isEvent: ui2.isEvent, 29442 segs: [] 29443 }; 29444 } 29445 for (let seg of ui2.segs) { 29446 byRow[seg.col].segs.push(seg); 29447 } 29448 } 29449 return byRow; 29450 } 29451 var TimeColMoreLink = class extends BaseComponent { 29452 render() { 29453 let { props } = this; 29454 return y2(MoreLinkContainer, { elClasses: ["fc-timegrid-more-link"], elStyle: { 29455 top: props.top, 29456 bottom: props.bottom 29457 }, allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: () => renderPlainFgSegs(props.hiddenSegs, props), defaultGenerator: renderMoreLinkInner2, forceTimed: true }, (InnerContent) => y2(InnerContent, { elTag: "div", elClasses: ["fc-timegrid-more-link-inner", "fc-sticky"] })); 29458 } 29459 }; 29460 function renderMoreLinkInner2(props) { 29461 return props.shortText; 29462 } 29463 function buildPositioning(segInputs, strictOrder, maxStackCnt) { 29464 let hierarchy = new SegHierarchy(); 29465 if (strictOrder != null) { 29466 hierarchy.strictOrder = strictOrder; 29467 } 29468 if (maxStackCnt != null) { 29469 hierarchy.maxStackCnt = maxStackCnt; 29470 } 29471 let hiddenEntries = hierarchy.addSegs(segInputs); 29472 let hiddenGroups = groupIntersectingEntries(hiddenEntries); 29473 let web = buildWeb(hierarchy); 29474 web = stretchWeb(web, 1); 29475 let segRects = webToRects(web); 29476 return { segRects, hiddenGroups }; 29477 } 29478 function buildWeb(hierarchy) { 29479 const { entriesByLevel } = hierarchy; 29480 const buildNode = cacheable((level, lateral) => level + ":" + lateral, (level, lateral) => { 29481 let siblingRange = findNextLevelSegs(hierarchy, level, lateral); 29482 let nextLevelRes = buildNodes(siblingRange, buildNode); 29483 let entry = entriesByLevel[level][lateral]; 29484 return [ 29485 Object.assign(Object.assign({}, entry), { nextLevelNodes: nextLevelRes[0] }), 29486 entry.thickness + nextLevelRes[1] 29487 ]; 29488 }); 29489 return buildNodes(entriesByLevel.length ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length } : null, buildNode)[0]; 29490 } 29491 function buildNodes(siblingRange, buildNode) { 29492 if (!siblingRange) { 29493 return [[], 0]; 29494 } 29495 let { level, lateralStart, lateralEnd } = siblingRange; 29496 let lateral = lateralStart; 29497 let pairs = []; 29498 while (lateral < lateralEnd) { 29499 pairs.push(buildNode(level, lateral)); 29500 lateral += 1; 29501 } 29502 pairs.sort(cmpDescPressures); 29503 return [ 29504 pairs.map(extractNode), 29505 pairs[0][1] 29506 ]; 29507 } 29508 function cmpDescPressures(a4, b4) { 29509 return b4[1] - a4[1]; 29510 } 29511 function extractNode(a4) { 29512 return a4[0]; 29513 } 29514 function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) { 29515 let { levelCoords, entriesByLevel } = hierarchy; 29516 let subjectEntry = entriesByLevel[subjectLevel][subjectLateral]; 29517 let afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness; 29518 let levelCnt = levelCoords.length; 29519 let level = subjectLevel; 29520 for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1) 29521 ; 29522 for (; level < levelCnt; level += 1) { 29523 let entries = entriesByLevel[level]; 29524 let entry; 29525 let searchIndex = binarySearch(entries, subjectEntry.span.start, getEntrySpanEnd); 29526 let lateralStart = searchIndex[0] + searchIndex[1]; 29527 let lateralEnd = lateralStart; 29528 while ((entry = entries[lateralEnd]) && entry.span.start < subjectEntry.span.end) { 29529 lateralEnd += 1; 29530 } 29531 if (lateralStart < lateralEnd) { 29532 return { level, lateralStart, lateralEnd }; 29533 } 29534 } 29535 return null; 29536 } 29537 function stretchWeb(topLevelNodes, totalThickness) { 29538 const stretchNode = cacheable((node, startCoord, prevThickness) => buildEntryKey(node), (node, startCoord, prevThickness) => { 29539 let { nextLevelNodes, thickness } = node; 29540 let allThickness = thickness + prevThickness; 29541 let thicknessFraction = thickness / allThickness; 29542 let endCoord; 29543 let newChildren = []; 29544 if (!nextLevelNodes.length) { 29545 endCoord = totalThickness; 29546 } else { 29547 for (let childNode of nextLevelNodes) { 29548 if (endCoord === void 0) { 29549 let res = stretchNode(childNode, startCoord, allThickness); 29550 endCoord = res[0]; 29551 newChildren.push(res[1]); 29552 } else { 29553 let res = stretchNode(childNode, endCoord, 0); 29554 newChildren.push(res[1]); 29555 } 29556 } 29557 } 29558 let newThickness = (endCoord - startCoord) * thicknessFraction; 29559 return [endCoord - newThickness, Object.assign(Object.assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })]; 29560 }); 29561 return topLevelNodes.map((node) => stretchNode(node, 0, 0)[1]); 29562 } 29563 function webToRects(topLevelNodes) { 29564 let rects = []; 29565 const processNode = cacheable((node, levelCoord, stackDepth) => buildEntryKey(node), (node, levelCoord, stackDepth) => { 29566 let rect = Object.assign(Object.assign({}, node), { 29567 levelCoord, 29568 stackDepth, 29569 stackForward: 0 29570 }); 29571 rects.push(rect); 29572 return rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1; 29573 }); 29574 function processNodes(nodes, levelCoord, stackDepth) { 29575 let stackForward = 0; 29576 for (let node of nodes) { 29577 stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward); 29578 } 29579 return stackForward; 29580 } 29581 processNodes(topLevelNodes, 0, 0); 29582 return rects; 29583 } 29584 function cacheable(keyFunc, workFunc) { 29585 const cache2 = {}; 29586 return (...args) => { 29587 let key = keyFunc(...args); 29588 return key in cache2 ? cache2[key] : cache2[key] = workFunc(...args); 29589 }; 29590 } 29591 function computeSegVCoords(segs, colDate, slatCoords = null, eventMinHeight = 0) { 29592 let vcoords = []; 29593 if (slatCoords) { 29594 for (let i4 = 0; i4 < segs.length; i4 += 1) { 29595 let seg = segs[i4]; 29596 let spanStart = slatCoords.computeDateTop(seg.start, colDate); 29597 let spanEnd = Math.max( 29598 spanStart + (eventMinHeight || 0), 29599 slatCoords.computeDateTop(seg.end, colDate) 29600 ); 29601 vcoords.push({ 29602 start: Math.round(spanStart), 29603 end: Math.round(spanEnd) 29604 }); 29605 } 29606 } 29607 return vcoords; 29608 } 29609 function computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack) { 29610 let segInputs = []; 29611 let dumbSegs = []; 29612 for (let i4 = 0; i4 < segs.length; i4 += 1) { 29613 let vcoords = segVCoords[i4]; 29614 if (vcoords) { 29615 segInputs.push({ 29616 index: i4, 29617 thickness: 1, 29618 span: vcoords 29619 }); 29620 } else { 29621 dumbSegs.push(segs[i4]); 29622 } 29623 } 29624 let { segRects, hiddenGroups } = buildPositioning(segInputs, eventOrderStrict, eventMaxStack); 29625 let segPlacements = []; 29626 for (let segRect of segRects) { 29627 segPlacements.push({ 29628 seg: segs[segRect.index], 29629 rect: segRect 29630 }); 29631 } 29632 for (let dumbSeg of dumbSegs) { 29633 segPlacements.push({ seg: dumbSeg, rect: null }); 29634 } 29635 return { segPlacements, hiddenGroups }; 29636 } 29637 var DEFAULT_TIME_FORMAT = createFormatter({ 29638 hour: "numeric", 29639 minute: "2-digit", 29640 meridiem: false 29641 }); 29642 var TimeColEvent = class extends BaseComponent { 29643 render() { 29644 return y2(StandardEvent, Object.assign({}, this.props, { elClasses: [ 29645 "fc-timegrid-event", 29646 "fc-v-event", 29647 this.props.isShort && "fc-timegrid-event-short" 29648 ], defaultTimeFormat: DEFAULT_TIME_FORMAT })); 29649 } 29650 }; 29651 var TimeCol = class extends BaseComponent { 29652 constructor() { 29653 super(...arguments); 29654 this.sortEventSegs = memoize(sortEventSegs); 29655 } 29656 render() { 29657 let { props, context } = this; 29658 let { options } = context; 29659 let isSelectMirror = options.selectMirror; 29660 let mirrorSegs = props.eventDrag && props.eventDrag.segs || props.eventResize && props.eventResize.segs || isSelectMirror && props.dateSelectionSegs || []; 29661 let interactionAffectedInstances = props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}; 29662 let sortedFgSegs = this.sortEventSegs(props.fgEventSegs, options.eventOrder); 29663 return y2(DayCellContainer, { elTag: "td", elRef: props.elRef, elClasses: [ 29664 "fc-timegrid-col", 29665 ...props.extraClassNames || [] 29666 ], elAttrs: Object.assign({ role: "gridcell" }, props.extraDataAttrs), date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraRenderProps: props.extraRenderProps }, (InnerContent) => y2( 29667 "div", 29668 { className: "fc-timegrid-col-frame" }, 29669 y2( 29670 "div", 29671 { className: "fc-timegrid-col-bg" }, 29672 this.renderFillSegs(props.businessHourSegs, "non-business"), 29673 this.renderFillSegs(props.bgEventSegs, "bg-event"), 29674 this.renderFillSegs(props.dateSelectionSegs, "highlight") 29675 ), 29676 y2("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), 29677 y2("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror), "mirror")), 29678 y2("div", { className: "fc-timegrid-now-indicator-container" }, this.renderNowIndicator(props.nowIndicatorSegs)), 29679 hasCustomDayCellContent(options) && y2(InnerContent, { elTag: "div", elClasses: ["fc-timegrid-col-misc"] }) 29680 )); 29681 } 29682 renderFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey) { 29683 let { props } = this; 29684 if (props.forPrint) { 29685 return renderPlainFgSegs(sortedFgSegs, props); 29686 } 29687 return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey); 29688 } 29689 renderPositionedFgSegs(segs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey) { 29690 let { eventMaxStack, eventShortHeight, eventOrderStrict, eventMinHeight } = this.context.options; 29691 let { date, slatCoords, eventSelection, todayRange, nowDate } = this.props; 29692 let isMirror = isDragging || isResizing || isDateSelecting; 29693 let segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); 29694 let { segPlacements, hiddenGroups } = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack); 29695 return y2( 29696 _2, 29697 null, 29698 this.renderHiddenGroups(hiddenGroups, segs), 29699 segPlacements.map((segPlacement) => { 29700 let { seg, rect } = segPlacement; 29701 let instanceId = seg.eventRange.instance.instanceId; 29702 let isVisible2 = isMirror || Boolean(!segIsInvisible[instanceId] && rect); 29703 let vStyle = computeSegVStyle(rect && rect.span); 29704 let hStyle = !isMirror && rect ? this.computeSegHStyle(rect) : { left: 0, right: 0 }; 29705 let isInset = Boolean(rect) && rect.stackForward > 0; 29706 let isShort = Boolean(rect) && rect.span.end - rect.span.start < eventShortHeight; 29707 return y2( 29708 "div", 29709 { className: "fc-timegrid-event-harness" + (isInset ? " fc-timegrid-event-harness-inset" : ""), key: forcedKey || instanceId, style: Object.assign(Object.assign({ visibility: isVisible2 ? "" : "hidden" }, vStyle), hStyle) }, 29710 y2(TimeColEvent, Object.assign({ seg, isDragging, isResizing, isDateSelecting, isSelected: instanceId === eventSelection, isShort }, getSegMeta(seg, todayRange, nowDate))) 29711 ); 29712 }) 29713 ); 29714 } 29715 renderHiddenGroups(hiddenGroups, segs) { 29716 let { extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize } = this.props; 29717 return y2(_2, null, hiddenGroups.map((hiddenGroup) => { 29718 let positionCss = computeSegVStyle(hiddenGroup.span); 29719 let hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs); 29720 return y2(TimeColMoreLink, { key: buildIsoString(computeEarliestSegStart(hiddenSegs)), hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize }); 29721 })); 29722 } 29723 renderFillSegs(segs, fillType) { 29724 let { props, context } = this; 29725 let segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); 29726 let children = segVCoords.map((vcoords, i4) => { 29727 let seg = segs[i4]; 29728 return y2("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === "bg-event" ? y2(BgEvent, Object.assign({ seg }, getSegMeta(seg, props.todayRange, props.nowDate))) : renderFill(fillType)); 29729 }); 29730 return y2(_2, null, children); 29731 } 29732 renderNowIndicator(segs) { 29733 let { slatCoords, date } = this.props; 29734 if (!slatCoords) { 29735 return null; 29736 } 29737 return segs.map((seg, i4) => y2( 29738 NowIndicatorContainer, 29739 { 29740 key: i4, 29741 elClasses: ["fc-timegrid-now-indicator-line"], 29742 elStyle: { 29743 top: slatCoords.computeDateTop(seg.start, date) 29744 }, 29745 isAxis: false, 29746 date 29747 } 29748 )); 29749 } 29750 computeSegHStyle(segHCoords) { 29751 let { isRtl, options } = this.context; 29752 let shouldOverlap = options.slotEventOverlap; 29753 let nearCoord = segHCoords.levelCoord; 29754 let farCoord = segHCoords.levelCoord + segHCoords.thickness; 29755 let left2; 29756 let right2; 29757 if (shouldOverlap) { 29758 farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2); 29759 } 29760 if (isRtl) { 29761 left2 = 1 - farCoord; 29762 right2 = nearCoord; 29763 } else { 29764 left2 = nearCoord; 29765 right2 = 1 - farCoord; 29766 } 29767 let props = { 29768 zIndex: segHCoords.stackDepth + 1, 29769 left: left2 * 100 + "%", 29770 right: right2 * 100 + "%" 29771 }; 29772 if (shouldOverlap && !segHCoords.stackForward) { 29773 props[isRtl ? "marginLeft" : "marginRight"] = 10 * 2; 29774 } 29775 return props; 29776 } 29777 }; 29778 function renderPlainFgSegs(sortedFgSegs, { todayRange, nowDate, eventSelection, eventDrag, eventResize }) { 29779 let hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || (eventResize ? eventResize.affectedInstances : null) || {}; 29780 return y2(_2, null, sortedFgSegs.map((seg) => { 29781 let instanceId = seg.eventRange.instance.instanceId; 29782 return y2( 29783 "div", 29784 { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? "hidden" : "" } }, 29785 y2(TimeColEvent, Object.assign({ seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, getSegMeta(seg, todayRange, nowDate))) 29786 ); 29787 })); 29788 } 29789 function computeSegVStyle(segVCoords) { 29790 if (!segVCoords) { 29791 return { top: "", bottom: "" }; 29792 } 29793 return { 29794 top: segVCoords.start, 29795 bottom: -segVCoords.end 29796 }; 29797 } 29798 function compileSegsFromEntries(segEntries, allSegs) { 29799 return segEntries.map((segEntry) => allSegs[segEntry.index]); 29800 } 29801 var TimeColsContent = class extends BaseComponent { 29802 constructor() { 29803 super(...arguments); 29804 this.splitFgEventSegs = memoize(splitSegsByCol); 29805 this.splitBgEventSegs = memoize(splitSegsByCol); 29806 this.splitBusinessHourSegs = memoize(splitSegsByCol); 29807 this.splitNowIndicatorSegs = memoize(splitSegsByCol); 29808 this.splitDateSelectionSegs = memoize(splitSegsByCol); 29809 this.splitEventDrag = memoize(splitInteractionByCol); 29810 this.splitEventResize = memoize(splitInteractionByCol); 29811 this.rootElRef = d2(); 29812 this.cellElRefs = new RefMap(); 29813 } 29814 render() { 29815 let { props, context } = this; 29816 let nowIndicatorTop = context.options.nowIndicator && props.slatCoords && props.slatCoords.safeComputeTop(props.nowDate); 29817 let colCnt = props.cells.length; 29818 let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt); 29819 let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt); 29820 let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt); 29821 let nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt); 29822 let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt); 29823 let eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); 29824 let eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); 29825 return y2( 29826 "div", 29827 { className: "fc-timegrid-cols", ref: this.rootElRef }, 29828 y2( 29829 "table", 29830 { role: "presentation", style: { 29831 minWidth: props.tableMinWidth, 29832 width: props.clientWidth 29833 } }, 29834 props.tableColGroupNode, 29835 y2( 29836 "tbody", 29837 { role: "presentation" }, 29838 y2( 29839 "tr", 29840 { role: "row" }, 29841 props.axis && y2( 29842 "td", 29843 { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, 29844 y2( 29845 "div", 29846 { className: "fc-timegrid-col-frame" }, 29847 y2("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === "number" && y2(NowIndicatorContainer, { elClasses: ["fc-timegrid-now-indicator-arrow"], elStyle: { top: nowIndicatorTop }, isAxis: true, date: props.nowDate })) 29848 ) 29849 ), 29850 props.cells.map((cell, i4) => y2(TimeCol, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i4], bgEventSegs: bgEventSegsByRow[i4], businessHourSegs: businessHourSegsByRow[i4], nowIndicatorSegs: nowIndicatorSegsByRow[i4], dateSelectionSegs: dateSelectionSegsByRow[i4], eventDrag: eventDragByRow[i4], eventResize: eventResizeByRow[i4], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint })) 29851 ) 29852 ) 29853 ) 29854 ); 29855 } 29856 componentDidMount() { 29857 this.updateCoords(); 29858 } 29859 componentDidUpdate() { 29860 this.updateCoords(); 29861 } 29862 updateCoords() { 29863 let { props } = this; 29864 if (props.onColCoords && props.clientWidth !== null) { 29865 props.onColCoords(new PositionCache( 29866 this.rootElRef.current, 29867 collectCellEls(this.cellElRefs.currentMap, props.cells), 29868 true, 29869 false 29870 )); 29871 } 29872 } 29873 }; 29874 function collectCellEls(elMap, cells) { 29875 return cells.map((cell) => elMap[cell.key]); 29876 } 29877 var TimeCols = class extends DateComponent { 29878 constructor() { 29879 super(...arguments); 29880 this.processSlotOptions = memoize(processSlotOptions); 29881 this.state = { 29882 slatCoords: null 29883 }; 29884 this.handleRootEl = (el) => { 29885 if (el) { 29886 this.context.registerInteractiveComponent(this, { 29887 el, 29888 isHitComboAllowed: this.props.isHitComboAllowed 29889 }); 29890 } else { 29891 this.context.unregisterInteractiveComponent(this); 29892 } 29893 }; 29894 this.handleScrollRequest = (request) => { 29895 let { onScrollTopRequest } = this.props; 29896 let { slatCoords } = this.state; 29897 if (onScrollTopRequest && slatCoords) { 29898 if (request.time) { 29899 let top2 = slatCoords.computeTimeTop(request.time); 29900 top2 = Math.ceil(top2); 29901 if (top2) { 29902 top2 += 1; 29903 } 29904 onScrollTopRequest(top2); 29905 } 29906 return true; 29907 } 29908 return false; 29909 }; 29910 this.handleColCoords = (colCoords) => { 29911 this.colCoords = colCoords; 29912 }; 29913 this.handleSlatCoords = (slatCoords) => { 29914 this.setState({ slatCoords }); 29915 if (this.props.onSlatCoords) { 29916 this.props.onSlatCoords(slatCoords); 29917 } 29918 }; 29919 } 29920 render() { 29921 let { props, state } = this; 29922 return y2( 29923 "div", 29924 { className: "fc-timegrid-body", ref: this.handleRootEl, style: { 29925 width: props.clientWidth, 29926 minWidth: props.tableMinWidth 29927 } }, 29928 y2(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : "", tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null, onCoords: this.handleSlatCoords }), 29929 y2(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint }) 29930 ); 29931 } 29932 componentDidMount() { 29933 this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); 29934 } 29935 componentDidUpdate(prevProps) { 29936 this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); 29937 } 29938 componentWillUnmount() { 29939 this.scrollResponder.detach(); 29940 } 29941 queryHit(positionLeft, positionTop) { 29942 let { dateEnv, options } = this.context; 29943 let { colCoords } = this; 29944 let { dateProfile } = this.props; 29945 let { slatCoords } = this.state; 29946 let { snapDuration, snapsPerSlot } = this.processSlotOptions(this.props.slotDuration, options.snapDuration); 29947 let colIndex = colCoords.leftToIndex(positionLeft); 29948 let slatIndex = slatCoords.positions.topToIndex(positionTop); 29949 if (colIndex != null && slatIndex != null) { 29950 let cell = this.props.cells[colIndex]; 29951 let slatTop = slatCoords.positions.tops[slatIndex]; 29952 let slatHeight = slatCoords.positions.getHeight(slatIndex); 29953 let partial = (positionTop - slatTop) / slatHeight; 29954 let localSnapIndex = Math.floor(partial * snapsPerSlot); 29955 let snapIndex = slatIndex * snapsPerSlot + localSnapIndex; 29956 let dayDate = this.props.cells[colIndex].date; 29957 let time = addDurations(dateProfile.slotMinTime, multiplyDuration(snapDuration, snapIndex)); 29958 let start5 = dateEnv.add(dayDate, time); 29959 let end2 = dateEnv.add(start5, snapDuration); 29960 return { 29961 dateProfile, 29962 dateSpan: Object.assign({ range: { start: start5, end: end2 }, allDay: false }, cell.extraDateSpan), 29963 dayEl: colCoords.els[colIndex], 29964 rect: { 29965 left: colCoords.lefts[colIndex], 29966 right: colCoords.rights[colIndex], 29967 top: slatTop, 29968 bottom: slatTop + slatHeight 29969 }, 29970 layer: 0 29971 }; 29972 } 29973 return null; 29974 } 29975 }; 29976 function processSlotOptions(slotDuration, snapDurationOverride) { 29977 let snapDuration = snapDurationOverride || slotDuration; 29978 let snapsPerSlot = wholeDivideDurations(slotDuration, snapDuration); 29979 if (snapsPerSlot === null) { 29980 snapDuration = slotDuration; 29981 snapsPerSlot = 1; 29982 } 29983 return { snapDuration, snapsPerSlot }; 29984 } 29985 var DayTimeColsSlicer = class extends Slicer { 29986 sliceRange(range, dayRanges) { 29987 let segs = []; 29988 for (let col = 0; col < dayRanges.length; col += 1) { 29989 let segRange = intersectRanges(range, dayRanges[col]); 29990 if (segRange) { 29991 segs.push({ 29992 start: segRange.start, 29993 end: segRange.end, 29994 isStart: segRange.start.valueOf() === range.start.valueOf(), 29995 isEnd: segRange.end.valueOf() === range.end.valueOf(), 29996 col 29997 }); 29998 } 29999 } 30000 return segs; 30001 } 30002 }; 30003 var DayTimeCols = class extends DateComponent { 30004 constructor() { 30005 super(...arguments); 30006 this.buildDayRanges = memoize(buildDayRanges); 30007 this.slicer = new DayTimeColsSlicer(); 30008 this.timeColsRef = d2(); 30009 } 30010 render() { 30011 let { props, context } = this; 30012 let { dateProfile, dayTableModel } = props; 30013 let { nowIndicator, nextDayThreshold } = context.options; 30014 let dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv); 30015 return y2(NowTimer, { unit: nowIndicator ? "minute" : "day" }, (nowDate, todayRange) => y2(TimeCols, Object.assign({ ref: this.timeColsRef }, this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate, nowIndicatorSegs: nowIndicator && this.slicer.sliceNowDate(nowDate, dateProfile, nextDayThreshold, context, dayRanges), todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords }))); 30016 } 30017 }; 30018 function buildDayRanges(dayTableModel, dateProfile, dateEnv) { 30019 let ranges = []; 30020 for (let date of dayTableModel.headerDates) { 30021 ranges.push({ 30022 start: dateEnv.add(date, dateProfile.slotMinTime), 30023 end: dateEnv.add(date, dateProfile.slotMaxTime) 30024 }); 30025 } 30026 return ranges; 30027 } 30028 var STOCK_SUB_DURATIONS = [ 30029 { hours: 1 }, 30030 { minutes: 30 }, 30031 { minutes: 15 }, 30032 { seconds: 30 }, 30033 { seconds: 15 } 30034 ]; 30035 function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) { 30036 let dayStart = new Date(0); 30037 let slatTime = slotMinTime; 30038 let slatIterator = createDuration(0); 30039 let labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration); 30040 let metas = []; 30041 while (asRoughMs(slatTime) < asRoughMs(slotMaxTime)) { 30042 let date = dateEnv.add(dayStart, slatTime); 30043 let isLabeled = wholeDivideDurations(slatIterator, labelInterval) !== null; 30044 metas.push({ 30045 date, 30046 time: slatTime, 30047 key: date.toISOString(), 30048 isoTimeStr: formatIsoTimeString(date), 30049 isLabeled 30050 }); 30051 slatTime = addDurations(slatTime, slotDuration); 30052 slatIterator = addDurations(slatIterator, slotDuration); 30053 } 30054 return metas; 30055 } 30056 function computeLabelInterval(slotDuration) { 30057 let i4; 30058 let labelInterval; 30059 let slotsPerLabel; 30060 for (i4 = STOCK_SUB_DURATIONS.length - 1; i4 >= 0; i4 -= 1) { 30061 labelInterval = createDuration(STOCK_SUB_DURATIONS[i4]); 30062 slotsPerLabel = wholeDivideDurations(labelInterval, slotDuration); 30063 if (slotsPerLabel !== null && slotsPerLabel > 1) { 30064 return labelInterval; 30065 } 30066 } 30067 return slotDuration; 30068 } 30069 var DayTimeColsView = class extends TimeColsView { 30070 constructor() { 30071 super(...arguments); 30072 this.buildTimeColsModel = memoize(buildTimeColsModel); 30073 this.buildSlatMetas = memoize(buildSlatMetas); 30074 } 30075 render() { 30076 let { options, dateEnv, dateProfileGenerator } = this.context; 30077 let { props } = this; 30078 let { dateProfile } = props; 30079 let dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator); 30080 let splitProps = this.allDaySplitter.splitProps(props); 30081 let slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); 30082 let { dayMinWidth } = options; 30083 let hasAttachedAxis = !dayMinWidth; 30084 let hasDetachedAxis = dayMinWidth; 30085 let headerContent = options.dayHeaders && y2(DayHeader, { dates: dayTableModel.headerDates, dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null }); 30086 let allDayContent = options.allDaySlot !== false && ((contentArg) => y2(DayTable, Object.assign({}, splitProps.allDay, { dateProfile, dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, this.getAllDayMaxEventProps()))); 30087 let timeGridContent = (contentArg) => y2(DayTimeCols, Object.assign({}, splitProps.timed, { dayTableModel, dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: this.handleScrollTopRequest })); 30088 return hasDetachedAxis ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); 30089 } 30090 }; 30091 function buildTimeColsModel(dateProfile, dateProfileGenerator) { 30092 let daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); 30093 return new DayTableModel(daySeries, false); 30094 } 30095 var css_248z3 = '.fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-arrow,.fc .fc-timegrid-now-indicator-line{pointer-events:none}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}'; 30096 injectStyles(css_248z3); 30097 30098
vendor: 624 bytes, lines 30098-30125
30098// node_modules/@fullcalendar/timegrid/index.js 30099 var OPTION_REFINERS = { 30100 allDaySlot: Boolean 30101 }; 30102 var index2 = createPlugin({ 30103 name: "@fullcalendar/timegrid", 30104 initialView: "timeGridWeek", 30105 optionRefiners: OPTION_REFINERS, 30106 views: { 30107 timeGrid: { 30108 component: DayTimeColsView, 30109 usesMinMaxTime: true, 30110 allDaySlot: true, 30111 slotDuration: "00:30:00", 30112 slotEventOverlap: true 30113 }, 30114 timeGridDay: { 30115 type: "timeGrid", 30116 duration: { days: 1 } 30117 }, 30118 timeGridWeek: { 30119 type: "timeGrid", 30120 duration: { weeks: 1 } 30121 } 30122 } 30123 }); 30124 30125
vendor: 12,939 bytes, lines 30125-30392
30125// node_modules/@fullcalendar/list/internal.js 30126 var ListViewHeaderRow = class extends BaseComponent { 30127 constructor() { 30128 super(...arguments); 30129 this.state = { 30130 textId: getUniqueDomId() 30131 }; 30132 } 30133 render() { 30134 let { theme, dateEnv, options, viewApi } = this.context; 30135 let { cellId, dayDate, todayRange } = this.props; 30136 let { textId } = this.state; 30137 let dayMeta = getDateMeta(dayDate, todayRange); 30138 let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ""; 30139 let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ""; 30140 let renderProps = Object.assign({ 30141 date: dateEnv.toDate(dayDate), 30142 view: viewApi, 30143 textId, 30144 text, 30145 sideText, 30146 navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), 30147 sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, "day", false) 30148 }, dayMeta); 30149 return y2(ContentContainer, { elTag: "tr", elClasses: [ 30150 "fc-list-day", 30151 ...getDayClassNames(dayMeta, theme) 30152 ], elAttrs: { 30153 "data-date": formatDayString(dayDate) 30154 }, renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInnerContent4, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => y2( 30155 "th", 30156 { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, 30157 y2(InnerContent, { elTag: "div", elClasses: [ 30158 "fc-list-day-cushion", 30159 theme.getClass("tableCellShaded") 30160 ] }) 30161 )); 30162 } 30163 }; 30164 function renderInnerContent4(props) { 30165 return y2( 30166 _2, 30167 null, 30168 props.text && y2("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text), 30169 props.sideText && y2("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText) 30170 ); 30171 } 30172 var DEFAULT_TIME_FORMAT2 = createFormatter({ 30173 hour: "numeric", 30174 minute: "2-digit", 30175 meridiem: "short" 30176 }); 30177 var ListViewEventRow = class extends BaseComponent { 30178 render() { 30179 let { props, context } = this; 30180 let { options } = context; 30181 let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props; 30182 let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT2; 30183 return y2(EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [ 30184 "fc-list-event", 30185 seg.eventRange.def.url && "fc-event-forced-url" 30186 ], defaultGenerator: () => renderEventInnerContent(seg, context), seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => y2( 30187 _2, 30188 null, 30189 buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), 30190 y2( 30191 "td", 30192 { "aria-hidden": true, className: "fc-list-event-graphic" }, 30193 y2("span", { className: "fc-list-event-dot", style: { 30194 borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor 30195 } }) 30196 ), 30197 y2(InnerContent, { elTag: "td", elClasses: ["fc-list-event-title"], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } }) 30198 )); 30199 } 30200 }; 30201 function renderEventInnerContent(seg, context) { 30202 let interactiveAttrs = getSegAnchorAttrs(seg, context); 30203 return y2("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title); 30204 } 30205 function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { 30206 let { options } = context; 30207 if (options.displayEventTime !== false) { 30208 let eventDef = seg.eventRange.def; 30209 let eventInstance = seg.eventRange.instance; 30210 let doAllDay = false; 30211 let timeText; 30212 if (eventDef.allDay) { 30213 doAllDay = true; 30214 } else if (isMultiDayRange(seg.eventRange.range)) { 30215 if (seg.isStart) { 30216 timeText = buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end); 30217 } else if (seg.isEnd) { 30218 timeText = buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end); 30219 } else { 30220 doAllDay = true; 30221 } 30222 } else { 30223 timeText = buildSegTimeText(seg, timeFormat, context); 30224 } 30225 if (doAllDay) { 30226 let renderProps = { 30227 text: context.options.allDayText, 30228 view: context.viewApi 30229 }; 30230 return y2(ContentContainer, { elTag: "td", elClasses: ["fc-list-event-time"], elAttrs: { 30231 headers: `${timeHeaderId} ${dateHeaderId}` 30232 }, renderProps, generatorName: "allDayContent", customGenerator: options.allDayContent, defaultGenerator: renderAllDayInner2, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }); 30233 } 30234 return y2("td", { className: "fc-list-event-time" }, timeText); 30235 } 30236 return null; 30237 } 30238 function renderAllDayInner2(renderProps) { 30239 return renderProps.text; 30240 } 30241 var ListView = class extends DateComponent { 30242 constructor() { 30243 super(...arguments); 30244 this.computeDateVars = memoize(computeDateVars); 30245 this.eventStoreToSegs = memoize(this._eventStoreToSegs); 30246 this.state = { 30247 timeHeaderId: getUniqueDomId(), 30248 eventHeaderId: getUniqueDomId(), 30249 dateHeaderIdRoot: getUniqueDomId() 30250 }; 30251 this.setRootEl = (rootEl) => { 30252 if (rootEl) { 30253 this.context.registerInteractiveComponent(this, { 30254 el: rootEl 30255 }); 30256 } else { 30257 this.context.unregisterInteractiveComponent(this); 30258 } 30259 }; 30260 } 30261 render() { 30262 let { props, context } = this; 30263 let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile); 30264 let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges); 30265 return y2( 30266 ViewContainer, 30267 { elRef: this.setRootEl, elClasses: [ 30268 "fc-list", 30269 context.theme.getClass("table"), 30270 context.options.stickyHeaderDates !== false ? "fc-list-sticky" : "" 30271 ], viewSpec: context.viewSpec }, 30272 y2(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? "visible" : "hidden", overflowY: props.isHeightAuto ? "visible" : "auto" }, eventSegs.length > 0 ? this.renderSegList(eventSegs, dayDates) : this.renderEmptyMessage()) 30273 ); 30274 } 30275 renderEmptyMessage() { 30276 let { options, viewApi } = this.context; 30277 let renderProps = { 30278 text: options.noEventsText, 30279 view: viewApi 30280 }; 30281 return y2(ContentContainer, { elTag: "div", elClasses: ["fc-list-empty"], renderProps, generatorName: "noEventsContent", customGenerator: options.noEventsContent, defaultGenerator: renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => y2(InnerContent, { elTag: "div", elClasses: ["fc-list-empty-cushion"] })); 30282 } 30283 renderSegList(allSegs, dayDates) { 30284 let { theme, options } = this.context; 30285 let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state; 30286 let segsByDay = groupSegsByDay(allSegs); 30287 return y2(NowTimer, { unit: "day" }, (nowDate, todayRange) => { 30288 let innerNodes = []; 30289 for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { 30290 let daySegs = segsByDay[dayIndex]; 30291 if (daySegs) { 30292 let dayStr = formatDayString(dayDates[dayIndex]); 30293 let dateHeaderId = dateHeaderIdRoot + "-" + dayStr; 30294 innerNodes.push(y2(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange })); 30295 daySegs = sortEventSegs(daySegs, options.eventOrder); 30296 for (let seg of daySegs) { 30297 innerNodes.push(y2(ListViewEventRow, Object.assign({ key: dayStr + ":" + seg.eventRange.instance.instanceId, seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId, eventHeaderId, dateHeaderId }, getSegMeta(seg, todayRange, nowDate)))); 30298 } 30299 } 30300 } 30301 return y2( 30302 "table", 30303 { className: "fc-list-table " + theme.getClass("table") }, 30304 y2( 30305 "thead", 30306 null, 30307 y2( 30308 "tr", 30309 null, 30310 y2("th", { scope: "col", id: timeHeaderId }, options.timeHint), 30311 y2("th", { scope: "col", "aria-hidden": true }), 30312 y2("th", { scope: "col", id: eventHeaderId }, options.eventHint) 30313 ) 30314 ), 30315 y2("tbody", null, innerNodes) 30316 ); 30317 }); 30318 } 30319 _eventStoreToSegs(eventStore, eventUiBases, dayRanges) { 30320 return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges); 30321 } 30322 eventRangesToSegs(eventRanges, dayRanges) { 30323 let segs = []; 30324 for (let eventRange of eventRanges) { 30325 segs.push(...this.eventRangeToSegs(eventRange, dayRanges)); 30326 } 30327 return segs; 30328 } 30329 eventRangeToSegs(eventRange, dayRanges) { 30330 let { dateEnv } = this.context; 30331 let { nextDayThreshold } = this.context.options; 30332 let range = eventRange.range; 30333 let allDay = eventRange.def.allDay; 30334 let dayIndex; 30335 let segRange; 30336 let seg; 30337 let segs = []; 30338 for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) { 30339 segRange = intersectRanges(range, dayRanges[dayIndex]); 30340 if (segRange) { 30341 seg = { 30342 component: this, 30343 eventRange, 30344 start: segRange.start, 30345 end: segRange.end, 30346 isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), 30347 isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), 30348 dayIndex 30349 }; 30350 segs.push(seg); 30351 if (!seg.isEnd && !allDay && dayIndex + 1 < dayRanges.length && range.end < dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { 30352 seg.end = range.end; 30353 seg.isEnd = true; 30354 break; 30355 } 30356 } 30357 } 30358 return segs; 30359 } 30360 }; 30361 function renderNoEventsInner(renderProps) { 30362 return renderProps.text; 30363 } 30364 function computeDateVars(dateProfile) { 30365 let dayStart = startOfDay(dateProfile.renderRange.start); 30366 let viewEnd = dateProfile.renderRange.end; 30367 let dayDates = []; 30368 let dayRanges = []; 30369 while (dayStart < viewEnd) { 30370 dayDates.push(dayStart); 30371 dayRanges.push({ 30372 start: dayStart, 30373 end: addDays(dayStart, 1) 30374 }); 30375 dayStart = addDays(dayStart, 1); 30376 } 30377 return { dayDates, dayRanges }; 30378 } 30379 function groupSegsByDay(segs) { 30380 let segsByDay = []; 30381 let i4; 30382 let seg; 30383 for (i4 = 0; i4 < segs.length; i4 += 1) { 30384 seg = segs[i4]; 30385 (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])).push(seg); 30386 } 30387 return segsByDay; 30388 } 30389 var css_248z4 = ':root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:"";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}'; 30390 injectStyles(css_248z4); 30391 30392
vendor: 1,272 bytes, lines 30392-30437
30392// node_modules/@fullcalendar/list/index.js 30393 var OPTION_REFINERS2 = { 30394 listDayFormat: createFalsableFormatter, 30395 listDaySideFormat: createFalsableFormatter, 30396 noEventsClassNames: identity, 30397 noEventsContent: identity, 30398 noEventsDidMount: identity, 30399 noEventsWillUnmount: identity 30400 }; 30401 function createFalsableFormatter(input) { 30402 return input === false ? null : createFormatter(input); 30403 } 30404 var index3 = createPlugin({ 30405 name: "@fullcalendar/list", 30406 optionRefiners: OPTION_REFINERS2, 30407 views: { 30408 list: { 30409 component: ListView, 30410 buttonTextKey: "list", 30411 listDayFormat: { month: "long", day: "numeric", year: "numeric" } 30412 }, 30413 listDay: { 30414 type: "list", 30415 duration: { days: 1 }, 30416 listDayFormat: { weekday: "long" } 30417 }, 30418 listWeek: { 30419 type: "list", 30420 duration: { weeks: 1 }, 30421 listDayFormat: { weekday: "long" }, 30422 listDaySideFormat: { month: "long", day: "numeric", year: "numeric" } 30423 }, 30424 listMonth: { 30425 type: "list", 30426 duration: { month: 1 }, 30427 listDaySideFormat: { weekday: "long" } 30428 }, 30429 listYear: { 30430 type: "list", 30431 duration: { year: 1 }, 30432 listDaySideFormat: { weekday: "long" } 30433 } 30434 } 30435 }); 30436 30437
30437// app/javascript/controllers/bookings_calendar_controller.js 30438 var bookings_calendar_controller_default = class extends Controller { 30439 connect() { 30440 let daily = new Calendar(this.element, { 30441 plugins: [index, index2, index3], 30442 initialView: "timeGridWeek", 30443 headerToolbar: { 30444 left: "prev", 30445 center: "title", 30446 right: "next" 30447 }, 30448 eventClick: function(info) { 30449 if (info.event.url) { 30450 window.open(info.event.url); 30451 return false; 30452 } 30453 }, 30454 events: this.eventsValue, 30455 businessHours: this.businessHoursValue 30456 }); 30457 daily.render(); 30458 } 30459 }; 30460 __publicField(bookings_calendar_controller_default, "values", { 30461 businessHours: Array, 30462 events: Array 30463 }); 30464 30465
30465// app/javascript/controllers/bootstrap_modal_controller.js 30466 var bootstrap_modal_controller_default = class extends Controller { 30467 connect() { 30468 this.modal = new bootstrap.Modal(this.element, { 30469 keyboard: false 30470 }); 30471 this.modal.show(); 30472 } 30473 disconnect() { 30474 this.modal.dispose(); 30475 } 30476 }; 30477 30478
30478// app/javascript/controllers/browser_location_controller.js 30479 var browser_location_controller_default = class extends Controller { 30480 connect() { 30481 if (navigator.geolocation) { 30482 navigator.geolocation.getCurrentPosition( 30483 this.handlePosition.bind(this), 30484 this.handleError.bind(this) 30485 ); 30486 } 30487 } 30488 handlePosition(position) { 30489 const lat = position.coords.latitude; 30490 const lng = position.coords.longitude; 30491 document.cookie = `user_lat=${lat};path=/`; 30492 document.cookie = `user_lng=${lng};path=/`; 30493 } 30494 handleError(error2) { 30495 console.log("Geolocation error:", error2); 30496 } 30497 }; 30498 __publicField(browser_location_controller_default, "targets", ["lat", "lng"]); 30499 30500
30500// app/javascript/controllers/call_to_action_controller.js 30501 var call_to_action_controller_default = class extends Controller { 30502 navigate() { 30503 const selectedOption = this.dropdownTarget.options[this.dropdownTarget.selectedIndex]; 30504 const url = selectedOption.value; 30505 window.open(url, "_blank").focus(); 30506 } 30507 }; 30508 __publicField(call_to_action_controller_default, "targets", ["dropdown", "button"]); 30509 30510
30510// app/javascript/controllers/cat_grid_switch_controller.js 30511 var cat_grid_switch_controller_default = class extends Controller { 30512 connect() { 30513 } 30514 toggle(event2) { 30515 const isGrid = event2.currentTarget.classList.contains("gridview"); 30516 this.element.classList.toggle("gridview", isGrid); 30517 this.switchTargets.forEach((switchEl) => { 30518 switchEl.querySelector(".gridview").classList.toggle("active", isGrid); 30519 switchEl.querySelector(".rowview").classList.toggle("active", !isGrid); 30520 }); 30521 } 30522 }; 30523 __publicField(cat_grid_switch_controller_default, "targets", ["switch"]); 30524 30525
30525// app/javascript/controllers/charges_toggle_controller.js 30526 var charges_toggle_controller_default = class extends Controller { 30527 toggle() { 30528 this.sectionTargets.forEach((e4) => { 30529 e4.classList.toggle("hidden"); 30530 }); 30531 } 30532 }; 30533 __publicField(charges_toggle_controller_default, "targets", ["section"]); 30534 30535
30535// app/javascript/controllers/checkbox_controller.js 30536 var checkbox_controller_default = class extends Controller { 30537 connect() { 30538 let checkboxes = document.querySelectorAll("input[type=checkbox]"); 30539 const checkSpan = '<span class="checkmark"></span>'; 30540 checkboxes.forEach((box) => { 30541 const next = box.nextSibling; 30542 if (!(next && next.nodeType === 1 && next.classList.contains("checkmark"))) { 30543 box.insertAdjacentHTML("afterend", checkSpan); 30544 } 30545 }); 30546 } 30547 }; 30548 30549
30549// app/javascript/controllers/checkbox_field_controller.js 30550 var checkbox_field_controller_default = class extends Controller { 30551 connect() { 30552 this.inputTextReplaceLoad(); 30553 this.inputTextReplaceChange(); 30554 } 30555 open() { 30556 this.modalTarget.classList.add("open"); 30557 } 30558 close() { 30559 this.modalTarget.classList.remove("open"); 30560 } 30561 inputTextReplaceLoad() { 30562 let i4 = 0; 30563 let checkboxes = this.element.querySelectorAll("input[type=checkbox]"); 30564 checkboxes.forEach((box) => { 30565 let text = box.closest("label").innerText; 30566 if (box.checked) { 30567 i4++; 30568 if (i4 > 1) { 30569 this.labelTarget.innerText = "Multiple"; 30570 } else if (i4 == 1) { 30571 this.labelTarget.innerText = text; 30572 } 30573 } 30574 ; 30575 }); 30576 } 30577 inputTextReplaceChange() { 30578 let checkboxes = this.element.querySelectorAll("input[type=checkbox]"); 30579 let i4 = 0; 30580 checkboxes.forEach((box) => { 30581 let text = box.closest("label").innerText; 30582 box.addEventListener("change", () => { 30583 if (box.checked) { 30584 i4++; 30585 if (i4 > 1) { 30586 this.labelTarget.innerText = "Multiple"; 30587 } else if (i4 == 1) { 30588 this.labelTarget.innerText = text; 30589 } 30590 } else if (!box.checked) { 30591 if (i4 > 0) { 30592 i4--; 30593 } 30594 if (i4 > 1) { 30595 this.labelTarget.innerText = "Multiple"; 30596 } else if (i4 <= 1) { 30597 let x5 = 0; 30598 checkboxes.forEach((box2) => { 30599 let text2 = box2.closest("label").innerText; 30600 if (box2.checked) { 30601 x5++; 30602 this.labelTarget.innerText = text2; 30603 } 30604 }); 30605 if (x5 == 0) { 30606 this.labelTarget.innerText = "Any"; 30607 } 30608 } 30609 } 30610 }); 30611 }); 30612 } 30613 }; 30614 __publicField(checkbox_field_controller_default, "targets", ["label", "modal"]); 30615 30616
30616// app/javascript/controllers/cms/bookings/booking_reason_toggle_controller.js 30617 var booking_reason_toggle_controller_default = class extends Controller { 30618 connect() { 30619 this.showHideOtherReasonInput(); 30620 } 30621 showHideOtherReasonInput() { 30622 const selectedOption = this.reasonSelectTarget.options[this.reasonSelectTarget.selectedIndex]; 30623 const reasonRequired = selectedOption.dataset.reasonRequired === "true"; 30624 this.otherReasonInputTarget.required = reasonRequired; 30625 this.otherReasonInputTarget.parentElement.hidden = !reasonRequired; 30626 } 30627 }; 30628 __publicField(booking_reason_toggle_controller_default, "targets", ["reasonSelect", "otherReasonInput", "manualConfirmationInput"]); 30629 30630
30630// app/javascript/controllers/cms/ongoing_toggle_controller.js 30631 var ongoing_toggle_controller_default = class extends Controller { 30632 connect() { 30633 } 30634 toggle(event2) { 30635 if (this.ongoingTarget.checked) { 30636 this.endInputsTarget.classList.add("hidden"); 30637 } else { 30638 this.endInputsTarget.classList.remove("hidden"); 30639 } 30640 } 30641 }; 30642 __publicField(ongoing_toggle_controller_default, "targets", ["ongoing", "endInputs"]); 30643 30644
30644// app/javascript/controllers/cms_booking_add_date_controller.js 30645 var cms_booking_add_date_controller_default = class extends Controller { 30646 connect() { 30647 this.addDateBooleanTarget.value = ""; 30648 } 30649 activate() { 30650 this.addDateBooleanTarget.value = "1"; 30651 } 30652 }; 30653 __publicField(cms_booking_add_date_controller_default, "targets", ["addDateBoolean"]); 30654 30655
30655// app/javascript/controllers/cms_booking_form_controller.js 30656 var cms_booking_form_controller_default = class extends Controller { 30657 checkdate() { 30658 this.checkdateTarget.value = "true"; 30659 } 30660 checkDateSubmit() { 30661 this.checkDateSubmitTarget.click(); 30662 } 30663 update() { 30664 const dateParts = this.dateInputTarget.value.split("/"); 30665 if (dateParts.length !== 3) { 30666 return; 30667 } 30668 const day = parseInt(dateParts[0], 10); 30669 const month = parseInt(dateParts[1], 10) - 1; 30670 const year = parseInt(dateParts[2], 10); 30671 var date = new Date(year, month, day); 30672 if (isNaN(date.getTime())) { 30673 date = null; 30674 } 30675 this.updateMonthlyInputLabel(date); 30676 this.updateYearlyInputLabel(date); 30677 } 30678 updateMonthlyInputLabel(date) { 30679 if (!date) { 30680 this.monthlyInputLabelTarget.innerHTML = "monthly"; 30681 return; 30682 } 30683 const [weekdayIndex, ordinalNumber] = this.weekdayAndOrdinal(date); 30684 const weekday = date.toLocaleString("default", { weekday: "long" }); 30685 this.monthlyInputLabelTarget.innerHTML = `Monthly on the ${ordinalNumber} ${weekday}`; 30686 } 30687 updateYearlyInputLabel(date) { 30688 if (!date) { 30689 this.yearlyInputLabelTarget.innerHTML = "Annually"; 30690 return; 30691 } 30692 var month = date.toLocaleString("default", { month: "long" }); 30693 var day = date.getDate(); 30694 this.yearlyInputLabelTarget.innerHTML = `Annually on ${month} ${day}`; 30695 } 30696 ordinalInWords(ordinalNumber) { 30697 const suffixes = ["th", "st", "nd", "rd"]; 30698 const suffixIndex = ordinalNumber % 100; 30699 return ordinalNumber + (suffixes[(suffixIndex - 20) % 10] || suffixes[suffixIndex] || suffixes[0]); 30700 } 30701 weekdayAndOrdinal(date) { 30702 const weekdayIndex = date.getDay(); 30703 let count = 0; 30704 for (let i4 = 1; i4 <= date.getDate(); i4++) { 30705 const tempDate = new Date(date.getFullYear(), date.getMonth(), i4); 30706 if (tempDate.getDay() === weekdayIndex) { 30707 count++; 30708 } 30709 } 30710 const ordinalNumber = this.ordinalInWords(count); 30711 return [weekdayIndex, ordinalNumber]; 30712 } 30713 }; 30714 __publicField(cms_booking_form_controller_default, "targets", [ 30715 "checkdate", 30716 "checkDateSubmit", 30717 "dateInput", 30718 "monthlyInputLabel", 30719 "yearlyInputLabel" 30720 ]); 30721 30722
30722// app/javascript/controllers/cms_booking_repeat_controller.js 30723 var cms_booking_repeat_controller_default = class extends Controller { 30724 checkdate() { 30725 this.checkdateTarget.value = "true"; 30726 } 30727 checkDateSubmit() { 30728 this.checkDateSubmitTarget.click(); 30729 } 30730 connect() { 30731 } 30732 select(event2) { 30733 this.hideAll(); 30734 let val = event2.srcElement.value; 30735 if (val == "none" || val == "") { 30736 return; 30737 } else { 30738 this.showCheckDate(); 30739 this.showEndMethods(); 30740 if (val == "specified_days") { 30741 this.showDays(); 30742 } else if (val == "custom") { 30743 this.showRepeats(); 30744 this.showDays(); 30745 } else { 30746 return; 30747 } 30748 } 30749 } 30750 hideAll() { 30751 this.hideCheckDateDiv(); 30752 this.hideDays(); 30753 this.hideEndMethods(); 30754 this.hideRepeats(); 30755 } 30756 hideCheckDateDiv() { 30757 this.checkdatedivTarget.classList.add("hidden"); 30758 } 30759 hideDays() { 30760 this.daysTarget.classList.add("hidden"); 30761 } 30762 hideEndMethods() { 30763 this.endMethodsTarget.classList.add("hidden"); 30764 } 30765 hideRepeats() { 30766 this.repeatsTarget.classList.add("hidden"); 30767 } 30768 showCheckDate() { 30769 this.checkdatedivTarget.classList.remove("hidden"); 30770 } 30771 showDays() { 30772 this.daysTarget.classList.remove("hidden"); 30773 } 30774 showEndMethods() { 30775 this.endMethodsTarget.classList.remove("hidden"); 30776 } 30777 showRepeats() { 30778 this.repeatsTarget.classList.remove("hidden"); 30779 } 30780 }; 30781 __publicField(cms_booking_repeat_controller_default, "targets", ["checkdate", "checkdatediv", "checkDateSubmit", "input", "days", "endMethods", "repeats", "occurs"]); 30782 30783
30783// app/javascript/controllers/cms_booking_specified_repeat_switcher_controller.js 30784 var cms_booking_specified_repeat_switcher_controller_default = class extends Controller { 30785 connect() { 30786 this.toggle(); 30787 } 30788 switchToRepeat() { 30789 this.specifiedTarget.classList.add("hidden"); 30790 this.repeatTarget.classList.remove("hidden"); 30791 } 30792 switchToSpecified() { 30793 this.repeatTarget.classList.add("hidden"); 30794 this.specifiedTarget.classList.remove("hidden"); 30795 } 30796 toggle() { 30797 if (this.repeatBookingsToggleTarget.checked) { 30798 this.switchToRepeat(); 30799 } else if (this.specifiedBookingsToggleTarget.checked) { 30800 this.switchToSpecified(); 30801 } else { 30802 this.specifiedTarget.classList.add("hidden"); 30803 this.repeatTarget.classList.add("hidden"); 30804 } 30805 } 30806 }; 30807 __publicField(cms_booking_specified_repeat_switcher_controller_default, "targets", [ 30808 "repeat", 30809 "repeatBookingsToggle", 30810 "specified", 30811 "specifiedBookingsToggle" 30812 ]); 30813 30814
30814// app/javascript/controllers/cms_business_booking_switcher_controller.js 30815 var cms_business_booking_switcher_controller_default = class extends Controller { 30816 connect() { 30817 } 30818 switchToBusiness() { 30819 this.address1LabelTarget.innerHTML = '<abbr title="required">*</abbr>Company address line 1'; 30820 this.address2LabelTarget.innerHTML = "Company address line 2"; 30821 this.companyNameLabelTarget.classList.add("required"); 30822 this.companyNameLabelTarget.classList.remove("optional"); 30823 this.companyNameLabelTarget.innerHTML = '<abbr title="required">*</abbr>Company name'; 30824 this.companyNameTarget.required = true; 30825 this.companyNameTarget.classList.add("required"); 30826 this.companyNameTarget.classList.remove("optional"); 30827 this.companyNameWrapperTarget.classList.remove("hidden"); 30828 this.companyNameWrapperTarget.classList.add("required"); 30829 this.companyNumberTarget.classList.remove("hidden"); 30830 this.firstNameLabelTarget.innerHTML = '<abbr title="required">*</abbr>Contact first name'; 30831 this.lastNameLabelTarget.innerHTML = '<abbr title="required">*</abbr>Contact last name'; 30832 this.vatNumberTarget.classList.remove("hidden"); 30833 } 30834 switchToPersonal() { 30835 this.address1LabelTarget.innerHTML = '<abbr title="required">*</abbr>Address line 1'; 30836 this.address2LabelTarget.innerHTML = "Address line 2"; 30837 this.companyNameLabelTarget.classList.remove("required"); 30838 this.companyNameLabelTarget.classList.add("optional"); 30839 this.companyNameLabelTarget.innerHTML = "Company name"; 30840 this.companyNameTarget.required = false; 30841 this.companyNameTarget.classList.remove("required"); 30842 this.companyNameTarget.classList.add("optional"); 30843 this.companyNameWrapperTarget.classList.remove("required"); 30844 this.companyNameWrapperTarget.classList.add("hidden"); 30845 this.companyNumberTarget.classList.add("hidden"); 30846 this.firstNameLabelTarget.innerHTML = '<abbr title="required">*</abbr>First name'; 30847 this.lastNameLabelTarget.innerHTML = '<abbr title="required">*</abbr>Last name'; 30848 this.vatNumberTarget.classList.add("hidden"); 30849 } 30850 toggle() { 30851 if (this.businessRadioTarget.checked) { 30852 this.switchToPersonal(); 30853 } else { 30854 this.switchToBusiness(); 30855 } 30856 } 30857 }; 30858 __publicField(cms_business_booking_switcher_controller_default, "targets", [ 30859 "address1Label", 30860 "address2Label", 30861 "businessRadio", 30862 "companyName", 30863 "companyNameLabel", 30864 "companyNameWrapper", 30865 "companyNumber", 30866 "firstNameLabel", 30867 "lastNameLabel", 30868 "vatNumber" 30869 ]); 30870 30871
30871// app/javascript/controllers/cms_item_groups_controller.js 30872 var import_moment = __toESM(require_moment()); 30873 var import_pikaday2 = __toESM(require_pikaday()); 30874 var cms_item_groups_controller_default = class extends Controller { 30875 connect() { 30876 this.pikaInit("timetables_item_group_start_date"); 30877 this.pikaInit("timetables_item_group_end_date"); 30878 (0, import_moment.default)().format(); 30879 this.classScheduleSelectListener(); 30880 this.endSelectListener(); 30881 } 30882 pikaInit(fieldID) { 30883 const pika = new import_pikaday2.default({ 30884 field: document.getElementById(fieldID), 30885 format: "DD MM YYYY", 30886 minDate: new Date(), 30887 toString(date) { 30888 const day = date.getDate(); 30889 const month = date.getMonth() + 1; 30890 const year = date.getFullYear(); 30891 return `${day}/${month}/${year}`; 30892 } 30893 }); 30894 pika.getMoment(); 30895 } 30896 classScheduleSelectListener() { 30897 const classSheduleSelect = document.querySelector("#timetables_item_group_repeat_type"); 30898 let daysRadios = [...document.querySelectorAll(".item-group__days")]; 30899 let repeatSelect = document.querySelector(".item-group__class-repeats"); 30900 classSheduleSelect.addEventListener("change", () => { 30901 if (classSheduleSelect.value == "specified_days") { 30902 daysRadios.forEach((e4) => { 30903 this.show(e4); 30904 }); 30905 this.hide(repeatSelect); 30906 } else if (classSheduleSelect.value == "none" || classSheduleSelect.value == "" || classSheduleSelect.value == "daily") { 30907 daysRadios.forEach((e4) => { 30908 this.hide(e4); 30909 }); 30910 this.hide(repeatSelect); 30911 } else { 30912 daysRadios.forEach((e4) => { 30913 this.hide(e4); 30914 }); 30915 this.show(repeatSelect); 30916 } 30917 }); 30918 } 30919 endSelectListener() { 30920 let endSelect = document.querySelector("#timetables_item_group_end_method"); 30921 let endDateField = document.querySelector(".item-group__end-date"); 30922 let endSessions = document.querySelector(".item-group__end-sessions"); 30923 endSelect.addEventListener("change", () => { 30924 if (endSelect.value == "end_count") { 30925 this.show(endSessions); 30926 this.hide(endDateField); 30927 } else if (endSelect.value == "none" || endSelect.value == "") { 30928 this.hide(endSessions); 30929 this.hide(endDateField); 30930 } else { 30931 this.hide(endSessions); 30932 this.show(endDateField); 30933 } 30934 }); 30935 } 30936 hide(element) { 30937 element.classList.add("hidden"); 30938 element.classList.remove("show"); 30939 } 30940 show(element) { 30941 element.classList.add("show"); 30942 element.classList.remove("hidden"); 30943 } 30944 }; 30945 __publicField(cms_item_groups_controller_default, "targets", []); 30946 30947
30947// app/javascript/controllers/cms_location_role_controller.js 30948 var cms_location_role_controller_default = class extends Controller { 30949 connect() { 30950 } 30951 updateLocationIds(event2) { 30952 const selectedLocationType = this.locationTypeSelectTarget.value; 30953 const options = this.locationIdSelectTarget.querySelectorAll("option"); 30954 options.forEach((option) => { 30955 option.classList.add("hidden"); 30956 if (selectedLocationType === "Borough" && option.dataset.type === "Borough" || selectedLocationType === "Venue" && option.dataset.type === "Venue") { 30957 option.classList.remove("hidden"); 30958 } else if (selectedLocationType === "" && option.label === " ") { 30959 option.classList.remove("hidden"); 30960 } 30961 if (this.roleSelectTarget.selectedOptions[0].dataset.global === "true") { 30962 option.classList.add("hidden"); 30963 } 30964 }); 30965 if (this.roleSelectTarget.selectedOptions[0].dataset.global === "true") { 30966 this.locationIdSelectTarget.selectedIndex = -1; 30967 } 30968 if (this.locationTypeSelectTarget.value === "Borough" && this.locationIdSelectTarget.selectedOptions[0] && this.locationIdSelectTarget.selectedOptions[0].dataset.type !== "Borough") { 30969 this.locationIdSelectTarget.selectedIndex = -1; 30970 } 30971 if (this.locationTypeSelectTarget.value === "Venue" && this.locationIdSelectTarget.selectedOptions[0] && this.locationIdSelectTarget.selectedOptions[0].dataset.type !== "Venue") { 30972 this.locationIdSelectTarget.selectedIndex = -1; 30973 } 30974 } 30975 updateLocationType(event2) { 30976 const selectedRole = this.roleSelectTarget.selectedOptions[0]; 30977 const options = this.locationTypeSelectTarget.querySelectorAll("option"); 30978 options.forEach( 30979 (option) => { 30980 option.classList.add("hidden"); 30981 if (selectedRole.dataset.global === "true") { 30982 this.locationTypeSelectTarget.selectedIndex = -1; 30983 if (option.label == " ") { 30984 option.classList.remove("hidden"); 30985 } 30986 } else if (selectedRole.dataset.borough == "true" && option.dataset.type == "Borough" || selectedRole.dataset.venue == "true" && option.dataset.type == "Venue") { 30987 option.classList.remove("hidden"); 30988 } 30989 } 30990 ); 30991 this.updateLocationIds(); 30992 } 30993 }; 30994 __publicField(cms_location_role_controller_default, "targets", [ 30995 "locationIdSelect", 30996 "locationTypeSelect", 30997 "roleSelect" 30998 ]); 30999 31000
31000// app/javascript/controllers/cms_spinner_controller.js 31001 var cms_spinner_controller_default = class extends Controller { 31002 connect() { 31003 this.spinnerTarget.classList.add("hidden"); 31004 this.clickListener = this.showSpinner.bind(this); 31005 this.element.addEventListener("click", this.clickListener); 31006 } 31007 disconnect() { 31008 this.element.removeEventListener("click", this.clickListener); 31009 } 31010 showSpinner(event2) { 31011 this.originalTarget.classList.add("hidden"); 31012 this.spinnerTarget.classList.remove("hidden"); 31013 const listItem = this.element.closest("li"); 31014 if (listItem) { 31015 listItem.classList.add("disabled"); 31016 } 31017 } 31018 }; 31019 __publicField(cms_spinner_controller_default, "targets", ["original", "spinner"]); 31020 31021
31021// app/javascript/controllers/cms_user_form_controller.js 31022 var cms_user_form_controller_default = class extends Controller { 31023 connect() { 31024 } 31025 updateHomeSites(event2) { 31026 let boroughId = this.boroughTarget.selectedOptions[0].value; 31027 fetch(`/library/api/boroughs/${boroughId}/prism_home_sites`).then((response) => { 31028 if (!response.ok) { 31029 throw new Error(`Network response was not ok (status: ${response.status})`); 31030 } 31031 return response.json(); 31032 }).then((data) => { 31033 this.homeSiteTarget.innerHTML = ""; 31034 data.forEach((location2) => { 31035 let option = document.createElement("option"); 31036 option.value = location2.id; 31037 option.text = location2.prism_id; 31038 this.homeSiteTarget.appendChild(option); 31039 }); 31040 }).catch((error2) => { 31041 console.error("Error fetching or parsing data:", error2); 31042 }); 31043 } 31044 }; 31045 __publicField(cms_user_form_controller_default, "targets", ["borough", "homeSite"]); 31046 31047
31047// app/javascript/controllers/dura_pick_controller.js 31048 var dura_pick_controller_default = class extends Controller { 31049 connect() { 31050 const inputField = this.element.querySelector(".booking_duration"); 31051 if (inputField) { 31052 inputField.addEventListener("click", () => { 31053 this.open(); 31054 }); 31055 } 31056 this.buttonHandler(); 31057 this.inputTarget.addEventListener("change", () => { 31058 this.labelChange(); 31059 }); 31060 } 31061 buttonHandler() { 31062 const buttons = this.element.querySelectorAll(".duration_btn"); 31063 buttons.forEach((button) => { 31064 button.addEventListener("click", () => { 31065 if (button.classList.contains("active")) { 31066 button.classList.remove("active"); 31067 } else if (!button.classList.contains("unav")) { 31068 buttons.forEach((button2) => { 31069 button2.classList.remove("active"); 31070 }); 31071 button.classList.toggle("active"); 31072 } 31073 this.labelChange(); 31074 }); 31075 const dataValue = button.getAttribute("data-value"); 31076 const text = button.innerText; 31077 if (this.inputTarget.value == dataValue) { 31078 this.dummyTarget.innerText = text; 31079 } 31080 }); 31081 } 31082 labelChange() { 31083 const selectedText = this.element.querySelector(".duration_btn.active").innerText; 31084 this.dummyTarget.innerText = selectedText; 31085 } 31086 open() { 31087 this.modalTarget.classList.add("open"); 31088 } 31089 close() { 31090 this.modalTarget.classList.remove("open"); 31091 } 31092 submit() { 31093 const selectedVal = this.element.querySelector(".duration_btn.active").getAttribute("data-value"); 31094 this.inputTarget.value = selectedVal; 31095 this.modalTarget.classList.remove("open"); 31096 } 31097 }; 31098 __publicField(dura_pick_controller_default, "targets", ["modal", "input", "dummy"]); 31099 31100
31100// app/javascript/controllers/duration_picker_controller.js 31101 var duration_picker_controller_default = class extends Controller { 31102 connect() { 31103 } 31104 close() { 31105 this.modalTarget.classList.remove("open"); 31106 } 31107 open() { 31108 this.modalTarget.classList.add("open"); 31109 } 31110 select(event2) { 31111 this.durationBtnTargets.forEach((button) => { 31112 button.classList.remove("active"); 31113 }); 31114 event2.currentTarget.classList.add("active"); 31115 this.inputTarget.value = event2.currentTarget.dataset.value; 31116 this.dummyTarget.innerText = event2.currentTarget.innerText; 31117 } 31118 }; 31119 __publicField(duration_picker_controller_default, "targets", ["modal", "input", "dummy", "durationBtn"]); 31120 31121
31121// app/javascript/controllers/facet_clear_controller.js 31122 var facet_clear_controller_default = class extends Controller { 31123 clear() { 31124 this.element.querySelectorAll("input[type=radio]").forEach((radio) => { 31125 radio.checked = false; 31126 }); 31127 this.element.closest("form").requestSubmit(); 31128 } 31129 }; 31130 31131
31131// app/javascript/controllers/faqs_controller.js 31132 var faqs_controller_default = class extends Controller { 31133 connect() { 31134 } 31135 toggle() { 31136 this.spanTarget.classList.toggle("open"); 31137 this.textTarget.classList.toggle("open"); 31138 } 31139 }; 31140 __publicField(faqs_controller_default, "targets", ["text", "span"]); 31141 31142
31142// app/javascript/controllers/filter_expand_controller.js 31143 var filter_expand_controller_default = class extends Controller { 31144 toggle() { 31145 this.moreTarget.hidden = !this.moreTarget.hidden; 31146 this.toggleTarget.textContent = this.moreTarget.hidden ? "Show all" : "Show fewer"; 31147 } 31148 }; 31149 __publicField(filter_expand_controller_default, "targets", ["more", "toggle"]); 31150 31151
31151// app/javascript/controllers/flash_notice_controller.js 31152 var flash_notice_controller_default = class extends Controller { 31153 connect() { 31154 if (this.hasFlashTarget) { 31155 setTimeout(() => { 31156 this.flashClose(); 31157 }, 4e3); 31158 } 31159 } 31160 flashClose() { 31161 const flash = this.hasFlashTarget ? this.flashTarget : this.element; 31162 if (flash) { 31163 flash.style.opacity = "0"; 31164 setTimeout(() => { 31165 flash.innerHTML = null; 31166 }, 1e3); 31167 } 31168 } 31169 close(event2) { 31170 event2.preventDefault(); 31171 this.flashClose(); 31172 } 31173 }; 31174 __publicField(flash_notice_controller_default, "targets", ["flash"]); 31175 31176
31176// app/javascript/controllers/headexpd_controller.js 31177 var headexpd_controller_default = class extends Controller { 31178 connect() { 31179 } 31180 expand() { 31181 this.headTarget.classList.toggle("open"); 31182 document.querySelector("#primary-navigation").classList.toggle("open"); 31183 this.btnTarget.classList.toggle("open"); 31184 } 31185 }; 31186 __publicField(headexpd_controller_default, "targets", ["head", "btn"]); 31187 31188
31188// app/javascript/controllers/hello_controller.js 31189 var hello_controller_default = class extends Controller { 31190 connect() { 31191 this.element.textContent = "Hello World!"; 31192 } 31193 }; 31194 31195
31195// app/javascript/controllers/hover_sync_controller.js 31196 var hover_sync_controller_default = class extends Controller { 31197 connect() { 31198 this.attachHoverListeners(this.itemTargets); 31199 this.observeDOM(); 31200 } 31201 disconnect() { 31202 if (this.observer) 31203 this.observer.disconnect(); 31204 } 31205 observeDOM() { 31206 this.observer = new MutationObserver((mutations) => { 31207 mutations.forEach((mutation) => { 31208 mutation.addedNodes.forEach((node) => { 31209 if (node.nodeType !== Node.ELEMENT_NODE) 31210 return; 31211 const candidates = node.matches?.("[data-hover-id]") ? [node] : node.querySelectorAll?.("[data-hover-id]") || []; 31212 this.attachHoverListeners(candidates); 31213 }); 31214 }); 31215 }); 31216 this.observer.observe(this.element, { 31217 childList: true, 31218 subtree: true 31219 }); 31220 } 31221 attachHoverListeners(elements) { 31222 elements.forEach((el) => { 31223 if (el.dataset.hoverBound) 31224 return; 31225 el.dataset.hoverBound = "true"; 31226 el.addEventListener("mouseenter", this.hoverIn); 31227 el.addEventListener("mouseleave", this.hoverOut); 31228 }); 31229 } 31230 hoverIn = (event2) => { 31231 const hoverId = event2.currentTarget.dataset.hoverId; 31232 this.toggleHighlight(hoverId, true); 31233 }; 31234 hoverOut = (event2) => { 31235 const hoverId = event2.currentTarget.dataset.hoverId; 31236 this.toggleHighlight(hoverId, false); 31237 }; 31238 toggleHighlight(hoverId, shouldHighlight) { 31239 document.querySelectorAll(`[data-hover-id="${hoverId}"]`).forEach((el) => { 31240 if (el.nodeName === "TR") { 31241 el.classList.toggle("table-info", shouldHighlight); 31242 } 31243 if (el.nodeName === "LI") { 31244 el.classList.toggle("list-group-item-info", shouldHighlight); 31245 } 31246 }); 31247 } 31248 }; 31249 __publicField(hover_sync_controller_default, "targets", ["item"]); 31250 31251
31251// app/javascript/controllers/jump_to_page_controller.js 31252 var jump_to_page_controller_default = class extends Controller { 31253 navigate() { 31254 const selectedOption = this.dropdownTarget.options[this.dropdownTarget.selectedIndex]; 31255 const url = selectedOption.value; 31256 window.open(url, "_self").focus(); 31257 } 31258 }; 31259 __publicField(jump_to_page_controller_default, "targets", ["dropdown", "button"]); 31260 31261
31261// app/javascript/controllers/listmodal_controller.js 31262 var listmodal_controller_default = class extends Controller { 31263 connect() { 31264 const content = this.element.querySelector(".wishlist-modal__content"); 31265 this.element.addEventListener("click", (e4) => { 31266 if (!content.contains(e4.target)) { 31267 this.element.classList.remove("open"); 31268 } 31269 }); 31270 } 31271 }; 31272 31273
31273// app/javascript/controllers/mob_sidebar_controller.js 31274 var mob_sidebar_controller_default = class extends Controller { 31275 connect() { 31276 } 31277 toggle() { 31278 this.element.classList.toggle("open"); 31279 } 31280 }; 31281 31282
31282// app/javascript/controllers/mobile_burger_controller.js 31283 var mobile_burger_controller_default = class extends Controller { 31284 connect() { 31285 const nav = document.querySelector("nav.primary-navigation"); 31286 this.element.addEventListener("click", () => { 31287 nav.classList.toggle("open"); 31288 }); 31289 } 31290 }; 31291 31292
31292// app/javascript/controllers/mobile_search_controller.js 31293 var mobile_search_controller_default = class extends Controller { 31294 connect() { 31295 } 31296 toggle() { 31297 const search = document.querySelector(".catalogue-header-search__form"); 31298 search.classList.toggle("open"); 31299 } 31300 }; 31301 31302
31302// app/javascript/controllers/nav_dropdown_controller.js 31303 var nav_dropdown_controller_default = class extends Controller { 31304 toggle(e4) { 31305 let menus = document.querySelectorAll(".header-nav-list__item.open"); 31306 menus.forEach((menu) => { 31307 if (menu != this.element) { 31308 menu.classList.remove("open"); 31309 } 31310 }); 31311 this.element.classList.toggle("open"); 31312 } 31313 }; 31314 31315
31315// app/javascript/controllers/opayo_payment_attempt_form_controller.js 31316 var opayo_payment_attempt_form_controller_default = class extends Controller { 31317 connect() { 31318 this.javaEnabledTarget.value = navigator.javaEnabled(); 31319 this.languageTarget.value = navigator.language; 31320 this.colorDepthTarget.value = screen.colorDepth; 31321 this.screenHeightTarget.value = screen.height; 31322 this.screenWidthTarget.value = screen.width; 31323 this.timeZoneTarget.value = this.getTimezoneOffsetInMinutes(); 31324 } 31325 getTimezoneOffsetInMinutes() { 31326 var date = new Date(); 31327 var offsetInMinutes = date.getTimezoneOffset(); 31328 return offsetInMinutes; 31329 } 31330 formatCardNumber() { 31331 var cardNumber = this.cardNumberTarget.value; 31332 cardNumber = cardNumber.replace(/[^0-9\s]/g, ""); 31333 cardNumber = cardNumber.replace(/^\s+/, ""); 31334 this.cardNumberTarget.value = cardNumber.replace(/\s/g, "").replace(/(\d{4})/g, "$1 ").trim(); 31335 } 31336 submit(event2) { 31337 event2.preventDefault(); 31338 const cardIdentifierTarget = this.cardIdentifierTarget; 31339 const formTarget = this.formTarget; 31340 const controller = this; 31341 sagepayOwnForm({ 31342 merchantSessionKey: this.merchantSessionKeyTarget.value 31343 }).tokeniseCardDetails({ 31344 cardDetails: { 31345 cardholderName: this.cardholderNameTarget.value, 31346 cardNumber: this.cardNumberTarget.value.replace(/\s/g, ""), 31347 expiryDate: this.expiryDateTarget.value, 31348 securityCode: this.securityCodeTarget.value 31349 }, 31350 onTokenised: function(result) { 31351 if (result.success) { 31352 cardIdentifierTarget.value = result.cardIdentifier; 31353 formTarget.submit(); 31354 } else { 31355 controller.updateErrorMessagesFromResult(result); 31356 } 31357 } 31358 }); 31359 } 31360 updateErrorMessagesFromResult(json) { 31361 json.errors.forEach((error2) => { 31362 if (error2.message == "The card number length is invalid") { 31363 this.cardNumberErrorTarget.classList.remove("hidden"); 31364 this.cardNumberErrorTarget.innerText = error2.message; 31365 this.cardNumberTarget.classList.add("error.message"); 31366 } else if (error2.message == "The card number is invalid") { 31367 this.cardNumberErrorTarget.classList.remove("hidden"); 31368 this.cardNumberErrorTarget.innerText = error2.message; 31369 this.cardNumberTarget.classList.add("error.message"); 31370 } else if (error2.message == "The expiry date is invalid") { 31371 this.expiryDateErrorTarget.classList.remove("hidden"); 31372 this.expiryDateErrorTarget.innerText = error2.message; 31373 this.expiryDateTarget.classList.add("error.message"); 31374 } else if (error2.message == "The security code length is invalid") { 31375 this.securityCodeErrorTarget.classList.remove("hidden"); 31376 this.securityCodeErrorTarget.innerText = error2.message; 31377 this.securityCodeTarget.classList.add("error.message"); 31378 } else if (error2.message == "The security code is invalid") { 31379 this.securityCodeErrorTarget.classList.remove("hidden"); 31380 this.securityCodeErrorTarget.innerText = error2.message; 31381 this.securityCodeTarget.classList.add("error.message"); 31382 } 31383 }); 31384 } 31385 updateSubmitButtonStatus() { 31386 const cardNumberError = !this.cardNumberErrorTarget.classList.contains("hidden"); 31387 const expiryDateError = !this.expiryDateErrorTarget.classList.contains("hidden"); 31388 const securityCodeError = !this.securityCodeErrorTarget.classList.contains("hidden"); 31389 const cardholderNameBlank = this.cardholderNameTarget.value.length == 0; 31390 const cardNumberBlank = this.cardNumberTarget.value.length == 0; 31391 const expiryDateBlank = this.expiryDateTarget.value.length == 0; 31392 const securityCodeBlank = this.securityCodeTarget.value.length == 0; 31393 const disabledStatus = cardNumberError || expiryDateError || securityCodeError || cardholderNameBlank || cardNumberBlank || expiryDateBlank || securityCodeBlank; 31394 this.submitButtonTarget.disabled = disabledStatus; 31395 if (disabledStatus) { 31396 this.submitButtonTarget.classList.add("disabled"); 31397 } else { 31398 this.submitButtonTarget.classList.remove("disabled"); 31399 } 31400 } 31401 validateCardholderName() { 31402 const cardholderName = this.cardholderNameTarget.value; 31403 this.cardholderNameTarget.value = cardholderName.replace(/[^a-zA-Z0-9Ã Ã¡Ã¢Ã¤Ã£Ã¥Ä ÄÄÄèéêëÄįìÃîïÅÅòóôöõøùúûüųūÿýżźñçÄšžÃÃÃÃÃà ÄÄÄÄÄÃÃÃÃÃÃÃÃÄ®ÅÅÃÃÃÃÃÃÃÃÃÃŲŪŸÃŻŹÃÃÃÅÃÄŠŽâð /\\&]{1,50}$/g, ""); 31404 this.updateSubmitButtonStatus(); 31405 } 31406 validateCardNumber() { 31407 this.formatCardNumber(); 31408 const cardNumber = this.cardNumberTarget.value; 31409 if (cardNumber.length < 12 || cardNumber.length > 19 || (cardNumber.match(/\s/g) || []).length > 3) { 31410 this.cardNumberErrorTarget.classList.remove("hidden"); 31411 this.cardNumberErrorTarget.innerText = "Please enter a valid card number"; 31412 this.cardNumberTarget.classList.add("error"); 31413 } else { 31414 this.cardNumberErrorTarget.classList.add("hidden"); 31415 this.cardNumberErrorTarget.innerText = ""; 31416 this.cardNumberTarget.classList.remove("error"); 31417 } 31418 this.updateSubmitButtonStatus(); 31419 } 31420 validateExpiryDate() { 31421 const expiryDate = this.expiryDateTarget.value; 31422 this.expiryDateTarget.value = expiryDate.replace(/[^0-9]/g, "");
31423 var month = parseInt(expiryDate.substring(0, 2)); 31424 var year = parseInt(expiryDate.substring(2, 4)); 31425 month -= 1; 31426 year += 2e3; 31427 if (month > 11) { 31428 this.expiryDateErrorTarget.classList.remove("hidden"); 31429 this.expiryDateErrorTarget.innerText = "Please enter a valid expiry date"; 31430 this.expiryDateTarget.classList.add("error"); 31431 this.updateSubmitButtonStatus(); 31432 return; 31433 } 31434 const expiry = new Date(year, month, 1); 31435 const now3 = new Date(); 31436 if (expiry < now3) { 31437 this.expiryDateErrorTarget.classList.remove("hidden"); 31438 this.expiryDateErrorTarget.innerText = "Please enter a valid expiry date"; 31439 this.expiryDateTarget.classList.add("error"); 31440 } else { 31441 this.expiryDateErrorTarget.classList.add("hidden"); 31442 this.expiryDateErrorTarget.innerText = ""; 31443 this.expiryDateTarget.classList.remove("error"); 31444 } 31445 this.updateSubmitButtonStatus(); 31446 } 31447 validateSecurityCode() { 31448 const securityCode = this.securityCodeTarget.value; 31449 this.securityCodeTarget.value = securityCode.replace(/[^0-9]/g, ""); 31450 if (securityCode.length < 3 || securityCode.length > 4) { 31451 this.securityCodeErrorTarget.classList.remove("hidden"); 31452 this.securityCodeErrorTarget.innerText = "Please enter a valid security code"; 31453 this.securityCodeTarget.classList.add("error"); 31454 } else { 31455 this.securityCodeErrorTarget.classList.add("hidden"); 31456 this.securityCodeErrorTarget.innerText = ""; 31457 this.securityCodeTarget.classList.remove("error"); 31458 } 31459 this.updateSubmitButtonStatus(); 31460 } 31461 }; 31462 __publicField(opayo_payment_attempt_form_controller_default, "targets", ["cardholderName", "cardholderNameError", "cardIdentifier", "cardNumber", "cardNumberError", "colorDepth", "expiryDate", "expiryDateError", "form", "javaEnabled", "language", "merchantSessionKey", "securityCode", "securityCodeError", "screenHeight", "screenWidth", "submitButton", "timeZone"]); 31463 31464
31464// app/javascript/controllers/opening_times_controller.js 31465 var opening_times_controller_default = class extends Controller { 31466 toggle() { 31467 this.element.classList.toggle("closed"); 31468 this.buttonTarget.innerText = this.element.classList.contains("closed") ? "See all opening times and contact details" : "Hide all opening times and contact details"; 31469 } 31470 }; 31471 __publicField(opening_times_controller_default, "targets", ["button"]); 31472 31473
31473// app/javascript/controllers/pikaday_init_controller.js 31474 var import_pikaday3 = __toESM(require_pikaday()); 31475 var pikaday_init_controller_default = class extends Controller { 31476 connect() { 31477 this.element.autocomplete = "off"; 31478 let mindate = null; 31479 if (this.mindateValue.trim() !== "") { 31480 const [day, month, year] = this.mindateValue.split("/"); 31481 mindate = new Date(`${year}-${month}-${day}`); 31482 } else { 31483 mindate = new Date(); 31484 } 31485 const picker = new import_pikaday3.default({ 31486 field: this.element, 31487 format: "DD/MM/YYYY", 31488 minDate: mindate, 31489 maxDate: new Date(2100, 1, 1), 31490 firstDay: 1 31491 }); 31492 } 31493 }; 31494 __publicField(pikaday_init_controller_default, "values", { 31495 mindate: String 31496 }); 31497 31498
31498// app/javascript/controllers/progsteps_controller.js 31499 var progsteps_controller_default = class extends Controller { 31500 connect() { 31501 const tick = '<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="xicons"><path id="Vector" d="M20 6.5L9 17.5L4 12.5" stroke="#1B365C" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></g></svg>'; 31502 const dot = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="6" cy="6" r="6" fill="#1B365C"/></svg>'; 31503 const roundals = document.querySelectorAll(".signup-progress__roundal"); 31504 roundals.forEach((roundal) => { 31505 let status = roundal.innerText.replace(/ /g, ""); 31506 if (status == "checked") { 31507 roundal.classList.add("checked"); 31508 roundal.innerHTML = tick; 31509 } else if (status == "current") { 31510 roundal.classList.add("current"); 31511 roundal.innerHTML = dot; 31512 } else if (status == "future") { 31513 roundal.classList.add("future"); 31514 roundal.innerHTML = dot; 31515 } 31516 }); 31517 } 31518 }; 31519 31520
31520// app/javascript/controllers/recite_me_controller.js 31521 var recite_me_controller_default = class extends Controller { 31522 loadReciteMe() { 31523 loadService(); 31524 } 31525 }; 31526 31527
31527// app/javascript/controllers/region_london_controller.js 31528 var region_london_controller_default = class extends Controller { 31529 connect() { 31530 this.london(); 31531 this.textReplaceLoad(); 31532 this.textReplaceChange(); 31533 } 31534 london() { 31535 let ldnAll = this.element.querySelector(".london-all"); 31536 let ldnSingles = this.element.querySelectorAll(".london-single"); 31537 ldnAll.addEventListener("change", () => { 31538 if (ldnAll.checked == true) { 31539 ldnSingles.forEach((e4) => { 31540 e4.checked = true; 31541 }); 31542 } else if (ldnAll.checked == false) { 31543 ldnSingles.forEach((e4) => { 31544 e4.checked = false; 31545 }); 31546 } 31547 }); 31548 ldnSingles.forEach((e4) => { 31549 e4.addEventListener("change", () => { 31550 const ldnChecked = [...ldnSingles].every((input) => input.checked == true); 31551 if (ldnChecked) { 31552 ldnAll.checked = true; 31553 } else if (!ldnChecked) { 31554 ldnAll.checked = false; 31555 } 31556 }); 31557 }); 31558 } 31559 textReplaceLoad() { 31560 let londonLabels = [...this.element.querySelectorAll("label:has(input[data-london=true])")]; 31561 let otherLabels = [...this.element.querySelectorAll("label:has(input[data-london=false])")]; 31562 let otherLabelsChecked = []; 31563 let londonLabelsChecked = [];
31564 otherLabels.forEach((e4) => { 31565 if (e4.querySelector("input").checked == true) { 31566 otherLabelsChecked.push(e4); 31567 } 31568 }); 31569 londonLabels.forEach((e4) => { 31570 if (e4.querySelector("input").checked == true) { 31571 londonLabelsChecked.push(e4); 31572 } 31573 }); 31574 const londonChecked = londonLabels.some((label) => label.querySelector("input").checked == true); 31575 const otherChecked = otherLabels.some((label) => label.querySelector("input").checked == true); 31576 if (londonChecked && otherChecked) { 31577 this.labelTarget.innerText = "Multiple"; 31578 } else if (!londonChecked && otherChecked) { 31579 if (otherLabelsChecked.length == 1) { 31580 this.labelTarget.innerText = otherLabelsChecked[0].innerText; 31581 } else if (otherLabelsChecked.length > 1) { 31582 this.labelTarget.innerText = "Multiple"; 31583 } 31584 } else if (londonChecked && !otherChecked) { 31585 if (londonLabelsChecked.length == 1) { 31586 this.labelTarget.innerText = londonLabelsChecked[0].innerText; 31587 } else if (londonLabelsChecked.length > 1) { 31588 this.labelTarget.innerText = "London"; 31589 } 31590 } else if (!londonChecked && !otherChecked) { 31591 this.labelTarget.innerText = "Any"; 31592 } 31593 } 31594 textReplaceChange() { 31595 let checkboxes = this.element.querySelectorAll("input[type=checkbox]"); 31596 checkboxes.forEach((box) => { 31597 box.addEventListener("change", () => { 31598 this.textReplaceLoad(); 31599 }); 31600 }); 31601 } 31602 }; 31603 __publicField(region_london_controller_default, "targets", ["label"]); 31604 31605
31605// app/javascript/controllers/result_avail_controller.js 31606 var result_avail_controller_default = class extends Controller { 31607 connect() { 31608 const container = this.modalTarget.querySelector(".availa-modal-container"); 31609 document.addEventListener("click", (e4) => { 31610 if (!this.btnTarget.contains(e4.target) && !container.contains(e4.target)) { 31611 this.close(); 31612 } 31613 }); 31614 } 31615 toggle() { 31616 this.modalTarget.classList.toggle("open"); 31617 } 31618 close() { 31619 this.modalTarget.classList.remove("open"); 31620 } 31621 }; 31622 __publicField(result_avail_controller_default, "targets", ["btn", "modal"]); 31623 31624
vendor: 22,899 bytes, lines 31624-32241
31624// node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.esm.js 31625 var linkClickSelector = "a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]"; 31626 var buttonClickSelector = { 31627 selector: "button[data-remote]:not([form]), button[data-confirm]:not([form])", 31628 exclude: "form button" 31629 }; 31630 var inputChangeSelector = "select[data-remote], input[data-remote], textarea[data-remote]"; 31631 var formSubmitSelector = "form:not([data-turbo=true])"; 31632 var formInputClickSelector = "form:not([data-turbo=true]) input[type=submit], form:not([data-turbo=true]) input[type=image], form:not([data-turbo=true]) button[type=submit], form:not([data-turbo=true]) button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])"; 31633 var formDisableSelector = "input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled"; 31634 var formEnableSelector = "input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled"; 31635 var fileInputSelector = "input[name][type=file]:not([disabled])"; 31636 var linkDisableSelector = "a[data-disable-with], a[data-disable]"; 31637 var buttonDisableSelector = "button[data-remote][data-disable-with], button[data-remote][data-disable]"; 31638 var nonce = null; 31639 var loadCSPNonce = () => { 31640 const metaTag = document.querySelector("meta[name=csp-nonce]"); 31641 return nonce = metaTag && metaTag.content; 31642 }; 31643 var cspNonce = () => nonce || loadCSPNonce(); 31644 var m4 = Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector; 31645 var matches = function(element, selector) { 31646 if (selector.exclude) { 31647 return m4.call(element, selector.selector) && !m4.call(element, selector.exclude); 31648 } else { 31649 return m4.call(element, selector); 31650 } 31651 }; 31652 var EXPANDO = "_ujsData"; 31653 var getData = (element, key) => element[EXPANDO] ? element[EXPANDO][key] : void 0; 31654 var setData = function(element, key, value) { 31655 if (!element[EXPANDO]) { 31656 element[EXPANDO] = {}; 31657 } 31658 return element[EXPANDO][key] = value; 31659 }; 31660 var $4 = (selector) => Array.prototype.slice.call(document.querySelectorAll(selector)); 31661 var isContentEditable = function(element) { 31662 var isEditable = false; 31663 do { 31664 if (element.isContentEditable) { 31665 isEditable = true; 31666 break; 31667 } 31668 element = element.parentElement; 31669 } while (element); 31670 return isEditable; 31671 }; 31672 var csrfToken = () => { 31673 const meta = document.querySelector("meta[name=csrf-token]"); 31674 return meta && meta.content; 31675 }; 31676 var csrfParam = () => { 31677 const meta = document.querySelector("meta[name=csrf-param]"); 31678 return meta && meta.content; 31679 }; 31680 var CSRFProtection = (xhr) => { 31681 const token = csrfToken(); 31682 if (token) { 31683 return xhr.setRequestHeader("X-CSRF-Token", token); 31684 } 31685 }; 31686 var refreshCSRFTokens = () => { 31687 const token = csrfToken(); 31688 const param = csrfParam(); 31689 if (token && param) { 31690 return $4('form input[name="' + param + '"]').forEach((input) => input.value = token); 31691 } 31692 }; 31693 var AcceptHeaders = { 31694 "*": "*/*", 31695 text: "text/plain", 31696 html: "text/html", 31697 xml: "application/xml, text/xml", 31698 json: "application/json, text/javascript", 31699 script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" 31700 }; 31701 var ajax = (options) => { 31702 options = prepareOptions(options); 31703 var xhr = createXHR(options, function() { 31704 const response = processResponse(xhr.response != null ? xhr.response : xhr.responseText, xhr.getResponseHeader("Content-Type")); 31705 if (Math.floor(xhr.status / 100) === 2) { 31706 if (typeof options.success === "function") { 31707 options.success(response, xhr.statusText, xhr); 31708 } 31709 } else { 31710 if (typeof options.error === "function") { 31711 options.error(response, xhr.statusText, xhr); 31712 } 31713 } 31714 return typeof options.complete === "function" ? options.complete(xhr, xhr.statusText) : void 0; 31715 }); 31716 if (options.beforeSend && !options.beforeSend(xhr, options)) { 31717 return false; 31718 } 31719 if (xhr.readyState === XMLHttpRequest.OPENED) { 31720 return xhr.send(options.data); 31721 } 31722 }; 31723 var prepareOptions = function(options) { 31724 options.url = options.url || location.href; 31725 options.type = options.type.toUpperCase(); 31726 if (options.type === "GET" && options.data) { 31727 if (options.url.indexOf("?") < 0) { 31728 options.url += "?" + options.data; 31729 } else { 31730 options.url += "&" + options.data; 31731 } 31732 } 31733 if (!(options.dataType in AcceptHeaders)) { 31734 options.dataType = "*"; 31735 } 31736 options.accept = AcceptHeaders[options.dataType]; 31737 if (options.dataType !== "*") { 31738 options.accept += ", */*; q=0.01"; 31739 } 31740 return options; 31741 }; 31742 var createXHR = function(options, done) { 31743 const xhr = new XMLHttpRequest(); 31744 xhr.open(options.type, options.url, true); 31745 xhr.setRequestHeader("Accept", options.accept); 31746 if (typeof options.data === "string") { 31747 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 31748 } 31749 if (!options.crossDomain) { 31750 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 31751 CSRFProtection(xhr); 31752 } 31753 xhr.withCredentials = !!options.withCredentials; 31754 xhr.onreadystatechange = function() { 31755 if (xhr.readyState === XMLHttpRequest.DONE) { 31756 return done(xhr); 31757 } 31758 }; 31759 return xhr; 31760 }; 31761 var processResponse = function(response, type) { 31762 if (typeof response === "string" && typeof type === "string") { 31763 if (type.match(/\bjson\b/)) { 31764 try { 31765 response = JSON.parse(response); 31766 } catch (error2) { 31767 } 31768 } else if (type.match(/\b(?:java|ecma)script\b/)) { 31769 const script = document.createElement("script"); 31770 script.setAttribute("nonce", cspNonce()); 31771 script.text = response; 31772 document.head.appendChild(script).parentNode.removeChild(script); 31773 } else if (type.match(/\b(xml|html|svg)\b/)) { 31774 const parser = new DOMParser(); 31775 type = type.replace(/;.+/, ""); 31776 try { 31777 response = parser.parseFromString(response, type); 31778 } catch (error1) { 31779 } 31780 } 31781 } 31782 return response; 31783 }; 31784 var href = (element) => element.href; 31785 var isCrossDomain = function(url) { 31786 const originAnchor = document.createElement("a"); 31787 originAnchor.href = location.href; 31788 const urlAnchor = document.createElement("a"); 31789 try { 31790 urlAnchor.href = url; 31791 return !((!urlAnchor.protocol || urlAnchor.protocol === ":") && !urlAnchor.host || originAnchor.protocol + "//" + originAnchor.host === urlAnchor.protocol + "//" + urlAnchor.host); 31792 } catch (e4) { 31793 return true; 31794 } 31795 }; 31796 var preventDefault2; 31797 var { CustomEvent: CustomEvent2 } = window; 31798 if (typeof CustomEvent2 !== "function") { 31799 CustomEvent2 = function(event2, params) { 31800 const evt = document.createEvent("CustomEvent"); 31801 evt.initCustomEvent(event2, params.bubbles, params.cancelable, params.detail); 31802 return evt; 31803 }; 31804 CustomEvent2.prototype = window.Event.prototype; 31805 ({ preventDefault: preventDefault2 } = CustomEvent2.prototype); 31806 CustomEvent2.prototype.preventDefault = function() { 31807 const result = preventDefault2.call(this); 31808 if (this.cancelable && !this.defaultPrevented) { 31809 Object.defineProperty(this, "defaultPrevented", { 31810 get() { 31811 return true; 31812 } 31813 }); 31814 } 31815 return result; 31816 }; 31817 } 31818 var fire = (obj, name, data) => { 31819 const event2 = new CustomEvent2(name, { 31820 bubbles: true, 31821 cancelable: true, 31822 detail: data 31823 }); 31824 obj.dispatchEvent(event2); 31825 return !event2.defaultPrevented; 31826 }; 31827 var stopEverything = (e4) => { 31828 fire(e4.target, "ujs:everythingStopped"); 31829 e4.preventDefault(); 31830 e4.stopPropagation(); 31831 e4.stopImmediatePropagation(); 31832 }; 31833 var delegate = (element, selector, eventType, handler) => element.addEventListener(eventType, function(e4) { 31834 let { target } = e4; 31835 while (!!(target instanceof Element) && !matches(target, selector)) { 31836 target = target.parentNode; 31837 } 31838 if (target instanceof Element && handler.call(target, e4) === false) { 31839 e4.preventDefault(); 31840 e4.stopPropagation(); 31841 } 31842 }); 31843 var toArray2 = (e4) => Array.prototype.slice.call(e4); 31844 var serializeElement = (element, additionalParam) => { 31845 let inputs = [element]; 31846 if (matches(element, "form")) { 31847 inputs = toArray2(element.elements); 31848 } 31849 const params = []; 31850 inputs.forEach(function(input) { 31851 if (!input.name || input.disabled) { 31852 return; 31853 } 31854 if (matches(input, "fieldset[disabled] *")) { 31855 return; 31856 } 31857 if (matches(input, "select")) { 31858 toArray2(input.options).forEach(function(option) { 31859 if (option.selected) { 31860 params.push({ 31861 name: input.name, 31862 value: option.value 31863 }); 31864 } 31865 }); 31866 } else if (input.checked || ["radio", "checkbox", "submit"].indexOf(input.type) === -1) { 31867 params.push({ 31868 name: input.name, 31869 value: input.value 31870 }); 31871 } 31872 }); 31873 if (additionalParam) { 31874 params.push(additionalParam); 31875 } 31876 return params.map(function(param) { 31877 if (param.name) { 31878 return `${encodeURIComponent(param.name)}=${encodeURIComponent(param.value)}`; 31879 } else { 31880 return param; 31881 } 31882 }).join("&"); 31883 }; 31884 var formElements = (form, selector) => { 31885 if (matches(form, "form")) { 31886 return toArray2(form.elements).filter((el) => matches(el, selector)); 31887 } else { 31888 return toArray2(form.querySelectorAll(selector)); 31889 } 31890 }; 31891 var handleConfirmWithRails = (rails) => function(e4) { 31892 if (!allowAction(this, rails)) { 31893 stopEverything(e4); 31894 } 31895 }; 31896 var confirm2 = (message, element) => window.confirm(message); 31897 var allowAction = function(element, rails) { 31898 let callback; 31899 const message = element.getAttribute("data-confirm"); 31900 if (!message) { 31901 return true; 31902 } 31903 let answer = false; 31904 if (fire(element, "confirm")) { 31905 try { 31906 answer = rails.confirm(message, element); 31907 } catch (error2) { 31908 } 31909 callback = fire(element, "confirm:complete", [answer]); 31910 } 31911 return answer && callback; 31912 }; 31913 var handleDisabledElement = function(e4) { 31914 const element = this; 31915 if (element.disabled) { 31916 stopEverything(e4); 31917 } 31918 }; 31919 var enableElement = (e4) => { 31920 let element; 31921 if (e4 instanceof Event) { 31922 if (isXhrRedirect(e4)) { 31923 return; 31924 } 31925 element = e4.target; 31926 } else { 31927 element = e4; 31928 } 31929 if (isContentEditable(element)) { 31930 return; 31931 } 31932 if (matches(element, linkDisableSelector)) { 31933 return enableLinkElement(element); 31934 } else if (matches(element, buttonDisableSelector) || matches(element, formEnableSelector)) { 31935 return enableFormElement(element); 31936 } else if (matches(element, formSubmitSelector)) { 31937 return enableFormElements(element); 31938 } 31939 }; 31940 var disableElement = (e4) => { 31941 const element = e4 instanceof Event ? e4.target : e4; 31942 if (isContentEditable(element)) { 31943 return; 31944 } 31945 if (matches(element, linkDisableSelector)) { 31946 return disableLinkElement(element); 31947 } else if (matches(element, buttonDisableSelector) || matches(element, formDisableSelector)) { 31948 return disableFormElement(element); 31949 } else if (matches(element, formSubmitSelector)) { 31950 return disableFormElements(element); 31951 } 31952 }; 31953 var disableLinkElement = function(element) { 31954 if (getData(element, "ujs:disabled")) { 31955 return; 31956 } 31957 const replacement = element.getAttribute("data-disable-with"); 31958 if (replacement != null) { 31959 setData(element, "ujs:enable-with", element.innerHTML); 31960 element.innerHTML = replacement; 31961 } 31962 element.addEventListener("click", stopEverything); 31963 return setData(element, "ujs:disabled", true); 31964 }; 31965 var enableLinkElement = function(element) { 31966 const originalText = getData(element, "ujs:enable-with"); 31967 if (originalText != null) { 31968 element.innerHTML = originalText; 31969 setData(element, "ujs:enable-with", null); 31970 } 31971 element.removeEventListener("click", stopEverything); 31972 return setData(element, "ujs:disabled", null); 31973 }; 31974 var disableFormElements = (form) => formElements(form, formDisableSelector).forEach(disableFormElement); 31975 var disableFormElement = function(element) { 31976 if (getData(element, "ujs:disabled")) { 31977 return; 31978 } 31979 const replacement = element.getAttribute("data-disable-with"); 31980 if (replacement != null) { 31981 if (matches(element, "button")) { 31982 setData(element, "ujs:enable-with", element.innerHTML); 31983 element.innerHTML = replacement; 31984 } else { 31985 setData(element, "ujs:enable-with", element.value); 31986 element.value = replacement; 31987 } 31988 } 31989 element.disabled = true; 31990 return setData(element, "ujs:disabled", true); 31991 }; 31992 var enableFormElements = (form) => formElements(form, formEnableSelector).forEach((element) => enableFormElement(element)); 31993 var enableFormElement = function(element) { 31994 const originalText = getData(element, "ujs:enable-with"); 31995 if (originalText != null) { 31996 if (matches(element, "button")) { 31997 element.innerHTML = originalText; 31998 } else { 31999 element.value = originalText; 32000 } 32001 setData(element, "ujs:enable-with", null); 32002 } 32003 element.disabled = false; 32004 return setData(element, "ujs:disabled", null); 32005 }; 32006 var isXhrRedirect = function(event2) { 32007 const xhr = event2.detail ? event2.detail[0] : void 0; 32008 return xhr && xhr.getResponseHeader("X-Xhr-Redirect"); 32009 }; 32010 var handleMethodWithRails = (rails) => function(e4) { 32011 const link = this; 32012 const method = link.getAttribute("data-method"); 32013 if (!method) { 32014 return; 32015 } 32016 if (isContentEditable(this)) { 32017 return; 32018 } 32019 const href2 = rails.href(link); 32020 const csrfToken$1 = csrfToken(); 32021 const csrfParam$1 = csrfParam(); 32022 const form = document.createElement("form"); 32023 let formContent = `<input name='_method' value='${method}' type='hidden' />`; 32024 if (csrfParam$1 && csrfToken$1 && !isCrossDomain(href2)) { 32025 formContent += `<input name='${csrfParam$1}' value='${csrfToken$1}' type='hidden' />`; 32026 } 32027 formContent += '<input type="submit" />'; 32028 form.method = "post"; 32029 form.action = href2; 32030 form.target = link.target; 32031 form.innerHTML = formContent; 32032 form.style.display = "none"; 32033 document.body.appendChild(form); 32034 form.querySelector('[type="submit"]').click(); 32035 stopEverything(e4); 32036 }; 32037 var isRemote = function(element) { 32038 const value = element.getAttribute("data-remote"); 32039 return value != null && value !== "false"; 32040 }; 32041 var handleRemoteWithRails = (rails) => function(e4) { 32042 let data, method, url; 32043 const element = this; 32044 if (!isRemote(element)) { 32045 return true; 32046 } 32047 if (!fire(element, "ajax:before")) { 32048 fire(element, "ajax:stopped"); 32049 return false; 32050 } 32051 if (isContentEditable(element)) { 32052 fire(element, "ajax:stopped"); 32053 return false; 32054 } 32055 const withCredentials = element.getAttribute("data-with-credentials"); 32056 const dataType = element.getAttribute("data-type") || "script"; 32057 if (matches(element, formSubmitSelector)) { 32058 const button = getData(element, "ujs:submit-button"); 32059 method = getData(element, "ujs:submit-button-formmethod") || element.getAttribute("method") || "get"; 32060 url = getData(element, "ujs:submit-button-formaction") || element.getAttribute("action") || location.href; 32061 if (method.toUpperCase() === "GET") { 32062 url = url.replace(/\?.*$/, ""); 32063 } 32064 if (element.enctype === "multipart/form-data") { 32065 data = new FormData(element); 32066 if (button != null) { 32067 data.append(button.name, button.value); 32068 } 32069 } else { 32070 data = serializeElement(element, button); 32071 } 32072 setData(element, "ujs:submit-button", null); 32073 setData(element, "ujs:submit-button-formmethod", null); 32074 setData(element, "ujs:submit-button-formaction", null); 32075 } else if (matches(element, buttonClickSelector) || matches(element, inputChangeSelector)) { 32076 method = element.getAttribute("data-method"); 32077 url = element.getAttribute("data-url"); 32078 data = serializeElement(element, element.getAttribute("data-params")); 32079 } else { 32080 method = element.getAttribute("data-method"); 32081 url = rails.href(element); 32082 data = element.getAttribute("data-params"); 32083 } 32084 ajax({ 32085 type: method || "GET", 32086 url, 32087 data, 32088 dataType, 32089 beforeSend(xhr, options) { 32090 if (fire(element, "ajax:beforeSend", [xhr, options])) { 32091 return fire(element, "ajax:send", [xhr]); 32092 } else { 32093 fire(element, "ajax:stopped"); 32094 return false; 32095 } 32096 }, 32097 success(...args) { 32098 return fire(element, "ajax:success", args); 32099 }, 32100 error(...args) { 32101 return fire(element, "ajax:error", args); 32102 }, 32103 complete(...args) { 32104 return fire(element, "ajax:complete", args); 32105 }, 32106 crossDomain: isCrossDomain(url), 32107 withCredentials: withCredentials != null && withCredentials !== "false" 32108 }); 32109 stopEverything(e4); 32110 }; 32111 var formSubmitButtonClick = function(e4) { 32112 const button = this; 32113 const { form } = button; 32114 if (!form) { 32115 return; 32116 } 32117 if (button.name) { 32118 setData(form, "ujs:submit-button", { 32119 name: button.name, 32120 value: button.value 32121 }); 32122 } 32123 setData(form, "ujs:formnovalidate-button", button.formNoValidate); 32124 setData(form, "ujs:submit-button-formaction", button.getAttribute("formaction")); 32125 return setData(form, "ujs:submit-button-formmethod", button.getAttribute("formmethod")); 32126 }; 32127 var preventInsignificantClick = function(e4) { 32128 const link = this; 32129 const method = (link.getAttribute("data-method") || "GET").toUpperCase(); 32130 const data = link.getAttribute("data-params"); 32131 const metaClick = e4.metaKey || e4.ctrlKey; 32132 const insignificantMetaClick = metaClick && method === "GET" && !data; 32133 const nonPrimaryMouseClick = e4.button != null && e4.button !== 0; 32134 if (nonPrimaryMouseClick || insignificantMetaClick) { 32135 e4.stopImmediatePropagation(); 32136 } 32137 }; 32138 var Rails = { 32139 $: $4, 32140 ajax, 32141 buttonClickSelector, 32142 buttonDisableSelector, 32143 confirm: confirm2, 32144 cspNonce, 32145 csrfToken, 32146 csrfParam, 32147 CSRFProtection, 32148 delegate, 32149 disableElement, 32150 enableElement, 32151 fileInputSelector, 32152 fire, 32153 formElements, 32154 formEnableSelector, 32155 formDisableSelector, 32156 formInputClickSelector, 32157 formSubmitButtonClick, 32158 formSubmitSelector, 32159 getData, 32160 handleDisabledElement, 32161 href, 32162 inputChangeSelector, 32163 isCrossDomain, 32164 linkClickSelector, 32165 linkDisableSelector, 32166 loadCSPNonce, 32167 matches, 32168 preventInsignificantClick, 32169 refreshCSRFTokens, 32170 serializeElement, 32171 setData, 32172 stopEverything 32173 }; 32174 var handleConfirm = handleConfirmWithRails(Rails); 32175 Rails.handleConfirm = handleConfirm; 32176 var handleMethod = handleMethodWithRails(Rails); 32177 Rails.handleMethod = handleMethod; 32178 var handleRemote = handleRemoteWithRails(Rails); 32179 Rails.handleRemote = handleRemote; 32180 var start3 = function() { 32181 if (window._rails_loaded) { 32182 throw new Error("rails-ujs has already been loaded!"); 32183 } 32184 window.addEventListener("pageshow", function() { 32185 $4(formEnableSelector).forEach(function(el) { 32186 if (getData(el, "ujs:disabled")) { 32187 enableElement(el); 32188 } 32189 }); 32190 $4(linkDisableSelector).forEach(function(el) { 32191 if (getData(el, "ujs:disabled")) { 32192 enableElement(el); 32193 } 32194 }); 32195 }); 32196 delegate(document, linkDisableSelector, "ajax:complete", enableElement); 32197 delegate(document, linkDisableSelector, "ajax:stopped", enableElement); 32198 delegate(document, buttonDisableSelector, "ajax:complete", enableElement); 32199 delegate(document, buttonDisableSelector, "ajax:stopped", enableElement); 32200 delegate(document, linkClickSelector, "click", preventInsignificantClick); 32201 delegate(document, linkClickSelector, "click", handleDisabledElement); 32202 delegate(document, linkClickSelector, "click", handleConfirm); 32203 delegate(document, linkClickSelector, "click", disableElement); 32204 delegate(document, linkClickSelector, "click", handleRemote); 32205 delegate(document, linkClickSelector, "click", handleMethod); 32206 delegate(document, buttonClickSelector, "click", preventInsignificantClick); 32207 delegate(document, buttonClickSelector, "click", handleDisabledElement); 32208 delegate(document, buttonClickSelector, "click", handleConfirm); 32209 delegate(document, buttonClickSelector, "click", disableElement); 32210 delegate(document, buttonClickSelector, "click", handleRemote); 32211 delegate(document, inputChangeSelector, "change", handleDisabledElement); 32212 delegate(document, inputChangeSelector, "change", handleConfirm); 32213 delegate(document, inputChangeSelector, "change", handleRemote); 32214 delegate(document, formSubmitSelector, "submit", handleDisabledElement); 32215 delegate(document, formSubmitSelector, "submit", handleConfirm); 32216 delegate(document, formSubmitSelector, "submit", handleRemote); 32217 delegate(document, formSubmitSelector, "submit", (e4) => setTimeout(() => disableElement(e4), 13)); 32218 delegate(document, formSubmitSelector, "ajax:send", disableElement); 32219 delegate(document, formSubmitSelector, "ajax:complete", enableElement); 32220 delegate(document, formInputClickSelector, "click", preventInsignificantClick); 32221 delegate(document, formInputClickSelector, "click", handleDisabledElement); 32222 delegate(document, formInputClickSelector, "click", handleConfirm); 32223 delegate(document, formInputClickSelector, "click", formSubmitButtonClick); 32224 document.addEventListener("DOMContentLoaded", refreshCSRFTokens); 32225 document.addEventListener("DOMContentLoaded", loadCSPNonce); 32226 return window._rails_loaded = true; 32227 }; 32228 Rails.start = start3; 32229 if (typeof jQuery !== "undefined" && jQuery && jQuery.ajax) { 32230 if (jQuery.rails) { 32231 throw new Error("If you load both jquery_ujs and rails-ujs, use rails-ujs only."); 32232 } 32233 jQuery.rails = Rails; 32234 jQuery.ajaxPrefilter(function(options, originalOptions, xhr) { 32235 if (!options.crossDomain) { 32236 return CSRFProtection(xhr); 32237 } 32238 }); 32239 } 32240 32241
32241// app/javascript/controllers/rich_text_table_controller.js 32242 var lang = no.config.lang; 32243 var rich_text_table_controller_default = class extends Controller { 32244 connect() { 32245 no.config.lang.table = "Table"; 32246 var tableButtonHTML = `<button type="button" class="trix-button trix-button--icon trix-button--icon-table" data-action="rich-text-table#attachTable" title="Attach Table" tabindex="-1">${lang.table}</button>`; 32247 var fileToolsElement = this.element.querySelector("[data-trix-button-group=block-tools]"); 32248 fileToolsElement.insertAdjacentHTML("beforeend", tableButtonHTML); 32249 } 32250 attachTable(event2) { 32251 Rails.ajax({ 32252 url: `/library/tables`, 32253 type: "post", 32254 success: this.insertTable.bind(this) 32255 }); 32256 } 32257 insertTable(tableAttachment) { 32258 this.attachment = new no.Attachment(tableAttachment); 32259 this.element.querySelector("trix-editor").editor.insertAttachment(this.attachment); 32260 this.element.focus(); 32261 } 32262 }; 32263 32264
32264// app/javascript/controllers/room_card_click_handler_controller.js 32265 var room_card_click_handler_controller_default = class extends Controller { 32266 buttonClick() { 32267 this.buttonTarget.click(); 32268 } 32269 }; 32270 __publicField(room_card_click_handler_controller_default, "targets", ["button"]); 32271 32272
32272// app/javascript/controllers/search_filter_controller.js 32273 var search_filter_controller_default = class extends Controller { 32274 connect() { 32275 this.searchTarget.addEventListener("input", this.filter.bind(this)); 32276 this.filter(); 32277 } 32278 filter() { 32279 const searchTerm = this.searchTarget.value.toLowerCase(); 32280 this.checkboxTargets.forEach((checkbox) => { 32281 const checkboxContainer = checkbox.closest(".checkbox"); 32282 const label = checkboxContainer.querySelector("label").textContent.toLowerCase(); 32283 if (label.includes(searchTerm) || searchTerm === "") { 32284 checkboxContainer.style.display = ""; 32285 } else { 32286 checkboxContainer.style.display = "none"; 32287 } 32288 }); 32289 } 32290 clear(event2) { 32291 event2.preventDefault(); 32292 this.searchTarget.value = ""; 32293 this.filter(); 32294 } 32295 }; 32296 __publicField(search_filter_controller_default, "targets", ["search", "checkbox"]); 32297 32298
32298// app/javascript/controllers/select_all_controller.js 32299 var select_all_controller_default = class extends Controller { 32300 connect() { 32301 } 32302 toggleAll() { 32303 const shouldCheck = !this.allChecked(); 32304 this.checkboxTargets.forEach((checkbox) => { 32305 checkbox.checked = shouldCheck; 32306 }); 32307 this.updateButtonText(); 32308 } 32309 allChecked() { 32310 return this.checkboxTargets.every((checkbox) => checkbox.checked); 32311 } 32312 updateButtonText() { 32313 this.selectAllButtonTarget.textContent = this.allChecked() ? "Select None" : "Select All"; 32314 } 32315 }; 32316 __publicField(select_all_controller_default, "targets", ["checkbox", "selectAllButton"]); 32317 32318
32318// app/javascript/controllers/select_button_disable_controller.js 32319 var select_button_disable_controller_default = class extends Controller { 32320 connect() { 32321 this.toggleTextBoxVisibility(); 32322 this.toggleButton(); 32323 } 32324 selectChanged() { 32325 this.toggleTextBoxVisibility(); 32326 this.toggleButton(); 32327 } 32328 toggleTextBoxVisibility() { 32329 if (!this.hasTextBoxWrapperTarget) 32330 return; 32331 const selectValue = this.selectTarget.value; 32332 if (selectValue === "other" || selectValue === "Other") { 32333 this.textBoxWrapperTarget.style.display = ""; 32334 } else { 32335 this.textBoxWrapperTarget.style.display = "none"; 32336 } 32337 } 32338 toggleButton() { 32339 const selectValue = this.selectTarget.value; 32340 let disabled = !selectValue || selectValue === "0"; 32341 if (selectValue === "other" || selectValue === "Other") { 32342 const textBoxValue = this.hasTextBoxTarget ? this.textBoxTarget.value.trim() : ""; 32343 disabled = textBoxValue === ""; 32344 } 32345 if (disabled) { 32346 this.disableButton(); 32347 } else { 32348 this.enableButton(); 32349 } 32350 } 32351 enableButton() { 32352 this.buttonTarget.classList.remove("btn-disabled"); 32353 this.buttonTarget.disabled = false; 32354 } 32355 disableButton() { 32356 if (!this.buttonTarget.classList.contains("btn-disabled")) { 32357 this.buttonTarget.classList.add("btn-disabled"); 32358 } 32359 this.buttonTarget.disabled = true; 32360 } 32361 }; 32362 __publicField(select_button_disable_controller_default, "targets", ["select", "button", "textBox", "textBoxWrapper"]); 32363 32364
vendor: 1,411 bytes, lines 32364-32407
32364// node_modules/@popperjs/core/lib/index.js 32365 var lib_exports = {}; 32366 __export(lib_exports, { 32367 afterMain: () => afterMain, 32368 afterRead: () => afterRead, 32369 afterWrite: () => afterWrite, 32370 applyStyles: () => applyStyles_default, 32371 arrow: () => arrow_default, 32372 auto: () => auto, 32373 basePlacements: () => basePlacements, 32374 beforeMain: () => beforeMain, 32375 beforeRead: () => beforeRead, 32376 beforeWrite: () => beforeWrite, 32377 bottom: () => bottom, 32378 clippingParents: () => clippingParents, 32379 computeStyles: () => computeStyles_default, 32380 createPopper: () => createPopper3, 32381 createPopperBase: () => createPopper, 32382 createPopperLite: () => createPopper2, 32383 detectOverflow: () => detectOverflow, 32384 end: () => end, 32385 eventListeners: () => eventListeners_default, 32386 flip: () => flip_default, 32387 hide: () => hide_default, 32388 left: () => left, 32389 main: () => main, 32390 modifierPhases: () => modifierPhases, 32391 offset: () => offset_default, 32392 placements: () => placements, 32393 popper: () => popper, 32394 popperGenerator: () => popperGenerator, 32395 popperOffsets: () => popperOffsets_default, 32396 preventOverflow: () => preventOverflow_default, 32397 read: () => read, 32398 reference: () => reference, 32399 right: () => right, 32400 start: () => start4, 32401 top: () => top, 32402 variationPlacements: () => variationPlacements, 32403 viewport: () => viewport, 32404 write: () => write 32405 }); 32406 32407
vendor: 1,129 bytes, lines 32407-32437
32407// node_modules/@popperjs/core/lib/enums.js 32408 var top = "top"; 32409 var bottom = "bottom"; 32410 var right = "right"; 32411 var left = "left"; 32412 var auto = "auto"; 32413 var basePlacements = [top, bottom, right, left]; 32414 var start4 = "start"; 32415 var end = "end"; 32416 var clippingParents = "clippingParents"; 32417 var viewport = "viewport"; 32418 var popper = "popper"; 32419 var reference = "reference"; 32420 var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { 32421 return acc.concat([placement + "-" + start4, placement + "-" + end]); 32422 }, []); 32423 var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { 32424 return acc.concat([placement, placement + "-" + start4, placement + "-" + end]); 32425 }, []); 32426 var beforeRead = "beforeRead"; 32427 var read = "read"; 32428 var afterRead = "afterRead"; 32429 var beforeMain = "beforeMain"; 32430 var main = "main"; 32431 var afterMain = "afterMain"; 32432 var beforeWrite = "beforeWrite"; 32433 var write = "write"; 32434 var afterWrite = "afterWrite"; 32435 var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; 32436 32437
vendor: 169 bytes, lines 32437-32442
32437// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js 32438 function getNodeName(element) { 32439 return element ? (element.nodeName || "").toLowerCase() : null; 32440 } 32441 32442
vendor: 338 bytes, lines 32442-32454
32442// node_modules/@popperjs/core/lib/dom-utils/getWindow.js 32443 function getWindow(node) { 32444 if (node == null) { 32445 return window; 32446 } 32447 if (node.toString() !== "[object Window]") { 32448 var ownerDocument = node.ownerDocument; 32449 return ownerDocument ? ownerDocument.defaultView || window : window; 32450 } 32451 return node; 32452 } 32453 32454
vendor: 589 bytes, lines 32454-32471
32454// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js 32455 function isElement(node) { 32456 var OwnElement = getWindow(node).Element; 32457 return node instanceof OwnElement || node instanceof Element; 32458 } 32459 function isHTMLElement(node) { 32460 var OwnElement = getWindow(node).HTMLElement; 32461 return node instanceof OwnElement || node instanceof HTMLElement; 32462 } 32463 function isShadowRoot(node) { 32464 if (typeof ShadowRoot === "undefined") { 32465 return false; 32466 } 32467 var OwnElement = getWindow(node).ShadowRoot; 32468 return node instanceof OwnElement || node instanceof ShadowRoot; 32469 } 32470 32471
vendor: 2,121 bytes, lines 32471-32539
32471// node_modules/@popperjs/core/lib/modifiers/applyStyles.js 32472 function applyStyles(_ref) { 32473 var state = _ref.state; 32474 Object.keys(state.elements).forEach(function(name) { 32475 var style = state.styles[name] || {}; 32476 var attributes = state.attributes[name] || {}; 32477 var element = state.elements[name]; 32478 if (!isHTMLElement(element) || !getNodeName(element)) { 32479 return; 32480 } 32481 Object.assign(element.style, style); 32482 Object.keys(attributes).forEach(function(name2) { 32483 var value = attributes[name2]; 32484 if (value === false) { 32485 element.removeAttribute(name2); 32486 } else { 32487 element.setAttribute(name2, value === true ? "" : value); 32488 } 32489 }); 32490 }); 32491 } 32492 function effect(_ref2) { 32493 var state = _ref2.state; 32494 var initialStyles = { 32495 popper: { 32496 position: state.options.strategy, 32497 left: "0", 32498 top: "0", 32499 margin: "0" 32500 }, 32501 arrow: { 32502 position: "absolute" 32503 }, 32504 reference: {} 32505 }; 32506 Object.assign(state.elements.popper.style, initialStyles.popper); 32507 state.styles = initialStyles; 32508 if (state.elements.arrow) { 32509 Object.assign(state.elements.arrow.style, initialStyles.arrow); 32510 } 32511 return function() { 32512 Object.keys(state.elements).forEach(function(name) { 32513 var element = state.elements[name]; 32514 var attributes = state.attributes[name] || {}; 32515 var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); 32516 var style = styleProperties.reduce(function(style2, property) { 32517 style2[property] = ""; 32518 return style2; 32519 }, {}); 32520 if (!isHTMLElement(element) || !getNodeName(element)) { 32521 return; 32522 } 32523 Object.assign(element.style, style); 32524 Object.keys(attributes).forEach(function(attribute) { 32525 element.removeAttribute(attribute); 32526 }); 32527 }); 32528 }; 32529 } 32530 var applyStyles_default = { 32531 name: "applyStyles", 32532 enabled: true, 32533 phase: "write", 32534 fn: applyStyles, 32535 effect, 32536 requires: ["computeStyles"] 32537 }; 32538 32539
vendor: 145 bytes, lines 32539-32544
32539// node_modules/@popperjs/core/lib/utils/getBasePlacement.js 32540 function getBasePlacement(placement) { 32541 return placement.split("-")[0]; 32542 } 32543 32544
vendor: 122 bytes, lines 32544-32549
32544// node_modules/@popperjs/core/lib/utils/math.js 32545 var max = Math.max; 32546 var min = Math.min; 32547 var round = Math.round; 32548 32549
vendor: 359 bytes, lines 32549-32560
32549// node_modules/@popperjs/core/lib/utils/userAgent.js 32550 function getUAString() { 32551 var uaData = navigator.userAgentData; 32552 if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) { 32553 return uaData.brands.map(function(item) { 32554 return item.brand + "/" + item.version; 32555 }).join(" "); 32556 } 32557 return navigator.userAgent; 32558 } 32559 32560
vendor: 170 bytes, lines 32560-32565
32560// node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js 32561 function isLayoutViewport() { 32562 return !/^((?!chrome|android).)*safari/i.test(getUAString()); 32563 } 32564 32565
vendor: 1,278 bytes, lines 32565-32598
32565// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js 32566 function getBoundingClientRect(element, includeScale, isFixedStrategy) { 32567 if (includeScale === void 0) { 32568 includeScale = false; 32569 } 32570 if (isFixedStrategy === void 0) { 32571 isFixedStrategy = false; 32572 } 32573 var clientRect = element.getBoundingClientRect(); 32574 var scaleX = 1; 32575 var scaleY = 1; 32576 if (includeScale && isHTMLElement(element)) { 32577 scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1; 32578 scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1; 32579 } 32580 var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport; 32581 var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; 32582 var x5 = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; 32583 var y4 = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; 32584 var width = clientRect.width / scaleX; 32585 var height = clientRect.height / scaleY; 32586 return { 32587 width, 32588 height, 32589 top: y4, 32590 right: x5 + width, 32591 bottom: y4 + height, 32592 left: x5, 32593 x: x5, 32594 y: y4 32595 }; 32596 } 32597 32598
vendor: 519 bytes, lines 32598-32617
32598// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js 32599 function getLayoutRect(element) { 32600 var clientRect = getBoundingClientRect(element); 32601 var width = element.offsetWidth; 32602 var height = element.offsetHeight; 32603 if (Math.abs(clientRect.width - width) <= 1) { 32604 width = clientRect.width; 32605 } 32606 if (Math.abs(clientRect.height - height) <= 1) { 32607 height = clientRect.height; 32608 } 32609 return { 32610 x: element.offsetLeft, 32611 y: element.offsetTop, 32612 width, 32613 height 32614 }; 32615 } 32616 32617
vendor: 474 bytes, lines 32617-32634
32617// node_modules/@popperjs/core/lib/dom-utils/contains.js 32618 function contains(parent, child) { 32619 var rootNode = child.getRootNode && child.getRootNode(); 32620 if (parent.contains(child)) { 32621 return true; 32622 } else if (rootNode && isShadowRoot(rootNode)) { 32623 var next = child; 32624 do { 32625 if (next && parent.isSameNode(next)) { 32626 return true; 32627 } 32628 next = next.parentNode || next.host; 32629 } while (next); 32630 } 32631 return false; 32632 } 32633 32634
vendor: 169 bytes, lines 32634-32639
32634// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js 32635 function getComputedStyle2(element) { 32636 return getWindow(element).getComputedStyle(element); 32637 } 32638 32639
vendor: 176 bytes, lines 32639-32644
32639// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js 32640 function isTableElement(element) { 32641 return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; 32642 } 32643 32644
vendor: 228 bytes, lines 32644-32649
32644// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js 32645 function getDocumentElement(element) { 32646 return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement; 32647 } 32648 32649
vendor: 311 bytes, lines 32649-32657
32649// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js 32650 function getParentNode(element) { 32651 if (getNodeName(element) === "html") { 32652 return element; 32653 } 32654 return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element); 32655 } 32656 32657
vendor: 1,791 bytes, lines 32657-32699
32657// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js 32658 function getTrueOffsetParent(element) { 32659 if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") { 32660 return null; 32661 } 32662 return element.offsetParent; 32663 } 32664 function getContainingBlock(element) { 32665 var isFirefox = /firefox/i.test(getUAString()); 32666 var isIE = /Trident/i.test(getUAString()); 32667 if (isIE && isHTMLElement(element)) { 32668 var elementCss = getComputedStyle2(element); 32669 if (elementCss.position === "fixed") { 32670 return null; 32671 } 32672 } 32673 var currentNode = getParentNode(element); 32674 if (isShadowRoot(currentNode)) { 32675 currentNode = currentNode.host; 32676 } 32677 while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { 32678 var css = getComputedStyle2(currentNode); 32679 if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { 32680 return currentNode; 32681 } else { 32682 currentNode = currentNode.parentNode; 32683 } 32684 } 32685 return null; 32686 } 32687 function getOffsetParent(element) { 32688 var window2 = getWindow(element); 32689 var offsetParent = getTrueOffsetParent(element); 32690 while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") { 32691 offsetParent = getTrueOffsetParent(offsetParent); 32692 } 32693 if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) { 32694 return window2; 32695 } 32696 return offsetParent || getContainingBlock(element) || window2; 32697 } 32698 32699
vendor: 191 bytes, lines 32699-32704
32699// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js 32700 function getMainAxisFromPlacement(placement) { 32701 return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; 32702 } 32703 32704
vendor: 262 bytes, lines 32704-32713
32704// node_modules/@popperjs/core/lib/utils/within.js 32705 function within(min2, value, max2) { 32706 return max(min2, min(value, max2)); 32707 } 32708 function withinMaxClamp(min2, value, max2) { 32709 var v4 = within(min2, value, max2); 32710 return v4 > max2 ? max2 : v4; 32711 } 32712 32713
vendor: 185 bytes, lines 32713-32723
32713// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js 32714 function getFreshSideObject() { 32715 return { 32716 top: 0, 32717 right: 0, 32718 bottom: 0, 32719 left: 0 32720 }; 32721 } 32722 32723
vendor: 184 bytes, lines 32723-32728
32723// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js 32724 function mergePaddingObject(paddingObject) { 32725 return Object.assign({}, getFreshSideObject(), paddingObject); 32726 } 32727 32728
vendor: 219 bytes, lines 32728-32736
32728// node_modules/@popperjs/core/lib/utils/expandToHashMap.js 32729 function expandToHashMap(value, keys) { 32730 return keys.reduce(function(hashMap, key) { 32731 hashMap[key] = value; 32732 return hashMap; 32733 }, {}); 32734 } 32735 32736
vendor: 2,756 bytes, lines 32736-32798
32736// node_modules/@popperjs/core/lib/modifiers/arrow.js 32737 var toPaddingObject = function toPaddingObject2(padding, state) { 32738 padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { 32739 placement: state.placement 32740 })) : padding; 32741 return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); 32742 }; 32743 function arrow(_ref) { 32744 var _state$modifiersData$; 32745 var state = _ref.state, name = _ref.name, options = _ref.options; 32746 var arrowElement = state.elements.arrow; 32747 var popperOffsets2 = state.modifiersData.popperOffsets; 32748 var basePlacement = getBasePlacement(state.placement); 32749 var axis = getMainAxisFromPlacement(basePlacement); 32750 var isVertical = [left, right].indexOf(basePlacement) >= 0; 32751 var len = isVertical ? "height" : "width"; 32752 if (!arrowElement || !popperOffsets2) { 32753 return; 32754 } 32755 var paddingObject = toPaddingObject(options.padding, state); 32756 var arrowRect = getLayoutRect(arrowElement); 32757 var minProp = axis === "y" ? top : left; 32758 var maxProp = axis === "y" ? bottom : right; 32759 var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; 32760 var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; 32761 var arrowOffsetParent = getOffsetParent(arrowElement); 32762 var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; 32763 var centerToReference = endDiff / 2 - startDiff / 2; 32764 var min2 = paddingObject[minProp]; 32765 var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; 32766 var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; 32767 var offset2 = within(min2, center, max2); 32768 var axisProp = axis; 32769 state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); 32770 } 32771 function effect2(_ref2) { 32772 var state = _ref2.state, options = _ref2.options; 32773 var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; 32774 if (arrowElement == null) { 32775 return; 32776 } 32777 if (typeof arrowElement === "string") { 32778 arrowElement = state.elements.popper.querySelector(arrowElement); 32779 if (!arrowElement) { 32780 return; 32781 } 32782 } 32783 if (!contains(state.elements.popper, arrowElement)) { 32784 return; 32785 } 32786 state.elements.arrow = arrowElement; 32787 } 32788 var arrow_default = { 32789 name: "arrow", 32790 enabled: true, 32791 phase: "main", 32792 fn: arrow, 32793 effect: effect2, 32794 requires: ["popperOffsets"], 32795 requiresIfExists: ["preventOverflow"] 32796 }; 32797 32798
vendor: 137 bytes, lines 32798-32803
32798// node_modules/@popperjs/core/lib/utils/getVariation.js 32799 function getVariation(placement) { 32800 return placement.split("-")[1]; 32801 } 32802 32803
vendor: 4,868 bytes, lines 32803-32918
32803// node_modules/@popperjs/core/lib/modifiers/computeStyles.js 32804 var unsetSides = { 32805 top: "auto", 32806 right: "auto", 32807 bottom: "auto", 32808 left: "auto" 32809 }; 32810 function roundOffsetsByDPR(_ref, win) { 32811 var x5 = _ref.x, y4 = _ref.y; 32812 var dpr = win.devicePixelRatio || 1; 32813 return { 32814 x: round(x5 * dpr) / dpr || 0, 32815 y: round(y4 * dpr) / dpr || 0 32816 }; 32817 } 32818 function mapToStyles(_ref2) { 32819 var _Object$assign2; 32820 var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; 32821 var _offsets$x = offsets.x, x5 = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y4 = _offsets$y === void 0 ? 0 : _offsets$y; 32822 var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ 32823 x: x5, 32824 y: y4 32825 }) : { 32826 x: x5, 32827 y: y4 32828 }; 32829 x5 = _ref3.x; 32830 y4 = _ref3.y; 32831 var hasX = offsets.hasOwnProperty("x"); 32832 var hasY = offsets.hasOwnProperty("y"); 32833 var sideX = left; 32834 var sideY = top; 32835 var win = window; 32836 if (adaptive) { 32837 var offsetParent = getOffsetParent(popper2); 32838 var heightProp = "clientHeight"; 32839 var widthProp = "clientWidth"; 32840 if (offsetParent === getWindow(popper2)) { 32841 offsetParent = getDocumentElement(popper2); 32842 if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") { 32843 heightProp = "scrollHeight"; 32844 widthProp = "scrollWidth"; 32845 } 32846 } 32847 offsetParent = offsetParent; 32848 if (placement === top || (placement === left || placement === right) && variation === end) { 32849 sideY = bottom; 32850 var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; 32851 y4 -= offsetY - popperRect.height; 32852 y4 *= gpuAcceleration ? 1 : -1; 32853 } 32854 if (placement === left || (placement === top || placement === bottom) && variation === end) { 32855 sideX = right; 32856 var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]; 32857 x5 -= offsetX - popperRect.width; 32858 x5 *= gpuAcceleration ? 1 : -1; 32859 } 32860 } 32861 var commonStyles = Object.assign({ 32862 position 32863 }, adaptive && unsetSides); 32864 var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ 32865 x: x5, 32866 y: y4 32867 }, getWindow(popper2)) : { 32868 x: x5, 32869 y: y4 32870 }; 32871 x5 = _ref4.x; 32872 y4 = _ref4.y; 32873 if (gpuAcceleration) { 32874 var _Object$assign; 32875 return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x5 + "px, " + y4 + "px)" : "translate3d(" + x5 + "px, " + y4 + "px, 0)", _Object$assign)); 32876 } 32877 return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y4 + "px" : "", _Object$assign2[sideX] = hasX ? x5 + "px" : "", _Object$assign2.transform = "", _Object$assign2)); 32878 } 32879 function computeStyles(_ref5) { 32880 var state = _ref5.state, options = _ref5.options; 32881 var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; 32882 var commonStyles = { 32883 placement: getBasePlacement(state.placement), 32884 variation: getVariation(state.placement), 32885 popper: state.elements.popper, 32886 popperRect: state.rects.popper, 32887 gpuAcceleration, 32888 isFixed: state.options.strategy === "fixed" 32889 }; 32890 if (state.modifiersData.popperOffsets != null) { 32891 state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { 32892 offsets: state.modifiersData.popperOffsets, 32893 position: state.options.strategy, 32894 adaptive, 32895 roundOffsets 32896 }))); 32897 } 32898 if (state.modifiersData.arrow != null) { 32899 state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { 32900 offsets: state.modifiersData.arrow, 32901 position: "absolute", 32902 adaptive: false, 32903 roundOffsets 32904 }))); 32905 } 32906 state.attributes.popper = Object.assign({}, state.attributes.popper, { 32907 "data-popper-placement": state.placement 32908 }); 32909 } 32910 var computeStyles_default = { 32911 name: "computeStyles", 32912 enabled: true, 32913 phase: "beforeWrite", 32914 fn: computeStyles, 32915 data: {} 32916 }; 32917 32918
vendor: 1,294 bytes, lines 32918-32956
32918// node_modules/@popperjs/core/lib/modifiers/eventListeners.js 32919 var passive = { 32920 passive: true 32921 }; 32922 function effect3(_ref) { 32923 var state = _ref.state, instance = _ref.instance, options = _ref.options; 32924 var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; 32925 var window2 = getWindow(state.elements.popper); 32926 var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); 32927 if (scroll) { 32928 scrollParents.forEach(function(scrollParent) { 32929 scrollParent.addEventListener("scroll", instance.update, passive); 32930 }); 32931 } 32932 if (resize) { 32933 window2.addEventListener("resize", instance.update, passive); 32934 } 32935 return function() { 32936 if (scroll) { 32937 scrollParents.forEach(function(scrollParent) { 32938 scrollParent.removeEventListener("scroll", instance.update, passive); 32939 }); 32940 } 32941 if (resize) { 32942 window2.removeEventListener("resize", instance.update, passive); 32943 } 32944 }; 32945 } 32946 var eventListeners_default = { 32947 name: "eventListeners", 32948 enabled: true, 32949 phase: "write", 32950 fn: function fn2() { 32951 }, 32952 effect: effect3, 32953 data: {} 32954 }; 32955 32956
vendor: 323 bytes, lines 32956-32969
32956// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js 32957 var hash = { 32958 left: "right", 32959 right: "left", 32960 bottom: "top", 32961 top: "bottom" 32962 }; 32963 function getOppositePlacement(placement) { 32964 return placement.replace(/left|right|bottom|top/g, function(matched) { 32965 return hash[matched]; 32966 }); 32967 } 32968 32969
vendor: 291 bytes, lines 32969-32980
32969// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js 32970 var hash2 = { 32971 start: "end", 32972 end: "start" 32973 }; 32974 function getOppositeVariationPlacement(placement) { 32975 return placement.replace(/start|end/g, function(matched) { 32976 return hash2[matched]; 32977 }); 32978 } 32979 32980
vendor: 266 bytes, lines 32980-32991
32980// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js 32981 function getWindowScroll(node) { 32982 var win = getWindow(node); 32983 var scrollLeft = win.pageXOffset; 32984 var scrollTop = win.pageYOffset; 32985 return { 32986 scrollLeft, 32987 scrollTop 32988 }; 32989 } 32990 32991
vendor: 223 bytes, lines 32991-32996
32991// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js 32992 function getWindowScrollBarX(element) { 32993 return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; 32994 } 32995 32996
vendor: 758 bytes, lines 32996-33022
32996// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js 32997 function getViewportRect(element, strategy) { 32998 var win = getWindow(element); 32999 var html = getDocumentElement(element); 33000 var visualViewport = win.visualViewport; 33001 var width = html.clientWidth; 33002 var height = html.clientHeight; 33003 var x5 = 0; 33004 var y4 = 0; 33005 if (visualViewport) { 33006 width = visualViewport.width; 33007 height = visualViewport.height; 33008 var layoutViewport = isLayoutViewport(); 33009 if (layoutViewport || !layoutViewport && strategy === "fixed") { 33010 x5 = visualViewport.offsetLeft; 33011 y4 = visualViewport.offsetTop; 33012 } 33013 } 33014 return { 33015 width, 33016 height, 33017 x: x5 + getWindowScrollBarX(element), 33018 y: y4 33019 }; 33020 } 33021 33022
vendor: 890 bytes, lines 33022-33043
33022// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js 33023 function getDocumentRect(element) { 33024 var _element$ownerDocumen; 33025 var html = getDocumentElement(element); 33026 var winScroll = getWindowScroll(element); 33027 var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; 33028 var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); 33029 var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); 33030 var x5 = -winScroll.scrollLeft + getWindowScrollBarX(element); 33031 var y4 = -winScroll.scrollTop; 33032 if (getComputedStyle2(body || html).direction === "rtl") { 33033 x5 += max(html.clientWidth, body ? body.clientWidth : 0) - width; 33034 } 33035 return { 33036 width, 33037 height, 33038 x: x5, 33039 y: y4 33040 }; 33041 } 33042 33043
vendor: 364 bytes, lines 33043-33049
33043// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js 33044 function isScrollParent(element) { 33045 var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; 33046 return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); 33047 } 33048 33049
vendor: 352 bytes, lines 33049-33060
33049// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js 33050 function getScrollParent(node) { 33051 if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { 33052 return node.ownerDocument.body; 33053 } 33054 if (isHTMLElement(node) && isScrollParent(node)) { 33055 return node; 33056 } 33057 return getScrollParent(getParentNode(node)); 33058 } 33059 33060
vendor: 689 bytes, lines 33060-33074
33060// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js 33061 function listScrollParents(element, list) { 33062 var _element$ownerDocumen; 33063 if (list === void 0) { 33064 list = []; 33065 } 33066 var scrollParent = getScrollParent(element); 33067 var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); 33068 var win = getWindow(scrollParent); 33069 var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; 33070 var updatedList = list.concat(target); 33071 return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target))); 33072 } 33073 33074
vendor: 257 bytes, lines 33074-33084
33074// node_modules/@popperjs/core/lib/utils/rectToClientRect.js 33075 function rectToClientRect(rect) { 33076 return Object.assign({}, rect, { 33077 left: rect.x, 33078 top: rect.y, 33079 right: rect.x + rect.width, 33080 bottom: rect.y + rect.height 33081 }); 33082 } 33083 33084
vendor: 2,468 bytes, lines 33084-33130
33084// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js 33085 function getInnerBoundingClientRect(element, strategy) { 33086 var rect = getBoundingClientRect(element, false, strategy === "fixed"); 33087 rect.top = rect.top + element.clientTop; 33088 rect.left = rect.left + element.clientLeft; 33089 rect.bottom = rect.top + element.clientHeight; 33090 rect.right = rect.left + element.clientWidth; 33091 rect.width = element.clientWidth; 33092 rect.height = element.clientHeight; 33093 rect.x = rect.left; 33094 rect.y = rect.top; 33095 return rect; 33096 } 33097 function getClientRectFromMixedType(element, clippingParent, strategy) { 33098 return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); 33099 } 33100 function getClippingParents2(element) { 33101 var clippingParents2 = listScrollParents(getParentNode(element)); 33102 var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0; 33103 var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; 33104 if (!isElement(clipperElement)) { 33105 return []; 33106 } 33107 return clippingParents2.filter(function(clippingParent) { 33108 return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; 33109 }); 33110 } 33111 function getClippingRect(element, boundary, rootBoundary, strategy) { 33112 var mainClippingParents = boundary === "clippingParents" ? getClippingParents2(element) : [].concat(boundary); 33113 var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); 33114 var firstClippingParent = clippingParents2[0]; 33115 var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { 33116 var rect = getClientRectFromMixedType(element, clippingParent, strategy); 33117 accRect.top = max(rect.top, accRect.top); 33118 accRect.right = min(rect.right, accRect.right); 33119 accRect.bottom = min(rect.bottom, accRect.bottom); 33120 accRect.left = max(rect.left, accRect.left); 33121 return accRect; 33122 }, getClientRectFromMixedType(element, firstClippingParent, strategy)); 33123 clippingRect.width = clippingRect.right - clippingRect.left; 33124 clippingRect.height = clippingRect.bottom - clippingRect.top; 33125 clippingRect.x = clippingRect.left; 33126 clippingRect.y = clippingRect.top; 33127 return clippingRect; 33128 } 33129 33130
vendor: 1,647 bytes, lines 33130-33185
33130// node_modules/@popperjs/core/lib/utils/computeOffsets.js 33131 function computeOffsets(_ref) { 33132 var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; 33133 var basePlacement = placement ? getBasePlacement(placement) : null; 33134 var variation = placement ? getVariation(placement) : null; 33135 var commonX = reference2.x + reference2.width / 2 - element.width / 2; 33136 var commonY = reference2.y + reference2.height / 2 - element.height / 2; 33137 var offsets; 33138 switch (basePlacement) { 33139 case top: 33140 offsets = { 33141 x: commonX, 33142 y: reference2.y - element.height 33143 }; 33144 break; 33145 case bottom: 33146 offsets = { 33147 x: commonX, 33148 y: reference2.y + reference2.height 33149 }; 33150 break; 33151 case right: 33152 offsets = { 33153 x: reference2.x + reference2.width, 33154 y: commonY 33155 }; 33156 break; 33157 case left: 33158 offsets = { 33159 x: reference2.x - element.width, 33160 y: commonY 33161 }; 33162 break; 33163 default: 33164 offsets = { 33165 x: reference2.x, 33166 y: reference2.y 33167 }; 33168 } 33169 var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; 33170 if (mainAxis != null) { 33171 var len = mainAxis === "y" ? "height" : "width"; 33172 switch (variation) { 33173 case start4: 33174 offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); 33175 break; 33176 case end: 33177 offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); 33178 break; 33179 default: 33180 } 33181 } 33182 return offsets; 33183 } 33184 33185
vendor: 2,766 bytes, lines 33185-33223
33185// node_modules/@popperjs/core/lib/utils/detectOverflow.js 33186 function detectOverflow(state, options) { 33187 if (options === void 0) { 33188 options = {}; 33189 } 33190 var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; 33191 var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); 33192 var altContext = elementContext === popper ? reference : popper; 33193 var popperRect = state.rects.popper; 33194 var element = state.elements[altBoundary ? altContext : elementContext]; 33195 var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); 33196 var referenceClientRect = getBoundingClientRect(state.elements.reference); 33197 var popperOffsets2 = computeOffsets({ 33198 reference: referenceClientRect, 33199 element: popperRect, 33200 strategy: "absolute", 33201 placement 33202 }); 33203 var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); 33204 var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; 33205 var overflowOffsets = { 33206 top: clippingClientRect.top - elementClientRect.top + paddingObject.top, 33207 bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, 33208 left: clippingClientRect.left - elementClientRect.left + paddingObject.left, 33209 right: elementClientRect.right - clippingClientRect.right + paddingObject.right 33210 }; 33211 var offsetData = state.modifiersData.offset; 33212 if (elementContext === popper && offsetData) { 33213 var offset2 = offsetData[placement]; 33214 Object.keys(overflowOffsets).forEach(function(key) { 33215 var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; 33216 var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; 33217 overflowOffsets[key] += offset2[axis] * multiply; 33218 }); 33219 } 33220 return overflowOffsets; 33221 } 33222 33223
vendor: 1,387 bytes, lines 33223-33253
33223// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js 33224 function computeAutoPlacement(state, options) { 33225 if (options === void 0) { 33226 options = {}; 33227 } 33228 var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; 33229 var variation = getVariation(placement); 33230 var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { 33231 return getVariation(placement2) === variation; 33232 }) : basePlacements; 33233 var allowedPlacements = placements2.filter(function(placement2) { 33234 return allowedAutoPlacements.indexOf(placement2) >= 0; 33235 }); 33236 if (allowedPlacements.length === 0) { 33237 allowedPlacements = placements2; 33238 } 33239 var overflows = allowedPlacements.reduce(function(acc, placement2) { 33240 acc[placement2] = detectOverflow(state, { 33241 placement: placement2, 33242 boundary, 33243 rootBoundary, 33244 padding 33245 })[getBasePlacement(placement2)]; 33246 return acc; 33247 }, {}); 33248 return Object.keys(overflows).sort(function(a4, b4) { 33249 return overflows[a4] - overflows[b4]; 33250 }); 33251 } 33252 33253
vendor: 4,365 bytes, lines 33253-33359
33253// node_modules/@popperjs/core/lib/modifiers/flip.js 33254 function getExpandedFallbackPlacements(placement) { 33255 if (getBasePlacement(placement) === auto) { 33256 return []; 33257 } 33258 var oppositePlacement = getOppositePlacement(placement); 33259 return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; 33260 } 33261 function flip(_ref) { 33262 var state = _ref.state, options = _ref.options, name = _ref.name; 33263 if (state.modifiersData[name]._skip) { 33264 return; 33265 } 33266 var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; 33267 var preferredPlacement = state.options.placement; 33268 var basePlacement = getBasePlacement(preferredPlacement); 33269 var isBasePlacement = basePlacement === preferredPlacement; 33270 var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); 33271 var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { 33272 return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { 33273 placement: placement2, 33274 boundary, 33275 rootBoundary, 33276 padding, 33277 flipVariations, 33278 allowedAutoPlacements 33279 }) : placement2); 33280 }, []); 33281 var referenceRect = state.rects.reference; 33282 var popperRect = state.rects.popper; 33283 var checksMap = /* @__PURE__ */ new Map(); 33284 var makeFallbackChecks = true; 33285 var firstFittingPlacement = placements2[0]; 33286 for (var i4 = 0; i4 < placements2.length; i4++) { 33287 var placement = placements2[i4]; 33288 var _basePlacement = getBasePlacement(placement); 33289 var isStartVariation = getVariation(placement) === start4; 33290 var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; 33291 var len = isVertical ? "width" : "height"; 33292 var overflow = detectOverflow(state, { 33293 placement, 33294 boundary, 33295 rootBoundary, 33296 altBoundary, 33297 padding 33298 }); 33299 var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; 33300 if (referenceRect[len] > popperRect[len]) { 33301 mainVariationSide = getOppositePlacement(mainVariationSide); 33302 } 33303 var altVariationSide = getOppositePlacement(mainVariationSide); 33304 var checks = []; 33305 if (checkMainAxis) { 33306 checks.push(overflow[_basePlacement] <= 0); 33307 } 33308 if (checkAltAxis) { 33309 checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); 33310 } 33311 if (checks.every(function(check) { 33312 return check; 33313 })) { 33314 firstFittingPlacement = placement; 33315 makeFallbackChecks = false; 33316 break; 33317 } 33318 checksMap.set(placement, checks); 33319 } 33320 if (makeFallbackChecks) { 33321 var numberOfChecks = flipVariations ? 3 : 1; 33322 var _loop = function _loop2(_i3) { 33323 var fittingPlacement = placements2.find(function(placement2) { 33324 var checks2 = checksMap.get(placement2); 33325 if (checks2) { 33326 return checks2.slice(0, _i3).every(function(check) { 33327 return check; 33328 }); 33329 } 33330 }); 33331 if (fittingPlacement) { 33332 firstFittingPlacement = fittingPlacement; 33333 return "break"; 33334 } 33335 }; 33336 for (var _i2 = numberOfChecks; _i2 > 0; _i2--) { 33337 var _ret = _loop(_i2); 33338 if (_ret === "break") 33339 break; 33340 } 33341 } 33342 if (state.placement !== firstFittingPlacement) { 33343 state.modifiersData[name]._skip = true; 33344 state.placement = firstFittingPlacement; 33345 state.reset = true; 33346 } 33347 } 33348 var flip_default = { 33349 name: "flip", 33350 enabled: true, 33351 phase: "main", 33352 fn: flip, 33353 requiresIfExists: ["offset"], 33354 data: { 33355 _skip: false 33356 } 33357 }; 33358 33359
vendor: 1,856 bytes, lines 33359-33413
33359// node_modules/@popperjs/core/lib/modifiers/hide.js 33360 function getSideOffsets(overflow, rect, preventedOffsets) { 33361 if (preventedOffsets === void 0) { 33362 preventedOffsets = { 33363 x: 0, 33364 y: 0 33365 }; 33366 } 33367 return { 33368 top: overflow.top - rect.height - preventedOffsets.y, 33369 right: overflow.right - rect.width + preventedOffsets.x, 33370 bottom: overflow.bottom - rect.height + preventedOffsets.y, 33371 left: overflow.left - rect.width - preventedOffsets.x 33372 }; 33373 } 33374 function isAnySideFullyClipped(overflow) { 33375 return [top, right, bottom, left].some(function(side) { 33376 return overflow[side] >= 0; 33377 }); 33378 } 33379 function hide(_ref) { 33380 var state = _ref.state, name = _ref.name; 33381 var referenceRect = state.rects.reference; 33382 var popperRect = state.rects.popper; 33383 var preventedOffsets = state.modifiersData.preventOverflow; 33384 var referenceOverflow = detectOverflow(state, { 33385 elementContext: "reference" 33386 }); 33387 var popperAltOverflow = detectOverflow(state, { 33388 altBoundary: true 33389 }); 33390 var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); 33391 var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); 33392 var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); 33393 var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); 33394 state.modifiersData[name] = { 33395 referenceClippingOffsets, 33396 popperEscapeOffsets, 33397 isReferenceHidden, 33398 hasPopperEscaped 33399 }; 33400 state.attributes.popper = Object.assign({}, state.attributes.popper, { 33401 "data-popper-reference-hidden": isReferenceHidden, 33402 "data-popper-escaped": hasPopperEscaped 33403 }); 33404 } 33405 var hide_default = { 33406 name: "hide", 33407 enabled: true, 33408 phase: "main", 33409 requiresIfExists: ["preventOverflow"], 33410 fn: hide 33411 }; 33412 33413
vendor: 1,466 bytes, lines 33413-33452
33413// node_modules/@popperjs/core/lib/modifiers/offset.js 33414 function distanceAndSkiddingToXY(placement, rects, offset2) { 33415 var basePlacement = getBasePlacement(placement); 33416 var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; 33417 var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { 33418 placement 33419 })) : offset2, skidding = _ref[0], distance = _ref[1]; 33420 skidding = skidding || 0; 33421 distance = (distance || 0) * invertDistance; 33422 return [left, right].indexOf(basePlacement) >= 0 ? { 33423 x: distance, 33424 y: skidding 33425 } : { 33426 x: skidding, 33427 y: distance 33428 }; 33429 } 33430 function offset(_ref2) { 33431 var state = _ref2.state, options = _ref2.options, name = _ref2.name; 33432 var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; 33433 var data = placements.reduce(function(acc, placement) { 33434 acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); 33435 return acc; 33436 }, {}); 33437 var _data$state$placement = data[state.placement], x5 = _data$state$placement.x, y4 = _data$state$placement.y; 33438 if (state.modifiersData.popperOffsets != null) { 33439 state.modifiersData.popperOffsets.x += x5; 33440 state.modifiersData.popperOffsets.y += y4; 33441 } 33442 state.modifiersData[name] = data; 33443 } 33444 var offset_default = { 33445 name: "offset", 33446 enabled: true, 33447 phase: "main", 33448 requires: ["popperOffsets"], 33449 fn: offset 33450 }; 33451 33452
vendor: 479 bytes, lines 33452-33470
33452// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js 33453 function popperOffsets(_ref) { 33454 var state = _ref.state, name = _ref.name; 33455 state.modifiersData[name] = computeOffsets({ 33456 reference: state.rects.reference, 33457 element: state.rects.popper, 33458 strategy: "absolute", 33459 placement: state.placement 33460 }); 33461 } 33462 var popperOffsets_default = { 33463 name: "popperOffsets", 33464 enabled: true, 33465 phase: "read", 33466 fn: popperOffsets, 33467 data: {} 33468 }; 33469 33470
vendor: 129 bytes, lines 33470-33475
33470// node_modules/@popperjs/core/lib/utils/getAltAxis.js 33471 function getAltAxis(axis) { 33472 return axis === "x" ? "y" : "x"; 33473 } 33474 33475
vendor: 5,550 bytes, lines 33475-33568
33475// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js 33476 function preventOverflow(_ref) { 33477 var state = _ref.state, options = _ref.options, name = _ref.name; 33478 var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; 33479 var overflow = detectOverflow(state, { 33480 boundary, 33481 rootBoundary, 33482 padding, 33483 altBoundary 33484 }); 33485 var basePlacement = getBasePlacement(state.placement); 33486 var variation = getVariation(state.placement); 33487 var isBasePlacement = !variation; 33488 var mainAxis = getMainAxisFromPlacement(basePlacement); 33489 var altAxis = getAltAxis(mainAxis); 33490 var popperOffsets2 = state.modifiersData.popperOffsets; 33491 var referenceRect = state.rects.reference; 33492 var popperRect = state.rects.popper; 33493 var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { 33494 placement: state.placement 33495 })) : tetherOffset; 33496 var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { 33497 mainAxis: tetherOffsetValue, 33498 altAxis: tetherOffsetValue 33499 } : Object.assign({ 33500 mainAxis: 0, 33501 altAxis: 0 33502 }, tetherOffsetValue); 33503 var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; 33504 var data = { 33505 x: 0, 33506 y: 0 33507 }; 33508 if (!popperOffsets2) { 33509 return; 33510 } 33511 if (checkMainAxis) { 33512 var _offsetModifierState$; 33513 var mainSide = mainAxis === "y" ? top : left; 33514 var altSide = mainAxis === "y" ? bottom : right; 33515 var len = mainAxis === "y" ? "height" : "width"; 33516 var offset2 = popperOffsets2[mainAxis]; 33517 var min2 = offset2 + overflow[mainSide]; 33518 var max2 = offset2 - overflow[altSide]; 33519 var additive = tether ? -popperRect[len] / 2 : 0; 33520 var minLen = variation === start4 ? referenceRect[len] : popperRect[len]; 33521 var maxLen = variation === start4 ? -popperRect[len] : -referenceRect[len]; 33522 var arrowElement = state.elements.arrow; 33523 var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { 33524 width: 0, 33525 height: 0 33526 }; 33527 var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); 33528 var arrowPaddingMin = arrowPaddingObject[mainSide]; 33529 var arrowPaddingMax = arrowPaddingObject[altSide]; 33530 var arrowLen = within(0, referenceRect[len], arrowRect[len]); 33531 var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; 33532 var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; 33533 var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); 33534 var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; 33535 var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; 33536 var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; 33537 var tetherMax = offset2 + maxOffset - offsetModifierValue; 33538 var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2); 33539 popperOffsets2[mainAxis] = preventedOffset; 33540 data[mainAxis] = preventedOffset - offset2; 33541 } 33542 if (checkAltAxis) { 33543 var _offsetModifierState$2; 33544 var _mainSide = mainAxis === "x" ? top : left; 33545 var _altSide = mainAxis === "x" ? bottom : right; 33546 var _offset = popperOffsets2[altAxis]; 33547 var _len = altAxis === "y" ? "height" : "width"; 33548 var _min = _offset + overflow[_mainSide]; 33549 var _max = _offset - overflow[_altSide]; 33550 var isOriginSide = [top, left].indexOf(basePlacement) !== -1; 33551 var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; 33552 var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; 33553 var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; 33554 var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); 33555 popperOffsets2[altAxis] = _preventedOffset; 33556 data[altAxis] = _preventedOffset - _offset; 33557 } 33558 state.modifiersData[name] = data; 33559 } 33560 var preventOverflow_default = { 33561 name: "preventOverflow", 33562 enabled: true, 33563 phase: "main", 33564 fn: preventOverflow, 33565 requiresIfExists: ["offset"] 33566 }; 33567 33568
vendor: 212 bytes, lines 33568-33576
33568// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js 33569 function getHTMLElementScroll(element) { 33570 return { 33571 scrollLeft: element.scrollLeft, 33572 scrollTop: element.scrollTop 33573 }; 33574 } 33575 33576
vendor: 258 bytes, lines 33576-33585
33576// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js 33577 function getNodeScroll(node) { 33578 if (node === getWindow(node) || !isHTMLElement(node)) { 33579 return getWindowScroll(node); 33580 } else { 33581 return getHTMLElementScroll(node); 33582 } 33583 } 33584 33585
vendor: 1,582 bytes, lines 33585-33628
33585// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js 33586 function isElementScaled(element) { 33587 var rect = element.getBoundingClientRect(); 33588 var scaleX = round(rect.width) / element.offsetWidth || 1; 33589 var scaleY = round(rect.height) / element.offsetHeight || 1; 33590 return scaleX !== 1 || scaleY !== 1; 33591 } 33592 function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { 33593 if (isFixed === void 0) { 33594 isFixed = false; 33595 } 33596 var isOffsetParentAnElement = isHTMLElement(offsetParent); 33597 var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); 33598 var documentElement = getDocumentElement(offsetParent); 33599 var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); 33600 var scroll = { 33601 scrollLeft: 0, 33602 scrollTop: 0 33603 }; 33604 var offsets = { 33605 x: 0, 33606 y: 0 33607 }; 33608 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { 33609 if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) { 33610 scroll = getNodeScroll(offsetParent); 33611 } 33612 if (isHTMLElement(offsetParent)) { 33613 offsets = getBoundingClientRect(offsetParent, true); 33614 offsets.x += offsetParent.clientLeft; 33615 offsets.y += offsetParent.clientTop; 33616 } else if (documentElement) { 33617 offsets.x = getWindowScrollBarX(documentElement); 33618 } 33619 } 33620 return { 33621 x: rect.left + scroll.scrollLeft - offsets.x, 33622 y: rect.top + scroll.scrollTop - offsets.y, 33623 width: rect.width, 33624 height: rect.height 33625 }; 33626 } 33627 33628
vendor: 1,109 bytes, lines 33628-33665
33628// node_modules/@popperjs/core/lib/utils/orderModifiers.js 33629 function order(modifiers) { 33630 var map = /* @__PURE__ */ new Map(); 33631 var visited = /* @__PURE__ */ new Set(); 33632 var result = []; 33633 modifiers.forEach(function(modifier) { 33634 map.set(modifier.name, modifier); 33635 }); 33636 function sort(modifier) { 33637 visited.add(modifier.name); 33638 var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); 33639 requires.forEach(function(dep) { 33640 if (!visited.has(dep)) { 33641 var depModifier = map.get(dep); 33642 if (depModifier) { 33643 sort(depModifier); 33644 } 33645 } 33646 }); 33647 result.push(modifier); 33648 } 33649 modifiers.forEach(function(modifier) { 33650 if (!visited.has(modifier.name)) { 33651 sort(modifier); 33652 } 33653 }); 33654 return result; 33655 } 33656 function orderModifiers(modifiers) { 33657 var orderedModifiers = order(modifiers); 33658 return modifierPhases.reduce(function(acc, phase) { 33659 return acc.concat(orderedModifiers.filter(function(modifier) { 33660 return modifier.phase === phase; 33661 })); 33662 }, []); 33663 } 33664 33665
vendor: 367 bytes, lines 33665-33681
33665// node_modules/@popperjs/core/lib/utils/debounce.js 33666 function debounce(fn3) { 33667 var pending; 33668 return function() { 33669 if (!pending) { 33670 pending = new Promise(function(resolve) { 33671 Promise.resolve().then(function() { 33672 pending = void 0; 33673 resolve(fn3()); 33674 }); 33675 }); 33676 } 33677 return pending; 33678 }; 33679 } 33680 33681
vendor: 557 bytes, lines 33681-33696
33681// node_modules/@popperjs/core/lib/utils/mergeByName.js 33682 function mergeByName(modifiers) { 33683 var merged = modifiers.reduce(function(merged2, current) { 33684 var existing = merged2[current.name]; 33685 merged2[current.name] = existing ? Object.assign({}, existing, current, { 33686 options: Object.assign({}, existing.options, current.options), 33687 data: Object.assign({}, existing.data, current.data) 33688 }) : current; 33689 return merged2; 33690 }, {}); 33691 return Object.keys(merged).map(function(key) { 33692 return merged[key]; 33693 }); 33694 } 33695 33696
vendor: 5,247 bytes, lines 33696-33830
33696// node_modules/@popperjs/core/lib/createPopper.js 33697 var DEFAULT_OPTIONS = { 33698 placement: "bottom", 33699 modifiers: [], 33700 strategy: "absolute" 33701 }; 33702 function areValidElements() { 33703 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 33704 args[_key] = arguments[_key]; 33705 } 33706 return !args.some(function(element) { 33707 return !(element && typeof element.getBoundingClientRect === "function"); 33708 }); 33709 } 33710 function popperGenerator(generatorOptions) { 33711 if (generatorOptions === void 0) { 33712 generatorOptions = {}; 33713 } 33714 var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers3 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions2 = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; 33715 return function createPopper4(reference2, popper2, options) { 33716 if (options === void 0) { 33717 options = defaultOptions2; 33718 } 33719 var state = { 33720 placement: "bottom", 33721 orderedModifiers: [], 33722 options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions2), 33723 modifiersData: {}, 33724 elements: { 33725 reference: reference2, 33726 popper: popper2 33727 }, 33728 attributes: {}, 33729 styles: {} 33730 }; 33731 var effectCleanupFns = []; 33732 var isDestroyed = false; 33733 var instance = { 33734 state, 33735 setOptions: function setOptions(setOptionsAction) { 33736 var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; 33737 cleanupModifierEffects(); 33738 state.options = Object.assign({}, defaultOptions2, state.options, options2); 33739 state.scrollParents = { 33740 reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], 33741 popper: listScrollParents(popper2) 33742 }; 33743 var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers3, state.options.modifiers))); 33744 state.orderedModifiers = orderedModifiers.filter(function(m5) { 33745 return m5.enabled; 33746 }); 33747 runModifierEffects(); 33748 return instance.update(); 33749 }, 33750 forceUpdate: function forceUpdate() { 33751 if (isDestroyed) { 33752 return; 33753 } 33754 var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; 33755 if (!areValidElements(reference3, popper3)) { 33756 return; 33757 } 33758 state.rects = { 33759 reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), 33760 popper: getLayoutRect(popper3) 33761 }; 33762 state.reset = false; 33763 state.placement = state.options.placement; 33764 state.orderedModifiers.forEach(function(modifier) { 33765 return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); 33766 }); 33767 for (var index4 = 0; index4 < state.orderedModifiers.length; index4++) { 33768 if (state.reset === true) { 33769 state.reset = false; 33770 index4 = -1; 33771 continue; 33772 } 33773 var _state$orderedModifie = state.orderedModifiers[index4], fn3 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; 33774 if (typeof fn3 === "function") { 33775 state = fn3({ 33776 state, 33777 options: _options, 33778 name, 33779 instance 33780 }) || state; 33781 } 33782 } 33783 }, 33784 update: debounce(function() { 33785 return new Promise(function(resolve) { 33786 instance.forceUpdate(); 33787 resolve(state); 33788 }); 33789 }), 33790 destroy: function destroy2() { 33791 cleanupModifierEffects(); 33792 isDestroyed = true; 33793 } 33794 }; 33795 if (!areValidElements(reference2, popper2)) { 33796 return instance; 33797 } 33798 instance.setOptions(options).then(function(state2) { 33799 if (!isDestroyed && options.onFirstUpdate) { 33800 options.onFirstUpdate(state2); 33801 } 33802 }); 33803 function runModifierEffects() { 33804 state.orderedModifiers.forEach(function(_ref) { 33805 var name = _ref.name, _ref$options = _ref.options, options2 = _ref$options === void 0 ? {} : _ref$options, effect4 = _ref.effect; 33806 if (typeof effect4 === "function") { 33807 var cleanupFn = effect4({ 33808 state, 33809 name, 33810 instance, 33811 options: options2 33812 }); 33813 var noopFn = function noopFn2() { 33814 }; 33815 effectCleanupFns.push(cleanupFn || noopFn); 33816 } 33817 }); 33818 } 33819 function cleanupModifierEffects() { 33820 effectCleanupFns.forEach(function(fn3) { 33821 return fn3(); 33822 }); 33823 effectCleanupFns = []; 33824 } 33825 return instance; 33826 }; 33827 } 33828 var createPopper = /* @__PURE__ */ popperGenerator(); 33829 33830
vendor: 254 bytes, lines 33830-33836
33830// node_modules/@popperjs/core/lib/popper-lite.js 33831 var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default]; 33832 var createPopper2 = /* @__PURE__ */ popperGenerator({ 33833 defaultModifiers 33834 }); 33835 33836
vendor: 353 bytes, lines 33836-33842
33836// node_modules/@popperjs/core/lib/popper.js 33837 var defaultModifiers2 = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default]; 33838 var createPopper3 = /* @__PURE__ */ popperGenerator({ 33839 defaultModifiers: defaultModifiers2 33840 }); 33841 33842
33842// app/javascript/controllers/select_colour_controller.js 33843 var select_colour_controller_default = class extends Controller { 33844 connect() { 33845 let select = this.element.querySelector("select"); 33846 select.addEventListener("change", () => { 33847 select.classList.remove("placeholder"); 33848 }); 33849 } 33850 }; 33851 33852
33852// app/javascript/controllers/sidebar_toggle_controller.js 33853 var sidebar_toggle_controller_default = class extends Controller { 33854 toggle() { 33855 if (window.innerWidth <= 1024) { 33856 this.sidebarTarget.classList.toggle("is-open"); 33857 } else { 33858 this.sidebarTarget.classList.toggle("is-collapsed"); 33859 this.element.classList.toggle("sidebar-collapsed"); 33860 } 33861 } 33862 }; 33863 __publicField(sidebar_toggle_controller_default, "targets", ["sidebar"]); 33864 33865
33865// app/javascript/controllers/simple_open_controller.js 33866 var simple_open_controller_default = class extends Controller { 33867 toggle() { 33868 this.targetTarget.classList.toggle("open"); 33869 } 33870 }; 33871 __publicField(simple_open_controller_default, "targets", ["target"]); 33872 33873
33873// app/javascript/controllers/space_attd_val_controller.js 33874 var space_attd_val_controller_default = class extends Controller { 33875 connect() { 33876 const input = this.element.querySelector("#booking_attendee_count"); 33877 const incr = this.element.querySelector(".attendees__incr"); 33878 const decr = this.element.querySelector(".attendees__decr"); 33879 let i4 = this.capacityValue; 33880 let maxCapacity = Number(this.element.dataset.maxCapacity); 33881 input.addEventListener("change", () => { 33882 i4 = input.value; 33883 }); 33884 incr.addEventListener("click", () => { 33885 if (i4 < maxCapacity || !i4 || !maxCapacity) { 33886 i4++; 33887 input.value = i4; 33888 input.dispatchEvent(new Event("input", { bubbles: true })); 33889 } 33890 }); 33891 decr.addEventListener("click", () => { 33892 if (i4 >= 2) { 33893 i4--; 33894 input.value = i4; 33895 input.dispatchEvent(new Event("input", { bubbles: true })); 33896 } 33897 }); 33898 } 33899 }; 33900 __publicField(space_attd_val_controller_default, "values", { capacity: Number }); 33901 33902
33902// app/javascript/controllers/spaces_blocks_controller.js 33903 var spaces_blocks_controller_default = class extends Controller { 33904 connect() { 33905 let mouseDown = false; 33906 let startX, scrollLeft; 33907 const slider = this.element; 33908 const startDragging = (e4) => { 33909 mouseDown = true; 33910 startX = e4.pageX - slider.offsetLeft; 33911 scrollLeft = slider.scrollLeft; 33912 this.element.style.cursor = "grabbing"; 33913 }; 33914 const stopDragging = (e4) => { 33915 mouseDown = false; 33916 this.element.style.cursor = "grab"; 33917 }; 33918 const move = (e4) => { 33919 e4.preventDefault(); 33920 if (!mouseDown) { 33921 return; 33922 } 33923 const x5 = e4.pageX - slider.offsetLeft; 33924 const scroll = x5 - startX; 33925 slider.scrollLeft = scrollLeft - scroll; 33926 }; 33927 slider.addEventListener("mousemove", move, false); 33928 slider.addEventListener("mousedown", startDragging, false); 33929 slider.addEventListener("mouseup", stopDragging, false); 33930 slider.addEventListener("mouseleave", stopDragging, false); 33931 } 33932 }; 33933 33934
33934// app/javascript/controllers/spaces_boro_id_controller.js 33935 var spaces_boro_id_controller_default = class extends Controller { 33936 connect() { 33937 const regionInputs = this.regionTarget.querySelectorAll("input[type=checkbox]"); 33938 const locationInputs = this.locationTarget.querySelectorAll("input[type=checkbox]"); 33939 const locationCheckboxes = this.locationTarget.querySelectorAll("span.checkbox"); 33940 const regionChecked = [...regionInputs].some((region) => region.checked == true); 33941 regionInputs.forEach((region) => { 33942 region.addEventListener("change", () => { 33943 this.hide(regionInputs, locationInputs, locationCheckboxes); 33944 locationInputs.forEach((location2) => { 33945 location2.checked = false; 33946 }); 33947 }); 33948 }); 33949 if (regionChecked) { 33950 this.hide(regionInputs, locationInputs, locationCheckboxes); 33951 } 33952 } 33953 hide(regionInputs, locationInputs, locationCheckboxes) { 33954 let showArr = []; 33955 locationCheckboxes.forEach((span) => { 33956 span.classList.add("hidden"); 33957 }); 33958 regionInputs.forEach((region) => { 33959 if (region.checked) { 33960 locationInputs.forEach((loc) => { 33961 if (region.dataset.boroughId == loc.dataset.boroughId) { 33962 if (!showArr.includes(loc)) { 33963 showArr.push(loc); 33964 } 33965 } 33966 }); 33967 } 33968 }); 33969 showArr.forEach((entry) => { 33970 locationCheckboxes.forEach((span) => { 33971 if (span.contains(entry)) { 33972 span.classList.remove("hidden"); 33973 } 33974 }); 33975 }); 33976 } 33977 }; 33978 __publicField(spaces_boro_id_controller_default, "targets", ["region", "location"]); 33979 33980
33980// app/javascript/controllers/spaces_date_pika_controller.js 33981 var import_pikaday4 = __toESM(require_pikaday()); 33982 var import_moment2 = __toESM(require_moment()); 33983 var spaces_date_pika_controller_default = class extends Controller { 33984 connect() { 33985 const disabledDates = this.inputTarget.dataset.disabled.split(","); 33986 const activitiesPicker = new import_pikaday4.default({ 33987 field: this.inputTarget, 33988 bound: false, 33989 minDate: new Date(), 33990 keyboardInput: false, 33991 firstDay: 1, 33992 format: "DD/MM/YYYY", 33993 container: document.getElementById("spaces-calendar") 33994 }); 33995 } 33996 open() { 33997 this.modalTarget.classList.add("open"); 33998 } 33999 close() { 34000 this.modalTarget.classList.remove("open"); 34001 } 34002 }; 34003 __publicField(spaces_date_pika_controller_default, "targets", ["input", "modal"]); 34004 34005
34005// app/javascript/controllers/spaces_finder_redirect_controller.js 34006 var spaces_finder_redirect_controller_default = class extends Controller { 34007 connect() { 34008 } 34009 submit() { 34010 this.element.method = "GET"; 34011 this.element.setAttribute("data-turbo", "false"); 34012 } 34013 }; 34014 34015
34015// app/javascript/controllers/spaces_load_more_controller.js 34016 var spaces_load_more_controller_default = class extends Controller { 34017 connect() { 34018 } 34019 open(e4) { 34020 e4.preventDefault(); 34021 const i4 = this.btnTarget.dataset.pageNumber; 34022 const spacePages = document.querySelectorAll(".spaces-search-results"); 34023 spacePages.forEach((page) => { 34024 let pageID = page.dataset.spacePage; 34025 if (i4 == pageID) { 34026 page.classList.add("open"); 34027 } 34028 }); 34029 e4.target.style.display = "none"; 34030 } 34031 }; 34032 __publicField(spaces_load_more_controller_default, "targets", ["btn"]); 34033 34034
34034// app/javascript/controllers/spaces_section_toggle_controller.js 34035 var spaces_section_toggle_controller_default = class extends Controller { 34036 connect() { 34037 } 34038 open() { 34039 this.bodyTarget.classList.add("open"); 34040 this.headerTarget.classList.add("closed"); 34041 } 34042 close() { 34043 this.bodyTarget.classList.remove("open"); 34044 this.headerTarget.classList.remove("closed"); 34045 } 34046 }; 34047 __publicField(spaces_section_toggle_controller_default, "targets", ["header", "body", "input"]); 34048 34049
34049// app/javascript/controllers/spaces_start_time_controller.js 34050 var spaces_start_time_controller_default = class extends Controller { 34051 connect() { 34052 this.hideOptions(); 34053 const buttons = this.element.querySelectorAll(".start-time_btn"); 34054 buttons.forEach((button) => { 34055 button.addEventListener("click", () => { 34056 if (button.classList.contains("active")) { 34057 button.classList.remove("active"); 34058 } else if (!button.classList.contains("unav")) { 34059 buttons.forEach((button2) => { 34060 button2.classList.remove("active"); 34061 }); 34062 button.classList.toggle("active"); 34063 } 34064 this.sendTime(); 34065 }); 34066 }); 34067 let inputFields = this.element.querySelectorAll("div.input"); 34068 inputFields.forEach((e4) => { 34069 e4.addEventListener("click", () => { 34070 this.open(); 34071 }); 34072 }); 34073 let startMinuteField = document.querySelector("#spaces_finder_start_minute"); 34074 if (startMinuteField) { 34075 if (startMinuteField.value == "") { 34076 startMinuteField.value = 0; 34077 } 34078 } 34079 } 34080 open() { 34081 this.modalTarget.classList.add("open"); 34082 } 34083 close() { 34084 this.modalTarget.classList.remove("open"); 34085 } 34086 hideOptions() { 34087 const options = this.element.querySelectorAll("option"); 34088 options.forEach((option) => { 34089 option.classList.add("hidden"); 34090 }); 34091 } 34092 sendTime() { 34093 let hourSelect; 34094 let minuteSelect; 34095 let spacesFinder = document.querySelector("#spaces_finder_start_hour"); 34096 let spaceSingle = document.querySelector("#booking_start_time_hours"); 34097 if (spacesFinder) { 34098 hourSelect = document.querySelector("#spaces_finder_start_hour"); 34099 minuteSelect = document.querySelector("#spaces_finder_start_minute"); 34100 } else if (spaceSingle) { 34101 hourSelect = document.querySelector("#booking_start_time_hours"); 34102 minuteSelect = document.querySelector("#booking_start_time_minutes"); 34103 } 34104 let selected = this.btnscontTarget.querySelector(".active").innerText.trim(); 34105 let timeArray = selected.split(":"); 34106 let hour = timeArray[0]; 34107 let minute = timeArray[1]; 34108 hourSelect.value = hour; 34109 if (spacesFinder) { 34110 if (minute == "00") { 34111 minuteSelect.value = 0; 34112 } else { 34113 minuteSelect.value = minute; 34114 } 34115 } else if (spaceSingle) { 34116 if (minute == "00") { 34117 minuteSelect.value = "00"; 34118 } else { 34119 minuteSelect.value = minute; 34120 } 34121 } 34122 } 34123 }; 34124 __publicField(spaces_start_time_controller_default, "targets", ["modal", "btnscont"]); 34125 34126
34126// app/javascript/controllers/system_alerts_controller.js 34127 var system_alerts_controller_default = class extends Controller { 34128 connect() { 34129 } 34130 createAlert(style, message) { 34131 const alertDiv = document.createElement("div"); 34132 alertDiv.setAttribute("class", `alert alert-${style} fixed-alert`); 34133 alertDiv.setAttribute("role", `alert`); 34134 const alertText = document.createTextNode(message); 34135 const dismissButton = document.createElement("button"); 34136 dismissButton.setAttribute("aria-label", "Close"); 34137 dismissButton.setAttribute("class", "btn-close"); 34138 dismissButton.setAttribute("data-bs-dismiss", "alert"); 34139 dismissButton.setAttribute("type", "button"); 34140 dismissButton.innerHTML = ` 34141 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 34142 <path fill-rule="evenodd" clip-rule="evenodd" d="M2.79289 2.79289C3.18342 2.40237 3.81658 2.40237 4.20711 2.79289L12 10.5858L19.7929 2.79289C20.1834 2.40237 20.8166 2.40237 21.2071 2.79289C21.5976 3.18342 21.5976 3.81658 21.2071 4.20711L13.4142 12L21.2071 19.7929C21.5976 20.1834 21.5976 20.8166 21.2071 21.2071C20.8166 21.5976 20.1834 21.5976 19.7929 21.2071L12 13.4142L4.20711 21.2071C3.81658 21.5976 3.18342 21.5976 2.79289 21.2071C2.40237 20.8166 2.40237 20.1834 2.79289 19.7929L10.5858 12L2.79289 4.20711C2.40237 3.81658 2.40237 3.18342 2.79289 2.79289Z" fill="white"/> 34143 </svg> 34144 `; 34145 alertDiv.appendChild(alertText); 34146 alertDiv.appendChild(dismissButton); 34147 this.containerTarget.appendChild(alertDiv); 34148 } 34149 }; 34150 __publicField(system_alerts_controller_default, "targets", ["container"]); 34151 34152
34152// app/javascript/controllers/table_editor_controller.js 34153 var MAX_PARENT_SEARCH_DEPTH = 5; 34154 var table_editor_controller_default = class extends Controller { 34155 addRow(event2) { 34156 Rails.ajax({ 34157 url: `/library/tables/${this.getID()}`, 34158 data: "method=addRow", 34159 type: "patch", 34160 success: this.attachTable.bind(this) 34161 }); 34162 } 34163 addColumn(event2) { 34164 Rails.ajax({ 34165 url: `/library/tables/${this.getID()}`, 34166 data: "method=addColumn", 34167 type: "patch", 34168 success: this.attachTable.bind(this) 34169 }); 34170 } 34171 updateCell(event2) { 34172 Rails.ajax({ 34173 url: `/library/tables/${this.getID()}`, 34174 data: `method=updateCell&cell=${encodeURIComponent(event2.target.dataset.key)}&value=${encodeURIComponent(event2.target.value)}`, 34175 type: "patch" 34176 }); 34177 } 34178 getID() { 34179 return this.data.get("id"); 34180 } 34181 attachTable(tableAttachment) { 34182 let attachment = new no.Attachment(tableAttachment); 34183 var parent = this.element.parentNode; 34184 var editorNode = null; 34185 for (let i4 = 0; i4 < MAX_PARENT_SEARCH_DEPTH; i4++) { 34186 editorNode = parent.querySelector("trix-editor"); 34187 if (editorNode != null) { 34188 i4 = MAX_PARENT_SEARCH_DEPTH; 34189 } else { 34190 parent = parent.parentNode; 34191 } 34192 } 34193 editorNode.editor.insertAttachment(attachment); 34194 } 34195 }; 34196 34197
34197// app/javascript/controllers/table_refresh_controller.js 34198 var table_refresh_controller_default = class extends Controller { 34199 connect() { 34200 const targetTableId = this.element.dataset.targetTable; 34201 const frame = document.getElementById(targetTableId); 34202 if (frame) { 34203 frame.reload(); 34204 } 34205 } 34206 }; 34207 34208
34208// app/javascript/controllers/turbo_modal_controller.js 34209 var turbo_modal_controller_default = class extends Controller { 34210 connect() { 34211 } 34212 initialize() { 34213 this.element.setAttribute("data-action", "click->turbo-modal#click"); 34214 } 34215 click(e4) { 34216 e4.preventDefault(); 34217 this.url = this.element.getAttribute("href"); 34218 fetch(this.url, { 34219 headers: { 34220 Accept: "text/vnd.turbo-stream.html" 34221 } 34222 }).then((r4) => r4.text()).then((html) => Turbo.renderStreamMessage(html)); 34223 } 34224 }; 34225 34226
34226// app/javascript/controllers/turbo_rescue_controller.js 34227 var turbo_rescue_controller_default = class extends Controller { 34228 connect() { 34229 this.handleServerError = this.handleServerError.bind(this); 34230 this.handleBeforeFetchResponse = this.handleBeforeFetchResponse.bind(this); 34231 document.addEventListener("turbo:frame-missing", this.handleServerError); 34232 document.addEventListener("turbo:before-fetch-response", this.handleBeforeFetchResponse); 34233 } 34234 disconnect() { 34235 document.removeEventListener("turbo:frame-missing", this.handleServerError); 34236 document.removeEventListener("turbo:before-fetch-response", this.handleBeforeFetchResponse); 34237 } 34238 handleServerError(event2) { 34239 event2.preventDefault(); 34240 const systemAlertsElement = document.querySelector('[data-controller~="system-alerts"]'); 34241 if (systemAlertsElement) { 34242 const systemAlertsController = this.application.getControllerForElementAndIdentifier(systemAlertsElement, "system-alerts"); 34243 if (systemAlertsController) { 34244 systemAlertsController.createAlert("danger", "A system error occurred. Please try again or contact support if the issue persists."); 34245 } 34246 } 34247 } 34248 handleBeforeFetchResponse(event2) { 34249 const response = event2.detail.fetchResponse.response; 34250 if (response.status === 500) { 34251 this.handleServerError(event2); 34252 } 34253 } 34254 }; 34255 34256
34256// app/javascript/controllers/work_tabs_controller.js 34257 var work_tabs_controller_default = class extends Controller { 34258 show({ params: { panel } }) { 34259 this.tabTargets.forEach((tab) => { 34260 tab.classList.toggle("active", tab.dataset.workTabsPanelParam === panel); 34261 }); 34262 this.panelTargets.forEach((element) => { 34263 element.classList.toggle("hidden", element.dataset.workTabsPanel !== panel); 34264 }); 34265 } 34266 }; 34267 __publicField(work_tabs_controller_default, "targets", ["panel", "tab"]); 34268 34269
34269// app/javascript/controllers/works_formats_controller.js 34270 var works_formats_controller_default = class extends Controller { 34271 connect() { 34272 } 34273 toggle() { 34274 const svg = this.buttonTarget.querySelector("svg"); 34275 svg.classList.toggle("spin"); 34276 this.editionsTarget.classList.toggle("closed"); 34277 } 34278 }; 34279 __publicField(works_formats_controller_default, "targets", ["button", "editions"]); 34280 34281
34281// app/javascript/controllers/year_range_controller.js 34282 var year_range_controller_default = class extends Controller { 34283 connect() { 34284 this.updateFill(); 34285 this.updatePositions(); 34286 } 34287 update(event2) { 34288 let minVal = parseInt(this.minRangeTarget.value); 34289 let maxVal = parseInt(this.maxRangeTarget.value); 34290 if (minVal > maxVal) { 34291 if (event2.target === this.minRangeTarget) { 34292 this.minRangeTarget.value = maxVal; 34293 minVal = maxVal; 34294 } else { 34295 this.maxRangeTarget.value = minVal; 34296 maxVal = minVal; 34297 } 34298 } 34299 this.minDisplayTarget.value = minVal; 34300 this.maxDisplayTarget.value = maxVal; 34301 this.updateFill(); 34302 this.updatePositions(); 34303 } 34304 updateFromInput() { 34305 let minVal = parseInt(this.minDisplayTarget.value) || this.minValue; 34306 let maxVal = parseInt(this.maxDisplayTarget.value) || this.maxValue; 34307 minVal = Math.max(this.minValue, Math.min(minVal, maxVal)); 34308 maxVal = Math.min(this.maxValue, Math.max(maxVal, minVal)); 34309 this.minRangeTarget.value = minVal; 34310 this.maxRangeTarget.value = maxVal; 34311 this.minDisplayTarget.value = minVal; 34312 this.maxDisplayTarget.value = maxVal; 34313 this.updateFill(); 34314 this.updatePositions(); 34315 } 34316 updateFill() { 34317 const min2 = parseInt(this.minRangeTarget.value); 34318 const max2 = parseInt(this.maxRangeTarget.value); 34319 const total = this.maxValue - this.minValue; 34320 const leftPercent = (min2 - this.minValue) / total * 100; 34321 const widthPercent = (max2 - min2) / total * 100; 34322 this.fillTarget.style.left = leftPercent + "%"; 34323 this.fillTarget.style.width = widthPercent + "%"; 34324 } 34325 updatePositions() { 34326 const trackWidth = this.minRangeTarget.offsetWidth; 34327 if (!trackWidth) 34328 return; 34329 const thumbRadius = 8; 34330 const travelWidth = trackWidth - thumbRadius * 2; 34331 const total = this.maxValue - this.minValue; 34332 const minVal = parseInt(this.minRangeTarget.value); 34333 const maxVal = parseInt(this.maxRangeTarget.value); 34334 const minPx = thumbRadius + (minVal - this.minValue) / total * travelWidth; 34335 const maxPx = thumbRadius + (maxVal - this.minValue) / total * travelWidth; 34336 this.minDisplayTarget.style.left = minPx + "px"; 34337 this.maxDisplayTarget.style.left = maxPx + "px"; 34338 } 34339 }; 34340 __publicField(year_range_controller_default, "targets", ["minRange", "maxRange", "minDisplay", "maxDisplay", "fill"]); 34341 __publicField(year_range_controller_default, "values", { min: Number, max: Number }); 34342 34343
34343// app/javascript/controllers/index.js 34344 application.register("action-text-character-limiter", action_text_character_limiter_controller_default); 34345 application.register("activities-pika", activities_pika_controller_default); 34346 application.register("adv-search", adv_search_controller_default); 34347 application.register("aft-occ", aft_occ_controller_default); 34348 application.register("alerts", alerts_controller_default); 34349 application.register("alerts-toggle", alerts_toggle_controller_default); 34350 application.register("amount-amend", amount_amend_controller_default); 34351 application.register("asset-grid", asset_grid_controller_default); 34352 application.register("attd-val", attd_val_controller_default); 34353 application.register("auto-submit", auto_submit_controller_default); 34354 application.register("availability-all-day-toggle", availability_all_day_toggle_controller_default); 34355 application.register("banner-img", banner_img_controller_default); 34356 application.register("billing-address-form", billing_address_form_controller_default); 34357 application.register("blocked-delete", blocked_delete_controller_default); 34358 application.register("booking-button-enabler", booking_button_enabler_controller_default); 34359 application.register("borough-reload", borough_reload_controller_default); 34360 application.register("booking-form", booking_form_controller_default); 34361 application.register("booking-form-section", booking_form_section_controller_default); 34362 application.register("booking-form-submit-button", booking_form_submit_button_controller_default); 34363 application.register("booking-form-time-and-duration-button-enabler", booking_form_time_and_duration_button_enabler_controller_default); 34364 application.register("booking-summary", booking_summary_controller_default); 34365 application.register("booking-type-reason", booking_type_reason_controller_default); 34366 application.register("bookings-calendar", bookings_calendar_controller_default); 34367 application.register("bootstrap-modal", bootstrap_modal_controller_default); 34368 application.register("browser-location", browser_location_controller_default); 34369 application.register("call-to-action", call_to_action_controller_default); 34370 application.register("cat-grid-switch", cat_grid_switch_controller_default); 34371 application.register("charges-toggle", charges_toggle_controller_default); 34372 application.register("checkbox", checkbox_controller_default); 34373 application.register("checkbox-field", checkbox_field_controller_default); 34374 application.register("cms--bookings--booking-reason-toggle", booking_reason_toggle_controller_default); 34375 application.register("cms--ongoing-toggle", ongoing_toggle_controller_default); 34376 application.register("cms-booking-add-date", cms_booking_add_date_controller_default); 34377 application.register("cms-booking-form", cms_booking_form_controller_default); 34378 application.register("cms-booking-repeat", cms_booking_repeat_controller_default); 34379 application.register("cms-booking-specified-repeat-switcher", cms_booking_specified_repeat_switcher_controller_default); 34380 application.register("cms-business-booking-switcher", cms_business_booking_switcher_controller_default); 34381 application.register("cms-item-groups", cms_item_groups_controller_default); 34382 application.register("cms-location-role", cms_location_role_controller_default); 34383 application.register("cms-spinner", cms_spinner_controller_default); 34384 application.register("cms-user-form", cms_user_form_controller_default); 34385 application.register("dura-pick", dura_pick_controller_default); 34386 application.register("duration-picker", duration_picker_controller_default); 34387 application.register("facet-clear", facet_clear_controller_default); 34388 application.register("faqs", faqs_controller_default); 34389 application.register("filter-expand", filter_expand_controller_default); 34390 application.register("flash-notice", flash_notice_controller_default); 34391 application.register("headexpd", headexpd_controller_default); 34392 application.register("hello", hello_controller_default); 34393 application.register("hover-sync", hover_sync_controller_default); 34394 application.register("jump-to-page", jump_to_page_controller_default); 34395 application.register("listmodal", listmodal_controller_default); 34396 application.register("mob-sidebar", mob_sidebar_controller_default); 34397 application.register("mobile-burger", mobile_burger_controller_default); 34398 application.register("mobile-search", mobile_search_controller_default); 34399 application.register("nav-dropdown", nav_dropdown_controller_default); 34400 application.register("opayo-payment-attempt-form", opayo_payment_attempt_form_controller_default); 34401 application.register("opening-times", opening_times_controller_default); 34402 application.register("pikaday-init", pikaday_init_controller_default); 34403 application.register("progsteps", progsteps_controller_default); 34404 application.register("recite-me", recite_me_controller_default); 34405 application.register("region-london", region_london_controller_default); 34406 application.register("result-avail", result_avail_controller_default); 34407 application.register("rich-text-table", rich_text_table_controller_default); 34408 application.register("room-card-click-handler", room_card_click_handler_controller_default); 34409 application.register("search-filter", search_filter_controller_default); 34410 application.register("select-all", select_all_controller_default); 34411 application.register("select-button-disable", select_button_disable_controller_default); 34412 application.register("select-colour", select_colour_controller_default); 34413 application.register("sidebar-toggle", sidebar_toggle_controller_default); 34414 application.register("simple-open", simple_open_controller_default); 34415 application.register("space-attd-val", space_attd_val_controller_default); 34416 application.register("spaces-blocks", spaces_blocks_controller_default); 34417 application.register("spaces-boro-id", spaces_boro_id_controller_default); 34418 application.register("spaces-date-pika", spaces_date_pika_controller_default); 34419 application.register("spaces-finder-redirect", spaces_finder_redirect_controller_default); 34420 application.register("spaces-load-more", spaces_load_more_controller_default); 34421 application.register("spaces-section-toggle", spaces_section_toggle_controller_default); 34422 application.register("spaces-start-time", spaces_start_time_controller_default); 34423 application.register("system-alerts", system_alerts_controller_default); 34424 application.register("table-editor", table_editor_controller_default); 34425 application.register("table-refresh", table_refresh_controller_default); 34426 application.register("turbo-modal", turbo_modal_controller_default); 34427 application.register("turbo-rescue", turbo_rescue_controller_default); 34428 application.register("work-tabs", work_tabs_controller_default); 34429 application.register("works-formats", works_formats_controller_default); 34430 application.register("year-range", year_range_controller_default); 34431 34432
34432// app/javascript/modules/index.js 34433 var import_mutation_events = __toESM(require_mutation_events_min()); 34434 34435
vendor: 2,873 bytes, lines 34435-34585
34435// node_modules/swiper/shared/ssr-window.esm.mjs 34436 function isObject(obj) { 34437 return obj !== null && typeof obj === "object" && "constructor" in obj && obj.constructor === Object; 34438 } 34439 function extend3(target, src) { 34440 if (target === void 0) { 34441 target = {}; 34442 } 34443 if (src === void 0) { 34444 src = {}; 34445 } 34446 Object.keys(src).forEach((key) => { 34447 if (typeof target[key] === "undefined") 34448 target[key] = src[key]; 34449 else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { 34450 extend3(target[key], src[key]); 34451 } 34452 }); 34453 } 34454 var ssrDocument = { 34455 body: {}, 34456 addEventListener() { 34457 }, 34458 removeEventListener() { 34459 }, 34460 activeElement: { 34461 blur() { 34462 }, 34463 nodeName: "" 34464 }, 34465 querySelector() { 34466 return null; 34467 }, 34468 querySelectorAll() { 34469 return []; 34470 }, 34471 getElementById() { 34472 return null; 34473 }, 34474 createEvent() { 34475 return { 34476 initEvent() { 34477 } 34478 }; 34479 }, 34480 createElement() { 34481 return { 34482 children: [], 34483 childNodes: [], 34484 style: {}, 34485 setAttribute() { 34486 }, 34487 getElementsByTagName() { 34488 return []; 34489 } 34490 }; 34491 }, 34492 createElementNS() { 34493 return {}; 34494 }, 34495 importNode() { 34496 return null; 34497 }, 34498 location: { 34499 hash: "", 34500 host: "", 34501 hostname: "", 34502 href: "", 34503 origin: "", 34504 pathname: "", 34505 protocol: "", 34506 search: "" 34507 } 34508 }; 34509 function getDocument() { 34510 const doc = typeof document !== "undefined" ? document : {}; 34511 extend3(doc, ssrDocument); 34512 return doc; 34513 } 34514 var ssrWindow = { 34515 document: ssrDocument, 34516 navigator: { 34517 userAgent: "" 34518 }, 34519 location: { 34520 hash: "", 34521 host: "", 34522 hostname: "", 34523 href: "", 34524 origin: "", 34525 pathname: "", 34526 protocol: "", 34527 search: "" 34528 }, 34529 history: { 34530 replaceState() { 34531 }, 34532 pushState() { 34533 }, 34534 go() { 34535 }, 34536 back() { 34537 } 34538 }, 34539 CustomEvent: function CustomEvent3() { 34540 return this; 34541 }, 34542 addEventListener() { 34543 }, 34544 removeEventListener() { 34545 }, 34546 getComputedStyle() { 34547 return { 34548 getPropertyValue() { 34549 return ""; 34550 } 34551 }; 34552 }, 34553 Image() { 34554 }, 34555 Date() { 34556 }, 34557 screen: {}, 34558 setTimeout() { 34559 }, 34560 clearTimeout() { 34561 }, 34562 matchMedia() { 34563 return {}; 34564 }, 34565 requestAnimationFrame(callback) { 34566 if (typeof setTimeout === "undefined") { 34567 callback(); 34568 return null; 34569 } 34570 return setTimeout(callback, 0); 34571 }, 34572 cancelAnimationFrame(id2) { 34573 if (typeof setTimeout === "undefined") { 34574 return; 34575 } 34576 clearTimeout(id2); 34577 } 34578 }; 34579 function getWindow2() { 34580 const win = typeof window !== "undefined" ? window : {}; 34581 extend3(win, ssrWindow); 34582 return win; 34583 } 34584 34585
vendor: 8,107 bytes, lines 34585-34830
34585// node_modules/swiper/shared/utils.mjs 34586 function deleteProps(obj) { 34587 const object = obj; 34588 Object.keys(object).forEach((key) => { 34589 try { 34590 object[key] = null; 34591 } catch (e4) { 34592 } 34593 try { 34594 delete object[key]; 34595 } catch (e4) { 34596 } 34597 }); 34598 } 34599 function nextTick(callback, delay) { 34600 if (delay === void 0) { 34601 delay = 0; 34602 } 34603 return setTimeout(callback, delay); 34604 } 34605 function now2() { 34606 return Date.now(); 34607 } 34608 function getComputedStyle3(el) { 34609 const window2 = getWindow2(); 34610 let style; 34611 if (window2.getComputedStyle) { 34612 style = window2.getComputedStyle(el, null); 34613 } 34614 if (!style && el.currentStyle) { 34615 style = el.currentStyle; 34616 } 34617 if (!style) { 34618 style = el.style; 34619 } 34620 return style; 34621 } 34622 function getTranslate(el, axis) { 34623 if (axis === void 0) { 34624 axis = "x"; 34625 } 34626 const window2 = getWindow2(); 34627 let matrix; 34628 let curTransform; 34629 let transformMatrix; 34630 const curStyle = getComputedStyle3(el); 34631 if (window2.WebKitCSSMatrix) { 34632 curTransform = curStyle.transform || curStyle.webkitTransform; 34633 if (curTransform.split(",").length > 6) { 34634 curTransform = curTransform.split(", ").map((a4) => a4.replace(",", ".")).join(", "); 34635 } 34636 transformMatrix = new window2.WebKitCSSMatrix(curTransform === "none" ? "" : curTransform); 34637 } else { 34638 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,"); 34639 matrix = transformMatrix.toString().split(","); 34640 } 34641 if (axis === "x") { 34642 if (window2.WebKitCSSMatrix) 34643 curTransform = transformMatrix.m41; 34644 else if (matrix.length === 16) 34645 curTransform = parseFloat(matrix[12]); 34646 else 34647 curTransform = parseFloat(matrix[4]); 34648 } 34649 if (axis === "y") { 34650 if (window2.WebKitCSSMatrix) 34651 curTransform = transformMatrix.m42; 34652 else if (matrix.length === 16) 34653 curTransform = parseFloat(matrix[13]); 34654 else 34655 curTransform = parseFloat(matrix[5]); 34656 } 34657 return curTransform || 0; 34658 } 34659 function isObject2(o3) { 34660 return typeof o3 === "object" && o3 !== null && o3.constructor && Object.prototype.toString.call(o3).slice(8, -1) === "Object"; 34661 } 34662 function isNode(node) { 34663 if (typeof window !== "undefined" && typeof window.HTMLElement !== "undefined") { 34664 return node instanceof HTMLElement; 34665 } 34666 return node && (node.nodeType === 1 || node.nodeType === 11); 34667 } 34668 function extend4() { 34669 const to2 = Object(arguments.length <= 0 ? void 0 : arguments[0]); 34670 const noExtend = ["__proto__", "constructor", "prototype"]; 34671 for (let i4 = 1; i4 < arguments.length; i4 += 1) { 34672 const nextSource = i4 < 0 || arguments.length <= i4 ? void 0 : arguments[i4]; 34673 if (nextSource !== void 0 && nextSource !== null && !isNode(nextSource)) { 34674 const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0); 34675 for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { 34676 const nextKey = keysArray[nextIndex]; 34677 const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 34678 if (desc !== void 0 && desc.enumerable) { 34679 if (isObject2(to2[nextKey]) && isObject2(nextSource[nextKey])) { 34680 if (nextSource[nextKey].__swiper__) { 34681 to2[nextKey] = nextSource[nextKey]; 34682 } else { 34683 extend4(to2[nextKey], nextSource[nextKey]); 34684 } 34685 } else if (!isObject2(to2[nextKey]) && isObject2(nextSource[nextKey])) { 34686 to2[nextKey] = {}; 34687 if (nextSource[nextKey].__swiper__) { 34688 to2[nextKey] = nextSource[nextKey]; 34689 } else { 34690 extend4(to2[nextKey], nextSource[nextKey]); 34691 } 34692 } else { 34693 to2[nextKey] = nextSource[nextKey]; 34694 } 34695 } 34696 } 34697 } 34698 } 34699 return to2; 34700 } 34701 function setCSSProperty(el, varName, varValue) { 34702 el.style.setProperty(varName, varValue); 34703 } 34704 function animateCSSModeScroll(_ref) { 34705 let { 34706 swiper, 34707 targetPosition, 34708 side 34709 } = _ref; 34710 const window2 = getWindow2(); 34711 const startPosition = -swiper.translate; 34712 let startTime = null; 34713 let time; 34714 const duration = swiper.params.speed; 34715 swiper.wrapperEl.style.scrollSnapType = "none"; 34716 window2.cancelAnimationFrame(swiper.cssModeFrameID); 34717 const dir = targetPosition > startPosition ? "next" : "prev"; 34718 const isOutOfBound = (current, target) => { 34719 return dir === "next" && current >= target || dir === "prev" && current <= target; 34720 }; 34721 const animate = () => { 34722 time = new Date().getTime(); 34723 if (startTime === null) { 34724 startTime = time; 34725 } 34726 const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); 34727 const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; 34728 let currentPosition = startPosition + easeProgress * (targetPosition - startPosition); 34729 if (isOutOfBound(currentPosition, targetPosition)) { 34730 currentPosition = targetPosition; 34731 } 34732 swiper.wrapperEl.scrollTo({ 34733 [side]: currentPosition 34734 }); 34735 if (isOutOfBound(currentPosition, targetPosition)) { 34736 swiper.wrapperEl.style.overflow = "hidden"; 34737 swiper.wrapperEl.style.scrollSnapType = ""; 34738 setTimeout(() => { 34739 swiper.wrapperEl.style.overflow = ""; 34740 swiper.wrapperEl.scrollTo({ 34741 [side]: currentPosition 34742 }); 34743 }); 34744 window2.cancelAnimationFrame(swiper.cssModeFrameID); 34745 return; 34746 } 34747 swiper.cssModeFrameID = window2.requestAnimationFrame(animate); 34748 }; 34749 animate(); 34750 } 34751 function elementChildren(element, selector) { 34752 if (selector === void 0) { 34753 selector = ""; 34754 } 34755 return [...element.children].filter((el) => el.matches(selector)); 34756 } 34757 function createElement(tag, classes2) { 34758 if (classes2 === void 0) { 34759 classes2 = []; 34760 } 34761 const el = document.createElement(tag); 34762 el.classList.add(...Array.isArray(classes2) ? classes2 : [classes2]); 34763 return el; 34764 } 34765 function elementPrevAll(el, selector) { 34766 const prevEls = []; 34767 while (el.previousElementSibling) { 34768 const prev = el.previousElementSibling; 34769 if (selector) { 34770 if (prev.matches(selector)) 34771 prevEls.push(prev); 34772 } else 34773 prevEls.push(prev); 34774 el = prev; 34775 } 34776 return prevEls; 34777 } 34778 function elementNextAll(el, selector) { 34779 const nextEls = []; 34780 while (el.nextElementSibling) { 34781 const next = el.nextElementSibling; 34782 if (selector) { 34783 if (next.matches(selector)) 34784 nextEls.push(next); 34785 } else 34786 nextEls.push(next); 34787 el = next; 34788 } 34789 return nextEls; 34790 } 34791 function elementStyle(el, prop) { 34792 const window2 = getWindow2(); 34793 return window2.getComputedStyle(el, null).getPropertyValue(prop); 34794 } 34795 function elementIndex(el) { 34796 let child = el; 34797 let i4; 34798 if (child) { 34799 i4 = 0; 34800 while ((child = child.previousSibling) !== null) { 34801 if (child.nodeType === 1) 34802 i4 += 1; 34803 } 34804 return i4; 34805 } 34806 return void 0; 34807 } 34808 function elementParents(el, selector) { 34809 const parents = []; 34810 let parent = el.parentElement; 34811 while (parent) { 34812 if (selector) { 34813 if (parent.matches(selector)) 34814 parents.push(parent); 34815 } else { 34816 parents.push(parent); 34817 } 34818 parent = parent.parentElement; 34819 } 34820 return parents; 34821 } 34822 function elementOuterSize(el, size, includeMargins) { 34823 const window2 = getWindow2(); 34824 if (includeMargins) { 34825 return el[size === "width" ? "offsetWidth" : "offsetHeight"] + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-right" : "margin-top")) + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-left" : "margin-bottom")); 34826 } 34827 return el.offsetWidth; 34828 } 34829 34830
vendor: 121,162 bytes, lines 34830-38342
34830// node_modules/swiper/shared/swiper-core.mjs 34831 var support; 34832 function calcSupport() { 34833 const window2 = getWindow2(); 34834 const document2 = getDocument(); 34835 return { 34836 smoothScroll: document2.documentElement && document2.documentElement.style && "scrollBehavior" in document2.documentElement.style, 34837 touch: !!("ontouchstart" in window2 || window2.DocumentTouch && document2 instanceof window2.DocumentTouch) 34838 }; 34839 } 34840 function getSupport() { 34841 if (!support) { 34842 support = calcSupport(); 34843 } 34844 return support; 34845 } 34846 var deviceCached; 34847 function calcDevice(_temp) { 34848 let { 34849 userAgent 34850 } = _temp === void 0 ? {} : _temp; 34851 const support2 = getSupport(); 34852 const window2 = getWindow2(); 34853 const platform = window2.navigator.platform; 34854 const ua = userAgent || window2.navigator.userAgent; 34855 const device = { 34856 ios: false, 34857 android: false 34858 }; 34859 const screenWidth = window2.screen.width; 34860 const screenHeight = window2.screen.height; 34861 const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); 34862 let ipad = ua.match(/(iPad).*OS\s([\d_]+)/); 34863 const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); 34864 const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); 34865 const windows = platform === "Win32"; 34866 let macos = platform === "MacIntel"; 34867 const iPadScreens = ["1024x1366", "1366x1024", "834x1194", "1194x834", "834x1112", "1112x834", "768x1024", "1024x768", "820x1180", "1180x820", "810x1080", "1080x810"]; 34868 if (!ipad && macos && support2.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) { 34869 ipad = ua.match(/(Version)\/([\d.]+)/); 34870 if (!ipad) 34871 ipad = [0, 1, "13_0_0"]; 34872 macos = false; 34873 } 34874 if (android && !windows) { 34875 device.os = "android"; 34876 device.android = true; 34877 } 34878 if (ipad || iphone || ipod) { 34879 device.os = "ios"; 34880 device.ios = true; 34881 } 34882 return device; 34883 } 34884 function getDevice(overrides) { 34885 if (overrides === void 0) { 34886 overrides = {}; 34887 } 34888 if (!deviceCached) { 34889 deviceCached = calcDevice(overrides); 34890 } 34891 return deviceCached; 34892 } 34893 var browser; 34894 function calcBrowser() { 34895 const window2 = getWindow2(); 34896 let needPerspectiveFix = false; 34897 function isSafari() { 34898 const ua = window2.navigator.userAgent.toLowerCase(); 34899 return ua.indexOf("safari") >= 0 && ua.indexOf("chrome") < 0 && ua.indexOf("android") < 0; 34900 } 34901 if (isSafari()) { 34902 const ua = String(window2.navigator.userAgent); 34903 if (ua.includes("Version/")) { 34904 const [major, minor] = ua.split("Version/")[1].split(" ")[0].split(".").map((num) => Number(num)); 34905 needPerspectiveFix = major < 16 || major === 16 && minor < 2; 34906 } 34907 } 34908 return { 34909 isSafari: needPerspectiveFix || isSafari(), 34910 needPerspectiveFix, 34911 isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window2.navigator.userAgent) 34912 }; 34913 } 34914 function getBrowser() { 34915 if (!browser) { 34916 browser = calcBrowser(); 34917 } 34918 return browser; 34919 } 34920 function Resize(_ref) { 34921 let { 34922 swiper, 34923 on: on2, 34924 emit 34925 } = _ref; 34926 const window2 = getWindow2(); 34927 let observer = null; 34928 let animationFrame = null; 34929 const resizeHandler = () => { 34930 if (!swiper || swiper.destroyed || !swiper.initialized) 34931 return; 34932 emit("beforeResize"); 34933 emit("resize"); 34934 }; 34935 const createObserver = () => { 34936 if (!swiper || swiper.destroyed || !swiper.initialized) 34937 return; 34938 observer = new ResizeObserver((entries) => { 34939 animationFrame = window2.requestAnimationFrame(() => { 34940 const { 34941 width, 34942 height 34943 } = swiper; 34944 let newWidth = width; 34945 let newHeight = height; 34946 entries.forEach((_ref2) => { 34947 let { 34948 contentBoxSize, 34949 contentRect, 34950 target 34951 } = _ref2; 34952 if (target && target !== swiper.el) 34953 return; 34954 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize; 34955 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize; 34956 }); 34957 if (newWidth !== width || newHeight !== height) { 34958 resizeHandler(); 34959 } 34960 }); 34961 }); 34962 observer.observe(swiper.el); 34963 }; 34964 const removeObserver = () => { 34965 if (animationFrame) { 34966 window2.cancelAnimationFrame(animationFrame); 34967 } 34968 if (observer && observer.unobserve && swiper.el) { 34969 observer.unobserve(swiper.el); 34970 observer = null; 34971 } 34972 }; 34973 const orientationChangeHandler = () => { 34974 if (!swiper || swiper.destroyed || !swiper.initialized) 34975 return; 34976 emit("orientationchange"); 34977 }; 34978 on2("init", () => { 34979 if (swiper.params.resizeObserver && typeof window2.ResizeObserver !== "undefined") { 34980 createObserver(); 34981 return; 34982 } 34983 window2.addEventListener("resize", resizeHandler); 34984 window2.addEventListener("orientationchange", orientationChangeHandler); 34985 }); 34986 on2("destroy", () => { 34987 removeObserver(); 34988 window2.removeEventListener("resize", resizeHandler); 34989 window2.removeEventListener("orientationchange", orientationChangeHandler); 34990 }); 34991 } 34992 function Observer(_ref) { 34993 let { 34994 swiper, 34995 extendParams, 34996 on: on2, 34997 emit 34998 } = _ref; 34999 const observers = []; 35000 const window2 = getWindow2(); 35001 const attach = function(target, options) { 35002 if (options === void 0) { 35003 options = {}; 35004 } 35005 const ObserverFunc = window2.MutationObserver || window2.WebkitMutationObserver; 35006 const observer = new ObserverFunc((mutations) => { 35007 if (swiper.__preventObserver__) 35008 return; 35009 if (mutations.length === 1) { 35010 emit("observerUpdate", mutations[0]); 35011 return; 35012 } 35013 const observerUpdate = function observerUpdate2() { 35014 emit("observerUpdate", mutations[0]); 35015 }; 35016 if (window2.requestAnimationFrame) { 35017 window2.requestAnimationFrame(observerUpdate); 35018 } else { 35019 window2.setTimeout(observerUpdate, 0); 35020 } 35021 }); 35022 observer.observe(target, { 35023 attributes: typeof options.attributes === "undefined" ? true : options.attributes, 35024 childList: typeof options.childList === "undefined" ? true : options.childList, 35025 characterData: typeof options.characterData === "undefined" ? true : options.characterData 35026 }); 35027 observers.push(observer); 35028 }; 35029 const init = () => { 35030 if (!swiper.params.observer) 35031 return; 35032 if (swiper.params.observeParents) { 35033 const containerParents = elementParents(swiper.hostEl); 35034 for (let i4 = 0; i4 < containerParents.length; i4 += 1) { 35035 attach(containerParents[i4]); 35036 } 35037 } 35038 attach(swiper.hostEl, { 35039 childList: swiper.params.observeSlideChildren 35040 }); 35041 attach(swiper.wrapperEl, { 35042 attributes: false 35043 }); 35044 }; 35045 const destroy2 = () => { 35046 observers.forEach((observer) => { 35047 observer.disconnect(); 35048 }); 35049 observers.splice(0, observers.length); 35050 }; 35051 extendParams({ 35052 observer: false, 35053 observeParents: false, 35054 observeSlideChildren: false 35055 }); 35056 on2("init", init); 35057 on2("destroy", destroy2); 35058 } 35059 var eventsEmitter = { 35060 on(events2, handler, priority) { 35061 const self = this; 35062 if (!self.eventsListeners || self.destroyed) 35063 return self; 35064 if (typeof handler !== "function") 35065 return self; 35066 const method = priority ? "unshift" : "push"; 35067 events2.split(" ").forEach((event2) => { 35068 if (!self.eventsListeners[event2]) 35069 self.eventsListeners[event2] = []; 35070 self.eventsListeners[event2][method](handler); 35071 }); 35072 return self; 35073 }, 35074 once(events2, handler, priority) { 35075 const self = this; 35076 if (!self.eventsListeners || self.destroyed) 35077 return self; 35078 if (typeof handler !== "function") 35079 return self; 35080 function onceHandler() { 35081 self.off(events2, onceHandler); 35082 if (onceHandler.__emitterProxy) { 35083 delete onceHandler.__emitterProxy; 35084 } 35085 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 35086 args[_key] = arguments[_key]; 35087 } 35088 handler.apply(self, args); 35089 } 35090 onceHandler.__emitterProxy = handler; 35091 return self.on(events2, onceHandler, priority); 35092 }, 35093 onAny(handler, priority) { 35094 const self = this; 35095 if (!self.eventsListeners || self.destroyed) 35096 return self; 35097 if (typeof handler !== "function") 35098 return self; 35099 const method = priority ? "unshift" : "push"; 35100 if (self.eventsAnyListeners.indexOf(handler) < 0) { 35101 self.eventsAnyListeners[method](handler); 35102 } 35103 return self; 35104 }, 35105 offAny(handler) { 35106 const self = this; 35107 if (!self.eventsListeners || self.destroyed) 35108 return self; 35109 if (!self.eventsAnyListeners) 35110 return self; 35111 const index4 = self.eventsAnyListeners.indexOf(handler); 35112 if (index4 >= 0) { 35113 self.eventsAnyListeners.splice(index4, 1); 35114 } 35115 return self; 35116 }, 35117 off(events2, handler) { 35118 const self = this; 35119 if (!self.eventsListeners || self.destroyed) 35120 return self; 35121 if (!self.eventsListeners) 35122 return self; 35123 events2.split(" ").forEach((event2) => { 35124 if (typeof handler === "undefined") { 35125 self.eventsListeners[event2] = []; 35126 } else if (self.eventsListeners[event2]) { 35127 self.eventsListeners[event2].forEach((eventHandler, index4) => { 35128 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) { 35129 self.eventsListeners[event2].splice(index4, 1); 35130 } 35131 }); 35132 } 35133 }); 35134 return self; 35135 }, 35136 emit() { 35137 const self = this; 35138 if (!self.eventsListeners || self.destroyed) 35139 return self; 35140 if (!self.eventsListeners) 35141 return self; 35142 let events2; 35143 let data; 35144 let context; 35145 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 35146 args[_key2] = arguments[_key2]; 35147 } 35148 if (typeof args[0] === "string" || Array.isArray(args[0])) { 35149 events2 = args[0]; 35150 data = args.slice(1, args.length); 35151 context = self; 35152 } else { 35153 events2 = args[0].events; 35154 data = args[0].data; 35155 context = args[0].context || self; 35156 } 35157 data.unshift(context); 35158 const eventsArray = Array.isArray(events2) ? events2 : events2.split(" "); 35159 eventsArray.forEach((event2) => { 35160 if (self.eventsAnyListeners && self.eventsAnyListeners.length) { 35161 self.eventsAnyListeners.forEach((eventHandler) => { 35162 eventHandler.apply(context, [event2, ...data]); 35163 }); 35164 } 35165 if (self.eventsListeners && self.eventsListeners[event2]) { 35166 self.eventsListeners[event2].forEach((eventHandler) => { 35167 eventHandler.apply(context, data); 35168 }); 35169 } 35170 }); 35171 return self; 35172 } 35173 }; 35174 function updateSize() { 35175 const swiper = this; 35176 let width; 35177 let height; 35178 const el = swiper.el; 35179 if (typeof swiper.params.width !== "undefined" && swiper.params.width !== null) { 35180 width = swiper.params.width; 35181 } else { 35182 width = el.clientWidth; 35183 } 35184 if (typeof swiper.params.height !== "undefined" && swiper.params.height !== null) { 35185 height = swiper.params.height; 35186 } else { 35187 height = el.clientHeight; 35188 } 35189 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) { 35190 return; 35191 } 35192 width = width - parseInt(elementStyle(el, "padding-left") || 0, 10) - parseInt(elementStyle(el, "padding-right") || 0, 10); 35193 height = height - parseInt(elementStyle(el, "padding-top") || 0, 10) - parseInt(elementStyle(el, "padding-bottom") || 0, 10); 35194 if (Number.isNaN(width)) 35195 width = 0; 35196 if (Number.isNaN(height)) 35197 height = 0; 35198 Object.assign(swiper, { 35199 width, 35200 height, 35201 size: swiper.isHorizontal() ? width : height 35202 }); 35203 } 35204 function updateSlides() { 35205 const swiper = this; 35206 function getDirectionLabel(property) { 35207 if (swiper.isHorizontal()) { 35208 return property; 35209 } 35210 return { 35211 "width": "height", 35212 "margin-top": "margin-left", 35213 "margin-bottom ": "margin-right", 35214 "margin-left": "margin-top", 35215 "margin-right": "margin-bottom", 35216 "padding-left": "padding-top", 35217 "padding-right": "padding-bottom", 35218 "marginRight": "marginBottom" 35219 }[property]; 35220 } 35221 function getDirectionPropertyValue(node, label) { 35222 return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0); 35223 } 35224 const params = swiper.params; 35225 const { 35226 wrapperEl, 35227 slidesEl, 35228 size: swiperSize, 35229 rtlTranslate: rtl, 35230 wrongRTL 35231 } = swiper; 35232 const isVirtual = swiper.virtual && params.virtual.enabled; 35233 const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; 35234 const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`); 35235 const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; 35236 let snapGrid = []; 35237 const slidesGrid = []; 35238 const slidesSizesGrid = []; 35239 let offsetBefore = params.slidesOffsetBefore; 35240 if (typeof offsetBefore === "function") { 35241 offsetBefore = params.slidesOffsetBefore.call(swiper); 35242 } 35243 let offsetAfter = params.slidesOffsetAfter; 35244 if (typeof offsetAfter === "function") { 35245 offsetAfter = params.slidesOffsetAfter.call(swiper); 35246 } 35247 const previousSnapGridLength = swiper.snapGrid.length; 35248 const previousSlidesGridLength = swiper.slidesGrid.length; 35249 let spaceBetween = params.spaceBetween; 35250 let slidePosition = -offsetBefore; 35251 let prevSlideSize = 0; 35252 let index4 = 0; 35253 if (typeof swiperSize === "undefined") { 35254 return; 35255 } 35256 if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) { 35257 spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiperSize; 35258 } else if (typeof spaceBetween === "string") { 35259 spaceBetween = parseFloat(spaceBetween); 35260 } 35261 swiper.virtualSize = -spaceBetween; 35262 slides.forEach((slideEl) => { 35263 if (rtl) { 35264 slideEl.style.marginLeft = ""; 35265 } else { 35266 slideEl.style.marginRight = ""; 35267 } 35268 slideEl.style.marginBottom = ""; 35269 slideEl.style.marginTop = ""; 35270 }); 35271 if (params.centeredSlides && params.cssMode) { 35272 setCSSProperty(wrapperEl, "--swiper-centered-offset-before", ""); 35273 setCSSProperty(wrapperEl, "--swiper-centered-offset-after", ""); 35274 } 35275 const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; 35276 if (gridEnabled) { 35277 swiper.grid.initSlides(slidesLength); 35278 } 35279 let slideSize; 35280 const shouldResetSlideSize = params.slidesPerView === "auto" && params.breakpoints && Object.keys(params.breakpoints).filter((key) => { 35281 return typeof params.breakpoints[key].slidesPerView !== "undefined"; 35282 }).length > 0; 35283 for (let i4 = 0; i4 < slidesLength; i4 += 1) { 35284 slideSize = 0; 35285 let slide2; 35286 if (slides[i4]) 35287 slide2 = slides[i4]; 35288 if (gridEnabled) { 35289 swiper.grid.updateSlide(i4, slide2, slidesLength, getDirectionLabel); 35290 } 35291 if (slides[i4] && elementStyle(slide2, "display") === "none") 35292 continue; 35293 if (params.slidesPerView === "auto") { 35294 if (shouldResetSlideSize) { 35295 slides[i4].style[getDirectionLabel("width")] = ``; 35296 } 35297 const slideStyles = getComputedStyle(slide2); 35298 const currentTransform = slide2.style.transform; 35299 const currentWebKitTransform = slide2.style.webkitTransform; 35300 if (currentTransform) { 35301 slide2.style.transform = "none"; 35302 } 35303 if (currentWebKitTransform) { 35304 slide2.style.webkitTransform = "none"; 35305 } 35306 if (params.roundLengths) { 35307 slideSize = swiper.isHorizontal() ? elementOuterSize(slide2, "width", true) : elementOuterSize(slide2, "height", true); 35308 } else { 35309 const width = getDirectionPropertyValue(slideStyles, "width"); 35310 const paddingLeft = getDirectionPropertyValue(slideStyles, "padding-left"); 35311 const paddingRight = getDirectionPropertyValue(slideStyles, "padding-right"); 35312 const marginLeft = getDirectionPropertyValue(slideStyles, "margin-left"); 35313 const marginRight = getDirectionPropertyValue(slideStyles, "margin-right"); 35314 const boxSizing = slideStyles.getPropertyValue("box-sizing"); 35315 if (boxSizing && boxSizing === "border-box") { 35316 slideSize = width + marginLeft + marginRight; 35317 } else { 35318 const { 35319 clientWidth, 35320 offsetWidth 35321 } = slide2; 35322 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth); 35323 } 35324 } 35325 if (currentTransform) { 35326 slide2.style.transform = currentTransform; 35327 } 35328 if (currentWebKitTransform) { 35329 slide2.style.webkitTransform = currentWebKitTransform; 35330 } 35331 if (params.roundLengths) 35332 slideSize = Math.floor(slideSize); 35333 } else { 35334 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView; 35335 if (params.roundLengths) 35336 slideSize = Math.floor(slideSize); 35337 if (slides[i4]) { 35338 slides[i4].style[getDirectionLabel("width")] = `${slideSize}px`; 35339 } 35340 } 35341 if (slides[i4]) { 35342 slides[i4].swiperSlideSize = slideSize; 35343 } 35344 slidesSizesGrid.push(slideSize); 35345 if (params.centeredSlides) { 35346 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; 35347 if (prevSlideSize === 0 && i4 !== 0) 35348 slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 35349 if (i4 === 0) 35350 slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 35351 if (Math.abs(slidePosition) < 1 / 1e3) 35352 slidePosition = 0; 35353 if (params.roundLengths) 35354 slidePosition = Math.floor(slidePosition); 35355 if (index4 % params.slidesPerGroup === 0) 35356 snapGrid.push(slidePosition); 35357 slidesGrid.push(slidePosition); 35358 } else { 35359 if (params.roundLengths) 35360 slidePosition = Math.floor(slidePosition); 35361 if ((index4 - Math.min(swiper.params.slidesPerGroupSkip, index4)) % swiper.params.slidesPerGroup === 0) 35362 snapGrid.push(slidePosition); 35363 slidesGrid.push(slidePosition); 35364 slidePosition = slidePosition + slideSize + spaceBetween; 35365 } 35366 swiper.virtualSize += slideSize + spaceBetween; 35367 prevSlideSize = slideSize; 35368 index4 += 1; 35369 } 35370 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; 35371 if (rtl && wrongRTL && (params.effect === "slide" || params.effect === "coverflow")) { 35372 wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`; 35373 } 35374 if (params.setWrapperSize) { 35375 wrapperEl.style[getDirectionLabel("width")] = `${swiper.virtualSize + spaceBetween}px`; 35376 } 35377 if (gridEnabled) { 35378 swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel); 35379 } 35380 if (!params.centeredSlides) { 35381 const newSlidesGrid = []; 35382 for (let i4 = 0; i4 < snapGrid.length; i4 += 1) { 35383 let slidesGridItem = snapGrid[i4]; 35384 if (params.roundLengths) 35385 slidesGridItem = Math.floor(slidesGridItem); 35386 if (snapGrid[i4] <= swiper.virtualSize - swiperSize) { 35387 newSlidesGrid.push(slidesGridItem); 35388 } 35389 } 35390 snapGrid = newSlidesGrid; 35391 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { 35392 snapGrid.push(swiper.virtualSize - swiperSize); 35393 } 35394 } 35395 if (isVirtual && params.loop) { 35396 const size = slidesSizesGrid[0] + spaceBetween; 35397 if (params.slidesPerGroup > 1) { 35398 const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup); 35399 const groupSize = size * params.slidesPerGroup; 35400 for (let i4 = 0; i4 < groups; i4 += 1) { 35401 snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize); 35402 } 35403 } 35404 for (let i4 = 0; i4 < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i4 += 1) { 35405 if (params.slidesPerGroup === 1) { 35406 snapGrid.push(snapGrid[snapGrid.length - 1] + size); 35407 } 35408 slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size); 35409 swiper.virtualSize += size; 35410 } 35411 } 35412 if (snapGrid.length === 0) 35413 snapGrid = [0]; 35414 if (spaceBetween !== 0) { 35415 const key = swiper.isHorizontal() && rtl ? "marginLeft" : getDirectionLabel("marginRight"); 35416 slides.filter((_4, slideIndex) => { 35417 if (!params.cssMode || params.loop) 35418 return true; 35419 if (slideIndex === slides.length - 1) { 35420 return false; 35421 } 35422 return true; 35423 }).forEach((slideEl) => { 35424 slideEl.style[key] = `${spaceBetween}px`; 35425 }); 35426 } 35427 if (params.centeredSlides && params.centeredSlidesBounds) { 35428 let allSlidesSize = 0; 35429 slidesSizesGrid.forEach((slideSizeValue) => { 35430 allSlidesSize += slideSizeValue + (spaceBetween || 0); 35431 }); 35432 allSlidesSize -= spaceBetween; 35433 const maxSnap = allSlidesSize - swiperSize; 35434 snapGrid = snapGrid.map((snap) => { 35435 if (snap <= 0) 35436 return -offsetBefore; 35437 if (snap > maxSnap) 35438 return maxSnap + offsetAfter; 35439 return snap; 35440 }); 35441 } 35442 if (params.centerInsufficientSlides) { 35443 let allSlidesSize = 0; 35444 slidesSizesGrid.forEach((slideSizeValue) => { 35445 allSlidesSize += slideSizeValue + (spaceBetween || 0); 35446 }); 35447 allSlidesSize -= spaceBetween; 35448 if (allSlidesSize < swiperSize) { 35449 const allSlidesOffset = (swiperSize - allSlidesSize) / 2; 35450 snapGrid.forEach((snap, snapIndex) => { 35451 snapGrid[snapIndex] = snap - allSlidesOffset; 35452 }); 35453 slidesGrid.forEach((snap, snapIndex) => { 35454 slidesGrid[snapIndex] = snap + allSlidesOffset; 35455 }); 35456 } 35457 } 35458 Object.assign(swiper, { 35459 slides, 35460 snapGrid, 35461 slidesGrid, 35462 slidesSizesGrid 35463 }); 35464 if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) { 35465 setCSSProperty(wrapperEl, "--swiper-centered-offset-before", `${-snapGrid[0]}px`); 35466 setCSSProperty(wrapperEl, "--swiper-centered-offset-after", `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`); 35467 const addToSnapGrid = -swiper.snapGrid[0]; 35468 const addToSlidesGrid = -swiper.slidesGrid[0]; 35469 swiper.snapGrid = swiper.snapGrid.map((v4) => v4 + addToSnapGrid); 35470 swiper.slidesGrid = swiper.slidesGrid.map((v4) => v4 + addToSlidesGrid); 35471 } 35472 if (slidesLength !== previousSlidesLength) { 35473 swiper.emit("slidesLengthChange"); 35474 } 35475 if (snapGrid.length !== previousSnapGridLength) { 35476 if (swiper.params.watchOverflow) 35477 swiper.checkOverflow(); 35478 swiper.emit("snapGridLengthChange"); 35479 } 35480 if (slidesGrid.length !== previousSlidesGridLength) { 35481 swiper.emit("slidesGridLengthChange"); 35482 } 35483 if (params.watchSlidesProgress) { 35484 swiper.updateSlidesOffset(); 35485 } 35486 if (!isVirtual && !params.cssMode && (params.effect === "slide" || params.effect === "fade")) { 35487 const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`; 35488 const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass); 35489 if (slidesLength <= params.maxBackfaceHiddenSlides) { 35490 if (!hasClassBackfaceClassAdded) 35491 swiper.el.classList.add(backFaceHiddenClass); 35492 } else if (hasClassBackfaceClassAdded) { 35493 swiper.el.classList.remove(backFaceHiddenClass); 35494 } 35495 } 35496 } 35497 function updateAutoHeight(speed) { 35498 const swiper = this; 35499 const activeSlides = []; 35500 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 35501 let newHeight = 0; 35502 let i4; 35503 if (typeof speed === "number") { 35504 swiper.setTransition(speed); 35505 } else if (speed === true) { 35506 swiper.setTransition(swiper.params.speed); 35507 } 35508 const getSlideByIndex = (index4) => { 35509 if (isVirtual) { 35510 return swiper.slides[swiper.getSlideIndexByData(index4)]; 35511 } 35512 return swiper.slides[index4]; 35513 }; 35514 if (swiper.params.slidesPerView !== "auto" && swiper.params.slidesPerView > 1) { 35515 if (swiper.params.centeredSlides) { 35516 (swiper.visibleSlides || []).forEach((slide2) => { 35517 activeSlides.push(slide2); 35518 }); 35519 } else { 35520 for (i4 = 0; i4 < Math.ceil(swiper.params.slidesPerView); i4 += 1) { 35521 const index4 = swiper.activeIndex + i4; 35522 if (index4 > swiper.slides.length && !isVirtual) 35523 break; 35524 activeSlides.push(getSlideByIndex(index4)); 35525 } 35526 } 35527 } else { 35528 activeSlides.push(getSlideByIndex(swiper.activeIndex)); 35529 } 35530 for (i4 = 0; i4 < activeSlides.length; i4 += 1) { 35531 if (typeof activeSlides[i4] !== "undefined") { 35532 const height = activeSlides[i4].offsetHeight; 35533 newHeight = height > newHeight ? height : newHeight; 35534 } 35535 } 35536 if (newHeight || newHeight === 0) 35537 swiper.wrapperEl.style.height = `${newHeight}px`; 35538 } 35539 function updateSlidesOffset() { 35540 const swiper = this; 35541 const slides = swiper.slides; 35542 const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0; 35543 for (let i4 = 0; i4 < slides.length; i4 += 1) { 35544 slides[i4].swiperSlideOffset = (swiper.isHorizontal() ? slides[i4].offsetLeft : slides[i4].offsetTop) - minusOffset - swiper.cssOverflowAdjustment(); 35545 } 35546 } 35547 function updateSlidesProgress(translate2) { 35548 if (translate2 === void 0) { 35549 translate2 = this && this.translate || 0; 35550 } 35551 const swiper = this; 35552 const params = swiper.params; 35553 const { 35554 slides, 35555 rtlTranslate: rtl, 35556 snapGrid 35557 } = swiper; 35558 if (slides.length === 0) 35559 return; 35560 if (typeof slides[0].swiperSlideOffset === "undefined") 35561 swiper.updateSlidesOffset(); 35562 let offsetCenter = -translate2; 35563 if (rtl) 35564 offsetCenter = translate2; 35565 slides.forEach((slideEl) => { 35566 slideEl.classList.remove(params.slideVisibleClass); 35567 }); 35568 swiper.visibleSlidesIndexes = []; 35569 swiper.visibleSlides = []; 35570 let spaceBetween = params.spaceBetween; 35571 if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) { 35572 spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiper.size; 35573 } else if (typeof spaceBetween === "string") { 35574 spaceBetween = parseFloat(spaceBetween); 35575 } 35576 for (let i4 = 0; i4 < slides.length; i4 += 1) { 35577 const slide2 = slides[i4]; 35578 let slideOffset = slide2.swiperSlideOffset; 35579 if (params.cssMode && params.centeredSlides) { 35580 slideOffset -= slides[0].swiperSlideOffset; 35581 } 35582 const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween); 35583 const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween); 35584 const slideBefore = -(offsetCenter - slideOffset); 35585 const slideAfter = slideBefore + swiper.slidesSizesGrid[i4]; 35586 const isVisible2 = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size; 35587 if (isVisible2) { 35588 swiper.visibleSlides.push(slide2); 35589 swiper.visibleSlidesIndexes.push(i4); 35590 slides[i4].classList.add(params.slideVisibleClass); 35591 } 35592 slide2.progress = rtl ? -slideProgress : slideProgress; 35593 slide2.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress; 35594 } 35595 } 35596 function updateProgress(translate2) { 35597 const swiper = this; 35598 if (typeof translate2 === "undefined") { 35599 const multiplier = swiper.rtlTranslate ? -1 : 1; 35600 translate2 = swiper && swiper.translate && swiper.translate * multiplier || 0; 35601 } 35602 const params = swiper.params; 35603 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 35604 let { 35605 progress, 35606 isBeginning, 35607 isEnd, 35608 progressLoop 35609 } = swiper; 35610 const wasBeginning = isBeginning; 35611 const wasEnd = isEnd; 35612 if (translatesDiff === 0) { 35613 progress = 0; 35614 isBeginning = true; 35615 isEnd = true; 35616 } else { 35617 progress = (translate2 - swiper.minTranslate()) / translatesDiff; 35618 const isBeginningRounded = Math.abs(translate2 - swiper.minTranslate()) < 1; 35619 const isEndRounded = Math.abs(translate2 - swiper.maxTranslate()) < 1; 35620 isBeginning = isBeginningRounded || progress <= 0; 35621 isEnd = isEndRounded || progress >= 1; 35622 if (isBeginningRounded) 35623 progress = 0; 35624 if (isEndRounded) 35625 progress = 1; 35626 } 35627 if (params.loop) { 35628 const firstSlideIndex = swiper.getSlideIndexByData(0); 35629 const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1); 35630 const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex]; 35631 const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex]; 35632 const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1]; 35633 const translateAbs = Math.abs(translate2); 35634 if (translateAbs >= firstSlideTranslate) { 35635 progressLoop = (translateAbs - firstSlideTranslate) / translateMax; 35636 } else { 35637 progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax; 35638 } 35639 if (progressLoop > 1) 35640 progressLoop -= 1; 35641 } 35642 Object.assign(swiper, { 35643 progress, 35644 progressLoop, 35645 isBeginning, 35646 isEnd 35647 }); 35648 if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) 35649 swiper.updateSlidesProgress(translate2); 35650 if (isBeginning && !wasBeginning) { 35651 swiper.emit("reachBeginning toEdge"); 35652 } 35653 if (isEnd && !wasEnd) { 35654 swiper.emit("reachEnd toEdge"); 35655 } 35656 if (wasBeginning && !isBeginning || wasEnd && !isEnd) { 35657 swiper.emit("fromEdge"); 35658 } 35659 swiper.emit("progress", progress); 35660 } 35661 function updateSlidesClasses() { 35662 const swiper = this; 35663 const { 35664 slides, 35665 params, 35666 slidesEl, 35667 activeIndex 35668 } = swiper; 35669 const isVirtual = swiper.virtual && params.virtual.enabled; 35670 const getFilteredSlide = (selector) => { 35671 return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0]; 35672 }; 35673 slides.forEach((slideEl) => { 35674 slideEl.classList.remove(params.slideActiveClass, params.slideNextClass, params.slidePrevClass); 35675 }); 35676 let activeSlide; 35677 if (isVirtual) { 35678 if (params.loop) { 35679 let slideIndex = activeIndex - swiper.virtual.slidesBefore; 35680 if (slideIndex < 0) 35681 slideIndex = swiper.virtual.slides.length + slideIndex; 35682 if (slideIndex >= swiper.virtual.slides.length) 35683 slideIndex -= swiper.virtual.slides.length; 35684 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`); 35685 } else { 35686 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`); 35687 } 35688 } else { 35689 activeSlide = slides[activeIndex]; 35690 } 35691 if (activeSlide) { 35692 activeSlide.classList.add(params.slideActiveClass); 35693 let nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0]; 35694 if (params.loop && !nextSlide) { 35695 nextSlide = slides[0]; 35696 } 35697 if (nextSlide) { 35698 nextSlide.classList.add(params.slideNextClass); 35699 } 35700 let prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0]; 35701 if (params.loop && !prevSlide === 0) { 35702 prevSlide = slides[slides.length - 1]; 35703 } 35704 if (prevSlide) { 35705 prevSlide.classList.add(params.slidePrevClass); 35706 } 35707 } 35708 swiper.emitSlidesClasses(); 35709 } 35710 var processLazyPreloader = (swiper, imageEl) => { 35711 if (!swiper || swiper.destroyed || !swiper.params) 35712 return; 35713 const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`; 35714 const slideEl = imageEl.closest(slideSelector()); 35715 if (slideEl) { 35716 let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`); 35717 if (!lazyEl && swiper.isElement) { 35718 if (slideEl.shadowRoot) { 35719 lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`); 35720 } else { 35721 requestAnimationFrame(() => { 35722 if (slideEl.shadowRoot) { 35723 lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`); 35724 if (lazyEl) 35725 lazyEl.remove(); 35726 } 35727 }); 35728 } 35729 } 35730 if (lazyEl) 35731 lazyEl.remove(); 35732 } 35733 }; 35734 var unlazy = (swiper, index4) => { 35735 if (!swiper.slides[index4]) 35736 return; 35737 const imageEl = swiper.slides[index4].querySelector('[loading="lazy"]'); 35738 if (imageEl) 35739 imageEl.removeAttribute("loading"); 35740 }; 35741 var preload = (swiper) => { 35742 if (!swiper || swiper.destroyed || !swiper.params) 35743 return; 35744 let amount = swiper.params.lazyPreloadPrevNext; 35745 const len = swiper.slides.length; 35746 if (!len || !amount || amount < 0) 35747 return; 35748 amount = Math.min(amount, len); 35749 const slidesPerView = swiper.params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView); 35750 const activeIndex = swiper.activeIndex; 35751 if (swiper.params.grid && swiper.params.grid.rows > 1) { 35752 const activeColumn = activeIndex; 35753 const preloadColumns = [activeColumn - amount]; 35754 preloadColumns.push(...Array.from({ 35755 length: amount 35756 }).map((_4, i4) => { 35757 return activeColumn + slidesPerView + i4; 35758 })); 35759 swiper.slides.forEach((slideEl, i4) => { 35760 if (preloadColumns.includes(slideEl.column)) 35761 unlazy(swiper, i4); 35762 }); 35763 return; 35764 } 35765 const slideIndexLastInView = activeIndex + slidesPerView - 1; 35766 if (swiper.params.rewind || swiper.params.loop) { 35767 for (let i4 = activeIndex - amount; i4 <= slideIndexLastInView + amount; i4 += 1) { 35768 const realIndex = (i4 % len + len) % len; 35769 if (realIndex < activeIndex || realIndex > slideIndexLastInView) 35770 unlazy(swiper, realIndex); 35771 } 35772 } else { 35773 for (let i4 = Math.max(activeIndex - amount, 0); i4 <= Math.min(slideIndexLastInView + amount, len - 1); i4 += 1) { 35774 if (i4 !== activeIndex && (i4 > slideIndexLastInView || i4 < activeIndex)) { 35775 unlazy(swiper, i4); 35776 } 35777 } 35778 } 35779 }; 35780 function getActiveIndexByTranslate(swiper) { 35781 const { 35782 slidesGrid, 35783 params 35784 } = swiper; 35785 const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 35786 let activeIndex; 35787 for (let i4 = 0; i4 < slidesGrid.length; i4 += 1) { 35788 if (typeof slidesGrid[i4 + 1] !== "undefined") { 35789 if (translate2 >= slidesGrid[i4] && translate2 < slidesGrid[i4 + 1] - (slidesGrid[i4 + 1] - slidesGrid[i4]) / 2) { 35790 activeIndex = i4; 35791 } else if (translate2 >= slidesGrid[i4] && translate2 < slidesGrid[i4 + 1]) { 35792 activeIndex = i4 + 1; 35793 } 35794 } else if (translate2 >= slidesGrid[i4]) { 35795 activeIndex = i4; 35796 } 35797 } 35798 if (params.normalizeSlideIndex) { 35799 if (activeIndex < 0 || typeof activeIndex === "undefined") 35800 activeIndex = 0; 35801 } 35802 return activeIndex; 35803 } 35804 function updateActiveIndex(newActiveIndex) { 35805 const swiper = this; 35806 const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 35807 const { 35808 snapGrid, 35809 params, 35810 activeIndex: previousIndex, 35811 realIndex: previousRealIndex, 35812 snapIndex: previousSnapIndex 35813 } = swiper; 35814 let activeIndex = newActiveIndex; 35815 let snapIndex; 35816 const getVirtualRealIndex = (aIndex) => { 35817 let realIndex2 = aIndex - swiper.virtual.slidesBefore; 35818 if (realIndex2 < 0) { 35819 realIndex2 = swiper.virtual.slides.length + realIndex2; 35820 } 35821 if (realIndex2 >= swiper.virtual.slides.length) { 35822 realIndex2 -= swiper.virtual.slides.length; 35823 } 35824 return realIndex2; 35825 }; 35826 if (typeof activeIndex === "undefined") { 35827 activeIndex = getActiveIndexByTranslate(swiper); 35828 } 35829 if (snapGrid.indexOf(translate2) >= 0) { 35830 snapIndex = snapGrid.indexOf(translate2); 35831 } else { 35832 const skip = Math.min(params.slidesPerGroupSkip, activeIndex); 35833 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); 35834 } 35835 if (snapIndex >= snapGrid.length) 35836 snapIndex = snapGrid.length - 1; 35837 if (activeIndex === previousIndex) { 35838 if (snapIndex !== previousSnapIndex) { 35839 swiper.snapIndex = snapIndex; 35840 swiper.emit("snapIndexChange"); 35841 } 35842 if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) { 35843 swiper.realIndex = getVirtualRealIndex(activeIndex); 35844 } 35845 return; 35846 } 35847 let realIndex; 35848 if (swiper.virtual && params.virtual.enabled && params.loop) { 35849 realIndex = getVirtualRealIndex(activeIndex); 35850 } else if (swiper.slides[activeIndex]) { 35851 realIndex = parseInt(swiper.slides[activeIndex].getAttribute("data-swiper-slide-index") || activeIndex, 10); 35852 } else { 35853 realIndex = activeIndex; 35854 } 35855 Object.assign(swiper, { 35856 previousSnapIndex, 35857 snapIndex, 35858 previousRealIndex, 35859 realIndex, 35860 previousIndex, 35861 activeIndex 35862 }); 35863 if (swiper.initialized) { 35864 preload(swiper); 35865 } 35866 swiper.emit("activeIndexChange"); 35867 swiper.emit("snapIndexChange"); 35868 if (swiper.initialized || swiper.params.runCallbacksOnInit) { 35869 if (previousRealIndex !== realIndex) { 35870 swiper.emit("realIndexChange"); 35871 } 35872 swiper.emit("slideChange"); 35873 } 35874 } 35875 function updateClickedSlide(el, path) { 35876 const swiper = this; 35877 const params = swiper.params; 35878 let slide2 = el.closest(`.${params.slideClass}, swiper-slide`); 35879 if (!slide2 && swiper.isElement && path && path.length > 1 && path.includes(el)) { 35880 [...path.slice(path.indexOf(el) + 1, path.length)].forEach((pathEl) => { 35881 if (!slide2 && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) { 35882 slide2 = pathEl; 35883 } 35884 }); 35885 } 35886 let slideFound = false; 35887 let slideIndex; 35888 if (slide2) { 35889 for (let i4 = 0; i4 < swiper.slides.length; i4 += 1) { 35890 if (swiper.slides[i4] === slide2) { 35891 slideFound = true; 35892 slideIndex = i4; 35893 break; 35894 } 35895 } 35896 } 35897 if (slide2 && slideFound) { 35898 swiper.clickedSlide = slide2; 35899 if (swiper.virtual && swiper.params.virtual.enabled) { 35900 swiper.clickedIndex = parseInt(slide2.getAttribute("data-swiper-slide-index"), 10); 35901 } else { 35902 swiper.clickedIndex = slideIndex; 35903 } 35904 } else { 35905 swiper.clickedSlide = void 0; 35906 swiper.clickedIndex = void 0; 35907 return; 35908 } 35909 if (params.slideToClickedSlide && swiper.clickedIndex !== void 0 && swiper.clickedIndex !== swiper.activeIndex) { 35910 swiper.slideToClickedSlide(); 35911 } 35912 } 35913 var update = { 35914 updateSize, 35915 updateSlides, 35916 updateAutoHeight, 35917 updateSlidesOffset, 35918 updateSlidesProgress, 35919 updateProgress, 35920 updateSlidesClasses, 35921 updateActiveIndex, 35922 updateClickedSlide 35923 }; 35924 function getSwiperTranslate(axis) { 35925 if (axis === void 0) { 35926 axis = this.isHorizontal() ? "x" : "y"; 35927 } 35928 const swiper = this; 35929 const { 35930 params, 35931 rtlTranslate: rtl, 35932 translate: translate2, 35933 wrapperEl 35934 } = swiper; 35935 if (params.virtualTranslate) { 35936 return rtl ? -translate2 : translate2; 35937 } 35938 if (params.cssMode) { 35939 return translate2; 35940 } 35941 let currentTranslate = getTranslate(wrapperEl, axis); 35942 currentTranslate += swiper.cssOverflowAdjustment(); 35943 if (rtl) 35944 currentTranslate = -currentTranslate; 35945 return currentTranslate || 0; 35946 } 35947 function setTranslate(translate2, byController) { 35948 const swiper = this; 35949 const { 35950 rtlTranslate: rtl, 35951 params, 35952 wrapperEl, 35953 progress 35954 } = swiper; 35955 let x5 = 0; 35956 let y4 = 0; 35957 const z4 = 0; 35958 if (swiper.isHorizontal()) { 35959 x5 = rtl ? -translate2 : translate2; 35960 } else { 35961 y4 = translate2; 35962 } 35963 if (params.roundLengths) { 35964 x5 = Math.floor(x5); 35965 y4 = Math.floor(y4); 35966 } 35967 swiper.previousTranslate = swiper.translate; 35968 swiper.translate = swiper.isHorizontal() ? x5 : y4; 35969 if (params.cssMode) { 35970 wrapperEl[swiper.isHorizontal() ? "scrollLeft" : "scrollTop"] = swiper.isHorizontal() ? -x5 : -y4; 35971 } else if (!params.virtualTranslate) { 35972 if (swiper.isHorizontal()) { 35973 x5 -= swiper.cssOverflowAdjustment(); 35974 } else { 35975 y4 -= swiper.cssOverflowAdjustment(); 35976 } 35977 wrapperEl.style.transform = `translate3d(${x5}px, ${y4}px, ${z4}px)`; 35978 } 35979 let newProgress; 35980 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 35981 if (translatesDiff === 0) { 35982 newProgress = 0; 35983 } else { 35984 newProgress = (translate2 - swiper.minTranslate()) / translatesDiff; 35985 } 35986 if (newProgress !== progress) { 35987 swiper.updateProgress(translate2); 35988 } 35989 swiper.emit("setTranslate", swiper.translate, byController); 35990 } 35991 function minTranslate() { 35992 return -this.snapGrid[0]; 35993 } 35994 function maxTranslate() { 35995 return -this.snapGrid[this.snapGrid.length - 1]; 35996 } 35997 function translateTo(translate2, speed, runCallbacks, translateBounds, internal) { 35998 if (translate2 === void 0) { 35999 translate2 = 0; 36000 } 36001 if (speed === void 0) { 36002 speed = this.params.speed; 36003 } 36004 if (runCallbacks === void 0) { 36005 runCallbacks = true; 36006 } 36007 if (translateBounds === void 0) { 36008 translateBounds = true; 36009 } 36010 const swiper = this; 36011 const { 36012 params, 36013 wrapperEl 36014 } = swiper; 36015 if (swiper.animating && params.preventInteractionOnTransition) { 36016 return false; 36017 } 36018 const minTranslate2 = swiper.minTranslate(); 36019 const maxTranslate2 = swiper.maxTranslate(); 36020 let newTranslate; 36021 if (translateBounds && translate2 > minTranslate2) 36022 newTranslate = minTranslate2; 36023 else if (translateBounds && translate2 < maxTranslate2) 36024 newTranslate = maxTranslate2; 36025 else 36026 newTranslate = translate2; 36027 swiper.updateProgress(newTranslate); 36028 if (params.cssMode) { 36029 const isH = swiper.isHorizontal(); 36030 if (speed === 0) { 36031 wrapperEl[isH ? "scrollLeft" : "scrollTop"] = -newTranslate; 36032 } else { 36033 if (!swiper.support.smoothScroll) { 36034 animateCSSModeScroll({ 36035 swiper, 36036 targetPosition: -newTranslate, 36037 side: isH ? "left" : "top" 36038 }); 36039 return true; 36040 } 36041 wrapperEl.scrollTo({ 36042 [isH ? "left" : "top"]: -newTranslate, 36043 behavior: "smooth" 36044 }); 36045 } 36046 return true; 36047 } 36048 if (speed === 0) { 36049 swiper.setTransition(0); 36050 swiper.setTranslate(newTranslate); 36051 if (runCallbacks) { 36052 swiper.emit("beforeTransitionStart", speed, internal); 36053 swiper.emit("transitionEnd"); 36054 } 36055 } else { 36056 swiper.setTransition(speed); 36057 swiper.setTranslate(newTranslate); 36058 if (runCallbacks) { 36059 swiper.emit("beforeTransitionStart", speed, internal); 36060 swiper.emit("transitionStart"); 36061 } 36062 if (!swiper.animating) { 36063 swiper.animating = true; 36064 if (!swiper.onTranslateToWrapperTransitionEnd) { 36065 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd2(e4) { 36066 if (!swiper || swiper.destroyed) 36067 return; 36068 if (e4.target !== this) 36069 return; 36070 swiper.wrapperEl.removeEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd); 36071 swiper.onTranslateToWrapperTransitionEnd = null; 36072 delete swiper.onTranslateToWrapperTransitionEnd; 36073 if (runCallbacks) { 36074 swiper.emit("transitionEnd"); 36075 } 36076 }; 36077 } 36078 swiper.wrapperEl.addEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd); 36079 } 36080 } 36081 return true; 36082 } 36083 var translate = { 36084 getTranslate: getSwiperTranslate, 36085 setTranslate, 36086 minTranslate, 36087 maxTranslate, 36088 translateTo 36089 }; 36090 function setTransition(duration, byController) { 36091 const swiper = this; 36092 if (!swiper.params.cssMode) { 36093 swiper.wrapperEl.style.transitionDuration = `${duration}ms`; 36094 swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : ""; 36095 } 36096 swiper.emit("setTransition", duration, byController); 36097 } 36098 function transitionEmit(_ref) { 36099 let { 36100 swiper, 36101 runCallbacks, 36102 direction, 36103 step 36104 } = _ref; 36105 const { 36106 activeIndex, 36107 previousIndex 36108 } = swiper; 36109 let dir = direction; 36110 if (!dir) { 36111 if (activeIndex > previousIndex) 36112 dir = "next"; 36113 else if (activeIndex < previousIndex) 36114 dir = "prev"; 36115 else 36116 dir = "reset"; 36117 } 36118 swiper.emit(`transition${step}`); 36119 if (runCallbacks && activeIndex !== previousIndex) { 36120 if (dir === "reset") { 36121 swiper.emit(`slideResetTransition${step}`); 36122 return; 36123 } 36124 swiper.emit(`slideChangeTransition${step}`); 36125 if (dir === "next") { 36126 swiper.emit(`slideNextTransition${step}`); 36127 } else { 36128 swiper.emit(`slidePrevTransition${step}`); 36129 } 36130 } 36131 } 36132 function transitionStart(runCallbacks, direction) { 36133 if (runCallbacks === void 0) { 36134 runCallbacks = true; 36135 } 36136 const swiper = this; 36137 const { 36138 params 36139 } = swiper; 36140 if (params.cssMode) 36141 return; 36142 if (params.autoHeight) { 36143 swiper.updateAutoHeight(); 36144 } 36145 transitionEmit({ 36146 swiper, 36147 runCallbacks, 36148 direction, 36149 step: "Start" 36150 }); 36151 } 36152 function transitionEnd(runCallbacks, direction) { 36153 if (runCallbacks === void 0) { 36154 runCallbacks = true; 36155 } 36156 const swiper = this; 36157 const { 36158 params 36159 } = swiper; 36160 swiper.animating = false; 36161 if (params.cssMode) 36162 return; 36163 swiper.setTransition(0); 36164 transitionEmit({ 36165 swiper, 36166 runCallbacks, 36167 direction, 36168 step: "End" 36169 }); 36170 } 36171 var transition = { 36172 setTransition, 36173 transitionStart, 36174 transitionEnd 36175 }; 36176 function slideTo(index4, speed, runCallbacks, internal, initial) { 36177 if (index4 === void 0) { 36178 index4 = 0; 36179 } 36180 if (speed === void 0) { 36181 speed = this.params.speed; 36182 } 36183 if (runCallbacks === void 0) { 36184 runCallbacks = true; 36185 } 36186 if (typeof index4 === "string") { 36187 index4 = parseInt(index4, 10); 36188 } 36189 const swiper = this; 36190 let slideIndex = index4; 36191 if (slideIndex < 0) 36192 slideIndex = 0; 36193 const { 36194 params, 36195 snapGrid, 36196 slidesGrid, 36197 previousIndex, 36198 activeIndex, 36199 rtlTranslate: rtl, 36200 wrapperEl, 36201 enabled 36202 } = swiper; 36203 if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) { 36204 return false; 36205 } 36206 const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); 36207 let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); 36208 if (snapIndex >= snapGrid.length) 36209 snapIndex = snapGrid.length - 1; 36210 const translate2 = -snapGrid[snapIndex]; 36211 if (params.normalizeSlideIndex) { 36212 for (let i4 = 0; i4 < slidesGrid.length; i4 += 1) { 36213 const normalizedTranslate = -Math.floor(translate2 * 100); 36214 const normalizedGrid = Math.floor(slidesGrid[i4] * 100); 36215 const normalizedGridNext = Math.floor(slidesGrid[i4 + 1] * 100); 36216 if (typeof slidesGrid[i4 + 1] !== "undefined") { 36217 if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) { 36218 slideIndex = i4; 36219 } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) { 36220 slideIndex = i4 + 1; 36221 } 36222 } else if (normalizedTranslate >= normalizedGrid) { 36223 slideIndex = i4; 36224 } 36225 } 36226 } 36227 if (swiper.initialized && slideIndex !== activeIndex) { 36228 if (!swiper.allowSlideNext && (rtl ? translate2 > swiper.translate && translate2 > swiper.minTranslate() : translate2 < swiper.translate && translate2 < swiper.minTranslate())) { 36229 return false; 36230 } 36231 if (!swiper.allowSlidePrev && translate2 > swiper.translate && translate2 > swiper.maxTranslate()) { 36232 if ((activeIndex || 0) !== slideIndex) { 36233 return false; 36234 } 36235 } 36236 } 36237 if (slideIndex !== (previousIndex || 0) && runCallbacks) { 36238 swiper.emit("beforeSlideChangeStart"); 36239 } 36240 swiper.updateProgress(translate2); 36241 let direction; 36242 if (slideIndex > activeIndex) 36243 direction = "next"; 36244 else if (slideIndex < activeIndex) 36245 direction = "prev"; 36246 else 36247 direction = "reset"; 36248 if (rtl && -translate2 === swiper.translate || !rtl && translate2 === swiper.translate) { 36249 swiper.updateActiveIndex(slideIndex); 36250 if (params.autoHeight) { 36251 swiper.updateAutoHeight(); 36252 } 36253 swiper.updateSlidesClasses(); 36254 if (params.effect !== "slide") { 36255 swiper.setTranslate(translate2); 36256 } 36257 if (direction !== "reset") { 36258 swiper.transitionStart(runCallbacks, direction); 36259 swiper.transitionEnd(runCallbacks, direction); 36260 } 36261 return false; 36262 } 36263 if (params.cssMode) { 36264 const isH = swiper.isHorizontal(); 36265 const t5 = rtl ? translate2 : -translate2; 36266 if (speed === 0) { 36267 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 36268 if (isVirtual) { 36269 swiper.wrapperEl.style.scrollSnapType = "none"; 36270 swiper._immediateVirtual = true; 36271 } 36272 if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) { 36273 swiper._cssModeVirtualInitialSet = true; 36274 requestAnimationFrame(() => { 36275 wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t5; 36276 }); 36277 } else { 36278 wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t5; 36279 } 36280 if (isVirtual) { 36281 requestAnimationFrame(() => { 36282 swiper.wrapperEl.style.scrollSnapType = ""; 36283 swiper._immediateVirtual = false; 36284 }); 36285 } 36286 } else { 36287 if (!swiper.support.smoothScroll) { 36288 animateCSSModeScroll({ 36289 swiper, 36290 targetPosition: t5, 36291 side: isH ? "left" : "top" 36292 }); 36293 return true; 36294 } 36295 wrapperEl.scrollTo({ 36296 [isH ? "left" : "top"]: t5, 36297 behavior: "smooth" 36298 }); 36299 } 36300 return true; 36301 } 36302 swiper.setTransition(speed); 36303 swiper.setTranslate(translate2); 36304 swiper.updateActiveIndex(slideIndex); 36305 swiper.updateSlidesClasses(); 36306 swiper.emit("beforeTransitionStart", speed, internal); 36307 swiper.transitionStart(runCallbacks, direction); 36308 if (speed === 0) { 36309 swiper.transitionEnd(runCallbacks, direction); 36310 } else if (!swiper.animating) { 36311 swiper.animating = true; 36312 if (!swiper.onSlideToWrapperTransitionEnd) { 36313 swiper.onSlideToWrapperTransitionEnd = function transitionEnd2(e4) { 36314 if (!swiper || swiper.destroyed) 36315 return; 36316 if (e4.target !== this) 36317 return; 36318 swiper.wrapperEl.removeEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd); 36319 swiper.onSlideToWrapperTransitionEnd = null; 36320 delete swiper.onSlideToWrapperTransitionEnd; 36321 swiper.transitionEnd(runCallbacks, direction); 36322 }; 36323 } 36324 swiper.wrapperEl.addEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd); 36325 } 36326 return true; 36327 } 36328 function slideToLoop(index4, speed, runCallbacks, internal) { 36329 if (index4 === void 0) { 36330 index4 = 0; 36331 } 36332 if (speed === void 0) { 36333 speed = this.params.speed; 36334 } 36335 if (runCallbacks === void 0) { 36336 runCallbacks = true; 36337 } 36338 if (typeof index4 === "string") { 36339 const indexAsNumber = parseInt(index4, 10); 36340 index4 = indexAsNumber; 36341 } 36342 const swiper = this; 36343 let newIndex = index4; 36344 if (swiper.params.loop) { 36345 if (swiper.virtual && swiper.params.virtual.enabled) { 36346 newIndex = newIndex + swiper.virtual.slidesBefore; 36347 } else { 36348 newIndex = swiper.getSlideIndexByData(newIndex); 36349 } 36350 } 36351 return swiper.slideTo(newIndex, speed, runCallbacks, internal); 36352 } 36353 function slideNext(speed, runCallbacks, internal) { 36354 if (speed === void 0) { 36355 speed = this.params.speed; 36356 } 36357 if (runCallbacks === void 0) { 36358 runCallbacks = true; 36359 } 36360 const swiper = this; 36361 const { 36362 enabled, 36363 params, 36364 animating 36365 } = swiper; 36366 if (!enabled) 36367 return swiper; 36368 let perGroup = params.slidesPerGroup; 36369 if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 36370 perGroup = Math.max(swiper.slidesPerViewDynamic("current", true), 1); 36371 } 36372 const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; 36373 const isVirtual = swiper.virtual && params.virtual.enabled; 36374 if (params.loop) { 36375 if (animating && !isVirtual && params.loopPreventsSliding) 36376 return false; 36377 swiper.loopFix({ 36378 direction: "next" 36379 }); 36380 swiper._clientLeft = swiper.wrapperEl.clientLeft; 36381 if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) { 36382 requestAnimationFrame(() => { 36383 swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); 36384 }); 36385 return true; 36386 } 36387 } 36388 if (params.rewind && swiper.isEnd) { 36389 return swiper.slideTo(0, speed, runCallbacks, internal); 36390 } 36391 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); 36392 } 36393 function slidePrev(speed, runCallbacks, internal) { 36394 if (speed === void 0) { 36395 speed = this.params.speed; 36396 } 36397 if (runCallbacks === void 0) { 36398 runCallbacks = true; 36399 } 36400 const swiper = this; 36401 const { 36402 params, 36403 snapGrid, 36404 slidesGrid, 36405 rtlTranslate, 36406 enabled, 36407 animating 36408 } = swiper; 36409 if (!enabled) 36410 return swiper; 36411 const isVirtual = swiper.virtual && params.virtual.enabled; 36412 if (params.loop) { 36413 if (animating && !isVirtual && params.loopPreventsSliding) 36414 return false; 36415 swiper.loopFix({ 36416 direction: "prev" 36417 }); 36418 swiper._clientLeft = swiper.wrapperEl.clientLeft; 36419 } 36420 const translate2 = rtlTranslate ? swiper.translate : -swiper.translate; 36421 function normalize(val) { 36422 if (val < 0) 36423 return -Math.floor(Math.abs(val)); 36424 return Math.floor(val); 36425 } 36426 const normalizedTranslate = normalize(translate2); 36427 const normalizedSnapGrid = snapGrid.map((val) => normalize(val)); 36428 let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; 36429 if (typeof prevSnap === "undefined" && params.cssMode) { 36430 let prevSnapIndex; 36431 snapGrid.forEach((snap, snapIndex) => { 36432 if (normalizedTranslate >= snap) { 36433 prevSnapIndex = snapIndex; 36434 } 36435 }); 36436 if (typeof prevSnapIndex !== "undefined") { 36437 prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; 36438 } 36439 } 36440 let prevIndex = 0; 36441 if (typeof prevSnap !== "undefined") { 36442 prevIndex = slidesGrid.indexOf(prevSnap); 36443 if (prevIndex < 0) 36444 prevIndex = swiper.activeIndex - 1; 36445 if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 36446 prevIndex = prevIndex - swiper.slidesPerViewDynamic("previous", true) + 1; 36447 prevIndex = Math.max(prevIndex, 0); 36448 } 36449 } 36450 if (params.rewind && swiper.isBeginning) { 36451 const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 36452 return swiper.slideTo(lastIndex, speed, runCallbacks, internal); 36453 } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) { 36454 requestAnimationFrame(() => { 36455 swiper.slideTo(prevIndex, speed, runCallbacks, internal); 36456 }); 36457 return true; 36458 } 36459 return swiper.slideTo(prevIndex, speed, runCallbacks, internal); 36460 } 36461 function slideReset(speed, runCallbacks, internal) { 36462 if (speed === void 0) { 36463 speed = this.params.speed; 36464 } 36465 if (runCallbacks === void 0) { 36466 runCallbacks = true; 36467 } 36468 const swiper = this; 36469 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); 36470 } 36471 function slideToClosest(speed, runCallbacks, internal, threshold) { 36472 if (speed === void 0) { 36473 speed = this.params.speed; 36474 } 36475 if (runCallbacks === void 0) { 36476 runCallbacks = true; 36477 } 36478 if (threshold === void 0) { 36479 threshold = 0.5; 36480 } 36481 const swiper = this; 36482 let index4 = swiper.activeIndex; 36483 const skip = Math.min(swiper.params.slidesPerGroupSkip, index4); 36484 const snapIndex = skip + Math.floor((index4 - skip) / swiper.params.slidesPerGroup); 36485 const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 36486 if (translate2 >= swiper.snapGrid[snapIndex]) { 36487 const currentSnap = swiper.snapGrid[snapIndex]; 36488 const nextSnap = swiper.snapGrid[snapIndex + 1]; 36489 if (translate2 - currentSnap > (nextSnap - currentSnap) * threshold) { 36490 index4 += swiper.params.slidesPerGroup; 36491 } 36492 } else { 36493 const prevSnap = swiper.snapGrid[snapIndex - 1]; 36494 const currentSnap = swiper.snapGrid[snapIndex]; 36495 if (translate2 - prevSnap <= (currentSnap - prevSnap) * threshold) { 36496 index4 -= swiper.params.slidesPerGroup; 36497 } 36498 } 36499 index4 = Math.max(index4, 0); 36500 index4 = Math.min(index4, swiper.slidesGrid.length - 1); 36501 return swiper.slideTo(index4, speed, runCallbacks, internal); 36502 } 36503 function slideToClickedSlide() { 36504 const swiper = this; 36505 const { 36506 params, 36507 slidesEl 36508 } = swiper; 36509 const slidesPerView = params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : params.slidesPerView; 36510 let slideToIndex = swiper.clickedIndex; 36511 let realIndex; 36512 const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`; 36513 if (params.loop) { 36514 if (swiper.animating) 36515 return; 36516 realIndex = parseInt(swiper.clickedSlide.getAttribute("data-swiper-slide-index"), 10); 36517 if (params.centeredSlides) { 36518 if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) { 36519 swiper.loopFix(); 36520 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]); 36521 nextTick(() => { 36522 swiper.slideTo(slideToIndex); 36523 }); 36524 } else { 36525 swiper.slideTo(slideToIndex); 36526 } 36527 } else if (slideToIndex > swiper.slides.length - slidesPerView) { 36528 swiper.loopFix(); 36529 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]); 36530 nextTick(() => { 36531 swiper.slideTo(slideToIndex); 36532 }); 36533 } else { 36534 swiper.slideTo(slideToIndex); 36535 } 36536 } else { 36537 swiper.slideTo(slideToIndex); 36538 } 36539 } 36540 var slide = { 36541 slideTo, 36542 slideToLoop, 36543 slideNext, 36544 slidePrev, 36545 slideReset, 36546 slideToClosest, 36547 slideToClickedSlide 36548 }; 36549 function loopCreate(slideRealIndex) { 36550 const swiper = this; 36551 const { 36552 params, 36553 slidesEl 36554 } = swiper; 36555 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) 36556 return; 36557 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`); 36558 slides.forEach((el, index4) => { 36559 el.setAttribute("data-swiper-slide-index", index4); 36560 }); 36561 swiper.loopFix({ 36562 slideRealIndex, 36563 direction: params.centeredSlides ? void 0 : "next" 36564 }); 36565 } 36566 function loopFix(_temp) { 36567 let { 36568 slideRealIndex, 36569 slideTo: slideTo2 = true, 36570 direction, 36571 setTranslate: setTranslate2, 36572 activeSlideIndex, 36573 byController, 36574 byMousewheel 36575 } = _temp === void 0 ? {} : _temp; 36576 const swiper = this; 36577 if (!swiper.params.loop) 36578 return; 36579 swiper.emit("beforeLoopFix"); 36580 const { 36581 slides, 36582 allowSlidePrev, 36583 allowSlideNext, 36584 slidesEl, 36585 params 36586 } = swiper; 36587 swiper.allowSlidePrev = true; 36588 swiper.allowSlideNext = true; 36589 if (swiper.virtual && params.virtual.enabled) { 36590 if (slideTo2) { 36591 if (!params.centeredSlides && swiper.snapIndex === 0) { 36592 swiper.slideTo(swiper.virtual.slides.length, 0, false, true); 36593 } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) { 36594 swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true); 36595 } else if (swiper.snapIndex === swiper.snapGrid.length - 1) { 36596 swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true); 36597 } 36598 } 36599 swiper.allowSlidePrev = allowSlidePrev; 36600 swiper.allowSlideNext = allowSlideNext; 36601 swiper.emit("loopFix"); 36602 return; 36603 } 36604 const slidesPerView = params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)); 36605 let loopedSlides = params.loopedSlides || slidesPerView; 36606 if (loopedSlides % params.slidesPerGroup !== 0) { 36607 loopedSlides += params.slidesPerGroup - loopedSlides % params.slidesPerGroup; 36608 } 36609 swiper.loopedSlides = loopedSlides; 36610 const prependSlidesIndexes = []; 36611 const appendSlidesIndexes = []; 36612 let activeIndex = swiper.activeIndex; 36613 if (typeof activeSlideIndex === "undefined") { 36614 activeSlideIndex = swiper.getSlideIndex(swiper.slides.filter((el) => el.classList.contains(params.slideActiveClass))[0]); 36615 } else { 36616 activeIndex = activeSlideIndex; 36617 } 36618 const isNext = direction === "next" || !direction; 36619 const isPrev = direction === "prev" || !direction; 36620 let slidesPrepended = 0; 36621 let slidesAppended = 0; 36622 if (activeSlideIndex < loopedSlides) { 36623 slidesPrepended = Math.max(loopedSlides - activeSlideIndex, params.slidesPerGroup); 36624 for (let i4 = 0; i4 < loopedSlides - activeSlideIndex; i4 += 1) { 36625 const index4 = i4 - Math.floor(i4 / slides.length) * slides.length; 36626 prependSlidesIndexes.push(slides.length - index4 - 1); 36627 } 36628 } else if (activeSlideIndex > swiper.slides.length - loopedSlides * 2) { 36629 slidesAppended = Math.max(activeSlideIndex - (swiper.slides.length - loopedSlides * 2), params.slidesPerGroup); 36630 for (let i4 = 0; i4 < slidesAppended; i4 += 1) { 36631 const index4 = i4 - Math.floor(i4 / slides.length) * slides.length; 36632 appendSlidesIndexes.push(index4); 36633 } 36634 } 36635 if (isPrev) { 36636 prependSlidesIndexes.forEach((index4) => { 36637 swiper.slides[index4].swiperLoopMoveDOM = true; 36638 slidesEl.prepend(swiper.slides[index4]); 36639 swiper.slides[index4].swiperLoopMoveDOM = false; 36640 }); 36641 } 36642 if (isNext) { 36643 appendSlidesIndexes.forEach((index4) => { 36644 swiper.slides[index4].swiperLoopMoveDOM = true; 36645 slidesEl.append(swiper.slides[index4]); 36646 swiper.slides[index4].swiperLoopMoveDOM = false; 36647 }); 36648 } 36649 swiper.recalcSlides(); 36650 if (params.slidesPerView === "auto") { 36651 swiper.updateSlides(); 36652 } 36653 if (params.watchSlidesProgress) { 36654 swiper.updateSlidesOffset(); 36655 } 36656 if (slideTo2) { 36657 if (prependSlidesIndexes.length > 0 && isPrev) { 36658 if (typeof slideRealIndex === "undefined") { 36659 const currentSlideTranslate = swiper.slidesGrid[activeIndex]; 36660 const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended]; 36661 const diff = newSlideTranslate - currentSlideTranslate; 36662 if (byMousewheel) { 36663 swiper.setTranslate(swiper.translate - diff); 36664 } else { 36665 swiper.slideTo(activeIndex + slidesPrepended, 0, false, true); 36666 if (setTranslate2) { 36667 swiper.touches[swiper.isHorizontal() ? "startX" : "startY"] += diff; 36668 swiper.touchEventsData.currentTranslate = swiper.translate; 36669 } 36670 } 36671 } else { 36672 if (setTranslate2) { 36673 swiper.slideToLoop(slideRealIndex, 0, false, true); 36674 swiper.touchEventsData.currentTranslate = swiper.translate; 36675 } 36676 } 36677 } else if (appendSlidesIndexes.length > 0 && isNext) { 36678 if (typeof slideRealIndex === "undefined") { 36679 const currentSlideTranslate = swiper.slidesGrid[activeIndex]; 36680 const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended]; 36681 const diff = newSlideTranslate - currentSlideTranslate; 36682 if (byMousewheel) { 36683 swiper.setTranslate(swiper.translate - diff); 36684 } else { 36685 swiper.slideTo(activeIndex - slidesAppended, 0, false, true); 36686 if (setTranslate2) { 36687 swiper.touches[swiper.isHorizontal() ? "startX" : "startY"] += diff; 36688 swiper.touchEventsData.currentTranslate = swiper.translate; 36689 } 36690 } 36691 } else { 36692 swiper.slideToLoop(slideRealIndex, 0, false, true); 36693 } 36694 } 36695 } 36696 swiper.allowSlidePrev = allowSlidePrev; 36697 swiper.allowSlideNext = allowSlideNext; 36698 if (swiper.controller && swiper.controller.control && !byController) { 36699 const loopParams = { 36700 slideRealIndex, 36701 direction, 36702 setTranslate: setTranslate2, 36703 activeSlideIndex, 36704 byController: true 36705 }; 36706 if (Array.isArray(swiper.controller.control)) { 36707 swiper.controller.control.forEach((c4) => { 36708 if (!c4.destroyed && c4.params.loop) 36709 c4.loopFix({ 36710 ...loopParams, 36711 slideTo: c4.params.slidesPerView === params.slidesPerView ? slideTo2 : false 36712 }); 36713 }); 36714 } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) { 36715 swiper.controller.control.loopFix({ 36716 ...loopParams, 36717 slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo2 : false 36718 }); 36719 } 36720 } 36721 swiper.emit("loopFix"); 36722 } 36723 function loopDestroy() { 36724 const swiper = this; 36725 const { 36726 params, 36727 slidesEl 36728 } = swiper; 36729 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) 36730 return; 36731 swiper.recalcSlides(); 36732 const newSlidesOrder = []; 36733 swiper.slides.forEach((slideEl) => { 36734 const index4 = typeof slideEl.swiperSlideIndex === "undefined" ? slideEl.getAttribute("data-swiper-slide-index") * 1 : slideEl.swiperSlideIndex; 36735 newSlidesOrder[index4] = slideEl; 36736 }); 36737 swiper.slides.forEach((slideEl) => { 36738 slideEl.removeAttribute("data-swiper-slide-index"); 36739 }); 36740 newSlidesOrder.forEach((slideEl) => { 36741 slidesEl.append(slideEl); 36742 }); 36743 swiper.recalcSlides(); 36744 swiper.slideTo(swiper.realIndex, 0); 36745 } 36746 var loop = { 36747 loopCreate, 36748 loopFix, 36749 loopDestroy 36750 }; 36751 function setGrabCursor(moving) { 36752 const swiper = this; 36753 if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) 36754 return; 36755 const el = swiper.params.touchEventsTarget === "container" ? swiper.el : swiper.wrapperEl; 36756 if (swiper.isElement) { 36757 swiper.__preventObserver__ = true; 36758 } 36759 el.style.cursor = "move"; 36760 el.style.cursor = moving ? "grabbing" : "grab"; 36761 if (swiper.isElement) { 36762 requestAnimationFrame(() => { 36763 swiper.__preventObserver__ = false; 36764 }); 36765 } 36766 } 36767 function unsetGrabCursor() { 36768 const swiper = this; 36769 if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) { 36770 return; 36771 } 36772 if (swiper.isElement) { 36773 swiper.__preventObserver__ = true; 36774 } 36775 swiper[swiper.params.touchEventsTarget === "container" ? "el" : "wrapperEl"].style.cursor = ""; 36776 if (swiper.isElement) { 36777 requestAnimationFrame(() => { 36778 swiper.__preventObserver__ = false; 36779 }); 36780 } 36781 } 36782 var grabCursor = { 36783 setGrabCursor, 36784 unsetGrabCursor 36785 }; 36786 function closestElement(selector, base) { 36787 if (base === void 0) { 36788 base = this; 36789 } 36790 function __closestFrom(el) { 36791 if (!el || el === getDocument() || el === getWindow2()) 36792 return null; 36793 if (el.assignedSlot) 36794 el = el.assignedSlot; 36795 const found = el.closest(selector); 36796 if (!found && !el.getRootNode) { 36797 return null; 36798 } 36799 return found || __closestFrom(el.getRootNode().host); 36800 } 36801 return __closestFrom(base); 36802 } 36803 function onTouchStart(event2) { 36804 const swiper = this; 36805 const document2 = getDocument(); 36806 const window2 = getWindow2(); 36807 const data = swiper.touchEventsData; 36808 data.evCache.push(event2); 36809 const { 36810 params, 36811 touches, 36812 enabled 36813 } = swiper; 36814 if (!enabled) 36815 return; 36816 if (!params.simulateTouch && event2.pointerType === "mouse") 36817 return; 36818 if (swiper.animating && params.preventInteractionOnTransition) { 36819 return; 36820 } 36821 if (!swiper.animating && params.cssMode && params.loop) { 36822 swiper.loopFix(); 36823 } 36824 let e4 = event2; 36825 if (e4.originalEvent) 36826 e4 = e4.originalEvent; 36827 let targetEl = e4.target; 36828 if (params.touchEventsTarget === "wrapper") { 36829 if (!swiper.wrapperEl.contains(targetEl)) 36830 return; 36831 } 36832 if ("which" in e4 && e4.which === 3) 36833 return; 36834 if ("button" in e4 && e4.button > 0) 36835 return; 36836 if (data.isTouched && data.isMoved) 36837 return; 36838 const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ""; 36839 const eventPath = event2.composedPath ? event2.composedPath() : event2.path; 36840 if (swipingClassHasValue && e4.target && e4.target.shadowRoot && eventPath) { 36841 targetEl = eventPath[0]; 36842 } 36843 const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`; 36844 const isTargetShadow = !!(e4.target && e4.target.shadowRoot); 36845 if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) { 36846 swiper.allowClick = true; 36847 return; 36848 } 36849 if (params.swipeHandler) { 36850 if (!targetEl.closest(params.swipeHandler)) 36851 return; 36852 } 36853 touches.currentX = e4.pageX; 36854 touches.currentY = e4.pageY; 36855 const startX = touches.currentX; 36856 const startY = touches.currentY; 36857 const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; 36858 const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; 36859 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window2.innerWidth - edgeSwipeThreshold)) { 36860 if (edgeSwipeDetection === "prevent") { 36861 event2.preventDefault(); 36862 } else { 36863 return; 36864 } 36865 } 36866 Object.assign(data, { 36867 isTouched: true, 36868 isMoved: false, 36869 allowTouchCallbacks: true, 36870 isScrolling: void 0, 36871 startMoving: void 0 36872 }); 36873 touches.startX = startX; 36874 touches.startY = startY; 36875 data.touchStartTime = now2(); 36876 swiper.allowClick = true; 36877 swiper.updateSize(); 36878 swiper.swipeDirection = void 0; 36879 if (params.threshold > 0) 36880 data.allowThresholdMove = false; 36881 let preventDefault3 = true; 36882 if (targetEl.matches(data.focusableElements)) { 36883 preventDefault3 = false; 36884 if (targetEl.nodeName === "SELECT") { 36885 data.isTouched = false; 36886 } 36887 } 36888 if (document2.activeElement && document2.activeElement.matches(data.focusableElements) && document2.activeElement !== targetEl) { 36889 document2.activeElement.blur(); 36890 } 36891 const shouldPreventDefault = preventDefault3 && swiper.allowTouchMove && params.touchStartPreventDefault; 36892 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) { 36893 e4.preventDefault(); 36894 } 36895 if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) { 36896 swiper.freeMode.onTouchStart(); 36897 } 36898 swiper.emit("touchStart", e4); 36899 } 36900 function onTouchMove(event2) { 36901 const document2 = getDocument(); 36902 const swiper = this; 36903 const data = swiper.touchEventsData; 36904 const { 36905 params, 36906 touches, 36907 rtlTranslate: rtl, 36908 enabled 36909 } = swiper; 36910 if (!enabled) 36911 return; 36912 if (!params.simulateTouch && event2.pointerType === "mouse") 36913 return; 36914 let e4 = event2; 36915 if (e4.originalEvent) 36916 e4 = e4.originalEvent; 36917 if (!data.isTouched) { 36918 if (data.startMoving && data.isScrolling) { 36919 swiper.emit("touchMoveOpposite", e4); 36920 } 36921 return; 36922 } 36923 const pointerIndex = data.evCache.findIndex((cachedEv) => cachedEv.pointerId === e4.pointerId); 36924 if (pointerIndex >= 0) 36925 data.evCache[pointerIndex] = e4; 36926 const targetTouch = data.evCache.length > 1 ? data.evCache[0] : e4; 36927 const pageX = targetTouch.pageX; 36928 const pageY = targetTouch.pageY; 36929 if (e4.preventedByNestedSwiper) { 36930 touches.startX = pageX; 36931 touches.startY = pageY; 36932 return; 36933 } 36934 if (!swiper.allowTouchMove) { 36935 if (!e4.target.matches(data.focusableElements)) { 36936 swiper.allowClick = false; 36937 } 36938 if (data.isTouched) { 36939 Object.assign(touches, { 36940 startX: pageX, 36941 startY: pageY, 36942 prevX: swiper.touches.currentX, 36943 prevY: swiper.touches.currentY, 36944 currentX: pageX, 36945 currentY: pageY 36946 }); 36947 data.touchStartTime = now2(); 36948 } 36949 return; 36950 } 36951 if (params.touchReleaseOnEdges && !params.loop) { 36952 if (swiper.isVertical()) { 36953 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) { 36954 data.isTouched = false; 36955 data.isMoved = false; 36956 return; 36957 } 36958 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) { 36959 return; 36960 } 36961 } 36962 if (document2.activeElement) { 36963 if (e4.target === document2.activeElement && e4.target.matches(data.focusableElements)) { 36964 data.isMoved = true; 36965 swiper.allowClick = false; 36966 return; 36967 } 36968 } 36969 if (data.allowTouchCallbacks) { 36970 swiper.emit("touchMove", e4); 36971 } 36972 if (e4.targetTouches && e4.targetTouches.length > 1) 36973 return; 36974 touches.currentX = pageX; 36975 touches.currentY = pageY; 36976 const diffX = touches.currentX - touches.startX; 36977 const diffY = touches.currentY - touches.startY; 36978 if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) 36979 return; 36980 if (typeof data.isScrolling === "undefined") { 36981 let touchAngle; 36982 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) { 36983 data.isScrolling = false; 36984 } else { 36985 if (diffX * diffX + diffY * diffY >= 25) { 36986 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI; 36987 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle; 36988 } 36989 } 36990 } 36991 if (data.isScrolling) { 36992 swiper.emit("touchMoveOpposite", e4); 36993 } 36994 if (typeof data.startMoving === "undefined") { 36995 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { 36996 data.startMoving = true; 36997 } 36998 } 36999 if (data.isScrolling || swiper.zoom && swiper.params.zoom && swiper.params.zoom.enabled && data.evCache.length > 1) { 37000 data.isTouched = false; 37001 return; 37002 } 37003 if (!data.startMoving) { 37004 return; 37005 } 37006 swiper.allowClick = false; 37007 if (!params.cssMode && e4.cancelable) { 37008 e4.preventDefault(); 37009 } 37010 if (params.touchMoveStopPropagation && !params.nested) { 37011 e4.stopPropagation(); 37012 } 37013 let diff = swiper.isHorizontal() ? diffX : diffY; 37014 let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY; 37015 if (params.oneWayMovement) { 37016 diff = Math.abs(diff) * (rtl ? 1 : -1); 37017 touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1); 37018 } 37019 touches.diff = diff; 37020 diff *= params.touchRatio; 37021 if (rtl) { 37022 diff = -diff; 37023 touchesDiff = -touchesDiff; 37024 } 37025 const prevTouchesDirection = swiper.touchesDirection; 37026 swiper.swipeDirection = diff > 0 ? "prev" : "next"; 37027 swiper.touchesDirection = touchesDiff > 0 ? "prev" : "next"; 37028 const isLoop = swiper.params.loop && !params.cssMode; 37029 const allowLoopFix = swiper.swipeDirection === "next" && swiper.allowSlideNext || swiper.swipeDirection === "prev" && swiper.allowSlidePrev; 37030 if (!data.isMoved) { 37031 if (isLoop && allowLoopFix) { 37032 swiper.loopFix({ 37033 direction: swiper.swipeDirection 37034 }); 37035 } 37036 data.startTranslate = swiper.getTranslate(); 37037 swiper.setTransition(0); 37038 if (swiper.animating) { 37039 const evt = new window.CustomEvent("transitionend", { 37040 bubbles: true, 37041 cancelable: true 37042 }); 37043 swiper.wrapperEl.dispatchEvent(evt); 37044 } 37045 data.allowMomentumBounce = false; 37046 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 37047 swiper.setGrabCursor(true); 37048 } 37049 swiper.emit("sliderFirstMove", e4); 37050 } 37051 let loopFixed; 37052 if (data.isMoved && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) { 37053 swiper.loopFix({ 37054 direction: swiper.swipeDirection, 37055 setTranslate: true 37056 }); 37057 loopFixed = true; 37058 } 37059 swiper.emit("sliderMove", e4); 37060 data.isMoved = true; 37061 data.currentTranslate = diff + data.startTranslate; 37062 let disableParentSwiper = true; 37063 let resistanceRatio = params.resistanceRatio; 37064 if (params.touchReleaseOnEdges) { 37065 resistanceRatio = 0; 37066 } 37067 if (diff > 0) { 37068 if (isLoop && allowLoopFix && !loopFixed && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.size / 2 : swiper.minTranslate())) { 37069 swiper.loopFix({ 37070 direction: "prev", 37071 setTranslate: true, 37072 activeSlideIndex: 0 37073 }); 37074 } 37075 if (data.currentTranslate > swiper.minTranslate()) { 37076 disableParentSwiper = false; 37077 if (params.resistance) { 37078 data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio; 37079 } 37080 } 37081 } else if (diff < 0) { 37082 if (isLoop && allowLoopFix && !loopFixed && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.size / 2 : swiper.maxTranslate())) { 37083 swiper.loopFix({ 37084 direction: "next", 37085 setTranslate: true, 37086 activeSlideIndex: swiper.slides.length - (params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10))) 37087 }); 37088 } 37089 if (data.currentTranslate < swiper.maxTranslate()) { 37090 disableParentSwiper = false; 37091 if (params.resistance) { 37092 data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio; 37093 } 37094 } 37095 } 37096 if (disableParentSwiper) { 37097 e4.preventedByNestedSwiper = true; 37098 } 37099 if (!swiper.allowSlideNext && swiper.swipeDirection === "next" && data.currentTranslate < data.startTranslate) { 37100 data.currentTranslate = data.startTranslate; 37101 } 37102 if (!swiper.allowSlidePrev && swiper.swipeDirection === "prev" && data.currentTranslate > data.startTranslate) { 37103 data.currentTranslate = data.startTranslate; 37104 } 37105 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { 37106 data.currentTranslate = data.startTranslate; 37107 } 37108 if (params.threshold > 0) { 37109 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { 37110 if (!data.allowThresholdMove) { 37111 data.allowThresholdMove = true; 37112 touches.startX = touches.currentX; 37113 touches.startY = touches.currentY; 37114 data.currentTranslate = data.startTranslate; 37115 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; 37116 return; 37117 } 37118 } else { 37119 data.currentTranslate = data.startTranslate; 37120 return; 37121 } 37122 } 37123 if (!params.followFinger || params.cssMode) 37124 return; 37125 if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) { 37126 swiper.updateActiveIndex(); 37127 swiper.updateSlidesClasses(); 37128 } 37129 if (params.freeMode && params.freeMode.enabled && swiper.freeMode) { 37130 swiper.freeMode.onTouchMove(); 37131 } 37132 swiper.updateProgress(data.currentTranslate); 37133 swiper.setTranslate(data.currentTranslate); 37134 } 37135 function onTouchEnd(event2) { 37136 const swiper = this; 37137 const data = swiper.touchEventsData; 37138 const pointerIndex = data.evCache.findIndex((cachedEv) => cachedEv.pointerId === event2.pointerId); 37139 if (pointerIndex >= 0) { 37140 data.evCache.splice(pointerIndex, 1); 37141 } 37142 if (["pointercancel", "pointerout", "pointerleave", "contextmenu"].includes(event2.type)) { 37143 const proceed = ["pointercancel", "contextmenu"].includes(event2.type) && (swiper.browser.isSafari || swiper.browser.isWebView); 37144 if (!proceed) { 37145 return; 37146 } 37147 } 37148 const { 37149 params, 37150 touches, 37151 rtlTranslate: rtl, 37152 slidesGrid, 37153 enabled 37154 } = swiper; 37155 if (!enabled) 37156 return; 37157 if (!params.simulateTouch && event2.pointerType === "mouse") 37158 return; 37159 let e4 = event2; 37160 if (e4.originalEvent) 37161 e4 = e4.originalEvent; 37162 if (data.allowTouchCallbacks) { 37163 swiper.emit("touchEnd", e4); 37164 } 37165 data.allowTouchCallbacks = false; 37166 if (!data.isTouched) { 37167 if (data.isMoved && params.grabCursor) { 37168 swiper.setGrabCursor(false); 37169 } 37170 data.isMoved = false; 37171 data.startMoving = false; 37172 return; 37173 } 37174 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 37175 swiper.setGrabCursor(false); 37176 } 37177 const touchEndTime = now2(); 37178 const timeDiff = touchEndTime - data.touchStartTime; 37179 if (swiper.allowClick) { 37180 const pathTree = e4.path || e4.composedPath && e4.composedPath(); 37181 swiper.updateClickedSlide(pathTree && pathTree[0] || e4.target, pathTree); 37182 swiper.emit("tap click", e4); 37183 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { 37184 swiper.emit("doubleTap doubleClick", e4); 37185 } 37186 } 37187 data.lastClickTime = now2(); 37188 nextTick(() => { 37189 if (!swiper.destroyed) 37190 swiper.allowClick = true; 37191 }); 37192 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { 37193 data.isTouched = false; 37194 data.isMoved = false; 37195 data.startMoving = false; 37196 return; 37197 } 37198 data.isTouched = false; 37199 data.isMoved = false; 37200 data.startMoving = false; 37201 let currentPos; 37202 if (params.followFinger) { 37203 currentPos = rtl ? swiper.translate : -swiper.translate; 37204 } else { 37205 currentPos = -data.currentTranslate; 37206 } 37207 if (params.cssMode) { 37208 return; 37209 } 37210 if (params.freeMode && params.freeMode.enabled) { 37211 swiper.freeMode.onTouchEnd({ 37212 currentPos 37213 }); 37214 return; 37215 } 37216 let stopIndex = 0; 37217 let groupSize = swiper.slidesSizesGrid[0]; 37218 for (let i4 = 0; i4 < slidesGrid.length; i4 += i4 < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) { 37219 const increment2 = i4 < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 37220 if (typeof slidesGrid[i4 + increment2] !== "undefined") { 37221 if (currentPos >= slidesGrid[i4] && currentPos < slidesGrid[i4 + increment2]) { 37222 stopIndex = i4; 37223 groupSize = slidesGrid[i4 + increment2] - slidesGrid[i4]; 37224 } 37225 } else if (currentPos >= slidesGrid[i4]) { 37226 stopIndex = i4; 37227 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; 37228 } 37229 } 37230 let rewindFirstIndex = null; 37231 let rewindLastIndex = null; 37232 if (params.rewind) { 37233 if (swiper.isBeginning) { 37234 rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 37235 } else if (swiper.isEnd) { 37236 rewindFirstIndex = 0; 37237 } 37238 } 37239 const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; 37240 const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 37241 if (timeDiff > params.longSwipesMs) { 37242 if (!params.longSwipes) { 37243 swiper.slideTo(swiper.activeIndex); 37244 return; 37245 } 37246 if (swiper.swipeDirection === "next") { 37247 if (ratio >= params.longSwipesRatio) 37248 swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment); 37249 else 37250 swiper.slideTo(stopIndex); 37251 } 37252 if (swiper.swipeDirection === "prev") { 37253 if (ratio > 1 - params.longSwipesRatio) { 37254 swiper.slideTo(stopIndex + increment); 37255 } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) { 37256 swiper.slideTo(rewindLastIndex); 37257 } else { 37258 swiper.slideTo(stopIndex); 37259 } 37260 } 37261 } else { 37262 if (!params.shortSwipes) { 37263 swiper.slideTo(swiper.activeIndex); 37264 return; 37265 } 37266 const isNavButtonTarget = swiper.navigation && (e4.target === swiper.navigation.nextEl || e4.target === swiper.navigation.prevEl); 37267 if (!isNavButtonTarget) { 37268 if (swiper.swipeDirection === "next") { 37269 swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment); 37270 } 37271 if (swiper.swipeDirection === "prev") { 37272 swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex); 37273 } 37274 } else if (e4.target === swiper.navigation.nextEl) { 37275 swiper.slideTo(stopIndex + increment); 37276 } else { 37277 swiper.slideTo(stopIndex); 37278 } 37279 } 37280 } 37281 function onResize() { 37282 const swiper = this; 37283 const { 37284 params, 37285 el 37286 } = swiper; 37287 if (el && el.offsetWidth === 0) 37288 return; 37289 if (params.breakpoints) { 37290 swiper.setBreakpoint(); 37291 } 37292 const { 37293 allowSlideNext, 37294 allowSlidePrev, 37295 snapGrid 37296 } = swiper; 37297 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 37298 swiper.allowSlideNext = true; 37299 swiper.allowSlidePrev = true; 37300 swiper.updateSize(); 37301 swiper.updateSlides(); 37302 swiper.updateSlidesClasses(); 37303 const isVirtualLoop = isVirtual && params.loop; 37304 if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) { 37305 swiper.slideTo(swiper.slides.length - 1, 0, false, true); 37306 } else { 37307 if (swiper.params.loop && !isVirtual) { 37308 swiper.slideToLoop(swiper.realIndex, 0, false, true); 37309 } else { 37310 swiper.slideTo(swiper.activeIndex, 0, false, true); 37311 } 37312 } 37313 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { 37314 clearTimeout(swiper.autoplay.resizeTimeout); 37315 swiper.autoplay.resizeTimeout = setTimeout(() => { 37316 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { 37317 swiper.autoplay.resume(); 37318 } 37319 }, 500); 37320 } 37321 swiper.allowSlidePrev = allowSlidePrev; 37322 swiper.allowSlideNext = allowSlideNext; 37323 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { 37324 swiper.checkOverflow(); 37325 } 37326 } 37327 function onClick(e4) { 37328 const swiper = this; 37329 if (!swiper.enabled) 37330 return; 37331 if (!swiper.allowClick) { 37332 if (swiper.params.preventClicks) 37333 e4.preventDefault(); 37334 if (swiper.params.preventClicksPropagation && swiper.animating) { 37335 e4.stopPropagation(); 37336 e4.stopImmediatePropagation(); 37337 } 37338 } 37339 } 37340 function onScroll() { 37341 const swiper = this; 37342 const { 37343 wrapperEl, 37344 rtlTranslate, 37345 enabled 37346 } = swiper; 37347 if (!enabled) 37348 return; 37349 swiper.previousTranslate = swiper.translate; 37350 if (swiper.isHorizontal()) { 37351 swiper.translate = -wrapperEl.scrollLeft; 37352 } else { 37353 swiper.translate = -wrapperEl.scrollTop; 37354 } 37355 if (swiper.translate === 0) 37356 swiper.translate = 0; 37357 swiper.updateActiveIndex(); 37358 swiper.updateSlidesClasses(); 37359 let newProgress; 37360 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 37361 if (translatesDiff === 0) { 37362 newProgress = 0; 37363 } else { 37364 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; 37365 } 37366 if (newProgress !== swiper.progress) { 37367 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate); 37368 } 37369 swiper.emit("setTranslate", swiper.translate, false); 37370 } 37371 function onLoad(e4) { 37372 const swiper = this; 37373 processLazyPreloader(swiper, e4.target); 37374 if (swiper.params.cssMode || swiper.params.slidesPerView !== "auto" && !swiper.params.autoHeight) { 37375 return; 37376 } 37377 swiper.update(); 37378 } 37379 var dummyEventAttached = false; 37380 function dummyEventListener() { 37381 } 37382 var events = (swiper, method) => { 37383 const document2 = getDocument(); 37384 const { 37385 params, 37386 el, 37387 wrapperEl, 37388 device 37389 } = swiper; 37390 const capture = !!params.nested; 37391 const domMethod = method === "on" ? "addEventListener" : "removeEventListener"; 37392 const swiperMethod = method; 37393 el[domMethod]("pointerdown", swiper.onTouchStart, { 37394 passive: false 37395 }); 37396 document2[domMethod]("pointermove", swiper.onTouchMove, { 37397 passive: false, 37398 capture 37399 }); 37400 document2[domMethod]("pointerup", swiper.onTouchEnd, { 37401 passive: true 37402 }); 37403 document2[domMethod]("pointercancel", swiper.onTouchEnd, { 37404 passive: true 37405 }); 37406 document2[domMethod]("pointerout", swiper.onTouchEnd, { 37407 passive: true 37408 }); 37409 document2[domMethod]("pointerleave", swiper.onTouchEnd, { 37410 passive: true 37411 }); 37412 document2[domMethod]("contextmenu", swiper.onTouchEnd, { 37413 passive: true 37414 }); 37415 if (params.preventClicks || params.preventClicksPropagation) { 37416 el[domMethod]("click", swiper.onClick, true); 37417 } 37418 if (params.cssMode) { 37419 wrapperEl[domMethod]("scroll", swiper.onScroll); 37420 } 37421 if (params.updateOnWindowResize) { 37422 swiper[swiperMethod](device.ios || device.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", onResize, true); 37423 } else { 37424 swiper[swiperMethod]("observerUpdate", onResize, true); 37425 } 37426 el[domMethod]("load", swiper.onLoad, { 37427 capture: true 37428 }); 37429 }; 37430 function attachEvents() { 37431 const swiper = this; 37432 const document2 = getDocument(); 37433 const { 37434 params 37435 } = swiper; 37436 swiper.onTouchStart = onTouchStart.bind(swiper); 37437 swiper.onTouchMove = onTouchMove.bind(swiper); 37438 swiper.onTouchEnd = onTouchEnd.bind(swiper); 37439 if (params.cssMode) { 37440 swiper.onScroll = onScroll.bind(swiper); 37441 } 37442 swiper.onClick = onClick.bind(swiper); 37443 swiper.onLoad = onLoad.bind(swiper); 37444 if (!dummyEventAttached) { 37445 document2.addEventListener("touchstart", dummyEventListener); 37446 dummyEventAttached = true; 37447 } 37448 events(swiper, "on"); 37449 } 37450 function detachEvents() { 37451 const swiper = this; 37452 events(swiper, "off"); 37453 } 37454 var events$1 = { 37455 attachEvents, 37456 detachEvents 37457 }; 37458 var isGridEnabled = (swiper, params) => { 37459 return swiper.grid && params.grid && params.grid.rows > 1; 37460 }; 37461 function setBreakpoint() { 37462 const swiper = this; 37463 const { 37464 realIndex, 37465 initialized, 37466 params, 37467 el 37468 } = swiper; 37469 const breakpoints2 = params.breakpoints; 37470 if (!breakpoints2 || breakpoints2 && Object.keys(breakpoints2).length === 0) 37471 return; 37472 const breakpoint = swiper.getBreakpoint(breakpoints2, swiper.params.breakpointsBase, swiper.el); 37473 if (!breakpoint || swiper.currentBreakpoint === breakpoint) 37474 return; 37475 const breakpointOnlyParams = breakpoint in breakpoints2 ? breakpoints2[breakpoint] : void 0; 37476 const breakpointParams = breakpointOnlyParams || swiper.originalParams; 37477 const wasMultiRow = isGridEnabled(swiper, params); 37478 const isMultiRow = isGridEnabled(swiper, breakpointParams); 37479 const wasEnabled = params.enabled; 37480 if (wasMultiRow && !isMultiRow) { 37481 el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`); 37482 swiper.emitContainerClasses(); 37483 } else if (!wasMultiRow && isMultiRow) { 37484 el.classList.add(`${params.containerModifierClass}grid`); 37485 if (breakpointParams.grid.fill && breakpointParams.grid.fill === "column" || !breakpointParams.grid.fill && params.grid.fill === "column") { 37486 el.classList.add(`${params.containerModifierClass}grid-column`); 37487 } 37488 swiper.emitContainerClasses(); 37489 } 37490 ["navigation", "pagination", "scrollbar"].forEach((prop) => { 37491 if (typeof breakpointParams[prop] === "undefined") 37492 return; 37493 const wasModuleEnabled = params[prop] && params[prop].enabled; 37494 const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled; 37495 if (wasModuleEnabled && !isModuleEnabled) { 37496 swiper[prop].disable(); 37497 } 37498 if (!wasModuleEnabled && isModuleEnabled) { 37499 swiper[prop].enable(); 37500 } 37501 }); 37502 const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; 37503 const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); 37504 const wasLoop = params.loop; 37505 if (directionChanged && initialized) { 37506 swiper.changeDirection(); 37507 } 37508 extend4(swiper.params, breakpointParams); 37509 const isEnabled = swiper.params.enabled; 37510 const hasLoop = swiper.params.loop; 37511 Object.assign(swiper, { 37512 allowTouchMove: swiper.params.allowTouchMove, 37513 allowSlideNext: swiper.params.allowSlideNext, 37514 allowSlidePrev: swiper.params.allowSlidePrev 37515 }); 37516 if (wasEnabled && !isEnabled) { 37517 swiper.disable(); 37518 } else if (!wasEnabled && isEnabled) { 37519 swiper.enable(); 37520 } 37521 swiper.currentBreakpoint = breakpoint; 37522 swiper.emit("_beforeBreakpoint", breakpointParams); 37523 if (initialized) { 37524 if (needsReLoop) { 37525 swiper.loopDestroy(); 37526 swiper.loopCreate(realIndex); 37527 swiper.updateSlides(); 37528 } else if (!wasLoop && hasLoop) { 37529 swiper.loopCreate(realIndex); 37530 swiper.updateSlides(); 37531 } else if (wasLoop && !hasLoop) { 37532 swiper.loopDestroy(); 37533 } 37534 } 37535 swiper.emit("breakpoint", breakpointParams); 37536 } 37537 function getBreakpoint(breakpoints2, base, containerEl) { 37538 if (base === void 0) { 37539 base = "window"; 37540 } 37541 if (!breakpoints2 || base === "container" && !containerEl) 37542 return void 0; 37543 let breakpoint = false; 37544 const window2 = getWindow2(); 37545 const currentHeight = base === "window" ? window2.innerHeight : containerEl.clientHeight; 37546 const points = Object.keys(breakpoints2).map((point) => { 37547 if (typeof point === "string" && point.indexOf("@") === 0) { 37548 const minRatio = parseFloat(point.substr(1)); 37549 const value = currentHeight * minRatio; 37550 return { 37551 value, 37552 point 37553 }; 37554 } 37555 return { 37556 value: point, 37557 point 37558 }; 37559 }); 37560 points.sort((a4, b4) => parseInt(a4.value, 10) - parseInt(b4.value, 10)); 37561 for (let i4 = 0; i4 < points.length; i4 += 1) { 37562 const { 37563 point, 37564 value 37565 } = points[i4]; 37566 if (base === "window") { 37567 if (window2.matchMedia(`(min-width: ${value}px)`).matches) { 37568 breakpoint = point; 37569 } 37570 } else if (value <= containerEl.clientWidth) { 37571 breakpoint = point; 37572 } 37573 } 37574 return breakpoint || "max"; 37575 } 37576 var breakpoints = { 37577 setBreakpoint, 37578 getBreakpoint 37579 }; 37580 function prepareClasses(entries, prefix) { 37581 const resultClasses = []; 37582 entries.forEach((item) => { 37583 if (typeof item === "object") { 37584 Object.keys(item).forEach((classNames) => { 37585 if (item[classNames]) { 37586 resultClasses.push(prefix + classNames); 37587 } 37588 }); 37589 } else if (typeof item === "string") { 37590 resultClasses.push(prefix + item); 37591 } 37592 }); 37593 return resultClasses; 37594 } 37595 function addClasses() { 37596 const swiper = this; 37597 const { 37598 classNames, 37599 params, 37600 rtl, 37601 el, 37602 device 37603 } = swiper; 37604 const suffixes = prepareClasses(["initialized", params.direction, { 37605 "free-mode": swiper.params.freeMode && params.freeMode.enabled 37606 }, { 37607 "autoheight": params.autoHeight 37608 }, { 37609 "rtl": rtl 37610 }, { 37611 "grid": params.grid && params.grid.rows > 1 37612 }, { 37613 "grid-column": params.grid && params.grid.rows > 1 && params.grid.fill === "column" 37614 }, { 37615 "android": device.android 37616 }, { 37617 "ios": device.ios 37618 }, { 37619 "css-mode": params.cssMode 37620 }, { 37621 "centered": params.cssMode && params.centeredSlides 37622 }, { 37623 "watch-progress": params.watchSlidesProgress 37624 }], params.containerModifierClass); 37625 classNames.push(...suffixes); 37626 el.classList.add(...classNames); 37627 swiper.emitContainerClasses(); 37628 } 37629 function removeClasses() { 37630 const swiper = this; 37631 const { 37632 el, 37633 classNames 37634 } = swiper; 37635 el.classList.remove(...classNames); 37636 swiper.emitContainerClasses(); 37637 } 37638 var classes = { 37639 addClasses, 37640 removeClasses 37641 }; 37642 function checkOverflow() { 37643 const swiper = this; 37644 const { 37645 isLocked: wasLocked, 37646 params 37647 } = swiper; 37648 const { 37649 slidesOffsetBefore 37650 } = params; 37651 if (slidesOffsetBefore) { 37652 const lastSlideIndex = swiper.slides.length - 1; 37653 const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2; 37654 swiper.isLocked = swiper.size > lastSlideRightEdge; 37655 } else { 37656 swiper.isLocked = swiper.snapGrid.length === 1; 37657 } 37658 if (params.allowSlideNext === true) { 37659 swiper.allowSlideNext = !swiper.isLocked; 37660 } 37661 if (params.allowSlidePrev === true) { 37662 swiper.allowSlidePrev = !swiper.isLocked; 37663 } 37664 if (wasLocked && wasLocked !== swiper.isLocked) { 37665 swiper.isEnd = false; 37666 } 37667 if (wasLocked !== swiper.isLocked) { 37668 swiper.emit(swiper.isLocked ? "lock" : "unlock"); 37669 } 37670 } 37671 var checkOverflow$1 = { 37672 checkOverflow 37673 }; 37674 var defaults = { 37675 init: true, 37676 direction: "horizontal", 37677 oneWayMovement: false, 37678 touchEventsTarget: "wrapper", 37679 initialSlide: 0, 37680 speed: 300, 37681 cssMode: false, 37682 updateOnWindowResize: true, 37683 resizeObserver: true, 37684 nested: false, 37685 createElements: false, 37686 enabled: true, 37687 focusableElements: "input, select, option, textarea, button, video, label", 37688 width: null, 37689 height: null, 37690 preventInteractionOnTransition: false, 37691 userAgent: null, 37692 url: null, 37693 edgeSwipeDetection: false, 37694 edgeSwipeThreshold: 20, 37695 autoHeight: false, 37696 setWrapperSize: false, 37697 virtualTranslate: false, 37698 effect: "slide", 37699 breakpoints: void 0, 37700 breakpointsBase: "window", 37701 spaceBetween: 0, 37702 slidesPerView: 1, 37703 slidesPerGroup: 1, 37704 slidesPerGroupSkip: 0, 37705 slidesPerGroupAuto: false, 37706 centeredSlides: false, 37707 centeredSlidesBounds: false, 37708 slidesOffsetBefore: 0, 37709 slidesOffsetAfter: 0, 37710 normalizeSlideIndex: true, 37711 centerInsufficientSlides: false, 37712 watchOverflow: true, 37713 roundLengths: false, 37714 touchRatio: 1, 37715 touchAngle: 45, 37716 simulateTouch: true, 37717 shortSwipes: true, 37718 longSwipes: true, 37719 longSwipesRatio: 0.5, 37720 longSwipesMs: 300, 37721 followFinger: true, 37722 allowTouchMove: true, 37723 threshold: 5, 37724 touchMoveStopPropagation: false, 37725 touchStartPreventDefault: true, 37726 touchStartForcePreventDefault: false, 37727 touchReleaseOnEdges: false, 37728 uniqueNavElements: true, 37729 resistance: true, 37730 resistanceRatio: 0.85, 37731 watchSlidesProgress: false, 37732 grabCursor: false, 37733 preventClicks: true, 37734 preventClicksPropagation: true, 37735 slideToClickedSlide: false, 37736 loop: false, 37737 loopedSlides: null, 37738 loopPreventsSliding: true, 37739 rewind: false, 37740 allowSlidePrev: true, 37741 allowSlideNext: true, 37742 swipeHandler: null, 37743 noSwiping: true, 37744 noSwipingClass: "swiper-no-swiping", 37745 noSwipingSelector: null, 37746 passiveListeners: true, 37747 maxBackfaceHiddenSlides: 10, 37748 containerModifierClass: "swiper-", 37749 slideClass: "swiper-slide", 37750 slideActiveClass: "swiper-slide-active", 37751 slideVisibleClass: "swiper-slide-visible", 37752 slideNextClass: "swiper-slide-next", 37753 slidePrevClass: "swiper-slide-prev", 37754 wrapperClass: "swiper-wrapper", 37755 lazyPreloaderClass: "swiper-lazy-preloader", 37756 lazyPreloadPrevNext: 0, 37757 runCallbacksOnInit: true, 37758 _emitClasses: false 37759 }; 37760 function moduleExtendParams(params, allModulesParams) { 37761 return function extendParams(obj) { 37762 if (obj === void 0) { 37763 obj = {}; 37764 } 37765 const moduleParamName = Object.keys(obj)[0]; 37766 const moduleParams = obj[moduleParamName]; 37767 if (typeof moduleParams !== "object" || moduleParams === null) { 37768 extend4(allModulesParams, obj); 37769 return; 37770 } 37771 if (params[moduleParamName] === true) { 37772 params[moduleParamName] = { 37773 enabled: true 37774 }; 37775 } 37776 if (moduleParamName === "navigation" && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) { 37777 params[moduleParamName].auto = true; 37778 } 37779 if (["pagination", "scrollbar"].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) { 37780 params[moduleParamName].auto = true; 37781 } 37782 if (!(moduleParamName in params && "enabled" in moduleParams)) { 37783 extend4(allModulesParams, obj); 37784 return; 37785 } 37786 if (typeof params[moduleParamName] === "object" && !("enabled" in params[moduleParamName])) { 37787 params[moduleParamName].enabled = true; 37788 } 37789 if (!params[moduleParamName]) 37790 params[moduleParamName] = { 37791 enabled: false 37792 }; 37793 extend4(allModulesParams, obj); 37794 }; 37795 } 37796 var prototypes = { 37797 eventsEmitter, 37798 update, 37799 translate, 37800 transition, 37801 slide, 37802 loop, 37803 grabCursor, 37804 events: events$1, 37805 breakpoints, 37806 checkOverflow: checkOverflow$1, 37807 classes 37808 }; 37809 var extendedDefaults = {}; 37810 var Swiper = class { 37811 constructor() { 37812 let el; 37813 let params; 37814 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 37815 args[_key] = arguments[_key]; 37816 } 37817 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === "Object") { 37818 params = args[0]; 37819 } else { 37820 [el, params] = args; 37821 } 37822 if (!params) 37823 params = {}; 37824 params = extend4({}, params); 37825 if (el && !params.el) 37826 params.el = el; 37827 const document2 = getDocument(); 37828 if (params.el && typeof params.el === "string" && document2.querySelectorAll(params.el).length > 1) { 37829 const swipers = []; 37830 document2.querySelectorAll(params.el).forEach((containerEl) => { 37831 const newParams = extend4({}, params, { 37832 el: containerEl 37833 }); 37834 swipers.push(new Swiper(newParams)); 37835 }); 37836 return swipers; 37837 } 37838 const swiper = this; 37839 swiper.__swiper__ = true; 37840 swiper.support = getSupport(); 37841 swiper.device = getDevice({ 37842 userAgent: params.userAgent 37843 }); 37844 swiper.browser = getBrowser(); 37845 swiper.eventsListeners = {}; 37846 swiper.eventsAnyListeners = []; 37847 swiper.modules = [...swiper.__modules__]; 37848 if (params.modules && Array.isArray(params.modules)) { 37849 swiper.modules.push(...params.modules); 37850 } 37851 const allModulesParams = {}; 37852 swiper.modules.forEach((mod) => { 37853 mod({ 37854 params, 37855 swiper, 37856 extendParams: moduleExtendParams(params, allModulesParams), 37857 on: swiper.on.bind(swiper), 37858 once: swiper.once.bind(swiper), 37859 off: swiper.off.bind(swiper), 37860 emit: swiper.emit.bind(swiper) 37861 }); 37862 }); 37863 const swiperParams = extend4({}, defaults, allModulesParams); 37864 swiper.params = extend4({}, swiperParams, extendedDefaults, params); 37865 swiper.originalParams = extend4({}, swiper.params); 37866 swiper.passedParams = extend4({}, params); 37867 if (swiper.params && swiper.params.on) { 37868 Object.keys(swiper.params.on).forEach((eventName) => { 37869 swiper.on(eventName, swiper.params.on[eventName]); 37870 }); 37871 } 37872 if (swiper.params && swiper.params.onAny) { 37873 swiper.onAny(swiper.params.onAny); 37874 } 37875 Object.assign(swiper, { 37876 enabled: swiper.params.enabled, 37877 el, 37878 classNames: [], 37879 slides: [], 37880 slidesGrid: [], 37881 snapGrid: [], 37882 slidesSizesGrid: [], 37883 isHorizontal() { 37884 return swiper.params.direction === "horizontal"; 37885 }, 37886 isVertical() { 37887 return swiper.params.direction === "vertical"; 37888 }, 37889 activeIndex: 0, 37890 realIndex: 0, 37891 isBeginning: true, 37892 isEnd: false, 37893 translate: 0, 37894 previousTranslate: 0, 37895 progress: 0, 37896 velocity: 0, 37897 animating: false, 37898 cssOverflowAdjustment() { 37899 return Math.trunc(this.translate / 2 ** 23) * 2 ** 23; 37900 }, 37901 allowSlideNext: swiper.params.allowSlideNext, 37902 allowSlidePrev: swiper.params.allowSlidePrev, 37903 touchEventsData: { 37904 isTouched: void 0, 37905 isMoved: void 0, 37906 allowTouchCallbacks: void 0, 37907 touchStartTime: void 0, 37908 isScrolling: void 0, 37909 currentTranslate: void 0, 37910 startTranslate: void 0, 37911 allowThresholdMove: void 0, 37912 focusableElements: swiper.params.focusableElements, 37913 lastClickTime: 0, 37914 clickTimeout: void 0, 37915 velocities: [], 37916 allowMomentumBounce: void 0, 37917 startMoving: void 0, 37918 evCache: [] 37919 }, 37920 allowClick: true, 37921 allowTouchMove: swiper.params.allowTouchMove, 37922 touches: { 37923 startX: 0, 37924 startY: 0, 37925 currentX: 0, 37926 currentY: 0, 37927 diff: 0 37928 }, 37929 imagesToLoad: [], 37930 imagesLoaded: 0 37931 }); 37932 swiper.emit("_swiper"); 37933 if (swiper.params.init) { 37934 swiper.init(); 37935 } 37936 return swiper; 37937 } 37938 getSlideIndex(slideEl) { 37939 const { 37940 slidesEl, 37941 params 37942 } = this; 37943 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`); 37944 const firstSlideIndex = elementIndex(slides[0]); 37945 return elementIndex(slideEl) - firstSlideIndex; 37946 } 37947 getSlideIndexByData(index4) { 37948 return this.getSlideIndex(this.slides.filter((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === index4)[0]); 37949 } 37950 recalcSlides() { 37951 const swiper = this; 37952 const { 37953 slidesEl, 37954 params 37955 } = swiper; 37956 swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`); 37957 } 37958 enable() { 37959 const swiper = this; 37960 if (swiper.enabled) 37961 return; 37962 swiper.enabled = true; 37963 if (swiper.params.grabCursor) { 37964 swiper.setGrabCursor(); 37965 } 37966 swiper.emit("enable"); 37967 } 37968 disable() { 37969 const swiper = this; 37970 if (!swiper.enabled) 37971 return; 37972 swiper.enabled = false; 37973 if (swiper.params.grabCursor) { 37974 swiper.unsetGrabCursor(); 37975 } 37976 swiper.emit("disable"); 37977 } 37978 setProgress(progress, speed) { 37979 const swiper = this; 37980 progress = Math.min(Math.max(progress, 0), 1); 37981 const min2 = swiper.minTranslate(); 37982 const max2 = swiper.maxTranslate(); 37983 const current = (max2 - min2) * progress + min2; 37984 swiper.translateTo(current, typeof speed === "undefined" ? 0 : speed); 37985 swiper.updateActiveIndex(); 37986 swiper.updateSlidesClasses(); 37987 } 37988 emitContainerClasses() { 37989 const swiper = this; 37990 if (!swiper.params._emitClasses || !swiper.el) 37991 return; 37992 const cls = swiper.el.className.split(" ").filter((className) => { 37993 return className.indexOf("swiper") === 0 || className.indexOf(swiper.params.containerModifierClass) === 0; 37994 }); 37995 swiper.emit("_containerClasses", cls.join(" ")); 37996 } 37997 getSlideClasses(slideEl) { 37998 const swiper = this; 37999 if (swiper.destroyed) 38000 return ""; 38001 return slideEl.className.split(" ").filter((className) => { 38002 return className.indexOf("swiper-slide") === 0 || className.indexOf(swiper.params.slideClass) === 0; 38003 }).join(" "); 38004 } 38005 emitSlidesClasses() { 38006 const swiper = this; 38007 if (!swiper.params._emitClasses || !swiper.el) 38008 return; 38009 const updates = []; 38010 swiper.slides.forEach((slideEl) => { 38011 const classNames = swiper.getSlideClasses(slideEl); 38012 updates.push({ 38013 slideEl, 38014 classNames 38015 }); 38016 swiper.emit("_slideClass", slideEl, classNames); 38017 }); 38018 swiper.emit("_slideClasses", updates); 38019 } 38020 slidesPerViewDynamic(view, exact) { 38021 if (view === void 0) { 38022 view = "current"; 38023 } 38024 if (exact === void 0) { 38025 exact = false; 38026 } 38027 const swiper = this; 38028 const { 38029 params, 38030 slides, 38031 slidesGrid, 38032 slidesSizesGrid, 38033 size: swiperSize, 38034 activeIndex 38035 } = swiper; 38036 let spv = 1; 38037 if (typeof params.slidesPerView === "number") 38038 return params.slidesPerView; 38039 if (params.centeredSlides) { 38040 let slideSize = slides[activeIndex] ? slides[activeIndex].swiperSlideSize : 0; 38041 let breakLoop; 38042 for (let i4 = activeIndex + 1; i4 < slides.length; i4 += 1) { 38043 if (slides[i4] && !breakLoop) { 38044 slideSize += slides[i4].swiperSlideSize; 38045 spv += 1; 38046 if (slideSize > swiperSize) 38047 breakLoop = true; 38048 } 38049 } 38050 for (let i4 = activeIndex - 1; i4 >= 0; i4 -= 1) { 38051 if (slides[i4] && !breakLoop) { 38052 slideSize += slides[i4].swiperSlideSize; 38053 spv += 1; 38054 if (slideSize > swiperSize) 38055 breakLoop = true; 38056 } 38057 } 38058 } else { 38059 if (view === "current") { 38060 for (let i4 = activeIndex + 1; i4 < slides.length; i4 += 1) { 38061 const slideInView = exact ? slidesGrid[i4] + slidesSizesGrid[i4] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i4] - slidesGrid[activeIndex] < swiperSize; 38062 if (slideInView) { 38063 spv += 1; 38064 } 38065 } 38066 } else { 38067 for (let i4 = activeIndex - 1; i4 >= 0; i4 -= 1) { 38068 const slideInView = slidesGrid[activeIndex] - slidesGrid[i4] < swiperSize; 38069 if (slideInView) { 38070 spv += 1; 38071 } 38072 } 38073 } 38074 } 38075 return spv; 38076 } 38077 update() { 38078 const swiper = this; 38079 if (!swiper || swiper.destroyed) 38080 return; 38081 const { 38082 snapGrid, 38083 params 38084 } = swiper; 38085 if (params.breakpoints) { 38086 swiper.setBreakpoint(); 38087 } 38088 [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach((imageEl) => { 38089 if (imageEl.complete) { 38090 processLazyPreloader(swiper, imageEl); 38091 } 38092 }); 38093 swiper.updateSize(); 38094 swiper.updateSlides(); 38095 swiper.updateProgress(); 38096 swiper.updateSlidesClasses(); 38097 function setTranslate2() { 38098 const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; 38099 const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); 38100 swiper.setTranslate(newTranslate); 38101 swiper.updateActiveIndex(); 38102 swiper.updateSlidesClasses(); 38103 } 38104 let translated; 38105 if (params.freeMode && params.freeMode.enabled && !params.cssMode) { 38106 setTranslate2(); 38107 if (params.autoHeight) { 38108 swiper.updateAutoHeight(); 38109 } 38110 } else { 38111 if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) { 38112 const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides; 38113 translated = swiper.slideTo(slides.length - 1, 0, false, true); 38114 } else { 38115 translated = swiper.slideTo(swiper.activeIndex, 0, false, true); 38116 } 38117 if (!translated) { 38118 setTranslate2(); 38119 } 38120 } 38121 if (params.watchOverflow && snapGrid !== swiper.snapGrid) { 38122 swiper.checkOverflow(); 38123 } 38124 swiper.emit("update"); 38125 } 38126 changeDirection(newDirection, needUpdate) { 38127 if (needUpdate === void 0) { 38128 needUpdate = true; 38129 } 38130 const swiper = this; 38131 const currentDirection = swiper.params.direction; 38132 if (!newDirection) { 38133 newDirection = currentDirection === "horizontal" ? "vertical" : "horizontal"; 38134 } 38135 if (newDirection === currentDirection || newDirection !== "horizontal" && newDirection !== "vertical") { 38136 return swiper; 38137 } 38138 swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`); 38139 swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`); 38140 swiper.emitContainerClasses(); 38141 swiper.params.direction = newDirection; 38142 swiper.slides.forEach((slideEl) => { 38143 if (newDirection === "vertical") { 38144 slideEl.style.width = ""; 38145 } else { 38146 slideEl.style.height = ""; 38147 } 38148 }); 38149 swiper.emit("changeDirection"); 38150 if (needUpdate) 38151 swiper.update(); 38152 return swiper; 38153 } 38154 changeLanguageDirection(direction) { 38155 const swiper = this; 38156 if (swiper.rtl && direction === "rtl" || !swiper.rtl && direction === "ltr") 38157 return; 38158 swiper.rtl = direction === "rtl"; 38159 swiper.rtlTranslate = swiper.params.direction === "horizontal" && swiper.rtl; 38160 if (swiper.rtl) { 38161 swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`); 38162 swiper.el.dir = "rtl"; 38163 } else { 38164 swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`); 38165 swiper.el.dir = "ltr"; 38166 } 38167 swiper.update(); 38168 } 38169 mount(element) { 38170 const swiper = this; 38171 if (swiper.mounted) 38172 return true; 38173 let el = element || swiper.params.el; 38174 if (typeof el === "string") { 38175 el = document.querySelector(el); 38176 } 38177 if (!el) { 38178 return false; 38179 } 38180 el.swiper = swiper; 38181 if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === "SWIPER-CONTAINER") { 38182 swiper.isElement = true; 38183 } 38184 const getWrapperSelector = () => { 38185 return `.${(swiper.params.wrapperClass || "").trim().split(" ").join(".")}`; 38186 }; 38187 const getWrapper = () => { 38188 if (el && el.shadowRoot && el.shadowRoot.querySelector) { 38189 const res = el.shadowRoot.querySelector(getWrapperSelector()); 38190 return res; 38191 } 38192 return elementChildren(el, getWrapperSelector())[0]; 38193 }; 38194 let wrapperEl = getWrapper(); 38195 if (!wrapperEl && swiper.params.createElements) { 38196 wrapperEl = createElement("div", swiper.params.wrapperClass); 38197 el.append(wrapperEl); 38198 elementChildren(el, `.${swiper.params.slideClass}`).forEach((slideEl) => { 38199 wrapperEl.append(slideEl); 38200 }); 38201 } 38202 Object.assign(swiper, { 38203 el, 38204 wrapperEl, 38205 slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl, 38206 hostEl: swiper.isElement ? el.parentNode.host : el, 38207 mounted: true, 38208 rtl: el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl", 38209 rtlTranslate: swiper.params.direction === "horizontal" && (el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl"), 38210 wrongRTL: elementStyle(wrapperEl, "display") === "-webkit-box" 38211 }); 38212 return true; 38213 } 38214 init(el) { 38215 const swiper = this; 38216 if (swiper.initialized) 38217 return swiper; 38218 const mounted = swiper.mount(el); 38219 if (mounted === false) 38220 return swiper; 38221 swiper.emit("beforeInit"); 38222 if (swiper.params.breakpoints) { 38223 swiper.setBreakpoint(); 38224 } 38225 swiper.addClasses(); 38226 swiper.updateSize(); 38227 swiper.updateSlides(); 38228 if (swiper.params.watchOverflow) { 38229 swiper.checkOverflow(); 38230 } 38231 if (swiper.params.grabCursor && swiper.enabled) { 38232 swiper.setGrabCursor(); 38233 } 38234 if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) { 38235 swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true); 38236 } else { 38237 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true); 38238 } 38239 if (swiper.params.loop) { 38240 swiper.loopCreate(); 38241 } 38242 swiper.attachEvents(); 38243 const lazyElements = [...swiper.el.querySelectorAll('[loading="lazy"]')]; 38244 if (swiper.isElement) { 38245 lazyElements.push(...swiper.hostEl.querySelectorAll('[loading="lazy"]')); 38246 } 38247 lazyElements.forEach((imageEl) => { 38248 if (imageEl.complete) { 38249 processLazyPreloader(swiper, imageEl); 38250 } else { 38251 imageEl.addEventListener("load", (e4) => { 38252 processLazyPreloader(swiper, e4.target); 38253 }); 38254 } 38255 }); 38256 preload(swiper); 38257 swiper.initialized = true; 38258 preload(swiper); 38259 swiper.emit("init"); 38260 swiper.emit("afterInit"); 38261 return swiper; 38262 } 38263 destroy(deleteInstance, cleanStyles) { 38264 if (deleteInstance === void 0) { 38265 deleteInstance = true; 38266 } 38267 if (cleanStyles === void 0) { 38268 cleanStyles = true; 38269 } 38270 const swiper = this; 38271 const { 38272 params, 38273 el, 38274 wrapperEl, 38275 slides 38276 } = swiper; 38277 if (typeof swiper.params === "undefined" || swiper.destroyed) { 38278 return null; 38279 } 38280 swiper.emit("beforeDestroy"); 38281 swiper.initialized = false; 38282 swiper.detachEvents(); 38283 if (params.loop) { 38284 swiper.loopDestroy(); 38285 } 38286 if (cleanStyles) { 38287 swiper.removeClasses(); 38288 el.removeAttribute("style"); 38289 wrapperEl.removeAttribute("style"); 38290 if (slides && slides.length) { 38291 slides.forEach((slideEl) => { 38292 slideEl.classList.remove(params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass); 38293 slideEl.removeAttribute("style"); 38294 slideEl.removeAttribute("data-swiper-slide-index"); 38295 }); 38296 } 38297 } 38298 swiper.emit("destroy"); 38299 Object.keys(swiper.eventsListeners).forEach((eventName) => { 38300 swiper.off(eventName); 38301 }); 38302 if (deleteInstance !== false) { 38303 swiper.el.swiper = null; 38304 deleteProps(swiper); 38305 } 38306 swiper.destroyed = true; 38307 return null; 38308 } 38309 static extendDefaults(newDefaults) { 38310 extend4(extendedDefaults, newDefaults); 38311 } 38312 static get extendedDefaults() { 38313 return extendedDefaults; 38314 } 38315 static get defaults() { 38316 return defaults; 38317 } 38318 static installModule(mod) { 38319 if (!Swiper.prototype.__modules__) 38320 Swiper.prototype.__modules__ = []; 38321 const modules = Swiper.prototype.__modules__; 38322 if (typeof mod === "function" && modules.indexOf(mod) < 0) { 38323 modules.push(mod); 38324 } 38325 } 38326 static use(module) { 38327 if (Array.isArray(module)) { 38328 module.forEach((m5) => Swiper.installModule(m5)); 38329 return Swiper; 38330 } 38331 Swiper.installModule(module); 38332 return Swiper; 38333 } 38334 }; 38335 Object.keys(prototypes).forEach((prototypeGroup) => { 38336 Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => { 38337 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; 38338 }); 38339 }); 38340 Swiper.use([Resize, Observer]); 38341 38342
vendor: 679 bytes, lines 38342-38361
38342// node_modules/swiper/shared/create-element-if-not-defined.mjs 38343 function createElementIfNotDefined(swiper, originalParams, params, checkProps) { 38344 if (swiper.params.createElements) { 38345 Object.keys(checkProps).forEach((key) => { 38346 if (!params[key] && params.auto === true) { 38347 let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0]; 38348 if (!element) { 38349 element = createElement("div", checkProps[key]); 38350 element.className = checkProps[key]; 38351 swiper.el.append(element); 38352 } 38353 params[key] = element; 38354 originalParams[key] = element; 38355 } 38356 }); 38357 } 38358 return params; 38359 } 38360 38361
vendor: 6,244 bytes, lines 38361-38555
38361// node_modules/swiper/modules/navigation.mjs 38362 function Navigation(_ref) { 38363 let { 38364 swiper, 38365 extendParams, 38366 on: on2, 38367 emit 38368 } = _ref; 38369 extendParams({ 38370 navigation: { 38371 nextEl: null, 38372 prevEl: null, 38373 hideOnClick: false, 38374 disabledClass: "swiper-button-disabled", 38375 hiddenClass: "swiper-button-hidden", 38376 lockClass: "swiper-button-lock", 38377 navigationDisabledClass: "swiper-navigation-disabled" 38378 } 38379 }); 38380 swiper.navigation = { 38381 nextEl: null, 38382 prevEl: null 38383 }; 38384 const makeElementsArray = (el) => (Array.isArray(el) ? el : [el]).filter((e4) => !!e4); 38385 function getEl(el) { 38386 let res; 38387 if (el && typeof el === "string" && swiper.isElement) { 38388 res = swiper.el.querySelector(el); 38389 if (res) 38390 return res; 38391 } 38392 if (el) { 38393 if (typeof el === "string") 38394 res = [...document.querySelectorAll(el)]; 38395 if (swiper.params.uniqueNavElements && typeof el === "string" && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) { 38396 res = swiper.el.querySelector(el); 38397 } 38398 } 38399 if (el && !res) 38400 return el; 38401 return res; 38402 } 38403 function toggleEl(el, disabled) { 38404 const params = swiper.params.navigation; 38405 el = makeElementsArray(el); 38406 el.forEach((subEl) => { 38407 if (subEl) { 38408 subEl.classList[disabled ? "add" : "remove"](...params.disabledClass.split(" ")); 38409 if (subEl.tagName === "BUTTON") 38410 subEl.disabled = disabled; 38411 if (swiper.params.watchOverflow && swiper.enabled) { 38412 subEl.classList[swiper.isLocked ? "add" : "remove"](params.lockClass); 38413 } 38414 } 38415 }); 38416 } 38417 function update2() { 38418 const { 38419 nextEl, 38420 prevEl 38421 } = swiper.navigation; 38422 if (swiper.params.loop) { 38423 toggleEl(prevEl, false); 38424 toggleEl(nextEl, false); 38425 return; 38426 } 38427 toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind); 38428 toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind); 38429 } 38430 function onPrevClick(e4) { 38431 e4.preventDefault(); 38432 if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) 38433 return; 38434 swiper.slidePrev(); 38435 emit("navigationPrev"); 38436 } 38437 function onNextClick(e4) { 38438 e4.preventDefault(); 38439 if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) 38440 return; 38441 swiper.slideNext(); 38442 emit("navigationNext"); 38443 } 38444 function init() { 38445 const params = swiper.params.navigation; 38446 swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, { 38447 nextEl: "swiper-button-next", 38448 prevEl: "swiper-button-prev" 38449 }); 38450 if (!(params.nextEl || params.prevEl)) 38451 return; 38452 let nextEl = getEl(params.nextEl); 38453 let prevEl = getEl(params.prevEl); 38454 Object.assign(swiper.navigation, { 38455 nextEl, 38456 prevEl 38457 }); 38458 nextEl = makeElementsArray(nextEl); 38459 prevEl = makeElementsArray(prevEl); 38460 const initButton = (el, dir) => { 38461 if (el) { 38462 el.addEventListener("click", dir === "next" ? onNextClick : onPrevClick); 38463 } 38464 if (!swiper.enabled && el) { 38465 el.classList.add(...params.lockClass.split(" ")); 38466 } 38467 }; 38468 nextEl.forEach((el) => initButton(el, "next")); 38469 prevEl.forEach((el) => initButton(el, "prev")); 38470 } 38471 function destroy2() { 38472 let { 38473 nextEl, 38474 prevEl 38475 } = swiper.navigation; 38476 nextEl = makeElementsArray(nextEl); 38477 prevEl = makeElementsArray(prevEl); 38478 const destroyButton = (el, dir) => { 38479 el.removeEventListener("click", dir === "next" ? onNextClick : onPrevClick); 38480 el.classList.remove(...swiper.params.navigation.disabledClass.split(" ")); 38481 }; 38482 nextEl.forEach((el) => destroyButton(el, "next")); 38483 prevEl.forEach((el) => destroyButton(el, "prev")); 38484 } 38485 on2("init", () => { 38486 if (swiper.params.navigation.enabled === false) { 38487 disable2(); 38488 } else { 38489 init(); 38490 update2(); 38491 } 38492 }); 38493 on2("toEdge fromEdge lock unlock", () => { 38494 update2(); 38495 }); 38496 on2("destroy", () => { 38497 destroy2(); 38498 }); 38499 on2("enable disable", () => { 38500 let { 38501 nextEl, 38502 prevEl 38503 } = swiper.navigation; 38504 nextEl = makeElementsArray(nextEl); 38505 prevEl = makeElementsArray(prevEl); 38506 if (swiper.enabled) { 38507 update2(); 38508 return; 38509 } 38510 [...nextEl, ...prevEl].filter((el) => !!el).forEach((el) => el.classList.add(swiper.params.navigation.lockClass)); 38511 }); 38512 on2("click", (_s, e4) => { 38513 let { 38514 nextEl, 38515 prevEl 38516 } = swiper.navigation; 38517 nextEl = makeElementsArray(nextEl); 38518 prevEl = makeElementsArray(prevEl); 38519 const targetEl = e4.target; 38520 if (swiper.params.navigation.hideOnClick && !prevEl.includes(targetEl) && !nextEl.includes(targetEl)) { 38521 if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) 38522 return; 38523 let isHidden; 38524 if (nextEl.length) { 38525 isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass); 38526 } else if (prevEl.length) { 38527 isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass); 38528 } 38529 if (isHidden === true) { 38530 emit("navigationShow"); 38531 } else { 38532 emit("navigationHide"); 38533 } 38534 [...nextEl, ...prevEl].filter((el) => !!el).forEach((el) => el.classList.toggle(swiper.params.navigation.hiddenClass)); 38535 } 38536 }); 38537 const enable2 = () => { 38538 swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(" ")); 38539 init(); 38540 update2(); 38541 }; 38542 const disable2 = () => { 38543 swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(" ")); 38544 destroy2(); 38545 }; 38546 Object.assign(swiper.navigation, { 38547 enable: enable2, 38548 disable: disable2, 38549 update: update2, 38550 init, 38551 destroy: destroy2 38552 }); 38553 } 38554 38555
vendor: 245 bytes, lines 38555-38563
38555// node_modules/swiper/shared/classes-to-selector.mjs 38556 function classesToSelector(classes2) { 38557 if (classes2 === void 0) { 38558 classes2 = ""; 38559 } 38560 return `.${classes2.trim().replace(/([\.:!+\/])/g, "\\$1").replace(/ /g, ".")}`; 38561 } 38562 38563
vendor: 18,523 bytes, lines 38563-39032
38563// node_modules/swiper/modules/pagination.mjs 38564 function Pagination(_ref) { 38565 let { 38566 swiper, 38567 extendParams, 38568 on: on2, 38569 emit 38570 } = _ref; 38571 const pfx = "swiper-pagination"; 38572 extendParams({ 38573 pagination: { 38574 el: null, 38575 bulletElement: "span", 38576 clickable: false, 38577 hideOnClick: false, 38578 renderBullet: null, 38579 renderProgressbar: null, 38580 renderFraction: null, 38581 renderCustom: null, 38582 progressbarOpposite: false, 38583 type: "bullets", 38584 dynamicBullets: false, 38585 dynamicMainBullets: 1, 38586 formatFractionCurrent: (number) => number, 38587 formatFractionTotal: (number) => number, 38588 bulletClass: `${pfx}-bullet`, 38589 bulletActiveClass: `${pfx}-bullet-active`, 38590 modifierClass: `${pfx}-`, 38591 currentClass: `${pfx}-current`, 38592 totalClass: `${pfx}-total`, 38593 hiddenClass: `${pfx}-hidden`, 38594 progressbarFillClass: `${pfx}-progressbar-fill`, 38595 progressbarOppositeClass: `${pfx}-progressbar-opposite`, 38596 clickableClass: `${pfx}-clickable`, 38597 lockClass: `${pfx}-lock`, 38598 horizontalClass: `${pfx}-horizontal`, 38599 verticalClass: `${pfx}-vertical`, 38600 paginationDisabledClass: `${pfx}-disabled` 38601 } 38602 }); 38603 swiper.pagination = { 38604 el: null, 38605 bullets: [] 38606 }; 38607 let bulletSize; 38608 let dynamicBulletIndex = 0; 38609 const makeElementsArray = (el) => (Array.isArray(el) ? el : [el]).filter((e4) => !!e4); 38610 function isPaginationDisabled() { 38611 return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0; 38612 } 38613 function setSideBullets(bulletEl, position) { 38614 const { 38615 bulletActiveClass 38616 } = swiper.params.pagination; 38617 if (!bulletEl) 38618 return; 38619 bulletEl = bulletEl[`${position === "prev" ? "previous" : "next"}ElementSibling`]; 38620 if (bulletEl) { 38621 bulletEl.classList.add(`${bulletActiveClass}-${position}`); 38622 bulletEl = bulletEl[`${position === "prev" ? "previous" : "next"}ElementSibling`]; 38623 if (bulletEl) { 38624 bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`); 38625 } 38626 } 38627 } 38628 function onBulletClick(e4) { 38629 const bulletEl = e4.target.closest(classesToSelector(swiper.params.pagination.bulletClass)); 38630 if (!bulletEl) { 38631 return; 38632 } 38633 e4.preventDefault(); 38634 const index4 = elementIndex(bulletEl) * swiper.params.slidesPerGroup; 38635 if (swiper.params.loop) { 38636 if (swiper.realIndex === index4) 38637 return; 38638 const realIndex = swiper.realIndex; 38639 const newSlideIndex = swiper.getSlideIndexByData(index4); 38640 const currentSlideIndex = swiper.getSlideIndexByData(swiper.realIndex); 38641 const loopFix2 = (dir) => { 38642 const indexBeforeLoopFix = swiper.activeIndex; 38643 swiper.loopFix({ 38644 direction: dir, 38645 activeSlideIndex: newSlideIndex, 38646 slideTo: false 38647 }); 38648 const indexAfterFix = swiper.activeIndex; 38649 if (indexBeforeLoopFix === indexAfterFix) { 38650 swiper.slideToLoop(realIndex, 0, false, true); 38651 } 38652 }; 38653 if (newSlideIndex > swiper.slides.length - swiper.loopedSlides) { 38654 loopFix2(newSlideIndex > currentSlideIndex ? "next" : "prev"); 38655 } else if (swiper.params.centeredSlides) { 38656 const slidesPerView = swiper.params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(swiper.params.slidesPerView, 10)); 38657 if (newSlideIndex < Math.floor(slidesPerView / 2)) { 38658 loopFix2("prev"); 38659 } 38660 } 38661 swiper.slideToLoop(index4); 38662 } else { 38663 swiper.slideTo(index4); 38664 } 38665 } 38666 function update2() { 38667 const rtl = swiper.rtl; 38668 const params = swiper.params.pagination; 38669 if (isPaginationDisabled()) 38670 return; 38671 let el = swiper.pagination.el; 38672 el = makeElementsArray(el); 38673 let current; 38674 let previousIndex; 38675 const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; 38676 const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length; 38677 if (swiper.params.loop) { 38678 previousIndex = swiper.previousRealIndex || 0; 38679 current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex; 38680 } else if (typeof swiper.snapIndex !== "undefined") { 38681 current = swiper.snapIndex; 38682 previousIndex = swiper.previousSnapIndex; 38683 } else { 38684 previousIndex = swiper.previousIndex || 0; 38685 current = swiper.activeIndex || 0; 38686 } 38687 if (params.type === "bullets" && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { 38688 const bullets = swiper.pagination.bullets; 38689 let firstIndex; 38690 let lastIndex; 38691 let midIndex; 38692 if (params.dynamicBullets) { 38693 bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? "width" : "height", true); 38694 el.forEach((subEl) => { 38695 subEl.style[swiper.isHorizontal() ? "width" : "height"] = `${bulletSize * (params.dynamicMainBullets + 4)}px`; 38696 }); 38697 if (params.dynamicMainBullets > 1 && previousIndex !== void 0) { 38698 dynamicBulletIndex += current - (previousIndex || 0); 38699 if (dynamicBulletIndex > params.dynamicMainBullets - 1) { 38700 dynamicBulletIndex = params.dynamicMainBullets - 1; 38701 } else if (dynamicBulletIndex < 0) { 38702 dynamicBulletIndex = 0; 38703 } 38704 } 38705 firstIndex = Math.max(current - dynamicBulletIndex, 0); 38706 lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); 38707 midIndex = (lastIndex + firstIndex) / 2; 38708 } 38709 bullets.forEach((bulletEl) => { 38710 const classesToRemove = [...["", "-next", "-next-next", "-prev", "-prev-prev", "-main"].map((suffix) => `${params.bulletActiveClass}${suffix}`)].map((s4) => typeof s4 === "string" && s4.includes(" ") ? s4.split(" ") : s4).flat(); 38711 bulletEl.classList.remove(...classesToRemove); 38712 }); 38713 if (el.length > 1) { 38714 bullets.forEach((bullet) => { 38715 const bulletIndex = elementIndex(bullet); 38716 if (bulletIndex === current) { 38717 bullet.classList.add(...params.bulletActiveClass.split(" ")); 38718 } else if (swiper.isElement) { 38719 bullet.setAttribute("part", "bullet"); 38720 } 38721 if (params.dynamicBullets) { 38722 if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { 38723 bullet.classList.add(...`${params.bulletActiveClass}-main`.split(" ")); 38724 } 38725 if (bulletIndex === firstIndex) { 38726 setSideBullets(bullet, "prev"); 38727 } 38728 if (bulletIndex === lastIndex) { 38729 setSideBullets(bullet, "next"); 38730 } 38731 } 38732 }); 38733 } else { 38734 const bullet = bullets[current]; 38735 if (bullet) { 38736 bullet.classList.add(...params.bulletActiveClass.split(" ")); 38737 } 38738 if (swiper.isElement) { 38739 bullets.forEach((bulletEl, bulletIndex) => { 38740 bulletEl.setAttribute("part", bulletIndex === current ? "bullet-active" : "bullet"); 38741 }); 38742 } 38743 if (params.dynamicBullets) { 38744 const firstDisplayedBullet = bullets[firstIndex]; 38745 const lastDisplayedBullet = bullets[lastIndex]; 38746 for (let i4 = firstIndex; i4 <= lastIndex; i4 += 1) { 38747 if (bullets[i4]) { 38748 bullets[i4].classList.add(...`${params.bulletActiveClass}-main`.split(" ")); 38749 } 38750 } 38751 setSideBullets(firstDisplayedBullet, "prev"); 38752 setSideBullets(lastDisplayedBullet, "next"); 38753 } 38754 } 38755 if (params.dynamicBullets) { 38756 const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); 38757 const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize; 38758 const offsetProp = rtl ? "right" : "left"; 38759 bullets.forEach((bullet) => { 38760 bullet.style[swiper.isHorizontal() ? offsetProp : "top"] = `${bulletsOffset}px`; 38761 }); 38762 } 38763 } 38764 el.forEach((subEl, subElIndex) => { 38765 if (params.type === "fraction") { 38766 subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach((fractionEl) => { 38767 fractionEl.textContent = params.formatFractionCurrent(current + 1); 38768 }); 38769 subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach((totalEl) => { 38770 totalEl.textContent = params.formatFractionTotal(total); 38771 }); 38772 } 38773 if (params.type === "progressbar") { 38774 let progressbarDirection; 38775 if (params.progressbarOpposite) { 38776 progressbarDirection = swiper.isHorizontal() ? "vertical" : "horizontal"; 38777 } else { 38778 progressbarDirection = swiper.isHorizontal() ? "horizontal" : "vertical"; 38779 } 38780 const scale = (current + 1) / total; 38781 let scaleX = 1; 38782 let scaleY = 1; 38783 if (progressbarDirection === "horizontal") { 38784 scaleX = scale; 38785 } else { 38786 scaleY = scale; 38787 } 38788 subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach((progressEl) => { 38789 progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`; 38790 progressEl.style.transitionDuration = `${swiper.params.speed}ms`; 38791 }); 38792 } 38793 if (params.type === "custom" && params.renderCustom) { 38794 subEl.innerHTML = params.renderCustom(swiper, current + 1, total); 38795 if (subElIndex === 0) 38796 emit("paginationRender", subEl); 38797 } else { 38798 if (subElIndex === 0) 38799 emit("paginationRender", subEl); 38800 emit("paginationUpdate", subEl); 38801 } 38802 if (swiper.params.watchOverflow && swiper.enabled) { 38803 subEl.classList[swiper.isLocked ? "add" : "remove"](params.lockClass); 38804 } 38805 }); 38806 } 38807 function render() { 38808 const params = swiper.params.pagination; 38809 if (isPaginationDisabled()) 38810 return; 38811 const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; 38812 let el = swiper.pagination.el; 38813 el = makeElementsArray(el); 38814 let paginationHTML = ""; 38815 if (params.type === "bullets") { 38816 let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length; 38817 if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) { 38818 numberOfBullets = slidesLength; 38819 } 38820 for (let i4 = 0; i4 < numberOfBullets; i4 += 1) { 38821 if (params.renderBullet) { 38822 paginationHTML += params.renderBullet.call(swiper, i4, params.bulletClass); 38823 } else { 38824 paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part="bullet"' : ""} class="${params.bulletClass}"></${params.bulletElement}>`; 38825 } 38826 } 38827 } 38828 if (params.type === "fraction") { 38829 if (params.renderFraction) { 38830 paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); 38831 } else { 38832 paginationHTML = `<span class="${params.currentClass}"></span> / <span class="${params.totalClass}"></span>`; 38833 } 38834 } 38835 if (params.type === "progressbar") { 38836 if (params.renderProgressbar) { 38837 paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); 38838 } else { 38839 paginationHTML = `<span class="${params.progressbarFillClass}"></span>`; 38840 } 38841 } 38842 swiper.pagination.bullets = []; 38843 el.forEach((subEl) => { 38844 if (params.type !== "custom") { 38845 subEl.innerHTML = paginationHTML || ""; 38846 } 38847 if (params.type === "bullets") { 38848 swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass))); 38849 } 38850 }); 38851 if (params.type !== "custom") { 38852 emit("paginationRender", el[0]); 38853 } 38854 } 38855 function init() { 38856 swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, { 38857 el: "swiper-pagination" 38858 }); 38859 const params = swiper.params.pagination; 38860 if (!params.el) 38861 return; 38862 let el; 38863 if (typeof params.el === "string" && swiper.isElement) { 38864 el = swiper.el.querySelector(params.el); 38865 } 38866 if (!el && typeof params.el === "string") { 38867 el = [...document.querySelectorAll(params.el)]; 38868 } 38869 if (!el) { 38870 el = params.el; 38871 } 38872 if (!el || el.length === 0) 38873 return; 38874 if (swiper.params.uniqueNavElements && typeof params.el === "string" && Array.isArray(el) && el.length > 1) { 38875 el = [...swiper.el.querySelectorAll(params.el)]; 38876 if (el.length > 1) { 38877 el = el.filter((subEl) => { 38878 if (elementParents(subEl, ".swiper")[0] !== swiper.el) 38879 return false; 38880 return true; 38881 })[0]; 38882 } 38883 } 38884 if (Array.isArray(el) && el.length === 1) 38885 el = el[0]; 38886 Object.assign(swiper.pagination, { 38887 el 38888 }); 38889 el = makeElementsArray(el); 38890 el.forEach((subEl) => { 38891 if (params.type === "bullets" && params.clickable) { 38892 subEl.classList.add(...(params.clickableClass || "").split(" ")); 38893 } 38894 subEl.classList.add(params.modifierClass + params.type); 38895 subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 38896 if (params.type === "bullets" && params.dynamicBullets) { 38897 subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`); 38898 dynamicBulletIndex = 0; 38899 if (params.dynamicMainBullets < 1) { 38900 params.dynamicMainBullets = 1; 38901 } 38902 } 38903 if (params.type === "progressbar" && params.progressbarOpposite) { 38904 subEl.classList.add(params.progressbarOppositeClass); 38905 } 38906 if (params.clickable) { 38907 subEl.addEventListener("click", onBulletClick); 38908 } 38909 if (!swiper.enabled) { 38910 subEl.classList.add(params.lockClass); 38911 } 38912 }); 38913 } 38914 function destroy2() { 38915 const params = swiper.params.pagination; 38916 if (isPaginationDisabled()) 38917 return; 38918 let el = swiper.pagination.el; 38919 if (el) { 38920 el = makeElementsArray(el); 38921 el.forEach((subEl) => { 38922 subEl.classList.remove(params.hiddenClass); 38923 subEl.classList.remove(params.modifierClass + params.type); 38924 subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 38925 if (params.clickable) { 38926 subEl.classList.remove(...(params.clickableClass || "").split(" ")); 38927 subEl.removeEventListener("click", onBulletClick); 38928 } 38929 }); 38930 } 38931 if (swiper.pagination.bullets) 38932 swiper.pagination.bullets.forEach((subEl) => subEl.classList.remove(...params.bulletActiveClass.split(" "))); 38933 } 38934 on2("changeDirection", () => { 38935 if (!swiper.pagination || !swiper.pagination.el) 38936 return; 38937 const params = swiper.params.pagination; 38938 let { 38939 el 38940 } = swiper.pagination; 38941 el = makeElementsArray(el); 38942 el.forEach((subEl) => { 38943 subEl.classList.remove(params.horizontalClass, params.verticalClass); 38944 subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 38945 }); 38946 }); 38947 on2("init", () => { 38948 if (swiper.params.pagination.enabled === false) { 38949 disable2(); 38950 } else { 38951 init(); 38952 render(); 38953 update2(); 38954 } 38955 }); 38956 on2("activeIndexChange", () => { 38957 if (typeof swiper.snapIndex === "undefined") { 38958 update2(); 38959 } 38960 }); 38961 on2("snapIndexChange", () => { 38962 update2(); 38963 }); 38964 on2("snapGridLengthChange", () => { 38965 render(); 38966 update2(); 38967 }); 38968 on2("destroy", () => { 38969 destroy2(); 38970 }); 38971 on2("enable disable", () => { 38972 let { 38973 el 38974 } = swiper.pagination; 38975 if (el) { 38976 el = makeElementsArray(el); 38977 el.forEach((subEl) => subEl.classList[swiper.enabled ? "remove" : "add"](swiper.params.pagination.lockClass)); 38978 } 38979 }); 38980 on2("lock unlock", () => { 38981 update2(); 38982 }); 38983 on2("click", (_s, e4) => { 38984 const targetEl = e4.target; 38985 const el = makeElementsArray(swiper.pagination.el); 38986 if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) { 38987 if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) 38988 return; 38989 const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass); 38990 if (isHidden === true) { 38991 emit("paginationShow"); 38992 } else { 38993 emit("paginationHide"); 38994 } 38995 el.forEach((subEl) => subEl.classList.toggle(swiper.params.pagination.hiddenClass)); 38996 } 38997 }); 38998 const enable2 = () => { 38999 swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass); 39000 let { 39001 el 39002 } = swiper.pagination; 39003 if (el) { 39004 el = makeElementsArray(el); 39005 el.forEach((subEl) => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass)); 39006 } 39007 init(); 39008 render(); 39009 update2(); 39010 }; 39011 const disable2 = () => { 39012 swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass); 39013 let { 39014 el 39015 } = swiper.pagination; 39016 if (el) { 39017 el = makeElementsArray(el); 39018 el.forEach((subEl) => subEl.classList.add(swiper.params.pagination.paginationDisabledClass)); 39019 } 39020 destroy2(); 39021 }; 39022 Object.assign(swiper.pagination, { 39023 enable: enable2, 39024 disable: disable2, 39025 render, 39026 update: update2, 39027 init, 39028 destroy: destroy2 39029 }); 39030 } 39031 39032
39032// app/javascript/modules/swiper_init/index.js 39033 var swiper_init_default = () => { 39034 const swiperHeroHalf = new Swiper(".swiper-hero-half", { 39035 modules: [Pagination], 39036 direction: "horizontal", 39037 loop: true, 39038 slidesPerView: 1, 39039 slidesPerGroup: 1, 39040 spaceBetween: 0, 39041 pagination: { 39042 el: ".swiper-pagination-hero-half", 39043 clickable: true, 39044 renderBullet: function() { 39045 return '<span class="swiper-pagination-bullet"></span>'; 39046 } 39047 } 39048 }); 39049 const swiperHeroFull = new Swiper(".swiper-hero-full", { 39050 modules: [Pagination], 39051 direction: "horizontal", 39052 loop: true, 39053 slidesPerView: 1, 39054 slidesPerGroup: 1, 39055 spaceBetween: 0, 39056 pagination: { 39057 el: ".swiper-pagination-hero-full", 39058 clickable: true, 39059 renderBullet: function() { 39060 return '<span class="swiper-pagination-bullet"></span>'; 39061 } 39062 } 39063 }); 39064 const swiperSpotlight = new Swiper(".spotlight__slider", { 39065 modules: [Pagination], 39066 direction: "horizontal", 39067 slidesPerView: "auto", 39068 slidesPerGroup: 1, 39069 spaceBetween: 24, 39070 pagination: { 39071 el: ".swiper-pagination-spotlight", 39072 clickable: true, 39073 renderBullet: function() { 39074 return '<span class="swiper-pagination-bullet"></span>'; 39075 } 39076 } 39077 }); 39078 const swiperTestimonials = new Swiper(".testimonials__slider", { 39079 modules: [Navigation, Pagination], 39080 direction: "horizontal", 39081 slidesPerView: "auto", 39082 slidesPerGroup: 1, 39083 spaceBetween: 32, 39084 pagination: { 39085 el: ".testimonials__pagination", 39086 clickable: true, 39087 renderBullet: function() { 39088 return '<span class="swiper-pagination-bullet"></span>'; 39089 } 39090 }, 39091 navigation: { 39092 nextEl: ".testimonial-button-next", 39093 prevEl: ".testimonial-button-prev" 39094 } 39095 }); 39096 const swiperNewArrivals = new Swiper(".new-arrivals-carousel", { 39097 direction: "horizontal", 39098 slidesPerView: "auto", 39099 slidesPerGroup: 1, 39100 spaceBetween: 24 39101 }); 39102 const swiperLifeAt = new Swiper(".life-at-swiper", { 39103 modules: [Pagination], 39104 direction: "horizontal", 39105 loop: false, 39106 slidesPerView: 1, 39107 slidesPerGroup: 1, 39108 spaceBetween: 24, 39109 centerInsufficientSlides: true, 39110 centeredSlides: true, 39111 wrapperClass: "life-at-swiper-wrapper", 39112 pagination: { 39113 el: ".life-at-swiper-pagination", 39114 clickable: true, 39115 renderBullet: function() { 39116 return '<span class="swiper-pagination-bullet"></span>'; 39117 } 39118 }, 39119 breakpoints: { 39120 1024: { 39121 slidesPerView: 3, 39122 slidesPerGroup: 1, 39123 spaceBetween: 24, 39124 centerInsufficientSlides: false, 39125 centeredSlides: false 39126 } 39127 } 39128 }); 39129 const swiperCatalogueList = new Swiper(".item-list-cards__carousel", { 39130 direction: "horizontal", 39131 loop: false, 39132 slidesPerView: "auto", 39133 slidesPerGroup: 1, 39134 spaceBetween: 16, 39135 centerInsufficientSlides: true, 39136 wrapperClass: "item-list-cards__wrapper" 39137 }); 39138 let imgLeftContainers = document.querySelectorAll(".image-left-grey-bg__img"); 39139 imgLeftContainers.forEach((cont) => { 39140 const imgLeftSwiper = new Swiper(cont, { 39141 modules: [Pagination], 39142 direction: "horizontal", 39143 loop: false, 39144 slidesPerView: 1, 39145 slidesPerGroup: 1, 39146 spaceBetween: 16, 39147 centerInsufficientSlides: true, 39148 wrapperClass: "image-left-swiper-wrapper", 39149 pagination: { 39150 el: ".image-left-swiper-pagination", 39151 clickable: true, 39152 renderBullet: function() { 39153 return '<span class="swiper-pagination-bullet"></span>'; 39154 } 39155 } 39156 }); 39157 }); 39158 const swiperSpaces = new Swiper(".space-info__images", { 39159 modules: [Navigation, Pagination], 39160 direction: "horizontal", 39161 slidesPerView: "auto", 39162 slidesPerGroup: 1, 39163 spaceBetween: 32, 39164 pagination: { 39165 el: ".space-info__images__pagination", 39166 clickable: true, 39167 renderBullet: function() { 39168 return '<span class="swiper-pagination-bullet"></span>'; 39169 } 39170 }, 39171 navigation: { 39172 nextEl: ".space-info__images__button-next", 39173 prevEl: ".space-info__images__button-prev" 39174 } 39175 }); 39176 if (window.innerWidth <= 1024) { 39177 setTimeout(() => { 39178 let discoverSwiper = document.querySelectorAll(".discover-services__swiper"); 39179 discoverSwiper.forEach((el) => { 39180 const swiperDiscover = new Swiper(el, { 39181 modules: [Pagination], 39182 direction: "horizontal", 39183 loop: false, 39184 slidesPerView: 1, 39185 slidesPerGroup: 1, 39186 spaceBetween: 24, 39187 centeredSlides: true, 39188 wrapperClass: "discover-services__swiper-wrapper", 39189 pagination: { 39190 el: ".discover-services__swiper-pagination", 39191 clickable: true, 39192 renderBullet: function() { 39193 return '<span class="swiper-pagination-bullet"></span>'; 39194 } 39195 } 39196 }); 39197 }); 39198 }, 1e3); 39199 const swiperThirdWidth = new Swiper(".masonry-swiper", { 39200 modules: [Pagination], 39201 direction: "horizontal", 39202 loop: false, 39203 slidesPerView: 1, 39204 slidesPerGroup: 1, 39205 spaceBetween: 32, 39206 centeredSlides: true, 39207 wrapperClass: "masonry-swiper-wrapper", 39208 pagination: { 39209 el: ".masonry-swiper-pagination", 39210 clickable: true, 39211 renderBullet: function() { 39212 return '<span class="swiper-pagination-bullet"></span>'; 39213 } 39214 } 39215 }); 39216 if (document.querySelector(".masonry-swiper")) { 39217 const imgs = document.querySelector(".masonry-swiper-wrapper").querySelectorAll("img");
39218 imgs.forEach((img) => { 39219 img.classList.add("swiper-slide"); 39220 }); 39221 } 39222 const swiperImageRightTextLeft = new Swiper(".img-right-text-left__swiper", { 39223 modules: [Pagination], 39224 direction: "horizontal", 39225 loop: false, 39226 slidesPerView: 1.2, 39227 slidesPerGroup: 1, 39228 spaceBetween: 24, 39229 wrapperClass: "img-right-text-left__swiper-wrapper", 39230 pagination: { 39231 el: ".img-right-text-left__pagination", 39232 clickable: true, 39233 renderBullet: function() { 39234 return '<span class="swiper-pagination-bullet"></span>'; 39235 } 39236 } 39237 }); 39238 } 39239 }; 39240 39241
39241// app/javascript/modules/index.js 39242 (() => { 39243 document.addEventListener("turbo:load", () => { 39244 swiper_init_default(); 39245 }); 39246 })(); 39247 39248
vendor: 123,186 bytes, lines 39248-42830
39248// node_modules/bootstrap/dist/js/bootstrap.esm.js 39249 var bootstrap_esm_exports = {}; 39250 __export(bootstrap_esm_exports, { 39251 Alert: () => Alert, 39252 Button: () => Button, 39253 Carousel: () => Carousel, 39254 Collapse: () => Collapse, 39255 Dropdown: () => Dropdown, 39256 Modal: () => Modal, 39257 Offcanvas: () => Offcanvas, 39258 Popover: () => Popover2, 39259 ScrollSpy: () => ScrollSpy, 39260 Tab: () => Tab, 39261 Toast: () => Toast, 39262 Tooltip: () => Tooltip 39263 }); 39264 var elementMap = /* @__PURE__ */ new Map(); 39265 var Data = { 39266 set(element, key, instance) { 39267 if (!elementMap.has(element)) { 39268 elementMap.set(element, /* @__PURE__ */ new Map()); 39269 } 39270 const instanceMap = elementMap.get(element); 39271 if (!instanceMap.has(key) && instanceMap.size !== 0) { 39272 console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); 39273 return; 39274 } 39275 instanceMap.set(key, instance); 39276 }, 39277 get(element, key) { 39278 if (elementMap.has(element)) { 39279 return elementMap.get(element).get(key) || null; 39280 } 39281 return null; 39282 }, 39283 remove(element, key) { 39284 if (!elementMap.has(element)) { 39285 return; 39286 } 39287 const instanceMap = elementMap.get(element); 39288 instanceMap.delete(key); 39289 if (instanceMap.size === 0) { 39290 elementMap.delete(element); 39291 } 39292 } 39293 }; 39294 var MAX_UID = 1e6; 39295 var MILLISECONDS_MULTIPLIER = 1e3; 39296 var TRANSITION_END = "transitionend"; 39297 var parseSelector = (selector) => { 39298 if (selector && window.CSS && window.CSS.escape) { 39299 selector = selector.replace(/#([^\s"#']+)/g, (match, id2) => `#${CSS.escape(id2)}`); 39300 } 39301 return selector; 39302 }; 39303 var toType = (object) => { 39304 if (object === null || object === void 0) { 39305 return `${object}`; 39306 } 39307 return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(); 39308 }; 39309 var getUID = (prefix) => { 39310 do { 39311 prefix += Math.floor(Math.random() * MAX_UID); 39312 } while (document.getElementById(prefix)); 39313 return prefix; 39314 }; 39315 var getTransitionDurationFromElement = (element) => { 39316 if (!element) { 39317 return 0; 39318 } 39319 let { 39320 transitionDuration, 39321 transitionDelay 39322 } = window.getComputedStyle(element); 39323 const floatTransitionDuration = Number.parseFloat(transitionDuration); 39324 const floatTransitionDelay = Number.parseFloat(transitionDelay); 39325 if (!floatTransitionDuration && !floatTransitionDelay) { 39326 return 0; 39327 } 39328 transitionDuration = transitionDuration.split(",")[0]; 39329 transitionDelay = transitionDelay.split(",")[0]; 39330 return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; 39331 }; 39332 var triggerTransitionEnd = (element) => { 39333 element.dispatchEvent(new Event(TRANSITION_END)); 39334 }; 39335 var isElement2 = (object) => { 39336 if (!object || typeof object !== "object") { 39337 return false; 39338 } 39339 if (typeof object.jquery !== "undefined") { 39340 object = object[0]; 39341 } 39342 return typeof object.nodeType !== "undefined"; 39343 }; 39344 var getElement = (object) => { 39345 if (isElement2(object)) { 39346 return object.jquery ? object[0] : object; 39347 } 39348 if (typeof object === "string" && object.length > 0) { 39349 return document.querySelector(parseSelector(object)); 39350 } 39351 return null; 39352 }; 39353 var isVisible = (element) => { 39354 if (!isElement2(element) || element.getClientRects().length === 0) { 39355 return false; 39356 } 39357 const elementIsVisible = getComputedStyle(element).getPropertyValue("visibility") === "visible"; 39358 const closedDetails = element.closest("details:not([open])"); 39359 if (!closedDetails) { 39360 return elementIsVisible; 39361 } 39362 if (closedDetails !== element) { 39363 const summary = element.closest("summary"); 39364 if (summary && summary.parentNode !== closedDetails) { 39365 return false; 39366 } 39367 if (summary === null) { 39368 return false; 39369 } 39370 } 39371 return elementIsVisible; 39372 }; 39373 var isDisabled = (element) => { 39374 if (!element || element.nodeType !== Node.ELEMENT_NODE) { 39375 return true; 39376 } 39377 if (element.classList.contains("disabled")) { 39378 return true; 39379 } 39380 if (typeof element.disabled !== "undefined") { 39381 return element.disabled; 39382 } 39383 return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false"; 39384 }; 39385 var findShadowRoot = (element) => { 39386 if (!document.documentElement.attachShadow) { 39387 return null; 39388 } 39389 if (typeof element.getRootNode === "function") { 39390 const root = element.getRootNode(); 39391 return root instanceof ShadowRoot ? root : null; 39392 } 39393 if (element instanceof ShadowRoot) { 39394 return element; 39395 } 39396 if (!element.parentNode) { 39397 return null; 39398 } 39399 return findShadowRoot(element.parentNode); 39400 }; 39401 var noop = () => { 39402 }; 39403 var reflow = (element) => { 39404 element.offsetHeight; 39405 }; 39406 var getjQuery = () => { 39407 if (window.jQuery && !document.body.hasAttribute("data-bs-no-jquery")) { 39408 return window.jQuery; 39409 } 39410 return null; 39411 }; 39412 var DOMContentLoadedCallbacks = []; 39413 var onDOMContentLoaded = (callback) => { 39414 if (document.readyState === "loading") { 39415 if (!DOMContentLoadedCallbacks.length) { 39416 document.addEventListener("DOMContentLoaded", () => { 39417 for (const callback2 of DOMContentLoadedCallbacks) { 39418 callback2(); 39419 } 39420 }); 39421 } 39422 DOMContentLoadedCallbacks.push(callback); 39423 } else { 39424 callback(); 39425 } 39426 }; 39427 var isRTL = () => document.documentElement.dir === "rtl"; 39428 var defineJQueryPlugin = (plugin) => { 39429 onDOMContentLoaded(() => { 39430 const $5 = getjQuery(); 39431 if ($5) { 39432 const name = plugin.NAME; 39433 const JQUERY_NO_CONFLICT = $5.fn[name]; 39434 $5.fn[name] = plugin.jQueryInterface; 39435 $5.fn[name].Constructor = plugin; 39436 $5.fn[name].noConflict = () => { 39437 $5.fn[name] = JQUERY_NO_CONFLICT; 39438 return plugin.jQueryInterface; 39439 }; 39440 } 39441 }); 39442 }; 39443 var execute = (possibleCallback, args = [], defaultValue = possibleCallback) => { 39444 return typeof possibleCallback === "function" ? possibleCallback(...args) : defaultValue; 39445 }; 39446 var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { 39447 if (!waitForTransition) { 39448 execute(callback); 39449 return; 39450 } 39451 const durationPadding = 5; 39452 const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; 39453 let called = false; 39454 const handler = ({ 39455 target 39456 }) => { 39457 if (target !== transitionElement) { 39458 return; 39459 } 39460 called = true; 39461 transitionElement.removeEventListener(TRANSITION_END, handler); 39462 execute(callback); 39463 }; 39464 transitionElement.addEventListener(TRANSITION_END, handler); 39465 setTimeout(() => { 39466 if (!called) { 39467 triggerTransitionEnd(transitionElement); 39468 } 39469 }, emulatedDuration); 39470 }; 39471 var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { 39472 const listLength = list.length; 39473 let index4 = list.indexOf(activeElement); 39474 if (index4 === -1) { 39475 return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]; 39476 } 39477 index4 += shouldGetNext ? 1 : -1; 39478 if (isCycleAllowed) { 39479 index4 = (index4 + listLength) % listLength; 39480 } 39481 return list[Math.max(0, Math.min(index4, listLength - 1))]; 39482 }; 39483 var namespaceRegex = /[^.]*(?=\..*)\.|.*/; 39484 var stripNameRegex = /\..*/; 39485 var stripUidRegex = /::\d+$/; 39486 var eventRegistry = {}; 39487 var uidEvent = 1; 39488 var customEvents = { 39489 mouseenter: "mouseover", 39490 mouseleave: "mouseout" 39491 }; 39492 var nativeEvents = /* @__PURE__ */ new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]); 39493 function makeEventUid(element, uid) { 39494 return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; 39495 } 39496 function getElementEvents(element) { 39497 const uid = makeEventUid(element); 39498 element.uidEvent = uid; 39499 eventRegistry[uid] = eventRegistry[uid] || {}; 39500 return eventRegistry[uid]; 39501 } 39502 function bootstrapHandler(element, fn3) { 39503 return function handler(event2) { 39504 hydrateObj(event2, { 39505 delegateTarget: element 39506 }); 39507 if (handler.oneOff) { 39508 EventHandler.off(element, event2.type, fn3); 39509 } 39510 return fn3.apply(element, [event2]); 39511 }; 39512 } 39513 function bootstrapDelegationHandler(element, selector, fn3) { 39514 return function handler(event2) { 39515 const domElements = element.querySelectorAll(selector); 39516 for (let { 39517 target 39518 } = event2; target && target !== this; target = target.parentNode) { 39519 for (const domElement of domElements) { 39520 if (domElement !== target) { 39521 continue; 39522 } 39523 hydrateObj(event2, { 39524 delegateTarget: target 39525 }); 39526 if (handler.oneOff) { 39527 EventHandler.off(element, event2.type, selector, fn3); 39528 } 39529 return fn3.apply(target, [event2]); 39530 } 39531 } 39532 }; 39533 } 39534 function findHandler(events2, callable, delegationSelector = null) { 39535 return Object.values(events2).find((event2) => event2.callable === callable && event2.delegationSelector === delegationSelector); 39536 } 39537 function normalizeParameters(originalTypeEvent, handler, delegationFunction) { 39538 const isDelegated = typeof handler === "string"; 39539 const callable = isDelegated ? delegationFunction : handler || delegationFunction; 39540 let typeEvent = getTypeEvent(originalTypeEvent); 39541 if (!nativeEvents.has(typeEvent)) { 39542 typeEvent = originalTypeEvent; 39543 } 39544 return [isDelegated, callable, typeEvent]; 39545 } 39546 function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { 39547 if (typeof originalTypeEvent !== "string" || !element) { 39548 return; 39549 } 39550 let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); 39551 if (originalTypeEvent in customEvents) { 39552 const wrapFunction = (fn4) => { 39553 return function(event2) { 39554 if (!event2.relatedTarget || event2.relatedTarget !== event2.delegateTarget && !event2.delegateTarget.contains(event2.relatedTarget)) { 39555 return fn4.call(this, event2); 39556 } 39557 }; 39558 }; 39559 callable = wrapFunction(callable); 39560 } 39561 const events2 = getElementEvents(element); 39562 const handlers = events2[typeEvent] || (events2[typeEvent] = {}); 39563 const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); 39564 if (previousFunction) { 39565 previousFunction.oneOff = previousFunction.oneOff && oneOff; 39566 return; 39567 } 39568 const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, "")); 39569 const fn3 = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); 39570 fn3.delegationSelector = isDelegated ? handler : null; 39571 fn3.callable = callable; 39572 fn3.oneOff = oneOff; 39573 fn3.uidEvent = uid; 39574 handlers[uid] = fn3; 39575 element.addEventListener(typeEvent, fn3, isDelegated); 39576 } 39577 function removeHandler(element, events2, typeEvent, handler, delegationSelector) { 39578 const fn3 = findHandler(events2[typeEvent], handler, delegationSelector); 39579 if (!fn3) { 39580 return; 39581 } 39582 element.removeEventListener(typeEvent, fn3, Boolean(delegationSelector)); 39583 delete events2[typeEvent][fn3.uidEvent]; 39584 } 39585 function removeNamespacedHandlers(element, events2, typeEvent, namespace) { 39586 const storeElementEvent = events2[typeEvent] || {}; 39587 for (const [handlerKey, event2] of Object.entries(storeElementEvent)) { 39588 if (handlerKey.includes(namespace)) { 39589 removeHandler(element, events2, typeEvent, event2.callable, event2.delegationSelector); 39590 } 39591 } 39592 } 39593 function getTypeEvent(event2) { 39594 event2 = event2.replace(stripNameRegex, ""); 39595 return customEvents[event2] || event2; 39596 } 39597 var EventHandler = { 39598 on(element, event2, handler, delegationFunction) { 39599 addHandler(element, event2, handler, delegationFunction, false); 39600 }, 39601 one(element, event2, handler, delegationFunction) { 39602 addHandler(element, event2, handler, delegationFunction, true); 39603 }, 39604 off(element, originalTypeEvent, handler, delegationFunction) { 39605 if (typeof originalTypeEvent !== "string" || !element) { 39606 return; 39607 } 39608 const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); 39609 const inNamespace = typeEvent !== originalTypeEvent; 39610 const events2 = getElementEvents(element); 39611 const storeElementEvent = events2[typeEvent] || {}; 39612 const isNamespace = originalTypeEvent.startsWith("."); 39613 if (typeof callable !== "undefined") { 39614 if (!Object.keys(storeElementEvent).length) { 39615 return; 39616 } 39617 removeHandler(element, events2, typeEvent, callable, isDelegated ? handler : null); 39618 return; 39619 } 39620 if (isNamespace) { 39621 for (const elementEvent of Object.keys(events2)) { 39622 removeNamespacedHandlers(element, events2, elementEvent, originalTypeEvent.slice(1)); 39623 } 39624 } 39625 for (const [keyHandlers, event2] of Object.entries(storeElementEvent)) { 39626 const handlerKey = keyHandlers.replace(stripUidRegex, ""); 39627 if (!inNamespace || originalTypeEvent.includes(handlerKey)) { 39628 removeHandler(element, events2, typeEvent, event2.callable, event2.delegationSelector); 39629 } 39630 } 39631 }, 39632 trigger(element, event2, args) { 39633 if (typeof event2 !== "string" || !element) { 39634 return null; 39635 } 39636 const $5 = getjQuery(); 39637 const typeEvent = getTypeEvent(event2); 39638 const inNamespace = event2 !== typeEvent; 39639 let jQueryEvent = null; 39640 let bubbles = true; 39641 let nativeDispatch = true; 39642 let defaultPrevented = false; 39643 if (inNamespace && $5) { 39644 jQueryEvent = $5.Event(event2, args); 39645 $5(element).trigger(jQueryEvent); 39646 bubbles = !jQueryEvent.isPropagationStopped(); 39647 nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); 39648 defaultPrevented = jQueryEvent.isDefaultPrevented(); 39649 } 39650 const evt = hydrateObj(new Event(event2, { 39651 bubbles, 39652 cancelable: true 39653 }), args); 39654 if (defaultPrevented) { 39655 evt.preventDefault(); 39656 } 39657 if (nativeDispatch) { 39658 element.dispatchEvent(evt); 39659 } 39660 if (evt.defaultPrevented && jQueryEvent) { 39661 jQueryEvent.preventDefault(); 39662 } 39663 return evt; 39664 } 39665 }; 39666 function hydrateObj(obj, meta = {}) { 39667 for (const [key, value] of Object.entries(meta)) { 39668 try { 39669 obj[key] = value; 39670 } catch (_unused) { 39671 Object.defineProperty(obj, key, { 39672 configurable: true, 39673 get() { 39674 return value; 39675 } 39676 }); 39677 } 39678 } 39679 return obj; 39680 } 39681 function normalizeData(value) { 39682 if (value === "true") { 39683 return true; 39684 } 39685 if (value === "false") { 39686 return false; 39687 } 39688 if (value === Number(value).toString()) { 39689 return Number(value); 39690 } 39691 if (value === "" || value === "null") { 39692 return null; 39693 } 39694 if (typeof value !== "string") { 39695 return value; 39696 } 39697 try { 39698 return JSON.parse(decodeURIComponent(value)); 39699 } catch (_unused) { 39700 return value; 39701 } 39702 } 39703 function normalizeDataKey(key) { 39704 return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); 39705 } 39706 var Manipulator = { 39707 setDataAttribute(element, key, value) { 39708 element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); 39709 }, 39710 removeDataAttribute(element, key) { 39711 element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); 39712 }, 39713 getDataAttributes(element) { 39714 if (!element) { 39715 return {}; 39716 } 39717 const attributes = {}; 39718 const bsKeys = Object.keys(element.dataset).filter((key) => key.startsWith("bs") && !key.startsWith("bsConfig")); 39719 for (const key of bsKeys) { 39720 let pureKey = key.replace(/^bs/, ""); 39721 pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); 39722 attributes[pureKey] = normalizeData(element.dataset[key]); 39723 } 39724 return attributes; 39725 }, 39726 getDataAttribute(element, key) { 39727 return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); 39728 } 39729 }; 39730 var Config = class { 39731 static get Default() { 39732 return {}; 39733 } 39734 static get DefaultType() { 39735 return {}; 39736 } 39737 static get NAME() { 39738 throw new Error('You have to implement the static method "NAME", for each component!'); 39739 } 39740 _getConfig(config2) { 39741 config2 = this._mergeConfigObj(config2); 39742 config2 = this._configAfterMerge(config2); 39743 this._typeCheckConfig(config2); 39744 return config2; 39745 } 39746 _configAfterMerge(config2) { 39747 return config2; 39748 } 39749 _mergeConfigObj(config2, element) { 39750 const jsonConfig = isElement2(element) ? Manipulator.getDataAttribute(element, "config") : {}; 39751 return { 39752 ...this.constructor.Default, 39753 ...typeof jsonConfig === "object" ? jsonConfig : {}, 39754 ...isElement2(element) ? Manipulator.getDataAttributes(element) : {}, 39755 ...typeof config2 === "object" ? config2 : {} 39756 }; 39757 } 39758 _typeCheckConfig(config2, configTypes = this.constructor.DefaultType) { 39759 for (const [property, expectedTypes] of Object.entries(configTypes)) { 39760 const value = config2[property]; 39761 const valueType = isElement2(value) ? "element" : toType(value); 39762 if (!new RegExp(expectedTypes).test(valueType)) { 39763 throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); 39764 } 39765 } 39766 } 39767 }; 39768 var VERSION = "5.3.3"; 39769 var BaseComponent2 = class extends Config { 39770 constructor(element, config2) { 39771 super(); 39772 element = getElement(element); 39773 if (!element) { 39774 return; 39775 } 39776 this._element = element; 39777 this._config = this._getConfig(config2); 39778 Data.set(this._element, this.constructor.DATA_KEY, this); 39779 } 39780 dispose() { 39781 Data.remove(this._element, this.constructor.DATA_KEY); 39782 EventHandler.off(this._element, this.constructor.EVENT_KEY); 39783 for (const propertyName of Object.getOwnPropertyNames(this)) { 39784 this[propertyName] = null; 39785 } 39786 } 39787 _queueCallback(callback, element, isAnimated = true) { 39788 executeAfterTransition(callback, element, isAnimated); 39789 } 39790 _getConfig(config2) { 39791 config2 = this._mergeConfigObj(config2, this._element); 39792 config2 = this._configAfterMerge(config2); 39793 this._typeCheckConfig(config2); 39794 return config2; 39795 } 39796 static getInstance(element) { 39797 return Data.get(getElement(element), this.DATA_KEY); 39798 } 39799 static getOrCreateInstance(element, config2 = {}) { 39800 return this.getInstance(element) || new this(element, typeof config2 === "object" ? config2 : null); 39801 } 39802 static get VERSION() { 39803 return VERSION; 39804 } 39805 static get DATA_KEY() { 39806 return `bs.${this.NAME}`; 39807 } 39808 static get EVENT_KEY() { 39809 return `.${this.DATA_KEY}`; 39810 } 39811 static eventName(name) { 39812 return `${name}${this.EVENT_KEY}`; 39813 } 39814 }; 39815 var getSelector = (element) => { 39816 let selector = element.getAttribute("data-bs-target"); 39817 if (!selector || selector === "#") { 39818 let hrefAttribute = element.getAttribute("href"); 39819 if (!hrefAttribute || !hrefAttribute.includes("#") && !hrefAttribute.startsWith(".")) { 39820 return null; 39821 } 39822 if (hrefAttribute.includes("#") && !hrefAttribute.startsWith("#")) { 39823 hrefAttribute = `#${hrefAttribute.split("#")[1]}`; 39824 } 39825 selector = hrefAttribute && hrefAttribute !== "#" ? hrefAttribute.trim() : null; 39826 } 39827 return selector ? selector.split(",").map((sel) => parseSelector(sel)).join(",") : null; 39828 }; 39829 var SelectorEngine = { 39830 find(selector, element = document.documentElement) { 39831 return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); 39832 }, 39833 findOne(selector, element = document.documentElement) { 39834 return Element.prototype.querySelector.call(element, selector); 39835 }, 39836 children(element, selector) { 39837 return [].concat(...element.children).filter((child) => child.matches(selector)); 39838 }, 39839 parents(element, selector) { 39840 const parents = []; 39841 let ancestor = element.parentNode.closest(selector); 39842 while (ancestor) { 39843 parents.push(ancestor); 39844 ancestor = ancestor.parentNode.closest(selector); 39845 } 39846 return parents; 39847 }, 39848 prev(element, selector) { 39849 let previous = element.previousElementSibling; 39850 while (previous) { 39851 if (previous.matches(selector)) { 39852 return [previous]; 39853 } 39854 previous = previous.previousElementSibling; 39855 } 39856 return []; 39857 }, 39858 next(element, selector) { 39859 let next = element.nextElementSibling; 39860 while (next) { 39861 if (next.matches(selector)) { 39862 return [next]; 39863 } 39864 next = next.nextElementSibling; 39865 } 39866 return []; 39867 }, 39868 focusableChildren(element) { 39869 const focusables = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((selector) => `${selector}:not([tabindex^="-"])`).join(","); 39870 return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el)); 39871 }, 39872 getSelectorFromElement(element) { 39873 const selector = getSelector(element); 39874 if (selector) { 39875 return SelectorEngine.findOne(selector) ? selector : null; 39876 } 39877 return null; 39878 }, 39879 getElementFromSelector(element) { 39880 const selector = getSelector(element); 39881 return selector ? SelectorEngine.findOne(selector) : null; 39882 }, 39883 getMultipleElementsFromSelector(element) { 39884 const selector = getSelector(element); 39885 return selector ? SelectorEngine.find(selector) : []; 39886 } 39887 }; 39888 var enableDismissTrigger = (component, method = "hide") => { 39889 const clickEvent = `click.dismiss${component.EVENT_KEY}`; 39890 const name = component.NAME; 39891 EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function(event2) { 39892 if (["A", "AREA"].includes(this.tagName)) { 39893 event2.preventDefault(); 39894 } 39895 if (isDisabled(this)) { 39896 return; 39897 } 39898 const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`); 39899 const instance = component.getOrCreateInstance(target); 39900 instance[method](); 39901 }); 39902 }; 39903 var NAME$f = "alert"; 39904 var DATA_KEY$a = "bs.alert"; 39905 var EVENT_KEY$b = `.${DATA_KEY$a}`; 39906 var EVENT_CLOSE = `close${EVENT_KEY$b}`; 39907 var EVENT_CLOSED = `closed${EVENT_KEY$b}`; 39908 var CLASS_NAME_FADE$5 = "fade"; 39909 var CLASS_NAME_SHOW$8 = "show"; 39910 var Alert = class extends BaseComponent2 { 39911 static get NAME() { 39912 return NAME$f; 39913 } 39914 close() { 39915 const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE); 39916 if (closeEvent.defaultPrevented) { 39917 return; 39918 } 39919 this._element.classList.remove(CLASS_NAME_SHOW$8); 39920 const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5); 39921 this._queueCallback(() => this._destroyElement(), this._element, isAnimated); 39922 } 39923 _destroyElement() { 39924 this._element.remove(); 39925 EventHandler.trigger(this._element, EVENT_CLOSED); 39926 this.dispose(); 39927 } 39928 static jQueryInterface(config2) { 39929 return this.each(function() { 39930 const data = Alert.getOrCreateInstance(this); 39931 if (typeof config2 !== "string") { 39932 return; 39933 } 39934 if (data[config2] === void 0 || config2.startsWith("_") || config2 === "constructor") { 39935 throw new TypeError(`No method named "${config2}"`); 39936 } 39937 data[config2](this); 39938 }); 39939 } 39940 }; 39941 enableDismissTrigger(Alert, "close"); 39942 defineJQueryPlugin(Alert); 39943 var NAME$e = "button"; 39944 var DATA_KEY$9 = "bs.button"; 39945 var EVENT_KEY$a = `.${DATA_KEY$9}`; 39946 var DATA_API_KEY$6 = ".data-api"; 39947 var CLASS_NAME_ACTIVE$3 = "active"; 39948 var SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]'; 39949 var EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`; 39950 var Button = class extends BaseComponent2 { 39951 static get NAME() { 39952 return NAME$e; 39953 } 39954 toggle() { 39955 this._element.setAttribute("aria-pressed", this._element.classList.toggle(CLASS_NAME_ACTIVE$3)); 39956 } 39957 static jQueryInterface(config2) { 39958 return this.each(function() { 39959 const data = Button.getOrCreateInstance(this); 39960 if (config2 === "toggle") { 39961 data[config2](); 39962 } 39963 }); 39964 } 39965 }; 39966 EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, (event2) => { 39967 event2.preventDefault(); 39968 const button = event2.target.closest(SELECTOR_DATA_TOGGLE$5); 39969 const data = Button.getOrCreateInstance(button); 39970 data.toggle(); 39971 }); 39972 defineJQueryPlugin(Button); 39973 var NAME$d = "swipe"; 39974 var EVENT_KEY$9 = ".bs.swipe"; 39975 var EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`; 39976 var EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`; 39977 var EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`; 39978 var EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`; 39979 var EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`; 39980 var POINTER_TYPE_TOUCH = "touch"; 39981 var POINTER_TYPE_PEN = "pen"; 39982 var CLASS_NAME_POINTER_EVENT = "pointer-event"; 39983 var SWIPE_THRESHOLD = 40; 39984 var Default$c = { 39985 endCallback: null, 39986 leftCallback: null, 39987 rightCallback: null 39988 }; 39989 var DefaultType$c = { 39990 endCallback: "(function|null)", 39991 leftCallback: "(function|null)", 39992 rightCallback: "(function|null)" 39993 }; 39994 var Swipe = class extends Config { 39995 constructor(element, config2) { 39996 super(); 39997 this._element = element; 39998 if (!element || !Swipe.isSupported()) { 39999 return; 40000 } 40001 this._config = this._getConfig(config2); 40002 this._deltaX = 0; 40003 this._supportPointerEvents = Boolean(window.PointerEvent); 40004 this._initEvents(); 40005 } 40006 static get Default() { 40007 return Default$c; 40008 } 40009 static get DefaultType() { 40010 return DefaultType$c; 40011 } 40012 static get NAME() { 40013 return NAME$d; 40014 } 40015 dispose() { 40016 EventHandler.off(this._element, EVENT_KEY$9); 40017 } 40018 _start(event2) { 40019 if (!this._supportPointerEvents) { 40020 this._deltaX = event2.touches[0].clientX; 40021 return; 40022 } 40023 if (this._eventIsPointerPenTouch(event2)) { 40024 this._deltaX = event2.clientX; 40025 } 40026 } 40027 _end(event2) { 40028 if (this._eventIsPointerPenTouch(event2)) { 40029 this._deltaX = event2.clientX - this._deltaX; 40030 } 40031 this._handleSwipe(); 40032 execute(this._config.endCallback); 40033 } 40034 _move(event2) { 40035 this._deltaX = event2.touches && event2.touches.length > 1 ? 0 : event2.touches[0].clientX - this._deltaX; 40036 } 40037 _handleSwipe() { 40038 const absDeltaX = Math.abs(this._deltaX); 40039 if (absDeltaX <= SWIPE_THRESHOLD) { 40040 return; 40041 } 40042 const direction = absDeltaX / this._deltaX; 40043 this._deltaX = 0; 40044 if (!direction) { 40045 return; 40046 } 40047 execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback); 40048 } 40049 _initEvents() { 40050 if (this._supportPointerEvents) { 40051 EventHandler.on(this._element, EVENT_POINTERDOWN, (event2) => this._start(event2)); 40052 EventHandler.on(this._element, EVENT_POINTERUP, (event2) => this._end(event2)); 40053 this._element.classList.add(CLASS_NAME_POINTER_EVENT); 40054 } else { 40055 EventHandler.on(this._element, EVENT_TOUCHSTART, (event2) => this._start(event2)); 40056 EventHandler.on(this._element, EVENT_TOUCHMOVE, (event2) => this._move(event2)); 40057 EventHandler.on(this._element, EVENT_TOUCHEND, (event2) => this._end(event2)); 40058 } 40059 } 40060 _eventIsPointerPenTouch(event2) { 40061 return this._supportPointerEvents && (event2.pointerType === POINTER_TYPE_PEN || event2.pointerType === POINTER_TYPE_TOUCH); 40062 } 40063 static isSupported() { 40064 return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0; 40065 } 40066 }; 40067 var NAME$c = "carousel"; 40068 var DATA_KEY$8 = "bs.carousel"; 40069 var EVENT_KEY$8 = `.${DATA_KEY$8}`; 40070 var DATA_API_KEY$5 = ".data-api"; 40071 var ARROW_LEFT_KEY$1 = "ArrowLeft"; 40072 var ARROW_RIGHT_KEY$1 = "ArrowRight"; 40073 var TOUCHEVENT_COMPAT_WAIT = 500; 40074 var ORDER_NEXT = "next"; 40075 var ORDER_PREV = "prev"; 40076 var DIRECTION_LEFT = "left"; 40077 var DIRECTION_RIGHT = "right"; 40078 var EVENT_SLIDE = `slide${EVENT_KEY$8}`; 40079 var EVENT_SLID = `slid${EVENT_KEY$8}`; 40080 var EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`; 40081 var EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`; 40082 var EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`; 40083 var EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`; 40084 var EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`; 40085 var EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`; 40086 var CLASS_NAME_CAROUSEL = "carousel"; 40087 var CLASS_NAME_ACTIVE$2 = "active"; 40088 var CLASS_NAME_SLIDE = "slide"; 40089 var CLASS_NAME_END = "carousel-item-end"; 40090 var CLASS_NAME_START = "carousel-item-start"; 40091 var CLASS_NAME_NEXT = "carousel-item-next"; 40092 var CLASS_NAME_PREV = "carousel-item-prev"; 40093 var SELECTOR_ACTIVE = ".active"; 40094 var SELECTOR_ITEM = ".carousel-item"; 40095 var SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM; 40096 var SELECTOR_ITEM_IMG = ".carousel-item img"; 40097 var SELECTOR_INDICATORS = ".carousel-indicators"; 40098 var SELECTOR_DATA_SLIDE = "[data-bs-slide], [data-bs-slide-to]"; 40099 var SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'; 40100 var KEY_TO_DIRECTION = { 40101 [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT, 40102 [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT 40103 }; 40104 var Default$b = { 40105 interval: 5e3, 40106 keyboard: true, 40107 pause: "hover", 40108 ride: false, 40109 touch: true, 40110 wrap: true 40111 }; 40112 var DefaultType$b = { 40113 interval: "(number|boolean)", 40114 keyboard: "boolean", 40115 pause: "(string|boolean)", 40116 ride: "(boolean|string)", 40117 touch: "boolean", 40118 wrap: "boolean" 40119 }; 40120 var Carousel = class extends BaseComponent2 { 40121 constructor(element, config2) { 40122 super(element, config2); 40123 this._interval = null; 40124 this._activeElement = null; 40125 this._isSliding = false; 40126 this.touchTimeout = null; 40127 this._swipeHelper = null; 40128 this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element); 40129 this._addEventListeners(); 40130 if (this._config.ride === CLASS_NAME_CAROUSEL) { 40131 this.cycle(); 40132 } 40133 } 40134 static get Default() { 40135 return Default$b; 40136 } 40137 static get DefaultType() { 40138 return DefaultType$b; 40139 } 40140 static get NAME() { 40141 return NAME$c; 40142 } 40143 next() { 40144 this._slide(ORDER_NEXT); 40145 } 40146 nextWhenVisible() { 40147 if (!document.hidden && isVisible(this._element)) { 40148 this.next(); 40149 } 40150 } 40151 prev() { 40152 this._slide(ORDER_PREV); 40153 } 40154 pause() { 40155 if (this._isSliding) { 40156 triggerTransitionEnd(this._element); 40157 } 40158 this._clearInterval(); 40159 } 40160 cycle() { 40161 this._clearInterval(); 40162 this._updateInterval(); 40163 this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval); 40164 } 40165 _maybeEnableCycle() { 40166 if (!this._config.ride) { 40167 return; 40168 } 40169 if (this._isSliding) { 40170 EventHandler.one(this._element, EVENT_SLID, () => this.cycle()); 40171 return; 40172 } 40173 this.cycle(); 40174 } 40175 to(index4) { 40176 const items = this._getItems(); 40177 if (index4 > items.length - 1 || index4 < 0) { 40178 return; 40179 } 40180 if (this._isSliding) { 40181 EventHandler.one(this._element, EVENT_SLID, () => this.to(index4)); 40182 return; 40183 } 40184 const activeIndex = this._getItemIndex(this._getActive()); 40185 if (activeIndex === index4) { 40186 return; 40187 } 40188 const order2 = index4 > activeIndex ? ORDER_NEXT : ORDER_PREV; 40189 this._slide(order2, items[index4]); 40190 } 40191 dispose() { 40192 if (this._swipeHelper) { 40193 this._swipeHelper.dispose(); 40194 } 40195 super.dispose(); 40196 } 40197 _configAfterMerge(config2) { 40198 config2.defaultInterval = config2.interval; 40199 return config2; 40200 } 40201 _addEventListeners() { 40202 if (this._config.keyboard) { 40203 EventHandler.on(this._element, EVENT_KEYDOWN$1, (event2) => this._keydown(event2)); 40204 } 40205 if (this._config.pause === "hover") { 40206 EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause()); 40207 EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle()); 40208 } 40209 if (this._config.touch && Swipe.isSupported()) { 40210 this._addTouchEventListeners(); 40211 } 40212 } 40213 _addTouchEventListeners() { 40214 for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) { 40215 EventHandler.on(img, EVENT_DRAG_START, (event2) => event2.preventDefault()); 40216 } 40217 const endCallBack = () => { 40218 if (this._config.pause !== "hover") { 40219 return; 40220 } 40221 this.pause(); 40222 if (this.touchTimeout) { 40223 clearTimeout(this.touchTimeout); 40224 } 40225 this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval); 40226 }; 40227 const swipeConfig = { 40228 leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)), 40229 rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)), 40230 endCallback: endCallBack 40231 }; 40232 this._swipeHelper = new Swipe(this._element, swipeConfig); 40233 } 40234 _keydown(event2) { 40235 if (/input|textarea/i.test(event2.target.tagName)) { 40236 return; 40237 } 40238 const direction = KEY_TO_DIRECTION[event2.key]; 40239 if (direction) { 40240 event2.preventDefault(); 40241 this._slide(this._directionToOrder(direction)); 40242 } 40243 } 40244 _getItemIndex(element) { 40245 return this._getItems().indexOf(element); 40246 } 40247 _setActiveIndicatorElement(index4) { 40248 if (!this._indicatorsElement) { 40249 return; 40250 } 40251 const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement); 40252 activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2); 40253 activeIndicator.removeAttribute("aria-current"); 40254 const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index4}"]`, this._indicatorsElement); 40255 if (newActiveIndicator) { 40256 newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2); 40257 newActiveIndicator.setAttribute("aria-current", "true"); 40258 } 40259 } 40260 _updateInterval() { 40261 const element = this._activeElement || this._getActive(); 40262 if (!element) { 40263 return; 40264 } 40265 const elementInterval = Number.parseInt(element.getAttribute("data-bs-interval"), 10); 40266 this._config.interval = elementInterval || this._config.defaultInterval; 40267 } 40268 _slide(order2, element = null) { 40269 if (this._isSliding) { 40270 return; 40271 } 40272 const activeElement = this._getActive(); 40273 const isNext = order2 === ORDER_NEXT; 40274 const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap); 40275 if (nextElement === activeElement) { 40276 return; 40277 } 40278 const nextElementIndex = this._getItemIndex(nextElement); 40279 const triggerEvent = (eventName) => { 40280 return EventHandler.trigger(this._element, eventName, { 40281 relatedTarget: nextElement, 40282 direction: this._orderToDirection(order2), 40283 from: this._getItemIndex(activeElement), 40284 to: nextElementIndex 40285 }); 40286 }; 40287 const slideEvent = triggerEvent(EVENT_SLIDE); 40288 if (slideEvent.defaultPrevented) { 40289 return; 40290 } 40291 if (!activeElement || !nextElement) { 40292 return; 40293 } 40294 const isCycling = Boolean(this._interval); 40295 this.pause(); 40296 this._isSliding = true; 40297 this._setActiveIndicatorElement(nextElementIndex); 40298 this._activeElement = nextElement; 40299 const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; 40300 const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; 40301 nextElement.classList.add(orderClassName); 40302 reflow(nextElement); 40303 activeElement.classList.add(directionalClassName); 40304 nextElement.classList.add(directionalClassName); 40305 const completeCallBack = () => { 40306 nextElement.classList.remove(directionalClassName, orderClassName); 40307 nextElement.classList.add(CLASS_NAME_ACTIVE$2); 40308 activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName); 40309 this._isSliding = false; 40310 triggerEvent(EVENT_SLID); 40311 }; 40312 this._queueCallback(completeCallBack, activeElement, this._isAnimated()); 40313 if (isCycling) { 40314 this.cycle(); 40315 } 40316 } 40317 _isAnimated() { 40318 return this._element.classList.contains(CLASS_NAME_SLIDE); 40319 } 40320 _getActive() { 40321 return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); 40322 } 40323 _getItems() { 40324 return SelectorEngine.find(SELECTOR_ITEM, this._element); 40325 } 40326 _clearInterval() { 40327 if (this._interval) { 40328 clearInterval(this._interval); 40329 this._interval = null; 40330 } 40331 } 40332 _directionToOrder(direction) { 40333 if (isRTL()) { 40334 return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; 40335 } 40336 return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; 40337 } 40338 _orderToDirection(order2) { 40339 if (isRTL()) { 40340 return order2 === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; 40341 } 40342 return order2 === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; 40343 } 40344 static jQueryInterface(config2) { 40345 return this.each(function() { 40346 const data = Carousel.getOrCreateInstance(this, config2); 40347 if (typeof config2 === "number") { 40348 data.to(config2); 40349 return; 40350 } 40351 if (typeof config2 === "string") { 40352 if (data[config2] === void 0 || config2.startsWith("_") || config2 === "constructor") { 40353 throw new TypeError(`No method named "${config2}"`); 40354 } 40355 data[config2](); 40356 } 40357 }); 40358 } 40359 }; 40360 EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function(event2) { 40361 const target = SelectorEngine.getElementFromSelector(this); 40362 if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { 40363 return; 40364 } 40365 event2.preventDefault(); 40366 const carousel = Carousel.getOrCreateInstance(target); 40367 const slideIndex = this.getAttribute("data-bs-slide-to"); 40368 if (slideIndex) { 40369 carousel.to(slideIndex); 40370 carousel._maybeEnableCycle(); 40371 return; 40372 } 40373 if (Manipulator.getDataAttribute(this, "slide") === "next") { 40374 carousel.next(); 40375 carousel._maybeEnableCycle(); 40376 return; 40377 } 40378 carousel.prev(); 40379 carousel._maybeEnableCycle(); 40380 }); 40381 EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => { 40382 const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); 40383 for (const carousel of carousels) { 40384 Carousel.getOrCreateInstance(carousel); 40385 } 40386 }); 40387 defineJQueryPlugin(Carousel); 40388 var NAME$b = "collapse"; 40389 var DATA_KEY$7 = "bs.collapse"; 40390 var EVENT_KEY$7 = `.${DATA_KEY$7}`; 40391 var DATA_API_KEY$4 = ".data-api"; 40392 var EVENT_SHOW$6 = `show${EVENT_KEY$7}`; 40393 var EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`; 40394 var EVENT_HIDE$6 = `hide${EVENT_KEY$7}`; 40395 var EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`; 40396 var EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`; 40397 var CLASS_NAME_SHOW$7 = "show"; 40398 var CLASS_NAME_COLLAPSE = "collapse"; 40399 var CLASS_NAME_COLLAPSING = "collapsing"; 40400 var CLASS_NAME_COLLAPSED = "collapsed"; 40401 var CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`; 40402 var CLASS_NAME_HORIZONTAL = "collapse-horizontal"; 40403 var WIDTH = "width"; 40404 var HEIGHT = "height"; 40405 var SELECTOR_ACTIVES = ".collapse.show, .collapse.collapsing"; 40406 var SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]'; 40407 var Default$a = { 40408 parent: null, 40409 toggle: true 40410 }; 40411 var DefaultType$a = { 40412 parent: "(null|element)", 40413 toggle: "boolean" 40414 }; 40415 var Collapse = class extends BaseComponent2 { 40416 constructor(element, config2) { 40417 super(element, config2); 40418 this._isTransitioning = false; 40419 this._triggerArray = []; 40420 const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4); 40421 for (const elem of toggleList) { 40422 const selector = SelectorEngine.getSelectorFromElement(elem); 40423 const filterElement = SelectorEngine.find(selector).filter((foundElement) => foundElement === this._element); 40424 if (selector !== null && filterElement.length) { 40425 this._triggerArray.push(elem); 40426 } 40427 } 40428 this._initializeChildren(); 40429 if (!this._config.parent) { 40430 this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); 40431 } 40432 if (this._config.toggle) { 40433 this.toggle(); 40434 } 40435 } 40436 static get Default() { 40437 return Default$a; 40438 } 40439 static get DefaultType() { 40440 return DefaultType$a; 40441 } 40442 static get NAME() { 40443 return NAME$b; 40444 } 40445 toggle() { 40446 if (this._isShown()) { 40447 this.hide(); 40448 } else { 40449 this.show(); 40450 } 40451 } 40452 show() { 40453 if (this._isTransitioning || this._isShown()) { 40454 return; 40455 } 40456 let activeChildren = []; 40457 if (this._config.parent) { 40458 activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter((element) => element !== this._element).map((element) => Collapse.getOrCreateInstance(element, { 40459 toggle: false 40460 })); 40461 } 40462 if (activeChildren.length && activeChildren[0]._isTransitioning) { 40463 return; 40464 } 40465 const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6); 40466 if (startEvent.defaultPrevented) { 40467 return; 40468 } 40469 for (const activeInstance of activeChildren) { 40470 activeInstance.hide(); 40471 } 40472 const dimension = this._getDimension(); 40473 this._element.classList.remove(CLASS_NAME_COLLAPSE); 40474 this._element.classList.add(CLASS_NAME_COLLAPSING); 40475 this._element.style[dimension] = 0; 40476 this._addAriaAndCollapsedClass(this._triggerArray, true); 40477 this._isTransitioning = true; 40478 const complete = () => { 40479 this._isTransitioning = false; 40480 this._element.classList.remove(CLASS_NAME_COLLAPSING); 40481 this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); 40482 this._element.style[dimension] = ""; 40483 EventHandler.trigger(this._element, EVENT_SHOWN$6); 40484 }; 40485 const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); 40486 const scrollSize = `scroll${capitalizedDimension}`; 40487 this._queueCallback(complete, this._element, true); 40488 this._element.style[dimension] = `${this._element[scrollSize]}px`; 40489 } 40490 hide() { 40491 if (this._isTransitioning || !this._isShown()) { 40492 return; 40493 } 40494 const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6); 40495 if (startEvent.defaultPrevented) { 40496 return; 40497 } 40498 const dimension = this._getDimension(); 40499 this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; 40500 reflow(this._element); 40501 this._element.classList.add(CLASS_NAME_COLLAPSING); 40502 this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); 40503 for (const trigger of this._triggerArray) { 40504 const element = SelectorEngine.getElementFromSelector(trigger); 40505 if (element && !this._isShown(element)) { 40506 this._addAriaAndCollapsedClass([trigger], false); 40507 } 40508 } 40509 this._isTransitioning = true; 40510 const complete = () => { 40511 this._isTransitioning = false; 40512 this._element.classList.remove(CLASS_NAME_COLLAPSING); 40513 this._element.classList.add(CLASS_NAME_COLLAPSE); 40514 EventHandler.trigger(this._element, EVENT_HIDDEN$6); 40515 }; 40516 this._element.style[dimension] = ""; 40517 this._queueCallback(complete, this._element, true); 40518 } 40519 _isShown(element = this._element) { 40520 return element.classList.contains(CLASS_NAME_SHOW$7); 40521 } 40522 _configAfterMerge(config2) { 40523 config2.toggle = Boolean(config2.toggle); 40524 config2.parent = getElement(config2.parent); 40525 return config2; 40526 } 40527 _getDimension() { 40528 return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; 40529 } 40530 _initializeChildren() { 40531 if (!this._config.parent) { 40532 return; 40533 } 40534 const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4); 40535 for (const element of children) { 40536 const selected = SelectorEngine.getElementFromSelector(element); 40537 if (selected) { 40538 this._addAriaAndCollapsedClass([element], this._isShown(selected)); 40539 } 40540 } 40541 } 40542 _getFirstLevelChildren(selector) { 40543 const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); 40544 return SelectorEngine.find(selector, this._config.parent).filter((element) => !children.includes(element)); 40545 } 40546 _addAriaAndCollapsedClass(triggerArray, isOpen) { 40547 if (!triggerArray.length) { 40548 return; 40549 } 40550 for (const element of triggerArray) { 40551 element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); 40552 element.setAttribute("aria-expanded", isOpen); 40553 } 40554 } 40555 static jQueryInterface(config2) { 40556 const _config = {}; 40557 if (typeof config2 === "string" && /show|hide/.test(config2)) { 40558 _config.toggle = false; 40559 } 40560 return this.each(function() { 40561 const data = Collapse.getOrCreateInstance(this, _config); 40562 if (typeof config2 === "string") { 40563 if (typeof data[config2] === "undefined") { 40564 throw new TypeError(`No method named "${config2}"`); 40565 } 40566 data[config2](); 40567 } 40568 }); 40569 } 40570 }; 40571 EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function(event2) { 40572 if (event2.target.tagName === "A" || event2.delegateTarget && event2.delegateTarget.tagName === "A") { 40573 event2.preventDefault(); 40574 } 40575 for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) { 40576 Collapse.getOrCreateInstance(element, { 40577 toggle: false 40578 }).toggle(); 40579 } 40580 }); 40581 defineJQueryPlugin(Collapse); 40582 var NAME$a = "dropdown"; 40583 var DATA_KEY$6 = "bs.dropdown"; 40584 var EVENT_KEY$6 = `.${DATA_KEY$6}`; 40585 var DATA_API_KEY$3 = ".data-api"; 40586 var ESCAPE_KEY$2 = "Escape"; 40587 var TAB_KEY$1 = "Tab"; 40588 var ARROW_UP_KEY$1 = "ArrowUp"; 40589 var ARROW_DOWN_KEY$1 = "ArrowDown"; 40590 var RIGHT_MOUSE_BUTTON = 2; 40591 var EVENT_HIDE$5 = `hide${EVENT_KEY$6}`; 40592 var EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`; 40593 var EVENT_SHOW$5 = `show${EVENT_KEY$6}`; 40594 var EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`; 40595 var EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`; 40596 var EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`; 40597 var EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`; 40598 var CLASS_NAME_SHOW$6 = "show"; 40599 var CLASS_NAME_DROPUP = "dropup"; 40600 var CLASS_NAME_DROPEND = "dropend"; 40601 var CLASS_NAME_DROPSTART = "dropstart"; 40602 var CLASS_NAME_DROPUP_CENTER = "dropup-center"; 40603 var CLASS_NAME_DROPDOWN_CENTER = "dropdown-center"; 40604 var SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'; 40605 var SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`; 40606 var SELECTOR_MENU = ".dropdown-menu"; 40607 var SELECTOR_NAVBAR = ".navbar"; 40608 var SELECTOR_NAVBAR_NAV = ".navbar-nav"; 40609 var SELECTOR_VISIBLE_ITEMS = ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)"; 40610 var PLACEMENT_TOP = isRTL() ? "top-end" : "top-start"; 40611 var PLACEMENT_TOPEND = isRTL() ? "top-start" : "top-end"; 40612 var PLACEMENT_BOTTOM = isRTL() ? "bottom-end" : "bottom-start"; 40613 var PLACEMENT_BOTTOMEND = isRTL() ? "bottom-start" : "bottom-end"; 40614 var PLACEMENT_RIGHT = isRTL() ? "left-start" : "right-start"; 40615 var PLACEMENT_LEFT = isRTL() ? "right-start" : "left-start"; 40616 var PLACEMENT_TOPCENTER = "top"; 40617 var PLACEMENT_BOTTOMCENTER = "bottom"; 40618 var Default$9 = { 40619 autoClose: true, 40620 boundary: "clippingParents", 40621 display: "dynamic", 40622 offset: [0, 2], 40623 popperConfig: null, 40624 reference: "toggle" 40625 }; 40626 var DefaultType$9 = { 40627 autoClose: "(boolean|string)", 40628 boundary: "(string|element)", 40629 display: "string", 40630 offset: "(array|string|function)", 40631 popperConfig: "(null|object|function)", 40632 reference: "(string|element|object)" 40633 }; 40634 var Dropdown = class extends BaseComponent2 { 40635 constructor(element, config2) { 40636 super(element, config2); 40637 this._popper = null; 40638 this._parent = this._element.parentNode; 40639 this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent); 40640 this._inNavbar = this._detectNavbar(); 40641 } 40642 static get Default() { 40643 return Default$9; 40644 } 40645 static get DefaultType() { 40646 return DefaultType$9; 40647 } 40648 static get NAME() { 40649 return NAME$a; 40650 } 40651 toggle() { 40652 return this._isShown() ? this.hide() : this.show(); 40653 } 40654 show() { 40655 if (isDisabled(this._element) || this._isShown()) { 40656 return; 40657 } 40658 const relatedTarget = { 40659 relatedTarget: this._element 40660 }; 40661 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget); 40662 if (showEvent.defaultPrevented) { 40663 return; 40664 } 40665 this._createPopper(); 40666 if ("ontouchstart" in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) { 40667 for (const element of [].concat(...document.body.children)) { 40668 EventHandler.on(element, "mouseover", noop); 40669 } 40670 } 40671 this._element.focus(); 40672 this._element.setAttribute("aria-expanded", true); 40673 this._menu.classList.add(CLASS_NAME_SHOW$6); 40674 this._element.classList.add(CLASS_NAME_SHOW$6); 40675 EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget); 40676 } 40677 hide() { 40678 if (isDisabled(this._element) || !this._isShown()) { 40679 return; 40680 } 40681 const relatedTarget = { 40682 relatedTarget: this._element 40683 }; 40684 this._completeHide(relatedTarget); 40685 } 40686 dispose() { 40687 if (this._popper) { 40688 this._popper.destroy(); 40689 } 40690 super.dispose(); 40691 } 40692 update() { 40693 this._inNavbar = this._detectNavbar(); 40694 if (this._popper) { 40695 this._popper.update(); 40696 } 40697 } 40698 _completeHide(relatedTarget) { 40699 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget); 40700 if (hideEvent.defaultPrevented) { 40701 return; 40702 } 40703 if ("ontouchstart" in document.documentElement) { 40704 for (const element of [].concat(...document.body.children)) { 40705 EventHandler.off(element, "mouseover", noop); 40706 } 40707 } 40708 if (this._popper) { 40709 this._popper.destroy(); 40710 } 40711 this._menu.classList.remove(CLASS_NAME_SHOW$6); 40712 this._element.classList.remove(CLASS_NAME_SHOW$6); 40713 this._element.setAttribute("aria-expanded", "false"); 40714 Manipulator.removeDataAttribute(this._menu, "popper"); 40715 EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget); 40716 } 40717 _getConfig(config2) { 40718 config2 = super._getConfig(config2); 40719 if (typeof config2.reference === "object" && !isElement2(config2.reference) && typeof config2.reference.getBoundingClientRect !== "function") { 40720 throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); 40721 } 40722 return config2; 40723 } 40724 _createPopper() { 40725 if (typeof lib_exports === "undefined") { 40726 throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); 40727 } 40728 let referenceElement = this._element; 40729 if (this._config.reference === "parent") { 40730 referenceElement = this._parent; 40731 } else if (isElement2(this._config.reference)) { 40732 referenceElement = getElement(this._config.reference); 40733 } else if (typeof this._config.reference === "object") { 40734 referenceElement = this._config.reference; 40735 } 40736 const popperConfig = this._getPopperConfig(); 40737 this._popper = createPopper3(referenceElement, this._menu, popperConfig); 40738 } 40739 _isShown() { 40740 return this._menu.classList.contains(CLASS_NAME_SHOW$6); 40741 } 40742 _getPlacement() { 40743 const parentDropdown = this._parent; 40744 if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { 40745 return PLACEMENT_RIGHT; 40746 } 40747 if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { 40748 return PLACEMENT_LEFT; 40749 } 40750 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { 40751 return PLACEMENT_TOPCENTER; 40752 } 40753 if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { 40754 return PLACEMENT_BOTTOMCENTER; 40755 } 40756 const isEnd = getComputedStyle(this._menu).getPropertyValue("--bs-position").trim() === "end"; 40757 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { 40758 return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; 40759 } 40760 return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; 40761 } 40762 _detectNavbar() { 40763 return this._element.closest(SELECTOR_NAVBAR) !== null; 40764 } 40765 _getOffset() { 40766 const { 40767 offset: offset2 40768 } = this._config; 40769 if (typeof offset2 === "string") { 40770 return offset2.split(",").map((value) => Number.parseInt(value, 10)); 40771 } 40772 if (typeof offset2 === "function") { 40773 return (popperData) => offset2(popperData, this._element); 40774 } 40775 return offset2; 40776 } 40777 _getPopperConfig() { 40778 const defaultBsPopperConfig = { 40779 placement: this._getPlacement(), 40780 modifiers: [{ 40781 name: "preventOverflow", 40782 options: { 40783 boundary: this._config.boundary 40784 } 40785 }, { 40786 name: "offset", 40787 options: { 40788 offset: this._getOffset() 40789 } 40790 }] 40791 }; 40792 if (this._inNavbar || this._config.display === "static") { 40793 Manipulator.setDataAttribute(this._menu, "popper", "static"); 40794 defaultBsPopperConfig.modifiers = [{ 40795 name: "applyStyles", 40796 enabled: false 40797 }]; 40798 } 40799 return { 40800 ...defaultBsPopperConfig, 40801 ...execute(this._config.popperConfig, [defaultBsPopperConfig]) 40802 }; 40803 } 40804 _selectMenuItem({ 40805 key, 40806 target 40807 }) { 40808 const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) => isVisible(element)); 40809 if (!items.length) { 40810 return; 40811 } 40812 getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus(); 40813 } 40814 static jQueryInterface(config2) { 40815 return this.each(function() { 40816 const data = Dropdown.getOrCreateInstance(this, config2); 40817 if (typeof config2 !== "string") { 40818 return; 40819 } 40820 if (typeof data[config2] === "undefined") { 40821 throw new TypeError(`No method named "${config2}"`); 40822 } 40823 data[config2](); 40824 }); 40825 } 40826 static clearMenus(event2) { 40827 if (event2.button === RIGHT_MOUSE_BUTTON || event2.type === "keyup" && event2.key !== TAB_KEY$1) { 40828 return; 40829 } 40830 const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN); 40831 for (const toggle of openToggles) { 40832 const context = Dropdown.getInstance(toggle); 40833 if (!context || context._config.autoClose === false) { 40834 continue; 40835 } 40836 const composedPath = event2.composedPath(); 40837 const isMenuTarget = composedPath.includes(context._menu); 40838 if (composedPath.includes(context._element) || context._config.autoClose === "inside" && !isMenuTarget || context._config.autoClose === "outside" && isMenuTarget) { 40839 continue; 40840 } 40841 if (context._menu.contains(event2.target) && (event2.type === "keyup" && event2.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event2.target.tagName))) { 40842 continue; 40843 } 40844 const relatedTarget = { 40845 relatedTarget: context._element 40846 }; 40847 if (event2.type === "click") { 40848 relatedTarget.clickEvent = event2; 40849 } 40850 context._completeHide(relatedTarget); 40851 } 40852 } 40853 static dataApiKeydownHandler(event2) { 40854 const isInput = /input|textarea/i.test(event2.target.tagName); 40855 const isEscapeEvent = event2.key === ESCAPE_KEY$2; 40856 const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event2.key); 40857 if (!isUpOrDownEvent && !isEscapeEvent) { 40858 return; 40859 } 40860 if (isInput && !isEscapeEvent) { 40861 return; 40862 } 40863 event2.preventDefault(); 40864 const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event2.delegateTarget.parentNode); 40865 const instance = Dropdown.getOrCreateInstance(getToggleButton); 40866 if (isUpOrDownEvent) { 40867 event2.stopPropagation(); 40868 instance.show(); 40869 instance._selectMenuItem(event2); 40870 return; 40871 } 40872 if (instance._isShown()) { 40873 event2.stopPropagation(); 40874 instance.hide(); 40875 getToggleButton.focus(); 40876 } 40877 } 40878 }; 40879 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler); 40880 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); 40881 EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus); 40882 EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); 40883 EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function(event2) { 40884 event2.preventDefault(); 40885 Dropdown.getOrCreateInstance(this).toggle(); 40886 }); 40887 defineJQueryPlugin(Dropdown); 40888 var NAME$9 = "backdrop"; 40889 var CLASS_NAME_FADE$4 = "fade"; 40890 var CLASS_NAME_SHOW$5 = "show"; 40891 var EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`; 40892 var Default$8 = { 40893 className: "modal-backdrop", 40894 clickCallback: null, 40895 isAnimated: false, 40896 isVisible: true, 40897 rootElement: "body" 40898 }; 40899 var DefaultType$8 = { 40900 className: "string", 40901 clickCallback: "(function|null)", 40902 isAnimated: "boolean", 40903 isVisible: "boolean", 40904 rootElement: "(element|string)" 40905 }; 40906 var Backdrop = class extends Config { 40907 constructor(config2) { 40908 super(); 40909 this._config = this._getConfig(config2); 40910 this._isAppended = false; 40911 this._element = null; 40912 } 40913 static get Default() { 40914 return Default$8; 40915 } 40916 static get DefaultType() { 40917 return DefaultType$8; 40918 } 40919 static get NAME() { 40920 return NAME$9; 40921 } 40922 show(callback) { 40923 if (!this._config.isVisible) { 40924 execute(callback); 40925 return; 40926 } 40927 this._append(); 40928 const element = this._getElement(); 40929 if (this._config.isAnimated) { 40930 reflow(element); 40931 } 40932 element.classList.add(CLASS_NAME_SHOW$5); 40933 this._emulateAnimation(() => { 40934 execute(callback); 40935 }); 40936 } 40937 hide(callback) { 40938 if (!this._config.isVisible) { 40939 execute(callback); 40940 return; 40941 } 40942 this._getElement().classList.remove(CLASS_NAME_SHOW$5); 40943 this._emulateAnimation(() => { 40944 this.dispose(); 40945 execute(callback); 40946 }); 40947 } 40948 dispose() { 40949 if (!this._isAppended) { 40950 return; 40951 } 40952 EventHandler.off(this._element, EVENT_MOUSEDOWN); 40953 this._element.remove(); 40954 this._isAppended = false; 40955 } 40956 _getElement() { 40957 if (!this._element) { 40958 const backdrop = document.createElement("div"); 40959 backdrop.className = this._config.className; 40960 if (this._config.isAnimated) { 40961 backdrop.classList.add(CLASS_NAME_FADE$4); 40962 } 40963 this._element = backdrop; 40964 } 40965 return this._element; 40966 } 40967 _configAfterMerge(config2) { 40968 config2.rootElement = getElement(config2.rootElement); 40969 return config2; 40970 } 40971 _append() { 40972 if (this._isAppended) { 40973 return; 40974 } 40975 const element = this._getElement(); 40976 this._config.rootElement.append(element); 40977 EventHandler.on(element, EVENT_MOUSEDOWN, () => { 40978 execute(this._config.clickCallback); 40979 }); 40980 this._isAppended = true; 40981 } 40982 _emulateAnimation(callback) { 40983 executeAfterTransition(callback, this._getElement(), this._config.isAnimated); 40984 } 40985 }; 40986 var NAME$8 = "focustrap"; 40987 var DATA_KEY$5 = "bs.focustrap"; 40988 var EVENT_KEY$5 = `.${DATA_KEY$5}`; 40989 var EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`; 40990 var EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`; 40991 var TAB_KEY = "Tab"; 40992 var TAB_NAV_FORWARD = "forward"; 40993 var TAB_NAV_BACKWARD = "backward"; 40994 var Default$7 = { 40995 autofocus: true, 40996 trapElement: null 40997 }; 40998 var DefaultType$7 = { 40999 autofocus: "boolean", 41000 trapElement: "element" 41001 }; 41002 var FocusTrap = class extends Config { 41003 constructor(config2) { 41004 super(); 41005 this._config = this._getConfig(config2); 41006 this._isActive = false; 41007 this._lastTabNavDirection = null; 41008 } 41009 static get Default() { 41010 return Default$7; 41011 } 41012 static get DefaultType() { 41013 return DefaultType$7; 41014 } 41015 static get NAME() { 41016 return NAME$8; 41017 } 41018 activate() { 41019 if (this._isActive) { 41020 return; 41021 } 41022 if (this._config.autofocus) { 41023 this._config.trapElement.focus(); 41024 } 41025 EventHandler.off(document, EVENT_KEY$5); 41026 EventHandler.on(document, EVENT_FOCUSIN$2, (event2) => this._handleFocusin(event2)); 41027 EventHandler.on(document, EVENT_KEYDOWN_TAB, (event2) => this._handleKeydown(event2)); 41028 this._isActive = true; 41029 } 41030 deactivate() { 41031 if (!this._isActive) { 41032 return; 41033 } 41034 this._isActive = false; 41035 EventHandler.off(document, EVENT_KEY$5); 41036 } 41037 _handleFocusin(event2) { 41038 const { 41039 trapElement 41040 } = this._config; 41041 if (event2.target === document || event2.target === trapElement || trapElement.contains(event2.target)) { 41042 return; 41043 } 41044 const elements = SelectorEngine.focusableChildren(trapElement); 41045 if (elements.length === 0) { 41046 trapElement.focus(); 41047 } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { 41048 elements[elements.length - 1].focus(); 41049 } else { 41050 elements[0].focus(); 41051 } 41052 } 41053 _handleKeydown(event2) { 41054 if (event2.key !== TAB_KEY) { 41055 return; 41056 } 41057 this._lastTabNavDirection = event2.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD; 41058 } 41059 }; 41060 var SELECTOR_FIXED_CONTENT = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top"; 41061 var SELECTOR_STICKY_CONTENT = ".sticky-top"; 41062 var PROPERTY_PADDING = "padding-right"; 41063 var PROPERTY_MARGIN = "margin-right"; 41064 var ScrollBarHelper = class { 41065 constructor() { 41066 this._element = document.body; 41067 } 41068 getWidth() { 41069 const documentWidth = document.documentElement.clientWidth; 41070 return Math.abs(window.innerWidth - documentWidth); 41071 } 41072 hide() { 41073 const width = this.getWidth(); 41074 this._disableOverFlow(); 41075 this._setElementAttributes(this._element, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width); 41076 this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width); 41077 this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, (calculatedValue) => calculatedValue - width); 41078 } 41079 reset() { 41080 this._resetElementAttributes(this._element, "overflow"); 41081 this._resetElementAttributes(this._element, PROPERTY_PADDING); 41082 this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING); 41083 this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN); 41084 } 41085 isOverflowing() { 41086 return this.getWidth() > 0; 41087 } 41088 _disableOverFlow() { 41089 this._saveInitialAttribute(this._element, "overflow"); 41090 this._element.style.overflow = "hidden"; 41091 } 41092 _setElementAttributes(selector, styleProperty, callback) { 41093 const scrollbarWidth = this.getWidth(); 41094 const manipulationCallBack = (element) => { 41095 if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) { 41096 return; 41097 } 41098 this._saveInitialAttribute(element, styleProperty); 41099 const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty); 41100 element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`); 41101 }; 41102 this._applyManipulationCallback(selector, manipulationCallBack); 41103 } 41104 _saveInitialAttribute(element, styleProperty) { 41105 const actualValue = element.style.getPropertyValue(styleProperty); 41106 if (actualValue) { 41107 Manipulator.setDataAttribute(element, styleProperty, actualValue); 41108 } 41109 } 41110 _resetElementAttributes(selector, styleProperty) { 41111 const manipulationCallBack = (element) => { 41112 const value = Manipulator.getDataAttribute(element, styleProperty); 41113 if (value === null) { 41114 element.style.removeProperty(styleProperty); 41115 return; 41116 } 41117 Manipulator.removeDataAttribute(element, styleProperty); 41118 element.style.setProperty(styleProperty, value); 41119 }; 41120 this._applyManipulationCallback(selector, manipulationCallBack); 41121 } 41122 _applyManipulationCallback(selector, callBack) { 41123 if (isElement2(selector)) { 41124 callBack(selector); 41125 return; 41126 } 41127 for (const sel of SelectorEngine.find(selector, this._element)) { 41128 callBack(sel); 41129 } 41130 } 41131 }; 41132 var NAME$7 = "modal"; 41133 var DATA_KEY$4 = "bs.modal"; 41134 var EVENT_KEY$4 = `.${DATA_KEY$4}`; 41135 var DATA_API_KEY$2 = ".data-api"; 41136 var ESCAPE_KEY$1 = "Escape"; 41137 var EVENT_HIDE$4 = `hide${EVENT_KEY$4}`; 41138 var EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`; 41139 var EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`; 41140 var EVENT_SHOW$4 = `show${EVENT_KEY$4}`; 41141 var EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`; 41142 var EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`; 41143 var EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`; 41144 var EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`; 41145 var EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`; 41146 var EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`; 41147 var CLASS_NAME_OPEN = "modal-open"; 41148 var CLASS_NAME_FADE$3 = "fade"; 41149 var CLASS_NAME_SHOW$4 = "show"; 41150 var CLASS_NAME_STATIC = "modal-static"; 41151 var OPEN_SELECTOR$1 = ".modal.show"; 41152 var SELECTOR_DIALOG = ".modal-dialog"; 41153 var SELECTOR_MODAL_BODY = ".modal-body"; 41154 var SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]'; 41155 var Default$6 = { 41156 backdrop: true, 41157 focus: true, 41158 keyboard: true 41159 }; 41160 var DefaultType$6 = { 41161 backdrop: "(boolean|string)", 41162 focus: "boolean", 41163 keyboard: "boolean" 41164 }; 41165 var Modal = class extends BaseComponent2 { 41166 constructor(element, config2) { 41167 super(element, config2); 41168 this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element); 41169 this._backdrop = this._initializeBackDrop(); 41170 this._focustrap = this._initializeFocusTrap(); 41171 this._isShown = false; 41172 this._isTransitioning = false; 41173 this._scrollBar = new ScrollBarHelper(); 41174 this._addEventListeners(); 41175 } 41176 static get Default() { 41177 return Default$6; 41178 } 41179 static get DefaultType() { 41180 return DefaultType$6; 41181 } 41182 static get NAME() { 41183 return NAME$7; 41184 } 41185 toggle(relatedTarget) { 41186 return this._isShown ? this.hide() : this.show(relatedTarget); 41187 } 41188 show(relatedTarget) { 41189 if (this._isShown || this._isTransitioning) { 41190 return; 41191 } 41192 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, { 41193 relatedTarget 41194 }); 41195 if (showEvent.defaultPrevented) { 41196 return; 41197 } 41198 this._isShown = true; 41199 this._isTransitioning = true; 41200 this._scrollBar.hide(); 41201 document.body.classList.add(CLASS_NAME_OPEN); 41202 this._adjustDialog(); 41203 this._backdrop.show(() => this._showElement(relatedTarget)); 41204 } 41205 hide() { 41206 if (!this._isShown || this._isTransitioning) { 41207 return; 41208 } 41209 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4); 41210 if (hideEvent.defaultPrevented) { 41211 return; 41212 } 41213 this._isShown = false; 41214 this._isTransitioning = true; 41215 this._focustrap.deactivate(); 41216 this._element.classList.remove(CLASS_NAME_SHOW$4); 41217 this._queueCallback(() => this._hideModal(), this._element, this._isAnimated()); 41218 } 41219 dispose() { 41220 EventHandler.off(window, EVENT_KEY$4); 41221 EventHandler.off(this._dialog, EVENT_KEY$4); 41222 this._backdrop.dispose(); 41223 this._focustrap.deactivate(); 41224 super.dispose(); 41225 } 41226 handleUpdate() { 41227 this._adjustDialog(); 41228 } 41229 _initializeBackDrop() { 41230 return new Backdrop({ 41231 isVisible: Boolean(this._config.backdrop), 41232 isAnimated: this._isAnimated() 41233 }); 41234 } 41235 _initializeFocusTrap() { 41236 return new FocusTrap({ 41237 trapElement: this._element 41238 }); 41239 } 41240 _showElement(relatedTarget) { 41241 if (!document.body.contains(this._element)) { 41242 document.body.append(this._element); 41243 } 41244 this._element.style.display = "block"; 41245 this._element.removeAttribute("aria-hidden"); 41246 this._element.setAttribute("aria-modal", true); 41247 this._element.setAttribute("role", "dialog"); 41248 this._element.scrollTop = 0; 41249 const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); 41250 if (modalBody) { 41251 modalBody.scrollTop = 0; 41252 } 41253 reflow(this._element); 41254 this._element.classList.add(CLASS_NAME_SHOW$4); 41255 const transitionComplete = () => { 41256 if (this._config.focus) { 41257 this._focustrap.activate(); 41258 } 41259 this._isTransitioning = false; 41260 EventHandler.trigger(this._element, EVENT_SHOWN$4, { 41261 relatedTarget 41262 }); 41263 }; 41264 this._queueCallback(transitionComplete, this._dialog, this._isAnimated()); 41265 } 41266 _addEventListeners() { 41267 EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, (event2) => { 41268 if (event2.key !== ESCAPE_KEY$1) { 41269 return; 41270 } 41271 if (this._config.keyboard) { 41272 this.hide(); 41273 return; 41274 } 41275 this._triggerBackdropTransition(); 41276 }); 41277 EventHandler.on(window, EVENT_RESIZE$1, () => { 41278 if (this._isShown && !this._isTransitioning) { 41279 this._adjustDialog(); 41280 } 41281 }); 41282 EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, (event2) => { 41283 EventHandler.one(this._element, EVENT_CLICK_DISMISS, (event22) => { 41284 if (this._element !== event2.target || this._element !== event22.target) { 41285 return; 41286 } 41287 if (this._config.backdrop === "static") { 41288 this._triggerBackdropTransition(); 41289 return; 41290 } 41291 if (this._config.backdrop) { 41292 this.hide(); 41293 } 41294 }); 41295 }); 41296 } 41297 _hideModal() { 41298 this._element.style.display = "none"; 41299 this._element.setAttribute("aria-hidden", true); 41300 this._element.removeAttribute("aria-modal"); 41301 this._element.removeAttribute("role"); 41302 this._isTransitioning = false; 41303 this._backdrop.hide(() => { 41304 document.body.classList.remove(CLASS_NAME_OPEN); 41305 this._resetAdjustments(); 41306 this._scrollBar.reset(); 41307 EventHandler.trigger(this._element, EVENT_HIDDEN$4); 41308 }); 41309 } 41310 _isAnimated() { 41311 return this._element.classList.contains(CLASS_NAME_FADE$3); 41312 } 41313 _triggerBackdropTransition() { 41314 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1); 41315 if (hideEvent.defaultPrevented) { 41316 return; 41317 } 41318 const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; 41319 const initialOverflowY = this._element.style.overflowY; 41320 if (initialOverflowY === "hidden" || this._element.classList.contains(CLASS_NAME_STATIC)) { 41321 return; 41322 } 41323 if (!isModalOverflowing) { 41324 this._element.style.overflowY = "hidden"; 41325 } 41326 this._element.classList.add(CLASS_NAME_STATIC); 41327 this._queueCallback(() => { 41328 this._element.classList.remove(CLASS_NAME_STATIC); 41329 this._queueCallback(() => { 41330 this._element.style.overflowY = initialOverflowY; 41331 }, this._dialog); 41332 }, this._dialog); 41333 this._element.focus(); 41334 } 41335 _adjustDialog() { 41336 const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; 41337 const scrollbarWidth = this._scrollBar.getWidth(); 41338 const isBodyOverflowing = scrollbarWidth > 0; 41339 if (isBodyOverflowing && !isModalOverflowing) { 41340 const property = isRTL() ? "paddingLeft" : "paddingRight"; 41341 this._element.style[property] = `${scrollbarWidth}px`; 41342 } 41343 if (!isBodyOverflowing && isModalOverflowing) { 41344 const property = isRTL() ? "paddingRight" : "paddingLeft"; 41345 this._element.style[property] = `${scrollbarWidth}px`; 41346 } 41347 } 41348 _resetAdjustments() { 41349 this._element.style.paddingLeft = ""; 41350 this._element.style.paddingRight = ""; 41351 } 41352 static jQueryInterface(config2, relatedTarget) { 41353 return this.each(function() { 41354 const data = Modal.getOrCreateInstance(this, config2); 41355 if (typeof config2 !== "string") { 41356 return; 41357 } 41358 if (typeof data[config2] === "undefined") { 41359 throw new TypeError(`No method named "${config2}"`); 41360 } 41361 data[config2](relatedTarget); 41362 }); 41363 } 41364 }; 41365 EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function(event2) { 41366 const target = SelectorEngine.getElementFromSelector(this); 41367 if (["A", "AREA"].includes(this.tagName)) { 41368 event2.preventDefault(); 41369 } 41370 EventHandler.one(target, EVENT_SHOW$4, (showEvent) => { 41371 if (showEvent.defaultPrevented) { 41372 return; 41373 } 41374 EventHandler.one(target, EVENT_HIDDEN$4, () => { 41375 if (isVisible(this)) { 41376 this.focus(); 41377 } 41378 }); 41379 }); 41380 const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1); 41381 if (alreadyOpen) { 41382 Modal.getInstance(alreadyOpen).hide(); 41383 } 41384 const data = Modal.getOrCreateInstance(target); 41385 data.toggle(this); 41386 }); 41387 enableDismissTrigger(Modal); 41388 defineJQueryPlugin(Modal); 41389 var NAME$6 = "offcanvas"; 41390 var DATA_KEY$3 = "bs.offcanvas"; 41391 var EVENT_KEY$3 = `.${DATA_KEY$3}`; 41392 var DATA_API_KEY$1 = ".data-api"; 41393 var EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`; 41394 var ESCAPE_KEY = "Escape"; 41395 var CLASS_NAME_SHOW$3 = "show"; 41396 var CLASS_NAME_SHOWING$1 = "showing"; 41397 var CLASS_NAME_HIDING = "hiding"; 41398 var CLASS_NAME_BACKDROP = "offcanvas-backdrop"; 41399 var OPEN_SELECTOR = ".offcanvas.show"; 41400 var EVENT_SHOW$3 = `show${EVENT_KEY$3}`; 41401 var EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`; 41402 var EVENT_HIDE$3 = `hide${EVENT_KEY$3}`; 41403 var EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`; 41404 var EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`; 41405 var EVENT_RESIZE = `resize${EVENT_KEY$3}`; 41406 var EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`; 41407 var EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`; 41408 var SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]'; 41409 var Default$5 = { 41410 backdrop: true, 41411 keyboard: true, 41412 scroll: false 41413 }; 41414 var DefaultType$5 = { 41415 backdrop: "(boolean|string)", 41416 keyboard: "boolean", 41417 scroll: "boolean" 41418 }; 41419 var Offcanvas = class extends BaseComponent2 { 41420 constructor(element, config2) { 41421 super(element, config2); 41422 this._isShown = false; 41423 this._backdrop = this._initializeBackDrop(); 41424 this._focustrap = this._initializeFocusTrap(); 41425 this._addEventListeners(); 41426 } 41427 static get Default() { 41428 return Default$5; 41429 } 41430 static get DefaultType() { 41431 return DefaultType$5; 41432 } 41433 static get NAME() { 41434 return NAME$6; 41435 } 41436 toggle(relatedTarget) { 41437 return this._isShown ? this.hide() : this.show(relatedTarget); 41438 } 41439 show(relatedTarget) { 41440 if (this._isShown) { 41441 return; 41442 } 41443 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, { 41444 relatedTarget 41445 }); 41446 if (showEvent.defaultPrevented) { 41447 return; 41448 } 41449 this._isShown = true; 41450 this._backdrop.show(); 41451 if (!this._config.scroll) { 41452 new ScrollBarHelper().hide(); 41453 } 41454 this._element.setAttribute("aria-modal", true); 41455 this._element.setAttribute("role", "dialog"); 41456 this._element.classList.add(CLASS_NAME_SHOWING$1); 41457 const completeCallBack = () => { 41458 if (!this._config.scroll || this._config.backdrop) { 41459 this._focustrap.activate(); 41460 } 41461 this._element.classList.add(CLASS_NAME_SHOW$3); 41462 this._element.classList.remove(CLASS_NAME_SHOWING$1); 41463 EventHandler.trigger(this._element, EVENT_SHOWN$3, { 41464 relatedTarget 41465 }); 41466 }; 41467 this._queueCallback(completeCallBack, this._element, true); 41468 } 41469 hide() { 41470 if (!this._isShown) { 41471 return; 41472 } 41473 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3); 41474 if (hideEvent.defaultPrevented) { 41475 return; 41476 } 41477 this._focustrap.deactivate(); 41478 this._element.blur(); 41479 this._isShown = false; 41480 this._element.classList.add(CLASS_NAME_HIDING); 41481 this._backdrop.hide(); 41482 const completeCallback = () => { 41483 this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING); 41484 this._element.removeAttribute("aria-modal"); 41485 this._element.removeAttribute("role"); 41486 if (!this._config.scroll) { 41487 new ScrollBarHelper().reset(); 41488 } 41489 EventHandler.trigger(this._element, EVENT_HIDDEN$3); 41490 }; 41491 this._queueCallback(completeCallback, this._element, true); 41492 } 41493 dispose() { 41494 this._backdrop.dispose(); 41495 this._focustrap.deactivate(); 41496 super.dispose(); 41497 } 41498 _initializeBackDrop() { 41499 const clickCallback = () => { 41500 if (this._config.backdrop === "static") { 41501 EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); 41502 return; 41503 } 41504 this.hide(); 41505 }; 41506 const isVisible2 = Boolean(this._config.backdrop); 41507 return new Backdrop({ 41508 className: CLASS_NAME_BACKDROP, 41509 isVisible: isVisible2, 41510 isAnimated: true, 41511 rootElement: this._element.parentNode, 41512 clickCallback: isVisible2 ? clickCallback : null 41513 }); 41514 } 41515 _initializeFocusTrap() { 41516 return new FocusTrap({ 41517 trapElement: this._element 41518 }); 41519 } 41520 _addEventListeners() { 41521 EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event2) => { 41522 if (event2.key !== ESCAPE_KEY) { 41523 return; 41524 } 41525 if (this._config.keyboard) { 41526 this.hide(); 41527 return; 41528 } 41529 EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); 41530 }); 41531 } 41532 static jQueryInterface(config2) { 41533 return this.each(function() { 41534 const data = Offcanvas.getOrCreateInstance(this, config2); 41535 if (typeof config2 !== "string") { 41536 return; 41537 } 41538 if (data[config2] === void 0 || config2.startsWith("_") || config2 === "constructor") { 41539 throw new TypeError(`No method named "${config2}"`); 41540 } 41541 data[config2](this); 41542 }); 41543 } 41544 }; 41545 EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function(event2) { 41546 const target = SelectorEngine.getElementFromSelector(this); 41547 if (["A", "AREA"].includes(this.tagName)) { 41548 event2.preventDefault(); 41549 } 41550 if (isDisabled(this)) { 41551 return; 41552 } 41553 EventHandler.one(target, EVENT_HIDDEN$3, () => { 41554 if (isVisible(this)) { 41555 this.focus(); 41556 } 41557 }); 41558 const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); 41559 if (alreadyOpen && alreadyOpen !== target) { 41560 Offcanvas.getInstance(alreadyOpen).hide(); 41561 } 41562 const data = Offcanvas.getOrCreateInstance(target); 41563 data.toggle(this); 41564 }); 41565 EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => { 41566 for (const selector of SelectorEngine.find(OPEN_SELECTOR)) { 41567 Offcanvas.getOrCreateInstance(selector).show(); 41568 } 41569 }); 41570 EventHandler.on(window, EVENT_RESIZE, () => { 41571 for (const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]")) { 41572 if (getComputedStyle(element).position !== "fixed") { 41573 Offcanvas.getOrCreateInstance(element).hide(); 41574 } 41575 } 41576 }); 41577 enableDismissTrigger(Offcanvas); 41578 defineJQueryPlugin(Offcanvas); 41579 var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; 41580 var DefaultAllowlist = { 41581 "*": ["class", "dir", "id", "lang", "role", ARIA_ATTRIBUTE_PATTERN], 41582 a: ["target", "href", "title", "rel"], 41583 area: [], 41584 b: [], 41585 br: [], 41586 col: [], 41587 code: [], 41588 dd: [], 41589 div: [], 41590 dl: [], 41591 dt: [], 41592 em: [], 41593 hr: [], 41594 h1: [], 41595 h2: [], 41596 h3: [], 41597 h4: [], 41598 h5: [], 41599 h6: [], 41600 i: [], 41601 img: ["src", "srcset", "alt", "title", "width", "height"], 41602 li: [], 41603 ol: [], 41604 p: [], 41605 pre: [], 41606 s: [], 41607 small: [], 41608 span: [], 41609 sub: [], 41610 sup: [], 41611 strong: [], 41612 u: [], 41613 ul: [] 41614 }; 41615 var uriAttributes = /* @__PURE__ */ new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]); 41616 var SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i; 41617 var allowedAttribute = (attribute, allowedAttributeList) => { 41618 const attributeName = attribute.nodeName.toLowerCase(); 41619 if (allowedAttributeList.includes(attributeName)) { 41620 if (uriAttributes.has(attributeName)) { 41621 return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue)); 41622 } 41623 return true; 41624 } 41625 return allowedAttributeList.filter((attributeRegex) => attributeRegex instanceof RegExp).some((regex) => regex.test(attributeName)); 41626 }; 41627 function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { 41628 if (!unsafeHtml.length) { 41629 return unsafeHtml; 41630 } 41631 if (sanitizeFunction && typeof sanitizeFunction === "function") { 41632 return sanitizeFunction(unsafeHtml); 41633 } 41634 const domParser = new window.DOMParser(); 41635 const createdDocument = domParser.parseFromString(unsafeHtml, "text/html"); 41636 const elements = [].concat(...createdDocument.body.querySelectorAll("*")); 41637 for (const element of elements) { 41638 const elementName = element.nodeName.toLowerCase(); 41639 if (!Object.keys(allowList).includes(elementName)) { 41640 element.remove(); 41641 continue; 41642 } 41643 const attributeList = [].concat(...element.attributes); 41644 const allowedAttributes = [].concat(allowList["*"] || [], allowList[elementName] || []); 41645 for (const attribute of attributeList) { 41646 if (!allowedAttribute(attribute, allowedAttributes)) { 41647 element.removeAttribute(attribute.nodeName); 41648 } 41649 } 41650 } 41651 return createdDocument.body.innerHTML; 41652 } 41653 var NAME$5 = "TemplateFactory"; 41654 var Default$4 = { 41655 allowList: DefaultAllowlist, 41656 content: {}, 41657 extraClass: "", 41658 html: false, 41659 sanitize: true, 41660 sanitizeFn: null, 41661 template: "<div></div>" 41662 }; 41663 var DefaultType$4 = { 41664 allowList: "object", 41665 content: "object", 41666 extraClass: "(string|function)", 41667 html: "boolean", 41668 sanitize: "boolean", 41669 sanitizeFn: "(null|function)", 41670 template: "string" 41671 }; 41672 var DefaultContentType = { 41673 entry: "(string|element|function|null)", 41674 selector: "(string|element)" 41675 }; 41676 var TemplateFactory = class extends Config { 41677 constructor(config2) { 41678 super(); 41679 this._config = this._getConfig(config2); 41680 } 41681 static get Default() { 41682 return Default$4; 41683 } 41684 static get DefaultType() { 41685 return DefaultType$4; 41686 } 41687 static get NAME() { 41688 return NAME$5; 41689 } 41690 getContent() { 41691 return Object.values(this._config.content).map((config2) => this._resolvePossibleFunction(config2)).filter(Boolean); 41692 } 41693 hasContent() { 41694 return this.getContent().length > 0; 41695 } 41696 changeContent(content) { 41697 this._checkContent(content); 41698 this._config.content = { 41699 ...this._config.content, 41700 ...content 41701 }; 41702 return this; 41703 } 41704 toHtml() { 41705 const templateWrapper = document.createElement("div"); 41706 templateWrapper.innerHTML = this._maybeSanitize(this._config.template); 41707 for (const [selector, text] of Object.entries(this._config.content)) { 41708 this._setContent(templateWrapper, text, selector); 41709 } 41710 const template = templateWrapper.children[0]; 41711 const extraClass = this._resolvePossibleFunction(this._config.extraClass); 41712 if (extraClass) { 41713 template.classList.add(...extraClass.split(" ")); 41714 } 41715 return template; 41716 } 41717 _typeCheckConfig(config2) { 41718 super._typeCheckConfig(config2); 41719 this._checkContent(config2.content); 41720 } 41721 _checkContent(arg) { 41722 for (const [selector, content] of Object.entries(arg)) { 41723 super._typeCheckConfig({ 41724 selector, 41725 entry: content 41726 }, DefaultContentType); 41727 } 41728 } 41729 _setContent(template, content, selector) { 41730 const templateElement = SelectorEngine.findOne(selector, template); 41731 if (!templateElement) { 41732 return; 41733 } 41734 content = this._resolvePossibleFunction(content); 41735 if (!content) { 41736 templateElement.remove(); 41737 return; 41738 } 41739 if (isElement2(content)) { 41740 this._putElementInTemplate(getElement(content), templateElement); 41741 return; 41742 } 41743 if (this._config.html) { 41744 templateElement.innerHTML = this._maybeSanitize(content); 41745 return; 41746 } 41747 templateElement.textContent = content; 41748 } 41749 _maybeSanitize(arg) { 41750 return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; 41751 } 41752 _resolvePossibleFunction(arg) { 41753 return execute(arg, [this]); 41754 } 41755 _putElementInTemplate(element, templateElement) { 41756 if (this._config.html) { 41757 templateElement.innerHTML = ""; 41758 templateElement.append(element); 41759 return; 41760 } 41761 templateElement.textContent = element.textContent; 41762 } 41763 }; 41764 var NAME$4 = "tooltip"; 41765 var DISALLOWED_ATTRIBUTES = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]); 41766 var CLASS_NAME_FADE$2 = "fade"; 41767 var CLASS_NAME_MODAL = "modal"; 41768 var CLASS_NAME_SHOW$2 = "show"; 41769 var SELECTOR_TOOLTIP_INNER = ".tooltip-inner"; 41770 var SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; 41771 var EVENT_MODAL_HIDE = "hide.bs.modal"; 41772 var TRIGGER_HOVER = "hover"; 41773 var TRIGGER_FOCUS = "focus"; 41774 var TRIGGER_CLICK = "click"; 41775 var TRIGGER_MANUAL = "manual"; 41776 var EVENT_HIDE$2 = "hide"; 41777 var EVENT_HIDDEN$2 = "hidden"; 41778 var EVENT_SHOW$2 = "show"; 41779 var EVENT_SHOWN$2 = "shown"; 41780 var EVENT_INSERTED = "inserted"; 41781 var EVENT_CLICK$1 = "click"; 41782 var EVENT_FOCUSIN$1 = "focusin"; 41783 var EVENT_FOCUSOUT$1 = "focusout"; 41784 var EVENT_MOUSEENTER = "mouseenter"; 41785 var EVENT_MOUSELEAVE = "mouseleave"; 41786 var AttachmentMap = { 41787 AUTO: "auto", 41788 TOP: "top", 41789 RIGHT: isRTL() ? "left" : "right", 41790 BOTTOM: "bottom", 41791 LEFT: isRTL() ? "right" : "left" 41792 }; 41793 var Default$3 = { 41794 allowList: DefaultAllowlist, 41795 animation: true, 41796 boundary: "clippingParents", 41797 container: false, 41798 customClass: "", 41799 delay: 0, 41800 fallbackPlacements: ["top", "right", "bottom", "left"], 41801 html: false, 41802 offset: [0, 6], 41803 placement: "top", 41804 popperConfig: null, 41805 sanitize: true, 41806 sanitizeFn: null, 41807 selector: false, 41808 template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', 41809 title: "", 41810 trigger: "hover focus" 41811 }; 41812 var DefaultType$3 = { 41813 allowList: "object", 41814 animation: "boolean", 41815 boundary: "(string|element)", 41816 container: "(string|element|boolean)", 41817 customClass: "(string|function)", 41818 delay: "(number|object)", 41819 fallbackPlacements: "array", 41820 html: "boolean", 41821 offset: "(array|string|function)", 41822 placement: "(string|function)", 41823 popperConfig: "(null|object|function)", 41824 sanitize: "boolean", 41825 sanitizeFn: "(null|function)", 41826 selector: "(string|boolean)", 41827 template: "string", 41828 title: "(string|element|function)", 41829 trigger: "string" 41830 }; 41831 var Tooltip = class extends BaseComponent2 { 41832 constructor(element, config2) { 41833 if (typeof lib_exports === "undefined") { 41834 throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); 41835 } 41836 super(element, config2); 41837 this._isEnabled = true; 41838 this._timeout = 0; 41839 this._isHovered = null; 41840 this._activeTrigger = {}; 41841 this._popper = null; 41842 this._templateFactory = null; 41843 this._newContent = null; 41844 this.tip = null; 41845 this._setListeners(); 41846 if (!this._config.selector) { 41847 this._fixTitle(); 41848 } 41849 } 41850 static get Default() { 41851 return Default$3; 41852 } 41853 static get DefaultType() { 41854 return DefaultType$3; 41855 } 41856 static get NAME() { 41857 return NAME$4; 41858 } 41859 enable() { 41860 this._isEnabled = true; 41861 } 41862 disable() { 41863 this._isEnabled = false; 41864 } 41865 toggleEnabled() { 41866 this._isEnabled = !this._isEnabled; 41867 } 41868 toggle() { 41869 if (!this._isEnabled) { 41870 return; 41871 } 41872 this._activeTrigger.click = !this._activeTrigger.click; 41873 if (this._isShown()) { 41874 this._leave(); 41875 return; 41876 } 41877 this._enter(); 41878 } 41879 dispose() { 41880 clearTimeout(this._timeout); 41881 EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); 41882 if (this._element.getAttribute("data-bs-original-title")) { 41883 this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title")); 41884 } 41885 this._disposePopper(); 41886 super.dispose(); 41887 } 41888 show() { 41889 if (this._element.style.display === "none") { 41890 throw new Error("Please use show on visible elements"); 41891 } 41892 if (!(this._isWithContent() && this._isEnabled)) { 41893 return; 41894 } 41895 const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2)); 41896 const shadowRoot = findShadowRoot(this._element); 41897 const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); 41898 if (showEvent.defaultPrevented || !isInTheDom) { 41899 return; 41900 } 41901 this._disposePopper(); 41902 const tip = this._getTipElement(); 41903 this._element.setAttribute("aria-describedby", tip.getAttribute("id")); 41904 const { 41905 container 41906 } = this._config; 41907 if (!this._element.ownerDocument.documentElement.contains(this.tip)) { 41908 container.append(tip); 41909 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); 41910 } 41911 this._popper = this._createPopper(tip); 41912 tip.classList.add(CLASS_NAME_SHOW$2); 41913 if ("ontouchstart" in document.documentElement) { 41914 for (const element of [].concat(...document.body.children)) { 41915 EventHandler.on(element, "mouseover", noop); 41916 } 41917 } 41918 const complete = () => { 41919 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2)); 41920 if (this._isHovered === false) { 41921 this._leave(); 41922 } 41923 this._isHovered = false; 41924 }; 41925 this._queueCallback(complete, this.tip, this._isAnimated()); 41926 } 41927 hide() { 41928 if (!this._isShown()) { 41929 return; 41930 } 41931 const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2)); 41932 if (hideEvent.defaultPrevented) { 41933 return; 41934 } 41935 const tip = this._getTipElement(); 41936 tip.classList.remove(CLASS_NAME_SHOW$2); 41937 if ("ontouchstart" in document.documentElement) { 41938 for (const element of [].concat(...document.body.children)) { 41939 EventHandler.off(element, "mouseover", noop); 41940 } 41941 } 41942 this._activeTrigger[TRIGGER_CLICK] = false; 41943 this._activeTrigger[TRIGGER_FOCUS] = false; 41944 this._activeTrigger[TRIGGER_HOVER] = false; 41945 this._isHovered = null; 41946 const complete = () => { 41947 if (this._isWithActiveTrigger()) { 41948 return; 41949 } 41950 if (!this._isHovered) { 41951 this._disposePopper(); 41952 } 41953 this._element.removeAttribute("aria-describedby"); 41954 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2)); 41955 }; 41956 this._queueCallback(complete, this.tip, this._isAnimated()); 41957 } 41958 update() { 41959 if (this._popper) { 41960 this._popper.update(); 41961 } 41962 } 41963 _isWithContent() { 41964 return Boolean(this._getTitle()); 41965 } 41966 _getTipElement() { 41967 if (!this.tip) { 41968 this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); 41969 } 41970 return this.tip; 41971 } 41972 _createTipElement(content) { 41973 const tip = this._getTemplateFactory(content).toHtml(); 41974 if (!tip) { 41975 return null; 41976 } 41977 tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); 41978 tip.classList.add(`bs-${this.constructor.NAME}-auto`); 41979 const tipId = getUID(this.constructor.NAME).toString(); 41980 tip.setAttribute("id", tipId); 41981 if (this._isAnimated()) { 41982 tip.classList.add(CLASS_NAME_FADE$2); 41983 } 41984 return tip; 41985 } 41986 setContent(content) { 41987 this._newContent = content; 41988 if (this._isShown()) { 41989 this._disposePopper(); 41990 this.show(); 41991 } 41992 } 41993 _getTemplateFactory(content) { 41994 if (this._templateFactory) { 41995 this._templateFactory.changeContent(content); 41996 } else { 41997 this._templateFactory = new TemplateFactory({ 41998 ...this._config, 41999 content, 42000 extraClass: this._resolvePossibleFunction(this._config.customClass) 42001 }); 42002 } 42003 return this._templateFactory; 42004 } 42005 _getContentForTemplate() { 42006 return { 42007 [SELECTOR_TOOLTIP_INNER]: this._getTitle() 42008 }; 42009 } 42010 _getTitle() { 42011 return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title"); 42012 } 42013 _initializeOnDelegatedTarget(event2) { 42014 return this.constructor.getOrCreateInstance(event2.delegateTarget, this._getDelegateConfig()); 42015 } 42016 _isAnimated() { 42017 return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2); 42018 } 42019 _isShown() { 42020 return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2); 42021 } 42022 _createPopper(tip) { 42023 const placement = execute(this._config.placement, [this, tip, this._element]); 42024 const attachment = AttachmentMap[placement.toUpperCase()]; 42025 return createPopper3(this._element, tip, this._getPopperConfig(attachment)); 42026 } 42027 _getOffset() { 42028 const { 42029 offset: offset2 42030 } = this._config; 42031 if (typeof offset2 === "string") { 42032 return offset2.split(",").map((value) => Number.parseInt(value, 10)); 42033 } 42034 if (typeof offset2 === "function") { 42035 return (popperData) => offset2(popperData, this._element); 42036 } 42037 return offset2; 42038 } 42039 _resolvePossibleFunction(arg) { 42040 return execute(arg, [this._element]); 42041 } 42042 _getPopperConfig(attachment) { 42043 const defaultBsPopperConfig = { 42044 placement: attachment, 42045 modifiers: [{ 42046 name: "flip", 42047 options: { 42048 fallbackPlacements: this._config.fallbackPlacements 42049 } 42050 }, { 42051 name: "offset", 42052 options: { 42053 offset: this._getOffset() 42054 } 42055 }, { 42056 name: "preventOverflow", 42057 options: { 42058 boundary: this._config.boundary 42059 } 42060 }, { 42061 name: "arrow", 42062 options: { 42063 element: `.${this.constructor.NAME}-arrow` 42064 } 42065 }, { 42066 name: "preSetPlacement", 42067 enabled: true, 42068 phase: "beforeMain", 42069 fn: (data) => { 42070 this._getTipElement().setAttribute("data-popper-placement", data.state.placement); 42071 } 42072 }] 42073 }; 42074 return { 42075 ...defaultBsPopperConfig, 42076 ...execute(this._config.popperConfig, [defaultBsPopperConfig]) 42077 }; 42078 } 42079 _setListeners() { 42080 const triggers = this._config.trigger.split(" "); 42081 for (const trigger of triggers) { 42082 if (trigger === "click") { 42083 EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, (event2) => { 42084 const context = this._initializeOnDelegatedTarget(event2); 42085 context.toggle(); 42086 }); 42087 } else if (trigger !== TRIGGER_MANUAL) { 42088 const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1); 42089 const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1); 42090 EventHandler.on(this._element, eventIn, this._config.selector, (event2) => { 42091 const context = this._initializeOnDelegatedTarget(event2); 42092 context._activeTrigger[event2.type === "focusin" ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; 42093 context._enter(); 42094 }); 42095 EventHandler.on(this._element, eventOut, this._config.selector, (event2) => { 42096 const context = this._initializeOnDelegatedTarget(event2); 42097 context._activeTrigger[event2.type === "focusout" ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event2.relatedTarget); 42098 context._leave(); 42099 }); 42100 } 42101 } 42102 this._hideModalHandler = () => { 42103 if (this._element) { 42104 this.hide(); 42105 } 42106 }; 42107 EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); 42108 } 42109 _fixTitle() { 42110 const title = this._element.getAttribute("title"); 42111 if (!title) { 42112 return; 42113 } 42114 if (!this._element.getAttribute("aria-label") && !this._element.textContent.trim()) { 42115 this._element.setAttribute("aria-label", title); 42116 } 42117 this._element.setAttribute("data-bs-original-title", title); 42118 this._element.removeAttribute("title"); 42119 } 42120 _enter() { 42121 if (this._isShown() || this._isHovered) { 42122 this._isHovered = true; 42123 return; 42124 } 42125 this._isHovered = true; 42126 this._setTimeout(() => { 42127 if (this._isHovered) { 42128 this.show(); 42129 } 42130 }, this._config.delay.show); 42131 } 42132 _leave() { 42133 if (this._isWithActiveTrigger()) { 42134 return; 42135 } 42136 this._isHovered = false; 42137 this._setTimeout(() => { 42138 if (!this._isHovered) { 42139 this.hide(); 42140 } 42141 }, this._config.delay.hide); 42142 } 42143 _setTimeout(handler, timeout) { 42144 clearTimeout(this._timeout); 42145 this._timeout = setTimeout(handler, timeout); 42146 } 42147 _isWithActiveTrigger() { 42148 return Object.values(this._activeTrigger).includes(true); 42149 } 42150 _getConfig(config2) { 42151 const dataAttributes = Manipulator.getDataAttributes(this._element); 42152 for (const dataAttribute of Object.keys(dataAttributes)) { 42153 if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { 42154 delete dataAttributes[dataAttribute]; 42155 } 42156 } 42157 config2 = { 42158 ...dataAttributes, 42159 ...typeof config2 === "object" && config2 ? config2 : {} 42160 }; 42161 config2 = this._mergeConfigObj(config2); 42162 config2 = this._configAfterMerge(config2); 42163 this._typeCheckConfig(config2); 42164 return config2; 42165 } 42166 _configAfterMerge(config2) { 42167 config2.container = config2.container === false ? document.body : getElement(config2.container); 42168 if (typeof config2.delay === "number") { 42169 config2.delay = { 42170 show: config2.delay, 42171 hide: config2.delay 42172 }; 42173 } 42174 if (typeof config2.title === "number") { 42175 config2.title = config2.title.toString(); 42176 } 42177 if (typeof config2.content === "number") { 42178 config2.content = config2.content.toString(); 42179 } 42180 return config2; 42181 } 42182 _getDelegateConfig() { 42183 const config2 = {}; 42184 for (const [key, value] of Object.entries(this._config)) { 42185 if (this.constructor.Default[key] !== value) { 42186 config2[key] = value; 42187 } 42188 } 42189 config2.selector = false; 42190 config2.trigger = "manual"; 42191 return config2; 42192 } 42193 _disposePopper() { 42194 if (this._popper) { 42195 this._popper.destroy(); 42196 this._popper = null; 42197 } 42198 if (this.tip) { 42199 this.tip.remove(); 42200 this.tip = null; 42201 } 42202 } 42203 static jQueryInterface(config2) { 42204 return this.each(function() { 42205 const data = Tooltip.getOrCreateInstance(this, config2); 42206 if (typeof config2 !== "string") { 42207 return; 42208 } 42209 if (typeof data[config2] === "undefined") { 42210 throw new TypeError(`No method named "${config2}"`); 42211 } 42212 data[config2](); 42213 }); 42214 } 42215 }; 42216 defineJQueryPlugin(Tooltip); 42217 var NAME$3 = "popover"; 42218 var SELECTOR_TITLE = ".popover-header"; 42219 var SELECTOR_CONTENT = ".popover-body"; 42220 var Default$2 = { 42221 ...Tooltip.Default, 42222 content: "", 42223 offset: [0, 8], 42224 placement: "right", 42225 template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>', 42226 trigger: "click" 42227 }; 42228 var DefaultType$2 = { 42229 ...Tooltip.DefaultType, 42230 content: "(null|string|element|function)" 42231 }; 42232 var Popover2 = class extends Tooltip { 42233 static get Default() { 42234 return Default$2; 42235 } 42236 static get DefaultType() { 42237 return DefaultType$2; 42238 } 42239 static get NAME() { 42240 return NAME$3; 42241 } 42242 _isWithContent() { 42243 return this._getTitle() || this._getContent(); 42244 } 42245 _getContentForTemplate() { 42246 return { 42247 [SELECTOR_TITLE]: this._getTitle(), 42248 [SELECTOR_CONTENT]: this._getContent() 42249 }; 42250 } 42251 _getContent() { 42252 return this._resolvePossibleFunction(this._config.content); 42253 } 42254 static jQueryInterface(config2) { 42255 return this.each(function() { 42256 const data = Popover2.getOrCreateInstance(this, config2); 42257 if (typeof config2 !== "string") { 42258 return; 42259 } 42260 if (typeof data[config2] === "undefined") { 42261 throw new TypeError(`No method named "${config2}"`); 42262 } 42263 data[config2](); 42264 }); 42265 } 42266 }; 42267 defineJQueryPlugin(Popover2); 42268 var NAME$2 = "scrollspy"; 42269 var DATA_KEY$2 = "bs.scrollspy"; 42270 var EVENT_KEY$2 = `.${DATA_KEY$2}`; 42271 var DATA_API_KEY = ".data-api"; 42272 var EVENT_ACTIVATE = `activate${EVENT_KEY$2}`; 42273 var EVENT_CLICK = `click${EVENT_KEY$2}`; 42274 var EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`; 42275 var CLASS_NAME_DROPDOWN_ITEM = "dropdown-item"; 42276 var CLASS_NAME_ACTIVE$1 = "active"; 42277 var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; 42278 var SELECTOR_TARGET_LINKS = "[href]"; 42279 var SELECTOR_NAV_LIST_GROUP = ".nav, .list-group"; 42280 var SELECTOR_NAV_LINKS = ".nav-link"; 42281 var SELECTOR_NAV_ITEMS = ".nav-item"; 42282 var SELECTOR_LIST_ITEMS = ".list-group-item"; 42283 var SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`; 42284 var SELECTOR_DROPDOWN = ".dropdown"; 42285 var SELECTOR_DROPDOWN_TOGGLE$1 = ".dropdown-toggle"; 42286 var Default$1 = { 42287 offset: null, 42288 rootMargin: "0px 0px -25%", 42289 smoothScroll: false, 42290 target: null, 42291 threshold: [0.1, 0.5, 1] 42292 }; 42293 var DefaultType$1 = { 42294 offset: "(number|null)", 42295 rootMargin: "string", 42296 smoothScroll: "boolean", 42297 target: "element", 42298 threshold: "array" 42299 }; 42300 var ScrollSpy = class extends BaseComponent2 { 42301 constructor(element, config2) { 42302 super(element, config2); 42303 this._targetLinks = /* @__PURE__ */ new Map(); 42304 this._observableSections = /* @__PURE__ */ new Map(); 42305 this._rootElement = getComputedStyle(this._element).overflowY === "visible" ? null : this._element; 42306 this._activeTarget = null; 42307 this._observer = null; 42308 this._previousScrollData = { 42309 visibleEntryTop: 0, 42310 parentScrollTop: 0 42311 }; 42312 this.refresh(); 42313 } 42314 static get Default() { 42315 return Default$1; 42316 } 42317 static get DefaultType() { 42318 return DefaultType$1; 42319 } 42320 static get NAME() { 42321 return NAME$2; 42322 } 42323 refresh() { 42324 this._initializeTargetsAndObservables(); 42325 this._maybeEnableSmoothScroll(); 42326 if (this._observer) { 42327 this._observer.disconnect(); 42328 } else { 42329 this._observer = this._getNewObserver(); 42330 } 42331 for (const section of this._observableSections.values()) { 42332 this._observer.observe(section); 42333 } 42334 } 42335 dispose() { 42336 this._observer.disconnect(); 42337 super.dispose(); 42338 } 42339 _configAfterMerge(config2) { 42340 config2.target = getElement(config2.target) || document.body; 42341 config2.rootMargin = config2.offset ? `${config2.offset}px 0px -30%` : config2.rootMargin; 42342 if (typeof config2.threshold === "string") { 42343 config2.threshold = config2.threshold.split(",").map((value) => Number.parseFloat(value)); 42344 } 42345 return config2; 42346 } 42347 _maybeEnableSmoothScroll() { 42348 if (!this._config.smoothScroll) { 42349 return; 42350 } 42351 EventHandler.off(this._config.target, EVENT_CLICK); 42352 EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event2) => { 42353 const observableSection = this._observableSections.get(event2.target.hash); 42354 if (observableSection) { 42355 event2.preventDefault(); 42356 const root = this._rootElement || window; 42357 const height = observableSection.offsetTop - this._element.offsetTop; 42358 if (root.scrollTo) { 42359 root.scrollTo({ 42360 top: height, 42361 behavior: "smooth" 42362 }); 42363 return; 42364 } 42365 root.scrollTop = height; 42366 } 42367 }); 42368 } 42369 _getNewObserver() { 42370 const options = { 42371 root: this._rootElement, 42372 threshold: this._config.threshold, 42373 rootMargin: this._config.rootMargin 42374 }; 42375 return new IntersectionObserver((entries) => this._observerCallback(entries), options); 42376 } 42377 _observerCallback(entries) { 42378 const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`); 42379 const activate = (entry) => { 42380 this._previousScrollData.visibleEntryTop = entry.target.offsetTop; 42381 this._process(targetElement(entry)); 42382 }; 42383 const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; 42384 const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; 42385 this._previousScrollData.parentScrollTop = parentScrollTop; 42386 for (const entry of entries) { 42387 if (!entry.isIntersecting) { 42388 this._activeTarget = null; 42389 this._clearActiveClass(targetElement(entry)); 42390 continue; 42391 } 42392 const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; 42393 if (userScrollsDown && entryIsLowerThanPrevious) { 42394 activate(entry); 42395 if (!parentScrollTop) { 42396 return; 42397 } 42398 continue; 42399 } 42400 if (!userScrollsDown && !entryIsLowerThanPrevious) { 42401 activate(entry); 42402 } 42403 } 42404 } 42405 _initializeTargetsAndObservables() { 42406 this._targetLinks = /* @__PURE__ */ new Map(); 42407 this._observableSections = /* @__PURE__ */ new Map(); 42408 const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target); 42409 for (const anchor of targetLinks) { 42410 if (!anchor.hash || isDisabled(anchor)) { 42411 continue; 42412 } 42413 const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element); 42414 if (isVisible(observableSection)) { 42415 this._targetLinks.set(decodeURI(anchor.hash), anchor); 42416 this._observableSections.set(anchor.hash, observableSection); 42417 } 42418 } 42419 } 42420 _process(target) { 42421 if (this._activeTarget === target) { 42422 return; 42423 } 42424 this._clearActiveClass(this._config.target); 42425 this._activeTarget = target; 42426 target.classList.add(CLASS_NAME_ACTIVE$1); 42427 this._activateParents(target); 42428 EventHandler.trigger(this._element, EVENT_ACTIVATE, { 42429 relatedTarget: target 42430 }); 42431 } 42432 _activateParents(target) { 42433 if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { 42434 SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1); 42435 return; 42436 } 42437 for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) { 42438 for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) { 42439 item.classList.add(CLASS_NAME_ACTIVE$1); 42440 } 42441 } 42442 } 42443 _clearActiveClass(parent) { 42444 parent.classList.remove(CLASS_NAME_ACTIVE$1); 42445 const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent); 42446 for (const node of activeNodes) { 42447 node.classList.remove(CLASS_NAME_ACTIVE$1); 42448 } 42449 } 42450 static jQueryInterface(config2) { 42451 return this.each(function() { 42452 const data = ScrollSpy.getOrCreateInstance(this, config2); 42453 if (typeof config2 !== "string") { 42454 return; 42455 } 42456 if (data[config2] === void 0 || config2.startsWith("_") || config2 === "constructor") { 42457 throw new TypeError(`No method named "${config2}"`); 42458 } 42459 data[config2](); 42460 }); 42461 } 42462 }; 42463 EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => { 42464 for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) { 42465 ScrollSpy.getOrCreateInstance(spy); 42466 } 42467 }); 42468 defineJQueryPlugin(ScrollSpy); 42469 var NAME$1 = "tab"; 42470 var DATA_KEY$1 = "bs.tab"; 42471 var EVENT_KEY$1 = `.${DATA_KEY$1}`; 42472 var EVENT_HIDE$1 = `hide${EVENT_KEY$1}`; 42473 var EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`; 42474 var EVENT_SHOW$1 = `show${EVENT_KEY$1}`; 42475 var EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`; 42476 var EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`; 42477 var EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`; 42478 var EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`; 42479 var ARROW_LEFT_KEY = "ArrowLeft"; 42480 var ARROW_RIGHT_KEY = "ArrowRight"; 42481 var ARROW_UP_KEY = "ArrowUp"; 42482 var ARROW_DOWN_KEY = "ArrowDown"; 42483 var HOME_KEY = "Home"; 42484 var END_KEY = "End"; 42485 var CLASS_NAME_ACTIVE = "active"; 42486 var CLASS_NAME_FADE$1 = "fade"; 42487 var CLASS_NAME_SHOW$1 = "show"; 42488 var CLASS_DROPDOWN = "dropdown"; 42489 var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle"; 42490 var SELECTOR_DROPDOWN_MENU = ".dropdown-menu"; 42491 var NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`; 42492 var SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'; 42493 var SELECTOR_OUTER = ".nav-item, .list-group-item"; 42494 var SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`; 42495 var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; 42496 var SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`; 42497 var SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`; 42498 var Tab = class extends BaseComponent2 { 42499 constructor(element) { 42500 super(element); 42501 this._parent = this._element.closest(SELECTOR_TAB_PANEL); 42502 if (!this._parent) { 42503 return; 42504 } 42505 this._setInitialAttributes(this._parent, this._getChildren()); 42506 EventHandler.on(this._element, EVENT_KEYDOWN, (event2) => this._keydown(event2)); 42507 } 42508 static get NAME() { 42509 return NAME$1; 42510 } 42511 show() { 42512 const innerElem = this._element; 42513 if (this._elemIsActive(innerElem)) { 42514 return; 42515 } 42516 const active = this._getActiveElem(); 42517 const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, { 42518 relatedTarget: innerElem 42519 }) : null; 42520 const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, { 42521 relatedTarget: active 42522 }); 42523 if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) { 42524 return; 42525 } 42526 this._deactivate(active, innerElem); 42527 this._activate(innerElem, active); 42528 } 42529 _activate(element, relatedElem) { 42530 if (!element) { 42531 return; 42532 } 42533 element.classList.add(CLASS_NAME_ACTIVE); 42534 this._activate(SelectorEngine.getElementFromSelector(element)); 42535 const complete = () => { 42536 if (element.getAttribute("role") !== "tab") { 42537 element.classList.add(CLASS_NAME_SHOW$1); 42538 return; 42539 } 42540 element.removeAttribute("tabindex"); 42541 element.setAttribute("aria-selected", true); 42542 this._toggleDropDown(element, true); 42543 EventHandler.trigger(element, EVENT_SHOWN$1, { 42544 relatedTarget: relatedElem 42545 }); 42546 }; 42547 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1)); 42548 } 42549 _deactivate(element, relatedElem) { 42550 if (!element) { 42551 return; 42552 } 42553 element.classList.remove(CLASS_NAME_ACTIVE); 42554 element.blur(); 42555 this._deactivate(SelectorEngine.getElementFromSelector(element)); 42556 const complete = () => { 42557 if (element.getAttribute("role") !== "tab") { 42558 element.classList.remove(CLASS_NAME_SHOW$1); 42559 return; 42560 } 42561 element.setAttribute("aria-selected", false); 42562 element.setAttribute("tabindex", "-1"); 42563 this._toggleDropDown(element, false); 42564 EventHandler.trigger(element, EVENT_HIDDEN$1, { 42565 relatedTarget: relatedElem 42566 }); 42567 }; 42568 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1)); 42569 } 42570 _keydown(event2) { 42571 if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event2.key)) { 42572 return; 42573 } 42574 event2.stopPropagation(); 42575 event2.preventDefault(); 42576 const children = this._getChildren().filter((element) => !isDisabled(element)); 42577 let nextActiveElement; 42578 if ([HOME_KEY, END_KEY].includes(event2.key)) { 42579 nextActiveElement = children[event2.key === HOME_KEY ? 0 : children.length - 1]; 42580 } else { 42581 const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event2.key); 42582 nextActiveElement = getNextActiveElement(children, event2.target, isNext, true); 42583 } 42584 if (nextActiveElement) { 42585 nextActiveElement.focus({ 42586 preventScroll: true 42587 }); 42588 Tab.getOrCreateInstance(nextActiveElement).show(); 42589 } 42590 } 42591 _getChildren() { 42592 return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent); 42593 } 42594 _getActiveElem() { 42595 return this._getChildren().find((child) => this._elemIsActive(child)) || null; 42596 } 42597 _setInitialAttributes(parent, children) { 42598 this._setAttributeIfNotExists(parent, "role", "tablist"); 42599 for (const child of children) { 42600 this._setInitialAttributesOnChild(child); 42601 } 42602 } 42603 _setInitialAttributesOnChild(child) { 42604 child = this._getInnerElement(child); 42605 const isActive = this._elemIsActive(child); 42606 const outerElem = this._getOuterElement(child); 42607 child.setAttribute("aria-selected", isActive); 42608 if (outerElem !== child) { 42609 this._setAttributeIfNotExists(outerElem, "role", "presentation"); 42610 } 42611 if (!isActive) { 42612 child.setAttribute("tabindex", "-1"); 42613 } 42614 this._setAttributeIfNotExists(child, "role", "tab"); 42615 this._setInitialAttributesOnTargetPanel(child); 42616 } 42617 _setInitialAttributesOnTargetPanel(child) { 42618 const target = SelectorEngine.getElementFromSelector(child); 42619 if (!target) { 42620 return; 42621 } 42622 this._setAttributeIfNotExists(target, "role", "tabpanel"); 42623 if (child.id) { 42624 this._setAttributeIfNotExists(target, "aria-labelledby", `${child.id}`); 42625 } 42626 } 42627 _toggleDropDown(element, open) { 42628 const outerElem = this._getOuterElement(element); 42629 if (!outerElem.classList.contains(CLASS_DROPDOWN)) { 42630 return; 42631 } 42632 const toggle = (selector, className) => { 42633 const element2 = SelectorEngine.findOne(selector, outerElem); 42634 if (element2) { 42635 element2.classList.toggle(className, open); 42636 } 42637 }; 42638 toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE); 42639 toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1); 42640 outerElem.setAttribute("aria-expanded", open); 42641 } 42642 _setAttributeIfNotExists(element, attribute, value) { 42643 if (!element.hasAttribute(attribute)) { 42644 element.setAttribute(attribute, value); 42645 } 42646 } 42647 _elemIsActive(elem) { 42648 return elem.classList.contains(CLASS_NAME_ACTIVE); 42649 } 42650 _getInnerElement(elem) { 42651 return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem); 42652 } 42653 _getOuterElement(elem) { 42654 return elem.closest(SELECTOR_OUTER) || elem; 42655 } 42656 static jQueryInterface(config2) { 42657 return this.each(function() { 42658 const data = Tab.getOrCreateInstance(this); 42659 if (typeof config2 !== "string") { 42660 return; 42661 } 42662 if (data[config2] === void 0 || config2.startsWith("_") || config2 === "constructor") { 42663 throw new TypeError(`No method named "${config2}"`); 42664 } 42665 data[config2](); 42666 }); 42667 } 42668 }; 42669 EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event2) { 42670 if (["A", "AREA"].includes(this.tagName)) { 42671 event2.preventDefault(); 42672 } 42673 if (isDisabled(this)) { 42674 return; 42675 } 42676 Tab.getOrCreateInstance(this).show(); 42677 }); 42678 EventHandler.on(window, EVENT_LOAD_DATA_API, () => { 42679 for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) { 42680 Tab.getOrCreateInstance(element); 42681 } 42682 }); 42683 defineJQueryPlugin(Tab); 42684 var NAME = "toast"; 42685 var DATA_KEY = "bs.toast"; 42686 var EVENT_KEY = `.${DATA_KEY}`; 42687 var EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`; 42688 var EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`; 42689 var EVENT_FOCUSIN = `focusin${EVENT_KEY}`; 42690 var EVENT_FOCUSOUT = `focusout${EVENT_KEY}`; 42691 var EVENT_HIDE = `hide${EVENT_KEY}`; 42692 var EVENT_HIDDEN = `hidden${EVENT_KEY}`; 42693 var EVENT_SHOW = `show${EVENT_KEY}`; 42694 var EVENT_SHOWN = `shown${EVENT_KEY}`; 42695 var CLASS_NAME_FADE = "fade"; 42696 var CLASS_NAME_HIDE = "hide"; 42697 var CLASS_NAME_SHOW = "show"; 42698 var CLASS_NAME_SHOWING = "showing"; 42699 var DefaultType = { 42700 animation: "boolean", 42701 autohide: "boolean", 42702 delay: "number" 42703 }; 42704 var Default = { 42705 animation: true, 42706 autohide: true, 42707 delay: 5e3 42708 }; 42709 var Toast = class extends BaseComponent2 { 42710 constructor(element, config2) { 42711 super(element, config2); 42712 this._timeout = null; 42713 this._hasMouseInteraction = false; 42714 this._hasKeyboardInteraction = false; 42715 this._setListeners(); 42716 } 42717 static get Default() { 42718 return Default; 42719 } 42720 static get DefaultType() { 42721 return DefaultType; 42722 } 42723 static get NAME() { 42724 return NAME; 42725 } 42726 show() { 42727 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW); 42728 if (showEvent.defaultPrevented) { 42729 return; 42730 } 42731 this._clearTimeout(); 42732 if (this._config.animation) { 42733 this._element.classList.add(CLASS_NAME_FADE); 42734 } 42735 const complete = () => { 42736 this._element.classList.remove(CLASS_NAME_SHOWING); 42737 EventHandler.trigger(this._element, EVENT_SHOWN); 42738 this._maybeScheduleHide(); 42739 }; 42740 this._element.classList.remove(CLASS_NAME_HIDE); 42741 reflow(this._element); 42742 this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING); 42743 this._queueCallback(complete, this._element, this._config.animation); 42744 } 42745 hide() { 42746 if (!this.isShown()) { 42747 return; 42748 } 42749 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE); 42750 if (hideEvent.defaultPrevented) { 42751 return; 42752 } 42753 const complete = () => { 42754 this._element.classList.add(CLASS_NAME_HIDE); 42755 this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW); 42756 EventHandler.trigger(this._element, EVENT_HIDDEN); 42757 }; 42758 this._element.classList.add(CLASS_NAME_SHOWING); 42759 this._queueCallback(complete, this._element, this._config.animation); 42760 } 42761 dispose() { 42762 this._clearTimeout(); 42763 if (this.isShown()) { 42764 this._element.classList.remove(CLASS_NAME_SHOW); 42765 } 42766 super.dispose(); 42767 } 42768 isShown() { 42769 return this._element.classList.contains(CLASS_NAME_SHOW); 42770 } 42771 _maybeScheduleHide() { 42772 if (!this._config.autohide) { 42773 return; 42774 } 42775 if (this._hasMouseInteraction || this._hasKeyboardInteraction) { 42776 return; 42777 } 42778 this._timeout = setTimeout(() => { 42779 this.hide(); 42780 }, this._config.delay); 42781 } 42782 _onInteraction(event2, isInteracting) { 42783 switch (event2.type) { 42784 case "mouseover": 42785 case "mouseout": { 42786 this._hasMouseInteraction = isInteracting; 42787 break; 42788 } 42789 case "focusin": 42790 case "focusout": { 42791 this._hasKeyboardInteraction = isInteracting; 42792 break; 42793 } 42794 } 42795 if (isInteracting) { 42796 this._clearTimeout(); 42797 return; 42798 } 42799 const nextElement = event2.relatedTarget; 42800 if (this._element === nextElement || this._element.contains(nextElement)) { 42801 return; 42802 } 42803 this._maybeScheduleHide(); 42804 } 42805 _setListeners() { 42806 EventHandler.on(this._element, EVENT_MOUSEOVER, (event2) => this._onInteraction(event2, true)); 42807 EventHandler.on(this._element, EVENT_MOUSEOUT, (event2) => this._onInteraction(event2, false)); 42808 EventHandler.on(this._element, EVENT_FOCUSIN, (event2) => this._onInteraction(event2, true)); 42809 EventHandler.on(this._element, EVENT_FOCUSOUT, (event2) => this._onInteraction(event2, false)); 42810 } 42811 _clearTimeout() { 42812 clearTimeout(this._timeout); 42813 this._timeout = null; 42814 } 42815 static jQueryInterface(config2) { 42816 return this.each(function() { 42817 const data = Toast.getOrCreateInstance(this, config2); 42818 if (typeof config2 === "string") { 42819 if (typeof data[config2] === "undefined") { 42820 throw new TypeError(`No method named "${config2}"`); 42821 } 42822 data[config2](this); 42823 } 42824 }); 42825 } 42826 }; 42827 enableDismissTrigger(Toast); 42828 defineJQueryPlugin(Toast); 42829 42830
42830// app/javascript/application.js 42831 window.bootstrap = bootstrap_esm_exports; 42832 if (navigator.serviceWorker) { 42833 navigator.serviceWorker.register("/service-worker.js", { scope: "./" }).then(function(registration) { 42834 console.log("[Companion]", "Service worker registered!"); 42835 console.log(registration); 42836 }); 42837 } 42838 (() => { 42839 document.querySelectorAll("a").forEach((link) => { 42840 link.hostname !== location.hostname && link.setAttribute("target", "_blank"); 42841 }); 42842 })(); 42843})(); 42844/*! 42845 * Bootstrap v5.3.3 (https://getbootstrap.com/) 42846 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 42847 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 42848 */ 42849/*! 42850 * Pikaday 42851 * 42852 * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/Pikaday/Pikaday 42853 */ 42854/*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */ 42855//! authors : Tim Wood, Iskren Chernev, Moment.js contributors 42856//! license : MIT 42857//! moment.js 42858//! momentjs.com 42859//! version : 2.30.1 42860//# sourceMappingURL=/library/assets/application-e9c5cb83.js.map
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.