grain.social is a photo sharing platform built on atproto.

host font files instead of reaching out to google

Changed files
+370 -18
src
static
+3 -1
deno.json
··· 19 19 "tasks": { 20 20 "start": "deno run -A ./src/main.tsx", 21 21 "dev": "deno run \"dev:*\"", 22 - "build": "deno task build:static && deno task build:tailwind", 22 + "build": "deno task build:static && deno task build:tailwind && deno task build:fonts", 23 23 "build:static": "deno run -A jsr:@bigmoves/bff-cli@0.3.0-beta.37 build src/static/mod.ts", 24 24 "build:tailwind": "deno run -A --node-modules-dir npm:@tailwindcss/cli -i ./src/input.css -o ./build/styles.css --minify", 25 + "build:fonts": "rm -rf ./build/fonts && cp -r ./static/fonts/. ./build/fonts", 25 26 "dev:build": "DEV=true deno -A --watch=src/static/ jsr:@bigmoves/bff-cli@0.3.0-beta.37 build src/static/mod.ts", 26 27 "dev:server": "deno run -A --watch ./src/main.tsx", 27 28 "dev:tailwind": "deno run -A --node-modules-dir npm:@tailwindcss/cli -i ./src/input.css -o ./build/styles.css --watch", 29 + "dev:fonts": "rm -rf ./build/fonts && cp -r ./static/fonts/. ./build/fonts", 28 30 "sync": "deno run -A --env=.env jsr:@bigmoves/bff-cli@0.3.0-beta.37 sync --collections=social.grain.gallery,social.grain.actor.profile,social.grain.photo,social.grain.favorite,social.grain.gallery.item,social.grain.graph.follow --external-collections=app.bsky.actor.profile,app.bsky.graph.follow,sh.tangled.graph.follow,sh.tangled.actor.profile", 29 31 "codegen": "deno run -A jsr:@bigmoves/bff-cli@0.3.0-beta.37 lexgen" 30 32 },
+353 -6
deno.lock
··· 3 3 "specifiers": { 4 4 "jsr:@bigmoves/atproto-oauth-client@0.2": "0.2.0", 5 5 "jsr:@bigmoves/bff@0.3.0-beta.37": "0.3.0-beta.37", 6 + "jsr:@deno/gfm@0.10": "0.10.0", 7 + "jsr:@denosaurs/emoji@0.3": "0.3.1", 8 + "jsr:@luca/esbuild-deno-loader@~0.11.1": "0.11.1", 9 + "jsr:@std/assert@^1.0.12": "1.0.13", 6 10 "jsr:@std/assert@^1.0.13": "1.0.13", 11 + "jsr:@std/async@^1.0.12": "1.0.12", 12 + "jsr:@std/bytes@^1.0.2": "1.0.6", 7 13 "jsr:@std/cache@0.2": "0.2.0", 14 + "jsr:@std/cli@^1.0.16": "1.0.20", 8 15 "jsr:@std/cli@^1.0.20": "1.0.20", 16 + "jsr:@std/data-structures@^1.0.6": "1.0.7", 9 17 "jsr:@std/encoding@^1.0.10": "1.0.10", 18 + "jsr:@std/encoding@^1.0.5": "1.0.10", 10 19 "jsr:@std/fmt@^1.0.8": "1.0.8", 20 + "jsr:@std/fs@^1.0.16": "1.0.18", 11 21 "jsr:@std/fs@^1.0.18": "1.0.18", 12 22 "jsr:@std/html@^1.0.4": "1.0.4", 13 23 "jsr:@std/http@^1.0.13": "1.0.18", ··· 15 25 "jsr:@std/internal@^1.0.6": "1.0.8", 16 26 "jsr:@std/media-types@^1.1.0": "1.1.0", 17 27 "jsr:@std/net@^1.0.4": "1.0.4", 28 + "jsr:@std/path@^1.0.6": "1.1.0", 18 29 "jsr:@std/path@^1.0.8": "1.1.0", 19 30 "jsr:@std/path@^1.0.9": "1.1.0", 20 31 "jsr:@std/path@^1.1.0": "1.1.0", 21 32 "jsr:@std/streams@^1.0.10": "1.0.10", 33 + "jsr:@std/testing@^1.0.11": "1.0.11", 22 34 "npm:@atproto-labs/handle-resolver-node@~0.1.14": "0.1.16", 23 35 "npm:@atproto-labs/simple-store@~0.1.2": "0.1.2", 24 36 "npm:@atproto/api@~0.15.7": "0.15.14", ··· 34 46 "npm:@atproto/xrpc-server@*": "0.7.19", 35 47 "npm:@atproto/xrpc-server@0.7.18": "0.7.18", 36 48 "npm:@tailwindcss/cli@*": "4.1.9", 49 + "npm:@tailwindcss/cli@^4.0.12": "4.1.9", 50 + "npm:@tailwindcss/cli@^4.1.3": "4.1.9", 37 51 "npm:@tailwindcss/cli@^4.1.4": "4.1.9", 38 52 "npm:@types/node@*": "22.15.15", 39 53 "npm:clsx@^2.1.1": "2.1.1", 40 54 "npm:date-fns@^4.1.0": "4.1.0", 55 + "npm:esbuild@~0.25.5": "0.25.5", 41 56 "npm:exifr@^7.1.3": "7.1.3", 57 + "npm:github-slugger@2": "2.0.0", 58 + "npm:he@^1.2.0": "1.2.0", 42 59 "npm:htmx.org@^1.9.12": "1.9.12", 43 60 "npm:hyperscript.org@~0.9.14": "0.9.14", 44 61 "npm:jose@5.9.6": "5.9.6", 62 + "npm:katex@0.16": "0.16.22", 63 + "npm:marked-alert@2": "2.1.2_marked@12.0.2", 64 + "npm:marked-footnote@^1.2.0": "1.2.4_marked@12.0.2", 65 + "npm:marked-gfm-heading-id@^3.1.0": "3.2.0_marked@12.0.2", 66 + "npm:marked@12": "12.0.2", 45 67 "npm:multiformats@*": "13.3.7", 46 68 "npm:multiformats@^13.3.2": "13.3.7", 47 69 "npm:popmotion@^11.0.5": "11.0.5", 48 70 "npm:preact-render-to-string@^6.5.13": "6.5.13_preact@10.26.9", 49 71 "npm:preact@^10.26.5": "10.26.9", 72 + "npm:prismjs@^1.29.0": "1.30.0", 73 + "npm:sanitize-html@^2.13.0": "2.17.0", 50 74 "npm:sortablejs@^1.15.6": "1.15.6", 51 75 "npm:tailwind-merge@^3.2.0": "3.3.1", 76 + "npm:tailwindcss@^4.0.12": "4.1.9", 77 + "npm:tailwindcss@^4.1.3": "4.1.9", 52 78 "npm:tailwindcss@^4.1.4": "4.1.9", 53 79 "npm:typed-htmx@~0.3.1": "0.3.1" 54 80 }, ··· 68 94 "integrity": "0b6203729c667642bfaa7481bf0fdddb55050b77db9dc6d3857f5a96548a6e3f", 69 95 "dependencies": [ 70 96 "jsr:@bigmoves/atproto-oauth-client", 71 - "jsr:@std/assert", 97 + "jsr:@std/assert@^1.0.13", 72 98 "jsr:@std/cache", 73 99 "jsr:@std/fmt", 74 100 "jsr:@std/http@^1.0.13", ··· 88 114 "npm:tailwind-merge" 89 115 ] 90 116 }, 117 + "@deno/gfm@0.10.0": { 118 + "integrity": "51708205e3559a4aeb6afb29d07c5bfafe7941f91bb360351ef6621de9a39527", 119 + "dependencies": [ 120 + "jsr:@denosaurs/emoji", 121 + "npm:github-slugger", 122 + "npm:he", 123 + "npm:katex", 124 + "npm:marked", 125 + "npm:marked-alert", 126 + "npm:marked-footnote", 127 + "npm:marked-gfm-heading-id", 128 + "npm:prismjs", 129 + "npm:sanitize-html" 130 + ] 131 + }, 132 + "@denosaurs/emoji@0.3.1": { 133 + "integrity": "b0aed5f55dec99e83da7c9637fe0a36d1d6252b7c99deaaa3fc5dea3fcf3da8b" 134 + }, 135 + "@luca/esbuild-deno-loader@0.11.1": { 136 + "integrity": "dc020d16d75b591f679f6b9288b10f38bdb4f24345edb2f5732affa1d9885267", 137 + "dependencies": [ 138 + "jsr:@std/bytes", 139 + "jsr:@std/encoding@^1.0.5", 140 + "jsr:@std/path@^1.0.6" 141 + ] 142 + }, 91 143 "@std/assert@1.0.13": { 92 144 "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29", 93 145 "dependencies": [ 94 146 "jsr:@std/internal" 95 147 ] 96 148 }, 149 + "@std/async@1.0.12": { 150 + "integrity": "d1bfcec459e8012846fe4e38dfc4241ab23240ecda3d8d6dfcf6d81a632e803d" 151 + }, 152 + "@std/bytes@1.0.6": { 153 + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" 154 + }, 97 155 "@std/cache@0.2.0": { 98 156 "integrity": "63a2ccd5a9e7c03e430f7d34dfcfd0d0cfc90731a1eaf8208f4c66e418fc3035" 99 157 }, 100 158 "@std/cli@1.0.20": { 101 159 "integrity": "a8c384a2c98cec6ec6a2055c273a916e2772485eb784af0db004c5ab8ba52333" 102 160 }, 161 + "@std/data-structures@1.0.7": { 162 + "integrity": "16932d2c8d281f65eaaa2209af2473209881e33b1ced54cd1b015e7b4cdbb0d2" 163 + }, 103 164 "@std/encoding@1.0.10": { 104 165 "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" 105 166 }, ··· 107 168 "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" 108 169 }, 109 170 "@std/fs@1.0.18": { 110 - "integrity": "24bcad99eab1af4fde75e05da6e9ed0e0dce5edb71b7e34baacf86ffe3969f3a" 171 + "integrity": "24bcad99eab1af4fde75e05da6e9ed0e0dce5edb71b7e34baacf86ffe3969f3a", 172 + "dependencies": [ 173 + "jsr:@std/path@^1.1.0" 174 + ] 111 175 }, 112 176 "@std/html@1.0.4": { 113 177 "integrity": "eff3497c08164e6ada49b7f81a28b5108087033823153d065e3f89467dd3d50e" ··· 115 179 "@std/http@1.0.18": { 116 180 "integrity": "8d9546aa532c52a0cf318c74616db0638b4c1073405355d1b14f9e1591dccf20", 117 181 "dependencies": [ 118 - "jsr:@std/cli", 119 - "jsr:@std/encoding", 182 + "jsr:@std/cli@^1.0.20", 183 + "jsr:@std/encoding@^1.0.10", 120 184 "jsr:@std/fmt", 121 - "jsr:@std/fs", 185 + "jsr:@std/fs@^1.0.18", 122 186 "jsr:@std/html", 123 187 "jsr:@std/media-types", 124 188 "jsr:@std/net", ··· 140 204 }, 141 205 "@std/streams@1.0.10": { 142 206 "integrity": "75c0b1431873cd0d8b3d679015220204d36d3c7420d93b60acfc379eb0dc30af" 207 + }, 208 + "@std/testing@1.0.11": { 209 + "integrity": "12b3db12d34f0f385a26248933bde766c0f8c5ad8b6ab34d4d38f528ab852f48", 210 + "dependencies": [ 211 + "jsr:@std/assert@^1.0.12", 212 + "jsr:@std/async", 213 + "jsr:@std/data-structures", 214 + "jsr:@std/fs@^1.0.16", 215 + "jsr:@std/internal", 216 + "jsr:@std/path@^1.0.8" 217 + ] 143 218 } 144 219 }, 145 220 "npm": { ··· 412 487 "tslib@2.8.1" 413 488 ] 414 489 }, 490 + "@esbuild/aix-ppc64@0.25.5": { 491 + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", 492 + "os": ["aix"], 493 + "cpu": ["ppc64"] 494 + }, 495 + "@esbuild/android-arm64@0.25.5": { 496 + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", 497 + "os": ["android"], 498 + "cpu": ["arm64"] 499 + }, 500 + "@esbuild/android-arm@0.25.5": { 501 + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", 502 + "os": ["android"], 503 + "cpu": ["arm"] 504 + }, 505 + "@esbuild/android-x64@0.25.5": { 506 + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", 507 + "os": ["android"], 508 + "cpu": ["x64"] 509 + }, 510 + "@esbuild/darwin-arm64@0.25.5": { 511 + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", 512 + "os": ["darwin"], 513 + "cpu": ["arm64"] 514 + }, 515 + "@esbuild/darwin-x64@0.25.5": { 516 + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", 517 + "os": ["darwin"], 518 + "cpu": ["x64"] 519 + }, 520 + "@esbuild/freebsd-arm64@0.25.5": { 521 + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", 522 + "os": ["freebsd"], 523 + "cpu": ["arm64"] 524 + }, 525 + "@esbuild/freebsd-x64@0.25.5": { 526 + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", 527 + "os": ["freebsd"], 528 + "cpu": ["x64"] 529 + }, 530 + "@esbuild/linux-arm64@0.25.5": { 531 + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", 532 + "os": ["linux"], 533 + "cpu": ["arm64"] 534 + }, 535 + "@esbuild/linux-arm@0.25.5": { 536 + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", 537 + "os": ["linux"], 538 + "cpu": ["arm"] 539 + }, 540 + "@esbuild/linux-ia32@0.25.5": { 541 + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", 542 + "os": ["linux"], 543 + "cpu": ["ia32"] 544 + }, 545 + "@esbuild/linux-loong64@0.25.5": { 546 + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", 547 + "os": ["linux"], 548 + "cpu": ["loong64"] 549 + }, 550 + "@esbuild/linux-mips64el@0.25.5": { 551 + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", 552 + "os": ["linux"], 553 + "cpu": ["mips64el"] 554 + }, 555 + "@esbuild/linux-ppc64@0.25.5": { 556 + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", 557 + "os": ["linux"], 558 + "cpu": ["ppc64"] 559 + }, 560 + "@esbuild/linux-riscv64@0.25.5": { 561 + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", 562 + "os": ["linux"], 563 + "cpu": ["riscv64"] 564 + }, 565 + "@esbuild/linux-s390x@0.25.5": { 566 + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", 567 + "os": ["linux"], 568 + "cpu": ["s390x"] 569 + }, 570 + "@esbuild/linux-x64@0.25.5": { 571 + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", 572 + "os": ["linux"], 573 + "cpu": ["x64"] 574 + }, 575 + "@esbuild/netbsd-arm64@0.25.5": { 576 + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", 577 + "os": ["netbsd"], 578 + "cpu": ["arm64"] 579 + }, 580 + "@esbuild/netbsd-x64@0.25.5": { 581 + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", 582 + "os": ["netbsd"], 583 + "cpu": ["x64"] 584 + }, 585 + "@esbuild/openbsd-arm64@0.25.5": { 586 + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", 587 + "os": ["openbsd"], 588 + "cpu": ["arm64"] 589 + }, 590 + "@esbuild/openbsd-x64@0.25.5": { 591 + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", 592 + "os": ["openbsd"], 593 + "cpu": ["x64"] 594 + }, 595 + "@esbuild/sunos-x64@0.25.5": { 596 + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", 597 + "os": ["sunos"], 598 + "cpu": ["x64"] 599 + }, 600 + "@esbuild/win32-arm64@0.25.5": { 601 + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", 602 + "os": ["win32"], 603 + "cpu": ["arm64"] 604 + }, 605 + "@esbuild/win32-ia32@0.25.5": { 606 + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", 607 + "os": ["win32"], 608 + "cpu": ["ia32"] 609 + }, 610 + "@esbuild/win32-x64@0.25.5": { 611 + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", 612 + "os": ["win32"], 613 + "cpu": ["x64"] 614 + }, 415 615 "@ipld/dag-cbor@7.0.3": { 416 616 "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 417 617 "dependencies": [ ··· 803 1003 "commander@2.20.3": { 804 1004 "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 805 1005 }, 1006 + "commander@8.3.0": { 1007 + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" 1008 + }, 806 1009 "content-disposition@0.5.4": { 807 1010 "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 808 1011 "dependencies": [ ··· 827 1030 "ms@2.0.0" 828 1031 ] 829 1032 }, 1033 + "deepmerge@4.3.1": { 1034 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" 1035 + }, 830 1036 "depd@2.0.0": { 831 1037 "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 832 1038 }, ··· 840 1046 "detect-libc@2.0.4": { 841 1047 "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" 842 1048 }, 1049 + "dom-serializer@2.0.0": { 1050 + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 1051 + "dependencies": [ 1052 + "domelementtype", 1053 + "domhandler", 1054 + "entities" 1055 + ] 1056 + }, 1057 + "domelementtype@2.3.0": { 1058 + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" 1059 + }, 1060 + "domhandler@5.0.3": { 1061 + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 1062 + "dependencies": [ 1063 + "domelementtype" 1064 + ] 1065 + }, 1066 + "domutils@3.2.2": { 1067 + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 1068 + "dependencies": [ 1069 + "dom-serializer", 1070 + "domelementtype", 1071 + "domhandler" 1072 + ] 1073 + }, 843 1074 "dunder-proto@1.0.1": { 844 1075 "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 845 1076 "dependencies": [ ··· 864 1095 "tapable" 865 1096 ] 866 1097 }, 1098 + "entities@4.5.0": { 1099 + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" 1100 + }, 867 1101 "es-define-property@1.0.1": { 868 1102 "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" 869 1103 }, ··· 876 1110 "es-errors" 877 1111 ] 878 1112 }, 1113 + "esbuild@0.25.5": { 1114 + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", 1115 + "optionalDependencies": [ 1116 + "@esbuild/aix-ppc64", 1117 + "@esbuild/android-arm", 1118 + "@esbuild/android-arm64", 1119 + "@esbuild/android-x64", 1120 + "@esbuild/darwin-arm64", 1121 + "@esbuild/darwin-x64", 1122 + "@esbuild/freebsd-arm64", 1123 + "@esbuild/freebsd-x64", 1124 + "@esbuild/linux-arm", 1125 + "@esbuild/linux-arm64", 1126 + "@esbuild/linux-ia32", 1127 + "@esbuild/linux-loong64", 1128 + "@esbuild/linux-mips64el", 1129 + "@esbuild/linux-ppc64", 1130 + "@esbuild/linux-riscv64", 1131 + "@esbuild/linux-s390x", 1132 + "@esbuild/linux-x64", 1133 + "@esbuild/netbsd-arm64", 1134 + "@esbuild/netbsd-x64", 1135 + "@esbuild/openbsd-arm64", 1136 + "@esbuild/openbsd-x64", 1137 + "@esbuild/sunos-x64", 1138 + "@esbuild/win32-arm64", 1139 + "@esbuild/win32-ia32", 1140 + "@esbuild/win32-x64" 1141 + ], 1142 + "scripts": true, 1143 + "bin": true 1144 + }, 879 1145 "escape-html@1.0.3": { 880 1146 "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1147 + }, 1148 + "escape-string-regexp@4.0.0": { 1149 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 881 1150 }, 882 1151 "etag@1.8.1": { 883 1152 "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" ··· 985 1254 "es-object-atoms" 986 1255 ] 987 1256 }, 1257 + "github-slugger@2.0.0": { 1258 + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" 1259 + }, 988 1260 "gopd@1.2.0": { 989 1261 "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 990 1262 }, ··· 1003 1275 "function-bind" 1004 1276 ] 1005 1277 }, 1278 + "he@1.2.0": { 1279 + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1280 + "bin": true 1281 + }, 1006 1282 "hey-listen@1.0.8": { 1007 1283 "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" 1008 1284 }, 1285 + "htmlparser2@8.0.2": { 1286 + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 1287 + "dependencies": [ 1288 + "domelementtype", 1289 + "domhandler", 1290 + "domutils", 1291 + "entities" 1292 + ] 1293 + }, 1009 1294 "htmx.org@1.9.12": { 1010 1295 "integrity": "sha512-VZAohXyF7xPGS52IM8d1T1283y+X4D+Owf3qY1NZ9RuBypyu9l8cGsxUMAG5fEAb/DhT7rDoJ9Hpu5/HxFD3cw==" 1011 1296 }, ··· 1057 1342 "is-number@7.0.0": { 1058 1343 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1059 1344 }, 1345 + "is-plain-object@5.0.0": { 1346 + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" 1347 + }, 1060 1348 "iso-datestring-validator@2.2.2": { 1061 1349 "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" 1062 1350 }, ··· 1067 1355 "jose@5.9.6": { 1068 1356 "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==" 1069 1357 }, 1358 + "katex@0.16.22": { 1359 + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", 1360 + "dependencies": [ 1361 + "commander@8.3.0" 1362 + ], 1363 + "bin": true 1364 + }, 1070 1365 "lightningcss-darwin-arm64@1.30.1": { 1071 1366 "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", 1072 1367 "os": ["darwin"], ··· 1147 1442 "markdown-it-deflist@2.1.0": { 1148 1443 "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" 1149 1444 }, 1445 + "marked-alert@2.1.2_marked@12.0.2": { 1446 + "integrity": "sha512-EFNRZ08d8L/iEIPLTlQMDjvwIsj03gxWCczYTht6DCiHJIZhMk4NK5gtPY9UqAYb09eV5VGT+jD4lp396E0I+w==", 1447 + "dependencies": [ 1448 + "marked" 1449 + ] 1450 + }, 1451 + "marked-footnote@1.2.4_marked@12.0.2": { 1452 + "integrity": "sha512-DB2Kl+wFh6YwZd70qABMY6WUkG1UuyqoNTFoDfGyG79Pz24neYtLBkB+45a7o72V7gkfvbC3CGzIYFobxfMT1Q==", 1453 + "dependencies": [ 1454 + "marked" 1455 + ] 1456 + }, 1457 + "marked-gfm-heading-id@3.2.0_marked@12.0.2": { 1458 + "integrity": "sha512-Xfxpr5lXLDLY10XqzSCA9l2dDaiabQUgtYM9hw8yunyVsB/xYBRpiic6BOiY/EAJw1ik1eWr1ET1HKOAPZBhXg==", 1459 + "dependencies": [ 1460 + "github-slugger", 1461 + "marked" 1462 + ] 1463 + }, 1464 + "marked@12.0.2": { 1465 + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", 1466 + "bin": true 1467 + }, 1150 1468 "math-intrinsics@1.1.0": { 1151 1469 "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 1152 1470 }, ··· 1206 1524 }, 1207 1525 "multiformats@9.9.0": { 1208 1526 "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 1527 + }, 1528 + "nanoid@3.3.11": { 1529 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1530 + "bin": true 1209 1531 }, 1210 1532 "negotiator@0.6.3": { 1211 1533 "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" ··· 1232 1554 "ee-first" 1233 1555 ] 1234 1556 }, 1557 + "parse-srcset@1.0.2": { 1558 + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" 1559 + }, 1235 1560 "parseurl@1.3.3": { 1236 1561 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1237 1562 }, ··· 1280 1605 "tslib@2.4.0" 1281 1606 ] 1282 1607 }, 1608 + "postcss@8.5.3": { 1609 + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1610 + "dependencies": [ 1611 + "nanoid", 1612 + "picocolors", 1613 + "source-map-js" 1614 + ] 1615 + }, 1283 1616 "preact-render-to-string@6.5.13_preact@10.26.9": { 1284 1617 "integrity": "sha512-iGPd+hKPMFKsfpR2vL4kJ6ZPcFIoWZEcBf0Dpm3zOpdVvj77aY8RlLiQji5OMrngEyaxGogeakTb54uS2FvA6w==", 1285 1618 "dependencies": [ ··· 1288 1621 }, 1289 1622 "preact@10.26.9": { 1290 1623 "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==" 1624 + }, 1625 + "prismjs@1.30.0": { 1626 + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" 1291 1627 }, 1292 1628 "process-warning@3.0.0": { 1293 1629 "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" ··· 1347 1683 }, 1348 1684 "safer-buffer@2.1.2": { 1349 1685 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1686 + }, 1687 + "sanitize-html@2.17.0": { 1688 + "integrity": "sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==", 1689 + "dependencies": [ 1690 + "deepmerge", 1691 + "escape-string-regexp", 1692 + "htmlparser2", 1693 + "is-plain-object", 1694 + "parse-srcset", 1695 + "postcss" 1696 + ] 1350 1697 }, 1351 1698 "send@0.19.0": { 1352 1699 "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", ··· 1480 1827 "dependencies": [ 1481 1828 "@jridgewell/source-map", 1482 1829 "acorn", 1483 - "commander", 1830 + "commander@2.20.3", 1484 1831 "source-map-support" 1485 1832 ], 1486 1833 "bin": true
-10
src/app.tsx
··· 31 31 props.ctx.fileFingerprints.get("styles.css") 32 32 }`} 33 33 /> 34 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 35 - <link 36 - rel="preconnect" 37 - href="https://fonts.gstatic.com" 38 - crossOrigin="anonymous" 39 - /> 40 - <link 41 - href="https://fonts.googleapis.com/css2?family=Jersey+20&display=swap" 42 - rel="stylesheet" 43 - /> 44 34 <link 45 35 rel="stylesheet" 46 36 href="https://unpkg.com/@fortawesome/fontawesome-free@6.7.2/css/all.min.css"
+8
src/input.css
··· 2 2 3 3 /* use to test light mode */ 4 4 /* @custom-variant dark (&:where(.dark, .dark *)); */ 5 + 6 + @font-face { 7 + font-family: "Jersey 20"; 8 + src: url("/build/fonts/Jersey20-Regular.ttf") format("truetype"); 9 + font-weight: normal; 10 + font-style: normal; 11 + font-display: swap; 12 + }
+6 -1
src/routes/record.ts
··· 10 10 import { galleryLink } from "../utils.ts"; 11 11 12 12 export const handler: RouteHandler = ( 13 - _req, 13 + req, 14 14 params, 15 15 ctx: BffContext<State>, 16 16 ) => { 17 + const url = new URL(req.url); 17 18 const { did, collection, rkey } = params; 19 + 20 + if (url.pathname.includes("/build/")) { 21 + return ctx.next(); // ignore build assets 22 + } 18 23 19 24 if (!did || !collection || !rkey) { 20 25 throw new BadRequestError("Invalid parameters for record handler");
static/fonts/Jersey20-Regular.ttf

This is a binary file and will not be displayed.