aboutsummaryrefslogtreecommitdiff
path: root/examples/07-routing/priv/static
diff options
context:
space:
mode:
Diffstat (limited to 'examples/07-routing/priv/static')
-rw-r--r--examples/07-routing/priv/static/app.mjs2419
1 files changed, 2419 insertions, 0 deletions
diff --git a/examples/07-routing/priv/static/app.mjs b/examples/07-routing/priv/static/app.mjs
new file mode 100644
index 0000000..d76fbad
--- /dev/null
+++ b/examples/07-routing/priv/static/app.mjs
@@ -0,0 +1,2419 @@
+// build/dev/javascript/prelude.mjs
+var CustomType = class {
+ withFields(fields) {
+ let properties = Object.keys(this).map(
+ (label2) => label2 in fields ? fields[label2] : this[label2]
+ );
+ return new this.constructor(...properties);
+ }
+};
+var List = class {
+ static fromArray(array3, tail) {
+ let t = tail || new Empty();
+ for (let i = array3.length - 1; i >= 0; --i) {
+ t = new NonEmpty(array3[i], t);
+ }
+ return t;
+ }
+ [Symbol.iterator]() {
+ return new ListIterator(this);
+ }
+ toArray() {
+ return [...this];
+ }
+ // @internal
+ atLeastLength(desired) {
+ for (let _ of this) {
+ if (desired <= 0)
+ return true;
+ desired--;
+ }
+ return desired <= 0;
+ }
+ // @internal
+ hasLength(desired) {
+ for (let _ of this) {
+ if (desired <= 0)
+ return false;
+ desired--;
+ }
+ return desired === 0;
+ }
+ countLength() {
+ let length3 = 0;
+ for (let _ of this)
+ length3++;
+ return length3;
+ }
+};
+function prepend(element2, tail) {
+ return new NonEmpty(element2, tail);
+}
+function toList(elements, tail) {
+ return List.fromArray(elements, tail);
+}
+var ListIterator = class {
+ #current;
+ constructor(current) {
+ this.#current = current;
+ }
+ next() {
+ if (this.#current instanceof Empty) {
+ return { done: true };
+ } else {
+ let { head, tail } = this.#current;
+ this.#current = tail;
+ return { value: head, done: false };
+ }
+ }
+};
+var Empty = class extends List {
+};
+var NonEmpty = class extends List {
+ constructor(head, tail) {
+ super();
+ this.head = head;
+ this.tail = tail;
+ }
+};
+var BitArray = class _BitArray {
+ constructor(buffer) {
+ if (!(buffer instanceof Uint8Array)) {
+ throw "BitArray can only be constructed from a Uint8Array";
+ }
+ this.buffer = buffer;
+ }
+ // @internal
+ get length() {
+ return this.buffer.length;
+ }
+ // @internal
+ byteAt(index2) {
+ return this.buffer[index2];
+ }
+ // @internal
+ floatAt(index2) {
+ return byteArrayToFloat(this.buffer.slice(index2, index2 + 8));
+ }
+ // @internal
+ intFromSlice(start4, end) {
+ return byteArrayToInt(this.buffer.slice(start4, end));
+ }
+ // @internal
+ binaryFromSlice(start4, end) {
+ return new _BitArray(this.buffer.slice(start4, end));
+ }
+ // @internal
+ sliceAfter(index2) {
+ return new _BitArray(this.buffer.slice(index2));
+ }
+};
+function byteArrayToInt(byteArray) {
+ byteArray = byteArray.reverse();
+ let value3 = 0;
+ for (let i = byteArray.length - 1; i >= 0; i--) {
+ value3 = value3 * 256 + byteArray[i];
+ }
+ return value3;
+}
+function byteArrayToFloat(byteArray) {
+ return new Float64Array(byteArray.reverse().buffer)[0];
+}
+var Result = class _Result extends CustomType {
+ // @internal
+ static isResult(data) {
+ return data instanceof _Result;
+ }
+};
+var Ok = class extends Result {
+ constructor(value3) {
+ super();
+ this[0] = value3;
+ }
+ // @internal
+ isOk() {
+ return true;
+ }
+};
+var Error = class extends Result {
+ constructor(detail) {
+ super();
+ this[0] = detail;
+ }
+ // @internal
+ isOk() {
+ return false;
+ }
+};
+function isEqual(x, y) {
+ let values = [x, y];
+ while (values.length) {
+ let a2 = values.pop();
+ let b = values.pop();
+ if (a2 === b)
+ continue;
+ if (!isObject(a2) || !isObject(b))
+ return false;
+ let unequal = !structurallyCompatibleObjects(a2, b) || unequalDates(a2, b) || unequalBuffers(a2, b) || unequalArrays(a2, b) || unequalMaps(a2, b) || unequalSets(a2, b) || unequalRegExps(a2, b);
+ if (unequal)
+ return false;
+ const proto = Object.getPrototypeOf(a2);
+ if (proto !== null && typeof proto.equals === "function") {
+ try {
+ if (a2.equals(b))
+ continue;
+ else
+ return false;
+ } catch {
+ }
+ }
+ let [keys2, get2] = getters(a2);
+ for (let k of keys2(a2)) {
+ values.push(get2(a2, k), get2(b, k));
+ }
+ }
+ return true;
+}
+function getters(object3) {
+ if (object3 instanceof Map) {
+ return [(x) => x.keys(), (x, y) => x.get(y)];
+ } else {
+ let extra = object3 instanceof globalThis.Error ? ["message"] : [];
+ return [(x) => [...extra, ...Object.keys(x)], (x, y) => x[y]];
+ }
+}
+function unequalDates(a2, b) {
+ return a2 instanceof Date && (a2 > b || a2 < b);
+}
+function unequalBuffers(a2, b) {
+ return a2.buffer instanceof ArrayBuffer && a2.BYTES_PER_ELEMENT && !(a2.byteLength === b.byteLength && a2.every((n, i) => n === b[i]));
+}
+function unequalArrays(a2, b) {
+ return Array.isArray(a2) && a2.length !== b.length;
+}
+function unequalMaps(a2, b) {
+ return a2 instanceof Map && a2.size !== b.size;
+}
+function unequalSets(a2, b) {
+ return a2 instanceof Set && (a2.size != b.size || [...a2].some((e) => !b.has(e)));
+}
+function unequalRegExps(a2, b) {
+ return a2 instanceof RegExp && (a2.source !== b.source || a2.flags !== b.flags);
+}
+function isObject(a2) {
+ return typeof a2 === "object" && a2 !== null;
+}
+function structurallyCompatibleObjects(a2, b) {
+ if (typeof a2 !== "object" && typeof b !== "object" && (!a2 || !b))
+ return false;
+ let nonstructural = [Promise, WeakSet, WeakMap, Function];
+ if (nonstructural.some((c) => a2 instanceof c))
+ return false;
+ return a2.constructor === b.constructor;
+}
+function makeError(variant, module, line, fn, message, extra) {
+ let error = new globalThis.Error(message);
+ error.gleam_error = variant;
+ error.module = module;
+ error.line = line;
+ error.fn = fn;
+ for (let k in extra)
+ error[k] = extra[k];
+ return error;
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/option.mjs
+var Some = class extends CustomType {
+ constructor(x0) {
+ super();
+ this[0] = x0;
+ }
+};
+var None = class extends CustomType {
+};
+function to_result(option, e) {
+ if (option instanceof Some) {
+ let a2 = option[0];
+ return new Ok(a2);
+ } else {
+ return new Error(e);
+ }
+}
+
+// build/dev/javascript/gleam_stdlib/dict.mjs
+var referenceMap = /* @__PURE__ */ new WeakMap();
+var tempDataView = new DataView(new ArrayBuffer(8));
+var referenceUID = 0;
+function hashByReference(o) {
+ const known = referenceMap.get(o);
+ if (known !== void 0) {
+ return known;
+ }
+ const hash = referenceUID++;
+ if (referenceUID === 2147483647) {
+ referenceUID = 0;
+ }
+ referenceMap.set(o, hash);
+ return hash;
+}
+function hashMerge(a2, b) {
+ return a2 ^ b + 2654435769 + (a2 << 6) + (a2 >> 2) | 0;
+}
+function hashString(s) {
+ let hash = 0;
+ const len = s.length;
+ for (let i = 0; i < len; i++) {
+ hash = Math.imul(31, hash) + s.charCodeAt(i) | 0;
+ }
+ return hash;
+}
+function hashNumber(n) {
+ tempDataView.setFloat64(0, n);
+ const i = tempDataView.getInt32(0);
+ const j = tempDataView.getInt32(4);
+ return Math.imul(73244475, i >> 16 ^ i) ^ j;
+}
+function hashBigInt(n) {
+ return hashString(n.toString());
+}
+function hashObject(o) {
+ const proto = Object.getPrototypeOf(o);
+ if (proto !== null && typeof proto.hashCode === "function") {
+ try {
+ const code = o.hashCode(o);
+ if (typeof code === "number") {
+ return code;
+ }
+ } catch {
+ }
+ }
+ if (o instanceof Promise || o instanceof WeakSet || o instanceof WeakMap) {
+ return hashByReference(o);
+ }
+ if (o instanceof Date) {
+ return hashNumber(o.getTime());
+ }
+ let h = 0;
+ if (o instanceof ArrayBuffer) {
+ o = new Uint8Array(o);
+ }
+ if (Array.isArray(o) || o instanceof Uint8Array) {
+ for (let i = 0; i < o.length; i++) {
+ h = Math.imul(31, h) + getHash(o[i]) | 0;
+ }
+ } else if (o instanceof Set) {
+ o.forEach((v) => {
+ h = h + getHash(v) | 0;
+ });
+ } else if (o instanceof Map) {
+ o.forEach((v, k) => {
+ h = h + hashMerge(getHash(v), getHash(k)) | 0;
+ });
+ } else {
+ const keys2 = Object.keys(o);
+ for (let i = 0; i < keys2.length; i++) {
+ const k = keys2[i];
+ const v = o[k];
+ h = h + hashMerge(getHash(v), hashString(k)) | 0;
+ }
+ }
+ return h;
+}
+function getHash(u) {
+ if (u === null)
+ return 1108378658;
+ if (u === void 0)
+ return 1108378659;
+ if (u === true)
+ return 1108378657;
+ if (u === false)
+ return 1108378656;
+ switch (typeof u) {
+ case "number":
+ return hashNumber(u);
+ case "string":
+ return hashString(u);
+ case "bigint":
+ return hashBigInt(u);
+ case "object":
+ return hashObject(u);
+ case "symbol":
+ return hashByReference(u);
+ case "function":
+ return hashByReference(u);
+ default:
+ return 0;
+ }
+}
+var SHIFT = 5;
+var BUCKET_SIZE = Math.pow(2, SHIFT);
+var MASK = BUCKET_SIZE - 1;
+var MAX_INDEX_NODE = BUCKET_SIZE / 2;
+var MIN_ARRAY_NODE = BUCKET_SIZE / 4;
+var ENTRY = 0;
+var ARRAY_NODE = 1;
+var INDEX_NODE = 2;
+var COLLISION_NODE = 3;
+var EMPTY = {
+ type: INDEX_NODE,
+ bitmap: 0,
+ array: []
+};
+function mask(hash, shift) {
+ return hash >>> shift & MASK;
+}
+function bitpos(hash, shift) {
+ return 1 << mask(hash, shift);
+}
+function bitcount(x) {
+ x -= x >> 1 & 1431655765;
+ x = (x & 858993459) + (x >> 2 & 858993459);
+ x = x + (x >> 4) & 252645135;
+ x += x >> 8;
+ x += x >> 16;
+ return x & 127;
+}
+function index(bitmap, bit) {
+ return bitcount(bitmap & bit - 1);
+}
+function cloneAndSet(arr, at, val) {
+ const len = arr.length;
+ const out = new Array(len);
+ for (let i = 0; i < len; ++i) {
+ out[i] = arr[i];
+ }
+ out[at] = val;
+ return out;
+}
+function spliceIn(arr, at, val) {
+ const len = arr.length;
+ const out = new Array(len + 1);
+ let i = 0;
+ let g = 0;
+ while (i < at) {
+ out[g++] = arr[i++];
+ }
+ out[g++] = val;
+ while (i < len) {
+ out[g++] = arr[i++];
+ }
+ return out;
+}
+function spliceOut(arr, at) {
+ const len = arr.length;
+ const out = new Array(len - 1);
+ let i = 0;
+ let g = 0;
+ while (i < at) {
+ out[g++] = arr[i++];
+ }
+ ++i;
+ while (i < len) {
+ out[g++] = arr[i++];
+ }
+ return out;
+}
+function createNode(shift, key1, val1, key2hash, key2, val2) {
+ const key1hash = getHash(key1);
+ if (key1hash === key2hash) {
+ return {
+ type: COLLISION_NODE,
+ hash: key1hash,
+ array: [
+ { type: ENTRY, k: key1, v: val1 },
+ { type: ENTRY, k: key2, v: val2 }
+ ]
+ };
+ }
+ const addedLeaf = { val: false };
+ return assoc(
+ assocIndex(EMPTY, shift, key1hash, key1, val1, addedLeaf),
+ shift,
+ key2hash,
+ key2,
+ val2,
+ addedLeaf
+ );
+}
+function assoc(root2, shift, hash, key, val, addedLeaf) {
+ switch (root2.type) {
+ case ARRAY_NODE:
+ return assocArray(root2, shift, hash, key, val, addedLeaf);
+ case INDEX_NODE:
+ return assocIndex(root2, shift, hash, key, val, addedLeaf);
+ case COLLISION_NODE:
+ return assocCollision(root2, shift, hash, key, val, addedLeaf);
+ }
+}
+function assocArray(root2, shift, hash, key, val, addedLeaf) {
+ const idx = mask(hash, shift);
+ const node = root2.array[idx];
+ if (node === void 0) {
+ addedLeaf.val = true;
+ return {
+ type: ARRAY_NODE,
+ size: root2.size + 1,
+ array: cloneAndSet(root2.array, idx, { type: ENTRY, k: key, v: val })
+ };
+ }
+ if (node.type === ENTRY) {
+ if (isEqual(key, node.k)) {
+ if (val === node.v) {
+ return root2;
+ }
+ return {
+ type: ARRAY_NODE,
+ size: root2.size,
+ array: cloneAndSet(root2.array, idx, {
+ type: ENTRY,
+ k: key,
+ v: val
+ })
+ };
+ }
+ addedLeaf.val = true;
+ return {
+ type: ARRAY_NODE,
+ size: root2.size,
+ array: cloneAndSet(
+ root2.array,
+ idx,
+ createNode(shift + SHIFT, node.k, node.v, hash, key, val)
+ )
+ };
+ }
+ const n = assoc(node, shift + SHIFT, hash, key, val, addedLeaf);
+ if (n === node) {
+ return root2;
+ }
+ return {
+ type: ARRAY_NODE,
+ size: root2.size,
+ array: cloneAndSet(root2.array, idx, n)
+ };
+}
+function assocIndex(root2, shift, hash, key, val, addedLeaf) {
+ const bit = bitpos(hash, shift);
+ const idx = index(root2.bitmap, bit);
+ if ((root2.bitmap & bit) !== 0) {
+ const node = root2.array[idx];
+ if (node.type !== ENTRY) {
+ const n = assoc(node, shift + SHIFT, hash, key, val, addedLeaf);
+ if (n === node) {
+ return root2;
+ }
+ return {
+ type: INDEX_NODE,
+ bitmap: root2.bitmap,
+ array: cloneAndSet(root2.array, idx, n)
+ };
+ }
+ const nodeKey = node.k;
+ if (isEqual(key, nodeKey)) {
+ if (val === node.v) {
+ return root2;
+ }
+ return {
+ type: INDEX_NODE,
+ bitmap: root2.bitmap,
+ array: cloneAndSet(root2.array, idx, {
+ type: ENTRY,
+ k: key,
+ v: val
+ })
+ };
+ }
+ addedLeaf.val = true;
+ return {
+ type: INDEX_NODE,
+ bitmap: root2.bitmap,
+ array: cloneAndSet(
+ root2.array,
+ idx,
+ createNode(shift + SHIFT, nodeKey, node.v, hash, key, val)
+ )
+ };
+ } else {
+ const n = root2.array.length;
+ if (n >= MAX_INDEX_NODE) {
+ const nodes = new Array(32);
+ const jdx = mask(hash, shift);
+ nodes[jdx] = assocIndex(EMPTY, shift + SHIFT, hash, key, val, addedLeaf);
+ let j = 0;
+ let bitmap = root2.bitmap;
+ for (let i = 0; i < 32; i++) {
+ if ((bitmap & 1) !== 0) {
+ const node = root2.array[j++];
+ nodes[i] = node;
+ }
+ bitmap = bitmap >>> 1;
+ }
+ return {
+ type: ARRAY_NODE,
+ size: n + 1,
+ array: nodes
+ };
+ } else {
+ const newArray = spliceIn(root2.array, idx, {
+ type: ENTRY,
+ k: key,
+ v: val
+ });
+ addedLeaf.val = true;
+ return {
+ type: INDEX_NODE,
+ bitmap: root2.bitmap | bit,
+ array: newArray
+ };
+ }
+ }
+}
+function assocCollision(root2, shift, hash, key, val, addedLeaf) {
+ if (hash === root2.hash) {
+ const idx = collisionIndexOf(root2, key);
+ if (idx !== -1) {
+ const entry = root2.array[idx];
+ if (entry.v === val) {
+ return root2;
+ }
+ return {
+ type: COLLISION_NODE,
+ hash,
+ array: cloneAndSet(root2.array, idx, { type: ENTRY, k: key, v: val })
+ };
+ }
+ const size = root2.array.length;
+ addedLeaf.val = true;
+ return {
+ type: COLLISION_NODE,
+ hash,
+ array: cloneAndSet(root2.array, size, { type: ENTRY, k: key, v: val })
+ };
+ }
+ return assoc(
+ {
+ type: INDEX_NODE,
+ bitmap: bitpos(root2.hash, shift),
+ array: [root2]
+ },
+ shift,
+ hash,
+ key,
+ val,
+ addedLeaf
+ );
+}
+function collisionIndexOf(root2, key) {
+ const size = root2.array.length;
+ for (let i = 0; i < size; i++) {
+ if (isEqual(key, root2.array[i].k)) {
+ return i;
+ }
+ }
+ return -1;
+}
+function find(root2, shift, hash, key) {
+ switch (root2.type) {
+ case ARRAY_NODE:
+ return findArray(root2, shift, hash, key);
+ case INDEX_NODE:
+ return findIndex(root2, shift, hash, key);
+ case COLLISION_NODE:
+ return findCollision(root2, key);
+ }
+}
+function findArray(root2, shift, hash, key) {
+ const idx = mask(hash, shift);
+ const node = root2.array[idx];
+ if (node === void 0) {
+ return void 0;
+ }
+ if (node.type !== ENTRY) {
+ return find(node, shift + SHIFT, hash, key);
+ }
+ if (isEqual(key, node.k)) {
+ return node;
+ }
+ return void 0;
+}
+function findIndex(root2, shift, hash, key) {
+ const bit = bitpos(hash, shift);
+ if ((root2.bitmap & bit) === 0) {
+ return void 0;
+ }
+ const idx = index(root2.bitmap, bit);
+ const node = root2.array[idx];
+ if (node.type !== ENTRY) {
+ return find(node, shift + SHIFT, hash, key);
+ }
+ if (isEqual(key, node.k)) {
+ return node;
+ }
+ return void 0;
+}
+function findCollision(root2, key) {
+ const idx = collisionIndexOf(root2, key);
+ if (idx < 0) {
+ return void 0;
+ }
+ return root2.array[idx];
+}
+function without(root2, shift, hash, key) {
+ switch (root2.type) {
+ case ARRAY_NODE:
+ return withoutArray(root2, shift, hash, key);
+ case INDEX_NODE:
+ return withoutIndex(root2, shift, hash, key);
+ case COLLISION_NODE:
+ return withoutCollision(root2, key);
+ }
+}
+function withoutArray(root2, shift, hash, key) {
+ const idx = mask(hash, shift);
+ const node = root2.array[idx];
+ if (node === void 0) {
+ return root2;
+ }
+ let n = void 0;
+ if (node.type === ENTRY) {
+ if (!isEqual(node.k, key)) {
+ return root2;
+ }
+ } else {
+ n = without(node, shift + SHIFT, hash, key);
+ if (n === node) {
+ return root2;
+ }
+ }
+ if (n === void 0) {
+ if (root2.size <= MIN_ARRAY_NODE) {
+ const arr = root2.array;
+ const out = new Array(root2.size - 1);
+ let i = 0;
+ let j = 0;
+ let bitmap = 0;
+ while (i < idx) {
+ const nv = arr[i];
+ if (nv !== void 0) {
+ out[j] = nv;
+ bitmap |= 1 << i;
+ ++j;
+ }
+ ++i;
+ }
+ ++i;
+ while (i < arr.length) {
+ const nv = arr[i];
+ if (nv !== void 0) {
+ out[j] = nv;
+ bitmap |= 1 << i;
+ ++j;
+ }
+ ++i;
+ }
+ return {
+ type: INDEX_NODE,
+ bitmap,
+ array: out
+ };
+ }
+ return {
+ type: ARRAY_NODE,
+ size: root2.size - 1,
+ array: cloneAndSet(root2.array, idx, n)
+ };
+ }
+ return {
+ type: ARRAY_NODE,
+ size: root2.size,
+ array: cloneAndSet(root2.array, idx, n)
+ };
+}
+function withoutIndex(root2, shift, hash, key) {
+ const bit = bitpos(hash, shift);
+ if ((root2.bitmap & bit) === 0) {
+ return root2;
+ }
+ const idx = index(root2.bitmap, bit);
+ const node = root2.array[idx];
+ if (node.type !== ENTRY) {
+ const n = without(node, shift + SHIFT, hash, key);
+ if (n === node) {
+ return root2;
+ }
+ if (n !== void 0) {
+ return {
+ type: INDEX_NODE,
+ bitmap: root2.bitmap,
+ array: cloneAndSet(root2.array, idx, n)
+ };
+ }
+ if (root2.bitmap === bit) {
+ return void 0;
+ }
+ return {
+ type: INDEX_NODE,
+ bitmap: root2.bitmap ^ bit,
+ array: spliceOut(root2.array, idx)
+ };
+ }
+ if (isEqual(key, node.k)) {
+ if (root2.bitmap === bit) {
+ return void 0;
+ }
+ return {
+ type: INDEX_NODE,
+ bitmap: root2.bitmap ^ bit,
+ array: spliceOut(root2.array, idx)
+ };
+ }
+ return root2;
+}
+function withoutCollision(root2, key) {
+ const idx = collisionIndexOf(root2, key);
+ if (idx < 0) {
+ return root2;
+ }
+ if (root2.array.length === 1) {
+ return void 0;
+ }
+ return {
+ type: COLLISION_NODE,
+ hash: root2.hash,
+ array: spliceOut(root2.array, idx)
+ };
+}
+function forEach(root2, fn) {
+ if (root2 === void 0) {
+ return;
+ }
+ const items = root2.array;
+ const size = items.length;
+ for (let i = 0; i < size; i++) {
+ const item = items[i];
+ if (item === void 0) {
+ continue;
+ }
+ if (item.type === ENTRY) {
+ fn(item.v, item.k);
+ continue;
+ }
+ forEach(item, fn);
+ }
+}
+var Dict = class _Dict {
+ /**
+ * @template V
+ * @param {Record<string,V>} o
+ * @returns {Dict<string,V>}
+ */
+ static fromObject(o) {
+ const keys2 = Object.keys(o);
+ let m = _Dict.new();
+ for (let i = 0; i < keys2.length; i++) {
+ const k = keys2[i];
+ m = m.set(k, o[k]);
+ }
+ return m;
+ }
+ /**
+ * @template K,V
+ * @param {Map<K,V>} o
+ * @returns {Dict<K,V>}
+ */
+ static fromMap(o) {
+ let m = _Dict.new();
+ o.forEach((v, k) => {
+ m = m.set(k, v);
+ });
+ return m;
+ }
+ static new() {
+ return new _Dict(void 0, 0);
+ }
+ /**
+ * @param {undefined | Node<K,V>} root
+ * @param {number} size
+ */
+ constructor(root2, size) {
+ this.root = root2;
+ this.size = size;
+ }
+ /**
+ * @template NotFound
+ * @param {K} key
+ * @param {NotFound} notFound
+ * @returns {NotFound | V}
+ */
+ get(key, notFound) {
+ if (this.root === void 0) {
+ return notFound;
+ }
+ const found = find(this.root, 0, getHash(key), key);
+ if (found === void 0) {
+ return notFound;
+ }
+ return found.v;
+ }
+ /**
+ * @param {K} key
+ * @param {V} val
+ * @returns {Dict<K,V>}
+ */
+ set(key, val) {
+ const addedLeaf = { val: false };
+ const root2 = this.root === void 0 ? EMPTY : this.root;
+ const newRoot = assoc(root2, 0, getHash(key), key, val, addedLeaf);
+ if (newRoot === this.root) {
+ return this;
+ }
+ return new _Dict(newRoot, addedLeaf.val ? this.size + 1 : this.size);
+ }
+ /**
+ * @param {K} key
+ * @returns {Dict<K,V>}
+ */
+ delete(key) {
+ if (this.root === void 0) {
+ return this;
+ }
+ const newRoot = without(this.root, 0, getHash(key), key);
+ if (newRoot === this.root) {
+ return this;
+ }
+ if (newRoot === void 0) {
+ return _Dict.new();
+ }
+ return new _Dict(newRoot, this.size - 1);
+ }
+ /**
+ * @param {K} key
+ * @returns {boolean}
+ */
+ has(key) {
+ if (this.root === void 0) {
+ return false;
+ }
+ return find(this.root, 0, getHash(key), key) !== void 0;
+ }
+ /**
+ * @returns {[K,V][]}
+ */
+ entries() {
+ if (this.root === void 0) {
+ return [];
+ }
+ const result = [];
+ this.forEach((v, k) => result.push([k, v]));
+ return result;
+ }
+ /**
+ *
+ * @param {(val:V,key:K)=>void} fn
+ */
+ forEach(fn) {
+ forEach(this.root, fn);
+ }
+ hashCode() {
+ let h = 0;
+ this.forEach((v, k) => {
+ h = h + hashMerge(getHash(v), getHash(k)) | 0;
+ });
+ return h;
+ }
+ /**
+ * @param {unknown} o
+ * @returns {boolean}
+ */
+ equals(o) {
+ if (!(o instanceof _Dict) || this.size !== o.size) {
+ return false;
+ }
+ let equal2 = true;
+ this.forEach((v, k) => {
+ equal2 = equal2 && isEqual(o.get(k, !v), v);
+ });
+ return equal2;
+ }
+};
+
+// build/dev/javascript/gleam_stdlib/gleam_stdlib.mjs
+var Nil = void 0;
+var NOT_FOUND = {};
+function identity(x) {
+ return x;
+}
+function to_string(term) {
+ return term.toString();
+}
+function string_replace(string3, target, substitute) {
+ if (typeof string3.replaceAll !== "undefined") {
+ return string3.replaceAll(target, substitute);
+ }
+ return string3.replace(
+ // $& means the whole matched string
+ new RegExp(target.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"),
+ substitute
+ );
+}
+function graphemes(string3) {
+ const iterator = graphemes_iterator(string3);
+ if (iterator) {
+ return List.fromArray(Array.from(iterator).map((item) => item.segment));
+ } else {
+ return List.fromArray(string3.match(/./gsu));
+ }
+}
+function graphemes_iterator(string3) {
+ if (Intl && Intl.Segmenter) {
+ return new Intl.Segmenter().segment(string3)[Symbol.iterator]();
+ }
+}
+function lowercase(string3) {
+ return string3.toLowerCase();
+}
+function split(xs, pattern) {
+ return List.fromArray(xs.split(pattern));
+}
+function concat(xs) {
+ let result = "";
+ for (const x of xs) {
+ result = result + x;
+ }
+ return result;
+}
+function map_get(map5, key) {
+ const value3 = map5.get(key, NOT_FOUND);
+ if (value3 === NOT_FOUND) {
+ return new Error(Nil);
+ }
+ return new Ok(value3);
+}
+function classify_dynamic(data) {
+ if (typeof data === "string") {
+ return "String";
+ } else if (data instanceof Result) {
+ return "Result";
+ } else if (data instanceof List) {
+ return "List";
+ } else if (data instanceof BitArray) {
+ return "BitArray";
+ } else if (data instanceof Dict) {
+ return "Dict";
+ } else if (Number.isInteger(data)) {
+ return "Int";
+ } else if (Array.isArray(data)) {
+ return `Tuple of ${data.length} elements`;
+ } else if (typeof data === "number") {
+ return "Float";
+ } else if (data === null) {
+ return "Null";
+ } else if (data === void 0) {
+ return "Nil";
+ } else {
+ const type = typeof data;
+ return type.charAt(0).toUpperCase() + type.slice(1);
+ }
+}
+function decoder_error(expected, got) {
+ return decoder_error_no_classify(expected, classify_dynamic(got));
+}
+function decoder_error_no_classify(expected, got) {
+ return new Error(
+ List.fromArray([new DecodeError(expected, got, List.fromArray([]))])
+ );
+}
+function decode_string(data) {
+ return typeof data === "string" ? new Ok(data) : decoder_error("String", data);
+}
+function decode_int(data) {
+ return Number.isInteger(data) ? new Ok(data) : decoder_error("Int", data);
+}
+function decode_field(value3, name) {
+ const not_a_map_error = () => decoder_error("Dict", value3);
+ if (value3 instanceof Dict || value3 instanceof WeakMap || value3 instanceof Map) {
+ const entry = map_get(value3, name);
+ return new Ok(entry.isOk() ? new Some(entry[0]) : new None());
+ } else if (value3 === null) {
+ return not_a_map_error();
+ } else if (Object.getPrototypeOf(value3) == Object.prototype) {
+ return try_get_field(value3, name, () => new Ok(new None()));
+ } else {
+ return try_get_field(value3, name, not_a_map_error);
+ }
+}
+function try_get_field(value3, field3, or_else) {
+ try {
+ return field3 in value3 ? new Ok(new Some(value3[field3])) : or_else();
+ } catch {
+ return or_else();
+ }
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/int.mjs
+function to_string2(x) {
+ return to_string(x);
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/list.mjs
+function do_reverse_acc(loop$remaining, loop$accumulator) {
+ while (true) {
+ let remaining = loop$remaining;
+ let accumulator = loop$accumulator;
+ if (remaining.hasLength(0)) {
+ return accumulator;
+ } else {
+ let item = remaining.head;
+ let rest$1 = remaining.tail;
+ loop$remaining = rest$1;
+ loop$accumulator = prepend(item, accumulator);
+ }
+ }
+}
+function do_reverse(list) {
+ return do_reverse_acc(list, toList([]));
+}
+function reverse(xs) {
+ return do_reverse(xs);
+}
+function do_map(loop$list, loop$fun, loop$acc) {
+ while (true) {
+ let list = loop$list;
+ let fun = loop$fun;
+ let acc = loop$acc;
+ if (list.hasLength(0)) {
+ return reverse(acc);
+ } else {
+ let x = list.head;
+ let xs = list.tail;
+ loop$list = xs;
+ loop$fun = fun;
+ loop$acc = prepend(fun(x), acc);
+ }
+ }
+}
+function map(list, fun) {
+ return do_map(list, fun, toList([]));
+}
+function do_append_acc(loop$first, loop$second) {
+ while (true) {
+ let first2 = loop$first;
+ let second2 = loop$second;
+ if (first2.hasLength(0)) {
+ return second2;
+ } else {
+ let item = first2.head;
+ let rest$1 = first2.tail;
+ loop$first = rest$1;
+ loop$second = prepend(item, second2);
+ }
+ }
+}
+function do_append(first2, second2) {
+ return do_append_acc(reverse(first2), second2);
+}
+function append(first2, second2) {
+ return do_append(first2, second2);
+}
+function fold(loop$list, loop$initial, loop$fun) {
+ while (true) {
+ let list = loop$list;
+ let initial = loop$initial;
+ let fun = loop$fun;
+ if (list.hasLength(0)) {
+ return initial;
+ } else {
+ let x = list.head;
+ let rest$1 = list.tail;
+ loop$list = rest$1;
+ loop$initial = fun(initial, x);
+ loop$fun = fun;
+ }
+ }
+}
+function find2(loop$haystack, loop$is_desired) {
+ while (true) {
+ let haystack = loop$haystack;
+ let is_desired = loop$is_desired;
+ if (haystack.hasLength(0)) {
+ return new Error(void 0);
+ } else {
+ let x = haystack.head;
+ let rest$1 = haystack.tail;
+ let $ = is_desired(x);
+ if ($) {
+ return new Ok(x);
+ } else {
+ loop$haystack = rest$1;
+ loop$is_desired = is_desired;
+ }
+ }
+ }
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/result.mjs
+function map2(result, fun) {
+ if (result.isOk()) {
+ let x = result[0];
+ return new Ok(fun(x));
+ } else {
+ let e = result[0];
+ return new Error(e);
+ }
+}
+function map_error(result, fun) {
+ if (result.isOk()) {
+ let x = result[0];
+ return new Ok(x);
+ } else {
+ let error = result[0];
+ return new Error(fun(error));
+ }
+}
+function try$(result, fun) {
+ if (result.isOk()) {
+ let x = result[0];
+ return fun(x);
+ } else {
+ let e = result[0];
+ return new Error(e);
+ }
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/string_builder.mjs
+function from_strings(strings) {
+ return concat(strings);
+}
+function from_string(string3) {
+ return identity(string3);
+}
+function to_string3(builder) {
+ return identity(builder);
+}
+function split2(iodata, pattern) {
+ return split(iodata, pattern);
+}
+function replace(builder, pattern, substitute) {
+ return string_replace(builder, pattern, substitute);
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/dynamic.mjs
+var DecodeError = class extends CustomType {
+ constructor(expected, found, path) {
+ super();
+ this.expected = expected;
+ this.found = found;
+ this.path = path;
+ }
+};
+function from(a2) {
+ return identity(a2);
+}
+function string(data) {
+ return decode_string(data);
+}
+function classify(data) {
+ return classify_dynamic(data);
+}
+function int(data) {
+ return decode_int(data);
+}
+function any(decoders) {
+ return (data) => {
+ if (decoders.hasLength(0)) {
+ return new Error(
+ toList([new DecodeError("another type", classify(data), toList([]))])
+ );
+ } else {
+ let decoder2 = decoders.head;
+ let decoders$1 = decoders.tail;
+ let $ = decoder2(data);
+ if ($.isOk()) {
+ let decoded = $[0];
+ return new Ok(decoded);
+ } else {
+ return any(decoders$1)(data);
+ }
+ }
+ };
+}
+function push_path(error, name) {
+ let name$1 = from(name);
+ let decoder2 = any(
+ toList([string, (x) => {
+ return map2(int(x), to_string2);
+ }])
+ );
+ let name$2 = (() => {
+ let $ = decoder2(name$1);
+ if ($.isOk()) {
+ let name$22 = $[0];
+ return name$22;
+ } else {
+ let _pipe = toList(["<", classify(name$1), ">"]);
+ let _pipe$1 = from_strings(_pipe);
+ return to_string3(_pipe$1);
+ }
+ })();
+ return error.withFields({ path: prepend(name$2, error.path) });
+}
+function map_errors(result, f) {
+ return map_error(
+ result,
+ (_capture) => {
+ return map(_capture, f);
+ }
+ );
+}
+function field(name, inner_type) {
+ return (value3) => {
+ let missing_field_error = new DecodeError("field", "nothing", toList([]));
+ return try$(
+ decode_field(value3, name),
+ (maybe_inner) => {
+ let _pipe = maybe_inner;
+ let _pipe$1 = to_result(_pipe, toList([missing_field_error]));
+ let _pipe$2 = try$(_pipe$1, inner_type);
+ return map_errors(
+ _pipe$2,
+ (_capture) => {
+ return push_path(_capture, name);
+ }
+ );
+ }
+ );
+ };
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/string.mjs
+function replace2(string3, pattern, substitute) {
+ let _pipe = string3;
+ let _pipe$1 = from_string(_pipe);
+ let _pipe$2 = replace(_pipe$1, pattern, substitute);
+ return to_string3(_pipe$2);
+}
+function lowercase2(string3) {
+ return lowercase(string3);
+}
+function split3(x, substring) {
+ if (substring === "") {
+ return graphemes(x);
+ } else {
+ let _pipe = x;
+ let _pipe$1 = from_string(_pipe);
+ let _pipe$2 = split2(_pipe$1, substring);
+ return map(_pipe$2, to_string3);
+ }
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/uri.mjs
+var Uri = class extends CustomType {
+ constructor(scheme, userinfo, host, port, path, query, fragment) {
+ super();
+ this.scheme = scheme;
+ this.userinfo = userinfo;
+ this.host = host;
+ this.port = port;
+ this.path = path;
+ this.query = query;
+ this.fragment = fragment;
+ }
+};
+function do_remove_dot_segments(loop$input, loop$accumulator) {
+ while (true) {
+ let input4 = loop$input;
+ let accumulator = loop$accumulator;
+ if (input4.hasLength(0)) {
+ return reverse(accumulator);
+ } else {
+ let segment = input4.head;
+ let rest = input4.tail;
+ let accumulator$1 = (() => {
+ if (segment === "") {
+ let accumulator$12 = accumulator;
+ return accumulator$12;
+ } else if (segment === ".") {
+ let accumulator$12 = accumulator;
+ return accumulator$12;
+ } else if (segment === ".." && accumulator.hasLength(0)) {
+ return toList([]);
+ } else if (segment === ".." && accumulator.atLeastLength(1)) {
+ let accumulator$12 = accumulator.tail;
+ return accumulator$12;
+ } else {
+ let segment$1 = segment;
+ let accumulator$12 = accumulator;
+ return prepend(segment$1, accumulator$12);
+ }
+ })();
+ loop$input = rest;
+ loop$accumulator = accumulator$1;
+ }
+ }
+}
+function remove_dot_segments(input4) {
+ return do_remove_dot_segments(input4, toList([]));
+}
+function path_segments(path) {
+ return remove_dot_segments(split3(path, "/"));
+}
+
+// build/dev/javascript/gleam_stdlib/gleam/bool.mjs
+function guard(requirement, consequence, alternative) {
+ if (requirement) {
+ return consequence;
+ } else {
+ return alternative();
+ }
+}
+
+// build/dev/javascript/lustre/lustre/effect.mjs
+var Effect = class extends CustomType {
+ constructor(all) {
+ super();
+ this.all = all;
+ }
+};
+function from2(effect) {
+ return new Effect(toList([(dispatch, _) => {
+ return effect(dispatch);
+ }]));
+}
+function none() {
+ return new Effect(toList([]));
+}
+
+// build/dev/javascript/lustre/lustre/internals/vdom.mjs
+var Text = class extends CustomType {
+ constructor(content) {
+ super();
+ this.content = content;
+ }
+};
+var Element = class extends CustomType {
+ constructor(key, namespace, tag2, attrs, children, self_closing, void$) {
+ super();
+ this.key = key;
+ this.namespace = namespace;
+ this.tag = tag2;
+ this.attrs = attrs;
+ this.children = children;
+ this.self_closing = self_closing;
+ this.void = void$;
+ }
+};
+var Attribute = class extends CustomType {
+ constructor(x0, x1, as_property) {
+ super();
+ this[0] = x0;
+ this[1] = x1;
+ this.as_property = as_property;
+ }
+};
+var Event = class extends CustomType {
+ constructor(x0, x1) {
+ super();
+ this[0] = x0;
+ this[1] = x1;
+ }
+};
+
+// build/dev/javascript/lustre/lustre/attribute.mjs
+function attribute(name, value3) {
+ return new Attribute(name, from(value3), false);
+}
+function property(name, value3) {
+ return new Attribute(name, from(value3), true);
+}
+function on(name, handler) {
+ return new Event("on" + name, handler);
+}
+function style(properties) {
+ return attribute(
+ "style",
+ fold(
+ properties,
+ "",
+ (styles, _use1) => {
+ let name$1 = _use1[0];
+ let value$1 = _use1[1];
+ return styles + name$1 + ":" + value$1 + ";";
+ }
+ )
+ );
+}
+function class$(name) {
+ return attribute("class", name);
+}
+function value(val) {
+ return property("value", from(val));
+}
+function href(uri) {
+ return attribute("href", uri);
+}
+
+// build/dev/javascript/lustre/lustre/element.mjs
+function element(tag2, attrs, children) {
+ if (tag2 === "area") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "base") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "br") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "col") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "embed") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "hr") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "img") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "input") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "link") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "meta") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "param") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "source") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "track") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else if (tag2 === "wbr") {
+ return new Element("", "", tag2, attrs, toList([]), false, true);
+ } else {
+ return new Element("", "", tag2, attrs, children, false, false);
+ }
+}
+function text(content) {
+ return new Text(content);
+}
+
+// build/dev/javascript/lustre/lustre/internals/runtime.mjs
+var Dispatch = class extends CustomType {
+ constructor(x0) {
+ super();
+ this[0] = x0;
+ }
+};
+var Shutdown = class extends CustomType {
+};
+
+// build/dev/javascript/lustre/vdom.ffi.mjs
+function morph(prev, next, dispatch, isComponent = false) {
+ let out;
+ let stack3 = [{ prev, next, parent: prev.parentNode }];
+ while (stack3.length) {
+ let { prev: prev2, next: next2, parent } = stack3.pop();
+ if (next2.subtree !== void 0)
+ next2 = next2.subtree();
+ if (next2.content !== void 0) {
+ if (!prev2) {
+ const created = document.createTextNode(next2.content);
+ parent.appendChild(created);
+ out ??= created;
+ } else if (prev2.nodeType === Node.TEXT_NODE) {
+ if (prev2.textContent !== next2.content)
+ prev2.textContent = next2.content;
+ out ??= prev2;
+ } else {
+ const created = document.createTextNode(next2.content);
+ parent.replaceChild(created, prev2);
+ out ??= created;
+ }
+ } else if (next2.tag !== void 0) {
+ const created = createElementNode({
+ prev: prev2,
+ next: next2,
+ dispatch,
+ stack: stack3,
+ isComponent
+ });
+ if (!prev2) {
+ parent.appendChild(created);
+ } else if (prev2 !== created) {
+ parent.replaceChild(created, prev2);
+ }
+ out ??= created;
+ }
+ }
+ return out;
+}
+function createElementNode({ prev, next, dispatch, stack: stack3 }) {
+ const namespace = next.namespace || "http://www.w3.org/1999/xhtml";
+ const canMorph = prev && prev.nodeType === Node.ELEMENT_NODE && prev.localName === next.tag && prev.namespaceURI === (next.namespace || "http://www.w3.org/1999/xhtml");
+ const el2 = canMorph ? prev : namespace ? document.createElementNS(namespace, next.tag) : document.createElement(next.tag);
+ let handlersForEl;
+ if (!registeredHandlers.has(el2)) {
+ const emptyHandlers = /* @__PURE__ */ new Map();
+ registeredHandlers.set(el2, emptyHandlers);
+ handlersForEl = emptyHandlers;
+ } else {
+ handlersForEl = registeredHandlers.get(el2);
+ }
+ const prevHandlers = canMorph ? new Set(handlersForEl.keys()) : null;
+ const prevAttributes = canMorph ? new Set(Array.from(prev.attributes, (a2) => a2.name)) : null;
+ let className = null;
+ let style2 = null;
+ let innerHTML = null;
+ for (const attr of next.attrs) {
+ const name = attr[0];
+ const value3 = attr[1];
+ const isProperty = attr[2];
+ if (isProperty) {
+ el2[name] = value3;
+ } else if (name.startsWith("on")) {
+ const eventName = name.slice(2);
+ const callback = dispatch(value3);
+ if (!handlersForEl.has(eventName)) {
+ el2.addEventListener(eventName, lustreGenericEventHandler);
+ }
+ handlersForEl.set(eventName, callback);
+ if (canMorph)
+ prevHandlers.delete(eventName);
+ } else if (name.startsWith("data-lustre-on-")) {
+ const eventName = name.slice(15);
+ const callback = dispatch(lustreServerEventHandler);
+ if (!handlersForEl.has(eventName)) {
+ el2.addEventListener(eventName, lustreGenericEventHandler);
+ }
+ handlersForEl.set(eventName, callback);
+ el2.setAttribute(name, value3);
+ } else if (name === "class") {
+ className = className === null ? value3 : className + " " + value3;
+ } else if (name === "style") {
+ style2 = style2 === null ? value3 : style2 + value3;
+ } else if (name === "dangerous-unescaped-html") {
+ innerHTML = value3;
+ } else {
+ el2.setAttribute(name, value3);
+ if (name === "value")
+ el2[name] = value3;
+ if (canMorph)
+ prevAttributes.delete(name);
+ }
+ }
+ if (className !== null) {
+ el2.setAttribute("class", className);
+ if (canMorph)
+ prevAttributes.delete("class");
+ }
+ if (style2 !== null) {
+ el2.setAttribute("style", style2);
+ if (canMorph)
+ prevAttributes.delete("style");
+ }
+ if (canMorph) {
+ for (const attr of prevAttributes) {
+ el2.removeAttribute(attr);
+ }
+ for (const eventName of prevHandlers) {
+ handlersForEl.delete(eventName);
+ el2.removeEventListener(eventName, lustreGenericEventHandler);
+ }
+ }
+ if (next.key !== void 0 && next.key !== "") {
+ el2.setAttribute("data-lustre-key", next.key);
+ } else if (innerHTML !== null) {
+ el2.innerHTML = innerHTML;
+ return el2;
+ }
+ let prevChild = el2.firstChild;
+ let seenKeys = null;
+ let keyedChildren = null;
+ let incomingKeyedChildren = null;
+ let firstChild = next.children[Symbol.iterator]().next().value;
+ if (canMorph && firstChild !== void 0 && // Explicit checks are more verbose but truthy checks force a bunch of comparisons
+ // we don't care about: it's never gonna be a number etc.
+ firstChild.key !== void 0 && firstChild.key !== "") {
+ seenKeys = /* @__PURE__ */ new Set();
+ keyedChildren = getKeyedChildren(prev);
+ incomingKeyedChildren = getKeyedChildren(next);
+ }
+ for (const child of next.children) {
+ if (child.key !== void 0 && seenKeys !== null) {
+ while (prevChild && !incomingKeyedChildren.has(prevChild.getAttribute("data-lustre-key"))) {
+ const nextChild = prevChild.nextSibling;
+ el2.removeChild(prevChild);
+ prevChild = nextChild;
+ }
+ if (keyedChildren.size === 0) {
+ stack3.unshift({ prev: prevChild, next: child, parent: el2 });
+ prevChild = prevChild?.nextSibling;
+ continue;
+ }
+ if (seenKeys.has(child.key)) {
+ console.warn(`Duplicate key found in Lustre vnode: ${child.key}`);
+ stack3.unshift({ prev: null, next: child, parent: el2 });
+ continue;
+ }
+ seenKeys.add(child.key);
+ const keyedChild = keyedChildren.get(child.key);
+ if (!keyedChild && !prevChild) {
+ stack3.unshift({ prev: null, next: child, parent: el2 });
+ continue;
+ }
+ if (!keyedChild && prevChild !== null) {
+ const placeholder = document.createTextNode("");
+ el2.insertBefore(placeholder, prevChild);
+ stack3.unshift({ prev: placeholder, next: child, parent: el2 });
+ continue;
+ }
+ if (!keyedChild || keyedChild === prevChild) {
+ stack3.unshift({ prev: prevChild, next: child, parent: el2 });
+ prevChild = prevChild?.nextSibling;
+ continue;
+ }
+ el2.insertBefore(keyedChild, prevChild);
+ stack3.unshift({ prev: keyedChild, next: child, parent: el2 });
+ } else {
+ stack3.unshift({ prev: prevChild, next: child, parent: el2 });
+ prevChild = prevChild?.nextSibling;
+ }
+ }
+ while (prevChild) {
+ const next2 = prevChild.nextSibling;
+ el2.removeChild(prevChild);
+ prevChild = next2;
+ }
+ return el2;
+}
+var registeredHandlers = /* @__PURE__ */ new WeakMap();
+function lustreGenericEventHandler(event2) {
+ const target = event2.currentTarget;
+ if (!registeredHandlers.has(target)) {
+ target.removeEventListener(event2.type, lustreGenericEventHandler);
+ return;
+ }
+ const handlersForEventTarget = registeredHandlers.get(target);
+ if (!handlersForEventTarget.has(event2.type)) {
+ target.removeEventListener(event2.type, lustreGenericEventHandler);
+ return;
+ }
+ handlersForEventTarget.get(event2.type)(event2);
+}
+function lustreServerEventHandler(event2) {
+ const el2 = event2.target;
+ const tag2 = el2.getAttribute(`data-lustre-on-${event2.type}`);
+ const data = JSON.parse(el2.getAttribute("data-lustre-data") || "{}");
+ const include = JSON.parse(el2.getAttribute("data-lustre-include") || "[]");
+ switch (event2.type) {
+ case "input":
+ case "change":
+ include.push("target.value");
+ break;
+ }
+ return {
+ tag: tag2,
+ data: include.reduce(
+ (data2, property2) => {
+ const path = property2.split(".");
+ for (let i = 0, o = data2, e = event2; i < path.length; i++) {
+ if (i === path.length - 1) {
+ o[path[i]] = e[path[i]];
+ } else {
+ o[path[i]] ??= {};
+ e = e[path[i]];
+ o = o[path[i]];
+ }
+ }
+ return data2;
+ },
+ { data }
+ )
+ };
+}
+function getKeyedChildren(el2) {
+ const keyedChildren = /* @__PURE__ */ new Map();
+ if (el2) {
+ for (const child of el2.children) {
+ const key = child.key || child?.getAttribute("data-lustre-key");
+ if (key)
+ keyedChildren.set(key, child);
+ }
+ }
+ return keyedChildren;
+}
+
+// build/dev/javascript/lustre/client-runtime.ffi.mjs
+var LustreClientApplication2 = class _LustreClientApplication {
+ #root = null;
+ #queue = [];
+ #effects = [];
+ #didUpdate = false;
+ #isComponent = false;
+ #model = null;
+ #update = null;
+ #view = null;
+ static start(flags, selector, init4, update3, view2) {
+ if (!is_browser())
+ return new Error(new NotABrowser());
+ const root2 = selector instanceof HTMLElement ? selector : document.querySelector(selector);
+ if (!root2)
+ return new Error(new ElementNotFound(selector));
+ const app = new _LustreClientApplication(init4(flags), update3, view2, root2);
+ return new Ok((msg) => app.send(msg));
+ }
+ constructor([model, effects], update3, view2, root2 = document.body, isComponent = false) {
+ this.#model = model;
+ this.#update = update3;
+ this.#view = view2;
+ this.#root = root2;
+ this.#effects = effects.all.toArray();
+ this.#didUpdate = true;
+ this.#isComponent = isComponent;
+ window.requestAnimationFrame(() => this.#tick());
+ }
+ send(action) {
+ switch (true) {
+ case action instanceof Dispatch: {
+ this.#queue.push(action[0]);
+ this.#tick();
+ return;
+ }
+ case action instanceof Shutdown: {
+ this.#shutdown();
+ return;
+ }
+ default:
+ return;
+ }
+ }
+ emit(event2, data) {
+ this.#root.dispatchEvent(
+ new CustomEvent(event2, {
+ bubbles: true,
+ detail: data,
+ composed: true
+ })
+ );
+ }
+ #tick() {
+ this.#flush_queue();
+ const vdom = this.#view(this.#model);
+ const dispatch = (handler) => (e) => {
+ const result = handler(e);
+ if (result instanceof Ok) {
+ this.send(new Dispatch(result[0]));
+ }
+ };
+ this.#didUpdate = false;
+ this.#root = morph(this.#root, vdom, dispatch, this.#isComponent);
+ }
+ #flush_queue(iterations = 0) {
+ while (this.#queue.length) {
+ const [next, effects] = this.#update(this.#model, this.#queue.shift());
+ this.#didUpdate ||= !isEqual(this.#model, next);
+ this.#model = next;
+ this.#effects = this.#effects.concat(effects.all.toArray());
+ }
+ while (this.#effects.length) {
+ this.#effects.shift()(
+ (msg) => this.send(new Dispatch(msg)),
+ (event2, data) => this.emit(event2, data)
+ );
+ }
+ if (this.#queue.length) {
+ if (iterations < 5) {
+ this.#flush_queue(++iterations);
+ } else {
+ window.requestAnimationFrame(() => this.#tick());
+ }
+ }
+ }
+ #shutdown() {
+ this.#root.remove();
+ this.#root = null;
+ this.#model = null;
+ this.#queue = [];
+ this.#effects = [];
+ this.#didUpdate = false;
+ this.#update = () => {
+ };
+ this.#view = () => {
+ };
+ }
+};
+var start = (app, selector, flags) => LustreClientApplication2.start(
+ flags,
+ selector,
+ app.init,
+ app.update,
+ app.view
+);
+var is_browser = () => window && window.document;
+
+// build/dev/javascript/lustre/lustre.mjs
+var App = class extends CustomType {
+ constructor(init4, update3, view2, on_attribute_change) {
+ super();
+ this.init = init4;
+ this.update = update3;
+ this.view = view2;
+ this.on_attribute_change = on_attribute_change;
+ }
+};
+var ElementNotFound = class extends CustomType {
+ constructor(selector) {
+ super();
+ this.selector = selector;
+ }
+};
+var NotABrowser = class extends CustomType {
+};
+function application(init4, update3, view2) {
+ return new App(init4, update3, view2, new None());
+}
+function start3(app, selector, flags) {
+ return guard(
+ !is_browser(),
+ new Error(new NotABrowser()),
+ () => {
+ return start(app, selector, flags);
+ }
+ );
+}
+
+// build/dev/javascript/lustre/lustre/element/html.mjs
+function h1(attrs, children) {
+ return element("h1", attrs, children);
+}
+function nav(attrs, children) {
+ return element("nav", attrs, children);
+}
+function div(attrs, children) {
+ return element("div", attrs, children);
+}
+function p(attrs, children) {
+ return element("p", attrs, children);
+}
+function a(attrs, children) {
+ return element("a", attrs, children);
+}
+function input(attrs) {
+ return element("input", attrs, toList([]));
+}
+
+// build/dev/javascript/lustre/lustre/event.mjs
+function on2(name, handler) {
+ return on(name, handler);
+}
+function value2(event2) {
+ let _pipe = event2;
+ return field("target", field("value", string))(
+ _pipe
+ );
+}
+
+// build/dev/javascript/lustre_ui/lustre/ui/layout/stack.mjs
+function of(element2, attributes, children) {
+ return element2(
+ prepend(class$("lustre-ui-stack"), attributes),
+ children
+ );
+}
+function stack(attributes, children) {
+ return of(div, attributes, children);
+}
+
+// build/dev/javascript/lustre_ui/lustre/ui/input.mjs
+function input2(attributes) {
+ return input(
+ prepend(class$("lustre-ui-input"), attributes)
+ );
+}
+
+// build/dev/javascript/lustre_ui/lustre/ui/layout/centre.mjs
+function of2(element2, attributes, children) {
+ return element2(
+ prepend(class$("lustre-ui-centre"), attributes),
+ toList([children])
+ );
+}
+function centre(attributes, children) {
+ return of2(div, attributes, children);
+}
+
+// build/dev/javascript/lustre_ui/lustre/ui/layout/cluster.mjs
+function of3(element2, attributes, children) {
+ return element2(
+ prepend(class$("lustre-ui-cluster"), attributes),
+ children
+ );
+}
+
+// build/dev/javascript/gleam_community_colour/gleam_community/colour.mjs
+var Rgba = class extends CustomType {
+ constructor(r, g, b, a2) {
+ super();
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ this.a = a2;
+ }
+};
+var light_red = new Rgba(
+ 0.9372549019607843,
+ 0.1607843137254902,
+ 0.1607843137254902,
+ 1
+);
+var red = new Rgba(0.8, 0, 0, 1);
+var dark_red = new Rgba(0.6431372549019608, 0, 0, 1);
+var light_orange = new Rgba(
+ 0.9882352941176471,
+ 0.6862745098039216,
+ 0.24313725490196078,
+ 1
+);
+var orange = new Rgba(0.9607843137254902, 0.4745098039215686, 0, 1);
+var dark_orange = new Rgba(
+ 0.807843137254902,
+ 0.3607843137254902,
+ 0,
+ 1
+);
+var light_yellow = new Rgba(
+ 1,
+ 0.9137254901960784,
+ 0.30980392156862746,
+ 1
+);
+var yellow = new Rgba(0.9294117647058824, 0.8313725490196079, 0, 1);
+var dark_yellow = new Rgba(
+ 0.7686274509803922,
+ 0.6274509803921569,
+ 0,
+ 1
+);
+var light_green = new Rgba(
+ 0.5411764705882353,
+ 0.8862745098039215,
+ 0.20392156862745098,
+ 1
+);
+var green = new Rgba(
+ 0.45098039215686275,
+ 0.8235294117647058,
+ 0.08627450980392157,
+ 1
+);
+var dark_green = new Rgba(
+ 0.3058823529411765,
+ 0.6039215686274509,
+ 0.023529411764705882,
+ 1
+);
+var light_blue = new Rgba(
+ 0.4470588235294118,
+ 0.6235294117647059,
+ 0.8117647058823529,
+ 1
+);
+var blue = new Rgba(
+ 0.20392156862745098,
+ 0.396078431372549,
+ 0.6431372549019608,
+ 1
+);
+var dark_blue = new Rgba(
+ 0.12549019607843137,
+ 0.2901960784313726,
+ 0.5294117647058824,
+ 1
+);
+var light_purple = new Rgba(
+ 0.6784313725490196,
+ 0.4980392156862745,
+ 0.6588235294117647,
+ 1
+);
+var purple = new Rgba(
+ 0.4588235294117647,
+ 0.3137254901960784,
+ 0.4823529411764706,
+ 1
+);
+var dark_purple = new Rgba(
+ 0.3607843137254902,
+ 0.20784313725490197,
+ 0.4,
+ 1
+);
+var light_brown = new Rgba(
+ 0.9137254901960784,
+ 0.7254901960784313,
+ 0.43137254901960786,
+ 1
+);
+var brown = new Rgba(
+ 0.7568627450980392,
+ 0.49019607843137253,
+ 0.06666666666666667,
+ 1
+);
+var dark_brown = new Rgba(
+ 0.5607843137254902,
+ 0.34901960784313724,
+ 0.00784313725490196,
+ 1
+);
+var black = new Rgba(0, 0, 0, 1);
+var white = new Rgba(1, 1, 1, 1);
+var light_grey = new Rgba(
+ 0.9333333333333333,
+ 0.9333333333333333,
+ 0.9254901960784314,
+ 1
+);
+var grey = new Rgba(
+ 0.8274509803921568,
+ 0.8431372549019608,
+ 0.8117647058823529,
+ 1
+);
+var dark_grey = new Rgba(
+ 0.7294117647058823,
+ 0.7411764705882353,
+ 0.7137254901960784,
+ 1
+);
+var light_gray = new Rgba(
+ 0.9333333333333333,
+ 0.9333333333333333,
+ 0.9254901960784314,
+ 1
+);
+var gray = new Rgba(
+ 0.8274509803921568,
+ 0.8431372549019608,
+ 0.8117647058823529,
+ 1
+);
+var dark_gray = new Rgba(
+ 0.7294117647058823,
+ 0.7411764705882353,
+ 0.7137254901960784,
+ 1
+);
+var light_charcoal = new Rgba(
+ 0.5333333333333333,
+ 0.5411764705882353,
+ 0.5215686274509804,
+ 1
+);
+var charcoal = new Rgba(
+ 0.3333333333333333,
+ 0.3411764705882353,
+ 0.3254901960784314,
+ 1
+);
+var dark_charcoal = new Rgba(
+ 0.1803921568627451,
+ 0.20392156862745098,
+ 0.21176470588235294,
+ 1
+);
+var pink = new Rgba(1, 0.6862745098039216, 0.9529411764705882, 1);
+
+// build/dev/javascript/lustre_ui/lustre/ui.mjs
+var centre2 = centre;
+var input3 = input2;
+var stack2 = stack;
+
+// build/dev/javascript/lustre_ui/lustre/ui/util/cn.mjs
+function text_xl() {
+ return class$("text-xl");
+}
+function mt_xl() {
+ return class$("mt-xl");
+}
+
+// build/dev/javascript/modem/modem.ffi.mjs
+var defaults = {
+ handle_external_links: false,
+ handle_internal_links: true
+};
+var do_init = (dispatch, options = defaults) => {
+ document.body.addEventListener("click", (event2) => {
+ const a2 = find_anchor(event2.target);
+ if (!a2)
+ return;
+ try {
+ const url = new URL(a2.href);
+ const uri = uri_from_url(url);
+ const is_external = url.host !== window.location.host;
+ if (!options.handle_external_links && is_external)
+ return;
+ if (!options.handle_internal_links && !is_external)
+ return;
+ event2.preventDefault();
+ if (!is_external) {
+ window.history.pushState({}, "", a2.href);
+ window.requestAnimationFrame(() => {
+ if (url.hash) {
+ document.getElementById(url.hash.slice(1))?.scrollIntoView();
+ }
+ });
+ }
+ return dispatch(uri);
+ } catch {
+ return;
+ }
+ });
+ window.addEventListener("popstate", (e) => {
+ e.preventDefault();
+ const url = new URL(window.location.href);
+ const uri = uri_from_url(url);
+ window.requestAnimationFrame(() => {
+ if (url.hash) {
+ document.getElementById(url.hash.slice(1))?.scrollIntoView();
+ }
+ });
+ dispatch(uri);
+ });
+};
+var find_anchor = (el2) => {
+ if (el2.tagName === "BODY") {
+ return null;
+ } else if (el2.tagName === "A") {
+ return el2;
+ } else {
+ return find_anchor(el2.parentElement);
+ }
+};
+var uri_from_url = (url) => {
+ return new Uri(
+ /* scheme */
+ new (url.protocol ? Some : None)(url.protocol),
+ /* userinfo */
+ new None(),
+ /* host */
+ new (url.host ? Some : None)(url.host),
+ /* port */
+ new (url.port ? Some : None)(url.port),
+ /* path */
+ url.pathname,
+ /* query */
+ new (url.search ? Some : None)(url.search),
+ /* fragment */
+ new (url.hash ? Some : None)(url.hash.slice(1))
+ );
+};
+
+// build/dev/javascript/modem/modem.mjs
+function init2(handler) {
+ return from2(
+ (dispatch) => {
+ return do_init(
+ (uri) => {
+ let _pipe = uri;
+ let _pipe$1 = handler(_pipe);
+ return dispatch(_pipe$1);
+ }
+ );
+ }
+ );
+}
+
+// build/dev/javascript/app/app.mjs
+var Model = class extends CustomType {
+ constructor(current_route, guests, new_guest_name) {
+ super();
+ this.current_route = current_route;
+ this.guests = guests;
+ this.new_guest_name = new_guest_name;
+ }
+};
+var Home = class extends CustomType {
+};
+var WelcomeGuest = class extends CustomType {
+ constructor(value3) {
+ super();
+ this.value = value3;
+ }
+};
+var Guest = class extends CustomType {
+ constructor(slug, name) {
+ super();
+ this.slug = slug;
+ this.name = name;
+ }
+};
+var OnRouteChange = class extends CustomType {
+ constructor(x0) {
+ super();
+ this[0] = x0;
+ }
+};
+var UserUpdatedNewGuestName = class extends CustomType {
+ constructor(x0) {
+ super();
+ this[0] = x0;
+ }
+};
+var UserAddedNewGuest = class extends CustomType {
+ constructor(x0) {
+ super();
+ this[0] = x0;
+ }
+};
+function on_route_change(uri) {
+ let $ = path_segments(uri.path);
+ if ($.hasLength(2) && $.head === "welcome") {
+ let guest = $.tail.head;
+ return new OnRouteChange(new WelcomeGuest(guest));
+ } else {
+ return new OnRouteChange(new Home());
+ }
+}
+function init3(_) {
+ return [
+ new Model(
+ new Home(),
+ toList([new Guest("chihiro", "Chihiro"), new Guest("totoro", "Totoro")]),
+ ""
+ ),
+ init2(on_route_change)
+ ];
+}
+function update2(model, msg) {
+ if (msg instanceof OnRouteChange) {
+ let route = msg[0];
+ return [model.withFields({ current_route: route }), none()];
+ } else if (msg instanceof UserUpdatedNewGuestName) {
+ let name = msg[0];
+ return [model.withFields({ new_guest_name: name }), none()];
+ } else {
+ let guest = msg[0];
+ return [
+ model.withFields({
+ guests: append(model.guests, toList([guest])),
+ new_guest_name: ""
+ }),
+ none()
+ ];
+ }
+}
+function view_nav(model) {
+ let item_styles = toList([["text-decoration", "underline"]]);
+ let view_nav_item = (path, text2) => {
+ return a(
+ toList([href("/" + path), style(item_styles)]),
+ toList([text(text2)])
+ );
+ };
+ let guest_nav_items = (() => {
+ let _pipe = model.guests;
+ return map(
+ _pipe,
+ (guest) => {
+ return view_nav_item("welcome/" + guest.slug, guest.name);
+ }
+ );
+ })();
+ return of3(
+ nav,
+ toList([]),
+ prepend(view_nav_item("", "Home"), guest_nav_items)
+ );
+}
+function view_body(children) {
+ return centre2(toList([mt_xl()]), stack2(toList([]), children));
+}
+function view_title(text2) {
+ return h1(toList([text_xl()]), toList([text(text2)]));
+}
+function view_home(model) {
+ let new_guest_input = (event2) => {
+ return try$(
+ field("key", string)(event2),
+ (key_code) => {
+ if (key_code === "Enter") {
+ let guest_slug = (() => {
+ let _pipe = model.new_guest_name;
+ let _pipe$1 = replace2(_pipe, " ", "-");
+ return lowercase2(_pipe$1);
+ })();
+ return new Ok(
+ new UserAddedNewGuest(new Guest(guest_slug, model.new_guest_name))
+ );
+ } else {
+ return try$(
+ value2(event2),
+ (value3) => {
+ return new Ok(new UserUpdatedNewGuestName(value3));
+ }
+ );
+ }
+ }
+ );
+ };
+ return view_body(
+ toList([
+ view_title("Welcome to the Party \u{1F3E1}"),
+ p(
+ toList([]),
+ toList([text("Please sign the guest book:")])
+ ),
+ input3(
+ toList([
+ on2("keyup", new_guest_input),
+ value(model.new_guest_name)
+ ])
+ )
+ ])
+ );
+}
+function view_welcome(model, slug) {
+ let guest = (() => {
+ let _pipe = model.guests;
+ return find2(_pipe, (guest2) => {
+ return guest2.slug === slug;
+ });
+ })();
+ let title = (() => {
+ if (guest.isOk()) {
+ let guest$1 = guest[0];
+ return view_title("Hello, " + guest$1.name + "! \u{1F389}");
+ } else {
+ return view_title("Sorry ... didn't quite catch that.");
+ }
+ })();
+ return view_body(toList([title]));
+}
+function view(model) {
+ let styles = toList([["margin", "15vh"]]);
+ let page = (() => {
+ let $ = model.current_route;
+ if ($ instanceof Home) {
+ return view_home(model);
+ } else {
+ let name = $.value;
+ return view_welcome(model, name);
+ }
+ })();
+ return stack2(
+ toList([style(styles)]),
+ toList([view_nav(model), page])
+ );
+}
+function main() {
+ let app = application(init3, update2, view);
+ let $ = start3(app, "#app", void 0);
+ if (!$.isOk()) {
+ throw makeError(
+ "assignment_no_match",
+ "app",
+ 21,
+ "main",
+ "Assignment pattern did not match",
+ { value: $ }
+ );
+ }
+ return $;
+}
+
+// build/.lustre/entry.mjs
+main();