您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Modifies the DuChinese graded reader UI to make it compatible with the Migaku extension.
// ==UserScript== // @name migaku-duchinese-compatability-userscript // @namespace https://github.com/halcarleton // @version 0.1.1 // @author https://github.com/halcarleton // @description Modifies the DuChinese graded reader UI to make it compatible with the Migaku extension. // @license Apache-2.0 // @include https://duchinese.net/* // @run-at document-start // ==/UserScript== (function () { 'use strict'; var __defProp = Object.defineProperty; var __typeError = (msg) => { throw TypeError(msg); }; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj)); var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value); var _events, _instance; function wait(delay) { return new Promise((res) => setTimeout(res, delay)); } const defaultWaitForOptions = { err: new Error("Exceeded time limit while waiting."), interval: 500, timeout: 5e3 }; async function waitFor(fn, options = {}) { const completeOptions = Object.assign( {}, defaultWaitForOptions, options ); let start = Date.now(); let result = fn(); while (!result) { if (Date.now() - start > completeOptions.timeout) { throw completeOptions.err; } await wait(completeOptions.interval); result = fn(); } return result; } function getAllBySelector(selector, parent) { return [...document.querySelectorAll(selector)]; } async function getNBySelector(selector, qty, options = {}, parent) { let localOptions = { ...options, err: options.err || new Error(`Exceeded time limit while querying selector: "${selector}"`) }; const matchedElements = await waitFor(() => { const elements = getAllBySelector(selector); if (elements.length === qty) { return elements; } elements.length; return null; }, localOptions); return matchedElements; } async function getBySelector(selector, options = {}, parent) { const matchedElements = await getNBySelector(selector, 1, options); return matchedElements[0]; } const PUBLIC_VERSION = "5"; if (typeof window !== "undefined") (window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(PUBLIC_VERSION); const EACH_ITEM_REACTIVE = 1; const EACH_INDEX_REACTIVE = 1 << 1; const EACH_ITEM_IMMUTABLE = 1 << 4; const PROPS_IS_RUNES = 1 << 1; const TEMPLATE_USE_IMPORT_NODE = 1 << 1; const HYDRATION_START = "["; const HYDRATION_START_ELSE = "[!"; const HYDRATION_END = "]"; const HYDRATION_ERROR = {}; const DEV = false; function hydration_mismatch(location) { { console.warn("hydration_mismatch"); } } var is_array = Array.isArray; var array_from = Array.from; var object_keys = Object.keys; var define_property = Object.defineProperty; var get_descriptor = Object.getOwnPropertyDescriptor; 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 UNOWNED = 1 << 7; const DISCONNECTED = 1 << 8; const CLEAN = 1 << 9; const DIRTY = 1 << 10; const MAYBE_DIRTY = 1 << 11; const INERT = 1 << 12; const DESTROYED = 1 << 13; const EFFECT_RAN = 1 << 14; const EFFECT_TRANSPARENT = 1 << 15; const HEAD_EFFECT = 1 << 18; const EFFECT_HAS_DERIVED = 1 << 19; 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_update_depth_exceeded() { { throw new Error("effect_update_depth_exceeded"); } } function hydration_failed() { { throw new Error("hydration_failed"); } } function props_invalid_value(key) { { throw new Error("props_invalid_value"); } } function state_unsafe_local_read() { { throw new Error("state_unsafe_local_read"); } } function state_unsafe_mutation() { { throw new Error("state_unsafe_mutation"); } } function source(v) { return { f: 0, // TODO ideally we could skip this altogether, but it causes type errors v, reactions: null, equals, version: 0 }; } // @__NO_SIDE_EFFECTS__ function mutable_source(initial_value, immutable = false) { var _a; const s = source(initial_value); if (!immutable) { s.equals = safe_equals; } if (component_context !== null && component_context.l !== null) { ((_a = component_context.l).s ?? (_a.s = [])).push(s); } return s; } function set(source2, value) { if (active_reaction !== null && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT)) !== 0 && // If the source was created locally within the current derived, then // we allow the mutation. (derived_sources === null || !derived_sources.includes(source2))) { state_unsafe_mutation(); } return internal_set(source2, value); } function internal_set(source2, value) { if (!source2.equals(value)) { source2.v = value; source2.version = increment_version(); mark_reactions(source2, DIRTY); if (is_runes() && active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & BRANCH_EFFECT) === 0) { if (new_deps !== null && new_deps.includes(source2)) { set_signal_status(active_effect, DIRTY); schedule_effect(active_effect); } else { 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 ); } } } } // @__NO_SIDE_EFFECTS__ function derived(fn) { var flags = DERIVED | DIRTY; if (active_effect === null) { flags |= UNOWNED; } else { active_effect.f |= EFFECT_HAS_DERIVED; } const signal = { children: null, ctx: component_context, deps: null, equals, f: flags, fn, reactions: null, v: ( /** @type {V} */ null ), version: 0, parent: active_effect }; if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0) { var derived2 = ( /** @type {Derived} */ active_reaction ); (derived2.children ?? (derived2.children = [])).push(signal); } return signal; } function destroy_derived_children(derived2) { var children = derived2.children; if (children !== null) { derived2.children = null; for (var i = 0; i < children.length; i += 1) { var child2 = children[i]; if ((child2.f & DERIVED) !== 0) { destroy_derived( /** @type {Derived} */ child2 ); } else { destroy_effect( /** @type {Effect} */ child2 ); } } } } function execute_derived(derived2) { var value; var prev_active_effect = active_effect; set_active_effect(derived2.parent); { try { destroy_derived_children(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.version = increment_version(); } } function destroy_derived(signal) { destroy_derived_children(signal); remove_reactions(signal, 0); set_signal_status(signal, DESTROYED); signal.v = signal.children = signal.deps = signal.ctx = signal.reactions = null; } 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 is_root = (type & ROOT_EFFECT) !== 0; var parent_effect = active_effect; var effect2 = { ctx: component_context, deps: null, deriveds: null, nodes_start: null, nodes_end: null, f: type | DIRTY, first: null, fn, last: null, next: null, parent: is_root ? null : parent_effect, prev: null, teardown: null, transitions: null, version: 0 }; if (sync) { var previously_flushing_effect = is_flushing_effect; try { set_is_flushing_effect(true); update_effect(effect2); effect2.f |= EFFECT_RAN; } catch (e) { destroy_effect(effect2); throw e; } finally { set_is_flushing_effect(previously_flushing_effect); } } 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) === 0; if (!inert && !is_root && push2) { if (parent_effect !== null) { push_effect(effect2, parent_effect); } if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0) { var derived2 = ( /** @type {Derived} */ active_reaction ); (derived2.children ?? (derived2.children = [])).push(effect2); } } return effect2; } function effect_root(fn) { const effect2 = create_effect(ROOT_EFFECT, fn, true); return () => { destroy_effect(effect2); }; } function effect(fn) { return create_effect(EFFECT, fn, false); } function render_effect(fn) { return create_effect(RENDER_EFFECT, fn, true); } function template_effect(fn) { return block(fn); } 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 teardown = effect2.teardown; if (teardown !== null) { const previous_reaction = active_reaction; set_active_reaction(null); try { teardown.call(null); } finally { set_active_reaction(previous_reaction); } } } function destroy_effect_deriveds(signal) { var deriveds = signal.deriveds; if (deriveds !== null) { signal.deriveds = null; for (var i = 0; i < deriveds.length; i += 1) { destroy_derived(deriveds[i]); } } } function destroy_effect_children(signal, remove_dom = false) { var effect2 = signal.first; signal.first = signal.last = null; while (effect2 !== null) { var next2 = effect2.next; destroy_effect(effect2, remove_dom); effect2 = next2; } } function destroy_block_effect_children(signal) { var effect2 = signal.first; while (effect2 !== null) { var next2 = effect2.next; if ((effect2.f & BRANCH_EFFECT) === 0) { destroy_effect(effect2); } effect2 = next2; } } 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 next2 = node === end ? null : ( /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(node) ); node.remove(); node = next2; } removed = true; } destroy_effect_deriveds(effect2); 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 transition of transitions) { transition.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.parent = effect2.fn = effect2.nodes_start = effect2.nodes_end = null; } function unlink_effect(effect2) { var parent = effect2.parent; var prev = effect2.prev; var next2 = effect2.next; if (prev !== null) prev.next = next2; if (next2 !== null) next2.prev = prev; if (parent !== null) { if (parent.first === effect2) parent.first = next2; 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 transition of transitions) { transition.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 transition of effect2.transitions) { if (transition.is_global || local) { transitions.push(transition); } } } var child2 = effect2.first; while (child2 !== null) { var sibling = child2.next; var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; pause_children(child2, transitions, transparent ? local : false); child2 = sibling; } } function resume_effect(effect2) { resume_children(effect2, true); } function resume_children(effect2, local) { if ((effect2.f & INERT) === 0) return; effect2.f ^= INERT; if (check_dirtiness(effect2)) { update_effect(effect2); } var child2 = effect2.first; while (child2 !== null) { var sibling = child2.next; var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; resume_children(child2, transparent ? local : false); child2 = sibling; } if (effect2.transitions !== null) { for (const transition of effect2.transitions) { if (transition.is_global || local) { transition.in(); } } } } let is_micro_task_queued$1 = false; let current_queued_micro_tasks = []; function process_micro_tasks() { is_micro_task_queued$1 = false; const tasks = current_queued_micro_tasks.slice(); current_queued_micro_tasks = []; run_all(tasks); } function queue_micro_task(fn) { if (!is_micro_task_queued$1) { is_micro_task_queued$1 = true; queueMicrotask(process_micro_tasks); } current_queued_micro_tasks.push(fn); } function flush_tasks() { if (is_micro_task_queued$1) { process_micro_tasks(); } } const FLUSH_MICROTASK = 0; const FLUSH_SYNC = 1; let scheduler_mode = FLUSH_MICROTASK; let is_micro_task_queued = false; let is_flushing_effect = false; function set_is_flushing_effect(value) { is_flushing_effect = value; } let queued_root_effects = []; let flush_count = 0; let active_reaction = null; function set_active_reaction(reaction) { active_reaction = reaction; } let active_effect = null; function set_active_effect(effect2) { active_effect = effect2; } let derived_sources = null; let new_deps = null; let skipped_deps = 0; let untracked_writes = null; function set_untracked_writes(value) { untracked_writes = value; } let current_version = 0; let skip_reaction = false; let component_context = null; function increment_version() { return ++current_version; } function is_runes() { return component_context !== null && component_context.l === null; } function check_dirtiness(reaction) { var _a, _b; 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; if ((flags & DISCONNECTED) !== 0) { for (i = 0; i < dependencies.length; i++) { ((_a = dependencies[i]).reactions ?? (_a.reactions = [])).push(reaction); } reaction.f ^= DISCONNECTED; } for (i = 0; i < dependencies.length; i++) { var dependency = dependencies[i]; if (check_dirtiness( /** @type {Derived} */ dependency )) { update_derived( /** @type {Derived} */ dependency ); } if (is_unowned && active_effect !== null && !skip_reaction && !((_b = dependency == null ? void 0 : dependency.reactions) == null ? void 0 : _b.includes(reaction))) { (dependency.reactions ?? (dependency.reactions = [])).push(reaction); } if (dependency.version > reaction.version) { return true; } } } if (!is_unowned) { set_signal_status(reaction, CLEAN); } } return false; } function handle_error(error, effect2, component_context2) { { throw error; } } function update_reaction(reaction) { var _a; 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 prev_derived_sources = derived_sources; var previous_component_context = component_context; var flags = reaction.f; new_deps = /** @type {null | Value[]} */ null; skipped_deps = 0; untracked_writes = null; active_reaction = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; skip_reaction = !is_flushing_effect && (flags & UNOWNED) !== 0; derived_sources = null; component_context = reaction.ctx; 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++) { ((_a = deps[i]).reactions ?? (_a.reactions = [])).push(reaction); } } } else if (deps !== null && skipped_deps < deps.length) { remove_reactions(reaction, skipped_deps); deps.length = skipped_deps; } 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; derived_sources = prev_derived_sources; component_context = previous_component_context; } } function remove_reaction(signal, dependency) { let reactions = dependency.reactions; if (reactions !== null) { var index2 = reactions.indexOf(signal); if (index2 !== -1) { var new_length = reactions.length - 1; if (new_length === 0) { reactions = dependency.reactions = null; } else { reactions[index2] = 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; } 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; active_effect = effect2; try { destroy_effect_deriveds(effect2); if ((flags & BLOCK_EFFECT) !== 0) { destroy_block_effect_children(effect2); } else { destroy_effect_children(effect2); } execute_effect_teardown(effect2); var teardown = update_reaction(effect2); effect2.teardown = typeof teardown === "function" ? teardown : null; effect2.version = current_version; if (DEV) ; } catch (error) { handle_error( /** @type {Error} */ error ); } finally { active_effect = previous_effect; } } function infinite_loop_guard() { if (flush_count > 1e3) { flush_count = 0; { effect_update_depth_exceeded(); } } flush_count++; } function flush_queued_root_effects(root_effects) { var length = root_effects.length; if (length === 0) { return; } infinite_loop_guard(); var previously_flushing_effect = is_flushing_effect; is_flushing_effect = true; try { for (var i = 0; i < length; i++) { var effect2 = root_effects[i]; if ((effect2.f & CLEAN) === 0) { effect2.f ^= CLEAN; } var collected_effects = []; process_effects(effect2, collected_effects); flush_queued_effects(collected_effects); } } finally { is_flushing_effect = previously_flushing_effect; } } 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 && 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; } } } } } function process_deferred() { is_micro_task_queued = false; if (flush_count > 1001) { return; } const previous_queued_root_effects = queued_root_effects; queued_root_effects = []; flush_queued_root_effects(previous_queued_root_effects); if (!is_micro_task_queued) { flush_count = 0; } } function schedule_effect(signal) { if (scheduler_mode === FLUSH_MICROTASK) { if (!is_micro_task_queued) { is_micro_task_queued = true; queueMicrotask(process_deferred); } } var effect2 = 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(effect2, collected_effects) { var current_effect = effect2.first; var effects = []; main_loop: while (current_effect !== null) { var flags = current_effect.f; var is_branch = (flags & BRANCH_EFFECT) !== 0; var is_skippable_branch = is_branch && (flags & CLEAN) !== 0; if (!is_skippable_branch && (flags & INERT) === 0) { if ((flags & RENDER_EFFECT) !== 0) { if (is_branch) { current_effect.f ^= CLEAN; } else if (check_dirtiness(current_effect)) { update_effect(current_effect); } var child2 = current_effect.first; if (child2 !== null) { current_effect = child2; continue; } } else if ((flags & EFFECT) !== 0) { effects.push(current_effect); } } var sibling = current_effect.next; if (sibling === null) { let parent = current_effect.parent; while (parent !== null) { if (effect2 === parent) { break main_loop; } var parent_sibling = parent.next; if (parent_sibling !== null) { current_effect = parent_sibling; continue main_loop; } parent = parent.parent; } } current_effect = sibling; } for (var i = 0; i < effects.length; i++) { child2 = effects[i]; collected_effects.push(child2); process_effects(child2, collected_effects); } } function flush_sync(fn) { var previous_scheduler_mode = scheduler_mode; var previous_queued_root_effects = queued_root_effects; try { infinite_loop_guard(); const root_effects = []; scheduler_mode = FLUSH_SYNC; queued_root_effects = root_effects; is_micro_task_queued = false; flush_queued_root_effects(previous_queued_root_effects); var result = fn == null ? void 0 : fn(); flush_tasks(); if (queued_root_effects.length > 0 || root_effects.length > 0) { flush_sync(); } flush_count = 0; if (DEV) ; return result; } finally { scheduler_mode = previous_scheduler_mode; queued_root_effects = previous_queued_root_effects; } } function get(signal) { var _a; var flags = signal.f; var is_derived = (flags & DERIVED) !== 0; if (is_derived && (flags & DESTROYED) !== 0) { var value = execute_derived( /** @type {Derived} */ signal ); destroy_derived( /** @type {Derived} */ signal ); return value; } if (active_reaction !== null) { if (derived_sources !== null && derived_sources.includes(signal)) { state_unsafe_local_read(); } var deps = active_reaction.deps; if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { skipped_deps++; } else if (new_deps === null) { new_deps = [signal]; } else { new_deps.push(signal); } if (untracked_writes !== null && active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & BRANCH_EFFECT) === 0 && untracked_writes.includes(signal)) { set_signal_status(active_effect, DIRTY); schedule_effect(active_effect); } } else if (is_derived && /** @type {Derived} */ signal.deps === null) { var derived2 = ( /** @type {Derived} */ signal ); var parent = derived2.parent; if (parent !== null && !((_a = parent.deriveds) == null ? void 0 : _a.includes(derived2))) { (parent.deriveds ?? (parent.deriveds = [])).push(derived2); } } if (is_derived) { derived2 = /** @type {Derived} */ signal; if (check_dirtiness(derived2)) { update_derived(derived2); } } return signal.v; } function untrack(fn) { const previous_reaction = active_reaction; try { active_reaction = null; return fn(); } finally { active_reaction = previous_reaction; } } const STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN); function set_signal_status(signal, status) { signal.f = signal.f & STATUS_MASK | status; } function push(props, runes = false, fn) { component_context = { p: component_context, c: null, e: null, m: false, s: props, x: null, l: null }; if (!runes) { component_context.l = { s: null, u: null, r1: [], r2: source(false) }; } } function pop(component) { const context_stack_item = component_context; if (context_stack_item !== null) { if (component !== void 0) { context_stack_item.x = component; } 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 component || /** @type {T} */ {}; } var $window; var first_child_getter; var next_sibling_getter; function init_operations() { if ($window !== void 0) { return; } $window = window; var element_prototype = Element.prototype; var node_prototype = Node.prototype; first_child_getter = get_descriptor(node_prototype, "firstChild").get; next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; element_prototype.__click = void 0; element_prototype.__className = ""; element_prototype.__attributes = null; element_prototype.__styles = null; element_prototype.__e = void 0; 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) { if (!hydrating) { return /* @__PURE__ */ get_first_child(node); } var child2 = ( /** @type {TemplateNode} */ /* @__PURE__ */ get_first_child(hydrate_node) ); if (child2 === null) { child2 = hydrate_node.appendChild(create_text()); } else if (is_text && child2.nodeType !== 3) { var text = create_text(); child2 == null ? void 0 : child2.before(text); set_hydrate_node(text); return text; } set_hydrate_node(child2); return child2; } function clear_text_content(node) { node.textContent = ""; } let hydrating = false; function set_hydrating(value) { hydrating = value; } let hydrate_node; function set_hydrate_node(node) { if (node === null) { hydration_mismatch(); throw HYDRATION_ERROR; } return hydrate_node = node; } function hydrate_next() { return set_hydrate_node( /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(hydrate_node) ); } function reset(node) { if (!hydrating) return; if (/* @__PURE__ */ get_next_sibling(hydrate_node) !== null) { hydration_mismatch(); throw HYDRATION_ERROR; } hydrate_node = node; } function next(count = 1) { if (hydrating) { var i = count; var node = hydrate_node; while (i--) { node = /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(node); } hydrate_node = node; } } function remove_nodes() { var depth = 0; var node = hydrate_node; while (true) { if (node.nodeType === 8) { var data = ( /** @type {Comment} */ node.data ); if (data === HYDRATION_END) { if (depth === 0) return node; depth -= 1; } else if (data === HYDRATION_START || data === HYDRATION_START_ELSE) { depth += 1; } } var next2 = ( /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(node) ); node.remove(); node = next2; } } const all_registered_events = /* @__PURE__ */ new Set(); const root_event_handles = /* @__PURE__ */ new Set(); function handle_event_propagation(event) { var _a; var handler_element = this; var owner_document = ( /** @type {Node} */ handler_element.ownerDocument ); var event_name = event.type; var path = ((_a = event.composedPath) == null ? void 0 : _a.call(event)) || []; var current_target = ( /** @type {null | Element} */ path[0] || event.target ); var path_idx = 0; var handled_at = event.__root; if (handled_at) { var at_idx = path.indexOf(handled_at); if (at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ window)) { event.__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] || event.target; if (current_target === handler_element) return; define_property(event, "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 !== void 0 && !/** @type {any} */ current_target.disabled) { if (is_array(delegated)) { var [fn, ...data] = delegated; fn.apply(current_target, [event, ...data]); } else { delegated.call(current_target, event); } } } catch (error) { if (throw_error) { other_errors.push(error); } else { throw_error = error; } } if (event.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 { event.__root = handler_element; delete event.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 use_import_node = (flags & TEMPLATE_USE_IMPORT_NODE) !== 0; var node; var has_start = !content.startsWith("<!>"); return () => { if (hydrating) { assign_nodes(hydrate_node, null); return hydrate_node; } if (node === void 0) { node = create_fragment_from_html(has_start ? content : "<!>" + content); node = /** @type {Node} */ /* @__PURE__ */ get_first_child(node); } var clone = ( /** @type {TemplateNode} */ use_import_node ? document.importNode(node, true) : node.cloneNode(true) ); { assign_nodes(clone, clone); } return clone; }; } function append(anchor, dom) { if (hydrating) { active_effect.nodes_end = hydrate_node; hydrate_next(); return; } if (anchor === null) { return; } anchor.before( /** @type {Node} */ dom ); } const PASSIVE_EVENTS = ["touchstart", "touchmove"]; function is_passive_event(name) { return PASSIVE_EVENTS.includes(name); } 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 == null ? "" : str + ""; } } function mount(component, options) { return _mount(component, options); } function hydrate(component, options) { init_operations(); options.intro = options.intro ?? false; const target = options.target; const was_hydrating = hydrating; const previous_hydrate_node = hydrate_node; try { var anchor = ( /** @type {TemplateNode} */ /* @__PURE__ */ get_first_child(target) ); while (anchor && (anchor.nodeType !== 8 || /** @type {Comment} */ anchor.data !== HYDRATION_START)) { anchor = /** @type {TemplateNode} */ /* @__PURE__ */ get_next_sibling(anchor); } if (!anchor) { throw HYDRATION_ERROR; } set_hydrating(true); set_hydrate_node( /** @type {Comment} */ anchor ); hydrate_next(); const instance = _mount(component, { ...options, anchor }); if (hydrate_node === null || hydrate_node.nodeType !== 8 || /** @type {Comment} */ hydrate_node.data !== HYDRATION_END) { hydration_mismatch(); throw HYDRATION_ERROR; } set_hydrating(false); return ( /** @type {Exports} */ instance ); } catch (error) { if (error === HYDRATION_ERROR) { if (options.recover === false) { hydration_failed(); } init_operations(); clear_text_content(target); set_hydrating(false); return mount(component, options); } throw error; } finally { set_hydrating(was_hydrating); set_hydrate_node(previous_hydrate_node); } } 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 unmount2 = effect_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; } if (hydrating) { assign_nodes( /** @type {TemplateNode} */ anchor_node, null ); } component = Component(anchor_node, props) || {}; if (hydrating) { active_effect.nodes_end = hydrate_node; } if (context) { pop(); } }); return () => { var _a; 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); mounted_components.delete(component); if (anchor_node !== anchor) { (_a = anchor_node.parentNode) == null ? void 0 : _a.removeChild(anchor_node); } }; }); mounted_components.set(component, unmount2); return component; } let mounted_components = /* @__PURE__ */ new WeakMap(); function unmount(component) { const fn = mounted_components.get(component); if (fn) { fn(); } } let current_each_item = null; function index(_, i) { return i; } function pause_effects(state, 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(state, 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(state, 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 state = { flags, items: /* @__PURE__ */ new Map(), first: null }; { var parent_node = ( /** @type {Element} */ node ); anchor = hydrating ? set_hydrate_node( /** @type {Comment | Text} */ /* @__PURE__ */ get_first_child(parent_node) ) : parent_node.appendChild(create_text()); } if (hydrating) { hydrate_next(); } var fallback = null; var was_empty = false; block(() => { var collection = get_collection(); var array = is_array(collection) ? collection : collection == null ? [] : array_from(collection); var length = array.length; if (was_empty && length === 0) { return; } was_empty = length === 0; let mismatch = false; if (hydrating) { var is_else = ( /** @type {Comment} */ anchor.data === HYDRATION_START_ELSE ); if (is_else !== (length === 0)) { anchor = remove_nodes(); set_hydrate_node(anchor); set_hydrating(false); mismatch = true; } } if (hydrating) { var prev = null; var item; for (var i = 0; i < length; i++) { if (hydrate_node.nodeType === 8 && /** @type {Comment} */ hydrate_node.data === HYDRATION_END) { anchor = /** @type {Comment} */ hydrate_node; mismatch = true; set_hydrating(false); break; } var value = array[i]; var key = get_key(value, i); item = create_item(hydrate_node, state, prev, null, value, key, i, render_fn, flags); state.items.set(key, item); prev = item; } if (length > 0) { set_hydrate_node(remove_nodes()); } } if (!hydrating) { reconcile(array, state, anchor, render_fn, flags, get_key); } 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; }); } } if (mismatch) { set_hydrating(true); } get_collection(); }); if (hydrating) { anchor = hydrate_node; } } function reconcile(array, state, anchor, render_fn, flags, get_key) { var length = array.length; var items = state.items; var first = state.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, state, prev, prev === null ? state.first : prev.next, value, key, i, render_fn, flags ); 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(state, a.prev, b.next); link(state, prev, a); link(state, b, start); current = start; prev = b; i -= 1; matched = []; stashed = []; } else { seen.delete(item); move(item, current, anchor); link(state, item.prev, item.next); link(state, item, prev === null ? state.first : prev.next); link(state, 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 = length === 0 ? anchor : null; pause_effects(state, to_destroy, controlled_anchor, items); } } active_effect.first = state.first && state.first.e; active_effect.last = prev && prev.e; } function update_item(item, value, index2, type) { { internal_set(item.v, value); } { item.i = index2; } } function create_item(anchor, state, prev, next2, value, key, index2, render_fn, flags) { var previous_each_item = current_each_item; try { 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 ? index2 : source(index2); var item = { i, v, k: key, a: null, // @ts-expect-error e: null, prev, next: next2 }; current_each_item = item; item.e = branch(() => render_fn(anchor, v, i), hydrating); item.e.prev = prev && prev.e; item.e.next = next2 && next2.e; if (prev === null) { state.first = item; } else { prev.next = item; prev.e.next = item.e; } if (next2 !== null) { next2.prev = item; next2.e.prev = item.e; } return item; } finally { current_each_item = previous_each_item; } } function move(item, next2, anchor) { var end = item.next ? ( /** @type {TemplateNode} */ item.next.e.nodes_start ) : anchor; var dest = next2 ? ( /** @type {TemplateNode} */ next2.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(state, prev, next2) { if (prev === null) { state.first = next2; } else { prev.next = next2; prev.e.next = next2 && next2.e; } if (next2 !== null) { next2.prev = prev; next2.e.prev = prev && prev.e; } } function append_styles(anchor, css) { queue_micro_task(() => { var root2 = anchor.getRootNode(); var target = ( /** @type {ShadowRoot} */ root2.host ? ( /** @type {ShadowRoot} */ root2 ) : ( /** @type {Document} */ root2.head ?? /** @type {Document} */ root2.ownerDocument.head ) ); if (!target.querySelector("#" + css.hash)) { const style = document.createElement("style"); style.id = css.hash; style.textContent = css.code; target.appendChild(style); } }); } function set_class(dom, value) { var prev_class_name = dom.__className; var next_class_name = to_class(value); if (hydrating && dom.className === next_class_name) { dom.__className = next_class_name; } else if (prev_class_name !== next_class_name || hydrating && dom.className !== next_class_name) { if (value == null) { dom.removeAttribute("class"); } else { dom.className = next_class_name; } dom.__className = next_class_name; } } function to_class(value) { return value == null ? "" : value; } function with_parent_branch(fn) { var effect2 = active_effect; var previous_effect = active_effect; while (effect2 !== null && (effect2.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { effect2 = effect2.parent; } try { set_active_effect(effect2); return fn(); } finally { set_active_effect(previous_effect); } } function prop(props, key, flags, fallback) { var _a; var runes = (flags & PROPS_IS_RUNES) !== 0; var is_store_sub = false; var prop_value; { prop_value = /** @type {V} */ props[key]; } var setter = (_a = get_descriptor(props, key)) == null ? void 0 : _a.set; var fallback_value = ( /** @type {V} */ fallback ); var fallback_dirty = true; var fallback_used = false; var get_fallback = () => { fallback_used = true; if (fallback_dirty) { fallback_dirty = false; { fallback_value = /** @type {V} */ fallback; } } return fallback_value; }; if (prop_value === void 0 && fallback !== void 0) { if (setter && runes) { props_invalid_value(); } prop_value = get_fallback(); if (setter) setter(prop_value); } var getter; { getter = () => { var value = ( /** @type {V} */ props[key] ); if (value === void 0) return get_fallback(); fallback_dirty = true; fallback_used = false; return value; }; } if (setter) { var legacy_parent = props.$$legacy; return function(value, mutation) { if (arguments.length > 0) { if (!mutation || legacy_parent || is_store_sub) { setter(mutation ? getter() : value); } return value; } else { return getter(); } }; } var from_child = false; var was_from_child = false; var inner_current_value = /* @__PURE__ */ mutable_source(prop_value); var current_value = with_parent_branch( () => /* @__PURE__ */ derived(() => { var parent_value = getter(); var child_value = get(inner_current_value); var current_derived = ( /** @type {Derived} */ active_reaction ); if (from_child || parent_value === void 0 && (current_derived.f & DESTROYED) !== 0) { from_child = false; was_from_child = true; return child_value; } was_from_child = false; return inner_current_value.v = parent_value; }) ); return function(value, mutation) { if (arguments.length > 0) { const new_value = mutation ? get(current_value) : value; if (!current_value.equals(new_value)) { from_child = true; set(inner_current_value, new_value); if (fallback_used && fallback_value !== void 0) { fallback_value = new_value; } untrack(() => get(current_value)); } return value; } return get(current_value); }; } function createClassComponent(options) { return new Svelte4Component(options); } class Svelte4Component { /** * @param {ComponentConstructorOptions & { * component: any; * }} options */ constructor(options) { /** @type {any} */ __privateAdd(this, _events); /** @type {Record<string, any>} */ __privateAdd(this, _instance); var _a; var sources = /* @__PURE__ */ new Map(); var add_source = (key, value) => { var s = /* @__PURE__ */ mutable_source(value); sources.set(key, s); return s; }; const props = new Proxy( { ...options.props || {}, $$events: {} }, { get(target, prop2) { return get(sources.get(prop2) ?? add_source(prop2, Reflect.get(target, prop2))); }, has(target, prop2) { get(sources.get(prop2) ?? add_source(prop2, Reflect.get(target, prop2))); return Reflect.has(target, prop2); }, set(target, prop2, value) { set(sources.get(prop2) ?? add_source(prop2, value), value); return Reflect.set(target, prop2, value); } } ); __privateSet(this, _instance, (options.hydrate ? hydrate : mount)(options.component, { target: options.target, props, context: options.context, intro: options.intro ?? false, recover: options.recover })); if (!((_a = options == null ? void 0 : options.props) == null ? void 0 : _a.$$host) || options.sync === false) { flush_sync(); } __privateSet(this, _events, props.$$events); for (const key of Object.keys(__privateGet(this, _instance))) { if (key === "$set" || key === "$destroy" || key === "$on") continue; define_property(this, key, { get() { return __privateGet(this, _instance)[key]; }, /** @param {any} value */ set(value) { __privateGet(this, _instance)[key] = value; }, enumerable: true }); } __privateGet(this, _instance).$set = /** @param {Record<string, any>} next */ (next2) => { Object.assign(props, next2); }; __privateGet(this, _instance).$destroy = () => { unmount(__privateGet(this, _instance)); }; } /** @param {Record<string, any>} props */ $set(props) { __privateGet(this, _instance).$set(props); } /** * @param {string} event * @param {(...args: any[]) => any} callback * @returns {any} */ $on(event, callback) { __privateGet(this, _events)[event] = __privateGet(this, _events)[event] || []; const cb = (...args) => callback.call(this, ...args); __privateGet(this, _events)[event].push(cb); return () => { __privateGet(this, _events)[event] = __privateGet(this, _events)[event].filter( /** @param {any} fn */ (fn) => fn !== cb ); }; } $destroy() { __privateGet(this, _instance).$destroy(); } } _events = new WeakMap(); _instance = new WeakMap(); let SvelteElement; if (typeof HTMLElement === "function") { SvelteElement = class extends HTMLElement { /** * @param {*} $$componentCtor * @param {*} $$slots * @param {*} use_shadow_dom */ constructor($$componentCtor, $$slots, use_shadow_dom) { super(); /** The Svelte component constructor */ __publicField(this, "$$ctor"); /** Slots */ __publicField(this, "$$s"); /** @type {any} The Svelte component instance */ __publicField(this, "$$c"); /** Whether or not the custom element is connected */ __publicField(this, "$$cn", false); /** @type {Record<string, any>} Component props data */ __publicField(this, "$$d", {}); /** `true` if currently in the process of reflecting component props back to attributes */ __publicField(this, "$$r", false); /** @type {Record<string, CustomElementPropDefinition>} Props definition (name, reflected, type etc) */ __publicField(this, "$$p_d", {}); /** @type {Record<string, EventListenerOrEventListenerObject[]>} Event listeners */ __publicField(this, "$$l", {}); /** @type {Map<EventListenerOrEventListenerObject, Function>} Event listener unsubscribe functions */ __publicField(this, "$$l_u", /* @__PURE__ */ new Map()); /** @type {any} The managed render effect for reflecting attributes */ __publicField(this, "$$me"); this.$$ctor = $$componentCtor; this.$$s = $$slots; if (use_shadow_dom) { this.attachShadow({ mode: "open" }); } } /** * @param {string} type * @param {EventListenerOrEventListenerObject} listener * @param {boolean | AddEventListenerOptions} [options] */ addEventListener(type, listener, options) { this.$$l[type] = this.$$l[type] || []; this.$$l[type].push(listener); if (this.$$c) { const unsub = this.$$c.$on(type, listener); this.$$l_u.set(listener, unsub); } super.addEventListener(type, listener, options); } /** * @param {string} type * @param {EventListenerOrEventListenerObject} listener * @param {boolean | AddEventListenerOptions} [options] */ removeEventListener(type, listener, options) { super.removeEventListener(type, listener, options); if (this.$$c) { const unsub = this.$$l_u.get(listener); if (unsub) { unsub(); this.$$l_u.delete(listener); } } } async connectedCallback() { this.$$cn = true; if (!this.$$c) { let create_slot2 = function(name) { return (anchor) => { const slot = document.createElement("slot"); if (name !== "default") slot.name = name; append(anchor, slot); }; }; await Promise.resolve(); if (!this.$$cn || this.$$c) { return; } const $$slots = {}; const existing_slots = get_custom_elements_slots(this); for (const name of this.$$s) { if (name in existing_slots) { if (name === "default" && !this.$$d.children) { this.$$d.children = create_slot2(name); $$slots.default = true; } else { $$slots[name] = create_slot2(name); } } } for (const attribute of this.attributes) { const name = this.$$g_p(attribute.name); if (!(name in this.$$d)) { this.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, "toProp"); } } for (const key in this.$$p_d) { if (!(key in this.$$d) && this[key] !== void 0) { this.$$d[key] = this[key]; delete this[key]; } } this.$$c = createClassComponent({ component: this.$$ctor, target: this.shadowRoot || this, props: { ...this.$$d, $$slots, $$host: this } }); this.$$me = effect_root(() => { render_effect(() => { var _a; this.$$r = true; for (const key of object_keys(this.$$c)) { if (!((_a = this.$$p_d[key]) == null ? void 0 : _a.reflect)) continue; this.$$d[key] = this.$$c[key]; const attribute_value = get_custom_element_value( key, this.$$d[key], this.$$p_d, "toAttribute" ); if (attribute_value == null) { this.removeAttribute(this.$$p_d[key].attribute || key); } else { this.setAttribute(this.$$p_d[key].attribute || key, attribute_value); } } this.$$r = false; }); }); for (const type in this.$$l) { for (const listener of this.$$l[type]) { const unsub = this.$$c.$on(type, listener); this.$$l_u.set(listener, unsub); } } this.$$l = {}; } } // We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte // and setting attributes through setAttribute etc, this is helpful /** * @param {string} attr * @param {string} _oldValue * @param {string} newValue */ attributeChangedCallback(attr, _oldValue, newValue) { var _a; if (this.$$r) return; attr = this.$$g_p(attr); this.$$d[attr] = get_custom_element_value(attr, newValue, this.$$p_d, "toProp"); (_a = this.$$c) == null ? void 0 : _a.$set({ [attr]: this.$$d[attr] }); } disconnectedCallback() { this.$$cn = false; Promise.resolve().then(() => { if (!this.$$cn && this.$$c) { this.$$c.$destroy(); this.$$me(); this.$$c = void 0; } }); } /** * @param {string} attribute_name */ $$g_p(attribute_name) { return object_keys(this.$$p_d).find( (key) => this.$$p_d[key].attribute === attribute_name || !this.$$p_d[key].attribute && key.toLowerCase() === attribute_name ) || attribute_name; } }; } function get_custom_element_value(prop2, value, props_definition, transform) { var _a; const type = (_a = props_definition[prop2]) == null ? void 0 : _a.type; value = type === "Boolean" && typeof value !== "boolean" ? value != null : value; if (!transform || !props_definition[prop2]) { return value; } else if (transform === "toAttribute") { switch (type) { case "Object": case "Array": return value == null ? null : JSON.stringify(value); case "Boolean": return value ? "" : null; case "Number": return value == null ? null : value; default: return value; } } else { switch (type) { case "Object": case "Array": return value && JSON.parse(value); case "Boolean": return value; case "Number": return value != null ? +value : value; default: return value; } } } function get_custom_elements_slots(element) { const result = {}; element.childNodes.forEach((node) => { result[ /** @type {Element} node */ node.slot || "default" ] = true; }); return result; } function create_custom_element(Component, props_definition, slots, exports, use_shadow_dom, extend) { let Class = class extends SvelteElement { constructor() { super(Component, slots, use_shadow_dom); this.$$p_d = props_definition; } static get observedAttributes() { return object_keys(props_definition).map( (key) => (props_definition[key].attribute || key).toLowerCase() ); } }; object_keys(props_definition).forEach((prop2) => { define_property(Class.prototype, prop2, { get() { return this.$$c && prop2 in this.$$c ? this.$$c[prop2] : this.$$d[prop2]; }, set(value) { var _a; value = get_custom_element_value(prop2, value, props_definition); this.$$d[prop2] = value; var component = this.$$c; if (component) { var setter = (_a = get_descriptor(component, prop2)) == null ? void 0 : _a.get; if (setter) { component[prop2] = value; } else { component.$set({ [prop2]: value }); } } } }); }); exports.forEach((property) => { define_property(Class.prototype, property, { get() { var _a; return (_a = this.$$c) == null ? void 0 : _a[property]; } }); }); Component.element = /** @type {any} */ Class; return Class; } var root_1 = /* @__PURE__ */ template(`<div class="content-section svelte-dm4y8d"> </div>`); var root$1 = /* @__PURE__ */ template(`<div></div>`); const $$css$1 = { hash: "svelte-dm4y8d", code: "\n .content-section.svelte-dm4y8d {\n margin: 2em 0;\n }\n" }; function FormattedContent($$anchor, $$props) { push($$props, true); append_styles($$anchor, $$css$1); let content = prop($$props, "content", 7); let sections = /* @__PURE__ */ derived(() => { var _a; return ((_a = content()) == null ? void 0 : _a.split(/\n/g)) || []; }); var div = root$1(); each(div, 21, () => get(sections), index, ($$anchor2, section) => { var div_1 = root_1(); var text = child(div_1, true); reset(div_1); template_effect(() => set_text(text, get(section))); append($$anchor2, div_1); }); reset(div); append($$anchor, div); return pop({ get content() { return content(); }, set content($$value) { content($$value); flush_sync(); } }); } create_custom_element(FormattedContent, { content: {} }, [], [], true); const lessonContentTag = "plain-text-lesson-content"; var root = /* @__PURE__ */ template(`<div><div class="plain-text-lesson-content svelte-1vevapp"><!></div> <div class="loading-indicator svelte-1vevapp">Loading</div></div>`); const $$css = { hash: "svelte-1vevapp", code: "\n .plain-text-lesson-content.svelte-1vevapp {\n padding: 0 2em;\n font-weight: 400;\n }\n\n .loading.svelte-1vevapp .plain-text-lesson-content:where(.svelte-1vevapp) {\n display: none;\n }\n\n .loading-indicator.svelte-1vevapp {\n display: none;\n }\n\n .loading.svelte-1vevapp .loading-indicator:where(.svelte-1vevapp) {\n display: block\n }\n" }; function LessonContent($$anchor, $$props) { push($$props, true); append_styles($$anchor, $$css); let characterSet = prop($$props, "characterSet", 7), loading = prop($$props, "loading", 7), traditional = prop($$props, "traditional", 7), simplified = prop($$props, "simplified", 7); let content = /* @__PURE__ */ derived(() => characterSet() === "simplified" ? simplified() : traditional()); var div = root(); var div_1 = child(div); var node = child(div_1); FormattedContent(node, { get content() { return get(content); } }); reset(div_1); next(2); reset(div); template_effect(() => set_class(div, `${(loading() ? "loading" : "") ?? ""} svelte-1vevapp`)); append($$anchor, div); return pop({ get characterSet() { return characterSet(); }, set characterSet($$value) { characterSet($$value); flush_sync(); }, get loading() { return loading(); }, set loading($$value) { loading($$value); flush_sync(); }, get traditional() { return traditional(); }, set traditional($$value) { traditional($$value); flush_sync(); }, get simplified() { return simplified(); }, set simplified($$value) { simplified($$value); flush_sync(); } }); } customElements.define("plain-text-lesson-content", create_custom_element( LessonContent, { characterSet: {}, loading: {}, traditional: {}, simplified: {} }, [], [], false )); function lessonContentFactory(props) { const baseElement = document.createElement(lessonContentTag); const element = Object.assign( baseElement, props ); return element; } var CharSet = /* @__PURE__ */ ((CharSet2) => { CharSet2["simplified"] = "simplified"; CharSet2["traditional"] = "traditional"; return CharSet2; })(CharSet || {}); async function getCourseNavigation() { const element = await getBySelector(".course-navigation"); return { element }; } async function getLessonContainer() { const element = await getBySelector("#du-lesson-container"); return { element }; } async function getLessonContent() { const element = await getBySelector(".lesson-content"); const plainTextLessonContent = lessonContentFactory({ characterSet: CharSet.traditional, simplified: "", traditional: "", loading: true }); const lessonContent = { element, plainTextLessonContent }; return lessonContent; } async function getLessonTextContent(lessonContent, previous) { const textContent = await waitFor(() => { const canvasEls = [...lessonContent.element.querySelectorAll("canvas")]; const content = canvasEls.map((el) => el.textContent || "").join("").trim(); const hasChanged = content !== previous; if (content.includes("Loading") || !hasChanged) { return ""; } return content; }); return textContent; } async function getLessonFooter() { const element = await getBySelector(".du-lesson-footer"); return { element }; } async function getPageFooter() { const element = await getBySelector(".du-footer-fixed-bottom"); const characterSetToggleEl = element.querySelectorAll(".du-button-charset")[0]; const characterSetToggle = { element: characterSetToggleEl }; return { characterSetToggle, element }; } async function getLessonElements() { const [ courseNavigation, lessonContainer, lessonContent, lessonFooter, pageFooter ] = await Promise.all([ getCourseNavigation(), getLessonContainer(), getLessonContent(), getLessonFooter(), getPageFooter() ]); const lessonElements = { courseNavigation, lessonContainer, lessonContent, lessonFooter, pageFooter }; return lessonElements; } async function getSelectedCharSet(pageFooter) { const simplifiedIndicatorMatches = pageFooter.characterSetToggle.element.getElementsByClassName( "du-button-charset-sc" ); return simplifiedIndicatorMatches.length ? CharSet.simplified : CharSet.traditional; } async function applyPlainTextUI(lessonElements) { var _a; const characterSet = await getSelectedCharSet(lessonElements.pageFooter); lessonElements.lessonContent.plainTextLessonContent.characterSet = characterSet; onCharSetChange((e) => { lessonElements.lessonContent.plainTextLessonContent.characterSet = e.charSet; }, lessonElements.pageFooter); (_a = lessonElements.lessonContent.element.parentElement) == null ? void 0 : _a.replaceChild( lessonElements.lessonContent.plainTextLessonContent, lessonElements.lessonContent.element ); } async function onCharSetChange(fn, pageFooter) { pageFooter.characterSetToggle.element.addEventListener("click", async () => { const selectedCharSet = await getSelectedCharSet(pageFooter); fn({ charSet: selectedCharSet }); }); } async function onClassChange(element, callback) { const observer = new MutationObserver((mutations) => { const firstMutation = mutations[0]; const previousClassName = (firstMutation == null ? void 0 : firstMutation.oldValue) || ""; const nextClassName = element.className; callback(previousClassName, nextClassName); }); observer.observe(element, { attributes: true, attributeFilter: ["class"], attributeOldValue: true }); } let migakuClasses = []; async function manageMigakuBodyClasses() { const body = await getBySelector("body"); onClassChange(body, (prevClass, nextClass) => { new Set( prevClass.split(/\s+/).filter((value) => value) ); const nextClassNames = new Set( nextClass.split(/\s+/).filter((value) => value) ); if (nextClassNames.has( "-mgk-branch" /* BRANCH */ )) { migakuClasses = [...nextClassNames].filter( (className) => className.startsWith("-mgk") ); } else { [...migakuClasses].forEach((className) => { body.classList.add(className); }); } }); } function separateCharacterTypes(content) { const half = Math.floor(content.length / 2); const simplified = content.substring(0, half).trim(); const traditional = content.substring(half + 1).trim(); return { simplified, traditional }; } class Store { constructor(defaultState) { __publicField(this, "eventTarget"); __publicField(this, "state"); this.state = defaultState; this.eventTarget = new EventTarget(); this.eventTarget.addEventListener("setstate", (event) => { const updatedState = event.detail.callback(this.state); this.modifyState(updatedState); }); } getState() { return this.state; } onStateChange(callback) { this.eventTarget.addEventListener("statechange", (e) => { const event = e; callback(event); }); } setState(callback) { const event = new CustomEvent("setstate", { detail: { callback } }); this.eventTarget.dispatchEvent(event); } modifyState(state) { const event = new CustomEvent( "statechange", { detail: { previous: this.state, state } } ); this.state = state; this.eventTarget.dispatchEvent(event); } } const initialState = { characterSet: CharSet.traditional, loading: true, mounted: false, textContent: "" }; async function getReferences() { const lessonElements = await getLessonElements(); return { lessonElements }; } async function intialize() { const internal = { async mount() { if (this.mounted() || this.references) { return; } this.references = await getReferences(); onCharSetChange(({ charSet }) => { this.store.setState((state) => ({ ...state, charSet })); }, this.references.lessonElements.pageFooter); await applyPlainTextUI(this.references.lessonElements); this.store.setState((state) => ({ ...state, mounted: true })); await this.refresh(); }, mounted() { return this.store.getState().mounted; }, references: null, async refresh() { if (this.mounted() && this.references) { this.store.setState((state) => ({ ...state, loading: true })); const textContent = await getLessonTextContent( this.references.lessonElements.lessonContent, this.store.getState().textContent ); this.store.setState((state) => ({ ...state, loading: false, textContent })); } }, store: new Store(initialState), async unmount() { this.store.setState(() => { this.references = null; return initialState; }); } }; internal.store.onStateChange((event) => { const { previous, state } = event.detail; if (!state.mounted || !internal.references) return; if (previous.characterSet !== state.characterSet) { internal.references.lessonElements.lessonContent.plainTextLessonContent.characterSet = state.characterSet; } if (previous.textContent !== state.textContent) { const { simplified, traditional } = separateCharacterTypes( state.textContent ); internal.references.lessonElements.lessonContent.plainTextLessonContent.simplified = simplified; internal.references.lessonElements.lessonContent.plainTextLessonContent.traditional = traditional; } if (previous.loading !== state.loading) { internal.references.lessonElements.lessonContent.plainTextLessonContent.loading = state.loading; } }); return { mount: internal.mount.bind(internal), mounted: internal.mounted.bind(internal), refresh: internal.refresh.bind(internal), unmount: internal.unmount.bind(internal) }; } function isLessonPage(url) { try { const urlInst = new URL(url); const isLessonsPath = /^\/lessons\//.test(urlInst.pathname); const isChapter = urlInst.searchParams.has("chapter"); const isCourse = urlInst.searchParams.has("from"); return isLessonsPath && (isChapter || isCourse); } catch (e) { console.error(e); return false; } } async function main() { let currentUrl = ""; const { mount: mount2, mounted, refresh, unmount: unmount2 } = await intialize(); async function handleNavigate(url) { const isDupeNavigation = currentUrl === url; const toLessonPage = isLessonPage(url); if (isDupeNavigation) { return; } currentUrl = url; if (mounted() && toLessonPage) { await refresh(); } else if (mounted() && !toLessonPage) { await unmount2(); } else if (!mounted() && toLessonPage) { await mount2(); } } function handleNavigateEvent(e) { return handleNavigate(e.destination.url); } window.addEventListener("popstate", handleNavigateEvent); navigation.addEventListener("navigate", handleNavigateEvent); manageMigakuBodyClasses(); } main(); })();