/******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/classes/semver.js": /*!*********************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/classes/semver.js ***! \*********************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const debug = __webpack_require__(/*! ../internal/debug */ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/debug.js") const { MAX_LENGTH, MAX_SAFE_INTEGER } = __webpack_require__(/*! ../internal/constants */ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/constants.js") const { safeRe: re, t } = __webpack_require__(/*! ../internal/re */ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/re.js") const parseOptions = __webpack_require__(/*! ../internal/parse-options */ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/parse-options.js") const { compareIdentifiers } = __webpack_require__(/*! ../internal/identifiers */ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/identifiers.js") class SemVer { constructor (version, options) { options = parseOptions(options) if (version instanceof SemVer) { if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) { return version } else { version = version.version } } else if (typeof version !== 'string') { throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`) } if (version.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ) } debug('SemVer', version, options) this.options = options this.loose = !!options.loose // this isn't actually relevant for versions, but keep it so that we // don't run into trouble passing this.options around. this.includePrerelease = !!options.includePrerelease const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) if (!m) { throw new TypeError(`Invalid Version: ${version}`) } this.raw = version // these are actually numbers this.major = +m[1] this.minor = +m[2] this.patch = +m[3] if (this.major > MAX_SAFE_INTEGER || this.major < 0) { throw new TypeError('Invalid major version') } if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { throw new TypeError('Invalid minor version') } if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { throw new TypeError('Invalid patch version') } // numberify any prerelease numeric ids if (!m[4]) { this.prerelease = [] } else { this.prerelease = m[4].split('.').map((id) => { if (/^[0-9]+$/.test(id)) { const num = +id if (num >= 0 && num < MAX_SAFE_INTEGER) { return num } } return id }) } this.build = m[5] ? m[5].split('.') : [] this.format() } format () { this.version = `${this.major}.${this.minor}.${this.patch}` if (this.prerelease.length) { this.version += `-${this.prerelease.join('.')}` } return this.version } toString () { return this.version } compare (other) { debug('SemVer.compare', this.version, this.options, other) if (!(other instanceof SemVer)) { if (typeof other === 'string' && other === this.version) { return 0 } other = new SemVer(other, this.options) } if (other.version === this.version) { return 0 } return this.compareMain(other) || this.comparePre(other) } compareMain (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } return ( compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch) ) } comparePre (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } // NOT having a prerelease is > having one if (this.prerelease.length && !other.prerelease.length) { return -1 } else if (!this.prerelease.length && other.prerelease.length) { return 1 } else if (!this.prerelease.length && !other.prerelease.length) { return 0 } let i = 0 do { const a = this.prerelease[i] const b = other.prerelease[i] debug('prerelease compare', i, a, b) if (a === undefined && b === undefined) { return 0 } else if (b === undefined) { return 1 } else if (a === undefined) { return -1 } else if (a === b) { continue } else { return compareIdentifiers(a, b) } } while (++i) } compareBuild (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } let i = 0 do { const a = this.build[i] const b = other.build[i] debug('prerelease compare', i, a, b) if (a === undefined && b === undefined) { return 0 } else if (b === undefined) { return 1 } else if (a === undefined) { return -1 } else if (a === b) { continue } else { return compareIdentifiers(a, b) } } while (++i) } // preminor will bump the version up to the next minor release, and immediately // down to pre-release. premajor and prepatch work the same way. inc (release, identifier, identifierBase) { switch (release) { case 'premajor': this.prerelease.length = 0 this.patch = 0 this.minor = 0 this.major++ this.inc('pre', identifier, identifierBase) break case 'preminor': this.prerelease.length = 0 this.patch = 0 this.minor++ this.inc('pre', identifier, identifierBase) break case 'prepatch': // If this is already a prerelease, it will bump to the next version // drop any prereleases that might already exist, since they are not // relevant at this point. this.prerelease.length = 0 this.inc('patch', identifier, identifierBase) this.inc('pre', identifier, identifierBase) break // If the input is a non-prerelease version, this acts the same as // prepatch. case 'prerelease': if (this.prerelease.length === 0) { this.inc('patch', identifier, identifierBase) } this.inc('pre', identifier, identifierBase) break case 'major': // If this is a pre-major version, bump up to the same major version. // Otherwise increment major. // 1.0.0-5 bumps to 1.0.0 // 1.1.0 bumps to 2.0.0 if ( this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0 ) { this.major++ } this.minor = 0 this.patch = 0 this.prerelease = [] break case 'minor': // If this is a pre-minor version, bump up to the same minor version. // Otherwise increment minor. // 1.2.0-5 bumps to 1.2.0 // 1.2.1 bumps to 1.3.0 if (this.patch !== 0 || this.prerelease.length === 0) { this.minor++ } this.patch = 0 this.prerelease = [] break case 'patch': // If this is not a pre-release version, it will increment the patch. // If it is a pre-release it will bump up to the same patch version. // 1.2.0-5 patches to 1.2.0 // 1.2.0 patches to 1.2.1 if (this.prerelease.length === 0) { this.patch++ } this.prerelease = [] break // This probably shouldn't be used publicly. // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. case 'pre': { const base = Number(identifierBase) ? 1 : 0 if (!identifier && identifierBase === false) { throw new Error('invalid increment argument: identifier is empty') } if (this.prerelease.length === 0) { this.prerelease = [base] } else { let i = this.prerelease.length while (--i >= 0) { if (typeof this.prerelease[i] === 'number') { this.prerelease[i]++ i = -2 } } if (i === -1) { // didn't increment anything if (identifier === this.prerelease.join('.') && identifierBase === false) { throw new Error('invalid increment argument: identifier already exists') } this.prerelease.push(base) } } if (identifier) { // 1.2.0-beta.1 bumps to 1.2.0-beta.2, // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 let prerelease = [identifier, base] if (identifierBase === false) { prerelease = [identifier] } if (compareIdentifiers(this.prerelease[0], identifier) === 0) { if (isNaN(this.prerelease[1])) { this.prerelease = prerelease } } else { this.prerelease = prerelease } } break } default: throw new Error(`invalid increment argument: ${release}`) } this.raw = this.format() if (this.build.length) { this.raw += `+${this.build.join('.')}` } return this } } module.exports = SemVer /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/functions/major.js": /*!**********************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/functions/major.js ***! \**********************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/@nextcloud/event-bus/node_modules/semver/classes/semver.js") const major = (a, loose) => new SemVer(a, loose).major module.exports = major /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/functions/parse.js": /*!**********************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/functions/parse.js ***! \**********************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/@nextcloud/event-bus/node_modules/semver/classes/semver.js") const parse = (version, options, throwErrors = false) => { if (version instanceof SemVer) { return version } try { return new SemVer(version, options) } catch (er) { if (!throwErrors) { return null } throw er } } module.exports = parse /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/functions/valid.js": /*!**********************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/functions/valid.js ***! \**********************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const parse = __webpack_require__(/*! ./parse */ "./node_modules/@nextcloud/event-bus/node_modules/semver/functions/parse.js") const valid = (version, options) => { const v = parse(version, options) return v ? v.version : null } module.exports = valid /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/constants.js": /*!*************************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/internal/constants.js ***! \*************************************************************************************/ /***/ ((module) => { // Note: this is the semver.org version of the spec that it implements // Not necessarily the package version of this code. const SEMVER_SPEC_VERSION = '2.0.0' const MAX_LENGTH = 256 const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ 9007199254740991 // Max safe segment length for coercion. const MAX_SAFE_COMPONENT_LENGTH = 16 // Max safe length for a build identifier. The max length minus 6 characters for // the shortest version with a build 0.0.0+BUILD. const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6 const RELEASE_TYPES = [ 'major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease', ] module.exports = { MAX_LENGTH, MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_SAFE_INTEGER, RELEASE_TYPES, SEMVER_SPEC_VERSION, FLAG_INCLUDE_PRERELEASE: 0b001, FLAG_LOOSE: 0b010, } /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/debug.js": /*!*********************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/internal/debug.js ***! \*********************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* provided dependency */ var process = __webpack_require__(/*! ./node_modules/process/browser.js */ "./node_modules/process/browser.js"); const debug = ( typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ) ? (...args) => console.error('SEMVER', ...args) : () => {} module.exports = debug /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/identifiers.js": /*!***************************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/internal/identifiers.js ***! \***************************************************************************************/ /***/ ((module) => { const numeric = /^[0-9]+$/ const compareIdentifiers = (a, b) => { const anum = numeric.test(a) const bnum = numeric.test(b) if (anum && bnum) { a = +a b = +b } return a === b ? 0 : (anum && !bnum) ? -1 : (bnum && !anum) ? 1 : a < b ? -1 : 1 } const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) module.exports = { compareIdentifiers, rcompareIdentifiers, } /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/parse-options.js": /*!*****************************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/internal/parse-options.js ***! \*****************************************************************************************/ /***/ ((module) => { // parse out just the options we care about const looseOption = Object.freeze({ loose: true }) const emptyOpts = Object.freeze({ }) const parseOptions = options => { if (!options) { return emptyOpts } if (typeof options !== 'object') { return looseOption } return options } module.exports = parseOptions /***/ }), /***/ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/re.js": /*!******************************************************************************!*\ !*** ./node_modules/@nextcloud/event-bus/node_modules/semver/internal/re.js ***! \******************************************************************************/ /***/ ((module, exports, __webpack_require__) => { const { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_LENGTH, } = __webpack_require__(/*! ./constants */ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/constants.js") const debug = __webpack_require__(/*! ./debug */ "./node_modules/@nextcloud/event-bus/node_modules/semver/internal/debug.js") exports = module.exports = {} // The actual regexps go on exports.re const re = exports.re = [] const safeRe = exports.safeRe = [] const src = exports.src = [] const t = exports.t = {} let R = 0 const LETTERDASHNUMBER = '[a-zA-Z0-9-]' // Replace some greedy regex tokens to prevent regex dos issues. These regex are // used internally via the safeRe object since all inputs in this library get // normalized first to trim and collapse all extra whitespace. The original // regexes are exported for userland consumption and lower level usage. A // future breaking change could export the safer regex only with a note that // all input should have extra whitespace removed. const safeRegexReplacements = [ ['\\s', 1], ['\\d', MAX_LENGTH], [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], ] const makeSafeRegex = (value) => { for (const [token, max] of safeRegexReplacements) { value = value .split(`${token}*`).join(`${token}{0,${max}}`) .split(`${token}+`).join(`${token}{1,${max}}`) } return value } const createToken = (name, value, isGlobal) => { const safe = makeSafeRegex(value) const index = R++ debug(name, index, value) t[name] = index src[index] = value re[index] = new RegExp(value, isGlobal ? 'g' : undefined) safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) } // The following Regular Expressions can be used for tokenizing, // validating, and parsing SemVer version strings. // ## Numeric Identifier // A single `0`, or a non-zero digit followed by zero or more digits. createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') createToken('NUMERICIDENTIFIERLOOSE', '\\d+') // ## Non-numeric Identifier // Zero or more digits, followed by a letter or hyphen, and then zero or // more letters, digits, or hyphens. createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`) // ## Main Version // Three dot-separated numeric identifiers. createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`) createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`) // ## Pre-release Version Identifier // A numeric identifier, or a non-numeric identifier. createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] }|${src[t.NONNUMERICIDENTIFIER]})`) createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] }|${src[t.NONNUMERICIDENTIFIER]})`) // ## Pre-release Version // Hyphen, followed by one or more dot-separated pre-release version // identifiers. createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] }(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] }(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) // ## Build Metadata Identifier // Any combination of digits, letters, or hyphens. createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`) // ## Build Metadata // Plus sign, followed by one or more period-separated build metadata // identifiers. createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] }(?:\\.${src[t.BUILDIDENTIFIER]})*))`) // ## Full Version String // A main version, followed optionally by a pre-release version and // build metadata. // Note that the only major, minor, patch, and pre-release sections of // the version string are capturing groups. The build metadata is not a // capturing group, because it should not ever be used in version // comparison. createToken('FULLPLAIN', `v?${src[t.MAINVERSION] }${src[t.PRERELEASE]}?${ src[t.BUILD]}?`) createToken('FULL', `^${src[t.FULLPLAIN]}$`) // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty // common in the npm registry. createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] }${src[t.PRERELEASELOOSE]}?${ src[t.BUILD]}?`) createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) createToken('GTLT', '((?:<|>)?=?)') // Something like "2.*" or "1.2.x". // Note that "x.x" is a valid xRange identifer, meaning "any version" // Only the first item is strictly required. createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${ src[t.BUILD]}?` + `)?)?`) createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${ src[t.BUILD]}?` + `)?)?`) createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) // Coercion. // Extract anything that could conceivably be a part of a valid semver createToken('COERCEPLAIN', `${'(^|[^\\d])' + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`) createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`) createToken('COERCEFULL', src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`) createToken('COERCERTL', src[t.COERCE], true) createToken('COERCERTLFULL', src[t.COERCEFULL], true) // Tilde ranges. // Meaning is "reasonably at or greater than" createToken('LONETILDE', '(?:~>?)') createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) exports.tildeTrimReplace = '$1~' createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) // Caret ranges. // Meaning is "at least and backwards compatible with" createToken('LONECARET', '(?:\\^)') createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) exports.caretTrimReplace = '$1^' createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) // A simple gt/lt/eq thing, or just "" to indicate "any version" createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) // An expression to strip any whitespace between the gtlt and the thing // it modifies, so that `> 1.2.3` ==> `>1.2.3` createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] }\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) exports.comparatorTrimReplace = '$1$2$3' // Something like `1.2.3 - 1.2.4` // Note that these all use the loose form, because they'll be // checked against either the strict or loose comparator form // later. createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`) createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`) // Star ranges basically just allow anything at all. createToken('STAR', '(<|>)?=?\\s*\\*') // >=0.0.0 is like a star createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$') createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$') /***/ }), /***/ "./node_modules/@nextcloud/l10n/node_modules/@nextcloud/router/dist/index.js": /*!***********************************************************************************!*\ !*** ./node_modules/@nextcloud/l10n/node_modules/@nextcloud/router/dist/index.js ***! \***********************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.generateUrl = exports.generateRemoteUrl = exports.generateOcsUrl = exports.generateFilePath = void 0; exports.getAppRootUrl = getAppRootUrl; exports.getRootUrl = getRootUrl; exports.linkTo = exports.imagePath = void 0; __webpack_require__(/*! core-js/modules/es.string.replace.js */ "./node_modules/core-js/modules/es.string.replace.js"); /** * Get an url with webroot to a file in an app * * @param {string} app the id of the app the file belongs to * @param {string} file the file path relative to the app folder * @return {string} URL with webroot to a file */ const linkTo = (app, file) => generateFilePath(app, '', file); /** * Creates a relative url for remote use * * @param {string} service id * @return {string} the url */ exports.linkTo = linkTo; const linkToRemoteBase = service => getRootUrl() + '/remote.php/' + service; /** * @brief Creates an absolute url for remote use * @param {string} service id * @return {string} the url */ const generateRemoteUrl = service => window.location.protocol + '//' + window.location.host + linkToRemoteBase(service); /** * Get the base path for the given OCS API service * * @param {string} url OCS API service url * @param {object} params parameters to be replaced into the service url * @param {UrlOptions} options options for the parameter replacement * @param {boolean} options.escape Set to false if parameters should not be URL encoded (default true) * @param {Number} options.ocsVersion OCS version to use (defaults to 2) * @return {string} Absolute path for the OCS URL */ exports.generateRemoteUrl = generateRemoteUrl; const generateOcsUrl = (url, params, options) => { const allOptions = Object.assign({ ocsVersion: 2 }, options || {}); const version = allOptions.ocsVersion === 1 ? 1 : 2; return window.location.protocol + '//' + window.location.host + getRootUrl() + '/ocs/v' + version + '.php' + _generateUrlPath(url, params, options); }; exports.generateOcsUrl = generateOcsUrl; /** * Generate a url path, which can contain parameters * * Parameters will be URL encoded automatically * * @param {string} url address (can contain placeholders e.g. /call/{token} would replace {token} with the value of params.token * @param {object} params parameters to be replaced into the address * @param {UrlOptions} options options for the parameter replacement * @return {string} Path part for the given URL */ const _generateUrlPath = (url, params, options) => { const allOptions = Object.assign({ escape: true }, options || {}); const _build = function (text, vars) { vars = vars || {}; return text.replace(/{([^{}]*)}/g, function (a, b) { var r = vars[b]; if (allOptions.escape) { return typeof r === 'string' || typeof r === 'number' ? encodeURIComponent(r.toString()) : encodeURIComponent(a); } else { return typeof r === 'string' || typeof r === 'number' ? r.toString() : a; } }); }; if (url.charAt(0) !== '/') { url = '/' + url; } return _build(url, params || {}); }; /** * Generate the url with webroot for the given relative url, which can contain parameters * * Parameters will be URL encoded automatically * * @param {string} url address (can contain placeholders e.g. /call/{token} would replace {token} with the value of params.token * @param {object} params parameters to be replaced into the url * @param {UrlOptions} options options for the parameter replacement * @param {boolean} options.noRewrite True if you want to force index.php being added * @param {boolean} options.escape Set to false if parameters should not be URL encoded (default true) * @return {string} URL with webroot for the given relative URL */ const generateUrl = (url, params, options) => { var _window; const allOptions = Object.assign({ noRewrite: false }, options || {}); if (((_window = window) === null || _window === void 0 || (_window = _window.OC) === null || _window === void 0 || (_window = _window.config) === null || _window === void 0 ? void 0 : _window.modRewriteWorking) === true && !allOptions.noRewrite) { return getRootUrl() + _generateUrlPath(url, params, options); } return getRootUrl() + '/index.php' + _generateUrlPath(url, params, options); }; /** * Get the path with webroot to an image file * if no extension is given for the image, it will automatically decide * between .png and .svg based on what the browser supports * * @param {string} app the app id to which the image belongs * @param {string} file the name of the image file * @return {string} */ exports.generateUrl = generateUrl; const imagePath = (app, file) => { if (file.indexOf('.') === -1) { //if no extension is given, use svg return generateFilePath(app, 'img', file + '.svg'); } return generateFilePath(app, 'img', file); }; /** * Get the url with webroot for a file in an app * * @param {string} app the id of the app * @param {string} type the type of the file to link to (e.g. css,img,ajax.template) * @param {string} file the filename * @return {string} URL with webroot for a file in an app */ exports.imagePath = imagePath; const generateFilePath = (app, type, file) => { var _window2; const isCore = ((_window2 = window) === null || _window2 === void 0 || (_window2 = _window2.OC) === null || _window2 === void 0 || (_window2 = _window2.coreApps) === null || _window2 === void 0 ? void 0 : _window2.indexOf(app)) !== -1; let link = getRootUrl(); if (file.substring(file.length - 3) === 'php' && !isCore) { link += '/index.php/apps/' + app; if (file !== 'index.php') { link += '/'; if (type) { link += encodeURI(type + '/'); } link += file; } } else if (file.substring(file.length - 3) !== 'php' && !isCore) { link = getAppRootUrl(app); if (type) { link += '/' + type + '/'; } if (link.substring(link.length - 1) !== '/') { link += '/'; } link += file; } else { if ((app === 'settings' || app === 'core' || app === 'search') && type === 'ajax') { link += '/index.php/'; } else { link += '/'; } if (!isCore) { link += 'apps/'; } if (app !== '') { app += '/'; link += app; } if (type) { link += type + '/'; } link += file; } return link; }; /** * Return the web root path where this Nextcloud instance * is accessible, with a leading slash. * For example "/nextcloud". * * @return {string} web root path */ exports.generateFilePath = generateFilePath; function getRootUrl() { let webroot = window._oc_webroot; if (typeof webroot === 'undefined') { webroot = location.pathname; const pos = webroot.indexOf('/index.php/'); if (pos !== -1) { webroot = webroot.substr(0, pos); } else { webroot = webroot.substr(0, webroot.lastIndexOf('/')); } } return webroot; } /** * Return the web root path for a given app * @param {string} app The ID of the app */ function getAppRootUrl(app) { var _window$_oc_appswebro, _webroots$app; const webroots = (_window$_oc_appswebro = window._oc_appswebroots) !== null && _window$_oc_appswebro !== void 0 ? _window$_oc_appswebro : {}; return (_webroots$app = webroots[app]) !== null && _webroots$app !== void 0 ? _webroots$app : ''; } //# sourceMappingURL=index.js.map /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2.use[3]!./css/calendar.scss": /*!***************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2.use[3]!./css/calendar.scss ***! \***************************************************************************************************************************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `@charset "UTF-8"; /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ /** * Calendar App * * @copyright 2016 Raghu Nayyar * @copyright 2018 Georg Ehrke * @copyright 2017 John Molakvoæ * * @author Raghu Nayyar * @author Georg Ehrke * @author John Molakvoæ * @author Richard Steinmetz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ .app-calendar .datepicker-button-section, .app-calendar .today-button-section, .app-calendar .view-button-section { display: flex; } .app-calendar .datepicker-button-section .button, .app-calendar .today-button-section .button, .app-calendar .view-button-section .button { border-radius: 0; font-weight: normal; margin: 0 0 var(--default-grid-baseline) 0; flex-grow: 1; } .app-calendar .datepicker-button-section .button:first-child:not(:only-of-type), .app-calendar .today-button-section .button:first-child:not(:only-of-type), .app-calendar .view-button-section .button:first-child:not(:only-of-type) { border-radius: var(--border-radius-pill) 0 0 var(--border-radius-pill); } .app-calendar .datepicker-button-section .button:last-child:not(:only-of-type), .app-calendar .today-button-section .button:last-child:not(:only-of-type), .app-calendar .view-button-section .button:last-child:not(:only-of-type) { border-radius: 0 var(--border-radius-pill) var(--border-radius-pill) 0; } .app-calendar .datepicker-button-section .button:not(:only-of-type):not(:first-child):not(:last-child), .app-calendar .today-button-section .button:not(:only-of-type):not(:first-child):not(:last-child), .app-calendar .view-button-section .button:not(:only-of-type):not(:first-child):not(:last-child) { border-radius: 0; } .app-calendar .datepicker-button-section .button:only-child, .app-calendar .today-button-section .button:only-child, .app-calendar .view-button-section .button:only-child { border-radius: var(--border-radius-pill); } .app-calendar .datepicker-button-section .button:hover, .app-calendar .datepicker-button-section .button:focus, .app-calendar .datepicker-button-section .button.active, .app-calendar .today-button-section .button:hover, .app-calendar .today-button-section .button:focus, .app-calendar .today-button-section .button.active, .app-calendar .view-button-section .button:hover, .app-calendar .view-button-section .button:focus, .app-calendar .view-button-section .button.active { z-index: 50; } .app-calendar .datepicker-button-section__datepicker-label { flex-grow: 4 !important; text-align: center; } .app-calendar .datepicker-button-section__datepicker { margin-left: 26px; margin-top: 48px; position: absolute !important; width: 0 !important; } .app-calendar .datepicker-button-section__datepicker .mx-input-wrapper { display: none !important; } .app-calendar .datepicker-button-section__previous, .app-calendar .datepicker-button-section__next { background-size: 10px; flex-grow: 0 !important; width: 34px; padding: 0 6px !important; } .app-calendar .app-navigation-header { padding: calc(var(--default-grid-baseline, 4px) * 2); } .app-calendar .new-event-today-view-section { display: flex; } .app-calendar .new-event-today-view-section .button { margin: 0 var(--default-grid-baseline) 0 0; } .app-calendar .new-event-today-view-section .new-event { flex-grow: 5; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } .app-calendar .new-event-today-view-section .today { flex-grow: 1; font-weight: normal !important; } .app-calendar .app-navigation-toggle { background-color: var(--color-main-background) !important; } .app-calendar .app-navigation button.icon-share { opacity: 0.3 !important; } .app-calendar .app-navigation button.icon-shared, .app-calendar .app-navigation button.icon-public { opacity: 0.7 !important; } .app-calendar .app-navigation button.icon-share:active, .app-calendar .app-navigation button.icon-share:focus, .app-calendar .app-navigation button.icon-share:hover, .app-calendar .app-navigation button.icon-shared:active, .app-calendar .app-navigation button.icon-shared:focus, .app-calendar .app-navigation button.icon-shared:hover, .app-calendar .app-navigation button.icon-public:active, .app-calendar .app-navigation button.icon-public:focus, .app-calendar .app-navigation button.icon-public:hover { opacity: 1 !important; } .app-calendar .app-navigation #calendars-list { display: block !important; } .app-calendar .app-navigation li.app-navigation-loading-placeholder-entry div.icon.icon-loading { min-height: 44px; } .app-calendar .app-navigation .app-navigation-entry-wrapper.deleted .app-navigation-entry__name { text-decoration: line-through; } .app-calendar .app-navigation .app-navigation-entry-wrapper.open-sharing { box-shadow: inset 4px 0 var(--color-primary-element) !important; margin-left: -6px; padding-left: 6px; } .app-calendar .app-navigation .app-navigation-entry-wrapper.disabled .app-navigation-entry__name { color: var(--color-text-lighter) !important; } .app-calendar .app-navigation .app-navigation-entry-wrapper .app-navigation-entry__children .app-navigation-entry { padding-left: 0 !important; } .app-calendar .app-navigation .app-navigation-entry-wrapper .app-navigation-entry__children .app-navigation-entry .avatar { width: 32px; height: 32px; background-color: var(--color-border-dark); background-size: 16px; } .app-calendar .app-navigation .app-navigation-entry-wrapper .app-navigation-entry__children .app-navigation-entry .avatar.published { background-color: var(--color-primary-element); color: white; } .app-calendar .app-navigation .app-navigation-entry__multiselect { padding: 0 8px; } .app-calendar .app-navigation .app-navigation-entry__multiselect .multiselect { width: 100%; border-radius: var(--border-radius-large); } .app-calendar .app-navigation .app-navigation-entry__multiselect .multiselect__content-wrapper { z-index: 200 !important; } .app-calendar .app-navigation .app-navigation-entry__utils .action-checkbox__label { padding-right: 0 !important; } .app-calendar .app-navigation .app-navigation-entry__utils .action-checkbox__label::before { margin: 0 4px 0 !important; } .app-calendar .app-navigation .app-navigation-entry-new-calendar .app-navigation-entry__name { color: var(--color-text-maxcontrast) !important; } .app-calendar .app-navigation .app-navigation-entry-new-calendar:hover .app-navigation-entry__name, .app-calendar .app-navigation .app-navigation-entry-new-calendar--open .app-navigation-entry__name { color: var(--color-text-light) !important; } .app-calendar .app-navigation .app-navigation-entry-new-calendar .action-item:not(.action-item--open) .action-item__menutoggle:not(:hover):not(:focus):not(:active) { opacity: 0.5; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section div.multiselect { width: calc(100% - 14px); max-width: none; z-index: 105; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .oneline { white-space: nowrap; position: relative; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList { list-style-type: none; display: flex; flex-direction: column; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li { height: 44px; white-space: normal; display: inline-flex; align-items: center; position: relative; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li .username { padding: 0 8px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup { margin-left: auto; display: flex; align-items: center; white-space: nowrap; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup > a:hover, .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup > a:focus, .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup > .share-menu > a:hover, .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup > .share-menu > a:focus { box-shadow: none !important; opacity: 1 !important; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup > .icon:not(.hidden), .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup > .share-menu .icon:not(.hidden) { padding: 14px; height: 44px; width: 44px; opacity: 0.5; display: block; cursor: pointer; } .app-calendar .app-navigation ul > li.app-navigation-entry-wrapper div.sharing-section .shareWithList > li > .sharingOptionsGroup > .share-menu { position: relative; display: block; } .app-calendar .app-navigation ul .appointment-config-list .app-navigation-caption { margin-top: 22px; } .app-calendar .app-navigation ul .appointment-config-list .app-navigation-entry-link, .app-calendar .app-navigation ul .appointment-config-list .app-navigation-entry-link * { cursor: default; } /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * @author Richard Steinmetz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ .app-calendar .app-sidebar .editor-invitee-list-empty-message, .app-calendar .app-sidebar .editor-reminders-list-empty-message, .app-calendar .app-sidebar .editor-invitee-list-no-email-configured-message, .event-popover .event-popover__inner .editor-invitee-list-empty-message, .event-popover .event-popover__inner .editor-reminders-list-empty-message, .event-popover .event-popover__inner .editor-invitee-list-no-email-configured-message { margin-top: 20px; } .app-calendar .app-sidebar .editor-invitee-list-empty-message__icon, .app-calendar .app-sidebar .editor-reminders-list-empty-message__icon, .app-calendar .app-sidebar .editor-invitee-list-no-email-configured-message__icon, .event-popover .event-popover__inner .editor-invitee-list-empty-message__icon, .event-popover .event-popover__inner .editor-reminders-list-empty-message__icon, .event-popover .event-popover__inner .editor-invitee-list-no-email-configured-message__icon { background-size: 50px; height: 50px; width: 50px; margin: 0 auto; opacity: 0.5; } .app-calendar .app-sidebar .editor-invitee-list-empty-message__caption, .app-calendar .app-sidebar .editor-reminders-list-empty-message__caption, .app-calendar .app-sidebar .editor-invitee-list-no-email-configured-message__caption, .event-popover .event-popover__inner .editor-invitee-list-empty-message__caption, .event-popover .event-popover__inner .editor-reminders-list-empty-message__caption, .event-popover .event-popover__inner .editor-invitee-list-no-email-configured-message__caption { margin-top: 8px; text-align: center; color: var(--color-text-lighter); } .app-calendar .app-sidebar .editor-invitee-list-no-email-configured-message__icon, .event-popover .event-popover__inner .editor-invitee-list-no-email-configured-message__icon { font-size: 50px; line-height: 1em; user-select: none; } .app-calendar .app-sidebar .editor-reminders-list-new-button, .event-popover .event-popover__inner .editor-reminders-list-new-button { width: 100%; background-position-x: 8px; } .app-calendar .app-sidebar .app-sidebar-tab, .event-popover .event-popover__inner .app-sidebar-tab { overflow: unset !important; max-height: unset !important; height: auto !important; } .app-calendar .app-sidebar .app-sidebar-tab__buttons, .event-popover .event-popover__inner .app-sidebar-tab__buttons { position: fixed; bottom: var(--body-container-margin); z-index: 2; width: calc(27vw - 11px); min-width: 289px; max-width: 489px; background-color: var(--color-main-background); border-radius: 0 0 var(--body-container-radius) 0; padding: 0 8px 6px 0; } .app-calendar .app-sidebar .app-sidebar-tab__buttons button, .event-popover .event-popover__inner .app-sidebar-tab__buttons button { width: 100%; height: 44px; } .app-calendar .app-sidebar .app-sidebar-tab__content, .event-popover .event-popover__inner .app-sidebar-tab__content { margin-bottom: 120px; } .app-calendar .app-sidebar .property-title-time-picker-loading-placeholder, .event-popover .event-popover__inner .property-title-time-picker-loading-placeholder { width: 100%; } .app-calendar .app-sidebar .property-title-time-picker-loading-placeholder__icon, .event-popover .event-popover__inner .property-title-time-picker-loading-placeholder__icon { margin: 0 auto; height: 62px; width: 62px; background-size: 62px; } .app-calendar .app-sidebar .app-sidebar__loading-indicator, .event-popover .event-popover__inner .app-sidebar__loading-indicator { width: 100%; margin-top: 20vh; } .app-calendar .app-sidebar .app-sidebar__loading-indicator__icon, .event-popover .event-popover__inner .app-sidebar__loading-indicator__icon { margin: 0 auto; height: 44px; width: 44px; background-size: 44px; } .app-calendar .app-sidebar .repeat-option-set .repeat-option-set-section:not(:first-of-type), .event-popover .event-popover__inner .repeat-option-set .repeat-option-set-section:not(:first-of-type) { margin-top: 20px; } .app-calendar .app-sidebar .repeat-option-set .repeat-option-set-section--on-the-select, .event-popover .event-popover__inner .repeat-option-set .repeat-option-set-section--on-the-select { display: flex; align-items: center; } .app-calendar .app-sidebar .repeat-option-set .repeat-option-set-section--on-the-select .v-select, .event-popover .event-popover__inner .repeat-option-set .repeat-option-set-section--on-the-select .v-select { width: 100%; min-width: 100px !important; } .app-calendar .app-sidebar .repeat-option-set .repeat-option-set-section__title, .event-popover .event-popover__inner .repeat-option-set .repeat-option-set-section__title { list-style: none; } .app-calendar .app-sidebar .repeat-option-set .repeat-option-set-section__grid, .event-popover .event-popover__inner .repeat-option-set .repeat-option-set-section__grid { display: grid; grid-gap: 0; } .app-calendar .app-sidebar .repeat-option-set .repeat-option-set-section__grid .repeat-option-set-section-grid-item, .event-popover .event-popover__inner .repeat-option-set .repeat-option-set-section__grid .repeat-option-set-section-grid-item { padding: 8px; border: 1px solid var(--color-border-dark); text-align: center; margin: 0; border-radius: 0; } .app-calendar .app-sidebar .repeat-option-set--weekly .repeat-option-set-section__grid, .app-calendar .app-sidebar .repeat-option-set--monthly .repeat-option-set-section__grid, .event-popover .event-popover__inner .repeat-option-set--weekly .repeat-option-set-section__grid, .event-popover .event-popover__inner .repeat-option-set--monthly .repeat-option-set-section__grid { grid-template-columns: repeat(7, auto); } .app-calendar .app-sidebar .repeat-option-set--yearly .repeat-option-set-section__grid, .event-popover .event-popover__inner .repeat-option-set--yearly .repeat-option-set-section__grid { grid-template-columns: repeat(4, auto); } .app-calendar .app-sidebar .repeat-option-set--interval-freq, .event-popover .event-popover__inner .repeat-option-set--interval-freq { display: flex; align-items: center; } .app-calendar .app-sidebar .repeat-option-set--interval-freq .multiselect, .app-calendar .app-sidebar .repeat-option-set--interval-freq input[type=number], .event-popover .event-popover__inner .repeat-option-set--interval-freq .multiselect, .event-popover .event-popover__inner .repeat-option-set--interval-freq input[type=number] { min-width: 100px; width: 25%; } .app-calendar .app-sidebar .repeat-option-set--end, .event-popover .event-popover__inner .repeat-option-set--end { margin-top: 20px; display: flex; align-items: center; } .app-calendar .app-sidebar .repeat-option-set--end .repeat-option-end__label, .app-calendar .app-sidebar .repeat-option-set--end .repeat-option-end__end-type-select, .event-popover .event-popover__inner .repeat-option-set--end .repeat-option-end__label, .event-popover .event-popover__inner .repeat-option-set--end .repeat-option-end__end-type-select { display: block; min-width: 160px; width: 25%; } .app-calendar .app-sidebar .repeat-option-set--end .repeat-option-end__until, .event-popover .event-popover__inner .repeat-option-set--end .repeat-option-end__until { min-width: 75px; width: 50%; } .app-calendar .app-sidebar .repeat-option-set--end .repeat-option-end__count, .event-popover .event-popover__inner .repeat-option-set--end .repeat-option-end__count { min-width: 75px; width: 25%; } .app-calendar .app-sidebar .repeat-option-set__label, .event-popover .event-popover__inner .repeat-option-set__label { margin-right: auto; } .app-calendar .app-sidebar .repeat-option-warning, .event-popover .event-popover__inner .repeat-option-warning { text-align: center; } .app-calendar .app-sidebar .property-title-time-picker, .event-popover .event-popover__inner .property-title-time-picker { width: 100%; } .app-calendar .app-sidebar .property-title-time-picker--readonly, .event-popover .event-popover__inner .property-title-time-picker--readonly { display: flex; align-items: center; } .app-calendar .app-sidebar .property-title-time-picker__icon, .event-popover .event-popover__inner .property-title-time-picker__icon { width: 34px; height: 34px; margin-left: -5px; margin-right: 5px; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers, .app-calendar .app-sidebar .property-title-time-picker__all-day, .event-popover .event-popover__inner .property-title-time-picker__time-pickers, .event-popover .event-popover__inner .property-title-time-picker__all-day { display: flex; align-items: center; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers, .event-popover .event-popover__inner .property-title-time-picker__time-pickers { flex-wrap: wrap; justify-content: space-between; gap: 5px; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers .mx-datepicker, .event-popover .event-popover__inner .property-title-time-picker__time-pickers .mx-datepicker { flex: 1 auto; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers .mx-datepicker .mx-input-append, .event-popover .event-popover__inner .property-title-time-picker__time-pickers .mx-datepicker .mx-input-append { background-color: transparent !important; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly { justify-content: start; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper { display: flex; align-items: center; padding: 8px 7px; background-color: var(--color-main-background); color: var(--color-main-text); outline: none; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper--start-date, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper--start-date { padding-right: 0; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper--end-date, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper--end-date { padding-left: 0; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon { margin-left: 8px; height: 16px; width: 16px; opacity: 0.3; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon--highlighted, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon--highlighted { opacity: 0.7; } .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon:focus, .app-calendar .app-sidebar .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon:hover, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon:focus, .event-popover .event-popover__inner .property-title-time-picker__time-pickers--readonly .property-title-time-picker-read-only-wrapper__icon:hover { opacity: 1; } .app-calendar .app-sidebar .property-title-time-picker__all-day, .event-popover .event-popover__inner .property-title-time-picker__all-day { padding-left: 3px; margin-top: 5px; } .app-calendar .app-sidebar .property-title-time-picker__all-day .checkbox-radio-switch__label, .event-popover .event-popover__inner .property-title-time-picker__all-day .checkbox-radio-switch__label { min-height: 32px; } .app-calendar .app-sidebar .property-title-time-picker .datetime-picker-inline-icon, .event-popover .event-popover__inner .property-title-time-picker .datetime-picker-inline-icon { margin-top: 17px; opacity: 0.3; border: none; background-color: transparent; border-radius: 0; padding: 6px !important; } .app-calendar .app-sidebar .property-title-time-picker .datetime-picker-inline-icon--highlighted, .event-popover .event-popover__inner .property-title-time-picker .datetime-picker-inline-icon--highlighted { opacity: 0.7; } .app-calendar .app-sidebar .property-title-time-picker .datetime-picker-inline-icon:focus, .app-calendar .app-sidebar .property-title-time-picker .datetime-picker-inline-icon:hover, .event-popover .event-popover__inner .property-title-time-picker .datetime-picker-inline-icon:focus, .event-popover .event-popover__inner .property-title-time-picker .datetime-picker-inline-icon:hover { opacity: 1; } .app-calendar .app-sidebar .property-alarm-list, .event-popover .event-popover__inner .property-alarm-list { width: 100%; } .app-calendar .app-sidebar .property-alarm-item, .event-popover .event-popover__inner .property-alarm-item { display: flex; align-items: center; min-height: 44px; } .app-calendar .app-sidebar .property-alarm-item__icon, .event-popover .event-popover__inner .property-alarm-item__icon { align-self: flex-start; } .app-calendar .app-sidebar .property-alarm-item__icon--hidden, .event-popover .event-popover__inner .property-alarm-item__icon--hidden { visibility: hidden; } .app-calendar .app-sidebar .property-alarm-item__icon .icon, .event-popover .event-popover__inner .property-alarm-item__icon .icon { width: 34px; height: 44px; margin-left: -5px; margin-right: 5px; } .app-calendar .app-sidebar .property-alarm-item__label, .event-popover .event-popover__inner .property-alarm-item__label { padding: 0 7px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; align-self: center; } .app-calendar .app-sidebar .property-alarm-item__options, .event-popover .event-popover__inner .property-alarm-item__options { margin-left: auto; display: flex; align-items: center; white-space: nowrap; } .app-calendar .app-sidebar .property-alarm-item__edit, .event-popover .event-popover__inner .property-alarm-item__edit { display: flex; align-items: center; width: 100%; min-width: 0; padding-right: 8px; } .app-calendar .app-sidebar .property-alarm-item__edit input[type=number], .event-popover .event-popover__inner .property-alarm-item__edit input[type=number] { width: 4em; } .app-calendar .app-sidebar .property-alarm-item__edit .multiselect, .event-popover .event-popover__inner .property-alarm-item__edit .multiselect { flex: 1 auto; height: 34px; min-width: 0; } .app-calendar .app-sidebar .property-alarm-item__edit .mx-datepicker, .event-popover .event-popover__inner .property-alarm-item__edit .mx-datepicker { flex: 1 auto; } .app-calendar .app-sidebar .property-alarm-item__edit--all-day, .event-popover .event-popover__inner .property-alarm-item__edit--all-day { flex-wrap: wrap; margin-bottom: 5px; gap: 0 5px; } .app-calendar .app-sidebar .property-alarm-item__edit--all-day__distance, .app-calendar .app-sidebar .property-alarm-item__edit--all-day__time, .event-popover .event-popover__inner .property-alarm-item__edit--all-day__distance, .event-popover .event-popover__inner .property-alarm-item__edit--all-day__time { display: flex; flex: 1; align-items: center; } .app-calendar .app-sidebar .property-alarm-item__edit--all-day__distance .multiselect, .event-popover .event-popover__inner .property-alarm-item__edit--all-day__distance .multiselect { width: 6em; } .app-calendar .app-sidebar .property-alarm-item__edit--all-day__time__before-at-label, .event-popover .event-popover__inner .property-alarm-item__edit--all-day__time__before-at-label { flex: 0 0 auto; margin-right: 5px; } .app-calendar .app-sidebar .property-alarm-item__edit--all-day__time .mx-datepicker, .event-popover .event-popover__inner .property-alarm-item__edit--all-day__time .mx-datepicker { width: 7em; } .app-calendar .app-sidebar .property-alarm-item__edit--absolute .mx-datepicker, .event-popover .event-popover__inner .property-alarm-item__edit--absolute .mx-datepicker { width: unset; } .app-calendar .app-sidebar .property-repeat, .event-popover .event-popover__inner .property-repeat { width: 100%; } .app-calendar .app-sidebar .property-repeat__summary, .event-popover .event-popover__inner .property-repeat__summary { display: flex; align-items: center; } .app-calendar .app-sidebar .property-repeat__summary__icon, .event-popover .event-popover__inner .property-repeat__summary__icon { width: 34px; height: 34px; margin-left: -5px; margin-right: 5px; } .app-calendar .app-sidebar .property-repeat__summary__content, .event-popover .event-popover__inner .property-repeat__summary__content { flex: 1 auto; padding: 8px 7px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .app-calendar .app-sidebar .property-repeat__options, .event-popover .event-popover__inner .property-repeat__options { margin-bottom: 5px; } .app-calendar .app-sidebar .resource-list-item, .app-calendar .app-sidebar .invitees-list-item, .event-popover .event-popover__inner .resource-list-item, .event-popover .event-popover__inner .invitees-list-item { display: flex; align-items: center; min-height: 44px; } .app-calendar .app-sidebar .resource-list-item__displayname, .app-calendar .app-sidebar .invitees-list-item__displayname, .event-popover .event-popover__inner .resource-list-item__displayname, .event-popover .event-popover__inner .invitees-list-item__displayname { margin-left: 8px; } .app-calendar .app-sidebar .resource-list-item__actions, .app-calendar .app-sidebar .invitees-list-item__actions, .event-popover .event-popover__inner .resource-list-item__actions, .event-popover .event-popover__inner .invitees-list-item__actions { margin-left: auto; } .app-calendar .app-sidebar .resource-list-item__organizer-hint, .app-calendar .app-sidebar .invitees-list-item__organizer-hint, .event-popover .event-popover__inner .resource-list-item__organizer-hint, .event-popover .event-popover__inner .invitees-list-item__organizer-hint { color: var(--color-text-maxcontrast); font-weight: 300; margin-left: 5px; } .app-calendar .app-sidebar .resource-search__capacity, .event-popover .event-popover__inner .resource-search__capacity { display: flex; align-items: center; } .app-calendar .app-sidebar .resource-search__capacity__actions, .event-popover .event-popover__inner .resource-search__capacity__actions { margin-left: 5px; } .app-calendar .app-sidebar .avatar-participation-status, .event-popover .event-popover__inner .avatar-participation-status { position: relative; height: 38px; width: 38px; } .app-calendar .app-sidebar .avatar-participation-status__indicator, .event-popover .event-popover__inner .avatar-participation-status__indicator { position: absolute; bottom: 0; right: 0; background-size: 10px; height: 15px; width: 15px; border-radius: 50%; } .app-calendar .app-sidebar .avatar-participation-status__indicator.accepted, .event-popover .event-popover__inner .avatar-participation-status__indicator.accepted { background-color: #2fb130; } .app-calendar .app-sidebar .avatar-participation-status__indicator.declined, .event-popover .event-popover__inner .avatar-participation-status__indicator.declined { background-color: #ff0000; } .app-calendar .app-sidebar .avatar-participation-status__indicator.tentative, .event-popover .event-popover__inner .avatar-participation-status__indicator.tentative { background-color: #ffa704; } .app-calendar .app-sidebar .avatar-participation-status__indicator.delegated, .app-calendar .app-sidebar .avatar-participation-status__indicator.no-response, .event-popover .event-popover__inner .avatar-participation-status__indicator.delegated, .event-popover .event-popover__inner .avatar-participation-status__indicator.no-response { background-color: grey; } .app-calendar .app-sidebar .property-text, .app-calendar .app-sidebar .property-select, .app-calendar .app-sidebar .property-color, .app-calendar .app-sidebar .property-select-multiple, .app-calendar .app-sidebar .property-title, .app-calendar .app-sidebar .resource-capacity, .app-calendar .app-sidebar .resource-room-type, .event-popover .event-popover__inner .property-text, .event-popover .event-popover__inner .property-select, .event-popover .event-popover__inner .property-color, .event-popover .event-popover__inner .property-select-multiple, .event-popover .event-popover__inner .property-title, .event-popover .event-popover__inner .resource-capacity, .event-popover .event-popover__inner .resource-room-type { display: flex; width: 100%; align-items: flex-start; } .app-calendar .app-sidebar .property-text__icon, .app-calendar .app-sidebar .property-text__info, .app-calendar .app-sidebar .property-select__icon, .app-calendar .app-sidebar .property-select__info, .app-calendar .app-sidebar .property-color__icon, .app-calendar .app-sidebar .property-color__info, .app-calendar .app-sidebar .property-select-multiple__icon, .app-calendar .app-sidebar .property-select-multiple__info, .app-calendar .app-sidebar .property-title__icon, .app-calendar .app-sidebar .property-title__info, .app-calendar .app-sidebar .resource-capacity__icon, .app-calendar .app-sidebar .resource-capacity__info, .app-calendar .app-sidebar .resource-room-type__icon, .app-calendar .app-sidebar .resource-room-type__info, .event-popover .event-popover__inner .property-text__icon, .event-popover .event-popover__inner .property-text__info, .event-popover .event-popover__inner .property-select__icon, .event-popover .event-popover__inner .property-select__info, .event-popover .event-popover__inner .property-color__icon, .event-popover .event-popover__inner .property-color__info, .event-popover .event-popover__inner .property-select-multiple__icon, .event-popover .event-popover__inner .property-select-multiple__info, .event-popover .event-popover__inner .property-title__icon, .event-popover .event-popover__inner .property-title__info, .event-popover .event-popover__inner .resource-capacity__icon, .event-popover .event-popover__inner .resource-capacity__info, .event-popover .event-popover__inner .resource-room-type__icon, .event-popover .event-popover__inner .resource-room-type__info { height: 34px; width: 34px; } .app-calendar .app-sidebar .property-text__icon--hidden, .app-calendar .app-sidebar .property-select__icon--hidden, .app-calendar .app-sidebar .property-color__icon--hidden, .app-calendar .app-sidebar .property-select-multiple__icon--hidden, .app-calendar .app-sidebar .property-title__icon--hidden, .app-calendar .app-sidebar .resource-capacity__icon--hidden, .app-calendar .app-sidebar .resource-room-type__icon--hidden, .event-popover .event-popover__inner .property-text__icon--hidden, .event-popover .event-popover__inner .property-select__icon--hidden, .event-popover .event-popover__inner .property-color__icon--hidden, .event-popover .event-popover__inner .property-select-multiple__icon--hidden, .event-popover .event-popover__inner .property-title__icon--hidden, .event-popover .event-popover__inner .resource-capacity__icon--hidden, .event-popover .event-popover__inner .resource-room-type__icon--hidden { visibility: hidden; } .app-calendar .app-sidebar .property-text__info, .app-calendar .app-sidebar .property-select__info, .app-calendar .app-sidebar .property-color__info, .app-calendar .app-sidebar .property-select-multiple__info, .app-calendar .app-sidebar .property-title__info, .app-calendar .app-sidebar .resource-capacity__info, .app-calendar .app-sidebar .resource-room-type__info, .event-popover .event-popover__inner .property-text__info, .event-popover .event-popover__inner .property-select__info, .event-popover .event-popover__inner .property-color__info, .event-popover .event-popover__inner .property-select-multiple__info, .event-popover .event-popover__inner .property-title__info, .event-popover .event-popover__inner .resource-capacity__info, .event-popover .event-popover__inner .resource-room-type__info { display: flex; justify-content: center; flex-shrink: 0; opacity: 0.5; } .app-calendar .app-sidebar .property-text__info:hover, .app-calendar .app-sidebar .property-select__info:hover, .app-calendar .app-sidebar .property-color__info:hover, .app-calendar .app-sidebar .property-select-multiple__info:hover, .app-calendar .app-sidebar .property-title__info:hover, .app-calendar .app-sidebar .resource-capacity__info:hover, .app-calendar .app-sidebar .resource-room-type__info:hover, .event-popover .event-popover__inner .property-text__info:hover, .event-popover .event-popover__inner .property-select__info:hover, .event-popover .event-popover__inner .property-color__info:hover, .event-popover .event-popover__inner .property-select-multiple__info:hover, .event-popover .event-popover__inner .property-title__info:hover, .event-popover .event-popover__inner .resource-capacity__info:hover, .event-popover .event-popover__inner .resource-room-type__info:hover { opacity: 1; } .app-calendar .app-sidebar .property-text__icon, .app-calendar .app-sidebar .property-select__icon, .app-calendar .app-sidebar .property-color__icon, .app-calendar .app-sidebar .property-select-multiple__icon, .app-calendar .app-sidebar .property-title__icon, .app-calendar .app-sidebar .resource-capacity__icon, .app-calendar .app-sidebar .resource-room-type__icon, .event-popover .event-popover__inner .property-text__icon, .event-popover .event-popover__inner .property-select__icon, .event-popover .event-popover__inner .property-color__icon, .event-popover .event-popover__inner .property-select-multiple__icon, .event-popover .event-popover__inner .property-title__icon, .event-popover .event-popover__inner .resource-capacity__icon, .event-popover .event-popover__inner .resource-room-type__icon { flex-shrink: 0; margin-left: -5px; margin-right: 5px; } .app-calendar .app-sidebar .property-text__input, .app-calendar .app-sidebar .property-select__input, .app-calendar .app-sidebar .property-color__input, .app-calendar .app-sidebar .property-select-multiple__input, .app-calendar .app-sidebar .property-title__input, .app-calendar .app-sidebar .resource-capacity__input, .app-calendar .app-sidebar .resource-room-type__input, .event-popover .event-popover__inner .property-text__input, .event-popover .event-popover__inner .property-select__input, .event-popover .event-popover__inner .property-color__input, .event-popover .event-popover__inner .property-select-multiple__input, .event-popover .event-popover__inner .property-title__input, .event-popover .event-popover__inner .resource-capacity__input, .event-popover .event-popover__inner .resource-room-type__input { flex-grow: 2; } .app-calendar .app-sidebar .property-text__input textarea, .app-calendar .app-sidebar .property-text__input input, .app-calendar .app-sidebar .property-text__input div.v-select, .app-calendar .app-sidebar .property-select__input textarea, .app-calendar .app-sidebar .property-select__input input, .app-calendar .app-sidebar .property-select__input div.v-select, .app-calendar .app-sidebar .property-color__input textarea, .app-calendar .app-sidebar .property-color__input input, .app-calendar .app-sidebar .property-color__input div.v-select, .app-calendar .app-sidebar .property-select-multiple__input textarea, .app-calendar .app-sidebar .property-select-multiple__input input, .app-calendar .app-sidebar .property-select-multiple__input div.v-select, .app-calendar .app-sidebar .property-title__input textarea, .app-calendar .app-sidebar .property-title__input input, .app-calendar .app-sidebar .property-title__input div.v-select, .app-calendar .app-sidebar .resource-capacity__input textarea, .app-calendar .app-sidebar .resource-capacity__input input, .app-calendar .app-sidebar .resource-capacity__input div.v-select, .app-calendar .app-sidebar .resource-room-type__input textarea, .app-calendar .app-sidebar .resource-room-type__input input, .app-calendar .app-sidebar .resource-room-type__input div.v-select, .event-popover .event-popover__inner .property-text__input textarea, .event-popover .event-popover__inner .property-text__input input, .event-popover .event-popover__inner .property-text__input div.v-select, .event-popover .event-popover__inner .property-select__input textarea, .event-popover .event-popover__inner .property-select__input input, .event-popover .event-popover__inner .property-select__input div.v-select, .event-popover .event-popover__inner .property-color__input textarea, .event-popover .event-popover__inner .property-color__input input, .event-popover .event-popover__inner .property-color__input div.v-select, .event-popover .event-popover__inner .property-select-multiple__input textarea, .event-popover .event-popover__inner .property-select-multiple__input input, .event-popover .event-popover__inner .property-select-multiple__input div.v-select, .event-popover .event-popover__inner .property-title__input textarea, .event-popover .event-popover__inner .property-title__input input, .event-popover .event-popover__inner .property-title__input div.v-select, .event-popover .event-popover__inner .resource-capacity__input textarea, .event-popover .event-popover__inner .resource-capacity__input input, .event-popover .event-popover__inner .resource-capacity__input div.v-select, .event-popover .event-popover__inner .resource-room-type__input textarea, .event-popover .event-popover__inner .resource-room-type__input input, .event-popover .event-popover__inner .resource-room-type__input div.v-select { width: 100%; } .app-calendar .app-sidebar .property-text__input textarea, .app-calendar .app-sidebar .property-select__input textarea, .app-calendar .app-sidebar .property-color__input textarea, .app-calendar .app-sidebar .property-select-multiple__input textarea, .app-calendar .app-sidebar .property-title__input textarea, .app-calendar .app-sidebar .resource-capacity__input textarea, .app-calendar .app-sidebar .resource-room-type__input textarea, .event-popover .event-popover__inner .property-text__input textarea, .event-popover .event-popover__inner .property-select__input textarea, .event-popover .event-popover__inner .property-color__input textarea, .event-popover .event-popover__inner .property-select-multiple__input textarea, .event-popover .event-popover__inner .property-title__input textarea, .event-popover .event-popover__inner .resource-capacity__input textarea, .event-popover .event-popover__inner .resource-room-type__input textarea { max-height: calc(100vh - 500px); vertical-align: top; margin: 0; } .app-calendar .app-sidebar .property-text__input--readonly div, .app-calendar .app-sidebar .property-select__input--readonly div, .app-calendar .app-sidebar .property-color__input--readonly div, .app-calendar .app-sidebar .property-select-multiple__input--readonly div, .app-calendar .app-sidebar .property-title__input--readonly div, .app-calendar .app-sidebar .resource-capacity__input--readonly div, .app-calendar .app-sidebar .resource-room-type__input--readonly div, .event-popover .event-popover__inner .property-text__input--readonly div, .event-popover .event-popover__inner .property-select__input--readonly div, .event-popover .event-popover__inner .property-color__input--readonly div, .event-popover .event-popover__inner .property-select-multiple__input--readonly div, .event-popover .event-popover__inner .property-title__input--readonly div, .event-popover .event-popover__inner .resource-capacity__input--readonly div, .event-popover .event-popover__inner .resource-room-type__input--readonly div { width: calc(100% - 8px); /* for typical (thin) scrollbar size */ white-space: pre-line; padding: 8px 7px; background-color: var(--color-main-background); color: var(--color-main-text); outline: none; overflow-y: scroll; word-break: break-word; /* allows breaking on long URLs */ max-height: 30vh; } .app-calendar .app-sidebar .property-text__input--readonly-calendar-picker div.calendar-picker-option, .app-calendar .app-sidebar .property-select__input--readonly-calendar-picker div.calendar-picker-option, .app-calendar .app-sidebar .property-color__input--readonly-calendar-picker div.calendar-picker-option, .app-calendar .app-sidebar .property-select-multiple__input--readonly-calendar-picker div.calendar-picker-option, .app-calendar .app-sidebar .property-title__input--readonly-calendar-picker div.calendar-picker-option, .app-calendar .app-sidebar .resource-capacity__input--readonly-calendar-picker div.calendar-picker-option, .app-calendar .app-sidebar .resource-room-type__input--readonly-calendar-picker div.calendar-picker-option, .event-popover .event-popover__inner .property-text__input--readonly-calendar-picker div.calendar-picker-option, .event-popover .event-popover__inner .property-select__input--readonly-calendar-picker div.calendar-picker-option, .event-popover .event-popover__inner .property-color__input--readonly-calendar-picker div.calendar-picker-option, .event-popover .event-popover__inner .property-select-multiple__input--readonly-calendar-picker div.calendar-picker-option, .event-popover .event-popover__inner .property-title__input--readonly-calendar-picker div.calendar-picker-option, .event-popover .event-popover__inner .resource-capacity__input--readonly-calendar-picker div.calendar-picker-option, .event-popover .event-popover__inner .resource-room-type__input--readonly-calendar-picker div.calendar-picker-option { padding: 8px 7px; } .app-calendar .app-sidebar .property-text, .app-calendar .app-sidebar .property-select, .app-calendar .app-sidebar .property-color, .app-calendar .app-sidebar .property-select-multiple, .app-calendar .app-sidebar .property-title, .app-calendar .app-sidebar .property-repeat, .app-calendar .app-sidebar .resource-capacity, .app-calendar .app-sidebar .resource-room-type, .event-popover .event-popover__inner .property-text, .event-popover .event-popover__inner .property-select, .event-popover .event-popover__inner .property-color, .event-popover .event-popover__inner .property-select-multiple, .event-popover .event-popover__inner .property-title, .event-popover .event-popover__inner .property-repeat, .event-popover .event-popover__inner .resource-capacity, .event-popover .event-popover__inner .resource-room-type { margin-bottom: 5px; } .app-calendar .app-sidebar .property-text--readonly, .app-calendar .app-sidebar .property-select--readonly, .app-calendar .app-sidebar .property-color--readonly, .app-calendar .app-sidebar .property-select-multiple--readonly, .app-calendar .app-sidebar .property-title--readonly, .app-calendar .app-sidebar .property-repeat--readonly, .app-calendar .app-sidebar .resource-capacity--readonly, .app-calendar .app-sidebar .resource-room-type--readonly, .event-popover .event-popover__inner .property-text--readonly, .event-popover .event-popover__inner .property-select--readonly, .event-popover .event-popover__inner .property-color--readonly, .event-popover .event-popover__inner .property-select-multiple--readonly, .event-popover .event-popover__inner .property-title--readonly, .event-popover .event-popover__inner .property-repeat--readonly, .event-popover .event-popover__inner .resource-capacity--readonly, .event-popover .event-popover__inner .resource-room-type--readonly { margin-bottom: 0; } .app-calendar .app-sidebar .property-select, .app-calendar .app-sidebar .property-select-multiple, .event-popover .event-popover__inner .property-select, .event-popover .event-popover__inner .property-select-multiple { align-items: center; } .app-calendar .app-sidebar .property-select .v-select, .app-calendar .app-sidebar .property-select-multiple .v-select, .event-popover .event-popover__inner .property-select .v-select, .event-popover .event-popover__inner .property-select-multiple .v-select { min-width: unset !important; } .app-calendar .app-sidebar .property-color__input, .event-popover .event-popover__inner .property-color__input { display: flex; gap: 5px; margin-bottom: 5px; } .app-calendar .app-sidebar .property-color__input--readonly, .event-popover .event-popover__inner .property-color__input--readonly { margin: 3px 0 3px 7px; } .app-calendar .app-sidebar .property-color__color-preview, .event-popover .event-popover__inner .property-color__color-preview { width: 44px !important; height: 44px !important; border-radius: 44px; } .app-calendar .app-sidebar .property-text__icon, .event-popover .event-popover__inner .property-text__icon { height: unset; align-self: flex-start; padding-top: 12px; } .app-calendar .app-sidebar .property-text--readonly .property-text__icon, .event-popover .event-popover__inner .property-text--readonly .property-text__icon { padding-top: 10px; } .app-calendar .app-sidebar .property-text__input--readonly, .event-popover .event-popover__inner .property-text__input--readonly { line-height: 1; padding-top: calc(var(--default-line-height) / 2 - 0.5lh); } .app-calendar .app-sidebar .property-text__input textarea, .event-popover .event-popover__inner .property-text__input textarea { resize: none; } .app-calendar .app-sidebar .property-select-multiple .property-select-multiple__input.property-select-multiple__input--readonly, .event-popover .event-popover__inner .property-select-multiple .property-select-multiple__input.property-select-multiple__input--readonly { width: 100%; } .app-calendar .app-sidebar .property-select-multiple .property-select-multiple__input.property-select-multiple__input--readonly .property-select-multiple-colored-tag-wrapper, .event-popover .event-popover__inner .property-select-multiple .property-select-multiple__input.property-select-multiple__input--readonly .property-select-multiple-colored-tag-wrapper { align-items: center; overflow: hidden; max-width: 100%; position: relative; padding: 3px 5px; } .app-calendar .app-sidebar .property-select-multiple .property-select-multiple__input.property-select-multiple__input--readonly .property-select-multiple-colored-tag-wrapper .multiselect__tag, .event-popover .event-popover__inner .property-select-multiple .property-select-multiple__input.property-select-multiple__input--readonly .property-select-multiple-colored-tag-wrapper .multiselect__tag { line-height: 20px; padding: 1px 5px; background-image: none; display: inline-flex; align-items: center; border-radius: 3px; max-width: fit-content; margin: 3px; } .app-calendar .app-sidebar .property-title__input, .app-calendar .app-sidebar .property-title input, .event-popover .event-popover__inner .property-title__input, .event-popover .event-popover__inner .property-title input { font-weight: bold; } .app-calendar .app-sidebar .property-title__input--readonly, .event-popover .event-popover__inner .property-title__input--readonly { font-size: 18px; } .app-calendar .app-sidebar .property-title input, .app-calendar .app-sidebar .property-title-time-picker input, .event-popover .event-popover__inner .property-title input, .event-popover .event-popover__inner .property-title-time-picker input { margin: 0; } .app-calendar .app-sidebar .resource-room-type, .event-popover .event-popover__inner .resource-room-type { margin-bottom: 5px; } .event-popover .event-popover__inner .event-popover__response-buttons { margin-top: 8px; margin-bottom: 0; } .event-popover .event-popover__inner .property-text__icon, .event-popover .event-popover__inner .property-title-time-picker__icon { margin: 0 !important; } .timezone-popover-wrapper .popover__inner { padding: 20px; } .timezone-popover-wrapper__title { margin-bottom: 8px; } .timezone-popover-wrapper__timezone-select { min-width: 200px; } .event-popover .v-popper__inner { overflow: unset !important; } .event-popover .event-popover__inner { text-align: left; max-width: 480px; width: 480px; padding: 5px 10px 10px 10px; } .event-popover .event-popover__inner .empty-content { margin-top: 0 !important; padding: 50px 0; } .event-popover .event-popover__inner .property-title-time-picker:not(.property-title-time-picker--readonly) { margin-bottom: 12px; } .event-popover .event-popover__inner .event-popover__invitees .avatar-participation-status__text { bottom: 22px; } .event-popover .event-popover__inner .event-popover__buttons { margin-top: 8px; } .event-popover .event-popover__inner .event-popover__top-right-actions { display: flex; gap: var(--default-grid-baseline); position: absolute !important; top: var(--default-grid-baseline) !important; right: var(--default-grid-baseline) !important; z-index: 100 !important; opacity: 0.7 !important; border-radius: 22px !important; } .event-popover .event-popover__inner .event-popover__top-right-actions .action-item.action-item--single { width: 44px !important; height: 44px !important; } .event-popover .event-popover__inner .popover-loading-indicator { width: 100%; } .event-popover .event-popover__inner .popover-loading-indicator__icon { margin: 0 auto; height: 62px; width: 62px; background-size: 62px; } .event-popover[x-out-of-boundaries] { margin-top: 75px; } .event-popover[x-placement^=bottom] .popover__arrow { border-bottom-color: var(--color-background-dark); } .calendar-picker-option { display: flex; align-items: center; overflow: hidden; } .calendar-picker-option__color-indicator { width: 12px; height: 12px; border-radius: 50%; border: none; margin-right: 8px; flex-basis: 12px; flex-shrink: 0; } .calendar-picker-option__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex-grow: 1; } .calendar-picker-option__avatar { flex-basis: 18px; flex-shrink: 0; } .property-select-multiple-colored-tag { width: 100%; display: flex; align-items: center; } .property-select-multiple-colored-tag__color-indicator { width: 12px; height: 12px; border-radius: 50%; border: none; margin-right: 8px; flex-shrink: 0; } .property-select-multiple-colored-tag .icon { margin-left: 4px; scale: 0.8; } .resource-list-button-group, .invitees-list-button-group { width: 100%; display: flex; justify-content: space-between; align-items: center; } .resource-list-button-group:not(:empty), .invitees-list-button-group:not(:empty) { margin-top: 20px; } .vs__dropdown-option span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .resource-search-list-item, .invitees-search-list-item { display: flex; align-items: center; width: 100%; padding-right: 32px; } .resource-search-list-item__label, .invitees-search-list-item__label { width: 100%; padding: 0 8px; } .resource-search-list-item__label__availability, .invitees-search-list-item__label__availability { color: var(--color-text-maxcontrast); } .resource-search-list-item__label div, .invitees-search-list-item__label div { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .resource-search-list-item__label div:nth-child(1), .invitees-search-list-item__label div:nth-child(1) { color: var(--color-main-text); } .resource-search-list-item__label div:nth-child(2), .invitees-search-list-item__label div:nth-child(2) { color: var(--color-text-lighter); line-height: 1; } .resource-search__multiselect, .invitees-search__multiselect { width: 100%; } /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ #app-settings .settings-fieldset-interior-item { padding: 5px 0; } #app-settings .settings-fieldset-interior-item .action-checkbox { line-height: unset !important; white-space: unset !important; } #app-settings .settings-fieldset-interior-item .action-checkbox__label::before { margin: 0 6px 3px 3px !important; flex-shrink: 0; } #app-settings .settings-fieldset-interior-item .action-button { min-height: unset !important; } #app-settings .settings-fieldset-interior-item .action-button__icon { margin: 0 6px 3px 3px !important; height: 14px !important; width: 14px !important; background-position: unset !important; } #app-settings .settings-fieldset-interior-item .action-button__longtext { width: unset !important; padding: 0 !important; } #app-settings .settings-fieldset-interior-item__import-button { display: block; text-align: center; background-position-x: 8px; position: relative; } #app-settings .settings-fieldset-interior-item__import-button .material-design-icon { position: absolute; } #app-settings .settings-fieldset-interior-item--slotDuration, #app-settings .settings-fieldset-interior-item--defaultReminder { display: table; } #app-settings .settings-fieldset-interior-item--slotDuration label, #app-settings .settings-fieldset-interior-item--defaultReminder label { display: block; } #app-settings .settings-fieldset-interior-item--slotDuration .multiselect, #app-settings .settings-fieldset-interior-item--defaultReminder .multiselect { display: block; } #app-settings .settings-fieldset-interior-item--timezone, #app-settings .settings-fieldset-interior-item--default-calendar { width: 100%; } #app-settings .settings-fieldset-interior-item--timezone .multiselect, #app-settings .settings-fieldset-interior-item--default-calendar .multiselect { width: 100%; } .shortcut-overview-modal .modal-container { display: flex !important; flex-wrap: wrap; padding: 0 12px 12px 12px !important; } .shortcut-overview-modal .modal-container * { box-sizing: border-box; } .shortcut-overview-modal .modal-container .shortcut-section { width: 50%; flex-grow: 0; flex-shrink: 0; padding: 10px; } .shortcut-overview-modal .modal-container .shortcut-section .shortcut-section-item { width: 100%; display: grid; grid-template-columns: 33% 67%; column-gap: 10px; } .shortcut-overview-modal .modal-container .shortcut-section .shortcut-section-item:not(:first-child) { margin-top: 10px; } .shortcut-overview-modal .modal-container .shortcut-section .shortcut-section-item__keys { display: block; text-align: right; } .shortcut-overview-modal .modal-container .shortcut-section .shortcut-section-item__label { display: block; text-align: left; padding-top: 5px; } .shortcut-overview-modal .modal-container .shortcut-section .shortcut-section-item__spacer { margin: 0 3px; } @media screen and (max-width: 800px) { .shortcut-overview-modal .modal-container .shortcut-section { width: 100%; } } /** * Calendar App * * @copyright 2021 Richard Steinmetz * * @author Richard Steinmetz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ .appointment-config-modal { padding: 2vw; } .appointment-config-modal__form { display: flex; flex-direction: column; width: 100%; } .appointment-config-modal__form fieldset { padding: 20px 0; } .appointment-config-modal__form fieldset header { font-size: 16px; margin-bottom: 3px; } .appointment-config-modal__form .availability-select, .appointment-config-modal__form .calendar-select { display: flex; flex-direction: column; } .appointment-config-modal__form__row--wrapped { display: flex; flex-wrap: wrap; gap: 10px 50px; } .appointment-config-modal__form__row--wrapped > div { flex: 1 200px; } .appointment-config-modal__form__row--local { display: flex; flex-direction: column; } .appointment-config-modal__form__row + .appointment-config-modal__form__row { margin-top: 10px; } .appointment-config-modal__form .multiselect__tags { height: unset !important; margin: 0 !important; } .appointment-config-modal__submit-button { margin-top: 20px; } .app-config-modal-confirmation .empty-content { margin-top: 0 !important; margin-bottom: 20px; } .app-config-modal-confirmation__buttons { display: flex; justify-content: center; gap: 0 10px; } /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ .modal--scheduler { position: relative; } .modal--scheduler .fc-bgevent { opacity: 0.8; } .modal--scheduler .blocking-event-free-busy { border-color: var(--color-primary-element); border-style: solid; border-left-width: 2px; border-right-width: 2px; background-color: transparent !important; opacity: 0.7 !important; z-index: 2; } .modal--scheduler .blocking-event-free-busy.blocking-event-free-busy--first-row { border-radius: var(--border-radius) var(--border-radius) 0 0; border-top-width: 2px; } .modal--scheduler .blocking-event-free-busy.blocking-event-free-busy--last-row { border-radius: 0 0 var(--border-radius) var(--border-radius); border-bottom-width: 2px; } .modal--scheduler .loading-indicator { width: 100%; position: absolute; top: 0; height: 50px; margin-top: 75px; } .freebusy-caption { margin-top: 10px; } .freebusy-caption__calendar-user-types, .freebusy-caption__colors { width: 50%; display: flex; } .freebusy-caption__colors { width: 100%; display: flex; flex-direction: column; padding: 5px; } .freebusy-caption__colors .freebusy-caption-item { display: flex; align-items: center; margin-right: 30px; } .freebusy-caption__colors .freebusy-caption-item__color { height: 1em; width: 2em; display: block; border: 1px solid var(--color-border-dark); opacity: 0.8; } .freebusy-caption__colors .freebusy-caption-item__label { margin-left: 5px; } /** * Calendar App * * @copyright 2020 Georg Ehrke * * @author Georg Ehrke * @author René Gieling * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ /** Override some FullCalendar CSS vars: */ .fc { --fc-small-font-size: 0.875em; --fc-page-bg-color: var(--color-main-background) !important; --fc-neutral-bg-color: var(--color-background-dark) !important; --fc-neutral-text-color: var(--color-text-lighter) !important; --fc-border-color: var(--color-border) !important; --fc-daygrid-event-dot-width: 10px !important; --fc-event-bg-color: var(--color-primary-element); --fc-event-border-color: var(--color-primary-element-text); --fc-event-text-color: var(--color-primary-element-text); --fc-event-selected-overlay-color: var(--color-box-shadow); --fc-event-resizer-thickness: 8px; --fc-event-resizer-dot-total-width: 8px; --fc-event-resizer-dot-border-width: 1px; --fc-non-business-color: var(--color-background-dark); --fc-bg-event-color: var(--color-primary-element); --fc-bg-event-opacity: 0.3; --fc-highlight-color: rgba(188, 232, 241, 0.3); --fc-today-bg-color: var(--color-main-background) !important; --fc-now-indicator-color: red; --fc-list-event-hover-bg-color: var(--color-background-hover) !important; } .fc { font-family: var(--font-face) !important; } .fc-timegrid-axis-frame, .fc-timegrid-slot-label, .fc-col-header-cell a { color: var(--color-text-lighter) !important; } .fc .fc-timegrid-slot-minor { border-top-style: none !important; } .fc-daygrid-day-top { justify-content: center; } .fc-state-highlight.fc-day-number, .fc tbody tr, .fc tbody tr:hover, .fc tbody tr:focus { background: inherit !important; } .fc-day-today.fc-col-header-cell a, .fc-day-today.fc-col-header-cell span { padding: 2px 6px; font-weight: bold; background-color: var(--color-primary-element); color: var(--color-primary-element-text) !important; border-radius: var(--border-radius-pill); } .fc-day-today .fc-event { box-shadow: 0px 0px 0px 1px var(--color-primary-element-light) !important; } .fc-day-today .fc-daygrid-day-top .fc-daygrid-day-number { margin: 4px; width: 24px; height: 24px; text-align: center; font-weight: bold !important; padding: 0 !important; background: var(--color-primary-element); color: var(--color-primary-element-text); border-radius: 50%; } .fc-list-table td { white-space: normal; word-break: break-word; } .fc .fc-list-sticky .fc-list-day > * { z-index: 1; } .fc-list-table .fc-list-day-cushion { padding-left: calc(var(--default-clickable-area) + var(--default-grid-baseline) * 2); } .fc-timeGridWeek-view .fc-col-header-cell.fc-day-today, .fc-timeGridWeek-view .fc-daygrid-day.fc-day-today, .fc-timeGridWeek-view .fc-timegrid-col.fc-day-today, .fc-dayGridMonth-view .fc-col-header-cell.fc-day-today, .fc-dayGridMonth-view .fc-daygrid-day.fc-day-today, .fc-dayGridMonth-view .fc-timegrid-col.fc-day-today { background-color: var(--color-primary-element-light) !important; } .fc-daygrid-day.fc-day.fc-day-other, .fc .fc-daygrid-day.fc-day-today.fc-day-other { background-color: var(--color-background-dark) !important; border: 1px solid var(--color-background-darker); } .fc-daygrid-day.fc-day.fc-day-other .fc-daygrid-day-top, .fc .fc-daygrid-day.fc-day-today.fc-day-other .fc-daygrid-day-top { opacity: 0.6; } .fc-event { padding-left: 3px; } .fc-event.fc-event-nc-task-completed, .fc-event.fc-event-nc-tentative, .fc-event.fc-event-nc-cancelled { opacity: 0.5; } .fc-event.fc-event-nc-task-completed .fc-event-title, .fc-event.fc-event-nc-task-completed .fc-list-event-title, .fc-event.fc-event-nc-cancelled .fc-event-title, .fc-event.fc-event-nc-cancelled .fc-list-event-title { text-decoration: line-through !important; } .fc-event .fc-event-title { text-overflow: ellipsis; } .fc-event .fc-event-nc-alarms .icon-event-reminder { background-color: inherit; background-position: right; position: absolute; top: 0; right: 0; } .fc-event .fc-event-nc-alarms .icon-event-reminder--light { background-image: var(--icon-calendar-reminder-fffffe); } .fc-event .fc-event-nc-alarms .icon-event-reminder--dark { background-image: var(--icon-calendar-reminder-000001); } .fc-event .fc-event-title-container { display: flex; align-content: center; } .fc-event .fc-event-title-container .fc-event-title-checkbox { margin: 4px 4px 0 0; line-height: 1; } .fc-event .fc-list-event-checkbox { margin: 2px 4px 0 -2px; line-height: 1; } .fc-event .fc-daygrid-event-checkbox { margin: 2px 4px 0 4px; line-height: 1; } .fc-event .fc-list-event-location span, .fc-event .fc-list-event-description span { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; white-space: pre-wrap; max-width: 25vw; } @media only screen and (max-width: 767px) { .fc-event .fc-list-event-location, .fc-event .fc-list-event-description { display: none; } } .fc-list-empty .fc-list-empty-cushion { display: none; } .fc-list-empty .empty-content { margin-top: 0 !important; } .fc-col-header-cell { word-break: break-word; white-space: normal; } .fc-timeGridWeek-view .fc-daygrid-more-link { word-break: break-all; white-space: normal; } .fc-timeGridWeek-view .fc-event-main { flex-wrap: wrap; } .fc-v-event { min-height: 4em; } .fc-v-event.fc-timegrid-event-short { min-height: 2em; } .fc-v-event .fc-event-title { white-space: initial; } .fc-dayGridMonth-view .fc-daygrid-more-link { word-break: break-word; white-space: normal; } .fc-dayGridMonth-view .fc-daygrid-day-frame { min-height: 150px !important; } .fc-daygrid-day-events { position: relative !important; } .fc-col-header-cell { padding-top: 10px !important; } .fc-timegrid-axis-cushion { margin-top: 44px; } .fc-timegrid-axis.fc-scrollgrid-shrink { height: 65px; } /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ .toast-calendar-multiline { white-space: pre-wrap; } .content.app-calendar > div.app-content { overflow-x: hidden; } .pending-event .fc-list-event-time { color: black; } .pending-event .fc-list-event-title { color: black; } .pending-event { position: relative; display: inline-block; } .pending-event::before, .pending-event::after { content: ""; position: absolute; left: 0; width: 100%; height: 1px; background: rgb(23, 23, 23); transform: scaleY(0.5); } .pending-event::before { top: 40%; /* First line */ } .pending-event::after { top: 60%; /* Second line */ } /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ .import-modal .modal-container { padding: 24px !important; min-width: 50%; overflow: visible !important; } .import-modal .modal-container .import-modal__title, .import-modal .modal-container .import-modal__subtitle { text-align: center; } .import-modal .modal-container .import-modal__actions { display: flex; gap: 5px; } .import-modal .modal-container .import-modal-file-item { display: flex; padding-top: 10px; } .import-modal .modal-container .import-modal-file-item--header { font-weight: bold; } .import-modal .modal-container .import-modal-file-item__filename { flex: 2 1 0; } .import-modal .modal-container .import-modal-file-item__calendar-select { flex: 1 1 0; } /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ @media print { .app-navigation { display: none; } } /** * Calendar App * * @copyright 2019 Georg Ehrke * * @author Georg Ehrke * @author Richard Steinmetz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ #emptycontent-container #emptycontent { color: #a9a9a9 !important; } .content.app-calendar.app-calendar-public-embedded #embed-header { position: fixed; top: 0; left: 0; height: 50px; width: 100%; box-sizing: border-box; background-color: var(--color-main-background); border-bottom: 1px solid var(--color-border); overflow: visible; z-index: 2000; display: flex; justify-content: space-between; } .content.app-calendar.app-calendar-public-embedded #embed-header .embed-header__date-section, .content.app-calendar.app-calendar-public-embedded #embed-header .embed-header__share-section { display: flex; gap: 5px; } .content.app-calendar.app-calendar-public-embedded #embed-header .view-button-section .button { min-width: 75px; } .content.app-calendar.app-calendar-public-embedded #embed-header .datepicker-button-section__datepicker-label { min-width: 150px; } .content.app-calendar.app-calendar-public-embedded .app-content { margin-top: 44px; } #body-public input#initial-state-calendar-is_embed ~ header#header { display: none; } #body-public .app-calendar-public + footer { border-radius: 0 0 var(--border-radius-large) var(--border-radius-large); } #body-public .app-calendar-public .app-content { height: calc(100% - 65px) !important; } .property-text__input--linkify { flex-basis: min-content; } .linkify-links { border: 2px solid var(--color-border-maxcontrast); border-radius: var(--border-radius-large); cursor: text; width: 100% !important; box-sizing: border-box; padding: 12px; white-space: pre-line; overflow: auto; line-height: normal; word-break: break-word; display: inline-block; vertical-align: top; max-height: 16em; max-height: calc(100vh - 500px); } .linkify-links a.linkified { text-decoration: underline; margin: 0; } .linkify-links a.linkified::after { content: " ↗"; }`, ""]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/runtime/api.js": /*!*****************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/api.js ***! \*****************************************************/ /***/ ((module) => { "use strict"; /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js": /*!**************************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***! \**************************************************************/ /***/ ((module) => { "use strict"; module.exports = function (i) { return i[1]; }; /***/ }), /***/ "./node_modules/dompurify/dist/purify.js": /*!***********************************************!*\ !*** ./node_modules/dompurify/dist/purify.js ***! \***********************************************/ /***/ (function(module) { /*! @license DOMPurify 3.0.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.8/LICENSE */ (function (global, factory) { true ? module.exports = factory() : 0; })(this, (function () { 'use strict'; const { entries, setPrototypeOf, isFrozen, getPrototypeOf, getOwnPropertyDescriptor } = Object; let { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports let { apply, construct } = typeof Reflect !== 'undefined' && Reflect; if (!freeze) { freeze = function freeze(x) { return x; }; } if (!seal) { seal = function seal(x) { return x; }; } if (!apply) { apply = function apply(fun, thisValue, args) { return fun.apply(thisValue, args); }; } if (!construct) { construct = function construct(Func, args) { return new Func(...args); }; } const arrayForEach = unapply(Array.prototype.forEach); const arrayPop = unapply(Array.prototype.pop); const arrayPush = unapply(Array.prototype.push); const stringToLowerCase = unapply(String.prototype.toLowerCase); const stringToString = unapply(String.prototype.toString); const stringMatch = unapply(String.prototype.match); const stringReplace = unapply(String.prototype.replace); const stringIndexOf = unapply(String.prototype.indexOf); const stringTrim = unapply(String.prototype.trim); const regExpTest = unapply(RegExp.prototype.test); const typeErrorCreate = unconstruct(TypeError); /** * Creates a new function that calls the given function with a specified thisArg and arguments. * * @param {Function} func - The function to be wrapped and called. * @returns {Function} A new function that calls the given function with a specified thisArg and arguments. */ function unapply(func) { return function (thisArg) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return apply(func, thisArg, args); }; } /** * Creates a new function that constructs an instance of the given constructor function with the provided arguments. * * @param {Function} func - The constructor function to be wrapped and called. * @returns {Function} A new function that constructs an instance of the given constructor function with the provided arguments. */ function unconstruct(func) { return function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return construct(func, args); }; } /** * Add properties to a lookup table * * @param {Object} set - The set to which elements will be added. * @param {Array} array - The array containing elements to be added to the set. * @param {Function} transformCaseFunc - An optional function to transform the case of each element before adding to the set. * @returns {Object} The modified set with added elements. */ function addToSet(set, array) { let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase; if (setPrototypeOf) { // Make 'in' and truthy checks like Boolean(set.constructor) // independent of any properties defined on Object.prototype. // Prevent prototype setters from intercepting set as a this value. setPrototypeOf(set, null); } let l = array.length; while (l--) { let element = array[l]; if (typeof element === 'string') { const lcElement = transformCaseFunc(element); if (lcElement !== element) { // Config presets (e.g. tags.js, attrs.js) are immutable. if (!isFrozen(array)) { array[l] = lcElement; } element = lcElement; } } set[element] = true; } return set; } /** * Clean up an array to harden against CSPP * * @param {Array} array - The array to be cleaned. * @returns {Array} The cleaned version of the array */ function cleanArray(array) { for (let index = 0; index < array.length; index++) { if (getOwnPropertyDescriptor(array, index) === undefined) { array[index] = null; } } return array; } /** * Shallow clone an object * * @param {Object} object - The object to be cloned. * @returns {Object} A new object that copies the original. */ function clone(object) { const newObject = create(null); for (const [property, value] of entries(object)) { if (getOwnPropertyDescriptor(object, property) !== undefined) { if (Array.isArray(value)) { newObject[property] = cleanArray(value); } else if (value && typeof value === 'object' && value.constructor === Object) { newObject[property] = clone(value); } else { newObject[property] = value; } } } return newObject; } /** * This method automatically checks if the prop is function or getter and behaves accordingly. * * @param {Object} object - The object to look up the getter function in its prototype chain. * @param {String} prop - The property name for which to find the getter function. * @returns {Function} The getter function found in the prototype chain or a fallback function. */ function lookupGetter(object, prop) { while (object !== null) { const desc = getOwnPropertyDescriptor(object, prop); if (desc) { if (desc.get) { return unapply(desc.get); } if (typeof desc.value === 'function') { return unapply(desc.value); } } object = getPrototypeOf(object); } function fallbackValue(element) { console.warn('fallback value for', element); return null; } return fallbackValue; } const html$1 = freeze(['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']); // SVG const svg$1 = freeze(['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']); const svgFilters = freeze(['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']); // List of SVG elements that are disallowed by default. // We still need to know them so that we can do namespace // checks properly in case one wants to add them to // allow-list. const svgDisallowed = freeze(['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']); const mathMl$1 = freeze(['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']); // Similarly to SVG, we want to know all MathML elements, // even those that we disallow by default. const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']); const text = freeze(['#text']); const html = freeze(['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', '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', 'xmlns', 'slot']); const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', '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', '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', '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', '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', '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']); const mathMl = freeze(['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']); const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']); // eslint-disable-next-line unicorn/better-regex const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm); const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm); const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape ); const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i); const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex ); const DOCTYPE_NAME = seal(/^html$/i); var EXPRESSIONS = /*#__PURE__*/Object.freeze({ __proto__: null, MUSTACHE_EXPR: MUSTACHE_EXPR, ERB_EXPR: ERB_EXPR, TMPLIT_EXPR: TMPLIT_EXPR, DATA_ATTR: DATA_ATTR, ARIA_ATTR: ARIA_ATTR, IS_ALLOWED_URI: IS_ALLOWED_URI, IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA, ATTR_WHITESPACE: ATTR_WHITESPACE, DOCTYPE_NAME: DOCTYPE_NAME }); const getGlobal = function getGlobal() { return typeof window === 'undefined' ? null : window; }; /** * Creates a no-op policy for internal use only. * Don't export this function outside this module! * @param {TrustedTypePolicyFactory} trustedTypes The policy factory. * @param {HTMLScriptElement} purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix). * @return {TrustedTypePolicy} The policy created (or null, if Trusted Types * are not supported or creating the policy failed). */ const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) { if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') { return null; } // Allow the callers to control the unique policy name // by adding a data-tt-policy-suffix to the script element with the DOMPurify. // Policy creation with duplicate names throws in Trusted Types. let suffix = null; const ATTR_NAME = 'data-tt-policy-suffix'; if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) { suffix = purifyHostElement.getAttribute(ATTR_NAME); } const policyName = 'dompurify' + (suffix ? '#' + suffix : ''); try { return trustedTypes.createPolicy(policyName, { createHTML(html) { return html; }, createScriptURL(scriptUrl) { return scriptUrl; } }); } catch (_) { // Policy creation failed (most likely another DOMPurify script has // already run). Skip creating the policy, as this will only cause errors // if TT are enforced. console.warn('TrustedTypes policy ' + policyName + ' could not be created.'); return null; } }; function createDOMPurify() { let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal(); const DOMPurify = root => createDOMPurify(root); /** * Version label, exposed for easier checks * if DOMPurify is up to date or not */ DOMPurify.version = '3.0.8'; /** * Array of elements that DOMPurify removed during sanitation. * Empty if nothing was removed. */ DOMPurify.removed = []; if (!window || !window.document || window.document.nodeType !== 9) { // Not running in a browser, provide a factory function // so that you can pass your own Window DOMPurify.isSupported = false; return DOMPurify; } let { document } = window; const originalDocument = document; const currentScript = originalDocument.currentScript; const { DocumentFragment, HTMLTemplateElement, Node, Element, NodeFilter, NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap, HTMLFormElement, DOMParser, trustedTypes } = window; const ElementPrototype = Element.prototype; const cloneNode = lookupGetter(ElementPrototype, 'cloneNode'); const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling'); const getChildNodes = lookupGetter(ElementPrototype, 'childNodes'); const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a // new document created via createHTMLDocument. As per the spec // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries) // a new empty registry is used when creating a template contents owner // document, so we use that as our parent document to ensure nothing // is inherited. if (typeof HTMLTemplateElement === 'function') { const template = document.createElement('template'); if (template.content && template.content.ownerDocument) { document = template.content.ownerDocument; } } let trustedTypesPolicy; let emptyHTML = ''; const { implementation, createNodeIterator, createDocumentFragment, getElementsByTagName } = document; const { importNode } = originalDocument; let hooks = {}; /** * Expose whether this browser supports running the full DOMPurify. */ DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined; const { MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR, DATA_ATTR, ARIA_ATTR, IS_SCRIPT_OR_DATA, ATTR_WHITESPACE } = EXPRESSIONS; let { IS_ALLOWED_URI: IS_ALLOWED_URI$1 } = EXPRESSIONS; /** * We consider the elements and attributes below to be safe. Ideally * don't add any new ones but feel free to remove unwanted ones. */ /* allowed element names */ let ALLOWED_TAGS = null; const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]); /* Allowed attribute names */ let ALLOWED_ATTR = null; const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]); /* * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements. * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements) * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list) * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`. */ let CUSTOM_ELEMENT_HANDLING = Object.seal(create(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 } })); /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */ let FORBID_TAGS = null; /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */ let FORBID_ATTR = null; /* Decide if ARIA attributes are okay */ let ALLOW_ARIA_ATTR = true; /* Decide if custom data attributes are okay */ let ALLOW_DATA_ATTR = true; /* Decide if unknown protocols are okay */ let ALLOW_UNKNOWN_PROTOCOLS = false; /* Decide if self-closing tags in attributes are allowed. * Usually removed due to a mXSS issue in jQuery 3.0 */ let ALLOW_SELF_CLOSE_IN_ATTR = true; /* Output should be safe for common template engines. * This means, DOMPurify removes data attributes, mustaches and ERB */ let SAFE_FOR_TEMPLATES = false; /* Decide if document with ... should be returned */ let WHOLE_DOCUMENT = false; /* Track whether config is already set on this instance of DOMPurify. */ let SET_CONFIG = false; /* Decide if all elements (e.g. style, script) must be children of * document.body. By default, browsers might move them to document.head */ let FORCE_BODY = false; /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html * string (or a TrustedHTML object if Trusted Types are supported). * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead */ let RETURN_DOM = false; /* Decide if a DOM `DocumentFragment` should be returned, instead of a html * string (or a TrustedHTML object if Trusted Types are supported) */ let RETURN_DOM_FRAGMENT = false; /* Try to return a Trusted Type object instead of a string, return a string in * case Trusted Types are not supported */ let RETURN_TRUSTED_TYPE = false; /* Output should be free from DOM clobbering attacks? * This sanitizes markups named with colliding, clobberable built-in DOM APIs. */ let SANITIZE_DOM = true; /* Achieve full DOM Clobbering protection by isolating the namespace of named * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules. * * HTML/DOM spec rules that enable DOM Clobbering: * - Named Access on Window (§7.3.3) * - DOM Tree Accessors (§3.1.5) * - Form Element Parent-Child Relations (§4.10.3) * - Iframe srcdoc / Nested WindowProxies (§4.8.5) * - HTMLCollection (§4.2.10.2) * * Namespace isolation is implemented by prefixing `id` and `name` attributes * with a constant string, i.e., `user-content-` */ let SANITIZE_NAMED_PROPS = false; const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-'; /* Keep element content when removing element? */ let KEEP_CONTENT = true; /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead * of importing it into a new Document and returning a sanitized copy */ let IN_PLACE = false; /* Allow usage of profiles like html, svg and mathMl */ let USE_PROFILES = {}; /* Tags to ignore content of when KEEP_CONTENT is true */ let FORBID_CONTENTS = null; const DEFAULT_FORBID_CONTENTS = addToSet({}, ['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']); /* Tags that are safe for data: URIs */ let DATA_URI_TAGS = null; const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']); /* Attributes safe for values like "javascript:" */ let URI_SAFE_ATTRIBUTES = null; const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']); const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; /* Document namespace */ let NAMESPACE = HTML_NAMESPACE; let IS_EMPTY_INPUT = false; /* Allowed XHTML+XML namespaces */ let ALLOWED_NAMESPACES = null; const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString); /* Parsing of strict XHTML documents */ let PARSER_MEDIA_TYPE = null; const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html']; const DEFAULT_PARSER_MEDIA_TYPE = 'text/html'; let transformCaseFunc = null; /* Keep a reference to config to pass to hooks */ let CONFIG = null; /* Ideally, do not touch anything below this line */ /* ______________________________________________ */ const formElement = document.createElement('form'); const isRegexOrFunction = function isRegexOrFunction(testValue) { return testValue instanceof RegExp || testValue instanceof Function; }; /** * _parseConfig * * @param {Object} cfg optional config literal */ // eslint-disable-next-line complexity const _parseConfig = function _parseConfig() { let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (CONFIG && CONFIG === cfg) { return; } /* Shield configuration object from tampering */ if (!cfg || typeof cfg !== 'object') { cfg = {}; } /* Shield configuration object from prototype pollution */ cfg = clone(cfg); PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is. transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase; /* Set configuration parameters */ ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS; ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR; ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES; URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent transformCaseFunc // eslint-disable-line indent ) // eslint-disable-line indent : DEFAULT_URI_SAFE_ATTRIBUTES; DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent transformCaseFunc // eslint-disable-line indent ) // eslint-disable-line indent : DEFAULT_DATA_URI_TAGS; FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS; FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {}; FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {}; USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false; ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false RETURN_DOM = cfg.RETURN_DOM || false; // Default false RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false FORCE_BODY = cfg.FORCE_BODY || false; // Default false SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true IN_PLACE = cfg.IN_PLACE || false; // Default false IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI; NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE; CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {}; if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) { CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck; } if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) { CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck; } if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') { CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements; } if (SAFE_FOR_TEMPLATES) { ALLOW_DATA_ATTR = false; } if (RETURN_DOM_FRAGMENT) { RETURN_DOM = true; } /* Parse profile info */ if (USE_PROFILES) { ALLOWED_TAGS = addToSet({}, text); ALLOWED_ATTR = []; if (USE_PROFILES.html === true) { addToSet(ALLOWED_TAGS, html$1); addToSet(ALLOWED_ATTR, html); } if (USE_PROFILES.svg === true) { addToSet(ALLOWED_TAGS, svg$1); addToSet(ALLOWED_ATTR, svg); addToSet(ALLOWED_ATTR, xml); } if (USE_PROFILES.svgFilters === true) { addToSet(ALLOWED_TAGS, svgFilters); addToSet(ALLOWED_ATTR, svg); addToSet(ALLOWED_ATTR, xml); } if (USE_PROFILES.mathMl === true) { addToSet(ALLOWED_TAGS, mathMl$1); addToSet(ALLOWED_ATTR, mathMl); addToSet(ALLOWED_ATTR, xml); } } /* Merge configuration parameters */ if (cfg.ADD_TAGS) { if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) { ALLOWED_TAGS = clone(ALLOWED_TAGS); } addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc); } if (cfg.ADD_ATTR) { if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) { ALLOWED_ATTR = clone(ALLOWED_ATTR); } addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc); } if (cfg.ADD_URI_SAFE_ATTR) { addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc); } if (cfg.FORBID_CONTENTS) { if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) { FORBID_CONTENTS = clone(FORBID_CONTENTS); } addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc); } /* Add #text in case KEEP_CONTENT is set to true */ if (KEEP_CONTENT) { ALLOWED_TAGS['#text'] = true; } /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */ if (WHOLE_DOCUMENT) { addToSet(ALLOWED_TAGS, ['html', 'head', 'body']); } /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */ if (ALLOWED_TAGS.table) { addToSet(ALLOWED_TAGS, ['tbody']); delete FORBID_TAGS.tbody; } if (cfg.TRUSTED_TYPES_POLICY) { if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') { throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); } if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') { throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); } // Overwrite existing TrustedTypes policy. trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY; // Sign local variables required by `sanitize`. emptyHTML = trustedTypesPolicy.createHTML(''); } else { // Uninitialized policy, attempt to initialize the internal dompurify policy. if (trustedTypesPolicy === undefined) { trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript); } // If creating the internal policy succeeded sign internal variables. if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') { emptyHTML = trustedTypesPolicy.createHTML(''); } } // Prevent further manipulation of configuration. // Not available in IE8, Safari 5, etc. if (freeze) { freeze(cfg); } CONFIG = cfg; }; const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML // namespace. We need to specify them explicitly // so that they don't get erroneously deleted from // HTML namespace. const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']); /* Keep track of all possible SVG and MathML tags * so that we can perform the namespace checks * correctly. */ const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]); const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]); /** * @param {Element} element a DOM element whose namespace is being checked * @returns {boolean} Return false if the element has a * namespace that a spec-compliant parser would never * return. Return true otherwise. */ const _checkValidNamespace = function _checkValidNamespace(element) { let parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode // can be null. We just simulate parent in this case. if (!parent || !parent.tagName) { parent = { namespaceURI: NAMESPACE, tagName: 'template' }; } const tagName = stringToLowerCase(element.tagName); const parentTagName = stringToLowerCase(parent.tagName); if (!ALLOWED_NAMESPACES[element.namespaceURI]) { return false; } if (element.namespaceURI === SVG_NAMESPACE) { // The only way to switch from HTML namespace to SVG // is via . If it happens via any other tag, then // it should be killed. if (parent.namespaceURI === HTML_NAMESPACE) { return tagName === 'svg'; } // The only way to switch from MathML to SVG is via` // svg if parent is either or MathML // text integration points. if (parent.namespaceURI === MATHML_NAMESPACE) { return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]); } // We only allow elements that are defined in SVG // spec. All others are disallowed in SVG namespace. return Boolean(ALL_SVG_TAGS[tagName]); } if (element.namespaceURI === MATHML_NAMESPACE) { // The only way to switch from HTML namespace to MathML // is via . If it happens via any other tag, then // it should be killed. if (parent.namespaceURI === HTML_NAMESPACE) { return tagName === 'math'; } // The only way to switch from SVG to MathML is via // and HTML integration points if (parent.namespaceURI === SVG_NAMESPACE) { return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName]; } // We only allow elements that are defined in MathML // spec. All others are disallowed in MathML namespace. return Boolean(ALL_MATHML_TAGS[tagName]); } if (element.namespaceURI === HTML_NAMESPACE) { // The only way to switch from SVG to HTML is via // HTML integration points, and from MathML to HTML // is via MathML text integration points if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) { return false; } if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) { return false; } // We disallow tags that are specific for MathML // or SVG and should never appear in HTML namespace return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]); } // For XHTML and XML documents that support custom namespaces if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) { return true; } // The code should never reach this place (this means // that the element somehow got namespace that is not // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES). // Return false just in case. return false; }; /** * _forceRemove * * @param {Node} node a DOM node */ const _forceRemove = function _forceRemove(node) { arrayPush(DOMPurify.removed, { element: node }); try { // eslint-disable-next-line unicorn/prefer-dom-node-remove node.parentNode.removeChild(node); } catch (_) { node.remove(); } }; /** * _removeAttribute * * @param {String} name an Attribute name * @param {Node} node a DOM node */ const _removeAttribute = function _removeAttribute(name, node) { try { arrayPush(DOMPurify.removed, { attribute: node.getAttributeNode(name), from: node }); } catch (_) { arrayPush(DOMPurify.removed, { attribute: null, from: node }); } node.removeAttribute(name); // We void attribute values for unremovable "is"" attributes if (name === 'is' && !ALLOWED_ATTR[name]) { if (RETURN_DOM || RETURN_DOM_FRAGMENT) { try { _forceRemove(node); } catch (_) {} } else { try { node.setAttribute(name, ''); } catch (_) {} } } }; /** * _initDocument * * @param {String} dirty a string of dirty markup * @return {Document} a DOM, filled with the dirty markup */ const _initDocument = function _initDocument(dirty) { /* Create a HTML document */ let doc = null; let leadingWhitespace = null; if (FORCE_BODY) { dirty = '' + dirty; } else { /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */ const matches = stringMatch(dirty, /^[\r\n\t ]+/); leadingWhitespace = matches && matches[0]; } if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) { // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict) dirty = '' + dirty + ''; } const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty; /* * Use the DOMParser API by default, fallback later if needs be * DOMParser not work for svg when has multiple root element. */ if (NAMESPACE === HTML_NAMESPACE) { try { doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE); } catch (_) {} } /* Use createHTMLDocument in case DOMParser is not available */ if (!doc || !doc.documentElement) { doc = implementation.createDocument(NAMESPACE, 'template', null); try { doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload; } catch (_) { // Syntax error if dirtyPayload is invalid xml } } const body = doc.body || doc.documentElement; if (dirty && leadingWhitespace) { body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null); } /* Work on whole document or just its body */ if (NAMESPACE === HTML_NAMESPACE) { return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0]; } return WHOLE_DOCUMENT ? doc.documentElement : body; }; /** * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document. * * @param {Node} root The root element or node to start traversing on. * @return {NodeIterator} The created NodeIterator */ const _createNodeIterator = function _createNodeIterator(root) { return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null); }; /** * _isClobbered * * @param {Node} elm element to check for clobbering attacks * @return {Boolean} true if clobbered, false if safe */ const _isClobbered = function _isClobbered(elm) { return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function' || typeof elm.hasChildNodes !== 'function'); }; /** * Checks whether the given object is a DOM node. * * @param {Node} object object to check whether it's a DOM node * @return {Boolean} true is object is a DOM node */ const _isNode = function _isNode(object) { return typeof Node === 'function' && object instanceof Node; }; /** * _executeHook * Execute user configurable hooks * * @param {String} entryPoint Name of the hook's entry point * @param {Node} currentNode node to work on with the hook * @param {Object} data additional hook parameters */ const _executeHook = function _executeHook(entryPoint, currentNode, data) { if (!hooks[entryPoint]) { return; } arrayForEach(hooks[entryPoint], hook => { hook.call(DOMPurify, currentNode, data, CONFIG); }); }; /** * _sanitizeElements * * @protect nodeName * @protect textContent * @protect removeChild * * @param {Node} currentNode to check for permission to exist * @return {Boolean} true if node was killed, false if left alive */ const _sanitizeElements = function _sanitizeElements(currentNode) { let content = null; /* Execute a hook if present */ _executeHook('beforeSanitizeElements', currentNode, null); /* Check if element is clobbered or can clobber */ if (_isClobbered(currentNode)) { _forceRemove(currentNode); return true; } /* Now let's check the element's type and name */ const tagName = transformCaseFunc(currentNode.nodeName); /* Execute a hook if present */ _executeHook('uponSanitizeElement', currentNode, { tagName, allowedTags: ALLOWED_TAGS }); /* Detect mXSS attempts abusing namespace confusion */ if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) { _forceRemove(currentNode); return true; } /* Remove element if anything forbids its presence */ if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { /* Check if we have a custom element to handle */ if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) { if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) { return false; } if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) { return false; } } /* Keep content except for bad-listed elements */ if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) { const parentNode = getParentNode(currentNode) || currentNode.parentNode; const childNodes = getChildNodes(currentNode) || currentNode.childNodes; if (childNodes && parentNode) { const childCount = childNodes.length; for (let i = childCount - 1; i >= 0; --i) { parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode)); } } } _forceRemove(currentNode); return true; } /* Check whether element has a valid namespace */ if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) { _forceRemove(currentNode); return true; } /* Make sure that older browsers don't get fallback-tag mXSS */ if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\/no(script|embed|frames)/i, currentNode.innerHTML)) { _forceRemove(currentNode); return true; } /* Sanitize element content to be template-safe */ if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) { /* Get the element's text content */ content = currentNode.textContent; arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { content = stringReplace(content, expr, ' '); }); if (currentNode.textContent !== content) { arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() }); currentNode.textContent = content; } } /* Execute a hook if present */ _executeHook('afterSanitizeElements', currentNode, null); return false; }; /** * _isValidAttribute * * @param {string} lcTag Lowercase tag name of containing element. * @param {string} lcName Lowercase attribute name. * @param {string} value Attribute value. * @return {Boolean} Returns true if `value` is valid, otherwise false. */ // eslint-disable-next-line complexity const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) { /* Make sure attribute cannot clobber */ if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) { return false; } /* Allow valid data-* attributes: At least one character after "-" (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes) XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804) We don't need to check the value; it's always URI safe. */ if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) { if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || // Alternative, second condition checks if it's an `is`-attribute, AND // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else { return false; } /* Check value is safe. First, is attr inert? If so, is safe */ } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) { return false; } else ; return true; }; /** * _isBasicCustomElement * checks if at least one dash is included in tagName, and it's not the first char * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name * * @param {string} tagName name of the tag of the node to sanitize * @returns {boolean} Returns true if the tag name meets the basic criteria for a custom element, otherwise false. */ const _isBasicCustomElement = function _isBasicCustomElement(tagName) { return tagName.indexOf('-') > 0; }; /** * _sanitizeAttributes * * @protect attributes * @protect nodeName * @protect removeAttribute * @protect setAttribute * * @param {Node} currentNode to sanitize */ const _sanitizeAttributes = function _sanitizeAttributes(currentNode) { /* Execute a hook if present */ _executeHook('beforeSanitizeAttributes', currentNode, null); const { attributes } = currentNode; /* Check if we have attributes; if not we might have a text node */ if (!attributes) { return; } const hookEvent = { attrName: '', attrValue: '', keepAttr: true, allowedAttributes: ALLOWED_ATTR }; let l = attributes.length; /* Go backwards over all attributes; safely remove bad ones */ while (l--) { const attr = attributes[l]; const { name, namespaceURI, value: attrValue } = attr; const lcName = transformCaseFunc(name); let value = name === 'value' ? attrValue : stringTrim(attrValue); /* Execute a hook if present */ hookEvent.attrName = lcName; hookEvent.attrValue = value; hookEvent.keepAttr = true; hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set _executeHook('uponSanitizeAttribute', currentNode, hookEvent); value = hookEvent.attrValue; /* Did the hooks approve of the attribute? */ if (hookEvent.forceKeepAttr) { continue; } /* Remove attribute */ _removeAttribute(name, currentNode); /* Did the hooks approve of the attribute? */ if (!hookEvent.keepAttr) { continue; } /* Work around a security issue in jQuery 3.0 */ if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) { _removeAttribute(name, currentNode); continue; } /* Sanitize attribute content to be template-safe */ if (SAFE_FOR_TEMPLATES) { arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { value = stringReplace(value, expr, ' '); }); } /* Is `value` valid for this attribute? */ const lcTag = transformCaseFunc(currentNode.nodeName); if (!_isValidAttribute(lcTag, lcName, value)) { continue; } /* Full DOM Clobbering protection via namespace isolation, * Prefix id and name attributes with `user-content-` */ if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) { // Remove the attribute with this value _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value value = SANITIZE_NAMED_PROPS_PREFIX + value; } /* Handle attributes that require Trusted Types */ if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') { if (namespaceURI) ; else { switch (trustedTypes.getAttributeType(lcTag, lcName)) { case 'TrustedHTML': { value = trustedTypesPolicy.createHTML(value); break; } case 'TrustedScriptURL': { value = trustedTypesPolicy.createScriptURL(value); break; } } } } /* Handle invalid data-* attribute set by try-catching it */ try { if (namespaceURI) { currentNode.setAttributeNS(namespaceURI, name, value); } else { /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */ currentNode.setAttribute(name, value); } arrayPop(DOMPurify.removed); } catch (_) {} } /* Execute a hook if present */ _executeHook('afterSanitizeAttributes', currentNode, null); }; /** * _sanitizeShadowDOM * * @param {DocumentFragment} fragment to iterate over recursively */ const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) { let shadowNode = null; const shadowIterator = _createNodeIterator(fragment); /* Execute a hook if present */ _executeHook('beforeSanitizeShadowDOM', fragment, null); while (shadowNode = shadowIterator.nextNode()) { /* Execute a hook if present */ _executeHook('uponSanitizeShadowNode', shadowNode, null); /* Sanitize tags and elements */ if (_sanitizeElements(shadowNode)) { continue; } /* Deep shadow DOM detected */ if (shadowNode.content instanceof DocumentFragment) { _sanitizeShadowDOM(shadowNode.content); } /* Check attributes, sanitize if necessary */ _sanitizeAttributes(shadowNode); } /* Execute a hook if present */ _executeHook('afterSanitizeShadowDOM', fragment, null); }; /** * Sanitize * Public method providing core sanitation functionality * * @param {String|Node} dirty string or DOM node * @param {Object} cfg object */ // eslint-disable-next-line complexity DOMPurify.sanitize = function (dirty) { let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let body = null; let importedNode = null; let currentNode = null; let returnNode = null; /* Make sure we have a string to sanitize. DO NOT return early, as this will return the wrong type if the user has requested a DOM object rather than a string */ IS_EMPTY_INPUT = !dirty; if (IS_EMPTY_INPUT) { dirty = ''; } /* Stringify, in case dirty is an object */ if (typeof dirty !== 'string' && !_isNode(dirty)) { if (typeof dirty.toString === 'function') { dirty = dirty.toString(); if (typeof dirty !== 'string') { throw typeErrorCreate('dirty is not a string, aborting'); } } else { throw typeErrorCreate('toString is not a function'); } } /* Return dirty HTML if DOMPurify cannot run */ if (!DOMPurify.isSupported) { return dirty; } /* Assign config vars */ if (!SET_CONFIG) { _parseConfig(cfg); } /* Clean up removed elements */ DOMPurify.removed = []; /* Check if dirty is correctly typed for IN_PLACE */ if (typeof dirty === 'string') { IN_PLACE = false; } if (IN_PLACE) { /* Do some early pre-sanitization to avoid unsafe root nodes */ if (dirty.nodeName) { const tagName = transformCaseFunc(dirty.nodeName); if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place'); } } } else if (dirty instanceof Node) { /* If dirty is a DOM element, append to an empty document to avoid elements being stripped by the parser */ body = _initDocument(''); importedNode = body.ownerDocument.importNode(dirty, true); if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') { /* Node is already a body, use as is */ body = importedNode; } else if (importedNode.nodeName === 'HTML') { body = importedNode; } else { // eslint-disable-next-line unicorn/prefer-dom-node-append body.appendChild(importedNode); } } else { /* Exit directly if we have nothing to do */ if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes dirty.indexOf('<') === -1) { return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty; } /* Initialize the document to work on */ body = _initDocument(dirty); /* Check we have a DOM node from the data */ if (!body) { return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : ''; } } /* Remove first element node (ours) if FORCE_BODY is set */ if (body && FORCE_BODY) { _forceRemove(body.firstChild); } /* Get node iterator */ const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body); /* Now start iterating over the created document */ while (currentNode = nodeIterator.nextNode()) { /* Sanitize tags and elements */ if (_sanitizeElements(currentNode)) { continue; } /* Shadow DOM detected, sanitize it */ if (currentNode.content instanceof DocumentFragment) { _sanitizeShadowDOM(currentNode.content); } /* Check attributes, sanitize if necessary */ _sanitizeAttributes(currentNode); } /* If we sanitized `dirty` in-place, return it. */ if (IN_PLACE) { return dirty; } /* Return sanitized string or DOM */ if (RETURN_DOM) { if (RETURN_DOM_FRAGMENT) { returnNode = createDocumentFragment.call(body.ownerDocument); while (body.firstChild) { // eslint-disable-next-line unicorn/prefer-dom-node-append returnNode.appendChild(body.firstChild); } } else { returnNode = body; } if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) { /* AdoptNode() is not used because internal state is not reset (e.g. the past names map of a HTMLFormElement), this is safe in theory but we would rather not risk another attack vector. The state that is cloned by importNode() is explicitly defined by the specs. */ returnNode = importNode.call(originalDocument, returnNode, true); } return returnNode; } let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML; /* Serialize doctype if allowed */ if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) { serializedHTML = '\n' + serializedHTML; } /* Sanitize final string template-safe */ if (SAFE_FOR_TEMPLATES) { arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { serializedHTML = stringReplace(serializedHTML, expr, ' '); }); } return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML; }; /** * Public method to set the configuration once * setConfig * * @param {Object} cfg configuration object */ DOMPurify.setConfig = function () { let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _parseConfig(cfg); SET_CONFIG = true; }; /** * Public method to remove the configuration * clearConfig * */ DOMPurify.clearConfig = function () { CONFIG = null; SET_CONFIG = false; }; /** * Public method to check if an attribute value is valid. * Uses last set config, if any. Otherwise, uses config defaults. * isValidAttribute * * @param {String} tag Tag name of containing element. * @param {String} attr Attribute name. * @param {String} value Attribute value. * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false. */ DOMPurify.isValidAttribute = function (tag, attr, value) { /* Initialize shared config vars if necessary. */ if (!CONFIG) { _parseConfig({}); } const lcTag = transformCaseFunc(tag); const lcName = transformCaseFunc(attr); return _isValidAttribute(lcTag, lcName, value); }; /** * AddHook * Public method to add DOMPurify hooks * * @param {String} entryPoint entry point for the hook to add * @param {Function} hookFunction function to execute */ DOMPurify.addHook = function (entryPoint, hookFunction) { if (typeof hookFunction !== 'function') { return; } hooks[entryPoint] = hooks[entryPoint] || []; arrayPush(hooks[entryPoint], hookFunction); }; /** * RemoveHook * Public method to remove a DOMPurify hook at a given entryPoint * (pops it from the stack of hooks if more are present) * * @param {String} entryPoint entry point for the hook to remove * @return {Function} removed(popped) hook */ DOMPurify.removeHook = function (entryPoint) { if (hooks[entryPoint]) { return arrayPop(hooks[entryPoint]); } }; /** * RemoveHooks * Public method to remove all DOMPurify hooks at a given entryPoint * * @param {String} entryPoint entry point for the hooks to remove */ DOMPurify.removeHooks = function (entryPoint) { if (hooks[entryPoint]) { hooks[entryPoint] = []; } }; /** * RemoveAllHooks * Public method to remove all DOMPurify hooks */ DOMPurify.removeAllHooks = function () { hooks = {}; }; return DOMPurify; } var purify = createDOMPurify(); return purify; })); //# sourceMappingURL=purify.js.map /***/ }), /***/ "./node_modules/escape-html/index.js": /*!*******************************************!*\ !*** ./node_modules/escape-html/index.js ***! \*******************************************/ /***/ ((module) => { "use strict"; /*! * escape-html * Copyright(c) 2012-2013 TJ Holowaychuk * Copyright(c) 2015 Andreas Lubbe * Copyright(c) 2015 Tiancheng "Timothy" Gu * MIT Licensed */ /** * Module variables. * @private */ var matchHtmlRegExp = /["'&<>]/; /** * Module exports. * @public */ module.exports = escapeHtml; /** * Escape special characters in the given string of html. * * @param {string} string The string to escape for inserting into HTML * @return {string} * @public */ function escapeHtml(string) { var str = '' + string; var match = matchHtmlRegExp.exec(str); if (!match) { return str; } var escape; var html = ''; var index = 0; var lastIndex = 0; for (index = match.index; index < str.length; index++) { switch (str.charCodeAt(index)) { case 34: // " escape = '"'; break; case 38: // & escape = '&'; break; case 39: // ' escape = '''; break; case 60: // < escape = '<'; break; case 62: // > escape = '>'; break; default: continue; } if (lastIndex !== index) { html += str.substring(lastIndex, index); } lastIndex = index + 1; html += escape; } return lastIndex !== index ? html + str.substring(lastIndex, index) : html; } /***/ }), /***/ "./node_modules/process/browser.js": /*!*****************************************!*\ !*** ./node_modules/process/browser.js ***! \*****************************************/ /***/ ((module) => { // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout () { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } } ()) function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch(e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch(e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; /***/ }), /***/ "./css/calendar.scss": /*!***************************!*\ !*** ./css/calendar.scss ***! \***************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // style-loader: Adds some css to the DOM by adding a