aberdeen 1.0.11 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,10 @@
1
- import type { DatumType, TargetType } from "./aberdeen.js";
1
+ import type { TargetType } from "./aberdeen.js";
2
2
  /**
3
3
  * Represents a set of changes that can be applied to proxied objects.
4
4
  * This is an opaque type - its internal structure is not part of the public API.
5
5
  * @private
6
6
  */
7
- export type Patch = Map<TargetType, Map<any, [DatumType, DatumType]>>;
7
+ export type Patch = Map<TargetType, Map<any, [any, any]>>;
8
8
  /**
9
9
  * Run the provided function, while treating all changes to Observables as predictions,
10
10
  * meaning they will be reverted when changes come back from the server (or some other
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/prediction.ts"],
4
4
  "sourcesContent": [
5
- "import { defaultEmitHandler, withEmitHandler } from \"./aberdeen.js\";\nimport type { DatumType, TargetType } from \"./aberdeen.js\";\n\n/**\n * Represents a set of changes that can be applied to proxied objects.\n * This is an opaque type - its internal structure is not part of the public API.\n * @private\n */\nexport type Patch = Map<TargetType, Map<any, [DatumType, DatumType]>>;\n\nfunction recordPatch(func: () => void): Patch {\n\tconst recordingPatch = new Map();\n\twithEmitHandler((target, index, newData, oldData) => {\n\t\taddToPatch(recordingPatch, target, index, newData, oldData);\n\t}, func);\n\treturn recordingPatch;\n}\n\nfunction addToPatch(\n\tpatch: Patch,\n\tcollection: TargetType,\n\tindex: any,\n\tnewData: DatumType,\n\toldData: DatumType,\n) {\n\tlet collectionMap = patch.get(collection);\n\tif (!collectionMap) {\n\t\tcollectionMap = new Map();\n\t\tpatch.set(collection, collectionMap);\n\t}\n\tconst prev = collectionMap.get(index);\n\tconst oldData0 = prev ? prev[1] : oldData;\n\tif (newData === oldData0) collectionMap.delete(index);\n\telse collectionMap.set(index, [newData, oldData0]);\n}\n\nfunction emitPatch(patch: Patch) {\n\tfor (const [collection, collectionMap] of patch) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\tdefaultEmitHandler(collection, index, newData, oldData);\n\t\t}\n\t}\n}\n\nfunction mergePatch(target: Patch, source: Patch, reverse = false) {\n\tfor (const [collection, collectionMap] of source) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\taddToPatch(\n\t\t\t\ttarget,\n\t\t\t\tcollection,\n\t\t\t\tindex,\n\t\t\t\treverse ? oldData : newData,\n\t\t\t\treverse ? newData : oldData,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction silentlyApplyPatch(patch: Patch, force = false): boolean {\n\tfor (const [collection, collectionMap] of patch) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\tconst actualData = (collection as any)[index];\n\t\t\tif (actualData !== oldData) {\n\t\t\t\tif (force)\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Applying invalid patch: data ${actualData} is unequal to expected old data ${oldData} for index ${index}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}, 0);\n\t\t\t\telse return false;\n\t\t\t}\n\t\t}\n\t}\n\tfor (const [collection, collectionMap] of patch) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\t(collection as any)[index] = newData;\n\t\t}\n\t}\n\treturn true;\n}\n\nconst appliedPredictions: Array<Patch> = [];\n\n/**\n * Run the provided function, while treating all changes to Observables as predictions,\n * meaning they will be reverted when changes come back from the server (or some other\n * async source).\n * @param predictFunc The function to run. It will generally modify some Observables\n * \tto immediately reflect state (as closely as possible) that we expect the server\n * to communicate back to us later on.\n * @returns A `Patch` object. Don't modify it. This is only meant to be passed to `applyCanon`.\n */\nexport function applyPrediction(predictFunc: () => void): Patch {\n\tconst patch = recordPatch(predictFunc);\n\tappliedPredictions.push(patch);\n\temitPatch(patch);\n\treturn patch;\n}\n\n/**\n * Temporarily revert all outstanding predictions, optionally run the provided function\n * (which will generally make authoritative changes to the data based on a server response),\n * and then attempt to reapply the predictions on top of the new canonical state, dropping\n * any predictions that can no longer be applied cleanly (the data has been modified) or\n * that were specified in `dropPredictions`.\n *\n * All of this is done such that redraws are only triggered if the overall effect is an\n * actual change to an `Observable`.\n * @param canonFunc The function to run without any predictions applied. This will typically\n * make authoritative changes to the data, based on a server response.\n * @param dropPredictions An optional list of predictions (as returned by `applyPrediction`)\n * to undo. Typically, when a server response for a certain request is being handled,\n * you'd want to drop the prediction that was done for that request.\n */\nexport function applyCanon(\n\tcanonFunc?: () => void,\n\tdropPredictions: Array<Patch> = [],\n) {\n\tconst resultPatch = new Map();\n\tfor (const prediction of appliedPredictions)\n\t\tmergePatch(resultPatch, prediction, true);\n\tsilentlyApplyPatch(resultPatch, true);\n\n\tfor (const prediction of dropPredictions) {\n\t\tconst pos = appliedPredictions.indexOf(prediction);\n\t\tif (pos >= 0) appliedPredictions.splice(pos, 1);\n\t}\n\tif (canonFunc) mergePatch(resultPatch, recordPatch(canonFunc));\n\n\tfor (let idx = 0; idx < appliedPredictions.length; idx++) {\n\t\tif (silentlyApplyPatch(appliedPredictions[idx])) {\n\t\t\tmergePatch(resultPatch, appliedPredictions[idx]);\n\t\t} else {\n\t\t\tappliedPredictions.splice(idx, 1);\n\t\t\tidx--;\n\t\t}\n\t}\n\n\temitPatch(resultPatch);\n}\n"
5
+ "import { defaultEmitHandler, withEmitHandler } from \"./aberdeen.js\";\nimport type { TargetType } from \"./aberdeen.js\";\n\n/**\n * Represents a set of changes that can be applied to proxied objects.\n * This is an opaque type - its internal structure is not part of the public API.\n * @private\n */\nexport type Patch = Map<TargetType, Map<any, [any, any]>>;\n\nfunction recordPatch(func: () => void): Patch {\n\tconst recordingPatch = new Map();\n\twithEmitHandler((target, index, newData, oldData) => {\n\t\taddToPatch(recordingPatch, target, index, newData, oldData);\n\t}, func);\n\treturn recordingPatch;\n}\n\nfunction addToPatch(\n\tpatch: Patch,\n\tcollection: TargetType,\n\tindex: any,\n\tnewData: any,\n\toldData: any,\n) {\n\tlet collectionMap = patch.get(collection);\n\tif (!collectionMap) {\n\t\tcollectionMap = new Map();\n\t\tpatch.set(collection, collectionMap);\n\t}\n\tconst prev = collectionMap.get(index);\n\tconst oldData0 = prev ? prev[1] : oldData;\n\tif (newData === oldData0) collectionMap.delete(index);\n\telse collectionMap.set(index, [newData, oldData0]);\n}\n\nfunction emitPatch(patch: Patch) {\n\tfor (const [collection, collectionMap] of patch) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\tdefaultEmitHandler(collection, index, newData, oldData);\n\t\t}\n\t}\n}\n\nfunction mergePatch(target: Patch, source: Patch, reverse = false) {\n\tfor (const [collection, collectionMap] of source) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\taddToPatch(\n\t\t\t\ttarget,\n\t\t\t\tcollection,\n\t\t\t\tindex,\n\t\t\t\treverse ? oldData : newData,\n\t\t\t\treverse ? newData : oldData,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction silentlyApplyPatch(patch: Patch, force = false): boolean {\n\tfor (const [collection, collectionMap] of patch) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\tconst actualData = (collection as any)[index];\n\t\t\tif (actualData !== oldData) {\n\t\t\t\tif (force)\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Applying invalid patch: data ${actualData} is unequal to expected old data ${oldData} for index ${index}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}, 0);\n\t\t\t\telse return false;\n\t\t\t}\n\t\t}\n\t}\n\tfor (const [collection, collectionMap] of patch) {\n\t\tfor (const [index, [newData, oldData]] of collectionMap) {\n\t\t\t(collection as any)[index] = newData;\n\t\t}\n\t}\n\treturn true;\n}\n\nconst appliedPredictions: Array<Patch> = [];\n\n/**\n * Run the provided function, while treating all changes to Observables as predictions,\n * meaning they will be reverted when changes come back from the server (or some other\n * async source).\n * @param predictFunc The function to run. It will generally modify some Observables\n * \tto immediately reflect state (as closely as possible) that we expect the server\n * to communicate back to us later on.\n * @returns A `Patch` object. Don't modify it. This is only meant to be passed to `applyCanon`.\n */\nexport function applyPrediction(predictFunc: () => void): Patch {\n\tconst patch = recordPatch(predictFunc);\n\tappliedPredictions.push(patch);\n\temitPatch(patch);\n\treturn patch;\n}\n\n/**\n * Temporarily revert all outstanding predictions, optionally run the provided function\n * (which will generally make authoritative changes to the data based on a server response),\n * and then attempt to reapply the predictions on top of the new canonical state, dropping\n * any predictions that can no longer be applied cleanly (the data has been modified) or\n * that were specified in `dropPredictions`.\n *\n * All of this is done such that redraws are only triggered if the overall effect is an\n * actual change to an `Observable`.\n * @param canonFunc The function to run without any predictions applied. This will typically\n * make authoritative changes to the data, based on a server response.\n * @param dropPredictions An optional list of predictions (as returned by `applyPrediction`)\n * to undo. Typically, when a server response for a certain request is being handled,\n * you'd want to drop the prediction that was done for that request.\n */\nexport function applyCanon(\n\tcanonFunc?: () => void,\n\tdropPredictions: Array<Patch> = [],\n) {\n\tconst resultPatch = new Map();\n\tfor (const prediction of appliedPredictions)\n\t\tmergePatch(resultPatch, prediction, true);\n\tsilentlyApplyPatch(resultPatch, true);\n\n\tfor (const prediction of dropPredictions) {\n\t\tconst pos = appliedPredictions.indexOf(prediction);\n\t\tif (pos >= 0) appliedPredictions.splice(pos, 1);\n\t}\n\tif (canonFunc) mergePatch(resultPatch, recordPatch(canonFunc));\n\n\tfor (let idx = 0; idx < appliedPredictions.length; idx++) {\n\t\tif (silentlyApplyPatch(appliedPredictions[idx])) {\n\t\t\tmergePatch(resultPatch, appliedPredictions[idx]);\n\t\t} else {\n\t\t\tappliedPredictions.splice(idx, 1);\n\t\t\tidx--;\n\t\t}\n\t}\n\n\temitPatch(resultPatch);\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
8
  "debugId": "55BE44FF877D138F64756E2164756E21",
package/dist/route.js CHANGED
@@ -109,7 +109,7 @@ immediateObserve(() => {
109
109
  route.hash = hash;
110
110
  });
111
111
  function isSamePage(path, state) {
112
- return location.pathname === path && JSON.stringify(history.state.id) === JSON.stringify(state.id);
112
+ return location.pathname === path && JSON.stringify(history.state.id || {}) === JSON.stringify(state.id || {});
113
113
  }
114
114
  function updateHistory() {
115
115
  let mode = route.mode;
@@ -165,5 +165,5 @@ export {
165
165
  Route
166
166
  };
167
167
 
168
- //# debugId=D7FFE7D955D7855E64756E2164756E21
168
+ //# debugId=D9D83FC76589C40E64756E2164756E21
169
169
  //# sourceMappingURL=route.js.map
package/dist/route.js.map CHANGED
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/route.ts"],
4
4
  "sourcesContent": [
5
- "import {\n\tclean,\n\tclone,\n\tgetParentElement,\n\timmediateObserve,\n\tobserve,\n\tproxy,\n\trunQueue,\n\tunproxy,\n} from \"./aberdeen.js\";\n\n/**\n * The class for the singleton `route` object.\n *\n */\n\nexport class Route {\n\t/** The current path of the URL split into components. For instance `/` or `/users/123/feed`. Updates will be reflected in the URL and will *push* a new entry to the browser history. */\n\tpath!: string;\n\t/** Array containing the path segments. For instance `[]` or `['users', 123, 'feed']`. Updates will be reflected in the URL and will *push* a new entry to the browser history. Also, the values of `p` and `path` will be synced. */\n\tp!: string[];\n\t/** An observable object containing search parameters (a split up query string). For instance `{order: \"date\", title: \"something\"}` or just `{}`. By default, updates will be reflected in the URL, replacing the current history state. */\n\thash!: string;\n\t/** A part of the browser history *state* that is considered part of the page *identify*, meaning changes will (by default) cause a history push, and when going *back*, it must match. */\n\tsearch!: Record<string, string>;\n\t/** The `hash` interpreted as search parameters. So `\"a=x&b=y\"` becomes `{a: \"x\", b: \"y\"}`. */\n\tid!: Record<string, any>;\n\t/** The auxiliary part of the browser history *state*, not considered part of the page *identity*. Changes will be reflected in the browser history using a replace. */\n\taux!: Record<string, any>;\n\t/** The navigation depth of the current session. Starts at 1. Writing to this property has no effect. */\n\tdepth = 1;\n\t/** The navigation action that got us to this page. Writing to this property has no effect.\n - `\"load\"`: An initial page load.\n - `\"back\"` or `\"forward\"`: When we navigated backwards or forwards in the stack.\n - `\"push\"`: When we added a new page on top of the stack. \n */\n\tnav: \"load\" | \"back\" | \"forward\" | \"push\" = \"load\";\n\t/** As described above, this library takes a best guess about whether pushing an item to the browser history makes sense or not. When `mode` is... \n \t - `\"push\"`: Force creation of a new browser history entry. \n \t - `\"replace\"`: Update the current history entry, even when updates to other keys would normally cause a *push*.\n \t - `\"back\"`: Unwind the history (like repeatedly pressing the *back* button) until we find a page that matches the given `path` and `id` (or that is the first page in our stack), and then *replace* that state by the full given state.\n The `mode` key can be written to `route` but will be immediately and silently removed.\n */\n\tmode: \"push\" | \"replace\" | \"back\" | undefined;\n}\n\n/**\n * The singleton {@link Route} object reflecting the current URL and browser history state. You can make changes to it to affect the URL and browser history. See {@link Route} for details.\n */\nexport const route = proxy(new Route());\n\nlet stateRoute = {\n\tnonce: -1,\n\tdepth: 0,\n};\n\n// Reflect changes to the browser URL (back/forward navigation) in the `route` and `stack`.\nfunction handleLocationUpdate(event?: PopStateEvent) {\n\tconst state = event?.state || {};\n\tlet nav: \"load\" | \"back\" | \"forward\" | \"push\" = \"load\";\n\tif (state.route?.nonce == null) {\n\t\tstate.route = {\n\t\t\tnonce: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER),\n\t\t\tdepth: 1,\n\t\t};\n\t\thistory.replaceState(state, \"\");\n\t} else if (stateRoute.nonce === state.route.nonce) {\n\t\tnav = state.route.depth > stateRoute.depth ? \"forward\" : \"back\";\n\t}\n\tstateRoute = state.route;\n\n\tif (unproxy(route).mode === \"back\") {\n\t\troute.depth = stateRoute.depth;\n\t\t// We are still in the process of searching for a page in our navigation history..\n\t\tupdateHistory();\n\t\treturn;\n\t}\n\n\tconst search: any = {};\n\tfor (const [k, v] of new URLSearchParams(location.search)) {\n\t\tsearch[k] = v;\n\t}\n\n\troute.path = location.pathname;\n\troute.p = location.pathname.slice(1).split(\"/\");\n\troute.search = search;\n\troute.hash = location.hash;\n\troute.id = state.id;\n\troute.aux = state.aux;\n\troute.depth = stateRoute.depth;\n\troute.nav = nav;\n\n\t// Forward or back event. Redraw synchronously, because we can!\n\tif (event) runQueue();\n}\nhandleLocationUpdate();\nwindow.addEventListener(\"popstate\", handleLocationUpdate);\n\n// These immediate-mode observers will rewrite the data in `route` to its canonical form.\n// We want to to this immediately, so that user-code running immediately after a user-code\n// initiated `set` will see the canonical form (instead of doing a rerender shortly after,\n// or crashing due to non-canonical data).\nfunction updatePath(): void {\n\tlet path = route.path;\n\tif (path == null && unproxy(route).p) {\n\t\tupdateP();\n\t\treturn;\n\t}\n\tpath = `${path || \"/\"}`;\n\tif (!path.startsWith(\"/\")) path = `/${path}`;\n\troute.path = path;\n\troute.p = path.slice(1).split(\"/\");\n}\nimmediateObserve(updatePath);\n\nfunction updateP() {\n\tconst p = route.p;\n\tif (p == null && unproxy(route).path) {\n\t\tupdatePath();\n\t\treturn;\n\t}\n\tif (!(p instanceof Array)) {\n\t\tconsole.error(\n\t\t\t`aberdeen route: 'p' must be a non-empty array, not ${JSON.stringify(p)}`,\n\t\t);\n\t\troute.p = [\"\"]; // This will cause a recursive call this observer.\n\t} else if (p.length === 0) {\n\t\troute.p = [\"\"]; // This will cause a recursive call this observer.\n\t} else {\n\t\troute.path = `/${p.join(\"/\")}`;\n\t}\n}\nimmediateObserve(updateP);\n\nimmediateObserve(() => {\n\tif (!route.search || typeof route.search !== \"object\") route.search = {};\n});\n\nimmediateObserve(() => {\n\tif (!route.id || typeof route.id !== \"object\") route.id = {};\n});\n\nimmediateObserve(() => {\n\tif (!route.aux || typeof route.aux !== \"object\") route.aux = {};\n});\n\nimmediateObserve(() => {\n\tlet hash = `${route.hash || \"\"}`;\n\tif (hash && !hash.startsWith(\"#\")) hash = `#${hash}`;\n\troute.hash = hash;\n});\n\nfunction isSamePage(path: string, state: any): boolean {\n\treturn (\n\t\tlocation.pathname === path &&\n\t\tJSON.stringify(history.state.id) === JSON.stringify(state.id)\n\t);\n}\n\nfunction updateHistory() {\n\t// Get and delete mode without triggering anything.\n\tlet mode = route.mode;\n\tconst state = {\n\t\tid: clone(route.id),\n\t\taux: clone(route.aux),\n\t\troute: stateRoute,\n\t};\n\n\t// Construct the URL.\n\tconst path = route.path;\n\n\t// Change browser state, according to `mode`.\n\tif (mode === \"back\") {\n\t\troute.nav = \"back\";\n\t\tif (!isSamePage(path, state) && (history.state.route?.depth || 0) > 1) {\n\t\t\thistory.back();\n\t\t\treturn;\n\t\t}\n\t\tmode = \"replace\";\n\t\t// We'll replace the state async, to give the history.go the time to take affect first.\n\t\t//setTimeout(() => history.replaceState(state, '', url), 0)\n\t}\n\n\tif (mode) route.mode = undefined;\n\tconst search = new URLSearchParams(route.search).toString();\n\tconst url = (search ? `${path}?${search}` : path) + route.hash;\n\n\tif (mode === \"push\" || (!mode && !isSamePage(path, state))) {\n\t\tstateRoute.depth++; // stateRoute === state.route\n\t\thistory.pushState(state, \"\", url);\n\t\troute.nav = \"push\";\n\t\troute.depth = stateRoute.depth;\n\t} else {\n\t\t// Default to `push` when the URL changed or top-level state keys changed.\n\t\thistory.replaceState(state, \"\", url);\n\t}\n}\n\n// This deferred-mode observer will update the URL and history based on `route` changes.\nobserve(updateHistory);\n\n/**\n * Restore and store the vertical and horizontal scroll position for\n * the parent element to the page state.\n *\n * @param {string} name - A unique (within this page) name for this\n * scrollable element. Defaults to 'main'.\n *\n * The scroll position will be persisted in `route.aux.scroll.<name>`.\n */\nexport function persistScroll(name = \"main\") {\n\tconst el = getParentElement();\n\tel.addEventListener(\"scroll\", onScroll);\n\tclean(() => el.removeEventListener(\"scroll\", onScroll));\n\n\tconst restore = unproxy(route).aux.scroll?.name;\n\tif (restore) {\n\t\tObject.assign(el, restore);\n\t}\n\n\tfunction onScroll() {\n\t\troute.mode = \"replace\";\n\t\tif (!route.aux.scroll) route.aux.scroll = {};\n\t\troute.aux.scroll[name] = {\n\t\t\tscrollTop: el.scrollTop,\n\t\t\tscrollLeft: el.scrollLeft,\n\t\t};\n\t}\n}\n"
5
+ "import {\n\tclean,\n\tclone,\n\tgetParentElement,\n\timmediateObserve,\n\tobserve,\n\tproxy,\n\trunQueue,\n\tunproxy,\n} from \"./aberdeen.js\";\n\n/**\n * The class for the singleton `route` object.\n *\n */\n\nexport class Route {\n\t/** The current path of the URL split into components. For instance `/` or `/users/123/feed`. Updates will be reflected in the URL and will *push* a new entry to the browser history. */\n\tpath!: string;\n\t/** Array containing the path segments. For instance `[]` or `['users', 123, 'feed']`. Updates will be reflected in the URL and will *push* a new entry to the browser history. Also, the values of `p` and `path` will be synced. */\n\tp!: string[];\n\t/** An observable object containing search parameters (a split up query string). For instance `{order: \"date\", title: \"something\"}` or just `{}`. By default, updates will be reflected in the URL, replacing the current history state. */\n\thash!: string;\n\t/** A part of the browser history *state* that is considered part of the page *identify*, meaning changes will (by default) cause a history push, and when going *back*, it must match. */\n\tsearch!: Record<string, string>;\n\t/** The `hash` interpreted as search parameters. So `\"a=x&b=y\"` becomes `{a: \"x\", b: \"y\"}`. */\n\tid!: Record<string, any>;\n\t/** The auxiliary part of the browser history *state*, not considered part of the page *identity*. Changes will be reflected in the browser history using a replace. */\n\taux!: Record<string, any>;\n\t/** The navigation depth of the current session. Starts at 1. Writing to this property has no effect. */\n\tdepth = 1;\n\t/** The navigation action that got us to this page. Writing to this property has no effect.\n - `\"load\"`: An initial page load.\n - `\"back\"` or `\"forward\"`: When we navigated backwards or forwards in the stack.\n - `\"push\"`: When we added a new page on top of the stack. \n */\n\tnav: \"load\" | \"back\" | \"forward\" | \"push\" = \"load\";\n\t/** As described above, this library takes a best guess about whether pushing an item to the browser history makes sense or not. When `mode` is... \n \t - `\"push\"`: Force creation of a new browser history entry. \n \t - `\"replace\"`: Update the current history entry, even when updates to other keys would normally cause a *push*.\n \t - `\"back\"`: Unwind the history (like repeatedly pressing the *back* button) until we find a page that matches the given `path` and `id` (or that is the first page in our stack), and then *replace* that state by the full given state.\n The `mode` key can be written to `route` but will be immediately and silently removed.\n */\n\tmode: \"push\" | \"replace\" | \"back\" | undefined;\n}\n\n/**\n * The singleton {@link Route} object reflecting the current URL and browser history state. You can make changes to it to affect the URL and browser history. See {@link Route} for details.\n */\nexport const route = proxy(new Route());\n\nlet stateRoute = {\n\tnonce: -1,\n\tdepth: 0,\n};\n\n// Reflect changes to the browser URL (back/forward navigation) in the `route` and `stack`.\nfunction handleLocationUpdate(event?: PopStateEvent) {\n\tconst state = event?.state || {};\n\tlet nav: \"load\" | \"back\" | \"forward\" | \"push\" = \"load\";\n\tif (state.route?.nonce == null) {\n\t\tstate.route = {\n\t\t\tnonce: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER),\n\t\t\tdepth: 1,\n\t\t};\n\t\thistory.replaceState(state, \"\");\n\t} else if (stateRoute.nonce === state.route.nonce) {\n\t\tnav = state.route.depth > stateRoute.depth ? \"forward\" : \"back\";\n\t}\n\tstateRoute = state.route;\n\n\tif (unproxy(route).mode === \"back\") {\n\t\troute.depth = stateRoute.depth;\n\t\t// We are still in the process of searching for a page in our navigation history..\n\t\tupdateHistory();\n\t\treturn;\n\t}\n\n\tconst search: any = {};\n\tfor (const [k, v] of new URLSearchParams(location.search)) {\n\t\tsearch[k] = v;\n\t}\n\n\troute.path = location.pathname;\n\troute.p = location.pathname.slice(1).split(\"/\");\n\troute.search = search;\n\troute.hash = location.hash;\n\troute.id = state.id;\n\troute.aux = state.aux;\n\troute.depth = stateRoute.depth;\n\troute.nav = nav;\n\n\t// Forward or back event. Redraw synchronously, because we can!\n\tif (event) runQueue();\n}\nhandleLocationUpdate();\nwindow.addEventListener(\"popstate\", handleLocationUpdate);\n\n// These immediate-mode observers will rewrite the data in `route` to its canonical form.\n// We want to to this immediately, so that user-code running immediately after a user-code\n// initiated `set` will see the canonical form (instead of doing a rerender shortly after,\n// or crashing due to non-canonical data).\nfunction updatePath(): void {\n\tlet path = route.path;\n\tif (path == null && unproxy(route).p) {\n\t\tupdateP();\n\t\treturn;\n\t}\n\tpath = `${path || \"/\"}`;\n\tif (!path.startsWith(\"/\")) path = `/${path}`;\n\troute.path = path;\n\troute.p = path.slice(1).split(\"/\");\n}\nimmediateObserve(updatePath);\n\nfunction updateP() {\n\tconst p = route.p;\n\tif (p == null && unproxy(route).path) {\n\t\tupdatePath();\n\t\treturn;\n\t}\n\tif (!(p instanceof Array)) {\n\t\tconsole.error(\n\t\t\t`aberdeen route: 'p' must be a non-empty array, not ${JSON.stringify(p)}`,\n\t\t);\n\t\troute.p = [\"\"]; // This will cause a recursive call this observer.\n\t} else if (p.length === 0) {\n\t\troute.p = [\"\"]; // This will cause a recursive call this observer.\n\t} else {\n\t\troute.path = `/${p.join(\"/\")}`;\n\t}\n}\nimmediateObserve(updateP);\n\nimmediateObserve(() => {\n\tif (!route.search || typeof route.search !== \"object\") route.search = {};\n});\n\nimmediateObserve(() => {\n\tif (!route.id || typeof route.id !== \"object\") route.id = {};\n});\n\nimmediateObserve(() => {\n\tif (!route.aux || typeof route.aux !== \"object\") route.aux = {};\n});\n\nimmediateObserve(() => {\n\tlet hash = `${route.hash || \"\"}`;\n\tif (hash && !hash.startsWith(\"#\")) hash = `#${hash}`;\n\troute.hash = hash;\n});\n\nfunction isSamePage(path: string, state: any): boolean {\n\treturn (\n\t\tlocation.pathname === path &&\n\t\tJSON.stringify(history.state.id || {}) === JSON.stringify(state.id || {})\n\t);\n}\n\nfunction updateHistory() {\n\t// Get and delete mode without triggering anything.\n\tlet mode = route.mode;\n\tconst state = {\n\t\tid: clone(route.id),\n\t\taux: clone(route.aux),\n\t\troute: stateRoute,\n\t};\n\n\t// Construct the URL.\n\tconst path = route.path;\n\n\t// Change browser state, according to `mode`.\n\tif (mode === \"back\") {\n\t\troute.nav = \"back\";\n\t\tif (!isSamePage(path, state) && (history.state.route?.depth || 0) > 1) {\n\t\t\thistory.back();\n\t\t\treturn;\n\t\t}\n\t\tmode = \"replace\";\n\t\t// We'll replace the state async, to give the history.go the time to take affect first.\n\t\t//setTimeout(() => history.replaceState(state, '', url), 0)\n\t}\n\n\tif (mode) route.mode = undefined;\n\tconst search = new URLSearchParams(route.search).toString();\n\tconst url = (search ? `${path}?${search}` : path) + route.hash;\n\n\tif (mode === \"push\" || (!mode && !isSamePage(path, state))) {\n\t\tstateRoute.depth++; // stateRoute === state.route\n\t\thistory.pushState(state, \"\", url);\n\t\troute.nav = \"push\";\n\t\troute.depth = stateRoute.depth;\n\t} else {\n\t\t// Default to `push` when the URL changed or top-level state keys changed.\n\t\thistory.replaceState(state, \"\", url);\n\t}\n}\n\n// This deferred-mode observer will update the URL and history based on `route` changes.\nobserve(updateHistory);\n\n/**\n * Restore and store the vertical and horizontal scroll position for\n * the parent element to the page state.\n *\n * @param {string} name - A unique (within this page) name for this\n * scrollable element. Defaults to 'main'.\n *\n * The scroll position will be persisted in `route.aux.scroll.<name>`.\n */\nexport function persistScroll(name = \"main\") {\n\tconst el = getParentElement();\n\tel.addEventListener(\"scroll\", onScroll);\n\tclean(() => el.removeEventListener(\"scroll\", onScroll));\n\n\tconst restore = unproxy(route).aux.scroll?.name;\n\tif (restore) {\n\t\tObject.assign(el, restore);\n\t}\n\n\tfunction onScroll() {\n\t\troute.mode = \"replace\";\n\t\tif (!route.aux.scroll) route.aux.scroll = {};\n\t\troute.aux.scroll[name] = {\n\t\t\tscrollTop: el.scrollTop,\n\t\t\tscrollLeft: el.scrollLeft,\n\t\t};\n\t}\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "D7FFE7D955D7855E64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "D9D83FC76589C40E64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,7 @@
1
- class Y{keyProp;tail;symbols;constructor(z){this.keyProp=z;this.tail={},this.symbols=[Symbol(0)]}add(z){if(this.symbols[0]in z)return!1;let F=1+(Math.clz32(Math.random()*4294967295)>>2);for(let W=this.symbols.length;W<F;W++)this.symbols.push(Symbol(W));let J=this.keyProp,X=z[J],Z,U=this.tail;for(let W=this.symbols.length-1;W>=0;W--){let j=this.symbols[W];while((Z=U[j])&&Z[J]>X)U=Z;if(W<F)z[j]=U[j],U[j]=z}return!0}has(z){return this.symbols[0]in z}fetchLast(){let z=this.tail[this.symbols[0]];if(z)return this.remove(z),z}isEmpty(){return this.tail[this.symbols[0]]===void 0}get(z){let F=this.keyProp,J,X=this.tail;for(let Z=this.symbols.length-1;Z>=0;Z--){let U=this.symbols[Z];while((J=X[U])&&J[F]>z)X=J}return X[this.symbols[0]]?.[F]===z?X[this.symbols[0]]:void 0}*[Symbol.iterator](){let z=this.symbols[0],F=this.tail[z];while(F)yield F,F=F[z]}prev(z){return z[this.symbols[0]]}remove(z){if(!(this.symbols[0]in z))return!1;let F=this.keyProp,J=z[F],X,Z=this.tail;for(let U=this.symbols.length-1;U>=0;U--){let W=this.symbols[U];while((X=Z[W])&&X[F]>=J&&X!==z)Z=X;if(X===z)Z[W]=X[W],delete X[W]}return X===z}clear(){let z=this.symbols[0],F=this.tail;while(F){let J=F[z];for(let X of this.symbols){if(!(X in F))break;delete F[X]}F=J}this.tail={}}}var B,I=0,G;function E(z){if(!B)B=new Y("prio"),setTimeout(Gz,0);else if(!(I&1)){if(I++,I>98)throw new Error("Too many recursive updates from observes")}B.add(z)}function Gz(){let z=Date.now();while(B){let F=B.fetchLast();if(!F)break;if(I&1)I++;F.queueRun()}if(B=void 0,I=0,z=Date.now()-z,z>9)console.debug(`Aberdeen queue took ${z}ms`)}function s(z){if(typeof z==="string")return`${z}\x01`;let F="",J=Math.abs(Math.round(z)),X=z<0;while(J>0)F=String.fromCharCode(X?65534-J%65533:2+J%65533)+F,J=Math.floor(J/65533);return String.fromCharCode(128+(X?-F.length:F.length))+F}function Cz(z){let F="";for(let J=0;J<z.length;J++)F+=String.fromCodePoint(65535-z.charCodeAt(J));return F}var Vz=0;class u{prio=--Vz;remove(){let z=this.getLastNode();if(z)w(z,this.getPrecedingNode());this.delete()}}class C extends u{cleaners;inSvgNamespace=!1;constructor(z=[]){super();this.cleaners=z}lastChild;redraw(){}getLastNode(){return R(this.lastChild)}delete(){for(let z of this.cleaners)if(typeof z==="function")z();else z.delete(this);this.cleaners.length=0,B?.remove(this),this.lastChild=void 0}queueRun(){this.remove(),G=this,this.redraw(),G=void 0}getInsertAfterNode(){return this.getLastNode()||this.getPrecedingNode()}onChange(z,F,J){E(this)}getChildPrevSibling(){return this.lastChild}}class M extends C{parentElement;prevSibling;constructor(z,F=!1){super(F?q.cleaners:[]);this.parentElement=z;if(this.inSvgNamespace=q.inSvgNamespace,z===q.parentElement)this.prevSibling=q.getChildPrevSibling(),q.lastChild=this;if(!F)q.cleaners.push(this)}getPrecedingNode(){return R(this.prevSibling)}getChildPrevSibling(){return this.lastChild||this.prevSibling}}class x extends M{renderer;constructor(z,F){super(z);this.renderer=F;this.redraw()}redraw(){let z=q;q=this;try{this.renderer()}catch(F){l(F,!0)}q=z}}class t extends C{parentElement=document.body;getPrecedingNode(){return}}class e extends C{parentElement;renderer;constructor(z,F){super();this.parentElement=z;this.renderer=F;this.inSvgNamespace=q.inSvgNamespace,this.redraw(),q.cleaners.push(this)}redraw(){x.prototype.redraw.call(this)}getPrecedingNode(){return}delete(){w(this.getLastNode(),this.getPrecedingNode()),super.delete()}remove(){this.delete()}}function w(z,F){while(z&&z!==F){let J=z.previousSibling,X=g.get(z);if(X&&z instanceof Element){if(X!==!0){if(typeof X==="function")X(z);else Nz(z,X);g.set(z,!0)}}else z.remove();z=J}}function R(z){if(!z||z instanceof Node)return z;return z.getLastNode()||z.getPrecedingNode()}class zz extends M{renderer;result=N({value:void 0});constructor(z,F){super(z);this.renderer=F;this.redraw()}redraw(){let z=q;q=this;try{this.result.value=this.renderer()}catch(F){l(F,!0)}q=z}}class Fz extends M{key;target;constructor(z,F,J){super(z);this.key=F;this.target=J;this.redraw()}redraw(){let z=q;q=this,Hz(this.key,this.target.value),q=z}}var T=new Y("prio");class Jz extends x{onChange(z,F,J){T.add(this)}}var y=!1;function D(){for(let z=0;!T.isEmpty()&&!y;z++){if(z>42)throw T.clear(),new Error("Too many immediate-mode recursive updates");y=!0;let F=T;T=new Y("prio");try{for(let J of F)J.queueRun()}finally{y=!1}}}class Xz extends u{renderer;makeSortKey;parentElement=q.parentElement;prevSibling;target;byIndex=new Map;sortedSet=new Y("sortKey");changedIndexes=new Set;constructor(z,F,J){super();this.renderer=F;this.makeSortKey=J;let X=this.target=z[H]||z;if(V(X,Q,this),this.prevSibling=q.getChildPrevSibling(),q.lastChild=this,q.cleaners.push(this),X instanceof Array){for(let Z=0;Z<X.length;Z++)if(X[Z]!==void 0)new O(this,Z,!1)}else for(let Z in X)if(X[Z]!==void 0)new O(this,Z,!1)}getPrecedingNode(){return R(this.prevSibling)}onChange(z,F,J){if(!(this.target instanceof Array)||typeof z==="number")this.changedIndexes.add(z);E(this)}queueRun(){let z=this.changedIndexes;this.changedIndexes=new Set;for(let F of z){let J=this.byIndex.get(F);if(J)J.remove();if(this.target[F]===void 0)this.byIndex.delete(F);else new O(this,F,!0)}G=void 0}delete(){for(let z of this.byIndex.values())z.delete();B?.remove(this),this.byIndex.clear(),setTimeout(()=>{this.sortedSet.clear()},1)}getLastNode(){for(let z of this.sortedSet){let F=z.getActualLastNode();if(F)return F}}}class O extends C{parent;itemIndex;sortKey;parentElement;constructor(z,F,J){super();this.parent=z;this.itemIndex=F;if(this.parentElement=z.parentElement,this.inSvgNamespace=q.inSvgNamespace,this.parent.byIndex.set(this.itemIndex,this),this.lastChild=this,J)G=this;this.redraw()}getPrecedingNode(){this.parent.sortedSet.add(this);let z=this.parent.sortedSet.prev(this);if(z)return R(z.lastChild);return this.parent.getPrecedingNode()}getLastNode(){return this.getPrecedingNode()}getActualLastNode(){let z=this.lastChild;while(z&&z!==this){if(z instanceof Node)return z;let F=z.getLastNode();if(F)return F;z=z.getPrecedingNode()}}queueRun(){if(q!==P)r(4);if(this.sortKey!==void 0){let z=this.getActualLastNode();if(z)w(z,this.getPrecedingNode())}this.delete(),this.lastChild=this,G=this,this.redraw(),G=void 0}redraw(){let z=N(this.parent.target[this.itemIndex]),F=q;q=this;let J;try{if(this.parent.makeSortKey){let X=this.parent.makeSortKey(z,this.itemIndex);if(X!=null)J=X instanceof Array?X.map(s).join(""):X}else J=this.itemIndex;if(typeof J==="number")J=s(J);if(this.sortKey!==J)this.parent.sortedSet.remove(this),this.sortKey=J;if(J!=null)this.parent.renderer(z,this.itemIndex)}catch(X){l(X,J!=null)}q=F}getInsertAfterNode(){if(this.sortKey==null)r(1);return R(this.lastChild)}remove(){if(this.sortKey!==void 0){let z=this.getActualLastNode();if(z)w(z,this.getPrecedingNode());this.parent.sortedSet.remove(this),this.sortKey=void 0}this.delete()}}function A(z){let F=q.parentElement,J=q.getInsertAfterNode();F.insertBefore(z,J?J.nextSibling:F.firstChild),q.lastChild=z}var P=new t,q=P,Q=Symbol("any"),H=Symbol("target"),S=new WeakMap,k=0;function V(z,F,J=q){if(J===P||k)return;let X=S.get(z);if(!X)S.set(z,X=new Map);if(F!==Q&&X.get(Q)?.has(J))return;let Z=X.get(F);if(!Z)X.set(F,Z=new Set);if(Z.has(J))return;if(Z.add(J),J===q)q.cleaners.push(Z);else q.cleaners.push(()=>{Z.delete(J)})}function m(z,F,J){if(!z||typeof z!=="object")throw new Error("onEach requires an object");z=z[H]||z,new Xz(z,F,J)}function Zz(z){for(let F in z)return!1;return!0}function Pz(z){let F=z[H]||z,J=q;if(F instanceof Array)return V(F,"length",(Z,U,W)=>{if(!U!==!W)E(J)}),!F.length;let X=Zz(F);return V(F,Q,(Z,U,W)=>{if(X?W===void 0:U===void 0)E(J)}),X}function hz(z){if(z instanceof Array)return qz(z,"length");let F=z[H]||z,J=0;for(let Z in F)if(F[Z]!==void 0)J++;let X=Uz(J);return V(F,Q,(Z,U,W)=>{if(W===U);else if(W===void 0)X.value=++J;else if(U===void 0)X.value=--J}),X}function Bz(z,F,J,X){if(J===X&&J!==void 0)return;let Z=S.get(z);if(Z===void 0)return;for(let U of[F,Q]){let W=Z.get(U);if(W)for(let j of W)if(typeof j==="function")j(F,J,X);else j.onChange(F,J,X)}}var $=Bz,Qz={get(z,F){if(F===H)return z;return V(z,F),N(z[F])},set(z,F,J){if(typeof J==="object"&&J)J=J[H]||J;let X=z[F];if(J!==X)z[F]=J,$(z,F,J,X),D();return!0},deleteProperty(z,F){let J=z[F];return delete z[F],$(z,F,void 0,J),D(),!0},has(z,F){let J=F in z;return V(z,F),J},ownKeys(z){return V(z,Q),Reflect.ownKeys(z)}};function p(z,F,J){if(typeof J==="object"&&J)J=J[H]||J;let X=z[F];if(J!==X){let Z=z.length;if(F==="length"){z.length=J;for(let U=J;U<Z;U++)$(z,U,void 0,z[U])}else{let U=Number.parseInt(F);if(U.toString()===F)F=U;z[F]=J,$(z,F,J,X)}if(z.length!==Z)$(z,"length",z.length,Z);D()}return!0}var Az={get(z,F){if(F===H)return z;let J=F;if(typeof F!=="symbol"){let X=Number.parseInt(F);if(X.toString()===F)J=X}return V(z,J),N(z[F])},set:p,deleteProperty(z,F){return p(z,F,void 0)}},n=new WeakMap;function N(z){if(typeof z!=="object"||!z||z[H]!==void 0)return z;let F=n.get(z);if(F)return F;return F=new Proxy(z,z instanceof Array?Az:Qz),n.set(z,F),F}function Uz(z){return N(typeof z==="object"&&z!==null?z:{value:z})}function Wz(z){return z?z[H]||z:z}var g=new WeakMap;function Nz(z,F){let J=F.split(".").filter((X)=>X);z.classList.add(...J),setTimeout(()=>z.remove(),2000)}function Oz(z,F,J=0){b(z,F,J),D()}var i=1,Yz=2,o=32,f=64;function fz(z,F=0){let J=Object.create(Object.getPrototypeOf(z));return b(J,z,F),J}function b(z,F,J){let X=z[H];if(X)z=X,J|=f;if(X=F[H],X){if(F=X,q!==P&&!k)J|=o}if(J&o)V(F,Q);if(F instanceof Array){if(!(z instanceof Array))throw new Error("Cannot copy array into object");let Z=z.length,U=F.length;for(let W=0;W<U;W++)a(z,F,W,J);if(U!==Z)if(J&f){for(let W=U;W<Z;W++){let j=z[W];z[W]=void 0,$(z,W,void 0,j)}z.length=U,$(z,"length",U,Z)}else z.length=U}else{for(let Z in F)a(z,F,Z,J);if(!(J&i)){for(let Z in z)if(!(Z in F)){let U=z[Z];if(delete z[Z],J&f&&U!==void 0)$(z,Z,void 0,U)}}}}function a(z,F,J,X){let Z=z[J],U=F[J];if(U!==Z){if(U&&Z&&typeof U==="object"&&typeof Z==="object"&&(U.constructor===Z.constructor||X&i&&Z instanceof Array)){b(Z,U,X);return}if(!(X&Yz)&&U&&typeof U==="object"){let j=Object.create(Object.getPrototypeOf(U));b(j,U,0),U=j}let W=z[J];if(X&i&&U==null)delete z[J];else z[J]=U;if(X&f)$(z,J,U,W)}}var _z={get(z,F){if(F===H)return qz(Wz(z.proxy),z.index);if(F==="value")return z.proxy[z.index]},set(z,F,J){if(F==="value")return z.proxy[z.index]=J,!0;return!1}};function qz(z,F){return new Proxy({proxy:z,index:F},_z)}function Iz(z,F){let J,X,Z=z.getAttribute("type"),U=Wz(F).value;if(Z==="checkbox"){if(U===void 0)F.value=z.checked;J=()=>{z.checked=F.value},X=()=>{F.value=z.checked}}else if(Z==="radio"){if(U===void 0&&z.checked)F.value=z.value;J=()=>{z.checked=F.value===z.value},X=()=>{if(z.checked)F.value=z.value}}else{if(X=()=>{F.value=Z==="number"||Z==="range"?z.value===""?null:+z.value:z.value},U===void 0)X();J=()=>{if(z.value=F.value,z.tagName==="SELECT"&&z.value!=F.value)throw new Error(`SELECT has no '${F.value}' OPTION (yet)`)}}Mz(J),z.addEventListener("input",X),L(()=>{z.removeEventListener("input",X)})}var d={create:(z)=>{let F=q.parentElement;if(q!==G)return;if(typeof z==="function")z(F);else{let J=z.split(".").filter((X)=>X);F.classList.add(...J),(async()=>{F.offsetHeight,F.classList.remove(...J)})()}},destroy:(z)=>{let F=q.parentElement;g.set(F,z)},html:(z)=>{let F=document.createElement(q.parentElement.tagName);F.innerHTML=`${z}`;while(F.firstChild)A(F.firstChild)},text:(z)=>{A(document.createTextNode(z))},element:(z)=>{console.log("Aberdeen: $({element: myElement}) is deprecated, use $(myElement) instead"),A(z),d.element=A}};function _(...z){let F,J,X;for(let Z of z){if(Z==null||Z===!1)continue;if(typeof Z==="string"){let U,W,j=Z.indexOf(":");if(j>=0)U=Z.substring(j+1),Z=Z.substring(0,j);let K=Z.indexOf(".");if(K>=0)W=Z.substring(K+1),Z=Z.substring(0,K);if(Z===""){if(U)A(document.createTextNode(U));if(W){let v=q.parentElement;if(v.classList.add(...W.split(".")),!F)L(()=>v.classList.remove(...W.split(".")))}}else if(Z.indexOf(" ")>=0){J=`Tag '${Z}' cannot contain space`;break}else{if(q.inSvgNamespace||Z==="svg")X=document.createElementNS("http://www.w3.org/2000/svg",Z);else X=document.createElement(Z);if(W)X.className=W.replaceAll("."," ");if(U)X.textContent=U;if(A(X),!F)F=q;let h=new M(X,!0);if(Z==="svg")h.inSvgNamespace=!0;if(h.lastChild=X.lastChild||void 0,G===q)G=h;q=h}}else if(typeof Z==="object")if(Z.constructor!==Object)if(Z instanceof Node){if(A(Z),Z instanceof Element){if(!F)F=q;q=new M(Z,!0),q.lastChild=Z.lastChild||void 0}}else{J=`Unexpected argument: ${Z}`;break}else for(let U in Z){let W=Z[U];Hz(U,W)}else if(typeof Z==="function")new x(q.parentElement,Z);else{J=`Unexpected argument: ${Z}`;break}}if(F)q=F;if(J)throw new Error(J);return X}var jz=0;function Ez(z,F=!1){let J=F?"":`.AbdStl${++jz}`,X=c(z,J);if(X)_(`style:${X}`);return J}function c(z,F){let J="",X="";for(let Z in z){let U=z[Z];for(let W of Z.split(/, ?/g))if(U&&typeof U==="object")if(W.startsWith("@"))X+=`${W}{
2
- ${c(U,F)}}
3
- `;else X+=c(U,W.includes("&")?W.replace(/&/g,F):`${F} ${W}`);else J+=`${W.replace(/[A-Z]/g,(j)=>`-${j.toLowerCase()}`)}:${U};`}if(J)X=`${F.trimStart()||"*"}{${J}}
4
- ${X}`;return X}function Hz(z,F){let J=q.parentElement;if(typeof F==="object"&&F!==null&&F[H])if(z==="bind")Iz(J,F);else new Fz(J,z,F);else if(z[0]==="."){let X=z.substring(1).split(".");if(F)J.classList.add(...X);else J.classList.remove(...X)}else if(z[0]==="$"){let X=z.substring(1);if(F==null||F===!1)J.style[X]="";else J.style[X]=`${F}`}else if(F==null);else if(z in d)d[z](F);else if(typeof F==="function")J.addEventListener(z,F),L(()=>J.removeEventListener(z,F));else if(F===!0||F===!1||z==="value"||z==="selectedIndex")J[z]=F;else J.setAttribute(z,F)}function $z(z){return console.error("Error while in Aberdeen render:",z),!0}var Kz=$z;function wz(z){Kz=z||$z}function Dz(){return q.parentElement}function L(z){q.cleaners.push(z)}function Mz(z){return new zz(q.parentElement,z).result}function kz(z){new Jz(q.parentElement,z)}function bz(z,F){new e(z,F)}function xz(){P.remove(),jz=0}function mz(z){k++;try{return z()}finally{k--}}function vz(z,F){let J=N(z instanceof Array?[]:{});return m(z,(X,Z)=>{let U=F(X,Z);if(U!==void 0)J[Z]=U,L(()=>{delete J[Z]})}),J}function yz(z,F){let J=N({});return m(z,(X,Z)=>{let U=F(X,Z);if(U){for(let W in U)J[W]=U[W];L(()=>{for(let W in U)delete J[W]})}}),J}function Sz(z,F){let J={},X=Uz(J);return m(z,(Z,U)=>{let W=F(Z,U);if(W!=null){let j=W instanceof Array?W:[W];if(j.length){for(let K of j)if(J[K])X[K][U]=Z;else X[K]={[U]:Z};L(()=>{for(let K of j)if(delete X[K][U],Zz(J[K]))delete X[K]})}}}),X}function Lz(z){if(z&&typeof z==="object")_({text:z instanceof Array?"<array>":"<object>"}),_("ul",()=>{m(z,(F,J)=>{_(`li:${JSON.stringify(J)}: `,()=>{Lz(F)})})});else _({text:JSON.stringify(z)});return z}function r(z){throw new Error(`Aberdeen internal error ${z}`)}function l(z,F){try{if(Kz(z)===!1)F=!1}catch(J){console.error(J)}try{if(F)_("div.aberdeen-error:Error")}catch{}}function gz(z,F){let J=$;$=z;try{F()}finally{$=J}}export{gz as withEmitHandler,Wz as unproxy,xz as unmountAll,wz as setErrorHandler,Gz as runQueue,qz as ref,Uz as proxy,mz as peek,Sz as partition,m as onEach,Mz as observe,yz as multiMap,bz as mount,vz as map,Pz as isEmpty,Cz as invertString,Ez as insertCss,kz as immediateObserve,Dz as getParentElement,Lz as dump,Bz as defaultEmitHandler,hz as count,Oz as copy,fz as clone,L as clean,Yz as SHALLOW,i as MERGE,_ as $};
1
+ class C{keyProp;tail;symbols;constructor(F){this.keyProp=F;this.tail={},this.symbols=[Symbol(0)]}add(F){if(this.symbols[0]in F)return!1;let J=1+(Math.clz32(Math.random()*4294967295)>>2);for(let q=this.symbols.length;q<J;q++)this.symbols.push(Symbol(q));let X=this.keyProp,z=F[X],U,W=this.tail;for(let q=this.symbols.length-1;q>=0;q--){let H=this.symbols[q];while((U=W[H])&&U[X]>z)W=U;if(q<J)F[H]=W[H],W[H]=F}return!0}has(F){return this.symbols[0]in F}fetchLast(){let F=this.tail[this.symbols[0]];if(F)return this.remove(F),F}isEmpty(){return this.tail[this.symbols[0]]===void 0}get(F){let J=this.keyProp,X,z=this.tail;for(let U=this.symbols.length-1;U>=0;U--){let W=this.symbols[U];while((X=z[W])&&X[J]>F)z=X}return z[this.symbols[0]]?.[J]===F?z[this.symbols[0]]:void 0}*[Symbol.iterator](){let F=this.symbols[0],J=this.tail[F];while(J)yield J,J=J[F]}prev(F){return F[this.symbols[0]]}remove(F){if(!(this.symbols[0]in F))return!1;let J=this.keyProp,X=F[J],z,U=this.tail;for(let W=this.symbols.length-1;W>=0;W--){let q=this.symbols[W];while((z=U[q])&&z[J]>=X&&z!==F)U=z;if(z===F)U[q]=z[q],delete z[q]}return z===F}clear(){let F=this.symbols[0],J=this.tail;while(J){let X=J[F];for(let z of this.symbols){if(!(z in J))break;delete J[z]}J=X}this.tail={}}}var B,L=0,V;function T(F){if(!B)B=new C("prio"),setTimeout(AF,0);else if(!(L&1)){if(L++,L>98)throw new Error("Too many recursive updates from observes")}B.add(F)}function AF(){let F=Date.now();while(B){let J=B.fetchLast();if(!J)break;if(L&1)L++;J.queueRun()}if(B=void 0,L=0,F=Date.now()-F,F>9)console.debug(`Aberdeen queue took ${F}ms`)}function n(F){if(typeof F==="string")return`${F}\x01`;let J="",X=Math.abs(Math.round(F)),z=F<0;while(X>0)J=String.fromCharCode(z?65534-X%65533:2+X%65533)+J,X=Math.floor(X/65533);return String.fromCharCode(128+(z?-J.length:J.length))+J}function wF(F){let J="";for(let X=0;X<F.length;X++)J+=String.fromCodePoint(65535-F.charCodeAt(X));return J}var IF=0;class p{prio=--IF;remove(){let F=this.getLastNode();if(F)k(F,this.getPrecedingNode());this.delete()}}class f extends p{cleaners;inSvgNamespace=!1;constructor(F=[]){super();this.cleaners=F}lastChild;redraw(){}getLastNode(){return P(this.lastChild)}delete(){for(let F of this.cleaners)if(typeof F==="function")F();else F.delete(this);this.cleaners.length=0,B?.remove(this),this.lastChild=void 0}queueRun(){this.remove(),V=this,this.redraw(),V=void 0}getInsertAfterNode(){return this.getLastNode()||this.getPrecedingNode()}onChange(F,J,X){T(this)}getChildPrevSibling(){return this.lastChild}}class M extends f{parentElement;prevSibling;constructor(F,J=!1){super(J?Z.cleaners:[]);this.parentElement=F;if(this.inSvgNamespace=Z.inSvgNamespace,F===Z.parentElement)this.prevSibling=Z.getChildPrevSibling(),Z.lastChild=this;if(!J)Z.cleaners.push(this)}getPrecedingNode(){return P(this.prevSibling)}getChildPrevSibling(){return this.lastChild||this.prevSibling}}class m extends M{renderer;constructor(F,J){super(F);this.renderer=J;this.redraw()}redraw(){let F=Z;Z=this;try{this.renderer()}catch(J){s(J,!0)}Z=F}}class zF extends f{parentElement=document.body;getPrecedingNode(){return}}class UF extends f{parentElement;renderer;constructor(F,J){super();this.parentElement=F;this.renderer=J;this.inSvgNamespace=Z.inSvgNamespace,this.redraw(),Z.cleaners.push(this)}redraw(){m.prototype.redraw.call(this)}getPrecedingNode(){return}delete(){k(this.getLastNode(),this.getPrecedingNode()),super.delete()}remove(){this.delete()}}function k(F,J){while(F&&F!==J){let X=F.previousSibling,z=d.get(F);if(z&&F instanceof Element){if(z!==!0){if(typeof z==="function")z(F);else MF(F,z);d.set(F,!0)}}else F.remove();F=X}}function P(F){if(!F||F instanceof Node)return F;return F.getLastNode()||F.getPrecedingNode()}class WF extends M{renderer;result=G({value:void 0});constructor(F,J){super(F);this.renderer=J;this.redraw()}redraw(){let F=Z;Z=this;try{this.result.value=this.renderer()}catch(J){s(J,!0)}Z=F}}class qF extends M{key;target;constructor(F,J,X){super(F);this.key=J;this.target=X;this.redraw()}redraw(){let F=Z;Z=this,NF(this.key,this.target.value),Z=F}}var R=new C("prio");class ZF extends m{onChange(F,J,X){R.add(this)}}var i=!1;function I(){for(let F=0;!R.isEmpty()&&!i;F++){if(F>42)throw R.clear(),new Error("Too many immediate-mode recursive updates");i=!0;let J=R;R=new C("prio");try{for(let X of J)X.queueRun()}finally{i=!1}}}class $F extends p{renderer;makeSortKey;parentElement=Z.parentElement;prevSibling;target;byIndex=new Map;sortedSet=new C("sortKey");changedIndexes=new Set;constructor(F,J,X){super();this.renderer=J;this.makeSortKey=X;let z=this.target=F[$]||F;if(j(z,Q,this),this.prevSibling=Z.getChildPrevSibling(),Z.lastChild=this,Z.cleaners.push(this),z instanceof Array){for(let U=0;U<z.length;U++)if(z[U]!==void 0)new w(this,U,!1)}else for(let[U,W]of GF(z))if(W!==void 0)new w(this,U,!1)}getPrecedingNode(){return P(this.prevSibling)}onChange(F,J,X){if(!(this.target instanceof Array)||typeof F==="number")this.changedIndexes.add(F);T(this)}queueRun(){let F=this.changedIndexes;this.changedIndexes=new Set;for(let J of F){let X=this.byIndex.get(J);if(X)X.remove();let z;if(this.target instanceof Map)z=this.target.has(J);else z=this.target[J]!==void 0;if(!z)this.byIndex.delete(J);else new w(this,J,!0)}V=void 0}delete(){for(let F of this.byIndex.values())F.delete();B?.remove(this),this.byIndex.clear(),setTimeout(()=>{this.sortedSet.clear()},1)}getLastNode(){for(let F of this.sortedSet){let J=F.getActualLastNode();if(J)return J}}}class w extends f{parent;itemIndex;sortKey;parentElement;constructor(F,J,X){super();this.parent=F;this.itemIndex=J;if(this.parentElement=F.parentElement,this.inSvgNamespace=Z.inSvgNamespace,this.parent.byIndex.set(this.itemIndex,this),this.lastChild=this,X)V=this;this.redraw()}getPrecedingNode(){this.parent.sortedSet.add(this);let F=this.parent.sortedSet.prev(this);if(F)return P(F.lastChild);return this.parent.getPrecedingNode()}getLastNode(){return this.getPrecedingNode()}getActualLastNode(){let F=this.lastChild;while(F&&F!==this){if(F instanceof Node)return F;let J=F.getLastNode();if(J)return J;F=F.getPrecedingNode()}}queueRun(){if(Z!==O)XF(4);if(this.sortKey!==void 0){let F=this.getActualLastNode();if(F)k(F,this.getPrecedingNode())}this.delete(),this.lastChild=this,V=this,this.redraw(),V=void 0}redraw(){let F,J=this.parent.target,X=this.itemIndex;if(J instanceof Map)F=G(J.get(X)),X=G(X);else F=G(J[X]);let z=Z;Z=this;let U;try{if(this.parent.makeSortKey){let W=this.parent.makeSortKey(F,X);if(W!=null)U=W instanceof Array?W.map(n).join(""):W}else U=X;if(typeof U==="number")U=n(U);if(this.sortKey!==U)this.parent.sortedSet.remove(this),this.sortKey=U;if(U!=null)this.parent.renderer(F,X)}catch(W){s(W,U!=null)}Z=z}getInsertAfterNode(){if(this.sortKey==null)XF(1);return P(this.lastChild)}remove(){if(this.sortKey!==void 0){let F=this.getActualLastNode();if(F)k(F,this.getPrecedingNode());this.parent.sortedSet.remove(this),this.sortKey=void 0}this.delete()}}function A(F){let J=Z.parentElement,X=Z.getInsertAfterNode();J.insertBefore(F,X?X.nextSibling:J.firstChild),Z.lastChild=F}var O=new zF,Z=O,Q=Symbol("any"),$=Symbol("target"),h=Symbol("mapSize"),g=new WeakMap,x=0;function j(F,J,X=Z){if(X===O||x)return;let z=g.get(F);if(!z)g.set(F,z=new Map);if(J!==Q&&z.get(Q)?.has(X))return;let U=z.get(J);if(!U)z.set(J,U=new Set);if(U.has(X))return;if(U.add(X),X===Z)Z.cleaners.push(U);else Z.cleaners.push(()=>{U.delete(X)})}function y(F,J,X){if(!F||typeof F!=="object")throw new Error("onEach requires an object");F=F[$]||F,new $F(F,J,X)}function HF(F){for(let J in F)return!1;return!0}function DF(F){let J=F[$]||F,X=Z;if(J instanceof Array)return j(J,"length",(U,W,q)=>{if(!W!==!q)T(X)}),!J.length;if(J instanceof Map)return j(J,h,(U,W,q)=>{if(!W!==!q)T(X)}),!J.size;let z=HF(J);return j(J,Q,(U,W,q)=>{if(z?q===void 0:W===void 0)T(X)}),z}function kF(F){if(F instanceof Array)return c(F,"length");if(F instanceof Map)return c(F,"size");let J=F[$]||F,X=0;for(let U in J)if(J[U]!==void 0)X++;let z=jF(X);return j(J,Q,(U,W,q)=>{if(q===W);else if(q===void 0)z.value=++X;else if(W===void 0)z.value=--X}),z}function YF(F,J,X,z){if(X===z&&X!==void 0)return;let U=g.get(F);if(U===void 0)return;for(let W of[J,Q]){let q=U.get(W);if(q)for(let H of q)if(typeof H==="function")H(J,X,z);else H.onChange(J,X,z)}}var K=YF,CF={get(F,J){if(J===$)return F;return j(F,J),G(F[J])},set(F,J,X){if(typeof X==="object"&&X)X=X[$]||X;let z=F[J];if(X!==z)F[J]=X,K(F,J,X,z),I();return!0},deleteProperty(F,J){let X=F[J];return delete F[J],K(F,J,void 0,X),I(),!0},has(F,J){let X=J in F;return j(F,J),X},ownKeys(F){return j(F,Q),Reflect.ownKeys(F)}};function o(F,J,X){if(typeof X==="object"&&X)X=X[$]||X;let z=F[J];if(X!==z){let U=F.length;if(J==="length"){F.length=X;for(let W=X;W<U;W++)K(F,W,void 0,F[W])}else{let W=Number.parseInt(J);if(W.toString()===J)J=W;F[J]=X,K(F,J,X,z)}if(F.length!==U)K(F,"length",F.length,U);I()}return!0}var _F={get(F,J){if(J===$)return F;let X=J;if(typeof J!=="symbol"){let z=Number.parseInt(J);if(z.toString()===J)X=z}return j(F,X),G(F[J])},set:o,deleteProperty(F,J){return o(F,J,void 0)}},a={get(F){let J=this[$];return j(J,F),G(J.get(F))},set(F,J){let X=this[$];if(typeof J==="object"&&J)J=J[$]||J;let z=X.get(F);if(J!==z)X.set(F,J),K(X,F,J,z),K(X,h,X.size,X.size-(z===void 0?1:0)),I();return this},delete(F){let J=this[$],X=J.get(F),z=J.delete(F);if(z)K(J,F,void 0,X),K(J,h,J.size,J.size+1),I();return z},clear(){let F=this[$],J=F.size;for(let X of F.keys()){let z=F.get(X);K(F,X,void 0,z)}F.clear(),K(F,h,0,J),I()},has(F){let J=this[$];return j(J,F),J.has(F)},keys(){let F=this[$];return j(F,Q),F.keys()},values(){let F=this[$];return j(F,Q),F.values()},entries(){let F=this[$];return j(F,Q),F.entries()},[Symbol.iterator](){let F=this[$];return j(F,Q),F[Symbol.iterator]()}},LF={get(F,J){if(J===$)return F;if(J in a)return a[J];if(J==="size")return j(F,h),F.size;return j(F,J),G(F[J])}},r=new WeakMap;function G(F){if(typeof F!=="object"||!F||F[$]!==void 0)return F;let J=r.get(F);if(J)return J;let X;if(F instanceof Array)X=_F;else if(F instanceof Map)X=LF;else X=CF;return J=new Proxy(F,X),r.set(F,J),J}function jF(F){return G(typeof F==="object"&&F!==null?F:{value:F})}function KF(F){return F?F[$]||F:F}var d=new WeakMap;function MF(F,J){let X=J.split(".").filter((z)=>z);F.classList.add(...X),setTimeout(()=>F.remove(),2000)}function xF(F,J,X=0){v(F,J,X),I()}var D=1,RF=2,t=32,b=64;function bF(F,J=0){let X;if(F instanceof Map)X=new Map;else X=Object.create(Object.getPrototypeOf(F));return v(X,F,J),X}function GF(F){return F instanceof Map?F.entries():Object.entries(F)}function e(F){return F instanceof Map?F.keys():Object.keys(F)}function v(F,J,X){let z=F[$];if(z)F=z,X|=b;if(z=J[$],z){if(J=z,Z!==O&&!x)X|=t}if(X&t)j(J,Q);if(J instanceof Array){if(!(F instanceof Array))throw new Error("Cannot copy array into object");let U=F.length,W=J.length;for(let q=0;q<W;q++)JF(F,q,J[q],X);if(W!==U)if(X&b){for(let q=W;q<U;q++){let H=F[q];F[q]=void 0,K(F,q,void 0,H)}F.length=W,K(F,"length",W,U)}else F.length=W}else{for(let[U,W]of GF(J))JF(F,U,W,X);if(!(X&D)){if(J instanceof Map){for(let U of e(F))if(!J.has(U))FF(F,U,X)}else for(let U of e(F))if(!(U in J))FF(F,U,X)}}}function FF(F,J,X){let z;if(F instanceof Map)z=F.get(J),F.delete(J);else z=F[J],delete F[J];if(X&b&&z!==void 0)K(F,J,void 0,z)}function JF(F,J,X,z){let U=F instanceof Map?F.get(J):F[J];if(X!==U){if(X&&U&&typeof X==="object"&&typeof U==="object"&&(X.constructor===U.constructor||z&D&&U instanceof Array)){v(U,X,z);return}if(!(z&RF)&&X&&typeof X==="object"){let W=Object.create(Object.getPrototypeOf(X));v(W,X,0),X=W}if(F instanceof Map)if(z&D&&X==null)F.delete(J);else F.set(J,X);else if(z&D&&X==null)delete F[J];else F[J]=X;if(z&b)K(F,J,X,U)}}var TF={get(F,J){if(J===$)return c(KF(F.proxy),F.index);if(J==="value")return F.proxy[F.index]},set(F,J,X){if(J==="value")return F.proxy[F.index]=X,!0;return!1}};function c(F,J){return new Proxy({proxy:F,index:J},TF)}function hF(F,J){let X,z,U=F.getAttribute("type"),W=KF(J).value;if(U==="checkbox"){if(W===void 0)J.value=F.checked;X=()=>{F.checked=J.value},z=()=>{J.value=F.checked}}else if(U==="radio"){if(W===void 0&&F.checked)J.value=F.value;X=()=>{F.checked=J.value===F.value},z=()=>{if(F.checked)J.value=F.value}}else{if(z=()=>{J.value=U==="number"||U==="range"?F.value===""?null:+F.value:F.value},W===void 0)z();X=()=>{if(F.value=J.value,F.tagName==="SELECT"&&F.value!=J.value)throw new Error(`SELECT has no '${J.value}' OPTION (yet)`)}}PF(X),F.addEventListener("input",z),Y(()=>{F.removeEventListener("input",z)})}var l={create:(F)=>{let J=Z.parentElement;if(Z!==V)return;if(typeof F==="function")F(J);else{let X=F.split(".").filter((z)=>z);J.classList.add(...X),(async()=>{J.offsetHeight,J.classList.remove(...X)})()}},destroy:(F)=>{let J=Z.parentElement;d.set(J,F)},html:(F)=>{let J=document.createElement(Z.parentElement.tagName);J.innerHTML=`${F}`;while(J.firstChild)A(J.firstChild)},text:(F)=>{A(document.createTextNode(F))},element:(F)=>{console.log("Aberdeen: $({element: myElement}) is deprecated, use $(myElement) instead"),A(F),l.element=A}};function _(...F){let J,X,z;for(let U of F){if(U==null||U===!1)continue;if(typeof U==="string"){let W,q,H=U.indexOf(":");if(H>=0)W=U.substring(H+1),U=U.substring(0,H);let N=U.indexOf(".");if(N>=0)q=U.substring(N+1),U=U.substring(0,N);if(U===""){if(W)A(document.createTextNode(W));if(q){let S=Z.parentElement;if(S.classList.add(...q.split(".")),!J)Y(()=>S.classList.remove(...q.split(".")))}}else if(U.indexOf(" ")>=0){X=`Tag '${U}' cannot contain space`;break}else{if(Z.inSvgNamespace||U==="svg")z=document.createElementNS("http://www.w3.org/2000/svg",U);else z=document.createElement(U);if(q)z.className=q.replaceAll("."," ");if(W)z.textContent=W;if(A(z),!J)J=Z;let E=new M(z,!0);if(U==="svg")E.inSvgNamespace=!0;if(E.lastChild=z.lastChild||void 0,V===Z)V=E;Z=E}}else if(typeof U==="object")if(U.constructor!==Object)if(U instanceof Node){if(A(U),U instanceof Element){if(!J)J=Z;Z=new M(U,!0),Z.lastChild=U.lastChild||void 0}}else{X=`Unexpected argument: ${U}`;break}else for(let W in U){let q=U[W];NF(W,q)}else if(typeof U==="function")new m(Z.parentElement,U);else{X=`Unexpected argument: ${U}`;break}}if(J)Z=J;if(X)throw new Error(X);return z}var QF=0;function vF(F,J=!1){let X=J?"":`.AbdStl${++QF}`,z=u(F,X);if(z)_(`style:${z}`);return X}function u(F,J){let X="",z="";for(let U in F){let W=F[U];for(let q of U.split(/, ?/g))if(W&&typeof W==="object")if(q.startsWith("@"))z+=`${q}{
2
+ ${u(W,J)}}
3
+ `;else z+=u(W,q.includes("&")?q.replace(/&/g,J):`${J} ${q}`);else X+=`${q.replace(/[A-Z]/g,(H)=>`-${H.toLowerCase()}`)}:${W};`}if(X)z=`${J.trimStart()||"*"}{${X}}
4
+ ${z}`;return z}function NF(F,J){let X=Z.parentElement;if(typeof J==="object"&&J!==null&&J[$])if(F==="bind")hF(X,J);else new qF(X,F,J);else if(F[0]==="."){let z=F.substring(1).split(".");if(J)X.classList.add(...z);else X.classList.remove(...z)}else if(F[0]==="$"){let z=F.substring(1);if(J==null||J===!1)X.style[z]="";else X.style[z]=`${J}`}else if(J==null);else if(F in l)l[F](J);else if(typeof J==="function")X.addEventListener(F,J),Y(()=>X.removeEventListener(F,J));else if(J===!0||J===!1||F==="value"||F==="selectedIndex")X[F]=J;else X.setAttribute(F,J)}function VF(F){return console.error("Error while in Aberdeen render:",F),!0}var BF=VF;function mF(F){BF=F||VF}function yF(){return Z.parentElement}function Y(F){Z.cleaners.push(F)}function PF(F){return new WF(Z.parentElement,F).result}function SF(F){new ZF(Z.parentElement,F)}function iF(F,J){new UF(F,J)}function gF(){O.remove(),QF=0}function dF(F){x++;try{return F()}finally{x--}}function cF(F,J){let X;if(F instanceof Array)X=G([]);else if(F instanceof Map)X=G(new Map);else X=G({});return y(F,(z,U)=>{let W=J(z,U);if(W!==void 0)if(X instanceof Map)X.set(U,W),Y(()=>{X.delete(U)});else X[U]=W,Y(()=>{delete X[U]})}),X}function lF(F,J){let X=G({});return y(F,(z,U)=>{let W=J(z,U);if(W){for(let q in W)X[q]=W[q];Y(()=>{for(let q in W)delete X[q]})}}),X}function uF(F,J){let X={},z=jF(X);return y(F,(U,W)=>{let q=J(U,W);if(q!=null){let H=q instanceof Array?q:[q];if(H.length){for(let N of H)if(X[N])z[N][W]=U;else z[N]={[W]:U};Y(()=>{for(let N of H)if(delete z[N][W],HF(X[N]))delete z[N]})}}}),z}function fF(F){if(F&&typeof F==="object"){let J;if(F instanceof Array)J="<array>";else if(F instanceof Map)J="<Map>";else J="<object>";_({text:J}),_("ul",()=>{y(F,(X,z)=>{_(`li:${JSON.stringify(z)}: `,()=>{fF(X)})})})}else _({text:JSON.stringify(F)});return F}function XF(F){throw new Error(`Aberdeen internal error ${F}`)}function s(F,J){try{if(BF(F)===!1)J=!1}catch(X){console.error(X)}try{if(J)_("div.aberdeen-error:Error")}catch{}}function pF(F,J){let X=K;K=F;try{J()}finally{K=X}}export{pF as withEmitHandler,KF as unproxy,gF as unmountAll,mF as setErrorHandler,AF as runQueue,c as ref,jF as proxy,dF as peek,uF as partition,y as onEach,PF as observe,lF as multiMap,iF as mount,cF as map,DF as isEmpty,wF as invertString,vF as insertCss,SF as immediateObserve,yF as getParentElement,fF as dump,YF as defaultEmitHandler,kF as count,xF as copy,bF as clone,Y as clean,RF as SHALLOW,D as MERGE,_ as $};
5
5
 
6
- //# debugId=E101AB30ABEE326964756E2164756E21
6
+ //# debugId=85DE25E9F7A8E00864756E2164756E21
7
7
  //# sourceMappingURL=aberdeen.js.map