// build/dev/javascript/prelude.mjs class CustomType { withFields(fields) { let properties = Object.keys(this).map((label) => (label in fields) ? fields[label] : this[label]); return new this.constructor(...properties); } } class List { static fromArray(array, tail) { let t = tail || new Empty; for (let i = array.length - 1;i >= 0; --i) { t = new NonEmpty(array[i], t); } return t; } [Symbol.iterator]() { return new ListIterator(this); } toArray() { return [...this]; } atLeastLength(desired) { let current = this; while (desired-- > 0 && current) current = current.tail; return current !== undefined; } hasLength(desired) { let current = this; while (desired-- > 0 && current) current = current.tail; return desired === -1 && current instanceof Empty; } countLength() { let current = this; let length = 0; while (current) { current = current.tail; length++; } return length - 1; } } function prepend(element, tail) { return new NonEmpty(element, tail); } function toList(elements, tail) { return List.fromArray(elements, tail); } class ListIterator { #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 }; } } } class Empty extends List { } var List$Empty = () => new Empty; var List$isEmpty = (value) => value instanceof Empty; class NonEmpty extends List { constructor(head, tail) { super(); this.head = head; this.tail = tail; } } var List$NonEmpty = (head, tail) => new NonEmpty(head, tail); var List$isNonEmpty = (value) => value instanceof NonEmpty; var List$NonEmpty$first = (value) => value.head; var List$NonEmpty$rest = (value) => value.tail; class BitArray { bitSize; byteSize; bitOffset; rawBuffer; constructor(buffer, bitSize, bitOffset) { if (!(buffer instanceof Uint8Array)) { throw globalThis.Error("BitArray can only be constructed from a Uint8Array"); } this.bitSize = bitSize ?? buffer.length * 8; this.byteSize = Math.trunc((this.bitSize + 7) / 8); this.bitOffset = bitOffset ?? 0; if (this.bitSize < 0) { throw globalThis.Error(`BitArray bit size is invalid: ${this.bitSize}`); } if (this.bitOffset < 0 || this.bitOffset > 7) { throw globalThis.Error(`BitArray bit offset is invalid: ${this.bitOffset}`); } if (buffer.length !== Math.trunc((this.bitOffset + this.bitSize + 7) / 8)) { throw globalThis.Error("BitArray buffer length is invalid"); } this.rawBuffer = buffer; } byteAt(index) { if (index < 0 || index >= this.byteSize) { return; } return bitArrayByteAt(this.rawBuffer, this.bitOffset, index); } equals(other) { if (this.bitSize !== other.bitSize) { return false; } const wholeByteCount = Math.trunc(this.bitSize / 8); if (this.bitOffset === 0 && other.bitOffset === 0) { for (let i = 0;i < wholeByteCount; i++) { if (this.rawBuffer[i] !== other.rawBuffer[i]) { return false; } } const trailingBitsCount = this.bitSize % 8; if (trailingBitsCount) { const unusedLowBitCount = 8 - trailingBitsCount; if (this.rawBuffer[wholeByteCount] >> unusedLowBitCount !== other.rawBuffer[wholeByteCount] >> unusedLowBitCount) { return false; } } } else { for (let i = 0;i < wholeByteCount; i++) { const a = bitArrayByteAt(this.rawBuffer, this.bitOffset, i); const b = bitArrayByteAt(other.rawBuffer, other.bitOffset, i); if (a !== b) { return false; } } const trailingBitsCount = this.bitSize % 8; if (trailingBitsCount) { const a = bitArrayByteAt(this.rawBuffer, this.bitOffset, wholeByteCount); const b = bitArrayByteAt(other.rawBuffer, other.bitOffset, wholeByteCount); const unusedLowBitCount = 8 - trailingBitsCount; if (a >> unusedLowBitCount !== b >> unusedLowBitCount) { return false; } } } return true; } get buffer() { if (this.bitOffset !== 0 || this.bitSize % 8 !== 0) { throw new globalThis.Error("BitArray.buffer does not support unaligned bit arrays"); } return this.rawBuffer; } get length() { if (this.bitOffset !== 0 || this.bitSize % 8 !== 0) { throw new globalThis.Error("BitArray.length does not support unaligned bit arrays"); } return this.rawBuffer.length; } } function bitArrayByteAt(buffer, bitOffset, index) { if (bitOffset === 0) { return buffer[index] ?? 0; } else { const a = buffer[index] << bitOffset & 255; const b = buffer[index + 1] >> 8 - bitOffset; return a | b; } } class UtfCodepoint { constructor(value) { this.value = value; } } class Result extends CustomType { static isResult(data2) { return data2 instanceof Result; } } class Ok extends Result { constructor(value) { super(); this[0] = value; } isOk() { return true; } } var Result$Ok = (value) => new Ok(value); var Result$isOk = (value) => value instanceof Ok; var Result$Ok$0 = (value) => value[0]; class Error extends Result { constructor(detail) { super(); this[0] = detail; } isOk() { return false; } } var Result$Error = (detail) => new Error(detail); var Result$isError = (value) => value instanceof Error; function isEqual(x, y) { let values = [x, y]; while (values.length) { let a = values.pop(); let b = values.pop(); if (a === b) continue; if (!isObject(a) || !isObject(b)) return false; let unequal = !structurallyCompatibleObjects(a, b) || unequalDates(a, b) || unequalBuffers(a, b) || unequalArrays(a, b) || unequalMaps(a, b) || unequalSets(a, b) || unequalRegExps(a, b); if (unequal) return false; const proto = Object.getPrototypeOf(a); if (proto !== null && typeof proto.equals === "function") { try { if (a.equals(b)) continue; else return false; } catch {} } let [keys, get] = getters(a); const ka = keys(a); const kb = keys(b); if (ka.length !== kb.length) return false; for (let k of ka) { values.push(get(a, k), get(b, k)); } } return true; } function getters(object) { if (object instanceof Map) { return [(x) => x.keys(), (x, y) => x.get(y)]; } else { let extra = object instanceof globalThis.Error ? ["message"] : []; return [(x) => [...extra, ...Object.keys(x)], (x, y) => x[y]]; } } function unequalDates(a, b) { return a instanceof Date && (a > b || a < b); } function unequalBuffers(a, b) { return !(a instanceof BitArray) && a.buffer instanceof ArrayBuffer && a.BYTES_PER_ELEMENT && !(a.byteLength === b.byteLength && a.every((n, i) => n === b[i])); } function unequalArrays(a, b) { return Array.isArray(a) && a.length !== b.length; } function unequalMaps(a, b) { return a instanceof Map && a.size !== b.size; } function unequalSets(a, b) { return a instanceof Set && (a.size != b.size || [...a].some((e) => !b.has(e))); } function unequalRegExps(a, b) { return a instanceof RegExp && (a.source !== b.source || a.flags !== b.flags); } function isObject(a) { return typeof a === "object" && a !== null; } function structurallyCompatibleObjects(a, b) { if (typeof a !== "object" && typeof b !== "object" && (!a || !b)) return false; let nonstructural = [Promise, WeakSet, WeakMap, Function]; if (nonstructural.some((c) => a instanceof c)) return false; return a.constructor === b.constructor; } function makeError(variant, file, module, line, fn, message, extra) { let error = new globalThis.Error(message); error.gleam_error = variant; error.file = file; error.module = module; error.line = line; error.function = fn; error.fn = fn; for (let k in extra) error[k] = extra[k]; return error; } // build/dev/javascript/gleam_stdlib/dict.mjs var referenceMap = /* @__PURE__ */ new WeakMap; var tempDataView = /* @__PURE__ */ new DataView(/* @__PURE__ */ new ArrayBuffer(8)); var referenceUID = 0; function hashByReference(o) { const known = referenceMap.get(o); if (known !== undefined) { return known; } const hash = referenceUID++; if (referenceUID === 2147483647) { referenceUID = 0; } referenceMap.set(o, hash); return hash; } function hashMerge(a, b) { return a ^ b + 2654435769 + (a << 6) + (a >> 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 keys = Object.keys(o); for (let i = 0;i < keys.length; i++) { const k = keys[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 === undefined) 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; } } class Dict { constructor(size, root) { this.size = size; this.root = root; } } var bits = 5; var mask = (1 << bits) - 1; var noElementMarker = Symbol(); var generationKey = Symbol(); var emptyNode = /* @__PURE__ */ newNode(0); var emptyDict = /* @__PURE__ */ new Dict(0, emptyNode); var errorNil = /* @__PURE__ */ Result$Error(undefined); function makeNode(generation, datamap, nodemap, data2) { return { datamap, nodemap, data: data2, [generationKey]: generation }; } function newNode(generation) { return makeNode(generation, 0, 0, []); } function copyNode(node, generation) { if (node[generationKey] === generation) { return node; } const newData = node.data.slice(0); return makeNode(generation, node.datamap, node.nodemap, newData); } function copyAndSet(node, generation, idx, val) { if (node.data[idx] === val) { return node; } node = copyNode(node, generation); node.data[idx] = val; return node; } function copyAndInsertPair(node, generation, bit, idx, key, val) { const data2 = node.data; const length = data2.length; const newData = new Array(length + 2); let readIndex = 0; let writeIndex = 0; while (readIndex < idx) newData[writeIndex++] = data2[readIndex++]; newData[writeIndex++] = key; newData[writeIndex++] = val; while (readIndex < length) newData[writeIndex++] = data2[readIndex++]; return makeNode(generation, node.datamap | bit, node.nodemap, newData); } function make() { return emptyDict; } function get(dict, key) { const result = lookup(dict.root, key, getHash(key)); return result !== noElementMarker ? Result$Ok(result) : errorNil; } function lookup(node, key, hash) { for (let shift = 0;shift < 32; shift += bits) { const data2 = node.data; const bit = hashbit(hash, shift); if (node.nodemap & bit) { node = data2[data2.length - 1 - index(node.nodemap, bit)]; } else if (node.datamap & bit) { const dataidx = Math.imul(index(node.datamap, bit), 2); return isEqual(key, data2[dataidx]) ? data2[dataidx + 1] : noElementMarker; } else { return noElementMarker; } } const overflow = node.data; for (let i = 0;i < overflow.length; i += 2) { if (isEqual(key, overflow[i])) { return overflow[i + 1]; } } return noElementMarker; } function toTransient(dict) { return { generation: nextGeneration(dict), root: dict.root, size: dict.size, dict }; } function nextGeneration(dict) { const root = dict.root; if (root[generationKey] < Number.MAX_SAFE_INTEGER) { return root[generationKey] + 1; } const queue = [root]; while (queue.length) { const node = queue.pop(); node[generationKey] = 0; const nodeStart = data.length - popcount(node.nodemap); for (let i = nodeStart;i < node.data.length; ++i) { queue.push(node.data[i]); } } return 1; } var globalTransient = /* @__PURE__ */ toTransient(emptyDict); function insert(dict, key, value) { globalTransient.generation = nextGeneration(dict); globalTransient.size = dict.size; const hash = getHash(key); const root = insertIntoNode(globalTransient, dict.root, key, value, hash, 0); if (root === dict.root) { return dict; } return new Dict(globalTransient.size, root); } function insertIntoNode(transient, node, key, value, hash, shift) { const data2 = node.data; const generation = transient.generation; if (shift > 32) { for (let i = 0;i < data2.length; i += 2) { if (isEqual(key, data2[i])) { return copyAndSet(node, generation, i + 1, value); } } transient.size += 1; return copyAndInsertPair(node, generation, 0, data2.length, key, value); } const bit = hashbit(hash, shift); if (node.nodemap & bit) { const nodeidx2 = data2.length - 1 - index(node.nodemap, bit); let child2 = data2[nodeidx2]; child2 = insertIntoNode(transient, child2, key, value, hash, shift + bits); return copyAndSet(node, generation, nodeidx2, child2); } const dataidx = Math.imul(index(node.datamap, bit), 2); if ((node.datamap & bit) === 0) { transient.size += 1; return copyAndInsertPair(node, generation, bit, dataidx, key, value); } if (isEqual(key, data2[dataidx])) { return copyAndSet(node, generation, dataidx + 1, value); } const childShift = shift + bits; let child = emptyNode; child = insertIntoNode(transient, child, key, value, hash, childShift); const key2 = data2[dataidx]; const value2 = data2[dataidx + 1]; const hash2 = getHash(key2); child = insertIntoNode(transient, child, key2, value2, hash2, childShift); transient.size -= 1; const length = data2.length; const nodeidx = length - 1 - index(node.nodemap, bit); const newData = new Array(length - 1); let readIndex = 0; let writeIndex = 0; while (readIndex < dataidx) newData[writeIndex++] = data2[readIndex++]; readIndex += 2; while (readIndex <= nodeidx) newData[writeIndex++] = data2[readIndex++]; newData[writeIndex++] = child; while (readIndex < length) newData[writeIndex++] = data2[readIndex++]; return makeNode(generation, node.datamap ^ bit, node.nodemap | bit, newData); } function fold(dict, state, fun) { const queue = [dict.root]; while (queue.length) { const node = queue.pop(); const data2 = node.data; const edgesStart = data2.length - popcount(node.nodemap); for (let i = 0;i < edgesStart; i += 2) { state = fun(state, data2[i], data2[i + 1]); } for (let i = edgesStart;i < data2.length; ++i) { queue.push(data2[i]); } } return state; } function popcount(n) { n -= n >>> 1 & 1431655765; n = (n & 858993459) + (n >>> 2 & 858993459); return Math.imul(n + (n >>> 4) & 252645135, 16843009) >>> 24; } function index(bitmap, bit) { return popcount(bitmap & bit - 1); } function hashbit(hash, shift) { return 1 << (hash >>> shift & mask); } // build/dev/javascript/gleam_stdlib/gleam/option.mjs class Some extends CustomType { constructor($0) { super(); this[0] = $0; } } var Option$isSome = (value) => value instanceof Some; var Option$Some$0 = (value) => value[0]; class None extends CustomType { } function to_result(option, e) { if (option instanceof Some) { let a = option[0]; return new Ok(a); } else { return new Error(e); } } function unwrap(option, default$) { if (option instanceof Some) { let x = option[0]; return x; } else { return default$; } } // build/dev/javascript/gleam_stdlib/gleam/dict.mjs function keys(dict) { return fold(dict, toList([]), (acc, key, _) => { return prepend(key, acc); }); } // build/dev/javascript/gleam_stdlib/gleam/order.mjs class Lt extends CustomType { } var Order$Lt = () => new Lt; class Eq extends CustomType { } var Order$Eq = () => new Eq; class Gt extends CustomType { } var Order$Gt = () => new Gt; // build/dev/javascript/gleam_stdlib/gleam/string.mjs function concat_loop(loop$strings, loop$accumulator) { while (true) { let strings = loop$strings; let accumulator = loop$accumulator; if (strings instanceof Empty) { return accumulator; } else { let string = strings.head; let strings$1 = strings.tail; loop$strings = strings$1; loop$accumulator = accumulator + string; } } } function concat2(strings) { return concat_loop(strings, ""); } function split2(x, substring) { if (substring === "") { return graphemes(x); } else { let _pipe = x; let _pipe$1 = identity(_pipe); let _pipe$2 = split(_pipe$1, substring); return map2(_pipe$2, identity); } } // build/dev/javascript/gleam_stdlib/gleam/dynamic/decode.mjs class DecodeError extends CustomType { constructor(expected, found, path) { super(); this.expected = expected; this.found = found; this.path = path; } } class Decoder extends CustomType { constructor(function$) { super(); this.function = function$; } } var int2 = /* @__PURE__ */ new Decoder(decode_int); var float2 = /* @__PURE__ */ new Decoder(decode_float); var string2 = /* @__PURE__ */ new Decoder(decode_string); function run(data2, decoder) { let $ = decoder.function(data2); let maybe_invalid_data; let errors; maybe_invalid_data = $[0]; errors = $[1]; if (errors instanceof Empty) { return new Ok(maybe_invalid_data); } else { return new Error(errors); } } function success(data2) { return new Decoder((_) => { return [data2, toList([])]; }); } function map3(decoder, transformer) { return new Decoder((d) => { let $ = decoder.function(d); let data2; let errors; data2 = $[0]; errors = $[1]; return [transformer(data2), errors]; }); } function run_decoders(loop$data, loop$failure, loop$decoders) { while (true) { let data2 = loop$data; let failure = loop$failure; let decoders = loop$decoders; if (decoders instanceof Empty) { return failure; } else { let decoder = decoders.head; let decoders$1 = decoders.tail; let $ = decoder.function(data2); let layer; let errors; layer = $; errors = $[1]; if (errors instanceof Empty) { return layer; } else { loop$data = data2; loop$failure = failure; loop$decoders = decoders$1; } } } } function one_of(first, alternatives) { return new Decoder((dynamic_data) => { let $ = first.function(dynamic_data); let layer; let errors; layer = $; errors = $[1]; if (errors instanceof Empty) { return layer; } else { return run_decoders(dynamic_data, layer, alternatives); } }); } function run_dynamic_function(data2, name, f) { let $ = f(data2); if ($ instanceof Ok) { let data$1 = $[0]; return [data$1, toList([])]; } else { let placeholder = $[0]; return [ placeholder, toList([new DecodeError(name, classify_dynamic(data2), toList([]))]) ]; } } function decode_int(data2) { return run_dynamic_function(data2, "Int", int); } function decode_float(data2) { return run_dynamic_function(data2, "Float", float); } function decode_string(data2) { return run_dynamic_function(data2, "String", string); } function path_segment_to_string(key) { let decoder = one_of(string2, toList([ (() => { let _pipe = int2; return map3(_pipe, to_string); })(), (() => { let _pipe = float2; return map3(_pipe, float_to_string); })() ])); let $ = run(key, decoder); if ($ instanceof Ok) { let key$1 = $[0]; return key$1; } else { return "<" + classify_dynamic(key) + ">"; } } function push_path(layer, path) { let path$1 = map2(path, (key) => { let _pipe = key; let _pipe$1 = identity(_pipe); return path_segment_to_string(_pipe$1); }); let errors = map2(layer[1], (error) => { return new DecodeError(error.expected, error.found, append2(path$1, error.path)); }); return [layer[0], errors]; } function index3(loop$path, loop$position, loop$inner, loop$data, loop$handle_miss) { while (true) { let path = loop$path; let position = loop$position; let inner = loop$inner; let data2 = loop$data; let handle_miss = loop$handle_miss; if (path instanceof Empty) { let _pipe = data2; let _pipe$1 = inner(_pipe); return push_path(_pipe$1, reverse(position)); } else { let key = path.head; let path$1 = path.tail; let $ = index2(data2, key); if ($ instanceof Ok) { let $1 = $[0]; if ($1 instanceof Some) { let data$1 = $1[0]; loop$path = path$1; loop$position = prepend(key, position); loop$inner = inner; loop$data = data$1; loop$handle_miss = handle_miss; } else { return handle_miss(data2, prepend(key, position)); } } else { let kind = $[0]; let $1 = inner(data2); let default$; default$ = $1[0]; let _pipe = [ default$, toList([new DecodeError(kind, classify_dynamic(data2), toList([]))]) ]; return push_path(_pipe, reverse(position)); } } } } function subfield(field_path, field_decoder, next) { return new Decoder((data2) => { let $ = index3(field_path, toList([]), field_decoder.function, data2, (data3, position) => { let $12 = field_decoder.function(data3); let default$; default$ = $12[0]; let _pipe = [ default$, toList([new DecodeError("Field", "Nothing", toList([]))]) ]; return push_path(_pipe, reverse(position)); }); let out; let errors1; out = $[0]; errors1 = $[1]; let $1 = next(out).function(data2); let out$1; let errors2; out$1 = $1[0]; errors2 = $1[1]; return [out$1, append2(errors1, errors2)]; }); } // build/dev/javascript/gleam_stdlib/gleam_stdlib.mjs var Nil = undefined; function identity(x) { return x; } function parse_int(value) { if (/^[-+]?(\d+)$/.test(value)) { return Result$Ok(parseInt(value)); } else { return Result$Error(Nil); } } function to_string(term) { return term.toString(); } function graphemes(string3) { const iterator = graphemes_iterator(string3); if (iterator) { return arrayToList(Array.from(iterator).map((item) => item.segment)); } else { return arrayToList(string3.match(/./gsu)); } } var segmenter = undefined; function graphemes_iterator(string3) { if (globalThis.Intl && Intl.Segmenter) { segmenter ||= new Intl.Segmenter; return segmenter.segment(string3)[Symbol.iterator](); } } function pop_codeunit(str) { return [str.charCodeAt(0) | 0, str.slice(1)]; } function lowercase(string3) { return string3.toLowerCase(); } function split(xs, pattern) { return arrayToList(xs.split(pattern)); } function string_codeunit_slice(str, from2, length2) { return str.slice(from2, from2 + length2); } function starts_with(haystack, needle) { return haystack.startsWith(needle); } var unicode_whitespaces = [ " ", "\t", ` `, "\v", "\f", "\r", "…", "\u2028", "\u2029" ].join(""); var trim_start_regex = /* @__PURE__ */ new RegExp(`^[${unicode_whitespaces}]*`); var trim_end_regex = /* @__PURE__ */ new RegExp(`[${unicode_whitespaces}]*$`); function classify_dynamic(data2) { if (typeof data2 === "string") { return "String"; } else if (typeof data2 === "boolean") { return "Bool"; } else if (isResult(data2)) { return "Result"; } else if (isList(data2)) { return "List"; } else if (data2 instanceof BitArray) { return "BitArray"; } else if (data2 instanceof Dict) { return "Dict"; } else if (Number.isInteger(data2)) { return "Int"; } else if (Array.isArray(data2)) { return `Array`; } else if (typeof data2 === "number") { return "Float"; } else if (data2 === null) { return "Nil"; } else if (data2 === undefined) { return "Nil"; } else { const type = typeof data2; return type.charAt(0).toUpperCase() + type.slice(1); } } var MIN_I32 = -(2 ** 31); var MAX_I32 = 2 ** 31 - 1; var U32 = 2 ** 32; var MAX_SAFE = Number.MAX_SAFE_INTEGER; var MIN_SAFE = Number.MIN_SAFE_INTEGER; function float_to_string(float3) { const string3 = float3.toString().replace("+", ""); if (string3.indexOf(".") >= 0) { return string3; } else { const index4 = string3.indexOf("e"); if (index4 >= 0) { return string3.slice(0, index4) + ".0" + string3.slice(index4); } else { return string3 + ".0"; } } } class Inspector { #references = new Set; inspect(v) { const t = typeof v; if (v === true) return "True"; if (v === false) return "False"; if (v === null) return "//js(null)"; if (v === undefined) return "Nil"; if (t === "string") return this.#string(v); if (t === "bigint" || Number.isInteger(v)) return v.toString(); if (t === "number") return float_to_string(v); if (v instanceof UtfCodepoint) return this.#utfCodepoint(v); if (v instanceof BitArray) return this.#bit_array(v); if (v instanceof RegExp) return `//js(${v})`; if (v instanceof Date) return `//js(Date("${v.toISOString()}"))`; if (v instanceof globalThis.Error) return `//js(${v.toString()})`; if (v instanceof Function) { const args = []; for (const i of Array(v.length).keys()) args.push(String.fromCharCode(i + 97)); return `//fn(${args.join(", ")}) { ... }`; } if (this.#references.size === this.#references.add(v).size) { return "//js(circular reference)"; } let printed; if (Array.isArray(v)) { printed = `#(${v.map((v2) => this.inspect(v2)).join(", ")})`; } else if (isList(v)) { printed = this.#list(v); } else if (v instanceof CustomType) { printed = this.#customType(v); } else if (v instanceof Dict) { printed = this.#dict(v); } else if (v instanceof Set) { return `//js(Set(${[...v].map((v2) => this.inspect(v2)).join(", ")}))`; } else { printed = this.#object(v); } this.#references.delete(v); return printed; } #object(v) { const name = Object.getPrototypeOf(v)?.constructor?.name || "Object"; const props = []; for (const k of Object.keys(v)) { props.push(`${this.inspect(k)}: ${this.inspect(v[k])}`); } const body = props.length ? " " + props.join(", ") + " " : ""; const head = name === "Object" ? "" : name + " "; return `//js(${head}{${body}})`; } #dict(map4) { let body = "dict.from_list(["; let first = true; body = fold(map4, body, (body2, key, value) => { if (!first) body2 = body2 + ", "; first = false; return body2 + "#(" + this.inspect(key) + ", " + this.inspect(value) + ")"; }); return body + "])"; } #customType(record) { const props = Object.keys(record).map((label) => { const value = this.inspect(record[label]); return isNaN(parseInt(label)) ? `${label}: ${value}` : value; }).join(", "); return props ? `${record.constructor.name}(${props})` : record.constructor.name; } #list(list2) { if (List$isEmpty(list2)) { return "[]"; } let char_out = 'charlist.from_string("'; let list_out = "["; let current = list2; while (List$isNonEmpty(current)) { let element = current.head; current = current.tail; if (list_out !== "[") { list_out += ", "; } list_out += this.inspect(element); if (char_out) { if (Number.isInteger(element) && element >= 32 && element <= 126) { char_out += String.fromCharCode(element); } else { char_out = null; } } } if (char_out) { return char_out + '")'; } else { return list_out + "]"; } } #string(str) { let new_str = '"'; for (let i = 0;i < str.length; i++) { const char = str[i]; switch (char) { case ` `: new_str += "\\n"; break; case "\r": new_str += "\\r"; break; case "\t": new_str += "\\t"; break; case "\f": new_str += "\\f"; break; case "\\": new_str += "\\\\"; break; case '"': new_str += "\\\""; break; default: if (char < " " || char > "~" && char < " ") { new_str += "\\u{" + char.charCodeAt(0).toString(16).toUpperCase().padStart(4, "0") + "}"; } else { new_str += char; } } } new_str += '"'; return new_str; } #utfCodepoint(codepoint2) { return `//utfcodepoint(${String.fromCodePoint(codepoint2.value)})`; } #bit_array(bits2) { if (bits2.bitSize === 0) { return "<<>>"; } let acc = "<<"; for (let i = 0;i < bits2.byteSize - 1; i++) { acc += bits2.byteAt(i).toString(); acc += ", "; } if (bits2.byteSize * 8 === bits2.bitSize) { acc += bits2.byteAt(bits2.byteSize - 1).toString(); } else { const trailingBitsCount = bits2.bitSize % 8; acc += bits2.byteAt(bits2.byteSize - 1) >> 8 - trailingBitsCount; acc += `:size(${trailingBitsCount})`; } acc += ">>"; return acc; } } function index2(data2, key) { if (data2 instanceof Dict) { const result = get(data2, key); return Result$Ok(result.isOk() ? new Some(result[0]) : new None); } if (data2 instanceof WeakMap || data2 instanceof Map) { const token = {}; const entry = data2.get(key, token); if (entry === token) return Result$Ok(new None); return Result$Ok(new Some(entry)); } const key_is_int = Number.isInteger(key); if (key_is_int && key >= 0 && key < 8 && isList(data2)) { let i = 0; for (const value of data2) { if (i === key) return Result$Ok(new Some(value)); i++; } return Result$Error("Indexable"); } if (key_is_int && Array.isArray(data2) || data2 && typeof data2 === "object" || data2 && Object.getPrototypeOf(data2) === Object.prototype) { if (key in data2) return Result$Ok(new Some(data2[key])); return Result$Ok(new None); } return Result$Error(key_is_int ? "Indexable" : "Dict"); } function float(data2) { if (typeof data2 === "number") return Result$Ok(data2); return Result$Error(0); } function int(data2) { if (Number.isInteger(data2)) return Result$Ok(data2); return Result$Error(0); } function string(data2) { if (typeof data2 === "string") return Result$Ok(data2); return Result$Error(""); } function arrayToList(array) { let list2 = List$Empty(); let i = array.length; while (i--) { list2 = List$NonEmpty(array[i], list2); } return list2; } function isList(data2) { return List$isEmpty(data2) || List$isNonEmpty(data2); } function isResult(data2) { return Result$isOk(data2) || Result$isError(data2); } // build/dev/javascript/gleam_stdlib/gleam/list.mjs class Ascending extends CustomType { } class Descending extends CustomType { } function reverse_and_prepend(loop$prefix, loop$suffix) { while (true) { let prefix = loop$prefix; let suffix = loop$suffix; if (prefix instanceof Empty) { return suffix; } else { let first$1 = prefix.head; let rest$1 = prefix.tail; loop$prefix = rest$1; loop$suffix = prepend(first$1, suffix); } } } function reverse(list2) { return reverse_and_prepend(list2, toList([])); } function map_loop(loop$list, loop$fun, loop$acc) { while (true) { let list2 = loop$list; let fun = loop$fun; let acc = loop$acc; if (list2 instanceof Empty) { return reverse(acc); } else { let first$1 = list2.head; let rest$1 = list2.tail; loop$list = rest$1; loop$fun = fun; loop$acc = prepend(fun(first$1), acc); } } } function map2(list2, fun) { return map_loop(list2, fun, toList([])); } function index_map_loop(loop$list, loop$fun, loop$index, loop$acc) { while (true) { let list2 = loop$list; let fun = loop$fun; let index4 = loop$index; let acc = loop$acc; if (list2 instanceof Empty) { return reverse(acc); } else { let first$1 = list2.head; let rest$1 = list2.tail; let acc$1 = prepend(fun(first$1, index4), acc); loop$list = rest$1; loop$fun = fun; loop$index = index4 + 1; loop$acc = acc$1; } } } function index_map(list2, fun) { return index_map_loop(list2, fun, 0, toList([])); } function append_loop(loop$first, loop$second) { while (true) { let first = loop$first; let second = loop$second; if (first instanceof Empty) { return second; } else { let first$1 = first.head; let rest$1 = first.tail; loop$first = rest$1; loop$second = prepend(first$1, second); } } } function append2(first, second) { return append_loop(reverse(first), second); } function prepend2(list2, item) { return prepend(item, list2); } function fold2(loop$list, loop$initial, loop$fun) { while (true) { let list2 = loop$list; let initial = loop$initial; let fun = loop$fun; if (list2 instanceof Empty) { return initial; } else { let first$1 = list2.head; let rest$1 = list2.tail; loop$list = rest$1; loop$initial = fun(initial, first$1); loop$fun = fun; } } } function sequences(loop$list, loop$compare, loop$growing, loop$direction, loop$prev, loop$acc) { while (true) { let list2 = loop$list; let compare3 = loop$compare; let growing = loop$growing; let direction = loop$direction; let prev = loop$prev; let acc = loop$acc; let growing$1 = prepend(prev, growing); if (list2 instanceof Empty) { if (direction instanceof Ascending) { return prepend(reverse(growing$1), acc); } else { return prepend(growing$1, acc); } } else { let new$1 = list2.head; let rest$1 = list2.tail; let $ = compare3(prev, new$1); if (direction instanceof Ascending) { if ($ instanceof Lt) { loop$list = rest$1; loop$compare = compare3; loop$growing = growing$1; loop$direction = direction; loop$prev = new$1; loop$acc = acc; } else if ($ instanceof Eq) { loop$list = rest$1; loop$compare = compare3; loop$growing = growing$1; loop$direction = direction; loop$prev = new$1; loop$acc = acc; } else { let _block; if (direction instanceof Ascending) { _block = prepend(reverse(growing$1), acc); } else { _block = prepend(growing$1, acc); } let acc$1 = _block; if (rest$1 instanceof Empty) { return prepend(toList([new$1]), acc$1); } else { let next = rest$1.head; let rest$2 = rest$1.tail; let _block$1; let $1 = compare3(new$1, next); if ($1 instanceof Lt) { _block$1 = new Ascending; } else if ($1 instanceof Eq) { _block$1 = new Ascending; } else { _block$1 = new Descending; } let direction$1 = _block$1; loop$list = rest$2; loop$compare = compare3; loop$growing = toList([new$1]); loop$direction = direction$1; loop$prev = next; loop$acc = acc$1; } } } else if ($ instanceof Lt) { let _block; if (direction instanceof Ascending) { _block = prepend(reverse(growing$1), acc); } else { _block = prepend(growing$1, acc); } let acc$1 = _block; if (rest$1 instanceof Empty) { return prepend(toList([new$1]), acc$1); } else { let next = rest$1.head; let rest$2 = rest$1.tail; let _block$1; let $1 = compare3(new$1, next); if ($1 instanceof Lt) { _block$1 = new Ascending; } else if ($1 instanceof Eq) { _block$1 = new Ascending; } else { _block$1 = new Descending; } let direction$1 = _block$1; loop$list = rest$2; loop$compare = compare3; loop$growing = toList([new$1]); loop$direction = direction$1; loop$prev = next; loop$acc = acc$1; } } else if ($ instanceof Eq) { let _block; if (direction instanceof Ascending) { _block = prepend(reverse(growing$1), acc); } else { _block = prepend(growing$1, acc); } let acc$1 = _block; if (rest$1 instanceof Empty) { return prepend(toList([new$1]), acc$1); } else { let next = rest$1.head; let rest$2 = rest$1.tail; let _block$1; let $1 = compare3(new$1, next); if ($1 instanceof Lt) { _block$1 = new Ascending; } else if ($1 instanceof Eq) { _block$1 = new Ascending; } else { _block$1 = new Descending; } let direction$1 = _block$1; loop$list = rest$2; loop$compare = compare3; loop$growing = toList([new$1]); loop$direction = direction$1; loop$prev = next; loop$acc = acc$1; } } else { loop$list = rest$1; loop$compare = compare3; loop$growing = growing$1; loop$direction = direction; loop$prev = new$1; loop$acc = acc; } } } } function merge_ascendings(loop$list1, loop$list2, loop$compare, loop$acc) { while (true) { let list1 = loop$list1; let list2 = loop$list2; let compare3 = loop$compare; let acc = loop$acc; if (list1 instanceof Empty) { let list3 = list2; return reverse_and_prepend(list3, acc); } else if (list2 instanceof Empty) { let list3 = list1; return reverse_and_prepend(list3, acc); } else { let first1 = list1.head; let rest1 = list1.tail; let first2 = list2.head; let rest2 = list2.tail; let $ = compare3(first1, first2); if ($ instanceof Lt) { loop$list1 = rest1; loop$list2 = list2; loop$compare = compare3; loop$acc = prepend(first1, acc); } else if ($ instanceof Eq) { loop$list1 = list1; loop$list2 = rest2; loop$compare = compare3; loop$acc = prepend(first2, acc); } else { loop$list1 = list1; loop$list2 = rest2; loop$compare = compare3; loop$acc = prepend(first2, acc); } } } } function merge_ascending_pairs(loop$sequences, loop$compare, loop$acc) { while (true) { let sequences2 = loop$sequences; let compare3 = loop$compare; let acc = loop$acc; if (sequences2 instanceof Empty) { return reverse(acc); } else { let $ = sequences2.tail; if ($ instanceof Empty) { let sequence = sequences2.head; return reverse(prepend(reverse(sequence), acc)); } else { let ascending1 = sequences2.head; let ascending2 = $.head; let rest$1 = $.tail; let descending = merge_ascendings(ascending1, ascending2, compare3, toList([])); loop$sequences = rest$1; loop$compare = compare3; loop$acc = prepend(descending, acc); } } } } function merge_descendings(loop$list1, loop$list2, loop$compare, loop$acc) { while (true) { let list1 = loop$list1; let list2 = loop$list2; let compare3 = loop$compare; let acc = loop$acc; if (list1 instanceof Empty) { let list3 = list2; return reverse_and_prepend(list3, acc); } else if (list2 instanceof Empty) { let list3 = list1; return reverse_and_prepend(list3, acc); } else { let first1 = list1.head; let rest1 = list1.tail; let first2 = list2.head; let rest2 = list2.tail; let $ = compare3(first1, first2); if ($ instanceof Lt) { loop$list1 = list1; loop$list2 = rest2; loop$compare = compare3; loop$acc = prepend(first2, acc); } else if ($ instanceof Eq) { loop$list1 = rest1; loop$list2 = list2; loop$compare = compare3; loop$acc = prepend(first1, acc); } else { loop$list1 = rest1; loop$list2 = list2; loop$compare = compare3; loop$acc = prepend(first1, acc); } } } } function merge_descending_pairs(loop$sequences, loop$compare, loop$acc) { while (true) { let sequences2 = loop$sequences; let compare3 = loop$compare; let acc = loop$acc; if (sequences2 instanceof Empty) { return reverse(acc); } else { let $ = sequences2.tail; if ($ instanceof Empty) { let sequence = sequences2.head; return reverse(prepend(reverse(sequence), acc)); } else { let descending1 = sequences2.head; let descending2 = $.head; let rest$1 = $.tail; let ascending = merge_descendings(descending1, descending2, compare3, toList([])); loop$sequences = rest$1; loop$compare = compare3; loop$acc = prepend(ascending, acc); } } } } function merge_all(loop$sequences, loop$direction, loop$compare) { while (true) { let sequences2 = loop$sequences; let direction = loop$direction; let compare3 = loop$compare; if (sequences2 instanceof Empty) { return sequences2; } else if (direction instanceof Ascending) { let $ = sequences2.tail; if ($ instanceof Empty) { let sequence = sequences2.head; return sequence; } else { let sequences$1 = merge_ascending_pairs(sequences2, compare3, toList([])); loop$sequences = sequences$1; loop$direction = new Descending; loop$compare = compare3; } } else { let $ = sequences2.tail; if ($ instanceof Empty) { let sequence = sequences2.head; return reverse(sequence); } else { let sequences$1 = merge_descending_pairs(sequences2, compare3, toList([])); loop$sequences = sequences$1; loop$direction = new Ascending; loop$compare = compare3; } } } } function sort(list2, compare3) { if (list2 instanceof Empty) { return list2; } else { let $ = list2.tail; if ($ instanceof Empty) { return list2; } else { let x = list2.head; let y = $.head; let rest$1 = $.tail; let _block; let $1 = compare3(x, y); if ($1 instanceof Lt) { _block = new Ascending; } else if ($1 instanceof Eq) { _block = new Ascending; } else { _block = new Descending; } let direction = _block; let sequences$1 = sequences(rest$1, compare3, toList([x]), direction, y, toList([])); return merge_all(sequences$1, new Ascending, compare3); } } } function key_set_loop(loop$list, loop$key, loop$value, loop$inspected) { while (true) { let list2 = loop$list; let key = loop$key; let value = loop$value; let inspected = loop$inspected; if (list2 instanceof Empty) { return reverse(prepend([key, value], inspected)); } else { let k = list2.head[0]; if (isEqual(k, key)) { let rest$1 = list2.tail; return reverse_and_prepend(inspected, prepend([k, value], rest$1)); } else { let first$1 = list2.head; let rest$1 = list2.tail; loop$list = rest$1; loop$key = key; loop$value = value; loop$inspected = prepend(first$1, inspected); } } } } function key_set(list2, key, value) { return key_set_loop(list2, key, value, toList([])); } function each(loop$list, loop$f) { while (true) { let list2 = loop$list; let f = loop$f; if (list2 instanceof Empty) { return; } else { let first$1 = list2.head; let rest$1 = list2.tail; f(first$1); loop$list = rest$1; loop$f = f; } } } // build/dev/javascript/gleam_stdlib/gleam/result.mjs function map_error(result, fun) { if (result instanceof Ok) { return result; } else { let error = result[0]; return new Error(fun(error)); } } function try$(result, fun) { if (result instanceof Ok) { let x = result[0]; return fun(x); } else { return result; } } function unwrap2(result, default$) { if (result instanceof Ok) { let v = result[0]; return v; } else { return default$; } } function replace_error(result, error) { if (result instanceof Ok) { return result; } else { return new Error(error); } } // build/dev/javascript/gleam_stdlib/gleam/bool.mjs function guard(requirement, consequence, alternative) { if (requirement) { return consequence; } else { return alternative(); } } // build/dev/javascript/gleam_http/gleam/http.mjs class Get extends CustomType { } class Post extends CustomType { } class Head extends CustomType { } class Put extends CustomType { } class Delete extends CustomType { } class Trace extends CustomType { } class Connect extends CustomType { } class Options extends CustomType { } class Patch extends CustomType { } class Http extends CustomType { } class Https extends CustomType { } function method_to_string(method) { if (method instanceof Get) { return "GET"; } else if (method instanceof Post) { return "POST"; } else if (method instanceof Head) { return "HEAD"; } else if (method instanceof Put) { return "PUT"; } else if (method instanceof Delete) { return "DELETE"; } else if (method instanceof Trace) { return "TRACE"; } else if (method instanceof Connect) { return "CONNECT"; } else if (method instanceof Options) { return "OPTIONS"; } else if (method instanceof Patch) { return "PATCH"; } else { let method$1 = method[0]; return method$1; } } function scheme_to_string(scheme) { if (scheme instanceof Http) { return "http"; } else { return "https"; } } function scheme_from_string(scheme) { let $ = lowercase(scheme); if ($ === "http") { return new Ok(new Http); } else if ($ === "https") { return new Ok(new Https); } else { return new Error(undefined); } } // build/dev/javascript/gleam_http/gleam/http/response.mjs class Response extends CustomType { constructor(status, headers, body) { super(); this.status = status; this.headers = headers; this.body = body; } } // build/dev/javascript/gleam_stdlib/gleam/function.mjs function identity2(x) { return x; } // build/dev/javascript/gleam_json/gleam_json_ffi.mjs function json_to_string(json) { return JSON.stringify(json); } function object(entries) { return Object.fromEntries(entries); } function identity3(x) { return x; } function array(list2) { const array2 = []; while (List$isNonEmpty(list2)) { array2.push(List$NonEmpty$first(list2)); list2 = List$NonEmpty$rest(list2); } return array2; } // build/dev/javascript/gleam_json/gleam/json.mjs function to_string2(json) { return json_to_string(json); } function string3(input) { return identity3(input); } function bool(input) { return identity3(input); } function int3(input) { return identity3(input); } function object2(entries) { return object(entries); } function preprocessed_array(from2) { return array(from2); } function array2(entries, inner_type) { let _pipe = entries; let _pipe$1 = map2(_pipe, inner_type); return preprocessed_array(_pipe$1); } // build/dev/javascript/houdini/houdini.ffi.mjs function do_escape(string4) { return string4.replaceAll(/[><&"']/g, (replaced) => { switch (replaced) { case ">": return ">"; case "<": return "<"; case "'": return "'"; case "&": return "&"; case '"': return """; default: return replaced; } }); } // build/dev/javascript/houdini/houdini/internal/escape_js.mjs function escape(text) { return do_escape(text); } // build/dev/javascript/houdini/houdini.mjs function escape2(string4) { return escape(string4); } // build/dev/javascript/lustre/lustre/internals/constants.mjs var empty_list = /* @__PURE__ */ toList([]); var error_nil = /* @__PURE__ */ new Error(undefined); // build/dev/javascript/lustre/lustre/vdom/vattr.ffi.mjs var GT = /* @__PURE__ */ Order$Gt(); var LT = /* @__PURE__ */ Order$Lt(); var EQ = /* @__PURE__ */ Order$Eq(); function compare3(a, b) { if (a.name === b.name) { return EQ; } else if (a.name < b.name) { return LT; } else { return GT; } } // build/dev/javascript/lustre/lustre/vdom/vattr.mjs class Attribute extends CustomType { constructor(kind, name, value) { super(); this.kind = kind; this.name = name; this.value = value; } } class Property extends CustomType { constructor(kind, name, value) { super(); this.kind = kind; this.name = name; this.value = value; } } class Event2 extends CustomType { constructor(kind, name, handler, include, prevent_default, stop_propagation, debounce, throttle) { super(); this.kind = kind; this.name = name; this.handler = handler; this.include = include; this.prevent_default = prevent_default; this.stop_propagation = stop_propagation; this.debounce = debounce; this.throttle = throttle; } } class Handler extends CustomType { constructor(prevent_default, stop_propagation, message) { super(); this.prevent_default = prevent_default; this.stop_propagation = stop_propagation; this.message = message; } } class Never extends CustomType { constructor(kind) { super(); this.kind = kind; } } var attribute_kind = 0; var property_kind = 1; var event_kind = 2; var never_kind = 0; var never = /* @__PURE__ */ new Never(never_kind); var always_kind = 2; function merge(loop$attributes, loop$merged) { while (true) { let attributes = loop$attributes; let merged = loop$merged; if (attributes instanceof Empty) { return merged; } else { let $ = attributes.head; if ($ instanceof Attribute) { let $1 = $.name; if ($1 === "") { let rest = attributes.tail; loop$attributes = rest; loop$merged = merged; } else if ($1 === "class") { let $2 = $.value; if ($2 === "") { let rest = attributes.tail; loop$attributes = rest; loop$merged = merged; } else { let $3 = attributes.tail; if ($3 instanceof Empty) { let attribute$1 = $; let rest = $3; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } else { let $4 = $3.head; if ($4 instanceof Attribute) { let $5 = $4.name; if ($5 === "class") { let kind = $.kind; let class1 = $2; let rest = $3.tail; let class2 = $4.value; let value = class1 + " " + class2; let attribute$1 = new Attribute(kind, "class", value); loop$attributes = prepend(attribute$1, rest); loop$merged = merged; } else { let attribute$1 = $; let rest = $3; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } } else { let attribute$1 = $; let rest = $3; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } } } } else if ($1 === "style") { let $2 = $.value; if ($2 === "") { let rest = attributes.tail; loop$attributes = rest; loop$merged = merged; } else { let $3 = attributes.tail; if ($3 instanceof Empty) { let attribute$1 = $; let rest = $3; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } else { let $4 = $3.head; if ($4 instanceof Attribute) { let $5 = $4.name; if ($5 === "style") { let kind = $.kind; let style1 = $2; let rest = $3.tail; let style2 = $4.value; let value = style1 + ";" + style2; let attribute$1 = new Attribute(kind, "style", value); loop$attributes = prepend(attribute$1, rest); loop$merged = merged; } else { let attribute$1 = $; let rest = $3; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } } else { let attribute$1 = $; let rest = $3; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } } } } else { let attribute$1 = $; let rest = attributes.tail; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } } else { let attribute$1 = $; let rest = attributes.tail; loop$attributes = rest; loop$merged = prepend(attribute$1, merged); } } } } function prepare(attributes) { if (attributes instanceof Empty) { return attributes; } else { let $ = attributes.tail; if ($ instanceof Empty) { return attributes; } else { let _pipe = attributes; let _pipe$1 = sort(_pipe, (a, b) => { return compare3(b, a); }); return merge(_pipe$1, empty_list); } } } function attribute(name, value) { return new Attribute(attribute_kind, name, value); } function property(name, value) { return new Property(property_kind, name, value); } function event(name, handler, include, prevent_default, stop_propagation, debounce, throttle) { return new Event2(event_kind, name, handler, include, prevent_default, stop_propagation, debounce, throttle); } // build/dev/javascript/lustre/lustre/attribute.mjs function attribute2(name, value) { return attribute(name, value); } function property2(name, value) { return property(name, value); } function boolean_attribute(name, value) { if (value) { return attribute2(name, ""); } else { return property2(name, bool(false)); } } function class$(name) { return attribute2("class", name); } function style(property3, value) { if (property3 === "") { return class$(""); } else if (value === "") { return class$(""); } else { return attribute2("style", property3 + ":" + value + ";"); } } function do_styles(loop$properties, loop$styles) { while (true) { let properties = loop$properties; let styles = loop$styles; if (properties instanceof Empty) { return styles; } else { let $ = properties.head[0]; if ($ === "") { let rest = properties.tail; loop$properties = rest; loop$styles = styles; } else { let $1 = properties.head[1]; if ($1 === "") { let rest = properties.tail; loop$properties = rest; loop$styles = styles; } else { let rest = properties.tail; let name$1 = $; let value$1 = $1; loop$properties = rest; loop$styles = styles + name$1 + ":" + value$1 + ";"; } } } } } function styles(properties) { return attribute2("style", do_styles(properties, "")); } function disabled(is_disabled) { return boolean_attribute("disabled", is_disabled); } function min2(value) { return attribute2("min", value); } function placeholder(text) { return attribute2("placeholder", text); } function type_(control_type) { return attribute2("type", control_type); } function value(control_value) { return attribute2("value", control_value); } // build/dev/javascript/lustre/lustre/effect.mjs class Effect extends CustomType { constructor(synchronous, before_paint, after_paint) { super(); this.synchronous = synchronous; this.before_paint = before_paint; this.after_paint = after_paint; } } class Actions extends CustomType { constructor(dispatch, emit, select, root, provide) { super(); this.dispatch = dispatch; this.emit = emit; this.select = select; this.root = root; this.provide = provide; } } var empty = /* @__PURE__ */ new Effect(/* @__PURE__ */ toList([]), /* @__PURE__ */ toList([]), /* @__PURE__ */ toList([])); function perform(effect, dispatch, emit, select, root, provide) { let actions = new Actions(dispatch, emit, select, root, provide); return each(effect.synchronous, (run2) => { return run2(actions); }); } function none() { return empty; } function from2(effect) { let task = (actions) => { let dispatch = actions.dispatch; return effect(dispatch); }; return new Effect(toList([task]), empty.before_paint, empty.after_paint); } function batch(effects) { return fold2(effects, empty, (acc, eff) => { return new Effect(fold2(eff.synchronous, acc.synchronous, prepend2), fold2(eff.before_paint, acc.before_paint, prepend2), fold2(eff.after_paint, acc.after_paint, prepend2)); }); } // build/dev/javascript/lustre/lustre/internals/mutable_map.ffi.mjs function empty2() { return null; } function get2(map6, key) { return map6?.get(key); } function get_or_compute(map6, key, compute) { return map6?.get(key) ?? compute(); } function has_key(map6, key) { return map6 && map6.has(key); } function insert2(map6, key, value2) { map6 ??= new Map; map6.set(key, value2); return map6; } function remove(map6, key) { map6?.delete(key); return map6; } // build/dev/javascript/lustre/lustre/internals/ref.ffi.mjs function sameValueZero(x, y) { if (typeof x === "number" && typeof y === "number") { return x === y || x !== x && y !== y; } return x === y; } // build/dev/javascript/lustre/lustre/internals/ref.mjs function equal_lists(loop$xs, loop$ys) { while (true) { let xs = loop$xs; let ys = loop$ys; if (xs instanceof Empty) { if (ys instanceof Empty) { return true; } else { return false; } } else if (ys instanceof Empty) { return false; } else { let x = xs.head; let xs$1 = xs.tail; let y = ys.head; let ys$1 = ys.tail; let $ = sameValueZero(x, y); if ($) { loop$xs = xs$1; loop$ys = ys$1; } else { return $; } } } } // build/dev/javascript/lustre/lustre/vdom/vnode.mjs class Fragment extends CustomType { constructor(kind, key, children, keyed_children) { super(); this.kind = kind; this.key = key; this.children = children; this.keyed_children = keyed_children; } } class Element extends CustomType { constructor(kind, key, namespace, tag, attributes, children, keyed_children, self_closing, void$) { super(); this.kind = kind; this.key = key; this.namespace = namespace; this.tag = tag; this.attributes = attributes; this.children = children; this.keyed_children = keyed_children; this.self_closing = self_closing; this.void = void$; } } class Text extends CustomType { constructor(kind, key, content) { super(); this.kind = kind; this.key = key; this.content = content; } } class UnsafeInnerHtml extends CustomType { constructor(kind, key, namespace, tag, attributes, inner_html) { super(); this.kind = kind; this.key = key; this.namespace = namespace; this.tag = tag; this.attributes = attributes; this.inner_html = inner_html; } } class Map2 extends CustomType { constructor(kind, key, mapper, child) { super(); this.kind = kind; this.key = key; this.mapper = mapper; this.child = child; } } class Memo extends CustomType { constructor(kind, key, dependencies, view) { super(); this.kind = kind; this.key = key; this.dependencies = dependencies; this.view = view; } } var fragment_kind = 0; var element_kind = 1; var text_kind = 2; var unsafe_inner_html_kind = 3; var map_kind = 4; var memo_kind = 5; function is_void_html_element(tag, namespace) { if (namespace === "") { if (tag === "area") { return true; } else if (tag === "base") { return true; } else if (tag === "br") { return true; } else if (tag === "col") { return true; } else if (tag === "embed") { return true; } else if (tag === "hr") { return true; } else if (tag === "img") { return true; } else if (tag === "input") { return true; } else if (tag === "link") { return true; } else if (tag === "meta") { return true; } else if (tag === "param") { return true; } else if (tag === "source") { return true; } else if (tag === "track") { return true; } else if (tag === "wbr") { return true; } else { return false; } } else { return false; } } function to_keyed(key, node) { if (node instanceof Fragment) { return new Fragment(node.kind, key, node.children, node.keyed_children); } else if (node instanceof Element) { return new Element(node.kind, key, node.namespace, node.tag, node.attributes, node.children, node.keyed_children, node.self_closing, node.void); } else if (node instanceof Text) { return new Text(node.kind, key, node.content); } else if (node instanceof UnsafeInnerHtml) { return new UnsafeInnerHtml(node.kind, key, node.namespace, node.tag, node.attributes, node.inner_html); } else if (node instanceof Map2) { let child = node.child; return new Map2(node.kind, key, node.mapper, to_keyed(key, child)); } else { let view = node.view; return new Memo(node.kind, key, node.dependencies, () => { return to_keyed(key, view()); }); } } function fragment(key, children, keyed_children) { return new Fragment(fragment_kind, key, children, keyed_children); } function element(key, namespace, tag, attributes, children, keyed_children, self_closing, void$) { return new Element(element_kind, key, namespace, tag, prepare(attributes), children, keyed_children, self_closing, void$); } function text(key, content) { return new Text(text_kind, key, content); } function map6(element2, mapper) { if (element2 instanceof Map2) { let child_mapper = element2.mapper; return new Map2(map_kind, element2.key, (handler) => { return identity2(mapper)(child_mapper(handler)); }, identity2(element2.child)); } else { return new Map2(map_kind, element2.key, identity2(mapper), identity2(element2)); } } function memo(key, dependencies, view) { return new Memo(memo_kind, key, dependencies, view); } // build/dev/javascript/lustre/lustre/element.mjs function element2(tag, attributes, children) { return element("", "", tag, attributes, children, empty2(), false, is_void_html_element(tag, "")); } function text2(content) { return text("", content); } function none2() { return text("", ""); } function memo2(dependencies, view) { return memo("", dependencies, view); } function ref(value2) { return identity2(value2); } function map7(element3, f) { return map6(element3, f); } // build/dev/javascript/lustre/lustre/element/html.mjs function text3(content) { return text2(content); } function h1(attrs, children) { return element2("h1", attrs, children); } function div(attrs, children) { return element2("div", attrs, children); } function li(attrs, children) { return element2("li", attrs, children); } function p(attrs, children) { return element2("p", attrs, children); } function ul(attrs, children) { return element2("ul", attrs, children); } function span(attrs, children) { return element2("span", attrs, children); } function button(attrs, children) { return element2("button", attrs, children); } function input(attrs) { return element2("input", attrs, empty_list); } // build/dev/javascript/lustre/lustre/vdom/patch.mjs class Patch2 extends CustomType { constructor(index4, removed, changes, children) { super(); this.index = index4; this.removed = removed; this.changes = changes; this.children = children; } } class ReplaceText extends CustomType { constructor(kind, content) { super(); this.kind = kind; this.content = content; } } class ReplaceInnerHtml extends CustomType { constructor(kind, inner_html) { super(); this.kind = kind; this.inner_html = inner_html; } } class Update extends CustomType { constructor(kind, added, removed) { super(); this.kind = kind; this.added = added; this.removed = removed; } } class Move extends CustomType { constructor(kind, key, before) { super(); this.kind = kind; this.key = key; this.before = before; } } class Replace extends CustomType { constructor(kind, index4, with$) { super(); this.kind = kind; this.index = index4; this.with = with$; } } class Remove extends CustomType { constructor(kind, index4) { super(); this.kind = kind; this.index = index4; } } class Insert extends CustomType { constructor(kind, children, before) { super(); this.kind = kind; this.children = children; this.before = before; } } var replace_text_kind = 0; var replace_inner_html_kind = 1; var update_kind = 2; var move_kind = 3; var remove_kind = 4; var replace_kind = 5; var insert_kind = 6; function new$3(index4, removed, changes, children) { return new Patch2(index4, removed, changes, children); } function replace_text(content) { return new ReplaceText(replace_text_kind, content); } function replace_inner_html(inner_html) { return new ReplaceInnerHtml(replace_inner_html_kind, inner_html); } function update(added, removed) { return new Update(update_kind, added, removed); } function move(key, before) { return new Move(move_kind, key, before); } function remove2(index4) { return new Remove(remove_kind, index4); } function replace2(index4, with$) { return new Replace(replace_kind, index4, with$); } function insert3(children, before) { return new Insert(insert_kind, children, before); } // build/dev/javascript/lustre/lustre/runtime/transport.mjs class Mount extends CustomType { constructor(kind, open_shadow_root, will_adopt_styles, observed_attributes, observed_properties, requested_contexts, provided_contexts, vdom, memos) { super(); this.kind = kind; this.open_shadow_root = open_shadow_root; this.will_adopt_styles = will_adopt_styles; this.observed_attributes = observed_attributes; this.observed_properties = observed_properties; this.requested_contexts = requested_contexts; this.provided_contexts = provided_contexts; this.vdom = vdom; this.memos = memos; } } class Reconcile extends CustomType { constructor(kind, patch, memos) { super(); this.kind = kind; this.patch = patch; this.memos = memos; } } class Emit extends CustomType { constructor(kind, name, data2) { super(); this.kind = kind; this.name = name; this.data = data2; } } class Provide extends CustomType { constructor(kind, key, value2) { super(); this.kind = kind; this.key = key; this.value = value2; } } class Batch extends CustomType { constructor(kind, messages) { super(); this.kind = kind; this.messages = messages; } } var ServerMessage$isBatch = (value2) => value2 instanceof Batch; class AttributeChanged extends CustomType { constructor(kind, name, value2) { super(); this.kind = kind; this.name = name; this.value = value2; } } var ServerMessage$isAttributeChanged = (value2) => value2 instanceof AttributeChanged; class PropertyChanged extends CustomType { constructor(kind, name, value2) { super(); this.kind = kind; this.name = name; this.value = value2; } } var ServerMessage$isPropertyChanged = (value2) => value2 instanceof PropertyChanged; class EventFired extends CustomType { constructor(kind, path, name, event2) { super(); this.kind = kind; this.path = path; this.name = name; this.event = event2; } } var ServerMessage$isEventFired = (value2) => value2 instanceof EventFired; class ContextProvided extends CustomType { constructor(kind, key, value2) { super(); this.kind = kind; this.key = key; this.value = value2; } } var ServerMessage$isContextProvided = (value2) => value2 instanceof ContextProvided; var mount_kind = 0; var reconcile_kind = 1; var emit_kind = 2; var provide_kind = 3; function mount(open_shadow_root, will_adopt_styles, observed_attributes, observed_properties, requested_contexts, provided_contexts, vdom, memos) { return new Mount(mount_kind, open_shadow_root, will_adopt_styles, observed_attributes, observed_properties, requested_contexts, provided_contexts, vdom, memos); } function reconcile(patch, memos) { return new Reconcile(reconcile_kind, patch, memos); } function emit(name, data2) { return new Emit(emit_kind, name, data2); } function provide(key, value2) { return new Provide(provide_kind, key, value2); } // build/dev/javascript/lustre/lustre/vdom/path.mjs class Root extends CustomType { } class Key extends CustomType { constructor(key, parent) { super(); this.key = key; this.parent = parent; } } class Index extends CustomType { constructor(index4, parent) { super(); this.index = index4; this.parent = parent; } } class Subtree extends CustomType { constructor(parent) { super(); this.parent = parent; } } var root = /* @__PURE__ */ new Root; var separator_element = "\t"; var separator_subtree = "\r"; var separator_event = ` `; function do_matches(loop$path, loop$candidates) { while (true) { let path = loop$path; let candidates = loop$candidates; if (candidates instanceof Empty) { return false; } else { let candidate = candidates.head; let rest = candidates.tail; let $ = starts_with(path, candidate); if ($) { return $; } else { loop$path = path; loop$candidates = rest; } } } } function add2(parent, index4, key) { if (key === "") { return new Index(index4, parent); } else { return new Key(key, parent); } } function subtree(path) { return new Subtree(path); } function finish_to_string(acc) { if (acc instanceof Empty) { return ""; } else { let segments = acc.tail; return concat2(segments); } } function split_subtree_path(path) { return split2(path, separator_subtree); } function do_to_string(loop$full, loop$path, loop$acc) { while (true) { let full = loop$full; let path = loop$path; let acc = loop$acc; if (path instanceof Root) { return finish_to_string(acc); } else if (path instanceof Key) { let key = path.key; let parent = path.parent; loop$full = full; loop$path = parent; loop$acc = prepend(separator_element, prepend(key, acc)); } else if (path instanceof Index) { let index4 = path.index; let parent = path.parent; let acc$1 = prepend(separator_element, prepend(to_string(index4), acc)); loop$full = full; loop$path = parent; loop$acc = acc$1; } else if (!full) { return finish_to_string(acc); } else { let parent = path.parent; if (acc instanceof Empty) { loop$full = full; loop$path = parent; loop$acc = acc; } else { let acc$1 = acc.tail; loop$full = full; loop$path = parent; loop$acc = prepend(separator_subtree, acc$1); } } } } function child(path) { return do_to_string(false, path, empty_list); } function to_string4(path) { return do_to_string(true, path, empty_list); } function matches(path, candidates) { if (candidates instanceof Empty) { return false; } else { return do_matches(to_string4(path), candidates); } } function event2(path, event3) { return do_to_string(false, path, prepend(separator_event, prepend(event3, empty_list))); } // build/dev/javascript/lustre/lustre/vdom/cache.mjs class Cache extends CustomType { constructor(events, vdoms, old_vdoms, dispatched_paths, next_dispatched_paths) { super(); this.events = events; this.vdoms = vdoms; this.old_vdoms = old_vdoms; this.dispatched_paths = dispatched_paths; this.next_dispatched_paths = next_dispatched_paths; } } class Events extends CustomType { constructor(handlers, children) { super(); this.handlers = handlers; this.children = children; } } class Child extends CustomType { constructor(mapper, events) { super(); this.mapper = mapper; this.events = events; } } class AddedChildren extends CustomType { constructor(handlers, children, vdoms) { super(); this.handlers = handlers; this.children = children; this.vdoms = vdoms; } } class DecodedEvent extends CustomType { constructor(path, handler) { super(); this.path = path; this.handler = handler; } } class DispatchedEvent extends CustomType { constructor(path) { super(); this.path = path; } } function compose_mapper(mapper, child_mapper) { return (msg) => { return mapper(child_mapper(msg)); }; } function new_events() { return new Events(empty2(), empty2()); } function new$4() { return new Cache(new_events(), empty2(), empty2(), empty_list, empty_list); } function tick(cache) { return new Cache(cache.events, empty2(), cache.vdoms, cache.next_dispatched_paths, empty_list); } function events(cache) { return cache.events; } function update_events(cache, events2) { return new Cache(events2, cache.vdoms, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths); } function memos(cache) { return cache.vdoms; } function get_old_memo(cache, old, new$5) { return get_or_compute(cache.old_vdoms, old, new$5); } function keep_memo(cache, old, new$5) { let node = get_or_compute(cache.old_vdoms, old, new$5); let vdoms = insert2(cache.vdoms, new$5, node); return new Cache(cache.events, vdoms, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths); } function add_memo(cache, new$5, node) { let vdoms = insert2(cache.vdoms, new$5, node); return new Cache(cache.events, vdoms, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths); } function get_subtree(events2, path, old_mapper) { let child2 = get_or_compute(events2.children, path, () => { return new Child(old_mapper, new_events()); }); return child2.events; } function update_subtree(parent, path, mapper, events2) { let new_child = new Child(mapper, events2); let children = insert2(parent.children, path, new_child); return new Events(parent.handlers, children); } function do_add_event(handlers, path, name, handler) { return insert2(handlers, event2(path, name), handler); } function add_event(events2, path, name, handler) { let handlers = do_add_event(events2.handlers, path, name, handler); return new Events(handlers, events2.children); } function do_remove_event(handlers, path, name) { return remove(handlers, event2(path, name)); } function remove_event(events2, path, name) { let handlers = do_remove_event(events2.handlers, path, name); return new Events(handlers, events2.children); } function add_attributes(handlers, path, attributes) { return fold2(attributes, handlers, (events2, attribute3) => { if (attribute3 instanceof Event2) { let name = attribute3.name; let handler = attribute3.handler; return do_add_event(events2, path, name, handler); } else { return events2; } }); } function do_add_children(loop$handlers, loop$children, loop$vdoms, loop$parent, loop$child_index, loop$nodes) { while (true) { let handlers = loop$handlers; let children = loop$children; let vdoms = loop$vdoms; let parent = loop$parent; let child_index = loop$child_index; let nodes = loop$nodes; let next = child_index + 1; if (nodes instanceof Empty) { return new AddedChildren(handlers, children, vdoms); } else { let $ = nodes.head; if ($ instanceof Fragment) { let rest = nodes.tail; let key = $.key; let nodes$1 = $.children; let path = add2(parent, child_index, key); let $1 = do_add_children(handlers, children, vdoms, path, 0, nodes$1); let handlers$1; let children$1; let vdoms$1; handlers$1 = $1.handlers; children$1 = $1.children; vdoms$1 = $1.vdoms; loop$handlers = handlers$1; loop$children = children$1; loop$vdoms = vdoms$1; loop$parent = parent; loop$child_index = next; loop$nodes = rest; } else if ($ instanceof Element) { let rest = nodes.tail; let key = $.key; let attributes = $.attributes; let nodes$1 = $.children; let path = add2(parent, child_index, key); let handlers$1 = add_attributes(handlers, path, attributes); let $1 = do_add_children(handlers$1, children, vdoms, path, 0, nodes$1); let handlers$2; let children$1; let vdoms$1; handlers$2 = $1.handlers; children$1 = $1.children; vdoms$1 = $1.vdoms; loop$handlers = handlers$2; loop$children = children$1; loop$vdoms = vdoms$1; loop$parent = parent; loop$child_index = next; loop$nodes = rest; } else if ($ instanceof Text) { let rest = nodes.tail; loop$handlers = handlers; loop$children = children; loop$vdoms = vdoms; loop$parent = parent; loop$child_index = next; loop$nodes = rest; } else if ($ instanceof UnsafeInnerHtml) { let rest = nodes.tail; let key = $.key; let attributes = $.attributes; let path = add2(parent, child_index, key); let handlers$1 = add_attributes(handlers, path, attributes); loop$handlers = handlers$1; loop$children = children; loop$vdoms = vdoms; loop$parent = parent; loop$child_index = next; loop$nodes = rest; } else if ($ instanceof Map2) { let rest = nodes.tail; let key = $.key; let mapper = $.mapper; let child2 = $.child; let path = add2(parent, child_index, key); let added = do_add_children(empty2(), empty2(), vdoms, subtree(path), 0, prepend(child2, empty_list)); let vdoms$1 = added.vdoms; let child_events = new Events(added.handlers, added.children); let child$1 = new Child(mapper, child_events); let children$1 = insert2(children, child(path), child$1); loop$handlers = handlers; loop$children = children$1; loop$vdoms = vdoms$1; loop$parent = parent; loop$child_index = next; loop$nodes = rest; } else { let rest = nodes.tail; let view = $.view; let child_node = view(); let vdoms$1 = insert2(vdoms, view, child_node); let next$1 = child_index; let rest$1 = prepend(child_node, rest); loop$handlers = handlers; loop$children = children; loop$vdoms = vdoms$1; loop$parent = parent; loop$child_index = next$1; loop$nodes = rest$1; } } } } function add_children(cache, events2, path, child_index, nodes) { let vdoms = cache.vdoms; let handlers; let children; handlers = events2.handlers; children = events2.children; let $ = do_add_children(handlers, children, vdoms, path, child_index, nodes); let handlers$1; let children$1; let vdoms$1; handlers$1 = $.handlers; children$1 = $.children; vdoms$1 = $.vdoms; return [ new Cache(cache.events, vdoms$1, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths), new Events(handlers$1, children$1) ]; } function add_child(cache, events2, parent, index4, child2) { let children = prepend(child2, empty_list); return add_children(cache, events2, parent, index4, children); } function from_node(root2) { let cache = new$4(); let $ = add_child(cache, cache.events, root, 0, root2); let cache$1; let events$1; cache$1 = $[0]; events$1 = $[1]; return new Cache(events$1, cache$1.vdoms, cache$1.old_vdoms, cache$1.dispatched_paths, cache$1.next_dispatched_paths); } function remove_attributes(handlers, path, attributes) { return fold2(attributes, handlers, (events2, attribute3) => { if (attribute3 instanceof Event2) { let name = attribute3.name; return do_remove_event(events2, path, name); } else { return events2; } }); } function do_remove_children(loop$handlers, loop$children, loop$vdoms, loop$parent, loop$index, loop$nodes) { while (true) { let handlers = loop$handlers; let children = loop$children; let vdoms = loop$vdoms; let parent = loop$parent; let index4 = loop$index; let nodes = loop$nodes; let next = index4 + 1; if (nodes instanceof Empty) { return new Events(handlers, children); } else { let $ = nodes.head; if ($ instanceof Fragment) { let rest = nodes.tail; let key = $.key; let nodes$1 = $.children; let path = add2(parent, index4, key); let $1 = do_remove_children(handlers, children, vdoms, path, 0, nodes$1); let handlers$1; let children$1; handlers$1 = $1.handlers; children$1 = $1.children; loop$handlers = handlers$1; loop$children = children$1; loop$vdoms = vdoms; loop$parent = parent; loop$index = next; loop$nodes = rest; } else if ($ instanceof Element) { let rest = nodes.tail; let key = $.key; let attributes = $.attributes; let nodes$1 = $.children; let path = add2(parent, index4, key); let handlers$1 = remove_attributes(handlers, path, attributes); let $1 = do_remove_children(handlers$1, children, vdoms, path, 0, nodes$1); let handlers$2; let children$1; handlers$2 = $1.handlers; children$1 = $1.children; loop$handlers = handlers$2; loop$children = children$1; loop$vdoms = vdoms; loop$parent = parent; loop$index = next; loop$nodes = rest; } else if ($ instanceof Text) { let rest = nodes.tail; loop$handlers = handlers; loop$children = children; loop$vdoms = vdoms; loop$parent = parent; loop$index = next; loop$nodes = rest; } else if ($ instanceof UnsafeInnerHtml) { let rest = nodes.tail; let key = $.key; let attributes = $.attributes; let path = add2(parent, index4, key); let handlers$1 = remove_attributes(handlers, path, attributes); loop$handlers = handlers$1; loop$children = children; loop$vdoms = vdoms; loop$parent = parent; loop$index = next; loop$nodes = rest; } else if ($ instanceof Map2) { let rest = nodes.tail; let key = $.key; let path = add2(parent, index4, key); let children$1 = remove(children, child(path)); loop$handlers = handlers; loop$children = children$1; loop$vdoms = vdoms; loop$parent = parent; loop$index = next; loop$nodes = rest; } else { let rest = nodes.tail; let view = $.view; let $1 = has_key(vdoms, view); if ($1) { let child2 = get2(vdoms, view); let nodes$1 = prepend(child2, rest); loop$handlers = handlers; loop$children = children; loop$vdoms = vdoms; loop$parent = parent; loop$index = index4; loop$nodes = nodes$1; } else { loop$handlers = handlers; loop$children = children; loop$vdoms = vdoms; loop$parent = parent; loop$index = next; loop$nodes = rest; } } } } } function remove_child(cache, events2, parent, child_index, child2) { return do_remove_children(events2.handlers, events2.children, cache.old_vdoms, parent, child_index, prepend(child2, empty_list)); } function replace_child(cache, events2, parent, child_index, prev, next) { let events$1 = remove_child(cache, events2, parent, child_index, prev); return add_child(cache, events$1, parent, child_index, next); } function dispatch(cache, event3) { let next_dispatched_paths = prepend(event3.path, cache.next_dispatched_paths); let cache$1 = new Cache(cache.events, cache.vdoms, cache.old_vdoms, cache.dispatched_paths, next_dispatched_paths); if (event3 instanceof DecodedEvent) { let handler = event3.handler; return [cache$1, new Ok(handler)]; } else { return [cache$1, error_nil]; } } function has_dispatched_events(cache, path) { return matches(path, cache.dispatched_paths); } function get_handler(loop$events, loop$path, loop$mapper) { while (true) { let events2 = loop$events; let path = loop$path; let mapper = loop$mapper; if (path instanceof Empty) { return error_nil; } else { let $ = path.tail; if ($ instanceof Empty) { let key = path.head; let $1 = has_key(events2.handlers, key); if ($1) { let handler = get2(events2.handlers, key); return new Ok(map3(handler, (handler2) => { return new Handler(handler2.prevent_default, handler2.stop_propagation, identity2(mapper)(handler2.message)); })); } else { return error_nil; } } else { let key = path.head; let path$1 = $; let $1 = has_key(events2.children, key); if ($1) { let child2 = get2(events2.children, key); let mapper$1 = compose_mapper(mapper, child2.mapper); loop$events = child2.events; loop$path = path$1; loop$mapper = mapper$1; } else { return error_nil; } } } } } function decode2(cache, path, name, event3) { let parts = split_subtree_path(path + separator_event + name); let $ = get_handler(cache.events, parts, identity2); if ($ instanceof Ok) { let handler = $[0]; let $1 = run(event3, handler); if ($1 instanceof Ok) { let handler$1 = $1[0]; return new DecodedEvent(path, handler$1); } else { return new DispatchedEvent(path); } } else { return new DispatchedEvent(path); } } function handle(cache, path, name, event3) { let _pipe = decode2(cache, path, name, event3); return ((_capture) => { return dispatch(cache, _capture); })(_pipe); } // build/dev/javascript/lustre/lustre/runtime/server/runtime.mjs class ClientDispatchedMessage extends CustomType { constructor(message) { super(); this.message = message; } } var Message$isClientDispatchedMessage = (value2) => value2 instanceof ClientDispatchedMessage; class ClientRegisteredCallback extends CustomType { constructor(callback) { super(); this.callback = callback; } } var Message$isClientRegisteredCallback = (value2) => value2 instanceof ClientRegisteredCallback; class ClientDeregisteredCallback extends CustomType { constructor(callback) { super(); this.callback = callback; } } var Message$isClientDeregisteredCallback = (value2) => value2 instanceof ClientDeregisteredCallback; class EffectDispatchedMessage extends CustomType { constructor(message) { super(); this.message = message; } } var Message$EffectDispatchedMessage = (message) => new EffectDispatchedMessage(message); var Message$isEffectDispatchedMessage = (value2) => value2 instanceof EffectDispatchedMessage; class EffectEmitEvent extends CustomType { constructor(name, data2) { super(); this.name = name; this.data = data2; } } var Message$EffectEmitEvent = (name, data2) => new EffectEmitEvent(name, data2); var Message$isEffectEmitEvent = (value2) => value2 instanceof EffectEmitEvent; class EffectProvidedValue extends CustomType { constructor(key, value2) { super(); this.key = key; this.value = value2; } } var Message$EffectProvidedValue = (key, value2) => new EffectProvidedValue(key, value2); var Message$isEffectProvidedValue = (value2) => value2 instanceof EffectProvidedValue; class SystemRequestedShutdown extends CustomType { } var Message$isSystemRequestedShutdown = (value2) => value2 instanceof SystemRequestedShutdown; // build/dev/javascript/lustre/lustre/runtime/app.mjs class App extends CustomType { constructor(name, init, update2, view, config2) { super(); this.name = name; this.init = init; this.update = update2; this.view = view; this.config = config2; } } class Config2 extends CustomType { constructor(open_shadow_root, adopt_styles, delegates_focus, attributes, properties, contexts, is_form_associated, on_form_autofill, on_form_reset, on_form_restore, on_connect, on_adopt, on_disconnect) { super(); this.open_shadow_root = open_shadow_root; this.adopt_styles = adopt_styles; this.delegates_focus = delegates_focus; this.attributes = attributes; this.properties = properties; this.contexts = contexts; this.is_form_associated = is_form_associated; this.on_form_autofill = on_form_autofill; this.on_form_reset = on_form_reset; this.on_form_restore = on_form_restore; this.on_connect = on_connect; this.on_adopt = on_adopt; this.on_disconnect = on_disconnect; } } var default_config = /* @__PURE__ */ new Config2(true, true, false, empty_list, empty_list, empty_list, false, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None); // build/dev/javascript/lustre/lustre/internals/equals.ffi.mjs var isEqual2 = (a, b) => { if (a === b) { return true; } if (a == null || b == null) { return false; } const type = typeof a; if (type !== typeof b) { return false; } if (type !== "object") { return false; } const ctor = a.constructor; if (ctor !== b.constructor) { return false; } if (Array.isArray(a)) { return areArraysEqual(a, b); } return areObjectsEqual(a, b); }; var areArraysEqual = (a, b) => { let index4 = a.length; if (index4 !== b.length) { return false; } while (index4--) { if (!isEqual2(a[index4], b[index4])) { return false; } } return true; }; var areObjectsEqual = (a, b) => { const properties = Object.keys(a); let index4 = properties.length; if (Object.keys(b).length !== index4) { return false; } while (index4--) { const property3 = properties[index4]; if (!Object.hasOwn(b, property3)) { return false; } if (!isEqual2(a[property3], b[property3])) { return false; } } return true; }; // build/dev/javascript/lustre/lustre/vdom/diff.mjs class Diff extends CustomType { constructor(patch, cache) { super(); this.patch = patch; this.cache = cache; } } class PartialDiff extends CustomType { constructor(patch, cache, events2) { super(); this.patch = patch; this.cache = cache; this.events = events2; } } class AttributeChange extends CustomType { constructor(added, removed, events2) { super(); this.added = added; this.removed = removed; this.events = events2; } } function is_controlled(cache, namespace, tag, path) { if (tag === "input" && namespace === "") { return has_dispatched_events(cache, path); } else if (tag === "select" && namespace === "") { return has_dispatched_events(cache, path); } else if (tag === "textarea" && namespace === "") { return has_dispatched_events(cache, path); } else { return false; } } function diff_attributes(loop$controlled, loop$path, loop$events, loop$old, loop$new, loop$added, loop$removed) { while (true) { let controlled = loop$controlled; let path = loop$path; let events2 = loop$events; let old = loop$old; let new$5 = loop$new; let added = loop$added; let removed = loop$removed; if (old instanceof Empty) { if (new$5 instanceof Empty) { return new AttributeChange(added, removed, events2); } else { let $ = new$5.head; if ($ instanceof Event2) { let next = $; let new$1 = new$5.tail; let name = $.name; let handler = $.handler; let events$1 = add_event(events2, path, name, handler); let added$1 = prepend(next, added); loop$controlled = controlled; loop$path = path; loop$events = events$1; loop$old = old; loop$new = new$1; loop$added = added$1; loop$removed = removed; } else { let next = $; let new$1 = new$5.tail; let added$1 = prepend(next, added); loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = old; loop$new = new$1; loop$added = added$1; loop$removed = removed; } } } else if (new$5 instanceof Empty) { let $ = old.head; if ($ instanceof Event2) { let prev = $; let old$1 = old.tail; let name = $.name; let events$1 = remove_event(events2, path, name); let removed$1 = prepend(prev, removed); loop$controlled = controlled; loop$path = path; loop$events = events$1; loop$old = old$1; loop$new = new$5; loop$added = added; loop$removed = removed$1; } else { let prev = $; let old$1 = old.tail; let removed$1 = prepend(prev, removed); loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = old$1; loop$new = new$5; loop$added = added; loop$removed = removed$1; } } else { let prev = old.head; let remaining_old = old.tail; let next = new$5.head; let remaining_new = new$5.tail; let $ = compare3(prev, next); if ($ instanceof Lt) { if (prev instanceof Event2) { let name = prev.name; loop$controlled = controlled; loop$path = path; loop$events = remove_event(events2, path, name); loop$old = remaining_old; loop$new = new$5; loop$added = added; loop$removed = prepend(prev, removed); } else { loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = remaining_old; loop$new = new$5; loop$added = added; loop$removed = prepend(prev, removed); } } else if ($ instanceof Eq) { if (prev instanceof Attribute) { if (next instanceof Attribute) { let _block; let $1 = next.name; if ($1 === "value") { _block = controlled || prev.value !== next.value; } else if ($1 === "checked") { _block = controlled || prev.value !== next.value; } else if ($1 === "selected") { _block = controlled || prev.value !== next.value; } else { _block = prev.value !== next.value; } let has_changes = _block; let _block$1; if (has_changes) { _block$1 = prepend(next, added); } else { _block$1 = added; } let added$1 = _block$1; loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = remaining_old; loop$new = remaining_new; loop$added = added$1; loop$removed = removed; } else if (next instanceof Event2) { let name = next.name; let handler = next.handler; loop$controlled = controlled; loop$path = path; loop$events = add_event(events2, path, name, handler); loop$old = remaining_old; loop$new = remaining_new; loop$added = prepend(next, added); loop$removed = prepend(prev, removed); } else { loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = remaining_old; loop$new = remaining_new; loop$added = prepend(next, added); loop$removed = prepend(prev, removed); } } else if (prev instanceof Property) { if (next instanceof Property) { let _block; let $1 = next.name; if ($1 === "scrollLeft") { _block = true; } else if ($1 === "scrollRight") { _block = true; } else if ($1 === "value") { _block = controlled || !isEqual2(prev.value, next.value); } else if ($1 === "checked") { _block = controlled || !isEqual2(prev.value, next.value); } else if ($1 === "selected") { _block = controlled || !isEqual2(prev.value, next.value); } else { _block = !isEqual2(prev.value, next.value); } let has_changes = _block; let _block$1; if (has_changes) { _block$1 = prepend(next, added); } else { _block$1 = added; } let added$1 = _block$1; loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = remaining_old; loop$new = remaining_new; loop$added = added$1; loop$removed = removed; } else if (next instanceof Event2) { let name = next.name; let handler = next.handler; loop$controlled = controlled; loop$path = path; loop$events = add_event(events2, path, name, handler); loop$old = remaining_old; loop$new = remaining_new; loop$added = prepend(next, added); loop$removed = prepend(prev, removed); } else { loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = remaining_old; loop$new = remaining_new; loop$added = prepend(next, added); loop$removed = prepend(prev, removed); } } else if (next instanceof Event2) { let name = next.name; let handler = next.handler; let has_changes = prev.prevent_default.kind !== next.prevent_default.kind || prev.stop_propagation.kind !== next.stop_propagation.kind || prev.debounce !== next.debounce || prev.throttle !== next.throttle; let _block; if (has_changes) { _block = prepend(next, added); } else { _block = added; } let added$1 = _block; loop$controlled = controlled; loop$path = path; loop$events = add_event(events2, path, name, handler); loop$old = remaining_old; loop$new = remaining_new; loop$added = added$1; loop$removed = removed; } else { let name = prev.name; loop$controlled = controlled; loop$path = path; loop$events = remove_event(events2, path, name); loop$old = remaining_old; loop$new = remaining_new; loop$added = prepend(next, added); loop$removed = prepend(prev, removed); } } else if (next instanceof Event2) { let name = next.name; let handler = next.handler; loop$controlled = controlled; loop$path = path; loop$events = add_event(events2, path, name, handler); loop$old = old; loop$new = remaining_new; loop$added = prepend(next, added); loop$removed = removed; } else { loop$controlled = controlled; loop$path = path; loop$events = events2; loop$old = old; loop$new = remaining_new; loop$added = prepend(next, added); loop$removed = removed; } } } } function do_diff(loop$old, loop$old_keyed, loop$new, loop$new_keyed, loop$moved, loop$moved_offset, loop$removed, loop$node_index, loop$patch_index, loop$changes, loop$children, loop$path, loop$cache, loop$events) { while (true) { let old = loop$old; let old_keyed = loop$old_keyed; let new$5 = loop$new; let new_keyed = loop$new_keyed; let moved = loop$moved; let moved_offset = loop$moved_offset; let removed = loop$removed; let node_index = loop$node_index; let patch_index = loop$patch_index; let changes = loop$changes; let children = loop$children; let path = loop$path; let cache = loop$cache; let events2 = loop$events; if (old instanceof Empty) { if (new$5 instanceof Empty) { let patch = new Patch2(patch_index, removed, changes, children); return new PartialDiff(patch, cache, events2); } else { let $ = add_children(cache, events2, path, node_index, new$5); let cache$1; let events$1; cache$1 = $[0]; events$1 = $[1]; let insert4 = insert3(new$5, node_index - moved_offset); let changes$1 = prepend(insert4, changes); let patch = new Patch2(patch_index, removed, changes$1, children); return new PartialDiff(patch, cache$1, events$1); } } else if (new$5 instanceof Empty) { let prev = old.head; let old$1 = old.tail; let _block; let $ = prev.key === "" || !has_key(moved, prev.key); if ($) { _block = removed + 1; } else { _block = removed; } let removed$1 = _block; let events$1 = remove_child(cache, events2, path, node_index, prev); loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$5; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed$1; loop$node_index = node_index; loop$patch_index = patch_index; loop$changes = changes; loop$children = children; loop$path = path; loop$cache = cache; loop$events = events$1; } else { let prev = old.head; let next = new$5.head; if (prev.key !== next.key) { let old_remaining = old.tail; let new_remaining = new$5.tail; let next_did_exist = has_key(old_keyed, next.key); let prev_does_exist = has_key(new_keyed, prev.key); if (prev_does_exist) { if (next_did_exist) { let $ = has_key(moved, prev.key); if ($) { loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new$5; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset - 1; loop$removed = removed; loop$node_index = node_index; loop$patch_index = patch_index; loop$changes = changes; loop$children = children; loop$path = path; loop$cache = cache; loop$events = events2; } else { let match = get2(old_keyed, next.key); let before = node_index - moved_offset; let changes$1 = prepend(move(next.key, before), changes); let moved$1 = insert2(moved, next.key, undefined); loop$old = prepend(match, old); loop$old_keyed = old_keyed; loop$new = new$5; loop$new_keyed = new_keyed; loop$moved = moved$1; loop$moved_offset = moved_offset + 1; loop$removed = removed; loop$node_index = node_index; loop$patch_index = patch_index; loop$changes = changes$1; loop$children = children; loop$path = path; loop$cache = cache; loop$events = events2; } } else { let before = node_index - moved_offset; let $ = add_child(cache, events2, path, node_index, next); let cache$1; let events$1; cache$1 = $[0]; events$1 = $[1]; let insert4 = insert3(toList([next]), before); let changes$1 = prepend(insert4, changes); loop$old = old; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset + 1; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes$1; loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else if (next_did_exist) { let index4 = node_index - moved_offset; let changes$1 = prepend(remove2(index4), changes); let events$1 = remove_child(cache, events2, path, node_index, prev); loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new$5; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset - 1; loop$removed = removed; loop$node_index = node_index; loop$patch_index = patch_index; loop$changes = changes$1; loop$children = children; loop$path = path; loop$cache = cache; loop$events = events$1; } else { let change = replace2(node_index - moved_offset, next); let $ = replace_child(cache, events2, path, node_index, prev, next); let cache$1; let events$1; cache$1 = $[0]; events$1 = $[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else { let $ = old.head; if ($ instanceof Fragment) { let $1 = new$5.head; if ($1 instanceof Fragment) { let prev2 = $; let old$1 = old.tail; let next2 = $1; let new$1 = new$5.tail; let $2 = do_diff(prev2.children, prev2.keyed_children, next2.children, next2.keyed_children, empty2(), 0, 0, 0, node_index, empty_list, empty_list, add2(path, node_index, next2.key), cache, events2); let patch; let cache$1; let events$1; patch = $2.patch; cache$1 = $2.cache; events$1 = $2.events; let _block; let $3 = patch.changes; if ($3 instanceof Empty) { let $4 = patch.children; if ($4 instanceof Empty) { let $5 = patch.removed; if ($5 === 0) { _block = children; } else { _block = prepend(patch, children); } } else { _block = prepend(patch, children); } } else { _block = prepend(patch, children); } let children$1 = _block; loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$1; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes; loop$children = children$1; loop$path = path; loop$cache = cache$1; loop$events = events$1; } else { let prev2 = $; let old_remaining = old.tail; let next2 = $1; let new_remaining = new$5.tail; let change = replace2(node_index - moved_offset, next2); let $2 = replace_child(cache, events2, path, node_index, prev2, next2); let cache$1; let events$1; cache$1 = $2[0]; events$1 = $2[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else if ($ instanceof Element) { let $1 = new$5.head; if ($1 instanceof Element) { let prev2 = $; let next2 = $1; if (prev2.namespace === next2.namespace && prev2.tag === next2.tag) { let old$1 = old.tail; let new$1 = new$5.tail; let child_path = add2(path, node_index, next2.key); let controlled = is_controlled(cache, next2.namespace, next2.tag, child_path); let $2 = diff_attributes(controlled, child_path, events2, prev2.attributes, next2.attributes, empty_list, empty_list); let added_attrs; let removed_attrs; let events$1; added_attrs = $2.added; removed_attrs = $2.removed; events$1 = $2.events; let _block; if (added_attrs instanceof Empty && removed_attrs instanceof Empty) { _block = empty_list; } else { _block = toList([update(added_attrs, removed_attrs)]); } let initial_child_changes = _block; let $3 = do_diff(prev2.children, prev2.keyed_children, next2.children, next2.keyed_children, empty2(), 0, 0, 0, node_index, initial_child_changes, empty_list, child_path, cache, events$1); let patch; let cache$1; let events$2; patch = $3.patch; cache$1 = $3.cache; events$2 = $3.events; let _block$1; let $4 = patch.changes; if ($4 instanceof Empty) { let $5 = patch.children; if ($5 instanceof Empty) { let $6 = patch.removed; if ($6 === 0) { _block$1 = children; } else { _block$1 = prepend(patch, children); } } else { _block$1 = prepend(patch, children); } } else { _block$1 = prepend(patch, children); } let children$1 = _block$1; loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$1; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes; loop$children = children$1; loop$path = path; loop$cache = cache$1; loop$events = events$2; } else { let prev3 = $; let old_remaining = old.tail; let next3 = $1; let new_remaining = new$5.tail; let change = replace2(node_index - moved_offset, next3); let $2 = replace_child(cache, events2, path, node_index, prev3, next3); let cache$1; let events$1; cache$1 = $2[0]; events$1 = $2[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else { let prev2 = $; let old_remaining = old.tail; let next2 = $1; let new_remaining = new$5.tail; let change = replace2(node_index - moved_offset, next2); let $2 = replace_child(cache, events2, path, node_index, prev2, next2); let cache$1; let events$1; cache$1 = $2[0]; events$1 = $2[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else if ($ instanceof Text) { let $1 = new$5.head; if ($1 instanceof Text) { let prev2 = $; let next2 = $1; if (prev2.content === next2.content) { let old$1 = old.tail; let new$1 = new$5.tail; loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$1; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes; loop$children = children; loop$path = path; loop$cache = cache; loop$events = events2; } else { let old$1 = old.tail; let next3 = $1; let new$1 = new$5.tail; let child2 = new$3(node_index, 0, toList([replace_text(next3.content)]), empty_list); loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$1; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes; loop$children = prepend(child2, children); loop$path = path; loop$cache = cache; loop$events = events2; } } else { let prev2 = $; let old_remaining = old.tail; let next2 = $1; let new_remaining = new$5.tail; let change = replace2(node_index - moved_offset, next2); let $2 = replace_child(cache, events2, path, node_index, prev2, next2); let cache$1; let events$1; cache$1 = $2[0]; events$1 = $2[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else if ($ instanceof UnsafeInnerHtml) { let $1 = new$5.head; if ($1 instanceof UnsafeInnerHtml) { let prev2 = $; let old$1 = old.tail; let next2 = $1; let new$1 = new$5.tail; let child_path = add2(path, node_index, next2.key); let $2 = diff_attributes(false, child_path, events2, prev2.attributes, next2.attributes, empty_list, empty_list); let added_attrs; let removed_attrs; let events$1; added_attrs = $2.added; removed_attrs = $2.removed; events$1 = $2.events; let _block; if (added_attrs instanceof Empty && removed_attrs instanceof Empty) { _block = empty_list; } else { _block = toList([update(added_attrs, removed_attrs)]); } let child_changes = _block; let _block$1; let $3 = prev2.inner_html === next2.inner_html; if ($3) { _block$1 = child_changes; } else { _block$1 = prepend(replace_inner_html(next2.inner_html), child_changes); } let child_changes$1 = _block$1; let _block$2; if (child_changes$1 instanceof Empty) { _block$2 = children; } else { _block$2 = prepend(new$3(node_index, 0, child_changes$1, toList([])), children); } let children$1 = _block$2; loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$1; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes; loop$children = children$1; loop$path = path; loop$cache = cache; loop$events = events$1; } else { let prev2 = $; let old_remaining = old.tail; let next2 = $1; let new_remaining = new$5.tail; let change = replace2(node_index - moved_offset, next2); let $2 = replace_child(cache, events2, path, node_index, prev2, next2); let cache$1; let events$1; cache$1 = $2[0]; events$1 = $2[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else if ($ instanceof Map2) { let $1 = new$5.head; if ($1 instanceof Map2) { let prev2 = $; let old$1 = old.tail; let next2 = $1; let new$1 = new$5.tail; let child_path = add2(path, node_index, next2.key); let child_key = child(child_path); let $2 = do_diff(prepend(prev2.child, empty_list), empty2(), prepend(next2.child, empty_list), empty2(), empty2(), 0, 0, 0, node_index, empty_list, empty_list, subtree(child_path), cache, get_subtree(events2, child_key, prev2.mapper)); let patch; let cache$1; let child_events; patch = $2.patch; cache$1 = $2.cache; child_events = $2.events; let events$1 = update_subtree(events2, child_key, next2.mapper, child_events); let _block; let $3 = patch.changes; if ($3 instanceof Empty) { let $4 = patch.children; if ($4 instanceof Empty) { let $5 = patch.removed; if ($5 === 0) { _block = children; } else { _block = prepend(patch, children); } } else { _block = prepend(patch, children); } } else { _block = prepend(patch, children); } let children$1 = _block; loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$1; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes; loop$children = children$1; loop$path = path; loop$cache = cache$1; loop$events = events$1; } else { let prev2 = $; let old_remaining = old.tail; let next2 = $1; let new_remaining = new$5.tail; let change = replace2(node_index - moved_offset, next2); let $2 = replace_child(cache, events2, path, node_index, prev2, next2); let cache$1; let events$1; cache$1 = $2[0]; events$1 = $2[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } else { let $1 = new$5.head; if ($1 instanceof Memo) { let prev2 = $; let old$1 = old.tail; let next2 = $1; let new$1 = new$5.tail; let $2 = equal_lists(prev2.dependencies, next2.dependencies); if ($2) { let cache$1 = keep_memo(cache, prev2.view, next2.view); loop$old = old$1; loop$old_keyed = old_keyed; loop$new = new$1; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = changes; loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events2; } else { let prev_node = get_old_memo(cache, prev2.view, prev2.view); let next_node = next2.view(); let cache$1 = add_memo(cache, next2.view, next_node); loop$old = prepend(prev_node, old$1); loop$old_keyed = old_keyed; loop$new = prepend(next_node, new$1); loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index; loop$patch_index = patch_index; loop$changes = changes; loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events2; } } else { let prev2 = $; let old_remaining = old.tail; let next2 = $1; let new_remaining = new$5.tail; let change = replace2(node_index - moved_offset, next2); let $2 = replace_child(cache, events2, path, node_index, prev2, next2); let cache$1; let events$1; cache$1 = $2[0]; events$1 = $2[1]; loop$old = old_remaining; loop$old_keyed = old_keyed; loop$new = new_remaining; loop$new_keyed = new_keyed; loop$moved = moved; loop$moved_offset = moved_offset; loop$removed = removed; loop$node_index = node_index + 1; loop$patch_index = patch_index; loop$changes = prepend(change, changes); loop$children = children; loop$path = path; loop$cache = cache$1; loop$events = events$1; } } } } } } function diff(cache, old, new$5) { let cache$1 = tick(cache); let $ = do_diff(prepend(old, empty_list), empty2(), prepend(new$5, empty_list), empty2(), empty2(), 0, 0, 0, 0, empty_list, empty_list, root, cache$1, events(cache$1)); let patch; let cache$2; let events2; patch = $.patch; cache$2 = $.cache; events2 = $.events; return new Diff(patch, update_events(cache$2, events2)); } // build/dev/javascript/lustre/lustre/internals/list.ffi.mjs var toList2 = (arr) => arr.reduceRight((xs, x) => List$NonEmpty(x, xs), empty_list); var iterate = (list4, callback) => { if (Array.isArray(list4)) { for (let i = 0;i < list4.length; i++) { callback(list4[i]); } } else if (list4) { for (list4;List$NonEmpty$rest(list4); list4 = List$NonEmpty$rest(list4)) { callback(List$NonEmpty$first(list4)); } } }; var append4 = (a, b) => { if (!List$NonEmpty$rest(a)) { return b; } else if (!List$NonEmpty$rest(b)) { return a; } else { return append2(a, b); } }; // build/dev/javascript/lustre/lustre/internals/constants.ffi.mjs var NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; var ELEMENT_NODE = 1; var TEXT_NODE = 3; var COMMENT_NODE = 8; var SUPPORTS_MOVE_BEFORE = !!globalThis.HTMLElement?.prototype?.moveBefore; // build/dev/javascript/lustre/lustre/vdom/reconciler.ffi.mjs var setTimeout = globalThis.setTimeout; var clearTimeout = globalThis.clearTimeout; var createElementNS = (ns, name) => globalThis.document.createElementNS(ns, name); var createTextNode = (data2) => globalThis.document.createTextNode(data2); var createComment = (data2) => globalThis.document.createComment(data2); var createDocumentFragment = () => globalThis.document.createDocumentFragment(); var insertBefore = (parent, node, reference) => parent.insertBefore(node, reference); var moveBefore = SUPPORTS_MOVE_BEFORE ? (parent, node, reference) => parent.moveBefore(node, reference) : insertBefore; var removeChild = (parent, child2) => parent.removeChild(child2); var getAttribute = (node, name) => node.getAttribute(name); var setAttribute = (node, name, value2) => node.setAttribute(name, value2); var removeAttribute = (node, name) => node.removeAttribute(name); var addEventListener = (node, name, handler, options) => node.addEventListener(name, handler, options); var removeEventListener = (node, name, handler) => node.removeEventListener(name, handler); var setInnerHtml = (node, innerHtml) => node.innerHTML = innerHtml; var setData = (node, data2) => node.data = data2; var meta = Symbol("lustre"); class MetadataNode { constructor(kind, parent, node, key) { this.kind = kind; this.key = key; this.parent = parent; this.children = []; this.node = node; this.endNode = null; this.handlers = new Map; this.throttles = new Map; this.debouncers = new Map; } get isVirtual() { return this.kind === fragment_kind || this.kind === map_kind; } get parentNode() { return this.isVirtual ? this.node.parentNode : this.node; } } var insertMetadataChild = (kind, parent, node, index4, key) => { const child2 = new MetadataNode(kind, parent, node, key); node[meta] = child2; parent?.children.splice(index4, 0, child2); return child2; }; var getPath = (node) => { let path = ""; for (let current = node[meta];current.parent; current = current.parent) { const separator = current.parent && current.parent.kind === map_kind ? separator_subtree : separator_element; if (current.key) { path = `${separator}${current.key}${path}`; } else { const index4 = current.parent.children.indexOf(current); path = `${separator}${index4}${path}`; } } return path.slice(1); }; class Reconciler { #root = null; #decodeEvent; #dispatch; #debug = false; constructor(root2, decodeEvent, dispatch2, { debug = false } = {}) { this.#root = root2; this.#decodeEvent = decodeEvent; this.#dispatch = dispatch2; this.#debug = debug; } mount(vdom) { insertMetadataChild(element_kind, null, this.#root, 0, null); this.#insertChild(this.#root, null, this.#root[meta], 0, vdom); } push(patch, memos2 = null) { this.#memos = memos2; this.#stack.push({ node: this.#root[meta], patch }); this.#reconcile(); } #memos; #stack = []; #reconcile() { const stack = this.#stack; while (stack.length) { const { node, patch } = stack.pop(); const { children: childNodes } = node; const { changes, removed, children: childPatches } = patch; iterate(changes, (change) => this.#patch(node, change)); if (removed) { this.#removeChildren(node, childNodes.length - removed, removed); } iterate(childPatches, (childPatch) => { const child2 = childNodes[childPatch.index | 0]; this.#stack.push({ node: child2, patch: childPatch }); }); } } #patch(node, change) { switch (change.kind) { case replace_text_kind: this.#replaceText(node, change); break; case replace_inner_html_kind: this.#replaceInnerHtml(node, change); break; case update_kind: this.#update(node, change); break; case move_kind: this.#move(node, change); break; case remove_kind: this.#remove(node, change); break; case replace_kind: this.#replace(node, change); break; case insert_kind: this.#insert(node, change); break; } } #insert(parent, { children, before }) { const fragment2 = createDocumentFragment(); const beforeEl = this.#getReference(parent, before); this.#insertChildren(fragment2, null, parent, before | 0, children); insertBefore(parent.parentNode, fragment2, beforeEl); } #replace(parent, { index: index4, with: child2 }) { this.#removeChildren(parent, index4 | 0, 1); const beforeEl = this.#getReference(parent, index4); this.#insertChild(parent.parentNode, beforeEl, parent, index4 | 0, child2); } #getReference(node, index4) { index4 = index4 | 0; const { children } = node; const childCount = children.length; if (index4 < childCount) return children[index4].node; if (node.endNode) return node.endNode; if (!node.isVirtual) return null; while (node.isVirtual && node.children.length) { if (node.endNode) return node.endNode.nextSibling; node = node.children[node.children.length - 1]; } return node.node.nextSibling; } #move(parent, { key, before }) { before = before | 0; const { children, parentNode } = parent; const beforeEl = children[before].node; let prev = children[before]; for (let i = before + 1;i < children.length; ++i) { const next = children[i]; children[i] = prev; prev = next; if (next.key === key) { children[before] = next; break; } } this.#moveChild(parentNode, prev, beforeEl); } #moveChildren(domParent, children, beforeEl) { for (let i = 0;i < children.length; ++i) { this.#moveChild(domParent, children[i], beforeEl); } } #moveChild(domParent, child2, beforeEl) { moveBefore(domParent, child2.node, beforeEl); if (child2.isVirtual) { this.#moveChildren(domParent, child2.children, beforeEl); } if (child2.endNode) { moveBefore(domParent, child2.endNode, beforeEl); } } #remove(parent, { index: index4 }) { this.#removeChildren(parent, index4, 1); } #removeChildren(parent, index4, count) { const { children, parentNode } = parent; const deleted = children.splice(index4, count); for (let i = 0;i < deleted.length; ++i) { const child2 = deleted[i]; const { node, endNode, isVirtual, children: nestedChildren } = child2; removeChild(parentNode, node); if (endNode) { removeChild(parentNode, endNode); } this.#removeDebouncers(child2); if (isVirtual) { deleted.push(...nestedChildren); } } } #removeDebouncers(node) { const { debouncers, children } = node; for (const { timeout } of debouncers.values()) { if (timeout) { clearTimeout(timeout); } } debouncers.clear(); iterate(children, (child2) => this.#removeDebouncers(child2)); } #update({ node, handlers, throttles, debouncers }, { added, removed }) { iterate(removed, ({ name }) => { if (handlers.delete(name)) { removeEventListener(node, name, handleEvent); this.#updateDebounceThrottle(throttles, name, 0); this.#updateDebounceThrottle(debouncers, name, 0); } else { removeAttribute(node, name); SYNCED_ATTRIBUTES[name]?.removed?.(node, name); } }); iterate(added, (attribute3) => this.#createAttribute(node, attribute3)); } #replaceText({ node }, { content }) { setData(node, content ?? ""); } #replaceInnerHtml({ node }, { inner_html }) { setInnerHtml(node, inner_html ?? ""); } #insertChildren(domParent, beforeEl, metaParent, index4, children) { iterate(children, (child2) => this.#insertChild(domParent, beforeEl, metaParent, index4++, child2)); } #insertChild(domParent, beforeEl, metaParent, index4, vnode) { switch (vnode.kind) { case element_kind: { const node = this.#createElement(metaParent, index4, vnode); this.#insertChildren(node, null, node[meta], 0, vnode.children); insertBefore(domParent, node, beforeEl); break; } case text_kind: { const node = this.#createTextNode(metaParent, index4, vnode); insertBefore(domParent, node, beforeEl); break; } case fragment_kind: { const marker = "lustre:fragment"; const head = this.#createHead(marker, metaParent, index4, vnode); insertBefore(domParent, head, beforeEl); this.#insertChildren(domParent, beforeEl, head[meta], 0, vnode.children); if (this.#debug) { head[meta].endNode = createComment(` /${marker} `); insertBefore(domParent, head[meta].endNode, beforeEl); } break; } case unsafe_inner_html_kind: { const node = this.#createElement(metaParent, index4, vnode); this.#replaceInnerHtml({ node }, vnode); insertBefore(domParent, node, beforeEl); break; } case map_kind: { const head = this.#createHead("lustre:map", metaParent, index4, vnode); insertBefore(domParent, head, beforeEl); this.#insertChild(domParent, beforeEl, head[meta], 0, vnode.child); break; } case memo_kind: { const child2 = this.#memos?.get(vnode.view) ?? vnode.view(); this.#insertChild(domParent, beforeEl, metaParent, index4, child2); break; } } } #createElement(parent, index4, { kind, key, tag, namespace, attributes }) { const node = createElementNS(namespace || NAMESPACE_HTML, tag); insertMetadataChild(kind, parent, node, index4, key); if (this.#debug && key) { setAttribute(node, "data-lustre-key", key); } iterate(attributes, (attribute3) => this.#createAttribute(node, attribute3)); return node; } #createTextNode(parent, index4, { kind, key, content }) { const node = createTextNode(content ?? ""); insertMetadataChild(kind, parent, node, index4, key); return node; } #createHead(marker, parent, index4, { kind, key }) { const node = this.#debug ? createComment(markerComment(marker, key)) : createTextNode(""); insertMetadataChild(kind, parent, node, index4, key); return node; } #createAttribute(node, attribute3) { const { debouncers, handlers, throttles } = node[meta]; const { kind, name, value: value2, prevent_default: prevent, debounce: debounceDelay, throttle: throttleDelay } = attribute3; switch (kind) { case attribute_kind: { const valueOrDefault = value2 ?? ""; if (name === "virtual:defaultValue") { node.defaultValue = valueOrDefault; return; } else if (name === "virtual:defaultChecked") { node.defaultChecked = true; return; } else if (name === "virtual:defaultSelected") { node.defaultSelected = true; return; } if (valueOrDefault !== getAttribute(node, name)) { setAttribute(node, name, valueOrDefault); } SYNCED_ATTRIBUTES[name]?.added?.(node, valueOrDefault); break; } case property_kind: node[name] = value2; break; case event_kind: { if (handlers.has(name)) { removeEventListener(node, name, handleEvent); } const passive = prevent.kind === never_kind; addEventListener(node, name, handleEvent, { passive }); this.#updateDebounceThrottle(throttles, name, throttleDelay); this.#updateDebounceThrottle(debouncers, name, debounceDelay); handlers.set(name, (event3) => this.#handleEvent(attribute3, event3)); break; } } } #updateDebounceThrottle(map8, name, delay) { const debounceOrThrottle = map8.get(name); if (delay > 0) { if (debounceOrThrottle) { debounceOrThrottle.delay = delay; } else { map8.set(name, { delay }); } } else if (debounceOrThrottle) { const { timeout } = debounceOrThrottle; if (timeout) { clearTimeout(timeout); } map8.delete(name); } } #handleEvent(attribute3, event3) { const { currentTarget, type } = event3; const { debouncers, throttles } = currentTarget[meta]; const path = getPath(currentTarget); const { prevent_default: prevent, stop_propagation: stop, include } = attribute3; if (prevent.kind === always_kind) event3.preventDefault(); if (stop.kind === always_kind) event3.stopPropagation(); if (type === "submit") { event3.detail ??= {}; event3.detail.formData = [ ...new FormData(event3.target, event3.submitter).entries() ]; } const data2 = this.#decodeEvent(event3, path, type, include); const throttle = throttles.get(type); if (throttle) { const now = Date.now(); const last = throttle.last || 0; if (now > last + throttle.delay) { throttle.last = now; throttle.lastEvent = event3; this.#dispatch(event3, data2); } } const debounce = debouncers.get(type); if (debounce) { clearTimeout(debounce.timeout); debounce.timeout = setTimeout(() => { if (event3 === throttles.get(type)?.lastEvent) return; this.#dispatch(event3, data2); }, debounce.delay); } if (!throttle && !debounce) { this.#dispatch(event3, data2); } } } var markerComment = (marker, key) => { if (key) { return ` ${marker} key="${escape2(key)}" `; } else { return ` ${marker} `; } }; var handleEvent = (event3) => { const { currentTarget, type } = event3; const handler = currentTarget[meta].handlers.get(type); handler(event3); }; var syncedBooleanAttribute = (name) => { return { added(node) { node[name] = true; }, removed(node) { node[name] = false; } }; }; var syncedAttribute = (name) => { return { added(node, value2) { node[name] = value2; } }; }; var SYNCED_ATTRIBUTES = { checked: syncedBooleanAttribute("checked"), selected: syncedBooleanAttribute("selected"), value: syncedAttribute("value"), autofocus: { added(node) { queueMicrotask(() => { node.focus?.(); }); } }, autoplay: { added(node) { try { node.play?.(); } catch (e) { console.error(e); } } } }; // build/dev/javascript/lustre/lustre/element/keyed.mjs function do_extract_keyed_children(loop$key_children_pairs, loop$keyed_children, loop$children) { while (true) { let key_children_pairs = loop$key_children_pairs; let keyed_children = loop$keyed_children; let children = loop$children; if (key_children_pairs instanceof Empty) { return [keyed_children, reverse(children)]; } else { let rest = key_children_pairs.tail; let key = key_children_pairs.head[0]; let element$1 = key_children_pairs.head[1]; let keyed_element = to_keyed(key, element$1); let _block; if (key === "") { _block = keyed_children; } else { _block = insert2(keyed_children, key, keyed_element); } let keyed_children$1 = _block; let children$1 = prepend(keyed_element, children); loop$key_children_pairs = rest; loop$keyed_children = keyed_children$1; loop$children = children$1; } } } function extract_keyed_children(children) { return do_extract_keyed_children(children, empty2(), empty_list); } function element3(tag, attributes, children) { let $ = extract_keyed_children(children); let keyed_children; let children$1; keyed_children = $[0]; children$1 = $[1]; return element("", "", tag, attributes, children$1, keyed_children, false, is_void_html_element(tag, "")); } function namespaced2(namespace, tag, attributes, children) { let $ = extract_keyed_children(children); let keyed_children; let children$1; keyed_children = $[0]; children$1 = $[1]; return element("", namespace, tag, attributes, children$1, keyed_children, false, is_void_html_element(tag, namespace)); } function fragment2(children) { let $ = extract_keyed_children(children); let keyed_children; let children$1; keyed_children = $[0]; children$1 = $[1]; return fragment("", children$1, keyed_children); } // build/dev/javascript/lustre/lustre/vdom/virtualise.ffi.mjs var virtualise = (root2) => { const rootMeta = insertMetadataChild(element_kind, null, root2, 0, null); for (let child2 = root2.firstChild;child2; child2 = child2.nextSibling) { const result = virtualiseChild(rootMeta, root2, child2, 0); if (result) return result.vnode; } const placeholder2 = globalThis.document.createTextNode(""); insertMetadataChild(text_kind, rootMeta, placeholder2, 0, null); root2.insertBefore(placeholder2, root2.firstChild); return none2(); }; var virtualiseChild = (meta2, domParent, child2, index4) => { if (child2.nodeType === COMMENT_NODE) { const data2 = child2.data.trim(); if (data2.startsWith("lustre:fragment")) { return virtualiseFragment(meta2, domParent, child2, index4); } if (data2.startsWith("lustre:map")) { return virtualiseMap(meta2, domParent, child2, index4); } if (data2.startsWith("lustre:memo")) { return virtualiseMemo(meta2, domParent, child2, index4); } return null; } if (child2.nodeType === ELEMENT_NODE) { return virtualiseElement(meta2, child2, index4); } if (child2.nodeType === TEXT_NODE) { return virtualiseText(meta2, child2, index4); } return null; }; var virtualiseElement = (metaParent, node, index4) => { const key = node.getAttribute("data-lustre-key") ?? ""; if (key) { node.removeAttribute("data-lustre-key"); } const meta2 = insertMetadataChild(element_kind, metaParent, node, index4, key); const tag = node.localName; const namespace = node.namespaceURI; const isHtmlElement = !namespace || namespace === NAMESPACE_HTML; if (isHtmlElement && INPUT_ELEMENTS.includes(tag)) { virtualiseInputEvents(tag, node); } const attributes = virtualiseAttributes(node); const children = []; for (let childNode = node.firstChild;childNode; ) { const child2 = virtualiseChild(meta2, node, childNode, children.length); if (child2) { children.push([child2.key, child2.vnode]); childNode = child2.next; } else { childNode = childNode.nextSibling; } } const vnode = isHtmlElement ? element3(tag, attributes, toList3(children)) : namespaced2(namespace, tag, attributes, toList3(children)); return childResult(key, vnode, node.nextSibling); }; var virtualiseText = (meta2, node, index4) => { insertMetadataChild(text_kind, meta2, node, index4, null); return childResult("", text2(node.data), node.nextSibling); }; var virtualiseFragment = (metaParent, domParent, node, index4) => { const key = parseKey(node.data); const meta2 = insertMetadataChild(fragment_kind, metaParent, node, index4, key); const children = []; node = node.nextSibling; while (node && (node.nodeType !== COMMENT_NODE || node.data.trim() !== "/lustre:fragment")) { const child2 = virtualiseChild(meta2, domParent, node, children.length); if (child2) { children.push([child2.key, child2.vnode]); node = child2.next; } else { node = node.nextSibling; } } meta2.endNode = node; const vnode = fragment2(toList3(children)); return childResult(key, vnode, node?.nextSibling); }; var virtualiseMap = (metaParent, domParent, node, index4) => { const key = parseKey(node.data); const meta2 = insertMetadataChild(map_kind, metaParent, node, index4, key); const child2 = virtualiseNextChild(meta2, domParent, node, 0); if (!child2) return null; const vnode = map7(child2.vnode, (x) => x); return childResult(key, vnode, child2.next); }; var virtualiseMemo = (meta2, domParent, node, index4) => { const key = parseKey(node.data); const child2 = virtualiseNextChild(meta2, domParent, node, index4); if (!child2) return null; domParent.removeChild(node); const vnode = memo2(toList3([ref({})]), () => child2.vnode); return childResult(key, vnode, child2.next); }; var virtualiseNextChild = (meta2, domParent, node, index4) => { while (true) { node = node.nextSibling; if (!node) return null; const child2 = virtualiseChild(meta2, domParent, node, index4); if (child2) return child2; } }; var childResult = (key, vnode, next) => { return { key, vnode, next }; }; var virtualiseAttributes = (node) => { const attributes = []; for (let i = 0;i < node.attributes.length; i++) { const attr = node.attributes[i]; if (attr.name !== "xmlns") { attributes.push(attribute2(attr.localName, attr.value)); } } return toList3(attributes); }; var INPUT_ELEMENTS = ["input", "select", "textarea"]; var virtualiseInputEvents = (tag, node) => { const value2 = node.value; const checked = node.checked; if (tag === "input" && node.type === "checkbox" && !checked) return; if (tag === "input" && node.type === "radio" && !checked) return; if (node.type !== "checkbox" && node.type !== "radio" && !value2) return; queueMicrotask(() => { node.value = value2; node.checked = checked; node.dispatchEvent(new Event("input", { bubbles: true })); node.dispatchEvent(new Event("change", { bubbles: true })); if (globalThis.document.activeElement !== node) { node.dispatchEvent(new Event("blur", { bubbles: true })); } }); }; var parseKey = (data2) => { const keyMatch = data2.match(/key="([^"]*)"/); if (!keyMatch) return ""; return unescapeKey(keyMatch[1]); }; var unescapeKey = (key) => { return key.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/&/g, "&").replace(/'/g, "'"); }; var toList3 = (arr) => arr.reduceRight((xs, x) => List$NonEmpty(x, xs), empty_list); // build/dev/javascript/lustre/lustre/runtime/client/runtime.ffi.mjs var is_browser = () => !!globalThis.document; class Runtime { constructor(root2, [model, effects], view, update2, options) { this.root = root2; this.#model = model; this.#view = view; this.#update = update2; this.root.addEventListener("context-request", (event3) => { if (!(event3.context && event3.callback)) return; if (!this.#contexts.has(event3.context)) return; event3.stopImmediatePropagation(); const context = this.#contexts.get(event3.context); if (event3.subscribe) { const unsubscribe = () => { context.subscribers = context.subscribers.filter((subscriber) => subscriber !== event3.callback); }; context.subscribers.push([event3.callback, unsubscribe]); event3.callback(context.value, unsubscribe); } else { event3.callback(context.value); } }); const decodeEvent = (event3, path, name) => decode2(this.#cache, path, name, event3); const dispatch2 = (event3, data2) => { const [cache, result] = dispatch(this.#cache, data2); this.#cache = cache; if (Result$isOk(result)) { const handler = Result$Ok$0(result); if (handler.stop_propagation) event3.stopPropagation(); if (handler.prevent_default) event3.preventDefault(); this.dispatch(handler.message, false); } }; this.#reconciler = new Reconciler(this.root, decodeEvent, dispatch2, options); this.#vdom = virtualise(this.root); this.#cache = new$4(); this.#handleEffects(effects); this.#render(); } root = null; dispatch(msg, shouldFlush = false) { if (this.#shouldQueue) { this.#queue.push(msg); } else { const [model, effects] = this.#update(this.#model, msg); this.#model = model; this.#tick(effects, shouldFlush); } } emit(event3, data2) { const target = this.root.host ?? this.root; target.dispatchEvent(new CustomEvent(event3, { detail: data2, bubbles: true, composed: true })); } provide(key, value2) { if (!this.#contexts.has(key)) { this.#contexts.set(key, { value: value2, subscribers: [] }); } else { const context = this.#contexts.get(key); if (isEqual2(context.value, value2)) { return; } context.value = value2; for (let i = context.subscribers.length - 1;i >= 0; i--) { const [subscriber, unsubscribe] = context.subscribers[i]; if (!subscriber) { context.subscribers.splice(i, 1); continue; } subscriber(value2, unsubscribe); } } } #model; #view; #update; #vdom; #cache; #reconciler; #contexts = new Map; #shouldQueue = false; #queue = []; #beforePaint = empty_list; #afterPaint = empty_list; #renderTimer = null; #actions = { dispatch: (msg) => this.dispatch(msg), emit: (event3, data2) => this.emit(event3, data2), select: () => {}, root: () => this.root, provide: (key, value2) => this.provide(key, value2) }; #tick(effects, shouldFlush = false) { this.#handleEffects(effects); if (!this.#renderTimer) { if (shouldFlush) { this.#renderTimer = "sync"; queueMicrotask(() => this.#render()); } else { this.#renderTimer = window.requestAnimationFrame(() => this.#render()); } } } #handleEffects(effects) { this.#shouldQueue = true; while (true) { iterate(effects.synchronous, (effect) => effect(this.#actions)); this.#beforePaint = append4(this.#beforePaint, effects.before_paint); this.#afterPaint = append4(this.#afterPaint, effects.after_paint); if (!this.#queue.length) break; const msg = this.#queue.shift(); [this.#model, effects] = this.#update(this.#model, msg); } this.#shouldQueue = false; } #render() { this.#renderTimer = null; const next = this.#view(this.#model); const { patch, cache } = diff(this.#cache, this.#vdom, next); this.#cache = cache; this.#vdom = next; this.#reconciler.push(patch, memos(cache)); if (List$isNonEmpty(this.#beforePaint)) { const effects = makeEffect(this.#beforePaint); this.#beforePaint = empty_list; queueMicrotask(() => { this.#tick(effects, true); }); } if (List$isNonEmpty(this.#afterPaint)) { const effects = makeEffect(this.#afterPaint); this.#afterPaint = empty_list; window.requestAnimationFrame(() => this.#tick(effects, true)); } } } function makeEffect(synchronous) { return { synchronous, after_paint: empty_list, before_paint: empty_list }; } var copiedStyleSheets = new WeakMap; // build/dev/javascript/lustre/lustre/runtime/client/spa.ffi.mjs class Spa { #runtime; constructor(root2, [init, effects], update2, view) { this.#runtime = new Runtime(root2, [init, effects], view, update2); } send(message) { if (Message$isEffectDispatchedMessage(message)) { this.dispatch(message.message, false); } else if (Message$isEffectEmitEvent(message)) { this.emit(message.name, message.data); } else if (Message$isSystemRequestedShutdown(message)) {} } dispatch(msg) { this.#runtime.dispatch(msg); } emit(event3, data2) { this.#runtime.emit(event3, data2); } } var start = ({ init, update: update2, view }, selector, flags) => { if (!is_browser()) return Result$Error(Error$NotABrowser()); const root2 = selector instanceof HTMLElement ? selector : globalThis.document.querySelector(selector); if (!root2) return Result$Error(Error$ElementNotFound(selector)); return Result$Ok(new Spa(root2, init(flags), update2, view)); }; // build/dev/javascript/lustre/lustre/runtime/server/runtime.ffi.mjs class Runtime2 { #model; #update; #view; #config; #vdom; #cache; #providers = make(); #callbacks = /* @__PURE__ */ new Set; constructor(_, init, update2, view, config2, start_arguments) { const [model, effects] = init(start_arguments); this.#model = model; this.#update = update2; this.#view = view; this.#config = config2; this.#vdom = this.#view(this.#model); this.#cache = from_node(this.#vdom); this.#handle_effect(effects); } send(msg) { if (Message$isClientDispatchedMessage(msg)) { const { message } = msg; const next = this.#handle_client_message(message); const diff2 = diff(this.#cache, this.#vdom, next); this.#vdom = next; this.#cache = diff2.cache; this.broadcast(reconcile(diff2.patch, memos(diff2.cache))); } else if (Message$isClientRegisteredCallback(msg)) { const { callback } = msg; this.#callbacks.add(callback); callback(mount(this.#config.open_shadow_root, this.#config.adopt_styles, keys(this.#config.attributes), keys(this.#config.properties), keys(this.#config.contexts), this.#providers, this.#vdom, memos(this.#cache))); if (Option$isSome(config.on_connect)) { this.#dispatch(Option$Some$0(config.on_connect)); } } else if (Message$isClientDeregisteredCallback(msg)) { const { callback } = msg; this.#callbacks.delete(callback); if (Option$isSome(config.on_disconnect)) { this.#dispatch(Option$Some$0(config.on_disconnect)); } } else if (Message$isEffectDispatchedMessage(msg)) { const { message } = msg; const [model, effect] = this.#update(this.#model, message); const next = this.#view(model); const diff2 = diff(this.#cache, this.#vdom, next); this.#handle_effect(effect); this.#model = model; this.#vdom = next; this.#cache = diff2.cache; this.broadcast(reconcile(diff2.patch, memos(diff2.cache))); } else if (Message$isEffectEmitEvent(msg)) { const { name, data: data2 } = msg; this.broadcast(emit(name, data2)); } else if (Message$isEffectProvidedValue(msg)) { const { key, value: value2 } = msg; const existing = get(this.#providers, key); if (Result$isOk(existing) && isEqual2(Result$Ok$0(existing), value2)) { return; } this.#providers = insert(this.#providers, key, value2); this.broadcast(provide(key, value2)); } else if (Message$isSystemRequestedShutdown(msg)) { this.#model = null; this.#update = null; this.#view = null; this.#config = null; this.#vdom = null; this.#cache = null; this.#providers = null; this.#callbacks.clear(); } } broadcast(msg) { for (const callback of this.#callbacks) { callback(msg); } } #handle_client_message(msg) { if (ServerMessage$isBatch(msg)) { const { messages } = msg; let model = this.#model; let effect = none(); for (let list4 = messages;List$NonEmpty$rest(list4); list4 = List$NonEmpty$rest(list4)) { const result = this.#handle_client_message(List$NonEmpty$first(list4)); if (Result$isOk(result)) { model = Result$Ok$0(result)[0]; effect = batch(toList2([effect, Result$Ok$0(result)[1]])); break; } } this.#handle_effect(effect); this.#model = model; return this.#view(model); } else if (ServerMessage$isAttributeChanged(msg)) { const { name, value: value2 } = msg; const result = this.#handle_attribute_change(name, value2); if (!Result$isOk(result)) { return this.#vdom; } return this.#dispatch(Result$Ok$0(result)); } else if (ServerMessage$isPropertyChanged(msg)) { const { name, value: value2 } = msg; const result = this.#handle_properties_change(name, value2); if (!Result$isOk(result)) { return this.#vdom; } return this.#dispatch(Result$Ok$0(result)); } else if (ServerMessage$isEventFired(msg)) { const { path, name, event: event3 } = msg; const [cache, result] = handle(this.#cache, path, name, event3); this.#cache = cache; if (!Result$isOk(result)) { return this.#vdom; } const { message } = Result$Ok$0(result); return this.#dispatch(message); } else if (ServerMessage$isContextProvided(msg)) { const { key, value: value2 } = msg; let result = get(this.#config.contexts, key); if (!Result$isOk(result)) { return this.#vdom; } result = run(value2, Result$Ok$0(result)); if (!Result$isOk(result)) { return this.#vdom; } return this.#dispatch(Result$Ok$0(result)); } } #dispatch(msg) { const [model, effects] = this.#update(this.#model, msg); this.#handle_effect(effects); this.#model = model; return this.#view(this.#model); } #handle_attribute_change(name, value2) { const result = get(this.#config.attributes, name); if (!Result$isOk(result)) { return result; } return Result$Ok$0(result)(value2); } #handle_properties_change(name, value2) { const result = get(this.#config.properties, name); if (!Result$isOk(result)) { return result; } return Result$Ok$0(result)(value2); } #handle_effect(effect) { const dispatch2 = (message) => this.send(Message$EffectDispatchedMessage(message)); const emit2 = (name, data2) => this.send(Message$EffectEmitEvent(name, data2)); const select = () => { return; }; const internals = () => { return; }; const provide2 = (key, value2) => this.send(Message$EffectProvidedValue(key, value2)); globalThis.queueMicrotask(() => { perform(effect, dispatch2, emit2, select, internals, provide2); }); } } // build/dev/javascript/lustre/lustre.mjs class ElementNotFound extends CustomType { constructor(selector) { super(); this.selector = selector; } } var Error$ElementNotFound = (selector) => new ElementNotFound(selector); class NotABrowser extends CustomType { } var Error$NotABrowser = () => new NotABrowser; function application(init, update2, view) { return new App(new None, init, update2, view, default_config); } function start4(app, selector, arguments$) { return guard(!is_browser(), new Error(new NotABrowser), () => { return start(app, selector, arguments$); }); } // build/dev/javascript/lustre/lustre/event.mjs function on(name, handler) { return event(name, map3(handler, (msg) => { return new Handler(false, false, msg); }), empty_list, never, never, 0, 0); } function on_click(msg) { return on("click", success(msg)); } function on_input(msg) { return on("input", subfield(toList(["target", "value"]), string2, (value2) => { return success(msg(value2)); })); } // build/dev/javascript/gleam_stdlib/gleam/uri.mjs class Uri extends CustomType { constructor(scheme, userinfo, host, port, path, query, fragment3) { super(); this.scheme = scheme; this.userinfo = userinfo; this.host = host; this.port = port; this.path = path; this.query = query; this.fragment = fragment3; } } var empty3 = /* @__PURE__ */ new Uri(/* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, "", /* @__PURE__ */ new None, /* @__PURE__ */ new None); function is_valid_host_within_brackets_char(char) { return 48 >= char && char <= 57 || 65 >= char && char <= 90 || 97 >= char && char <= 122 || char === 58 || char === 46; } function parse_fragment(rest, pieces) { return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, new Some(rest))); } function parse_query_with_question_mark_loop(loop$original, loop$uri_string, loop$pieces, loop$size) { while (true) { let original = loop$original; let uri_string = loop$uri_string; let pieces = loop$pieces; let size3 = loop$size; if (uri_string.startsWith("#")) { if (size3 === 0) { let rest = uri_string.slice(1); return parse_fragment(rest, pieces); } else { let rest = uri_string.slice(1); let query = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, pieces.path, new Some(query), pieces.fragment); return parse_fragment(rest, pieces$1); } } else if (uri_string === "") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, pieces.path, new Some(original), pieces.fragment)); } else { let $ = pop_codeunit(uri_string); let rest; rest = $[1]; loop$original = original; loop$uri_string = rest; loop$pieces = pieces; loop$size = size3 + 1; } } } function parse_query_with_question_mark(uri_string, pieces) { return parse_query_with_question_mark_loop(uri_string, uri_string, pieces, 0); } function parse_path_loop(loop$original, loop$uri_string, loop$pieces, loop$size) { while (true) { let original = loop$original; let uri_string = loop$uri_string; let pieces = loop$pieces; let size3 = loop$size; if (uri_string.startsWith("?")) { let rest = uri_string.slice(1); let path = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, path, pieces.query, pieces.fragment); return parse_query_with_question_mark(rest, pieces$1); } else if (uri_string.startsWith("#")) { let rest = uri_string.slice(1); let path = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, path, pieces.query, pieces.fragment); return parse_fragment(rest, pieces$1); } else if (uri_string === "") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, original, pieces.query, pieces.fragment)); } else { let $ = pop_codeunit(uri_string); let rest; rest = $[1]; loop$original = original; loop$uri_string = rest; loop$pieces = pieces; loop$size = size3 + 1; } } } function parse_path(uri_string, pieces) { return parse_path_loop(uri_string, uri_string, pieces, 0); } function parse_port_loop(loop$uri_string, loop$pieces, loop$port) { while (true) { let uri_string = loop$uri_string; let pieces = loop$pieces; let port = loop$port; if (uri_string.startsWith("0")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10; } else if (uri_string.startsWith("1")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 1; } else if (uri_string.startsWith("2")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 2; } else if (uri_string.startsWith("3")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 3; } else if (uri_string.startsWith("4")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 4; } else if (uri_string.startsWith("5")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 5; } else if (uri_string.startsWith("6")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 6; } else if (uri_string.startsWith("7")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 7; } else if (uri_string.startsWith("8")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 8; } else if (uri_string.startsWith("9")) { let rest = uri_string.slice(1); loop$uri_string = rest; loop$pieces = pieces; loop$port = port * 10 + 9; } else if (uri_string.startsWith("?")) { let rest = uri_string.slice(1); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment); return parse_query_with_question_mark(rest, pieces$1); } else if (uri_string.startsWith("#")) { let rest = uri_string.slice(1); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment); return parse_fragment(rest, pieces$1); } else if (uri_string.startsWith("/")) { let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment); return parse_path(uri_string, pieces$1); } else if (uri_string === "") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment)); } else { return new Error(undefined); } } } function parse_port(uri_string, pieces) { if (uri_string.startsWith(":0")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 0); } else if (uri_string.startsWith(":1")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 1); } else if (uri_string.startsWith(":2")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 2); } else if (uri_string.startsWith(":3")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 3); } else if (uri_string.startsWith(":4")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 4); } else if (uri_string.startsWith(":5")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 5); } else if (uri_string.startsWith(":6")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 6); } else if (uri_string.startsWith(":7")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 7); } else if (uri_string.startsWith(":8")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 8); } else if (uri_string.startsWith(":9")) { let rest = uri_string.slice(2); return parse_port_loop(rest, pieces, 9); } else if (uri_string === ":") { return new Ok(pieces); } else if (uri_string === "") { return new Ok(pieces); } else if (uri_string.startsWith("?")) { let rest = uri_string.slice(1); return parse_query_with_question_mark(rest, pieces); } else if (uri_string.startsWith(":?")) { let rest = uri_string.slice(2); return parse_query_with_question_mark(rest, pieces); } else if (uri_string.startsWith("#")) { let rest = uri_string.slice(1); return parse_fragment(rest, pieces); } else if (uri_string.startsWith(":#")) { let rest = uri_string.slice(2); return parse_fragment(rest, pieces); } else if (uri_string.startsWith("/")) { return parse_path(uri_string, pieces); } else if (uri_string.startsWith(":")) { let rest = uri_string.slice(1); if (rest.startsWith("/")) { return parse_path(rest, pieces); } else { return new Error(undefined); } } else { return new Error(undefined); } } function parse_host_outside_of_brackets_loop(loop$original, loop$uri_string, loop$pieces, loop$size) { while (true) { let original = loop$original; let uri_string = loop$uri_string; let pieces = loop$pieces; let size3 = loop$size; if (uri_string === "") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(original), pieces.port, pieces.path, pieces.query, pieces.fragment)); } else if (uri_string.startsWith(":")) { let host = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_port(uri_string, pieces$1); } else if (uri_string.startsWith("/")) { let host = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_path(uri_string, pieces$1); } else if (uri_string.startsWith("?")) { let rest = uri_string.slice(1); let host = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_query_with_question_mark(rest, pieces$1); } else if (uri_string.startsWith("#")) { let rest = uri_string.slice(1); let host = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_fragment(rest, pieces$1); } else { let $ = pop_codeunit(uri_string); let rest; rest = $[1]; loop$original = original; loop$uri_string = rest; loop$pieces = pieces; loop$size = size3 + 1; } } } function parse_host_within_brackets_loop(loop$original, loop$uri_string, loop$pieces, loop$size) { while (true) { let original = loop$original; let uri_string = loop$uri_string; let pieces = loop$pieces; let size3 = loop$size; if (uri_string === "") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(uri_string), pieces.port, pieces.path, pieces.query, pieces.fragment)); } else if (uri_string.startsWith("]")) { if (size3 === 0) { let rest = uri_string.slice(1); return parse_port(rest, pieces); } else { let rest = uri_string.slice(1); let host = string_codeunit_slice(original, 0, size3 + 1); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_port(rest, pieces$1); } } else if (uri_string.startsWith("/")) { if (size3 === 0) { return parse_path(uri_string, pieces); } else { let host = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_path(uri_string, pieces$1); } } else if (uri_string.startsWith("?")) { if (size3 === 0) { let rest = uri_string.slice(1); return parse_query_with_question_mark(rest, pieces); } else { let rest = uri_string.slice(1); let host = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_query_with_question_mark(rest, pieces$1); } } else if (uri_string.startsWith("#")) { if (size3 === 0) { let rest = uri_string.slice(1); return parse_fragment(rest, pieces); } else { let rest = uri_string.slice(1); let host = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_fragment(rest, pieces$1); } } else { let $ = pop_codeunit(uri_string); let char; let rest; char = $[0]; rest = $[1]; let $1 = is_valid_host_within_brackets_char(char); if ($1) { loop$original = original; loop$uri_string = rest; loop$pieces = pieces; loop$size = size3 + 1; } else { return parse_host_outside_of_brackets_loop(original, original, pieces, 0); } } } } function parse_host_within_brackets(uri_string, pieces) { return parse_host_within_brackets_loop(uri_string, uri_string, pieces, 0); } function parse_host_outside_of_brackets(uri_string, pieces) { return parse_host_outside_of_brackets_loop(uri_string, uri_string, pieces, 0); } function parse_host(uri_string, pieces) { if (uri_string.startsWith("[")) { return parse_host_within_brackets(uri_string, pieces); } else if (uri_string.startsWith(":")) { let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(""), pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_port(uri_string, pieces$1); } else if (uri_string === "") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(""), pieces.port, pieces.path, pieces.query, pieces.fragment)); } else { return parse_host_outside_of_brackets(uri_string, pieces); } } function parse_userinfo_loop(loop$original, loop$uri_string, loop$pieces, loop$size) { while (true) { let original = loop$original; let uri_string = loop$uri_string; let pieces = loop$pieces; let size3 = loop$size; if (uri_string.startsWith("@")) { if (size3 === 0) { let rest = uri_string.slice(1); return parse_host(rest, pieces); } else { let rest = uri_string.slice(1); let userinfo = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(pieces.scheme, new Some(userinfo), pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_host(rest, pieces$1); } } else if (uri_string === "") { return parse_host(original, pieces); } else if (uri_string.startsWith("/")) { return parse_host(original, pieces); } else if (uri_string.startsWith("?")) { return parse_host(original, pieces); } else if (uri_string.startsWith("#")) { return parse_host(original, pieces); } else { let $ = pop_codeunit(uri_string); let rest; rest = $[1]; loop$original = original; loop$uri_string = rest; loop$pieces = pieces; loop$size = size3 + 1; } } } function parse_authority_pieces(string5, pieces) { return parse_userinfo_loop(string5, string5, pieces, 0); } function parse_authority_with_slashes(uri_string, pieces) { if (uri_string === "//") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(""), pieces.port, pieces.path, pieces.query, pieces.fragment)); } else if (uri_string.startsWith("//")) { let rest = uri_string.slice(2); return parse_authority_pieces(rest, pieces); } else { return parse_path(uri_string, pieces); } } function parse_scheme_loop(loop$original, loop$uri_string, loop$pieces, loop$size) { while (true) { let original = loop$original; let uri_string = loop$uri_string; let pieces = loop$pieces; let size3 = loop$size; if (uri_string.startsWith("/")) { if (size3 === 0) { return parse_authority_with_slashes(uri_string, pieces); } else { let scheme = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_authority_with_slashes(uri_string, pieces$1); } } else if (uri_string.startsWith("?")) { if (size3 === 0) { let rest = uri_string.slice(1); return parse_query_with_question_mark(rest, pieces); } else { let rest = uri_string.slice(1); let scheme = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_query_with_question_mark(rest, pieces$1); } } else if (uri_string.startsWith("#")) { if (size3 === 0) { let rest = uri_string.slice(1); return parse_fragment(rest, pieces); } else { let rest = uri_string.slice(1); let scheme = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_fragment(rest, pieces$1); } } else if (uri_string.startsWith(":")) { if (size3 === 0) { return new Error(undefined); } else { let rest = uri_string.slice(1); let scheme = string_codeunit_slice(original, 0, size3); let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment); return parse_authority_with_slashes(rest, pieces$1); } } else if (uri_string === "") { return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, original, pieces.query, pieces.fragment)); } else { let $ = pop_codeunit(uri_string); let rest; rest = $[1]; loop$original = original; loop$uri_string = rest; loop$pieces = pieces; loop$size = size3 + 1; } } } function to_string5(uri) { let _block; let $ = uri.fragment; if ($ instanceof Some) { let fragment3 = $[0]; _block = toList(["#", fragment3]); } else { _block = toList([]); } let parts = _block; let _block$1; let $1 = uri.query; if ($1 instanceof Some) { let query = $1[0]; _block$1 = prepend("?", prepend(query, parts)); } else { _block$1 = parts; } let parts$1 = _block$1; let parts$2 = prepend(uri.path, parts$1); let _block$2; let $2 = uri.host; let $3 = starts_with(uri.path, "/"); if ($2 instanceof Some && !$3) { let host = $2[0]; if (host !== "") { _block$2 = prepend("/", parts$2); } else { _block$2 = parts$2; } } else { _block$2 = parts$2; } let parts$3 = _block$2; let _block$3; let $4 = uri.host; let $5 = uri.port; if ($4 instanceof Some && $5 instanceof Some) { let port = $5[0]; _block$3 = prepend(":", prepend(to_string(port), parts$3)); } else { _block$3 = parts$3; } let parts$4 = _block$3; let _block$4; let $6 = uri.scheme; let $7 = uri.userinfo; let $8 = uri.host; if ($6 instanceof Some) { if ($7 instanceof Some) { if ($8 instanceof Some) { let s = $6[0]; let u = $7[0]; let h = $8[0]; _block$4 = prepend(s, prepend("://", prepend(u, prepend("@", prepend(h, parts$4))))); } else { let s = $6[0]; _block$4 = prepend(s, prepend(":", parts$4)); } } else if ($8 instanceof Some) { let s = $6[0]; let h = $8[0]; _block$4 = prepend(s, prepend("://", prepend(h, parts$4))); } else { let s = $6[0]; _block$4 = prepend(s, prepend(":", parts$4)); } } else if ($7 instanceof None && $8 instanceof Some) { let h = $8[0]; _block$4 = prepend("//", prepend(h, parts$4)); } else { _block$4 = parts$4; } let parts$5 = _block$4; return concat2(parts$5); } function parse2(uri_string) { return parse_scheme_loop(uri_string, uri_string, empty3, 0); } // build/dev/javascript/gleam_http/gleam/http/request.mjs class Request extends CustomType { constructor(method, headers, body, scheme, host, port, path, query) { super(); this.method = method; this.headers = headers; this.body = body; this.scheme = scheme; this.host = host; this.port = port; this.path = path; this.query = query; } } function to_uri(request) { return new Uri(new Some(scheme_to_string(request.scheme)), new None, new Some(request.host), request.port, request.path, request.query, new None); } function from_uri(uri) { return try$((() => { let _pipe = uri.scheme; let _pipe$1 = unwrap(_pipe, ""); return scheme_from_string(_pipe$1); })(), (scheme) => { return try$((() => { let _pipe = uri.host; return to_result(_pipe, undefined); })(), (host) => { let req = new Request(new Get, toList([]), "", scheme, host, uri.port, uri.path, uri.query); return new Ok(req); }); }); } function set_header2(request, key, value2) { let headers = key_set(request.headers, lowercase(key), value2); return new Request(request.method, headers, request.body, request.scheme, request.host, request.port, request.path, request.query); } function set_body(req, body) { return new Request(req.method, req.headers, body, req.scheme, req.host, req.port, req.path, req.query); } function set_method(req, method) { return new Request(method, req.headers, req.body, req.scheme, req.host, req.port, req.path, req.query); } // build/dev/javascript/gleam_javascript/gleam_javascript_ffi.mjs class PromiseLayer { constructor(promise) { this.promise = promise; } static wrap(value2) { return value2 instanceof Promise ? new PromiseLayer(value2) : value2; } static unwrap(value2) { return value2 instanceof PromiseLayer ? value2.promise : value2; } } function resolve(value2) { return Promise.resolve(PromiseLayer.wrap(value2)); } function then_await(promise, fn) { return promise.then((value2) => fn(PromiseLayer.unwrap(value2))); } function map_promise(promise, fn) { return promise.then((value2) => PromiseLayer.wrap(fn(PromiseLayer.unwrap(value2)))); } // build/dev/javascript/gleam_javascript/gleam/javascript/promise.mjs function tap(promise, callback) { let _pipe = promise; return map_promise(_pipe, (a) => { callback(a); return a; }); } function try_await(promise, callback) { let _pipe = promise; return then_await(_pipe, (result) => { if (result instanceof Ok) { let a = result[0]; return callback(a); } else { let e = result[0]; return resolve(new Error(e)); } }); } // build/dev/javascript/gleam_fetch/gleam_fetch_ffi.mjs async function raw_send(request) { try { return new Ok(await fetch(request)); } catch (error) { return new Error(new NetworkError(error.toString())); } } function from_fetch_response(response) { return new Response(response.status, List.fromArray([...response.headers]), response); } function request_common(request) { let url = to_string5(to_uri(request)); let method = method_to_string(request.method).toUpperCase(); let options = { headers: make_headers(request.headers), method }; return [url, options]; } function to_fetch_request(request) { let [url, options] = request_common(request); if (options.method !== "GET" && options.method !== "HEAD") options.body = request.body; return new globalThis.Request(url, options); } function make_headers(headersList) { let headers = new globalThis.Headers; for (let [k, v] of headersList) headers.append(k.toLowerCase(), v); return headers; } async function read_text_body(response) { let body; try { body = await response.body.text(); } catch (error) { return new Error(new UnableToReadBody); } return new Ok(response.withFields({ body })); } // build/dev/javascript/gleam_fetch/gleam/fetch.mjs class NetworkError extends CustomType { constructor($0) { super(); this[0] = $0; } } class UnableToReadBody extends CustomType { } function send2(request) { let _pipe = request; let _pipe$1 = to_fetch_request(_pipe); let _pipe$2 = raw_send(_pipe$1); return try_await(_pipe$2, (resp) => { return resolve(new Ok(from_fetch_response(resp))); }); } // build/dev/javascript/rsvp/rsvp.ffi.mjs var from_relative_url = (url_string) => { if (!globalThis.location) return new Error(undefined); const url = new URL(url_string, globalThis.location.href); const uri = uri_from_url(url); return new Ok(uri); }; var uri_from_url = (url) => { const optional = (value2) => value2 ? new Some(value2) : new None; return new Uri(optional(url.protocol?.slice(0, -1)), new None, optional(url.hostname), optional(url.port && Number(url.port)), url.pathname, optional(url.search?.slice(1)), optional(url.hash?.slice(1))); }; // build/dev/javascript/rsvp/rsvp.mjs class BadBody extends CustomType { } class BadUrl extends CustomType { constructor($0) { super(); this[0] = $0; } } class HttpError extends CustomType { constructor($0) { super(); this[0] = $0; } } class NetworkError2 extends CustomType { } class UnhandledResponse extends CustomType { constructor($0) { super(); this[0] = $0; } } class Handler2 extends CustomType { constructor(run2) { super(); this.run = run2; } } function expect_ok_response(handler) { return new Handler2((result) => { return handler(try$(result, (response) => { let $ = response.status; let code = $; if (code >= 200 && code < 300) { return new Ok(response); } else { let code2 = $; if (code2 >= 400 && code2 < 600) { return new Error(new HttpError(response)); } else { return new Error(new UnhandledResponse(response)); } } })); }); } function do_send(request, handler) { return from2((dispatch2) => { let _pipe = send2(request); let _pipe$1 = try_await(_pipe, read_text_body); let _pipe$2 = map_promise(_pipe$1, (_capture) => { return map_error(_capture, (error) => { if (error instanceof NetworkError) { return new NetworkError2; } else if (error instanceof UnableToReadBody) { return new BadBody; } else { return new BadBody; } }); }); let _pipe$3 = map_promise(_pipe$2, handler.run); tap(_pipe$3, dispatch2); return; }); } function send3(request, handler) { return do_send(request, handler); } function reject(err, handler) { return from2((dispatch2) => { let _pipe = new Error(err); let _pipe$1 = handler.run(_pipe); return dispatch2(_pipe$1); }); } function to_uri2(uri_string) { let _block; if (uri_string.startsWith("./")) { _block = from_relative_url(uri_string); } else if (uri_string.startsWith("/")) { _block = from_relative_url(uri_string); } else { _block = parse2(uri_string); } let _pipe = _block; return replace_error(_pipe, new BadUrl(uri_string)); } function post(url, body, handler) { let $ = to_uri2(url); if ($ instanceof Ok) { let uri = $[0]; let $1 = from_uri(uri); if ($1 instanceof Ok) { let request = $1[0]; let _pipe = request; let _pipe$1 = set_method(_pipe, new Post); let _pipe$2 = set_header2(_pipe$1, "content-type", "application/json"); let _pipe$3 = set_body(_pipe$2, to_string2(body)); return send3(_pipe$3, handler); } else { return reject(new BadUrl(url), handler); } } else { let err = $[0]; return reject(err, handler); } } // build/dev/javascript/client/shared.mjs class GroceryItem extends CustomType { constructor(name, quantity) { super(); this.name = name; this.quantity = quantity; } } function grocery_item_to_json(grocery_item) { let name; let quantity; name = grocery_item.name; quantity = grocery_item.quantity; return object2(toList([["name", string3(name)], ["quantity", int3(quantity)]])); } function grocery_list_to_json(items) { return array2(items, grocery_item_to_json); } // build/dev/javascript/client/client.mjs var FILEPATH = "src/client.gleam"; class Model extends CustomType { constructor(items, new_item, saving, error) { super(); this.items = items; this.new_item = new_item; this.saving = saving; this.error = error; } } class ServerSavedList extends CustomType { constructor($0) { super(); this[0] = $0; } } class UserAddedItem extends CustomType { } class UserTypedNewItem extends CustomType { constructor($0) { super(); this[0] = $0; } } class UserSavedList extends CustomType { } class UserUpdatedQuantity extends CustomType { constructor(index5, quantity) { super(); this.index = index5; this.quantity = quantity; } } function init(items) { let model = new Model(items, "", false, new None); return [model, none()]; } function save_list(items) { let body = grocery_list_to_json(items); let url = "/api/groceries"; return post(url, body, expect_ok_response((var0) => { return new ServerSavedList(var0); })); } function update2(model, msg) { if (msg instanceof ServerSavedList) { let $ = msg[0]; if ($ instanceof Ok) { return [ new Model(model.items, model.new_item, false, new None), none() ]; } else { return [ new Model(model.items, model.new_item, false, new Some("Failed to save list")), none() ]; } } else if (msg instanceof UserAddedItem) { let $ = model.new_item; if ($ === "") { return [model, none()]; } else { let name = $; let item = new GroceryItem(name, 1); let updated_items = append2(model.items, toList([item])); return [ new Model(updated_items, "", model.saving, model.error), none() ]; } } else if (msg instanceof UserTypedNewItem) { let text4 = msg[0]; return [ new Model(model.items, text4, model.saving, model.error), none() ]; } else if (msg instanceof UserSavedList) { return [ new Model(model.items, model.new_item, true, model.error), save_list(model.items) ]; } else { let index5 = msg.index; let quantity = msg.quantity; let updated_items = index_map(model.items, (item, item_index) => { let $ = item_index === index5; if ($) { return new GroceryItem(item.name, quantity); } else { return item; } }); return [ new Model(updated_items, model.new_item, model.saving, model.error), none() ]; } } function view_new_item(new_item) { return div(toList([]), toList([ input(toList([ placeholder("Enter item name"), value(new_item), on_input((var0) => { return new UserTypedNewItem(var0); }) ])), button(toList([on_click(new UserAddedItem)]), toList([text3("Add")])) ])); } function view_grocery_item(item, index5) { return div(toList([styles(toList([["display", "flex"], ["gap", "1em"]]))]), toList([ span(toList([style("flex", "1")]), toList([text3(item.name)])), input(toList([ style("width", "4em"), type_("number"), value(to_string(item.quantity)), min2("0"), on_input((value2) => { let _pipe = unwrap2(parse_int(value2), 0); return ((_capture) => { return new UserUpdatedQuantity(index5, _capture); })(_pipe); }) ])) ])); } function view_grocery_list(items) { if (items instanceof Empty) { return p(toList([]), toList([text3("No items in your list yet.")])); } else { return ul(toList([]), index_map(items, (item, index5) => { return li(toList([]), toList([view_grocery_item(item, index5)])); })); } } function view(model) { let styles2 = toList([ ["max-width", "30ch"], ["margin", "0 auto"], ["display", "flex"], ["flex-direction", "column"], ["gap", "1em"] ]); return div(toList([styles(styles2)]), toList([ h1(toList([]), toList([text3("Grocery List")])), view_grocery_list(model.items), view_new_item(model.new_item), div(toList([]), toList([ button(toList([ on_click(new UserSavedList), disabled(model.saving) ]), toList([ text3((() => { let $ = model.saving; if ($) { return "Saving..."; } else { return "Save List"; } })()) ])) ])), (() => { let $ = model.error; if ($ instanceof Some) { let error = $[0]; return div(toList([style("color", "red")]), toList([text3(error)])); } else { return none2(); } })() ])); } function main() { let app = application(init, update2, view); let $ = start4(app, "#app", toList([])); if (!($ instanceof Ok)) { throw makeError("let_assert", FILEPATH, "client", 17, "main", "Pattern match failed, no pattern matched the value.", { value: $, start: 417, end: 465, pattern_start: 428, pattern_end: 433 }); } return; } // .lustre/build/client.mjs main();