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

update pds settings, add create account dialog, update login copy

Changed files
+146 -392
local-infra
services
pds
src
static
+2 -8
README.md
··· 85 85 86 86 #### Install the root certificate on your machine 87 87 88 - First, get your Caddy container ID: 89 - 90 - ```bash 91 - docker ps 92 - ``` 93 - 94 - Then copy the cert out: 88 + Copy the cert out: 95 89 96 90 ```bash 97 - docker cp <caddy_container_id>:/data/pki/authorities/grain/root.crt ./grain-root.crt 91 + docker cp caddy:/data/pki/authorities/grain/root.crt ./grain-root.crt 98 92 ``` 99 93 100 94 Once you have grain-root.crt, install it:
+1 -1
deno.json
··· 2 2 "imports": { 3 3 "$lexicon/": "./__generated__/", 4 4 "@atproto/syntax": "npm:@atproto/syntax@^0.4.0", 5 - "@bigmoves/bff": "jsr:@bigmoves/bff@0.3.0-beta.30", 5 + "@bigmoves/bff": "jsr:@bigmoves/bff@0.3.0-beta.31", 6 6 "@std/http": "jsr:@std/http@^1.0.17", 7 7 "@std/path": "jsr:@std/path@^1.0.9", 8 8 "@tailwindcss/cli": "npm:@tailwindcss/cli@^4.1.4",
+36 -377
deno.lock
··· 1 1 { 2 2 "version": "5", 3 3 "specifiers": { 4 - "jsr:@deno/gfm@0.10": "0.10.0", 5 - "jsr:@denosaurs/emoji@0.3": "0.3.1", 6 - "jsr:@std/assert@^1.0.12": "1.0.13", 4 + "jsr:@bigmoves/atproto-oauth-client@0.2": "0.2.0", 5 + "jsr:@bigmoves/bff@0.3.0-beta.31": "0.3.0-beta.31", 7 6 "jsr:@std/assert@^1.0.13": "1.0.13", 8 - "jsr:@std/async@^1.0.12": "1.0.12", 9 - "jsr:@std/cache@0.2": "0.2.0", 10 - "jsr:@std/cli@^1.0.16": "1.0.18", 11 - "jsr:@std/cli@^1.0.18": "1.0.18", 12 - "jsr:@std/data-structures@^1.0.6": "1.0.7", 7 + "jsr:@std/cli@^1.0.18": "1.0.19", 13 8 "jsr:@std/encoding@^1.0.10": "1.0.10", 14 9 "jsr:@std/fmt@^1.0.8": "1.0.8", 15 - "jsr:@std/fs@^1.0.16": "1.0.17", 16 10 "jsr:@std/html@^1.0.4": "1.0.4", 17 11 "jsr:@std/http@^1.0.13": "1.0.17", 18 12 "jsr:@std/http@^1.0.17": "1.0.17", ··· 23 17 "jsr:@std/path@^1.0.9": "1.1.0", 24 18 "jsr:@std/path@^1.1.0": "1.1.0", 25 19 "jsr:@std/streams@^1.0.9": "1.0.9", 26 - "jsr:@std/testing@^1.0.11": "1.0.11", 27 20 "npm:@atproto-labs/handle-resolver-node@~0.1.14": "0.1.15", 28 21 "npm:@atproto-labs/simple-store@~0.1.2": "0.1.2", 29 22 "npm:@atproto/api@~0.15.7": "0.15.7", ··· 37 30 "npm:@atproto/syntax@0.4": "0.4.0", 38 31 "npm:@atproto/xrpc-server@*": "0.7.18", 39 32 "npm:@tailwindcss/cli@*": "4.1.7", 40 - "npm:@tailwindcss/cli@^4.0.12": "4.1.7", 41 - "npm:@tailwindcss/cli@^4.1.3": "4.1.7", 42 33 "npm:@tailwindcss/cli@^4.1.4": "4.1.7", 43 34 "npm:@types/node@*": "22.15.15", 44 35 "npm:clsx@^2.1.1": "2.1.1", 45 36 "npm:date-fns@^4.1.0": "4.1.0", 46 - "npm:github-slugger@2": "2.0.0", 47 - "npm:he@^1.2.0": "1.2.0", 48 37 "npm:jose@5.9.6": "5.9.6", 49 - "npm:katex@0.16": "0.16.22", 50 - "npm:marked-alert@2": "2.1.2_marked@12.0.2", 51 - "npm:marked-footnote@^1.2.0": "1.2.4_marked@12.0.2", 52 - "npm:marked-gfm-heading-id@^3.1.0": "3.2.0_marked@12.0.2", 53 - "npm:marked@12": "12.0.2", 54 38 "npm:multiformats@*": "13.3.4", 55 39 "npm:multiformats@^13.3.2": "13.3.4", 56 40 "npm:popmotion@^11.0.5": "11.0.5", 57 41 "npm:preact-render-to-string@^6.5.13": "6.5.13_preact@10.26.6", 58 42 "npm:preact@^10.26.5": "10.26.6", 59 - "npm:prismjs@^1.29.0": "1.30.0", 60 - "npm:sanitize-html@^2.13.0": "2.17.0", 61 - "npm:sharp@~0.34.1": "0.34.1", 62 43 "npm:tailwind-merge@^3.2.0": "3.3.0", 63 - "npm:tailwindcss@^4.0.12": "4.1.7", 64 - "npm:tailwindcss@^4.1.3": "4.1.7", 65 44 "npm:tailwindcss@^4.1.4": "4.1.7", 66 45 "npm:typed-htmx@~0.3.1": "0.3.1" 67 46 }, 68 47 "jsr": { 48 + "@bigmoves/atproto-oauth-client@0.2.0": { 49 + "integrity": "5c3ca124dd52eff51dace83790779ebe48c4b41559b799e16c8750bd415f2124", 50 + "dependencies": [ 51 + "npm:@atproto-labs/handle-resolver-node", 52 + "npm:@atproto-labs/simple-store", 53 + "npm:@atproto/jwk", 54 + "npm:@atproto/oauth-client", 55 + "npm:@atproto/oauth-types", 56 + "npm:jose" 57 + ] 58 + }, 69 59 "@bigmoves/bff@0.3.0-beta.21": { 70 60 "integrity": "1c83ac3abca2a9671b1ddadcdb38ed628704c5a14765ec20c54a4d05c46757dd", 71 61 "dependencies": [ ··· 74 64 "npm:tailwind-merge" 75 65 ] 76 66 }, 77 - "@deno/gfm@0.10.0": { 78 - "integrity": "51708205e3559a4aeb6afb29d07c5bfafe7941f91bb360351ef6621de9a39527", 67 + "@bigmoves/bff@0.3.0-beta.31": { 68 + "integrity": "2f0ec89088ff8099abeaec25af5a5998894c1dbdbed66cc6d3b0a9b2500b18e0", 79 69 "dependencies": [ 80 - "jsr:@denosaurs/emoji", 81 - "npm:github-slugger", 82 - "npm:he", 83 - "npm:katex", 84 - "npm:marked", 85 - "npm:marked-alert", 86 - "npm:marked-footnote", 87 - "npm:marked-gfm-heading-id", 88 - "npm:prismjs", 89 - "npm:sanitize-html" 70 + "jsr:@bigmoves/atproto-oauth-client", 71 + "jsr:@std/assert", 72 + "jsr:@std/fmt", 73 + "jsr:@std/http@^1.0.13", 74 + "jsr:@std/path@^1.0.8", 75 + "npm:@atproto/api", 76 + "npm:@atproto/common", 77 + "npm:@atproto/identity", 78 + "npm:@atproto/lexicon@~0.4.11", 79 + "npm:@atproto/oauth-client", 80 + "npm:@atproto/syntax", 81 + "npm:clsx", 82 + "npm:multiformats@^13.3.2", 83 + "npm:preact", 84 + "npm:preact-render-to-string", 85 + "npm:tailwind-merge" 90 86 ] 91 - }, 92 - "@denosaurs/emoji@0.3.1": { 93 - "integrity": "b0aed5f55dec99e83da7c9637fe0a36d1d6252b7c99deaaa3fc5dea3fcf3da8b" 94 87 }, 95 88 "@std/assert@1.0.13": { 96 89 "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29", ··· 98 91 "jsr:@std/internal" 99 92 ] 100 93 }, 101 - "@std/async@1.0.12": { 102 - "integrity": "d1bfcec459e8012846fe4e38dfc4241ab23240ecda3d8d6dfcf6d81a632e803d" 103 - }, 104 - "@std/cache@0.2.0": { 105 - "integrity": "63a2ccd5a9e7c03e430f7d34dfcfd0d0cfc90731a1eaf8208f4c66e418fc3035" 106 - }, 107 - "@std/cli@1.0.18": { 108 - "integrity": "33846eab6a7cac52156cc105a798451df06965693606e4668adfe0436a155fd7" 109 - }, 110 - "@std/data-structures@1.0.7": { 111 - "integrity": "16932d2c8d281f65eaaa2209af2473209881e33b1ced54cd1b015e7b4cdbb0d2" 94 + "@std/cli@1.0.19": { 95 + "integrity": "b3601a54891f89f3f738023af11960c4e6f7a45dc76cde39a6861124cba79e88" 112 96 }, 113 97 "@std/encoding@1.0.10": { 114 98 "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" ··· 116 100 "@std/fmt@1.0.8": { 117 101 "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" 118 102 }, 119 - "@std/fs@1.0.17": { 120 - "integrity": "1c00c632677c1158988ef7a004cb16137f870aafdb8163b9dce86ec652f3952b", 121 - "dependencies": [ 122 - "jsr:@std/path@^1.0.9" 123 - ] 124 - }, 125 103 "@std/html@1.0.4": { 126 104 "integrity": "eff3497c08164e6ada49b7f81a28b5108087033823153d065e3f89467dd3d50e" 127 105 }, 128 106 "@std/http@1.0.17": { 129 107 "integrity": "98aec8ab4080d95c21f731e3008f69c29c5012d12f1b4e553f85935db601569f", 130 108 "dependencies": [ 131 - "jsr:@std/cli@^1.0.18", 109 + "jsr:@std/cli", 132 110 "jsr:@std/encoding", 133 111 "jsr:@std/fmt", 134 112 "jsr:@std/html", ··· 152 130 }, 153 131 "@std/streams@1.0.9": { 154 132 "integrity": "a9d26b1988cdd7aa7b1f4b51e1c36c1557f3f252880fa6cc5b9f37078b1a5035" 155 - }, 156 - "@std/testing@1.0.11": { 157 - "integrity": "12b3db12d34f0f385a26248933bde766c0f8c5ad8b6ab34d4d38f528ab852f48", 158 - "dependencies": [ 159 - "jsr:@std/assert@^1.0.12", 160 - "jsr:@std/async", 161 - "jsr:@std/data-structures", 162 - "jsr:@std/fs", 163 - "jsr:@std/internal", 164 - "jsr:@std/path@^1.0.8" 165 - ] 166 133 } 167 134 }, 168 135 "npm": { ··· 419 386 "tslib@2.8.1" 420 387 ] 421 388 }, 422 - "@img/sharp-darwin-arm64@0.34.1": { 423 - "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", 424 - "optionalDependencies": [ 425 - "@img/sharp-libvips-darwin-arm64" 426 - ], 427 - "os": ["darwin"], 428 - "cpu": ["arm64"] 429 - }, 430 - "@img/sharp-darwin-x64@0.34.1": { 431 - "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", 432 - "optionalDependencies": [ 433 - "@img/sharp-libvips-darwin-x64" 434 - ], 435 - "os": ["darwin"], 436 - "cpu": ["x64"] 437 - }, 438 - "@img/sharp-libvips-darwin-arm64@1.1.0": { 439 - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", 440 - "os": ["darwin"], 441 - "cpu": ["arm64"] 442 - }, 443 - "@img/sharp-libvips-darwin-x64@1.1.0": { 444 - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", 445 - "os": ["darwin"], 446 - "cpu": ["x64"] 447 - }, 448 - "@img/sharp-libvips-linux-arm64@1.1.0": { 449 - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", 450 - "os": ["linux"], 451 - "cpu": ["arm64"] 452 - }, 453 - "@img/sharp-libvips-linux-arm@1.1.0": { 454 - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", 455 - "os": ["linux"], 456 - "cpu": ["arm"] 457 - }, 458 - "@img/sharp-libvips-linux-ppc64@1.1.0": { 459 - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", 460 - "os": ["linux"], 461 - "cpu": ["ppc64"] 462 - }, 463 - "@img/sharp-libvips-linux-s390x@1.1.0": { 464 - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", 465 - "os": ["linux"], 466 - "cpu": ["s390x"] 467 - }, 468 - "@img/sharp-libvips-linux-x64@1.1.0": { 469 - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", 470 - "os": ["linux"], 471 - "cpu": ["x64"] 472 - }, 473 - "@img/sharp-libvips-linuxmusl-arm64@1.1.0": { 474 - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", 475 - "os": ["linux"], 476 - "cpu": ["arm64"] 477 - }, 478 - "@img/sharp-libvips-linuxmusl-x64@1.1.0": { 479 - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", 480 - "os": ["linux"], 481 - "cpu": ["x64"] 482 - }, 483 - "@img/sharp-linux-arm64@0.34.1": { 484 - "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", 485 - "optionalDependencies": [ 486 - "@img/sharp-libvips-linux-arm64" 487 - ], 488 - "os": ["linux"], 489 - "cpu": ["arm64"] 490 - }, 491 - "@img/sharp-linux-arm@0.34.1": { 492 - "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", 493 - "optionalDependencies": [ 494 - "@img/sharp-libvips-linux-arm" 495 - ], 496 - "os": ["linux"], 497 - "cpu": ["arm"] 498 - }, 499 - "@img/sharp-linux-s390x@0.34.1": { 500 - "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", 501 - "optionalDependencies": [ 502 - "@img/sharp-libvips-linux-s390x" 503 - ], 504 - "os": ["linux"], 505 - "cpu": ["s390x"] 506 - }, 507 - "@img/sharp-linux-x64@0.34.1": { 508 - "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", 509 - "optionalDependencies": [ 510 - "@img/sharp-libvips-linux-x64" 511 - ], 512 - "os": ["linux"], 513 - "cpu": ["x64"] 514 - }, 515 - "@img/sharp-linuxmusl-arm64@0.34.1": { 516 - "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", 517 - "optionalDependencies": [ 518 - "@img/sharp-libvips-linuxmusl-arm64" 519 - ], 520 - "os": ["linux"], 521 - "cpu": ["arm64"] 522 - }, 523 - "@img/sharp-linuxmusl-x64@0.34.1": { 524 - "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", 525 - "optionalDependencies": [ 526 - "@img/sharp-libvips-linuxmusl-x64" 527 - ], 528 - "os": ["linux"], 529 - "cpu": ["x64"] 530 - }, 531 - "@img/sharp-wasm32@0.34.1": { 532 - "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", 533 - "dependencies": [ 534 - "@emnapi/runtime" 535 - ], 536 - "cpu": ["wasm32"] 537 - }, 538 - "@img/sharp-win32-ia32@0.34.1": { 539 - "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", 540 - "os": ["win32"], 541 - "cpu": ["ia32"] 542 - }, 543 - "@img/sharp-win32-x64@0.34.1": { 544 - "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", 545 - "os": ["win32"], 546 - "cpu": ["x64"] 547 - }, 548 389 "@ipld/dag-cbor@7.0.3": { 549 390 "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 550 391 "dependencies": [ ··· 919 760 "clsx@2.1.1": { 920 761 "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" 921 762 }, 922 - "color-convert@2.0.1": { 923 - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 924 - "dependencies": [ 925 - "color-name" 926 - ] 927 - }, 928 - "color-name@1.1.4": { 929 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 930 - }, 931 - "color-string@1.9.1": { 932 - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 933 - "dependencies": [ 934 - "color-name", 935 - "simple-swizzle" 936 - ] 937 - }, 938 - "color@4.2.3": { 939 - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 940 - "dependencies": [ 941 - "color-convert", 942 - "color-string" 943 - ] 944 - }, 945 - "commander@8.3.0": { 946 - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" 947 - }, 948 763 "content-disposition@0.5.4": { 949 764 "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 950 765 "dependencies": [ ··· 969 784 "ms@2.0.0" 970 785 ] 971 786 }, 972 - "deepmerge@4.3.1": { 973 - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" 974 - }, 975 787 "depd@2.0.0": { 976 788 "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 977 789 }, ··· 985 797 "detect-libc@2.0.4": { 986 798 "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" 987 799 }, 988 - "dom-serializer@2.0.0": { 989 - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 990 - "dependencies": [ 991 - "domelementtype", 992 - "domhandler", 993 - "entities" 994 - ] 995 - }, 996 - "domelementtype@2.3.0": { 997 - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" 998 - }, 999 - "domhandler@5.0.3": { 1000 - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 1001 - "dependencies": [ 1002 - "domelementtype" 1003 - ] 1004 - }, 1005 - "domutils@3.2.2": { 1006 - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 1007 - "dependencies": [ 1008 - "dom-serializer", 1009 - "domelementtype", 1010 - "domhandler" 1011 - ] 1012 - }, 1013 800 "dunder-proto@1.0.1": { 1014 801 "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 1015 802 "dependencies": [ ··· 1034 821 "tapable" 1035 822 ] 1036 823 }, 1037 - "entities@4.5.0": { 1038 - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" 1039 - }, 1040 824 "es-define-property@1.0.1": { 1041 825 "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" 1042 826 }, ··· 1051 835 }, 1052 836 "escape-html@1.0.3": { 1053 837 "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1054 - }, 1055 - "escape-string-regexp@4.0.0": { 1056 - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 1057 838 }, 1058 839 "etag@1.8.1": { 1059 840 "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" ··· 1158 939 "es-object-atoms" 1159 940 ] 1160 941 }, 1161 - "github-slugger@2.0.0": { 1162 - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" 1163 - }, 1164 942 "gopd@1.2.0": { 1165 943 "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 1166 944 }, ··· 1179 957 "function-bind" 1180 958 ] 1181 959 }, 1182 - "he@1.2.0": { 1183 - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1184 - "bin": true 1185 - }, 1186 960 "hey-listen@1.0.8": { 1187 961 "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" 1188 962 }, 1189 - "htmlparser2@8.0.2": { 1190 - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 1191 - "dependencies": [ 1192 - "domelementtype", 1193 - "domhandler", 1194 - "domutils", 1195 - "entities" 1196 - ] 1197 - }, 1198 963 "http-errors@2.0.0": { 1199 964 "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1200 965 "dependencies": [ ··· 1223 988 "ipaddr.js@2.2.0": { 1224 989 "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==" 1225 990 }, 1226 - "is-arrayish@0.3.2": { 1227 - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 1228 - }, 1229 991 "is-extglob@2.1.1": { 1230 992 "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 1231 993 }, ··· 1238 1000 "is-number@7.0.0": { 1239 1001 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1240 1002 }, 1241 - "is-plain-object@5.0.0": { 1242 - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" 1243 - }, 1244 1003 "iso-datestring-validator@2.2.2": { 1245 1004 "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" 1246 1005 }, ··· 1250 1009 }, 1251 1010 "jose@5.9.6": { 1252 1011 "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==" 1253 - }, 1254 - "katex@0.16.22": { 1255 - "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", 1256 - "dependencies": [ 1257 - "commander" 1258 - ], 1259 - "bin": true 1260 1012 }, 1261 1013 "lightningcss-darwin-arm64@1.30.1": { 1262 1014 "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", ··· 1335 1087 "@jridgewell/sourcemap-codec" 1336 1088 ] 1337 1089 }, 1338 - "marked-alert@2.1.2_marked@12.0.2": { 1339 - "integrity": "sha512-EFNRZ08d8L/iEIPLTlQMDjvwIsj03gxWCczYTht6DCiHJIZhMk4NK5gtPY9UqAYb09eV5VGT+jD4lp396E0I+w==", 1340 - "dependencies": [ 1341 - "marked" 1342 - ] 1343 - }, 1344 - "marked-footnote@1.2.4_marked@12.0.2": { 1345 - "integrity": "sha512-DB2Kl+wFh6YwZd70qABMY6WUkG1UuyqoNTFoDfGyG79Pz24neYtLBkB+45a7o72V7gkfvbC3CGzIYFobxfMT1Q==", 1346 - "dependencies": [ 1347 - "marked" 1348 - ] 1349 - }, 1350 - "marked-gfm-heading-id@3.2.0_marked@12.0.2": { 1351 - "integrity": "sha512-Xfxpr5lXLDLY10XqzSCA9l2dDaiabQUgtYM9hw8yunyVsB/xYBRpiic6BOiY/EAJw1ik1eWr1ET1HKOAPZBhXg==", 1352 - "dependencies": [ 1353 - "github-slugger", 1354 - "marked" 1355 - ] 1356 - }, 1357 - "marked@12.0.2": { 1358 - "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", 1359 - "bin": true 1360 - }, 1361 1090 "math-intrinsics@1.1.0": { 1362 1091 "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 1363 1092 }, ··· 1418 1147 "multiformats@9.9.0": { 1419 1148 "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 1420 1149 }, 1421 - "nanoid@3.3.11": { 1422 - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1423 - "bin": true 1424 - }, 1425 1150 "negotiator@0.6.3": { 1426 1151 "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1427 1152 }, ··· 1446 1171 "dependencies": [ 1447 1172 "ee-first" 1448 1173 ] 1449 - }, 1450 - "parse-srcset@1.0.2": { 1451 - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" 1452 1174 }, 1453 1175 "parseurl@1.3.3": { 1454 1176 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" ··· 1498 1220 "tslib@2.4.0" 1499 1221 ] 1500 1222 }, 1501 - "postcss@8.5.3": { 1502 - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1503 - "dependencies": [ 1504 - "nanoid", 1505 - "picocolors", 1506 - "source-map-js" 1507 - ] 1508 - }, 1509 1223 "preact-render-to-string@6.5.13_preact@10.26.6": { 1510 1224 "integrity": "sha512-iGPd+hKPMFKsfpR2vL4kJ6ZPcFIoWZEcBf0Dpm3zOpdVvj77aY8RlLiQji5OMrngEyaxGogeakTb54uS2FvA6w==", 1511 1225 "dependencies": [ ··· 1514 1228 }, 1515 1229 "preact@10.26.6": { 1516 1230 "integrity": "sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==" 1517 - }, 1518 - "prismjs@1.30.0": { 1519 - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" 1520 1231 }, 1521 1232 "process-warning@3.0.0": { 1522 1233 "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" ··· 1586 1297 "safer-buffer@2.1.2": { 1587 1298 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1588 1299 }, 1589 - "sanitize-html@2.17.0": { 1590 - "integrity": "sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==", 1591 - "dependencies": [ 1592 - "deepmerge", 1593 - "escape-string-regexp", 1594 - "htmlparser2", 1595 - "is-plain-object", 1596 - "parse-srcset", 1597 - "postcss" 1598 - ] 1599 - }, 1600 - "semver@7.7.2": { 1601 - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1602 - "bin": true 1603 - }, 1604 1300 "send@0.19.0": { 1605 1301 "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 1606 1302 "dependencies": [ ··· 1631 1327 "setprototypeof@1.2.0": { 1632 1328 "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1633 1329 }, 1634 - "sharp@0.34.1": { 1635 - "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", 1636 - "dependencies": [ 1637 - "color", 1638 - "detect-libc@2.0.4", 1639 - "semver" 1640 - ], 1641 - "optionalDependencies": [ 1642 - "@img/sharp-darwin-arm64", 1643 - "@img/sharp-darwin-x64", 1644 - "@img/sharp-libvips-darwin-arm64", 1645 - "@img/sharp-libvips-darwin-x64", 1646 - "@img/sharp-libvips-linux-arm", 1647 - "@img/sharp-libvips-linux-arm64", 1648 - "@img/sharp-libvips-linux-ppc64", 1649 - "@img/sharp-libvips-linux-s390x", 1650 - "@img/sharp-libvips-linux-x64", 1651 - "@img/sharp-libvips-linuxmusl-arm64", 1652 - "@img/sharp-libvips-linuxmusl-x64", 1653 - "@img/sharp-linux-arm", 1654 - "@img/sharp-linux-arm64", 1655 - "@img/sharp-linux-s390x", 1656 - "@img/sharp-linux-x64", 1657 - "@img/sharp-linuxmusl-arm64", 1658 - "@img/sharp-linuxmusl-x64", 1659 - "@img/sharp-wasm32", 1660 - "@img/sharp-win32-ia32", 1661 - "@img/sharp-win32-x64" 1662 - ], 1663 - "scripts": true 1664 - }, 1665 1330 "side-channel-list@1.0.0": { 1666 1331 "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1667 1332 "dependencies": [ ··· 1696 1361 "side-channel-list", 1697 1362 "side-channel-map", 1698 1363 "side-channel-weakmap" 1699 - ] 1700 - }, 1701 - "simple-swizzle@0.2.2": { 1702 - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 1703 - "dependencies": [ 1704 - "is-arrayish" 1705 1364 ] 1706 1365 }, 1707 1366 "sonic-boom@3.8.1": { ··· 1826 1485 }, 1827 1486 "workspace": { 1828 1487 "dependencies": [ 1829 - "jsr:@bigmoves/bff@0.3.0-beta.30", 1488 + "jsr:@bigmoves/bff@0.3.0-beta.31", 1830 1489 "jsr:@std/http@^1.0.17", 1831 1490 "jsr:@std/path@^1.0.9", 1832 1491 "npm:@atproto/syntax@0.4",
+1
fly.toml
··· 15 15 BFF_PUBLIC_URL = 'https://grain.social' 16 16 GOATCOUNTER_URL = 'https://grain.goatcounter.com/count' 17 17 USE_CDN = 'true' 18 + PDS_HOST_URL = 'https://ansel.grainsocial.network' 18 19 19 20 [[mounts]] 20 21 source = "litefs"
+7
local-infra/pds.env
··· 14 14 PDS_EMAIL_FROM_ADDRESS=admin@grain.social 15 15 PDS_SERVICE_NAME=Grain Social 16 16 PDS_INVITE_REQUIRED=0 17 + PDS_OAUTH_PROVIDER_NAME=Grain Social 18 + PDS_HOME_URL=http://localhost:8080 19 + PDS_LIGHT_COLOR=#fff 20 + PDS_DARK_COLOR=#09090b 21 + PDS_PRIMARY_COLOR=#00a6f4 22 + PDS_PRIMARY_COLOR_CONTRAST=#fff 23 + PDS_PRIMARY_COLOR_HUE=#fff
+8
services/pds/fly.toml
··· 21 21 PDS_HOSTNAME = 'ansel.grainsocial.network' 22 22 PDS_REPORT_SERVICE_DID = 'did:plc:ar7c4by46qjdydhdevvrndac' 23 23 PDS_REPORT_SERVICE_URL = 'https://mod.bsky.app' 24 + PDS_SERVICE_HANDLE_DOMAINS = '.grain.social' 25 + PDS_SERVICE_NAME = 'Grain Social' 26 + PDS_HOME_URL = 'https://grain.social' 27 + PDS_LIGHT_COLOR = '#fff' 28 + PDS_DARK_COLOR = '#09090b' 29 + PDS_PRIMARY_COLOR = '#00a6f4' 30 + PDS_PRIMARY_COLOR_CONTRAST = '#fff' 31 + PDS_PRIMARY_COLOR_HUE = '#fff' 24 32 25 33 [[mounts]] 26 34 source = 'pdsdata'
+47
src/components/CreateAccountDialog.tsx
··· 1 + import { OAUTH_ROUTES } from "@bigmoves/bff"; 2 + import { Button, Dialog } from "@bigmoves/bff/components"; 3 + import { PDS_HOST_URL } from "../env.ts"; 4 + 5 + export function CreateAccountDialog({}: Readonly<{}>) { 6 + return ( 7 + <Dialog id="photo-alt-dialog" class="z-100"> 8 + <Dialog.Content class="dark:bg-zinc-950 relative"> 9 + <Dialog.X class="fill-zinc-950 dark:fill-zinc-50" /> 10 + <Dialog.Title>Choose your handle</Dialog.Title> 11 + <div className="flex flex-col space-y-4 my-10"> 12 + <form hx-post={OAUTH_ROUTES.signup} hx-swap="none" class="w-full"> 13 + <input 14 + type="hidden" 15 + name="pdsHostUrl" 16 + value="https://bsky.social" 17 + /> 18 + <Button 19 + type="submit" 20 + variant="primary" 21 + class="w-full" 22 + > 23 + user.bsky.social 24 + </Button> 25 + </form> 26 + <form hx-post={OAUTH_ROUTES.signup} hx-swap="none" class="w-full"> 27 + <input 28 + type="hidden" 29 + name="pdsHostUrl" 30 + value={PDS_HOST_URL} 31 + /> 32 + <Button 33 + type="submit" 34 + variant="primary" 35 + class="w-full" 36 + > 37 + user.grain.social 38 + </Button> 39 + </form> 40 + <p> 41 + Note: <b>.grain.social</b> handles are currently invite only. 42 + </p> 43 + </div> 44 + </Dialog.Content> 45 + </Dialog> 46 + ); 47 + }
+9 -5
src/components/Layout.tsx
··· 111 111 ) 112 112 : ( 113 113 <div class="flex items-center space-x-4"> 114 - <form hx-post="/signup" hx-swap="none" class="inline"> 115 - <Button variant="secondary" type="submit"> 116 - Create account 117 - </Button> 118 - </form> 114 + <Button 115 + variant="secondary" 116 + hx-get={`/dialogs/create-account`} 117 + hx-trigger="click" 118 + hx-target="body" 119 + hx-swap="afterbegin" 120 + > 121 + Create account 122 + </Button> 119 123 <Button variant="secondary" asChild> 120 124 <a href="/login"> 121 125 Sign in
+9 -1
src/components/LoginPage.tsx
··· 8 8 class="flex justify-center items-center w-full h-[calc(100vh-56px)] relative" 9 9 style="background-image: url('https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:bcgltzqazw5tb6k2g3ttenbj/bafkreiewhwu3ro5dv7omedphb62db4koa7qtvyzfhiiypg3ru4tvuxkrjy@jpeg'); background-size: cover; background-position: center;" 10 10 > 11 - <Login hx-target="#login" error={error} errorClass="text-white" /> 11 + <Login 12 + hx-target="#login" 13 + error={error} 14 + errorClass="text-white" 15 + inputPlaceholder="Enter your handle or pds host" 16 + submitText="Login" 17 + infoText="e.g., user.bsky.social, user.grain.social, example.com, https://pds.example.com" 18 + infoClass="text-white text-sm! bg-zinc-950/70 p-4 font-mono" 19 + /> 12 20 <div class="absolute bottom-2 right-2 text-white text-sm"> 13 21 Photo by{" "} 14 22 <a
+1
src/main.tsx
··· 57 57 route("/profile/:handle/gallery/:rkey", galleryHandler), 58 58 route("/upload", uploadHandler), 59 59 route("/onboard", onboardHandler), 60 + route("/dialogs/create-account", dialogHandlers.createAccount), 60 61 route("/dialogs/gallery/new", dialogHandlers.createGallery), 61 62 route("/dialogs/gallery/:rkey", dialogHandlers.editGallery), 62 63 route("/dialogs/gallery/:rkey/sort", dialogHandlers.sortGallery),
+9
src/routes/dialogs.tsx
··· 6 6 import { BffContext, RouteHandler, WithBffMeta } from "@bigmoves/bff"; 7 7 import { wrap } from "popmotion"; 8 8 import { AvatarDialog } from "../components/AvatarDialog.tsx"; 9 + import { CreateAccountDialog } from "../components/CreateAccountDialog.tsx"; 9 10 import { GalleryCreateEditDialog } from "../components/GalleryCreateEditDialog.tsx"; 10 11 import { GallerySortDialog } from "../components/GallerySortDialog.tsx"; 11 12 import { PhotoAltDialog } from "../components/PhotoAltDialog.tsx"; ··· 153 154 />, 154 155 ); 155 156 }; 157 + 158 + export const createAccount: RouteHandler = ( 159 + _req, 160 + _params, 161 + ctx: BffContext<State>, 162 + ) => { 163 + return ctx.html(<CreateAccountDialog />); 164 + };
+16
static/styles.css
··· 285 285 .my-4 { 286 286 margin-block: calc(var(--spacing) * 4); 287 287 } 288 + .my-10 { 289 + margin-block: calc(var(--spacing) * 10); 290 + } 288 291 .my-30 { 289 292 margin-block: calc(var(--spacing) * 30); 290 293 } ··· 581 584 .bg-zinc-950 { 582 585 background-color: var(--color-zinc-950); 583 586 } 587 + .bg-zinc-950\/70 { 588 + background-color: color-mix(in srgb, oklch(14.1% 0.005 285.823) 70%, transparent); 589 + @supports (color: color-mix(in lab, red, red)) { 590 + background-color: color-mix(in oklab, var(--color-zinc-950) 70%, transparent); 591 + } 592 + } 584 593 .fill-zinc-950 { 585 594 fill: var(--color-zinc-950); 586 595 } ··· 632 641 .font-\[\'Jersey_20\'\] { 633 642 font-family: 'Jersey 20'; 634 643 } 644 + .font-mono { 645 + font-family: var(--font-mono); 646 + } 635 647 .text-2xl { 636 648 font-size: var(--text-2xl); 637 649 line-height: var(--tw-leading, var(--text-2xl--line-height)); ··· 643 655 .text-sm { 644 656 font-size: var(--text-sm); 645 657 line-height: var(--tw-leading, var(--text-sm--line-height)); 658 + } 659 + .text-sm\! { 660 + font-size: var(--text-sm) !important; 661 + line-height: var(--tw-leading, var(--text-sm--line-height)) !important; 646 662 } 647 663 .text-xl { 648 664 font-size: var(--text-xl);