Extended モードでギャラリーの全タグを取得し、他の標準レイアウトを再現。
// ==UserScript==
// @name Eh View Refined
// @name:zh-TW Eh View Refined
// @name:zh-CN Eh View Refined
// @name:ja Eh View Refined
// @name:ko Eh View Refined
// @namespace https://github.com/Tsuyumi25
// @version 0.1.1
// @author tsuyumi
// @description Get complete gallery tags in Extended mode and simulate other native layouts.
// @description:zh-TW 以 Extended 模式取得完整圖庫標籤,並模擬成其他原生的排版。
// @description:zh-CN 以 Extended 模式获取完整图库标签,并模拟成其他原生的排版。
// @description:ja Extended モードでギャラリーの全タグを取得し、他の標準レイアウトを再現。
// @description:ko Extended 모드로 전체 갤러리 태그를 가져오고 다른 기본 레이아웃을 재현합니다.
// @license MIT
// @icon https://e-hentai.org/favicon.ico
// @homepageURL https://github.com/Tsuyumi25/EhViewRefined
// @supportURL https://github.com/Tsuyumi25/EhViewRefined/issues
// @match https://e-hentai.org/*
// @match https://exhentai.org/*
// @grant GM_addValueChangeListener
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @grant GM_removeValueChangeListener
// @grant GM_setValue
// @grant GM_unregisterMenuCommand
// @run-at document-start
// ==/UserScript==
(function() {
"use strict";
var PRESENCE_ATTRIBUTE = "data-evr-version";
function announcePresence(doc, version) {
if (doc.documentElement) {
doc.documentElement.setAttribute(PRESENCE_ATTRIBUTE, version);
return;
}
const observer = new MutationObserver(() => {
if (!doc.documentElement) return;
observer.disconnect();
doc.documentElement.setAttribute(PRESENCE_ATTRIBUTE, version);
});
observer.observe(doc, { childList: true });
}
var PLAIN_TAG_MARK = "data-evr-tag-plain";
var uncoloured = {
"": true,
none: true,
transparent: true,
currentcolor: true,
inherit: true,
initial: true,
unset: true,
revert: true,
"revert-layer": true,
auto: true
};
function alphaOf(value) {
const body = /^[a-z]+\(([^()]*)\)$/.exec(value)?.[1];
if (body === void 0) return null;
const slash = body.lastIndexOf("/");
const parts = body.split(",");
const raw = slash >= 0 ? body.slice(slash + 1) : parts.length === 4 ? parts[3] : null;
if (raw === null) return null;
const text = raw.trim();
const percent = text.endsWith("%");
const alpha = Number.parseFloat(percent ? text.slice(0, -1) : text);
return Number.isNaN(alpha) ? null : percent ? alpha / 100 : alpha;
}
function isColourValue(value) {
const normalised = value.trim().toLowerCase();
if (uncoloured[normalised]) return false;
return alphaOf(normalised) !== 0;
}
function isHighlighted(paint) {
return isColourValue(paint.color) || isColourValue(paint.backgroundColor) || isColourValue(paint.backgroundImage);
}
var sourceSelector = "table.itg.glte";
var GALLERY_PATH = /\/g\/(\d+)\/[^/?#]+/;
var GALLERY_KEY = /\/g\/(\d+)\/([^/?#]+)/;
var CATEGORY_TONE = /^ct[0-9a-f]+$/;
var TAG_DATA = "data-evr-tags";
var UPLOADER_DATA = "data-evr-uploader";
var UPLOADER_PATH = /\/uploader\/([^/?#]+)/;
var RATING_DATA = "data-evr-rating";
var MY_RATING_DATA = "data-evr-my-rating";
var MY_RATING_MARKS = [
"irr",
"irg",
"irb"
];
var sectionTags$1 = {
TBODY: true,
THEAD: true,
TFOOT: true
};
var TAG_NAME = "data-evr-tag";
var TAG_NAMESPACE = "data-evr-ns";
var UPLOADER_TAG_CLASS = "evr-uploader-tag";
var TAG_SELECTOR$1 = `:is(.gt, .gtl, .gtw):not(.${UPLOADER_TAG_CLASS})`;
function outerRows(table) {
const rows = [];
for (const child of table.children) if (child.tagName === "TR") rows.push(child);
else if (sectionTags$1[child.tagName]) {
for (const row of child.children) if (row.tagName === "TR") rows.push(row);
}
return rows;
}
function galleryKey(row) {
const link = row.querySelector("a[href*=\"/g/\"]");
const match = GALLERY_KEY.exec(link?.getAttribute("href") ?? "");
return match ? `${match[1]}/${match[2]}` : null;
}
function tagMetadata(tags) {
return JSON.stringify(Array.from(tags, (tag) => ({
name: tag.title,
tier: tag.classList.contains("gtw") ? "gtw" : tag.classList.contains("gtl") ? "gtl" : "gt"
})));
}
function namespaceOf(tag) {
const colon = tag.title.indexOf(":");
if (colon > 0) return tag.title.slice(0, colon).trim().toLowerCase();
return tag.closest("tr")?.querySelector(":scope > td.tc")?.textContent?.trim().toLowerCase().replace(/:$/, "") || null;
}
function captureGalleryTags(row) {
const cached = row.getAttribute(TAG_DATA);
if (cached !== null) return cached;
const tags = row.querySelectorAll(`.gl4e ${TAG_SELECTOR$1}`);
for (const tag of tags) {
if (tag.title) tag.setAttribute(TAG_NAME, tag.title);
const namespace = namespaceOf(tag);
if (namespace) tag.setAttribute(TAG_NAMESPACE, namespace);
if (!isHighlighted(tag.style)) tag.setAttribute(PLAIN_TAG_MARK, "");
}
const data = tagMetadata(tags);
row.setAttribute(TAG_DATA, data);
return data;
}
function captureGalleryUploader(row) {
const cached = row.getAttribute(UPLOADER_DATA);
if (cached !== null) return cached;
const encoded = UPLOADER_PATH.exec(row.querySelector(".gl3e a[href*=\"/uploader/\"]")?.getAttribute("href") ?? "")?.[1];
if (!encoded) return null;
let name;
try {
name = decodeURIComponent(encoded.replace(/\+/g, " "));
} catch {
return null;
}
row.setAttribute(UPLOADER_DATA, name);
return name;
}
function starsOf(stars) {
const [x, y] = Array.from((stars.getAttribute("style") ?? "").matchAll(/(-?\d+)px/g), (match) => Math.abs(Number(match[1])));
if (x === void 0 || y === void 0) return null;
const value = 5 - x / 16 - (y === 21 ? .5 : 0);
return value >= 0 && value <= 5 ? value : null;
}
function captureGalleryRating(row) {
const cachedRating = row.getAttribute(RATING_DATA);
const cachedMine = row.getAttribute(MY_RATING_DATA);
if (cachedRating !== null || cachedMine !== null) return {
rating: cachedRating === null ? null : Number(cachedRating),
myRating: cachedMine === null ? null : Number(cachedMine)
};
const stars = row.querySelector(".gl3e .ir");
const value = stars ? starsOf(stars) : null;
if (value === null) return {
rating: null,
myRating: null
};
const mine = MY_RATING_MARKS.some((mark) => stars.classList.contains(mark));
row.setAttribute(mine ? MY_RATING_DATA : RATING_DATA, String(value));
return mine ? {
rating: null,
myRating: value
} : {
rating: value,
myRating: null
};
}
function childByClass(parent, name) {
if (!parent) return null;
for (const child of parent.children) if (child.classList.contains(name)) return child;
return null;
}
function galleryHref(scope) {
if (!scope) return "";
for (const link of scope.querySelectorAll("a[href]")) {
const href = link.getAttribute("href") ?? "";
if (GALLERY_PATH.test(href)) return href;
}
return "";
}
function pixels(el, property) {
if (!el) return 0;
for (const declaration of (el.getAttribute("style") ?? "").split(";")) {
const colon = declaration.indexOf(":");
if (colon < 0) continue;
if (declaration.slice(0, colon).trim() !== property) continue;
return Math.round(Number.parseFloat(declaration.slice(colon + 1)) || 0);
}
return 0;
}
function adaptExtendedGallery(row) {
const coverCell = childByClass(row, "gl1e");
const body = childByClass(row, "gl2e");
if (!body) return null;
const name = body.querySelector(".gl4e");
const title = name?.querySelector(".glink");
const href = galleryHref(body) || galleryHref(coverCell);
const gid = GALLERY_PATH.exec(href)?.[1] ?? "";
if (!gid || !name || !title) return null;
const meta = body.querySelector(".gl3e");
const slots = meta ? Array.from(meta.children) : [];
const category = slots.find((slot) => [
"cn",
"cs",
"cw"
].some((mark) => slot.classList.contains(mark))) ?? null;
const posted = slots.find((slot) => slot.id.startsWith("posted_")) ?? null;
const rating = slots.find((slot) => slot.classList.contains("ir")) ?? null;
const download = slots.find((slot) => slot.classList.contains("gldown")) ?? null;
const named = [
category,
posted,
rating,
download
];
const downloadAt = download ? slots.indexOf(download) : slots.length;
const rest = slots.filter((slot) => !named.includes(slot));
const before = rest.filter((slot) => slots.indexOf(slot) < downloadAt);
const uploader = before.find((slot) => slot.querySelector("a[href*=\"/uploader/\"]")) ?? before[0] ?? null;
const pages = before.find((slot) => slot !== uploader) ?? null;
let selection = childByClass(row, "glfe");
if (!selection) for (const cell of row.children) {
if (cell === coverCell || cell === body) continue;
if (cell.querySelector("input")) selection = cell;
}
const frame = coverCell?.querySelector("div") ?? null;
const cover = coverCell?.querySelector("img") ?? null;
const tags = Array.from(name.querySelectorAll(TAG_SELECTOR$1));
const tagData = captureGalleryTags(row);
const uploaderName = captureGalleryUploader(row);
const { rating: averageRating, myRating } = captureGalleryRating(row);
const bindings = {
cover,
category,
posted,
rating,
uploader,
pages,
download,
favorited: rest.find((slot) => slots.indexOf(slot) > downloadAt) ?? null,
note: row.querySelector(".glfnote"),
selection,
title,
tags
};
return {
snapshot: {
gid,
href,
fresh: row.getAttribute("data-new"),
categoryTone: category ? Array.from(category.classList).find((mark) => CATEGORY_TONE.test(mark)) ?? null : null,
cover: cover ? {
width: cover.naturalWidth || pixels(cover, "width") || Number(cover.getAttribute("width")),
height: cover.naturalHeight || pixels(cover, "height") || Number(cover.getAttribute("height")),
sourceHeight: pixels(cover, "height"),
deferredSource: cover.getAttribute("data-src")
} : null,
frameHeight: pixels(frame, "height"),
frameStyle: frame?.getAttribute("style") ?? null,
tags: tags.map((tag) => ({
text: tag.getAttribute("ehs-tag") ?? tag.textContent,
styled: (tag.getAttribute("style") ?? "") !== "",
namespace: tag.getAttribute(TAG_NAMESPACE)
})),
tagData,
uploader: uploaderName,
rating: averageRating,
myRating,
previousGid: GALLERY_PATH.exec(galleryHref(row.previousElementSibling))?.[1] ?? "0",
nextGid: GALLERY_PATH.exec(galleryHref(row.nextElementSibling))?.[1] ?? "0"
},
bindings
};
}
var _GM_addValueChangeListener = (() => typeof GM_addValueChangeListener != "undefined" ? GM_addValueChangeListener : void 0)();
var _GM_getValue = (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
var _GM_registerMenuCommand = (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)();
var _GM_removeValueChangeListener = (() => typeof GM_removeValueChangeListener != "undefined" ? GM_removeValueChangeListener : void 0)();
var _GM_setValue = (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
var _GM_unregisterMenuCommand = (() => typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : void 0)();
var locales = [
"zh-TW",
"zh-CN",
"en",
"ja",
"ko"
];
function isLocale(value) {
return locales.includes(value);
}
function isLocaleChoice(value) {
return value === "auto" || isLocale(value);
}
function resolveLocale(choice, languages) {
return choice === "auto" ? detectLocale(languages) : choice;
}
function detectLocale(languages) {
for (const language of languages) {
const parts = language.toLowerCase().split("-");
const primary = parts[0];
if (primary === "zh") {
if (parts.includes("hans")) return "zh-CN";
if (parts.includes("hant")) return "zh-TW";
if (parts.some((part) => [
"tw",
"hk",
"mo"
].includes(part))) return "zh-TW";
return "zh-CN";
}
if (primary === "en") return "en";
if (primary === "ja") return "ja";
if (primary === "ko") return "ko";
}
return "en";
}
function createSetting(key, parse) {
const listeners = new Set();
let current = null;
let listenerId;
function stored() {
return parse(_GM_getValue(key, null));
}
function update(value) {
if (value === current) return;
current = value;
for (const listener of [...listeners]) listener(value);
}
function get() {
return current ??= stored();
}
function set(value) {
if (get() === value) return;
_GM_setValue(key, String(value));
update(value);
}
function subscribe(listener) {
get();
listeners.add(listener);
if (listenerId === void 0) {
listenerId = _GM_addValueChangeListener(key, (_key, _old, value) => {
update(parse(value));
});
update(stored());
}
return () => {
if (!listeners.delete(listener)) return;
if (listeners.size === 0 && listenerId !== void 0) {
_GM_removeValueChangeListener(listenerId);
listenerId = void 0;
}
};
}
return {
get,
set,
subscribe
};
}
function createBooleanSetting(key, defaultValue) {
return createSetting(key, (raw) => raw === "true" ? true : raw === "false" ? false : defaultValue);
}
var { get: getAllMyTags, set: setAllMyTags, subscribe: subscribeAllMyTags } = createBooleanSetting("ehe:all-my-tags", true);
var { get: getAllOtherTags, set: setAllOtherTags, subscribe: subscribeAllOtherTags } = createBooleanSetting("ehe:all-other-tags", true);
var { get: getGroupTags, set: setGroupTags, subscribe: subscribeGroupTags } = createBooleanSetting("ehe:group-tags", false);
var { get: getUploaderTag, set: setUploaderTag, subscribe: subscribeUploaderTag } = createBooleanSetting("ehe:uploader-tag", true);
var { get: getInfiniteScroll, set: setInfiniteScroll, subscribe: subscribeInfiniteScroll } = createBooleanSetting("ehe:infinite-scroll", true);
var { get: getLocaleChoice, set: setLocaleChoice, subscribe: subscribeLocaleChoice } = createSetting("ehe:locale", (raw) => isLocaleChoice(raw) ? raw : "auto");
var PARKED_CLASS = "evr-parked";
function createItemStrip() {
const nodes = [];
let start = 0;
let end = 0;
return {
get count() {
return nodes.length;
},
get start() {
return start;
},
get end() {
return end;
},
nodeAt(index) {
return index >= start && index < end ? nodes[index] : void 0;
},
push(node) {
if (end === nodes.length) {
end++;
node.classList.remove(PARKED_CLASS);
} else node.classList.add(PARKED_CLASS);
nodes.push(node);
},
setRange(nextStart, nextEnd) {
const lower = Math.max(0, Math.min(nextStart, nodes.length));
const upper = Math.max(lower, Math.min(nextEnd, nodes.length));
for (let index = start; index < end; index++) if (index < lower || index >= upper) nodes[index].classList.add(PARKED_CLASS);
for (let index = lower; index < upper; index++) if (index < start || index >= end) nodes[index].classList.remove(PARKED_CLASS);
start = lower;
end = upper;
}
};
}
function makeMap(str) {
const map = Object.create(null);
for (const key of str.split(",")) map[key] = 1;
return (val) => val in map;
}
var EMPTY_OBJ = {};
var EMPTY_ARR = [];
var NOOP = () => {};
var NO = () => false;
var isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && (key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);
var isModelListener = (key) => key.startsWith("onUpdate:");
var extend = Object.assign;
var remove = (arr, el) => {
const i = arr.indexOf(el);
if (i > -1) arr.splice(i, 1);
};
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
var hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
var isArray = Array.isArray;
var isMap = (val) => toTypeString(val) === "[object Map]";
var isSet = (val) => toTypeString(val) === "[object Set]";
var isDate = (val) => toTypeString(val) === "[object Date]";
var isFunction = (val) => typeof val === "function";
var isString = (val) => typeof val === "string";
var isSymbol = (val) => typeof val === "symbol";
var isObject = (val) => val !== null && typeof val === "object";
var isPromise = (val) => {
return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
};
var objectToString = Object.prototype.toString;
var toTypeString = (value) => objectToString.call(value);
var toRawType = (value) => {
return toTypeString(value).slice(8, -1);
};
var isPlainObject = (val) => toTypeString(val) === "[object Object]";
var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
var isReservedProp = makeMap(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted");
var cacheStringFunction = (fn) => {
const cache = Object.create(null);
return ((str) => {
return cache[str] || (cache[str] = fn(str));
});
};
var camelizeRE = /-\w/g;
var camelize = cacheStringFunction((str) => {
return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());
});
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase());
var capitalize = cacheStringFunction((str) => {
return str.charAt(0).toUpperCase() + str.slice(1);
});
var toHandlerKey = cacheStringFunction((str) => {
return str ? `on${capitalize(str)}` : ``;
});
var hasChanged = (value, oldValue) => !Object.is(value, oldValue);
var invokeArrayFns = (fns, ...arg) => {
for (let i = 0; i < fns.length; i++) fns[i](...arg);
};
var def = (obj, key, value, writable = false) => {
Object.defineProperty(obj, key, {
configurable: true,
enumerable: false,
writable,
value
});
};
var looseToNumber = (val) => {
const n = parseFloat(val);
return isNaN(n) ? val : n;
};
var _globalThis;
var getGlobalThis = () => {
return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
};
function normalizeStyle(value) {
if (isArray(value)) {
const res = {};
for (let i = 0; i < value.length; i++) {
const item = value[i];
const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
if (normalized) for (const key in normalized) res[key] = normalized[key];
}
return res;
} else if (isString(value) || isObject(value)) return value;
}
var listDelimiterRE = /;(?![^(]*\))/g;
var propertyDelimiterRE = /:([^]+)/;
var styleCommentRE = /"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;
function parseStringStyle(cssText) {
const ret = {};
cssText.replace(styleCommentRE, (match) => match.startsWith("/*") ? "" : match).split(listDelimiterRE).forEach((item) => {
if (item) {
const tmp = item.split(propertyDelimiterRE);
tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
}
});
return ret;
}
function normalizeClass(value) {
let res = "";
if (isString(value)) res = value;
else if (isArray(value)) for (let i = 0; i < value.length; i++) {
const normalized = normalizeClass(value[i]);
if (normalized) res += normalized + " ";
}
else if (isObject(value)) {
for (const name in value) if (value[name]) res += name + " ";
}
return res.trim();
}
var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
var isSpecialBooleanAttr = makeMap(specialBooleanAttrs);
specialBooleanAttrs + "";
function includeBooleanAttr(value) {
return !!value || value === "";
}
function looseCompareArrays(a, b, seen) {
if (a.length !== b.length) return false;
let equal = true;
for (let i = 0; equal && i < a.length; i++) equal = looseEqual(a[i], b[i], seen);
return equal;
}
function looseCompareCollections(a, b, seen) {
if (a.size !== b.size) return false;
const candidates = Array.from(b);
const matched = new Uint8Array(candidates.length);
for (const item of a) {
let index = -1;
for (let i = 0; i < candidates.length; i++) if (!matched[i] && looseEqual(item, candidates[i], seen)) {
index = i;
break;
}
if (index < 0) return false;
matched[index] = 1;
}
return true;
}
function looseCompareObjects(a, b, seen) {
let aValidType = isMap(a);
let bValidType = isMap(b);
if (aValidType || bValidType) return aValidType && bValidType ? looseCompareCollections(a, b, seen) : false;
aValidType = isSet(a);
bValidType = isSet(b);
if (aValidType || bValidType) return aValidType && bValidType ? looseCompareCollections(a, b, seen) : false;
if (Object.keys(a).length !== Object.keys(b).length) return false;
for (const key in a) {
const aHasKey = a.hasOwnProperty(key);
const bHasKey = b.hasOwnProperty(key);
if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key], seen)) return false;
}
return String(a) === String(b);
}
function looseCompareNested(a, b, seen, compare) {
if (!seen) seen = [new Map(), new Map()];
const [seenA, seenB] = seen;
if (seenA.has(a) || seenB.has(b)) return seenA.get(a) === b && seenB.get(b) === a;
seenA.set(a, b);
seenB.set(b, a);
const equal = compare(a, b, seen);
seenA.delete(a);
seenB.delete(b);
return equal;
}
function looseEqual(a, b, seen) {
if (a === b) return true;
let aValidType = isDate(a);
let bValidType = isDate(b);
if (aValidType || bValidType) return aValidType && bValidType ? a.getTime() === b.getTime() : false;
aValidType = isSymbol(a);
bValidType = isSymbol(b);
if (aValidType || bValidType) return a === b;
aValidType = isArray(a);
bValidType = isArray(b);
if (aValidType || bValidType) return aValidType && bValidType ? looseCompareNested(a, b, seen, looseCompareArrays) : false;
aValidType = isObject(a);
bValidType = isObject(b);
if (aValidType || bValidType) {
if (!aValidType || !bValidType) return false;
return looseCompareNested(a, b, seen, looseCompareObjects);
}
return String(a) === String(b);
}
var isRef$1 = (val) => {
return !!(val && val["__v_isRef"] === true);
};
var toDisplayString = (val) => {
return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef$1(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);
};
var replacer = (_key, val) => {
if (isRef$1(val)) return replacer(_key, val.value);
else if (isMap(val)) return { [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2], i) => {
entries[stringifySymbol(key, i) + " =>"] = val2;
return entries;
}, {}) };
else if (isSet(val)) return { [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) };
else if (isSymbol(val)) return stringifySymbol(val);
else if (isObject(val) && !isArray(val) && !isPlainObject(val)) return String(val);
return val;
};
var stringifySymbol = (v, i = "") => {
var _a;
return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v;
};
var activeEffectScope;
var EffectScope = class {
constructor(detached = false) {
this.detached = detached;
this._active = true;
this._on = 0;
this.effects = [];
this.cleanups = [];
this._isPaused = false;
this._warnOnRun = true;
this.__v_skip = true;
if (!detached && activeEffectScope) {
if (activeEffectScope.active) {
this.parent = activeEffectScope;
this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1;
} else {
this._active = false;
this._warnOnRun = false;
}
}
}
get active() {
return this._active;
}
pause() {
if (this._active) {
this._isPaused = true;
let i, l;
if (this.scopes) {
const scopes = this.scopes.slice();
for (i = 0, l = scopes.length; i < l; i++) scopes[i].pause();
}
for (i = 0, l = this.effects.length; i < l; i++) this.effects[i].pause();
}
}
resume() {
if (this._active) {
if (this._isPaused) {
this._isPaused = false;
let i, l;
if (this.scopes) {
const scopes = this.scopes.slice();
for (i = 0, l = scopes.length; i < l; i++) scopes[i].resume();
}
const effects = this.effects.slice();
for (i = 0, l = effects.length; i < l; i++) effects[i].resume();
}
}
}
run(fn) {
if (this._active) {
const currentEffectScope = activeEffectScope;
try {
activeEffectScope = this;
return fn();
} finally {
activeEffectScope = currentEffectScope;
}
}
}
on() {
if (++this._on === 1) {
this.prevScope = activeEffectScope;
activeEffectScope = this;
}
}
off() {
if (this._on > 0 && --this._on === 0) {
if (activeEffectScope === this) activeEffectScope = this.prevScope;
else {
let current = activeEffectScope;
while (current) {
if (current.prevScope === this) {
current.prevScope = this.prevScope;
break;
}
current = current.prevScope;
}
}
this.prevScope = void 0;
}
}
stop(fromParent) {
if (this._active) {
this._active = false;
let i, l;
for (i = 0, l = this.effects.length; i < l; i++) this.effects[i].stop();
this.effects.length = 0;
for (i = 0, l = this.cleanups.length; i < l; i++) this.cleanups[i]();
this.cleanups.length = 0;
if (this.scopes) {
const scopes = this.scopes.slice();
for (i = 0, l = scopes.length; i < l; i++) scopes[i].stop(true);
this.scopes.length = 0;
}
if (!this.detached && this.parent && !fromParent) {
const last = this.parent.scopes.pop();
if (last && last !== this) {
this.parent.scopes[this.index] = last;
last.index = this.index;
}
}
this.parent = void 0;
}
}
};
function getCurrentScope() {
return activeEffectScope;
}
var activeSub;
var pausedQueueEffects = new WeakSet();
var ReactiveEffect = class {
constructor(fn) {
this.fn = fn;
this.deps = void 0;
this.depsTail = void 0;
this.flags = 5;
this.next = void 0;
this.cleanup = void 0;
this.scheduler = void 0;
if (activeEffectScope) {
if (activeEffectScope.active) activeEffectScope.effects.push(this);
else this.flags &= -2;
}
}
pause() {
this.flags |= 64;
}
resume() {
if (this.flags & 64) {
this.flags &= -65;
if (pausedQueueEffects.has(this)) {
pausedQueueEffects.delete(this);
this.trigger();
}
}
}
notify() {
if (this.flags & 2 && !(this.flags & 32)) return;
if (!(this.flags & 8)) batch(this);
}
run() {
if (!(this.flags & 1)) return this.fn();
this.flags |= 2;
cleanupEffect(this);
prepareDeps(this);
const prevEffect = activeSub;
const prevShouldTrack = shouldTrack;
activeSub = this;
shouldTrack = true;
try {
return this.fn();
} finally {
cleanupDeps(this);
activeSub = prevEffect;
shouldTrack = prevShouldTrack;
this.flags &= -3;
}
}
stop() {
if (this.flags & 1) {
for (let link = this.deps; link; link = link.nextDep) removeSub(link);
this.deps = this.depsTail = void 0;
cleanupEffect(this);
this.onStop && this.onStop();
this.flags &= -2;
}
}
trigger() {
if (this.flags & 64) pausedQueueEffects.add(this);
else if (this.scheduler) this.scheduler();
else this.runIfDirty();
}
runIfDirty() {
if (isDirty(this)) this.run();
}
get dirty() {
return isDirty(this);
}
};
var batchDepth = 0;
var batchedSub;
var batchedComputed;
function batch(sub, isComputed = false) {
sub.flags |= 8;
if (isComputed) {
sub.next = batchedComputed;
batchedComputed = sub;
return;
}
sub.next = batchedSub;
batchedSub = sub;
}
function startBatch() {
batchDepth++;
}
function endBatch() {
if (--batchDepth > 0) return;
if (batchedComputed) {
let e = batchedComputed;
batchedComputed = void 0;
while (e) {
const next = e.next;
e.next = void 0;
e.flags &= -9;
e = next;
}
}
let error;
while (batchedSub) {
let e = batchedSub;
batchedSub = void 0;
while (e) {
const next = e.next;
e.next = void 0;
e.flags &= -9;
if (e.flags & 1) try {
e.trigger();
} catch (err) {
if (!error) error = err;
}
e = next;
}
}
if (error) throw error;
}
function prepareDeps(sub) {
for (let link = sub.deps; link; link = link.nextDep) {
link.version = -1;
link.prevActiveLink = link.dep.activeLink;
link.dep.activeLink = link;
}
}
function cleanupDeps(sub) {
let head;
let tail = sub.depsTail;
let link = tail;
while (link) {
const prev = link.prevDep;
if (link.version === -1) {
if (link === tail) tail = prev;
removeSub(link);
removeDep(link);
} else head = link;
link.dep.activeLink = link.prevActiveLink;
link.prevActiveLink = void 0;
link = prev;
}
sub.deps = head;
sub.depsTail = tail;
}
function isDirty(sub) {
for (let link = sub.deps; link; link = link.nextDep) if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) return true;
if (sub._dirty) return true;
return false;
}
function refreshComputed(computed) {
if (computed.flags & 4 && !(computed.flags & 16)) return;
computed.flags &= -17;
if (computed.globalVersion === globalVersion) return;
computed.globalVersion = globalVersion;
if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) return;
computed.flags |= 2;
const dep = computed.dep;
const prevSub = activeSub;
const prevShouldTrack = shouldTrack;
activeSub = computed;
shouldTrack = true;
try {
prepareDeps(computed);
const value = computed.fn(computed._value);
if (dep.version === 0 || hasChanged(value, computed._value)) {
computed.flags |= 128;
computed._value = value;
dep.version++;
}
} catch (err) {
dep.version++;
throw err;
} finally {
activeSub = prevSub;
shouldTrack = prevShouldTrack;
cleanupDeps(computed);
computed.flags &= -3;
}
}
function removeSub(link, soft = false) {
const { dep, prevSub, nextSub } = link;
if (prevSub) {
prevSub.nextSub = nextSub;
link.prevSub = void 0;
}
if (nextSub) {
nextSub.prevSub = prevSub;
link.nextSub = void 0;
}
if (dep.subs === link) {
dep.subs = prevSub;
if (!prevSub && dep.computed) {
dep.computed.flags &= -5;
for (let l = dep.computed.deps; l; l = l.nextDep) removeSub(l, true);
}
}
if (!soft && !--dep.sc && dep.map) dep.map.delete(dep.key);
}
function removeDep(link) {
const { prevDep, nextDep } = link;
if (prevDep) {
prevDep.nextDep = nextDep;
link.prevDep = void 0;
}
if (nextDep) {
nextDep.prevDep = prevDep;
link.nextDep = void 0;
}
}
var shouldTrack = true;
var trackStack = [];
function pauseTracking() {
trackStack.push(shouldTrack);
shouldTrack = false;
}
function resetTracking() {
const last = trackStack.pop();
shouldTrack = last === void 0 ? true : last;
}
function cleanupEffect(e) {
const { cleanup } = e;
e.cleanup = void 0;
if (cleanup) {
const prevSub = activeSub;
activeSub = void 0;
try {
cleanup();
} finally {
activeSub = prevSub;
}
}
}
var globalVersion = 0;
var Link = class {
constructor(sub, dep) {
this.sub = sub;
this.dep = dep;
this.version = dep.version;
this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;
}
};
var Dep = class {
constructor(computed) {
this.computed = computed;
this.version = 0;
this.activeLink = void 0;
this.subs = void 0;
this.map = void 0;
this.key = void 0;
this.sc = 0;
this.__v_skip = true;
}
track(debugInfo) {
if (!activeSub || !shouldTrack || activeSub === this.computed) return;
let link = this.activeLink;
if (link === void 0 || link.sub !== activeSub) {
link = this.activeLink = new Link(activeSub, this);
if (!activeSub.deps) activeSub.deps = activeSub.depsTail = link;
else {
link.prevDep = activeSub.depsTail;
activeSub.depsTail.nextDep = link;
activeSub.depsTail = link;
}
addSub(link);
} else if (link.version === -1) {
link.version = this.version;
if (link.nextDep) {
const next = link.nextDep;
next.prevDep = link.prevDep;
if (link.prevDep) link.prevDep.nextDep = next;
link.prevDep = activeSub.depsTail;
link.nextDep = void 0;
activeSub.depsTail.nextDep = link;
activeSub.depsTail = link;
if (activeSub.deps === link) activeSub.deps = next;
}
}
return link;
}
trigger(debugInfo) {
this.version++;
globalVersion++;
this.notify(debugInfo);
}
notify(debugInfo) {
startBatch();
try {
for (let link = this.subs; link; link = link.prevSub) if (link.sub.notify()) link.sub.dep.notify();
} finally {
endBatch();
}
}
};
function addSub(link) {
link.dep.sc++;
if (link.sub.flags & 4) {
const computed = link.dep.computed;
if (computed && !link.dep.subs) {
computed.flags |= 20;
for (let l = computed.deps; l; l = l.nextDep) addSub(l);
}
const currentTail = link.dep.subs;
if (currentTail !== link) {
link.prevSub = currentTail;
if (currentTail) currentTail.nextSub = link;
}
link.dep.subs = link;
}
}
var targetMap = new WeakMap();
var ITERATE_KEY = Symbol("");
var MAP_KEY_ITERATE_KEY = Symbol("");
var ARRAY_ITERATE_KEY = Symbol("");
function track(target, type, key) {
if (shouldTrack && activeSub) {
let depsMap = targetMap.get(target);
if (!depsMap) targetMap.set(target, depsMap = new Map());
let dep = depsMap.get(key);
if (!dep) {
depsMap.set(key, dep = new Dep());
dep.map = depsMap;
dep.key = key;
}
dep.track();
}
}
function trigger$1(target, type, key, newValue, oldValue, oldTarget) {
const depsMap = targetMap.get(target);
if (!depsMap) {
globalVersion++;
return;
}
const run = (dep) => {
if (dep) dep.trigger();
};
startBatch();
if (type === "clear") depsMap.forEach(run);
else {
const targetIsArray = isArray(target);
const isArrayIndex = targetIsArray && isIntegerKey(key);
if (targetIsArray && key === "length") {
const newLength = Number(newValue);
depsMap.forEach((dep, key2) => {
if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) run(dep);
});
} else {
if (key !== void 0 || depsMap.has(void 0)) run(depsMap.get(key));
if (isArrayIndex) run(depsMap.get(ARRAY_ITERATE_KEY));
switch (type) {
case "add":
if (!targetIsArray) {
run(depsMap.get(ITERATE_KEY));
if (isMap(target)) run(depsMap.get(MAP_KEY_ITERATE_KEY));
} else if (isArrayIndex) run(depsMap.get("length"));
break;
case "delete":
if (!targetIsArray) {
run(depsMap.get(ITERATE_KEY));
if (isMap(target)) run(depsMap.get(MAP_KEY_ITERATE_KEY));
}
break;
case "set": if (isMap(target)) run(depsMap.get(ITERATE_KEY));
}
}
}
endBatch();
}
function reactiveReadArray(array) {
const raw = toRaw(array);
if (raw === array) return raw;
track(raw, "iterate", ARRAY_ITERATE_KEY);
if (isShallow(array)) return raw;
if (!isReadonly(array)) return raw.map(toReactive);
return isReactive(array) ? raw.map((item) => toReadonly(toReactive(item))) : raw.map(toReadonly);
}
function shallowReadArray(arr) {
track(arr = toRaw(arr), "iterate", ARRAY_ITERATE_KEY);
return arr;
}
function toWrapped(target, item) {
if (isReadonly(target)) return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);
return toReactive(item);
}
var arrayInstrumentations = {
__proto__: null,
[Symbol.iterator]() {
return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));
},
concat(...args) {
return reactiveReadArray(this).concat(...args.map((x) => isArray(x) ? reactiveReadArray(x) : x));
},
entries() {
return iterator(this, "entries", (value) => {
value[1] = toWrapped(this, value[1]);
return value;
});
},
every(fn, thisArg) {
return apply(this, "every", fn, thisArg, void 0, arguments);
},
filter(fn, thisArg) {
return apply(this, "filter", fn, thisArg, (v) => v.map((item) => toWrapped(this, item)), arguments);
},
find(fn, thisArg) {
return apply(this, "find", fn, thisArg, (item) => toWrapped(this, item), arguments);
},
findIndex(fn, thisArg) {
return apply(this, "findIndex", fn, thisArg, void 0, arguments);
},
findLast(fn, thisArg) {
return apply(this, "findLast", fn, thisArg, (item) => toWrapped(this, item), arguments);
},
findLastIndex(fn, thisArg) {
return apply(this, "findLastIndex", fn, thisArg, void 0, arguments);
},
forEach(fn, thisArg) {
return apply(this, "forEach", fn, thisArg, void 0, arguments);
},
includes(...args) {
return searchProxy(this, "includes", args);
},
indexOf(...args) {
return searchProxy(this, "indexOf", args);
},
join(separator) {
return reactiveReadArray(this).join(separator);
},
lastIndexOf(...args) {
return searchProxy(this, "lastIndexOf", args);
},
map(fn, thisArg) {
return apply(this, "map", fn, thisArg, void 0, arguments);
},
pop() {
return noTracking(this, "pop");
},
push(...args) {
return noTracking(this, "push", args);
},
reduce(fn, ...args) {
return reduce(this, "reduce", fn, args);
},
reduceRight(fn, ...args) {
return reduce(this, "reduceRight", fn, args);
},
shift() {
return noTracking(this, "shift");
},
some(fn, thisArg) {
return apply(this, "some", fn, thisArg, void 0, arguments);
},
splice(...args) {
return noTracking(this, "splice", args);
},
toReversed() {
return reactiveReadArray(this).toReversed();
},
toSorted(comparer) {
return reactiveReadArray(this).toSorted(comparer);
},
toSpliced(...args) {
return reactiveReadArray(this).toSpliced(...args);
},
unshift(...args) {
return noTracking(this, "unshift", args);
},
values() {
return iterator(this, "values", (item) => toWrapped(this, item));
}
};
function iterator(self, method, wrapValue) {
const arr = shallowReadArray(self);
const iter = arr[method]();
if (arr !== self && !isShallow(self)) {
iter._next = iter.next;
iter.next = () => {
const result = iter._next();
if (!result.done) result.value = wrapValue(result.value);
return result;
};
}
return iter;
}
var arrayProto = Array.prototype;
function apply(self, method, fn, thisArg, wrappedRetFn, args) {
const arr = shallowReadArray(self);
const needsWrap = arr !== self && !isShallow(self);
const methodFn = arr[method];
if (methodFn !== arrayProto[method]) {
const result2 = methodFn.apply(self, args);
return needsWrap ? toReactive(result2) : result2;
}
let wrappedFn = fn;
if (arr !== self) {
if (needsWrap) wrappedFn = function(item, index) {
return fn.call(this, toWrapped(self, item), index, self);
};
else if (fn.length > 2) wrappedFn = function(item, index) {
return fn.call(this, item, index, self);
};
}
const result = methodFn.call(arr, wrappedFn, thisArg);
return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;
}
function reduce(self, method, fn, args) {
const arr = shallowReadArray(self);
const needsWrap = arr !== self && !isShallow(self);
let wrappedFn = fn;
let wrapInitialAccumulator = false;
if (arr !== self) {
if (needsWrap) {
wrapInitialAccumulator = args.length === 0;
wrappedFn = function(acc, item, index) {
if (wrapInitialAccumulator) {
wrapInitialAccumulator = false;
acc = toWrapped(self, acc);
}
return fn.call(this, acc, toWrapped(self, item), index, self);
};
} else if (fn.length > 3) wrappedFn = function(acc, item, index) {
return fn.call(this, acc, item, index, self);
};
}
const result = arr[method](wrappedFn, ...args);
return wrapInitialAccumulator ? toWrapped(self, result) : result;
}
function searchProxy(self, method, args) {
const arr = toRaw(self);
track(arr, "iterate", ARRAY_ITERATE_KEY);
const res = arr[method](...args);
if ((res === -1 || res === false) && isProxy(args[0])) {
args[0] = toRaw(args[0]);
return arr[method](...args);
}
return res;
}
function noTracking(self, method, args = []) {
pauseTracking();
startBatch();
const res = toRaw(self)[method].apply(self, args);
endBatch();
resetTracking();
return res;
}
var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`);
var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol));
function hasOwnProperty(key) {
if (!isSymbol(key)) key = String(key);
const obj = toRaw(this);
track(obj, "has", key);
return obj.hasOwnProperty(key);
}
var BaseReactiveHandler = class {
constructor(_isReadonly = false, _isShallow = false) {
this._isReadonly = _isReadonly;
this._isShallow = _isShallow;
}
get(target, key, receiver) {
if (key === "__v_skip") return target["__v_skip"];
const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;
if (key === "__v_isReactive") return !isReadonly2;
else if (key === "__v_isReadonly") return isReadonly2;
else if (key === "__v_isShallow") return isShallow2;
else if (key === "__v_raw") {
if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) return target;
return;
}
const targetIsArray = isArray(target);
if (!isReadonly2) {
let fn;
if (targetIsArray && (fn = arrayInstrumentations[key])) return fn;
if (key === "hasOwnProperty") return hasOwnProperty;
}
const res = Reflect.get(target, key, isRef(target) ? target : receiver);
if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) return res;
if (!isReadonly2) track(target, "get", key);
if (isShallow2) return res;
if (isRef(res)) {
const value = targetIsArray && isIntegerKey(key) ? res : res.value;
return isReadonly2 && isObject(value) ? readonly(value) : value;
}
if (isObject(res)) return isReadonly2 ? readonly(res) : reactive(res);
return res;
}
};
var MutableReactiveHandler = class extends BaseReactiveHandler {
constructor(isShallow2 = false) {
super(false, isShallow2);
}
set(target, key, value, receiver) {
let oldValue = target[key];
const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);
if (!this._isShallow) {
const isOldValueReadonly = isReadonly(oldValue);
if (!isShallow(value) && !isReadonly(value)) {
oldValue = toRaw(oldValue);
value = toRaw(value);
}
if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {
if (isOldValueReadonly) return true;
else {
oldValue.value = value;
return true;
}
}
}
const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);
const result = Reflect.set(target, key, value, isRef(target) ? target : receiver);
if (target === toRaw(receiver) && result) {
if (!hadKey) trigger$1(target, "add", key, value);
else if (hasChanged(value, oldValue)) trigger$1(target, "set", key, value, oldValue);
}
return result;
}
deleteProperty(target, key) {
const hadKey = hasOwn(target, key);
const oldValue = target[key];
const result = Reflect.deleteProperty(target, key);
if (result && hadKey) trigger$1(target, "delete", key, void 0, oldValue);
return result;
}
has(target, key) {
const result = Reflect.has(target, key);
if (!isSymbol(key) || !builtInSymbols.has(key)) track(target, "has", key);
return result;
}
ownKeys(target) {
track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY);
return Reflect.ownKeys(target);
}
};
var ReadonlyReactiveHandler = class extends BaseReactiveHandler {
constructor(isShallow2 = false) {
super(true, isShallow2);
}
set(target, key) {
return true;
}
deleteProperty(target, key) {
return true;
}
};
var mutableHandlers = new MutableReactiveHandler();
var readonlyHandlers = new ReadonlyReactiveHandler();
var shallowReactiveHandlers = new MutableReactiveHandler(true);
var toShallow = (value) => value;
var getProto = (v) => Reflect.getPrototypeOf(v);
function createIterableMethod(method, isReadonly2, isShallow2) {
return function(...args) {
const target = this["__v_raw"];
const rawTarget = toRaw(target);
const targetIsMap = isMap(rawTarget);
const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
const isKeyOnly = method === "keys" && targetIsMap;
const innerIterator = target[method](...args);
const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
!isReadonly2 && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
return extend(Object.create(innerIterator), { next() {
const { value, done } = innerIterator.next();
return done ? {
value,
done
} : {
value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
done
};
} });
};
}
function createReadonlyMethod(type) {
return function(...args) {
return type === "delete" ? false : type === "clear" ? void 0 : this;
};
}
function createInstrumentations(readonly, shallow) {
const instrumentations = {
get(key) {
const target = this["__v_raw"];
const rawTarget = toRaw(target);
const rawKey = toRaw(key);
if (!readonly) {
if (hasChanged(key, rawKey)) track(rawTarget, "get", key);
track(rawTarget, "get", rawKey);
}
const { has } = getProto(rawTarget);
const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;
if (has.call(rawTarget, key)) return wrap(target.get(key));
else if (has.call(rawTarget, rawKey)) return wrap(target.get(rawKey));
else if (target !== rawTarget) target.get(key);
},
get size() {
const target = this["__v_raw"];
!readonly && track(toRaw(target), "iterate", ITERATE_KEY);
return target.size;
},
has(key) {
const target = this["__v_raw"];
const rawTarget = toRaw(target);
const rawKey = toRaw(key);
if (!readonly) {
if (hasChanged(key, rawKey)) track(rawTarget, "has", key);
track(rawTarget, "has", rawKey);
}
return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
},
forEach(callback, thisArg) {
const observed = this;
const target = observed["__v_raw"];
const rawTarget = toRaw(target);
const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;
!readonly && track(rawTarget, "iterate", ITERATE_KEY);
return target.forEach((value, key) => {
return callback.call(thisArg, wrap(value), wrap(key), observed);
});
}
};
extend(instrumentations, readonly ? {
add: createReadonlyMethod("add"),
set: createReadonlyMethod("set"),
delete: createReadonlyMethod("delete"),
clear: createReadonlyMethod("clear")
} : {
add(value) {
const target = toRaw(this);
const proto = getProto(target);
const rawValue = toRaw(value);
const valueToAdd = !shallow && !isShallow(value) && !isReadonly(value) ? rawValue : value;
if (!(proto.has.call(target, valueToAdd) || hasChanged(value, valueToAdd) && proto.has.call(target, value) || hasChanged(rawValue, valueToAdd) && proto.has.call(target, rawValue))) {
target.add(valueToAdd);
trigger$1(target, "add", valueToAdd, valueToAdd);
}
return this;
},
set(key, value) {
if (!shallow && !isShallow(value) && !isReadonly(value)) value = toRaw(value);
const target = toRaw(this);
const { has, get } = getProto(target);
let hadKey = has.call(target, key);
if (!hadKey) {
key = toRaw(key);
hadKey = has.call(target, key);
}
const oldValue = get.call(target, key);
target.set(key, value);
if (!hadKey) trigger$1(target, "add", key, value);
else if (hasChanged(value, oldValue)) trigger$1(target, "set", key, value, oldValue);
return this;
},
delete(key) {
const target = toRaw(this);
const { has, get } = getProto(target);
let hadKey = has.call(target, key);
if (!hadKey) {
key = toRaw(key);
hadKey = has.call(target, key);
}
const oldValue = get ? get.call(target, key) : void 0;
const result = target.delete(key);
if (hadKey) trigger$1(target, "delete", key, void 0, oldValue);
return result;
},
clear() {
const target = toRaw(this);
const hadItems = target.size !== 0;
const oldTarget = void 0;
const result = target.clear();
if (hadItems) trigger$1(target, "clear", void 0, void 0, oldTarget);
return result;
}
});
[
"keys",
"values",
"entries",
Symbol.iterator
].forEach((method) => {
instrumentations[method] = createIterableMethod(method, readonly, shallow);
});
return instrumentations;
}
function createInstrumentationGetter(isReadonly2, shallow) {
const instrumentations = createInstrumentations(isReadonly2, shallow);
return (target, key, receiver) => {
if (key === "__v_isReactive") return !isReadonly2;
else if (key === "__v_isReadonly") return isReadonly2;
else if (key === "__v_raw") return target;
return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
};
}
var mutableCollectionHandlers = { get: createInstrumentationGetter(false, false) };
var shallowCollectionHandlers = { get: createInstrumentationGetter(false, true) };
var readonlyCollectionHandlers = { get: createInstrumentationGetter(true, false) };
var reactiveMap = new WeakMap();
var shallowReactiveMap = new WeakMap();
var readonlyMap = new WeakMap();
var shallowReadonlyMap = new WeakMap();
function targetTypeMap(rawType) {
switch (rawType) {
case "Object":
case "Array": return 1;
case "Map":
case "Set":
case "WeakMap":
case "WeakSet": return 2;
default: return 0;
}
}
function reactive(target) {
if (isReadonly(target)) return target;
return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
}
function shallowReactive(target) {
return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap);
}
function readonly(target) {
return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
}
function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
if (!isObject(target)) return target;
if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) return target;
if (target["__v_skip"] || !Object.isExtensible(target)) return target;
const existingProxy = proxyMap.get(target);
if (existingProxy) return existingProxy;
const targetType = targetTypeMap(toRawType(target));
if (targetType === 0) return target;
const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);
proxyMap.set(target, proxy);
return proxy;
}
function isReactive(value) {
if (isReadonly(value)) return isReactive(value["__v_raw"]);
return !!(value && value["__v_isReactive"]);
}
function isReadonly(value) {
return !!(value && value["__v_isReadonly"]);
}
function isShallow(value) {
return !!(value && value["__v_isShallow"]);
}
function isProxy(value) {
return value ? !!value["__v_raw"] : false;
}
function toRaw(observed) {
const raw = observed && observed["__v_raw"];
return raw ? toRaw(raw) : observed;
}
function markRaw(value) {
if (!hasOwn(value, "__v_skip") && Object.isExtensible(value)) def(value, "__v_skip", true);
return value;
}
var toReactive = (value) => isObject(value) ? reactive(value) : value;
var toReadonly = (value) => isObject(value) ? readonly(value) : value;
function isRef(r) {
return r ? r["__v_isRef"] === true : false;
}
function ref(value) {
return createRef(value, false);
}
function createRef(rawValue, shallow) {
if (isRef(rawValue)) return rawValue;
return new RefImpl(rawValue, shallow);
}
var RefImpl = class {
constructor(value, isShallow2) {
this.dep = new Dep();
this["__v_isRef"] = true;
this["__v_isShallow"] = false;
this._rawValue = isShallow2 ? value : toRaw(value);
this._value = isShallow2 ? value : toReactive(value);
this["__v_isShallow"] = isShallow2;
}
get value() {
this.dep.track();
return this._value;
}
set value(newValue) {
const oldValue = this._rawValue;
const useDirectValue = this["__v_isShallow"] || isShallow(newValue) || isReadonly(newValue);
newValue = useDirectValue ? newValue : toRaw(newValue);
if (hasChanged(newValue, oldValue)) {
this._rawValue = newValue;
this._value = useDirectValue ? newValue : toReactive(newValue);
this.dep.trigger();
}
}
};
function unref(ref2) {
return isRef(ref2) ? ref2.value : ref2;
}
var shallowUnwrapHandlers = {
get: (target, key, receiver) => key === "__v_raw" ? target : unref(Reflect.get(target, key, receiver)),
set: (target, key, value, receiver) => {
const oldValue = target[key];
if (isRef(oldValue) && !isRef(value)) {
oldValue.value = value;
return true;
} else return Reflect.set(target, key, value, receiver);
}
};
function proxyRefs(objectWithRefs) {
return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
}
var ComputedRefImpl = class {
constructor(fn, setter, isSSR) {
this.fn = fn;
this.setter = setter;
this._value = void 0;
this.dep = new Dep(this);
this.__v_isRef = true;
this.deps = void 0;
this.depsTail = void 0;
this.flags = 16;
this.globalVersion = globalVersion - 1;
this.next = void 0;
this.effect = this;
this["__v_isReadonly"] = !setter;
this.isSSR = isSSR;
}
notify() {
this.flags |= 16;
if (!(this.flags & 8) && activeSub !== this) {
batch(this, true);
return true;
}
}
get value() {
const link = this.dep.track();
refreshComputed(this);
if (link) link.version = this.dep.version;
return this._value;
}
set value(newValue) {
if (this.setter) this.setter(newValue);
}
};
function computed$1(getterOrOptions, debugOptions, isSSR = false) {
let getter;
let setter;
if (isFunction(getterOrOptions)) getter = getterOrOptions;
else {
getter = getterOrOptions.get;
setter = getterOrOptions.set;
}
return new ComputedRefImpl(getter, setter, isSSR);
}
var INITIAL_WATCHER_VALUE = {};
var cleanupMap = new WeakMap();
var activeWatcher = void 0;
function onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {
if (owner) {
let cleanups = cleanupMap.get(owner);
if (!cleanups) cleanupMap.set(owner, cleanups = []);
cleanups.push(cleanupFn);
}
}
function watch$1(source, cb, options = EMPTY_OBJ) {
const { immediate, deep, once, scheduler, augmentJob, call } = options;
const reactiveGetter = (source2) => {
if (deep) return source2;
if (isShallow(source2) || deep === false || deep === 0) return traverse(source2, 1);
return traverse(source2);
};
let effect;
let getter;
let cleanup;
let boundCleanup;
let forceTrigger = false;
let isMultiSource = false;
if (isRef(source)) {
getter = () => source.value;
forceTrigger = isShallow(source);
} else if (isReactive(source)) {
getter = () => reactiveGetter(source);
forceTrigger = true;
} else if (isArray(source)) {
isMultiSource = true;
forceTrigger = source.some((s) => isReactive(s) || isShallow(s));
getter = () => source.map((s) => {
if (isRef(s)) return s.value;
else if (isReactive(s)) return reactiveGetter(s);
else if (isFunction(s)) return call ? call(s, 2) : s();
});
} else if (isFunction(source)) {
if (cb) getter = call ? () => call(source, 2) : source;
else getter = () => {
if (cleanup) {
pauseTracking();
try {
cleanup();
} finally {
resetTracking();
}
}
const currentEffect = activeWatcher;
activeWatcher = effect;
try {
return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);
} finally {
activeWatcher = currentEffect;
}
};
} else getter = NOOP;
if (cb && deep) {
const baseGetter = getter;
const depth = deep === true ? Infinity : deep;
getter = () => traverse(baseGetter(), depth);
}
const scope = getCurrentScope();
const watchHandle = () => {
effect.stop();
if (scope && scope.active) remove(scope.effects, effect);
};
if (once && cb) {
const _cb = cb;
cb = (...args) => {
const res = _cb(...args);
watchHandle();
return res;
};
}
let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
const job = (immediateFirstRun) => {
if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) return;
if (cb) {
const newValue = effect.run();
if (immediateFirstRun || deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {
if (cleanup) cleanup();
const currentWatcher = activeWatcher;
activeWatcher = effect;
try {
const args = [
newValue,
oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
boundCleanup
];
oldValue = newValue;
call ? call(cb, 3, args) : cb(...args);
} finally {
activeWatcher = currentWatcher;
}
}
} else effect.run();
};
if (augmentJob) augmentJob(job);
effect = new ReactiveEffect(getter);
effect.scheduler = scheduler ? () => scheduler(job, false) : job;
boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);
cleanup = effect.onStop = () => {
const cleanups = cleanupMap.get(effect);
if (cleanups) {
if (call) call(cleanups, 4);
else for (const cleanup2 of cleanups) cleanup2();
cleanupMap.delete(effect);
}
};
if (cb) {
if (immediate) job(true);
else oldValue = effect.run();
} else if (scheduler) scheduler(job.bind(null, true), true);
else effect.run();
watchHandle.pause = effect.pause.bind(effect);
watchHandle.resume = effect.resume.bind(effect);
watchHandle.stop = watchHandle;
return watchHandle;
}
function traverse(value, depth = Infinity, seen) {
if (depth <= 0 || !isObject(value) || value["__v_skip"]) return value;
seen = seen || new Map();
if ((seen.get(value) || 0) >= depth) return value;
seen.set(value, depth);
depth--;
if (isRef(value)) traverse(value.value, depth, seen);
else if (isArray(value)) for (let i = 0; i < value.length; i++) traverse(value[i], depth, seen);
else if (isSet(value) || isMap(value)) value.forEach((v) => {
traverse(v, depth, seen);
});
else if (isPlainObject(value)) {
for (const key in value) traverse(value[key], depth, seen);
for (const key of Object.getOwnPropertySymbols(value)) if (Object.prototype.propertyIsEnumerable.call(value, key)) traverse(value[key], depth, seen);
}
return value;
}
function callWithErrorHandling(fn, instance, type, args) {
try {
return args ? fn(...args) : fn();
} catch (err) {
handleError(err, instance, type);
}
}
function callWithAsyncErrorHandling(fn, instance, type, args) {
if (isFunction(fn)) {
const res = callWithErrorHandling(fn, instance, type, args);
if (res && isPromise(res)) res.catch((err) => {
handleError(err, instance, type);
});
return res;
}
if (isArray(fn)) {
const values = [];
for (let i = 0; i < fn.length; i++) values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
return values;
}
}
function handleError(err, instance, type, throwInDev = true) {
const contextVNode = instance ? instance.vnode : null;
const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;
if (instance) {
let cur = instance.parent;
const exposedInstance = instance.proxy;
const errorInfo = `https://vuejs.org/error-reference/#runtime-${type}`;
while (cur) {
const errorCapturedHooks = cur.ec;
if (errorCapturedHooks) {
for (let i = 0; i < errorCapturedHooks.length; i++) if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) return;
}
cur = cur.parent;
}
if (errorHandler) {
pauseTracking();
callWithErrorHandling(errorHandler, null, 10, [
err,
exposedInstance,
errorInfo
]);
resetTracking();
return;
}
}
logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);
}
function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {
if (throwInProd) throw err;
else console.error(err);
}
var queue = [];
var flushIndex = -1;
var pendingPostFlushCbs = [];
var activePostFlushCbs = null;
var postFlushIndex = 0;
var resolvedPromise = Promise.resolve();
var currentFlushPromise = null;
function nextTick(fn) {
const p = currentFlushPromise || resolvedPromise;
return fn ? p.then(this ? fn.bind(this) : fn) : p;
}
function findInsertionIndex(id) {
let start = flushIndex + 1;
let end = queue.length;
while (start < end) {
const middle = start + end >>> 1;
const middleJob = queue[middle];
const middleJobId = getId(middleJob);
if (middleJobId < id || middleJobId === id && middleJob.flags & 2) start = middle + 1;
else end = middle;
}
return start;
}
function queueJob(job) {
if (!(job.flags & 1)) {
const jobId = getId(job);
const lastJob = queue[queue.length - 1];
if (!lastJob || !(job.flags & 2) && jobId >= getId(lastJob)) queue.push(job);
else queue.splice(findInsertionIndex(jobId), 0, job);
job.flags |= 1;
queueFlush();
}
}
function queueFlush() {
if (!currentFlushPromise) currentFlushPromise = resolvedPromise.then(flushJobs);
}
function queuePostFlushCb(cb) {
if (!isArray(cb)) {
if (activePostFlushCbs && cb.id === -1) activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);
else if (!(cb.flags & 1)) {
pendingPostFlushCbs.push(cb);
cb.flags |= 1;
}
} else for (let i = 0; i < cb.length; i++) pendingPostFlushCbs.push(cb[i]);
queueFlush();
}
function flushPreFlushCbs(instance, seen, i = flushIndex + 1) {
for (; i < queue.length; i++) {
const cb = queue[i];
if (cb && cb.flags & 2) {
if (instance && cb.id !== instance.uid) continue;
queue.splice(i, 1);
i--;
if (cb.flags & 4) cb.flags &= -2;
cb();
if (!(cb.flags & 4)) cb.flags &= -2;
}
}
}
function flushPostFlushCbs(seen) {
if (pendingPostFlushCbs.length) {
const deduped = [...new Set(pendingPostFlushCbs)].sort((a, b) => getId(a) - getId(b));
pendingPostFlushCbs.length = 0;
if (activePostFlushCbs) {
for (let i = 0; i < deduped.length; i++) activePostFlushCbs.push(deduped[i]);
return;
}
activePostFlushCbs = deduped;
for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
const cb = activePostFlushCbs[postFlushIndex];
if (cb.flags & 4) cb.flags &= -2;
if (!(cb.flags & 8)) cb();
cb.flags &= -2;
}
activePostFlushCbs = null;
postFlushIndex = 0;
}
}
var getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;
function flushJobs(seen) {
try {
for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
const job = queue[flushIndex];
if (job && !(job.flags & 8)) {
if (job.flags & 4) job.flags &= -2;
callWithErrorHandling(job, job.i, job.i ? 15 : 14);
if (!(job.flags & 4)) job.flags &= -2;
}
}
} finally {
for (; flushIndex < queue.length; flushIndex++) {
const job = queue[flushIndex];
if (job) job.flags &= -2;
}
flushIndex = -1;
queue.length = 0;
flushPostFlushCbs(seen);
currentFlushPromise = null;
if (queue.length || pendingPostFlushCbs.length) flushJobs(seen);
}
}
var currentRenderingInstance = null;
var currentScopeId = null;
function setCurrentRenderingInstance(instance) {
const prev = currentRenderingInstance;
currentRenderingInstance = instance;
currentScopeId = instance && instance.type.__scopeId || null;
return prev;
}
function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
if (!ctx) return fn;
if (fn._n) return fn;
const renderFnWithContext = (...args) => {
if (renderFnWithContext._d) setBlockTracking(-1);
const prevInstance = setCurrentRenderingInstance(ctx);
const prevStackSize = blockStack.length;
let res;
try {
res = fn(...args);
} finally {
for (let i = blockStack.length; i > prevStackSize; i--) closeBlock();
setCurrentRenderingInstance(prevInstance);
if (renderFnWithContext._d) setBlockTracking(1);
}
return res;
};
renderFnWithContext._n = true;
renderFnWithContext._c = true;
renderFnWithContext._d = true;
return renderFnWithContext;
}
function invokeDirectiveHook(vnode, prevVNode, instance, name) {
const bindings = vnode.dirs;
const oldBindings = prevVNode && prevVNode.dirs;
for (let i = 0; i < bindings.length; i++) {
const binding = bindings[i];
if (oldBindings) binding.oldValue = oldBindings[i].value;
let hook = binding.dir[name];
if (hook) {
pauseTracking();
callWithAsyncErrorHandling(hook, instance, 8, [
vnode.el,
binding,
vnode,
prevVNode
]);
resetTracking();
}
}
}
function provide(key, value) {
if (currentInstance) {
let provides = currentInstance.provides;
const parentProvides = currentInstance.parent && currentInstance.parent.provides;
if (parentProvides === provides) provides = currentInstance.provides = Object.create(parentProvides);
provides[key] = value;
}
}
function inject(key, defaultValue, treatDefaultAsFactory = false) {
const instance = getCurrentInstance();
if (instance || currentApp) {
let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;
if (provides && key in provides) return provides[key];
else if (arguments.length > 1) return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
}
}
var ssrContextKey = Symbol.for("v-scx");
var useSSRContext = () => {
{
const ctx = inject(ssrContextKey);
if (!ctx) {}
return ctx;
}
};
function watch(source, cb, options) {
return doWatch(source, cb, options);
}
function doWatch(source, cb, options = EMPTY_OBJ) {
const { immediate, deep, flush, once } = options;
const baseWatchOptions = extend({}, options);
const runsImmediately = cb && immediate || !cb && flush !== "post";
let ssrCleanup;
if (isInSSRComponentSetup) {
if (flush === "sync") {
const ctx = useSSRContext();
ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);
} else if (!runsImmediately) {
const watchStopHandle = () => {};
watchStopHandle.stop = NOOP;
watchStopHandle.resume = NOOP;
watchStopHandle.pause = NOOP;
return watchStopHandle;
}
}
const instance = currentInstance;
baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);
let isPre = false;
if (flush === "post") baseWatchOptions.scheduler = (job) => {
queuePostRenderEffect(job, instance && instance.suspense);
};
else if (flush !== "sync") {
isPre = true;
baseWatchOptions.scheduler = (job, isFirstRun) => {
if (isFirstRun) job();
else queueJob(job);
};
}
baseWatchOptions.augmentJob = (job) => {
if (cb) job.flags |= 4;
if (isPre) {
job.flags |= 2;
if (instance) {
job.id = instance.uid;
job.i = instance;
}
}
};
const watchHandle = watch$1(source, cb, baseWatchOptions);
if (isInSSRComponentSetup) {
if (ssrCleanup) ssrCleanup.push(watchHandle);
else if (runsImmediately) watchHandle();
}
return watchHandle;
}
function instanceWatch(source, value, options) {
const publicThis = this.proxy;
const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
let cb;
if (isFunction(value)) cb = value;
else {
cb = value.handler;
options = value;
}
const reset = setCurrentInstance(this);
const res = doWatch(getter, cb.bind(publicThis), options);
reset();
return res;
}
function createPathGetter(ctx, path) {
const segments = path.split(".");
return () => {
let cur = ctx;
for (let i = 0; i < segments.length && cur; i++) cur = cur[segments[i]];
return cur;
};
}
var TeleportEndKey = Symbol("_vte");
var isTeleport = (type) => type.__isTeleport;
var leaveCbKey = Symbol("_leaveCb");
function findNonCommentChild(children) {
let child = children[0];
if (children.length > 1) {
for (const c of children) if (c.type !== Comment) {
child = c;
break;
}
}
return child;
}
function getInnerChild$1(vnode) {
if (!isKeepAlive(vnode)) {
if (isTeleport(vnode.type) && vnode.children) return findNonCommentChild(vnode.children);
return vnode;
}
if (vnode.component) return vnode.component.subTree;
const { shapeFlag, children } = vnode;
if (children) {
if (shapeFlag & 16) return children[0];
if (shapeFlag & 32 && isFunction(children.default)) return children.default();
}
}
function setTransitionHooks(vnode, hooks) {
if (vnode.shapeFlag & 6 && vnode.component) {
vnode.transition = hooks;
const subTree = vnode.component.subTree;
setTransitionHooks(isTeleport(subTree.type) ? getInnerChild$1(subTree) || subTree : subTree, hooks);
} else if (vnode.shapeFlag & 128) {
vnode.ssContent.transition = hooks.clone(vnode.ssContent);
vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
} else vnode.transition = hooks;
}
function defineComponent(options, extraOptions) {
return isFunction(options) ? (() => extend({ name: options.name }, extraOptions, { setup: options }))() : options;
}
function markAsyncBoundary(instance) {
instance.ids = [
instance.ids[0] + instance.ids[2]++ + "-",
0,
0
];
}
function isTemplateRefKey(refs, key) {
let desc;
return !!((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable);
}
var pendingSetRefMap = new WeakMap();
function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
if (isArray(rawRef)) {
rawRef.forEach((r, i) => setRef(r, oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), parentSuspense, vnode, isUnmount));
return;
}
if (isAsyncWrapper(vnode) && !isUnmount) {
if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);
return;
}
const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;
const value = isUnmount ? null : refValue;
const { i: owner, r: ref } = rawRef;
const oldRef = oldRawRef && oldRawRef.r;
const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;
const setupState = owner.setupState;
const rawSetupState = toRaw(setupState);
const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {
if (isTemplateRefKey(refs, key)) return false;
return hasOwn(rawSetupState, key);
};
const canSetRef = (ref2, key) => {
if (key && isTemplateRefKey(refs, key)) return false;
return true;
};
if (oldRef != null && oldRef !== ref) {
invalidatePendingSetRef(oldRawRef);
if (isString(oldRef)) {
refs[oldRef] = null;
if (canSetSetupRef(oldRef)) setupState[oldRef] = null;
} else if (isRef(oldRef)) {
const oldRawRefAtom = oldRawRef;
if (canSetRef(oldRef, oldRawRefAtom.k)) oldRef.value = null;
if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;
}
}
if (isFunction(ref)) callWithErrorHandling(ref, owner, 12, [value, refs]);
else {
const _isString = isString(ref);
const _isRef = isRef(ref);
if (_isString || _isRef) {
const doSet = () => {
if (rawRef.f) {
const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];
if (isUnmount) isArray(existing) && remove(existing, refValue);
else if (!isArray(existing)) {
if (_isString) {
refs[ref] = [refValue];
if (canSetSetupRef(ref)) setupState[ref] = refs[ref];
} else {
const newVal = [refValue];
if (canSetRef(ref, rawRef.k)) ref.value = newVal;
if (rawRef.k) refs[rawRef.k] = newVal;
}
} else if (!existing.includes(refValue)) existing.push(refValue);
} else if (_isString) {
refs[ref] = value;
if (canSetSetupRef(ref)) setupState[ref] = value;
} else if (_isRef) {
if (canSetRef(ref, rawRef.k)) ref.value = value;
if (rawRef.k) refs[rawRef.k] = value;
}
};
if (value) {
const job = () => {
doSet();
pendingSetRefMap.delete(rawRef);
};
job.id = -1;
pendingSetRefMap.set(rawRef, job);
queuePostRenderEffect(job, parentSuspense);
} else {
invalidatePendingSetRef(rawRef);
doSet();
}
}
}
}
function invalidatePendingSetRef(rawRef) {
const pendingSetRef = pendingSetRefMap.get(rawRef);
if (pendingSetRef) {
pendingSetRef.flags |= 8;
pendingSetRefMap.delete(rawRef);
}
}
getGlobalThis().requestIdleCallback;
getGlobalThis().cancelIdleCallback;
var isAsyncWrapper = (i) => !!i.type.__asyncLoader;
var isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
function onActivated(hook, target) {
registerKeepAliveHook(hook, "a", target);
}
function onDeactivated(hook, target) {
registerKeepAliveHook(hook, "da", target);
}
function registerKeepAliveHook(hook, type, target = currentInstance) {
const wrappedHook = hook.__wdc || (hook.__wdc = () => {
let current = target;
while (current) {
if (current.isDeactivated) return;
current = current.parent;
}
return hook();
});
injectHook(type, wrappedHook, target);
if (target) {
let current = target.parent;
while (current && current.parent) {
if (isKeepAlive(current.parent.vnode)) injectToKeepAliveRoot(wrappedHook, type, target, current);
current = current.parent;
}
}
}
function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
const injected = injectHook(type, hook, keepAliveRoot, true);
onUnmounted(() => {
remove(keepAliveRoot[type], injected);
}, target);
}
function injectHook(type, hook, target = currentInstance, prepend = false) {
if (target) {
const hooks = target[type] || (target[type] = []);
const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
pauseTracking();
const reset = setCurrentInstance(target);
const res = callWithAsyncErrorHandling(hook, target, type, args);
reset();
resetTracking();
return res;
});
if (prepend) hooks.unshift(wrappedHook);
else hooks.push(wrappedHook);
return wrappedHook;
}
}
var createHook = (lifecycle) => (hook, target = currentInstance) => {
if (!isInSSRComponentSetup || lifecycle === "sp") injectHook(lifecycle, (...args) => hook(...args), target);
};
var onBeforeMount = createHook("bm");
var onMounted = createHook("m");
var onBeforeUpdate = createHook("bu");
var onUpdated = createHook("u");
var onBeforeUnmount = createHook("bum");
var onUnmounted = createHook("um");
var onServerPrefetch = createHook("sp");
var onRenderTriggered = createHook("rtg");
var onRenderTracked = createHook("rtc");
function onErrorCaptured(hook, target = currentInstance) {
injectHook("ec", hook, target);
}
var NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
function renderList(source, renderItem, cache, index) {
let ret;
const cached = cache && cache[index];
const sourceIsArray = isArray(source);
if (sourceIsArray || isString(source)) {
const sourceIsReactiveArray = sourceIsArray && isReactive(source);
let needsWrap = false;
let isReadonlySource = false;
if (sourceIsReactiveArray) {
needsWrap = !isShallow(source);
isReadonlySource = isReadonly(source);
source = shallowReadArray(source);
}
ret = new Array(source.length);
for (let i = 0, l = source.length; i < l; i++) ret[i] = renderItem(needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i], i, void 0, cached && cached[i]);
} else if (typeof source === "number") {
ret = new Array(source);
for (let i = 0; i < source; i++) ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
} else if (isObject(source)) {
if (source[Symbol.iterator]) ret = Array.from(source, (item, i) => renderItem(item, i, void 0, cached && cached[i]));
else {
const keys = Object.keys(source);
ret = new Array(keys.length);
for (let i = 0, l = keys.length; i < l; i++) {
const key = keys[i];
ret[i] = renderItem(source[key], key, i, cached && cached[i]);
}
}
} else ret = [];
if (cache) cache[index] = ret;
return ret;
}
var getPublicInstance = (i) => {
if (!i) return null;
if (isStatefulComponent(i)) return getComponentPublicInstance(i);
return getPublicInstance(i.parent);
};
var publicPropertiesMap = extend(Object.create(null), {
$: (i) => i,
$el: (i) => i.vnode.el,
$data: (i) => i.data,
$props: (i) => i.props,
$attrs: (i) => i.attrs,
$slots: (i) => i.slots,
$refs: (i) => i.refs,
$parent: (i) => getPublicInstance(i.parent),
$root: (i) => getPublicInstance(i.root),
$host: (i) => i.ce,
$emit: (i) => i.emit,
$options: (i) => resolveMergedOptions(i),
$forceUpdate: (i) => i.f || (i.f = () => {
queueJob(i.update);
}),
$nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
$watch: (i) => instanceWatch.bind(i)
});
var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
var PublicInstanceProxyHandlers = {
get({ _: instance }, key) {
if (key === "__v_skip") return true;
const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
if (key[0] !== "$") {
const n = accessCache[key];
if (n !== void 0) switch (n) {
case 1: return setupState[key];
case 2: return data[key];
case 4: return ctx[key];
case 3: return props[key];
}
else if (hasSetupBinding(setupState, key)) {
accessCache[key] = 1;
return setupState[key];
} else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
accessCache[key] = 2;
return data[key];
} else if (hasOwn(props, key)) {
accessCache[key] = 3;
return props[key];
} else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
accessCache[key] = 4;
return ctx[key];
} else if (shouldCacheAccess) accessCache[key] = 0;
}
const publicGetter = publicPropertiesMap[key];
let cssModule, globalProperties;
if (publicGetter) {
if (key === "$attrs") track(instance.attrs, "get", "");
return publicGetter(instance);
} else if ((cssModule = type.__cssModules) && (cssModule = cssModule[key])) return cssModule;
else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
accessCache[key] = 4;
return ctx[key];
} else if (globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)) return globalProperties[key];
},
set({ _: instance }, key, value) {
const { data, setupState, ctx } = instance;
if (hasSetupBinding(setupState, key)) {
setupState[key] = value;
return true;
} else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
data[key] = value;
return true;
} else if (hasOwn(instance.props, key)) return false;
if (key[0] === "$" && key.slice(1) in instance) return false;
else ctx[key] = value;
return true;
},
has({ _: { data, setupState, accessCache, ctx, appContext, props, type } }, key) {
let cssModules;
return !!(accessCache[key] || data !== EMPTY_OBJ && key[0] !== "$" && hasOwn(data, key) || hasSetupBinding(setupState, key) || hasOwn(props, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key) || (cssModules = type.__cssModules) && cssModules[key]);
},
defineProperty(target, key, descriptor) {
if (descriptor.get != null) target._.accessCache[key] = 0;
else if (hasOwn(descriptor, "value")) this.set(target, key, descriptor.value, null);
return Reflect.defineProperty(target, key, descriptor);
}
};
function normalizePropsOrEmits(props) {
return isArray(props) ? props.reduce((normalized, p) => (normalized[p] = null, normalized), {}) : props;
}
var shouldCacheAccess = true;
function applyOptions(instance) {
const options = resolveMergedOptions(instance);
const publicThis = instance.proxy;
const ctx = instance.ctx;
shouldCacheAccess = false;
if (options.beforeCreate) callHook(options.beforeCreate, instance, "bc");
const { data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions, created, beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render, renderTracked, renderTriggered, errorCaptured, serverPrefetch, expose, inheritAttrs, components, directives, filters } = options;
const checkDuplicateProperties = null;
if (injectOptions) resolveInjections(injectOptions, ctx, checkDuplicateProperties);
if (methods) for (const key in methods) {
const methodHandler = methods[key];
if (isFunction(methodHandler)) ctx[key] = methodHandler.bind(publicThis);
}
if (dataOptions) {
const data = dataOptions.call(publicThis, publicThis);
if (!isObject(data)) {} else instance.data = reactive(data);
}
shouldCacheAccess = true;
if (computedOptions) for (const key in computedOptions) {
const opt = computedOptions[key];
const c = computed({
get: isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP,
set: !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : NOOP
});
Object.defineProperty(ctx, key, {
enumerable: true,
configurable: true,
get: () => c.value,
set: (v) => c.value = v
});
}
if (watchOptions) for (const key in watchOptions) createWatcher(watchOptions[key], ctx, publicThis, key);
if (provideOptions) {
const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
Reflect.ownKeys(provides).forEach((key) => {
provide(key, provides[key]);
});
}
if (created) callHook(created, instance, "c");
function registerLifecycleHook(register, hook) {
if (isArray(hook)) hook.forEach((_hook) => register(_hook.bind(publicThis)));
else if (hook) register(hook.bind(publicThis));
}
registerLifecycleHook(onBeforeMount, beforeMount);
registerLifecycleHook(onMounted, mounted);
registerLifecycleHook(onBeforeUpdate, beforeUpdate);
registerLifecycleHook(onUpdated, updated);
registerLifecycleHook(onActivated, activated);
registerLifecycleHook(onDeactivated, deactivated);
registerLifecycleHook(onErrorCaptured, errorCaptured);
registerLifecycleHook(onRenderTracked, renderTracked);
registerLifecycleHook(onRenderTriggered, renderTriggered);
registerLifecycleHook(onBeforeUnmount, beforeUnmount);
registerLifecycleHook(onUnmounted, unmounted);
registerLifecycleHook(onServerPrefetch, serverPrefetch);
if (isArray(expose)) {
if (expose.length) {
const exposed = instance.exposed || (instance.exposed = {});
expose.forEach((key) => {
Object.defineProperty(exposed, key, {
get: () => publicThis[key],
set: (val) => publicThis[key] = val,
enumerable: true
});
});
} else if (!instance.exposed) instance.exposed = {};
}
if (render && instance.render === NOOP) instance.render = render;
if (inheritAttrs != null) instance.inheritAttrs = inheritAttrs;
if (components) instance.components = components;
if (directives) instance.directives = directives;
if (serverPrefetch) markAsyncBoundary(instance);
}
function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {
if (isArray(injectOptions)) injectOptions = normalizeInject(injectOptions);
for (const key in injectOptions) {
const opt = injectOptions[key];
let injected;
if (isObject(opt)) {
if ("default" in opt) injected = inject(opt.from || key, opt.default, true);
else injected = inject(opt.from || key);
} else injected = inject(opt);
if (isRef(injected)) Object.defineProperty(ctx, key, {
enumerable: true,
configurable: true,
get: () => injected.value,
set: (v) => injected.value = v
});
else ctx[key] = injected;
}
}
function callHook(hook, instance, type) {
callWithAsyncErrorHandling(isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy), instance, type);
}
function createWatcher(raw, ctx, publicThis, key) {
let getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
if (isString(raw)) {
const handler = ctx[raw];
if (isFunction(handler)) watch(getter, handler);
} else if (isFunction(raw)) watch(getter, raw.bind(publicThis));
else if (isObject(raw)) {
if (isArray(raw)) raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
else {
const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
if (isFunction(handler)) watch(getter, handler, raw);
}
}
}
function resolveMergedOptions(instance) {
const base = instance.type;
const { mixins, extends: extendsOptions } = base;
const { mixins: globalMixins, optionsCache: cache, config: { optionMergeStrategies } } = instance.appContext;
const cached = cache.get(base);
let resolved;
if (cached) resolved = cached;
else if (!globalMixins.length && !mixins && !extendsOptions) resolved = base;
else {
resolved = {};
if (globalMixins.length) globalMixins.forEach((m) => mergeOptions(resolved, m, optionMergeStrategies, true));
mergeOptions(resolved, base, optionMergeStrategies);
}
if (isObject(base)) cache.set(base, resolved);
return resolved;
}
function mergeOptions(to, from, strats, asMixin = false) {
const { mixins, extends: extendsOptions } = from;
if (extendsOptions) mergeOptions(to, extendsOptions, strats, true);
if (mixins) mixins.forEach((m) => mergeOptions(to, m, strats, true));
for (const key in from) if (asMixin && key === "expose") {} else {
const strat = internalOptionMergeStrats[key] || strats && strats[key];
to[key] = strat ? strat(to[key], from[key]) : from[key];
}
return to;
}
var internalOptionMergeStrats = {
data: mergeDataFn,
props: mergeEmitsOrPropsOptions,
emits: mergeEmitsOrPropsOptions,
methods: mergeObjectOptions,
computed: mergeObjectOptions,
beforeCreate: mergeAsArray,
created: mergeAsArray,
beforeMount: mergeAsArray,
mounted: mergeAsArray,
beforeUpdate: mergeAsArray,
updated: mergeAsArray,
beforeDestroy: mergeAsArray,
beforeUnmount: mergeAsArray,
destroyed: mergeAsArray,
unmounted: mergeAsArray,
activated: mergeAsArray,
deactivated: mergeAsArray,
errorCaptured: mergeAsArray,
serverPrefetch: mergeAsArray,
components: mergeObjectOptions,
directives: mergeObjectOptions,
watch: mergeWatchOptions,
provide: mergeDataFn,
inject: mergeInject
};
function mergeDataFn(to, from) {
if (!from) return to;
if (!to) return from;
return function mergedDataFn() {
return extend(isFunction(to) ? to.call(this, this) : to, isFunction(from) ? from.call(this, this) : from);
};
}
function mergeInject(to, from) {
return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
}
function normalizeInject(raw) {
if (isArray(raw)) {
const res = {};
for (let i = 0; i < raw.length; i++) res[raw[i]] = raw[i];
return res;
}
return raw;
}
function mergeAsArray(to, from) {
return to ? [...new Set([].concat(to, from))] : from;
}
function mergeObjectOptions(to, from) {
return to ? extend(Object.create(null), to, from) : from;
}
function mergeEmitsOrPropsOptions(to, from) {
if (to) {
if (isArray(to) && isArray(from)) return [...new Set([...to, ...from])];
return extend(Object.create(null), normalizePropsOrEmits(to), normalizePropsOrEmits(from != null ? from : {}));
} else return from;
}
function mergeWatchOptions(to, from) {
if (!to) return from;
if (!from) return to;
const merged = extend(Object.create(null), to);
for (const key in from) merged[key] = mergeAsArray(to[key], from[key]);
return merged;
}
function createAppContext() {
return {
app: null,
config: {
isNativeTag: NO,
performance: false,
globalProperties: {},
optionMergeStrategies: {},
errorHandler: void 0,
warnHandler: void 0,
compilerOptions: {}
},
mixins: [],
components: {},
directives: {},
provides: Object.create(null),
optionsCache: new WeakMap(),
propsCache: new WeakMap(),
emitsCache: new WeakMap()
};
}
var uid$1 = 0;
function createAppAPI(render, hydrate) {
return function createApp(rootComponent, rootProps = null) {
if (!isFunction(rootComponent)) rootComponent = extend({}, rootComponent);
if (rootProps != null && !isObject(rootProps)) rootProps = null;
const context = createAppContext();
const installedPlugins = new WeakSet();
const pluginCleanupFns = [];
let isMounted = false;
const app = context.app = {
_uid: uid$1++,
_component: rootComponent,
_props: rootProps,
_container: null,
_context: context,
_instance: null,
version,
get config() {
return context.config;
},
set config(v) {},
use(plugin, ...options) {
if (installedPlugins.has(plugin)) {} else if (plugin && isFunction(plugin.install)) {
installedPlugins.add(plugin);
plugin.install(app, ...options);
} else if (isFunction(plugin)) {
installedPlugins.add(plugin);
plugin(app, ...options);
}
return app;
},
mixin(mixin) {
if (!context.mixins.includes(mixin)) context.mixins.push(mixin);
return app;
},
component(name, component) {
if (!component) return context.components[name];
context.components[name] = component;
return app;
},
directive(name, directive) {
if (!directive) return context.directives[name];
context.directives[name] = directive;
return app;
},
mount(rootContainer, isHydrate, namespace) {
if (!isMounted) {
const vnode = app._ceVNode || createVNode(rootComponent, rootProps);
vnode.appContext = context;
if (namespace === true) namespace = "svg";
else if (namespace === false) namespace = void 0;
if (isHydrate && hydrate) hydrate(vnode, rootContainer);
else render(vnode, rootContainer, namespace);
isMounted = true;
app._container = rootContainer;
rootContainer.__vue_app__ = app;
return getComponentPublicInstance(vnode.component);
}
},
onUnmount(cleanupFn) {
pluginCleanupFns.push(cleanupFn);
},
unmount() {
if (isMounted) {
callWithAsyncErrorHandling(pluginCleanupFns, app._instance, 16);
render(null, app._container);
delete app._container.__vue_app__;
}
},
provide(key, value) {
context.provides[key] = value;
return app;
},
runWithContext(fn) {
const lastApp = currentApp;
currentApp = app;
try {
return fn();
} finally {
currentApp = lastApp;
}
}
};
return app;
};
}
var currentApp = null;
var getModelModifiers = (props, modelName) => {
return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`];
};
function emit(instance, event, ...rawArgs) {
if (instance.isUnmounted) return;
const props = instance.vnode.props || EMPTY_OBJ;
let args = rawArgs;
const isModelListener = event.startsWith("update:");
const modifiers = isModelListener && getModelModifiers(props, event.slice(7));
if (modifiers) {
if (modifiers.trim) args = rawArgs.map((a) => isString(a) ? a.trim() : a);
if (modifiers.number) args = args.map(looseToNumber);
}
let handlerName;
let handler = props[handlerName = toHandlerKey(event)] || props[handlerName = toHandlerKey(camelize(event))];
if (!handler && isModelListener) handler = props[handlerName = toHandlerKey(hyphenate(event))];
if (handler) callWithAsyncErrorHandling(handler, instance, 6, args);
const onceHandler = props[handlerName + `Once`];
if (onceHandler) {
if (!instance.emitted) instance.emitted = {};
else if (instance.emitted[handlerName]) return;
instance.emitted[handlerName] = true;
callWithAsyncErrorHandling(onceHandler, instance, 6, args);
}
}
var mixinEmitsCache = new WeakMap();
function normalizeEmitsOptions(comp, appContext, asMixin = false) {
const cache = asMixin ? mixinEmitsCache : appContext.emitsCache;
const cached = cache.get(comp);
if (cached !== void 0) return cached;
const raw = comp.emits;
let normalized = {};
let hasExtends = false;
if (!isFunction(comp)) {
const extendEmits = (raw2) => {
const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
if (normalizedFromExtend) {
hasExtends = true;
extend(normalized, normalizedFromExtend);
}
};
if (!asMixin && appContext.mixins.length) appContext.mixins.forEach(extendEmits);
if (comp.extends) extendEmits(comp.extends);
if (comp.mixins) comp.mixins.forEach(extendEmits);
}
if (!raw && !hasExtends) {
if (isObject(comp)) cache.set(comp, null);
return null;
}
if (isArray(raw)) raw.forEach((key) => normalized[key] = null);
else extend(normalized, raw);
if (isObject(comp)) cache.set(comp, normalized);
return normalized;
}
function isEmitListener(options, key) {
if (!options || !isOn(key)) return false;
key = key.slice(2);
key = key === "Once" ? key : key.replace(/Once$/, "");
return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
}
function renderComponentRoot(instance) {
const { type: Component, vnode, proxy, withProxy, propsOptions: [propsOptions], slots, attrs, emit, render, renderCache, props, data, setupState, ctx, inheritAttrs } = instance;
const prev = setCurrentRenderingInstance(instance);
let result;
let fallthroughAttrs;
try {
if (vnode.shapeFlag & 4) {
const proxyToUse = withProxy || proxy;
const thisProxy = proxyToUse;
result = normalizeVNode(render.call(thisProxy, proxyToUse, renderCache, props, setupState, data, ctx));
fallthroughAttrs = attrs;
} else {
const render2 = Component;
result = normalizeVNode(render2.length > 1 ? render2(props, {
attrs,
slots,
emit
}) : render2(props, null));
fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
}
} catch (err) {
blockStack.length = 0;
handleError(err, instance, 1);
result = createVNode(Comment);
}
let root = result;
if (fallthroughAttrs && inheritAttrs !== false) {
const keys = Object.keys(fallthroughAttrs);
const { shapeFlag } = root;
if (keys.length) {
if (shapeFlag & 7) {
if (propsOptions && keys.some(isModelListener)) fallthroughAttrs = filterModelListeners(fallthroughAttrs, propsOptions);
root = cloneVNode(root, fallthroughAttrs, false, true);
}
}
}
if (vnode.dirs) {
root = cloneVNode(root, null, false, true);
root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
}
if (vnode.transition) setTransitionHooks(isTeleport(root.type) ? getInnerChild$1(root) || root : root, vnode.transition);
result = root;
setCurrentRenderingInstance(prev);
return result;
}
var getFunctionalFallthrough = (attrs) => {
let res;
for (const key in attrs) if (key === "class" || key === "style" || isOn(key)) (res || (res = {}))[key] = attrs[key];
return res;
};
var filterModelListeners = (attrs, props) => {
const res = {};
for (const key in attrs) if (!isModelListener(key) || !(key.slice(9) in props)) res[key] = attrs[key];
return res;
};
function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
const { props: prevProps, children: prevChildren, component } = prevVNode;
const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
const emits = component.emitsOptions;
if (nextVNode.dirs || nextVNode.transition) return true;
if (optimized && patchFlag >= 0) {
if (patchFlag & 1024) return true;
if (patchFlag & 16) {
if (!prevProps) return !!nextProps;
return hasPropsChanged(prevProps, nextProps, emits);
} else if (patchFlag & 8) {
const dynamicProps = nextVNode.dynamicProps;
for (let i = 0; i < dynamicProps.length; i++) {
const key = dynamicProps[i];
if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emits, key)) return true;
}
}
} else {
if (prevChildren || nextChildren) {
if (!nextChildren || !nextChildren.$stable) return true;
}
if (prevProps === nextProps) return false;
if (!prevProps) return !!nextProps;
if (!nextProps) return true;
return hasPropsChanged(prevProps, nextProps, emits);
}
return false;
}
function hasPropsChanged(prevProps, nextProps, emitsOptions) {
const nextKeys = Object.keys(nextProps);
if (nextKeys.length !== Object.keys(prevProps).length) return true;
for (let i = 0; i < nextKeys.length; i++) {
const key = nextKeys[i];
if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emitsOptions, key)) return true;
}
return false;
}
function hasPropValueChanged(nextProps, prevProps, key) {
const nextProp = nextProps[key];
const prevProp = prevProps[key];
if (key === "style" && isObject(nextProp) && isObject(prevProp)) return !looseEqual(nextProp, prevProp);
return nextProp !== prevProp;
}
function updateHOCHostEl({ vnode, parent, suspense }, el) {
while (parent) {
const root = parent.subTree;
if (root.suspense && root.suspense.activeBranch === vnode) {
root.suspense.vnode.el = root.el = el;
vnode = root;
}
if (root === vnode) {
(vnode = parent.vnode).el = el;
parent = parent.parent;
} else break;
}
if (suspense && suspense.activeBranch === vnode) suspense.vnode.el = el;
}
var internalObjectProto = {};
var createInternalObject = () => Object.create(internalObjectProto);
var isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;
function initProps(instance, rawProps, isStateful, isSSR = false) {
const props = {};
const attrs = createInternalObject();
instance.propsDefaults = Object.create(null);
setFullProps(instance, rawProps, props, attrs);
for (const key in instance.propsOptions[0]) if (!(key in props)) props[key] = void 0;
if (isStateful) instance.props = isSSR ? props : shallowReactive(props);
else if (!instance.type.props) instance.props = attrs;
else instance.props = props;
instance.attrs = attrs;
}
function updateProps(instance, rawProps, rawPrevProps, optimized) {
const { props, attrs, vnode: { patchFlag } } = instance;
const rawCurrentProps = toRaw(props);
const [options] = instance.propsOptions;
let hasAttrsChanged = false;
if ((optimized || patchFlag > 0) && !(patchFlag & 16)) {
if (patchFlag & 8) {
const propsToUpdate = instance.vnode.dynamicProps;
for (let i = 0; i < propsToUpdate.length; i++) {
let key = propsToUpdate[i];
if (isEmitListener(instance.emitsOptions, key)) continue;
const value = rawProps[key];
if (options) {
if (hasOwn(attrs, key)) {
if (value !== attrs[key]) {
attrs[key] = value;
hasAttrsChanged = true;
}
} else {
const camelizedKey = camelize(key);
props[camelizedKey] = resolvePropValue(options, rawCurrentProps, camelizedKey, value, instance, false);
}
} else if (value !== attrs[key]) {
attrs[key] = value;
hasAttrsChanged = true;
}
}
}
} else {
if (setFullProps(instance, rawProps, props, attrs)) hasAttrsChanged = true;
let kebabKey;
for (const key in rawCurrentProps) if (!rawProps || !hasOwn(rawProps, key) && ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {
if (options) {
if (rawPrevProps && (rawPrevProps[key] !== void 0 || rawPrevProps[kebabKey] !== void 0)) props[key] = resolvePropValue(options, rawCurrentProps, key, void 0, instance, true);
} else delete props[key];
}
if (attrs !== rawCurrentProps) {
for (const key in attrs) if (!rawProps || !hasOwn(rawProps, key) && true) {
delete attrs[key];
hasAttrsChanged = true;
}
}
}
if (hasAttrsChanged) trigger$1(instance.attrs, "set", "");
}
function setFullProps(instance, rawProps, props, attrs) {
const [options, needCastKeys] = instance.propsOptions;
let hasAttrsChanged = false;
let rawCastValues;
if (rawProps) for (let key in rawProps) {
if (isReservedProp(key)) continue;
const value = rawProps[key];
let camelKey;
if (options && hasOwn(options, camelKey = camelize(key))) {
if (!needCastKeys || !needCastKeys.includes(camelKey)) props[camelKey] = value;
else (rawCastValues || (rawCastValues = {}))[camelKey] = value;
} else if (!isEmitListener(instance.emitsOptions, key)) {
if (!(key in attrs) || value !== attrs[key]) {
attrs[key] = value;
hasAttrsChanged = true;
}
}
}
if (needCastKeys) {
const rawCurrentProps = toRaw(props);
const castValues = rawCastValues || EMPTY_OBJ;
for (let i = 0; i < needCastKeys.length; i++) {
const key = needCastKeys[i];
props[key] = resolvePropValue(options, rawCurrentProps, key, castValues[key], instance, !hasOwn(castValues, key));
}
}
return hasAttrsChanged;
}
function resolvePropValue(options, props, key, value, instance, isAbsent) {
const opt = options[key];
if (opt != null) {
const hasDefault = hasOwn(opt, "default");
if (hasDefault && value === void 0) {
const defaultValue = opt.default;
if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {
const { propsDefaults } = instance;
if (key in propsDefaults) value = propsDefaults[key];
else {
const reset = setCurrentInstance(instance);
value = propsDefaults[key] = defaultValue.call(null, props);
reset();
}
} else value = defaultValue;
if (instance.ce) instance.ce._setProp(key, value);
}
if (opt[0]) {
if (isAbsent && !hasDefault) value = false;
else if (opt[1] && (value === "" || value === hyphenate(key))) value = true;
}
}
return value;
}
var mixinPropsCache = new WeakMap();
function normalizePropsOptions(comp, appContext, asMixin = false) {
const cache = asMixin ? mixinPropsCache : appContext.propsCache;
const cached = cache.get(comp);
if (cached) return cached;
const raw = comp.props;
const normalized = {};
const needCastKeys = [];
let hasExtends = false;
if (!isFunction(comp)) {
const extendProps = (raw2) => {
hasExtends = true;
const [props, keys] = normalizePropsOptions(raw2, appContext, true);
extend(normalized, props);
if (keys) needCastKeys.push(...keys);
};
if (!asMixin && appContext.mixins.length) appContext.mixins.forEach(extendProps);
if (comp.extends) extendProps(comp.extends);
if (comp.mixins) comp.mixins.forEach(extendProps);
}
if (!raw && !hasExtends) {
if (isObject(comp)) cache.set(comp, EMPTY_ARR);
return EMPTY_ARR;
}
if (isArray(raw)) for (let i = 0; i < raw.length; i++) {
const normalizedKey = camelize(raw[i]);
if (validatePropName(normalizedKey)) normalized[normalizedKey] = EMPTY_OBJ;
}
else if (raw) for (const key in raw) {
const normalizedKey = camelize(key);
if (validatePropName(normalizedKey)) {
const opt = raw[key];
const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);
const propType = prop.type;
let shouldCast = false;
let shouldCastTrue = true;
if (isArray(propType)) for (let index = 0; index < propType.length; ++index) {
const type = propType[index];
const typeName = isFunction(type) && type.name;
if (typeName === "Boolean") {
shouldCast = true;
break;
} else if (typeName === "String") shouldCastTrue = false;
}
else shouldCast = isFunction(propType) && propType.name === "Boolean";
prop[0] = shouldCast;
prop[1] = shouldCastTrue;
if (shouldCast || hasOwn(prop, "default")) needCastKeys.push(normalizedKey);
}
}
const res = [normalized, needCastKeys];
if (isObject(comp)) cache.set(comp, res);
return res;
}
function validatePropName(key) {
if (key[0] !== "$" && !isReservedProp(key)) return true;
return false;
}
var isInternalKey = (key) => key === "_" || key === "_ctx" || key === "$stable";
var normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];
var normalizeSlot = (key, rawSlot, ctx) => {
if (rawSlot._n) return rawSlot;
const normalized = withCtx((...args) => {
return normalizeSlotValue(rawSlot(...args));
}, ctx);
normalized._c = false;
return normalized;
};
var normalizeObjectSlots = (rawSlots, slots, instance) => {
const ctx = rawSlots._ctx;
for (const key in rawSlots) {
if (isInternalKey(key)) continue;
const value = rawSlots[key];
if (isFunction(value)) slots[key] = normalizeSlot(key, value, ctx);
else if (value != null) {
const normalized = normalizeSlotValue(value);
slots[key] = () => normalized;
}
}
};
var normalizeVNodeSlots = (instance, children) => {
const normalized = normalizeSlotValue(children);
instance.slots.default = () => normalized;
};
var assignSlots = (slots, children, optimized) => {
for (const key in children) if (optimized || !isInternalKey(key)) slots[key] = children[key];
};
var initSlots = (instance, children, optimized) => {
const slots = instance.slots = createInternalObject();
if (instance.vnode.shapeFlag & 32) {
const type = children._;
if (type) {
assignSlots(slots, children, optimized);
if (optimized) def(slots, "_", type, true);
} else normalizeObjectSlots(children, slots);
} else if (children) normalizeVNodeSlots(instance, children);
};
var updateSlots = (instance, children, optimized) => {
const { vnode, slots } = instance;
let needDeletionCheck = true;
let deletionComparisonTarget = EMPTY_OBJ;
if (vnode.shapeFlag & 32) {
const type = children._;
if (type) {
if (optimized && type === 1) needDeletionCheck = false;
else assignSlots(slots, children, optimized);
} else {
needDeletionCheck = !children.$stable;
normalizeObjectSlots(children, slots);
}
deletionComparisonTarget = children;
} else if (children) {
normalizeVNodeSlots(instance, children);
deletionComparisonTarget = { default: 1 };
}
if (needDeletionCheck) {
for (const key in slots) if (!isInternalKey(key) && deletionComparisonTarget[key] == null) delete slots[key];
}
};
var queuePostRenderEffect = queueEffectWithSuspense;
function createRenderer(options) {
return baseCreateRenderer(options);
}
function baseCreateRenderer(options, createHydrationFns) {
const target = getGlobalThis();
target.__VUE__ = true;
const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = NOOP, insertStaticContent: hostInsertStaticContent } = options;
const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!n2.dynamicChildren) => {
if (n1 === n2) return;
if (n1 && !isSameVNodeType(n1, n2)) {
anchor = getNextHostNode(n1);
unmount(n1, parentComponent, parentSuspense, true);
n1 = null;
}
if (n2.patchFlag === -2) {
optimized = false;
n2.dynamicChildren = null;
}
if (n2.dynamicChildren && n1 && n1.dynamicChildren && n1.dynamicChildren.hasOnce) {
if (n2.dynamicChildren === EMPTY_ARR) n2.dynamicChildren = [];
n2.dynamicChildren.hasOnce = true;
}
const { type, ref, shapeFlag } = n2;
switch (type) {
case Text:
processText(n1, n2, container, anchor);
break;
case Comment:
processCommentNode(n1, n2, container, anchor);
break;
case Static:
if (n1 == null) mountStaticNode(n2, container, anchor, namespace);
break;
case Fragment:
processFragment(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
break;
default: if (shapeFlag & 1) processElement(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else if (shapeFlag & 6) processComponent(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else if (shapeFlag & 64) type.process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals);
else if (shapeFlag & 128) type.process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals);
}
if (ref != null && parentComponent) setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);
else if (ref == null && n1 && n1.ref != null) setRef(n1.ref, null, parentSuspense, n1, true);
};
const processText = (n1, n2, container, anchor) => {
if (n1 == null) hostInsert(n2.el = hostCreateText(n2.children), container, anchor);
else {
const el = n2.el = n1.el;
if (n2.children !== n1.children) hostSetText(el, n2.children);
}
};
const processCommentNode = (n1, n2, container, anchor) => {
if (n1 == null) hostInsert(n2.el = hostCreateComment(n2.children || ""), container, anchor);
else n2.el = n1.el;
};
const mountStaticNode = (n2, container, anchor, namespace) => {
[n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, namespace, n2.el, n2.anchor);
};
const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
let next;
while (el && el !== anchor) {
next = hostNextSibling(el);
hostInsert(el, container, nextSibling);
el = next;
}
hostInsert(anchor, container, nextSibling);
};
const removeStaticNode = ({ el, anchor }) => {
let next;
while (el && el !== anchor) {
next = hostNextSibling(el);
hostRemove(el);
el = next;
}
hostRemove(anchor);
};
const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
if (n2.type === "svg") namespace = "svg";
else if (n2.type === "math") namespace = "mathml";
if (n1 == null) mountElement(n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else {
const customElement = n1.el && n1.el._isVueCE ? n1.el : null;
try {
if (customElement) customElement._beginPatch();
patchElement(n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
} finally {
if (customElement) customElement._endPatch();
}
}
};
const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
let el;
let vnodeHook;
const { props, shapeFlag, transition, dirs } = vnode;
el = vnode.el = hostCreateElement(vnode.type, namespace, props && props.is, props);
if (shapeFlag & 8) hostSetElementText(el, vnode.children);
else if (shapeFlag & 16) mountChildren(vnode.children, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(vnode, namespace), slotScopeIds, optimized);
if (dirs) invokeDirectiveHook(vnode, null, parentComponent, "created");
setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
if (props) {
for (const key in props) if (key !== "value" && !isReservedProp(key)) hostPatchProp(el, key, null, props[key], namespace, parentComponent);
if ("value" in props) hostPatchProp(el, "value", null, props.value, namespace);
if (vnodeHook = props.onVnodeBeforeMount) invokeVNodeHook(vnodeHook, parentComponent, vnode);
}
if (dirs) invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
const needCallTransitionHooks = needTransition(parentSuspense, transition);
if (needCallTransitionHooks) transition.beforeEnter(el);
hostInsert(el, container, anchor);
if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) queuePostRenderEffect(() => {
try {
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
needCallTransitionHooks && transition.enter(el);
dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
} finally {}
}, parentSuspense);
};
const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {
if (scopeId) hostSetScopeId(el, scopeId);
if (slotScopeIds) for (let i = 0; i < slotScopeIds.length; i++) hostSetScopeId(el, slotScopeIds[i]);
if (parentComponent) {
let subTree = parentComponent.subTree;
if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) {
const parentVNode = parentComponent.vnode;
setScopeId(el, parentVNode, parentVNode.scopeId, parentVNode.slotScopeIds, parentComponent.parent);
}
}
};
const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {
for (let i = start; i < children.length; i++) {
const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);
patch(null, child, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
}
};
const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
const el = n2.el = n1.el;
let { patchFlag, dynamicChildren, dirs } = n2;
patchFlag |= n1.patchFlag & 16;
const oldProps = n1.props || EMPTY_OBJ;
const newProps = n2.props || EMPTY_OBJ;
let vnodeHook;
parentComponent && toggleRecurse(parentComponent, false);
if (vnodeHook = newProps.onVnodeBeforeUpdate) invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
if (dirs) invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate");
parentComponent && toggleRecurse(parentComponent, true);
if (dynamicChildren && (!n1.dynamicChildren || n1.dynamicChildren.length !== dynamicChildren.length)) {
patchFlag = 0;
optimized = false;
dynamicChildren = null;
}
if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) hostSetElementText(el, "");
if (dynamicChildren) patchBlockChildren(n1.dynamicChildren, dynamicChildren, el, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds);
else if (!optimized) patchChildren(n1, n2, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds, false);
if (patchFlag > 0) {
if (patchFlag & 16) patchProps(el, oldProps, newProps, parentComponent, namespace);
else {
if (patchFlag & 2) {
if (oldProps.class !== newProps.class) hostPatchProp(el, "class", null, newProps.class, namespace);
}
if (patchFlag & 4) hostPatchProp(el, "style", oldProps.style, newProps.style, namespace);
if (patchFlag & 8) {
const propsToUpdate = n2.dynamicProps;
for (let i = 0; i < propsToUpdate.length; i++) {
const key = propsToUpdate[i];
const prev = oldProps[key];
const next = newProps[key];
if (next !== prev || key === "value") hostPatchProp(el, key, prev, next, namespace, parentComponent);
}
}
}
if (patchFlag & 1) {
if (n1.children !== n2.children) hostSetElementText(el, n2.children);
}
} else if (!optimized && dynamicChildren == null) patchProps(el, oldProps, newProps, parentComponent, namespace);
if ((vnodeHook = newProps.onVnodeUpdated) || dirs) queuePostRenderEffect(() => {
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated");
}, parentSuspense);
};
const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {
for (let i = 0; i < newChildren.length; i++) {
const oldVNode = oldChildren[i];
const newVNode = newChildren[i];
const container = oldVNode.el && (oldVNode.type === Fragment || !isSameVNodeType(oldVNode, newVNode) || oldVNode.shapeFlag & 198) ? hostParentNode(oldVNode.el) : fallbackContainer;
patch(oldVNode, newVNode, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, true);
}
};
const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {
if (oldProps !== newProps) {
if (oldProps !== EMPTY_OBJ) {
for (const key in oldProps) if (!isReservedProp(key) && !(key in newProps)) hostPatchProp(el, key, oldProps[key], null, namespace, parentComponent);
}
for (const key in newProps) {
if (isReservedProp(key)) continue;
const next = newProps[key];
const prev = oldProps[key];
if (next !== prev && key !== "value") hostPatchProp(el, key, prev, next, namespace, parentComponent);
}
if ("value" in newProps) hostPatchProp(el, "value", oldProps.value, newProps.value, namespace);
}
};
const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText("");
const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText("");
let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;
if (fragmentSlotScopeIds) slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
if (n1 == null) {
hostInsert(fragmentStartAnchor, container, anchor);
hostInsert(fragmentEndAnchor, container, anchor);
mountChildren(n2.children || [], container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
} else if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && n1.dynamicChildren && n1.dynamicChildren.length === dynamicChildren.length) {
patchBlockChildren(n1.dynamicChildren, dynamicChildren, container, parentComponent, parentSuspense, namespace, slotScopeIds);
if (n2.key != null || parentComponent && n2 === parentComponent.subTree) traverseStaticChildren(n1, n2, true);
} else patchChildren(n1, n2, container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
};
const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
n2.slotScopeIds = slotScopeIds;
if (n1 == null) {
if (n2.shapeFlag & 512) parentComponent.ctx.activate(n2, container, anchor, namespace, optimized);
else mountComponent(n2, container, anchor, parentComponent, parentSuspense, namespace, optimized);
} else updateComponent(n1, n2, optimized);
};
const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {
const instance = initialVNode.component = createComponentInstance(initialVNode, parentComponent, parentSuspense);
if (isKeepAlive(initialVNode)) instance.ctx.renderer = internals;
setupComponent(instance, false, optimized);
if (instance.asyncDep) {
parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);
if (!initialVNode.el) {
const placeholder = instance.subTree = createVNode(Comment);
processCommentNode(null, placeholder, container, anchor);
initialVNode.placeholder = placeholder.el;
}
} else setupRenderEffect(instance, initialVNode, container, anchor, parentSuspense, namespace, optimized);
};
const updateComponent = (n1, n2, optimized) => {
const instance = n2.component = n1.component;
if (shouldUpdateComponent(n1, n2, optimized)) {
if (instance.asyncDep && !instance.asyncResolved) {
n2.el = n1.el;
updateComponentPreRender(instance, n2, optimized);
return;
} else {
instance.next = n2;
instance.update();
}
} else {
n2.el = n1.el;
instance.vnode = n2;
}
};
const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {
const componentUpdateFn = () => {
if (!instance.isMounted) {
let vnodeHook;
const { el, props } = initialVNode;
const { bm, m, parent, root, type } = instance;
const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);
toggleRecurse(instance, false);
if (bm) invokeArrayFns(bm);
if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) invokeVNodeHook(vnodeHook, parent, initialVNode);
toggleRecurse(instance, true);
if (el && hydrateNode) {
const hydrateSubTree = () => {
instance.subTree = renderComponentRoot(instance);
hydrateNode(el, instance.subTree, instance, parentSuspense, null);
};
if (isAsyncWrapperVNode && type.__asyncHydrate) type.__asyncHydrate(el, instance, hydrateSubTree);
else hydrateSubTree();
} else {
if (root.ce && root.ce._hasShadowRoot()) root.ce._injectChildStyle(type, instance.parent ? instance.parent.type : void 0);
const subTree = instance.subTree = renderComponentRoot(instance);
patch(null, subTree, container, anchor, instance, parentSuspense, namespace);
initialVNode.el = subTree.el;
}
if (m) queuePostRenderEffect(m, parentSuspense);
if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {
const scopedInitialVNode = initialVNode;
queuePostRenderEffect(() => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode), parentSuspense);
}
if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) instance.a && queuePostRenderEffect(instance.a, parentSuspense);
instance.isMounted = true;
initialVNode = container = anchor = null;
} else {
let { next, bu, u, parent, vnode } = instance;
{
const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);
if (nonHydratedAsyncRoot) {
if (next) {
next.el = vnode.el;
updateComponentPreRender(instance, next, optimized);
}
nonHydratedAsyncRoot.asyncDep.then(() => {
queuePostRenderEffect(() => {
if (!instance.isUnmounted) update();
}, parentSuspense);
});
return;
}
}
let originNext = next;
let vnodeHook;
toggleRecurse(instance, false);
if (next) {
next.el = vnode.el;
updateComponentPreRender(instance, next, optimized);
} else next = vnode;
if (bu) invokeArrayFns(bu);
if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) invokeVNodeHook(vnodeHook, parent, next, vnode);
toggleRecurse(instance, true);
const nextTree = renderComponentRoot(instance);
const prevTree = instance.subTree;
instance.subTree = nextTree;
patch(prevTree, nextTree, hostParentNode(prevTree.el), getNextHostNode(prevTree), instance, parentSuspense, namespace);
next.el = nextTree.el;
if (originNext === null) updateHOCHostEl(instance, nextTree.el);
if (u) queuePostRenderEffect(u, parentSuspense);
if (vnodeHook = next.props && next.props.onVnodeUpdated) queuePostRenderEffect(() => invokeVNodeHook(vnodeHook, parent, next, vnode), parentSuspense);
}
};
instance.scope.on();
const effect = instance.effect = new ReactiveEffect(componentUpdateFn);
instance.scope.off();
const update = instance.update = effect.run.bind(effect);
const job = instance.job = effect.runIfDirty.bind(effect);
job.i = instance;
job.id = instance.uid;
effect.scheduler = () => queueJob(job);
toggleRecurse(instance, true);
update();
};
const updateComponentPreRender = (instance, nextVNode, optimized) => {
nextVNode.component = instance;
const prevProps = instance.vnode.props;
instance.vnode = nextVNode;
instance.next = null;
updateProps(instance, nextVNode.props, prevProps, optimized);
updateSlots(instance, nextVNode.children, optimized);
pauseTracking();
flushPreFlushCbs(instance);
resetTracking();
};
const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {
const c1 = n1 && n1.children;
const prevShapeFlag = n1 ? n1.shapeFlag : 0;
const c2 = n2.children;
const { patchFlag, shapeFlag } = n2;
if (patchFlag > 0) {
if (patchFlag & 128) {
patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
return;
} else if (patchFlag & 256) {
patchUnkeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
return;
}
}
if (shapeFlag & 8) {
if (prevShapeFlag & 16) unmountChildren(c1, parentComponent, parentSuspense);
if (c2 !== c1) hostSetElementText(container, c2);
} else if (prevShapeFlag & 16) {
if (shapeFlag & 16) patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else unmountChildren(c1, parentComponent, parentSuspense, true);
} else {
if (prevShapeFlag & 8) hostSetElementText(container, "");
if (shapeFlag & 16) mountChildren(c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
}
};
const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
c1 = c1 || EMPTY_ARR;
c2 = c2 || EMPTY_ARR;
const oldLength = c1.length;
const newLength = c2.length;
const commonLength = Math.min(oldLength, newLength);
let i = 0;
for (; i < commonLength; i++) {
const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
patch(c1[i], nextChild, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
}
if (oldLength > newLength) unmountChildren(c1, parentComponent, parentSuspense, true, false, commonLength);
else mountChildren(c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, commonLength);
};
const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
let i = 0;
const l2 = c2.length;
let e1 = c1.length - 1;
let e2 = l2 - 1;
while (i <= e1 && i <= e2) {
const n1 = c1[i];
const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
if (isSameVNodeType(n1, n2)) patch(n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else break;
i++;
}
while (i <= e1 && i <= e2) {
const n1 = c1[e1];
const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);
if (isSameVNodeType(n1, n2)) patch(n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else break;
e1--;
e2--;
}
if (i > e1) {
if (i <= e2) {
const nextPos = e2 + 1;
const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
while (i <= e2) {
patch(null, c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]), container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
i++;
}
}
} else if (i > e2) while (i <= e1) {
unmount(c1[i], parentComponent, parentSuspense, true);
i++;
}
else {
const s1 = i;
const s2 = i;
const keyToNewIndexMap = new Map();
for (i = s2; i <= e2; i++) {
const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
if (nextChild.key != null) keyToNewIndexMap.set(nextChild.key, i);
}
let j;
let patched = 0;
const toBePatched = e2 - s2 + 1;
let moved = false;
let maxNewIndexSoFar = 0;
const newIndexToOldIndexMap = new Array(toBePatched);
for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;
for (i = s1; i <= e1; i++) {
const prevChild = c1[i];
if (patched >= toBePatched) {
unmount(prevChild, parentComponent, parentSuspense, true);
continue;
}
let newIndex;
if (prevChild.key != null) newIndex = keyToNewIndexMap.get(prevChild.key);
else for (j = s2; j <= e2; j++) if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
newIndex = j;
break;
}
if (newIndex === void 0) unmount(prevChild, parentComponent, parentSuspense, true);
else {
newIndexToOldIndexMap[newIndex - s2] = i + 1;
if (newIndex >= maxNewIndexSoFar) maxNewIndexSoFar = newIndex;
else moved = true;
patch(prevChild, c2[newIndex], container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
patched++;
}
}
const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;
j = increasingNewIndexSequence.length - 1;
for (i = toBePatched - 1; i >= 0; i--) {
const nextIndex = s2 + i;
const nextChild = c2[nextIndex];
const anchorVNode = c2[nextIndex + 1];
const anchor = nextIndex + 1 < l2 ? anchorVNode.el || resolveAsyncComponentPlaceholder(anchorVNode) : parentAnchor;
if (newIndexToOldIndexMap[i] === 0) patch(null, nextChild, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else if (moved) {
if (j < 0 || i !== increasingNewIndexSequence[j]) move(nextChild, container, anchor, 2);
else j--;
}
}
}
};
const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
const { el, type, transition, children, shapeFlag } = vnode;
if (shapeFlag & 6) {
move(vnode.component.subTree, container, anchor, moveType);
return;
}
if (shapeFlag & 128) {
vnode.suspense.move(container, anchor, moveType);
return;
}
if (shapeFlag & 64) {
type.move(vnode, container, anchor, internals);
return;
}
if (type === Fragment) {
hostInsert(el, container, anchor);
for (let i = 0; i < children.length; i++) move(children[i], container, anchor, moveType);
hostInsert(vnode.anchor, container, anchor);
return;
}
if (type === Static) {
moveStaticNode(vnode, container, anchor);
return;
}
if (moveType !== 2 && shapeFlag & 1 && transition) {
if (moveType === 0) {
if (transition.persisted && !el[leaveCbKey]) hostInsert(el, container, anchor);
else {
transition.beforeEnter(el);
hostInsert(el, container, anchor);
queuePostRenderEffect(() => transition.enter(el), parentSuspense);
}
} else {
const { leave, delayLeave, afterLeave } = transition;
const remove2 = () => {
if (vnode.ctx.isUnmounted) hostRemove(el);
else hostInsert(el, container, anchor);
};
const performLeave = () => {
const wasLeaving = el._isLeaving || !!el[leaveCbKey];
if (el._isLeaving) el[leaveCbKey](true);
if (transition.persisted && !wasLeaving) remove2();
else leave(el, () => {
remove2();
afterLeave && afterLeave();
});
};
if (delayLeave) delayLeave(el, remove2, performLeave);
else performLeave();
}
} else hostInsert(el, container, anchor);
};
const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
const { type, props, ref, children, dynamicChildren, shapeFlag, patchFlag, dirs, cacheIndex, memo } = vnode;
if (patchFlag === -2 || dynamicChildren && dynamicChildren.hasOnce) optimized = false;
if (ref != null) {
pauseTracking();
setRef(ref, null, parentSuspense, vnode, true);
resetTracking();
}
if (cacheIndex != null && (!vnode.ctx || vnode.ctx === parentComponent)) parentComponent.renderCache[cacheIndex] = void 0;
if (shapeFlag & 256) {
parentComponent.ctx.deactivate(vnode);
return;
}
const shouldInvokeDirs = shapeFlag & 1 && dirs;
const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);
let vnodeHook;
if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) invokeVNodeHook(vnodeHook, parentComponent, vnode);
if (shapeFlag & 6) unmountComponent(vnode.component, parentSuspense, doRemove);
else {
if (shapeFlag & 128) {
vnode.suspense.unmount(parentSuspense, doRemove);
return;
}
if (shouldInvokeDirs) invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount");
if (shapeFlag & 64) vnode.type.remove(vnode, parentComponent, parentSuspense, internals, doRemove);
else if (dynamicChildren && !dynamicChildren.hasOnce && (type !== Fragment || patchFlag > 0 && patchFlag & 64)) unmountChildren(dynamicChildren, parentComponent, parentSuspense, false, true);
else if (type === Fragment && patchFlag & 384 || !optimized && shapeFlag & 16) unmountChildren(children, parentComponent, parentSuspense);
if (doRemove) remove(vnode);
}
const shouldInvalidateMemo = memo != null && cacheIndex == null;
if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs || shouldInvalidateMemo) queuePostRenderEffect(() => {
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted");
if (shouldInvalidateMemo) vnode.el = null;
}, parentSuspense);
};
const remove = (vnode) => {
const { type, el, anchor, transition } = vnode;
if (type === Fragment) {
removeFragment(el, anchor);
return;
}
if (type === Static) {
removeStaticNode(vnode);
if (transition && !transition.persisted && transition.afterLeave) transition.afterLeave();
return;
}
const performRemove = () => {
hostRemove(el);
if (transition && !transition.persisted && transition.afterLeave) transition.afterLeave();
};
if (vnode.shapeFlag & 1 && transition && !transition.persisted) {
const { leave, delayLeave } = transition;
const performLeave = () => leave(el, performRemove);
if (delayLeave) delayLeave(vnode.el, performRemove, performLeave);
else performLeave();
} else performRemove();
};
const removeFragment = (cur, end) => {
let next;
while (cur !== end) {
next = hostNextSibling(cur);
hostRemove(cur);
cur = next;
}
hostRemove(end);
};
const unmountComponent = (instance, parentSuspense, doRemove) => {
const { bum, scope, job, subTree, um, m, a } = instance;
invalidateMount(m);
invalidateMount(a);
if (bum) invokeArrayFns(bum);
scope.stop();
if (job) {
job.flags |= 8;
unmount(subTree, instance, parentSuspense, doRemove);
} else if (instance.vnode.el && subTree) {
subTree.transition = instance.vnode.transition;
unmount(subTree, instance, parentSuspense, doRemove);
}
if (um) queuePostRenderEffect(um, parentSuspense);
queuePostRenderEffect(() => {
instance.isUnmounted = true;
}, parentSuspense);
};
const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
for (let i = start; i < children.length; i++) unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
};
const getNextHostNode = (vnode) => {
if (vnode.shapeFlag & 6) return getNextHostNode(vnode.component.subTree);
if (vnode.shapeFlag & 128) return vnode.suspense.next();
const el = hostNextSibling(vnode.anchor || vnode.el);
const teleportEnd = el && el[TeleportEndKey];
return teleportEnd ? hostNextSibling(teleportEnd) : el;
};
let isFlushing = false;
const render = (vnode, container, namespace) => {
let instance;
if (vnode == null) {
if (container._vnode) {
unmount(container._vnode, null, null, true);
instance = container._vnode.component;
}
} else patch(container._vnode || null, vnode, container, null, null, null, namespace);
container._vnode = vnode;
if (!isFlushing) {
isFlushing = true;
flushPreFlushCbs(instance);
flushPostFlushCbs();
isFlushing = false;
}
};
const internals = {
p: patch,
um: unmount,
m: move,
r: remove,
mt: mountComponent,
mc: mountChildren,
pc: patchChildren,
pbc: patchBlockChildren,
n: getNextHostNode,
o: options
};
let hydrate;
let hydrateNode;
if (createHydrationFns) [hydrate, hydrateNode] = createHydrationFns(internals);
return {
render,
hydrate,
createApp: createAppAPI(render, hydrate)
};
}
function resolveChildrenNamespace({ type, props }, currentNamespace) {
return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace;
}
function toggleRecurse({ effect, job }, allowed) {
if (allowed) {
effect.flags |= 32;
job.flags |= 4;
} else {
effect.flags &= -33;
job.flags &= -5;
}
}
function needTransition(parentSuspense, transition) {
return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
}
function traverseStaticChildren(n1, n2, shallow = false) {
const ch1 = n1.children;
const ch2 = n2.children;
if (isArray(ch1) && isArray(ch2)) for (let i = 0; i < ch1.length; i++) {
const c1 = ch1[i];
let c2 = ch2[i];
if (c2.shapeFlag & 1 && !c2.dynamicChildren) {
if (c2.patchFlag <= 0 || c2.patchFlag === 32) {
c2 = ch2[i] = cloneIfMounted(ch2[i]);
c2.el = c1.el;
}
if (!shallow && c2.patchFlag !== -2) traverseStaticChildren(c1, c2);
}
if (c2.type === Text) {
if (c2.patchFlag === -1) c2 = ch2[i] = cloneIfMounted(c2);
c2.el = c1.el;
}
if (c2.type === Comment && !c2.el) c2.el = c1.el;
}
}
function getSequence(arr) {
const p = arr.slice();
const result = [0];
let i, j, u, v, c;
const len = arr.length;
for (i = 0; i < len; i++) {
const arrI = arr[i];
if (arrI !== 0) {
j = result[result.length - 1];
if (arr[j] < arrI) {
p[i] = j;
result.push(i);
continue;
}
u = 0;
v = result.length - 1;
while (u < v) {
c = u + v >> 1;
if (arr[result[c]] < arrI) u = c + 1;
else v = c;
}
if (arrI < arr[result[u]]) {
if (u > 0) p[i] = result[u - 1];
result[u] = i;
}
}
}
u = result.length;
v = result[u - 1];
while (u-- > 0) {
result[u] = v;
v = p[v];
}
return result;
}
function locateNonHydratedAsyncRoot(instance) {
const subComponent = instance.subTree.component;
if (subComponent) {
if (subComponent.asyncDep && !subComponent.asyncResolved) return subComponent;
else return locateNonHydratedAsyncRoot(subComponent);
}
}
function invalidateMount(hooks) {
if (hooks) for (let i = 0; i < hooks.length; i++) hooks[i].flags |= 8;
}
function resolveAsyncComponentPlaceholder(anchorVnode) {
if (anchorVnode.placeholder) return anchorVnode.placeholder;
const instance = anchorVnode.component;
if (instance) return resolveAsyncComponentPlaceholder(instance.subTree);
return null;
}
var isSuspense = (type) => type.__isSuspense;
function queueEffectWithSuspense(fn, suspense) {
if (suspense && suspense.pendingBranch) {
if (isArray(fn)) suspense.effects.push(...fn);
else suspense.effects.push(fn);
} else queuePostFlushCb(fn);
}
var Fragment = Symbol.for("v-fgt");
var Text = Symbol.for("v-txt");
var Comment = Symbol.for("v-cmt");
var Static = Symbol.for("v-stc");
var blockStack = [];
var currentBlock = null;
function openBlock(disableTracking = false) {
blockStack.push(currentBlock = disableTracking ? null : []);
}
function closeBlock() {
blockStack.pop();
currentBlock = blockStack[blockStack.length - 1] || null;
}
var isBlockTreeEnabled = 1;
function setBlockTracking(value, inVOnce = false) {
isBlockTreeEnabled += value;
if (value < 0 && currentBlock && inVOnce) currentBlock.hasOnce = true;
}
function setupBlock(vnode) {
vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;
closeBlock();
if (isBlockTreeEnabled > 0 && currentBlock) currentBlock.push(vnode);
return vnode;
}
function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {
return setupBlock(createBaseVNode(type, props, children, patchFlag, dynamicProps, shapeFlag, true));
}
function isVNode(value) {
return value ? value.__v_isVNode === true : false;
}
function isSameVNodeType(n1, n2) {
return n1.type === n2.type && n1.key === n2.key;
}
var normalizeKey = ({ key }) => key != null ? key : null;
var normalizeRef = ({ ref, ref_key, ref_for }) => {
if (typeof ref === "number") ref = "" + ref;
return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? {
i: currentRenderingInstance,
r: ref,
k: ref_key,
f: !!ref_for
} : ref : null;
};
function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {
const vnode = {
__v_isVNode: true,
__v_skip: true,
type,
props,
key: props && normalizeKey(props),
ref: props && normalizeRef(props),
scopeId: currentScopeId,
slotScopeIds: null,
children,
component: null,
suspense: null,
ssContent: null,
ssFallback: null,
dirs: null,
transition: null,
el: null,
anchor: null,
target: null,
targetStart: null,
targetAnchor: null,
staticCount: 0,
shapeFlag,
patchFlag,
dynamicProps,
dynamicChildren: null,
appContext: null,
ctx: currentRenderingInstance
};
if (needFullChildrenNormalization) {
normalizeChildren(vnode, children);
if (shapeFlag & 128) type.normalize(vnode);
} else if (children) vnode.shapeFlag |= isString(children) ? 8 : 16;
if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock && (vnode.patchFlag > 0 || shapeFlag & 6) && vnode.patchFlag !== 32) currentBlock.push(vnode);
return vnode;
}
var createVNode = _createVNode;
function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
if (!type || type === NULL_DYNAMIC_COMPONENT) type = Comment;
if (isVNode(type)) {
const cloned = cloneVNode(type, props, true);
if (children) normalizeChildren(cloned, children);
if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {
if (cloned.shapeFlag & 6) currentBlock[currentBlock.indexOf(type)] = cloned;
else currentBlock.push(cloned);
}
cloned.patchFlag = -2;
return cloned;
}
if (isClassComponent(type)) type = type.__vccOpts;
if (props) {
props = guardReactiveProps(props);
let { class: klass, style } = props;
if (klass && !isString(klass)) props.class = normalizeClass(klass);
if (isObject(style)) {
if (isProxy(style) && !isArray(style)) style = extend({}, style);
props.style = normalizeStyle(style);
}
}
const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;
return createBaseVNode(type, props, children, patchFlag, dynamicProps, shapeFlag, isBlockNode, true);
}
function guardReactiveProps(props) {
if (!props) return null;
return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;
}
function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {
const { props, ref, patchFlag, children, transition } = vnode;
const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
const cloned = {
__v_isVNode: true,
__v_skip: true,
type: vnode.type,
props: mergedProps,
key: mergedProps && normalizeKey(mergedProps),
ref: extraProps && extraProps.ref ? mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps) : ref,
scopeId: vnode.scopeId,
slotScopeIds: vnode.slotScopeIds,
children,
target: vnode.target,
targetStart: vnode.targetStart,
targetAnchor: vnode.targetAnchor,
staticCount: vnode.staticCount,
shapeFlag: vnode.shapeFlag,
patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,
dynamicProps: vnode.dynamicProps,
dynamicChildren: vnode.dynamicChildren,
appContext: vnode.appContext,
dirs: vnode.dirs,
transition,
component: vnode.component,
suspense: vnode.suspense,
ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
placeholder: vnode.placeholder,
el: vnode.el,
anchor: vnode.anchor,
ctx: vnode.ctx,
ce: vnode.ce,
cacheIndex: vnode.cacheIndex
};
if (transition && cloneTransition) setTransitionHooks(cloned, transition.clone(cloned));
return cloned;
}
function createTextVNode(text = " ", flag = 0) {
return createVNode(Text, null, text, flag);
}
function normalizeVNode(child) {
if (child == null || typeof child === "boolean") return createVNode(Comment);
else if (isArray(child)) return createVNode(Fragment, null, child.slice());
else if (isVNode(child)) return cloneIfMounted(child);
else return createVNode(Text, null, String(child));
}
function cloneIfMounted(child) {
return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);
}
function normalizeChildren(vnode, children) {
let type = 0;
const { shapeFlag } = vnode;
if (children == null) children = null;
else if (isArray(children)) type = 16;
else if (typeof children === "object") {
if (shapeFlag & 65) {
const slot = children.default;
if (slot) {
slot._c && (slot._d = false);
normalizeChildren(vnode, slot());
slot._c && (slot._d = true);
}
return;
} else {
type = 32;
const slotFlag = children._;
if (!slotFlag && !isInternalObject(children)) children._ctx = currentRenderingInstance;
else if (slotFlag === 3 && currentRenderingInstance) {
if (currentRenderingInstance.slots._ === 1) children._ = 1;
else {
children._ = 2;
vnode.patchFlag |= 1024;
}
}
}
} else if (isFunction(children)) {
if (shapeFlag & 65) {
normalizeChildren(vnode, { default: children });
return;
}
children = {
default: children,
_ctx: currentRenderingInstance
};
type = 32;
} else {
children = String(children);
if (shapeFlag & 64) {
type = 16;
children = [createTextVNode(children)];
} else type = 8;
}
vnode.children = children;
vnode.shapeFlag |= type;
}
function mergeProps(...args) {
const ret = {};
for (let i = 0; i < args.length; i++) {
const toMerge = args[i];
for (const key in toMerge) if (key === "class") {
if (ret.class !== toMerge.class) ret.class = normalizeClass([ret.class, toMerge.class]);
} else if (key === "style") ret.style = normalizeStyle([ret.style, toMerge.style]);
else if (isOn(key)) {
const existing = ret[key];
const incoming = toMerge[key];
if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) ret[key] = existing ? [].concat(existing, incoming) : incoming;
else if (incoming == null && existing == null && !isModelListener(key)) ret[key] = incoming;
} else if (key !== "") ret[key] = toMerge[key];
}
return ret;
}
function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
callWithAsyncErrorHandling(hook, instance, 7, [vnode, prevVNode]);
}
var emptyAppContext = createAppContext();
var uid = 0;
function createComponentInstance(vnode, parent, suspense) {
const type = vnode.type;
const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
const instance = {
uid: uid++,
vnode,
type,
parent,
appContext,
root: null,
next: null,
subTree: null,
effect: null,
update: null,
job: null,
scope: new EffectScope(true),
render: null,
proxy: null,
exposed: null,
exposeProxy: null,
withProxy: null,
provides: parent ? parent.provides : Object.create(appContext.provides),
ids: parent ? parent.ids : [
"",
0,
0
],
accessCache: null,
renderCache: [],
components: null,
directives: null,
propsOptions: normalizePropsOptions(type, appContext),
emitsOptions: normalizeEmitsOptions(type, appContext),
emit: null,
emitted: null,
propsDefaults: EMPTY_OBJ,
inheritAttrs: type.inheritAttrs,
ctx: EMPTY_OBJ,
data: EMPTY_OBJ,
props: EMPTY_OBJ,
attrs: EMPTY_OBJ,
slots: EMPTY_OBJ,
refs: EMPTY_OBJ,
setupState: EMPTY_OBJ,
setupContext: null,
suspense,
suspenseId: suspense ? suspense.pendingId : 0,
asyncDep: null,
asyncResolved: false,
isMounted: false,
isUnmounted: false,
isDeactivated: false,
bc: null,
c: null,
bm: null,
m: null,
bu: null,
u: null,
um: null,
bum: null,
da: null,
a: null,
rtg: null,
rtc: null,
ec: null,
sp: null
};
instance.ctx = { _: instance };
instance.root = parent ? parent.root : instance;
instance.emit = emit.bind(null, instance);
if (vnode.ce) vnode.ce(instance);
return instance;
}
var currentInstance = null;
var getCurrentInstance = () => currentInstance || currentRenderingInstance;
var internalSetCurrentInstance;
var setInSSRSetupState;
{
const g = getGlobalThis();
const registerGlobalSetter = (key, setter) => {
let setters;
if (!(setters = g[key])) setters = g[key] = [];
setters.push(setter);
return (v) => {
if (setters.length > 1) setters.forEach((set) => set(v));
else setters[0](v);
};
};
internalSetCurrentInstance = registerGlobalSetter(`__VUE_INSTANCE_SETTERS__`, (v) => currentInstance = v);
setInSSRSetupState = registerGlobalSetter(`__VUE_SSR_SETTERS__`, (v) => isInSSRComponentSetup = v);
}
var setCurrentInstance = (instance) => {
const prev = currentInstance;
internalSetCurrentInstance(instance);
instance.scope.on();
return () => {
instance.scope.off();
internalSetCurrentInstance(prev);
};
};
var unsetCurrentInstance = () => {
currentInstance && currentInstance.scope.off();
internalSetCurrentInstance(null);
};
function isStatefulComponent(instance) {
return instance.vnode.shapeFlag & 4;
}
var isInSSRComponentSetup = false;
function setupComponent(instance, isSSR = false, optimized = false) {
isSSR && setInSSRSetupState(isSSR);
const { props, children } = instance.vnode;
const isStateful = isStatefulComponent(instance);
initProps(instance, props, isStateful, isSSR);
initSlots(instance, children, optimized || isSSR);
const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
isSSR && setInSSRSetupState(false);
return setupResult;
}
function setupStatefulComponent(instance, isSSR) {
const Component = instance.type;
instance.accessCache = Object.create(null);
instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);
const { setup } = Component;
if (setup) {
pauseTracking();
const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
const reset = setCurrentInstance(instance);
const setupResult = callWithErrorHandling(setup, instance, 0, [instance.props, setupContext]);
const isAsyncSetup = isPromise(setupResult);
resetTracking();
reset();
if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) markAsyncBoundary(instance);
if (isAsyncSetup) {
setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
if (isSSR) return setupResult.then((resolvedResult) => {
setInSSRSetupState(true);
try {
handleSetupResult(instance, resolvedResult, isSSR);
} finally {
setInSSRSetupState(false);
}
}).catch((e) => {
handleError(e, instance, 0);
});
else instance.asyncDep = setupResult;
} else handleSetupResult(instance, setupResult, isSSR);
} else finishComponentSetup(instance, isSSR);
}
function handleSetupResult(instance, setupResult, isSSR) {
if (isFunction(setupResult)) {
if (instance.type.__ssrInlineRender) instance.ssrRender = setupResult;
else instance.render = setupResult;
} else if (isObject(setupResult)) instance.setupState = proxyRefs(setupResult);
finishComponentSetup(instance, isSSR);
}
function finishComponentSetup(instance, isSSR, skipOptions) {
const Component = instance.type;
if (!instance.render) instance.render = Component.render || NOOP;
{
const reset = setCurrentInstance(instance);
pauseTracking();
try {
applyOptions(instance);
} finally {
resetTracking();
reset();
}
}
}
var attrsProxyHandlers = { get(target, key) {
track(target, "get", "");
return target[key];
} };
function createSetupContext(instance) {
const expose = (exposed) => {
instance.exposed = exposed || {};
};
return {
attrs: new Proxy(instance.attrs, attrsProxyHandlers),
slots: instance.slots,
emit: instance.emit,
expose
};
}
function getComponentPublicInstance(instance) {
if (instance.exposed) return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
get(target, key) {
if (key in target) return target[key];
else if (key in publicPropertiesMap) return publicPropertiesMap[key](instance);
},
has(target, key) {
return key in target || key in publicPropertiesMap;
}
}));
else return instance.proxy;
}
function isClassComponent(value) {
return isFunction(value) && "__vccOpts" in value;
}
var computed = (getterOrOptions, debugOptions) => {
return computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);
};
function h(type, propsOrChildren, children) {
try {
setBlockTracking(-1);
const l = arguments.length;
if (l === 2) {
if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
if (isVNode(propsOrChildren)) return createVNode(type, null, [propsOrChildren]);
return createVNode(type, propsOrChildren);
} else return createVNode(type, null, propsOrChildren);
} else {
if (l > 3) children = Array.prototype.slice.call(arguments, 2);
else if (l === 3 && isVNode(children)) children = [children];
return createVNode(type, propsOrChildren, children);
}
} finally {
setBlockTracking(1);
}
}
var version = "3.5.43";
var policy = void 0;
var tt = typeof window !== "undefined" && window.trustedTypes;
if (tt) try {
policy = tt.createPolicy("vue", { createHTML: (val) => val });
} catch (e) {}
var unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val;
var svgNS = "http://www.w3.org/2000/svg";
var mathmlNS = "http://www.w3.org/1998/Math/MathML";
var doc = typeof document !== "undefined" ? document : null;
var templateContainer = doc && doc.createElement("template");
var nodeOps = {
insert: (child, parent, anchor) => {
parent.insertBefore(child, anchor || null);
},
remove: (child) => {
const parent = child.parentNode;
if (parent) parent.removeChild(child);
},
createElement: (tag, namespace, is, props) => {
const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);
if (tag === "select" && props && props.multiple != null) el.setAttribute("multiple", props.multiple);
return el;
},
createText: (text) => doc.createTextNode(text),
createComment: (text) => doc.createComment(text),
setText: (node, text) => {
node.nodeValue = text;
},
setElementText: (el, text) => {
el.textContent = text;
},
parentNode: (node) => node.parentNode,
nextSibling: (node) => node.nextSibling,
querySelector: (selector) => doc.querySelector(selector),
setScopeId(el, id) {
el.setAttribute(id, "");
},
insertStaticContent(content, parent, anchor, namespace, start, end) {
const before = anchor ? anchor.previousSibling : parent.lastChild;
if (start && (start === end || start.nextSibling)) while (true) {
parent.insertBefore(start.cloneNode(true), anchor);
if (start === end || !(start = start.nextSibling)) break;
}
else {
templateContainer.innerHTML = unsafeToTrustedHTML(namespace === "svg" ? `<svg>${content}</svg>` : namespace === "mathml" ? `<math>${content}</math>` : content);
const template = templateContainer.content;
if (namespace === "svg" || namespace === "mathml") {
const wrapper = template.firstChild;
while (wrapper.firstChild) template.appendChild(wrapper.firstChild);
template.removeChild(wrapper);
}
parent.insertBefore(template, anchor);
}
return [before ? before.nextSibling : parent.firstChild, anchor ? anchor.previousSibling : parent.lastChild];
}
};
var vtcKey = Symbol("_vtc");
function patchClass(el, value, isSVG) {
const transitionClasses = el[vtcKey];
if (transitionClasses) value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" ");
if (value == null) el.removeAttribute("class");
else if (isSVG) el.setAttribute("class", value);
else el.className = value;
}
var vShowOriginalDisplay = Symbol("_vod");
var vShowHidden = Symbol("_vsh");
var CSS_VAR_TEXT = Symbol("");
var displayRE = /(?:^|;)\s*display\s*:/;
function patchStyle(el, prev, next) {
const style = el.style;
const isCssString = isString(next);
let hasControlledDisplay = false;
if (next && !isCssString) {
if (prev) {
if (!isString(prev)) {
for (const key in prev) if (next[key] == null) setStyle(style, key, "");
} else for (const prevStyle of prev.split(";")) {
const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim();
if (next[key] == null) setStyle(style, key, "");
}
}
for (const key in next) {
if (key === "display") hasControlledDisplay = true;
const value = next[key];
if (value != null) {
if (!shouldPreserveTextareaResizeStyle(el, key, !isString(prev) && prev ? prev[key] : void 0, value)) setStyle(style, key, value);
} else setStyle(style, key, "");
}
} else if (isCssString) {
if (prev !== next) {
const cssVarText = style[CSS_VAR_TEXT];
if (cssVarText) next += ";" + cssVarText;
style.cssText = next;
hasControlledDisplay = displayRE.test(next);
}
} else if (prev) el.removeAttribute("style");
if (vShowOriginalDisplay in el) {
el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : "";
if (el[vShowHidden]) style.display = "none";
}
}
var importantRE = /\s*!important$/;
function setStyle(style, name, val) {
if (isArray(val)) val.forEach((v) => setStyle(style, name, v));
else {
if (val == null) val = "";
if (name.startsWith("--")) {
if (importantRE.test(val)) style.setProperty(name, val.replace(importantRE, ""), "important");
else style.setProperty(name, val);
} else {
const prefixed = autoPrefix(style, name);
if (importantRE.test(val)) style.setProperty(hyphenate(prefixed), val.replace(importantRE, ""), "important");
else style[prefixed] = val;
}
}
}
var prefixes = [
"Webkit",
"Moz",
"ms"
];
var prefixCache = {};
function autoPrefix(style, rawName) {
const cached = prefixCache[rawName];
if (cached) return cached;
let name = camelize(rawName);
if (name !== "filter" && name in style) return prefixCache[rawName] = name;
name = capitalize(name);
for (let i = 0; i < prefixes.length; i++) {
const prefixed = prefixes[i] + name;
if (prefixed in style) return prefixCache[rawName] = prefixed;
}
return rawName;
}
function shouldPreserveTextareaResizeStyle(el, key, prev, next) {
return el.tagName === "TEXTAREA" && (key === "width" || key === "height") && isString(next) && prev === next;
}
var xlinkNS = "http://www.w3.org/1999/xlink";
function patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) {
if (isSVG && key.startsWith("xlink:")) {
if (value == null) el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
else el.setAttributeNS(xlinkNS, key, value);
} else if (value == null || isBoolean && !includeBooleanAttr(value)) el.removeAttribute(key);
else el.setAttribute(key, isBoolean ? "" : isSymbol(value) ? String(value) : value);
}
function patchDOMProp(el, key, value, parentComponent, attrName) {
if (key === "innerHTML" || key === "textContent") {
if (value != null) el[key] = key === "innerHTML" ? unsafeToTrustedHTML(value) : value;
return;
}
const tag = el.tagName;
if (key === "value" && tag !== "PROGRESS" && !tag.includes("-")) {
const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value;
const newValue = value == null ? el.type === "checkbox" ? "on" : "" : String(value);
if (oldValue !== newValue || !("_value" in el)) el.value = newValue;
if (value == null) el.removeAttribute(key);
el._value = value;
return;
}
let needRemove = false;
if (value === "" || value == null) {
const type = typeof el[key];
if (type === "boolean") value = includeBooleanAttr(value);
else if (value == null && type === "string") {
value = "";
needRemove = true;
} else if (type === "number") {
value = 0;
needRemove = true;
}
}
try {
el[key] = value;
} catch (e) {}
needRemove && el.removeAttribute(attrName || key);
}
function addEventListener(el, event, handler, options) {
el.addEventListener(event, handler, options);
}
function removeEventListener(el, event, handler, options) {
el.removeEventListener(event, handler, options);
}
var veiKey = Symbol("_vei");
function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
const invokers = el[veiKey] || (el[veiKey] = {});
const existingInvoker = invokers[rawName];
if (nextValue && existingInvoker) existingInvoker.value = nextValue;
else {
const [name, options] = parseName(rawName);
if (nextValue) addEventListener(el, name, invokers[rawName] = createInvoker(nextValue, instance), options);
else if (existingInvoker) {
removeEventListener(el, name, existingInvoker, options);
invokers[rawName] = void 0;
}
}
}
var optionsModifierRE = /(Once|Passive|Capture)$/;
var optionsModifierEventRE = /^on:?(?:Once|Passive|Capture)$/;
function parseName(name) {
let options;
let m;
while ((m = name.match(optionsModifierRE)) && !optionsModifierEventRE.test(name)) {
if (!options) options = {};
name = name.slice(0, name.length - m[1].length);
options[m[1].toLowerCase()] = true;
}
return [name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2)), options];
}
var cachedNow = 0;
var p = Promise.resolve();
var getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());
function createInvoker(initialValue, instance) {
const invoker = (e) => {
if (!e._vts) e._vts = Date.now();
else if (e._vts <= invoker.attached) return;
const value = invoker.value;
if (isArray(value)) {
const originalStop = e.stopImmediatePropagation;
e.stopImmediatePropagation = () => {
originalStop.call(e);
e._stopped = true;
};
const handlers = value.slice();
const args = [e];
for (let i = 0; i < handlers.length; i++) {
if (e._stopped) break;
const handler = handlers[i];
if (handler) callWithAsyncErrorHandling(handler, instance, 5, args);
}
} else callWithAsyncErrorHandling(value, instance, 5, [e]);
};
invoker.value = initialValue;
invoker.attached = getNow();
return invoker;
}
var isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;
var patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {
const isSVG = namespace === "svg";
if (key === "class") patchClass(el, nextValue, isSVG);
else if (key === "style") patchStyle(el, prevValue, nextValue);
else if (isOn(key)) {
if (!isModelListener(key)) patchEvent(el, key, prevValue, nextValue, parentComponent);
} else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {
patchDOMProp(el, key, nextValue);
if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value");
} else if (el._isVueCE && (shouldSetAsPropForVueCE(el, key) || el._def.__asyncLoader && (/[A-Z]/.test(key) || !isString(nextValue)))) patchDOMProp(el, camelize(key), nextValue, parentComponent, key);
else {
if (key === "true-value") el._trueValue = nextValue;
else if (key === "false-value") el._falseValue = nextValue;
patchAttr(el, key, nextValue, isSVG);
}
};
function shouldSetAsProp(el, key, value, isSVG) {
if (isSVG) {
if (key === "innerHTML" || key === "textContent") return true;
if (key in el && isNativeOn(key) && isFunction(value)) return true;
return false;
}
if (key === "spellcheck" || key === "draggable" || key === "translate" || key === "autocorrect") return false;
if (key === "sandbox" && el.tagName === "IFRAME") return false;
if (key === "form") return false;
if (key === "list" && el.tagName === "INPUT") return false;
if (key === "type" && el.tagName === "TEXTAREA") return false;
if (key === "width" || key === "height") {
const tag = el.tagName;
if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") return false;
}
if (isNativeOn(key) && isString(value)) return false;
return key in el;
}
function shouldSetAsPropForVueCE(el, key) {
const props = el._def.props;
if (!props) return false;
const camelKey = camelize(key);
return Array.isArray(props) ? props.some((prop) => camelize(prop) === camelKey) : Object.keys(props).some((prop) => camelize(prop) === camelKey);
}
var systemModifiers = [
"ctrl",
"shift",
"alt",
"meta"
];
var modifierGuards = {
stop: (e) => e.stopPropagation(),
prevent: (e) => e.preventDefault(),
self: (e) => e.target !== e.currentTarget,
ctrl: (e) => !e.ctrlKey,
shift: (e) => !e.shiftKey,
alt: (e) => !e.altKey,
meta: (e) => !e.metaKey,
left: (e) => "button" in e && e.button !== 0,
middle: (e) => "button" in e && e.button !== 1,
right: (e) => "button" in e && e.button !== 2,
exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
};
var withModifiers = (fn, modifiers) => {
if (!fn) return fn;
const cache = fn._withMods || (fn._withMods = {});
const cacheKey = modifiers.join(".");
return cache[cacheKey] || (cache[cacheKey] = ((event, ...args) => {
for (let i = 0; i < modifiers.length; i++) {
const guard = modifierGuards[modifiers[i]];
if (guard && guard(event, modifiers)) return;
}
return fn(event, ...args);
}));
};
var rendererOptions = extend({ patchProp }, nodeOps);
var renderer;
function ensureRenderer() {
return renderer || (renderer = createRenderer(rendererOptions));
}
var createApp = ((...args) => {
const app = ensureRenderer().createApp(...args);
const { mount } = app;
app.mount = (containerOrSelector) => {
const container = normalizeContainer(containerOrSelector);
if (!container) return;
const component = app._component;
if (!isFunction(component) && !component.render && !component.template) component.template = container.innerHTML;
if (container.nodeType === 1) container.textContent = "";
const proxy = mount(container, false, resolveRootNamespace(container));
if (container instanceof Element) {
container.removeAttribute("v-cloak");
container.setAttribute("data-v-app", "");
}
return proxy;
};
return app;
});
function resolveRootNamespace(container) {
if (container instanceof SVGElement) return "svg";
if (typeof MathMLElement === "function" && container instanceof MathMLElement) return "mathml";
}
function normalizeContainer(container) {
if (isString(container)) return document.querySelector(container);
return container;
}
var messages = {
en: {
"views.m": "EVR Minimal",
"views.p": "EVR Minimal+",
"views.l": "EVR Compact",
"views.e": "EVR Extended",
"views.t": "EVR Thumbnail",
"select.group": "Eh View Refined layouts",
"columns.published": "Published",
"columns.title": "Title",
"columns.uploader": "Uploader",
"namespaces.language": "language:",
"namespaces.parody": "parody:",
"namespaces.character": "character:",
"namespaces.group": "group:",
"namespaces.artist": "artist:",
"namespaces.cosplayer": "cosplayer:",
"namespaces.male": "male:",
"namespaces.female": "female:",
"namespaces.mixed": "mixed:",
"namespaces.other": "other:",
"namespaces.reclass": "reclass:",
"namespaces.location": "location:",
"namespaces.temp": "temp:",
"namespaces.uploader": "uploader:",
"pagination.error": "Automatic loading stopped. Use the Next link to continue.",
"settings.open": "Eh View Refined settings",
"settings.title": "Eh View Refined",
"settings.button": "Settings",
"settings.browsingSection": "Browsing",
"settings.infiniteScroll": "Infinite scrolling",
"settings.close": "Close",
"settings.language": "Language",
"settings.languageAuto": "Browser language",
"settings.tagsSection": "Tags",
"settings.allMyTags": "Show every My Tags tag",
"settings.allOtherTags": "Show every other tag",
"settings.groupTags": "One row per namespace",
"settings.uploaderTag": "Show the uploader among the tags"
},
"zh-TW": {
"views.m": "EVR 最小模式",
"views.p": "EVR 最小模式+",
"views.l": "EVR 緊湊",
"views.e": "EVR 擴展",
"views.t": "EVR 縮略圖",
"select.group": "Eh View Refined 排版",
"columns.published": "發布時間",
"columns.title": "標題",
"columns.uploader": "上傳者",
"namespaces.language": "語言:",
"namespaces.parody": "原作:",
"namespaces.character": "角色:",
"namespaces.group": "團體:",
"namespaces.artist": "繪師:",
"namespaces.cosplayer": "Coser:",
"namespaces.male": "男:",
"namespaces.female": "女:",
"namespaces.mixed": "混:",
"namespaces.other": "其他:",
"namespaces.reclass": "分類:",
"namespaces.location": "地點:",
"namespaces.temp": "臨時:",
"namespaces.uploader": "上傳者:",
"pagination.error": "自動載入已停止,請使用下一頁連結繼續。",
"settings.open": "Eh View Refined 設定",
"settings.title": "Eh View Refined",
"settings.button": "設定",
"settings.browsingSection": "瀏覽",
"settings.infiniteScroll": "無限滾動",
"settings.close": "關閉",
"settings.language": "語言 / Language",
"settings.languageAuto": "跟隨瀏覽器 / Browser",
"settings.tagsSection": "標籤",
"settings.allMyTags": "顯示完整的 My Tags 標籤",
"settings.allOtherTags": "顯示完整的非 My Tags 標籤",
"settings.groupTags": "每個 namespace 一列",
"settings.uploaderTag": "把上傳者顯示在標籤裡"
},
"zh-CN": {
"views.m": "EVR 最小模式",
"views.p": "EVR 最小模式+",
"views.l": "EVR 紧凑",
"views.e": "EVR 扩展",
"views.t": "EVR 缩略图",
"select.group": "Eh View Refined 排版",
"columns.published": "发布时间",
"columns.title": "标题",
"columns.uploader": "上传者",
"namespaces.language": "语言:",
"namespaces.parody": "原作:",
"namespaces.character": "角色:",
"namespaces.group": "团体:",
"namespaces.artist": "画师:",
"namespaces.cosplayer": "Coser:",
"namespaces.male": "男:",
"namespaces.female": "女:",
"namespaces.mixed": "混:",
"namespaces.other": "其他:",
"namespaces.reclass": "分类:",
"namespaces.location": "地点:",
"namespaces.temp": "临时:",
"namespaces.uploader": "上传者:",
"pagination.error": "自动加载已停止,请使用下一页链接继续。",
"settings.open": "Eh View Refined 设置",
"settings.title": "Eh View Refined",
"settings.button": "设置",
"settings.browsingSection": "浏览",
"settings.infiniteScroll": "无限滚动",
"settings.close": "关闭",
"settings.language": "语言 / Language",
"settings.languageAuto": "跟随浏览器 / Browser",
"settings.tagsSection": "标签",
"settings.allMyTags": "显示完整的 My Tags 标签",
"settings.allOtherTags": "显示完整的非 My Tags 标签",
"settings.groupTags": "每个 namespace 一行",
"settings.uploaderTag": "把上传者显示在标签里"
},
ja: {
"views.m": "EVR Minimal",
"views.p": "EVR Minimal+",
"views.l": "EVR Compact",
"views.e": "EVR Extended",
"views.t": "EVR Thumbnail",
"select.group": "Eh View Refined レイアウト",
"columns.published": "公開日時",
"columns.title": "タイトル",
"columns.uploader": "投稿者",
"namespaces.language": "言語:",
"namespaces.parody": "原作:",
"namespaces.character": "キャラ:",
"namespaces.group": "サークル:",
"namespaces.artist": "作家:",
"namespaces.cosplayer": "レイヤー:",
"namespaces.male": "男性:",
"namespaces.female": "女性:",
"namespaces.mixed": "混合:",
"namespaces.other": "その他:",
"namespaces.reclass": "再分類:",
"namespaces.location": "場所:",
"namespaces.temp": "一時:",
"namespaces.uploader": "投稿者:",
"pagination.error": "自動読み込みを停止しました。次のページへのリンクで続けてください。",
"settings.open": "Eh View Refined の設定",
"settings.title": "Eh View Refined",
"settings.button": "設定",
"settings.browsingSection": "閲覧",
"settings.infiniteScroll": "無限スクロール",
"settings.close": "閉じる",
"settings.language": "言語 / Language",
"settings.languageAuto": "ブラウザーの言語 / Browser",
"settings.tagsSection": "タグ",
"settings.allMyTags": "My Tags のタグをすべて表示",
"settings.allOtherTags": "その他のタグをすべて表示",
"settings.groupTags": "namespace ごとに 1 行",
"settings.uploaderTag": "アップローダーをタグとして表示"
},
ko: {
"views.m": "EVR Minimal",
"views.p": "EVR Minimal+",
"views.l": "EVR Compact",
"views.e": "EVR Extended",
"views.t": "EVR Thumbnail",
"select.group": "Eh View Refined 레이아웃",
"columns.published": "게시일",
"columns.title": "제목",
"columns.uploader": "업로더",
"namespaces.language": "언어:",
"namespaces.parody": "원작:",
"namespaces.character": "캐릭터:",
"namespaces.group": "서클:",
"namespaces.artist": "작가:",
"namespaces.cosplayer": "코스어:",
"namespaces.male": "남성:",
"namespaces.female": "여성:",
"namespaces.mixed": "혼합:",
"namespaces.other": "기타:",
"namespaces.reclass": "재분류:",
"namespaces.location": "장소:",
"namespaces.temp": "임시:",
"namespaces.uploader": "업로더:",
"pagination.error": "자동 로딩이 중지되었습니다. 다음 페이지 링크를 이용해 주세요.",
"settings.open": "Eh View Refined 설정",
"settings.title": "Eh View Refined",
"settings.button": "설정",
"settings.browsingSection": "탐색",
"settings.infiniteScroll": "무한 스크롤",
"settings.close": "닫기",
"settings.language": "언어 / Language",
"settings.languageAuto": "브라우저 언어 / Browser",
"settings.tagsSection": "태그",
"settings.allMyTags": "My Tags 태그를 모두 표시",
"settings.allOtherTags": "나머지 태그를 모두 표시",
"settings.groupTags": "namespace마다 한 줄",
"settings.uploaderTag": "업로더를 태그로 표시"
}
};
var textAttribute = "data-evr-text";
var labelAttribute = "data-evr-label";
var current = ref(detectLocale(navigator.languages));
var locale = readonly(current);
function t(key) {
return messages[current.value][key];
}
function localizeText(node, key) {
node.setAttribute(textAttribute, key);
node.textContent = t(key);
}
function localizeLabel(node, key) {
node.setAttribute(labelAttribute, key);
node.label = t(key);
}
function setLocale(next, root = document) {
if (current.value === next) return;
current.value = next;
for (const node of root.querySelectorAll(`[${textAttribute}]`)) node.textContent = t(node.getAttribute(textAttribute));
for (const node of root.querySelectorAll(`optgroup[${labelAttribute}]`)) node.label = t(node.getAttribute(labelAttribute));
}
var TAG_SELECTOR = ".gt, .gtl, .gtw";
function carry(origin, clone) {
clone.checked = origin.checked;
clone.value = origin.value;
}
function copy(node) {
const clone = node.cloneNode(true);
const sources = node.querySelectorAll("input, select, textarea");
const clones = clone.querySelectorAll("input, select, textarea");
for (let index = 0; index < sources.length; index++) carry(sources[index], clones[index]);
return clone;
}
function syncSelection(from, to) {
if (from === to) return;
const states = new Map();
const key = (input) => input.id || `${input.name}:${input.value}`;
for (const input of from.querySelectorAll("input[type=\"checkbox\"]")) states.set(key(input), input.checked);
for (const input of to.querySelectorAll("input[type=\"checkbox\"]")) {
const checked = states.get(key(input));
if (checked !== void 0) input.checked = checked;
}
}
function cloneTag(node, text) {
const clone = node.cloneNode(false);
clone.removeAttribute("ehs-tag");
clone.textContent = text;
return clone;
}
function insertItems(container, items) {
const batch = container.ownerDocument.createDocumentFragment();
batch.append(...items);
if (container.ownerDocument.readyState !== "loading") {
container.append(batch);
return;
}
const tags = Array.from(batch.querySelectorAll(TAG_SELECTOR));
const texts = tags.map((tag) => {
const text = tag.firstChild;
text?.remove();
return text;
});
container.append(batch);
texts.forEach((text, index) => {
if (text) tags[index].append(text);
});
}
function createListingHost(source) {
const doc = source.ownerDocument;
const wrapper = source.closest(".ido");
const originalWidth = wrapper?.style.getPropertyValue("max-width") ?? "";
const originalWidthPriority = wrapper?.style.getPropertyPriority("max-width") ?? "";
const start = doc.createComment("evr");
source.before(start);
let mounted = source;
function restoreWidth() {
if (!wrapper || wrapper.style.maxWidth !== "1370px") return;
if (originalWidth) wrapper.style.setProperty("max-width", originalWidth, originalWidthPriority);
else wrapper.style.removeProperty("max-width");
}
function place(node) {
if (node === mounted && node.parentNode) return;
if (mounted !== node && mounted.parentNode) mounted.replaceWith(node);
else if (start.parentNode) start.after(node);
mounted = node;
}
return {
get element() {
return mounted;
},
mount(node, view) {
if (view === "t" && wrapper) wrapper.style.setProperty("max-width", "1370px");
else restoreWidth();
place(node);
},
dispose() {
restoreWidth();
place(source);
start.remove();
}
};
}
var TAG_LIMIT = 12;
function selectTagIndexes(tags, selection, complete) {
const styled = [];
const plain = [];
for (let index = 0; index < tags.length; index++) (tags[index].styled ? styled : plain).push(index);
const shownStyled = complete.styled ? styled : selection === "none" ? [] : styled.slice(0, TAG_LIMIT);
const room = Math.max(0, TAG_LIMIT - shownStyled.length);
const shownPlain = complete.plain ? plain : selection === "styled-first" ? plain.slice(0, room) : [];
if (selection === "styled-first") return [...shownStyled, ...shownPlain];
return [...shownStyled, ...shownPlain].sort((a, b) => a - b);
}
var plainTagOptions = {
group: false,
uploader: false,
allMyTags: false,
allOtherTags: false
};
var UPLOADER_NAMESPACE = "uploader";
var GROUPS_CLASS = "evr-tag-groups";
var UPLOADER_ROW_CLASS = "evr-uploader-row";
var STYLE_ID = "evr-tag-area-style";
function uploaderTag(doc, name) {
const tag = doc.createElement("div");
const full = `${UPLOADER_NAMESPACE}:${name}`;
tag.className = `gt ${UPLOADER_TAG_CLASS}`;
tag.title = full;
tag.setAttribute("data-evr-tag", full);
tag.setAttribute("data-evr-ns", UPLOADER_NAMESPACE);
tag.setAttribute("translate", "no");
tag.textContent = name;
return tag;
}
var NAMESPACE_LABELS = {
language: "namespaces.language",
parody: "namespaces.parody",
character: "namespaces.character",
group: "namespaces.group",
artist: "namespaces.artist",
cosplayer: "namespaces.cosplayer",
male: "namespaces.male",
female: "namespaces.female",
mixed: "namespaces.mixed",
other: "namespaces.other",
reclass: "namespaces.reclass",
location: "namespaces.location",
temp: "namespaces.temp",
[UPLOADER_NAMESPACE]: "namespaces.uploader"
};
function groupRow(doc, namespace, tags) {
const row = doc.createElement("tr");
const label = doc.createElement("td");
label.className = "tc";
if (namespace !== null && Object.hasOwn(NAMESPACE_LABELS, namespace)) localizeText(label, NAMESPACE_LABELS[namespace]);
else label.textContent = namespace ? `${namespace}:` : "";
const cell = doc.createElement("td");
cell.append(...tags);
row.append(label, cell);
return row;
}
function groupTable(doc, groups) {
const table = doc.createElement("table");
table.className = GROUPS_CLASS;
const body = doc.createElement("tbody");
for (const [namespace, tags] of groups) body.append(groupRow(doc, namespace, tags));
table.append(body);
return table;
}
function tagAreaOf(gallery, selection, options, className) {
const doc = gallery.bindings.title.ownerDocument;
const { tags, uploader } = gallery.snapshot;
const groups = new Map();
for (const index of selectTagIndexes(tags, selection, {
styled: options.allMyTags,
plain: options.allOtherTags
})) {
const clone = cloneTag(gallery.bindings.tags[index], tags[index].text);
if (className !== void 0) clone.className = className;
const namespace = tags[index].namespace;
const members = groups.get(namespace);
if (members) members.push(clone);
else groups.set(namespace, [clone]);
}
const shown = options.uploader && uploader !== null ? uploaderTag(doc, uploader) : null;
if (!options.group) {
const flat = [...groups.values()].flat();
return shown ? [...flat, shown] : flat;
}
if (shown) groups.set(UPLOADER_NAMESPACE, [shown]);
return groups.size ? [groupTable(doc, groups)] : [];
}
function syncUploaderRow(row, uploader, enabled) {
const existing = row.querySelector(`tr.${UPLOADER_ROW_CLASS}`);
if (!enabled || uploader === null) {
existing?.remove();
return;
}
if (existing) return;
const name = row.querySelector(".gl4e");
if (!name) return;
const doc = row.ownerDocument;
const line = groupRow(doc, UPLOADER_NAMESPACE, [uploaderTag(doc, uploader)]);
line.className = UPLOADER_ROW_CLASS;
const body = name.querySelector("table")?.tBodies[0];
if (body) {
body.append(line);
return;
}
const table = doc.createElement("table");
const created = doc.createElement("tbody");
created.append(line);
table.append(created);
const holder = doc.createElement("div");
holder.append(table);
name.append(holder);
}
function installTagAreaStyles(doc) {
if (doc.getElementById(STYLE_ID)) return;
const style = doc.createElement("style");
style.id = STYLE_ID;
style.textContent = `
.${GROUPS_CLASS} { border-collapse: collapse; border-spacing: 0; margin: 0; }
.${GROUPS_CLASS} td { padding: 0; border: none; vertical-align: top; }
.${GROUPS_CLASS} td.tc { padding: 2px 4px 0 0; white-space: nowrap; text-align: right; }
.gltm:has(> .${GROUPS_CLASS}) { max-height: none; }`;
(doc.head ?? doc.documentElement).append(style);
}
var sectionTags = {
TBODY: true,
THEAD: true,
TFOOT: true
};
function createExtendedSource(source, onRows, uploaderTag = () => false) {
const doc = source.ownerDocument;
const entries = [];
let strip = createItemStrip();
const known = new Set();
const visited = new WeakSet();
const parser = doc.createElement("template");
let parsed = false;
let disposed = false;
function sourceParsed() {
if (!parsed && doc.readyState !== "loading") parsed = true;
return parsed;
}
function collect() {
const candidates = outerRows(source);
const limit = sourceParsed() ? candidates.length : candidates.length - 1;
for (let index = 0; index < limit; index++) {
const row = candidates[index];
if (visited.has(row)) continue;
visited.add(row);
const key = galleryKey(row);
if (!key || known.has(key)) continue;
capture(row);
known.add(key);
entries.push({
gid: key.split("/")[0],
row,
html: null
});
strip.push(row);
}
}
function capture(row) {
captureGalleryTags(row);
syncUploaderRow(row, captureGalleryUploader(row), uploaderTag());
captureGalleryRating(row);
}
function parse(html) {
parser.innerHTML = html;
const row = parser.content.firstElementChild;
row.remove();
return row;
}
function section() {
for (let index = source.children.length - 1; index >= 0; index--) {
const child = source.children[index];
if (sectionTags[child.tagName]) return child;
}
return source;
}
const observer = new MutationObserver(() => {
if (disposed) return;
watch();
collect();
onRows();
});
function watch() {
observer.observe(source, { childList: true });
for (const child of source.children) if (sectionTags[child.tagName]) observer.observe(child, { childList: true });
}
watch();
collect();
return {
get count() {
return entries.length;
},
get strip() {
return strip;
},
gallery(index) {
const entry = entries[index];
if (!entry) return null;
const gallery = adaptExtendedGallery(entry.row ?? parse(entry.html));
if (!gallery) return null;
gallery.snapshot.previousGid = entries[index - 1]?.gid ?? "0";
gallery.snapshot.nextGid = entries[index + 1]?.gid ?? "0";
return gallery;
},
release() {
let released = false;
for (const entry of entries) {
if (!entry.row) continue;
entry.html = entry.row.outerHTML;
entry.row.remove();
entry.row = null;
released = true;
}
if (released) strip = createItemStrip();
},
restore() {
const rebuilt = doc.createDocumentFragment();
let anchor = null;
for (const entry of entries) {
if (entry.row) {
anchor ??= entry.row;
continue;
}
const row = parse(entry.html);
syncUploaderRow(row, captureGalleryUploader(row), uploaderTag());
visited.add(row);
entry.row = row;
entry.html = null;
rebuilt.append(row);
}
if (!rebuilt.firstChild) return;
anchor ??= outerRows(source).find((row) => !visited.has(row)) ?? null;
if (anchor) anchor.before(rebuilt);
else section().append(rebuilt);
strip = createItemStrip();
for (const entry of entries) strip.push(entry.row);
},
collect,
syncUploaderTags() {
for (const entry of entries) if (entry.row) syncUploaderRow(entry.row, captureGalleryUploader(entry.row), uploaderTag());
},
appendPage(page) {
const table = page.querySelector(sourceSelector);
if (!table) throw new Error("eh-view-refined: the response carries no Extended listing");
const batch = doc.createDocumentFragment();
const incoming = new Set();
for (const row of outerRows(table)) {
const key = galleryKey(row);
if (!key || known.has(key) || incoming.has(key)) continue;
incoming.add(key);
capture(row);
batch.append(row);
}
const added = incoming.size;
section().append(batch);
collect();
return added;
},
dispose() {
disposed = true;
observer.disconnect();
}
};
}
function coverGeometry(width, height) {
if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return null;
const scaledHeight = Math.round(height * 250 / width);
const frameHeight = Math.min(340, scaledHeight);
return {
width: 250,
height: scaledHeight,
frameHeight,
top: Math.trunc((frameHeight - scaledHeight) / 2)
};
}
function element(doc, tag, className) {
const node = doc.createElement(tag);
if (className) node.className = className;
return node;
}
function coverOf(gallery) {
const { cover } = gallery.snapshot;
const source = gallery.bindings.cover;
if (!cover || !source) return {
image: null,
height: 0
};
const image = copy(source);
if (cover.deferredSource) {
image.setAttribute("src", cover.deferredSource);
image.removeAttribute("data-src");
}
const geometry = coverGeometry(cover.width, cover.height);
if (geometry) {
image.style.width = `${geometry.width}px`;
image.style.height = `${geometry.height}px`;
image.style.top = `${geometry.top}px`;
}
return {
image,
height: geometry ? geometry.height : cover.sourceHeight
};
}
function categoryOf(gallery, className) {
const source = gallery.bindings.category;
if (!source) return null;
const clone = copy(source);
const tone = gallery.snapshot.categoryTone;
clone.className = tone ? `${className} ${tone}` : className;
return clone;
}
function postedOf(gallery, id) {
const source = gallery.bindings.posted;
if (!source) return null;
const clone = copy(source);
clone.id = id;
return clone;
}
function downloadOf(doc, gallery) {
const source = gallery.bindings.download;
return source ? copy(source) : element(doc, "div", "gldown");
}
function titleOf(doc, gallery, className) {
const link = element(doc, "a");
link.setAttribute("href", gallery.snapshot.href);
const title = copy(gallery.bindings.title);
title.className = className;
link.append(title);
return link;
}
var PANE_FOOTER = 46;
function paneOf(doc, gallery, categoryClassName) {
const pane = element(doc, "div", "glthumb");
pane.id = `it${gallery.snapshot.gid}`;
const picture = element(doc, "div");
const cover = coverOf(gallery);
if (cover.image) picture.append(cover.image);
pane.append(picture);
const footer = element(doc, "div");
const left = element(doc, "div");
const category = categoryOf(gallery, categoryClassName);
if (category) left.append(category);
const posted = postedOf(gallery, `postedpop_${gallery.snapshot.gid}`);
if (posted) left.append(posted);
const right = element(doc, "div");
if (gallery.bindings.rating) right.append(copy(gallery.bindings.rating));
right.append(gallery.bindings.pages ? copy(gallery.bindings.pages) : element(doc, "div"));
footer.append(left, right);
pane.append(footer);
pane.style.height = `${(cover.height || gallery.snapshot.frameHeight) + PANE_FOOTER}px`;
return pane;
}
function categoryCell({ doc, gallery, definition }) {
const cell = element(doc, "td");
const category = categoryOf(gallery, definition.categoryClassName);
if (category) cell.append(category);
return cell;
}
function publishedCell({ gallery, preview }) {
const posted = postedOf(gallery, `posted_${gallery.snapshot.gid}`);
if (posted) preview.append(posted);
return preview;
}
function metadataCell({ doc, gallery, preview }) {
const stack = element(doc, "div");
const posted = postedOf(gallery, `posted_${gallery.snapshot.gid}`);
if (posted) stack.append(posted);
if (gallery.bindings.rating) stack.append(copy(gallery.bindings.rating));
stack.append(downloadOf(doc, gallery));
preview.append(stack);
return preview;
}
function downloadCell({ doc, gallery }) {
const cell = element(doc, "td");
cell.append(downloadOf(doc, gallery));
return cell;
}
function titleCell(context) {
const { doc, gallery, definition } = context;
const cell = element(doc, "td");
const title = titleOf(doc, gallery, "glink");
const tags = tagAreaOf(gallery, definition.tags, context.tagOptions, "gt");
if (tags.length > 0) {
const holder = element(doc, "div", definition.titleTagsClassName);
holder.append(...tags);
title.append(holder);
}
cell.append(title);
if (gallery.bindings.note) cell.append(copy(gallery.bindings.note));
context.hover = cell;
return cell;
}
function ratingCell({ doc, gallery }) {
const cell = element(doc, "td");
if (gallery.bindings.rating) cell.append(copy(gallery.bindings.rating));
return cell;
}
function uploaderCell({ doc, gallery }) {
const cell = element(doc, "td");
cell.append(gallery.bindings.uploader ? copy(gallery.bindings.uploader) : element(doc, "div"));
return cell;
}
function uploaderWithPagesCell(context) {
const cell = uploaderCell(context);
const pages = context.gallery.bindings.pages;
cell.append(pages ? copy(pages) : element(context.doc, "div"));
return cell;
}
function favouriteCell(doc, gallery, className) {
const { favorited, selection } = gallery.bindings;
if (!favorited && !selection) return null;
const cell = element(doc, "td", className);
if (favorited) {
const line = element(doc, "p");
line.append(...copy(favorited).childNodes);
cell.append(line);
}
if (selection) cell.append(...copy(selection).childNodes);
return cell;
}
function tableItem(doc, gallery, definition, tagOptions) {
const row = doc.createElement("tr");
if (gallery.snapshot.fresh !== null) row.setAttribute("data-new", gallery.snapshot.fresh);
const preview = element(doc, "td");
const cut = element(doc, "div", "glcut");
cut.id = `ic${gallery.snapshot.gid}`;
const pane = paneOf(doc, gallery, definition.categoryClassName);
preview.append(cut, pane);
const context = {
doc,
gallery,
definition,
preview,
hover: null,
tagOptions
};
for (const column of definition.columns) {
const cell = column.render(context);
cell.className = column.className;
row.append(cell);
}
context.hover?.addEventListener("mouseover", () => {
const top = preview.getBoundingClientRect().top;
const height = pane.getBoundingClientRect().height;
const bottom = (doc.defaultView?.innerHeight ?? height) - top - height;
pane.style.top = `${Math.max(-top, Math.min(0, bottom))}px`;
});
const favourite = favouriteCell(doc, gallery, definition.favouriteClassName);
if (favourite) row.append(favourite);
return {
node: row,
hover: context.hover
};
}
function tableLayout(definition) {
return {
root: {
tag: "table",
className: definition.rootClassName
},
createContainer(root) {
const doc = root.ownerDocument;
const body = doc.createElement("tbody");
const header = doc.createElement("tr");
for (const column of definition.columns) {
const cell = element(doc, "th", column.headerClassName);
if (column.header) localizeText(cell, column.header);
header.append(cell);
}
root.append(body);
body.append(header);
return body;
},
renderItem: (doc, gallery, tagOptions) => tableItem(doc, gallery, definition, tagOptions)
};
}
var minimalStructure = {
rootClassName: "itg gltm",
categoryClassName: "cs",
columns: [
{
className: "gl1m glcat",
render: categoryCell
},
{
className: "gl2m",
header: "columns.published",
render: publishedCell
},
{
className: "gl6m",
render: downloadCell
},
{
className: "gl3m glname",
header: "columns.title",
render: titleCell
},
{
className: "gl4m",
render: ratingCell
},
{
className: "gl5m glhide",
header: "columns.uploader",
headerClassName: "glhide",
render: uploaderCell
}
],
favouriteClassName: "glfav"
};
var minimalLayout = tableLayout({
...minimalStructure,
tags: "none"
});
var minimalPlusLayout = tableLayout({
...minimalStructure,
tags: "styled",
titleTagsClassName: "gltm"
});
var compactLayout = tableLayout({
rootClassName: "itg gltc",
categoryClassName: "cn",
columns: [
{
className: "gl1c glcat",
render: categoryCell
},
{
className: "gl2c",
header: "columns.published",
render: metadataCell
},
{
className: "gl3c glname",
header: "columns.title",
render: titleCell
},
{
className: "gl4c glhide",
header: "columns.uploader",
headerClassName: "glhide",
render: uploaderWithPagesCell
}
],
favouriteClassName: "glfav glfc",
tags: "styled-first"
});
function installNativeThumbnailStyles(doc) {
if (doc.getElementById("evr-native-thumbnail-style")) return;
const style = doc.createElement("style");
style.id = "evr-native-thumbnail-style";
style.textContent = `
@supports (display: grid) {
.gld { display: grid; grid-template-columns: repeat(5, 1fr); }
.gl1t { min-width: 250px; max-width: 400px; }
@media screen and (max-width: 1360px) { .gld { grid-template-columns: repeat(4, 1fr); } }
@media screen and (max-width: 1090px) { .gld { grid-template-columns: repeat(3, 1fr); } }
@media screen and (max-width: 820px) { .gld { grid-template-columns: repeat(2, 1fr); } }
}`;
(doc.head ?? doc.documentElement).append(style);
}
function favouritePanel(doc, gallery) {
const { favorited, selection } = gallery.bindings;
if (!favorited && !selection) return null;
const holder = element(doc, "div", "glft");
const date = element(doc, "div");
if (favorited) date.append(...copy(favorited).childNodes);
const select = element(doc, "div");
if (selection) select.append(...copy(selection).childNodes);
holder.append(date, select);
return holder;
}
function thumbnailItem(doc, gallery, tagOptions) {
const { snapshot, bindings } = gallery;
const card = element(doc, "div", "gl1t");
if (snapshot.fresh !== null) card.setAttribute("data-new", snapshot.fresh);
card.append(titleOf(doc, gallery, "gl4t glname glink"));
const frame = element(doc, "div", "gl3t");
if (snapshot.frameStyle) frame.setAttribute("style", snapshot.frameStyle);
const link = element(doc, "a");
link.setAttribute("href", snapshot.href);
const cover = coverOf(gallery);
if (cover.image) {
link.append(cover.image);
if (cover.height > 0) {
frame.style.width = "250px";
frame.style.height = `${Math.min(340, cover.height)}px`;
}
}
frame.append(link);
card.append(frame);
const tags = tagAreaOf(gallery, "styled", tagOptions);
if (tags.length > 0) {
const row = element(doc, "div", "gl6t");
row.append(...tags);
card.append(row);
}
const footer = element(doc, "div", "gl5t");
const left = element(doc, "div");
const category = categoryOf(gallery, "cs");
if (category) left.append(category);
const posted = postedOf(gallery, `posted_${snapshot.gid}`);
if (posted) left.append(posted);
const right = element(doc, "div");
if (bindings.rating) right.append(copy(bindings.rating));
right.append(bindings.pages ? copy(bindings.pages) : element(doc, "div"));
right.append(downloadOf(doc, gallery));
footer.append(left, right);
card.append(footer);
const favourite = favouritePanel(doc, gallery);
if (favourite) card.append(favourite);
if (bindings.note) card.append(copy(bindings.note));
return {
node: card,
hover: null
};
}
var nativeLayouts = {
m: minimalLayout,
p: minimalPlusLayout,
l: compactLayout,
t: {
root: {
tag: "div",
className: "itg gld"
},
initialize: installNativeThumbnailStyles,
renderItem: thumbnailItem
}
};
function createNativeListing(doc, view, tagOptions) {
const layout = nativeLayouts[view];
layout.initialize?.(doc);
installTagAreaStyles(doc);
const root = doc.createElement(layout.root.tag);
root.className = layout.root.className;
root.setAttribute("data-evr-view", view);
const container = layout.createContainer?.(root) ?? root;
const seen = new Set();
const strip = createItemStrip();
function render(gallery) {
const { snapshot } = gallery;
const item = layout.renderItem(doc, gallery, tagOptions);
item.node.setAttribute("data-evr-tags", snapshot.tagData);
if (snapshot.uploader !== null) item.node.setAttribute("data-evr-uploader", snapshot.uploader);
if (snapshot.rating !== null) item.node.setAttribute("data-evr-rating", String(snapshot.rating));
if (snapshot.myRating !== null) item.node.setAttribute("data-evr-my-rating", String(snapshot.myRating));
if (item.hover) {
item.hover.setAttribute("onmouseover", `show_image_pane(${snapshot.gid});preload_pane_image(${snapshot.previousGid},${snapshot.nextGid})`);
item.hover.setAttribute("onmouseout", "hide_image_pane()");
}
return item.node;
}
return {
element: root,
strip,
append(galleries) {
const nodes = [];
for (const gallery of galleries) {
if (seen.has(gallery.snapshot.gid)) continue;
seen.add(gallery.snapshot.gid);
nodes.push(render(gallery));
}
if (!nodes.length) return 0;
for (const node of nodes) strip.push(node);
insertItems(container, nodes);
return nodes.length;
}
};
}
function createListingPipeline(source, tagOptions = () => plainTagOptions) {
const doc = source.ownerDocument;
const host = createListingHost(source);
let active = null;
let disposed = false;
const input = createExtendedSource(source, publish, () => tagOptions().uploader);
const listeners = new Set();
function notify() {
for (const listener of listeners) listener();
}
function feed(listing) {
const batch = [];
while (listing.fed < input.count) {
const gallery = input.gallery(listing.fed++);
if (gallery) batch.push(gallery);
}
listing.native.append(batch);
input.release();
}
function open(next) {
return {
view: next,
native: createNativeListing(doc, next, tagOptions()),
fed: 0
};
}
function publish() {
if (active) feed(active);
notify();
}
function flush() {
if (disposed) return;
input.collect();
publish();
}
doc.addEventListener("DOMContentLoaded", flush);
return {
get element() {
return host.element;
},
get strip() {
return active ? active.native.strip : input.strip;
},
flush,
setView(next) {
if (disposed) return;
const previous = host.element;
if (next === "e") {
input.restore();
active = null;
host.mount(source, next);
syncSelection(previous, source);
notify();
return;
}
if (active?.view !== next) active = open(next);
host.mount(active.native.element, next);
feed(active);
syncSelection(previous, active.native.element);
notify();
},
appendPage(page) {
if (disposed) return 0;
const added = input.appendPage(page);
publish();
return added;
},
watch(listener) {
listeners.add(listener);
return () => listeners.delete(listener);
},
refreshTags() {
if (disposed) return;
input.syncUploaderTags();
if (!active) return;
const previous = active.native.element;
active = open(active.view);
host.mount(active.native.element, active.view);
feed(active);
syncSelection(previous, active.native.element);
notify();
},
revealAll() {
const strip = active ? active.native.strip : input.strip;
strip.setRange(0, strip.count);
},
dispose() {
if (disposed) return;
disposed = true;
listeners.clear();
const shown = host.element;
input.restore();
input.dispose();
doc.removeEventListener("DOMContentLoaded", flush);
syncSelection(shown, source);
host.dispose();
}
};
}
var listViews = [
"m",
"p",
"l",
"e",
"t"
];
var simulatedPrefix = "evr-";
var storageKey = "ehe:view";
var inlineSetParameter = "inline_set";
var nativeExtendedMode = "dm_e";
function isListView(value) {
return listViews.includes(value);
}
function parseModeValue(value) {
if (value.startsWith("evr-")) {
const view = value.slice(4);
return isListView(view) ? {
kind: "simulated",
view
} : null;
}
return isListView(value) ? {
kind: "native",
mode: value
} : null;
}
function nativeExtendedUrl(href) {
const url = new URL(href);
url.searchParams.set(inlineSetParameter, nativeExtendedMode);
return url.toString();
}
function planModeChange(value, context) {
const choice = parseModeValue(value);
if (!choice) return { kind: "ignore" };
if (choice.kind === "native") return {
kind: "native",
mode: choice.mode
};
if (context.extended) return {
kind: "apply",
view: choice.view
};
return {
kind: "navigate",
view: choice.view,
url: nativeExtendedUrl(context.href)
};
}
function initialView(stored, extended) {
if (!extended) return "e";
return stored ?? "t";
}
function readStoredView(storage) {
const stored = storage.getItem(storageKey);
return stored && isListView(stored) ? stored : null;
}
function storeView(storage, view) {
if (view === null) storage.removeItem(storageKey);
else storage.setItem(storageKey, view);
}
var navSelector = ".searchnav";
var groupAttribute = "data-evr-modes";
function isModeSelect(node) {
if (!(node instanceof HTMLSelectElement) || !node.closest(navSelector)) return false;
const values = new Set(Array.from(node.options, (option) => option.value));
return listViews.every((view) => values.has(view));
}
function findModeSelects(root) {
return Array.from(root.querySelectorAll(`${navSelector} select`)).filter(isModeSelect);
}
function decorateModeSelect(select) {
const existing = select.querySelectorAll(`optgroup[${groupAttribute}]`);
if (existing.length === 1) return;
for (const stale of existing) stale.remove();
const group = document.createElement("optgroup");
group.setAttribute(groupAttribute, "");
group.setAttribute("translate", "no");
localizeLabel(group, "select.group");
for (const view of listViews) {
const option = document.createElement("option");
option.value = view;
localizeText(option, `views.${view}`);
group.append(option);
}
select.append(group);
}
function undecorateModeSelect(select) {
for (const group of select.querySelectorAll(`optgroup[${groupAttribute}]`)) group.remove();
}
function readModeChoice(select) {
for (const option of select.options) {
if (!option.selected) continue;
return option.closest(`optgroup[${groupAttribute}]`) ? `${simulatedPrefix}${option.value}` : option.value;
}
return select.value;
}
function syncModeSelect(select, view) {
const selected = Array.from(select.options).find((option) => option.value === view && option.closest(`optgroup[${groupAttribute}]`));
if (!selected) return;
for (const option of select.options) option.toggleAttribute("selected", option === selected);
selected.selected = true;
}
function observeModeSelects(root, onMutate) {
const watched = new WeakSet();
const scoped = new MutationObserver(() => {
onMutate();
scoped.takeRecords();
});
function watch(nav) {
if (watched.has(nav)) return;
watched.add(nav);
scoped.observe(nav, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: [
"class",
"style",
"hidden"
]
});
}
function scan() {
for (const nav of root.querySelectorAll(navSelector)) watch(nav);
}
const bootstrap = new MutationObserver((records) => {
let found = false;
for (const record of records) for (const node of record.addedNodes) {
if (!(node instanceof Element)) continue;
if (node.matches(navSelector)) {
watch(node);
found = true;
} else if (node.firstElementChild) for (const nav of node.querySelectorAll(navSelector)) {
watch(nav);
found = true;
}
}
if (found) onMutate();
});
function settle() {
bootstrap.disconnect();
document.removeEventListener("DOMContentLoaded", settle);
scan();
onMutate();
}
scan();
if (document.readyState === "loading") {
bootstrap.observe(document, {
childList: true,
subtree: true
});
document.addEventListener("DOMContentLoaded", settle);
}
return () => {
bootstrap.disconnect();
scoped.disconnect();
document.removeEventListener("DOMContentLoaded", settle);
};
}
function startViewSwitcher(options) {
const root = options.root ?? document;
const extended = options.table !== null;
if (!extended && findModeSelects(root).length === 0) return null;
const storage = options.storage ?? window.sessionStorage;
const href = options.href ?? (() => location.href);
const navigate = options.navigate ?? ((url) => location.assign(url));
const presentation = options.table ? createListingPipeline(options.table, options.tagOptions) : null;
let view = initialView(readStoredView(storage), extended);
function refresh() {
for (const select of findModeSelects(root)) {
decorateModeSelect(select);
if (extended) syncModeSelect(select, view);
}
}
function apply(next) {
view = next;
presentation?.setView(next);
refresh();
}
function onChange(event) {
if (!isModeSelect(event.target)) return;
const transition = planModeChange(readModeChoice(event.target), {
extended,
href: href()
});
if (transition.kind === "ignore") return;
if (transition.kind === "native") {
storeView(storage, transition.mode === "e" ? "e" : null);
return;
}
event.stopPropagation();
event.stopImmediatePropagation();
storeView(storage, transition.view);
if (transition.kind === "apply") apply(transition.view);
else navigate(transition.url);
}
apply(view);
document.addEventListener("change", onChange, true);
const stopObserving = observeModeSelects(root, refresh);
return {
presentation,
dispose() {
stopObserving();
document.removeEventListener("change", onChange, true);
for (const select of findModeSelects(root)) undecorateModeSelect(select);
presentation?.dispose();
}
};
}
function startEarlyListing(onReady) {
let switcher = null;
let started = false;
let disposed = false;
function start(table) {
if (started || disposed) return;
started = true;
observer.disconnect();
switcher = startViewSwitcher({
table,
tagOptions: () => ({
group: getGroupTags(),
uploader: getUploaderTag(),
allMyTags: getAllMyTags(),
allOtherTags: getAllOtherTags()
})
});
}
const observer = new MutationObserver((records) => {
for (const record of records) for (const node of record.addedNodes) {
if (!(node instanceof Element)) continue;
const table = node.matches("table.itg.glte") ? node : node.firstElementChild && node.querySelector("table.itg.glte");
if (table) {
start(table);
return;
}
}
});
function ready() {
document.removeEventListener("DOMContentLoaded", ready);
if (disposed) return;
start(null);
if (!switcher) return;
switcher.presentation?.flush();
onReady?.(switcher);
}
observer.observe(document, {
childList: true,
subtree: true
});
const parsed = document.querySelector(sourceSelector);
if (parsed) start(parsed);
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", ready);
else ready();
return { dispose() {
if (disposed) return;
disposed = true;
observer.disconnect();
document.removeEventListener("DOMContentLoaded", ready);
switcher?.dispose();
} };
}
function startPagination(presentation) {
const doc = presentation.element.ownerDocument;
const win = doc.defaultView;
const bottom = doc.querySelectorAll(".searchnav")[1];
if (!bottom) return () => {};
function nextUrl(page, base) {
const href = page.querySelector("#dnext")?.getAttribute("href");
return href ? new URL(href, base).href : null;
}
let next = nextUrl(doc, doc.URL);
let loading = false;
let disposed = false;
const visited = new Set([doc.URL]);
const abort = new AbortController();
const errorNotice = doc.createElement("p");
errorNotice.setAttribute("translate", "no");
function updateNextLinks(page) {
for (const id of ["unext", "dnext"]) {
const current = doc.getElementById(id);
const replacement = page.getElementById(id);
if (current && replacement) current.replaceWith(doc.importNode(replacement, true));
else current?.remove();
}
}
async function fetchPage(url) {
for (const target of [url, nativeExtendedUrl(url)]) {
const response = await win.fetch(target, { signal: abort.signal });
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const page = new win.DOMParser().parseFromString(await response.text(), "text/html");
if (page.querySelector("table.itg.glte")) return {
page,
base: response.url || url
};
}
throw new Error("eh-view-refined: the response carries no Extended listing");
}
async function load() {
if (loading || disposed || !next) return;
loading = true;
try {
do {
const url = next;
if (visited.has(url)) {
next = null;
break;
}
const { page, base } = await fetchPage(url);
if (disposed) return;
presentation.appendPage(page);
visited.add(url);
next = nextUrl(page, base);
updateNextLinks(page);
} while (next && !disposed && bottom.getBoundingClientRect().top <= win.innerHeight + 400);
if (!next) observer.disconnect();
} catch (error) {
if (!disposed) {
observer.disconnect();
localizeText(errorNotice, "pagination.error");
bottom.after(errorNotice);
console.error("[Eh View Refined] Pagination stopped:", error);
}
} finally {
loading = false;
}
}
const observer = new win.IntersectionObserver((entries) => {
if (entries.some((entry) => entry.isIntersecting)) load();
}, { rootMargin: "400px" });
if (next) observer.observe(bottom);
return () => {
disposed = true;
abort.abort();
observer.disconnect();
errorNotice.remove();
};
}
var POSITION_PARAMETERS = [
"prev",
"next",
"jump",
"seek",
"range",
"inline_set"
];
var GID_CURSOR = /^\d+$/;
var SETTLE_MS = 250;
function pagesByGid(root) {
const cursorHref = root.querySelector("#unext[href], #dnext[href], #uprev[href], #dprev[href]")?.getAttribute("href");
if (!cursorHref) return false;
const url = new URL(cursorHref, "https://e-hentai.org/");
const cursor = url.searchParams.get("next") ?? url.searchParams.get("prev");
return cursor !== null && GID_CURSOR.test(cursor);
}
function positionUrl(href, gid) {
const url = new URL(href);
for (const name of POSITION_PARAMETERS) url.searchParams.delete(name);
url.searchParams.set("next", String(Number(gid) + 1));
return url.toString();
}
function startLiveUrl(presentation, origin) {
const doc = presentation.element.ownerDocument;
const win = doc.defaultView;
if (!pagesByGid(doc)) return () => {};
let written = win.location.href;
let timer = 0;
function topGallery() {
const strip = presentation.strip;
for (let index = strip.start; index < strip.end; index++) {
const node = strip.nodeAt(index);
if (node && node.getBoundingClientRect().bottom > 0) return {
index,
node
};
}
return null;
}
function write() {
timer = 0;
const top = topGallery();
if (!top) return;
const key = top.index === 0 ? null : galleryKey(top.node);
const next = key ? positionUrl(origin.href, key.split("/")[0]) : origin.href;
if (next === written) return;
win.history.scrollRestoration = next === origin.href ? origin.scrollRestoration : "manual";
win.history.replaceState(win.history.state, "", next);
written = next;
}
function schedule() {
if (timer) win.clearTimeout(timer);
timer = win.setTimeout(write, SETTLE_MS);
}
win.addEventListener("scroll", schedule, { passive: true });
return () => {
if (timer) win.clearTimeout(timer);
win.removeEventListener("scroll", schedule);
};
}
var PAGE_SIZE = 25;
function createWindowMemory() {
return {
step: 0,
heights: [],
fallback: 0
};
}
function chunkSize(columns) {
const lines = Math.max(1, Math.floor(columns));
return lines * Math.ceil(PAGE_SIZE / lines);
}
function estimate(memory, chunk) {
return memory.heights[chunk] ?? memory.fallback;
}
function itemsIn(chunk, step, count) {
return Math.max(0, Math.min(step, count - chunk * step));
}
function spacers(memory, count, range) {
const step = memory.step;
if (!step) return {
above: 0,
below: 0
};
let above = 0;
for (let chunk = 0; chunk < range.start / step; chunk++) above += estimate(memory, chunk);
let below = 0;
if (range.end < count) for (let chunk = range.end / step; chunk * step < count; chunk++) below += memory.heights[chunk] ?? memory.fallback * itemsIn(chunk, step, count) / step;
return {
above,
below
};
}
function regroup(geometry, memory, step) {
const { count, start, end } = geometry;
const before = spacers(memory, count, geometry);
const perAbove = start ? before.above / start : memory.fallback / step;
const perBelow = end < count ? before.below / (count - end) : memory.fallback / step;
const nextStart = start - start % step;
const nextEnd = end >= count ? count : Math.min(count, Math.ceil(end / step) * step);
const heights = [];
for (let chunk = 0; chunk * step < count; chunk++) {
const items = itemsIn(chunk, step, count);
heights.push((chunk * step < nextStart ? perAbove : perBelow) * items);
}
memory.step = step;
memory.heights = heights;
return {
start: nextStart,
end: nextEnd,
target: null
};
}
function planWindow(geometry, memory) {
const { count, start, end, viewport, reach } = geometry;
if (count === 0) return null;
const step = chunkSize(geometry.columns);
if (start >= end) {
memory.step = step;
return {
start: 0,
end: Math.min(count, step),
target: null
};
}
if (memory.step === 0) memory.step = step;
else if (memory.step !== step) return regroup(geometry, memory, step);
const top = geometry.top(start);
const bottom = geometry.bottom(end - 1);
memory.fallback = (bottom - top) / Math.ceil((end - start) / step);
const far = reach * 2;
const first = start / step;
const after = Math.ceil(end / step);
const lostAbove = start > 0 && top > viewport + reach;
const lostBelow = end < count && bottom < -reach;
if (lostAbove || lostBelow) {
for (let chunk = first; chunk < after; chunk++) {
const next = (chunk + 1) * step;
memory.heights[chunk] = (next < end ? geometry.top(next) : bottom) - geometry.top(chunk * step);
}
let chunk;
let edge;
if (lostAbove) {
chunk = first;
edge = top;
while (chunk > 0 && edge > 0) edge -= estimate(memory, --chunk);
} else {
chunk = after;
edge = bottom;
while ((chunk + 1) * step < count && edge + estimate(memory, chunk) < 0) edge += estimate(memory, chunk++);
}
return {
start: chunk * step,
end: Math.min(count, (chunk + 1) * step),
target: {
index: chunk * step,
top: edge
}
};
}
if (start > 0 && top > -reach) return {
start: start - step,
end,
target: null
};
if (end < count && bottom < viewport + reach) return {
start,
end: Math.min(count, end + step),
target: null
};
if (start + step < end && geometry.bottom(start + step - 1) < -far) {
memory.heights[first] = geometry.top(start + step) - top;
return {
start: start + step,
end,
target: null
};
}
const cut = end % step ? end - end % step : end - step;
if (cut > start && geometry.top(cut) > viewport + far) {
memory.heights[cut / step] = bottom - geometry.top(cut);
return {
start,
end: cut,
target: null
};
}
return null;
}
function rendered(node) {
return !!node && node.getClientRects().length > 0;
}
function startListingWindow(presentation) {
const win = presentation.element.ownerDocument.defaultView;
const doc = win.document;
const memories = new WeakMap();
const spacerAbove = createSpacer();
const spacerBelow = createSpacer();
const parkedStyle = doc.createElement("style");
parkedStyle.textContent = `.${PARKED_CLASS} { display: none !important; }`;
(doc.head ?? doc.documentElement).append(parkedStyle);
function createSpacer() {
const spacer = doc.createElement("div");
spacer.className = "evr-window-spacer";
spacer.setAttribute("aria-hidden", "true");
spacer.style.overflowAnchor = "none";
return spacer;
}
function memoryOf(strip) {
let memory = memories.get(strip);
if (!memory) memories.set(strip, memory = createWindowMemory());
return memory;
}
function fitSpacers(strip, memory) {
const listing = presentation.element;
if (listing.previousSibling !== spacerAbove) listing.before(spacerAbove);
if (listing.nextSibling !== spacerBelow) listing.after(spacerBelow);
const room = spacers(memory, strip.count, strip);
const above = `${Math.round(room.above)}px`;
const below = `${Math.round(room.below)}px`;
if (spacerAbove.style.height !== above) spacerAbove.style.height = above;
if (spacerBelow.style.height !== below) spacerBelow.style.height = below;
}
let frame = 0;
let stopped = false;
function schedule() {
if (!stopped && !frame) frame = win.requestAnimationFrame(update);
}
function top(strip, index) {
for (let next = index; next < strip.end; next++) {
const node = strip.nodeAt(next);
if (rendered(node)) return node.getBoundingClientRect().top;
}
return presentation.element.getBoundingClientRect().bottom;
}
function bottom(strip, index) {
for (let previous = index; previous >= strip.start; previous--) {
const node = strip.nodeAt(previous);
if (rendered(node)) return node.getBoundingClientRect().bottom;
}
return presentation.element.getBoundingClientRect().top;
}
function columnsOf(strip) {
let first = null;
let columns = 0;
for (let index = strip.start; index < strip.end && columns < 64; index++) {
const node = strip.nodeAt(index);
if (!rendered(node)) continue;
const edge = node.getBoundingClientRect().top;
if (first === null) first = edge;
else if (Math.abs(edge - first) > 1) break;
columns++;
}
return Math.max(1, columns);
}
function visible(strip) {
for (let index = strip.start; index < strip.end; index++) {
const node = strip.nodeAt(index);
if (rendered(node) && node.getBoundingClientRect().bottom > 0) return node;
}
return null;
}
function update() {
frame = 0;
if (stopped || !presentation.element.isConnected) return;
const strip = presentation.strip;
const memory = memoryOf(strip);
const viewport = win.innerHeight;
const next = planWindow({
count: strip.count,
start: strip.start,
end: strip.end,
columns: columnsOf(strip),
viewport,
reach: Math.max(viewport * 1.5, 1200),
top: (index) => top(strip, index),
bottom: (index) => bottom(strip, index)
}, memory);
if (!next) {
fitSpacers(strip, memory);
return;
}
const anchor = next.target ? null : visible(strip);
const before = anchor?.getBoundingClientRect().top ?? 0;
strip.setRange(next.start, next.end);
fitSpacers(strip, memory);
const drift = next.target ? top(strip, next.target.index) - next.target.top : anchor ? anchor.getBoundingClientRect().top - before : 0;
if (Math.abs(drift) >= 1) win.scrollBy(0, drift);
schedule();
}
const unwatch = presentation.watch(schedule);
win.addEventListener("scroll", schedule, { passive: true });
win.addEventListener("resize", schedule);
schedule();
return () => {
stopped = true;
if (frame) win.cancelAnimationFrame(frame);
frame = 0;
unwatch();
win.removeEventListener("scroll", schedule);
win.removeEventListener("resize", schedule);
presentation.revealAll();
spacerAbove.remove();
spacerBelow.remove();
parkedStyle.remove();
};
}
var defaultAttributes = {
xmlns: "http://www.w3.org/2000/svg",
width: 24,
height: 24,
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
"stroke-width": 2,
"stroke-linecap": "round",
"stroke-linejoin": "round"
};
var mergeClasses = (...classes) => classes.filter((className, index, array) => {
return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index;
}).join(" ").trim();
function isDefined(value) {
return value !== null && value !== void 0;
}
function buildLucideIconNode(icon, params = {}) {
const attributeNames = params.attributeNames ?? {};
const getAttributeName = (attributeName) => attributeNames[attributeName] ?? attributeName;
const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes["width"];
const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes["height"];
const aliasClassNames = icon.aliases?.filter((alias) => typeof alias === "string" && alias.trim() !== "").map((alias) => `lucide-${alias}`) ?? [];
const iconClassNames = [...icon.name ? [`lucide-${icon.name}`] : [], ...aliasClassNames];
const classNamesFromClassName = params.className?.split(" ").filter(Boolean) ?? [];
const className = params.includeDefaultClasses === false ? mergeClasses(...classNamesFromClassName) : mergeClasses("lucide", ...iconClassNames, ...classNamesFromClassName);
const calculatedStrokeWidth = params.absoluteStrokeWidth ? Number(params.strokeWidth ?? defaultAttributes["stroke-width"]) * Number(icon.size ?? icon.width ?? defaultAttributes["width"]) / Number(params.size ?? params.width ?? defaultAttributes["width"]) : params.strokeWidth ?? defaultAttributes["stroke-width"];
return [
"svg",
{
...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {
attrs[getAttributeName(attrName)] = value;
return attrs;
}, {}),
..."color" in params && params.color && { [getAttributeName("stroke")]: params.color },
..."size" in params && isDefined(params.size) && {
[getAttributeName("width")]: params.size,
[getAttributeName("height")]: params.size
},
..."width" in params && isDefined(params.width) && { [getAttributeName("width")]: params.width },
..."height" in params && isDefined(params.height) && { [getAttributeName("height")]: params.height },
[getAttributeName("stroke-width")]: calculatedStrokeWidth,
...className && { [getAttributeName("class")]: className },
[getAttributeName("viewBox")]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,
...params.hasA11yProp === false ? { [getAttributeName("aria-hidden")]: "true" } : {},
..."attributes" in params && params.attributes
},
icon.node.map((child) => {
const [name, attrs, children] = child;
const nextAttrs = params.nonScalingStroke ? {
[getAttributeName("vector-effect")]: "non-scaling-stroke",
...attrs
} : attrs;
return children ? [
name,
nextAttrs,
children
] : [name, nextAttrs];
})
];
}
var hasA11yProp = (props) => {
for (const prop in props) if (prop.startsWith("aria-") || prop === "role" || prop === "title") return true;
return false;
};
var isEmptyString = (value) => value === "";
var toKebabCase = (string) => string?.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
var LUCIDE_CONTEXT = Symbol("lucide-icons");
function useLucideProps() {
return inject(LUCIDE_CONTEXT, {});
}
var Icon = ({ name, iconNode, "icon-node": iconNodeKebabCase, icon = {
name: name && toKebabCase(name),
node: iconNode ?? iconNodeKebabCase ?? [],
size: 24,
aliases: []
}, absoluteStrokeWidth, "absolute-stroke-width": absoluteStrokeWidthKebabCase, nonScalingStroke, "non-scaling-stroke": nonScalingStrokeKebabCase, strokeWidth, "stroke-width": strokeWidthKebabCase, size, width = size, height = size, color, ...props }, { slots }) => {
const { size: contextSize, color: contextColor, strokeWidth: contextStrokeWidth = 2, absoluteStrokeWidth: contextAbsoluteStrokeWidth = false, nonScalingStroke: contextNonScalingStroke = false, class: contextClass = "" } = useLucideProps();
const isAbsoluteStrokeWidth = isEmptyString(absoluteStrokeWidth) || isEmptyString(absoluteStrokeWidthKebabCase) || absoluteStrokeWidth === true || absoluteStrokeWidthKebabCase === true || contextAbsoluteStrokeWidth === true;
const isNonScalingStroke = isEmptyString(nonScalingStroke) || isEmptyString(nonScalingStrokeKebabCase) || nonScalingStroke === true || nonScalingStrokeKebabCase === true || contextNonScalingStroke === true;
delete props.class;
const defaultSlot = slots.default?.();
const [, svgAttributes, builtIconNode = []] = buildLucideIconNode(icon, {
color: color ?? contextColor,
width: width ?? size ?? contextSize,
height: height ?? size ?? contextSize,
strokeWidth: strokeWidth ?? strokeWidthKebabCase ?? contextStrokeWidth,
absoluteStrokeWidth: isAbsoluteStrokeWidth,
nonScalingStroke: isNonScalingStroke,
className: contextClass,
hasA11yProp: defaultSlot != null && defaultSlot.length > 0 || hasA11yProp(props),
attributes: props
});
return h("svg", svgAttributes, [...builtIconNode.map(([tag, attrs]) => h(tag, attrs)), ...defaultSlot ?? []]);
};
function createLucideIcon(iconDataOrName, iconNode = []) {
const icon = typeof iconDataOrName === "string" ? {
name: iconDataOrName,
node: iconNode
} : iconDataOrName;
return (props, { slots }) => h(Icon, {
...props,
icon
}, slots.default ? { default: slots.default } : void 0);
}
var Languages = createLucideIcon({
name: "languages",
size: 24,
node: [
["path", {
d: "m5 8 6 6",
key: "1wu5hv"
}],
["path", {
d: "m4 14 6-6 2-3",
key: "1k1g8d"
}],
["path", {
d: "M2 5h12",
key: "or177f"
}],
["path", {
d: "M7 2h1",
key: "1t2jsx"
}],
["path", {
d: "m22 22-5-10-5 10",
key: "don7ne"
}],
["path", {
d: "M14 18h6",
key: "1m8k6r"
}]
]
});
var Settings = createLucideIcon({
name: "settings",
size: 24,
node: [["path", {
d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",
key: "1i5ecw"
}], ["circle", {
cx: "12",
cy: "12",
r: "3",
key: "1v7zrd"
}]]
});
var Tags = createLucideIcon({
name: "tags",
size: 24,
node: [
["path", {
d: "M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z",
key: "16rjxf"
}],
["path", {
d: "M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193",
key: "178nd4"
}],
["circle", {
cx: "10.5",
cy: "6.5",
r: ".5",
fill: "currentColor",
key: "12ikhr"
}]
]
});
var X = createLucideIcon({
name: "x",
size: 24,
node: [["path", {
d: "M18 6 6 18",
key: "1bl5f8"
}], ["path", {
d: "m6 6 12 12",
key: "d8bk6v"
}]]
});
var _hoisted_1$1 = ["title", "aria-label"];
var SettingsButton_default = defineComponent({
__name: "SettingsButton",
emits: ["open"],
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createElementBlock("button", {
type: "button",
class: "evr-settings-button",
title: unref(t)("settings.open"),
"aria-label": unref(t)("settings.open"),
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("open"))
}, [createVNode(unref(Settings), {
size: 15,
"aria-hidden": "true"
}), createBaseVNode("span", null, toDisplayString(unref(t)("settings.button")), 1)], 8, _hoisted_1$1);
};
}
});
var _hoisted_1 = ["aria-label"];
var _hoisted_2 = { class: "evr-settings__header" };
var _hoisted_3 = { class: "evr-settings__title" };
var _hoisted_4 = ["aria-label", "title"];
var _hoisted_5 = { class: "evr-settings__panel" };
var _hoisted_6 = { class: "evr-settings__panel-inner" };
var _hoisted_7 = { class: "evr-settings__section" };
var _hoisted_8 = { class: "evr-settings__subtitle" };
var _hoisted_9 = ["value", "aria-label"];
var _hoisted_10 = { value: "auto" };
var _hoisted_11 = ["value", "lang"];
var _hoisted_12 = { class: "evr-settings__section" };
var _hoisted_13 = { class: "evr-settings__subtitle" };
var _hoisted_14 = { class: "evr-switch" };
var _hoisted_15 = ["checked", "onChange"];
var _hoisted_16 = { class: "evr-settings__label" };
var _hoisted_17 = { class: "evr-settings__section" };
var _hoisted_18 = { class: "evr-settings__subtitle" };
var _hoisted_19 = { class: "evr-switch" };
var _hoisted_20 = ["checked", "onChange"];
var _hoisted_21 = { class: "evr-settings__label" };
var scrollLockAttribute = "data-evr-scroll-locked";
var focusableSelector = "button, input, select, textarea, a[href], [tabindex]:not([tabindex=\"-1\"])";
var SettingsPopup_default = defineComponent({
__name: "SettingsPopup",
emits: ["close"],
setup(__props, { emit: __emit }) {
const emit = __emit;
function toggle(label, get, set, subscribe) {
return {
label,
value: ref(get()),
set,
subscribe
};
}
const browsing = [toggle("settings.infiniteScroll", getInfiniteScroll, setInfiniteScroll, subscribeInfiniteScroll)];
const tags = [
toggle("settings.groupTags", getGroupTags, setGroupTags, subscribeGroupTags),
toggle("settings.uploaderTag", getUploaderTag, setUploaderTag, subscribeUploaderTag),
toggle("settings.allMyTags", getAllMyTags, setAllMyTags, subscribeAllMyTags),
toggle("settings.allOtherTags", getAllOtherTags, setAllOtherTags, subscribeAllOtherTags)
];
const localeOptions = [
{
value: "zh-TW",
label: "繁體中文"
},
{
value: "zh-CN",
label: "简体中文"
},
{
value: "en",
label: "English"
},
{
value: "ja",
label: "日本語"
},
{
value: "ko",
label: "한국어"
}
];
const localeChoice = ref(getLocaleChoice());
const dialog = ref(null);
let unsubscribers = [];
function keepFocusInside(event) {
const root = dialog.value;
if (!root) return;
const focusable = Array.from(root.querySelectorAll(focusableSelector)).filter((node) => !node.matches(":disabled"));
if (focusable.length === 0) return;
const first = focusable[0];
const last = focusable[focusable.length - 1];
const active = document.activeElement;
const inside = active !== root && active instanceof Node && root.contains(active);
if (!(event.shiftKey ? !inside || active === first : !inside || active === last)) return;
event.preventDefault();
(event.shiftKey ? last : first).focus();
}
function onKeydown(event) {
if (event.defaultPrevented) return;
if (event.key === "Tab") {
keepFocusInside(event);
return;
}
if (event.key !== "Escape") return;
event.preventDefault();
event.stopPropagation();
emit("close");
}
function onToggle(entry, event) {
const input = event.target;
try {
entry.set(input.checked);
} catch (error) {
input.checked = entry.value.value;
throw error;
}
}
onMounted(() => {
unsubscribers = [...browsing, ...tags].map((entry) => entry.subscribe((value) => {
entry.value.value = value;
}));
unsubscribers.push(subscribeLocaleChoice((value) => {
localeChoice.value = value;
}));
document.addEventListener("keydown", onKeydown, true);
document.documentElement.setAttribute(scrollLockAttribute, "");
dialog.value?.focus();
});
onBeforeUnmount(() => {
for (const unsubscribe of unsubscribers) unsubscribe();
document.removeEventListener("keydown", onKeydown, true);
document.documentElement.removeAttribute(scrollLockAttribute);
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: "evr-popup-overlay",
onMousedown: _cache[2] || (_cache[2] = withModifiers(($event) => emit("close"), ["self"]))
}, [createBaseVNode("div", {
ref_key: "dialog",
ref: dialog,
class: "evr-popup",
role: "dialog",
"aria-modal": "true",
"aria-label": unref(t)("settings.open"),
tabindex: "-1"
}, [createBaseVNode("div", _hoisted_2, [createBaseVNode("h3", _hoisted_3, toDisplayString(unref(t)("settings.title")), 1), createBaseVNode("button", {
type: "button",
class: "evr-settings__close-btn",
"aria-label": unref(t)("settings.close"),
title: unref(t)("settings.close"),
onClick: _cache[0] || (_cache[0] = ($event) => emit("close"))
}, [createVNode(unref(X), {
size: 18,
"aria-hidden": "true"
})], 8, _hoisted_4)]), createBaseVNode("div", _hoisted_5, [createBaseVNode("div", _hoisted_6, [
createBaseVNode("section", _hoisted_7, [createBaseVNode("h4", _hoisted_8, [createVNode(unref(Languages), {
size: 14,
"aria-hidden": "true"
}), createTextVNode(toDisplayString(unref(t)("settings.language")), 1)]), createBaseVNode("select", {
class: "evr-settings__select",
value: localeChoice.value,
"aria-label": unref(t)("settings.language"),
onChange: _cache[1] || (_cache[1] = ($event) => unref(setLocaleChoice)($event.target.value))
}, [createBaseVNode("option", _hoisted_10, toDisplayString(unref(t)("settings.languageAuto")), 1), (openBlock(), createElementBlock(Fragment, null, renderList(localeOptions, (option) => {
return createBaseVNode("option", {
key: option.value,
value: option.value,
lang: option.value
}, toDisplayString(option.label), 9, _hoisted_11);
}), 64))], 40, _hoisted_9)]),
createBaseVNode("section", _hoisted_12, [createBaseVNode("h4", _hoisted_13, toDisplayString(unref(t)("settings.browsingSection")), 1), (openBlock(), createElementBlock(Fragment, null, renderList(browsing, (entry) => {
return createBaseVNode("label", {
key: entry.label,
class: "evr-settings__row"
}, [createBaseVNode("span", _hoisted_14, [createBaseVNode("input", {
class: "evr-switch__input",
type: "checkbox",
checked: entry.value.value,
onChange: ($event) => onToggle(entry, $event)
}, null, 40, _hoisted_15), _cache[3] || (_cache[3] = createBaseVNode("span", { class: "evr-switch__track" }, [createBaseVNode("span", { class: "evr-switch__knob" })], -1))]), createBaseVNode("span", _hoisted_16, toDisplayString(unref(t)(entry.label)), 1)]);
}), 64))]),
createBaseVNode("section", _hoisted_17, [createBaseVNode("h4", _hoisted_18, [createVNode(unref(Tags), {
size: 14,
"aria-hidden": "true"
}), createTextVNode(toDisplayString(unref(t)("settings.tagsSection")), 1)]), (openBlock(), createElementBlock(Fragment, null, renderList(tags, (entry) => {
return createBaseVNode("label", {
key: entry.label,
class: "evr-settings__row"
}, [createBaseVNode("span", _hoisted_19, [createBaseVNode("input", {
class: "evr-switch__input",
type: "checkbox",
checked: entry.value.value,
onChange: ($event) => onToggle(entry, $event)
}, null, 40, _hoisted_20), _cache[4] || (_cache[4] = createBaseVNode("span", { class: "evr-switch__track" }, [createBaseVNode("span", { class: "evr-switch__knob" })], -1))]), createBaseVNode("span", _hoisted_21, toDisplayString(unref(t)(entry.label)), 1)]);
}), 64))])
])])], 8, _hoisted_1)], 32);
};
}
});
var settings_default = ".evr-scope{--evr-fs-lg:13px;--evr-radius-sm:3px;--evr-border-width:2px;--evr-ctrl-h:25px;--evr-ctrl-gap:4px;--evr-ctrl-padding:6px;--evr-ctrl-margin:0 1px 1px;--evr-popup-width:24rem;--evr-popup-padding:1.25rem;--evr-z-overlay:99999;--evr-transition-base:background .15s, border-color .15s, color .15s;--evr-bg:#edebdf;--evr-bg-hover:#0000000f;--evr-bg-active:#ddd8c8;--evr-bg-btn:#edeada;--evr-bg-btn-hover:#e2dfcf;--evr-text:#5c0d12;--evr-text-hint:#8a8271;--evr-text-on-color:#fff;--evr-border:#b5a4a4;--evr-overlay:#0006;--evr-shadow:0 4px 16px #00000040;--evr-green:#4a7c59;color:var(--evr-text);font-size:var(--evr-fs-lg);text-align:left}.evr-scope--dark{--evr-bg:#4f535b;--evr-bg-hover:#ffffff0f;--evr-bg-active:#5e636c;--evr-bg-btn:#34353b;--evr-bg-btn-hover:#3e3f45;--evr-text:#ddd;--evr-text-hint:#b0b0b0;--evr-border:#8d8d8d;--evr-overlay:#0009;--evr-shadow:0 4px 16px #00000080;--evr-green:#5a9a6a}.evr-scope,.evr-scope *,.evr-scope :before,.evr-scope :after{box-sizing:border-box}.evr-scope :where(button){font-family:inherit;font-weight:inherit;line-height:1.4}.searchnav select:has(+.evr-settings-host){vertical-align:middle}.evr-settings-host{vertical-align:middle;margin-inline-start:var(--evr-ctrl-gap);display:inline-flex}.evr-settings-button{justify-content:center;align-items:center;gap:var(--evr-ctrl-gap);height:var(--evr-ctrl-h);margin:var(--evr-ctrl-margin);padding:0 var(--evr-ctrl-padding);font:inherit;white-space:nowrap;border:var(--evr-border-width) solid var(--evr-border);border-radius:var(--evr-radius-sm);background:var(--evr-bg-btn);color:var(--evr-text);cursor:pointer;transition:var(--evr-transition-base);display:inline-flex}.evr-settings-button:hover{background:var(--evr-bg-hover)}html[data-evr-scroll-locked] body{overflow:hidden!important}.evr-popup-overlay{z-index:var(--evr-z-overlay);background:var(--evr-overlay);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.evr-popup{width:min(var(--evr-popup-width), 90vw);background:var(--evr-bg);border:var(--evr-border-width) solid var(--evr-border);max-height:86vh;box-shadow:var(--evr-shadow);border-radius:.5rem;flex-direction:column;display:flex;overflow:hidden}.evr-popup:focus{outline:none}.evr-settings__header{justify-content:space-between;align-items:center;gap:var(--evr-ctrl-gap);padding:var(--evr-ctrl-gap) var(--evr-ctrl-gap) var(--evr-ctrl-gap) var(--evr-popup-padding);flex-shrink:0;display:flex}.evr-settings__title{font-size:var(--evr-fs-lg);margin:0;font-weight:700}.evr-settings__close-btn{width:var(--evr-ctrl-h);height:var(--evr-ctrl-h);border-radius:var(--evr-radius-sm);color:var(--evr-text);cursor:pointer;transition:var(--evr-transition-base);background:0 0;border:none;justify-content:center;align-items:center;margin:0;padding:0;display:inline-flex}.evr-settings__close-btn:hover{background:var(--evr-bg-btn-hover)}.evr-settings__panel{overscroll-behavior:contain;flex:1;min-width:0;overflow-y:auto}.evr-settings__panel-inner{padding:0 var(--evr-popup-padding) var(--evr-popup-padding);flex-direction:column;display:flex}.evr-settings__section{flex-direction:column;gap:6px;padding:14px 0;display:flex}.evr-settings__section:first-child{padding-top:0}.evr-settings__section:last-child{padding-bottom:0}.evr-settings__section+.evr-settings__section{border-top:var(--evr-border-width) solid var(--evr-border)}.evr-settings__subtitle{align-items:center;gap:6px;margin:0;font-size:14px;font-weight:700;display:flex}.evr-settings__subtitle>svg{color:var(--evr-text-hint);flex-shrink:0}.evr-scope select.evr-settings__select{min-height:0;height:var(--evr-ctrl-h);padding:0 var(--evr-ctrl-padding);border:var(--evr-border-width) solid var(--evr-border);border-radius:var(--evr-radius-sm);background:var(--evr-bg-btn);color:var(--evr-text);font:inherit;cursor:pointer;align-self:flex-start;margin:0}.evr-scope select.evr-settings__select:focus-visible{outline:2px solid var(--evr-text);outline-offset:2px}.evr-settings__row{min-height:var(--evr-ctrl-h);cursor:pointer;align-items:center;gap:8px;display:flex}.evr-settings__label{-webkit-user-select:none;user-select:none}.evr-switch{flex-shrink:0;width:34px;height:18px;display:inline-flex;position:relative}.evr-scope input.evr-switch__input{opacity:0;cursor:pointer;width:100%;height:100%;margin:0;position:absolute;inset:0}.evr-switch__track{border:var(--evr-border-width) solid var(--evr-border);background:var(--evr-bg-btn);transition:var(--evr-transition-base);pointer-events:none;border-radius:999px;flex:1}.evr-switch__knob{background:var(--evr-text-hint);border-radius:50%;width:10px;height:10px;transition:left .15s,background .15s;position:absolute;top:50%;left:3px;transform:translateY(-50%)}.evr-switch__input:checked~.evr-switch__track{background:var(--evr-green);border-color:var(--evr-green)}.evr-switch__input:checked~.evr-switch__track .evr-switch__knob{background:var(--evr-text-on-color);left:calc(100% - 13px)}.evr-switch__input:focus-visible~.evr-switch__track{outline:2px solid var(--evr-text);outline-offset:2px}";
var openSettingsEvent = "evr:open-settings";
var styleId = "evr-settings-style";
var hostAttribute = "data-evr-settings";
function installStyles(doc) {
if (doc.getElementById(styleId)) return;
const style = doc.createElement("style");
style.id = styleId;
style.textContent = settings_default;
(doc.head ?? doc.documentElement).append(style);
}
function scopeClass() {
return location.hostname === "exhentai.org" ? "evr-scope evr-scope--dark" : "evr-scope";
}
function isVisible(select) {
return typeof select.checkVisibility === "function" ? select.checkVisibility() : select.offsetParent !== null;
}
var overlay = null;
var overlayApp = null;
var trigger = null;
function closeSettings() {
if (!overlay) return;
overlayApp?.unmount();
overlay.remove();
overlayApp = null;
overlay = null;
const returnTo = trigger;
trigger = null;
if (returnTo?.isConnected) returnTo.focus();
}
function openSettings(source) {
if (overlay) return;
installStyles(document);
trigger = source instanceof HTMLElement ? source : null;
overlay = document.createElement("div");
overlay.className = scopeClass();
overlay.setAttribute("translate", "no");
(document.body ?? document.documentElement).append(overlay);
overlayApp = createApp(SettingsPopup_default, { onClose: closeSettings });
overlayApp.mount(overlay);
}
function startSettingsHook() {
const onOpen = () => openSettings(document.activeElement);
document.addEventListener(openSettingsEvent, onOpen);
return () => {
document.removeEventListener(openSettingsEvent, onOpen);
closeSettings();
document.getElementById(styleId)?.remove();
};
}
function startSettingsLaunchers() {
const launchers = new Map();
const resizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
const select = entry.target;
const launcher = launchers.get(select);
if (launcher) syncSize(select, launcher.host);
}
});
function syncSize(select, host) {
const height = select.getBoundingClientRect().height;
const value = `${height}px`;
if (height > 0 && host.style.getPropertyValue("--evr-ctrl-h") !== value) host.style.setProperty("--evr-ctrl-h", value);
const style = getComputedStyle(select);
if (host.style.verticalAlign !== style.verticalAlign) host.style.verticalAlign = style.verticalAlign;
if (host.style.font !== style.font) host.style.font = style.font;
}
function release(select) {
const launcher = launchers.get(select);
if (!launcher) return;
launchers.delete(select);
resizeObserver.unobserve(select);
launcher.app.unmount();
launcher.host.remove();
}
function sync() {
const visible = findModeSelects(document).filter(isVisible);
const wanted = new Set(visible);
for (const select of [...launchers.keys()]) if (!wanted.has(select) || !select.isConnected) release(select);
for (const select of visible) {
const launcher = launchers.get(select);
if (launcher) {
if (select.nextElementSibling !== launcher.host) select.after(launcher.host);
syncSize(select, launcher.host);
continue;
}
installStyles(document);
const host = document.createElement("span");
host.className = `${scopeClass()} evr-settings-host`;
host.setAttribute(hostAttribute, "");
host.setAttribute("translate", "no");
const app = createApp(SettingsButton_default, { onOpen: () => openSettings(host.querySelector("button")) });
select.after(host);
app.mount(host);
launchers.set(select, {
host,
app
});
syncSize(select, host);
resizeObserver.observe(select, { box: "border-box" });
}
const live = new Set([...launchers.values()].map((launcher) => launcher.host));
for (const stale of document.querySelectorAll(`[${hostAttribute}]`)) if (!live.has(stale)) stale.remove();
}
const stopObserving = observeModeSelects(document, sync);
sync();
return () => {
stopObserving();
resizeObserver.disconnect();
for (const select of [...launchers.keys()]) release(select);
};
}
function startSettingsMenu() {
let id;
const stopWatching = watch(locale, () => {
if (id !== void 0) _GM_unregisterMenuCommand(id);
id = _GM_registerMenuCommand(t("settings.button"), () => document.dispatchEvent(new Event(openSettingsEvent)));
}, { immediate: true });
return () => {
stopWatching();
if (id !== void 0) _GM_unregisterMenuCommand(id);
id = void 0;
};
}
announcePresence(document, "0.1.1");
setLocale(resolveLocale(getLocaleChoice(), navigator.languages));
var stopObservingLocale = subscribeLocaleChoice((next) => setLocale(resolveLocale(next, navigator.languages)));
var stopSettingsHook = startSettingsHook();
var stopSettingsMenu = startSettingsMenu();
var origin = {
href: location.href,
scrollRestoration: history.scrollRestoration
};
var stopPagination;
var stopWindow;
var stopLiveUrl;
var stopSettingsLaunchers;
var stopObservingPagination;
var stopObservingTags = [];
var startup = startEarlyListing((switcher) => {
const presentation = switcher.presentation;
if (presentation) {
const syncPagination = (enabled) => {
stopPagination?.();
stopWindow?.();
stopLiveUrl?.();
stopPagination = enabled ? startPagination(presentation) : void 0;
stopWindow = enabled ? startListingWindow(presentation) : void 0;
stopLiveUrl = enabled ? startLiveUrl(presentation, origin) : void 0;
};
syncPagination(getInfiniteScroll());
stopObservingPagination = subscribeInfiniteScroll(syncPagination);
stopObservingTags = [
subscribeGroupTags,
subscribeUploaderTag,
subscribeAllMyTags,
subscribeAllOtherTags
].map((subscribe) => subscribe(() => presentation.refreshTags()));
}
stopSettingsLaunchers = startSettingsLaunchers();
});
window.addEventListener("pagehide", (event) => {
if (event.persisted) return;
stopObservingLocale();
stopObservingPagination?.();
for (const stop of stopObservingTags) stop();
stopPagination?.();
stopWindow?.();
stopLiveUrl?.();
stopSettingsLaunchers?.();
stopSettingsHook();
stopSettingsMenu();
startup.dispose();
});
})();