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