update deps & switch to atcute/repo

juli.ee 050f9248 d0fe10a2

verified
+9 -12
package.json
··· 11 11 "devDependencies": { 12 12 "@iconify-json/lucide": "^1.2.70", 13 13 "@iconify/tailwind4": "^1.0.6", 14 - "@tailwindcss/vite": "^4.1.14", 14 + "@tailwindcss/vite": "^4.1.15", 15 15 "prettier": "^3.6.2", 16 16 "prettier-plugin-organize-imports": "^4.3.0", 17 17 "prettier-plugin-tailwindcss": "^0.7.1", 18 - "tailwindcss": "^4.1.14", 18 + "tailwindcss": "^4.1.15", 19 19 "typescript": "^5.9.3", 20 - "vite": "^7.1.10", 20 + "vite": "^7.1.11", 21 21 "vite-plugin-solid": "^2.11.9" 22 22 }, 23 23 "dependencies": { 24 - "@atcute/atproto": "^3.1.7", 25 - "@atcute/bluesky": "^3.2.7", 26 - "@atcute/car": "^3.1.3", 27 - "@atcute/cbor": "^2.2.7", 28 - "@atcute/cid": "^2.2.5", 24 + "@atcute/atproto": "^3.1.8", 25 + "@atcute/bluesky": "^3.2.8", 29 26 "@atcute/client": "^4.0.5", 30 27 "@atcute/crypto": "^2.2.5", 31 28 "@atcute/did-plc": "^0.1.7", 32 29 "@atcute/identity": "^1.1.1", 33 30 "@atcute/identity-resolver": "^1.1.4", 34 - "@atcute/leaflet": "^1.0.10", 31 + "@atcute/leaflet": "^1.0.11", 35 32 "@atcute/lexicon-doc": "^1.1.3", 36 - "@atcute/lexicon-resolver": "^0.1.2", 33 + "@atcute/lexicon-resolver": "^0.1.3", 37 34 "@atcute/lexicons": "^1.2.2", 38 35 "@atcute/oauth-browser-client": "^1.0.27", 39 - "@atcute/tangled": "^1.0.9", 36 + "@atcute/repo": "^0.1.0", 37 + "@atcute/tangled": "^1.0.10", 40 38 "@atcute/tid": "^1.0.3", 41 - "@atcute/uint8array": "^1.0.5", 42 39 "@codemirror/commands": "^6.9.0", 43 40 "@codemirror/lang-json": "^6.0.2", 44 41 "@codemirror/lint": "^6.9.0",
+218 -233
pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@atcute/atproto': 12 - specifier: ^3.1.7 13 - version: 3.1.7 12 + specifier: ^3.1.8 13 + version: 3.1.8 14 14 '@atcute/bluesky': 15 - specifier: ^3.2.7 16 - version: 3.2.7 17 - '@atcute/car': 18 - specifier: ^3.1.3 19 - version: 3.1.3 20 - '@atcute/cbor': 21 - specifier: ^2.2.7 22 - version: 2.2.7 23 - '@atcute/cid': 24 - specifier: ^2.2.5 25 - version: 2.2.5 15 + specifier: ^3.2.8 16 + version: 3.2.8 26 17 '@atcute/client': 27 18 specifier: ^4.0.5 28 19 version: 4.0.5 ··· 39 30 specifier: ^1.1.4 40 31 version: 1.1.4(@atcute/identity@1.1.1) 41 32 '@atcute/leaflet': 42 - specifier: ^1.0.10 43 - version: 1.0.10 33 + specifier: ^1.0.11 34 + version: 1.0.11 44 35 '@atcute/lexicon-doc': 45 36 specifier: ^1.1.3 46 37 version: 1.1.3 47 38 '@atcute/lexicon-resolver': 48 - specifier: ^0.1.2 49 - version: 0.1.2(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.1))(@atcute/identity@1.1.1) 39 + specifier: ^0.1.3 40 + version: 0.1.3(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.1))(@atcute/identity@1.1.1) 50 41 '@atcute/lexicons': 51 42 specifier: ^1.2.2 52 43 version: 1.2.2 53 44 '@atcute/oauth-browser-client': 54 45 specifier: ^1.0.27 55 46 version: 1.0.27 47 + '@atcute/repo': 48 + specifier: ^0.1.0 49 + version: 0.1.0 56 50 '@atcute/tangled': 57 - specifier: ^1.0.9 58 - version: 1.0.9 51 + specifier: ^1.0.10 52 + version: 1.0.10 59 53 '@atcute/tid': 60 54 specifier: ^1.0.3 61 55 version: 1.0.3 62 - '@atcute/uint8array': 63 - specifier: ^1.0.5 64 - version: 1.0.5 65 56 '@codemirror/commands': 66 57 specifier: ^6.9.0 67 58 version: 6.9.0 ··· 107 98 version: 1.2.70 108 99 '@iconify/tailwind4': 109 100 specifier: ^1.0.6 110 - version: 1.0.6(tailwindcss@4.1.14) 101 + version: 1.0.6(tailwindcss@4.1.15) 111 102 '@tailwindcss/vite': 112 - specifier: ^4.1.14 113 - version: 4.1.14(vite@7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2)) 103 + specifier: ^4.1.15 104 + version: 4.1.15(vite@7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 114 105 prettier: 115 106 specifier: ^3.6.2 116 107 version: 3.6.2 ··· 121 112 specifier: ^0.7.1 122 113 version: 0.7.1(prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.9.3))(prettier@3.6.2) 123 114 tailwindcss: 124 - specifier: ^4.1.14 125 - version: 4.1.14 115 + specifier: ^4.1.15 116 + version: 4.1.15 126 117 typescript: 127 118 specifier: ^5.9.3 128 119 version: 5.9.3 129 120 vite: 130 - specifier: ^7.1.10 131 - version: 7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2) 121 + specifier: ^7.1.11 122 + version: 7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 132 123 vite-plugin-solid: 133 124 specifier: ^2.11.9 134 - version: 2.11.9(solid-js@1.9.9)(vite@7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2)) 125 + version: 2.11.9(solid-js@1.9.9)(vite@7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 135 126 136 127 packages: 137 128 ··· 141 132 '@antfu/utils@8.1.1': 142 133 resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} 143 134 144 - '@atcute/atproto@3.1.7': 145 - resolution: {integrity: sha512-3Ym8qaVZg2vf8qw0KO1aue39z/5oik5J+UDoSes1vr8ddw40UVLA5sV4bXSKmLnhzQHiLLgoVZXe4zaKfozPoQ==} 135 + '@atcute/atproto@3.1.8': 136 + resolution: {integrity: sha512-Miu+S7RSgAYbmQWtHJKfSFUN5Kliqoo4YH0rILPmBtfmlZieORJgXNj9oO/Uive0/ulWkiRse07ATIcK8JxMnw==} 146 137 147 - '@atcute/bluesky@3.2.7': 148 - resolution: {integrity: sha512-mofkZySIIp+Z+TbBD+cDWaPY6FVKNRZG8yhMFkh6uMCuiazDUAUjxr4yaFjYMVcgMN9FkwGllwQJevUH9aTSnQ==} 138 + '@atcute/bluesky@3.2.8': 139 + resolution: {integrity: sha512-wxEnSOvX7nLH4sVzX9YFCkaNEWIDrTv3pTs6/x4NgJ3AJ3XJio0OYPM8tR7wAgsklY6BHvlAgt3yoCDK0cl1CA==} 149 140 150 141 '@atcute/car@3.1.3': 151 142 resolution: {integrity: sha512-WJ13bAEt7TjDMVi09ubjLtvhdljbWInGm9Kfy7Y6NhrmiyC/aZYaA/zHX/bHI6xv1c/h3SQduWqxOr4ae49eqA==} 152 143 144 + '@atcute/car@5.0.0': 145 + resolution: {integrity: sha512-OIY2xTXv8lSpZsDSn/UYQtJSMvDw5Hi4Q+uyvmiqSM+fht08QRAEq/nxa5YFciPZ3nfDFnZ3//EgJw7QhkSXLQ==} 146 + 153 147 '@atcute/cbor@2.2.7': 154 148 resolution: {integrity: sha512-/mwAF0gnokOphceZqFq3uzMGdd8sbw5y6bxF8CRutRkCCUcpjjpJc5fkLwhxyGgOveF3mZuHE6p7t/+IAqb7Aw==} 155 149 156 - '@atcute/cid@2.2.5': 157 - resolution: {integrity: sha512-7SId61nMyuxSwsDI02wEZn6/gVeha2TrAN4W0UPSdSEcwQD3R2W8VU7zvR4XGfU7A/KmBnVkwx5FTfzyizKj6g==} 150 + '@atcute/cid@2.2.6': 151 + resolution: {integrity: sha512-bTAHHbJ24p+E//V4KCS4xdmd39o211jJswvqQOevj7vk+5IYcgDLx1ryZWZ1sEPOo9x875li/kj5gpKL14RDwQ==} 158 152 159 153 '@atcute/client@4.0.5': 160 154 resolution: {integrity: sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA==} ··· 173 167 '@atcute/identity@1.1.1': 174 168 resolution: {integrity: sha512-zax42n693VEhnC+5tndvO2KLDTMkHOz8UExwmklvJv7R9VujfEwiSWhcv6Jgwb3ellaG8wjiQ1lMOIjLLvwh0Q==} 175 169 176 - '@atcute/leaflet@1.0.10': 177 - resolution: {integrity: sha512-BTALobkbxNO6+IiGRcqfCmMxioqh88S0LEswHLf2rBVfNNL7/gZ0EuHhwN+sizHoY7Od6/MBUk4aOEjUPr16tw==} 170 + '@atcute/leaflet@1.0.11': 171 + resolution: {integrity: sha512-PmhBIltPD4DqR737J412ePwtfyBeC/Xr9R+s/d55Aq0kLPo4aBWt+JDb40Mh4JCGGxiz6gu9HFCCZeaVLrL4Dw==} 178 172 179 173 '@atcute/lexicon-doc@1.1.3': 180 174 resolution: {integrity: sha512-HlQBmB4NCZPzREyVzr7lzjRxSiRHook2xfa7DgA3dk3oYZ+KnnPEtS6M1sAmAAddtUdrOrJ+0xJPQHkfElZmpQ==} 181 175 182 - '@atcute/lexicon-resolver@0.1.2': 183 - resolution: {integrity: sha512-qiBZspJQIcVL/9ZkWMIThsavbX4PL6F2IEEow5V/eCgKiknfq5G2X4ULb+iKvI2vwl9STCeUpctUT3/q4nXVqg==} 176 + '@atcute/lexicon-resolver@0.1.3': 177 + resolution: {integrity: sha512-4AOS3KKm60GtBfl7ue/35xwZlylAuX5V2xmXnAmNoiN3vIauNkYawwRqgtni5q+EIV9R7p4D8tzkv58NaZ8fEQ==} 184 178 peerDependencies: 185 179 '@atcute/identity': ^1.1.0 186 180 '@atcute/identity-resolver': ^1.1.3 ··· 188 182 '@atcute/lexicons@1.2.2': 189 183 resolution: {integrity: sha512-bgEhJq5Z70/0TbK5sx+tAkrR8FsCODNiL2gUEvS5PuJfPxmFmRYNWaMGehxSPaXWpU2+Oa9ckceHiYbrItDTkA==} 190 184 185 + '@atcute/mst@0.1.0': 186 + resolution: {integrity: sha512-h+iDToKEnBpigk2DOHjSqY63vJtjYKUIztqu1CZ0P+I54wV2SrgoqAXAT1xrW6A1Iup8cjTv+U2H5WVG4KxPLw==} 187 + 191 188 '@atcute/multibase@1.1.6': 192 189 resolution: {integrity: sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg==} 193 190 194 191 '@atcute/oauth-browser-client@1.0.27': 195 192 resolution: {integrity: sha512-Ng1tCOTMLgFHHoIHXTtCZR1/ND62an1qxPX2kBoUzkxxd7iCP7IBYYqOiKyJYT5n1R4zS+s29hFS4t9mxXa5kQ==} 196 193 197 - '@atcute/tangled@1.0.9': 198 - resolution: {integrity: sha512-Nr/LyEe4To5Yz+3IwL2pExKr+AJ7tPMR2+3YNMKeWHvVm+UfMTd4PkwwwAI9fKvBv2qEJ3egE1mXefGW15sqDQ==} 194 + '@atcute/repo@0.1.0': 195 + resolution: {integrity: sha512-INiYAuma8dydBu7cqd2WVpcXh3mzhIepYBUqFWAK5MqMulPRLTRCc/9GW3G9pxYrOdlvLCVamG2Jf8XK0nuFEw==} 196 + 197 + '@atcute/tangled@1.0.10': 198 + resolution: {integrity: sha512-DGconZIN5TpLBah+aHGbWI1tMsL7XzyVEbr/fW4CbcLWYKICU6SAUZ0YnZ+5GvltjlORWHUy7hfftvoh4zodIA==} 199 199 200 200 '@atcute/tid@1.0.3': 201 201 resolution: {integrity: sha512-wfMJx1IMdnu0CZgWl0uR4JO2s6PGT1YPhpytD4ZHzEYKKQVuqV6Eb/7vieaVo1eYNMp2FrY67FZObeR7utRl2w==} ··· 648 648 '@iconify/utils@2.3.0': 649 649 resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} 650 650 651 - '@isaacs/fs-minipass@4.0.1': 652 - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 653 - engines: {node: '>=18.0.0'} 654 - 655 651 '@jridgewell/gen-mapping@0.3.13': 656 652 resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 657 653 ··· 815 811 '@standard-schema/spec@1.0.0': 816 812 resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} 817 813 818 - '@tailwindcss/node@4.1.14': 819 - resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} 814 + '@tailwindcss/node@4.1.15': 815 + resolution: {integrity: sha512-HF4+7QxATZWY3Jr8OlZrBSXmwT3Watj0OogeDvdUY/ByXJHQ+LBtqA2brDb3sBxYslIFx6UP94BJ4X6a4L9Bmw==} 820 816 821 - '@tailwindcss/oxide-android-arm64@4.1.14': 822 - resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} 817 + '@tailwindcss/oxide-android-arm64@4.1.15': 818 + resolution: {integrity: sha512-TkUkUgAw8At4cBjCeVCRMc/guVLKOU1D+sBPrHt5uVcGhlbVKxrCaCW9OKUIBv1oWkjh4GbunD/u/Mf0ql6kEA==} 823 819 engines: {node: '>= 10'} 824 820 cpu: [arm64] 825 821 os: [android] 826 822 827 - '@tailwindcss/oxide-darwin-arm64@4.1.14': 828 - resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} 823 + '@tailwindcss/oxide-darwin-arm64@4.1.15': 824 + resolution: {integrity: sha512-xt5XEJpn2piMSfvd1UFN6jrWXyaKCwikP4Pidcf+yfHTSzSpYhG3dcMktjNkQO3JiLCp+0bG0HoWGvz97K162w==} 829 825 engines: {node: '>= 10'} 830 826 cpu: [arm64] 831 827 os: [darwin] 832 828 833 - '@tailwindcss/oxide-darwin-x64@4.1.14': 834 - resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} 829 + '@tailwindcss/oxide-darwin-x64@4.1.15': 830 + resolution: {integrity: sha512-TnWaxP6Bx2CojZEXAV2M01Yl13nYPpp0EtGpUrY+LMciKfIXiLL2r/SiSRpagE5Fp2gX+rflp/Os1VJDAyqymg==} 835 831 engines: {node: '>= 10'} 836 832 cpu: [x64] 837 833 os: [darwin] 838 834 839 - '@tailwindcss/oxide-freebsd-x64@4.1.14': 840 - resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} 835 + '@tailwindcss/oxide-freebsd-x64@4.1.15': 836 + resolution: {integrity: sha512-quISQDWqiB6Cqhjc3iWptXVZHNVENsWoI77L1qgGEHNIdLDLFnw3/AfY7DidAiiCIkGX/MjIdB3bbBZR/G2aJg==} 841 837 engines: {node: '>= 10'} 842 838 cpu: [x64] 843 839 os: [freebsd] 844 840 845 - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': 846 - resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} 841 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.15': 842 + resolution: {integrity: sha512-ObG76+vPlab65xzVUQbExmDU9FIeYLQ5k2LrQdR2Ud6hboR+ZobXpDoKEYXf/uOezOfIYmy2Ta3w0ejkTg9yxg==} 847 843 engines: {node: '>= 10'} 848 844 cpu: [arm] 849 845 os: [linux] 850 846 851 - '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': 852 - resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} 847 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.15': 848 + resolution: {integrity: sha512-4WbBacRmk43pkb8/xts3wnOZMDKsPFyEH/oisCm2q3aLZND25ufvJKcDUpAu0cS+CBOL05dYa8D4U5OWECuH/Q==} 853 849 engines: {node: '>= 10'} 854 850 cpu: [arm64] 855 851 os: [linux] 856 852 857 - '@tailwindcss/oxide-linux-arm64-musl@4.1.14': 858 - resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} 853 + '@tailwindcss/oxide-linux-arm64-musl@4.1.15': 854 + resolution: {integrity: sha512-AbvmEiteEj1nf42nE8skdHv73NoR+EwXVSgPY6l39X12Ex8pzOwwfi3Kc8GAmjsnsaDEbk+aj9NyL3UeyHcTLg==} 859 855 engines: {node: '>= 10'} 860 856 cpu: [arm64] 861 857 os: [linux] 862 858 863 - '@tailwindcss/oxide-linux-x64-gnu@4.1.14': 864 - resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} 859 + '@tailwindcss/oxide-linux-x64-gnu@4.1.15': 860 + resolution: {integrity: sha512-+rzMVlvVgrXtFiS+ES78yWgKqpThgV19ISKD58Ck+YO5pO5KjyxLt7AWKsWMbY0R9yBDC82w6QVGz837AKQcHg==} 865 861 engines: {node: '>= 10'} 866 862 cpu: [x64] 867 863 os: [linux] 868 864 869 - '@tailwindcss/oxide-linux-x64-musl@4.1.14': 870 - resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} 865 + '@tailwindcss/oxide-linux-x64-musl@4.1.15': 866 + resolution: {integrity: sha512-fPdEy7a8eQN9qOIK3Em9D3TO1z41JScJn8yxl/76mp4sAXFDfV4YXxsiptJcOwy6bGR+70ZSwFIZhTXzQeqwQg==} 871 867 engines: {node: '>= 10'} 872 868 cpu: [x64] 873 869 os: [linux] 874 870 875 - '@tailwindcss/oxide-wasm32-wasi@4.1.14': 876 - resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} 871 + '@tailwindcss/oxide-wasm32-wasi@4.1.15': 872 + resolution: {integrity: sha512-sJ4yd6iXXdlgIMfIBXuVGp/NvmviEoMVWMOAGxtxhzLPp9LOj5k0pMEMZdjeMCl4C6Up+RM8T3Zgk+BMQ0bGcQ==} 877 873 engines: {node: '>=14.0.0'} 878 874 cpu: [wasm32] 879 875 bundledDependencies: ··· 884 880 - '@emnapi/wasi-threads' 885 881 - tslib 886 882 887 - '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': 888 - resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} 883 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.15': 884 + resolution: {integrity: sha512-sJGE5faXnNQ1iXeqmRin7Ds/ru2fgCiaQZQQz3ZGIDtvbkeV85rAZ0QJFMDg0FrqsffZG96H1U9AQlNBRLsHVg==} 889 885 engines: {node: '>= 10'} 890 886 cpu: [arm64] 891 887 os: [win32] 892 888 893 - '@tailwindcss/oxide-win32-x64-msvc@4.1.14': 894 - resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} 889 + '@tailwindcss/oxide-win32-x64-msvc@4.1.15': 890 + resolution: {integrity: sha512-NLeHE7jUV6HcFKS504bpOohyi01zPXi2PXmjFfkzTph8xRxDdxkRsXm/xDO5uV5K3brrE1cCwbUYmFUSHR3u1w==} 895 891 engines: {node: '>= 10'} 896 892 cpu: [x64] 897 893 os: [win32] 898 894 899 - '@tailwindcss/oxide@4.1.14': 900 - resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} 895 + '@tailwindcss/oxide@4.1.15': 896 + resolution: {integrity: sha512-krhX+UOOgnsUuks2SR7hFafXmLQrKxB4YyRTERuCE59JlYL+FawgaAlSkOYmDRJdf1Q+IFNDMl9iRnBW7QBDfQ==} 901 897 engines: {node: '>= 10'} 902 898 903 - '@tailwindcss/vite@4.1.14': 904 - resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} 899 + '@tailwindcss/vite@4.1.15': 900 + resolution: {integrity: sha512-B6s60MZRTUil+xKoZoGe6i0Iar5VuW+pmcGlda2FX+guDuQ1G1sjiIy1W0frneVpeL/ZjZ4KEgWZHNrIm++2qA==} 905 901 peerDependencies: 906 902 vite: ^5.2.0 || ^6 || ^7 907 903 ··· 942 938 solid-js: 943 939 optional: true 944 940 945 - baseline-browser-mapping@2.8.17: 946 - resolution: {integrity: sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA==} 941 + baseline-browser-mapping@2.8.18: 942 + resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} 947 943 hasBin: true 948 944 949 945 browserslist@4.26.3: ··· 953 949 954 950 caniuse-lite@1.0.30001751: 955 951 resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} 956 - 957 - chownr@3.0.0: 958 - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} 959 - engines: {node: '>=18'} 960 952 961 953 codemirror@6.0.2: 962 954 resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} ··· 1075 1067 kolorist@1.8.0: 1076 1068 resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1077 1069 1078 - lightningcss-darwin-arm64@1.30.1: 1079 - resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} 1070 + lightningcss-android-arm64@1.30.2: 1071 + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} 1072 + engines: {node: '>= 12.0.0'} 1073 + cpu: [arm64] 1074 + os: [android] 1075 + 1076 + lightningcss-darwin-arm64@1.30.2: 1077 + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} 1080 1078 engines: {node: '>= 12.0.0'} 1081 1079 cpu: [arm64] 1082 1080 os: [darwin] 1083 1081 1084 - lightningcss-darwin-x64@1.30.1: 1085 - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} 1082 + lightningcss-darwin-x64@1.30.2: 1083 + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} 1086 1084 engines: {node: '>= 12.0.0'} 1087 1085 cpu: [x64] 1088 1086 os: [darwin] 1089 1087 1090 - lightningcss-freebsd-x64@1.30.1: 1091 - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} 1088 + lightningcss-freebsd-x64@1.30.2: 1089 + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} 1092 1090 engines: {node: '>= 12.0.0'} 1093 1091 cpu: [x64] 1094 1092 os: [freebsd] 1095 1093 1096 - lightningcss-linux-arm-gnueabihf@1.30.1: 1097 - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} 1094 + lightningcss-linux-arm-gnueabihf@1.30.2: 1095 + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} 1098 1096 engines: {node: '>= 12.0.0'} 1099 1097 cpu: [arm] 1100 1098 os: [linux] 1101 1099 1102 - lightningcss-linux-arm64-gnu@1.30.1: 1103 - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} 1100 + lightningcss-linux-arm64-gnu@1.30.2: 1101 + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} 1104 1102 engines: {node: '>= 12.0.0'} 1105 1103 cpu: [arm64] 1106 1104 os: [linux] 1107 1105 1108 - lightningcss-linux-arm64-musl@1.30.1: 1109 - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} 1106 + lightningcss-linux-arm64-musl@1.30.2: 1107 + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} 1110 1108 engines: {node: '>= 12.0.0'} 1111 1109 cpu: [arm64] 1112 1110 os: [linux] 1113 1111 1114 - lightningcss-linux-x64-gnu@1.30.1: 1115 - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} 1112 + lightningcss-linux-x64-gnu@1.30.2: 1113 + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} 1116 1114 engines: {node: '>= 12.0.0'} 1117 1115 cpu: [x64] 1118 1116 os: [linux] 1119 1117 1120 - lightningcss-linux-x64-musl@1.30.1: 1121 - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} 1118 + lightningcss-linux-x64-musl@1.30.2: 1119 + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} 1122 1120 engines: {node: '>= 12.0.0'} 1123 1121 cpu: [x64] 1124 1122 os: [linux] 1125 1123 1126 - lightningcss-win32-arm64-msvc@1.30.1: 1127 - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} 1124 + lightningcss-win32-arm64-msvc@1.30.2: 1125 + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} 1128 1126 engines: {node: '>= 12.0.0'} 1129 1127 cpu: [arm64] 1130 1128 os: [win32] 1131 1129 1132 - lightningcss-win32-x64-msvc@1.30.1: 1133 - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} 1130 + lightningcss-win32-x64-msvc@1.30.2: 1131 + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} 1134 1132 engines: {node: '>= 12.0.0'} 1135 1133 cpu: [x64] 1136 1134 os: [win32] 1137 1135 1138 - lightningcss@1.30.1: 1139 - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} 1136 + lightningcss@1.30.2: 1137 + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} 1140 1138 engines: {node: '>= 12.0.0'} 1141 1139 1142 1140 local-pkg@1.1.2: ··· 1153 1151 resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} 1154 1152 engines: {node: '>=12.13'} 1155 1153 1156 - minipass@7.1.2: 1157 - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1158 - engines: {node: '>=16 || 14 >=14.17'} 1159 - 1160 - minizlib@3.1.0: 1161 - resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} 1162 - engines: {node: '>= 18'} 1163 - 1164 1154 mlly@1.8.0: 1165 1155 resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 1166 1156 ··· 1184 1174 node-releases@2.0.25: 1185 1175 resolution: {integrity: sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==} 1186 1176 1187 - package-manager-detector@1.4.1: 1188 - resolution: {integrity: sha512-dSMiVLBEA4XaNJ0PRb4N5cV/SEP4BWrWZKBmfF+OUm2pQTiZ6DDkKeWaltwu3JRhLoy59ayIkJ00cx9K9CaYTg==} 1177 + package-manager-detector@1.5.0: 1178 + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} 1189 1179 1190 1180 parse5@7.3.0: 1191 1181 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 1320 1310 style-mod@4.1.3: 1321 1311 resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} 1322 1312 1323 - tailwindcss@4.1.14: 1324 - resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} 1313 + tailwindcss@4.1.15: 1314 + resolution: {integrity: sha512-k2WLnWkYFkdpRv+Oby3EBXIyQC8/s1HOFMBUViwtAh6Z5uAozeUSMQlIsn/c6Q2iJzqG6aJT3wdPaRNj70iYxQ==} 1325 1315 1326 1316 tapable@2.3.0: 1327 1317 resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} 1328 1318 engines: {node: '>=6'} 1329 - 1330 - tar@7.5.1: 1331 - resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} 1332 - engines: {node: '>=18'} 1333 1319 1334 1320 tinyexec@1.0.1: 1335 1321 resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} ··· 1373 1359 '@testing-library/jest-dom': 1374 1360 optional: true 1375 1361 1376 - vite@7.1.10: 1377 - resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} 1362 + vite@7.1.11: 1363 + resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} 1378 1364 engines: {node: ^20.19.0 || >=22.12.0} 1379 1365 hasBin: true 1380 1366 peerDependencies: ··· 1427 1413 yallist@3.1.1: 1428 1414 resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1429 1415 1430 - yallist@5.0.0: 1431 - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} 1432 - engines: {node: '>=18'} 1433 - 1434 1416 yocto-queue@1.2.1: 1435 1417 resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} 1436 1418 engines: {node: '>=12.20'} ··· 1439 1421 1440 1422 '@antfu/install-pkg@1.1.0': 1441 1423 dependencies: 1442 - package-manager-detector: 1.4.1 1424 + package-manager-detector: 1.5.0 1443 1425 tinyexec: 1.0.1 1444 1426 1445 1427 '@antfu/utils@8.1.1': {} 1446 1428 1447 - '@atcute/atproto@3.1.7': 1429 + '@atcute/atproto@3.1.8': 1448 1430 dependencies: 1449 1431 '@atcute/lexicons': 1.2.2 1450 1432 1451 - '@atcute/bluesky@3.2.7': 1433 + '@atcute/bluesky@3.2.8': 1452 1434 dependencies: 1453 - '@atcute/atproto': 3.1.7 1435 + '@atcute/atproto': 3.1.8 1454 1436 '@atcute/lexicons': 1.2.2 1455 1437 1456 1438 '@atcute/car@3.1.3': 1457 1439 dependencies: 1458 1440 '@atcute/cbor': 2.2.7 1459 - '@atcute/cid': 2.2.5 1441 + '@atcute/cid': 2.2.6 1460 1442 '@atcute/uint8array': 1.0.5 1461 1443 '@atcute/varint': 1.0.3 1462 1444 yocto-queue: 1.2.1 1463 1445 1446 + '@atcute/car@5.0.0': 1447 + dependencies: 1448 + '@atcute/cbor': 2.2.7 1449 + '@atcute/cid': 2.2.6 1450 + '@atcute/uint8array': 1.0.5 1451 + '@atcute/varint': 1.0.3 1452 + 1464 1453 '@atcute/cbor@2.2.7': 1465 1454 dependencies: 1466 - '@atcute/cid': 2.2.5 1455 + '@atcute/cid': 2.2.6 1467 1456 '@atcute/multibase': 1.1.6 1468 1457 '@atcute/uint8array': 1.0.5 1469 1458 1470 - '@atcute/cid@2.2.5': 1459 + '@atcute/cid@2.2.6': 1471 1460 dependencies: 1472 1461 '@atcute/multibase': 1.1.6 1473 1462 '@atcute/uint8array': 1.0.5 ··· 1486 1475 '@atcute/did-plc@0.1.7': 1487 1476 dependencies: 1488 1477 '@atcute/cbor': 2.2.7 1489 - '@atcute/cid': 2.2.5 1478 + '@atcute/cid': 2.2.6 1490 1479 '@atcute/crypto': 2.2.5 1491 1480 '@atcute/identity': 1.1.1 1492 1481 '@atcute/lexicons': 1.2.2 ··· 1506 1495 '@atcute/lexicons': 1.2.2 1507 1496 '@badrap/valita': 0.4.6 1508 1497 1509 - '@atcute/leaflet@1.0.10': 1498 + '@atcute/leaflet@1.0.11': 1510 1499 dependencies: 1511 - '@atcute/atproto': 3.1.7 1500 + '@atcute/atproto': 3.1.8 1512 1501 '@atcute/lexicons': 1.2.2 1513 1502 1514 1503 '@atcute/lexicon-doc@1.1.3': 1515 1504 dependencies: 1516 1505 '@badrap/valita': 0.4.6 1517 1506 1518 - '@atcute/lexicon-resolver@0.1.2(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.1))(@atcute/identity@1.1.1)': 1507 + '@atcute/lexicon-resolver@0.1.3(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.1))(@atcute/identity@1.1.1)': 1519 1508 dependencies: 1520 - '@atcute/car': 3.1.3 1509 + '@atcute/car': 5.0.0 1521 1510 '@atcute/cbor': 2.2.7 1522 - '@atcute/cid': 2.2.5 1511 + '@atcute/cid': 2.2.6 1523 1512 '@atcute/crypto': 2.2.5 1524 1513 '@atcute/identity': 1.1.1 1525 1514 '@atcute/identity-resolver': 1.1.4(@atcute/identity@1.1.1) 1526 1515 '@atcute/lexicon-doc': 1.1.3 1527 1516 '@atcute/lexicons': 1.2.2 1517 + '@atcute/repo': 0.1.0 1528 1518 '@atcute/uint8array': 1.0.5 1529 1519 '@atcute/util-fetch': 1.0.3 1530 1520 '@badrap/valita': 0.4.6 ··· 1534 1524 '@standard-schema/spec': 1.0.0 1535 1525 esm-env: 1.2.2 1536 1526 1527 + '@atcute/mst@0.1.0': 1528 + dependencies: 1529 + '@atcute/cbor': 2.2.7 1530 + '@atcute/cid': 2.2.6 1531 + '@atcute/uint8array': 1.0.5 1532 + 1537 1533 '@atcute/multibase@1.1.6': 1538 1534 dependencies: 1539 1535 '@atcute/uint8array': 1.0.5 ··· 1547 1543 '@atcute/uint8array': 1.0.5 1548 1544 nanoid: 5.1.6 1549 1545 1550 - '@atcute/tangled@1.0.9': 1546 + '@atcute/repo@0.1.0': 1547 + dependencies: 1548 + '@atcute/car': 5.0.0 1549 + '@atcute/cbor': 2.2.7 1550 + '@atcute/cid': 2.2.6 1551 + '@atcute/crypto': 2.2.5 1552 + '@atcute/lexicons': 1.2.2 1553 + '@atcute/mst': 0.1.0 1554 + '@atcute/uint8array': 1.0.5 1555 + 1556 + '@atcute/tangled@1.0.10': 1551 1557 dependencies: 1552 - '@atcute/atproto': 3.1.7 1558 + '@atcute/atproto': 3.1.8 1553 1559 '@atcute/lexicons': 1.2.2 1554 1560 1555 1561 '@atcute/tid@1.0.3': {} ··· 1894 1900 dependencies: 1895 1901 '@iconify/types': 2.0.0 1896 1902 1897 - '@iconify/tailwind4@1.0.6(tailwindcss@4.1.14)': 1903 + '@iconify/tailwind4@1.0.6(tailwindcss@4.1.15)': 1898 1904 dependencies: 1899 1905 '@iconify/types': 2.0.0 1900 1906 '@iconify/utils': 2.3.0 1901 - tailwindcss: 4.1.14 1907 + tailwindcss: 4.1.15 1902 1908 transitivePeerDependencies: 1903 1909 - supports-color 1904 1910 ··· 1916 1922 mlly: 1.8.0 1917 1923 transitivePeerDependencies: 1918 1924 - supports-color 1919 - 1920 - '@isaacs/fs-minipass@4.0.1': 1921 - dependencies: 1922 - minipass: 7.1.2 1923 1925 1924 1926 '@jridgewell/gen-mapping@0.3.13': 1925 1927 dependencies: ··· 2044 2046 2045 2047 '@standard-schema/spec@1.0.0': {} 2046 2048 2047 - '@tailwindcss/node@4.1.14': 2049 + '@tailwindcss/node@4.1.15': 2048 2050 dependencies: 2049 2051 '@jridgewell/remapping': 2.3.5 2050 2052 enhanced-resolve: 5.18.3 2051 2053 jiti: 2.6.1 2052 - lightningcss: 1.30.1 2054 + lightningcss: 1.30.2 2053 2055 magic-string: 0.30.19 2054 2056 source-map-js: 1.2.1 2055 - tailwindcss: 4.1.14 2057 + tailwindcss: 4.1.15 2056 2058 2057 - '@tailwindcss/oxide-android-arm64@4.1.14': 2059 + '@tailwindcss/oxide-android-arm64@4.1.15': 2058 2060 optional: true 2059 2061 2060 - '@tailwindcss/oxide-darwin-arm64@4.1.14': 2062 + '@tailwindcss/oxide-darwin-arm64@4.1.15': 2061 2063 optional: true 2062 2064 2063 - '@tailwindcss/oxide-darwin-x64@4.1.14': 2065 + '@tailwindcss/oxide-darwin-x64@4.1.15': 2064 2066 optional: true 2065 2067 2066 - '@tailwindcss/oxide-freebsd-x64@4.1.14': 2068 + '@tailwindcss/oxide-freebsd-x64@4.1.15': 2067 2069 optional: true 2068 2070 2069 - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': 2071 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.15': 2070 2072 optional: true 2071 2073 2072 - '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': 2074 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.15': 2073 2075 optional: true 2074 2076 2075 - '@tailwindcss/oxide-linux-arm64-musl@4.1.14': 2077 + '@tailwindcss/oxide-linux-arm64-musl@4.1.15': 2076 2078 optional: true 2077 2079 2078 - '@tailwindcss/oxide-linux-x64-gnu@4.1.14': 2080 + '@tailwindcss/oxide-linux-x64-gnu@4.1.15': 2079 2081 optional: true 2080 2082 2081 - '@tailwindcss/oxide-linux-x64-musl@4.1.14': 2083 + '@tailwindcss/oxide-linux-x64-musl@4.1.15': 2082 2084 optional: true 2083 2085 2084 - '@tailwindcss/oxide-wasm32-wasi@4.1.14': 2086 + '@tailwindcss/oxide-wasm32-wasi@4.1.15': 2085 2087 optional: true 2086 2088 2087 - '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': 2089 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.15': 2088 2090 optional: true 2089 2091 2090 - '@tailwindcss/oxide-win32-x64-msvc@4.1.14': 2092 + '@tailwindcss/oxide-win32-x64-msvc@4.1.15': 2091 2093 optional: true 2092 2094 2093 - '@tailwindcss/oxide@4.1.14': 2094 - dependencies: 2095 - detect-libc: 2.1.2 2096 - tar: 7.5.1 2095 + '@tailwindcss/oxide@4.1.15': 2097 2096 optionalDependencies: 2098 - '@tailwindcss/oxide-android-arm64': 4.1.14 2099 - '@tailwindcss/oxide-darwin-arm64': 4.1.14 2100 - '@tailwindcss/oxide-darwin-x64': 4.1.14 2101 - '@tailwindcss/oxide-freebsd-x64': 4.1.14 2102 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 2103 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 2104 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 2105 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 2106 - '@tailwindcss/oxide-linux-x64-musl': 4.1.14 2107 - '@tailwindcss/oxide-wasm32-wasi': 4.1.14 2108 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 2109 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 2097 + '@tailwindcss/oxide-android-arm64': 4.1.15 2098 + '@tailwindcss/oxide-darwin-arm64': 4.1.15 2099 + '@tailwindcss/oxide-darwin-x64': 4.1.15 2100 + '@tailwindcss/oxide-freebsd-x64': 4.1.15 2101 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.15 2102 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.15 2103 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.15 2104 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.15 2105 + '@tailwindcss/oxide-linux-x64-musl': 4.1.15 2106 + '@tailwindcss/oxide-wasm32-wasi': 4.1.15 2107 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.15 2108 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.15 2110 2109 2111 - '@tailwindcss/vite@4.1.14(vite@7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2))': 2110 + '@tailwindcss/vite@4.1.15(vite@7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2))': 2112 2111 dependencies: 2113 - '@tailwindcss/node': 4.1.14 2114 - '@tailwindcss/oxide': 4.1.14 2115 - tailwindcss: 4.1.14 2116 - vite: 7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2) 2112 + '@tailwindcss/node': 4.1.15 2113 + '@tailwindcss/oxide': 4.1.15 2114 + tailwindcss: 4.1.15 2115 + vite: 7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2117 2116 2118 2117 '@types/babel__core@7.20.5': 2119 2118 dependencies: ··· 2162 2161 optionalDependencies: 2163 2162 solid-js: 1.9.9 2164 2163 2165 - baseline-browser-mapping@2.8.17: {} 2164 + baseline-browser-mapping@2.8.18: {} 2166 2165 2167 2166 browserslist@4.26.3: 2168 2167 dependencies: 2169 - baseline-browser-mapping: 2.8.17 2168 + baseline-browser-mapping: 2.8.18 2170 2169 caniuse-lite: 1.0.30001751 2171 2170 electron-to-chromium: 1.5.237 2172 2171 node-releases: 2.0.25 2173 2172 update-browserslist-db: 1.1.3(browserslist@4.26.3) 2174 2173 2175 2174 caniuse-lite@1.0.30001751: {} 2176 - 2177 - chownr@3.0.0: {} 2178 2175 2179 2176 codemirror@6.0.2: 2180 2177 dependencies: ··· 2306 2303 2307 2304 kolorist@1.8.0: {} 2308 2305 2309 - lightningcss-darwin-arm64@1.30.1: 2306 + lightningcss-android-arm64@1.30.2: 2310 2307 optional: true 2311 2308 2312 - lightningcss-darwin-x64@1.30.1: 2309 + lightningcss-darwin-arm64@1.30.2: 2313 2310 optional: true 2314 2311 2315 - lightningcss-freebsd-x64@1.30.1: 2312 + lightningcss-darwin-x64@1.30.2: 2316 2313 optional: true 2317 2314 2318 - lightningcss-linux-arm-gnueabihf@1.30.1: 2315 + lightningcss-freebsd-x64@1.30.2: 2319 2316 optional: true 2320 2317 2321 - lightningcss-linux-arm64-gnu@1.30.1: 2318 + lightningcss-linux-arm-gnueabihf@1.30.2: 2322 2319 optional: true 2323 2320 2324 - lightningcss-linux-arm64-musl@1.30.1: 2321 + lightningcss-linux-arm64-gnu@1.30.2: 2325 2322 optional: true 2326 2323 2327 - lightningcss-linux-x64-gnu@1.30.1: 2324 + lightningcss-linux-arm64-musl@1.30.2: 2328 2325 optional: true 2329 2326 2330 - lightningcss-linux-x64-musl@1.30.1: 2327 + lightningcss-linux-x64-gnu@1.30.2: 2331 2328 optional: true 2332 2329 2333 - lightningcss-win32-arm64-msvc@1.30.1: 2330 + lightningcss-linux-x64-musl@1.30.2: 2334 2331 optional: true 2335 2332 2336 - lightningcss-win32-x64-msvc@1.30.1: 2333 + lightningcss-win32-arm64-msvc@1.30.2: 2337 2334 optional: true 2338 2335 2339 - lightningcss@1.30.1: 2336 + lightningcss-win32-x64-msvc@1.30.2: 2337 + optional: true 2338 + 2339 + lightningcss@1.30.2: 2340 2340 dependencies: 2341 2341 detect-libc: 2.1.2 2342 2342 optionalDependencies: 2343 - lightningcss-darwin-arm64: 1.30.1 2344 - lightningcss-darwin-x64: 1.30.1 2345 - lightningcss-freebsd-x64: 1.30.1 2346 - lightningcss-linux-arm-gnueabihf: 1.30.1 2347 - lightningcss-linux-arm64-gnu: 1.30.1 2348 - lightningcss-linux-arm64-musl: 1.30.1 2349 - lightningcss-linux-x64-gnu: 1.30.1 2350 - lightningcss-linux-x64-musl: 1.30.1 2351 - lightningcss-win32-arm64-msvc: 1.30.1 2352 - lightningcss-win32-x64-msvc: 1.30.1 2343 + lightningcss-android-arm64: 1.30.2 2344 + lightningcss-darwin-arm64: 1.30.2 2345 + lightningcss-darwin-x64: 1.30.2 2346 + lightningcss-freebsd-x64: 1.30.2 2347 + lightningcss-linux-arm-gnueabihf: 1.30.2 2348 + lightningcss-linux-arm64-gnu: 1.30.2 2349 + lightningcss-linux-arm64-musl: 1.30.2 2350 + lightningcss-linux-x64-gnu: 1.30.2 2351 + lightningcss-linux-x64-musl: 1.30.2 2352 + lightningcss-win32-arm64-msvc: 1.30.2 2353 + lightningcss-win32-x64-msvc: 1.30.2 2353 2354 2354 2355 local-pkg@1.1.2: 2355 2356 dependencies: ··· 2368 2369 merge-anything@5.1.7: 2369 2370 dependencies: 2370 2371 is-what: 4.1.16 2371 - 2372 - minipass@7.1.2: {} 2373 - 2374 - minizlib@3.1.0: 2375 - dependencies: 2376 - minipass: 7.1.2 2377 2372 2378 2373 mlly@1.8.0: 2379 2374 dependencies: ··· 2392 2387 2393 2388 node-releases@2.0.25: {} 2394 2389 2395 - package-manager-detector@1.4.1: {} 2390 + package-manager-detector@1.5.0: {} 2396 2391 2397 2392 parse5@7.3.0: 2398 2393 dependencies: ··· 2495 2490 2496 2491 style-mod@4.1.3: {} 2497 2492 2498 - tailwindcss@4.1.14: {} 2493 + tailwindcss@4.1.15: {} 2499 2494 2500 2495 tapable@2.3.0: {} 2501 - 2502 - tar@7.5.1: 2503 - dependencies: 2504 - '@isaacs/fs-minipass': 4.0.1 2505 - chownr: 3.0.0 2506 - minipass: 7.1.2 2507 - minizlib: 3.1.0 2508 - yallist: 5.0.0 2509 2496 2510 2497 tinyexec@1.0.1: {} 2511 2498 ··· 2537 2524 2538 2525 validate-html-nesting@1.2.3: {} 2539 2526 2540 - vite-plugin-solid@2.11.9(solid-js@1.9.9)(vite@7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2)): 2527 + vite-plugin-solid@2.11.9(solid-js@1.9.9)(vite@7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 2541 2528 dependencies: 2542 2529 '@babel/core': 7.28.4 2543 2530 '@types/babel__core': 7.20.5 ··· 2545 2532 merge-anything: 5.1.7 2546 2533 solid-js: 1.9.9 2547 2534 solid-refresh: 0.6.3(solid-js@1.9.9) 2548 - vite: 7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2) 2549 - vitefu: 1.1.1(vite@7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2)) 2535 + vite: 7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2536 + vitefu: 1.1.1(vite@7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 2550 2537 transitivePeerDependencies: 2551 2538 - supports-color 2552 2539 2553 - vite@7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2): 2540 + vite@7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2): 2554 2541 dependencies: 2555 2542 esbuild: 0.25.11 2556 2543 fdir: 6.5.0(picomatch@4.0.3) ··· 2562 2549 '@types/node': 22.13.1 2563 2550 fsevents: 2.3.3 2564 2551 jiti: 2.6.1 2565 - lightningcss: 1.30.1 2552 + lightningcss: 1.30.2 2566 2553 tsx: 4.19.2 2567 2554 2568 - vitefu@1.1.1(vite@7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2)): 2555 + vitefu@1.1.1(vite@7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 2569 2556 optionalDependencies: 2570 - vite: 7.1.10(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.19.2) 2557 + vite: 7.1.11(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2571 2558 2572 2559 w3c-keyname@2.2.8: {} 2573 2560 2574 2561 yallist@3.1.1: {} 2575 - 2576 - yallist@5.0.0: {} 2577 2562 2578 2563 yocto-queue@1.2.1: {}
+2 -2
src/components/account.tsx
··· 97 97 return ( 98 98 <> 99 99 <Modal open={openManager()} onClose={() => setOpenManager(false)}> 100 - <div class="dark:bg-dark-300 dark:shadow-dark-700 absolute top-16 left-[50%] w-[22rem] -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-4 shadow-md transition-opacity duration-200 dark:border-neutral-700 starting:opacity-0"> 100 + <div class="dark:bg-dark-300 dark:shadow-dark-700 absolute top-16 left-[50%] w-88 -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-4 shadow-md transition-opacity duration-200 dark:border-neutral-700 starting:opacity-0"> 101 101 <div class="mb-2 px-1 font-semibold"> 102 102 <span>Manage accounts</span> 103 103 </div> 104 - <div class="mb-3 max-h-[20rem] overflow-y-auto md:max-h-[25rem]"> 104 + <div class="mb-3 max-h-80 overflow-y-auto md:max-h-100"> 105 105 <For each={Object.keys(sessions)}> 106 106 {(did) => ( 107 107 <div class="flex items-center">
+4 -4
src/components/create.tsx
··· 334 334 <div 335 335 data-draggable 336 336 classList={{ 337 - "dark:bg-dark-300 dark:shadow-dark-700 pointer-events-auto absolute top-16 left-[50%] w-screen -translate-x-1/2 cursor-grab rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-4 shadow-md transition-opacity duration-200 sm:w-xl lg:w-[48rem] dark:border-neutral-700 starting:opacity-0": true, 337 + "dark:bg-dark-300 dark:shadow-dark-700 pointer-events-auto absolute top-16 left-[50%] w-screen -translate-x-1/2 cursor-grab rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-4 shadow-md transition-opacity duration-200 sm:w-xl lg:w-3xl dark:border-neutral-700 starting:opacity-0": true, 338 338 "opacity-60 hover:opacity-100": nonBlocking(), 339 339 }} 340 340 ref={dragBox} ··· 369 369 <div class="flex flex-wrap items-center gap-1 text-sm"> 370 370 <span>at://</span> 371 371 <select 372 - class="dark:bg-dark-100 dark:shadow-dark-700 max-w-[10rem] truncate rounded-lg border-[0.5px] border-neutral-300 bg-white px-1 py-1 shadow-xs select-none focus:outline-[1px] focus:outline-neutral-600 dark:border-neutral-600 dark:focus:outline-neutral-400" 372 + class="dark:bg-dark-100 dark:shadow-dark-700 max-w-40 truncate rounded-lg border-[0.5px] border-neutral-300 bg-white px-1 py-1 shadow-xs select-none focus:outline-[1px] focus:outline-neutral-600 dark:border-neutral-600 dark:focus:outline-neutral-400" 373 373 name="repo" 374 374 id="repo" 375 375 > ··· 386 386 id="collection" 387 387 name="collection" 388 388 placeholder="Collection (default: $type)" 389 - class="w-[10rem] placeholder:text-xs lg:w-[13rem]" 389 + class="w-40 placeholder:text-xs lg:w-52" 390 390 /> 391 391 <span>/</span> 392 392 <TextInput 393 393 id="rkey" 394 394 name="rkey" 395 395 placeholder="Record key (default: TID)" 396 - class="w-[10rem] placeholder:text-xs lg:w-[13rem]" 396 + class="w-40 placeholder:text-xs lg:w-52" 397 397 /> 398 398 </div> 399 399 </Show>
+1 -1
src/components/json.tsx
··· 154 154 <span class="flex gap-x-1"> 155 155 <Show when={blob.mimeType.startsWith("image/") && !hide()}> 156 156 <img 157 - class="h-auto max-h-[16rem] max-w-[16rem] object-contain" 157 + class="h-auto max-h-64 max-w-[16rem] object-contain" 158 158 src={`https://${pds()}/xrpc/com.atproto.sync.getBlob?did=${repo}&cid=${blob.ref.$link}`} 159 159 /> 160 160 </Show>
+1 -1
src/components/navbar.tsx
··· 24 24 return ( 25 25 <nav class="flex w-full flex-col px-2 text-sm wrap-anywhere sm:text-base"> 26 26 <div class="relative flex items-center justify-between gap-1"> 27 - <div class="flex min-h-[1.25rem] basis-full items-center gap-2 sm:min-h-[1.5rem]"> 27 + <div class="flex min-h-5 basis-full items-center gap-2 sm:min-h-6"> 28 28 <Tooltip text="PDS"> 29 29 <span class="iconify lucide--hard-drive shrink-0"></span> 30 30 </Tooltip>
+1 -1
src/components/search.tsx
··· 165 165 return ( 166 166 <> 167 167 <Modal open={openList()} onClose={() => setOpenList(false)}> 168 - <div class="dark:bg-dark-300 dark:shadow-dark-700 absolute top-16 left-[50%] w-[22rem] -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-4 shadow-md transition-opacity duration-200 sm:w-[26rem] dark:border-neutral-700 starting:opacity-0"> 168 + <div class="dark:bg-dark-300 dark:shadow-dark-700 absolute top-16 left-[50%] w-88 -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-4 shadow-md transition-opacity duration-200 sm:w-104 dark:border-neutral-700 starting:opacity-0"> 169 169 <div class="mb-2 flex items-center gap-1 font-semibold"> 170 170 <span class="iconify lucide--link"></span> 171 171 <span>Supported URLs</span>
+1 -1
src/components/video-player.tsx
··· 19 19 }); 20 20 21 21 return ( 22 - <video ref={video} class="max-h-[20rem] max-w-[20rem]" controls playsinline> 22 + <video ref={video} class="max-h-80 max-w-[20rem]" controls playsinline> 23 23 <source type="video/mp4" /> 24 24 </video> 25 25 );
+1 -1
src/layout.tsx
··· 113 113 </Show> 114 114 <Show keyed when={location.pathname}> 115 115 <ErrorBoundary 116 - fallback={(err) => <div class="mt-3 break-words">Error: {err.message}</div>} 116 + fallback={(err) => <div class="mt-3 wrap-break-word">Error: {err.message}</div>} 117 117 > 118 118 <Suspense 119 119 fallback={
-306
src/utils/verify.ts
··· 1 - import * as CAR from "@atcute/car"; 2 - import { CarReader } from "@atcute/car/v4"; 3 - import * as CBOR from "@atcute/cbor"; 4 - import * as CID from "@atcute/cid"; 5 - import { Client } from "@atcute/client"; 6 - import { type FoundPublicKey, getPublicKeyFromDidController, verifySig } from "@atcute/crypto"; 7 - import { type DidDocument, getAtprotoVerificationMaterial } from "@atcute/identity"; 8 - import { Did } from "@atcute/lexicons"; 9 - import { toSha256 } from "@atcute/uint8array"; 10 - 11 - import { type AddressedAtUri, parseAddressedAtUri } from "./types/at-uri"; 12 - 13 - export interface VerifyError { 14 - message: string; 15 - detail?: unknown; 16 - } 17 - 18 - export interface VerifyResult { 19 - errors: VerifyError[]; 20 - } 21 - 22 - export interface VerifyOptions { 23 - rpc: Client; 24 - uri: string; 25 - cid: string; 26 - record: unknown; 27 - didDoc: DidDocument; 28 - } 29 - 30 - export const verifyRecord = async (opts: VerifyOptions): Promise<VerifyResult> => { 31 - const errors: VerifyError[] = []; 32 - 33 - // verify cid can be parsed 34 - try { 35 - CID.fromString(opts.cid); 36 - } catch (e) { 37 - errors.push({ message: `provided cid is invalid`, detail: e }); 38 - } 39 - 40 - // verify record content matches cid 41 - let cbor: Uint8Array; 42 - { 43 - cbor = CBOR.encode(opts.record); 44 - 45 - const cid = await CID.create(CID.CODEC_DCBOR, cbor); 46 - const cidString = CID.toString(cid); 47 - 48 - if (cidString !== opts.cid) { 49 - errors.push({ message: `record content does not match cid` }); 50 - } 51 - } 52 - 53 - // verify at-uri is valid 54 - let uri: AddressedAtUri; 55 - try { 56 - uri = parseAddressedAtUri(opts.uri); 57 - 58 - if (uri.repo !== opts.didDoc.id) { 59 - errors.push({ message: `repo in at-uri does not match did document` }); 60 - } 61 - } catch (err) { 62 - errors.push({ message: `provided at-uri is invalid`, detail: err }); 63 - return { errors }; 64 - } 65 - 66 - // grab public key from did document 67 - let publicKey: FoundPublicKey; 68 - try { 69 - const controller = getAtprotoVerificationMaterial(opts.didDoc); 70 - if (!controller) { 71 - errors.push({ 72 - message: `did document does not contain verification material`, 73 - }); 74 - return { errors }; 75 - } 76 - 77 - publicKey = getPublicKeyFromDidController(controller); 78 - } catch (err) { 79 - errors.push({ 80 - message: `failed to get public key from did document`, 81 - detail: err, 82 - }); 83 - return { errors }; 84 - } 85 - 86 - // grab the raw record blocks from the pds 87 - let car: Uint8Array; 88 - const { ok, data } = await opts.rpc.get("com.atproto.sync.getRecord", { 89 - params: { 90 - did: opts.didDoc.id as Did, 91 - collection: uri.collection, 92 - rkey: uri.rkey, 93 - }, 94 - as: "bytes", 95 - }); 96 - if (!ok) { 97 - errors.push({ message: `failed to fetch car from pds`, detail: data.error }); 98 - return { errors }; 99 - } else { 100 - car = data; 101 - } 102 - 103 - // read the car 104 - let blockmap: CAR.BlockMap; 105 - let commit: CAR.Commit; 106 - 107 - try { 108 - const reader = CarReader.fromUint8Array(car); 109 - if (reader.header.data.roots.length !== 1) { 110 - errors.push({ message: `car must have exactly one root` }); 111 - return { errors }; 112 - } 113 - 114 - blockmap = new Map(); 115 - for (const entry of reader) { 116 - const cidString = CID.toString(entry.cid); 117 - 118 - // Verify that `bytes` matches its associated CID 119 - const expectedCid = CID.toString(await CID.create(entry.cid.codec as 85 | 113, entry.bytes)); 120 - if (cidString !== expectedCid) { 121 - errors.push({ 122 - message: `cid does not match bytes`, 123 - detail: { cid: cidString, expectedCid }, 124 - }); 125 - } 126 - 127 - blockmap.set(cidString, entry); 128 - } 129 - 130 - if (blockmap.size === 0) { 131 - errors.push({ message: `car must have at least one block` }); 132 - return { errors }; 133 - } 134 - 135 - commit = CAR.readBlock(blockmap, reader.header.data.roots[0], CAR.isCommit); 136 - } catch (err) { 137 - errors.push({ message: `failed to read car`, detail: err }); 138 - return { errors }; 139 - } 140 - 141 - // verify did in commit matches the did in the at-uri 142 - if (commit.did !== opts.didDoc.id) { 143 - errors.push({ message: `did in commit does not match did document` }); 144 - } 145 - 146 - // verify signature contained in commit is valid 147 - { 148 - const { sig, ...unsigned } = commit; 149 - 150 - const data = CBOR.encode(unsigned); 151 - const valid = await verifySig( 152 - publicKey, 153 - CBOR.fromBytes(sig) as Uint8Array<ArrayBuffer>, 154 - data as Uint8Array<ArrayBuffer>, 155 - ); 156 - 157 - if (!valid) { 158 - errors.push({ message: `signature verification failed` }); 159 - } 160 - } 161 - 162 - // verify the commit is a valid commit 163 - try { 164 - const result = await dfs(blockmap, commit.data.$link, opts.cid); 165 - if (!result.found) { 166 - errors.push({ message: `could not find record in car` }); 167 - } 168 - } catch (err) { 169 - errors.push({ message: `failed to iterate over car`, detail: err }); 170 - } 171 - 172 - return { errors }; 173 - }; 174 - 175 - interface DfsResult { 176 - found: boolean; 177 - min?: string; 178 - max?: string; 179 - depth?: number; 180 - } 181 - 182 - const encoder = new TextEncoder(); 183 - const decoder = new TextDecoder(); 184 - 185 - const dfs = async ( 186 - blockmap: CAR.BlockMap, 187 - from: string | undefined, 188 - target: string, 189 - visited = new Set<string>(), 190 - ): Promise<DfsResult> => { 191 - // If there's no starting point, return empty state 192 - if (from == null) { 193 - return { found: false }; 194 - } 195 - 196 - // Check for cycles 197 - { 198 - if (visited.has(from)) { 199 - throw new Error(`cycle detected; cid=${from}`); 200 - } 201 - 202 - visited.add(from); 203 - } 204 - 205 - // Get the block data 206 - let node: CAR.MstNode; 207 - { 208 - const entry = blockmap.get(from); 209 - if (!entry) { 210 - return { found: false }; 211 - } 212 - 213 - const decoded = CBOR.decode(entry.bytes); 214 - if (!CAR.isMstNode(decoded)) { 215 - throw new Error(`invalid mst node; cid=${from}`); 216 - } 217 - 218 - node = decoded; 219 - } 220 - 221 - // Recursively process the left child 222 - const left = await dfs(blockmap, node.l?.$link, target, visited); 223 - 224 - let key = ""; 225 - let found = left.found; 226 - let depth: number | undefined; 227 - let firstKey: string | undefined; 228 - let lastKey: string | undefined; 229 - 230 - // Process all entries in this node 231 - for (const entry of node.e) { 232 - if (entry.v.$link === target) { 233 - found = true; 234 - } 235 - 236 - // Construct the key by truncating and appending 237 - key = key.substring(0, entry.p) + decoder.decode(CBOR.fromBytes(entry.k)); 238 - 239 - // Calculate depth based on leading zeros in the hash 240 - const keyDigest = await toSha256(encoder.encode(key) as Uint8Array<ArrayBuffer>); 241 - let zeroCount = 0; 242 - 243 - outerLoop: for (const byte of keyDigest) { 244 - for (let bit = 7; bit >= 0; bit--) { 245 - if (((byte >> bit) & 1) !== 0) { 246 - break outerLoop; 247 - } 248 - zeroCount++; 249 - } 250 - } 251 - 252 - const thisDepth = Math.floor(zeroCount / 2); 253 - 254 - // Ensure consistent depth 255 - if (depth === undefined) { 256 - depth = thisDepth; 257 - } else if (depth !== thisDepth) { 258 - throw new Error(`node has entries with different depths; cid=${from}`); 259 - } 260 - 261 - // Track first and last keys 262 - if (lastKey === undefined) { 263 - firstKey = key; 264 - lastKey = key; 265 - } 266 - 267 - // Check key ordering 268 - if (lastKey > key) { 269 - throw new Error(`entries are out of order; cid=${from}`); 270 - } 271 - 272 - // Process right child 273 - const right = await dfs(blockmap, entry.t?.$link, target, visited); 274 - 275 - // Check ordering with right subtree 276 - if (right.min && right.min < lastKey) { 277 - throw new Error(`entries are out of order; cid=${from}`); 278 - } 279 - 280 - found ||= right.found; 281 - 282 - // Check depth ordering 283 - if (left.depth !== undefined && left.depth >= thisDepth) { 284 - throw new Error(`depths are out of order; cid=${from}`); 285 - } 286 - 287 - if (right.depth !== undefined && right.depth >= thisDepth) { 288 - throw new Error(`depths are out of order; cid=${from}`); 289 - } 290 - 291 - // Update last key based on right subtree 292 - lastKey = right.max ?? key; 293 - } 294 - 295 - // Check ordering with left subtree 296 - if (left.max && firstKey && left.max > firstKey) { 297 - throw new Error(`entries are out of order; cid=${from}`); 298 - } 299 - 300 - return { 301 - found, 302 - min: firstKey, 303 - max: lastKey, 304 - depth, 305 - }; 306 - };
+3 -3
src/views/collection.tsx
··· 60 60 <Show when={hover()}> 61 61 <span 62 62 ref={previewRef} 63 - class={`dark:bg-dark-300 dark:shadow-dark-700 pointer-events-none absolute left-[50%] z-25 block max-h-[20rem] w-max max-w-sm -translate-x-1/2 overflow-hidden rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-2 text-xs whitespace-pre-wrap shadow-md sm:max-h-[28rem] lg:max-w-lg dark:border-neutral-700 ${isOverflowing(previewHeight()) ? "bottom-7" : "top-7"}`} 63 + class={`dark:bg-dark-300 dark:shadow-dark-700 pointer-events-none absolute left-[50%] z-25 block max-h-80 w-max max-w-sm -translate-x-1/2 overflow-hidden rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-2 text-xs whitespace-pre-wrap shadow-md sm:max-h-112 lg:max-w-lg dark:border-neutral-700 ${isOverflowing(previewHeight()) ? "bottom-7" : "top-7"}`} 64 64 > 65 65 <JSONValue 66 66 data={props.record.record.value as JSONType} ··· 312 312 </Show> 313 313 <span>{records.length} records</span> 314 314 </div> 315 - <div class="flex w-[5rem] items-center justify-end"> 315 + <div class="flex w-20 items-center justify-end"> 316 316 <Show when={cursor()}> 317 317 <Show when={!response.loading}> 318 318 <Button onClick={() => refetch()}>Load More</Button> 319 319 </Show> 320 320 <Show when={response.loading}> 321 - <div class="iconify lucide--loader-circle w-[5rem] animate-spin text-xl" /> 321 + <div class="iconify lucide--loader-circle w-20 animate-spin text-xl" /> 322 322 </Show> 323 323 </Show> 324 324 </div>
+2 -2
src/views/home.tsx
··· 1 1 export const Home = () => { 2 2 return ( 3 - <div class="flex w-full flex-col gap-4 break-words"> 3 + <div class="flex w-full flex-col gap-4 wrap-break-word"> 4 4 <div> 5 5 <div> 6 6 <span class="text-lg font-semibold">AT Protocol Explorer</span> ··· 58 58 Made by{" "} 59 59 <a 60 60 href="https://juli.ee" 61 - class="font-pecita relative after:absolute after:bottom-0 after:left-0 after:h-[1px] after:w-0 after:bg-current after:transition-[width] after:duration-300 after:ease-out hover:after:w-full" 61 + class="font-pecita relative after:absolute after:bottom-0 after:left-0 after:h-px after:w-0 after:bg-current after:transition-[width] after:duration-300 after:ease-out hover:after:w-full" 62 62 > 63 63 Juliet 64 64 </a>{" "}
+6 -6
src/views/labels.tsx
··· 113 113 </div> 114 114 </Show> 115 115 <Show when={cursor()}> 116 - <div class="flex h-[2rem] w-[5.5rem] items-center justify-center text-nowrap"> 116 + <div class="flex h-8 w-22 items-center justify-center text-nowrap"> 117 117 <Show when={!response.loading}> 118 118 <Button onClick={() => refetch()}>Load More</Button> 119 119 </Show> ··· 131 131 <div class="flex items-center justify-between gap-2 pb-2"> 132 132 <div class="flex flex-col"> 133 133 <div class="flex items-center gap-x-2"> 134 - <div class="min-w-[4rem] font-semibold">URI</div> 134 + <div class="min-w-16 font-semibold">URI</div> 135 135 <A 136 136 href={`/at://${label.uri.replace("at://", "")}`} 137 137 class="text-blue-400 hover:underline active:underline" ··· 141 141 </div> 142 142 <Show when={label.cid}> 143 143 <div class="flex items-center gap-x-2"> 144 - <div class="min-w-[4rem] font-semibold">CID</div> 144 + <div class="min-w-16 font-semibold">CID</div> 145 145 {label.cid} 146 146 </div> 147 147 </Show> 148 148 <div class="flex items-center gap-x-2"> 149 - <div class="min-w-[4rem] font-semibold">Label</div> 149 + <div class="min-w-16 font-semibold">Label</div> 150 150 {label.val} 151 151 </div> 152 152 <div class="flex items-center gap-x-2"> 153 - <div class="min-w-[4rem] font-semibold">Created</div> 153 + <div class="min-w-16 font-semibold">Created</div> 154 154 {localDateFromTimestamp(new Date(label.cts).getTime())} 155 155 </div> 156 156 <Show when={label.exp}> 157 157 {(exp) => ( 158 158 <div class="flex items-center gap-x-2"> 159 - <div class="min-w-[4rem] font-semibold">Expires</div> 159 + <div class="min-w-16 font-semibold">Expires</div> 160 160 {localDateFromTimestamp(new Date(exp()).getTime())} 161 161 </div> 162 162 )}
+1 -1
src/views/pds.tsx
··· 74 74 <span class="iconify lucide--info"></span> 75 75 </button> 76 76 <Modal open={openInfo()} onClose={() => setOpenInfo(false)}> 77 - <div class="dark:bg-dark-300 dark:shadow-dark-700 absolute top-70 left-[50%] w-max max-w-full -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-3 break-words shadow-md transition-opacity duration-200 sm:max-w-[32rem] dark:border-neutral-700 starting:opacity-0"> 77 + <div class="dark:bg-dark-300 dark:shadow-dark-700 absolute top-70 left-[50%] w-max max-w-full -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-3 wrap-break-word shadow-md transition-opacity duration-200 sm:max-w-lg dark:border-neutral-700 starting:opacity-0"> 78 78 <div class="mb-1 flex justify-between gap-2"> 79 79 <div class="flex items-center gap-1"> 80 80 <span class="iconify lucide--info"></span>
+27 -22
src/views/record.tsx
··· 2 2 import { lexiconDoc } from "@atcute/lexicon-doc"; 3 3 import { ResolvedSchema } from "@atcute/lexicon-resolver"; 4 4 import { ActorIdentifier, is, Nsid, ResourceUri } from "@atcute/lexicons"; 5 + import { AtprotoDid, Did } from "@atcute/lexicons/syntax"; 6 + import { verifyRecord } from "@atcute/repo"; 5 7 import { A, useLocation, useNavigate, useParams } from "@solidjs/router"; 6 8 import { createResource, createSignal, ErrorBoundary, Show, Suspense } from "solid-js"; 7 9 import { Backlinks } from "../components/backlinks.jsx"; ··· 15 17 import { pds } from "../components/navbar.jsx"; 16 18 import Tooltip from "../components/tooltip.jsx"; 17 19 import { setNotif } from "../layout.jsx"; 18 - import { 19 - didDocCache, 20 - resolveLexiconAuthority, 21 - resolveLexiconSchema, 22 - resolvePDS, 23 - } from "../utils/api.js"; 20 + import { resolveLexiconAuthority, resolveLexiconSchema, resolvePDS } from "../utils/api.js"; 24 21 import { AtUri, uriTemplates } from "../utils/templates.js"; 25 22 import { lexicons } from "../utils/types/lexicons.js"; 26 - import { verifyRecord } from "../utils/verify.js"; 27 23 28 24 export const RecordView = () => { 29 25 const location = useLocation(); ··· 89 85 setValidSchema(false); 90 86 } 91 87 } 92 - const { errors } = await verifyRecord({ 93 - rpc: rpc, 94 - uri: record.uri, 95 - cid: record.cid!, 96 - record: record.value, 97 - didDoc: didDocCache[record.uri.split("/")[2]], 88 + 89 + const { ok, data } = await rpc.get("com.atproto.sync.getRecord", { 90 + params: { 91 + did: did as Did, 92 + collection: params.collection as Nsid, 93 + rkey: params.rkey, 94 + }, 95 + as: "bytes", 96 + }); 97 + if (!ok) throw data.error; 98 + 99 + await verifyRecord({ 100 + did: did as AtprotoDid, 101 + collection: params.collection, 102 + rkey: params.rkey, 103 + carBytes: data, 98 104 }); 99 105 100 - if (errors.length > 0) { 101 - console.warn(errors); 102 - setNotice(`Invalid record: ${errors.map((e) => e.message).join("\n")}`); 103 - } 104 - setValidRecord(errors.length === 0); 105 - } catch (err) { 106 + setValidRecord(true); 107 + } catch (err: any) { 106 108 console.error(err); 109 + setNotice(err.message); 107 110 setValidRecord(false); 108 111 } 109 112 }; ··· 247 250 </div> 248 251 </div> 249 252 <Show when={!location.hash || location.hash === "#record"}> 250 - <div class="w-max max-w-screen min-w-full px-4 font-mono text-xs wrap-anywhere whitespace-pre-wrap sm:px-2 sm:text-sm md:max-w-[48rem]"> 253 + <div class="w-max max-w-screen min-w-full px-4 font-mono text-xs wrap-anywhere whitespace-pre-wrap sm:px-2 sm:text-sm md:max-w-3xl"> 251 254 <JSONValue data={record()?.value as any} repo={record()!.uri.split("/")[2]} /> 252 255 </div> 253 256 </Show> ··· 265 268 </Show> 266 269 </Show> 267 270 <Show when={location.hash === "#backlinks"}> 268 - <ErrorBoundary fallback={(err) => <div class="break-words">Error: {err.message}</div>}> 271 + <ErrorBoundary 272 + fallback={(err) => <div class="wrap-break-word">Error: {err.message}</div>} 273 + > 269 274 <Suspense 270 275 fallback={ 271 276 <div class="iconify lucide--loader-circle animate-spin self-center text-xl" /> ··· 311 316 ></span> 312 317 </div> 313 318 <Show when={validRecord() === false}> 314 - <div class="break-words">{notice()}</div> 319 + <div class="wrap-break-word">{notice()}</div> 315 320 </Show> 316 321 </div> 317 322 <Show when={validSchema() !== undefined}>
+10 -4
src/views/repo.tsx
··· 153 153 154 154 return ( 155 155 <Show when={repo()}> 156 - <div class="flex w-full flex-col gap-2 break-words"> 156 + <div class="flex w-full flex-col gap-2 wrap-break-word"> 157 157 <div 158 158 class={`dark:shadow-dark-700 dark:bg-dark-300 flex justify-between rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 px-2 py-1.5 text-sm shadow-xs dark:border-neutral-700`} 159 159 > ··· 229 229 </div> 230 230 <div class="flex w-full flex-col gap-1 px-2"> 231 231 <Show when={location.hash === "#logs"}> 232 - <ErrorBoundary fallback={(err) => <div class="break-words">Error: {err.message}</div>}> 232 + <ErrorBoundary 233 + fallback={(err) => <div class="wrap-break-word">Error: {err.message}</div>} 234 + > 233 235 <Suspense 234 236 fallback={ 235 237 <div class="iconify lucide--loader-circle mt-2 animate-spin self-center text-xl" /> ··· 240 242 </ErrorBoundary> 241 243 </Show> 242 244 <Show when={location.hash === "#backlinks"}> 243 - <ErrorBoundary fallback={(err) => <div class="break-words">Error: {err.message}</div>}> 245 + <ErrorBoundary 246 + fallback={(err) => <div class="wrap-break-word">Error: {err.message}</div>} 247 + > 244 248 <Suspense 245 249 fallback={ 246 250 <div class="iconify lucide--loader-circle mt-2 animate-spin self-center text-xl" /> ··· 251 255 </ErrorBoundary> 252 256 </Show> 253 257 <Show when={location.hash === "#blobs"}> 254 - <ErrorBoundary fallback={(err) => <div class="break-words">Error: {err.message}</div>}> 258 + <ErrorBoundary 259 + fallback={(err) => <div class="wrap-break-word">Error: {err.message}</div>} 260 + > 255 261 <Suspense 256 262 fallback={ 257 263 <div class="iconify lucide--loader-circle mt-2 animate-spin self-center text-xl" />
+6 -6
src/views/stream.tsx
··· 163 163 <form ref={formRef} class="flex w-full flex-col gap-1 text-sm"> 164 164 <Show when={!connected()}> 165 165 <label class="flex items-center justify-end gap-x-1"> 166 - <span class="min-w-[5rem]">Instance</span> 166 + <span class="min-w-20">Instance</span> 167 167 <TextInput 168 168 name="instance" 169 169 value={ ··· 177 177 </label> 178 178 <Show when={streamType === "jetstream"}> 179 179 <label class="flex items-center justify-end gap-x-1"> 180 - <span class="min-w-[5rem]">Collections</span> 180 + <span class="min-w-20">Collections</span> 181 181 <textarea 182 182 name="collections" 183 183 spellcheck={false} ··· 189 189 </Show> 190 190 <Show when={streamType === "jetstream"}> 191 191 <label class="flex items-center justify-end gap-x-1"> 192 - <span class="min-w-[5rem]">DIDs</span> 192 + <span class="min-w-20">DIDs</span> 193 193 <textarea 194 194 name="dids" 195 195 spellcheck={false} ··· 200 200 </label> 201 201 </Show> 202 202 <label class="flex items-center justify-end gap-x-1"> 203 - <span class="min-w-[5rem]">Cursor</span> 203 + <span class="min-w-20">Cursor</span> 204 204 <TextInput 205 205 name="cursor" 206 206 placeholder="Leave empty for live-tail" ··· 228 228 {(param) => ( 229 229 <Show when={param.param}> 230 230 <div class="flex"> 231 - <div class="min-w-[6rem] font-semibold">{param.name}</div> 231 + <div class="min-w-24 font-semibold">{param.name}</div> 232 232 {param.param} 233 233 </div> 234 234 </Show> ··· 246 246 <Show when={notice().length}> 247 247 <div class="text-red-500 dark:text-red-400">{notice()}</div> 248 248 </Show> 249 - <div class="flex w-full flex-col gap-2 divide-y-[0.5px] divide-neutral-500 font-mono text-sm wrap-anywhere whitespace-pre-wrap md:w-[48rem]"> 249 + <div class="flex w-full flex-col gap-2 divide-y-[0.5px] divide-neutral-500 font-mono text-sm wrap-anywhere whitespace-pre-wrap md:w-3xl"> 250 250 <For each={records().toReversed()}> 251 251 {(rec) => ( 252 252 <div class="pb-2">