// ==UserScript== // @name 图片批量下载器 // @name:zh-CN 图片批量下载器 // @name:zh-TW 圖片批量下載器 // @namespace jasonzk // @version 1.0.0 // @author JasonZK // @description 一个简单好用的图片批量下载工具,帮助你快速下载网页上的图片。 // @description:zh-CN 一个简单好用的图片批量下载工具,帮助你快速下载网页上的图片。 // @description:zh-TW 一個簡單好用的圖片批量下載工具,幫助你快速下載網頁上的圖片。 // @license None // @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIiByeT0iMiI+PC9yZWN0PgogIDxwb2x5bGluZSBwb2ludHM9IjggMTIgMTIgMTYgMTYgMTIiPjwvcG9seWxpbmU+CiAgPGxpbmUgeDE9IjEyIiB5MT0iOCIgeDI9IjEyIiB5Mj0iMTYiPjwvbGluZT4KPC9zdmc+Cg== // @match *://*/* // @require https://cdn.jsdelivr.net/npm/fflate@0.8.2/umd/index.min.js // @connect localhost // @connect localhost:3001 // @connect 127.0.0.1 // @connect 127.0.0.1:3001 // @connect api2.jasonzk.com // @grant GM_addStyle // @grant GM_download // @grant GM_info // @grant GM_openInTab // @grant GM_xmlhttpRequest // @noframes // @downloadURL none // ==/UserScript== (function (fflate) { 'use strict'; var _a; const DEV = false; var is_array = Array.isArray; var index_of = Array.prototype.indexOf; var array_from = Array.from; var define_property = Object.defineProperty; var get_descriptor = Object.getOwnPropertyDescriptor; var get_descriptors = Object.getOwnPropertyDescriptors; var object_prototype = Object.prototype; var array_prototype = Array.prototype; var get_prototype_of = Object.getPrototypeOf; var is_extensible = Object.isExtensible; function is_function(thing) { return typeof thing === 'function'; } const noop = () => {}; function run(fn) { return fn(); } function run_all(arr) { for (var i = 0; i < arr.length; i++) { arr[i](); } } const DERIVED = 1 << 1; const EFFECT = 1 << 2; const RENDER_EFFECT = 1 << 3; const BLOCK_EFFECT = 1 << 4; const BRANCH_EFFECT = 1 << 5; const ROOT_EFFECT = 1 << 6; const BOUNDARY_EFFECT = 1 << 7; const UNOWNED = 1 << 8; const DISCONNECTED = 1 << 9; const CLEAN = 1 << 10; const DIRTY = 1 << 11; const MAYBE_DIRTY = 1 << 12; const INERT = 1 << 13; const DESTROYED = 1 << 14; const EFFECT_RAN = 1 << 15; const EFFECT_TRANSPARENT = 1 << 16; const LEGACY_DERIVED_PROP = 1 << 17; const HEAD_EFFECT = 1 << 19; const EFFECT_HAS_DERIVED = 1 << 20; const EFFECT_IS_UPDATING = 1 << 21; const STATE_SYMBOL = Symbol('$state'); const LOADING_ATTR_SYMBOL = Symbol(''); function equals(value) { return value === this.v; } function safe_not_equal(a, b) { return a != a ? b == b : a !== b || (a !== null && typeof a === 'object') || typeof a === 'function'; } function safe_equals(value) { return !safe_not_equal(value, this.v); } function effect_in_teardown(rune) { { throw new Error(`https://svelte.dev/e/effect_in_teardown`); } } function effect_in_unowned_derived() { { throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); } } function effect_orphan(rune) { { throw new Error(`https://svelte.dev/e/effect_orphan`); } } function effect_update_depth_exceeded() { { throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); } } function state_descriptors_fixed() { { throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); } } function state_prototype_fixed() { { throw new Error(`https://svelte.dev/e/state_prototype_fixed`); } } function state_unsafe_mutation() { { throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); } } let legacy_mode_flag = false; let tracing_mode_flag = false; function enable_legacy_mode_flag() { legacy_mode_flag = true; } const EACH_ITEM_REACTIVE = 1; const EACH_INDEX_REACTIVE = 1 << 1; const EACH_ITEM_IMMUTABLE = 1 << 4; const TRANSITION_GLOBAL = 1 << 2; const TEMPLATE_FRAGMENT = 1; const TEMPLATE_USE_IMPORT_NODE = 1 << 1; const UNINITIALIZED = Symbol(); const NAMESPACE_HTML = 'http://www.w3.org/1999/xhtml'; function lifecycle_outside_component(name) { { throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); } } let component_context = null; function set_component_context(context) { component_context = context; } function push(props, runes = false, fn) { var ctx = (component_context = { p: component_context, c: null, d: false, e: null, m: false, s: props, x: null, l: null, }); if (legacy_mode_flag && !runes) { component_context.l = { s: null, u: null, r1: [], r2: source(false), }; } teardown(() => { ctx.d = true; }); } function pop(component) { const context_stack_item = component_context; if (context_stack_item !== null) { const component_effects = context_stack_item.e; if (component_effects !== null) { var previous_effect = active_effect; var previous_reaction = active_reaction; context_stack_item.e = null; try { for (var i = 0; i < component_effects.length; i++) { var component_effect = component_effects[i]; set_active_effect(component_effect.effect); set_active_reaction(component_effect.reaction); effect(component_effect.fn); } } finally { set_active_effect(previous_effect); set_active_reaction(previous_reaction); } } component_context = context_stack_item.p; context_stack_item.m = true; } return ( /** @type {T} */ {} ); } function is_runes() { return ( !legacy_mode_flag || (component_context !== null && component_context.l === null) ); } function proxy(value) { if (typeof value !== 'object' || value === null || STATE_SYMBOL in value) { return value; } const prototype = get_prototype_of(value); if (prototype !== object_prototype && prototype !== array_prototype) { return value; } var sources = /* @__PURE__ */ new Map(); var is_proxied_array = is_array(value); var version = /* @__PURE__ */ state(0); var reaction = active_reaction; var with_parent = (fn) => { var previous_reaction = active_reaction; set_active_reaction(reaction); var result = fn(); set_active_reaction(previous_reaction); return result; }; if (is_proxied_array) { sources.set( 'length', /* @__PURE__ */ state( /** @type {any[]} */ value.length, ), ); } return new Proxy( /** @type {any} */ value, { defineProperty(_, prop, descriptor) { if ( !('value' in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false ) { state_descriptors_fixed(); } var s = sources.get(prop); if (s === void 0) { s = with_parent(() => /* @__PURE__ */ state(descriptor.value)); sources.set(prop, s); } else { set( s, with_parent(() => proxy(descriptor.value)), ); } return true; }, deleteProperty(target, prop) { var s = sources.get(prop); if (s === void 0) { if (prop in target) { sources.set( prop, with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)), ); } } else { if (is_proxied_array && typeof prop === 'string') { var ls = /** @type {Source} */ sources.get('length'); var n = Number(prop); if (Number.isInteger(n) && n < ls.v) { set(ls, n); } } set(s, UNINITIALIZED); update_version(version); } return true; }, get(target, prop, receiver) { var _a2; if (prop === STATE_SYMBOL) { return value; } var s = sources.get(prop); var exists = prop in target; if ( s === void 0 && (!exists || ((_a2 = get_descriptor(target, prop)) == null ? void 0 : _a2.writable)) ) { s = with_parent(() => /* @__PURE__ */ state( proxy(exists ? target[prop] : UNINITIALIZED), ), ); sources.set(prop, s); } if (s !== void 0) { var v = get(s); return v === UNINITIALIZED ? void 0 : v; } return Reflect.get(target, prop, receiver); }, getOwnPropertyDescriptor(target, prop) { var descriptor = Reflect.getOwnPropertyDescriptor(target, prop); if (descriptor && 'value' in descriptor) { var s = sources.get(prop); if (s) descriptor.value = get(s); } else if (descriptor === void 0) { var source2 = sources.get(prop); var value2 = source2 == null ? void 0 : source2.v; if (source2 !== void 0 && value2 !== UNINITIALIZED) { return { enumerable: true, configurable: true, value: value2, writable: true, }; } } return descriptor; }, has(target, prop) { var _a2; if (prop === STATE_SYMBOL) { return true; } var s = sources.get(prop); var has = (s !== void 0 && s.v !== UNINITIALIZED) || Reflect.has(target, prop); if ( s !== void 0 || (active_effect !== null && (!has || ((_a2 = get_descriptor(target, prop)) == null ? void 0 : _a2.writable))) ) { if (s === void 0) { s = with_parent(() => /* @__PURE__ */ state( has ? proxy(target[prop]) : UNINITIALIZED, ), ); sources.set(prop, s); } var value2 = get(s); if (value2 === UNINITIALIZED) { return false; } } return has; }, set(target, prop, value2, receiver) { var _a2; var s = sources.get(prop); var has = prop in target; if (is_proxied_array && prop === 'length') { for ( var i = value2; i < /** @type {Source} */ s.v; i += 1 ) { var other_s = sources.get(i + ''); if (other_s !== void 0) { set(other_s, UNINITIALIZED); } else if (i in target) { other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED), ); sources.set(i + '', other_s); } } } if (s === void 0) { if ( !has || ((_a2 = get_descriptor(target, prop)) == null ? void 0 : _a2.writable) ) { s = with_parent(() => /* @__PURE__ */ state(void 0)); set( s, with_parent(() => proxy(value2)), ); sources.set(prop, s); } } else { has = s.v !== UNINITIALIZED; set( s, with_parent(() => proxy(value2)), ); } var descriptor = Reflect.getOwnPropertyDescriptor(target, prop); if (descriptor == null ? void 0 : descriptor.set) { descriptor.set.call(receiver, value2); } if (!has) { if (is_proxied_array && typeof prop === 'string') { var ls = /** @type {Source} */ sources.get('length'); var n = Number(prop); if (Number.isInteger(n) && n >= ls.v) { set(ls, n + 1); } } update_version(version); } return true; }, ownKeys(target) { get(version); var own_keys = Reflect.ownKeys(target).filter((key2) => { var source3 = sources.get(key2); return source3 === void 0 || source3.v !== UNINITIALIZED; }); for (var [key, source2] of sources) { if (source2.v !== UNINITIALIZED && !(key in target)) { own_keys.push(key); } } return own_keys; }, setPrototypeOf() { state_prototype_fixed(); }, }, ); } function update_version(signal, d = 1) { set(signal, signal.v + d); } // @__NO_SIDE_EFFECTS__ function derived(fn) { var flags = DERIVED | DIRTY; var parent_derived = active_reaction !== null && (active_reaction.f & DERIVED) !== 0 ? /** @type {Derived} */ active_reaction : null; if ( active_effect === null || (parent_derived !== null && (parent_derived.f & UNOWNED) !== 0) ) { flags |= UNOWNED; } else { active_effect.f |= EFFECT_HAS_DERIVED; } const signal = { ctx: component_context, deps: null, effects: null, equals, f: flags, fn, reactions: null, rv: 0, v: /** @type {V} */ null, wv: 0, parent: parent_derived ?? active_effect, }; return signal; } // @__NO_SIDE_EFFECTS__ function derived_safe_equal(fn) { const signal = /* @__PURE__ */ derived(fn); signal.equals = safe_equals; return signal; } function destroy_derived_effects(derived2) { var effects = derived2.effects; if (effects !== null) { derived2.effects = null; for (var i = 0; i < effects.length; i += 1) { destroy_effect( /** @type {Effect} */ effects[i], ); } } } function get_derived_parent_effect(derived2) { var parent = derived2.parent; while (parent !== null) { if ((parent.f & DERIVED) === 0) { return ( /** @type {Effect} */ parent ); } parent = parent.parent; } return null; } function execute_derived(derived2) { var value; var prev_active_effect = active_effect; set_active_effect(get_derived_parent_effect(derived2)); { try { destroy_derived_effects(derived2); value = update_reaction(derived2); } finally { set_active_effect(prev_active_effect); } } return value; } function update_derived(derived2) { var value = execute_derived(derived2); var status = (skip_reaction || (derived2.f & UNOWNED) !== 0) && derived2.deps !== null ? MAYBE_DIRTY : CLEAN; set_signal_status(derived2, status); if (!derived2.equals(value)) { derived2.v = value; derived2.wv = increment_write_version(); } } const old_values = /* @__PURE__ */ new Map(); function source(v, stack) { var signal = { f: 0, // TODO ideally we could skip this altogether, but it causes type errors v, reactions: null, equals, rv: 0, wv: 0, }; return signal; } // @__NO_SIDE_EFFECTS__ function state(v, stack) { const s = source(v); push_reaction_value(s); return s; } // @__NO_SIDE_EFFECTS__ function mutable_source(initial_value, immutable = false) { var _a2; const s = source(initial_value); if (!immutable) { s.equals = safe_equals; } if ( legacy_mode_flag && component_context !== null && component_context.l !== null ) { ((_a2 = component_context.l).s ?? (_a2.s = [])).push(s); } return s; } function mutate(source2, value) { set( source2, untrack(() => get(source2)), ); return value; } function set(source2, value, should_proxy = false) { if ( active_reaction !== null && !untracking && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT)) !== 0 && !(reaction_sources == null ? void 0 : reaction_sources.includes(source2)) ) { state_unsafe_mutation(); } let new_value = should_proxy ? proxy(value) : value; return internal_set(source2, new_value); } function internal_set(source2, value) { if (!source2.equals(value)) { var old_value = source2.v; if (is_destroying_effect) { old_values.set(source2, value); } else { old_values.set(source2, old_value); } source2.v = value; source2.wv = increment_write_version(); if ((source2.f & DERIVED) !== 0) { if ((source2.f & DIRTY) !== 0) { execute_derived( /** @type {Derived} */ source2, ); } set_signal_status( source2, (source2.f & UNOWNED) === 0 ? CLEAN : MAYBE_DIRTY, ); } mark_reactions(source2, DIRTY); if ( is_runes() && active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ) { if (untracked_writes === null) { set_untracked_writes([source2]); } else { untracked_writes.push(source2); } } } return value; } function mark_reactions(signal, status) { var reactions = signal.reactions; if (reactions === null) return; var runes = is_runes(); var length = reactions.length; for (var i = 0; i < length; i++) { var reaction = reactions[i]; var flags = reaction.f; if ((flags & DIRTY) !== 0) continue; if (!runes && reaction === active_effect) continue; set_signal_status(reaction, status); if ((flags & (CLEAN | UNOWNED)) !== 0) { if ((flags & DERIVED) !== 0) { mark_reactions( /** @type {Derived} */ reaction, MAYBE_DIRTY, ); } else { schedule_effect( /** @type {Effect} */ reaction, ); } } } } let hydrating = false; var $window; var is_firefox; var first_child_getter; var next_sibling_getter; function init_operations() { if ($window !== void 0) { return; } $window = window; is_firefox = /Firefox/.test(navigator.userAgent); var element_prototype = Element.prototype; var node_prototype = Node.prototype; var text_prototype = Text.prototype; first_child_getter = get_descriptor(node_prototype, 'firstChild').get; next_sibling_getter = get_descriptor(node_prototype, 'nextSibling').get; if (is_extensible(element_prototype)) { element_prototype.__click = void 0; element_prototype.__className = void 0; element_prototype.__attributes = null; element_prototype.__style = void 0; element_prototype.__e = void 0; } if (is_extensible(text_prototype)) { text_prototype.__t = void 0; } } function create_text(value = '') { return document.createTextNode(value); } // @__NO_SIDE_EFFECTS__ function get_first_child(node) { return first_child_getter.call(node); } // @__NO_SIDE_EFFECTS__ function get_next_sibling(node) { return next_sibling_getter.call(node); } function child(node, is_text) { { return /* @__PURE__ */ get_first_child(node); } } function first_child(fragment, is_text) { { var first = /** @type {DocumentFragment} */ /* @__PURE__ */ get_first_child( /** @type {Node} */ fragment, ); if (first instanceof Comment && first.data === '') return /* @__PURE__ */ get_next_sibling(first); return first; } } function sibling(node, count = 1, is_text = false) { let next_sibling = node; while (count--) { next_sibling = /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(next_sibling); } { return next_sibling; } } function clear_text_content(node) { node.textContent = ''; } function validate_effect(rune) { if (active_effect === null && active_reaction === null) { effect_orphan(); } if ( active_reaction !== null && (active_reaction.f & UNOWNED) !== 0 && active_effect === null ) { effect_in_unowned_derived(); } if (is_destroying_effect) { effect_in_teardown(); } } function push_effect(effect2, parent_effect) { var parent_last = parent_effect.last; if (parent_last === null) { parent_effect.last = parent_effect.first = effect2; } else { parent_last.next = effect2; effect2.prev = parent_last; parent_effect.last = effect2; } } function create_effect(type, fn, sync, push2 = true) { var parent = active_effect; var effect2 = { ctx: component_context, deps: null, nodes_start: null, nodes_end: null, f: type | DIRTY, first: null, fn, last: null, next: null, parent, prev: null, teardown: null, transitions: null, wv: 0, }; if (sync) { try { update_effect(effect2); effect2.f |= EFFECT_RAN; } catch (e) { destroy_effect(effect2); throw e; } } else if (fn !== null) { schedule_effect(effect2); } var inert = sync && effect2.deps === null && effect2.first === null && effect2.nodes_start === null && effect2.teardown === null && (effect2.f & (EFFECT_HAS_DERIVED | BOUNDARY_EFFECT)) === 0; if (!inert && push2) { if (parent !== null) { push_effect(effect2, parent); } if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0) { var derived2 = /** @type {Derived} */ active_reaction; (derived2.effects ?? (derived2.effects = [])).push(effect2); } } return effect2; } function teardown(fn) { const effect2 = create_effect(RENDER_EFFECT, null, false); set_signal_status(effect2, CLEAN); effect2.teardown = fn; return effect2; } function user_effect(fn) { validate_effect(); var defer = active_effect !== null && (active_effect.f & BRANCH_EFFECT) !== 0 && component_context !== null && !component_context.m; if (defer) { var context = /** @type {ComponentContext} */ component_context; (context.e ?? (context.e = [])).push({ fn, effect: active_effect, reaction: active_reaction, }); } else { var signal = effect(fn); return signal; } } function user_pre_effect(fn) { validate_effect(); return render_effect(fn); } function component_root(fn) { const effect2 = create_effect(ROOT_EFFECT, fn, true); return (options = {}) => { return new Promise((fulfil) => { if (options.outro) { pause_effect(effect2, () => { destroy_effect(effect2); fulfil(void 0); }); } else { destroy_effect(effect2); fulfil(void 0); } }); }; } function effect(fn) { return create_effect(EFFECT, fn, false); } function legacy_pre_effect(deps, fn) { var context = /** @type {ComponentContextLegacy} */ component_context; var token = { effect: null, ran: false }; context.l.r1.push(token); token.effect = render_effect(() => { deps(); if (token.ran) return; token.ran = true; set(context.l.r2, true); untrack(fn); }); } function legacy_pre_effect_reset() { var context = /** @type {ComponentContextLegacy} */ component_context; render_effect(() => { if (!get(context.l.r2)) return; for (var token of context.l.r1) { var effect2 = token.effect; if ((effect2.f & CLEAN) !== 0) { set_signal_status(effect2, MAYBE_DIRTY); } if (check_dirtiness(effect2)) { update_effect(effect2); } token.ran = false; } context.l.r2.v = false; }); } function render_effect(fn) { return create_effect(RENDER_EFFECT, fn, true); } function template_effect(fn, thunks = [], d = derived) { const deriveds = thunks.map(d); const effect2 = () => fn(...deriveds.map(get)); return block(effect2); } function block(fn, flags = 0) { return create_effect(RENDER_EFFECT | BLOCK_EFFECT | flags, fn, true); } function branch(fn, push2 = true) { return create_effect(RENDER_EFFECT | BRANCH_EFFECT, fn, true, push2); } function execute_effect_teardown(effect2) { var teardown2 = effect2.teardown; if (teardown2 !== null) { const previously_destroying_effect = is_destroying_effect; const previous_reaction = active_reaction; set_is_destroying_effect(true); set_active_reaction(null); try { teardown2.call(null); } finally { set_is_destroying_effect(previously_destroying_effect); set_active_reaction(previous_reaction); } } } function destroy_effect_children(signal, remove_dom = false) { var effect2 = signal.first; signal.first = signal.last = null; while (effect2 !== null) { var next = effect2.next; if ((effect2.f & ROOT_EFFECT) !== 0) { effect2.parent = null; } else { destroy_effect(effect2, remove_dom); } effect2 = next; } } function destroy_block_effect_children(signal) { var effect2 = signal.first; while (effect2 !== null) { var next = effect2.next; if ((effect2.f & BRANCH_EFFECT) === 0) { destroy_effect(effect2); } effect2 = next; } } function destroy_effect(effect2, remove_dom = true) { var removed = false; if ( (remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes_start !== null ) { var node = effect2.nodes_start; var end = effect2.nodes_end; while (node !== null) { var next = node === end ? null : /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(node); node.remove(); node = next; } removed = true; } destroy_effect_children(effect2, remove_dom && !removed); remove_reactions(effect2, 0); set_signal_status(effect2, DESTROYED); var transitions = effect2.transitions; if (transitions !== null) { for (const transition2 of transitions) { transition2.stop(); } } execute_effect_teardown(effect2); var parent = effect2.parent; if (parent !== null && parent.first !== null) { unlink_effect(effect2); } effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes_start = effect2.nodes_end = null; } function unlink_effect(effect2) { var parent = effect2.parent; var prev = effect2.prev; var next = effect2.next; if (prev !== null) prev.next = next; if (next !== null) next.prev = prev; if (parent !== null) { if (parent.first === effect2) parent.first = next; if (parent.last === effect2) parent.last = prev; } } function pause_effect(effect2, callback) { var transitions = []; pause_children(effect2, transitions, true); run_out_transitions(transitions, () => { destroy_effect(effect2); if (callback) callback(); }); } function run_out_transitions(transitions, fn) { var remaining = transitions.length; if (remaining > 0) { var check = () => --remaining || fn(); for (var transition2 of transitions) { transition2.out(check); } } else { fn(); } } function pause_children(effect2, transitions, local) { if ((effect2.f & INERT) !== 0) return; effect2.f ^= INERT; if (effect2.transitions !== null) { for (const transition2 of effect2.transitions) { if (transition2.is_global || local) { transitions.push(transition2); } } } var child2 = effect2.first; while (child2 !== null) { var sibling2 = child2.next; var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; pause_children(child2, transitions, transparent ? local : false); child2 = sibling2; } } function resume_effect(effect2) { resume_children(effect2, true); } function resume_children(effect2, local) { if ((effect2.f & INERT) === 0) return; effect2.f ^= INERT; if ((effect2.f & CLEAN) === 0) { effect2.f ^= CLEAN; } if (check_dirtiness(effect2)) { set_signal_status(effect2, DIRTY); schedule_effect(effect2); } var child2 = effect2.first; while (child2 !== null) { var sibling2 = child2.next; var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; resume_children(child2, transparent ? local : false); child2 = sibling2; } if (effect2.transitions !== null) { for (const transition2 of effect2.transitions) { if (transition2.is_global || local) { transition2.in(); } } } } let micro_tasks = []; function run_micro_tasks() { var tasks = micro_tasks; micro_tasks = []; run_all(tasks); } function queue_micro_task(fn) { if (micro_tasks.length === 0) { queueMicrotask(run_micro_tasks); } micro_tasks.push(fn); } let is_throwing_error = false; let is_flushing = false; let last_scheduled_effect = null; let is_updating_effect = false; let is_destroying_effect = false; function set_is_destroying_effect(value) { is_destroying_effect = value; } let queued_root_effects = []; let active_reaction = null; let untracking = false; function set_active_reaction(reaction) { active_reaction = reaction; } let active_effect = null; function set_active_effect(effect2) { active_effect = effect2; } let reaction_sources = null; function set_reaction_sources(sources) { reaction_sources = sources; } function push_reaction_value(value) { if (active_reaction !== null && active_reaction.f & EFFECT_IS_UPDATING) { if (reaction_sources === null) { set_reaction_sources([value]); } else { reaction_sources.push(value); } } } let new_deps = null; let skipped_deps = 0; let untracked_writes = null; function set_untracked_writes(value) { untracked_writes = value; } let write_version = 1; let read_version = 0; let skip_reaction = false; let captured_signals = null; function increment_write_version() { return ++write_version; } function check_dirtiness(reaction) { var _a2; var flags = reaction.f; if ((flags & DIRTY) !== 0) { return true; } if ((flags & MAYBE_DIRTY) !== 0) { var dependencies = reaction.deps; var is_unowned = (flags & UNOWNED) !== 0; if (dependencies !== null) { var i; var dependency; var is_disconnected = (flags & DISCONNECTED) !== 0; var is_unowned_connected = is_unowned && active_effect !== null && !skip_reaction; var length = dependencies.length; if (is_disconnected || is_unowned_connected) { var derived2 = /** @type {Derived} */ reaction; var parent = derived2.parent; for (i = 0; i < length; i++) { dependency = dependencies[i]; if ( is_disconnected || !((_a2 = dependency == null ? void 0 : dependency.reactions) == null ? void 0 : _a2.includes(derived2)) ) { (dependency.reactions ?? (dependency.reactions = [])).push( derived2, ); } } if (is_disconnected) { derived2.f ^= DISCONNECTED; } if ( is_unowned_connected && parent !== null && (parent.f & UNOWNED) === 0 ) { derived2.f ^= UNOWNED; } } for (i = 0; i < length; i++) { dependency = dependencies[i]; if ( check_dirtiness( /** @type {Derived} */ dependency, ) ) { update_derived( /** @type {Derived} */ dependency, ); } if (dependency.wv > reaction.wv) { return true; } } } if (!is_unowned || (active_effect !== null && !skip_reaction)) { set_signal_status(reaction, CLEAN); } } return false; } function propagate_error(error, effect2) { var current = effect2; while (current !== null) { if ((current.f & BOUNDARY_EFFECT) !== 0) { try { current.fn(error); return; } catch { current.f ^= BOUNDARY_EFFECT; } } current = current.parent; } is_throwing_error = false; throw error; } function should_rethrow_error(effect2) { return ( (effect2.f & DESTROYED) === 0 && (effect2.parent === null || (effect2.parent.f & BOUNDARY_EFFECT) === 0) ); } function handle_error(error, effect2, previous_effect, component_context2) { if (is_throwing_error) { if (previous_effect === null) { is_throwing_error = false; } if (should_rethrow_error(effect2)) { throw error; } return; } if (previous_effect !== null) { is_throwing_error = true; } { propagate_error(error, effect2); return; } } function schedule_possible_effect_self_invalidation( signal, effect2, root2 = true, ) { var reactions = signal.reactions; if (reactions === null) return; for (var i = 0; i < reactions.length; i++) { var reaction = reactions[i]; if (reaction_sources == null ? void 0 : reaction_sources.includes(signal)) continue; if ((reaction.f & DERIVED) !== 0) { schedule_possible_effect_self_invalidation( /** @type {Derived} */ reaction, effect2, false, ); } else if (effect2 === reaction) { if (root2) { set_signal_status(reaction, DIRTY); } else if ((reaction.f & CLEAN) !== 0) { set_signal_status(reaction, MAYBE_DIRTY); } schedule_effect( /** @type {Effect} */ reaction, ); } } } function update_reaction(reaction) { var _a2; var previous_deps = new_deps; var previous_skipped_deps = skipped_deps; var previous_untracked_writes = untracked_writes; var previous_reaction = active_reaction; var previous_skip_reaction = skip_reaction; var previous_reaction_sources = reaction_sources; var previous_component_context = component_context; var previous_untracking = untracking; var flags = reaction.f; new_deps = /** @type {null | Value[]} */ null; skipped_deps = 0; untracked_writes = null; skip_reaction = (flags & UNOWNED) !== 0 && (untracking || !is_updating_effect || active_reaction === null); active_reaction = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; reaction_sources = null; set_component_context(reaction.ctx); untracking = false; read_version++; reaction.f |= EFFECT_IS_UPDATING; try { var result = /** @type {Function} */ (0, reaction.fn)(); var deps = reaction.deps; if (new_deps !== null) { var i; remove_reactions(reaction, skipped_deps); if (deps !== null && skipped_deps > 0) { deps.length = skipped_deps + new_deps.length; for (i = 0; i < new_deps.length; i++) { deps[skipped_deps + i] = new_deps[i]; } } else { reaction.deps = deps = new_deps; } if (!skip_reaction) { for (i = skipped_deps; i < deps.length; i++) { ((_a2 = deps[i]).reactions ?? (_a2.reactions = [])).push(reaction); } } } else if (deps !== null && skipped_deps < deps.length) { remove_reactions(reaction, skipped_deps); deps.length = skipped_deps; } if ( is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0 ) { for (i = 0; i < /** @type {Source[]} */ untracked_writes.length; i++) { schedule_possible_effect_self_invalidation( untracked_writes[i], /** @type {Effect} */ reaction, ); } } if (previous_reaction !== reaction) { read_version++; if (untracked_writes !== null) { if (previous_untracked_writes === null) { previous_untracked_writes = untracked_writes; } else { previous_untracked_writes.push( .../** @type {Source[]} */ untracked_writes, ); } } } return result; } finally { new_deps = previous_deps; skipped_deps = previous_skipped_deps; untracked_writes = previous_untracked_writes; active_reaction = previous_reaction; skip_reaction = previous_skip_reaction; reaction_sources = previous_reaction_sources; set_component_context(previous_component_context); untracking = previous_untracking; reaction.f ^= EFFECT_IS_UPDATING; } } function remove_reaction(signal, dependency) { let reactions = dependency.reactions; if (reactions !== null) { var index = index_of.call(reactions, signal); if (index !== -1) { var new_length = reactions.length - 1; if (new_length === 0) { reactions = dependency.reactions = null; } else { reactions[index] = reactions[new_length]; reactions.pop(); } } } if ( reactions === null && (dependency.f & DERIVED) !== 0 && // Destroying a child effect while updating a parent effect can cause a dependency to appear // to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps` // allows us to skip the expensive work of disconnecting and immediately reconnecting it (new_deps === null || !new_deps.includes(dependency)) ) { set_signal_status(dependency, MAYBE_DIRTY); if ((dependency.f & (UNOWNED | DISCONNECTED)) === 0) { dependency.f ^= DISCONNECTED; } destroy_derived_effects( /** @type {Derived} **/ dependency, ); remove_reactions( /** @type {Derived} **/ dependency, 0, ); } } function remove_reactions(signal, start_index) { var dependencies = signal.deps; if (dependencies === null) return; for (var i = start_index; i < dependencies.length; i++) { remove_reaction(signal, dependencies[i]); } } function update_effect(effect2) { var flags = effect2.f; if ((flags & DESTROYED) !== 0) { return; } set_signal_status(effect2, CLEAN); var previous_effect = active_effect; var previous_component_context = component_context; var was_updating_effect = is_updating_effect; active_effect = effect2; is_updating_effect = true; try { if ((flags & BLOCK_EFFECT) !== 0) { destroy_block_effect_children(effect2); } else { destroy_effect_children(effect2); } execute_effect_teardown(effect2); var teardown2 = update_reaction(effect2); effect2.teardown = typeof teardown2 === 'function' ? teardown2 : null; effect2.wv = write_version; var deps = effect2.deps; var dep; if ( DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && deps !== null ); if (DEV); } catch (error) { handle_error( error, effect2, previous_effect, previous_component_context || effect2.ctx, ); } finally { is_updating_effect = was_updating_effect; active_effect = previous_effect; } } function infinite_loop_guard() { try { effect_update_depth_exceeded(); } catch (error) { if (last_scheduled_effect !== null) { { handle_error(error, last_scheduled_effect, null); } } else { throw error; } } } function flush_queued_root_effects() { var was_updating_effect = is_updating_effect; try { var flush_count = 0; is_updating_effect = true; while (queued_root_effects.length > 0) { if (flush_count++ > 1e3) { infinite_loop_guard(); } var root_effects = queued_root_effects; var length = root_effects.length; queued_root_effects = []; for (var i = 0; i < length; i++) { var collected_effects = process_effects(root_effects[i]); flush_queued_effects(collected_effects); } old_values.clear(); } } finally { is_flushing = false; is_updating_effect = was_updating_effect; last_scheduled_effect = null; } } function flush_queued_effects(effects) { var length = effects.length; if (length === 0) return; for (var i = 0; i < length; i++) { var effect2 = effects[i]; if ((effect2.f & (DESTROYED | INERT)) === 0) { try { if (check_dirtiness(effect2)) { update_effect(effect2); if ( effect2.deps === null && effect2.first === null && effect2.nodes_start === null ) { if (effect2.teardown === null) { unlink_effect(effect2); } else { effect2.fn = null; } } } } catch (error) { handle_error(error, effect2, null, effect2.ctx); } } } } function schedule_effect(signal) { if (!is_flushing) { is_flushing = true; queueMicrotask(flush_queued_root_effects); } var effect2 = (last_scheduled_effect = signal); while (effect2.parent !== null) { effect2 = effect2.parent; var flags = effect2.f; if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { if ((flags & CLEAN) === 0) return; effect2.f ^= CLEAN; } } queued_root_effects.push(effect2); } function process_effects(root2) { var effects = []; var effect2 = root2; while (effect2 !== null) { var flags = effect2.f; var is_branch = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; var is_skippable_branch = is_branch && (flags & CLEAN) !== 0; if (!is_skippable_branch && (flags & INERT) === 0) { if ((flags & EFFECT) !== 0) { effects.push(effect2); } else if (is_branch) { effect2.f ^= CLEAN; } else { var previous_active_reaction = active_reaction; try { active_reaction = effect2; if (check_dirtiness(effect2)) { update_effect(effect2); } } catch (error) { handle_error(error, effect2, null, effect2.ctx); } finally { active_reaction = previous_active_reaction; } } var child2 = effect2.first; if (child2 !== null) { effect2 = child2; continue; } } var parent = effect2.parent; effect2 = effect2.next; while (effect2 === null && parent !== null) { effect2 = parent.next; parent = parent.parent; } } return effects; } function get(signal) { var flags = signal.f; var is_derived = (flags & DERIVED) !== 0; if (captured_signals !== null) { captured_signals.add(signal); } if (active_reaction !== null && !untracking) { if ( !(reaction_sources == null ? void 0 : reaction_sources.includes(signal)) ) { var deps = active_reaction.deps; if (signal.rv < read_version) { signal.rv = read_version; if ( new_deps === null && deps !== null && deps[skipped_deps] === signal ) { skipped_deps++; } else if (new_deps === null) { new_deps = [signal]; } else if (!skip_reaction || !new_deps.includes(signal)) { new_deps.push(signal); } } } } else if ( is_derived && /** @type {Derived} */ signal.deps === null && /** @type {Derived} */ signal.effects === null ) { var derived2 = /** @type {Derived} */ signal; var parent = derived2.parent; if (parent !== null && (parent.f & UNOWNED) === 0) { derived2.f ^= UNOWNED; } } if (is_derived) { derived2 = /** @type {Derived} */ signal; if (check_dirtiness(derived2)) { update_derived(derived2); } } if (is_destroying_effect && old_values.has(signal)) { return old_values.get(signal); } return signal.v; } function capture_signals(fn) { var previous_captured_signals = captured_signals; captured_signals = /* @__PURE__ */ new Set(); var captured = captured_signals; var signal; try { untrack(fn); if (previous_captured_signals !== null) { for (signal of captured_signals) { previous_captured_signals.add(signal); } } } finally { captured_signals = previous_captured_signals; } return captured; } function invalidate_inner_signals(fn) { var captured = capture_signals(() => untrack(fn)); for (var signal of captured) { if ((signal.f & LEGACY_DERIVED_PROP) !== 0) { /** @type {Derived} */ for (const dep of signal.deps || []) { if ((dep.f & DERIVED) === 0) { internal_set(dep, dep.v); } } } else { internal_set(signal, signal.v); } } } function untrack(fn) { var previous_untracking = untracking; try { untracking = true; return fn(); } finally { untracking = previous_untracking; } } const STATUS_MASK = -7169; function set_signal_status(signal, status) { signal.f = (signal.f & STATUS_MASK) | status; } function deep_read_state(value) { if (typeof value !== 'object' || !value || value instanceof EventTarget) { return; } if (STATE_SYMBOL in value) { deep_read(value); } else if (!Array.isArray(value)) { for (let key in value) { const prop = value[key]; if (typeof prop === 'object' && prop && STATE_SYMBOL in prop) { deep_read(prop); } } } } function deep_read(value, visited = /* @__PURE__ */ new Set()) { if ( typeof value === 'object' && value !== null && // We don't want to traverse DOM elements !(value instanceof EventTarget) && !visited.has(value) ) { visited.add(value); if (value instanceof Date) { value.getTime(); } for (let key in value) { try { deep_read(value[key], visited); } catch (e) {} } const proto = get_prototype_of(value); if ( proto !== Object.prototype && proto !== Array.prototype && proto !== Map.prototype && proto !== Set.prototype && proto !== Date.prototype ) { const descriptors = get_descriptors(proto); for (let key in descriptors) { const get2 = descriptors[key].get; if (get2) { try { get2.call(value); } catch (e) {} } } } } } const PASSIVE_EVENTS = ['touchstart', 'touchmove']; function is_passive_event(name) { return PASSIVE_EVENTS.includes(name); } let listening_to_form_reset = false; function add_form_reset_listener() { if (!listening_to_form_reset) { listening_to_form_reset = true; document.addEventListener( 'reset', (evt) => { Promise.resolve().then(() => { var _a2; if (!evt.defaultPrevented) { /**@type {HTMLFormElement} */ for (const e of evt.target.elements) { (_a2 = e.__on_r) == null ? void 0 : _a2.call(e); } } }); }, // In the capture phase to guarantee we get noticed of it (no possiblity of stopPropagation) { capture: true }, ); } } function without_reactive_context(fn) { var previous_reaction = active_reaction; var previous_effect = active_effect; set_active_reaction(null); set_active_effect(null); try { return fn(); } finally { set_active_reaction(previous_reaction); set_active_effect(previous_effect); } } function listen_to_event_and_reset_event( element, event2, handler, on_reset = handler, ) { element.addEventListener(event2, () => without_reactive_context(handler)); const prev = element.__on_r; if (prev) { element.__on_r = () => { prev(); on_reset(true); }; } else { element.__on_r = () => on_reset(true); } add_form_reset_listener(); } const all_registered_events = /* @__PURE__ */ new Set(); const root_event_handles = /* @__PURE__ */ new Set(); function create_event(event_name, dom, handler, options = {}) { function target_handler(event2) { if (!options.capture) { handle_event_propagation.call(dom, event2); } if (!event2.cancelBubble) { return without_reactive_context(() => { return handler == null ? void 0 : handler.call(this, event2); }); } } if ( event_name.startsWith('pointer') || event_name.startsWith('touch') || event_name === 'wheel' ) { queue_micro_task(() => { dom.addEventListener(event_name, target_handler, options); }); } else { dom.addEventListener(event_name, target_handler, options); } return target_handler; } function event(event_name, dom, handler, capture, passive) { var options = { capture, passive }; var target_handler = create_event(event_name, dom, handler, options); if (dom === document.body || dom === window || dom === document) { teardown(() => { dom.removeEventListener(event_name, target_handler, options); }); } } function handle_event_propagation(event2) { var _a2; var handler_element = this; var owner_document = /** @type {Node} */ handler_element.ownerDocument; var event_name = event2.type; var path = ((_a2 = event2.composedPath) == null ? void 0 : _a2.call(event2)) || []; var current_target = /** @type {null | Element} */ path[0] || event2.target; var path_idx = 0; var handled_at = event2.__root; if (handled_at) { var at_idx = path.indexOf(handled_at); if ( at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ window) ) { event2.__root = handler_element; return; } var handler_idx = path.indexOf(handler_element); if (handler_idx === -1) { return; } if (at_idx <= handler_idx) { path_idx = at_idx; } } current_target = /** @type {Element} */ path[path_idx] || event2.target; if (current_target === handler_element) return; define_property(event2, 'currentTarget', { configurable: true, get() { return current_target || owner_document; }, }); var previous_reaction = active_reaction; var previous_effect = active_effect; set_active_reaction(null); set_active_effect(null); try { var throw_error; var other_errors = []; while (current_target !== null) { var parent_element = current_target.assignedSlot || current_target.parentNode || /** @type {any} */ current_target.host || null; try { var delegated = current_target['__' + event_name]; if ( delegated != null && (!(/** @type {any} */ current_target.disabled) || // DOM could've been updated already by the time this is reached, so we check this as well // -> the target could not have been disabled because it emits the event in the first place event2.target === current_target) ) { if (is_array(delegated)) { var [fn, ...data] = delegated; fn.apply(current_target, [event2, ...data]); } else { delegated.call(current_target, event2); } } } catch (error) { if (throw_error) { other_errors.push(error); } else { throw_error = error; } } if ( event2.cancelBubble || parent_element === handler_element || parent_element === null ) { break; } current_target = parent_element; } if (throw_error) { for (let error of other_errors) { queueMicrotask(() => { throw error; }); } throw throw_error; } } finally { event2.__root = handler_element; delete event2.currentTarget; set_active_reaction(previous_reaction); set_active_effect(previous_effect); } } function create_fragment_from_html(html) { var elem = document.createElement('template'); elem.innerHTML = html; return elem.content; } function assign_nodes(start, end) { var effect2 = /** @type {Effect} */ active_effect; if (effect2.nodes_start === null) { effect2.nodes_start = start; effect2.nodes_end = end; } } // @__NO_SIDE_EFFECTS__ function template(content, flags) { var is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0; var use_import_node = (flags & TEMPLATE_USE_IMPORT_NODE) !== 0; var node; var has_start = !content.startsWith(''); return () => { if (node === void 0) { node = create_fragment_from_html(has_start ? content : '' + content); if (!is_fragment) node = /** @type {Node} */ /* @__PURE__ */ get_first_child(node); } var clone = /** @type {TemplateNode} */ use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true); if (is_fragment) { var start = /** @type {TemplateNode} */ /* @__PURE__ */ get_first_child(clone); var end = /** @type {TemplateNode} */ clone.lastChild; assign_nodes(start, end); } else { assign_nodes(clone, clone); } return clone; }; } function comment() { var frag = document.createDocumentFragment(); var start = document.createComment(''); var anchor = create_text(); frag.append(start, anchor); assign_nodes(start, anchor); return frag; } function append(anchor, dom) { if (anchor === null) { return; } anchor.before( /** @type {Node} */ dom, ); } let should_intro = true; function set_text(text, value) { var str = value == null ? '' : typeof value === 'object' ? value + '' : value; if (str !== (text.__t ?? (text.__t = text.nodeValue))) { text.__t = str; text.nodeValue = str + ''; } } function mount(component, options) { return _mount(component, options); } const document_listeners = /* @__PURE__ */ new Map(); function _mount( Component, { target, anchor, props = {}, events, context, intro = true }, ) { init_operations(); var registered_events = /* @__PURE__ */ new Set(); var event_handle = (events2) => { for (var i = 0; i < events2.length; i++) { var event_name = events2[i]; if (registered_events.has(event_name)) continue; registered_events.add(event_name); var passive = is_passive_event(event_name); target.addEventListener(event_name, handle_event_propagation, { passive, }); var n = document_listeners.get(event_name); if (n === void 0) { document.addEventListener(event_name, handle_event_propagation, { passive, }); document_listeners.set(event_name, 1); } else { document_listeners.set(event_name, n + 1); } } }; event_handle(array_from(all_registered_events)); root_event_handles.add(event_handle); var component = void 0; var unmount = component_root(() => { var anchor_node = anchor ?? target.appendChild(create_text()); branch(() => { if (context) { push({}); var ctx = /** @type {ComponentContext} */ component_context; ctx.c = context; } if (events) { props.$$events = events; } should_intro = intro; component = Component(anchor_node, props) || {}; should_intro = true; if (context) { pop(); } }); return () => { var _a2; for (var event_name of registered_events) { target.removeEventListener(event_name, handle_event_propagation); var n = /** @type {number} */ document_listeners.get(event_name); if (--n === 0) { document.removeEventListener(event_name, handle_event_propagation); document_listeners.delete(event_name); } else { document_listeners.set(event_name, n); } } root_event_handles.delete(event_handle); if (anchor_node !== anchor) { (_a2 = anchor_node.parentNode) == null ? void 0 : _a2.removeChild(anchor_node); } }; }); mounted_components.set(component, unmount); return component; } let mounted_components = /* @__PURE__ */ new WeakMap(); function if_block(node, fn, [root_index, hydrate_index] = [0, 0]) { var anchor = node; var consequent_effect = null; var alternate_effect = null; var condition = UNINITIALIZED; var flags = root_index > 0 ? EFFECT_TRANSPARENT : 0; var has_branch = false; const set_branch = (fn2, flag = true) => { has_branch = true; update_branch(flag, fn2); }; const update_branch = (new_condition, fn2) => { if (condition === (condition = new_condition)) return; if (condition) { if (consequent_effect) { resume_effect(consequent_effect); } else if (fn2) { consequent_effect = branch(() => fn2(anchor)); } if (alternate_effect) { pause_effect(alternate_effect, () => { alternate_effect = null; }); } } else { if (alternate_effect) { resume_effect(alternate_effect); } else if (fn2) { alternate_effect = branch(() => fn2(anchor, [root_index + 1, hydrate_index]), ); } if (consequent_effect) { pause_effect(consequent_effect, () => { consequent_effect = null; }); } } }; block(() => { has_branch = false; fn(set_branch); if (!has_branch) { update_branch(null, null); } }, flags); } function pause_effects(state2, items, controlled_anchor, items_map) { var transitions = []; var length = items.length; for (var i = 0; i < length; i++) { pause_children(items[i].e, transitions, true); } var is_controlled = length > 0 && transitions.length === 0 && controlled_anchor !== null; if (is_controlled) { var parent_node = /** @type {Element} */ /** @type {Element} */ controlled_anchor.parentNode; clear_text_content(parent_node); parent_node.append( /** @type {Element} */ controlled_anchor, ); items_map.clear(); link(state2, items[0].prev, items[length - 1].next); } run_out_transitions(transitions, () => { for (var i2 = 0; i2 < length; i2++) { var item = items[i2]; if (!is_controlled) { items_map.delete(item.k); link(state2, item.prev, item.next); } destroy_effect(item.e, !is_controlled); } }); } function each( node, flags, get_collection, get_key, render_fn, fallback_fn = null, ) { var anchor = node; var state2 = { flags, items: /* @__PURE__ */ new Map(), first: null }; var fallback = null; var was_empty = false; var each_array = /* @__PURE__ */ derived_safe_equal(() => { var collection = get_collection(); return is_array(collection) ? collection : collection == null ? [] : array_from(collection); }); block(() => { var array = get(each_array); var length = array.length; if (was_empty && length === 0) { return; } was_empty = length === 0; { reconcile( array, state2, anchor, render_fn, flags, get_key, get_collection, ); } if (fallback_fn !== null) { if (length === 0) { if (fallback) { resume_effect(fallback); } else { fallback = branch(() => fallback_fn(anchor)); } } else if (fallback !== null) { pause_effect(fallback, () => { fallback = null; }); } } get(each_array); }); } function reconcile( array, state2, anchor, render_fn, flags, get_key, get_collection, ) { var length = array.length; var items = state2.items; var first = state2.first; var current = first; var seen; var prev = null; var matched = []; var stashed = []; var value; var key; var item; var i; for (i = 0; i < length; i += 1) { value = array[i]; key = get_key(value, i); item = items.get(key); if (item === void 0) { var child_anchor = current ? /** @type {TemplateNode} */ current.e.nodes_start : anchor; prev = create_item( child_anchor, state2, prev, prev === null ? state2.first : prev.next, value, key, i, render_fn, flags, get_collection, ); items.set(key, prev); matched = []; stashed = []; current = prev.next; continue; } { update_item(item, value, i); } if ((item.e.f & INERT) !== 0) { resume_effect(item.e); } if (item !== current) { if (seen !== void 0 && seen.has(item)) { if (matched.length < stashed.length) { var start = stashed[0]; var j; prev = start.prev; var a = matched[0]; var b = matched[matched.length - 1]; for (j = 0; j < matched.length; j += 1) { move(matched[j], start, anchor); } for (j = 0; j < stashed.length; j += 1) { seen.delete(stashed[j]); } link(state2, a.prev, b.next); link(state2, prev, a); link(state2, b, start); current = start; prev = b; i -= 1; matched = []; stashed = []; } else { seen.delete(item); move(item, current, anchor); link(state2, item.prev, item.next); link(state2, item, prev === null ? state2.first : prev.next); link(state2, prev, item); prev = item; } continue; } matched = []; stashed = []; while (current !== null && current.k !== key) { if ((current.e.f & INERT) === 0) { (seen ?? (seen = /* @__PURE__ */ new Set())).add(current); } stashed.push(current); current = current.next; } if (current === null) { continue; } item = current; } matched.push(item); prev = item; current = item.next; } if (current !== null || seen !== void 0) { var to_destroy = seen === void 0 ? [] : array_from(seen); while (current !== null) { if ((current.e.f & INERT) === 0) { to_destroy.push(current); } current = current.next; } var destroy_length = to_destroy.length; if (destroy_length > 0) { var controlled_anchor = null; pause_effects(state2, to_destroy, controlled_anchor, items); } } active_effect.first = state2.first && state2.first.e; active_effect.last = prev && prev.e; } function update_item(item, value, index, type) { { internal_set(item.v, value); } { internal_set( /** @type {Value} */ item.i, index, ); } } function create_item( anchor, state2, prev, next, value, key, index, render_fn, flags, get_collection, ) { var reactive = (flags & EACH_ITEM_REACTIVE) !== 0; var mutable = (flags & EACH_ITEM_IMMUTABLE) === 0; var v = reactive ? mutable ? /* @__PURE__ */ mutable_source(value) : source(value) : value; var i = (flags & EACH_INDEX_REACTIVE) === 0 ? index : source(index); var item = { i, v, k: key, a: null, // @ts-expect-error e: null, prev, next, }; try { item.e = branch(() => render_fn(anchor, v, i, get_collection), hydrating); item.e.prev = prev && prev.e; item.e.next = next && next.e; if (prev === null) { state2.first = item; } else { prev.next = item; prev.e.next = item.e; } if (next !== null) { next.prev = item; next.e.prev = item.e; } return item; } finally { } } function move(item, next, anchor) { var end = item.next ? /** @type {TemplateNode} */ item.next.e.nodes_start : anchor; var dest = next ? /** @type {TemplateNode} */ next.e.nodes_start : anchor; var node = /** @type {TemplateNode} */ item.e.nodes_start; while (node !== end) { var next_node = /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(node); dest.before(node); node = next_node; } } function link(state2, prev, next) { if (prev === null) { state2.first = next; } else { prev.next = next; prev.e.next = next && next.e; } if (next !== null) { next.prev = prev; next.e.prev = prev && prev.e; } } const whitespace = [...' \n\r\f \v\uFEFF']; function to_class(value, hash, directives) { var classname = value == null ? '' : '' + value; if (directives) { for (var key in directives) { if (directives[key]) { classname = classname ? classname + ' ' + key : key; } else if (classname.length) { var len = key.length; var a = 0; while ((a = classname.indexOf(key, a)) >= 0) { var b = a + len; if ( (a === 0 || whitespace.includes(classname[a - 1])) && (b === classname.length || whitespace.includes(classname[b])) ) { classname = (a === 0 ? '' : classname.substring(0, a)) + classname.substring(b + 1); } else { a = b; } } } } } return classname === '' ? null : classname; } function set_class(dom, is_html, value, hash, prev_classes, next_classes) { var prev = dom.__className; if (prev !== value || prev === void 0) { var next_class_name = to_class(value, hash, next_classes); { if (next_class_name == null) { dom.removeAttribute('class'); } else { dom.className = next_class_name; } } dom.__className = value; } else if (next_classes && prev_classes !== next_classes) { for (var key in next_classes) { var is_present = !!next_classes[key]; if (prev_classes == null || is_present !== !!prev_classes[key]) { dom.classList.toggle(key, is_present); } } } return next_classes; } const IS_CUSTOM_ELEMENT = Symbol('is custom element'); const IS_HTML = Symbol('is html'); function set_attribute(element, attribute, value, skip_warning) { var attributes = get_attributes(element); if (attributes[attribute] === (attributes[attribute] = value)) return; if (attribute === 'loading') { element[LOADING_ATTR_SYMBOL] = value; } if (value == null) { element.removeAttribute(attribute); } else if ( typeof value !== 'string' && get_setters(element).includes(attribute) ) { element[attribute] = value; } else { element.setAttribute(attribute, value); } } function get_attributes(element) { return ( /** @type {Record} **/ // @ts-expect-error element.__attributes ?? (element.__attributes = { [IS_CUSTOM_ELEMENT]: element.nodeName.includes('-'), [IS_HTML]: element.namespaceURI === NAMESPACE_HTML, }) ); } var setters_cache = /* @__PURE__ */ new Map(); function get_setters(element) { var setters = setters_cache.get(element.nodeName); if (setters) return setters; setters_cache.set(element.nodeName, (setters = [])); var descriptors; var proto = element; var element_proto = Element.prototype; while (element_proto !== proto) { descriptors = get_descriptors(proto); for (var key in descriptors) { if (descriptors[key].set) { setters.push(key); } } proto = get_prototype_of(proto); } return setters; } const now = () => performance.now(); const raf = { // don't access requestAnimationFrame eagerly outside method // this allows basic testing of user code without JSDOM // bunder will eval and remove ternary when the user's app is built tick: /** @param {any} _ */ (_) => requestAnimationFrame(_), now: () => now(), tasks: /* @__PURE__ */ new Set(), }; function run_tasks() { const now2 = raf.now(); raf.tasks.forEach((task) => { if (!task.c(now2)) { raf.tasks.delete(task); task.f(); } }); if (raf.tasks.size !== 0) { raf.tick(run_tasks); } } function loop(callback) { let task; if (raf.tasks.size === 0) { raf.tick(run_tasks); } return { promise: new Promise((fulfill) => { raf.tasks.add((task = { c: callback, f: fulfill })); }), abort() { raf.tasks.delete(task); }, }; } function dispatch_event(element, type) { without_reactive_context(() => { element.dispatchEvent(new CustomEvent(type)); }); } function css_property_to_camelcase(style) { if (style === 'float') return 'cssFloat'; if (style === 'offset') return 'cssOffset'; if (style.startsWith('--')) return style; const parts = style.split('-'); if (parts.length === 1) return parts[0]; return ( parts[0] + parts .slice(1) .map( /** @param {any} word */ (word) => word[0].toUpperCase() + word.slice(1), ) .join('') ); } function css_to_keyframe(css) { const keyframe = {}; const parts = css.split(';'); for (const part of parts) { const [property, value] = part.split(':'); if (!property || value === void 0) break; const formatted_property = css_property_to_camelcase(property.trim()); keyframe[formatted_property] = value.trim(); } return keyframe; } const linear$1 = (t) => t; function transition(flags, element, get_fn, get_params) { var is_global = (flags & TRANSITION_GLOBAL) !== 0; var direction = 'both'; var current_options; var inert = element.inert; var overflow = element.style.overflow; var intro; var outro; function get_options() { var previous_reaction = active_reaction; var previous_effect = active_effect; set_active_reaction(null); set_active_effect(null); try { return ( current_options ?? (current_options = get_fn()( element, (get_params == null ? void 0 : get_params()) ?? /** @type {P} */ {}, { direction, }, )) ); } finally { set_active_reaction(previous_reaction); set_active_effect(previous_effect); } } var transition2 = { is_global, in() { element.inert = inert; dispatch_event(element, 'introstart'); intro = animate(element, get_options(), outro, 1, () => { dispatch_event(element, 'introend'); intro == null ? void 0 : intro.abort(); intro = current_options = void 0; element.style.overflow = overflow; }); }, out(fn) { element.inert = true; dispatch_event(element, 'outrostart'); outro = animate(element, get_options(), intro, 0, () => { dispatch_event(element, 'outroend'); fn == null ? void 0 : fn(); }); }, stop: () => { intro == null ? void 0 : intro.abort(); outro == null ? void 0 : outro.abort(); }, }; var e = /** @type {Effect} */ active_effect; (e.transitions ?? (e.transitions = [])).push(transition2); if (should_intro) { var run2 = is_global; if (!run2) { var block2 = /** @type {Effect | null} */ e.parent; while (block2 && (block2.f & EFFECT_TRANSPARENT) !== 0) { while ((block2 = block2.parent)) { if ((block2.f & BLOCK_EFFECT) !== 0) break; } } run2 = !block2 || (block2.f & EFFECT_RAN) !== 0; } if (run2) { effect(() => { untrack(() => transition2.in()); }); } } } function animate(element, options, counterpart, t2, on_finish) { var is_intro = t2 === 1; if (is_function(options)) { var a; var aborted = false; queue_micro_task(() => { if (aborted) return; var o = options({ direction: is_intro ? 'in' : 'out' }); a = animate(element, o, counterpart, t2, on_finish); }); return { abort: () => { aborted = true; a == null ? void 0 : a.abort(); }, deactivate: () => a.deactivate(), reset: () => a.reset(), t: () => a.t(), }; } counterpart == null ? void 0 : counterpart.deactivate(); if (!(options == null ? void 0 : options.duration)) { on_finish(); return { abort: noop, deactivate: noop, reset: noop, t: () => t2, }; } const { delay = 0, css, tick, easing = linear$1 } = options; var keyframes = []; if (is_intro && counterpart === void 0) { if (tick) { tick(0, 1); } if (css) { var styles = css_to_keyframe(css(0, 1)); keyframes.push(styles, styles); } } var get_t = () => 1 - t2; var animation = element.animate(keyframes, { duration: delay }); animation.onfinish = () => { var t1 = (counterpart == null ? void 0 : counterpart.t()) ?? 1 - t2; counterpart == null ? void 0 : counterpart.abort(); var delta = t2 - t1; var duration = /** @type {number} */ options.duration * Math.abs(delta); var keyframes2 = []; if (duration > 0) { var needs_overflow_hidden = false; if (css) { var n = Math.ceil(duration / (1e3 / 60)); for (var i = 0; i <= n; i += 1) { var t = t1 + delta * easing(i / n); var styles2 = css_to_keyframe(css(t, 1 - t)); keyframes2.push(styles2); needs_overflow_hidden || (needs_overflow_hidden = styles2.overflow === 'hidden'); } } if (needs_overflow_hidden) { element.style.overflow = 'hidden'; } get_t = () => { var time = /** @type {number} */ /** @type {globalThis.Animation} */ animation.currentTime; return t1 + delta * easing(time / duration); }; if (tick) { loop(() => { if (animation.playState !== 'running') return false; var t3 = get_t(); tick(t3, 1 - t3); return true; }); } } animation = element.animate(keyframes2, { duration, fill: 'forwards' }); animation.onfinish = () => { get_t = () => t2; tick == null ? void 0 : tick(t2, 1 - t2); on_finish(); }; }; return { abort: () => { if (animation) { animation.cancel(); animation.effect = null; animation.onfinish = noop; } }, deactivate: () => { on_finish = noop; }, reset: () => { if (t2 === 0) { tick == null ? void 0 : tick(1, 0); } }, t: () => get_t(), }; } function bind_checked(input, get2, set2 = get2) { listen_to_event_and_reset_event(input, 'change', (is_reset) => { var value = is_reset ? input.defaultChecked : input.checked; set2(value); }); if ( // If we are hydrating and the value has since changed, // then use the update value from the input instead. // If defaultChecked is set, then checked == defaultChecked untrack(get2) == null ) { set2(input.checked); } render_effect(() => { var value = get2(); input.checked = Boolean(value); }); } function is_bound_this(bound_value, element_or_component) { return ( bound_value === element_or_component || (bound_value == null ? void 0 : bound_value[STATE_SYMBOL]) === element_or_component ); } function bind_this(element_or_component = {}, update, get_value, get_parts) { effect(() => { var old_parts; var parts; render_effect(() => { old_parts = parts; parts = []; untrack(() => { if (element_or_component !== get_value(...parts)) { update(element_or_component, ...parts); if ( old_parts && is_bound_this(get_value(...old_parts), element_or_component) ) { update(null, ...old_parts); } } }); }); return () => { queue_micro_task(() => { if ( parts && is_bound_this(get_value(...parts), element_or_component) ) { update(null, ...parts); } }); }; }); return element_or_component; } function bind_property(property, event_name, element, set2, get2) { var handler = () => { set2(element[property]); }; element.addEventListener(event_name, handler); if (get2) { render_effect(() => { element[property] = get2(); }); } else { handler(); } if ( element === document.body || element === window || element === document ) { teardown(() => { element.removeEventListener(event_name, handler); }); } } function stopPropagation(fn) { return function (...args) { var event2 = /** @type {Event} */ args[0]; event2.stopPropagation(); return fn == null ? void 0 : fn.apply(this, args); }; } function preventDefault(fn) { return function (...args) { var event2 = /** @type {Event} */ args[0]; event2.preventDefault(); return fn == null ? void 0 : fn.apply(this, args); }; } function init(immutable = false) { const context = /** @type {ComponentContextLegacy} */ component_context; const callbacks = context.l.u; if (!callbacks) return; let props = () => deep_read_state(context.s); if (immutable) { let version = 0; let prev = /** @type {Record} */ {}; const d = /* @__PURE__ */ derived(() => { let changed = false; const props2 = context.s; for (const key in props2) { if (props2[key] !== prev[key]) { prev[key] = props2[key]; changed = true; } } if (changed) version++; return version; }); props = () => get(d); } if (callbacks.b.length) { user_pre_effect(() => { observe_all(context, props); run_all(callbacks.b); }); } user_effect(() => { const fns = untrack(() => callbacks.m.map(run)); return () => { for (const fn of fns) { if (typeof fn === 'function') { fn(); } } }; }); if (callbacks.a.length) { user_effect(() => { observe_all(context, props); run_all(callbacks.a); }); } } function observe_all(context, props) { if (context.l.s) { for (const signal of context.l.s) get(signal); } props(); } function bubble_event($$props, event2) { var _a2; var events = /** @type {Record} */ (_a2 = $$props.$$events) == null ? void 0 : _a2[event2.type]; var callbacks = is_array(events) ? events.slice() : events == null ? [] : [events]; for (var fn of callbacks) { fn.call(this, event2); } } function onMount(fn) { if (component_context === null) { lifecycle_outside_component(); } if (legacy_mode_flag && component_context.l !== null) { init_update_callbacks(component_context).m.push(fn); } else { user_effect(() => { const cleanup = untrack(fn); if (typeof cleanup === 'function') return ( /** @type {() => void} */ cleanup ); }); } } function init_update_callbacks(context) { var l = /** @type {ComponentContextLegacy} */ context.l; return l.u ?? (l.u = { a: [], b: [], m: [] }); } const PUBLIC_VERSION = '5'; if (typeof window !== 'undefined') { ( (_a = window.__svelte ?? (window.__svelte = {})).v ?? (_a.v = /* @__PURE__ */ new Set()) ).add(PUBLIC_VERSION); } enable_legacy_mode_flag(); var _GM_addStyle = /* @__PURE__ */ (() => typeof GM_addStyle != 'undefined' ? GM_addStyle : void 0)(); var _GM_openInTab = /* @__PURE__ */ (() => typeof GM_openInTab != 'undefined' ? GM_openInTab : void 0)(); var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != 'undefined' ? GM_xmlhttpRequest : void 0)(); const baseUrl = 'https://api2.jasonzk.com'; const getAds = `${baseUrl}/ads/list`; const touchWeibo = `${baseUrl}/redirect/weibo`; const API = { getAds, touchWeibo, }; async function openNewTab(url, active = true, rel = 'https://www.weibo.com') { if (_GM_openInTab) { _GM_openInTab(url, { active }); } else { const a = document.createElement('a'); a.href = url; a.target = '_blank'; a.rel = rel ?? 'noreferrer'; document.body.appendChild(a); a.click(); document.body.removeChild(a); } } var root_2$1 = /* @__PURE__ */ template(`
`); var root_1$1 = /* @__PURE__ */ template( `
`, ); function TextAd($$anchor, $$props) { push($$props, false); let currentIndex = /* @__PURE__ */ mutable_source(0); let isAnimating = /* @__PURE__ */ mutable_source(true); let container = /* @__PURE__ */ mutable_source(); let show = /* @__PURE__ */ mutable_source(true); let ads = /* @__PURE__ */ mutable_source([]); async function fetchAds() { try { const response = await new Promise((resolve, reject) => { _GM_xmlhttpRequest({ method: 'GET', url: API.getAds, headers: { Accept: 'application/json' }, onload: resolve, onerror: reject, }); }); if (response.status === 200) { const json = JSON.parse(response.responseText); const data = json.data; set(show, data.show); set(ads, data.list); } } catch (error) { console.error('Failed to fetch ads:', error); } } function nextAd() { set(isAnimating, true); set(currentIndex, (get(currentIndex) + 1) % get(ads).length); } function onAnimationEnd() { set(isAnimating, false); setTimeout(() => { if (get(ads).length > 1) { nextAd(); } }, 5e3); } function handleClick() { if (get(ads)[get(currentIndex)]) { _GM_xmlhttpRequest({ method: 'GET', url: `${API.touchWeibo}?url=${encodeURIComponent(get(ads)[get(currentIndex)].link)}`, headers: { Accept: 'application/json' }, }); openNewTab(get(ads)[get(currentIndex)].link); } } onMount(() => { _GM_addStyle(` .img-downloader-ad-container { width: 100%; height: 24px; overflow: hidden; background: #f8f9fa; border-radius: 4px; margin: 8px 0; cursor: pointer; text-align: center; } .img-downloader-roll-text { display: inline-block; color: #666; font-size: 13px; padding: 4px 8px; white-space: nowrap; } .img-downloader-roll-text.animating { animation: imgDownloaderMarquee 8s linear; } .img-downloader-roll-text:hover { color: #0d6efd; text-decoration: underline; } @keyframes imgDownloaderMarquee { 0% { transform: translateX(100%); } 100% { transform: translateX(-100%); } } `); fetchAds(); }); init(); var fragment = comment(); var node = first_child(fragment); { var consequent_1 = ($$anchor2) => { var div = root_1$1(); var node_1 = child(div); { var consequent = ($$anchor3) => { var div_1 = root_2$1(); let classes; var text = child(div_1); template_effect( ($0) => { classes = set_class( div_1, 1, 'img-downloader-roll-text', null, classes, $0, ); set_text(text, get(ads)[get(currentIndex)].text); }, [() => ({ animating: get(isAnimating) })], derived_safe_equal, ); event('animationend', div_1, onAnimationEnd); event('click', div_1, handleClick); append($$anchor3, div_1); }; if_block(node_1, ($$render) => { if (get(ads)[get(currentIndex)]) $$render(consequent); }); } bind_this( div, ($$value) => set(container, $$value), () => get(container), ); append($$anchor2, div); }; if_block(node, ($$render) => { if (get(show) && get(ads).length > 0) $$render(consequent_1); }); } append($$anchor, fragment); pop(); } const linear = (x) => x; function fade(node, { delay = 0, duration = 400, easing = linear } = {}) { const o = +getComputedStyle(node).opacity; return { delay, duration, easing, css: (t) => `opacity: ${t * o}`, }; } var root_1 = /* @__PURE__ */ template( `
Image Preview
`, ); var root_3 = /* @__PURE__ */ template( `
`, ); var root_6 = /* @__PURE__ */ template( `Thumbnail`, ); var root_5 = /* @__PURE__ */ template( ``, ); var root_8 = /* @__PURE__ */ template( `

未找到图片或尚未查找。

`, ); var root_9 = /* @__PURE__ */ template(`

正在查找...

`); var root_2 = /* @__PURE__ */ template( `

图片下载器

`, ); var root_10 = /* @__PURE__ */ template( ``, ); var root = /* @__PURE__ */ template(` `, 1); function App($$anchor, $$props) { push($$props, false); const allSelected = /* @__PURE__ */ mutable_source(); const indeterminate = /* @__PURE__ */ mutable_source(); let images = /* @__PURE__ */ mutable_source([]); let status = /* @__PURE__ */ mutable_source('点击“查找图片”开始'); let loading = /* @__PURE__ */ mutable_source(false); let panelVisible = /* @__PURE__ */ mutable_source(false); let showThumbnails = /* @__PURE__ */ mutable_source(true); let buttonVisible = /* @__PURE__ */ mutable_source(true); let previewVisible = /* @__PURE__ */ mutable_source(false); let previewImageUrl = /* @__PURE__ */ mutable_source(''); let panelElement = /* @__PURE__ */ mutable_source(); let isDragging = /* @__PURE__ */ mutable_source(false); let startX, startY, initialRight, initialBottom; function handleMouseDown(event2) { var _a2; if ( (_a2 = event2.target) == null ? void 0 : _a2.closest('button, input, label, img') ) { return; } set(isDragging, true); startX = event2.clientX; startY = event2.clientY; const rect = get(panelElement).getBoundingClientRect(); initialRight = window.innerWidth - rect.right; initialBottom = window.innerHeight - rect.bottom; document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); } function handleMouseMove(event2) { if (!get(isDragging)) return; const dx = startX - event2.clientX; const dy = startY - event2.clientY; mutate( panelElement, (get(panelElement).style.right = `${initialRight + dx}px`), ); mutate( panelElement, (get(panelElement).style.bottom = `${initialBottom + dy}px`), ); } function handleMouseUp() { if (!get(isDragging)) return; set(isDragging, false); document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); } function findImages() { set(loading, true); set(status, '正在查找页面图片...'); set(images, []); const foundUrls = /* @__PURE__ */ new Set(); document.querySelectorAll('img').forEach((img) => { if (img.src && img.naturalWidth > 50 && img.naturalHeight > 50) { foundUrls.add(img.src); } const dataSrc = img.getAttribute('data-src') || img.getAttribute('data-lazy-src'); if (dataSrc) { foundUrls.add(new URL(dataSrc, window.location.href).href); } }); document.querySelectorAll('*').forEach((el) => { const style = window.getComputedStyle(el); const bgImage = style.backgroundImage; if (bgImage && bgImage !== 'none' && bgImage.startsWith('url("')) { const urlMatch = bgImage.match(/url\("?(.+?)"?\)/); if (urlMatch && urlMatch[1]) { foundUrls.add(new URL(urlMatch[1], window.location.href).href); } } }); set( images, Array.from(foundUrls).map((url, index) => ({ url, selected: true, name: `image_${index + 1}.${getExtension(url)}`, })), ); set(status, `找到 ${get(images).length} 张图片`); set(loading, false); } function getExtension(url) { var _a2; try { const pathname = new URL(url).pathname; const parts = pathname.split('.'); if (parts.length > 1) { let ext = ((_a2 = parts.pop()) == null ? void 0 : _a2.toLowerCase()) || 'jpg'; ext = ext.split('?')[0]; if ( ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg'].includes(ext) ) { return ext; } } } catch (e) {} return 'jpg'; } function openPreview(imageUrl) { set(previewImageUrl, imageUrl); set(previewVisible, true); } async function downloadSelected() { const selectedImages = get(images).filter((img) => img.selected); if (selectedImages.length === 0) { set(status, '请至少选择一张图片'); return; } set(loading, true); set(status, `准备下载 ${selectedImages.length} 张图片...`); let processedCount = 0; const filePromises = selectedImages.map((img, index) => { return new Promise((resolve, reject) => { console.log( `[Image Downloader] 开始请求: ${img.name} (${index + 1}/${selectedImages.length})`, ); fetch(img.url, { method: 'GET', mode: 'cors', // Explicitly set CORS mode, though 'no-cors' might be needed sometimes (with limitations) }) .then(async (response) => { if (response.ok) { try { const blob = await response.blob(); const buffer = await blob.arrayBuffer(); const uint8Array = new Uint8Array(buffer); console.log( `[Image Downloader] 下载成功并转换为 Uint8Array: ${img.name}`, ); processedCount++; set( status, `处理中 ${processedCount}/${selectedImages.length}... (成功: ${img.name})`, ); resolve({ name: img.name, data: uint8Array }); } catch (conversionError) { console.error( `[Image Downloader] Blob 转 Uint8Array 失败: ${img.name}`, conversionError, ); processedCount++; set( status, `处理中 ${processedCount}/${selectedImages.length}... (转换失败: ${img.name})`, ); reject(new Error(`Blob conversion failed for ${img.name}`)); } } else { console.warn( `[Image Downloader] Fetch 失败: ${img.url} (状态: ${response.status} ${response.statusText})`, ); processedCount++; set( status, `处理中 ${processedCount}/${selectedImages.length}... (Fetch 失败 ${response.status}: ${img.name})`, ); reject( new Error( `Fetch failed for ${img.name} with status ${response.status}`, ), ); } }) .catch((err) => { console.error( `[Image Downloader] Fetch 网络错误/CORS: ${img.url}`, err, ); processedCount++; set( status, `处理中 ${processedCount}/${selectedImages.length}... (网络/CORS 错误: ${img.name})`, ); reject( new Error( `Fetch network/CORS error for ${img.name}: ${err.message}`, ), ); }); }); }); set(status, `等待 ${selectedImages.length} 张图片处理完成...`); const results = await Promise.allSettled(filePromises); const successfulFiles = {}; let downloadedCount = 0; results.forEach((result) => { if (result.status === 'fulfilled') { successfulFiles[result.value.name] = result.value.data; downloadedCount++; } else { console.warn('[Image Downloader] 一个文件处理失败:', result.reason); } }); if (downloadedCount === 0) { set(status, '没有图片成功下载或处理。'); set(loading, false); return; } set(status, `已成功处理 ${downloadedCount} 张图片,正在生成 ZIP 文件...`); console.log( '[Image Downloader] 文件处理完成,准备使用 fflate 生成 ZIP...', ); try { fflate.zip(successfulFiles, { level: 1 }, (err, data) => { if (err) { console.error('[Image Downloader] fflate ZIP 生成错误:', err); set(status, `生成 ZIP 文件时出错: ${err.message}`); set(loading, false); return; } console.log('[Image Downloader] fflate ZIP 文件生成完毕.'); const content = new Blob([data], { type: 'application/zip' }); console.log('[Image Downloader] Blob size:', content.size); set(status, 'ZIP 文件生成完毕,准备下载...'); const timestamp = /* @__PURE__ */ new Date() .toISOString() .replace(/[:.]/g, '-'); const filename = `images_${document.title}_${timestamp}.zip`; const objectURL = URL.createObjectURL(content); console.log(`[Image Downloader] 准备使用 标签下载 ${filename}`); try { const a = document.createElement('a'); a.href = objectURL; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); console.log(`[Image Downloader] 标签点击触发: ${filename}`); set(status, `已下载 ${downloadedCount} 张图片到 ${filename}`); set(loading, false); setTimeout(() => URL.revokeObjectURL(objectURL), 100); } catch (downloadError) { console.error( '[Image Downloader] 标签下载错误:', downloadError, ); set( status, `下载 ZIP 文件时出错: ${downloadError instanceof Error ? downloadError.message : '未知错误'}`, ); set(loading, false); URL.revokeObjectURL(objectURL); } }); } catch (outerError) { console.error( '[Image Downloader] 处理文件或调用 zip 时发生意外错误:', outerError, ); set( status, `处理文件时发生错误: ${outerError instanceof Error ? outerError.message : '未知错误'}`, ); set(loading, false); } } function toggleSelectAll(event2) { const target = event2.target; const checked = target.checked; set( images, get(images).map((img) => ({ ...img, selected: checked })), ); } function handleThumbnailError(event2) { const imgElement = event2.target; imgElement.style.display = 'none'; } function handleKeyPress(event2) { if (event2.altKey) { if (event2.key.toLowerCase() === 's') { set(buttonVisible, true); } else if (event2.key.toLowerCase() === 'h') { set(buttonVisible, false); } } } onMount(() => { document.addEventListener('keydown', handleKeyPress); _GM_addStyle(` #image-downloader-panel { position: fixed; bottom: 20px; right: 20px; z-index: 99999; background-color: white; border: 1px solid #e4e7ed; border-radius: 8px; padding: 16px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); width: 380px; max-height: 80vh; display: flex; flex-direction: column; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; color: #2c3e50; cursor: grab; } #image-downloader-panel.dragging { cursor: grabbing; } #image-downloader-panel h3 { margin: 0 0 12px 0; font-size: 16px; border-bottom: 1px solid #ebeef5; padding-bottom: 8px; display: flex; justify-content: space-between; align-items: center; color: #303133; } #image-downloader-panel .panel-controls { display: flex; gap: 8px; margin-bottom: 12px; } #image-downloader-panel .panel-controls button, #image-downloader-panel .primary-button, #image-downloader-panel .download-button { background-color: #409eff; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; font-size: 14px; transition: background-color 0.2s; } #image-downloader-panel .panel-controls button:hover:not(:disabled), #image-downloader-panel .primary-button:hover:not(:disabled), #image-downloader-panel .download-button:hover:not(:disabled) { background-color: #66b1ff; } #image-downloader-panel .panel-controls button:disabled, #image-downloader-panel .primary-button:disabled, #image-downloader-panel .download-button:disabled { background-color: #c0c4cc; cursor: not-allowed; } #image-downloader-panel .image-list { background-color: #fafafa; border: 1px solid #ebeef5; border-radius: 4px; padding: 8px; margin-bottom: 12px; max-height: 400px; overflow-y: auto; } #image-downloader-panel .select-all-container { margin-bottom: 8px; font-size: 14px; color: #606266; } #image-downloader-panel .status-bar { font-size: 13px; color: #909399; margin-top: 8px; min-height: 20px; } #image-downloader-panel .close-button, #image-downloader-panel .toggle-thumbs-button { background: none; border: none; font-size: 16px; cursor: pointer; color: #909399; padding: 4px; margin-left: 8px; transition: color 0.2s; } #image-downloader-panel .close-button:hover, #image-downloader-panel .toggle-thumbs-button:hover { color: #606266; } #image-downloader-panel .image-item { display: flex; align-items: center; margin-bottom: 8px; padding: 5px 0; border-bottom: 1px solid #eee; cursor: pointer; transition: background-color 0.1s ease-in-out; } #image-downloader-panel .image-item:hover { background-color: #f0f0f0; } #image-downloader-panel .image-item:last-child { border-bottom: none; } #image-downloader-panel .image-item input[type='checkbox'] { margin-right: 10px !important; flex-shrink: 0 !important; pointer-events: none !important; display: inline-block !important; opacity: 1 !important; visibility: visible !important; width: auto !important; height: auto !important; appearance: checkbox !important; position: static !important; } #image-downloader-panel .image-item img.thumbnail { width: 40px; height: 40px; object-fit: cover; margin-right: 10px; border: 1px solid #eee; flex-shrink: 0; } #image-downloader-panel .image-item .image-url { word-break: break-all; font-size: 12px; color: #495057; flex-grow: 1; } .image-downloader-toggle-btn { position: fixed; /* Changed from relative to fixed */ bottom: 20px; right: 20px; z-index: 99998; width: 50px; height: 50px; background-color: #409eff; color: white; border: none; border-radius: 50%; cursor: pointer; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); display: flex; align-items: center; justify-content: center; font-size: 24px; line-height: 1; transition: background-color 0.2s; } .image-downloader-toggle-btn:hover { background-color: #66b1ff; } .image-downloader-toggle-btn .close-icon { position: absolute; top: -6px; left: -6px; width: 16px; height: 16px; background-color: rgba(0, 0, 0, 0.6); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 12px; opacity: 0; transition: opacity 0.2s; cursor: pointer; z-index: 100000; } .image-downloader-toggle-btn:hover .close-icon { opacity: 1; } .image-downloader-toggle-btn .close-icon:hover { background-color: rgba(0, 0, 0, 0.8); } /* Preview Modal Styles */ .image-preview-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.7); display: flex; justify-content: center; align-items: center; z-index: 100000; /* Ensure it's above everything */ cursor: pointer; } .image-preview-content { position: relative; max-width: 90vw; max-height: 90vh; background-color: #fff; /* Optional: add background if needed */ padding: 10px; /* Add some padding around the image */ border-radius: 5px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); cursor: default; /* Reset cursor for the content area */ display: flex; /* Use flex to help center potentially smaller images */ justify-content: center; align-items: center; } .image-preview-content img { display: block; max-width: 100%; max-height: 100%; object-fit: contain; /* Scale image while preserving aspect ratio */ } .preview-close-button { position: absolute; top: -15px; /* Position outside the top-right corner */ right: -15px; background-color: rgba(0, 0, 0, 0.7); color: white; border: none; border-radius: 50%; width: 30px; height: 30px; font-size: 16px; line-height: 30px; /* Center the '✖' */ text-align: center; cursor: pointer; z-index: 100001; transition: background-color 0.2s; } .preview-close-button:hover { background-color: rgba(0, 0, 0, 0.9); } /* Adjust thumbnail cursor */ #image-downloader-panel .image-item img.thumbnail, #image-downloader-panel .image-item .image-url { cursor: pointer; /* Ensure pointer cursor */ } `); return () => { document.removeEventListener('keydown', handleKeyPress); }; }); legacy_pre_effect( () => get(images), () => { set( allSelected, get(images).length > 0 && get(images).every((img) => img.selected), ); }, ); legacy_pre_effect( () => (get(images), get(allSelected)), () => { set( indeterminate, get(images).length > 0 && !get(allSelected) && get(images).some((img) => img.selected), ); }, ); legacy_pre_effect_reset(); init(); var fragment = root(); var node = first_child(fragment); { var consequent = ($$anchor2) => { var div = root_1(); var div_1 = child(div); var button = child(div_1); var img_1 = sibling(button, 2); template_effect(() => set_attribute(img_1, 'src', get(previewImageUrl)), ); event('click', button, () => set(previewVisible, false)); event( 'click', div_1, stopPropagation(function ($$arg) { bubble_event.call(this, $$props, $$arg); }), ); event('click', div, () => set(previewVisible, false)); transition( 3, div, () => fade, () => ({ duration: 150 }), ); append($$anchor2, div); }; if_block(node, ($$render) => { if (get(previewVisible)) $$render(consequent); }); } var node_1 = sibling(node, 2); { var consequent_6 = ($$anchor2) => { var div_2 = root_2(); let classes; var h3 = child(div_2); var div_3 = sibling(child(h3), 2); var button_1 = child(div_3); var text = child(button_1); var button_2 = sibling(button_1, 2); var node_2 = sibling(h3, 2); TextAd(node_2, {}); var div_4 = sibling(node_2, 2); var button_3 = child(div_4); var node_3 = sibling(div_4, 2); { var consequent_1 = ($$anchor3) => { var div_5 = root_3(); var input = child(div_5); var label = sibling(input, 2); var text_1 = child(label); template_effect( ($0) => { input.disabled = get(loading); set_text( text_1, `全选/取消全选 (${$0 ?? ''}/${get(images).length ?? ''})`, ); }, [() => get(images).filter((img) => img.selected).length], derived_safe_equal, ); bind_checked( input, () => get(allSelected), ($$value) => set(allSelected, $$value), ); bind_property( 'indeterminate', 'change', input, ($$value) => set(indeterminate, $$value), () => get(indeterminate), ); event('change', input, toggleSelectAll); append($$anchor3, div_5); }; if_block(node_3, ($$render) => { if (get(images).length > 0) $$render(consequent_1); }); } var div_6 = sibling(node_3, 2); var node_4 = child(div_6); { var consequent_3 = ($$anchor3) => { var fragment_1 = comment(); var node_5 = first_child(fragment_1); each( node_5, 3, () => get(images), (img) => img.url, ($$anchor4, img, i) => { var label_1 = root_5(); var input_1 = child(label_1); var node_6 = sibling(input_1, 2); { var consequent_2 = ($$anchor5) => { var img_2 = root_6(); template_effect(() => set_attribute(img_2, 'src', get(img).url), ); event('error', img_2, handleThumbnailError); event( 'click', img_2, preventDefault(() => openPreview(get(img).url)), ); append($$anchor5, img_2); }; if_block(node_6, ($$render) => { if (get(showThumbnails)) $$render(consequent_2); }); } var span = sibling(node_6, 2); var text_2 = child(span); template_effect(() => { set_attribute(input_1, 'id', `img-${get(i)}`); input_1.disabled = get(loading); set_text(text_2, get(img).name); }); bind_checked( input_1, () => get(img).selected, ($$value) => ( (get(img).selected = $$value), invalidate_inner_signals(() => get(images)) ), ); append($$anchor4, label_1); }, ); append($$anchor3, fragment_1); }; var alternate = ($$anchor3, $$elseif) => { { var consequent_4 = ($$anchor4) => { var p = root_8(); append($$anchor4, p); }; if_block( $$anchor3, ($$render) => { if (!get(loading)) $$render(consequent_4); }, $$elseif, ); } }; if_block(node_4, ($$render) => { if (get(images).length > 0) $$render(consequent_3); else $$render(alternate, false); }); } var node_7 = sibling(node_4, 2); { var consequent_5 = ($$anchor3) => { var p_1 = root_9(); append($$anchor3, p_1); }; if_block(node_7, ($$render) => { if (get(loading) && get(images).length === 0) $$render(consequent_5); }); } var button_4 = sibling(div_6, 2); var div_7 = sibling(button_4, 2); var text_3 = child(div_7); bind_this( div_2, ($$value) => set(panelElement, $$value), () => get(panelElement), ); template_effect( ($0, $1) => { classes = set_class(div_2, 1, '', null, classes, $0); set_attribute( button_1, 'title', get(showThumbnails) ? '隐藏缩略图' : '显示缩略图', ); set_text(text, get(showThumbnails) ? '🖼️' : '🚫'); button_3.disabled = get(loading); button_4.disabled = $1; set_text(text_3, get(status)); }, [ () => ({ dragging: get(isDragging) }), () => get(loading) || get(images).filter((img) => img.selected).length === 0, ], derived_safe_equal, ); event('click', button_1, () => set(showThumbnails, !get(showThumbnails)), ); event('click', button_2, () => set(panelVisible, false)); event('click', button_3, findImages); event('click', button_4, downloadSelected); event('mousedown', div_2, handleMouseDown); append($$anchor2, div_2); }; if_block(node_1, ($$render) => { if (get(panelVisible)) $$render(consequent_6); }); } var node_8 = sibling(node_1, 2); { var consequent_7 = ($$anchor2) => { var button_5 = root_10(); var div_8 = child(button_5); event( 'click', div_8, stopPropagation(() => set(buttonVisible, false)), ); event('click', button_5, () => set(panelVisible, true)); append($$anchor2, button_5); }; if_block(node_8, ($$render) => { if (!get(panelVisible) && get(buttonVisible)) $$render(consequent_7); }); } append($$anchor, fragment); pop(); } mount(App, { target: (() => { const app2 = document.createElement('div'); document.body.append(app2); return app2; })(), }); })(fflate);