6456 lines
187 KiB
JavaScript
6456 lines
187 KiB
JavaScript
/*
|
||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||
if you want to view the source, please visit the github repository of this plugin
|
||
*/
|
||
|
||
var __defProp = Object.defineProperty;
|
||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||
var __export = (target, all) => {
|
||
for (var name in all)
|
||
__defProp(target, name, { get: all[name], enumerable: true });
|
||
};
|
||
var __copyProps = (to, from, except, desc) => {
|
||
if (from && typeof from === "object" || typeof from === "function") {
|
||
for (let key2 of __getOwnPropNames(from))
|
||
if (!__hasOwnProp.call(to, key2) && key2 !== except)
|
||
__defProp(to, key2, { get: () => from[key2], enumerable: !(desc = __getOwnPropDesc(from, key2)) || desc.enumerable });
|
||
}
|
||
return to;
|
||
};
|
||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||
|
||
// src/main.ts
|
||
var main_exports = {};
|
||
__export(main_exports, {
|
||
default: () => MultiPropPlugin2
|
||
});
|
||
module.exports = __toCommonJS(main_exports);
|
||
var import_obsidian7 = require("obsidian");
|
||
|
||
// src/AddPropModal.ts
|
||
var import_obsidian2 = require("obsidian");
|
||
|
||
// node_modules/esm-env/dev-fallback.js
|
||
var node_env = globalThis.process?.env?.NODE_ENV;
|
||
var dev_fallback_default = node_env && !node_env.toLowerCase().startsWith("prod");
|
||
|
||
// node_modules/svelte/src/internal/shared/utils.js
|
||
var is_array = Array.isArray;
|
||
var index_of = Array.prototype.indexOf;
|
||
var array_from = Array.from;
|
||
var object_keys = Object.keys;
|
||
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 run_all(arr) {
|
||
for (var i = 0; i < arr.length; i++) {
|
||
arr[i]();
|
||
}
|
||
}
|
||
function deferred() {
|
||
var resolve;
|
||
var reject;
|
||
var promise = new Promise((res, rej) => {
|
||
resolve = res;
|
||
reject = rej;
|
||
});
|
||
return { promise, resolve, reject };
|
||
}
|
||
function to_array(value, n) {
|
||
if (Array.isArray(value)) {
|
||
return value;
|
||
}
|
||
if (n === void 0 || !(Symbol.iterator in value)) {
|
||
return Array.from(value);
|
||
}
|
||
const array = [];
|
||
for (const element2 of value) {
|
||
array.push(element2);
|
||
if (array.length === n) break;
|
||
}
|
||
return array;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/constants.js
|
||
var DERIVED = 1 << 1;
|
||
var EFFECT = 1 << 2;
|
||
var RENDER_EFFECT = 1 << 3;
|
||
var MANAGED_EFFECT = 1 << 24;
|
||
var BLOCK_EFFECT = 1 << 4;
|
||
var BRANCH_EFFECT = 1 << 5;
|
||
var ROOT_EFFECT = 1 << 6;
|
||
var BOUNDARY_EFFECT = 1 << 7;
|
||
var CONNECTED = 1 << 9;
|
||
var CLEAN = 1 << 10;
|
||
var DIRTY = 1 << 11;
|
||
var MAYBE_DIRTY = 1 << 12;
|
||
var INERT = 1 << 13;
|
||
var DESTROYED = 1 << 14;
|
||
var EFFECT_RAN = 1 << 15;
|
||
var EFFECT_TRANSPARENT = 1 << 16;
|
||
var EAGER_EFFECT = 1 << 17;
|
||
var HEAD_EFFECT = 1 << 18;
|
||
var EFFECT_PRESERVED = 1 << 19;
|
||
var USER_EFFECT = 1 << 20;
|
||
var EFFECT_OFFSCREEN = 1 << 25;
|
||
var WAS_MARKED = 1 << 15;
|
||
var REACTION_IS_UPDATING = 1 << 21;
|
||
var ASYNC = 1 << 22;
|
||
var ERROR_VALUE = 1 << 23;
|
||
var STATE_SYMBOL = Symbol("$state");
|
||
var LEGACY_PROPS = Symbol("legacy props");
|
||
var LOADING_ATTR_SYMBOL = Symbol("");
|
||
var PROXY_PATH_SYMBOL = Symbol("proxy path");
|
||
var STALE_REACTION = new class StaleReactionError extends Error {
|
||
name = "StaleReactionError";
|
||
message = "The reaction that called `getAbortSignal()` was re-run or destroyed";
|
||
}();
|
||
var TEXT_NODE = 3;
|
||
var COMMENT_NODE = 8;
|
||
|
||
// node_modules/svelte/src/internal/shared/errors.js
|
||
function lifecycle_outside_component(name) {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`lifecycle_outside_component
|
||
\`${name}(...)\` can only be used during component initialisation
|
||
https://svelte.dev/e/lifecycle_outside_component`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/lifecycle_outside_component`);
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/errors.js
|
||
function async_derived_orphan() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`async_derived_orphan
|
||
Cannot create a \`$derived(...)\` with an \`await\` expression outside of an effect tree
|
||
https://svelte.dev/e/async_derived_orphan`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/async_derived_orphan`);
|
||
}
|
||
}
|
||
function bind_invalid_checkbox_value() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`bind_invalid_checkbox_value
|
||
Using \`bind:value\` together with a checkbox input is not allowed. Use \`bind:checked\` instead
|
||
https://svelte.dev/e/bind_invalid_checkbox_value`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/bind_invalid_checkbox_value`);
|
||
}
|
||
}
|
||
function derived_references_self() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`derived_references_self
|
||
A derived value cannot reference itself recursively
|
||
https://svelte.dev/e/derived_references_self`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/derived_references_self`);
|
||
}
|
||
}
|
||
function effect_in_teardown(rune) {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`effect_in_teardown
|
||
\`${rune}\` cannot be used inside an effect cleanup function
|
||
https://svelte.dev/e/effect_in_teardown`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/effect_in_teardown`);
|
||
}
|
||
}
|
||
function effect_in_unowned_derived() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`effect_in_unowned_derived
|
||
Effect cannot be created inside a \`$derived\` value that was not itself created inside an effect
|
||
https://svelte.dev/e/effect_in_unowned_derived`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`);
|
||
}
|
||
}
|
||
function effect_orphan(rune) {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`effect_orphan
|
||
\`${rune}\` can only be used inside an effect (e.g. during component initialisation)
|
||
https://svelte.dev/e/effect_orphan`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/effect_orphan`);
|
||
}
|
||
}
|
||
function effect_update_depth_exceeded() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`effect_update_depth_exceeded
|
||
Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state
|
||
https://svelte.dev/e/effect_update_depth_exceeded`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`);
|
||
}
|
||
}
|
||
function hydration_failed() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`hydration_failed
|
||
Failed to hydrate the application
|
||
https://svelte.dev/e/hydration_failed`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/hydration_failed`);
|
||
}
|
||
}
|
||
function props_invalid_value(key2) {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`props_invalid_value
|
||
Cannot do \`bind:${key2}={undefined}\` when \`${key2}\` has a fallback value
|
||
https://svelte.dev/e/props_invalid_value`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/props_invalid_value`);
|
||
}
|
||
}
|
||
function rune_outside_svelte(rune) {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`rune_outside_svelte
|
||
The \`${rune}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files
|
||
https://svelte.dev/e/rune_outside_svelte`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/rune_outside_svelte`);
|
||
}
|
||
}
|
||
function state_descriptors_fixed() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`state_descriptors_fixed
|
||
Property descriptors defined on \`$state\` objects must contain \`value\` and always be \`enumerable\`, \`configurable\` and \`writable\`.
|
||
https://svelte.dev/e/state_descriptors_fixed`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/state_descriptors_fixed`);
|
||
}
|
||
}
|
||
function state_prototype_fixed() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`state_prototype_fixed
|
||
Cannot set prototype of \`$state\` object
|
||
https://svelte.dev/e/state_prototype_fixed`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/state_prototype_fixed`);
|
||
}
|
||
}
|
||
function state_unsafe_mutation() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`state_unsafe_mutation
|
||
Updating state inside \`$derived(...)\`, \`$inspect(...)\` or a template expression is forbidden. If the value should not be reactive, declare it without \`$state\`
|
||
https://svelte.dev/e/state_unsafe_mutation`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/state_unsafe_mutation`);
|
||
}
|
||
}
|
||
function svelte_boundary_reset_onerror() {
|
||
if (dev_fallback_default) {
|
||
const error = new Error(`svelte_boundary_reset_onerror
|
||
A \`<svelte:boundary>\` \`reset\` function cannot be called while an error is still being handled
|
||
https://svelte.dev/e/svelte_boundary_reset_onerror`);
|
||
error.name = "Svelte error";
|
||
throw error;
|
||
} else {
|
||
throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`);
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/constants.js
|
||
var EACH_ITEM_REACTIVE = 1;
|
||
var EACH_INDEX_REACTIVE = 1 << 1;
|
||
var EACH_IS_CONTROLLED = 1 << 2;
|
||
var EACH_IS_ANIMATED = 1 << 3;
|
||
var EACH_ITEM_IMMUTABLE = 1 << 4;
|
||
var PROPS_IS_IMMUTABLE = 1;
|
||
var PROPS_IS_RUNES = 1 << 1;
|
||
var PROPS_IS_UPDATED = 1 << 2;
|
||
var PROPS_IS_BINDABLE = 1 << 3;
|
||
var PROPS_IS_LAZY_INITIAL = 1 << 4;
|
||
var TRANSITION_OUT = 1 << 1;
|
||
var TRANSITION_GLOBAL = 1 << 2;
|
||
var TEMPLATE_FRAGMENT = 1;
|
||
var TEMPLATE_USE_IMPORT_NODE = 1 << 1;
|
||
var TEMPLATE_USE_SVG = 1 << 2;
|
||
var TEMPLATE_USE_MATHML = 1 << 3;
|
||
var HYDRATION_START = "[";
|
||
var HYDRATION_START_ELSE = "[!";
|
||
var HYDRATION_END = "]";
|
||
var HYDRATION_ERROR = {};
|
||
var ELEMENT_PRESERVE_ATTRIBUTE_CASE = 1 << 1;
|
||
var ELEMENT_IS_INPUT = 1 << 2;
|
||
var UNINITIALIZED = Symbol();
|
||
var FILENAME = Symbol("filename");
|
||
var HMR = Symbol("hmr");
|
||
var NAMESPACE_HTML = "http://www.w3.org/1999/xhtml";
|
||
|
||
// node_modules/svelte/src/internal/client/warnings.js
|
||
var bold = "font-weight: bold";
|
||
var normal = "font-weight: normal";
|
||
function await_waterfall(name, location) {
|
||
if (dev_fallback_default) {
|
||
console.warn(`%c[svelte] await_waterfall
|
||
%cAn async derived, \`${name}\` (${location}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app
|
||
https://svelte.dev/e/await_waterfall`, bold, normal);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/await_waterfall`);
|
||
}
|
||
}
|
||
function hydration_attribute_changed(attribute, html2, value) {
|
||
if (dev_fallback_default) {
|
||
console.warn(`%c[svelte] hydration_attribute_changed
|
||
%cThe \`${attribute}\` attribute on \`${html2}\` changed its value between server and client renders. The client value, \`${value}\`, will be ignored in favour of the server value
|
||
https://svelte.dev/e/hydration_attribute_changed`, bold, normal);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/hydration_attribute_changed`);
|
||
}
|
||
}
|
||
function hydration_mismatch(location) {
|
||
if (dev_fallback_default) {
|
||
console.warn(
|
||
`%c[svelte] hydration_mismatch
|
||
%c${location ? `Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${location}` : "Hydration failed because the initial UI does not match what was rendered on the server"}
|
||
https://svelte.dev/e/hydration_mismatch`,
|
||
bold,
|
||
normal
|
||
);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/hydration_mismatch`);
|
||
}
|
||
}
|
||
function lifecycle_double_unmount() {
|
||
if (dev_fallback_default) {
|
||
console.warn(`%c[svelte] lifecycle_double_unmount
|
||
%cTried to unmount a component that was not mounted
|
||
https://svelte.dev/e/lifecycle_double_unmount`, bold, normal);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/lifecycle_double_unmount`);
|
||
}
|
||
}
|
||
function select_multiple_invalid_value() {
|
||
if (dev_fallback_default) {
|
||
console.warn(`%c[svelte] select_multiple_invalid_value
|
||
%cThe \`value\` property of a \`<select multiple>\` element should be an array, but it received a non-array value. The selection will be kept as is.
|
||
https://svelte.dev/e/select_multiple_invalid_value`, bold, normal);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/select_multiple_invalid_value`);
|
||
}
|
||
}
|
||
function state_proxy_equality_mismatch(operator) {
|
||
if (dev_fallback_default) {
|
||
console.warn(`%c[svelte] state_proxy_equality_mismatch
|
||
%cReactive \`$state(...)\` proxies and the values they proxy have different identities. Because of this, comparisons with \`${operator}\` will produce unexpected results
|
||
https://svelte.dev/e/state_proxy_equality_mismatch`, bold, normal);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/state_proxy_equality_mismatch`);
|
||
}
|
||
}
|
||
function state_proxy_unmount() {
|
||
if (dev_fallback_default) {
|
||
console.warn(`%c[svelte] state_proxy_unmount
|
||
%cTried to unmount a state proxy, rather than a component
|
||
https://svelte.dev/e/state_proxy_unmount`, bold, normal);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/state_proxy_unmount`);
|
||
}
|
||
}
|
||
function svelte_boundary_reset_noop() {
|
||
if (dev_fallback_default) {
|
||
console.warn(`%c[svelte] svelte_boundary_reset_noop
|
||
%cA \`<svelte:boundary>\` \`reset\` function only resets the boundary the first time it is called
|
||
https://svelte.dev/e/svelte_boundary_reset_noop`, bold, normal);
|
||
} else {
|
||
console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`);
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/hydration.js
|
||
var hydrating = false;
|
||
function set_hydrating(value) {
|
||
hydrating = value;
|
||
}
|
||
var 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(get_next_sibling(hydrate_node));
|
||
}
|
||
function reset(node) {
|
||
if (!hydrating) return;
|
||
if (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} */
|
||
get_next_sibling(node);
|
||
}
|
||
hydrate_node = node;
|
||
}
|
||
}
|
||
function skip_nodes(remove = true) {
|
||
var depth = 0;
|
||
var node = hydrate_node;
|
||
while (true) {
|
||
if (node.nodeType === COMMENT_NODE) {
|
||
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} */
|
||
get_next_sibling(node)
|
||
);
|
||
if (remove) node.remove();
|
||
node = next2;
|
||
}
|
||
}
|
||
function read_hydration_instruction(node) {
|
||
if (!node || node.nodeType !== COMMENT_NODE) {
|
||
hydration_mismatch();
|
||
throw HYDRATION_ERROR;
|
||
}
|
||
return (
|
||
/** @type {Comment} */
|
||
node.data
|
||
);
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/equality.js
|
||
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);
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/flags/index.js
|
||
var async_mode_flag = false;
|
||
var legacy_mode_flag = false;
|
||
var tracing_mode_flag = false;
|
||
|
||
// node_modules/svelte/src/internal/client/dev/tracing.js
|
||
var tracing_expressions = null;
|
||
function tag(source2, label) {
|
||
source2.label = label;
|
||
tag_proxy(source2.v, label);
|
||
return source2;
|
||
}
|
||
function tag_proxy(value, label) {
|
||
value?.[PROXY_PATH_SYMBOL]?.(label);
|
||
return value;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/shared/dev.js
|
||
function get_error(label) {
|
||
const error = new Error();
|
||
const stack2 = get_stack();
|
||
if (stack2.length === 0) {
|
||
return null;
|
||
}
|
||
stack2.unshift("\n");
|
||
define_property(error, "stack", {
|
||
value: stack2.join("\n")
|
||
});
|
||
define_property(error, "name", {
|
||
value: label
|
||
});
|
||
return (
|
||
/** @type {Error & { stack: string }} */
|
||
error
|
||
);
|
||
}
|
||
function get_stack() {
|
||
const limit = Error.stackTraceLimit;
|
||
Error.stackTraceLimit = Infinity;
|
||
const stack2 = new Error().stack;
|
||
Error.stackTraceLimit = limit;
|
||
if (!stack2) return [];
|
||
const lines = stack2.split("\n");
|
||
const new_lines = [];
|
||
for (let i = 0; i < lines.length; i++) {
|
||
const line = lines[i];
|
||
const posixified = line.replaceAll("\\", "/");
|
||
if (line.trim() === "Error") {
|
||
continue;
|
||
}
|
||
if (line.includes("validate_each_keys")) {
|
||
return [];
|
||
}
|
||
if (posixified.includes("svelte/src/internal") || posixified.includes("node_modules/.vite")) {
|
||
continue;
|
||
}
|
||
new_lines.push(line);
|
||
}
|
||
return new_lines;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/context.js
|
||
var component_context = null;
|
||
function set_component_context(context) {
|
||
component_context = context;
|
||
}
|
||
var dev_stack = null;
|
||
function set_dev_stack(stack2) {
|
||
dev_stack = stack2;
|
||
}
|
||
var dev_current_component_function = null;
|
||
function set_dev_current_component_function(fn) {
|
||
dev_current_component_function = fn;
|
||
}
|
||
function push(props, runes = false, fn) {
|
||
component_context = {
|
||
p: component_context,
|
||
i: false,
|
||
c: null,
|
||
e: null,
|
||
s: props,
|
||
x: null,
|
||
l: legacy_mode_flag && !runes ? { s: null, u: null, $: [] } : null
|
||
};
|
||
if (dev_fallback_default) {
|
||
component_context.function = fn;
|
||
dev_current_component_function = fn;
|
||
}
|
||
}
|
||
function pop(component2) {
|
||
var context = (
|
||
/** @type {ComponentContext} */
|
||
component_context
|
||
);
|
||
var effects = context.e;
|
||
if (effects !== null) {
|
||
context.e = null;
|
||
for (var fn of effects) {
|
||
create_user_effect(fn);
|
||
}
|
||
}
|
||
if (component2 !== void 0) {
|
||
context.x = component2;
|
||
}
|
||
context.i = true;
|
||
component_context = context.p;
|
||
if (dev_fallback_default) {
|
||
dev_current_component_function = component_context?.function ?? null;
|
||
}
|
||
return component2 ?? /** @type {T} */
|
||
{};
|
||
}
|
||
function is_runes() {
|
||
return !legacy_mode_flag || component_context !== null && component_context.l === null;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/task.js
|
||
var 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 && !is_flushing_sync) {
|
||
var tasks = micro_tasks;
|
||
queueMicrotask(() => {
|
||
if (tasks === micro_tasks) run_micro_tasks();
|
||
});
|
||
}
|
||
micro_tasks.push(fn);
|
||
}
|
||
function flush_tasks() {
|
||
while (micro_tasks.length > 0) {
|
||
run_micro_tasks();
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/error-handling.js
|
||
var adjustments = /* @__PURE__ */ new WeakMap();
|
||
function handle_error(error) {
|
||
var effect2 = active_effect;
|
||
if (effect2 === null) {
|
||
active_reaction.f |= ERROR_VALUE;
|
||
return error;
|
||
}
|
||
if (dev_fallback_default && error instanceof Error && !adjustments.has(error)) {
|
||
adjustments.set(error, get_adjustments(error, effect2));
|
||
}
|
||
if ((effect2.f & EFFECT_RAN) === 0) {
|
||
if ((effect2.f & BOUNDARY_EFFECT) === 0) {
|
||
if (dev_fallback_default && !effect2.parent && error instanceof Error) {
|
||
apply_adjustments(error);
|
||
}
|
||
throw error;
|
||
}
|
||
effect2.b.error(error);
|
||
} else {
|
||
invoke_error_boundary(error, effect2);
|
||
}
|
||
}
|
||
function invoke_error_boundary(error, effect2) {
|
||
while (effect2 !== null) {
|
||
if ((effect2.f & BOUNDARY_EFFECT) !== 0) {
|
||
try {
|
||
effect2.b.error(error);
|
||
return;
|
||
} catch (e) {
|
||
error = e;
|
||
}
|
||
}
|
||
effect2 = effect2.parent;
|
||
}
|
||
if (dev_fallback_default && error instanceof Error) {
|
||
apply_adjustments(error);
|
||
}
|
||
throw error;
|
||
}
|
||
function get_adjustments(error, effect2) {
|
||
const message_descriptor = get_descriptor(error, "message");
|
||
if (message_descriptor && !message_descriptor.configurable) return;
|
||
var indent = is_firefox ? " " : " ";
|
||
var component_stack = `
|
||
${indent}in ${effect2.fn?.name || "<unknown>"}`;
|
||
var context = effect2.ctx;
|
||
while (context !== null) {
|
||
component_stack += `
|
||
${indent}in ${context.function?.[FILENAME].split("/").pop()}`;
|
||
context = context.p;
|
||
}
|
||
return {
|
||
message: error.message + `
|
||
${component_stack}
|
||
`,
|
||
stack: error.stack?.split("\n").filter((line) => !line.includes("svelte/src/internal")).join("\n")
|
||
};
|
||
}
|
||
function apply_adjustments(error) {
|
||
const adjusted = adjustments.get(error);
|
||
if (adjusted) {
|
||
define_property(error, "message", {
|
||
value: adjusted.message
|
||
});
|
||
define_property(error, "stack", {
|
||
value: adjusted.stack
|
||
});
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/batch.js
|
||
var batches = /* @__PURE__ */ new Set();
|
||
var current_batch = null;
|
||
var previous_batch = null;
|
||
var batch_values = null;
|
||
var queued_root_effects = [];
|
||
var last_scheduled_effect = null;
|
||
var is_flushing = false;
|
||
var is_flushing_sync = false;
|
||
var Batch = class _Batch {
|
||
committed = false;
|
||
/**
|
||
* The current values of any sources that are updated in this batch
|
||
* They keys of this map are identical to `this.#previous`
|
||
* @type {Map<Source, any>}
|
||
*/
|
||
current = /* @__PURE__ */ new Map();
|
||
/**
|
||
* The values of any sources that are updated in this batch _before_ those updates took place.
|
||
* They keys of this map are identical to `this.#current`
|
||
* @type {Map<Source, any>}
|
||
*/
|
||
previous = /* @__PURE__ */ new Map();
|
||
/**
|
||
* When the batch is committed (and the DOM is updated), we need to remove old branches
|
||
* and append new ones by calling the functions added inside (if/each/key/etc) blocks
|
||
* @type {Set<() => void>}
|
||
*/
|
||
#commit_callbacks = /* @__PURE__ */ new Set();
|
||
/**
|
||
* If a fork is discarded, we need to destroy any effects that are no longer needed
|
||
* @type {Set<(batch: Batch) => void>}
|
||
*/
|
||
#discard_callbacks = /* @__PURE__ */ new Set();
|
||
/**
|
||
* The number of async effects that are currently in flight
|
||
*/
|
||
#pending = 0;
|
||
/**
|
||
* The number of async effects that are currently in flight, _not_ inside a pending boundary
|
||
*/
|
||
#blocking_pending = 0;
|
||
/**
|
||
* A deferred that resolves when the batch is committed, used with `settled()`
|
||
* TODO replace with Promise.withResolvers once supported widely enough
|
||
* @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null}
|
||
*/
|
||
#deferred = null;
|
||
/**
|
||
* Deferred effects (which run after async work has completed) that are DIRTY
|
||
* @type {Effect[]}
|
||
*/
|
||
#dirty_effects = [];
|
||
/**
|
||
* Deferred effects that are MAYBE_DIRTY
|
||
* @type {Effect[]}
|
||
*/
|
||
#maybe_dirty_effects = [];
|
||
/**
|
||
* A set of branches that still exist, but will be destroyed when this batch
|
||
* is committed — we skip over these during `process`
|
||
* @type {Set<Effect>}
|
||
*/
|
||
skipped_effects = /* @__PURE__ */ new Set();
|
||
is_fork = false;
|
||
is_deferred() {
|
||
return this.is_fork || this.#blocking_pending > 0;
|
||
}
|
||
/**
|
||
*
|
||
* @param {Effect[]} root_effects
|
||
*/
|
||
process(root_effects) {
|
||
queued_root_effects = [];
|
||
previous_batch = null;
|
||
this.apply();
|
||
var target = {
|
||
parent: null,
|
||
effect: null,
|
||
effects: [],
|
||
render_effects: [],
|
||
block_effects: []
|
||
};
|
||
for (const root6 of root_effects) {
|
||
this.#traverse_effect_tree(root6, target);
|
||
}
|
||
if (!this.is_fork) {
|
||
this.#resolve();
|
||
}
|
||
if (this.is_deferred()) {
|
||
this.#defer_effects(target.effects);
|
||
this.#defer_effects(target.render_effects);
|
||
this.#defer_effects(target.block_effects);
|
||
} else {
|
||
previous_batch = this;
|
||
current_batch = null;
|
||
flush_queued_effects(target.render_effects);
|
||
flush_queued_effects(target.effects);
|
||
previous_batch = null;
|
||
this.#deferred?.resolve();
|
||
}
|
||
batch_values = null;
|
||
}
|
||
/**
|
||
* Traverse the effect tree, executing effects or stashing
|
||
* them for later execution as appropriate
|
||
* @param {Effect} root
|
||
* @param {EffectTarget} target
|
||
*/
|
||
#traverse_effect_tree(root6, target) {
|
||
root6.f ^= CLEAN;
|
||
var effect2 = root6.first;
|
||
while (effect2 !== null) {
|
||
var flags2 = effect2.f;
|
||
var is_branch = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0;
|
||
var is_skippable_branch = is_branch && (flags2 & CLEAN) !== 0;
|
||
var skip = is_skippable_branch || (flags2 & INERT) !== 0 || this.skipped_effects.has(effect2);
|
||
if ((effect2.f & BOUNDARY_EFFECT) !== 0 && effect2.b?.is_pending()) {
|
||
target = {
|
||
parent: target,
|
||
effect: effect2,
|
||
effects: [],
|
||
render_effects: [],
|
||
block_effects: []
|
||
};
|
||
}
|
||
if (!skip && effect2.fn !== null) {
|
||
if (is_branch) {
|
||
effect2.f ^= CLEAN;
|
||
} else if ((flags2 & EFFECT) !== 0) {
|
||
target.effects.push(effect2);
|
||
} else if (async_mode_flag && (flags2 & (RENDER_EFFECT | MANAGED_EFFECT)) !== 0) {
|
||
target.render_effects.push(effect2);
|
||
} else if (is_dirty(effect2)) {
|
||
if ((effect2.f & BLOCK_EFFECT) !== 0) target.block_effects.push(effect2);
|
||
update_effect(effect2);
|
||
}
|
||
var child2 = effect2.first;
|
||
if (child2 !== null) {
|
||
effect2 = child2;
|
||
continue;
|
||
}
|
||
}
|
||
var parent = effect2.parent;
|
||
effect2 = effect2.next;
|
||
while (effect2 === null && parent !== null) {
|
||
if (parent === target.effect) {
|
||
this.#defer_effects(target.effects);
|
||
this.#defer_effects(target.render_effects);
|
||
this.#defer_effects(target.block_effects);
|
||
target = /** @type {EffectTarget} */
|
||
target.parent;
|
||
}
|
||
effect2 = parent.next;
|
||
parent = parent.parent;
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* @param {Effect[]} effects
|
||
*/
|
||
#defer_effects(effects) {
|
||
for (const e of effects) {
|
||
const target = (e.f & DIRTY) !== 0 ? this.#dirty_effects : this.#maybe_dirty_effects;
|
||
target.push(e);
|
||
this.#clear_marked(e.deps);
|
||
set_signal_status(e, CLEAN);
|
||
}
|
||
}
|
||
/**
|
||
* @param {Value[] | null} deps
|
||
*/
|
||
#clear_marked(deps) {
|
||
if (deps === null) return;
|
||
for (const dep of deps) {
|
||
if ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) {
|
||
continue;
|
||
}
|
||
dep.f ^= WAS_MARKED;
|
||
this.#clear_marked(
|
||
/** @type {Derived} */
|
||
dep.deps
|
||
);
|
||
}
|
||
}
|
||
/**
|
||
* Associate a change to a given source with the current
|
||
* batch, noting its previous and current values
|
||
* @param {Source} source
|
||
* @param {any} value
|
||
*/
|
||
capture(source2, value) {
|
||
if (!this.previous.has(source2)) {
|
||
this.previous.set(source2, value);
|
||
}
|
||
if ((source2.f & ERROR_VALUE) === 0) {
|
||
this.current.set(source2, source2.v);
|
||
batch_values?.set(source2, source2.v);
|
||
}
|
||
}
|
||
activate() {
|
||
current_batch = this;
|
||
this.apply();
|
||
}
|
||
deactivate() {
|
||
if (current_batch !== this) return;
|
||
current_batch = null;
|
||
batch_values = null;
|
||
}
|
||
flush() {
|
||
this.activate();
|
||
if (queued_root_effects.length > 0) {
|
||
flush_effects();
|
||
if (current_batch !== null && current_batch !== this) {
|
||
return;
|
||
}
|
||
} else if (this.#pending === 0) {
|
||
this.process([]);
|
||
}
|
||
this.deactivate();
|
||
}
|
||
discard() {
|
||
for (const fn of this.#discard_callbacks) fn(this);
|
||
this.#discard_callbacks.clear();
|
||
}
|
||
#resolve() {
|
||
if (this.#blocking_pending === 0) {
|
||
for (const fn of this.#commit_callbacks) fn();
|
||
this.#commit_callbacks.clear();
|
||
}
|
||
if (this.#pending === 0) {
|
||
this.#commit();
|
||
}
|
||
}
|
||
#commit() {
|
||
if (batches.size > 1) {
|
||
this.previous.clear();
|
||
var previous_batch_values = batch_values;
|
||
var is_earlier = true;
|
||
var dummy_target = {
|
||
parent: null,
|
||
effect: null,
|
||
effects: [],
|
||
render_effects: [],
|
||
block_effects: []
|
||
};
|
||
for (const batch of batches) {
|
||
if (batch === this) {
|
||
is_earlier = false;
|
||
continue;
|
||
}
|
||
const sources = [];
|
||
for (const [source2, value] of this.current) {
|
||
if (batch.current.has(source2)) {
|
||
if (is_earlier && value !== batch.current.get(source2)) {
|
||
batch.current.set(source2, value);
|
||
} else {
|
||
continue;
|
||
}
|
||
}
|
||
sources.push(source2);
|
||
}
|
||
if (sources.length === 0) {
|
||
continue;
|
||
}
|
||
const others = [...batch.current.keys()].filter((s) => !this.current.has(s));
|
||
if (others.length > 0) {
|
||
var prev_queued_root_effects = queued_root_effects;
|
||
queued_root_effects = [];
|
||
const marked = /* @__PURE__ */ new Set();
|
||
const checked = /* @__PURE__ */ new Map();
|
||
for (const source2 of sources) {
|
||
mark_effects(source2, others, marked, checked);
|
||
}
|
||
if (queued_root_effects.length > 0) {
|
||
current_batch = batch;
|
||
batch.apply();
|
||
for (const root6 of queued_root_effects) {
|
||
batch.#traverse_effect_tree(root6, dummy_target);
|
||
}
|
||
batch.deactivate();
|
||
}
|
||
queued_root_effects = prev_queued_root_effects;
|
||
}
|
||
}
|
||
current_batch = null;
|
||
batch_values = previous_batch_values;
|
||
}
|
||
this.committed = true;
|
||
batches.delete(this);
|
||
}
|
||
/**
|
||
*
|
||
* @param {boolean} blocking
|
||
*/
|
||
increment(blocking) {
|
||
this.#pending += 1;
|
||
if (blocking) this.#blocking_pending += 1;
|
||
}
|
||
/**
|
||
*
|
||
* @param {boolean} blocking
|
||
*/
|
||
decrement(blocking) {
|
||
this.#pending -= 1;
|
||
if (blocking) this.#blocking_pending -= 1;
|
||
this.revive();
|
||
}
|
||
revive() {
|
||
for (const e of this.#dirty_effects) {
|
||
set_signal_status(e, DIRTY);
|
||
schedule_effect(e);
|
||
}
|
||
for (const e of this.#maybe_dirty_effects) {
|
||
set_signal_status(e, MAYBE_DIRTY);
|
||
schedule_effect(e);
|
||
}
|
||
this.#dirty_effects = [];
|
||
this.#maybe_dirty_effects = [];
|
||
this.flush();
|
||
}
|
||
/** @param {() => void} fn */
|
||
oncommit(fn) {
|
||
this.#commit_callbacks.add(fn);
|
||
}
|
||
/** @param {(batch: Batch) => void} fn */
|
||
ondiscard(fn) {
|
||
this.#discard_callbacks.add(fn);
|
||
}
|
||
settled() {
|
||
return (this.#deferred ??= deferred()).promise;
|
||
}
|
||
static ensure() {
|
||
if (current_batch === null) {
|
||
const batch = current_batch = new _Batch();
|
||
batches.add(current_batch);
|
||
if (!is_flushing_sync) {
|
||
_Batch.enqueue(() => {
|
||
if (current_batch !== batch) {
|
||
return;
|
||
}
|
||
batch.flush();
|
||
});
|
||
}
|
||
}
|
||
return current_batch;
|
||
}
|
||
/** @param {() => void} task */
|
||
static enqueue(task) {
|
||
queue_micro_task(task);
|
||
}
|
||
apply() {
|
||
if (!async_mode_flag || !this.is_fork && batches.size === 1) return;
|
||
batch_values = new Map(this.current);
|
||
for (const batch of batches) {
|
||
if (batch === this) continue;
|
||
for (const [source2, previous] of batch.previous) {
|
||
if (!batch_values.has(source2)) {
|
||
batch_values.set(source2, previous);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
function flushSync(fn) {
|
||
var was_flushing_sync = is_flushing_sync;
|
||
is_flushing_sync = true;
|
||
try {
|
||
var result;
|
||
if (fn) {
|
||
if (current_batch !== null) {
|
||
flush_effects();
|
||
}
|
||
result = fn();
|
||
}
|
||
while (true) {
|
||
flush_tasks();
|
||
if (queued_root_effects.length === 0) {
|
||
current_batch?.flush();
|
||
if (queued_root_effects.length === 0) {
|
||
last_scheduled_effect = null;
|
||
return (
|
||
/** @type {T} */
|
||
result
|
||
);
|
||
}
|
||
}
|
||
flush_effects();
|
||
}
|
||
} finally {
|
||
is_flushing_sync = was_flushing_sync;
|
||
}
|
||
}
|
||
function flush_effects() {
|
||
var was_updating_effect = is_updating_effect;
|
||
is_flushing = true;
|
||
var source_stacks = dev_fallback_default ? /* @__PURE__ */ new Set() : null;
|
||
try {
|
||
var flush_count = 0;
|
||
set_is_updating_effect(true);
|
||
while (queued_root_effects.length > 0) {
|
||
var batch = Batch.ensure();
|
||
if (flush_count++ > 1e3) {
|
||
if (dev_fallback_default) {
|
||
var updates = /* @__PURE__ */ new Map();
|
||
for (const source2 of batch.current.keys()) {
|
||
for (const [stack2, update2] of source2.updated ?? []) {
|
||
var entry = updates.get(stack2);
|
||
if (!entry) {
|
||
entry = { error: update2.error, count: 0 };
|
||
updates.set(stack2, entry);
|
||
}
|
||
entry.count += update2.count;
|
||
}
|
||
}
|
||
for (const update2 of updates.values()) {
|
||
if (update2.error) {
|
||
console.error(update2.error);
|
||
}
|
||
}
|
||
}
|
||
infinite_loop_guard();
|
||
}
|
||
batch.process(queued_root_effects);
|
||
old_values.clear();
|
||
if (dev_fallback_default) {
|
||
for (const source2 of batch.current.keys()) {
|
||
source_stacks.add(source2);
|
||
}
|
||
}
|
||
}
|
||
} finally {
|
||
is_flushing = false;
|
||
set_is_updating_effect(was_updating_effect);
|
||
last_scheduled_effect = null;
|
||
if (dev_fallback_default) {
|
||
for (
|
||
const source2 of
|
||
/** @type {Set<Source>} */
|
||
source_stacks
|
||
) {
|
||
source2.updated = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function infinite_loop_guard() {
|
||
try {
|
||
effect_update_depth_exceeded();
|
||
} catch (error) {
|
||
if (dev_fallback_default) {
|
||
define_property(error, "stack", { value: "" });
|
||
}
|
||
invoke_error_boundary(error, last_scheduled_effect);
|
||
}
|
||
}
|
||
var eager_block_effects = null;
|
||
function flush_queued_effects(effects) {
|
||
var length = effects.length;
|
||
if (length === 0) return;
|
||
var i = 0;
|
||
while (i < length) {
|
||
var effect2 = effects[i++];
|
||
if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) {
|
||
eager_block_effects = /* @__PURE__ */ new Set();
|
||
update_effect(effect2);
|
||
if (effect2.deps === null && effect2.first === null && effect2.nodes === null) {
|
||
if (effect2.teardown === null && effect2.ac === null) {
|
||
unlink_effect(effect2);
|
||
} else {
|
||
effect2.fn = null;
|
||
}
|
||
}
|
||
if (eager_block_effects?.size > 0) {
|
||
old_values.clear();
|
||
for (const e of eager_block_effects) {
|
||
if ((e.f & (DESTROYED | INERT)) !== 0) continue;
|
||
const ordered_effects = [e];
|
||
let ancestor = e.parent;
|
||
while (ancestor !== null) {
|
||
if (eager_block_effects.has(ancestor)) {
|
||
eager_block_effects.delete(ancestor);
|
||
ordered_effects.push(ancestor);
|
||
}
|
||
ancestor = ancestor.parent;
|
||
}
|
||
for (let j = ordered_effects.length - 1; j >= 0; j--) {
|
||
const e2 = ordered_effects[j];
|
||
if ((e2.f & (DESTROYED | INERT)) !== 0) continue;
|
||
update_effect(e2);
|
||
}
|
||
}
|
||
eager_block_effects.clear();
|
||
}
|
||
}
|
||
}
|
||
eager_block_effects = null;
|
||
}
|
||
function mark_effects(value, sources, marked, checked) {
|
||
if (marked.has(value)) return;
|
||
marked.add(value);
|
||
if (value.reactions !== null) {
|
||
for (const reaction of value.reactions) {
|
||
const flags2 = reaction.f;
|
||
if ((flags2 & DERIVED) !== 0) {
|
||
mark_effects(
|
||
/** @type {Derived} */
|
||
reaction,
|
||
sources,
|
||
marked,
|
||
checked
|
||
);
|
||
} else if ((flags2 & (ASYNC | BLOCK_EFFECT)) !== 0 && (flags2 & DIRTY) === 0 && depends_on(reaction, sources, checked)) {
|
||
set_signal_status(reaction, DIRTY);
|
||
schedule_effect(
|
||
/** @type {Effect} */
|
||
reaction
|
||
);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function depends_on(reaction, sources, checked) {
|
||
const depends = checked.get(reaction);
|
||
if (depends !== void 0) return depends;
|
||
if (reaction.deps !== null) {
|
||
for (const dep of reaction.deps) {
|
||
if (sources.includes(dep)) {
|
||
return true;
|
||
}
|
||
if ((dep.f & DERIVED) !== 0 && depends_on(
|
||
/** @type {Derived} */
|
||
dep,
|
||
sources,
|
||
checked
|
||
)) {
|
||
checked.set(
|
||
/** @type {Derived} */
|
||
dep,
|
||
true
|
||
);
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
checked.set(reaction, false);
|
||
return false;
|
||
}
|
||
function schedule_effect(signal) {
|
||
var effect2 = last_scheduled_effect = signal;
|
||
while (effect2.parent !== null) {
|
||
effect2 = effect2.parent;
|
||
var flags2 = effect2.f;
|
||
if (is_flushing && effect2 === active_effect && (flags2 & BLOCK_EFFECT) !== 0 && (flags2 & HEAD_EFFECT) === 0) {
|
||
return;
|
||
}
|
||
if ((flags2 & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) {
|
||
if ((flags2 & CLEAN) === 0) return;
|
||
effect2.f ^= CLEAN;
|
||
}
|
||
}
|
||
queued_root_effects.push(effect2);
|
||
}
|
||
|
||
// node_modules/svelte/src/reactivity/create-subscriber.js
|
||
function createSubscriber(start) {
|
||
let subscribers = 0;
|
||
let version = source(0);
|
||
let stop;
|
||
if (dev_fallback_default) {
|
||
tag(version, "createSubscriber version");
|
||
}
|
||
return () => {
|
||
if (effect_tracking()) {
|
||
get(version);
|
||
render_effect(() => {
|
||
if (subscribers === 0) {
|
||
stop = untrack(() => start(() => increment(version)));
|
||
}
|
||
subscribers += 1;
|
||
return () => {
|
||
queue_micro_task(() => {
|
||
subscribers -= 1;
|
||
if (subscribers === 0) {
|
||
stop?.();
|
||
stop = void 0;
|
||
increment(version);
|
||
}
|
||
});
|
||
};
|
||
});
|
||
}
|
||
};
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/blocks/boundary.js
|
||
var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED | BOUNDARY_EFFECT;
|
||
function boundary(node, props, children) {
|
||
new Boundary(node, props, children);
|
||
}
|
||
var Boundary = class {
|
||
/** @type {Boundary | null} */
|
||
parent;
|
||
#pending = false;
|
||
/** @type {TemplateNode} */
|
||
#anchor;
|
||
/** @type {TemplateNode | null} */
|
||
#hydrate_open = hydrating ? hydrate_node : null;
|
||
/** @type {BoundaryProps} */
|
||
#props;
|
||
/** @type {((anchor: Node) => void)} */
|
||
#children;
|
||
/** @type {Effect} */
|
||
#effect;
|
||
/** @type {Effect | null} */
|
||
#main_effect = null;
|
||
/** @type {Effect | null} */
|
||
#pending_effect = null;
|
||
/** @type {Effect | null} */
|
||
#failed_effect = null;
|
||
/** @type {DocumentFragment | null} */
|
||
#offscreen_fragment = null;
|
||
/** @type {TemplateNode | null} */
|
||
#pending_anchor = null;
|
||
#local_pending_count = 0;
|
||
#pending_count = 0;
|
||
#is_creating_fallback = false;
|
||
/**
|
||
* A source containing the number of pending async deriveds/expressions.
|
||
* Only created if `$effect.pending()` is used inside the boundary,
|
||
* otherwise updating the source results in needless `Batch.ensure()`
|
||
* calls followed by no-op flushes
|
||
* @type {Source<number> | null}
|
||
*/
|
||
#effect_pending = null;
|
||
#effect_pending_subscriber = createSubscriber(() => {
|
||
this.#effect_pending = source(this.#local_pending_count);
|
||
if (dev_fallback_default) {
|
||
tag(this.#effect_pending, "$effect.pending()");
|
||
}
|
||
return () => {
|
||
this.#effect_pending = null;
|
||
};
|
||
});
|
||
/**
|
||
* @param {TemplateNode} node
|
||
* @param {BoundaryProps} props
|
||
* @param {((anchor: Node) => void)} children
|
||
*/
|
||
constructor(node, props, children) {
|
||
this.#anchor = node;
|
||
this.#props = props;
|
||
this.#children = children;
|
||
this.parent = /** @type {Effect} */
|
||
active_effect.b;
|
||
this.#pending = !!this.#props.pending;
|
||
this.#effect = block(() => {
|
||
active_effect.b = this;
|
||
if (hydrating) {
|
||
const comment2 = this.#hydrate_open;
|
||
hydrate_next();
|
||
const server_rendered_pending = (
|
||
/** @type {Comment} */
|
||
comment2.nodeType === COMMENT_NODE && /** @type {Comment} */
|
||
comment2.data === HYDRATION_START_ELSE
|
||
);
|
||
if (server_rendered_pending) {
|
||
this.#hydrate_pending_content();
|
||
} else {
|
||
this.#hydrate_resolved_content();
|
||
}
|
||
} else {
|
||
var anchor = this.#get_anchor();
|
||
try {
|
||
this.#main_effect = branch(() => children(anchor));
|
||
} catch (error) {
|
||
this.error(error);
|
||
}
|
||
if (this.#pending_count > 0) {
|
||
this.#show_pending_snippet();
|
||
} else {
|
||
this.#pending = false;
|
||
}
|
||
}
|
||
return () => {
|
||
this.#pending_anchor?.remove();
|
||
};
|
||
}, flags);
|
||
if (hydrating) {
|
||
this.#anchor = hydrate_node;
|
||
}
|
||
}
|
||
#hydrate_resolved_content() {
|
||
try {
|
||
this.#main_effect = branch(() => this.#children(this.#anchor));
|
||
} catch (error) {
|
||
this.error(error);
|
||
}
|
||
this.#pending = false;
|
||
}
|
||
#hydrate_pending_content() {
|
||
const pending2 = this.#props.pending;
|
||
if (!pending2) {
|
||
return;
|
||
}
|
||
this.#pending_effect = branch(() => pending2(this.#anchor));
|
||
Batch.enqueue(() => {
|
||
var anchor = this.#get_anchor();
|
||
this.#main_effect = this.#run(() => {
|
||
Batch.ensure();
|
||
return branch(() => this.#children(anchor));
|
||
});
|
||
if (this.#pending_count > 0) {
|
||
this.#show_pending_snippet();
|
||
} else {
|
||
pause_effect(
|
||
/** @type {Effect} */
|
||
this.#pending_effect,
|
||
() => {
|
||
this.#pending_effect = null;
|
||
}
|
||
);
|
||
this.#pending = false;
|
||
}
|
||
});
|
||
}
|
||
#get_anchor() {
|
||
var anchor = this.#anchor;
|
||
if (this.#pending) {
|
||
this.#pending_anchor = create_text();
|
||
this.#anchor.before(this.#pending_anchor);
|
||
anchor = this.#pending_anchor;
|
||
}
|
||
return anchor;
|
||
}
|
||
/**
|
||
* Returns `true` if the effect exists inside a boundary whose pending snippet is shown
|
||
* @returns {boolean}
|
||
*/
|
||
is_pending() {
|
||
return this.#pending || !!this.parent && this.parent.is_pending();
|
||
}
|
||
has_pending_snippet() {
|
||
return !!this.#props.pending;
|
||
}
|
||
/**
|
||
* @param {() => Effect | null} fn
|
||
*/
|
||
#run(fn) {
|
||
var previous_effect = active_effect;
|
||
var previous_reaction = active_reaction;
|
||
var previous_ctx = component_context;
|
||
set_active_effect(this.#effect);
|
||
set_active_reaction(this.#effect);
|
||
set_component_context(this.#effect.ctx);
|
||
try {
|
||
return fn();
|
||
} catch (e) {
|
||
handle_error(e);
|
||
return null;
|
||
} finally {
|
||
set_active_effect(previous_effect);
|
||
set_active_reaction(previous_reaction);
|
||
set_component_context(previous_ctx);
|
||
}
|
||
}
|
||
#show_pending_snippet() {
|
||
const pending2 = (
|
||
/** @type {(anchor: Node) => void} */
|
||
this.#props.pending
|
||
);
|
||
if (this.#main_effect !== null) {
|
||
this.#offscreen_fragment = document.createDocumentFragment();
|
||
this.#offscreen_fragment.append(
|
||
/** @type {TemplateNode} */
|
||
this.#pending_anchor
|
||
);
|
||
move_effect(this.#main_effect, this.#offscreen_fragment);
|
||
}
|
||
if (this.#pending_effect === null) {
|
||
this.#pending_effect = branch(() => pending2(this.#anchor));
|
||
}
|
||
}
|
||
/**
|
||
* Updates the pending count associated with the currently visible pending snippet,
|
||
* if any, such that we can replace the snippet with content once work is done
|
||
* @param {1 | -1} d
|
||
*/
|
||
#update_pending_count(d) {
|
||
if (!this.has_pending_snippet()) {
|
||
if (this.parent) {
|
||
this.parent.#update_pending_count(d);
|
||
}
|
||
return;
|
||
}
|
||
this.#pending_count += d;
|
||
if (this.#pending_count === 0) {
|
||
this.#pending = false;
|
||
if (this.#pending_effect) {
|
||
pause_effect(this.#pending_effect, () => {
|
||
this.#pending_effect = null;
|
||
});
|
||
}
|
||
if (this.#offscreen_fragment) {
|
||
this.#anchor.before(this.#offscreen_fragment);
|
||
this.#offscreen_fragment = null;
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* Update the source that powers `$effect.pending()` inside this boundary,
|
||
* and controls when the current `pending` snippet (if any) is removed.
|
||
* Do not call from inside the class
|
||
* @param {1 | -1} d
|
||
*/
|
||
update_pending_count(d) {
|
||
this.#update_pending_count(d);
|
||
this.#local_pending_count += d;
|
||
if (this.#effect_pending) {
|
||
internal_set(this.#effect_pending, this.#local_pending_count);
|
||
}
|
||
}
|
||
get_effect_pending() {
|
||
this.#effect_pending_subscriber();
|
||
return get(
|
||
/** @type {Source<number>} */
|
||
this.#effect_pending
|
||
);
|
||
}
|
||
/** @param {unknown} error */
|
||
error(error) {
|
||
var onerror = this.#props.onerror;
|
||
let failed = this.#props.failed;
|
||
if (this.#is_creating_fallback || !onerror && !failed) {
|
||
throw error;
|
||
}
|
||
if (this.#main_effect) {
|
||
destroy_effect(this.#main_effect);
|
||
this.#main_effect = null;
|
||
}
|
||
if (this.#pending_effect) {
|
||
destroy_effect(this.#pending_effect);
|
||
this.#pending_effect = null;
|
||
}
|
||
if (this.#failed_effect) {
|
||
destroy_effect(this.#failed_effect);
|
||
this.#failed_effect = null;
|
||
}
|
||
if (hydrating) {
|
||
set_hydrate_node(
|
||
/** @type {TemplateNode} */
|
||
this.#hydrate_open
|
||
);
|
||
next();
|
||
set_hydrate_node(skip_nodes());
|
||
}
|
||
var did_reset = false;
|
||
var calling_on_error = false;
|
||
const reset2 = () => {
|
||
if (did_reset) {
|
||
svelte_boundary_reset_noop();
|
||
return;
|
||
}
|
||
did_reset = true;
|
||
if (calling_on_error) {
|
||
svelte_boundary_reset_onerror();
|
||
}
|
||
Batch.ensure();
|
||
this.#local_pending_count = 0;
|
||
if (this.#failed_effect !== null) {
|
||
pause_effect(this.#failed_effect, () => {
|
||
this.#failed_effect = null;
|
||
});
|
||
}
|
||
this.#pending = this.has_pending_snippet();
|
||
this.#main_effect = this.#run(() => {
|
||
this.#is_creating_fallback = false;
|
||
return branch(() => this.#children(this.#anchor));
|
||
});
|
||
if (this.#pending_count > 0) {
|
||
this.#show_pending_snippet();
|
||
} else {
|
||
this.#pending = false;
|
||
}
|
||
};
|
||
var previous_reaction = active_reaction;
|
||
try {
|
||
set_active_reaction(null);
|
||
calling_on_error = true;
|
||
onerror?.(error, reset2);
|
||
calling_on_error = false;
|
||
} catch (error2) {
|
||
invoke_error_boundary(error2, this.#effect && this.#effect.parent);
|
||
} finally {
|
||
set_active_reaction(previous_reaction);
|
||
}
|
||
if (failed) {
|
||
queue_micro_task(() => {
|
||
this.#failed_effect = this.#run(() => {
|
||
Batch.ensure();
|
||
this.#is_creating_fallback = true;
|
||
try {
|
||
return branch(() => {
|
||
failed(
|
||
this.#anchor,
|
||
() => error,
|
||
() => reset2
|
||
);
|
||
});
|
||
} catch (error2) {
|
||
invoke_error_boundary(
|
||
error2,
|
||
/** @type {Effect} */
|
||
this.#effect.parent
|
||
);
|
||
return null;
|
||
} finally {
|
||
this.#is_creating_fallback = false;
|
||
}
|
||
});
|
||
});
|
||
}
|
||
}
|
||
};
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/async.js
|
||
function flatten(blockers, sync, async2, fn) {
|
||
const d = is_runes() ? derived : derived_safe_equal;
|
||
if (async2.length === 0 && blockers.length === 0) {
|
||
fn(sync.map(d));
|
||
return;
|
||
}
|
||
var batch = current_batch;
|
||
var parent = (
|
||
/** @type {Effect} */
|
||
active_effect
|
||
);
|
||
var restore = capture();
|
||
function run3() {
|
||
Promise.all(async2.map((expression) => async_derived(expression))).then((result) => {
|
||
restore();
|
||
try {
|
||
fn([...sync.map(d), ...result]);
|
||
} catch (error) {
|
||
if ((parent.f & DESTROYED) === 0) {
|
||
invoke_error_boundary(error, parent);
|
||
}
|
||
}
|
||
batch?.deactivate();
|
||
unset_context();
|
||
}).catch((error) => {
|
||
invoke_error_boundary(error, parent);
|
||
});
|
||
}
|
||
if (blockers.length > 0) {
|
||
Promise.all(blockers).then(() => {
|
||
restore();
|
||
try {
|
||
return run3();
|
||
} finally {
|
||
batch?.deactivate();
|
||
unset_context();
|
||
}
|
||
});
|
||
} else {
|
||
run3();
|
||
}
|
||
}
|
||
function capture() {
|
||
var previous_effect = active_effect;
|
||
var previous_reaction = active_reaction;
|
||
var previous_component_context = component_context;
|
||
var previous_batch2 = current_batch;
|
||
if (dev_fallback_default) {
|
||
var previous_dev_stack = dev_stack;
|
||
}
|
||
return function restore(activate_batch = true) {
|
||
set_active_effect(previous_effect);
|
||
set_active_reaction(previous_reaction);
|
||
set_component_context(previous_component_context);
|
||
if (activate_batch) previous_batch2?.activate();
|
||
if (dev_fallback_default) {
|
||
set_from_async_derived(null);
|
||
set_dev_stack(previous_dev_stack);
|
||
}
|
||
};
|
||
}
|
||
function unset_context() {
|
||
set_active_effect(null);
|
||
set_active_reaction(null);
|
||
set_component_context(null);
|
||
if (dev_fallback_default) {
|
||
set_from_async_derived(null);
|
||
set_dev_stack(null);
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/deriveds.js
|
||
var current_async_effect = null;
|
||
function set_from_async_derived(v) {
|
||
current_async_effect = v;
|
||
}
|
||
var recent_async_deriveds = /* @__PURE__ */ new Set();
|
||
// @__NO_SIDE_EFFECTS__
|
||
function derived(fn) {
|
||
var flags2 = DERIVED | DIRTY;
|
||
var parent_derived = active_reaction !== null && (active_reaction.f & DERIVED) !== 0 ? (
|
||
/** @type {Derived} */
|
||
active_reaction
|
||
) : null;
|
||
if (active_effect !== null) {
|
||
active_effect.f |= EFFECT_PRESERVED;
|
||
}
|
||
const signal = {
|
||
ctx: component_context,
|
||
deps: null,
|
||
effects: null,
|
||
equals,
|
||
f: flags2,
|
||
fn,
|
||
reactions: null,
|
||
rv: 0,
|
||
v: (
|
||
/** @type {V} */
|
||
UNINITIALIZED
|
||
),
|
||
wv: 0,
|
||
parent: parent_derived ?? active_effect,
|
||
ac: null
|
||
};
|
||
if (dev_fallback_default && tracing_mode_flag) {
|
||
signal.created = get_error("created at");
|
||
}
|
||
return signal;
|
||
}
|
||
// @__NO_SIDE_EFFECTS__
|
||
function async_derived(fn, location) {
|
||
let parent = (
|
||
/** @type {Effect | null} */
|
||
active_effect
|
||
);
|
||
if (parent === null) {
|
||
async_derived_orphan();
|
||
}
|
||
var boundary2 = (
|
||
/** @type {Boundary} */
|
||
parent.b
|
||
);
|
||
var promise = (
|
||
/** @type {Promise<V>} */
|
||
/** @type {unknown} */
|
||
void 0
|
||
);
|
||
var signal = source(
|
||
/** @type {V} */
|
||
UNINITIALIZED
|
||
);
|
||
var should_suspend = !active_reaction;
|
||
var deferreds = /* @__PURE__ */ new Map();
|
||
async_effect(() => {
|
||
if (dev_fallback_default) current_async_effect = active_effect;
|
||
var d = deferred();
|
||
promise = d.promise;
|
||
try {
|
||
Promise.resolve(fn()).then(d.resolve, d.reject).then(() => {
|
||
if (batch === current_batch && batch.committed) {
|
||
batch.deactivate();
|
||
}
|
||
unset_context();
|
||
});
|
||
} catch (error) {
|
||
d.reject(error);
|
||
unset_context();
|
||
}
|
||
if (dev_fallback_default) current_async_effect = null;
|
||
var batch = (
|
||
/** @type {Batch} */
|
||
current_batch
|
||
);
|
||
if (should_suspend) {
|
||
var blocking = !boundary2.is_pending();
|
||
boundary2.update_pending_count(1);
|
||
batch.increment(blocking);
|
||
deferreds.get(batch)?.reject(STALE_REACTION);
|
||
deferreds.delete(batch);
|
||
deferreds.set(batch, d);
|
||
}
|
||
const handler = (value, error = void 0) => {
|
||
current_async_effect = null;
|
||
batch.activate();
|
||
if (error) {
|
||
if (error !== STALE_REACTION) {
|
||
signal.f |= ERROR_VALUE;
|
||
internal_set(signal, error);
|
||
}
|
||
} else {
|
||
if ((signal.f & ERROR_VALUE) !== 0) {
|
||
signal.f ^= ERROR_VALUE;
|
||
}
|
||
internal_set(signal, value);
|
||
for (const [b, d2] of deferreds) {
|
||
deferreds.delete(b);
|
||
if (b === batch) break;
|
||
d2.reject(STALE_REACTION);
|
||
}
|
||
if (dev_fallback_default && location !== void 0) {
|
||
recent_async_deriveds.add(signal);
|
||
setTimeout(() => {
|
||
if (recent_async_deriveds.has(signal)) {
|
||
await_waterfall(
|
||
/** @type {string} */
|
||
signal.label,
|
||
location
|
||
);
|
||
recent_async_deriveds.delete(signal);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
if (should_suspend) {
|
||
boundary2.update_pending_count(-1);
|
||
batch.decrement(blocking);
|
||
}
|
||
};
|
||
d.promise.then(handler, (e) => handler(null, e || "unknown"));
|
||
});
|
||
teardown(() => {
|
||
for (const d of deferreds.values()) {
|
||
d.reject(STALE_REACTION);
|
||
}
|
||
});
|
||
if (dev_fallback_default) {
|
||
signal.f |= ASYNC;
|
||
}
|
||
return new Promise((fulfil) => {
|
||
function next2(p) {
|
||
function go() {
|
||
if (p === promise) {
|
||
fulfil(signal);
|
||
} else {
|
||
next2(promise);
|
||
}
|
||
}
|
||
p.then(go, go);
|
||
}
|
||
next2(promise);
|
||
});
|
||
}
|
||
// @__NO_SIDE_EFFECTS__
|
||
function user_derived(fn) {
|
||
const d = /* @__PURE__ */ derived(fn);
|
||
if (!async_mode_flag) push_reaction_value(d);
|
||
return d;
|
||
}
|
||
// @__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]
|
||
);
|
||
}
|
||
}
|
||
}
|
||
var stack = [];
|
||
function get_derived_parent_effect(derived2) {
|
||
var parent = derived2.parent;
|
||
while (parent !== null) {
|
||
if ((parent.f & DERIVED) === 0) {
|
||
return (parent.f & DESTROYED) === 0 ? (
|
||
/** @type {Effect} */
|
||
parent
|
||
) : null;
|
||
}
|
||
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));
|
||
if (dev_fallback_default) {
|
||
let prev_eager_effects = eager_effects;
|
||
set_eager_effects(/* @__PURE__ */ new Set());
|
||
try {
|
||
if (stack.includes(derived2)) {
|
||
derived_references_self();
|
||
}
|
||
stack.push(derived2);
|
||
derived2.f &= ~WAS_MARKED;
|
||
destroy_derived_effects(derived2);
|
||
value = update_reaction(derived2);
|
||
} finally {
|
||
set_active_effect(prev_active_effect);
|
||
set_eager_effects(prev_eager_effects);
|
||
stack.pop();
|
||
}
|
||
} else {
|
||
try {
|
||
derived2.f &= ~WAS_MARKED;
|
||
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);
|
||
if (!derived2.equals(value)) {
|
||
if (!current_batch?.is_fork) {
|
||
derived2.v = value;
|
||
}
|
||
derived2.wv = increment_write_version();
|
||
}
|
||
if (is_destroying_effect) {
|
||
return;
|
||
}
|
||
if (batch_values !== null) {
|
||
if (effect_tracking() || current_batch?.is_fork) {
|
||
batch_values.set(derived2, value);
|
||
}
|
||
} else {
|
||
var status = (derived2.f & CONNECTED) === 0 ? MAYBE_DIRTY : CLEAN;
|
||
set_signal_status(derived2, status);
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/sources.js
|
||
var eager_effects = /* @__PURE__ */ new Set();
|
||
var old_values = /* @__PURE__ */ new Map();
|
||
function set_eager_effects(v) {
|
||
eager_effects = v;
|
||
}
|
||
var eager_effects_deferred = false;
|
||
function set_eager_effects_deferred() {
|
||
eager_effects_deferred = true;
|
||
}
|
||
function source(v, stack2) {
|
||
var signal = {
|
||
f: 0,
|
||
// TODO ideally we could skip this altogether, but it causes type errors
|
||
v,
|
||
reactions: null,
|
||
equals,
|
||
rv: 0,
|
||
wv: 0
|
||
};
|
||
if (dev_fallback_default && tracing_mode_flag) {
|
||
signal.created = stack2 ?? get_error("created at");
|
||
signal.updated = null;
|
||
signal.set_during_effect = false;
|
||
signal.trace = null;
|
||
}
|
||
return signal;
|
||
}
|
||
// @__NO_SIDE_EFFECTS__
|
||
function state(v, stack2) {
|
||
const s = source(v, stack2);
|
||
push_reaction_value(s);
|
||
return s;
|
||
}
|
||
// @__NO_SIDE_EFFECTS__
|
||
function mutable_source(initial_value, immutable = false, trackable = true) {
|
||
const s = source(initial_value);
|
||
if (!immutable) {
|
||
s.equals = safe_equals;
|
||
}
|
||
if (legacy_mode_flag && trackable && component_context !== null && component_context.l !== null) {
|
||
(component_context.l.s ??= []).push(s);
|
||
}
|
||
return s;
|
||
}
|
||
function set(source2, value, should_proxy = false) {
|
||
if (active_reaction !== null && // since we are untracking the function inside `$inspect.with` we need to add this check
|
||
// to ensure we error if state is set inside an inspect effect
|
||
(!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 && !current_sources?.includes(source2)) {
|
||
state_unsafe_mutation();
|
||
}
|
||
let new_value = should_proxy ? proxy(value) : value;
|
||
if (dev_fallback_default) {
|
||
tag_proxy(
|
||
new_value,
|
||
/** @type {string} */
|
||
source2.label
|
||
);
|
||
}
|
||
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;
|
||
var batch = Batch.ensure();
|
||
batch.capture(source2, old_value);
|
||
if (dev_fallback_default) {
|
||
if (tracing_mode_flag || active_effect !== null) {
|
||
source2.updated ??= /* @__PURE__ */ new Map();
|
||
const count = (source2.updated.get("")?.count ?? 0) + 1;
|
||
source2.updated.set("", { error: (
|
||
/** @type {any} */
|
||
null
|
||
), count });
|
||
if (tracing_mode_flag || count > 5) {
|
||
const error = get_error("updated at");
|
||
if (error !== null) {
|
||
let entry = source2.updated.get(error.stack);
|
||
if (!entry) {
|
||
entry = { error, count: 0 };
|
||
source2.updated.set(error.stack, entry);
|
||
}
|
||
entry.count++;
|
||
}
|
||
}
|
||
}
|
||
if (active_effect !== null) {
|
||
source2.set_during_effect = true;
|
||
}
|
||
}
|
||
if ((source2.f & DERIVED) !== 0) {
|
||
if ((source2.f & DIRTY) !== 0) {
|
||
execute_derived(
|
||
/** @type {Derived} */
|
||
source2
|
||
);
|
||
}
|
||
set_signal_status(source2, (source2.f & CONNECTED) !== 0 ? CLEAN : MAYBE_DIRTY);
|
||
}
|
||
source2.wv = increment_write_version();
|
||
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);
|
||
}
|
||
}
|
||
if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) {
|
||
flush_eager_effects();
|
||
}
|
||
}
|
||
return value;
|
||
}
|
||
function flush_eager_effects() {
|
||
eager_effects_deferred = false;
|
||
var prev_is_updating_effect = is_updating_effect;
|
||
set_is_updating_effect(true);
|
||
const inspects = Array.from(eager_effects);
|
||
try {
|
||
for (const effect2 of inspects) {
|
||
if ((effect2.f & CLEAN) !== 0) {
|
||
set_signal_status(effect2, MAYBE_DIRTY);
|
||
}
|
||
if (is_dirty(effect2)) {
|
||
update_effect(effect2);
|
||
}
|
||
}
|
||
} finally {
|
||
set_is_updating_effect(prev_is_updating_effect);
|
||
}
|
||
eager_effects.clear();
|
||
}
|
||
function update(source2, d = 1) {
|
||
var value = get(source2);
|
||
var result = d === 1 ? value++ : value--;
|
||
set(source2, value);
|
||
return result;
|
||
}
|
||
function increment(source2) {
|
||
set(source2, source2.v + 1);
|
||
}
|
||
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 flags2 = reaction.f;
|
||
if (!runes && reaction === active_effect) continue;
|
||
if (dev_fallback_default && (flags2 & EAGER_EFFECT) !== 0) {
|
||
eager_effects.add(reaction);
|
||
continue;
|
||
}
|
||
var not_dirty = (flags2 & DIRTY) === 0;
|
||
if (not_dirty) {
|
||
set_signal_status(reaction, status);
|
||
}
|
||
if ((flags2 & DERIVED) !== 0) {
|
||
var derived2 = (
|
||
/** @type {Derived} */
|
||
reaction
|
||
);
|
||
batch_values?.delete(derived2);
|
||
if ((flags2 & WAS_MARKED) === 0) {
|
||
if (flags2 & CONNECTED) {
|
||
reaction.f |= WAS_MARKED;
|
||
}
|
||
mark_reactions(derived2, MAYBE_DIRTY);
|
||
}
|
||
} else if (not_dirty) {
|
||
if ((flags2 & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) {
|
||
eager_block_effects.add(
|
||
/** @type {Effect} */
|
||
reaction
|
||
);
|
||
}
|
||
schedule_effect(
|
||
/** @type {Effect} */
|
||
reaction
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/proxy.js
|
||
var regex_is_valid_identifier = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;
|
||
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 = state(0);
|
||
var stack2 = dev_fallback_default && tracing_mode_flag ? get_error("created at") : null;
|
||
var parent_version = update_version;
|
||
var with_parent = (fn) => {
|
||
if (update_version === parent_version) {
|
||
return fn();
|
||
}
|
||
var reaction = active_reaction;
|
||
var version2 = update_version;
|
||
set_active_reaction(null);
|
||
set_update_version(parent_version);
|
||
var result = fn();
|
||
set_active_reaction(reaction);
|
||
set_update_version(version2);
|
||
return result;
|
||
};
|
||
if (is_proxied_array) {
|
||
sources.set("length", state(
|
||
/** @type {any[]} */
|
||
value.length,
|
||
stack2
|
||
));
|
||
if (dev_fallback_default) {
|
||
value = /** @type {any} */
|
||
inspectable_array(
|
||
/** @type {any[]} */
|
||
value
|
||
);
|
||
}
|
||
}
|
||
var path = "";
|
||
let updating = false;
|
||
function update_path(new_path) {
|
||
if (updating) return;
|
||
updating = true;
|
||
path = new_path;
|
||
tag(version, `${path} version`);
|
||
for (const [prop2, source2] of sources) {
|
||
tag(source2, get_label(path, prop2));
|
||
}
|
||
updating = false;
|
||
}
|
||
return new Proxy(
|
||
/** @type {any} */
|
||
value,
|
||
{
|
||
defineProperty(_, prop2, descriptor) {
|
||
if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) {
|
||
state_descriptors_fixed();
|
||
}
|
||
var s = sources.get(prop2);
|
||
if (s === void 0) {
|
||
s = with_parent(() => {
|
||
var s2 = state(descriptor.value, stack2);
|
||
sources.set(prop2, s2);
|
||
if (dev_fallback_default && typeof prop2 === "string") {
|
||
tag(s2, get_label(path, prop2));
|
||
}
|
||
return s2;
|
||
});
|
||
} else {
|
||
set(s, descriptor.value, true);
|
||
}
|
||
return true;
|
||
},
|
||
deleteProperty(target, prop2) {
|
||
var s = sources.get(prop2);
|
||
if (s === void 0) {
|
||
if (prop2 in target) {
|
||
const s2 = with_parent(() => state(UNINITIALIZED, stack2));
|
||
sources.set(prop2, s2);
|
||
increment(version);
|
||
if (dev_fallback_default) {
|
||
tag(s2, get_label(path, prop2));
|
||
}
|
||
}
|
||
} else {
|
||
set(s, UNINITIALIZED);
|
||
increment(version);
|
||
}
|
||
return true;
|
||
},
|
||
get(target, prop2, receiver) {
|
||
if (prop2 === STATE_SYMBOL) {
|
||
return value;
|
||
}
|
||
if (dev_fallback_default && prop2 === PROXY_PATH_SYMBOL) {
|
||
return update_path;
|
||
}
|
||
var s = sources.get(prop2);
|
||
var exists = prop2 in target;
|
||
if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) {
|
||
s = with_parent(() => {
|
||
var p = proxy(exists ? target[prop2] : UNINITIALIZED);
|
||
var s2 = state(p, stack2);
|
||
if (dev_fallback_default) {
|
||
tag(s2, get_label(path, prop2));
|
||
}
|
||
return s2;
|
||
});
|
||
sources.set(prop2, s);
|
||
}
|
||
if (s !== void 0) {
|
||
var v = get(s);
|
||
return v === UNINITIALIZED ? void 0 : v;
|
||
}
|
||
return Reflect.get(target, prop2, receiver);
|
||
},
|
||
getOwnPropertyDescriptor(target, prop2) {
|
||
var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2);
|
||
if (descriptor && "value" in descriptor) {
|
||
var s = sources.get(prop2);
|
||
if (s) descriptor.value = get(s);
|
||
} else if (descriptor === void 0) {
|
||
var source2 = sources.get(prop2);
|
||
var value2 = source2?.v;
|
||
if (source2 !== void 0 && value2 !== UNINITIALIZED) {
|
||
return {
|
||
enumerable: true,
|
||
configurable: true,
|
||
value: value2,
|
||
writable: true
|
||
};
|
||
}
|
||
}
|
||
return descriptor;
|
||
},
|
||
has(target, prop2) {
|
||
if (prop2 === STATE_SYMBOL) {
|
||
return true;
|
||
}
|
||
var s = sources.get(prop2);
|
||
var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2);
|
||
if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) {
|
||
if (s === void 0) {
|
||
s = with_parent(() => {
|
||
var p = has ? proxy(target[prop2]) : UNINITIALIZED;
|
||
var s2 = state(p, stack2);
|
||
if (dev_fallback_default) {
|
||
tag(s2, get_label(path, prop2));
|
||
}
|
||
return s2;
|
||
});
|
||
sources.set(prop2, s);
|
||
}
|
||
var value2 = get(s);
|
||
if (value2 === UNINITIALIZED) {
|
||
return false;
|
||
}
|
||
}
|
||
return has;
|
||
},
|
||
set(target, prop2, value2, receiver) {
|
||
var s = sources.get(prop2);
|
||
var has = prop2 in target;
|
||
if (is_proxied_array && prop2 === "length") {
|
||
for (var i = value2; i < /** @type {Source<number>} */
|
||
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(() => state(UNINITIALIZED, stack2));
|
||
sources.set(i + "", other_s);
|
||
if (dev_fallback_default) {
|
||
tag(other_s, get_label(path, i));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (s === void 0) {
|
||
if (!has || get_descriptor(target, prop2)?.writable) {
|
||
s = with_parent(() => state(void 0, stack2));
|
||
if (dev_fallback_default) {
|
||
tag(s, get_label(path, prop2));
|
||
}
|
||
set(s, proxy(value2));
|
||
sources.set(prop2, s);
|
||
}
|
||
} else {
|
||
has = s.v !== UNINITIALIZED;
|
||
var p = with_parent(() => proxy(value2));
|
||
set(s, p);
|
||
}
|
||
var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2);
|
||
if (descriptor?.set) {
|
||
descriptor.set.call(receiver, value2);
|
||
}
|
||
if (!has) {
|
||
if (is_proxied_array && typeof prop2 === "string") {
|
||
var ls = (
|
||
/** @type {Source<number>} */
|
||
sources.get("length")
|
||
);
|
||
var n = Number(prop2);
|
||
if (Number.isInteger(n) && n >= ls.v) {
|
||
set(ls, n + 1);
|
||
}
|
||
}
|
||
increment(version);
|
||
}
|
||
return true;
|
||
},
|
||
ownKeys(target) {
|
||
get(version);
|
||
var own_keys = Reflect.ownKeys(target).filter((key3) => {
|
||
var source3 = sources.get(key3);
|
||
return source3 === void 0 || source3.v !== UNINITIALIZED;
|
||
});
|
||
for (var [key2, source2] of sources) {
|
||
if (source2.v !== UNINITIALIZED && !(key2 in target)) {
|
||
own_keys.push(key2);
|
||
}
|
||
}
|
||
return own_keys;
|
||
},
|
||
setPrototypeOf() {
|
||
state_prototype_fixed();
|
||
}
|
||
}
|
||
);
|
||
}
|
||
function get_label(path, prop2) {
|
||
if (typeof prop2 === "symbol") return `${path}[Symbol(${prop2.description ?? ""})]`;
|
||
if (regex_is_valid_identifier.test(prop2)) return `${path}.${prop2}`;
|
||
return /^\d+$/.test(prop2) ? `${path}[${prop2}]` : `${path}['${prop2}']`;
|
||
}
|
||
function get_proxied_value(value) {
|
||
try {
|
||
if (value !== null && typeof value === "object" && STATE_SYMBOL in value) {
|
||
return value[STATE_SYMBOL];
|
||
}
|
||
} catch {
|
||
}
|
||
return value;
|
||
}
|
||
function is(a, b) {
|
||
return Object.is(get_proxied_value(a), get_proxied_value(b));
|
||
}
|
||
var ARRAY_MUTATING_METHODS = /* @__PURE__ */ new Set([
|
||
"copyWithin",
|
||
"fill",
|
||
"pop",
|
||
"push",
|
||
"reverse",
|
||
"shift",
|
||
"sort",
|
||
"splice",
|
||
"unshift"
|
||
]);
|
||
function inspectable_array(array) {
|
||
return new Proxy(array, {
|
||
get(target, prop2, receiver) {
|
||
var value = Reflect.get(target, prop2, receiver);
|
||
if (!ARRAY_MUTATING_METHODS.has(
|
||
/** @type {string} */
|
||
prop2
|
||
)) {
|
||
return value;
|
||
}
|
||
return function(...args) {
|
||
set_eager_effects_deferred();
|
||
var result = value.apply(this, args);
|
||
flush_eager_effects();
|
||
return result;
|
||
};
|
||
}
|
||
});
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dev/equality.js
|
||
function init_array_prototype_warnings() {
|
||
const array_prototype2 = Array.prototype;
|
||
const cleanup = Array.__svelte_cleanup;
|
||
if (cleanup) {
|
||
cleanup();
|
||
}
|
||
const { indexOf, lastIndexOf, includes } = array_prototype2;
|
||
array_prototype2.indexOf = function(item, from_index) {
|
||
const index2 = indexOf.call(this, item, from_index);
|
||
if (index2 === -1) {
|
||
for (let i = from_index ?? 0; i < this.length; i += 1) {
|
||
if (get_proxied_value(this[i]) === item) {
|
||
state_proxy_equality_mismatch("array.indexOf(...)");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return index2;
|
||
};
|
||
array_prototype2.lastIndexOf = function(item, from_index) {
|
||
const index2 = lastIndexOf.call(this, item, from_index ?? this.length - 1);
|
||
if (index2 === -1) {
|
||
for (let i = 0; i <= (from_index ?? this.length - 1); i += 1) {
|
||
if (get_proxied_value(this[i]) === item) {
|
||
state_proxy_equality_mismatch("array.lastIndexOf(...)");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return index2;
|
||
};
|
||
array_prototype2.includes = function(item, from_index) {
|
||
const has = includes.call(this, item, from_index);
|
||
if (!has) {
|
||
for (let i = 0; i < this.length; i += 1) {
|
||
if (get_proxied_value(this[i]) === item) {
|
||
state_proxy_equality_mismatch("array.includes(...)");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return has;
|
||
};
|
||
Array.__svelte_cleanup = () => {
|
||
array_prototype2.indexOf = indexOf;
|
||
array_prototype2.lastIndexOf = lastIndexOf;
|
||
array_prototype2.includes = includes;
|
||
};
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/operations.js
|
||
var $window;
|
||
var $document;
|
||
var is_firefox;
|
||
var first_child_getter;
|
||
var next_sibling_getter;
|
||
function init_operations() {
|
||
if ($window !== void 0) {
|
||
return;
|
||
}
|
||
$window = window;
|
||
$document = document;
|
||
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;
|
||
}
|
||
if (dev_fallback_default) {
|
||
element_prototype.__svelte_meta = null;
|
||
init_array_prototype_warnings();
|
||
}
|
||
}
|
||
function create_text(value = "") {
|
||
return document.createTextNode(value);
|
||
}
|
||
// @__NO_SIDE_EFFECTS__
|
||
function get_first_child(node) {
|
||
return (
|
||
/** @type {TemplateNode | null} */
|
||
first_child_getter.call(node)
|
||
);
|
||
}
|
||
// @__NO_SIDE_EFFECTS__
|
||
function get_next_sibling(node) {
|
||
return (
|
||
/** @type {TemplateNode | null} */
|
||
next_sibling_getter.call(node)
|
||
);
|
||
}
|
||
function child(node, is_text) {
|
||
if (!hydrating) {
|
||
return /* @__PURE__ */ get_first_child(node);
|
||
}
|
||
var child2 = /* @__PURE__ */ get_first_child(hydrate_node);
|
||
if (child2 === null) {
|
||
child2 = hydrate_node.appendChild(create_text());
|
||
} else if (is_text && child2.nodeType !== TEXT_NODE) {
|
||
var text2 = create_text();
|
||
child2?.before(text2);
|
||
set_hydrate_node(text2);
|
||
return text2;
|
||
}
|
||
set_hydrate_node(child2);
|
||
return child2;
|
||
}
|
||
function sibling(node, count = 1, is_text = false) {
|
||
let next_sibling = hydrating ? hydrate_node : node;
|
||
var last_sibling;
|
||
while (count--) {
|
||
last_sibling = next_sibling;
|
||
next_sibling = /** @type {TemplateNode} */
|
||
/* @__PURE__ */ get_next_sibling(next_sibling);
|
||
}
|
||
if (!hydrating) {
|
||
return next_sibling;
|
||
}
|
||
if (is_text && next_sibling?.nodeType !== TEXT_NODE) {
|
||
var text2 = create_text();
|
||
if (next_sibling === null) {
|
||
last_sibling?.after(text2);
|
||
} else {
|
||
next_sibling.before(text2);
|
||
}
|
||
set_hydrate_node(text2);
|
||
return text2;
|
||
}
|
||
set_hydrate_node(next_sibling);
|
||
return next_sibling;
|
||
}
|
||
function clear_text_content(node) {
|
||
node.textContent = "";
|
||
}
|
||
function should_defer_append() {
|
||
if (!async_mode_flag) return false;
|
||
if (eager_block_effects !== null) return false;
|
||
var flags2 = (
|
||
/** @type {Effect} */
|
||
active_effect.f
|
||
);
|
||
return (flags2 & EFFECT_RAN) !== 0;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/misc.js
|
||
var 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(() => {
|
||
if (!evt.defaultPrevented) {
|
||
for (
|
||
const e of
|
||
/**@type {HTMLFormElement} */
|
||
evt.target.elements
|
||
) {
|
||
e.__on_r?.();
|
||
}
|
||
}
|
||
});
|
||
},
|
||
// In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation)
|
||
{ capture: true }
|
||
);
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/bindings/shared.js
|
||
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(element2, event2, handler, on_reset = handler) {
|
||
element2.addEventListener(event2, () => without_reactive_context(handler));
|
||
const prev = element2.__on_r;
|
||
if (prev) {
|
||
element2.__on_r = () => {
|
||
prev();
|
||
on_reset(true);
|
||
};
|
||
} else {
|
||
element2.__on_r = () => on_reset(true);
|
||
}
|
||
add_form_reset_listener();
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/effects.js
|
||
function validate_effect(rune) {
|
||
if (active_effect === null) {
|
||
if (active_reaction === null) {
|
||
effect_orphan(rune);
|
||
}
|
||
effect_in_unowned_derived();
|
||
}
|
||
if (is_destroying_effect) {
|
||
effect_in_teardown(rune);
|
||
}
|
||
}
|
||
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) {
|
||
var parent = active_effect;
|
||
if (dev_fallback_default) {
|
||
while (parent !== null && (parent.f & EAGER_EFFECT) !== 0) {
|
||
parent = parent.parent;
|
||
}
|
||
}
|
||
if (parent !== null && (parent.f & INERT) !== 0) {
|
||
type |= INERT;
|
||
}
|
||
var effect2 = {
|
||
ctx: component_context,
|
||
deps: null,
|
||
nodes: null,
|
||
f: type | DIRTY | CONNECTED,
|
||
first: null,
|
||
fn,
|
||
last: null,
|
||
next: null,
|
||
parent,
|
||
b: parent && parent.b,
|
||
prev: null,
|
||
teardown: null,
|
||
wv: 0,
|
||
ac: null
|
||
};
|
||
if (dev_fallback_default) {
|
||
effect2.component_function = dev_current_component_function;
|
||
}
|
||
if (sync) {
|
||
try {
|
||
update_effect(effect2);
|
||
effect2.f |= EFFECT_RAN;
|
||
} catch (e2) {
|
||
destroy_effect(effect2);
|
||
throw e2;
|
||
}
|
||
} else if (fn !== null) {
|
||
schedule_effect(effect2);
|
||
}
|
||
var e = effect2;
|
||
if (sync && e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && // either `null`, or a singular child
|
||
(e.f & EFFECT_PRESERVED) === 0) {
|
||
e = e.first;
|
||
if ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) {
|
||
e.f |= EFFECT_TRANSPARENT;
|
||
}
|
||
}
|
||
if (e !== null) {
|
||
e.parent = parent;
|
||
if (parent !== null) {
|
||
push_effect(e, parent);
|
||
}
|
||
if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) {
|
||
var derived2 = (
|
||
/** @type {Derived} */
|
||
active_reaction
|
||
);
|
||
(derived2.effects ??= []).push(e);
|
||
}
|
||
}
|
||
return effect2;
|
||
}
|
||
function effect_tracking() {
|
||
return active_reaction !== null && !untracking;
|
||
}
|
||
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("$effect");
|
||
if (dev_fallback_default) {
|
||
define_property(fn, "name", {
|
||
value: "$effect"
|
||
});
|
||
}
|
||
var flags2 = (
|
||
/** @type {Effect} */
|
||
active_effect.f
|
||
);
|
||
var defer = !active_reaction && (flags2 & BRANCH_EFFECT) !== 0 && (flags2 & EFFECT_RAN) === 0;
|
||
if (defer) {
|
||
var context = (
|
||
/** @type {ComponentContext} */
|
||
component_context
|
||
);
|
||
(context.e ??= []).push(fn);
|
||
} else {
|
||
return create_user_effect(fn);
|
||
}
|
||
}
|
||
function create_user_effect(fn) {
|
||
return create_effect(EFFECT | USER_EFFECT, fn, false);
|
||
}
|
||
function effect_root(fn) {
|
||
Batch.ensure();
|
||
const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn, true);
|
||
return () => {
|
||
destroy_effect(effect2);
|
||
};
|
||
}
|
||
function component_root(fn) {
|
||
Batch.ensure();
|
||
const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, 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 async_effect(fn) {
|
||
return create_effect(ASYNC | EFFECT_PRESERVED, fn, true);
|
||
}
|
||
function render_effect(fn, flags2 = 0) {
|
||
return create_effect(RENDER_EFFECT | flags2, fn, true);
|
||
}
|
||
function template_effect(fn, sync = [], async2 = [], blockers = []) {
|
||
flatten(blockers, sync, async2, (values) => {
|
||
create_effect(RENDER_EFFECT, () => fn(...values.map(get)), true);
|
||
});
|
||
}
|
||
function block(fn, flags2 = 0) {
|
||
var effect2 = create_effect(BLOCK_EFFECT | flags2, fn, true);
|
||
if (dev_fallback_default) {
|
||
effect2.dev_stack = dev_stack;
|
||
}
|
||
return effect2;
|
||
}
|
||
function branch(fn) {
|
||
return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn, true);
|
||
}
|
||
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) {
|
||
const controller = effect2.ac;
|
||
if (controller !== null) {
|
||
without_reactive_context(() => {
|
||
controller.abort(STALE_REACTION);
|
||
});
|
||
}
|
||
var next2 = effect2.next;
|
||
if ((effect2.f & ROOT_EFFECT) !== 0) {
|
||
effect2.parent = null;
|
||
} else {
|
||
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 !== null && effect2.nodes.end !== null) {
|
||
remove_effect_dom(
|
||
effect2.nodes.start,
|
||
/** @type {TemplateNode} */
|
||
effect2.nodes.end
|
||
);
|
||
removed = true;
|
||
}
|
||
destroy_effect_children(effect2, remove_dom && !removed);
|
||
remove_reactions(effect2, 0);
|
||
set_signal_status(effect2, DESTROYED);
|
||
var transitions = effect2.nodes && effect2.nodes.t;
|
||
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);
|
||
}
|
||
if (dev_fallback_default) {
|
||
effect2.component_function = null;
|
||
}
|
||
effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes = effect2.ac = null;
|
||
}
|
||
function remove_effect_dom(node, end) {
|
||
while (node !== null) {
|
||
var next2 = node === end ? null : get_next_sibling(node);
|
||
node.remove();
|
||
node = next2;
|
||
}
|
||
}
|
||
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, destroy = true) {
|
||
var transitions = [];
|
||
pause_children(effect2, transitions, true);
|
||
var fn = () => {
|
||
if (destroy) destroy_effect(effect2);
|
||
if (callback) callback();
|
||
};
|
||
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;
|
||
var t = effect2.nodes && effect2.nodes.t;
|
||
if (t !== null) {
|
||
for (const transition2 of t) {
|
||
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 || // If this is a branch effect without a block effect parent,
|
||
// it means the parent block effect was pruned. In that case,
|
||
// transparency information was transferred to the branch effect.
|
||
(child2.f & BRANCH_EFFECT) !== 0 && (effect2.f & BLOCK_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) {
|
||
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;
|
||
}
|
||
var t = effect2.nodes && effect2.nodes.t;
|
||
if (t !== null) {
|
||
for (const transition2 of t) {
|
||
if (transition2.is_global || local) {
|
||
transition2.in();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function move_effect(effect2, fragment) {
|
||
if (!effect2.nodes) return;
|
||
var node = effect2.nodes.start;
|
||
var end = effect2.nodes.end;
|
||
while (node !== null) {
|
||
var next2 = node === end ? null : get_next_sibling(node);
|
||
fragment.append(node);
|
||
node = next2;
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/legacy.js
|
||
var captured_signals = null;
|
||
|
||
// node_modules/svelte/src/internal/client/runtime.js
|
||
var is_updating_effect = false;
|
||
function set_is_updating_effect(value) {
|
||
is_updating_effect = value;
|
||
}
|
||
var is_destroying_effect = false;
|
||
function set_is_destroying_effect(value) {
|
||
is_destroying_effect = value;
|
||
}
|
||
var active_reaction = null;
|
||
var untracking = false;
|
||
function set_active_reaction(reaction) {
|
||
active_reaction = reaction;
|
||
}
|
||
var active_effect = null;
|
||
function set_active_effect(effect2) {
|
||
active_effect = effect2;
|
||
}
|
||
var current_sources = null;
|
||
function push_reaction_value(value) {
|
||
if (active_reaction !== null && (!async_mode_flag || (active_reaction.f & DERIVED) !== 0)) {
|
||
if (current_sources === null) {
|
||
current_sources = [value];
|
||
} else {
|
||
current_sources.push(value);
|
||
}
|
||
}
|
||
}
|
||
var new_deps = null;
|
||
var skipped_deps = 0;
|
||
var untracked_writes = null;
|
||
function set_untracked_writes(value) {
|
||
untracked_writes = value;
|
||
}
|
||
var write_version = 1;
|
||
var read_version = 0;
|
||
var update_version = read_version;
|
||
function set_update_version(value) {
|
||
update_version = value;
|
||
}
|
||
function increment_write_version() {
|
||
return ++write_version;
|
||
}
|
||
function is_dirty(reaction) {
|
||
var flags2 = reaction.f;
|
||
if ((flags2 & DIRTY) !== 0) {
|
||
return true;
|
||
}
|
||
if (flags2 & DERIVED) {
|
||
reaction.f &= ~WAS_MARKED;
|
||
}
|
||
if ((flags2 & MAYBE_DIRTY) !== 0) {
|
||
var dependencies = reaction.deps;
|
||
if (dependencies !== null) {
|
||
var length = dependencies.length;
|
||
for (var i = 0; i < length; i++) {
|
||
var dependency = dependencies[i];
|
||
if (is_dirty(
|
||
/** @type {Derived} */
|
||
dependency
|
||
)) {
|
||
update_derived(
|
||
/** @type {Derived} */
|
||
dependency
|
||
);
|
||
}
|
||
if (dependency.wv > reaction.wv) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
if ((flags2 & CONNECTED) !== 0 && // During time traveling we don't want to reset the status so that
|
||
// traversal of the graph in the other batches still happens
|
||
batch_values === null) {
|
||
set_signal_status(reaction, CLEAN);
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
function schedule_possible_effect_self_invalidation(signal, effect2, root6 = true) {
|
||
var reactions = signal.reactions;
|
||
if (reactions === null) return;
|
||
if (!async_mode_flag && current_sources?.includes(signal)) {
|
||
return;
|
||
}
|
||
for (var i = 0; i < reactions.length; i++) {
|
||
var reaction = reactions[i];
|
||
if ((reaction.f & DERIVED) !== 0) {
|
||
schedule_possible_effect_self_invalidation(
|
||
/** @type {Derived} */
|
||
reaction,
|
||
effect2,
|
||
false
|
||
);
|
||
} else if (effect2 === reaction) {
|
||
if (root6) {
|
||
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 previous_deps = new_deps;
|
||
var previous_skipped_deps = skipped_deps;
|
||
var previous_untracked_writes = untracked_writes;
|
||
var previous_reaction = active_reaction;
|
||
var previous_sources = current_sources;
|
||
var previous_component_context = component_context;
|
||
var previous_untracking = untracking;
|
||
var previous_update_version = update_version;
|
||
var flags2 = reaction.f;
|
||
new_deps = /** @type {null | Value[]} */
|
||
null;
|
||
skipped_deps = 0;
|
||
untracked_writes = null;
|
||
active_reaction = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null;
|
||
current_sources = null;
|
||
set_component_context(reaction.ctx);
|
||
untracking = false;
|
||
update_version = ++read_version;
|
||
if (reaction.ac !== null) {
|
||
without_reactive_context(() => {
|
||
reaction.ac.abort(STALE_REACTION);
|
||
});
|
||
reaction.ac = null;
|
||
}
|
||
try {
|
||
reaction.f |= REACTION_IS_UPDATING;
|
||
var fn = (
|
||
/** @type {Function} */
|
||
reaction.fn
|
||
);
|
||
var result = 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 (effect_tracking() && (reaction.f & CONNECTED) !== 0) {
|
||
for (i = skipped_deps; i < deps.length; i++) {
|
||
(deps[i].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 !== null && 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);
|
||
}
|
||
}
|
||
}
|
||
if ((reaction.f & ERROR_VALUE) !== 0) {
|
||
reaction.f ^= ERROR_VALUE;
|
||
}
|
||
return result;
|
||
} catch (error) {
|
||
return handle_error(error);
|
||
} finally {
|
||
reaction.f ^= REACTION_IS_UPDATING;
|
||
new_deps = previous_deps;
|
||
skipped_deps = previous_skipped_deps;
|
||
untracked_writes = previous_untracked_writes;
|
||
active_reaction = previous_reaction;
|
||
current_sources = previous_sources;
|
||
set_component_context(previous_component_context);
|
||
untracking = previous_untracking;
|
||
update_version = previous_update_version;
|
||
}
|
||
}
|
||
function remove_reaction(signal, dependency) {
|
||
let reactions = dependency.reactions;
|
||
if (reactions !== null) {
|
||
var index2 = index_of.call(reactions, 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 & CONNECTED) !== 0) {
|
||
dependency.f ^= CONNECTED;
|
||
dependency.f &= ~WAS_MARKED;
|
||
}
|
||
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 flags2 = effect2.f;
|
||
if ((flags2 & DESTROYED) !== 0) {
|
||
return;
|
||
}
|
||
set_signal_status(effect2, CLEAN);
|
||
var previous_effect = active_effect;
|
||
var was_updating_effect = is_updating_effect;
|
||
active_effect = effect2;
|
||
is_updating_effect = true;
|
||
if (dev_fallback_default) {
|
||
var previous_component_fn = dev_current_component_function;
|
||
set_dev_current_component_function(effect2.component_function);
|
||
var previous_stack = (
|
||
/** @type {any} */
|
||
dev_stack
|
||
);
|
||
set_dev_stack(effect2.dev_stack ?? dev_stack);
|
||
}
|
||
try {
|
||
if ((flags2 & (BLOCK_EFFECT | MANAGED_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;
|
||
if (dev_fallback_default && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) {
|
||
for (var dep of effect2.deps) {
|
||
if (dep.set_during_effect) {
|
||
dep.wv = increment_write_version();
|
||
dep.set_during_effect = false;
|
||
}
|
||
}
|
||
}
|
||
} finally {
|
||
is_updating_effect = was_updating_effect;
|
||
active_effect = previous_effect;
|
||
if (dev_fallback_default) {
|
||
set_dev_current_component_function(previous_component_fn);
|
||
set_dev_stack(previous_stack);
|
||
}
|
||
}
|
||
}
|
||
async function tick() {
|
||
if (async_mode_flag) {
|
||
return new Promise((f) => {
|
||
requestAnimationFrame(() => f());
|
||
setTimeout(() => f());
|
||
});
|
||
}
|
||
await Promise.resolve();
|
||
flushSync();
|
||
}
|
||
function get(signal) {
|
||
var flags2 = signal.f;
|
||
var is_derived = (flags2 & DERIVED) !== 0;
|
||
captured_signals?.add(signal);
|
||
if (active_reaction !== null && !untracking) {
|
||
var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0;
|
||
if (!destroyed && !current_sources?.includes(signal)) {
|
||
var deps = active_reaction.deps;
|
||
if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) {
|
||
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 (!new_deps.includes(signal)) {
|
||
new_deps.push(signal);
|
||
}
|
||
}
|
||
} else {
|
||
(active_reaction.deps ??= []).push(signal);
|
||
var reactions = signal.reactions;
|
||
if (reactions === null) {
|
||
signal.reactions = [active_reaction];
|
||
} else if (!reactions.includes(active_reaction)) {
|
||
reactions.push(active_reaction);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (dev_fallback_default) {
|
||
recent_async_deriveds.delete(signal);
|
||
if (tracing_mode_flag && !untracking && tracing_expressions !== null && active_reaction !== null && tracing_expressions.reaction === active_reaction) {
|
||
if (signal.trace) {
|
||
signal.trace();
|
||
} else {
|
||
var trace2 = get_error("traced at");
|
||
if (trace2) {
|
||
var entry = tracing_expressions.entries.get(signal);
|
||
if (entry === void 0) {
|
||
entry = { traces: [] };
|
||
tracing_expressions.entries.set(signal, entry);
|
||
}
|
||
var last = entry.traces[entry.traces.length - 1];
|
||
if (trace2.stack !== last?.stack) {
|
||
entry.traces.push(trace2);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (is_destroying_effect) {
|
||
if (old_values.has(signal)) {
|
||
return old_values.get(signal);
|
||
}
|
||
if (is_derived) {
|
||
var derived2 = (
|
||
/** @type {Derived} */
|
||
signal
|
||
);
|
||
var value = derived2.v;
|
||
if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) {
|
||
value = execute_derived(derived2);
|
||
}
|
||
old_values.set(derived2, value);
|
||
return value;
|
||
}
|
||
} else if (is_derived && (!batch_values?.has(signal) || current_batch?.is_fork && !effect_tracking())) {
|
||
derived2 = /** @type {Derived} */
|
||
signal;
|
||
if (is_dirty(derived2)) {
|
||
update_derived(derived2);
|
||
}
|
||
if (is_updating_effect && effect_tracking() && (derived2.f & CONNECTED) === 0) {
|
||
reconnect(derived2);
|
||
}
|
||
}
|
||
if (batch_values?.has(signal)) {
|
||
return batch_values.get(signal);
|
||
}
|
||
if ((signal.f & ERROR_VALUE) !== 0) {
|
||
throw signal.v;
|
||
}
|
||
return signal.v;
|
||
}
|
||
function reconnect(derived2) {
|
||
if (derived2.deps === null) return;
|
||
derived2.f ^= CONNECTED;
|
||
for (const dep of derived2.deps) {
|
||
(dep.reactions ??= []).push(derived2);
|
||
if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) {
|
||
reconnect(
|
||
/** @type {Derived} */
|
||
dep
|
||
);
|
||
}
|
||
}
|
||
}
|
||
function depends_on_old_values(derived2) {
|
||
if (derived2.v === UNINITIALIZED) return true;
|
||
if (derived2.deps === null) return false;
|
||
for (const dep of derived2.deps) {
|
||
if (old_values.has(dep)) {
|
||
return true;
|
||
}
|
||
if ((dep.f & DERIVED) !== 0 && depends_on_old_values(
|
||
/** @type {Derived} */
|
||
dep
|
||
)) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
function untrack(fn) {
|
||
var previous_untracking = untracking;
|
||
try {
|
||
untracking = true;
|
||
return fn();
|
||
} finally {
|
||
untracking = previous_untracking;
|
||
}
|
||
}
|
||
var STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);
|
||
function set_signal_status(signal, status) {
|
||
signal.f = signal.f & STATUS_MASK | status;
|
||
}
|
||
|
||
// node_modules/svelte/src/utils.js
|
||
var DOM_BOOLEAN_ATTRIBUTES = [
|
||
"allowfullscreen",
|
||
"async",
|
||
"autofocus",
|
||
"autoplay",
|
||
"checked",
|
||
"controls",
|
||
"default",
|
||
"disabled",
|
||
"formnovalidate",
|
||
"indeterminate",
|
||
"inert",
|
||
"ismap",
|
||
"loop",
|
||
"multiple",
|
||
"muted",
|
||
"nomodule",
|
||
"novalidate",
|
||
"open",
|
||
"playsinline",
|
||
"readonly",
|
||
"required",
|
||
"reversed",
|
||
"seamless",
|
||
"selected",
|
||
"webkitdirectory",
|
||
"defer",
|
||
"disablepictureinpicture",
|
||
"disableremoteplayback"
|
||
];
|
||
var DOM_PROPERTIES = [
|
||
...DOM_BOOLEAN_ATTRIBUTES,
|
||
"formNoValidate",
|
||
"isMap",
|
||
"noModule",
|
||
"playsInline",
|
||
"readOnly",
|
||
"value",
|
||
"volume",
|
||
"defaultValue",
|
||
"defaultChecked",
|
||
"srcObject",
|
||
"noValidate",
|
||
"allowFullscreen",
|
||
"disablePictureInPicture",
|
||
"disableRemotePlayback"
|
||
];
|
||
var PASSIVE_EVENTS = ["touchstart", "touchmove"];
|
||
function is_passive_event(name) {
|
||
return PASSIVE_EVENTS.includes(name);
|
||
}
|
||
var STATE_CREATION_RUNES = (
|
||
/** @type {const} */
|
||
[
|
||
"$state",
|
||
"$state.raw",
|
||
"$derived",
|
||
"$derived.by"
|
||
]
|
||
);
|
||
var RUNES = (
|
||
/** @type {const} */
|
||
[
|
||
...STATE_CREATION_RUNES,
|
||
"$state.eager",
|
||
"$state.snapshot",
|
||
"$props",
|
||
"$props.id",
|
||
"$bindable",
|
||
"$effect",
|
||
"$effect.pre",
|
||
"$effect.tracking",
|
||
"$effect.root",
|
||
"$effect.pending",
|
||
"$inspect",
|
||
"$inspect().with",
|
||
"$inspect.trace",
|
||
"$host"
|
||
]
|
||
);
|
||
|
||
// node_modules/svelte/src/internal/client/dev/css.js
|
||
var all_styles = /* @__PURE__ */ new Map();
|
||
function register_style(hash2, style) {
|
||
var styles = all_styles.get(hash2);
|
||
if (!styles) {
|
||
styles = /* @__PURE__ */ new Set();
|
||
all_styles.set(hash2, styles);
|
||
}
|
||
styles.add(style);
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/events.js
|
||
var all_registered_events = /* @__PURE__ */ new Set();
|
||
var 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?.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, capture2, passive2) {
|
||
var options = { capture: capture2, passive: passive2 };
|
||
var target_handler = create_event(event_name, dom, handler, options);
|
||
if (dom === document.body || // @ts-ignore
|
||
dom === window || // @ts-ignore
|
||
dom === document || // Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed
|
||
dom instanceof HTMLMediaElement) {
|
||
teardown(() => {
|
||
dom.removeEventListener(event_name, target_handler, options);
|
||
});
|
||
}
|
||
}
|
||
function delegate(events) {
|
||
for (var i = 0; i < events.length; i++) {
|
||
all_registered_events.add(events[i]);
|
||
}
|
||
for (var fn of root_event_handles) {
|
||
fn(events);
|
||
}
|
||
}
|
||
var last_propagated_event = null;
|
||
function handle_event_propagation(event2) {
|
||
var handler_element = this;
|
||
var owner_document = (
|
||
/** @type {Node} */
|
||
handler_element.ownerDocument
|
||
);
|
||
var event_name = event2.type;
|
||
var path = event2.composedPath?.() || [];
|
||
var current_target = (
|
||
/** @type {null | Element} */
|
||
path[0] || event2.target
|
||
);
|
||
last_propagated_event = event2;
|
||
var path_idx = 0;
|
||
var handled_at = last_propagated_event === event2 && 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)) {
|
||
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);
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/reconciler.js
|
||
function create_fragment_from_html(html2) {
|
||
var elem = document.createElement("template");
|
||
elem.innerHTML = html2.replaceAll("<!>", "<!---->");
|
||
return elem.content;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/template.js
|
||
function assign_nodes(start, end) {
|
||
var effect2 = (
|
||
/** @type {Effect} */
|
||
active_effect
|
||
);
|
||
if (effect2.nodes === null) {
|
||
effect2.nodes = { start, end, a: null, t: null };
|
||
}
|
||
}
|
||
// @__NO_SIDE_EFFECTS__
|
||
function from_html(content, flags2) {
|
||
var is_fragment = (flags2 & TEMPLATE_FRAGMENT) !== 0;
|
||
var use_import_node = (flags2 & 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);
|
||
if (!is_fragment) node = /** @type {TemplateNode} */
|
||
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} */
|
||
get_first_child(clone)
|
||
);
|
||
var end = (
|
||
/** @type {TemplateNode} */
|
||
clone.lastChild
|
||
);
|
||
assign_nodes(start, end);
|
||
} else {
|
||
assign_nodes(clone, clone);
|
||
}
|
||
return clone;
|
||
};
|
||
}
|
||
function append(anchor, dom) {
|
||
if (hydrating) {
|
||
var effect2 = (
|
||
/** @type {Effect & { nodes: EffectNodes }} */
|
||
active_effect
|
||
);
|
||
if ((effect2.f & EFFECT_RAN) === 0 || effect2.nodes.end === null) {
|
||
effect2.nodes.end = hydrate_node;
|
||
}
|
||
hydrate_next();
|
||
return;
|
||
}
|
||
if (anchor === null) {
|
||
return;
|
||
}
|
||
anchor.before(
|
||
/** @type {Node} */
|
||
dom
|
||
);
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/render.js
|
||
var should_intro = true;
|
||
function set_text(text2, value) {
|
||
var str = value == null ? "" : typeof value === "object" ? value + "" : value;
|
||
if (str !== (text2.__t ??= text2.nodeValue)) {
|
||
text2.__t = str;
|
||
text2.nodeValue = str + "";
|
||
}
|
||
}
|
||
function mount(component2, options) {
|
||
return _mount(component2, options);
|
||
}
|
||
function hydrate(component2, 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 = get_first_child(target);
|
||
while (anchor && (anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */
|
||
anchor.data !== HYDRATION_START)) {
|
||
anchor = get_next_sibling(anchor);
|
||
}
|
||
if (!anchor) {
|
||
throw HYDRATION_ERROR;
|
||
}
|
||
set_hydrating(true);
|
||
set_hydrate_node(
|
||
/** @type {Comment} */
|
||
anchor
|
||
);
|
||
const instance = _mount(component2, { ...options, anchor });
|
||
set_hydrating(false);
|
||
return (
|
||
/** @type {Exports} */
|
||
instance
|
||
);
|
||
} catch (error) {
|
||
if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) {
|
||
throw error;
|
||
}
|
||
if (error !== HYDRATION_ERROR) {
|
||
console.warn("Failed to hydrate: ", error);
|
||
}
|
||
if (options.recover === false) {
|
||
hydration_failed();
|
||
}
|
||
init_operations();
|
||
clear_text_content(target);
|
||
set_hydrating(false);
|
||
return mount(component2, options);
|
||
} finally {
|
||
set_hydrating(was_hydrating);
|
||
set_hydrate_node(previous_hydrate_node);
|
||
}
|
||
}
|
||
var 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 passive2 = is_passive_event(event_name);
|
||
target.addEventListener(event_name, handle_event_propagation, { passive: passive2 });
|
||
var n = document_listeners.get(event_name);
|
||
if (n === void 0) {
|
||
document.addEventListener(event_name, handle_event_propagation, { passive: passive2 });
|
||
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 component2 = void 0;
|
||
var unmount2 = component_root(() => {
|
||
var anchor_node = anchor ?? target.appendChild(create_text());
|
||
boundary(
|
||
/** @type {TemplateNode} */
|
||
anchor_node,
|
||
{
|
||
pending: () => {
|
||
}
|
||
},
|
||
(anchor_node2) => {
|
||
if (context) {
|
||
push({});
|
||
var ctx = (
|
||
/** @type {ComponentContext} */
|
||
component_context
|
||
);
|
||
ctx.c = context;
|
||
}
|
||
if (events) {
|
||
props.$$events = events;
|
||
}
|
||
if (hydrating) {
|
||
assign_nodes(
|
||
/** @type {TemplateNode} */
|
||
anchor_node2,
|
||
null
|
||
);
|
||
}
|
||
should_intro = intro;
|
||
component2 = Component(anchor_node2, props) || {};
|
||
should_intro = true;
|
||
if (hydrating) {
|
||
active_effect.nodes.end = hydrate_node;
|
||
if (hydrate_node === null || hydrate_node.nodeType !== COMMENT_NODE || /** @type {Comment} */
|
||
hydrate_node.data !== HYDRATION_END) {
|
||
hydration_mismatch();
|
||
throw HYDRATION_ERROR;
|
||
}
|
||
}
|
||
if (context) {
|
||
pop();
|
||
}
|
||
}
|
||
);
|
||
return () => {
|
||
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) {
|
||
anchor_node.parentNode?.removeChild(anchor_node);
|
||
}
|
||
};
|
||
});
|
||
mounted_components.set(component2, unmount2);
|
||
return component2;
|
||
}
|
||
var mounted_components = /* @__PURE__ */ new WeakMap();
|
||
function unmount(component2, options) {
|
||
const fn = mounted_components.get(component2);
|
||
if (fn) {
|
||
mounted_components.delete(component2);
|
||
return fn(options);
|
||
}
|
||
if (dev_fallback_default) {
|
||
if (STATE_SYMBOL in component2) {
|
||
state_proxy_unmount();
|
||
} else {
|
||
lifecycle_double_unmount();
|
||
}
|
||
}
|
||
return Promise.resolve();
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/blocks/each.js
|
||
function index(_, i) {
|
||
return i;
|
||
}
|
||
function pause_effects(state2, to_destroy, controlled_anchor) {
|
||
var transitions = [];
|
||
var length = to_destroy.length;
|
||
var group;
|
||
var remaining = to_destroy.length;
|
||
for (var i = 0; i < length; i++) {
|
||
let effect2 = to_destroy[i];
|
||
pause_effect(
|
||
effect2,
|
||
() => {
|
||
if (group) {
|
||
group.pending.delete(effect2);
|
||
group.done.add(effect2);
|
||
if (group.pending.size === 0) {
|
||
var groups = (
|
||
/** @type {Set<EachOutroGroup>} */
|
||
state2.outrogroups
|
||
);
|
||
destroy_effects(array_from(group.done));
|
||
groups.delete(group);
|
||
if (groups.size === 0) {
|
||
state2.outrogroups = null;
|
||
}
|
||
}
|
||
} else {
|
||
remaining -= 1;
|
||
}
|
||
},
|
||
false
|
||
);
|
||
}
|
||
if (remaining === 0) {
|
||
var fast_path = transitions.length === 0 && controlled_anchor !== null;
|
||
if (fast_path) {
|
||
var anchor = (
|
||
/** @type {Element} */
|
||
controlled_anchor
|
||
);
|
||
var parent_node = (
|
||
/** @type {Element} */
|
||
anchor.parentNode
|
||
);
|
||
clear_text_content(parent_node);
|
||
parent_node.append(anchor);
|
||
state2.items.clear();
|
||
}
|
||
destroy_effects(to_destroy, !fast_path);
|
||
} else {
|
||
group = {
|
||
pending: new Set(to_destroy),
|
||
done: /* @__PURE__ */ new Set()
|
||
};
|
||
(state2.outrogroups ??= /* @__PURE__ */ new Set()).add(group);
|
||
}
|
||
}
|
||
function destroy_effects(to_destroy, remove_dom = true) {
|
||
for (var i = 0; i < to_destroy.length; i++) {
|
||
destroy_effect(to_destroy[i], remove_dom);
|
||
}
|
||
}
|
||
var offscreen_anchor;
|
||
function each(node, flags2, get_collection, get_key, render_fn, fallback_fn = null) {
|
||
var anchor = node;
|
||
var items = /* @__PURE__ */ new Map();
|
||
var is_controlled = (flags2 & EACH_IS_CONTROLLED) !== 0;
|
||
if (is_controlled) {
|
||
var parent_node = (
|
||
/** @type {Element} */
|
||
node
|
||
);
|
||
anchor = hydrating ? set_hydrate_node(get_first_child(parent_node)) : parent_node.appendChild(create_text());
|
||
}
|
||
if (hydrating) {
|
||
hydrate_next();
|
||
}
|
||
var fallback2 = null;
|
||
var each_array = derived_safe_equal(() => {
|
||
var collection = get_collection();
|
||
return is_array(collection) ? collection : collection == null ? [] : array_from(collection);
|
||
});
|
||
var array;
|
||
var first_run = true;
|
||
function commit() {
|
||
state2.fallback = fallback2;
|
||
reconcile(state2, array, anchor, flags2, get_key);
|
||
if (fallback2 !== null) {
|
||
if (array.length === 0) {
|
||
if ((fallback2.f & EFFECT_OFFSCREEN) === 0) {
|
||
resume_effect(fallback2);
|
||
} else {
|
||
fallback2.f ^= EFFECT_OFFSCREEN;
|
||
move(fallback2, null, anchor);
|
||
}
|
||
} else {
|
||
pause_effect(fallback2, () => {
|
||
fallback2 = null;
|
||
});
|
||
}
|
||
}
|
||
}
|
||
var effect2 = block(() => {
|
||
array = /** @type {V[]} */
|
||
get(each_array);
|
||
var length = array.length;
|
||
let mismatch = false;
|
||
if (hydrating) {
|
||
var is_else = read_hydration_instruction(anchor) === HYDRATION_START_ELSE;
|
||
if (is_else !== (length === 0)) {
|
||
anchor = skip_nodes();
|
||
set_hydrate_node(anchor);
|
||
set_hydrating(false);
|
||
mismatch = true;
|
||
}
|
||
}
|
||
var keys = /* @__PURE__ */ new Set();
|
||
var batch = (
|
||
/** @type {Batch} */
|
||
current_batch
|
||
);
|
||
var defer = should_defer_append();
|
||
for (var index2 = 0; index2 < length; index2 += 1) {
|
||
if (hydrating && hydrate_node.nodeType === COMMENT_NODE && /** @type {Comment} */
|
||
hydrate_node.data === HYDRATION_END) {
|
||
anchor = /** @type {Comment} */
|
||
hydrate_node;
|
||
mismatch = true;
|
||
set_hydrating(false);
|
||
}
|
||
var value = array[index2];
|
||
var key2 = get_key(value, index2);
|
||
var item = first_run ? null : items.get(key2);
|
||
if (item) {
|
||
if (item.v) internal_set(item.v, value);
|
||
if (item.i) internal_set(item.i, index2);
|
||
if (defer) {
|
||
batch.skipped_effects.delete(item.e);
|
||
}
|
||
} else {
|
||
item = create_item(
|
||
items,
|
||
first_run ? anchor : offscreen_anchor ??= create_text(),
|
||
value,
|
||
key2,
|
||
index2,
|
||
render_fn,
|
||
flags2,
|
||
get_collection
|
||
);
|
||
if (!first_run) {
|
||
item.e.f |= EFFECT_OFFSCREEN;
|
||
}
|
||
items.set(key2, item);
|
||
}
|
||
keys.add(key2);
|
||
}
|
||
if (length === 0 && fallback_fn && !fallback2) {
|
||
if (first_run) {
|
||
fallback2 = branch(() => fallback_fn(anchor));
|
||
} else {
|
||
fallback2 = branch(() => fallback_fn(offscreen_anchor ??= create_text()));
|
||
fallback2.f |= EFFECT_OFFSCREEN;
|
||
}
|
||
}
|
||
if (hydrating && length > 0) {
|
||
set_hydrate_node(skip_nodes());
|
||
}
|
||
if (!first_run) {
|
||
if (defer) {
|
||
for (const [key3, item2] of items) {
|
||
if (!keys.has(key3)) {
|
||
batch.skipped_effects.add(item2.e);
|
||
}
|
||
}
|
||
batch.oncommit(commit);
|
||
batch.ondiscard(() => {
|
||
});
|
||
} else {
|
||
commit();
|
||
}
|
||
}
|
||
if (mismatch) {
|
||
set_hydrating(true);
|
||
}
|
||
get(each_array);
|
||
});
|
||
var state2 = { effect: effect2, flags: flags2, items, outrogroups: null, fallback: fallback2 };
|
||
first_run = false;
|
||
if (hydrating) {
|
||
anchor = hydrate_node;
|
||
}
|
||
}
|
||
function reconcile(state2, array, anchor, flags2, get_key) {
|
||
var is_animated = (flags2 & EACH_IS_ANIMATED) !== 0;
|
||
var length = array.length;
|
||
var items = state2.items;
|
||
var current = state2.effect.first;
|
||
var seen;
|
||
var prev = null;
|
||
var to_animate;
|
||
var matched = [];
|
||
var stashed = [];
|
||
var value;
|
||
var key2;
|
||
var effect2;
|
||
var i;
|
||
if (is_animated) {
|
||
for (i = 0; i < length; i += 1) {
|
||
value = array[i];
|
||
key2 = get_key(value, i);
|
||
effect2 = /** @type {EachItem} */
|
||
items.get(key2).e;
|
||
if ((effect2.f & EFFECT_OFFSCREEN) === 0) {
|
||
effect2.nodes?.a?.measure();
|
||
(to_animate ??= /* @__PURE__ */ new Set()).add(effect2);
|
||
}
|
||
}
|
||
}
|
||
for (i = 0; i < length; i += 1) {
|
||
value = array[i];
|
||
key2 = get_key(value, i);
|
||
effect2 = /** @type {EachItem} */
|
||
items.get(key2).e;
|
||
if (state2.outrogroups !== null) {
|
||
for (const group of state2.outrogroups) {
|
||
group.pending.delete(effect2);
|
||
group.done.delete(effect2);
|
||
}
|
||
}
|
||
if ((effect2.f & EFFECT_OFFSCREEN) !== 0) {
|
||
effect2.f ^= EFFECT_OFFSCREEN;
|
||
if (effect2 === current) {
|
||
move(effect2, null, anchor);
|
||
} else {
|
||
var next2 = prev ? prev.next : current;
|
||
if (effect2 === state2.effect.last) {
|
||
state2.effect.last = effect2.prev;
|
||
}
|
||
if (effect2.prev) effect2.prev.next = effect2.next;
|
||
if (effect2.next) effect2.next.prev = effect2.prev;
|
||
link(state2, prev, effect2);
|
||
link(state2, effect2, next2);
|
||
move(effect2, next2, anchor);
|
||
prev = effect2;
|
||
matched = [];
|
||
stashed = [];
|
||
current = prev.next;
|
||
continue;
|
||
}
|
||
}
|
||
if ((effect2.f & INERT) !== 0) {
|
||
resume_effect(effect2);
|
||
if (is_animated) {
|
||
effect2.nodes?.a?.unfix();
|
||
(to_animate ??= /* @__PURE__ */ new Set()).delete(effect2);
|
||
}
|
||
}
|
||
if (effect2 !== current) {
|
||
if (seen !== void 0 && seen.has(effect2)) {
|
||
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(effect2);
|
||
move(effect2, current, anchor);
|
||
link(state2, effect2.prev, effect2.next);
|
||
link(state2, effect2, prev === null ? state2.effect.first : prev.next);
|
||
link(state2, prev, effect2);
|
||
prev = effect2;
|
||
}
|
||
continue;
|
||
}
|
||
matched = [];
|
||
stashed = [];
|
||
while (current !== null && current !== effect2) {
|
||
(seen ??= /* @__PURE__ */ new Set()).add(current);
|
||
stashed.push(current);
|
||
current = current.next;
|
||
}
|
||
if (current === null) {
|
||
continue;
|
||
}
|
||
}
|
||
if ((effect2.f & EFFECT_OFFSCREEN) === 0) {
|
||
matched.push(effect2);
|
||
}
|
||
prev = effect2;
|
||
current = effect2.next;
|
||
}
|
||
if (state2.outrogroups !== null) {
|
||
for (const group of state2.outrogroups) {
|
||
if (group.pending.size === 0) {
|
||
destroy_effects(array_from(group.done));
|
||
state2.outrogroups?.delete(group);
|
||
}
|
||
}
|
||
if (state2.outrogroups.size === 0) {
|
||
state2.outrogroups = null;
|
||
}
|
||
}
|
||
if (current !== null || seen !== void 0) {
|
||
var to_destroy = [];
|
||
if (seen !== void 0) {
|
||
for (effect2 of seen) {
|
||
if ((effect2.f & INERT) === 0) {
|
||
to_destroy.push(effect2);
|
||
}
|
||
}
|
||
}
|
||
while (current !== null) {
|
||
if ((current.f & INERT) === 0 && current !== state2.fallback) {
|
||
to_destroy.push(current);
|
||
}
|
||
current = current.next;
|
||
}
|
||
var destroy_length = to_destroy.length;
|
||
if (destroy_length > 0) {
|
||
var controlled_anchor = (flags2 & EACH_IS_CONTROLLED) !== 0 && length === 0 ? anchor : null;
|
||
if (is_animated) {
|
||
for (i = 0; i < destroy_length; i += 1) {
|
||
to_destroy[i].nodes?.a?.measure();
|
||
}
|
||
for (i = 0; i < destroy_length; i += 1) {
|
||
to_destroy[i].nodes?.a?.fix();
|
||
}
|
||
}
|
||
pause_effects(state2, to_destroy, controlled_anchor);
|
||
}
|
||
}
|
||
if (is_animated) {
|
||
queue_micro_task(() => {
|
||
if (to_animate === void 0) return;
|
||
for (effect2 of to_animate) {
|
||
effect2.nodes?.a?.apply();
|
||
}
|
||
});
|
||
}
|
||
}
|
||
function create_item(items, anchor, value, key2, index2, render_fn, flags2, get_collection) {
|
||
var v = (flags2 & EACH_ITEM_REACTIVE) !== 0 ? (flags2 & EACH_ITEM_IMMUTABLE) === 0 ? mutable_source(value, false, false) : source(value) : null;
|
||
var i = (flags2 & EACH_INDEX_REACTIVE) !== 0 ? source(index2) : null;
|
||
if (dev_fallback_default && v) {
|
||
v.trace = () => {
|
||
get_collection()[i?.v ?? index2];
|
||
};
|
||
}
|
||
return {
|
||
v,
|
||
i,
|
||
e: branch(() => {
|
||
render_fn(anchor, v ?? value, i ?? index2, get_collection);
|
||
return () => {
|
||
items.delete(key2);
|
||
};
|
||
})
|
||
};
|
||
}
|
||
function move(effect2, next2, anchor) {
|
||
if (!effect2.nodes) return;
|
||
var node = effect2.nodes.start;
|
||
var end = effect2.nodes.end;
|
||
var dest = next2 && (next2.f & EFFECT_OFFSCREEN) === 0 ? (
|
||
/** @type {EffectNodes} */
|
||
next2.nodes.start
|
||
) : anchor;
|
||
while (node !== null) {
|
||
var next_node = (
|
||
/** @type {TemplateNode} */
|
||
get_next_sibling(node)
|
||
);
|
||
dest.before(node);
|
||
if (node === end) {
|
||
return;
|
||
}
|
||
node = next_node;
|
||
}
|
||
}
|
||
function link(state2, prev, next2) {
|
||
if (prev === null) {
|
||
state2.effect.first = next2;
|
||
} else {
|
||
prev.next = next2;
|
||
}
|
||
if (next2 === null) {
|
||
state2.effect.last = prev;
|
||
} else {
|
||
next2.prev = prev;
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/css.js
|
||
function append_styles(anchor, css) {
|
||
effect(() => {
|
||
var root6 = anchor.getRootNode();
|
||
var target = (
|
||
/** @type {ShadowRoot} */
|
||
root6.host ? (
|
||
/** @type {ShadowRoot} */
|
||
root6
|
||
) : (
|
||
/** @type {Document} */
|
||
root6.head ?? /** @type {Document} */
|
||
root6.ownerDocument.head
|
||
)
|
||
);
|
||
if (!target.querySelector("#" + css.hash)) {
|
||
const style = document.createElement("style");
|
||
style.id = css.hash;
|
||
style.textContent = css.code;
|
||
target.appendChild(style);
|
||
if (dev_fallback_default) {
|
||
register_style(css.hash, style);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/shared/attributes.js
|
||
var whitespace = [..." \n\r\f\xA0\v\uFEFF"];
|
||
function to_class(value, hash2, directives) {
|
||
var classname = value == null ? "" : "" + value;
|
||
if (hash2) {
|
||
classname = classname ? classname + " " + hash2 : hash2;
|
||
}
|
||
if (directives) {
|
||
for (var key2 in directives) {
|
||
if (directives[key2]) {
|
||
classname = classname ? classname + " " + key2 : key2;
|
||
} else if (classname.length) {
|
||
var len = key2.length;
|
||
var a = 0;
|
||
while ((a = classname.indexOf(key2, 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;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/class.js
|
||
function set_class(dom, is_html, value, hash2, prev_classes, next_classes) {
|
||
var prev = dom.__className;
|
||
if (hydrating || prev !== value || prev === void 0) {
|
||
var next_class_name = to_class(value, hash2, next_classes);
|
||
if (!hydrating || next_class_name !== dom.getAttribute("class")) {
|
||
if (next_class_name == null) {
|
||
dom.removeAttribute("class");
|
||
} else if (is_html) {
|
||
dom.className = next_class_name;
|
||
} else {
|
||
dom.setAttribute("class", next_class_name);
|
||
}
|
||
}
|
||
dom.__className = value;
|
||
} else if (next_classes && prev_classes !== next_classes) {
|
||
for (var key2 in next_classes) {
|
||
var is_present = !!next_classes[key2];
|
||
if (prev_classes == null || is_present !== !!prev_classes[key2]) {
|
||
dom.classList.toggle(key2, is_present);
|
||
}
|
||
}
|
||
}
|
||
return next_classes;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/bindings/select.js
|
||
function select_option(select, value, mounting = false) {
|
||
if (select.multiple) {
|
||
if (value == void 0) {
|
||
return;
|
||
}
|
||
if (!is_array(value)) {
|
||
return select_multiple_invalid_value();
|
||
}
|
||
for (var option of select.options) {
|
||
option.selected = value.includes(get_option_value(option));
|
||
}
|
||
return;
|
||
}
|
||
for (option of select.options) {
|
||
var option_value = get_option_value(option);
|
||
if (is(option_value, value)) {
|
||
option.selected = true;
|
||
return;
|
||
}
|
||
}
|
||
if (!mounting || value !== void 0) {
|
||
select.selectedIndex = -1;
|
||
}
|
||
}
|
||
function init_select(select) {
|
||
var observer = new MutationObserver(() => {
|
||
select_option(select, select.__value);
|
||
});
|
||
observer.observe(select, {
|
||
// Listen to option element changes
|
||
childList: true,
|
||
subtree: true,
|
||
// because of <optgroup>
|
||
// Listen to option element value attribute changes
|
||
// (doesn't get notified of select value changes,
|
||
// because that property is not reflected as an attribute)
|
||
attributes: true,
|
||
attributeFilter: ["value"]
|
||
});
|
||
teardown(() => {
|
||
observer.disconnect();
|
||
});
|
||
}
|
||
function bind_select_value(select, get3, set2 = get3) {
|
||
var batches2 = /* @__PURE__ */ new WeakSet();
|
||
var mounting = true;
|
||
listen_to_event_and_reset_event(select, "change", (is_reset) => {
|
||
var query = is_reset ? "[selected]" : ":checked";
|
||
var value;
|
||
if (select.multiple) {
|
||
value = [].map.call(select.querySelectorAll(query), get_option_value);
|
||
} else {
|
||
var selected_option = select.querySelector(query) ?? // will fall back to first non-disabled option if no option is selected
|
||
select.querySelector("option:not([disabled])");
|
||
value = selected_option && get_option_value(selected_option);
|
||
}
|
||
set2(value);
|
||
if (current_batch !== null) {
|
||
batches2.add(current_batch);
|
||
}
|
||
});
|
||
effect(() => {
|
||
var value = get3();
|
||
if (select === document.activeElement) {
|
||
var batch = (
|
||
/** @type {Batch} */
|
||
previous_batch ?? current_batch
|
||
);
|
||
if (batches2.has(batch)) {
|
||
return;
|
||
}
|
||
}
|
||
select_option(select, value, mounting);
|
||
if (mounting && value === void 0) {
|
||
var selected_option = select.querySelector(":checked");
|
||
if (selected_option !== null) {
|
||
value = get_option_value(selected_option);
|
||
set2(value);
|
||
}
|
||
}
|
||
select.__value = value;
|
||
mounting = false;
|
||
});
|
||
init_select(select);
|
||
}
|
||
function get_option_value(option) {
|
||
if ("__value" in option) {
|
||
return option.__value;
|
||
} else {
|
||
return option.value;
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/attributes.js
|
||
var CLASS = Symbol("class");
|
||
var STYLE = Symbol("style");
|
||
var IS_CUSTOM_ELEMENT = Symbol("is custom element");
|
||
var IS_HTML = Symbol("is html");
|
||
function remove_input_defaults(input) {
|
||
if (!hydrating) return;
|
||
var already_removed = false;
|
||
var remove_defaults = () => {
|
||
if (already_removed) return;
|
||
already_removed = true;
|
||
if (input.hasAttribute("value")) {
|
||
var value = input.value;
|
||
set_attribute2(input, "value", null);
|
||
input.value = value;
|
||
}
|
||
if (input.hasAttribute("checked")) {
|
||
var checked = input.checked;
|
||
set_attribute2(input, "checked", null);
|
||
input.checked = checked;
|
||
}
|
||
};
|
||
input.__on_r = remove_defaults;
|
||
queue_micro_task(remove_defaults);
|
||
add_form_reset_listener();
|
||
}
|
||
function set_checked(element2, checked) {
|
||
var attributes = get_attributes(element2);
|
||
if (attributes.checked === (attributes.checked = // treat null and undefined the same for the initial value
|
||
checked ?? void 0)) {
|
||
return;
|
||
}
|
||
element2.checked = checked;
|
||
}
|
||
function set_attribute2(element2, attribute, value, skip_warning) {
|
||
var attributes = get_attributes(element2);
|
||
if (hydrating) {
|
||
attributes[attribute] = element2.getAttribute(attribute);
|
||
if (attribute === "src" || attribute === "srcset" || attribute === "href" && element2.nodeName === "LINK") {
|
||
if (!skip_warning) {
|
||
check_src_in_dev_hydration(element2, attribute, value ?? "");
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
if (attributes[attribute] === (attributes[attribute] = value)) return;
|
||
if (attribute === "loading") {
|
||
element2[LOADING_ATTR_SYMBOL] = value;
|
||
}
|
||
if (value == null) {
|
||
element2.removeAttribute(attribute);
|
||
} else if (typeof value !== "string" && get_setters(element2).includes(attribute)) {
|
||
element2[attribute] = value;
|
||
} else {
|
||
element2.setAttribute(attribute, value);
|
||
}
|
||
}
|
||
function get_attributes(element2) {
|
||
return (
|
||
/** @type {Record<string | symbol, unknown>} **/
|
||
// @ts-expect-error
|
||
element2.__attributes ??= {
|
||
[IS_CUSTOM_ELEMENT]: element2.nodeName.includes("-"),
|
||
[IS_HTML]: element2.namespaceURI === NAMESPACE_HTML
|
||
}
|
||
);
|
||
}
|
||
var setters_cache = /* @__PURE__ */ new Map();
|
||
function get_setters(element2) {
|
||
var cache_key = element2.getAttribute("is") || element2.nodeName;
|
||
var setters = setters_cache.get(cache_key);
|
||
if (setters) return setters;
|
||
setters_cache.set(cache_key, setters = []);
|
||
var descriptors;
|
||
var proto = element2;
|
||
var element_proto = Element.prototype;
|
||
while (element_proto !== proto) {
|
||
descriptors = get_descriptors(proto);
|
||
for (var key2 in descriptors) {
|
||
if (descriptors[key2].set) {
|
||
setters.push(key2);
|
||
}
|
||
}
|
||
proto = get_prototype_of(proto);
|
||
}
|
||
return setters;
|
||
}
|
||
function check_src_in_dev_hydration(element2, attribute, value) {
|
||
if (!dev_fallback_default) return;
|
||
if (attribute === "srcset" && srcset_url_equal(element2, value)) return;
|
||
if (src_url_equal(element2.getAttribute(attribute) ?? "", value)) return;
|
||
hydration_attribute_changed(
|
||
attribute,
|
||
element2.outerHTML.replace(element2.innerHTML, element2.innerHTML && "..."),
|
||
String(value)
|
||
);
|
||
}
|
||
function src_url_equal(element_src, url) {
|
||
if (element_src === url) return true;
|
||
return new URL(element_src, document.baseURI).href === new URL(url, document.baseURI).href;
|
||
}
|
||
function split_srcset(srcset) {
|
||
return srcset.split(",").map((src) => src.trim().split(" ").filter(Boolean));
|
||
}
|
||
function srcset_url_equal(element2, srcset) {
|
||
var element_urls = split_srcset(element2.srcset);
|
||
var urls = split_srcset(srcset);
|
||
return urls.length === element_urls.length && urls.every(
|
||
([url, width], i) => width === element_urls[i][1] && // We need to test both ways because Vite will create an a full URL with
|
||
// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the
|
||
// relative URLs inside srcset are not automatically resolved to absolute URLs by
|
||
// browsers (in contrast to img.src). This means both SSR and DOM code could
|
||
// contain relative or absolute URLs.
|
||
(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))
|
||
);
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/bindings/input.js
|
||
function bind_value(input, get3, set2 = get3) {
|
||
var batches2 = /* @__PURE__ */ new WeakSet();
|
||
listen_to_event_and_reset_event(input, "input", async (is_reset) => {
|
||
if (dev_fallback_default && input.type === "checkbox") {
|
||
bind_invalid_checkbox_value();
|
||
}
|
||
var value = is_reset ? input.defaultValue : input.value;
|
||
value = is_numberlike_input(input) ? to_number(value) : value;
|
||
set2(value);
|
||
if (current_batch !== null) {
|
||
batches2.add(current_batch);
|
||
}
|
||
await tick();
|
||
if (value !== (value = get3())) {
|
||
var start = input.selectionStart;
|
||
var end = input.selectionEnd;
|
||
var length = input.value.length;
|
||
input.value = value ?? "";
|
||
if (end !== null) {
|
||
var new_length = input.value.length;
|
||
if (start === end && end === length && new_length > length) {
|
||
input.selectionStart = new_length;
|
||
input.selectionEnd = new_length;
|
||
} else {
|
||
input.selectionStart = start;
|
||
input.selectionEnd = Math.min(end, new_length);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
if (
|
||
// If we are hydrating and the value has since changed,
|
||
// then use the updated value from the input instead.
|
||
hydrating && input.defaultValue !== input.value || // If defaultValue is set, then value == defaultValue
|
||
// TODO Svelte 6: remove input.value check and set to empty string?
|
||
untrack(get3) == null && input.value
|
||
) {
|
||
set2(is_numberlike_input(input) ? to_number(input.value) : input.value);
|
||
if (current_batch !== null) {
|
||
batches2.add(current_batch);
|
||
}
|
||
}
|
||
render_effect(() => {
|
||
if (dev_fallback_default && input.type === "checkbox") {
|
||
bind_invalid_checkbox_value();
|
||
}
|
||
var value = get3();
|
||
if (input === document.activeElement) {
|
||
var batch = (
|
||
/** @type {Batch} */
|
||
previous_batch ?? current_batch
|
||
);
|
||
if (batches2.has(batch)) {
|
||
return;
|
||
}
|
||
}
|
||
if (is_numberlike_input(input) && value === to_number(input.value)) {
|
||
return;
|
||
}
|
||
if (input.type === "date" && !value && !input.value) {
|
||
return;
|
||
}
|
||
if (value !== input.value) {
|
||
input.value = value ?? "";
|
||
}
|
||
});
|
||
}
|
||
function bind_checked(input, get3, set2 = get3) {
|
||
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.
|
||
hydrating && input.defaultChecked !== input.checked || // If defaultChecked is set, then checked == defaultChecked
|
||
untrack(get3) == null
|
||
) {
|
||
set2(input.checked);
|
||
}
|
||
render_effect(() => {
|
||
var value = get3();
|
||
input.checked = Boolean(value);
|
||
});
|
||
}
|
||
function is_numberlike_input(input) {
|
||
var type = input.type;
|
||
return type === "number" || type === "range";
|
||
}
|
||
function to_number(value) {
|
||
return value === "" ? null : +value;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/bindings/this.js
|
||
function is_bound_this(bound_value, element_or_component) {
|
||
return bound_value === element_or_component || bound_value?.[STATE_SYMBOL] === element_or_component;
|
||
}
|
||
function bind_this(element_or_component = {}, update2, get_value, get_parts) {
|
||
effect(() => {
|
||
var old_parts;
|
||
var parts;
|
||
render_effect(() => {
|
||
old_parts = parts;
|
||
parts = get_parts?.() || [];
|
||
untrack(() => {
|
||
if (element_or_component !== get_value(...parts)) {
|
||
update2(element_or_component, ...parts);
|
||
if (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) {
|
||
update2(null, ...old_parts);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
return () => {
|
||
queue_micro_task(() => {
|
||
if (parts && is_bound_this(get_value(...parts), element_or_component)) {
|
||
update2(null, ...parts);
|
||
}
|
||
});
|
||
};
|
||
});
|
||
return element_or_component;
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/store.js
|
||
var is_store_binding = false;
|
||
var IS_UNMOUNTED = Symbol();
|
||
function capture_store_binding(fn) {
|
||
var previous_is_store_binding = is_store_binding;
|
||
try {
|
||
is_store_binding = false;
|
||
return [fn(), is_store_binding];
|
||
} finally {
|
||
is_store_binding = previous_is_store_binding;
|
||
}
|
||
}
|
||
|
||
// node_modules/svelte/src/internal/client/reactivity/props.js
|
||
function prop(props, key2, flags2, fallback2) {
|
||
var runes = !legacy_mode_flag || (flags2 & PROPS_IS_RUNES) !== 0;
|
||
var bindable = (flags2 & PROPS_IS_BINDABLE) !== 0;
|
||
var lazy = (flags2 & PROPS_IS_LAZY_INITIAL) !== 0;
|
||
var fallback_value = (
|
||
/** @type {V} */
|
||
fallback2
|
||
);
|
||
var fallback_dirty = true;
|
||
var get_fallback = () => {
|
||
if (fallback_dirty) {
|
||
fallback_dirty = false;
|
||
fallback_value = lazy ? untrack(
|
||
/** @type {() => V} */
|
||
fallback2
|
||
) : (
|
||
/** @type {V} */
|
||
fallback2
|
||
);
|
||
}
|
||
return fallback_value;
|
||
};
|
||
var setter;
|
||
if (bindable) {
|
||
var is_entry_props = STATE_SYMBOL in props || LEGACY_PROPS in props;
|
||
setter = get_descriptor(props, key2)?.set ?? (is_entry_props && key2 in props ? (v) => props[key2] = v : void 0);
|
||
}
|
||
var initial_value;
|
||
var is_store_sub = false;
|
||
if (bindable) {
|
||
[initial_value, is_store_sub] = capture_store_binding(() => (
|
||
/** @type {V} */
|
||
props[key2]
|
||
));
|
||
} else {
|
||
initial_value = /** @type {V} */
|
||
props[key2];
|
||
}
|
||
if (initial_value === void 0 && fallback2 !== void 0) {
|
||
initial_value = get_fallback();
|
||
if (setter) {
|
||
if (runes) props_invalid_value(key2);
|
||
setter(initial_value);
|
||
}
|
||
}
|
||
var getter;
|
||
if (runes) {
|
||
getter = () => {
|
||
var value = (
|
||
/** @type {V} */
|
||
props[key2]
|
||
);
|
||
if (value === void 0) return get_fallback();
|
||
fallback_dirty = true;
|
||
return value;
|
||
};
|
||
} else {
|
||
getter = () => {
|
||
var value = (
|
||
/** @type {V} */
|
||
props[key2]
|
||
);
|
||
if (value !== void 0) {
|
||
fallback_value = /** @type {V} */
|
||
void 0;
|
||
}
|
||
return value === void 0 ? fallback_value : value;
|
||
};
|
||
}
|
||
if (runes && (flags2 & PROPS_IS_UPDATED) === 0) {
|
||
return getter;
|
||
}
|
||
if (setter) {
|
||
var legacy_parent = props.$$legacy;
|
||
return (
|
||
/** @type {() => V} */
|
||
(function(value, mutation) {
|
||
if (arguments.length > 0) {
|
||
if (!runes || !mutation || legacy_parent || is_store_sub) {
|
||
setter(mutation ? getter() : value);
|
||
}
|
||
return value;
|
||
}
|
||
return getter();
|
||
})
|
||
);
|
||
}
|
||
var overridden = false;
|
||
var d = ((flags2 & PROPS_IS_IMMUTABLE) !== 0 ? derived : derived_safe_equal)(() => {
|
||
overridden = false;
|
||
return getter();
|
||
});
|
||
if (dev_fallback_default) {
|
||
d.label = key2;
|
||
}
|
||
if (bindable) get(d);
|
||
var parent_effect = (
|
||
/** @type {Effect} */
|
||
active_effect
|
||
);
|
||
return (
|
||
/** @type {() => V} */
|
||
(function(value, mutation) {
|
||
if (arguments.length > 0) {
|
||
const new_value = mutation ? get(d) : runes && bindable ? proxy(value) : value;
|
||
set(d, new_value);
|
||
overridden = true;
|
||
if (fallback_value !== void 0) {
|
||
fallback_value = new_value;
|
||
}
|
||
return value;
|
||
}
|
||
if (is_destroying_effect && overridden || (parent_effect.f & DESTROYED) !== 0) {
|
||
return d.v;
|
||
}
|
||
return get(d);
|
||
})
|
||
);
|
||
}
|
||
|
||
// node_modules/svelte/src/legacy/legacy-client.js
|
||
function createClassComponent(options) {
|
||
return new Svelte4Component(options);
|
||
}
|
||
var Svelte4Component = class {
|
||
/** @type {any} */
|
||
#events;
|
||
/** @type {Record<string, any>} */
|
||
#instance;
|
||
/**
|
||
* @param {ComponentConstructorOptions & {
|
||
* component: any;
|
||
* }} options
|
||
*/
|
||
constructor(options) {
|
||
var sources = /* @__PURE__ */ new Map();
|
||
var add_source = (key2, value) => {
|
||
var s = mutable_source(value, false, false);
|
||
sources.set(key2, 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) {
|
||
if (prop2 === LEGACY_PROPS) return true;
|
||
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);
|
||
}
|
||
}
|
||
);
|
||
this.#instance = (options.hydrate ? hydrate : mount)(options.component, {
|
||
target: options.target,
|
||
anchor: options.anchor,
|
||
props,
|
||
context: options.context,
|
||
intro: options.intro ?? false,
|
||
recover: options.recover
|
||
});
|
||
if (!async_mode_flag && (!options?.props?.$$host || options.sync === false)) {
|
||
flushSync();
|
||
}
|
||
this.#events = props.$$events;
|
||
for (const key2 of Object.keys(this.#instance)) {
|
||
if (key2 === "$set" || key2 === "$destroy" || key2 === "$on") continue;
|
||
define_property(this, key2, {
|
||
get() {
|
||
return this.#instance[key2];
|
||
},
|
||
/** @param {any} value */
|
||
set(value) {
|
||
this.#instance[key2] = value;
|
||
},
|
||
enumerable: true
|
||
});
|
||
}
|
||
this.#instance.$set = /** @param {Record<string, any>} next */
|
||
(next2) => {
|
||
Object.assign(props, next2);
|
||
};
|
||
this.#instance.$destroy = () => {
|
||
unmount(this.#instance);
|
||
};
|
||
}
|
||
/** @param {Record<string, any>} props */
|
||
$set(props) {
|
||
this.#instance.$set(props);
|
||
}
|
||
/**
|
||
* @param {string} event
|
||
* @param {(...args: any[]) => any} callback
|
||
* @returns {any}
|
||
*/
|
||
$on(event2, callback) {
|
||
this.#events[event2] = this.#events[event2] || [];
|
||
const cb = (...args) => callback.call(this, ...args);
|
||
this.#events[event2].push(cb);
|
||
return () => {
|
||
this.#events[event2] = this.#events[event2].filter(
|
||
/** @param {any} fn */
|
||
(fn) => fn !== cb
|
||
);
|
||
};
|
||
}
|
||
$destroy() {
|
||
this.#instance.$destroy();
|
||
}
|
||
};
|
||
|
||
// node_modules/svelte/src/internal/client/dom/elements/custom-element.js
|
||
var SvelteElement;
|
||
if (typeof HTMLElement === "function") {
|
||
SvelteElement = class extends HTMLElement {
|
||
/** The Svelte component constructor */
|
||
$$ctor;
|
||
/** Slots */
|
||
$$s;
|
||
/** @type {any} The Svelte component instance */
|
||
$$c;
|
||
/** Whether or not the custom element is connected */
|
||
$$cn = false;
|
||
/** @type {Record<string, any>} Component props data */
|
||
$$d = {};
|
||
/** `true` if currently in the process of reflecting component props back to attributes */
|
||
$$r = false;
|
||
/** @type {Record<string, CustomElementPropDefinition>} Props definition (name, reflected, type etc) */
|
||
$$p_d = {};
|
||
/** @type {Record<string, EventListenerOrEventListenerObject[]>} Event listeners */
|
||
$$l = {};
|
||
/** @type {Map<EventListenerOrEventListenerObject, Function>} Event listener unsubscribe functions */
|
||
$$l_u = /* @__PURE__ */ new Map();
|
||
/** @type {any} The managed render effect for reflecting attributes */
|
||
$$me;
|
||
/**
|
||
* @param {*} $$componentCtor
|
||
* @param {*} $$slots
|
||
* @param {*} use_shadow_dom
|
||
*/
|
||
constructor($$componentCtor, $$slots, use_shadow_dom) {
|
||
super();
|
||
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_slot = function(name) {
|
||
return (anchor) => {
|
||
const slot2 = document.createElement("slot");
|
||
if (name !== "default") slot2.name = name;
|
||
append(anchor, slot2);
|
||
};
|
||
};
|
||
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_slot(name);
|
||
$$slots.default = true;
|
||
} else {
|
||
$$slots[name] = create_slot(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 key2 in this.$$p_d) {
|
||
if (!(key2 in this.$$d) && this[key2] !== void 0) {
|
||
this.$$d[key2] = this[key2];
|
||
delete this[key2];
|
||
}
|
||
}
|
||
this.$$c = createClassComponent({
|
||
component: this.$$ctor,
|
||
target: this.shadowRoot || this,
|
||
props: {
|
||
...this.$$d,
|
||
$$slots,
|
||
$$host: this
|
||
}
|
||
});
|
||
this.$$me = effect_root(() => {
|
||
render_effect(() => {
|
||
this.$$r = true;
|
||
for (const key2 of object_keys(this.$$c)) {
|
||
if (!this.$$p_d[key2]?.reflect) continue;
|
||
this.$$d[key2] = this.$$c[key2];
|
||
const attribute_value = get_custom_element_value(
|
||
key2,
|
||
this.$$d[key2],
|
||
this.$$p_d,
|
||
"toAttribute"
|
||
);
|
||
if (attribute_value == null) {
|
||
this.removeAttribute(this.$$p_d[key2].attribute || key2);
|
||
} else {
|
||
this.setAttribute(this.$$p_d[key2].attribute || key2, 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(attr2, _oldValue, newValue) {
|
||
if (this.$$r) return;
|
||
attr2 = this.$$g_p(attr2);
|
||
this.$$d[attr2] = get_custom_element_value(attr2, newValue, this.$$p_d, "toProp");
|
||
this.$$c?.$set({ [attr2]: this.$$d[attr2] });
|
||
}
|
||
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(
|
||
(key2) => this.$$p_d[key2].attribute === attribute_name || !this.$$p_d[key2].attribute && key2.toLowerCase() === attribute_name
|
||
) || attribute_name;
|
||
}
|
||
};
|
||
}
|
||
function get_custom_element_value(prop2, value, props_definition, transform) {
|
||
const type = props_definition[prop2]?.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;
|
||
// conversion already handled above
|
||
case "Number":
|
||
return value != null ? +value : value;
|
||
default:
|
||
return value;
|
||
}
|
||
}
|
||
}
|
||
function get_custom_elements_slots(element2) {
|
||
const result = {};
|
||
element2.childNodes.forEach((node) => {
|
||
result[
|
||
/** @type {Element} node */
|
||
node.slot || "default"
|
||
] = true;
|
||
});
|
||
return result;
|
||
}
|
||
|
||
// node_modules/svelte/src/index-client.js
|
||
if (dev_fallback_default) {
|
||
let throw_rune_error = function(rune) {
|
||
if (!(rune in globalThis)) {
|
||
let value;
|
||
Object.defineProperty(globalThis, rune, {
|
||
configurable: true,
|
||
// eslint-disable-next-line getter-return
|
||
get: () => {
|
||
if (value !== void 0) {
|
||
return value;
|
||
}
|
||
rune_outside_svelte(rune);
|
||
},
|
||
set: (v) => {
|
||
value = v;
|
||
}
|
||
});
|
||
}
|
||
};
|
||
throw_rune_error("$state");
|
||
throw_rune_error("$effect");
|
||
throw_rune_error("$derived");
|
||
throw_rune_error("$inspect");
|
||
throw_rune_error("$props");
|
||
throw_rune_error("$bindable");
|
||
}
|
||
function onMount(fn) {
|
||
if (component_context === null) {
|
||
lifecycle_outside_component("onMount");
|
||
}
|
||
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 ??= { a: [], b: [], m: [] };
|
||
}
|
||
|
||
// node_modules/svelte/src/version.js
|
||
var PUBLIC_VERSION = "5";
|
||
|
||
// node_modules/svelte/src/internal/disclose-version.js
|
||
if (typeof window !== "undefined") {
|
||
((window.__svelte ??= {}).v ??= /* @__PURE__ */ new Set()).add(PUBLIC_VERSION);
|
||
}
|
||
|
||
// node_modules/tslib/tslib.es6.js
|
||
function __awaiter(thisArg, _arguments, P, generator) {
|
||
function adopt(value) {
|
||
return value instanceof P ? value : new P(function(resolve) {
|
||
resolve(value);
|
||
});
|
||
}
|
||
return new (P || (P = Promise))(function(resolve, reject) {
|
||
function fulfilled(value) {
|
||
try {
|
||
step(generator.next(value));
|
||
} catch (e) {
|
||
reject(e);
|
||
}
|
||
}
|
||
function rejected(value) {
|
||
try {
|
||
step(generator["throw"](value));
|
||
} catch (e) {
|
||
reject(e);
|
||
}
|
||
}
|
||
function step(result) {
|
||
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
||
}
|
||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
});
|
||
}
|
||
|
||
// src/AddPropInput.svelte
|
||
var root_1 = from_html(`<option> </option>`);
|
||
var root = from_html(`<div class="modal-input-container svelte-1jh3cip"><a id="del-btn" href="href">X</a> <select id="type-input" class="flex-obj svelte-1jh3cip"></select> <input id="name-input" class="name-input flex-obj svelte-1jh3cip" type="text" name="name[]" placeholder="name" required/> <input id="value-input" type="text" name="value[]" placeholder="value" class="value-input flex-obj svelte-1jh3cip"/></div>`);
|
||
var $$css = {
|
||
hash: "svelte-1jh3cip",
|
||
code: "input.svelte-1jh3cip {max-height:25px;overflow-x:auto;}select.svelte-1jh3cip {height:21px;}#name-input.svelte-1jh3cip {flex-grow:0;width:auto;}.modal-input-container.svelte-1jh3cip {width:95%;display:flex;flex-direction:row;align-items:center;gap:10px;margin-top:10px;}.btn-inactive.svelte-1jh3cip {cursor:not-allowed;pointer-events:none;opacity:0.7;}"
|
||
};
|
||
function AddPropInput($$anchor, $$props) {
|
||
push($$props, true);
|
||
append_styles($$anchor, $$css);
|
||
let totalInputs = prop($$props, "totalInputs", 11, 0), typeVal = prop($$props, "typeVal", 11, "text"), nameVal = prop($$props, "nameVal", 15, ""), valueVal = prop($$props, "valueVal", 15, "");
|
||
let inputEl = state(proxy(document.createElement("input")));
|
||
let valueEl = state(proxy(document.createElement("input")));
|
||
const options = {
|
||
Text: "string",
|
||
Number: "number",
|
||
Checkbox: "checkbox",
|
||
Date: "date",
|
||
Datetime: "datetime-local"
|
||
};
|
||
const convertProps = {
|
||
text: "Text",
|
||
multitext: "Text",
|
||
tags: "Text",
|
||
aliases: "Text",
|
||
number: "Number",
|
||
checkbox: "Checkbox",
|
||
date: "Date",
|
||
datetime: "Datetime"
|
||
};
|
||
let optionVal = state(proxy(options[convertProps[typeVal()]]));
|
||
onMount(() => __awaiter(void 0, void 0, void 0, function* () {
|
||
yield tick();
|
||
get(inputEl).focus();
|
||
get(inputEl).select();
|
||
set(
|
||
optionVal,
|
||
options[convertProps[typeVal()]],
|
||
//Load default type.
|
||
true
|
||
);
|
||
if (typeVal() !== "text") changeType(get(optionVal));
|
||
}));
|
||
function changeType(type) {
|
||
get(valueEl).type = type;
|
||
}
|
||
var div = root();
|
||
var a = child(div);
|
||
a.__click = () => {
|
||
if (totalInputs() <= 1) return;
|
||
$$props.removeInput($$props.id);
|
||
};
|
||
var select = sibling(a, 2);
|
||
select.__change = () => changeType(get(optionVal));
|
||
each(select, 21, () => Object.keys(options), index, ($$anchor2, key2) => {
|
||
var option = root_1();
|
||
var text2 = child(option, true);
|
||
reset(option);
|
||
var option_value = {};
|
||
template_effect(() => {
|
||
set_text(text2, get(key2));
|
||
if (option_value !== (option_value = options[get(key2)])) {
|
||
option.value = (option.__value = options[get(key2)]) ?? "";
|
||
}
|
||
});
|
||
append($$anchor2, option);
|
||
});
|
||
reset(select);
|
||
var input = sibling(select, 2);
|
||
remove_input_defaults(input);
|
||
bind_this(input, ($$value) => set(inputEl, $$value), () => get(inputEl));
|
||
var input_1 = sibling(input, 2);
|
||
remove_input_defaults(input_1);
|
||
bind_this(input_1, ($$value) => set(valueEl, $$value), () => get(valueEl));
|
||
reset(div);
|
||
template_effect(() => {
|
||
set_class(a, 1, `btn-del ${totalInputs() <= 1 ? "btn-inactive" : ""}`, "svelte-1jh3cip");
|
||
set_attribute2(a, "tabindex", totalInputs() <= 1 ? -1 : 0);
|
||
});
|
||
bind_select_value(select, () => get(optionVal), ($$value) => set(optionVal, $$value));
|
||
bind_value(input, nameVal);
|
||
bind_value(input_1, valueVal);
|
||
append($$anchor, div);
|
||
pop();
|
||
}
|
||
delegate(["click", "change"]);
|
||
|
||
// src/helpers.ts
|
||
function parseValue(input, type) {
|
||
switch (type) {
|
||
case "number":
|
||
return Number(input.value);
|
||
case "checkbox":
|
||
return Boolean(input.checked);
|
||
default:
|
||
return input.value;
|
||
}
|
||
}
|
||
function removeExtraCommas(str) {
|
||
return str.replace(/^,*(.*?),*$/g, "$1").replace(/,{2,}/g, ",");
|
||
}
|
||
function cleanTags(str) {
|
||
let cleanStr = str;
|
||
for (let index2 in KNOWN_BAD_CHARACTERS) {
|
||
cleanStr = cleanStr.replaceAll(KNOWN_BAD_CHARACTERS[index2], "");
|
||
}
|
||
return cleanStr;
|
||
}
|
||
var KNOWN_BAD_CHARACTERS = [
|
||
"\u2012",
|
||
"\u2013",
|
||
"\u2014",
|
||
"\u2015",
|
||
"\u204F",
|
||
"\u203D",
|
||
"\u2018",
|
||
"\u201A",
|
||
"\u201B",
|
||
"\u2039",
|
||
"\u203A",
|
||
"\u201C",
|
||
"\u201D",
|
||
"\u201E",
|
||
"\u201F",
|
||
"\u2045",
|
||
"\u2046",
|
||
"\u204B",
|
||
"\u204E",
|
||
"\u2051",
|
||
"\u2044",
|
||
"\u204A",
|
||
"\u2030",
|
||
"\u2031",
|
||
"\u2052",
|
||
"\u2020",
|
||
"\u2021",
|
||
"\u2022",
|
||
"\u2023",
|
||
"\u2043",
|
||
"\u204C",
|
||
"\u204D",
|
||
"\u2032",
|
||
"\u2035",
|
||
"\u2038",
|
||
"\u203B",
|
||
"\u2050",
|
||
"\u2041",
|
||
"\u2042",
|
||
"\u2016",
|
||
"\u2011",
|
||
"\u2033",
|
||
"\u2034",
|
||
"\u2057",
|
||
"\u2036",
|
||
"\u2037",
|
||
"`",
|
||
"^",
|
||
"\u203E",
|
||
"\u2017",
|
||
"\u2053",
|
||
";",
|
||
":",
|
||
"!",
|
||
"\u203C",
|
||
"\u2049",
|
||
"?",
|
||
"\u2048",
|
||
"\u2047",
|
||
".",
|
||
"\u2024",
|
||
"\u2025",
|
||
"\u2026",
|
||
"'",
|
||
'"',
|
||
"(",
|
||
")",
|
||
"[",
|
||
"]",
|
||
"{",
|
||
"}",
|
||
"@",
|
||
"*",
|
||
"&",
|
||
"%",
|
||
"\u2054",
|
||
"+",
|
||
"<",
|
||
"=",
|
||
">",
|
||
"|",
|
||
"~",
|
||
"$",
|
||
"\u2055",
|
||
"\u2056",
|
||
"\u2058",
|
||
"\u2059",
|
||
"\u205A",
|
||
"\u205B",
|
||
"\u205C",
|
||
"\u205D",
|
||
"\u205E",
|
||
"\u2E00",
|
||
"\u2E01",
|
||
"\u2E02",
|
||
"\u2E03",
|
||
"\u2E04",
|
||
"\u2E05",
|
||
"\u2E06",
|
||
"\u2E07",
|
||
"\u2E08",
|
||
"\u2E09",
|
||
"\u2E0A",
|
||
"\u2E0B",
|
||
"\u2E0C",
|
||
"\u2E0D",
|
||
"\u2E0E",
|
||
"\u2E0F",
|
||
"\u2E10",
|
||
"\u2E11",
|
||
"\u2E12",
|
||
"\u2E13",
|
||
"\u2E14",
|
||
"\u2E15",
|
||
"\u2E16",
|
||
"\u2E17",
|
||
"\u2E1C",
|
||
"\u2E1D",
|
||
" ",
|
||
"#"
|
||
];
|
||
|
||
// src/AddPropForm.svelte
|
||
var root_12 = from_html(`<button type="button" class="prop-chip"> </button>`);
|
||
var root2 = from_html(`<div id="multi-properties-modal" class="modal-content"><div id="alert-container" class="alert-container hidden svelte-18exwij"><div>ERROR</div> <div id="alert-text"> </div></div> <p>Select from existing properties or create new ones:</p> <div class="suggested-props svelte-18exwij"></div> <p>Type in a property name, then value. Use the dropbox to choose what type of
|
||
data you wish to store.</p> <p> </p> <p>如需添加标签,请使用属性名 "tags"。</p> <form><label><input type="checkbox"/> </label> <div class="modal-inputs-container svelte-18exwij"></div> <div class="modal-add-container svelte-18exwij"><button type="button" class="a-btn">Add</button></div> <div class="modal-button-container"><button type="submit" class="btn-submit">Submit</button></div></form></div>`);
|
||
var $$css2 = {
|
||
hash: "svelte-18exwij",
|
||
code: ".modal-inputs-container.svelte-18exwij {height:200px;width:100%;overflow-y:scroll;border-radius:5px;border-style:solid;display:flex;flex-direction:column;align-items:center;}.modal-add-container.svelte-18exwij {margin-top:10px;}.alert-container.svelte-18exwij {display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:10px;background-color:red;font-weight:bold;}.suggested-props.svelte-18exwij {overflow-y:scroll;max-height:100px;}.hidden.svelte-18exwij {display:none;}"
|
||
};
|
||
function AddPropForm($$anchor, $$props) {
|
||
push($$props, true);
|
||
append_styles($$anchor, $$css2);
|
||
let overwrite = prop($$props, "overwrite", 15);
|
||
let countInputs = 0;
|
||
let formEl = state(proxy(document.createElement("form")));
|
||
let errorEl = state(proxy(document.createElement("div")));
|
||
let alertText = state(".");
|
||
let inputEls = state(proxy([]));
|
||
function onCheckboxChange() {
|
||
overwrite(!overwrite());
|
||
$$props.changeBool(overwrite());
|
||
}
|
||
onMount(() => {
|
||
$$props.defaultProps.length > 0 ? addInputs($$props.defaultProps) : addInputs([{ type: "text", name: "", value: "" }]);
|
||
});
|
||
function addInputs(inputs = [{ type: "text", name: "", value: "" }]) {
|
||
let arr = [];
|
||
for (let input of inputs) {
|
||
countInputs++;
|
||
arr.push({
|
||
id: countInputs,
|
||
totalInputs: countInputs,
|
||
typeDef: input.type,
|
||
nameDef: input.name,
|
||
valueDef: input.value
|
||
});
|
||
}
|
||
set(inputEls, [...get(inputEls), ...arr], true);
|
||
}
|
||
function removeInput(id) {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
set(inputEls, get(inputEls).filter((input) => input.id !== id), true);
|
||
yield tick();
|
||
let inputs = get(formEl).querySelectorAll("input");
|
||
if (!inputs) return;
|
||
inputs[inputs.length - 2].focus();
|
||
});
|
||
}
|
||
function addSuggested(prop2) {
|
||
if (!get(inputEls).find((el) => el.nameDef === prop2.name)) {
|
||
addInputs([{ type: prop2.widget, name: prop2.name, value: "" }]);
|
||
}
|
||
}
|
||
function checkDuplicateNames() {
|
||
let set2 = /* @__PURE__ */ new Set();
|
||
for (let input of get(inputEls)) set2.add(input.nameDef);
|
||
if (set2.size < get(inputEls).length) return true;
|
||
else return false;
|
||
}
|
||
function runError(errorText) {
|
||
set(alertText, errorText, true);
|
||
get(
|
||
errorEl
|
||
//Should I have this error message fade away?
|
||
).classList.remove("hidden");
|
||
}
|
||
function onSubmit(e) {
|
||
e.preventDefault();
|
||
if (checkDuplicateNames()) {
|
||
runError("Duplicate property names are not allowed.");
|
||
return;
|
||
}
|
||
let obj = /* @__PURE__ */ new Map();
|
||
let inputs = get(formEl).querySelectorAll('input[name^="name[]"]');
|
||
inputs.forEach((input) => {
|
||
var _a;
|
||
if (!(input.nextElementSibling instanceof HTMLInputElement)) return;
|
||
if (!(input.previousElementSibling instanceof HTMLSelectElement)) return;
|
||
if (!(input.previousElementSibling.children[0] instanceof HTMLOptionElement)) return;
|
||
let name = input.value;
|
||
if (name === "") {
|
||
input.reportValidity();
|
||
return;
|
||
}
|
||
const selectEl = input.previousElementSibling;
|
||
const htmlType = selectEl.value;
|
||
const reverseOptions = {
|
||
string: "text",
|
||
number: "number",
|
||
checkbox: "checkbox",
|
||
date: "date",
|
||
"datetime-local": "datetime"
|
||
};
|
||
const obsidianType = (_a = reverseOptions[htmlType]) !== null && _a !== void 0 ? _a : "text";
|
||
let value = parseValue(input.nextElementSibling, input.nextElementSibling.type);
|
||
if (typeof value === "string") {
|
||
if (name === "tags") {
|
||
value = cleanTags(value);
|
||
}
|
||
if (typeof value === "string" && value.includes(",")) {
|
||
let str = removeExtraCommas(value);
|
||
value = str.split($$props.delimiter);
|
||
}
|
||
}
|
||
if (value === "") value = null;
|
||
let propObj = {
|
||
type: obsidianType,
|
||
data: value,
|
||
overwrite: false,
|
||
delimiter: $$props.delimiter
|
||
};
|
||
obj.set(name, propObj);
|
||
});
|
||
if (obj.size < inputs.length) return;
|
||
$$props.submission(obj);
|
||
}
|
||
var div = root2();
|
||
var div_1 = child(div);
|
||
var div_2 = sibling(child(div_1), 2);
|
||
var text2 = child(div_2, true);
|
||
reset(div_2);
|
||
reset(div_1);
|
||
bind_this(div_1, ($$value) => set(errorEl, $$value), () => get(errorEl));
|
||
var div_3 = sibling(div_1, 4);
|
||
each(div_3, 21, () => $$props.suggestedProps, index, ($$anchor2, prop2) => {
|
||
var button = root_12();
|
||
button.__click = () => addSuggested(get(prop2));
|
||
var text_1 = child(button, true);
|
||
reset(button);
|
||
template_effect(() => set_text(text_1, get(prop2).name));
|
||
append($$anchor2, button);
|
||
});
|
||
reset(div_3);
|
||
var p = sibling(div_3, 4);
|
||
var text_2 = child(p);
|
||
reset(p);
|
||
var form = sibling(p, 4);
|
||
var label = child(form);
|
||
var input_1 = child(label);
|
||
remove_input_defaults(input_1);
|
||
input_1.__change = onCheckboxChange;
|
||
var text_3 = sibling(input_1, 1, true);
|
||
text_3.nodeValue = "覆盖已有属性";
|
||
reset(label);
|
||
var div_4 = sibling(label, 2);
|
||
each(div_4, 21, () => get(inputEls), (input) => input.id, ($$anchor2, input, $$index_1) => {
|
||
AddPropInput($$anchor2, {
|
||
get id() {
|
||
return get(input).id;
|
||
},
|
||
get totalInputs() {
|
||
return get(inputEls).length;
|
||
},
|
||
removeInput,
|
||
get typeVal() {
|
||
return get(input).typeDef;
|
||
},
|
||
set typeVal($$value) {
|
||
get(input).typeDef = $$value;
|
||
},
|
||
get nameVal() {
|
||
return get(input).nameDef;
|
||
},
|
||
set nameVal($$value) {
|
||
get(input).nameDef = $$value;
|
||
},
|
||
get valueVal() {
|
||
return get(input).valueDef;
|
||
},
|
||
set valueVal($$value) {
|
||
get(input).valueDef = $$value;
|
||
}
|
||
});
|
||
});
|
||
reset(div_4);
|
||
var div_5 = sibling(div_4, 2);
|
||
var button_1 = child(div_5);
|
||
button_1.__click = () => addInputs([{ type: "text", name: "", value: "" }]);
|
||
reset(div_5);
|
||
next(2);
|
||
reset(form);
|
||
bind_this(form, ($$value) => set(formEl, $$value), () => get(formEl));
|
||
reset(div);
|
||
template_effect(() => {
|
||
set_text(text2, get(alertText));
|
||
set_text(text_2, `If you want to make a List property, use the Text data type and separate
|
||
each value with a "${$$props.delimiter ?? ""}".`);
|
||
set_checked(input_1, overwrite());
|
||
});
|
||
event("submit", form, onSubmit);
|
||
append($$anchor, div);
|
||
pop();
|
||
}
|
||
delegate(["click", "change"]);
|
||
|
||
// src/AddConfirmModal.ts
|
||
var import_obsidian = require("obsidian");
|
||
|
||
// src/AddConfirmForm.svelte
|
||
var root_13 = from_html(`<li> </li>`);
|
||
var root3 = from_html(`<div><form><p class="msg svelte-n0gky0"> </p> <p>以下属性将被添加:</p> <ul></ul> <p>确认要继续执行吗?</p> <button class="mod-warning" type="submit">Confirm</button> <button type="button">Cancel</button></form></div>`);
|
||
var $$css3 = {
|
||
hash: "svelte-n0gky0",
|
||
code: ".msg.svelte-n0gky0 {font-weight:bold;padding-bottom:10px;}"
|
||
};
|
||
function AddConfirmForm($$anchor, $$props) {
|
||
push($$props, true);
|
||
append_styles($$anchor, $$css3);
|
||
let overwrite = prop($$props, "overwrite", 3, true);
|
||
let btnCancel = state(null);
|
||
let msg = user_derived(() => overwrite() ? "Any pre-existing text props will have their values overwritten." : "Any pre-existing text props will have their values be appended to.");
|
||
function onSubmit(e) {
|
||
e.preventDefault();
|
||
$$props.submission();
|
||
}
|
||
onMount(() => {
|
||
get(btnCancel) === null || get(btnCancel) === void 0 ? void 0 : get(btnCancel).focus();
|
||
});
|
||
var div = root3();
|
||
var form = child(div);
|
||
var p = child(form);
|
||
var text2 = child(p, true);
|
||
reset(p);
|
||
var ul = sibling(p, 4);
|
||
each(ul, 21, () => [...$$props.newProps], index, ($$anchor2, $$item) => {
|
||
var $$array = user_derived(() => to_array(get($$item), 2));
|
||
let propName = () => get($$array)[0];
|
||
let prop2 = () => get($$array)[1];
|
||
var li = root_13();
|
||
var text_1 = child(li);
|
||
reset(li);
|
||
template_effect(() => set_text(text_1, `${propName() ?? ""}: ${prop2().data ?? ""}`));
|
||
append($$anchor2, li);
|
||
});
|
||
reset(ul);
|
||
var button = sibling(ul, 6);
|
||
button.__click = function(...$$args) {
|
||
$$props.cancel?.apply(this, $$args);
|
||
};
|
||
bind_this(button, ($$value) => set(btnCancel, $$value), () => get(btnCancel));
|
||
reset(form);
|
||
reset(div);
|
||
template_effect(() => set_text(text2, get(msg)));
|
||
event("submit", form, onSubmit);
|
||
append($$anchor, div);
|
||
pop();
|
||
}
|
||
delegate(["click"]);
|
||
|
||
// src/AddConfirmModal.ts
|
||
var AddConfirmModal = class extends import_obsidian.Modal {
|
||
constructor(app, props, overwrite, submission) {
|
||
super(app);
|
||
this.props = props;
|
||
this.overwrite = overwrite;
|
||
this.submission = submission;
|
||
}
|
||
onSubmit() {
|
||
this.submission();
|
||
this.close();
|
||
}
|
||
onCancel() {
|
||
this.close();
|
||
}
|
||
onOpen() {
|
||
this.titleEl.createEl("h2", { text: "添加属性" });
|
||
this.component = mount(AddConfirmForm, {
|
||
target: this.contentEl,
|
||
props: {
|
||
newProps: this.props,
|
||
overwrite: this.overwrite,
|
||
submission: this.onSubmit.bind(this),
|
||
cancel: this.onCancel.bind(this)
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
// src/AddPropModal.ts
|
||
var PropModal = class extends import_obsidian2.Modal {
|
||
constructor(app, submission, overwrite, delimiter, defaultProps, changeBool, suggestedProps) {
|
||
super(app);
|
||
this.submission = submission;
|
||
this.overwrite = overwrite;
|
||
this.delimiter = delimiter;
|
||
this.defaultProps = defaultProps;
|
||
this.changeBool = changeBool;
|
||
this.suggestedProps = suggestedProps;
|
||
}
|
||
//Run form submission if user clicks confirm.
|
||
onConfirm() {
|
||
this.submission(this.props);
|
||
this.close();
|
||
}
|
||
updateBool(bool) {
|
||
this.overwrite = bool;
|
||
this.changeBool(bool);
|
||
}
|
||
//Pull up confirmation form when user submits base form.
|
||
onSubmit(props) {
|
||
this.props = props;
|
||
new AddConfirmModal(
|
||
this.app,
|
||
this.props,
|
||
this.overwrite,
|
||
this.onConfirm.bind(this)
|
||
).open();
|
||
}
|
||
onOpen() {
|
||
this.titleEl.createEl("h2", { text: "添加属性" });
|
||
this.component = mount(AddPropForm, {
|
||
target: this.contentEl,
|
||
props: {
|
||
submission: this.onSubmit.bind(this),
|
||
overwrite: this.overwrite,
|
||
delimiter: this.delimiter,
|
||
defaultProps: this.defaultProps,
|
||
changeBool: this.updateBool.bind(this),
|
||
suggestedProps: this.suggestedProps
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
// src/SettingTab.ts
|
||
var import_obsidian3 = require("obsidian");
|
||
var SettingTab = class extends import_obsidian3.PluginSettingTab {
|
||
constructor(app, plugin) {
|
||
super(app, plugin);
|
||
this.plugin = plugin;
|
||
}
|
||
display() {
|
||
let { containerEl } = this;
|
||
containerEl.empty();
|
||
new import_obsidian3.Setting(containerEl).setName("覆盖现有文本").setDesc(
|
||
"添加名称已经存在的属性时,文本将覆盖该属性的现有值。 如果保持禁用状态,新值将作为列表添加到旧值。 "
|
||
).addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.overwrite);
|
||
toggle.onChange(async (value) => {
|
||
this.plugin.settings.overwrite = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian3.Setting(containerEl).setName("递归迭代").setDesc(
|
||
"启用后,在循环遍历文件夹中的所有文件时,还将循环遍历任何子文件夹。 "
|
||
).addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.recursive);
|
||
toggle.onChange(async (value) => {
|
||
this.plugin.settings.recursive = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian3.Setting(containerEl).setName("列表分隔符").setDesc(
|
||
"设置要在创建列表时使用的分隔符。 默认使用逗号(,)。 "
|
||
).addText((text2) => {
|
||
text2.setValue(this.plugin.settings.delimiter);
|
||
text2.onChange(async (value) => {
|
||
if (value.length > 1) {
|
||
text2.setValue(value[0]);
|
||
new import_obsidian3.Notice("分隔符必须是单个字符。");
|
||
return;
|
||
}
|
||
this.plugin.settings.delimiter = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian3.Setting(containerEl).setName("默认属性文件").setDesc(
|
||
"选择一个包含属性的文件,该文件将默认载入多属性表单。请输入目标文件的完整路径。(例如:Templates/PropFile 1)"
|
||
).addText((text2) => {
|
||
text2.setValue(this.plugin.settings.defaultPropPath);
|
||
text2.onChange(async (value) => {
|
||
this.plugin.settings.defaultPropPath = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
}
|
||
};
|
||
|
||
// src/RemoveModal.ts
|
||
var import_obsidian5 = require("obsidian");
|
||
|
||
// src/RemovePropForm.svelte
|
||
var root_14 = from_html(`<label><input type="checkbox"/> </label>`);
|
||
var root4 = from_html(`<div><div id="alert-container" class="alert-container hidden svelte-1c8m26c"><div>ERROR</div> <div id="alert-text"> </div></div> <p>从文件选择中勾选您希望移除的属性。</p> <form><div class="name-container svelte-1c8m26c"></div> <div class="button-container svelte-1c8m26c"><button type="submit">Confirm</button> <button type="button"> </button></div></form></div>`);
|
||
var $$css4 = {
|
||
hash: "svelte-1c8m26c",
|
||
code: ".name-container.svelte-1c8m26c {display:flex;flex-direction:column;gap:5px;margin-top:10px;margin-bottom:20px;}.alert-container.svelte-1c8m26c {display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:10px;background-color:red;font-weight:bold;}.button-container.svelte-1c8m26c {display:flex;flex-direction:row;justify-content:space-between;}.hidden.svelte-1c8m26c {display:none;}"
|
||
};
|
||
function RemovePropForm($$anchor, $$props) {
|
||
push($$props, true);
|
||
append_styles($$anchor, $$css4);
|
||
let names = prop($$props, "names", 19, () => []);
|
||
let errorEl = state(null);
|
||
let alertText = state(".");
|
||
let checkCount = state(0);
|
||
let inputs = state(proxy([]));
|
||
user_effect(() => {
|
||
const sortedNames = [...names()].sort();
|
||
set(inputs, sortedNames.map((name) => ({ name, isChecked: false })), true);
|
||
set(checkCount, 0);
|
||
});
|
||
let isMaxChecked = user_derived(() => get(inputs).length > 0 && get(checkCount) >= get(inputs).length);
|
||
function onCheckboxChange(event2) {
|
||
let checked = event2.target.checked;
|
||
checked ? update(checkCount) : update(checkCount, -1);
|
||
}
|
||
function toggleAll() {
|
||
const shouldCheckAll = !get(isMaxChecked);
|
||
set(inputs, get(inputs).map((input) => Object.assign(Object.assign({}, input), { isChecked: shouldCheckAll })), true);
|
||
set(checkCount, shouldCheckAll ? get(inputs).length : 0, true);
|
||
}
|
||
function onSubmit(e) {
|
||
e.preventDefault();
|
||
if (get(checkCount) === 0) {
|
||
set(alertText, "请至少选择一个要移除的属性。");
|
||
get(errorEl) === null || get(errorEl) === void 0 ? void 0 : get(errorEl).classList.remove("hidden");
|
||
return;
|
||
}
|
||
let propNames = get(inputs).filter((input) => input.isChecked).map((input) => input.name);
|
||
$$props.submission(propNames);
|
||
}
|
||
var div = root4();
|
||
var div_1 = child(div);
|
||
var div_2 = sibling(child(div_1), 2);
|
||
var text2 = child(div_2, true);
|
||
reset(div_2);
|
||
reset(div_1);
|
||
bind_this(div_1, ($$value) => set(errorEl, $$value), () => get(errorEl));
|
||
var form = sibling(div_1, 4);
|
||
var div_3 = child(form);
|
||
each(div_3, 21, () => get(inputs), (input) => input.name, ($$anchor2, input, $$index) => {
|
||
var label = root_14();
|
||
var input_1 = child(label);
|
||
remove_input_defaults(input_1);
|
||
input_1.__change = (event2) => onCheckboxChange(event2);
|
||
var text_1 = sibling(input_1);
|
||
reset(label);
|
||
template_effect(() => set_text(text_1, ` ${get(input).name ?? ""}`));
|
||
bind_checked(input_1, () => get(input).isChecked, ($$value) => get(input).isChecked = $$value);
|
||
append($$anchor2, label);
|
||
});
|
||
reset(div_3);
|
||
var div_4 = sibling(div_3, 2);
|
||
var button = sibling(child(div_4), 2);
|
||
button.__click = toggleAll;
|
||
var text_2 = child(button, true);
|
||
reset(button);
|
||
reset(div_4);
|
||
reset(form);
|
||
reset(div);
|
||
template_effect(() => {
|
||
set_text(text2, get(alertText));
|
||
set_text(text_2, get(isMaxChecked) ? "Uncheck All" : "Check All");
|
||
});
|
||
event("submit", form, onSubmit);
|
||
append($$anchor, div);
|
||
pop();
|
||
}
|
||
delegate(["change", "click"]);
|
||
|
||
// src/RemoveConfirmModal.ts
|
||
var import_obsidian4 = require("obsidian");
|
||
|
||
// src/RemoveConfirmForm.svelte
|
||
var root_15 = from_html(`<li> </li>`);
|
||
var root5 = from_html(`<div><form><p> </p> <ul></ul> <p>确认要继续执行吗?</p> <button class="mod-warning" type="submit">Delete</button> <button type="button">Cancel</button></form></div>`);
|
||
function RemoveConfirmForm($$anchor, $$props) {
|
||
push($$props, true);
|
||
let names = prop($$props, "names", 19, () => ["test", "test2"]);
|
||
let btnCancel = state(null);
|
||
let word = user_derived(() => names().length > 1 ? "properties" : "property");
|
||
function onSubmit(e) {
|
||
e.preventDefault();
|
||
$$props.submission();
|
||
}
|
||
onMount(() => {
|
||
get(btnCancel) === null || get(btnCancel) === void 0 ? void 0 : get(btnCancel).focus();
|
||
});
|
||
var div = root5();
|
||
var form = child(div);
|
||
var p = child(form);
|
||
var text2 = child(p);
|
||
reset(p);
|
||
var ul = sibling(p, 2);
|
||
each(ul, 21, names, index, ($$anchor2, name) => {
|
||
var li = root_15();
|
||
var text_1 = child(li, true);
|
||
reset(li);
|
||
template_effect(() => set_text(text_1, get(name)));
|
||
append($$anchor2, li);
|
||
});
|
||
reset(ul);
|
||
var button = sibling(ul, 6);
|
||
button.__click = function(...$$args) {
|
||
$$props.cancel?.apply(this, $$args);
|
||
};
|
||
bind_this(button, ($$value) => set(btnCancel, $$value), () => get(btnCancel));
|
||
reset(form);
|
||
reset(div);
|
||
template_effect(() => set_text(text2, `下列 ${get(word) ?? ""} 将被移除:`));
|
||
event("submit", form, onSubmit);
|
||
append($$anchor, div);
|
||
pop();
|
||
}
|
||
delegate(["click"]);
|
||
|
||
// src/RemoveConfirmModal.ts
|
||
var RemoveConfirmModal = class extends import_obsidian4.Modal {
|
||
constructor(app, names, submission) {
|
||
super(app);
|
||
this.names = names;
|
||
this.submission = submission;
|
||
}
|
||
onSubmit() {
|
||
this.submission();
|
||
this.close();
|
||
}
|
||
onCancel() {
|
||
this.close();
|
||
}
|
||
onOpen() {
|
||
if (!this.names || this.names.length === 0) {
|
||
new import_obsidian4.Notice("请检查至少一个要删除的属性。");
|
||
this.close();
|
||
}
|
||
this.titleEl.createEl("h2", { text: "移除属性" });
|
||
this.component = mount(RemoveConfirmForm, {
|
||
target: this.contentEl,
|
||
props: {
|
||
names: this.names,
|
||
submission: this.onSubmit.bind(this),
|
||
cancel: this.onCancel.bind(this)
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
// src/RemoveModal.ts
|
||
var RemoveModal = class extends import_obsidian5.Modal {
|
||
constructor(app, names, submission) {
|
||
if (!names || names.length === 0) {
|
||
new import_obsidian5.Notice("没有要删除的属性");
|
||
return;
|
||
}
|
||
super(app);
|
||
this.names = names;
|
||
this.submission = submission;
|
||
}
|
||
onConfirm() {
|
||
this.submission(this.props);
|
||
this.close();
|
||
}
|
||
onSubmit(props) {
|
||
this.props = props;
|
||
new RemoveConfirmModal(
|
||
this.app,
|
||
this.props,
|
||
this.onConfirm.bind(this)
|
||
).open();
|
||
}
|
||
onOpen() {
|
||
this.titleEl.createEl("h2", { text: "移除属性" });
|
||
this.component = mount(RemovePropForm, {
|
||
target: this.contentEl,
|
||
props: {
|
||
names: this.names,
|
||
submission: this.onSubmit.bind(this)
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
// src/frontmatter.ts
|
||
var import_obsidian6 = require("obsidian");
|
||
async function addProperties(fileProcessor, file, props, overwrite, propCache) {
|
||
await fileProcessor(file, (frontmatter) => {
|
||
for (const [key2, value] of props) {
|
||
if (key2 === "tags" && !frontmatter.hasOwnProperty("tags") && !Array.isArray(value.data)) {
|
||
frontmatter[key2] = [value.data];
|
||
continue;
|
||
}
|
||
if (!frontmatter[key2] || overwrite) {
|
||
frontmatter[key2] = value.data;
|
||
continue;
|
||
}
|
||
let type1 = value.type;
|
||
let type2 = propCache[key2.toLowerCase()].widget;
|
||
if (canBeAppended(type1, type2)) {
|
||
if (frontmatter[key2] === value.data) continue;
|
||
if (!value.data) continue;
|
||
let arr = mergeIntoArrays(frontmatter[key2], value.data);
|
||
frontmatter[key2] = arr;
|
||
continue;
|
||
} else {
|
||
frontmatter[key2] = value.data;
|
||
continue;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
async function addPropToSet(fileProcessor, set2, file) {
|
||
await fileProcessor(file, (frontmatter) => {
|
||
for (const key2 in frontmatter) {
|
||
set2.add(key2);
|
||
}
|
||
});
|
||
return set2;
|
||
}
|
||
async function removeProperties(fileProcessor, file, props) {
|
||
await fileProcessor(file, (frontmatter) => {
|
||
for (const prop2 of props) {
|
||
frontmatter[prop2] = void 0;
|
||
}
|
||
});
|
||
}
|
||
function canBeAppended(str1, str2) {
|
||
let arr = ["number", "date", "datetime", "checkbox"];
|
||
if (arr.includes(str1) || arr.includes(str2)) return false;
|
||
return true;
|
||
}
|
||
function mergeIntoArrays(...args) {
|
||
const arrays = args.map((arg) => Array.isArray(arg) ? arg : [arg]);
|
||
const flattened = arrays.flat();
|
||
const unique = [...new Set(flattened)];
|
||
return unique;
|
||
}
|
||
|
||
// src/main.ts
|
||
var defaultSettings = {
|
||
overwrite: false,
|
||
recursive: true,
|
||
delimiter: ",",
|
||
defaultPropPath: ""
|
||
};
|
||
var MultiPropPlugin2 = class extends import_obsidian7.Plugin {
|
||
async loadSettings() {
|
||
this.settings = Object.assign({}, defaultSettings, await this.loadData());
|
||
}
|
||
async saveSettings() {
|
||
await this.saveData(this.settings);
|
||
}
|
||
async changeOverwrite(bool) {
|
||
this.settings.overwrite = bool;
|
||
await this.saveSettings();
|
||
}
|
||
_getFilesFromTabGroup(leaf) {
|
||
if (!leaf) {
|
||
return [];
|
||
}
|
||
const files = [];
|
||
const fileSet = /* @__PURE__ */ new Set();
|
||
const activeParent = leaf.parent;
|
||
if (activeParent instanceof import_obsidian7.WorkspaceTabs) {
|
||
this.app.workspace.iterateAllLeaves((l) => {
|
||
if (l.parent === activeParent && l.view instanceof import_obsidian7.FileView) {
|
||
const file = l.view.file;
|
||
if (file && !fileSet.has(file.path)) {
|
||
files.push(file);
|
||
fileSet.add(file.path);
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
const activeWindowRoot = leaf.getRoot();
|
||
this.app.workspace.iterateAllLeaves((l) => {
|
||
if (l.getRoot() === activeWindowRoot && l.view instanceof import_obsidian7.FileView) {
|
||
const file = l.view.file;
|
||
if (file && !fileSet.has(file.path)) {
|
||
files.push(file);
|
||
fileSet.add(file.path);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
return files;
|
||
}
|
||
async onload() {
|
||
await this.loadSettings();
|
||
this.addSettingTab(new SettingTab(this.app, this));
|
||
this.addCommand({
|
||
id: "add-props-to-current-note",
|
||
name: "Add props to current note",
|
||
callback: async () => {
|
||
const file = this.app.workspace.getActiveFile();
|
||
if (!file) {
|
||
new import_obsidian7.Notice("No active file to add properties to.", 4e3);
|
||
return;
|
||
}
|
||
await this.createPropModal([file]);
|
||
}
|
||
});
|
||
this.registerEvent(
|
||
this.app.workspace.on("file-menu", (menu, node) => {
|
||
let title = "";
|
||
let obj;
|
||
if (node instanceof import_obsidian7.TFile) {
|
||
obj = [node];
|
||
title = "Add props to file.";
|
||
} else {
|
||
obj = node;
|
||
title = "Add props to folder.";
|
||
}
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle(title).onClick(() => this.createPropModal(obj));
|
||
});
|
||
})
|
||
);
|
||
this.addCommand({
|
||
id: "remove-props-from-current-note",
|
||
name: "Remove props from current note",
|
||
callback: async () => {
|
||
const file = this.app.workspace.getActiveFile();
|
||
if (!file) {
|
||
new import_obsidian7.Notice("No active file to remove properties from.", 4e3);
|
||
return;
|
||
}
|
||
await this.createRemoveModal([file]);
|
||
}
|
||
});
|
||
this.registerEvent(
|
||
this.app.workspace.on("file-menu", (menu, node) => {
|
||
let title = "";
|
||
let obj;
|
||
if (node instanceof import_obsidian7.TFile) {
|
||
obj = [node];
|
||
title = "Remove props from file.";
|
||
} else {
|
||
obj = node;
|
||
title = "Remove props from folder.";
|
||
}
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle(title).onClick(() => this.createRemoveModal(obj));
|
||
});
|
||
})
|
||
);
|
||
this.addCommand({
|
||
id: "add-props-to-tab-group",
|
||
name: "Add props to tabs in active tab group",
|
||
callback: async () => {
|
||
const files = this._getFilesFromTabGroup(this.app.workspace.activeLeaf);
|
||
if (!files || !files.length) {
|
||
new import_obsidian7.Notice(
|
||
"No open tabs in the active tab group to add properties to.",
|
||
4e3
|
||
);
|
||
return;
|
||
}
|
||
await this.createPropModal(files);
|
||
}
|
||
});
|
||
this.registerEvent(
|
||
this.app.workspace.on("tab-group-menu", (menu) => {
|
||
const obj = this._getFilesFromTabGroup(
|
||
this.app.workspace.getLeaf(false)
|
||
);
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle("Add props from all tabs").onClick(() => this.createPropModal(obj));
|
||
});
|
||
})
|
||
);
|
||
this.addCommand({
|
||
id: "remove-props-from-tab-group",
|
||
name: "Remove props from tabs in active tab group",
|
||
callback: async () => {
|
||
const files = this._getFilesFromTabGroup(
|
||
this.app.workspace.getLeaf(false)
|
||
);
|
||
if (!files || !files.length) {
|
||
new import_obsidian7.Notice(
|
||
"No open tabs in the active tab group to remove properties from.",
|
||
4e3
|
||
);
|
||
return;
|
||
}
|
||
await this.createRemoveModal(files);
|
||
}
|
||
});
|
||
this.registerEvent(
|
||
this.app.workspace.on("tab-group-menu", (menu) => {
|
||
const obj = this._getFilesFromTabGroup(
|
||
this.app.workspace.getLeaf(false)
|
||
);
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle("Remove props from all tabs").onClick(() => this.createRemoveModal(obj));
|
||
});
|
||
})
|
||
);
|
||
this.registerEvent(
|
||
this.app.workspace.on("files-menu", (menu, nodes) => {
|
||
let obj = nodes;
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle("向所选文件添加props").onClick(() => this.createPropModal(obj));
|
||
});
|
||
})
|
||
);
|
||
this.registerEvent(
|
||
this.app.workspace.on("files-menu", (menu, nodes) => {
|
||
let obj = nodes;
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle("从选定的文件中删除props").onClick(async () => this.createRemoveModal(obj));
|
||
});
|
||
})
|
||
);
|
||
this.registerEvent(
|
||
this.app.workspace.on("search:results-menu", (menu, leaf) => {
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle("在搜索结果中添加props").onClick(() => {
|
||
let files = this.getFilesFromSearch(leaf);
|
||
if (!files.length) {
|
||
new import_obsidian7.Notice("没有要添加属性的文件。", 4e3);
|
||
return;
|
||
}
|
||
this.createPropModal(files);
|
||
});
|
||
});
|
||
})
|
||
);
|
||
this.registerEvent(
|
||
this.app.workspace.on("search:results-menu", (menu, leaf) => {
|
||
menu.addItem((item) => {
|
||
item.setIcon("archive").setTitle("在搜索结果中移除props").onClick(async () => {
|
||
let files = this.getFilesFromSearch(leaf);
|
||
if (!files.length) {
|
||
new import_obsidian7.Notice("没有要从中删除属性的文件。", 4e3);
|
||
return;
|
||
}
|
||
this.createRemoveModal(files);
|
||
});
|
||
});
|
||
})
|
||
);
|
||
}
|
||
async getPropsFromFolder(folder, names) {
|
||
for (let obj of folder.children) {
|
||
if (obj instanceof import_obsidian7.TFile && obj.extension === "md") {
|
||
names = await addPropToSet(
|
||
this.app.fileManager.processFrontMatter.bind(this.app.fileManager),
|
||
names,
|
||
obj
|
||
);
|
||
}
|
||
if (obj instanceof import_obsidian7.TFolder) {
|
||
if (this.settings.recursive) {
|
||
await this.getPropsFromFolder(obj, names);
|
||
}
|
||
}
|
||
}
|
||
return [...names].sort();
|
||
}
|
||
async getPropsFromFiles(files, names) {
|
||
for (let file of files) {
|
||
if (file instanceof import_obsidian7.TFile && file.extension === "md") {
|
||
names = await addPropToSet(
|
||
this.app.fileManager.processFrontMatter.bind(this.app.fileManager),
|
||
names,
|
||
file
|
||
);
|
||
}
|
||
}
|
||
return [...names];
|
||
}
|
||
/** Iterates through all files in a folder and runs callback on each file. */
|
||
async searchFolders(folder, callback) {
|
||
for (let obj of folder.children) {
|
||
if (obj instanceof import_obsidian7.TFolder) {
|
||
if (this.settings.recursive) {
|
||
await this.searchFolders(obj, callback);
|
||
}
|
||
}
|
||
if (obj instanceof import_obsidian7.TFile && obj.extension === "md") {
|
||
await callback(obj);
|
||
}
|
||
}
|
||
}
|
||
async searchFiles(files, callback) {
|
||
for (let file of files) {
|
||
if (file instanceof import_obsidian7.TFile && file.extension === "md") {
|
||
await callback(file);
|
||
}
|
||
}
|
||
}
|
||
getFilesFromSearch(leaf) {
|
||
let files = [];
|
||
leaf.dom.vChildren.children.forEach((e) => {
|
||
files.push(e.file);
|
||
});
|
||
return files;
|
||
}
|
||
async createPropModal(iterable) {
|
||
let iterateFunc;
|
||
if (iterable instanceof import_obsidian7.TFolder) {
|
||
const allFiles = [];
|
||
this.searchFolders(iterable, async (f) => allFiles.push(f));
|
||
iterateFunc = async (props) => {
|
||
await this.searchFolders(
|
||
iterable,
|
||
await this.addPropsCallback(props, allFiles.length)
|
||
);
|
||
};
|
||
} else {
|
||
iterateFunc = async (props) => this.searchFiles(
|
||
iterable,
|
||
await this.addPropsCallback(props, iterable.length)
|
||
);
|
||
}
|
||
let defaultProps;
|
||
defaultProps = this.loadDefaultProps();
|
||
const allProps = this.getAllUsedProperties();
|
||
new PropModal(
|
||
this.app,
|
||
iterateFunc,
|
||
this.settings.overwrite,
|
||
this.settings.delimiter,
|
||
defaultProps,
|
||
this.changeOverwrite.bind(this),
|
||
allProps
|
||
).open();
|
||
}
|
||
getAllUsedProperties() {
|
||
const allProps = this.app.metadataCache.getAllPropertyInfos();
|
||
return Object.values(allProps).sort(
|
||
(a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())
|
||
);
|
||
}
|
||
/** Create modal for removing properties.
|
||
* Will call a different function depending on whether files or a folder is used. */
|
||
async createRemoveModal(iterable) {
|
||
let names;
|
||
let iterateFunc;
|
||
if (iterable instanceof import_obsidian7.TFolder) {
|
||
names = await this.getPropsFromFolder(iterable, /* @__PURE__ */ new Set());
|
||
const allFiles = [];
|
||
this.searchFolders(iterable, async (f) => allFiles.push(f));
|
||
iterateFunc = (props) => this.searchFolders(
|
||
iterable,
|
||
this.removePropsCallback(props, allFiles.length)
|
||
);
|
||
} else {
|
||
names = await this.getPropsFromFiles(iterable, /* @__PURE__ */ new Set());
|
||
iterateFunc = (props) => this.searchFiles(
|
||
iterable,
|
||
this.removePropsCallback(props, iterable.length)
|
||
);
|
||
}
|
||
if (names.length === 0) {
|
||
new import_obsidian7.Notice("无属性可移除", 4e3);
|
||
return;
|
||
}
|
||
const sortedNames = [...names].sort(
|
||
(a, b) => a.toLowerCase() > b.toLowerCase() ? 1 : -1
|
||
);
|
||
new RemoveModal(this.app, sortedNames, iterateFunc).open();
|
||
}
|
||
/** Read through a given file and get name/value of props.
|
||
* Revised from https://forum.obsidian.md/t/how-to-programmatically-access-a-files-properties-types/77826/4.
|
||
*/
|
||
readYamlProperties(file) {
|
||
const metadata = this.app.metadataCache.getFileCache(file);
|
||
const frontmatter = metadata?.frontmatter;
|
||
if (!frontmatter) {
|
||
new import_obsidian7.Notice("无效的属性模板。", 4e3);
|
||
return;
|
||
}
|
||
const allPropsWithType = this.app.metadataCache.getAllPropertyInfos();
|
||
let result = [];
|
||
for (let [key2, value] of Object.entries(frontmatter)) {
|
||
const keyLower = key2.toLowerCase();
|
||
const obj = {
|
||
name: key2,
|
||
value,
|
||
type: allPropsWithType[keyLower].widget
|
||
};
|
||
result.push(obj);
|
||
}
|
||
return result;
|
||
}
|
||
loadDefaultProps() {
|
||
if (this.settings.defaultPropPath) {
|
||
try {
|
||
const file = this.app.vault.getAbstractFileByPath(
|
||
`${this.settings.defaultPropPath}.md`
|
||
);
|
||
let tmp = this.readYamlProperties(file);
|
||
if (tmp === void 0) throw Error("Undefined path.");
|
||
return tmp;
|
||
} catch (e) {
|
||
new import_obsidian7.Notice(
|
||
`${e}. 请检查默认属性文件设置中输入的路径是否有效。`,
|
||
1e4
|
||
);
|
||
}
|
||
}
|
||
return [{ name: "", value: "", type: "text" }];
|
||
}
|
||
async addPropsCallback(props, totalFiles) {
|
||
const statusBarItem = this.addStatusBarItem();
|
||
let count = 0;
|
||
return async (file) => {
|
||
await addProperties(
|
||
this.app.fileManager.processFrontMatter.bind(this.app.fileManager),
|
||
file,
|
||
props,
|
||
this.settings.overwrite,
|
||
this.app.metadataCache.getAllPropertyInfos()
|
||
);
|
||
count++;
|
||
statusBarItem.setText(
|
||
"Added props to " + count + "/" + totalFiles + " files"
|
||
);
|
||
if (count === totalFiles) {
|
||
setTimeout(() => {
|
||
statusBarItem.remove();
|
||
}, 5e3);
|
||
}
|
||
};
|
||
}
|
||
removePropsCallback(props, totalFiles) {
|
||
const statusBarItem = this.addStatusBarItem();
|
||
let count = 0;
|
||
return async (file) => {
|
||
await removeProperties(
|
||
this.app.fileManager.processFrontMatter.bind(this.app.fileManager),
|
||
file,
|
||
props
|
||
);
|
||
count++;
|
||
statusBarItem.setText(
|
||
"Removed props from " + count + "/" + totalFiles + " files"
|
||
);
|
||
if (count === totalFiles) {
|
||
setTimeout(() => {
|
||
statusBarItem.remove();
|
||
}, 5e3);
|
||
}
|
||
};
|
||
}
|
||
};
|
||
|
||
/* nosourcemap */ |