an attempt to make a lightweight, easily self-hostable, scoped bluesky appview

idk changes to the frontend's esbuild system

rimar1337 5d43d515 c97cf44f

+2 -2
deno.json
··· 1 1 { 2 2 "tasks": { 3 - "index": "deno run --watch -A --env-file main-index.ts", 4 - "view": "deno run --watch -A --env-file main-view.ts" 3 + "index": "deno run --watch -A --env-file --unstable-broadcast-channel main-index.ts", 4 + "view": "deno run --watch -A --env-file --unstable-broadcast-channel main-view.ts" 5 5 }, 6 6 "imports": { 7 7 "@std/assert": "jsr:@std/assert@1"
+170 -2
deno.lock
··· 1309 1309 }, 1310 1310 "redirects": { 1311 1311 "https://esm.sh/@alloc/quick-lru@^5.2.0?target=denonext": "https://esm.sh/@alloc/quick-lru@5.2.0?target=denonext", 1312 + "https://esm.sh/@atproto/api": "https://esm.sh/@atproto/api@0.16.3", 1313 + "https://esm.sh/@atproto/common-web@^0.4.2?target=denonext": "https://esm.sh/@atproto/common-web@0.4.2?target=denonext", 1314 + "https://esm.sh/@atproto/lexicon@^0.4.13?target=denonext": "https://esm.sh/@atproto/lexicon@0.4.13?target=denonext", 1315 + "https://esm.sh/@atproto/oauth-client-browser": "https://esm.sh/@atproto/oauth-client-browser@0.3.30", 1316 + "https://esm.sh/@atproto/syntax@^0.4.0?target=denonext": "https://esm.sh/@atproto/syntax@0.4.0?target=denonext", 1317 + "https://esm.sh/@atproto/xrpc@^0.7.2?target=denonext": "https://esm.sh/@atproto/xrpc@0.7.2?target=denonext", 1312 1318 "https://esm.sh/@jridgewell/gen-mapping@^0.3.2?target=denonext": "https://esm.sh/@jridgewell/gen-mapping@0.3.13?target=denonext", 1313 1319 "https://esm.sh/@jridgewell/resolve-uri@^3.1.0?target=denonext": "https://esm.sh/@jridgewell/resolve-uri@3.1.2?target=denonext", 1314 1320 "https://esm.sh/@jridgewell/sourcemap-codec@^1.4.14?target=denonext": "https://esm.sh/@jridgewell/sourcemap-codec@1.5.5?target=denonext", ··· 1318 1324 "https://esm.sh/@nodelib/fs.walk@^1.2.3?target=denonext": "https://esm.sh/@nodelib/fs.walk@1.2.8?target=denonext", 1319 1325 "https://esm.sh/@tailwindcss/line-clamp?target=denonext": "https://esm.sh/@tailwindcss/line-clamp@0.4.4?target=denonext", 1320 1326 "https://esm.sh/autoprefixer@10": "https://esm.sh/autoprefixer@10.4.21", 1327 + "https://esm.sh/await-lock@^2.2.2?target=denonext": "https://esm.sh/await-lock@2.2.2?target=denonext", 1321 1328 "https://esm.sh/braces@^3.0.3?target=denonext": "https://esm.sh/braces@3.0.3?target=denonext", 1322 1329 "https://esm.sh/browserslist@^4.24.4?target=denonext": "https://esm.sh/browserslist@4.25.3?target=denonext", 1323 1330 "https://esm.sh/camelcase-css@^2.0.1?target=denonext": "https://esm.sh/camelcase-css@2.0.1?target=denonext", ··· 1407 1414 "https://esm.sh/fraction.js@^4.3.7?target=denonext": "https://esm.sh/fraction.js@4.3.7?target=denonext", 1408 1415 "https://esm.sh/glob-parent@^5.1.2?target=denonext": "https://esm.sh/glob-parent@5.1.2?target=denonext", 1409 1416 "https://esm.sh/glob-parent@^6.0.2?target=denonext": "https://esm.sh/glob-parent@6.0.2?target=denonext", 1417 + "https://esm.sh/graphemer@^1.4.0?target=denonext": "https://esm.sh/graphemer@1.4.0?target=denonext", 1410 1418 "https://esm.sh/is-extglob@^2.1.1?target=denonext": "https://esm.sh/is-extglob@2.1.1?target=denonext", 1411 1419 "https://esm.sh/is-glob@^4.0.1?target=denonext": "https://esm.sh/is-glob@4.0.3?target=denonext", 1412 1420 "https://esm.sh/is-glob@^4.0.3?target=denonext": "https://esm.sh/is-glob@4.0.3?target=denonext", 1421 + "https://esm.sh/iso-datestring-validator@^2.2.2?target=denonext": "https://esm.sh/iso-datestring-validator@2.2.2?target=denonext", 1413 1422 "https://esm.sh/jiti@^1.21.6/dist/babel?target=denonext": "https://esm.sh/jiti@1.21.7/dist/babel?target=denonext", 1414 1423 "https://esm.sh/jiti@^1.21.6?target=denonext": "https://esm.sh/jiti@1.21.7?target=denonext", 1424 + "https://esm.sh/jose@^5.2.0?target=denonext": "https://esm.sh/jose@5.10.0?target=denonext", 1415 1425 "https://esm.sh/lines-and-columns@^1.1.6?target=denonext": "https://esm.sh/lines-and-columns@1.2.4?target=denonext", 1426 + "https://esm.sh/lru-cache@^10.2.0?target=denonext": "https://esm.sh/lru-cache@10.4.3?target=denonext", 1416 1427 "https://esm.sh/merge2@^1.3.0?target=denonext": "https://esm.sh/merge2@1.4.1?target=denonext", 1417 1428 "https://esm.sh/micromatch@^4.0.8?target=denonext": "https://esm.sh/micromatch@4.0.8?target=denonext", 1429 + "https://esm.sh/multiformats@^9.4.2/basics?target=denonext": "https://esm.sh/multiformats@9.9.0/basics?target=denonext", 1430 + "https://esm.sh/multiformats@^9.9.0/bases/base64?target=denonext": "https://esm.sh/multiformats@9.9.0/bases/base64?target=denonext", 1431 + "https://esm.sh/multiformats@^9.9.0/cid?target=denonext": "https://esm.sh/multiformats@9.9.0/cid?target=denonext", 1418 1432 "https://esm.sh/nanoid@^3.3.11/non-secure?target=denonext": "https://esm.sh/nanoid@3.3.11/non-secure?target=denonext", 1419 1433 "https://esm.sh/node-releases@^2.0.19/data/processed/envs.json?module": "https://esm.sh/node-releases@2.0.19/data/processed/envs.json?module", 1420 1434 "https://esm.sh/node-releases@^2.0.19/data/release-schedule/release-schedule.json?module": "https://esm.sh/node-releases@2.0.19/data/release-schedule/release-schedule.json?module", ··· 1438 1452 "https://esm.sh/queue-microtask@^1.2.2?target=denonext": "https://esm.sh/queue-microtask@1.2.3?target=denonext", 1439 1453 "https://esm.sh/reusify@^1.0.4?target=denonext": "https://esm.sh/reusify@1.1.0?target=denonext", 1440 1454 "https://esm.sh/run-parallel@^1.1.9?target=denonext": "https://esm.sh/run-parallel@1.2.0?target=denonext", 1455 + "https://esm.sh/scheduler@^0.26.0?target=denonext": "https://esm.sh/scheduler@0.26.0?target=denonext", 1441 1456 "https://esm.sh/source-map-js@^1.2.1?target=denonext": "https://esm.sh/source-map-js@1.2.1?target=denonext", 1442 1457 "https://esm.sh/sucrase@^3.35.0?target=denonext": "https://esm.sh/sucrase@3.35.0?target=denonext", 1443 1458 "https://esm.sh/tailwindcss@3": "https://esm.sh/tailwindcss@3.4.17", 1444 1459 "https://esm.sh/tailwindcss@^4.0.0-beta.9/plugin?target=denonext": "https://esm.sh/tailwindcss@4.1.12/plugin?target=denonext", 1460 + "https://esm.sh/tlds@^1.234.0?target=denonext": "https://esm.sh/tlds@1.259.0?target=denonext", 1445 1461 "https://esm.sh/to-regex-range@^5.0.1?target=denonext": "https://esm.sh/to-regex-range@5.0.1?target=denonext", 1446 1462 "https://esm.sh/ts-interface-checker@^0.1.9?target=denonext": "https://esm.sh/ts-interface-checker@0.1.13?target=denonext", 1447 - "https://esm.sh/util-deprecate@^1.0.2?target=denonext": "https://esm.sh/util-deprecate@1.0.2?target=denonext" 1463 + "https://esm.sh/util-deprecate@^1.0.2?target=denonext": "https://esm.sh/util-deprecate@1.0.2?target=denonext", 1464 + "https://esm.sh/zod@^3.23.8?target=denonext": "https://esm.sh/zod@3.25.76?target=denonext" 1448 1465 }, 1449 1466 "remote": { 1450 1467 "https://esm.sh/@alloc/quick-lru@5.2.0/denonext/quick-lru.mjs": "18d5ab8b0ee2b8c0ba55eab65a86f126f480d5d0ca85eeefa32f9ee2e399f110", 1451 1468 "https://esm.sh/@alloc/quick-lru@5.2.0?target=denonext": "8506b81cc497d3d01a8b06176598c36333efab2f6773b5f681f4bfbeba33079d", 1469 + "https://esm.sh/@atproto-labs/did-resolver@0.2.0/denonext/did-resolver.mjs": "a88663c45be439196b85c03cd1b6bc904b5b33c2aca0f3bab716f1a8c305d7e6", 1470 + "https://esm.sh/@atproto-labs/fetch@0.2.3/denonext/fetch.mjs": "eaabcb75b50ef9b62d749e0e6843f11d60204526a0296ff84a99c8d8385862bc", 1471 + "https://esm.sh/@atproto-labs/handle-resolver@0.3.0/denonext/handle-resolver.mjs": "5ce886fa149d802d864b9988d0be71d18e37e06b7aab5a941a482aaa7b2d9da6", 1472 + "https://esm.sh/@atproto-labs/identity-resolver@0.3.0/denonext/identity-resolver.mjs": "36cf98e9478813b6e5eb6e33da8771f2dd33a2e8ba587d32803dc0b766cd5cab", 1473 + "https://esm.sh/@atproto-labs/pipe@0.1.1/denonext/pipe.mjs": "9432ecdd24724682a612fc0f47f019366a1ebf5e3fd2ffa9ef6b5176419ed84f", 1474 + "https://esm.sh/@atproto-labs/simple-store-memory@0.1.3/denonext/simple-store-memory.mjs": "789ef49fe6b81024631fd4340183c670f3f35b1be8ca773d5c14f7a040dd0b89", 1475 + "https://esm.sh/@atproto-labs/simple-store@0.2.0/denonext/simple-store.mjs": "1829d20db9d7157cfd85b3968dacf60aaab1fa77742612ae0ea193a616feec21", 1476 + "https://esm.sh/@atproto/api@0.16.3": "c50f915ec53d1d48b2fbf88c74ae6d41da255e9ac6e7449ca6c8a723a1fa419b", 1477 + "https://esm.sh/@atproto/api@0.16.3/denonext/api.mjs": "1fd08820fbc9cc67f29c4dfacf1f5b806ac67d1ee3bbdfcbc0bafcf07fda0cf2", 1478 + "https://esm.sh/@atproto/common-web@0.4.2/denonext/common-web.mjs": "350a01dc9ea0e21c5b85c166d269f53c3348ec3daaf94b97e035d0256366a2ef", 1479 + "https://esm.sh/@atproto/common-web@0.4.2?target=denonext": "bb0d13657e0fc4565eaf217a456ea6a48c2ca5178ecbb6692eb0d538ef51a4cd", 1480 + "https://esm.sh/@atproto/did@0.1.5/denonext/did.mjs": "1ae8eff7a842a509499f7efd1a1db842087499e2f03138ac8400f9558f926733", 1481 + "https://esm.sh/@atproto/jwk-jose@0.1.10/denonext/jwk-jose.mjs": "d4e05a0828e23532f185e301ec2b70c5bc4632691992b21f7d4af43e5ffe784c", 1482 + "https://esm.sh/@atproto/jwk-webcrypto@0.1.10/denonext/jwk-webcrypto.mjs": "ba106ae637353dcbaa7e8b7e6a0cb888e707261383a9c56eaa4a7fe4d8ad3519", 1483 + "https://esm.sh/@atproto/jwk@0.5.0/denonext/jwk.mjs": "5791d0fc7369da7993594d23ff00df612d43b33611b293df66476e07a0033b0a", 1484 + "https://esm.sh/@atproto/lexicon@0.4.13/denonext/lexicon.mjs": "eed494b224e5d28b2d1b1c0e88740b16eeaab1b1739c1d9b3120feb35f238de4", 1485 + "https://esm.sh/@atproto/lexicon@0.4.13?target=denonext": "df4a5757c00257ca4289db10271075cd3e89d48c9d5664d1e40ad3db933ea3ab", 1486 + "https://esm.sh/@atproto/oauth-client-browser@0.3.30": "d5df31ac9f9536879c8e1dbc8a5f3b9dc6635321044aaceda6f89028e416bd84", 1487 + "https://esm.sh/@atproto/oauth-client-browser@0.3.30/denonext/oauth-client-browser.mjs": "cae96820945c788497c365ce0b99decacf17b6b0b08ab3489e71fa2f7a62fdc6", 1488 + "https://esm.sh/@atproto/oauth-client@0.5.4/denonext/oauth-client.mjs": "75c5656274abcd6fba39aef3d6eb5b1ae53459a01665b17e9699db87278891b0", 1489 + "https://esm.sh/@atproto/oauth-types@0.4.1/denonext/oauth-types.mjs": "aa73bced2c5dda2b693f2c7eccddf2c26ef8f263553ee3be3ce0bd387ce75de0", 1490 + "https://esm.sh/@atproto/syntax@0.4.0/denonext/syntax.mjs": "e03d230b4bce87f75b6af7826e654db0ccc1ee1e8a0399522b708bfbb72534f9", 1491 + "https://esm.sh/@atproto/syntax@0.4.0?target=denonext": "d64c2ed239cf18dde908f4e6e78ad2771d29f879318eec4b567e9737f0b4a0cf", 1492 + "https://esm.sh/@atproto/xrpc@0.7.2/denonext/xrpc.mjs": "8b6a604c52f49f0e958185275f5553326d93178d468de49b0a6a8081882f8840", 1493 + "https://esm.sh/@atproto/xrpc@0.7.2?target=denonext": "0d01d68187689e970d63c99364a99659c6846e0eedc7abb9227ba082d0546a70", 1452 1494 "https://esm.sh/@jridgewell/gen-mapping@0.3.13/denonext/gen-mapping.mjs": "297f733cd1f48cde4050055e4379df23b701394106946ec8692f41fd4fbc06a3", 1453 1495 "https://esm.sh/@jridgewell/gen-mapping@0.3.13?target=denonext": "d3eb8a4aee09dd989ae0d8121874e9ef41d7b1c2261a8809250654d040b54e83", 1454 1496 "https://esm.sh/@jridgewell/resolve-uri@3.1.2/denonext/resolve-uri.mjs": "2da147ad4f55ddeff542640347c789ff19db8db4ead77cce27a0c171f5f5c349", ··· 1466 1508 "https://esm.sh/@tailwindcss/line-clamp@0.4.4?target=denonext": "1fbc5f55d06b23c8fc79d58f00831983224f1c15b5249de3cd0a2d51fed22572", 1467 1509 "https://esm.sh/autoprefixer@10.4.21": "2bb14916b2e4881a32ee311720679c3e57e2d04f45ac808f4f71ae4e0923801c", 1468 1510 "https://esm.sh/autoprefixer@10.4.21/denonext/autoprefixer.mjs": "0d9874129a69bb35c1392f38f09e6a5a747c0eeb8c2b29e7fc8d4c1868337d92", 1511 + "https://esm.sh/await-lock@2.2.2/denonext/await-lock.mjs": "6787201229bc4ccae3aabbcee4086ea60b803bb476b37e576ec135e954f3ae5a", 1512 + "https://esm.sh/await-lock@2.2.2?target=denonext": "62d8dd2ac9a50e115f76d05f309f437a8dbc6e53ff508c70addf07ed40ad0077", 1469 1513 "https://esm.sh/braces@3.0.3/denonext/braces.mjs": "a3909393c947301c3b6348ab2378bd4f96fe001009b9beb44dcf1030dd717f47", 1470 1514 "https://esm.sh/braces@3.0.3?target=denonext": "58c0fed5cc432a2192aad7eeaf6e3988b96830a6c6ec0ad51dfc97578b2e8dee", 1471 1515 "https://esm.sh/browserslist@4.25.3/denonext/browserslist.mjs": "df95a5657a9d8a83aa8e834a82e1747b3d6e8ea1ee8d41676c665e05d803c103", ··· 1640 1684 "https://esm.sh/glob-parent@5.1.2?target=denonext": "0e04ba2ebac5a052f7d5671a73c19f72407c2660bd3d5a5be577dd1ffcdfc7dc", 1641 1685 "https://esm.sh/glob-parent@6.0.2/denonext/glob-parent.mjs": "e629258fece4c22cb6d3a108a97c95ea8df4d735e4c79630f2a7da870bbafa23", 1642 1686 "https://esm.sh/glob-parent@6.0.2?target=denonext": "e30aa6b9dc68fbde857f7495eb6f05c7c41b5e5a7453be63a48cfd62269aacdb", 1687 + "https://esm.sh/graphemer@1.4.0/denonext/graphemer.mjs": "5a2c9e558258abf5f67d95a6814b6a3ef0bb3ea649ed231505f42a2863d1b317", 1688 + "https://esm.sh/graphemer@1.4.0?target=denonext": "09e56a40cab2fec5dbcce661e11517580d59b8854034d2414e4bb1576cd3254c", 1643 1689 "https://esm.sh/is-extglob@2.1.1/denonext/is-extglob.mjs": "adbceb33b529cc88849ee39364a0eea16088cefb795221d3be31c7d6c2b7a47d", 1644 1690 "https://esm.sh/is-extglob@2.1.1?target=denonext": "cc21d63edf9dcc600d613af9dc30eeac8c8ee324104dab9f978fa567ec8f3ae4", 1645 1691 "https://esm.sh/is-glob@4.0.3/denonext/is-glob.mjs": "4555ca21a3af8a883c44c977fd1ff03be73dd7927dea188443992d01749b845d", 1646 1692 "https://esm.sh/is-glob@4.0.3?target=denonext": "5fef477a765ea5f14bff33ee18156cd8398e8fba5fea6fa636ebe2280349e3ce", 1693 + "https://esm.sh/iso-datestring-validator@2.2.2/denonext/iso-datestring-validator.mjs": "ed32c001968af2e58843b98d99f95fa09d7e5b056ae4ad2a30ce0d436daa087e", 1694 + "https://esm.sh/iso-datestring-validator@2.2.2?target=denonext": "de296e64bf5da2fb01f4b909d22a6c1676fcc52a1c6f176aa5307df37eacb217", 1647 1695 "https://esm.sh/jiti@1.21.7/denonext/dist/babel.mjs": "95d8f0b529fdeeb7b12eacfa93d6ad80c4548b2b407022e08608c6789b8e7d9f", 1648 1696 "https://esm.sh/jiti@1.21.7/denonext/jiti.mjs": "75830015c5c1f473ae2014286ed7f9f66b88404641efdfef8c18731463295c7b", 1649 1697 "https://esm.sh/jiti@1.21.7/dist/babel?target=denonext": "238960d30e4169f10b16b90db8b8e0e3695d3d13b589c2cbde7a70d5eb8761b2", 1650 1698 "https://esm.sh/jiti@1.21.7?target=denonext": "8b16749a8a79eafecd65003c0a14082274620e9521e2a0137e5825ee353898e8", 1699 + "https://esm.sh/jose@5.10.0/denonext/base64url.mjs": "539aace7c49b2261745da4ec543d941618d11a294c4e7799d6face203aebfc45", 1700 + "https://esm.sh/jose@5.10.0/denonext/decode/protected_header.mjs": "73ce892cbc903722e5628006b329d836d29af384eeb99e18f4e8ad3888d5c241", 1701 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/jwt/produce.mjs": "72409fb814f902126eeca273e6c6855685ab0715f2ef95a5f61b29015862472b", 1702 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/aesgcmkw.mjs": "c0363171d95389f30ed6a8de16fdb3c8f123e1d7cb92f39011393c1038faf044", 1703 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/buffer_utils.mjs": "2b23cfebda877dbfc41c9a69438a158ffb31731d97308baa01621d73ef959f2b", 1704 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/cek.mjs": "85c4e75e70bb1da9960b6825e1bf985eb37881d7d23fa76e2bc2efb8ca071812", 1705 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/check_iv_length.mjs": "38783fdf60c458e435a42e588da9d4097fd2d096d92129673674da037d1defd8", 1706 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/check_key_type.mjs": "9d4b6990a0b8523681db4cef0bde67b957ef6f29f5708ce871225eb6f24d4e63", 1707 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/crypto_key.mjs": "59dc27357c645bbe213439acee0ef9ad481bd9ed751041ebe8801a108431aa00", 1708 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/encrypt_key_management.mjs": "35dd301ef6820956d2f5668d92786764dcbb459fae1136d5d11dae3d839a2e9d", 1709 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/epoch.mjs": "b594e6e3d563fd8b437b924b8738ce883d5d4fc1126dfd0ca230fd5c0fae02e8", 1710 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/invalid_key_input.mjs": "19a65328e952d4031c09c1315abe803ea1fdc9934f0fa4f455379bc3c072921a", 1711 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/is_disjoint.mjs": "85ebfe6f46e0feb55cd79e41626717594b2f1e997d54c9a66a255998b626bc51", 1712 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/is_jwk.mjs": "12240833a4979333cb4f8fad5f065c7cb9fff1d5e4d589a073ec99bdf2fc234d", 1713 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/is_object.mjs": "a477fb6116adc68383ea964f6e9b5542427e7638d192a23e93a683c5797ab387", 1714 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/iv.mjs": "3edfe59dfc97f12b3fff5535f95f0bf690d6dd1bd0140baf7a86d705313f09c2", 1715 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/jwt_claims_set.mjs": "67658e0bde825ea75aeecb740e34cee41b754ed0092b25f6a4e822d9d06f3d92", 1716 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/private_symbols.mjs": "5c8542caf07cd0e88f442c3cf16bf67b74108b8fa10f93f41141840fed183af9", 1717 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/secs.mjs": "aaab2389b4a39d7cdd422908aa1f60fb93b075df47acab0c4f42838ccca23c81", 1718 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/validate_algorithms.mjs": "095384ff18fb772f980bdb504474dfe87a5ec02730d5c510d59ef2d95e5efd06", 1719 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/validate_crit.mjs": "176fa8b63805db36ef0eaa7490eef27c43352eec53ac2843920ab7b353282809", 1720 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/aeskw.mjs": "1ca307484491e42a7cd7be95f9a3a9a6504d433f4920f1a611f3faeb27ab9848", 1721 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/asn1.mjs": "71e4c6e67ed71454ad786e5ba25f1ed0634c527d1ef15f053116927828b9ed5b", 1722 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/base64url.mjs": "32bb04a70098ab611900258e09901161e0022265a4ff09c1f6a585f0d0dfe308", 1723 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/bogus.mjs": "26b5a2bace42941799dcb891f5676678bb2017ab64778e94923fe71a040d1719", 1724 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/check_cek_length.mjs": "b1511d0ecbc2bf90a8b50ebe9baa15eab169dfa3d3ad3a2a556474a69cb2a344", 1725 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/check_key_length.mjs": "3aec7aaa6c36c0b1c984cccfd476b310c3678dd8a5b07331e292c0a005b97798", 1726 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/decrypt.mjs": "f81f1f103e787deee890cf5d97a2c91b59a03e63efaf479c7844b0c20983a454", 1727 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/digest.mjs": "b170cf6543920f6c12d147c6a8914f8e626d686226e50af820fc0effadfa413e", 1728 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/ecdhes.mjs": "5eb732da9266ebdeb62b424dd898523ddbf4c09ca6144e53cca86793e611d65b", 1729 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/encrypt.mjs": "5a8563d9813f837850edf6e814f535e36fc6373673850ec4e75221f0de3ee90e", 1730 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/generate.mjs": "b6e73ada71e897f6f189ef2e2ffa7a4a91fbaf675d6d0aa86d6121d4c68dc07a", 1731 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/get_sign_verify_key.mjs": "8e91861e258c0fdf9988b0460a113158a01294b5541c56292314e6f345caa6a6", 1732 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/is_key_like.mjs": "43e10261870d4a65beb24cb868befc0e9aaff002b9ebf90257ffdaf073c636d7", 1733 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/jwk_to_key.mjs": "46ef0a4df4d689f2065bac957dae4e6572071797675123a08749bf83992abacc", 1734 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/normalize_key.mjs": "0e915ab84055caa0f3e031f9d5a545608e22976d22b03b35485b38611a8c282e", 1735 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/pbes2kw.mjs": "d964c662b1e8cd72e143bf13fe90eb7213ce21fa7b4aadeebba8394e0ec32db8", 1736 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/random.mjs": "1fd349b6114345bbd8d67407dcb83efca1720b9b862a4e1ca232427149a167c0", 1737 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/rsaes.mjs": "12cdf94a5b92eec19456f9df4b8ef2265cad392612345c36aa28065506cb8c51", 1738 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/subtle_dsa.mjs": "04a41e3a9ac0f77c9b34b84be050ff0a27c2d768eadb30a464d57567f857cd46", 1739 + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/webcrypto.mjs": "a7ca0ccea9e87fa0698d48f5a0832cb28fea137705f4c494ff3f3c83bde57cf1", 1740 + "https://esm.sh/jose@5.10.0/denonext/errors.mjs": "10bd291dfa016ffa8a5228e18bbc0c147b24c88725061bec323d1c1498bfde3b", 1741 + "https://esm.sh/jose@5.10.0/denonext/jose.mjs": "745abba7b218a451fb747ab7250eb67bf62c7eaa0d2ed98fc7db4320b3ac2371", 1742 + "https://esm.sh/jose@5.10.0/denonext/jwe/compact/decrypt.mjs": "868abeef0f4bc4bf499bbb4d64febc9121bf7f9d01132df8e19b7d7d50a0af07", 1743 + "https://esm.sh/jose@5.10.0/denonext/jwe/compact/encrypt.mjs": "f0063936a5a8f9e4c50a978ad0bb23baf842eb20dc4e4982fa5363045685871e", 1744 + "https://esm.sh/jose@5.10.0/denonext/jwe/flattened/decrypt.mjs": "49596d5a985ab0a850eb7924f53888253669f059f4687320790cbe04641ddea8", 1745 + "https://esm.sh/jose@5.10.0/denonext/jwe/flattened/encrypt.mjs": "b70bb208e1cefcd08758fe39af6e9bc46dd475b3182c209c084dd6fd6575819b", 1746 + "https://esm.sh/jose@5.10.0/denonext/jwe/general/decrypt.mjs": "16d59263b205635a9063a9c6256d92373d1e32ddf632d1ccc06a1a4c0cf769f7", 1747 + "https://esm.sh/jose@5.10.0/denonext/jwe/general/encrypt.mjs": "6acc66f0eee89603c2bb5089af9cef5f579ab38533c3e0fe49625b479736efaa", 1748 + "https://esm.sh/jose@5.10.0/denonext/jwk/embedded.mjs": "c13d8092a672bba2ce7fcf6d94804f89ce278842f829a041a1c8eef6019bb489", 1749 + "https://esm.sh/jose@5.10.0/denonext/jwk/thumbprint.mjs": "428799b05c6ab4455e0d34a2974be42053f3fbcee2af5a7c829dcfc4d457aab7", 1750 + "https://esm.sh/jose@5.10.0/denonext/jwks/local.mjs": "2f1492c3761af03bae601c48494d43b481740dcb01286461a0589f0978033696", 1751 + "https://esm.sh/jose@5.10.0/denonext/jwks/remote.mjs": "7c352605a7b5f7048f139452253ad5705db74ed7391e36bbe6be3e947b83fd83", 1752 + "https://esm.sh/jose@5.10.0/denonext/jws/compact/sign.mjs": "4f345eac0d98cf5074193e251879b67b9c6b5d4aea6648f0e19169776f4ee59f", 1753 + "https://esm.sh/jose@5.10.0/denonext/jws/compact/verify.mjs": "25d3749082196faefe6ca4b656b2aba0a3c030e21a6b8b06355459dc203549e7", 1754 + "https://esm.sh/jose@5.10.0/denonext/jws/flattened/sign.mjs": "c00c6af48d50c0d6d50490ec24666bcabb85b4f2cdef1216fd2eb7c1fff2959e", 1755 + "https://esm.sh/jose@5.10.0/denonext/jws/flattened/verify.mjs": "d5fe93eb720b2ea659be49bbf0cadcea137de0024edd5c630ab058a69691fae7", 1756 + "https://esm.sh/jose@5.10.0/denonext/jws/general/sign.mjs": "612872a9dda21c24756b95fdfd8555cd5e7a7541e996fdfa95d0f68a3545c4d8", 1757 + "https://esm.sh/jose@5.10.0/denonext/jws/general/verify.mjs": "fc43cdd11c19eb9e8636b3710d4728a36f82480c19b2e75bfd9a9f4c31f7d029", 1758 + "https://esm.sh/jose@5.10.0/denonext/jwt/decode.mjs": "40b1699324c4c97c95661ae286fff14c5b18dabe6d96343b04c31456ef73026a", 1759 + "https://esm.sh/jose@5.10.0/denonext/jwt/decrypt.mjs": "acdf2a910bb295403edc53e7fb5f098e8d8c45c59cd079082745abd9b225f22e", 1760 + "https://esm.sh/jose@5.10.0/denonext/jwt/encrypt.mjs": "3fe7a9dde4a875028bbd72828c86a1fcf82f168a8eeee69ce1662a6b2a4ea635", 1761 + "https://esm.sh/jose@5.10.0/denonext/jwt/sign.mjs": "490e0d0f9f16eb648362686ec477694a37065fc5c7a4c64c5b1e6ddb2e281248", 1762 + "https://esm.sh/jose@5.10.0/denonext/jwt/unsecured.mjs": "f20d4176b9b09f31460d141899d860b0d56d5dae4429f7625b1186ea0807489b", 1763 + "https://esm.sh/jose@5.10.0/denonext/jwt/verify.mjs": "8baef7b4f3d23422fb51192d1df07326719db00f8fc601b35463fd8515c45a3e", 1764 + "https://esm.sh/jose@5.10.0/denonext/key/export.mjs": "817e555aa3e0f87a9d4715affd72447f93e3bb0e4c8feafc16095f826759efcd", 1765 + "https://esm.sh/jose@5.10.0/denonext/key/generate/keypair.mjs": "5722cb2dc742d9e1f9eec179288294a13a7c26b8b273b25a3e28830c7017b687", 1766 + "https://esm.sh/jose@5.10.0/denonext/key/generate/secret.mjs": "74453b742576819a5f5245f7fc47617b5da766a60afd9751b5b1e14a099c9fff", 1767 + "https://esm.sh/jose@5.10.0/denonext/key/import.mjs": "e488ba70e5eee01134d352c7ba00e3eb25093252c05a63e9d6e4185b2e6836eb", 1768 + "https://esm.sh/jose@5.10.0?target=denonext": "43705c1f40e5191081bcac2851ad8265f03c23bf751f9b84260ac2874f8ce209", 1651 1769 "https://esm.sh/lines-and-columns@1.2.4/denonext/lines-and-columns.mjs": "785cd1f5843f3645f9304248e4cf77987a71c6e2e7207d5b5200c9ea8ed67cdc", 1652 1770 "https://esm.sh/lines-and-columns@1.2.4?target=denonext": "24df63eccd321681ded34cf71de26b252de505ac6fe86fff5f5fafb810f86441", 1771 + "https://esm.sh/lru-cache@10.4.3/denonext/lru-cache.mjs": "ba5ee5ff9067a3a33de530b47c0ce7e81cdff92937e5519258ed422b7e23fbdb", 1772 + "https://esm.sh/lru-cache@10.4.3?target=denonext": "e0a3f66d0dbb61c67fbec24fb29ba1b18e21dab43178cfba399481560e076382", 1653 1773 "https://esm.sh/merge2@1.4.1/denonext/merge2.mjs": "b7e2fe0b629b75aabc963fd1e6635d6dcf59f5f2df42111df1ced9d3d064fcec", 1654 1774 "https://esm.sh/merge2@1.4.1?target=denonext": "a1286ee0e809c60cde57dcd9357fe3979d10abf74324608c83eb5640088c5053", 1655 1775 "https://esm.sh/micromatch@4.0.8/denonext/micromatch.mjs": "3663f155546be362a116c4a6bcececb00df29ed5870b308809ddb255ade2a78b", 1656 1776 "https://esm.sh/micromatch@4.0.8?target=denonext": "5e66db24ea49ffe179d951391cb92d5173e4911a45a6793d189a83861dae0b2e", 1777 + "https://esm.sh/multiformats@9.9.0/bases/base64?target=denonext": "9622b652809e84b8cbdc3834d15a306da9a9305552527668b13b1b16a6d686da", 1778 + "https://esm.sh/multiformats@9.9.0/basics?target=denonext": "97fa53d99c2a3aa56367e5e2a34ab3d1b3dc496e4a4fe490460d2955de707361", 1779 + "https://esm.sh/multiformats@9.9.0/cid?target=denonext": "be24427188844af21bc0b29187229c4c6e5a681b676db65b8c7fcf5277652b4b", 1780 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base10.mjs": "07ac037675bfbbf0621e7f8fd3cfeb242d1ab0955d7e965f4f3a2daa1c369b85", 1781 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base16.mjs": "7f0c9b5860c52b54170cbc8b058fe46eee1b81f52d0908055d38d2a63ec8b721", 1782 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base2.mjs": "46527ded4d9b868600b2fd8902398a31226655790bd3c5f61ffa0bd8737b0698", 1783 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base256emoji.mjs": "7c16b9576b295024837fe5d192f0b854951ac3a7c0be1be8a3c91d5f62505066", 1784 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base32.mjs": "2c42d149c299e8b8934e51ccb284b01b113d3fe432177a55b7a781d10cfbe5b2", 1785 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base36.mjs": "52dfe773e2d2650ed87c7c353e909a0d710ed83cb01eb553858eae4879a6664d", 1786 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base58.mjs": "d45f93c89f6f8a05c7ddc132c99a2bc866d1de2e8475747b6722f6322482feab", 1787 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base64.mjs": "1365d8ab96a8998be1663e7277eebc58d3207f785c9ab53533966626f153461b", 1788 + "https://esm.sh/multiformats@9.9.0/denonext/bases/base8.mjs": "9336d2259eb06c31fd0d1e7e5ae36e0826f39b2f73639849a403933348c7526c", 1789 + "https://esm.sh/multiformats@9.9.0/denonext/bases/identity.mjs": "28acc5f7d4dfe7d5647e1c8d250540a50ba6397ff4f375bc41dc37fc5d5de510", 1790 + "https://esm.sh/multiformats@9.9.0/denonext/basics.mjs": "edd1f5f7171a026940535586a6682c88f036b972a0158d10db2a5936239182ec", 1791 + "https://esm.sh/multiformats@9.9.0/denonext/cid.mjs": "1945384d570468b0bb5bd0f394184835038d5778d701b50b6b7eb7273748d288", 1792 + "https://esm.sh/multiformats@9.9.0/denonext/codecs/json.mjs": "a31ef601f2480daa1ed34393e91f937cef522517ca7d934b86939f8d761fe077", 1793 + "https://esm.sh/multiformats@9.9.0/denonext/codecs/raw.mjs": "6d6b44e3bea526dd9930d61631709f45e9f10bf2e190dc19168e9b0297fb30dd", 1794 + "https://esm.sh/multiformats@9.9.0/denonext/esm/src/bases/base.mjs": "f0057681c3f918b72d77de38d89d1f532ae4fc78b86f35db7f617c81e7ac504f", 1795 + "https://esm.sh/multiformats@9.9.0/denonext/esm/src/bytes.mjs": "d2fa273fd87212f525dcd3863af8a3d2ca1e3ee42aca3eaee5ddd4ad6e43ba04", 1796 + "https://esm.sh/multiformats@9.9.0/denonext/esm/src/varint.mjs": "5ea3af2ab0109f1e9f4f56fe35883f593f6b047899ada90095a5ed518d635899", 1797 + "https://esm.sh/multiformats@9.9.0/denonext/hashes/digest.mjs": "fc07873514b182ae0897159ebdcad3dd3ceced04740aa76caf4b2e796ff6ca25", 1798 + "https://esm.sh/multiformats@9.9.0/denonext/hashes/hasher.mjs": "44bfd064461927c2e8f161db65053d711e59e3df4b55b76bb3f9bf4c316492ad", 1799 + "https://esm.sh/multiformats@9.9.0/denonext/hashes/identity.mjs": "43eaf0a3160c8344e2f70387d0a124f3f21363d82d3e246a7a7df4053c6199e4", 1800 + "https://esm.sh/multiformats@9.9.0/denonext/hashes/sha2.mjs": "a0fd2e20d8753f6ca30db815bb7f20a57e2a23dd691384b11d07b5a52dbec74f", 1801 + "https://esm.sh/multiformats@9.9.0/denonext/multiformats.mjs": "7449f492d80b1dcffcbbfb5599707e5f9c0e5a54694532f330b0f64defe27809", 1657 1802 "https://esm.sh/nanoid@3.3.11/denonext/non-secure.mjs": "1f166118c1c4b4d4b5356ef0050fed87acf28cdb8a76813803fee72188f18b30", 1658 1803 "https://esm.sh/nanoid@3.3.11/non-secure?target=denonext": "ac0c34cc5f9846db51a5d868ce6ee815f831a19b1d57a1b8bae9226fc8d68dec", 1659 1804 "https://esm.sh/node-releases@2.0.19/data/processed/envs.json?module": "62fef61ca0cdd9c90f89cdbf60280aa1ebff036ddb965f4174e69a30e6efb196", ··· 1717 1862 "https://esm.sh/postcss@8.5.6?target=denonext": "d74fb26c8e5f2355773381813a2514b103cd99d9262961b6d43148f714f343da", 1718 1863 "https://esm.sh/queue-microtask@1.2.3/denonext/queue-microtask.mjs": "b0e153a240d836527feea7b9ecfa99fa8e5a5ef7e48b43092b7cecd8649a8712", 1719 1864 "https://esm.sh/queue-microtask@1.2.3?target=denonext": "fc6002fc339a8edbab36e4e6df1d245a0c3a5dc507edf4e5fb7e857f8b117aa2", 1865 + "https://esm.sh/react-dom@19.1.1/client": "e610fc905fb8a0f45ef487496e6084a9c46e6a9b1b1fc9e77ae388d8a9489a9f", 1866 + "https://esm.sh/react-dom@19.1.1/denonext/cjs/react-dom-server-legacy.browser.production.mjs": "46093e4d958c744635246158bbe9d1448c1168acc16ee248a1cb744c0194cc72", 1867 + "https://esm.sh/react-dom@19.1.1/denonext/cjs/react-dom-server.browser.production.mjs": "1b65edfd064bcb0377f63e6d3d15176967ead3acd6b3aec869bd194e48522676", 1868 + "https://esm.sh/react-dom@19.1.1/denonext/client.mjs": "747fb2c2a65ba2fc0e191c6be104de92f26e7b3559425fd2bebc71decf9358c9", 1869 + "https://esm.sh/react-dom@19.1.1/denonext/react-dom.mjs": "a31239e9832b73257ff344fb3d8292982ee25cbc1da5edab9ba81648c30f4abd", 1870 + "https://esm.sh/react-dom@19.1.1/denonext/server.mjs": "513c3f84f3402259c315ae6788c2dd9e671e8dc2adfa2f37d51165e156b4932f", 1871 + "https://esm.sh/react-dom@19.1.1/server": "d8d537b44c19a05a7805396eac77f18c628e1019fb2a61cb1f1a1bce0eeeb939", 1872 + "https://esm.sh/react@19.1.1": "4583aedf2a721df5ea4aa7308de82b5bcbee12e5ed7910061940f7434982847d", 1873 + "https://esm.sh/react@19.1.1/denonext/react.mjs": "588ff2562af9e974efdb79cc945049768bf5ee0252543fd8fb6a48472f3db587", 1720 1874 "https://esm.sh/reusify@1.1.0/denonext/reusify.mjs": "3b91b42988a3ec3984cef34b99cd5f67b4a008609c3d4fc5d35e8f2d1aab8cef", 1721 1875 "https://esm.sh/reusify@1.1.0?target=denonext": "aea1fd894bd8993f740cf053799f9639ee649122854c1fe4a5425d5aa2dc5e96", 1722 1876 "https://esm.sh/run-parallel@1.2.0/denonext/run-parallel.mjs": "77808968c9de972bb725e73559c80e64bf9524b7d2f781941115d023fd42e7b3", 1723 1877 "https://esm.sh/run-parallel@1.2.0?target=denonext": "2acc47cfa930a6c5e502877b2e5ee9cd2a2ec81e4fcc579f3c0bdebe32590de6", 1878 + "https://esm.sh/scheduler@0.26.0/denonext/scheduler.mjs": "b62267951094a7c42b7170c51e31f57198981b08ebfae60be0d076101a4c6f91", 1879 + "https://esm.sh/scheduler@0.26.0?target=denonext": "102f3b685ea5271452bd93de89ab0d99668aecb08f7706e3b9c6629699dd92e0", 1724 1880 "https://esm.sh/source-map-js@1.2.1/denonext/source-map-js.mjs": "2129223e17c258b391a47907a69c0b86d1c87cbb66eea7e9b25ff555ec0bbc7c", 1725 1881 "https://esm.sh/source-map-js@1.2.1?target=denonext": "33ba5cf2ee7c1fe6b63b36c31e9075e290bc5c574055acbdc48c2f24a21d2f83", 1726 1882 "https://esm.sh/sucrase@3.35.0/denonext/sucrase.mjs": "1d1c05878a5f0656226ee064c90845d01adf23b2bff84521480ffaad6da16d21", ··· 1729 1885 "https://esm.sh/tailwindcss@3.4.17/denonext/tailwindcss.mjs": "382a6a4ed82273daead6e2eb6af426822a3fbf7303387ee49db16be7699f8b45", 1730 1886 "https://esm.sh/tailwindcss@4.1.12/denonext/plugin.mjs": "349369852f7afd8ca09ef1682d94766d02e84bc45f927d0f02b374b20be70c9f", 1731 1887 "https://esm.sh/tailwindcss@4.1.12/plugin?target=denonext": "05b784ebe25c01018a0eab3fe1e1dab62bdbceb114e2371e748f967552510c00", 1888 + "https://esm.sh/tlds@1.259.0/denonext/tlds.mjs": "574135861b248c619a791bd6a1769ee6b5b45d1d7e11f8d052c8e0e43ae6e009", 1889 + "https://esm.sh/tlds@1.259.0?target=denonext": "9a5c7ee3354f90209f3fee0255a201ec5c9f46d28dc500ac161325c945af7389", 1732 1890 "https://esm.sh/to-regex-range@5.0.1/denonext/to-regex-range.mjs": "3f099b66f908b58dd6ee20afd1fed4616ea02fd0c118dc91ff1ed3e72d795bc7", 1733 1891 "https://esm.sh/to-regex-range@5.0.1?target=denonext": "5d6ed8b93f9fc4009378f84ade74e2681c2264b37e79f978c557037c612086ed", 1734 1892 "https://esm.sh/ts-interface-checker@0.1.13/denonext/ts-interface-checker.mjs": "482a9d9214862af127455b80dbe15559b107bb8283dc4b6ba10da16757b3dfe8", 1735 1893 "https://esm.sh/ts-interface-checker@0.1.13?target=denonext": "b1c4bedafbacf4fc6ca1b02c22601fe4e3dee3d3dc14ca3e8fb6f8656a368e72", 1894 + "https://esm.sh/uint8arrays@3.0.0/denonext/compare.mjs": "2b8ed67b92836546e504b87733eacd3f0569050ea645920d3f2503e8e335cd01", 1895 + "https://esm.sh/uint8arrays@3.0.0/denonext/concat.mjs": "ce3cfbcdd3cc6d1d9fa75f13963c7398a377d8a1dbd6302820f2058f42545fc7", 1896 + "https://esm.sh/uint8arrays@3.0.0/denonext/equals.mjs": "2c9a9504f97abc172b755fb5069cb9b69aac2e177ad4bc2cf9afdd6a4a322694", 1897 + "https://esm.sh/uint8arrays@3.0.0/denonext/esm/src/util/bases.mjs": "03de06f47b410a6ed09da73d6e58696ca34ac4e51bce4a0bcfac5cf88c23b8da", 1898 + "https://esm.sh/uint8arrays@3.0.0/denonext/from-string.mjs": "6df06b3ed43db82fa33500d4ab01a97ae4ecef234f76e06c1774b915d913bbe3", 1899 + "https://esm.sh/uint8arrays@3.0.0/denonext/to-string.mjs": "bafce61afad1706118c9c6bd08d6d2f53dada2c0892b8fe14da8124e5951390c", 1900 + "https://esm.sh/uint8arrays@3.0.0/denonext/uint8arrays.mjs": "2627bbf05b4b496ffe067a4f090dd91d4aa7bc8c815d36f1e543531fb0d9342f", 1901 + "https://esm.sh/uint8arrays@3.0.0/denonext/xor.mjs": "cc93f46198dca299adc26ae5344768914923bbc88e78eefd28699d0ec28c8e71", 1736 1902 "https://esm.sh/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "083639894972cb68837eef26346c43bdd01357977149e0a4493f76192a4008b8", 1737 - "https://esm.sh/util-deprecate@1.0.2?target=denonext": "859f4df8ba771a4c33143185d3db6a7edb824fab1ed4f9a4b96ac0e6bc3ef1a4" 1903 + "https://esm.sh/util-deprecate@1.0.2?target=denonext": "859f4df8ba771a4c33143185d3db6a7edb824fab1ed4f9a4b96ac0e6bc3ef1a4", 1904 + "https://esm.sh/zod@3.25.76/denonext/zod.mjs": "9f643d0cc560840b7fa3b6e6fc3a5a41595f12ff8863cac0ccbae3ec98989284", 1905 + "https://esm.sh/zod@3.25.76?target=denonext": "7d2e5b7450d6f99b9b3b228958bd1291d5a1f8378f82b8cdd2ce83b2f14961c2" 1738 1906 }, 1739 1907 "workspace": { 1740 1908 "dependencies": [
+58 -41
main-index.ts
··· 6 6 import { extractDid } from "./utils/identity.ts"; 7 7 import { config } from "./config.ts"; 8 8 import { compile, devWatch } from "./shared-landing/build.ts"; 9 - let { js, html, css } = await compile("index"); 10 - 11 9 // ------------------------------------------ 12 10 // AppView Setup 13 11 // ------------------------------------------ ··· 18 16 }; 19 17 export const genericIndexServer = new IndexServer(indexServerConfig); 20 18 setupSystemDb(genericIndexServer.systemDB); 19 + 20 + let { js, html, css } = await compile({ 21 + target: "index", 22 + initialData: { 23 + config: config.indexServer, 24 + users: (await genericIndexServer.unspeccedGetRegisteredUsers()) ?? [], 25 + }, 26 + }); 21 27 22 28 // add me lol 23 29 genericIndexServer.systemDB.exec(` ··· 68 74 // "/xrpc/party.whey.app.bsky.feed.getListFeedPartial", 69 75 // ]); 70 76 const placeholderselfcheckstatus = { 71 - "#skylite_index:/xrpc/app.bsky.actor.getProfile": "green", 72 - "#skylite_index:/xrpc/app.bsky.actor.getProfiles": "green", 73 - "#skylite_index:/xrpc/app.bsky.feed.getActorFeeds": "green", 74 - "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerator": "green", 75 - "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerators": "green", 76 - "#skylite_index:/xrpc/app.bsky.feed.getPosts": "green", 77 - "#skylite_index:/xrpc/app.bsky.graph.getLists": "black", 78 - "#skylite_index:/xrpc/app.bsky.graph.getList": "black", 79 - "#skylite_index:/xrpc/app.bsky.graph.getActorStarterPacks": "black", 80 - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getActorLikesPartial": "green", 81 - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getAuthorFeedPartial": "green", 82 - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getLikesPartial": "orange", 83 - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getPostThreadPartial": "green", 84 - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getQuotesPartial": "orange", 85 - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getRepostedByPartial": "orange", 77 + "#skylite_index:/xrpc/app.bsky.actor.getProfile": "green", 78 + "#skylite_index:/xrpc/app.bsky.actor.getProfiles": "green", 79 + "#skylite_index:/xrpc/app.bsky.feed.getActorFeeds": "green", 80 + "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerator": "green", 81 + "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerators": "green", 82 + "#skylite_index:/xrpc/app.bsky.feed.getPosts": "green", 83 + "#skylite_index:/xrpc/app.bsky.graph.getLists": "black", 84 + "#skylite_index:/xrpc/app.bsky.graph.getList": "black", 85 + "#skylite_index:/xrpc/app.bsky.graph.getActorStarterPacks": "black", 86 + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getActorLikesPartial": "green", 87 + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getAuthorFeedPartial": "green", 88 + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getLikesPartial": "orange", 89 + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getPostThreadPartial": "green", 90 + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getQuotesPartial": "orange", 91 + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getRepostedByPartial": 92 + "orange", 86 93 "#skylite_index:/xrpc/party.whey.app.bsky.feed.getListFeedPartial": "black", 87 - 88 94 89 - 90 - 91 - "constellation:/links": "green", 92 - "constellation:/links/distinct-dids": "green", 93 - "constellation:/links/count": "green", 94 - "constellation:/links/count/distinct-dids": "green", 95 - "constellation:/links/all": "green", 95 + "constellation:/links": "green", 96 + "constellation:/links/distinct-dids": "green", 97 + "constellation:/links/count": "green", 98 + "constellation:/links/count/distinct-dids": "green", 99 + "constellation:/links/all": "green", 96 100 }; 97 - 98 101 99 102 //console.log("ready to serve"); 100 103 Deno.serve( ··· 104 107 const pathname = url.pathname; 105 108 const searchParams = searchParamsToJson(url.searchParams); 106 109 107 - const publicdir = "/public" 110 + const publicdir = "/public"; 108 111 if (pathname.startsWith(publicdir)) { 109 112 const filepath = decodeURIComponent(pathname.slice(publicdir.length)); 110 113 try { ··· 114 117 return new Response("404 Not Found", { status: 404 }); 115 118 } 116 119 } 117 - 118 - const todopleasespecthis = "/_unspecced" 120 + 121 + const todopleasespecthis = "/_unspecced"; 119 122 if (pathname.startsWith(todopleasespecthis)) { 120 - const unspeccedroute = decodeURIComponent(pathname.slice(todopleasespecthis.length)); 123 + const unspeccedroute = decodeURIComponent( 124 + pathname.slice(todopleasespecthis.length) 125 + ); 121 126 if (unspeccedroute === "/config") { 122 127 const safeconfig = { 123 128 inviteOnly: config.indexServer.inviteOnly, 124 129 //port: number, 125 130 did: config.indexServer.did, 126 131 host: config.indexServer.host, 127 - } 132 + }; 128 133 return new Response(JSON.stringify(safeconfig), { 129 - headers: withCors({ "content-type": "application/json; charset=utf-8" }), 134 + headers: withCors({ 135 + "content-type": "application/json; charset=utf-8", 136 + }), 130 137 }); 131 138 } 132 139 if (unspeccedroute === "/users") { 133 - const res = await genericIndexServer.unspeccedGetRegisteredUsers() 140 + const res = await genericIndexServer.unspeccedGetRegisteredUsers(); 134 141 return new Response(JSON.stringify(res), { 135 - headers: withCors({ "content-type": "application/json; charset=utf-8" }), 142 + headers: withCors({ 143 + "content-type": "application/json; charset=utf-8", 144 + }), 136 145 }); 137 146 } 138 147 if (unspeccedroute === "/apitest") { 139 148 return new Response(JSON.stringify(placeholderselfcheckstatus), { 140 - headers: withCors({ "content-type": "application/json; charset=utf-8" }), 149 + headers: withCors({ 150 + "content-type": "application/json; charset=utf-8", 151 + }), 141 152 }); 142 153 } 143 154 } ··· 169 180 }), 170 181 }); 171 182 } 172 - 173 183 174 184 if (pathname === "/.well-known/did.json") { 175 185 return new Response( ··· 231 241 } 232 242 ); 233 243 234 - devWatch("index", ({ js: newjs, html: newhtml, css: newcss }) => { 235 - js = newjs; 236 - html = newhtml; 237 - css = newcss; 238 - }); 244 + devWatch({ 245 + target: "index", 246 + initialData: { 247 + config: config.indexServer, 248 + users: (await genericIndexServer.unspeccedGetRegisteredUsers()) ?? [], 249 + }, 250 + onBuild: ({ js: newjs, html: newhtml, css: newcss }) => { 251 + js = newjs; 252 + html = newhtml; 253 + css = newcss; 254 + }, 255 + });
+38 -18
main-view.ts
··· 6 6 import { extractDid } from "./utils/identity.ts"; 7 7 import { config } from "./config.ts"; 8 8 import { compile, devWatch } from "./shared-landing/build.ts"; 9 - let { js, html, css } = await compile("view"); 10 9 11 10 // ------------------------------------------ 12 11 // AppView Setup ··· 24 23 }; 25 24 export const genericViewServer = new ViewServer(viewServerConfig); 26 25 setupSystemDb(genericViewServer.systemDB); 26 + let { js, html, css } = await compile({ 27 + target: "view", 28 + initialData: { 29 + config: config.viewServer, 30 + users: (await genericViewServer.unspeccedGetRegisteredUsers()) ?? [], 31 + }, 32 + }); 27 33 28 34 // add me lol 29 35 genericViewServer.systemDB.exec(` ··· 107 113 "#bsky_appview:/xrpc/app.bsky.video.getJobStatus": "black", 108 114 "#bsky_appview:/xrpc/app.bsky.video.getUploadLimits": "black", 109 115 "#bsky_appview:/xrpc/app.bsky.video.uploadVideo": "black", 110 - "#bsky_appview:/xrpc/app.bsky.unspecced.getTrendingTopics":"red", 111 - "#bsky_appview:/xrpc/app.bsky.unspecced.getConfig":"red", 112 - } 116 + "#bsky_appview:/xrpc/app.bsky.unspecced.getTrendingTopics": "red", 117 + "#bsky_appview:/xrpc/app.bsky.unspecced.getConfig": "red", 118 + }; 113 119 114 120 Deno.serve( 115 121 { port: config.viewServer.port }, ··· 118 124 const pathname = url.pathname; 119 125 const searchParams = searchParamsToJson(url.searchParams); 120 126 121 - const publicdir = "/public" 127 + const publicdir = "/public"; 122 128 if (pathname.startsWith(publicdir)) { 123 129 const filepath = decodeURIComponent(pathname.slice(publicdir.length)); 124 130 try { ··· 129 135 } 130 136 } 131 137 132 - const todopleasespecthis = "/_unspecced" 138 + const todopleasespecthis = "/_unspecced"; 133 139 if (pathname.startsWith(todopleasespecthis)) { 134 - const unspeccedroute = decodeURIComponent(pathname.slice(todopleasespecthis.length)); 140 + const unspeccedroute = decodeURIComponent( 141 + pathname.slice(todopleasespecthis.length) 142 + ); 135 143 if (unspeccedroute === "/config") { 136 144 const safeconfig = { 137 145 inviteOnly: config.viewServer.inviteOnly, ··· 139 147 did: config.viewServer.did, 140 148 host: config.viewServer.host, 141 149 indexPriority: config.viewServer.indexPriority, 142 - } 150 + }; 143 151 return new Response(JSON.stringify(safeconfig), { 144 - headers: withCors({ "content-type": "application/json; charset=utf-8" }), 152 + headers: withCors({ 153 + "content-type": "application/json; charset=utf-8", 154 + }), 145 155 }); 146 156 } 147 157 if (unspeccedroute === "/users") { 148 - const res = await genericViewServer.unspeccedGetRegisteredUsers() 158 + const res = await genericViewServer.unspeccedGetRegisteredUsers(); 149 159 return new Response(JSON.stringify(res), { 150 - headers: withCors({ "content-type": "application/json; charset=utf-8" }), 160 + headers: withCors({ 161 + "content-type": "application/json; charset=utf-8", 162 + }), 151 163 }); 152 164 } 153 165 if (unspeccedroute === "/apitest") { 154 166 return new Response(JSON.stringify(placeholderselfcheckstatus), { 155 - headers: withCors({ "content-type": "application/json; charset=utf-8" }), 167 + headers: withCors({ 168 + "content-type": "application/json; charset=utf-8", 169 + }), 156 170 }); 157 171 } 158 172 } ··· 223 237 } 224 238 ); 225 239 226 - 227 - devWatch("view", ({ js: newjs, html: newhtml, css: newcss }) => { 228 - js = newjs; 229 - html = newhtml; 230 - css = newcss; 231 - }); 240 + devWatch({ 241 + target: "view", 242 + initialData: { 243 + config: config.viewServer, 244 + users: await genericViewServer.unspeccedGetRegisteredUsers() ?? [], 245 + }, 246 + onBuild: ({ js: newjs, html: newhtml, css: newcss }) => { 247 + js = newjs; 248 + html = newhtml; 249 + css = newcss; 250 + }, 251 + });
+22
public/client-metadata.json
··· 1 + { 2 + "client_id": "https://local3768forumtest.whey.party/client-metadata.json", 3 + "client_name": "ForumTest", 4 + "client_uri": "https://local3768forumtest.whey.party", 5 + "logo_uri": "https://local3768forumtest.whey.party/logo192.png", 6 + "tos_uri": "https://local3768forumtest.whey.party/terms-of-service", 7 + "policy_uri": "https://local3768forumtest.whey.party/privacy-policy", 8 + "redirect_uris": [ 9 + "https://local3768forumtest.whey.party/callback" 10 + ], 11 + "scope": "atproto transition:generic", 12 + "grant_types": [ 13 + "authorization_code", 14 + "refresh_token" 15 + ], 16 + "response_types": [ 17 + "code" 18 + ], 19 + "token_endpoint_auth_method": "none", 20 + "application_type": "web", 21 + "dpop_bound_access_tokens": true 22 + }
+9
shared-landing/browser/ClientOnly.tsx
··· 1 + 'use client'; 2 + import React from "https://esm.sh/react@19.1.1"; 3 + import { useEffect, useState } from 'https://esm.sh/react@19.1.1'; 4 + 5 + export function ClientOnly({ children }: { children: React.ReactNode }) { 6 + const [mounted, setMounted] = useState(false); 7 + useEffect(() => setMounted(true), []); 8 + return mounted ? <>{children}</> : null; 9 + }
+6 -4
shared-landing/browser/landing-index.tsx
··· 2 2 import { createRoot, hydrateRoot } from "https://esm.sh/react-dom@19.1.1/client"; 3 3 import * as ATPAPI from "https://esm.sh/@atproto/api"; 4 4 import { AuthProvider } from "../browser/passauthprovider.tsx"; 5 - import { App } from "../browser/landing-shared.tsx"; 5 + import { Root } from "../browser/landing-shared.tsx"; 6 + 7 + const initialDataEl = document.getElementById("initial-data"); 8 + const initialData = initialDataEl ? JSON.parse(initialDataEl.textContent!) : undefined; 9 + // rule of thumb this is the only place where we can do browser-only code 6 10 7 11 createRoot(document.getElementById("root")!).render( 8 - <AuthProvider> 9 - <App type="index" /> 10 - </AuthProvider> 12 + <Root type="index" initialData={initialData}/> 11 13 ); 12 14 //hydrateRoot(document.getElementById("root")!, <App />);
+65 -8
shared-landing/browser/landing-shared.tsx
··· 64 64 <span> 65 65 Skylite {capitaltitle} Server{" "} 66 66 {instancehost && ( 67 - <span className="text-sm">({/*instancehost*/"alpha"})</span> 67 + <span className="text-sm">({/*instancehost*/ "alpha"})</span> 68 68 )} 69 69 </span> 70 70 </div> ··· 269 269 return ( 270 270 <> 271 271 <h2 className="text-xl font-semibold text-gray-700 mb-2"> 272 - About <span className="">{instanceConfig.name}</span> ( 273 - {window.location.hostname}) 272 + About <span className="">{instanceConfig.name}</span> ({config?.host}) 274 273 </h2> 275 274 <p className="text-gray-600">{instanceConfig.description}</p> 276 275 {config && ( ··· 571 570 ); 572 571 } 573 572 574 - export function App({ type }: { type: "index" | "view" }) { 573 + export function App({ 574 + type, 575 + initialData, 576 + }: { 577 + type: "index" | "view"; 578 + initialData?: { 579 + config: { 580 + inviteOnly: boolean; 581 + //port: number; 582 + did: string; 583 + host: string; 584 + indexPriority?: string[]; 585 + }; 586 + users: { 587 + did: string; 588 + role: string; 589 + registrationdate: string; 590 + onboardingstatus: string; 591 + pfp?: string; 592 + displayname: string; 593 + handle: string; 594 + }[]; 595 + }; 596 + }) { 575 597 const { agent, loginStatus, loading } = useAuth(); 598 + console.log("hasinitialdata?",initialData ? true : false); 576 599 const [users, setUsers] = useState< 577 600 { 578 601 did: string; ··· 583 606 displayname: string; 584 607 handle: string; 585 608 }[] 586 - >([]); 587 - const [usersLoading, setUsersLoading] = useState(true); 609 + >(initialData?.users ?? []); 610 + const [usersLoading, setUsersLoading] = useState(!initialData?.users?.length); 611 + 588 612 589 613 const isIndex = type === "index"; 590 614 const capitaltitle = isIndex ? "Index" : "View"; ··· 598 622 indexPriority?: string[]; 599 623 } 600 624 | undefined 601 - >(); 602 - const [configloading, setconfigloading] = useState(true); 625 + >(initialData?.config ?? undefined); 626 + const [configloading, setconfigloading] = useState(!initialData?.config); 603 627 useEffect(() => { 628 + if (config) return 604 629 async function fetchConfig() { 605 630 try { 606 631 const response = await fetch("/_unspecced/config"); ··· 618 643 }, []); 619 644 620 645 useEffect(() => { 646 + if (users.length) return 621 647 async function fetchUsers() { 622 648 try { 623 649 const response = await fetch("/_unspecced/users"); ··· 693 719 </div> 694 720 ); 695 721 } 722 + 723 + export function Root({ 724 + type, 725 + initialData, 726 + }: { 727 + type: "index" | "view"; 728 + initialData?: { 729 + config: { 730 + inviteOnly: boolean; 731 + //port: number; 732 + did: string; 733 + host: string; 734 + indexPriority?: string[]; 735 + }; 736 + users: { 737 + did: string; 738 + role: string; 739 + registrationdate: string; 740 + onboardingstatus: string; 741 + pfp?: string; 742 + displayname: string; 743 + handle: string; 744 + }[]; 745 + }; 746 + }) { 747 + return ( 748 + <AuthProvider> 749 + <App type={type} initialData={initialData} /> 750 + </AuthProvider> 751 + ); 752 + }
+6 -4
shared-landing/browser/landing-view.tsx
··· 2 2 import { createRoot, hydrateRoot } from "https://esm.sh/react-dom@19.1.1/client"; 3 3 import * as ATPAPI from "https://esm.sh/@atproto/api"; 4 4 import { AuthProvider } from "./passauthprovider.tsx"; 5 - import { App } from "./landing-shared.tsx"; 5 + import { Root } from "./landing-shared.tsx"; 6 + 7 + const initialDataEl = document.getElementById("initial-data"); 8 + const initialData = initialDataEl ? JSON.parse(initialDataEl.textContent!) : undefined; 9 + // rule of thumb this is the only place where we can do browser-only code 6 10 7 11 createRoot(document.getElementById("root")!).render( 8 - <AuthProvider> 9 - <App type="view" /> 10 - </AuthProvider> 12 + <Root type="view" initialData={initialData}/> 11 13 ); 12 14 //hydrateRoot(document.getElementById("root")!, <App />);
+100 -12
shared-landing/build.ts
··· 5 5 import tailwindcss from "https://esm.sh/tailwindcss@3"; 6 6 import postcss from "https://esm.sh/postcss@8"; 7 7 import autoprefixer from "https://esm.sh/autoprefixer@10"; 8 + import { renderToString } from "https://esm.sh/react-dom@19.1.1/server"; 9 + import { createElement } from "https://esm.sh/react@19.1.1"; 10 + import { Root } from "./browser/landing-shared.tsx"; 8 11 9 12 // helper build function 10 - async function build(entry: string) { 13 + async function build({ 14 + entry, 15 + initialData, 16 + }: { 17 + entry: "index" | "view"; 18 + initialData?: { 19 + config: { 20 + inviteOnly: boolean; 21 + //port: number; 22 + did: string; 23 + host: string; 24 + indexPriority?: string[]; 25 + }; 26 + users: { 27 + did: string; 28 + role: string; 29 + registrationdate: string; 30 + onboardingstatus: string; 31 + pfp?: string; 32 + displayname: string; 33 + handle: string; 34 + }[]; 35 + }; 36 + }) { 11 37 const template = await Deno.readTextFile( 12 38 `./shared-landing/template-${entry}.html` 13 39 ); ··· 27 53 loader: { ".tsx": "tsx" }, 28 54 jsxFactory: "React.createElement", 29 55 jsxFragment: "React.Fragment", 30 - platform: "browser", 56 + platform: "neutral", //"browser", 31 57 external: ["react/jsx-runtime", "react/compiler-runtime"], 32 58 plugins: [ 33 59 cache({ importmap, directory: "./cache" }), ··· 56 82 const html = template.replace( 57 83 "<!--SCRIPT-INJECT-->", 58 84 `<script type="module" src="/landing-${entry}.js?v=${jshash}"></script> 59 - <link href="./app.css?v=${csshash}" rel="stylesheet">` 85 + <link href="./app.css?v=${csshash}" rel="stylesheet"> 86 + <style>${cssResult}</style> 87 + <script id="initial-data" type="application/json"> 88 + ${JSON.stringify(initialData)} 89 + </script>` 60 90 ); 91 + // const html = template.replace( 92 + // "<!--SCRIPT-INJECT-->", 93 + // `<script type="module" src="/landing-${entry}.js?v=${jshash}"></script> 94 + // <link href="./app.css?v=${csshash}" rel="stylesheet">` 95 + // ); 96 + const ssr = renderToString( 97 + createElement( 98 + () => 99 + Root({ 100 + type: entry, 101 + initialData 102 + }), 103 + null 104 + ) 105 + ); 106 + const ssrhtml = html.replace("<!--APP-INJECT-->", `${ssr}`); 61 107 62 - return { js, html, css: cssResult.css }; 108 + return { js, html: ssrhtml, css: cssResult.css }; 63 109 } 64 110 65 111 // public compile function 66 - export async function compile(target: "index" | "view") { 67 - return await build(target); 112 + export async function compile({ 113 + target, 114 + initialData 115 + }: { 116 + target: "index" | "view"; 117 + initialData?: { 118 + config: { 119 + inviteOnly: boolean; 120 + //port: number; 121 + did: string; 122 + host: string; 123 + indexPriority?: string[]; 124 + }; 125 + users: { 126 + did: string; 127 + role: string; 128 + registrationdate: string; 129 + onboardingstatus: string; 130 + pfp?: string; 131 + displayname: string; 132 + handle: string; 133 + }[]; 134 + }; 135 + }) { 136 + return await build({entry: target, initialData}); 68 137 } 69 138 70 139 // watch loop 71 - export async function devWatch( 140 + export async function devWatch({target,initialData,onBuild}:{ 72 141 target: "index" | "view", 142 + initialData?: { 143 + config: { 144 + inviteOnly: boolean; 145 + //port: number; 146 + did: string; 147 + host: string; 148 + indexPriority?: string[]; 149 + }; 150 + users: { 151 + did: string; 152 + role: string; 153 + registrationdate: string; 154 + onboardingstatus: string; 155 + pfp?: string; 156 + displayname: string; 157 + handle: string; 158 + }[]; 159 + }, 73 160 onBuild: (data: { js: string; html: string; css: string }) => void 161 + } 74 162 ) { 75 163 for await (const event of Deno.watchFs(".")) { 76 164 if (event.paths.some((p) => p.endsWith(".tsx"))) { 77 165 console.log("Rebuilding bundle…"); 78 - const data = await compile(target); 166 + const data = await compile({target,initialData}); 79 167 onBuild(data); 80 168 } 81 169 } ··· 84 172 async function hashString(content: string): Promise<string> { 85 173 const encoder = new TextEncoder(); 86 174 const data = encoder.encode(content); 87 - 175 + 88 176 // SHA-256 hash 89 177 const hashBuffer = await crypto.subtle.digest("SHA-256", data); 90 - 178 + 91 179 // Convert buffer to hex string 92 180 return Array.from(new Uint8Array(hashBuffer)) 93 - .map(b => b.toString(16).padStart(2, "0")) 181 + .map((b) => b.toString(16).padStart(2, "0")) 94 182 .join("") 95 183 .slice(0, 8); // optional: shorten hash for filenames 96 - } 184 + }
+1 -1
shared-landing/template-index.html
··· 9 9 <!--SCRIPT-INJECT--> 10 10 </head> 11 11 <body class="bg-gray-100 min-h-screen flex items-center justify-center"> 12 - <div class="flex flex-1 flex-col" id="root"></div> 12 + <div class="flex flex-1 flex-col" id="root"><!--APP-INJECT--></div> 13 13 </body> 14 14 </html>
+1 -1
shared-landing/template-view.html
··· 9 9 <!--SCRIPT-INJECT--> 10 10 </head> 11 11 <body class="bg-gray-100 min-h-screen flex items-center justify-center"> 12 - <div class="flex flex-1 flex-col" id="root"></div> 12 + <div class="flex flex-1 flex-col" id="root"><!--APP-INJECT--></div> 13 13 </body> 14 14 </html>