social bookmarking for atproto

[frontend] Add OAuth

hexmani.ac ec96ec15 fce94307

verified
+1
frontend/README.md
··· 6 6 7 7 ```shell 8 8 pnpm install 9 + cp .env.example .env # Modify this if necessary 9 10 pnpm run dev 10 11 ``` 11 12
+8 -4
frontend/package.json
··· 12 12 }, 13 13 "license": "AGPL-3.0-only", 14 14 "devDependencies": { 15 + "@types/node": "^24.2.0", 15 16 "prettier": "^3.6.2", 16 - "typescript": "^5.7.2", 17 - "vite": "^6.0.0", 18 - "vite-plugin-solid": "^2.11.6" 17 + "solid-devtools": "^0.34.3", 18 + "typescript": "^5.9.2", 19 + "vite": "^6.3.5", 20 + "vite-plugin-solid": "^2.11.8" 19 21 }, 20 22 "dependencies": { 23 + "@atcute/lexicons": "^1.1.0", 24 + "@atcute/oauth-browser-client": "^1.0.26", 21 25 "@solidjs/router": "^0.15.3", 22 - "solid-js": "^1.9.5" 26 + "solid-js": "^1.9.7" 23 27 } 24 28 }
+765 -421
frontend/pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 + '@atcute/lexicons': 12 + specifier: ^1.1.0 13 + version: 1.1.0 14 + '@atcute/oauth-browser-client': 15 + specifier: ^1.0.26 16 + version: 1.0.26 11 17 '@solidjs/router': 12 18 specifier: ^0.15.3 13 - version: 0.15.3(solid-js@1.9.5) 19 + version: 0.15.3(solid-js@1.9.7) 14 20 solid-js: 15 - specifier: ^1.9.5 16 - version: 1.9.5 21 + specifier: ^1.9.7 22 + version: 1.9.7 17 23 devDependencies: 24 + '@types/node': 25 + specifier: ^24.2.0 26 + version: 24.2.0 18 27 prettier: 19 28 specifier: ^3.6.2 20 29 version: 3.6.2 30 + solid-devtools: 31 + specifier: ^0.34.3 32 + version: 0.34.3(solid-js@1.9.7)(vite@6.3.5(@types/node@24.2.0)) 21 33 typescript: 22 - specifier: ^5.7.2 23 - version: 5.7.2 34 + specifier: ^5.9.2 35 + version: 5.9.2 24 36 vite: 25 - specifier: ^6.0.0 26 - version: 6.0.0 37 + specifier: ^6.3.5 38 + version: 6.3.5(@types/node@24.2.0) 27 39 vite-plugin-solid: 28 - specifier: ^2.11.6 29 - version: 2.11.6(solid-js@1.9.5)(vite@6.0.0) 40 + specifier: ^2.11.8 41 + version: 2.11.8(solid-js@1.9.7)(vite@6.3.5(@types/node@24.2.0)) 30 42 31 43 packages: 32 44 ··· 34 46 resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 35 47 engines: {node: '>=6.0.0'} 36 48 37 - '@babel/code-frame@7.26.2': 38 - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 49 + '@atcute/client@4.0.3': 50 + resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 51 + 52 + '@atcute/identity@1.0.3': 53 + resolution: {integrity: sha512-mNMxbKHFGys03A8JXKk0KfMBzdd0vrYMzZZWjpw1nYTs0+ea6bo5S1hwqVUZxHdo1gFHSe/t63jxQIF4yL9aKw==} 54 + 55 + '@atcute/lexicons@1.1.0': 56 + resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 57 + 58 + '@atcute/multibase@1.1.4': 59 + resolution: {integrity: sha512-NUf5AeeSOmuZHGU+4GAaMtISJoG+ZHtW/vUVA4lK/YDt/7LODAW0Fd0NNIIUPVUoW0xJS6zSEIWvwLLuxmEHhA==} 60 + 61 + '@atcute/oauth-browser-client@1.0.26': 62 + resolution: {integrity: sha512-z8VUmwRO1sFu5Dq1qYQOQLenkTSNaOyzlUZhVwFR41ru+AP84MS5UHHW/NsdC1xJAq1v6mlLySJ+pjxdDW8IYA==} 63 + 64 + '@atcute/uint8array@1.0.3': 65 + resolution: {integrity: sha512-M/K+ihiVW8Pl2PFLzaC4E3l4JaZ1IH05Q0AbPWUC4cVHnd/gZ/1kAF5ngdtGvJeDMirHZ2VAy7OmAsPwR/2nlA==} 66 + 67 + '@babel/code-frame@7.27.1': 68 + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 69 + engines: {node: '>=6.9.0'} 70 + 71 + '@babel/compat-data@7.28.0': 72 + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 39 73 engines: {node: '>=6.9.0'} 40 74 41 - '@babel/compat-data@7.26.2': 42 - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} 75 + '@babel/core@7.28.0': 76 + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 43 77 engines: {node: '>=6.9.0'} 44 78 45 - '@babel/core@7.26.0': 46 - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} 79 + '@babel/generator@7.28.0': 80 + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 47 81 engines: {node: '>=6.9.0'} 48 82 49 - '@babel/generator@7.26.2': 50 - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} 83 + '@babel/helper-compilation-targets@7.27.2': 84 + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 51 85 engines: {node: '>=6.9.0'} 52 86 53 - '@babel/helper-compilation-targets@7.25.9': 54 - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} 87 + '@babel/helper-globals@7.28.0': 88 + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 55 89 engines: {node: '>=6.9.0'} 56 90 57 91 '@babel/helper-module-imports@7.18.6': 58 92 resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 59 93 engines: {node: '>=6.9.0'} 60 94 61 - '@babel/helper-module-imports@7.25.9': 62 - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 95 + '@babel/helper-module-imports@7.27.1': 96 + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 63 97 engines: {node: '>=6.9.0'} 64 98 65 - '@babel/helper-module-transforms@7.26.0': 66 - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 99 + '@babel/helper-module-transforms@7.27.3': 100 + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 67 101 engines: {node: '>=6.9.0'} 68 102 peerDependencies: 69 103 '@babel/core': ^7.0.0 70 104 71 - '@babel/helper-plugin-utils@7.25.9': 72 - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} 105 + '@babel/helper-plugin-utils@7.27.1': 106 + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 73 107 engines: {node: '>=6.9.0'} 74 108 75 - '@babel/helper-string-parser@7.25.9': 76 - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 109 + '@babel/helper-string-parser@7.27.1': 110 + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 77 111 engines: {node: '>=6.9.0'} 78 112 79 - '@babel/helper-validator-identifier@7.25.9': 80 - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 113 + '@babel/helper-validator-identifier@7.27.1': 114 + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 81 115 engines: {node: '>=6.9.0'} 82 116 83 - '@babel/helper-validator-option@7.25.9': 84 - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 117 + '@babel/helper-validator-option@7.27.1': 118 + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 85 119 engines: {node: '>=6.9.0'} 86 120 87 - '@babel/helpers@7.26.0': 88 - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} 121 + '@babel/helpers@7.28.2': 122 + resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} 89 123 engines: {node: '>=6.9.0'} 90 124 91 - '@babel/parser@7.26.2': 92 - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} 125 + '@babel/parser@7.28.0': 126 + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 93 127 engines: {node: '>=6.0.0'} 94 128 hasBin: true 95 129 96 - '@babel/plugin-syntax-jsx@7.25.9': 97 - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 130 + '@babel/plugin-syntax-jsx@7.27.1': 131 + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} 98 132 engines: {node: '>=6.9.0'} 99 133 peerDependencies: 100 134 '@babel/core': ^7.0.0-0 101 135 102 - '@babel/template@7.25.9': 103 - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} 136 + '@babel/plugin-syntax-typescript@7.27.1': 137 + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} 104 138 engines: {node: '>=6.9.0'} 139 + peerDependencies: 140 + '@babel/core': ^7.0.0-0 105 141 106 - '@babel/traverse@7.25.9': 107 - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} 142 + '@babel/template@7.27.2': 143 + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 144 + engines: {node: '>=6.9.0'} 145 + 146 + '@babel/traverse@7.28.0': 147 + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} 108 148 engines: {node: '>=6.9.0'} 109 149 110 - '@babel/types@7.26.0': 111 - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} 150 + '@babel/types@7.28.2': 151 + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 112 152 engines: {node: '>=6.9.0'} 113 153 114 - '@esbuild/aix-ppc64@0.24.0': 115 - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 154 + '@badrap/valita@0.4.6': 155 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 156 + engines: {node: '>= 18'} 157 + 158 + '@esbuild/aix-ppc64@0.25.8': 159 + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} 116 160 engines: {node: '>=18'} 117 161 cpu: [ppc64] 118 162 os: [aix] 119 163 120 - '@esbuild/android-arm64@0.24.0': 121 - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 164 + '@esbuild/android-arm64@0.25.8': 165 + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} 122 166 engines: {node: '>=18'} 123 167 cpu: [arm64] 124 168 os: [android] 125 169 126 - '@esbuild/android-arm@0.24.0': 127 - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 170 + '@esbuild/android-arm@0.25.8': 171 + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} 128 172 engines: {node: '>=18'} 129 173 cpu: [arm] 130 174 os: [android] 131 175 132 - '@esbuild/android-x64@0.24.0': 133 - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 176 + '@esbuild/android-x64@0.25.8': 177 + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} 134 178 engines: {node: '>=18'} 135 179 cpu: [x64] 136 180 os: [android] 137 181 138 - '@esbuild/darwin-arm64@0.24.0': 139 - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 182 + '@esbuild/darwin-arm64@0.25.8': 183 + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} 140 184 engines: {node: '>=18'} 141 185 cpu: [arm64] 142 186 os: [darwin] 143 187 144 - '@esbuild/darwin-x64@0.24.0': 145 - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 188 + '@esbuild/darwin-x64@0.25.8': 189 + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} 146 190 engines: {node: '>=18'} 147 191 cpu: [x64] 148 192 os: [darwin] 149 193 150 - '@esbuild/freebsd-arm64@0.24.0': 151 - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 194 + '@esbuild/freebsd-arm64@0.25.8': 195 + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} 152 196 engines: {node: '>=18'} 153 197 cpu: [arm64] 154 198 os: [freebsd] 155 199 156 - '@esbuild/freebsd-x64@0.24.0': 157 - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 200 + '@esbuild/freebsd-x64@0.25.8': 201 + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} 158 202 engines: {node: '>=18'} 159 203 cpu: [x64] 160 204 os: [freebsd] 161 205 162 - '@esbuild/linux-arm64@0.24.0': 163 - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 206 + '@esbuild/linux-arm64@0.25.8': 207 + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} 164 208 engines: {node: '>=18'} 165 209 cpu: [arm64] 166 210 os: [linux] 167 211 168 - '@esbuild/linux-arm@0.24.0': 169 - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 212 + '@esbuild/linux-arm@0.25.8': 213 + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} 170 214 engines: {node: '>=18'} 171 215 cpu: [arm] 172 216 os: [linux] 173 217 174 - '@esbuild/linux-ia32@0.24.0': 175 - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 218 + '@esbuild/linux-ia32@0.25.8': 219 + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} 176 220 engines: {node: '>=18'} 177 221 cpu: [ia32] 178 222 os: [linux] 179 223 180 - '@esbuild/linux-loong64@0.24.0': 181 - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 224 + '@esbuild/linux-loong64@0.25.8': 225 + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} 182 226 engines: {node: '>=18'} 183 227 cpu: [loong64] 184 228 os: [linux] 185 229 186 - '@esbuild/linux-mips64el@0.24.0': 187 - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 230 + '@esbuild/linux-mips64el@0.25.8': 231 + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} 188 232 engines: {node: '>=18'} 189 233 cpu: [mips64el] 190 234 os: [linux] 191 235 192 - '@esbuild/linux-ppc64@0.24.0': 193 - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 236 + '@esbuild/linux-ppc64@0.25.8': 237 + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} 194 238 engines: {node: '>=18'} 195 239 cpu: [ppc64] 196 240 os: [linux] 197 241 198 - '@esbuild/linux-riscv64@0.24.0': 199 - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 242 + '@esbuild/linux-riscv64@0.25.8': 243 + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} 200 244 engines: {node: '>=18'} 201 245 cpu: [riscv64] 202 246 os: [linux] 203 247 204 - '@esbuild/linux-s390x@0.24.0': 205 - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 248 + '@esbuild/linux-s390x@0.25.8': 249 + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} 206 250 engines: {node: '>=18'} 207 251 cpu: [s390x] 208 252 os: [linux] 209 253 210 - '@esbuild/linux-x64@0.24.0': 211 - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 254 + '@esbuild/linux-x64@0.25.8': 255 + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} 212 256 engines: {node: '>=18'} 213 257 cpu: [x64] 214 258 os: [linux] 215 259 216 - '@esbuild/netbsd-x64@0.24.0': 217 - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 260 + '@esbuild/netbsd-arm64@0.25.8': 261 + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} 262 + engines: {node: '>=18'} 263 + cpu: [arm64] 264 + os: [netbsd] 265 + 266 + '@esbuild/netbsd-x64@0.25.8': 267 + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} 218 268 engines: {node: '>=18'} 219 269 cpu: [x64] 220 270 os: [netbsd] 221 271 222 - '@esbuild/openbsd-arm64@0.24.0': 223 - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 272 + '@esbuild/openbsd-arm64@0.25.8': 273 + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} 224 274 engines: {node: '>=18'} 225 275 cpu: [arm64] 226 276 os: [openbsd] 227 277 228 - '@esbuild/openbsd-x64@0.24.0': 229 - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 278 + '@esbuild/openbsd-x64@0.25.8': 279 + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} 230 280 engines: {node: '>=18'} 231 281 cpu: [x64] 232 282 os: [openbsd] 233 283 234 - '@esbuild/sunos-x64@0.24.0': 235 - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 284 + '@esbuild/openharmony-arm64@0.25.8': 285 + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} 286 + engines: {node: '>=18'} 287 + cpu: [arm64] 288 + os: [openharmony] 289 + 290 + '@esbuild/sunos-x64@0.25.8': 291 + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} 236 292 engines: {node: '>=18'} 237 293 cpu: [x64] 238 294 os: [sunos] 239 295 240 - '@esbuild/win32-arm64@0.24.0': 241 - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 296 + '@esbuild/win32-arm64@0.25.8': 297 + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} 242 298 engines: {node: '>=18'} 243 299 cpu: [arm64] 244 300 os: [win32] 245 301 246 - '@esbuild/win32-ia32@0.24.0': 247 - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 302 + '@esbuild/win32-ia32@0.25.8': 303 + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} 248 304 engines: {node: '>=18'} 249 305 cpu: [ia32] 250 306 os: [win32] 251 307 252 - '@esbuild/win32-x64@0.24.0': 253 - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 308 + '@esbuild/win32-x64@0.25.8': 309 + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} 254 310 engines: {node: '>=18'} 255 311 cpu: [x64] 256 312 os: [win32] 257 313 258 - '@jridgewell/gen-mapping@0.3.5': 259 - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 260 - engines: {node: '>=6.0.0'} 314 + '@jridgewell/gen-mapping@0.3.12': 315 + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 261 316 262 317 '@jridgewell/resolve-uri@3.1.2': 263 318 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 264 319 engines: {node: '>=6.0.0'} 265 320 266 - '@jridgewell/set-array@1.2.1': 267 - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 268 - engines: {node: '>=6.0.0'} 321 + '@jridgewell/sourcemap-codec@1.5.4': 322 + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 269 323 270 - '@jridgewell/sourcemap-codec@1.5.0': 271 - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 324 + '@jridgewell/trace-mapping@0.3.29': 325 + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 272 326 273 - '@jridgewell/trace-mapping@0.3.25': 274 - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 327 + '@nothing-but/utils@0.17.0': 328 + resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} 275 329 276 - '@rollup/rollup-android-arm-eabi@4.27.4': 277 - resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} 330 + '@rollup/rollup-android-arm-eabi@4.46.2': 331 + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} 278 332 cpu: [arm] 279 333 os: [android] 280 334 281 - '@rollup/rollup-android-arm64@4.27.4': 282 - resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} 335 + '@rollup/rollup-android-arm64@4.46.2': 336 + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} 283 337 cpu: [arm64] 284 338 os: [android] 285 339 286 - '@rollup/rollup-darwin-arm64@4.27.4': 287 - resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} 340 + '@rollup/rollup-darwin-arm64@4.46.2': 341 + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} 288 342 cpu: [arm64] 289 343 os: [darwin] 290 344 291 - '@rollup/rollup-darwin-x64@4.27.4': 292 - resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} 345 + '@rollup/rollup-darwin-x64@4.46.2': 346 + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} 293 347 cpu: [x64] 294 348 os: [darwin] 295 349 296 - '@rollup/rollup-freebsd-arm64@4.27.4': 297 - resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} 350 + '@rollup/rollup-freebsd-arm64@4.46.2': 351 + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} 298 352 cpu: [arm64] 299 353 os: [freebsd] 300 354 301 - '@rollup/rollup-freebsd-x64@4.27.4': 302 - resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} 355 + '@rollup/rollup-freebsd-x64@4.46.2': 356 + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} 303 357 cpu: [x64] 304 358 os: [freebsd] 305 359 306 - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': 307 - resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} 360 + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 361 + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} 308 362 cpu: [arm] 309 363 os: [linux] 310 364 311 - '@rollup/rollup-linux-arm-musleabihf@4.27.4': 312 - resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} 365 + '@rollup/rollup-linux-arm-musleabihf@4.46.2': 366 + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} 313 367 cpu: [arm] 314 368 os: [linux] 315 369 316 - '@rollup/rollup-linux-arm64-gnu@4.27.4': 317 - resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} 370 + '@rollup/rollup-linux-arm64-gnu@4.46.2': 371 + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} 318 372 cpu: [arm64] 319 373 os: [linux] 320 374 321 - '@rollup/rollup-linux-arm64-musl@4.27.4': 322 - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} 375 + '@rollup/rollup-linux-arm64-musl@4.46.2': 376 + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} 323 377 cpu: [arm64] 324 378 os: [linux] 325 379 326 - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': 327 - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} 380 + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 381 + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} 382 + cpu: [loong64] 383 + os: [linux] 384 + 385 + '@rollup/rollup-linux-ppc64-gnu@4.46.2': 386 + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} 328 387 cpu: [ppc64] 329 388 os: [linux] 330 389 331 - '@rollup/rollup-linux-riscv64-gnu@4.27.4': 332 - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} 390 + '@rollup/rollup-linux-riscv64-gnu@4.46.2': 391 + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} 392 + cpu: [riscv64] 393 + os: [linux] 394 + 395 + '@rollup/rollup-linux-riscv64-musl@4.46.2': 396 + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} 333 397 cpu: [riscv64] 334 398 os: [linux] 335 399 336 - '@rollup/rollup-linux-s390x-gnu@4.27.4': 337 - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} 400 + '@rollup/rollup-linux-s390x-gnu@4.46.2': 401 + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} 338 402 cpu: [s390x] 339 403 os: [linux] 340 404 341 - '@rollup/rollup-linux-x64-gnu@4.27.4': 342 - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} 405 + '@rollup/rollup-linux-x64-gnu@4.46.2': 406 + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} 343 407 cpu: [x64] 344 408 os: [linux] 345 409 346 - '@rollup/rollup-linux-x64-musl@4.27.4': 347 - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} 410 + '@rollup/rollup-linux-x64-musl@4.46.2': 411 + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} 348 412 cpu: [x64] 349 413 os: [linux] 350 414 351 - '@rollup/rollup-win32-arm64-msvc@4.27.4': 352 - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} 415 + '@rollup/rollup-win32-arm64-msvc@4.46.2': 416 + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} 353 417 cpu: [arm64] 354 418 os: [win32] 355 419 356 - '@rollup/rollup-win32-ia32-msvc@4.27.4': 357 - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} 420 + '@rollup/rollup-win32-ia32-msvc@4.46.2': 421 + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} 358 422 cpu: [ia32] 359 423 os: [win32] 360 424 361 - '@rollup/rollup-win32-x64-msvc@4.27.4': 362 - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} 425 + '@rollup/rollup-win32-x64-msvc@4.46.2': 426 + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} 363 427 cpu: [x64] 364 428 os: [win32] 365 429 430 + '@solid-devtools/debugger@0.28.1': 431 + resolution: {integrity: sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==} 432 + peerDependencies: 433 + solid-js: ^1.9.0 434 + 435 + '@solid-devtools/shared@0.20.0': 436 + resolution: {integrity: sha512-o5TACmUOQsxpzpOKCjbQqGk8wL8PMi+frXG9WNu4Lh3PQVUB6hs95Kl/S8xc++zwcMguUKZJn8h5URUiMOca6Q==} 437 + peerDependencies: 438 + solid-js: ^1.9.0 439 + 440 + '@solid-primitives/bounds@0.1.3': 441 + resolution: {integrity: sha512-UbiyKMdSPmtijcEDnYLQL3zzaejpwWDAJJ4Gt5P0hgVs6A72piov0GyNw7V2SroH7NZFwxlYS22YmOr8A5xc1Q==} 442 + peerDependencies: 443 + solid-js: ^1.6.12 444 + 445 + '@solid-primitives/event-listener@2.4.3': 446 + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} 447 + peerDependencies: 448 + solid-js: ^1.6.12 449 + 450 + '@solid-primitives/keyboard@1.3.3': 451 + resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} 452 + peerDependencies: 453 + solid-js: ^1.6.12 454 + 455 + '@solid-primitives/media@2.3.3': 456 + resolution: {integrity: sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==} 457 + peerDependencies: 458 + solid-js: ^1.6.12 459 + 460 + '@solid-primitives/refs@1.1.2': 461 + resolution: {integrity: sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==} 462 + peerDependencies: 463 + solid-js: ^1.6.12 464 + 465 + '@solid-primitives/resize-observer@2.1.3': 466 + resolution: {integrity: sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==} 467 + peerDependencies: 468 + solid-js: ^1.6.12 469 + 470 + '@solid-primitives/rootless@1.5.2': 471 + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} 472 + peerDependencies: 473 + solid-js: ^1.6.12 474 + 475 + '@solid-primitives/scheduled@1.5.2': 476 + resolution: {integrity: sha512-/j2igE0xyNaHhj6kMfcUQn5rAVSTLbAX+CDEBm25hSNBmNiHLu2lM7Usj2kJJ5j36D67bE8wR1hBNA8hjtvsQA==} 477 + peerDependencies: 478 + solid-js: ^1.6.12 479 + 480 + '@solid-primitives/static-store@0.1.2': 481 + resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} 482 + peerDependencies: 483 + solid-js: ^1.6.12 484 + 485 + '@solid-primitives/styles@0.1.2': 486 + resolution: {integrity: sha512-7iX5K+J5b1PRrbgw3Ki92uvU2LgQ0Kd/QMsrAZxDg5dpUBwMyTijZkA3bbs1ikZsT1oQhS41bTyKbjrXeU0Awg==} 487 + peerDependencies: 488 + solid-js: ^1.6.12 489 + 490 + '@solid-primitives/utils@6.3.2': 491 + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} 492 + peerDependencies: 493 + solid-js: ^1.6.12 494 + 366 495 '@solidjs/router@0.15.3': 367 496 resolution: {integrity: sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==} 368 497 peerDependencies: ··· 371 500 '@types/babel__core@7.20.5': 372 501 resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 373 502 374 - '@types/babel__generator@7.6.8': 375 - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 503 + '@types/babel__generator@7.27.0': 504 + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 376 505 377 506 '@types/babel__template@7.4.4': 378 507 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 379 508 380 - '@types/babel__traverse@7.20.6': 381 - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 509 + '@types/babel__traverse@7.28.0': 510 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 382 511 383 - '@types/estree@1.0.6': 384 - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 512 + '@types/estree@1.0.8': 513 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 514 + 515 + '@types/node@24.2.0': 516 + resolution: {integrity: sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==} 385 517 386 - babel-plugin-jsx-dom-expressions@0.39.3: 387 - resolution: {integrity: sha512-6RzmSu21zYPlV2gNwzjGG9FgODtt9hIWnx7L//OIioIEuRcnpDZoY8Tr+I81Cy1SrH4qoDyKpwHHo6uAMAeyPA==} 518 + babel-plugin-jsx-dom-expressions@0.39.8: 519 + resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} 388 520 peerDependencies: 389 521 '@babel/core': ^7.20.12 390 522 391 - babel-preset-solid@1.9.3: 392 - resolution: {integrity: sha512-jvlx5wDp8s+bEF9sGFw/84SInXOA51ttkUEroQziKMbxplXThVKt83qB6bDTa1HuLNatdU9FHpFOiQWs1tLQIg==} 523 + babel-preset-solid@1.9.6: 524 + resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 393 525 peerDependencies: 394 526 '@babel/core': ^7.0.0 395 527 396 - browserslist@4.24.2: 397 - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} 528 + browserslist@4.25.1: 529 + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} 398 530 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 399 531 hasBin: true 400 532 401 - caniuse-lite@1.0.30001684: 402 - resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} 533 + caniuse-lite@1.0.30001731: 534 + resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} 403 535 404 536 convert-source-map@2.0.0: 405 537 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 407 539 csstype@3.1.3: 408 540 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 409 541 410 - debug@4.3.7: 411 - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 542 + debug@4.4.1: 543 + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 412 544 engines: {node: '>=6.0'} 413 545 peerDependencies: 414 546 supports-color: '*' ··· 416 548 supports-color: 417 549 optional: true 418 550 419 - electron-to-chromium@1.5.65: 420 - resolution: {integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==} 551 + electron-to-chromium@1.5.195: 552 + resolution: {integrity: sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==} 421 553 422 - entities@4.5.0: 423 - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 554 + entities@6.0.1: 555 + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 424 556 engines: {node: '>=0.12'} 425 557 426 - esbuild@0.24.0: 427 - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 558 + esbuild@0.25.8: 559 + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} 428 560 engines: {node: '>=18'} 429 561 hasBin: true 430 562 ··· 432 564 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 433 565 engines: {node: '>=6'} 434 566 567 + esm-env@1.2.2: 568 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 569 + 570 + fdir@6.4.6: 571 + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 572 + peerDependencies: 573 + picomatch: ^3 || ^4 574 + peerDependenciesMeta: 575 + picomatch: 576 + optional: true 577 + 435 578 fsevents@2.3.3: 436 579 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 437 580 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} ··· 441 584 resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 442 585 engines: {node: '>=6.9.0'} 443 586 444 - globals@11.12.0: 445 - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 446 - engines: {node: '>=4'} 447 - 448 587 html-entities@2.3.3: 449 588 resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} 450 589 ··· 455 594 js-tokens@4.0.0: 456 595 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 457 596 458 - jsesc@3.0.2: 459 - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} 597 + jsesc@3.1.0: 598 + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 460 599 engines: {node: '>=6'} 461 600 hasBin: true 462 601 ··· 475 614 ms@2.1.3: 476 615 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 477 616 478 - nanoid@3.3.8: 479 - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 617 + nanoid@3.3.11: 618 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 480 619 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 481 620 hasBin: true 482 621 483 - node-releases@2.0.18: 484 - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 622 + nanoid@5.1.5: 623 + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} 624 + engines: {node: ^18 || >=20} 625 + hasBin: true 485 626 486 - parse5@7.2.1: 487 - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 627 + node-releases@2.0.19: 628 + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 629 + 630 + parse5@7.3.0: 631 + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 488 632 489 633 picocolors@1.1.1: 490 634 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 491 635 492 - postcss@8.4.49: 493 - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 636 + picomatch@4.0.3: 637 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 638 + engines: {node: '>=12'} 639 + 640 + postcss@8.5.6: 641 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 494 642 engines: {node: ^10 || ^12 || >=14} 495 643 496 644 prettier@3.6.2: ··· 498 646 engines: {node: '>=14'} 499 647 hasBin: true 500 648 501 - rollup@4.27.4: 502 - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} 649 + rollup@4.46.2: 650 + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} 503 651 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 504 652 hasBin: true 505 653 ··· 507 655 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 508 656 hasBin: true 509 657 510 - seroval-plugins@1.1.1: 511 - resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==} 658 + seroval-plugins@1.3.2: 659 + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 512 660 engines: {node: '>=10'} 513 661 peerDependencies: 514 662 seroval: ^1.0 515 663 516 - seroval@1.1.1: 517 - resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==} 664 + seroval@1.3.2: 665 + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 518 666 engines: {node: '>=10'} 519 667 520 - solid-js@1.9.5: 521 - resolution: {integrity: sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==} 668 + solid-devtools@0.34.3: 669 + resolution: {integrity: sha512-ZQua959n+Zu3sLbm9g0IRjYUb1YYlYbu83PWLRoKbSsq0a3ItQNhnS2OBU7rQNmOKZiMexNo9Z3izas9BcOKDg==} 670 + peerDependencies: 671 + solid-js: ^1.9.0 672 + vite: ^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 673 + peerDependenciesMeta: 674 + vite: 675 + optional: true 676 + 677 + solid-js@1.9.7: 678 + resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 522 679 523 680 solid-refresh@0.6.3: 524 681 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 529 686 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 530 687 engines: {node: '>=0.10.0'} 531 688 532 - typescript@5.7.2: 533 - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 689 + tinyglobby@0.2.14: 690 + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 691 + engines: {node: '>=12.0.0'} 692 + 693 + typescript@5.9.2: 694 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 534 695 engines: {node: '>=14.17'} 535 696 hasBin: true 536 697 537 - update-browserslist-db@1.1.1: 538 - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 698 + undici-types@7.10.0: 699 + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 700 + 701 + update-browserslist-db@1.1.3: 702 + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 539 703 hasBin: true 540 704 peerDependencies: 541 705 browserslist: '>= 4.21.0' 542 706 543 - validate-html-nesting@1.2.2: 544 - resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} 707 + validate-html-nesting@1.2.3: 708 + resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 545 709 546 - vite-plugin-solid@2.11.6: 547 - resolution: {integrity: sha512-Sl5CTqJTGyEeOsmdH6BOgalIZlwH3t4/y0RQuFLMGnvWMBvxb4+lq7x3BSiAw6etf0QexfNJW7HSOO/Qf7pigg==} 710 + vite-plugin-solid@2.11.8: 711 + resolution: {integrity: sha512-hFrCxBfv3B1BmFqnJF4JOCYpjrmi/zwyeKjcomQ0khh8HFyQ8SbuBWQ7zGojfrz6HUOBFrJBNySDi/JgAHytWg==} 548 712 peerDependencies: 549 713 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 550 714 solid-js: ^1.7.2 551 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 715 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 552 716 peerDependenciesMeta: 553 717 '@testing-library/jest-dom': 554 718 optional: true 555 719 556 - vite@6.0.0: 557 - resolution: {integrity: sha512-Q2+5yQV79EdnpbNxjD3/QHVMCBaQ3Kpd4/uL51UGuh38bIIM+s4o3FqyCzRvTRwFb+cWIUeZvaWwS9y2LD2qeQ==} 720 + vite@6.3.5: 721 + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 558 722 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 559 723 hasBin: true 560 724 peerDependencies: ··· 593 757 yaml: 594 758 optional: true 595 759 596 - vitefu@1.0.4: 597 - resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} 760 + vitefu@1.1.1: 761 + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} 598 762 peerDependencies: 599 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 763 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 600 764 peerDependenciesMeta: 601 765 vite: 602 766 optional: true ··· 608 772 609 773 '@ampproject/remapping@2.3.0': 610 774 dependencies: 611 - '@jridgewell/gen-mapping': 0.3.5 612 - '@jridgewell/trace-mapping': 0.3.25 775 + '@jridgewell/gen-mapping': 0.3.12 776 + '@jridgewell/trace-mapping': 0.3.29 613 777 614 - '@babel/code-frame@7.26.2': 778 + '@atcute/client@4.0.3': 779 + dependencies: 780 + '@atcute/identity': 1.0.3 781 + '@atcute/lexicons': 1.1.0 782 + 783 + '@atcute/identity@1.0.3': 784 + dependencies: 785 + '@atcute/lexicons': 1.1.0 786 + '@badrap/valita': 0.4.6 787 + 788 + '@atcute/lexicons@1.1.0': 789 + dependencies: 790 + esm-env: 1.2.2 791 + 792 + '@atcute/multibase@1.1.4': 793 + dependencies: 794 + '@atcute/uint8array': 1.0.3 795 + 796 + '@atcute/oauth-browser-client@1.0.26': 615 797 dependencies: 616 - '@babel/helper-validator-identifier': 7.25.9 798 + '@atcute/client': 4.0.3 799 + '@atcute/identity': 1.0.3 800 + '@atcute/lexicons': 1.1.0 801 + '@atcute/multibase': 1.1.4 802 + '@atcute/uint8array': 1.0.3 803 + nanoid: 5.1.5 804 + 805 + '@atcute/uint8array@1.0.3': {} 806 + 807 + '@babel/code-frame@7.27.1': 808 + dependencies: 809 + '@babel/helper-validator-identifier': 7.27.1 617 810 js-tokens: 4.0.0 618 811 picocolors: 1.1.1 619 812 620 - '@babel/compat-data@7.26.2': {} 813 + '@babel/compat-data@7.28.0': {} 621 814 622 - '@babel/core@7.26.0': 815 + '@babel/core@7.28.0': 623 816 dependencies: 624 817 '@ampproject/remapping': 2.3.0 625 - '@babel/code-frame': 7.26.2 626 - '@babel/generator': 7.26.2 627 - '@babel/helper-compilation-targets': 7.25.9 628 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) 629 - '@babel/helpers': 7.26.0 630 - '@babel/parser': 7.26.2 631 - '@babel/template': 7.25.9 632 - '@babel/traverse': 7.25.9 633 - '@babel/types': 7.26.0 818 + '@babel/code-frame': 7.27.1 819 + '@babel/generator': 7.28.0 820 + '@babel/helper-compilation-targets': 7.27.2 821 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) 822 + '@babel/helpers': 7.28.2 823 + '@babel/parser': 7.28.0 824 + '@babel/template': 7.27.2 825 + '@babel/traverse': 7.28.0 826 + '@babel/types': 7.28.2 634 827 convert-source-map: 2.0.0 635 - debug: 4.3.7 828 + debug: 4.4.1 636 829 gensync: 1.0.0-beta.2 637 830 json5: 2.2.3 638 831 semver: 6.3.1 639 832 transitivePeerDependencies: 640 833 - supports-color 641 834 642 - '@babel/generator@7.26.2': 835 + '@babel/generator@7.28.0': 643 836 dependencies: 644 - '@babel/parser': 7.26.2 645 - '@babel/types': 7.26.0 646 - '@jridgewell/gen-mapping': 0.3.5 647 - '@jridgewell/trace-mapping': 0.3.25 648 - jsesc: 3.0.2 837 + '@babel/parser': 7.28.0 838 + '@babel/types': 7.28.2 839 + '@jridgewell/gen-mapping': 0.3.12 840 + '@jridgewell/trace-mapping': 0.3.29 841 + jsesc: 3.1.0 649 842 650 - '@babel/helper-compilation-targets@7.25.9': 843 + '@babel/helper-compilation-targets@7.27.2': 651 844 dependencies: 652 - '@babel/compat-data': 7.26.2 653 - '@babel/helper-validator-option': 7.25.9 654 - browserslist: 4.24.2 845 + '@babel/compat-data': 7.28.0 846 + '@babel/helper-validator-option': 7.27.1 847 + browserslist: 4.25.1 655 848 lru-cache: 5.1.1 656 849 semver: 6.3.1 657 850 851 + '@babel/helper-globals@7.28.0': {} 852 + 658 853 '@babel/helper-module-imports@7.18.6': 659 854 dependencies: 660 - '@babel/types': 7.26.0 855 + '@babel/types': 7.28.2 661 856 662 - '@babel/helper-module-imports@7.25.9': 857 + '@babel/helper-module-imports@7.27.1': 663 858 dependencies: 664 - '@babel/traverse': 7.25.9 665 - '@babel/types': 7.26.0 859 + '@babel/traverse': 7.28.0 860 + '@babel/types': 7.28.2 666 861 transitivePeerDependencies: 667 862 - supports-color 668 863 669 - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': 864 + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': 670 865 dependencies: 671 - '@babel/core': 7.26.0 672 - '@babel/helper-module-imports': 7.25.9 673 - '@babel/helper-validator-identifier': 7.25.9 674 - '@babel/traverse': 7.25.9 866 + '@babel/core': 7.28.0 867 + '@babel/helper-module-imports': 7.27.1 868 + '@babel/helper-validator-identifier': 7.27.1 869 + '@babel/traverse': 7.28.0 675 870 transitivePeerDependencies: 676 871 - supports-color 677 872 678 - '@babel/helper-plugin-utils@7.25.9': {} 873 + '@babel/helper-plugin-utils@7.27.1': {} 679 874 680 - '@babel/helper-string-parser@7.25.9': {} 875 + '@babel/helper-string-parser@7.27.1': {} 681 876 682 - '@babel/helper-validator-identifier@7.25.9': {} 877 + '@babel/helper-validator-identifier@7.27.1': {} 878 + 879 + '@babel/helper-validator-option@7.27.1': {} 683 880 684 - '@babel/helper-validator-option@7.25.9': {} 881 + '@babel/helpers@7.28.2': 882 + dependencies: 883 + '@babel/template': 7.27.2 884 + '@babel/types': 7.28.2 685 885 686 - '@babel/helpers@7.26.0': 886 + '@babel/parser@7.28.0': 687 887 dependencies: 688 - '@babel/template': 7.25.9 689 - '@babel/types': 7.26.0 888 + '@babel/types': 7.28.2 690 889 691 - '@babel/parser@7.26.2': 890 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': 692 891 dependencies: 693 - '@babel/types': 7.26.0 892 + '@babel/core': 7.28.0 893 + '@babel/helper-plugin-utils': 7.27.1 694 894 695 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': 895 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': 696 896 dependencies: 697 - '@babel/core': 7.26.0 698 - '@babel/helper-plugin-utils': 7.25.9 897 + '@babel/core': 7.28.0 898 + '@babel/helper-plugin-utils': 7.27.1 699 899 700 - '@babel/template@7.25.9': 900 + '@babel/template@7.27.2': 701 901 dependencies: 702 - '@babel/code-frame': 7.26.2 703 - '@babel/parser': 7.26.2 704 - '@babel/types': 7.26.0 902 + '@babel/code-frame': 7.27.1 903 + '@babel/parser': 7.28.0 904 + '@babel/types': 7.28.2 705 905 706 - '@babel/traverse@7.25.9': 906 + '@babel/traverse@7.28.0': 707 907 dependencies: 708 - '@babel/code-frame': 7.26.2 709 - '@babel/generator': 7.26.2 710 - '@babel/parser': 7.26.2 711 - '@babel/template': 7.25.9 712 - '@babel/types': 7.26.0 713 - debug: 4.3.7 714 - globals: 11.12.0 908 + '@babel/code-frame': 7.27.1 909 + '@babel/generator': 7.28.0 910 + '@babel/helper-globals': 7.28.0 911 + '@babel/parser': 7.28.0 912 + '@babel/template': 7.27.2 913 + '@babel/types': 7.28.2 914 + debug: 4.4.1 715 915 transitivePeerDependencies: 716 916 - supports-color 717 917 718 - '@babel/types@7.26.0': 918 + '@babel/types@7.28.2': 719 919 dependencies: 720 - '@babel/helper-string-parser': 7.25.9 721 - '@babel/helper-validator-identifier': 7.25.9 920 + '@babel/helper-string-parser': 7.27.1 921 + '@babel/helper-validator-identifier': 7.27.1 922 + 923 + '@badrap/valita@0.4.6': {} 924 + 925 + '@esbuild/aix-ppc64@0.25.8': 926 + optional: true 927 + 928 + '@esbuild/android-arm64@0.25.8': 929 + optional: true 722 930 723 - '@esbuild/aix-ppc64@0.24.0': 931 + '@esbuild/android-arm@0.25.8': 724 932 optional: true 725 933 726 - '@esbuild/android-arm64@0.24.0': 934 + '@esbuild/android-x64@0.25.8': 727 935 optional: true 728 936 729 - '@esbuild/android-arm@0.24.0': 937 + '@esbuild/darwin-arm64@0.25.8': 730 938 optional: true 731 939 732 - '@esbuild/android-x64@0.24.0': 940 + '@esbuild/darwin-x64@0.25.8': 733 941 optional: true 734 942 735 - '@esbuild/darwin-arm64@0.24.0': 943 + '@esbuild/freebsd-arm64@0.25.8': 736 944 optional: true 737 945 738 - '@esbuild/darwin-x64@0.24.0': 946 + '@esbuild/freebsd-x64@0.25.8': 739 947 optional: true 740 948 741 - '@esbuild/freebsd-arm64@0.24.0': 949 + '@esbuild/linux-arm64@0.25.8': 742 950 optional: true 743 951 744 - '@esbuild/freebsd-x64@0.24.0': 952 + '@esbuild/linux-arm@0.25.8': 745 953 optional: true 746 954 747 - '@esbuild/linux-arm64@0.24.0': 955 + '@esbuild/linux-ia32@0.25.8': 748 956 optional: true 749 957 750 - '@esbuild/linux-arm@0.24.0': 958 + '@esbuild/linux-loong64@0.25.8': 751 959 optional: true 752 960 753 - '@esbuild/linux-ia32@0.24.0': 961 + '@esbuild/linux-mips64el@0.25.8': 754 962 optional: true 755 963 756 - '@esbuild/linux-loong64@0.24.0': 964 + '@esbuild/linux-ppc64@0.25.8': 757 965 optional: true 758 966 759 - '@esbuild/linux-mips64el@0.24.0': 967 + '@esbuild/linux-riscv64@0.25.8': 760 968 optional: true 761 969 762 - '@esbuild/linux-ppc64@0.24.0': 970 + '@esbuild/linux-s390x@0.25.8': 763 971 optional: true 764 972 765 - '@esbuild/linux-riscv64@0.24.0': 973 + '@esbuild/linux-x64@0.25.8': 766 974 optional: true 767 975 768 - '@esbuild/linux-s390x@0.24.0': 976 + '@esbuild/netbsd-arm64@0.25.8': 769 977 optional: true 770 978 771 - '@esbuild/linux-x64@0.24.0': 979 + '@esbuild/netbsd-x64@0.25.8': 772 980 optional: true 773 981 774 - '@esbuild/netbsd-x64@0.24.0': 982 + '@esbuild/openbsd-arm64@0.25.8': 775 983 optional: true 776 984 777 - '@esbuild/openbsd-arm64@0.24.0': 985 + '@esbuild/openbsd-x64@0.25.8': 778 986 optional: true 779 987 780 - '@esbuild/openbsd-x64@0.24.0': 988 + '@esbuild/openharmony-arm64@0.25.8': 781 989 optional: true 782 990 783 - '@esbuild/sunos-x64@0.24.0': 991 + '@esbuild/sunos-x64@0.25.8': 784 992 optional: true 785 993 786 - '@esbuild/win32-arm64@0.24.0': 994 + '@esbuild/win32-arm64@0.25.8': 787 995 optional: true 788 996 789 - '@esbuild/win32-ia32@0.24.0': 997 + '@esbuild/win32-ia32@0.25.8': 790 998 optional: true 791 999 792 - '@esbuild/win32-x64@0.24.0': 1000 + '@esbuild/win32-x64@0.25.8': 793 1001 optional: true 794 1002 795 - '@jridgewell/gen-mapping@0.3.5': 1003 + '@jridgewell/gen-mapping@0.3.12': 796 1004 dependencies: 797 - '@jridgewell/set-array': 1.2.1 798 - '@jridgewell/sourcemap-codec': 1.5.0 799 - '@jridgewell/trace-mapping': 0.3.25 1005 + '@jridgewell/sourcemap-codec': 1.5.4 1006 + '@jridgewell/trace-mapping': 0.3.29 800 1007 801 1008 '@jridgewell/resolve-uri@3.1.2': {} 802 1009 803 - '@jridgewell/set-array@1.2.1': {} 804 - 805 - '@jridgewell/sourcemap-codec@1.5.0': {} 1010 + '@jridgewell/sourcemap-codec@1.5.4': {} 806 1011 807 - '@jridgewell/trace-mapping@0.3.25': 1012 + '@jridgewell/trace-mapping@0.3.29': 808 1013 dependencies: 809 1014 '@jridgewell/resolve-uri': 3.1.2 810 - '@jridgewell/sourcemap-codec': 1.5.0 1015 + '@jridgewell/sourcemap-codec': 1.5.4 1016 + 1017 + '@nothing-but/utils@0.17.0': {} 811 1018 812 - '@rollup/rollup-android-arm-eabi@4.27.4': 1019 + '@rollup/rollup-android-arm-eabi@4.46.2': 813 1020 optional: true 814 1021 815 - '@rollup/rollup-android-arm64@4.27.4': 1022 + '@rollup/rollup-android-arm64@4.46.2': 816 1023 optional: true 817 1024 818 - '@rollup/rollup-darwin-arm64@4.27.4': 1025 + '@rollup/rollup-darwin-arm64@4.46.2': 819 1026 optional: true 820 1027 821 - '@rollup/rollup-darwin-x64@4.27.4': 1028 + '@rollup/rollup-darwin-x64@4.46.2': 822 1029 optional: true 823 1030 824 - '@rollup/rollup-freebsd-arm64@4.27.4': 1031 + '@rollup/rollup-freebsd-arm64@4.46.2': 825 1032 optional: true 826 1033 827 - '@rollup/rollup-freebsd-x64@4.27.4': 1034 + '@rollup/rollup-freebsd-x64@4.46.2': 828 1035 optional: true 829 1036 830 - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': 1037 + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 831 1038 optional: true 832 1039 833 - '@rollup/rollup-linux-arm-musleabihf@4.27.4': 1040 + '@rollup/rollup-linux-arm-musleabihf@4.46.2': 834 1041 optional: true 835 1042 836 - '@rollup/rollup-linux-arm64-gnu@4.27.4': 1043 + '@rollup/rollup-linux-arm64-gnu@4.46.2': 837 1044 optional: true 838 1045 839 - '@rollup/rollup-linux-arm64-musl@4.27.4': 1046 + '@rollup/rollup-linux-arm64-musl@4.46.2': 840 1047 optional: true 841 1048 842 - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': 1049 + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 843 1050 optional: true 844 1051 845 - '@rollup/rollup-linux-riscv64-gnu@4.27.4': 1052 + '@rollup/rollup-linux-ppc64-gnu@4.46.2': 846 1053 optional: true 847 1054 848 - '@rollup/rollup-linux-s390x-gnu@4.27.4': 1055 + '@rollup/rollup-linux-riscv64-gnu@4.46.2': 849 1056 optional: true 850 1057 851 - '@rollup/rollup-linux-x64-gnu@4.27.4': 1058 + '@rollup/rollup-linux-riscv64-musl@4.46.2': 852 1059 optional: true 853 1060 854 - '@rollup/rollup-linux-x64-musl@4.27.4': 1061 + '@rollup/rollup-linux-s390x-gnu@4.46.2': 855 1062 optional: true 856 1063 857 - '@rollup/rollup-win32-arm64-msvc@4.27.4': 1064 + '@rollup/rollup-linux-x64-gnu@4.46.2': 858 1065 optional: true 859 1066 860 - '@rollup/rollup-win32-ia32-msvc@4.27.4': 1067 + '@rollup/rollup-linux-x64-musl@4.46.2': 1068 + optional: true 1069 + 1070 + '@rollup/rollup-win32-arm64-msvc@4.46.2': 1071 + optional: true 1072 + 1073 + '@rollup/rollup-win32-ia32-msvc@4.46.2': 861 1074 optional: true 862 1075 863 - '@rollup/rollup-win32-x64-msvc@4.27.4': 1076 + '@rollup/rollup-win32-x64-msvc@4.46.2': 864 1077 optional: true 865 1078 866 - '@solidjs/router@0.15.3(solid-js@1.9.5)': 1079 + '@solid-devtools/debugger@0.28.1(solid-js@1.9.7)': 1080 + dependencies: 1081 + '@nothing-but/utils': 0.17.0 1082 + '@solid-devtools/shared': 0.20.0(solid-js@1.9.7) 1083 + '@solid-primitives/bounds': 0.1.3(solid-js@1.9.7) 1084 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) 1085 + '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.7) 1086 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) 1087 + '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.7) 1088 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.7) 1089 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1090 + solid-js: 1.9.7 1091 + 1092 + '@solid-devtools/shared@0.20.0(solid-js@1.9.7)': 1093 + dependencies: 1094 + '@nothing-but/utils': 0.17.0 1095 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) 1096 + '@solid-primitives/media': 2.3.3(solid-js@1.9.7) 1097 + '@solid-primitives/refs': 1.1.2(solid-js@1.9.7) 1098 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) 1099 + '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.7) 1100 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.7) 1101 + '@solid-primitives/styles': 0.1.2(solid-js@1.9.7) 1102 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1103 + solid-js: 1.9.7 1104 + 1105 + '@solid-primitives/bounds@0.1.3(solid-js@1.9.7)': 1106 + dependencies: 1107 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) 1108 + '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.7) 1109 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.7) 1110 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1111 + solid-js: 1.9.7 1112 + 1113 + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.7)': 1114 + dependencies: 1115 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1116 + solid-js: 1.9.7 1117 + 1118 + '@solid-primitives/keyboard@1.3.3(solid-js@1.9.7)': 1119 + dependencies: 1120 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) 1121 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) 1122 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1123 + solid-js: 1.9.7 1124 + 1125 + '@solid-primitives/media@2.3.3(solid-js@1.9.7)': 1126 + dependencies: 1127 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) 1128 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) 1129 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.7) 1130 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1131 + solid-js: 1.9.7 1132 + 1133 + '@solid-primitives/refs@1.1.2(solid-js@1.9.7)': 1134 + dependencies: 1135 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1136 + solid-js: 1.9.7 1137 + 1138 + '@solid-primitives/resize-observer@2.1.3(solid-js@1.9.7)': 1139 + dependencies: 1140 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) 1141 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) 1142 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.7) 1143 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1144 + solid-js: 1.9.7 1145 + 1146 + '@solid-primitives/rootless@1.5.2(solid-js@1.9.7)': 1147 + dependencies: 1148 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1149 + solid-js: 1.9.7 1150 + 1151 + '@solid-primitives/scheduled@1.5.2(solid-js@1.9.7)': 1152 + dependencies: 1153 + solid-js: 1.9.7 1154 + 1155 + '@solid-primitives/static-store@0.1.2(solid-js@1.9.7)': 1156 + dependencies: 1157 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1158 + solid-js: 1.9.7 1159 + 1160 + '@solid-primitives/styles@0.1.2(solid-js@1.9.7)': 867 1161 dependencies: 868 - solid-js: 1.9.5 1162 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) 1163 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) 1164 + solid-js: 1.9.7 1165 + 1166 + '@solid-primitives/utils@6.3.2(solid-js@1.9.7)': 1167 + dependencies: 1168 + solid-js: 1.9.7 1169 + 1170 + '@solidjs/router@0.15.3(solid-js@1.9.7)': 1171 + dependencies: 1172 + solid-js: 1.9.7 869 1173 870 1174 '@types/babel__core@7.20.5': 871 1175 dependencies: 872 - '@babel/parser': 7.26.2 873 - '@babel/types': 7.26.0 874 - '@types/babel__generator': 7.6.8 1176 + '@babel/parser': 7.28.0 1177 + '@babel/types': 7.28.2 1178 + '@types/babel__generator': 7.27.0 875 1179 '@types/babel__template': 7.4.4 876 - '@types/babel__traverse': 7.20.6 1180 + '@types/babel__traverse': 7.28.0 877 1181 878 - '@types/babel__generator@7.6.8': 1182 + '@types/babel__generator@7.27.0': 879 1183 dependencies: 880 - '@babel/types': 7.26.0 1184 + '@babel/types': 7.28.2 881 1185 882 1186 '@types/babel__template@7.4.4': 883 1187 dependencies: 884 - '@babel/parser': 7.26.2 885 - '@babel/types': 7.26.0 1188 + '@babel/parser': 7.28.0 1189 + '@babel/types': 7.28.2 886 1190 887 - '@types/babel__traverse@7.20.6': 1191 + '@types/babel__traverse@7.28.0': 888 1192 dependencies: 889 - '@babel/types': 7.26.0 1193 + '@babel/types': 7.28.2 1194 + 1195 + '@types/estree@1.0.8': {} 890 1196 891 - '@types/estree@1.0.6': {} 1197 + '@types/node@24.2.0': 1198 + dependencies: 1199 + undici-types: 7.10.0 892 1200 893 - babel-plugin-jsx-dom-expressions@0.39.3(@babel/core@7.26.0): 1201 + babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.28.0): 894 1202 dependencies: 895 - '@babel/core': 7.26.0 1203 + '@babel/core': 7.28.0 896 1204 '@babel/helper-module-imports': 7.18.6 897 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) 898 - '@babel/types': 7.26.0 1205 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) 1206 + '@babel/types': 7.28.2 899 1207 html-entities: 2.3.3 900 - parse5: 7.2.1 901 - validate-html-nesting: 1.2.2 1208 + parse5: 7.3.0 1209 + validate-html-nesting: 1.2.3 902 1210 903 - babel-preset-solid@1.9.3(@babel/core@7.26.0): 1211 + babel-preset-solid@1.9.6(@babel/core@7.28.0): 904 1212 dependencies: 905 - '@babel/core': 7.26.0 906 - babel-plugin-jsx-dom-expressions: 0.39.3(@babel/core@7.26.0) 1213 + '@babel/core': 7.28.0 1214 + babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.28.0) 907 1215 908 - browserslist@4.24.2: 1216 + browserslist@4.25.1: 909 1217 dependencies: 910 - caniuse-lite: 1.0.30001684 911 - electron-to-chromium: 1.5.65 912 - node-releases: 2.0.18 913 - update-browserslist-db: 1.1.1(browserslist@4.24.2) 1218 + caniuse-lite: 1.0.30001731 1219 + electron-to-chromium: 1.5.195 1220 + node-releases: 2.0.19 1221 + update-browserslist-db: 1.1.3(browserslist@4.25.1) 914 1222 915 - caniuse-lite@1.0.30001684: {} 1223 + caniuse-lite@1.0.30001731: {} 916 1224 917 1225 convert-source-map@2.0.0: {} 918 1226 919 1227 csstype@3.1.3: {} 920 1228 921 - debug@4.3.7: 1229 + debug@4.4.1: 922 1230 dependencies: 923 1231 ms: 2.1.3 924 1232 925 - electron-to-chromium@1.5.65: {} 1233 + electron-to-chromium@1.5.195: {} 926 1234 927 - entities@4.5.0: {} 1235 + entities@6.0.1: {} 928 1236 929 - esbuild@0.24.0: 1237 + esbuild@0.25.8: 930 1238 optionalDependencies: 931 - '@esbuild/aix-ppc64': 0.24.0 932 - '@esbuild/android-arm': 0.24.0 933 - '@esbuild/android-arm64': 0.24.0 934 - '@esbuild/android-x64': 0.24.0 935 - '@esbuild/darwin-arm64': 0.24.0 936 - '@esbuild/darwin-x64': 0.24.0 937 - '@esbuild/freebsd-arm64': 0.24.0 938 - '@esbuild/freebsd-x64': 0.24.0 939 - '@esbuild/linux-arm': 0.24.0 940 - '@esbuild/linux-arm64': 0.24.0 941 - '@esbuild/linux-ia32': 0.24.0 942 - '@esbuild/linux-loong64': 0.24.0 943 - '@esbuild/linux-mips64el': 0.24.0 944 - '@esbuild/linux-ppc64': 0.24.0 945 - '@esbuild/linux-riscv64': 0.24.0 946 - '@esbuild/linux-s390x': 0.24.0 947 - '@esbuild/linux-x64': 0.24.0 948 - '@esbuild/netbsd-x64': 0.24.0 949 - '@esbuild/openbsd-arm64': 0.24.0 950 - '@esbuild/openbsd-x64': 0.24.0 951 - '@esbuild/sunos-x64': 0.24.0 952 - '@esbuild/win32-arm64': 0.24.0 953 - '@esbuild/win32-ia32': 0.24.0 954 - '@esbuild/win32-x64': 0.24.0 1239 + '@esbuild/aix-ppc64': 0.25.8 1240 + '@esbuild/android-arm': 0.25.8 1241 + '@esbuild/android-arm64': 0.25.8 1242 + '@esbuild/android-x64': 0.25.8 1243 + '@esbuild/darwin-arm64': 0.25.8 1244 + '@esbuild/darwin-x64': 0.25.8 1245 + '@esbuild/freebsd-arm64': 0.25.8 1246 + '@esbuild/freebsd-x64': 0.25.8 1247 + '@esbuild/linux-arm': 0.25.8 1248 + '@esbuild/linux-arm64': 0.25.8 1249 + '@esbuild/linux-ia32': 0.25.8 1250 + '@esbuild/linux-loong64': 0.25.8 1251 + '@esbuild/linux-mips64el': 0.25.8 1252 + '@esbuild/linux-ppc64': 0.25.8 1253 + '@esbuild/linux-riscv64': 0.25.8 1254 + '@esbuild/linux-s390x': 0.25.8 1255 + '@esbuild/linux-x64': 0.25.8 1256 + '@esbuild/netbsd-arm64': 0.25.8 1257 + '@esbuild/netbsd-x64': 0.25.8 1258 + '@esbuild/openbsd-arm64': 0.25.8 1259 + '@esbuild/openbsd-x64': 0.25.8 1260 + '@esbuild/openharmony-arm64': 0.25.8 1261 + '@esbuild/sunos-x64': 0.25.8 1262 + '@esbuild/win32-arm64': 0.25.8 1263 + '@esbuild/win32-ia32': 0.25.8 1264 + '@esbuild/win32-x64': 0.25.8 955 1265 956 1266 escalade@3.2.0: {} 957 1267 1268 + esm-env@1.2.2: {} 1269 + 1270 + fdir@6.4.6(picomatch@4.0.3): 1271 + optionalDependencies: 1272 + picomatch: 4.0.3 1273 + 958 1274 fsevents@2.3.3: 959 1275 optional: true 960 1276 961 1277 gensync@1.0.0-beta.2: {} 962 - 963 - globals@11.12.0: {} 964 1278 965 1279 html-entities@2.3.3: {} 966 1280 ··· 968 1282 969 1283 js-tokens@4.0.0: {} 970 1284 971 - jsesc@3.0.2: {} 1285 + jsesc@3.1.0: {} 972 1286 973 1287 json5@2.2.3: {} 974 1288 ··· 982 1296 983 1297 ms@2.1.3: {} 984 1298 985 - nanoid@3.3.8: {} 1299 + nanoid@3.3.11: {} 1300 + 1301 + nanoid@5.1.5: {} 986 1302 987 - node-releases@2.0.18: {} 1303 + node-releases@2.0.19: {} 988 1304 989 - parse5@7.2.1: 1305 + parse5@7.3.0: 990 1306 dependencies: 991 - entities: 4.5.0 1307 + entities: 6.0.1 992 1308 993 1309 picocolors@1.1.1: {} 994 1310 995 - postcss@8.4.49: 1311 + picomatch@4.0.3: {} 1312 + 1313 + postcss@8.5.6: 996 1314 dependencies: 997 - nanoid: 3.3.8 1315 + nanoid: 3.3.11 998 1316 picocolors: 1.1.1 999 1317 source-map-js: 1.2.1 1000 1318 1001 1319 prettier@3.6.2: {} 1002 1320 1003 - rollup@4.27.4: 1321 + rollup@4.46.2: 1004 1322 dependencies: 1005 - '@types/estree': 1.0.6 1323 + '@types/estree': 1.0.8 1006 1324 optionalDependencies: 1007 - '@rollup/rollup-android-arm-eabi': 4.27.4 1008 - '@rollup/rollup-android-arm64': 4.27.4 1009 - '@rollup/rollup-darwin-arm64': 4.27.4 1010 - '@rollup/rollup-darwin-x64': 4.27.4 1011 - '@rollup/rollup-freebsd-arm64': 4.27.4 1012 - '@rollup/rollup-freebsd-x64': 4.27.4 1013 - '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 1014 - '@rollup/rollup-linux-arm-musleabihf': 4.27.4 1015 - '@rollup/rollup-linux-arm64-gnu': 4.27.4 1016 - '@rollup/rollup-linux-arm64-musl': 4.27.4 1017 - '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 1018 - '@rollup/rollup-linux-riscv64-gnu': 4.27.4 1019 - '@rollup/rollup-linux-s390x-gnu': 4.27.4 1020 - '@rollup/rollup-linux-x64-gnu': 4.27.4 1021 - '@rollup/rollup-linux-x64-musl': 4.27.4 1022 - '@rollup/rollup-win32-arm64-msvc': 4.27.4 1023 - '@rollup/rollup-win32-ia32-msvc': 4.27.4 1024 - '@rollup/rollup-win32-x64-msvc': 4.27.4 1325 + '@rollup/rollup-android-arm-eabi': 4.46.2 1326 + '@rollup/rollup-android-arm64': 4.46.2 1327 + '@rollup/rollup-darwin-arm64': 4.46.2 1328 + '@rollup/rollup-darwin-x64': 4.46.2 1329 + '@rollup/rollup-freebsd-arm64': 4.46.2 1330 + '@rollup/rollup-freebsd-x64': 4.46.2 1331 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 1332 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 1333 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 1334 + '@rollup/rollup-linux-arm64-musl': 4.46.2 1335 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 1336 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 1337 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 1338 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 1339 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 1340 + '@rollup/rollup-linux-x64-gnu': 4.46.2 1341 + '@rollup/rollup-linux-x64-musl': 4.46.2 1342 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 1343 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 1344 + '@rollup/rollup-win32-x64-msvc': 4.46.2 1025 1345 fsevents: 2.3.3 1026 1346 1027 1347 semver@6.3.1: {} 1028 1348 1029 - seroval-plugins@1.1.1(seroval@1.1.1): 1349 + seroval-plugins@1.3.2(seroval@1.3.2): 1030 1350 dependencies: 1031 - seroval: 1.1.1 1351 + seroval: 1.3.2 1032 1352 1033 - seroval@1.1.1: {} 1353 + seroval@1.3.2: {} 1034 1354 1035 - solid-js@1.9.5: 1355 + solid-devtools@0.34.3(solid-js@1.9.7)(vite@6.3.5(@types/node@24.2.0)): 1356 + dependencies: 1357 + '@babel/core': 7.28.0 1358 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) 1359 + '@babel/types': 7.28.2 1360 + '@solid-devtools/debugger': 0.28.1(solid-js@1.9.7) 1361 + '@solid-devtools/shared': 0.20.0(solid-js@1.9.7) 1362 + solid-js: 1.9.7 1363 + optionalDependencies: 1364 + vite: 6.3.5(@types/node@24.2.0) 1365 + transitivePeerDependencies: 1366 + - supports-color 1367 + 1368 + solid-js@1.9.7: 1036 1369 dependencies: 1037 1370 csstype: 3.1.3 1038 - seroval: 1.1.1 1039 - seroval-plugins: 1.1.1(seroval@1.1.1) 1371 + seroval: 1.3.2 1372 + seroval-plugins: 1.3.2(seroval@1.3.2) 1040 1373 1041 - solid-refresh@0.6.3(solid-js@1.9.5): 1374 + solid-refresh@0.6.3(solid-js@1.9.7): 1042 1375 dependencies: 1043 - '@babel/generator': 7.26.2 1044 - '@babel/helper-module-imports': 7.25.9 1045 - '@babel/types': 7.26.0 1046 - solid-js: 1.9.5 1376 + '@babel/generator': 7.28.0 1377 + '@babel/helper-module-imports': 7.27.1 1378 + '@babel/types': 7.28.2 1379 + solid-js: 1.9.7 1047 1380 transitivePeerDependencies: 1048 1381 - supports-color 1049 1382 1050 1383 source-map-js@1.2.1: {} 1051 1384 1052 - typescript@5.7.2: {} 1385 + tinyglobby@0.2.14: 1386 + dependencies: 1387 + fdir: 6.4.6(picomatch@4.0.3) 1388 + picomatch: 4.0.3 1053 1389 1054 - update-browserslist-db@1.1.1(browserslist@4.24.2): 1390 + typescript@5.9.2: {} 1391 + 1392 + undici-types@7.10.0: {} 1393 + 1394 + update-browserslist-db@1.1.3(browserslist@4.25.1): 1055 1395 dependencies: 1056 - browserslist: 4.24.2 1396 + browserslist: 4.25.1 1057 1397 escalade: 3.2.0 1058 1398 picocolors: 1.1.1 1059 1399 1060 - validate-html-nesting@1.2.2: {} 1400 + validate-html-nesting@1.2.3: {} 1061 1401 1062 - vite-plugin-solid@2.11.6(solid-js@1.9.5)(vite@6.0.0): 1402 + vite-plugin-solid@2.11.8(solid-js@1.9.7)(vite@6.3.5(@types/node@24.2.0)): 1063 1403 dependencies: 1064 - '@babel/core': 7.26.0 1404 + '@babel/core': 7.28.0 1065 1405 '@types/babel__core': 7.20.5 1066 - babel-preset-solid: 1.9.3(@babel/core@7.26.0) 1406 + babel-preset-solid: 1.9.6(@babel/core@7.28.0) 1067 1407 merge-anything: 5.1.7 1068 - solid-js: 1.9.5 1069 - solid-refresh: 0.6.3(solid-js@1.9.5) 1070 - vite: 6.0.0 1071 - vitefu: 1.0.4(vite@6.0.0) 1408 + solid-js: 1.9.7 1409 + solid-refresh: 0.6.3(solid-js@1.9.7) 1410 + vite: 6.3.5(@types/node@24.2.0) 1411 + vitefu: 1.1.1(vite@6.3.5(@types/node@24.2.0)) 1072 1412 transitivePeerDependencies: 1073 1413 - supports-color 1074 1414 1075 - vite@6.0.0: 1415 + vite@6.3.5(@types/node@24.2.0): 1076 1416 dependencies: 1077 - esbuild: 0.24.0 1078 - postcss: 8.4.49 1079 - rollup: 4.27.4 1417 + esbuild: 0.25.8 1418 + fdir: 6.4.6(picomatch@4.0.3) 1419 + picomatch: 4.0.3 1420 + postcss: 8.5.6 1421 + rollup: 4.46.2 1422 + tinyglobby: 0.2.14 1080 1423 optionalDependencies: 1424 + '@types/node': 24.2.0 1081 1425 fsevents: 2.3.3 1082 1426 1083 - vitefu@1.0.4(vite@6.0.0): 1427 + vitefu@1.1.1(vite@6.3.5(@types/node@24.2.0)): 1084 1428 optionalDependencies: 1085 - vite: 6.0.0 1429 + vite: 6.3.5(@types/node@24.2.0) 1086 1430 1087 1431 yallist@3.1.1: {}
+12
frontend/public/oauth/client-metadata.json
··· 1 + { 2 + "client_id": "https://clippr.social/oauth/client-metadata.json", 3 + "client_name": "Clippr", 4 + "client_uri": "https://clippr.social", 5 + "redirect_uris": ["https://clippr.social/"], 6 + "scope": "atproto transition:generic", 7 + "grant_types": ["authorization_code", "refresh_token"], 8 + "response_types": ["code"], 9 + "token_endpoint_auth_method": "none", 10 + "application_type": "web", 11 + "dpop_bound_access_tokens": true 12 + }
+10 -3
frontend/src/components/header.tsx
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 + import { killSession, loginState } from "./loginForm.tsx"; 8 + 7 9 const Header = () => { 8 10 return ( 9 11 <header> 10 12 <div id="header-left"> 11 - <p>clippr (beta)</p> 13 + <a href={loginState() ? "/home" : "/"}> 14 + <p class="silent-link">clippr (beta)</p> 15 + </a> 12 16 </div> 13 17 <div id="header-right"> 14 18 <nav> 15 - <a href="/">home</a> 16 - <a href="/login">login</a> 19 + {loginState() ? ( 20 + <a onclick={killSession}>logout</a> 21 + ) : ( 22 + <a href="/login">login</a> 23 + )} 17 24 </nav> 18 25 </div> 19 26 </header>
+142
frontend/src/components/loginForm.tsx
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { 8 + configureOAuth, 9 + createAuthorizationUrl, 10 + deleteStoredSession, 11 + finalizeAuthorization, 12 + getSession, 13 + OAuthUserAgent, 14 + resolveFromIdentity, 15 + resolveFromService, 16 + Session, 17 + } from "@atcute/oauth-browser-client"; 18 + import { createSignal } from "solid-js"; 19 + import { Did, isHandle } from "@atcute/lexicons/syntax"; 20 + 21 + configureOAuth({ 22 + metadata: { 23 + client_id: import.meta.env.VITE_OAUTH_CLIENT_ID, 24 + redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URI, 25 + }, 26 + }); 27 + 28 + export const [loginState, setLoginState] = createSignal(false); 29 + let agent: OAuthUserAgent; 30 + 31 + const LoginForm = () => { 32 + const [notice, setNotice] = createSignal(""); 33 + const [loginInput, setLoginInput] = createSignal(""); 34 + 35 + const login = async (handle: string) => { 36 + try { 37 + if (!handle) return; 38 + let resolved; 39 + document.getElementById("submitDetails")!.removeAttribute("hidden"); 40 + document 41 + .querySelector('button[type="submit"]')! 42 + .setAttribute("disabled", "true"); 43 + if (!isHandle(handle)) { 44 + setNotice(`Resolving your service...`); 45 + resolved = await resolveFromService(handle); 46 + } else { 47 + setNotice(`Resolving your identity...`); 48 + resolved = await resolveFromIdentity(handle); 49 + } 50 + 51 + setNotice(`Contacting your data server...`); 52 + const authUrl = await createAuthorizationUrl({ 53 + scope: import.meta.env.VITE_OAUTH_SCOPE, 54 + ...resolved, 55 + }); 56 + 57 + setNotice(`Redirecting...`); 58 + await new Promise((resolve) => setTimeout(resolve, 500)); 59 + 60 + location.assign(authUrl); 61 + } catch (e: unknown) { 62 + if (e instanceof Error) { 63 + console.error(e); 64 + setNotice(`${e.message}`); 65 + } else { 66 + console.error(e); 67 + setNotice(`Unknown error, check console ¯\\_(ツ)_/¯`); 68 + } 69 + } 70 + }; 71 + 72 + return ( 73 + <> 74 + <form onclick={(e) => e.preventDefault()}> 75 + <label for="handle">Bluesky handle or DID</label> 76 + <input 77 + type="text" 78 + name="handle" 79 + id="handle" 80 + placeholder="alice.bsky.social" 81 + onInput={(e) => setLoginInput(e.currentTarget.value)} 82 + /> 83 + <button type="submit" onclick={() => login(loginInput())}> 84 + log in 85 + </button> 86 + </form> 87 + <p id="submitDetails" hidden> 88 + {notice()} 89 + </p> 90 + </> 91 + ); 92 + }; 93 + 94 + const retrieveSession = async (): Promise<void> => { 95 + const init = async (): Promise<Session | undefined> => { 96 + const params = new URLSearchParams(location.hash.slice(1)); 97 + console.log("Params", params); 98 + 99 + if (params.has("state") && (params.has("code") || params.has("error"))) { 100 + history.replaceState(null, "", location.pathname + location.search); 101 + 102 + const session = await finalizeAuthorization(params); 103 + console.log("Authorization finalization", session); 104 + const agent = new OAuthUserAgent(session); 105 + console.log(await agent.getSession()); 106 + const did = session.info.sub; 107 + 108 + localStorage.setItem("currentUser", did); 109 + return session; 110 + } else { 111 + const currentUser = localStorage.getItem("currentUser"); 112 + 113 + if (currentUser) { 114 + try { 115 + console.log("Retrieving session"); 116 + return await getSession(currentUser as Did); 117 + } catch (err) { 118 + deleteStoredSession(currentUser as Did); 119 + localStorage.removeItem("currentUser"); 120 + throw err; 121 + } 122 + } 123 + } 124 + }; 125 + 126 + const session = await init().catch(() => {}); 127 + 128 + if (session) { 129 + console.log("Retrieved session", session); 130 + agent = new OAuthUserAgent(session); 131 + setLoginState(true); 132 + } 133 + }; 134 + 135 + const killSession = async (): Promise<void> => { 136 + await agent.signOut(); 137 + setLoginState(false); 138 + localStorage.removeItem("currentUser"); 139 + location.href = "/"; 140 + }; 141 + 142 + export { LoginForm, retrieveSession, agent, killSession };
+8 -1
frontend/src/index.tsx
··· 8 8 import { render } from "solid-js/web"; 9 9 import { Route, Router } from "@solidjs/router"; 10 10 import { Layout } from "./layout.tsx"; 11 + import { LandingPage } from "./views/landingPage.tsx"; 12 + import { Login } from "./views/login.tsx"; 13 + import { NotFound } from "./views/notFound.tsx"; 11 14 import { Home } from "./views/home.tsx"; 15 + import "solid-devtools"; 12 16 13 17 render( 14 18 () => ( 15 19 <Router root={Layout}> 16 - <Route path="/" component={Home} /> 20 + <Route path="/" component={LandingPage} /> 21 + <Route path="/login" component={Login} /> 22 + <Route path="/home" component={Home} /> 23 + <Route path="*paramName" component={NotFound} /> 17 24 </Router> 18 25 ), 19 26 document.getElementById("root") as HTMLElement,
+23 -1
frontend/src/layout.tsx
··· 5 5 */ 6 6 7 7 import { RouteSectionProps } from "@solidjs/router"; 8 + import { Header } from "./components/header.tsx"; 9 + import { Footer } from "./components/footer.tsx"; 10 + import { onMount, createSignal, Show } from "solid-js"; 11 + import { loginState, retrieveSession } from "./components/loginForm.tsx"; 8 12 9 13 const Layout = (props: RouteSectionProps<unknown>) => { 10 - return <>{props.children}</>; 14 + const [isLoading, setIsLoading] = createSignal(true); 15 + 16 + onMount(async () => { 17 + await retrieveSession(); 18 + if (loginState() && location.pathname === "/") { 19 + window.location.href = "/home"; 20 + } 21 + setIsLoading(false); 22 + }); 23 + 24 + return ( 25 + <Show when={!isLoading()} fallback={<></>}> 26 + <> 27 + <Header /> 28 + {props.children} 29 + <Footer /> 30 + </> 31 + </Show> 32 + ); 11 33 }; 12 34 13 35 export { Layout };
+38 -17
frontend/src/styles/index.css
··· 26 26 body { 27 27 background-color: var(--bg); 28 28 color: var(--fg); 29 - width: 50%; 29 + width: 70vw; 30 30 margin: 1rem auto; 31 31 } 32 32 ··· 57 57 h1 { 58 58 margin: 0; 59 59 } 60 + 60 61 margin: 1rem 0 2rem 0; 61 62 } 62 63 ··· 101 102 gap: 1rem; 102 103 } 103 104 105 + .centered { 106 + text-align: center; 107 + margin: 0 auto; 108 + } 109 + 104 110 .sidebar-item { 105 111 border: 1px solid var(--fg); 106 112 display: flex; ··· 117 123 h4 { 118 124 margin: 0; 119 125 } 126 + } 120 127 121 - form { 122 - display: flex; 123 - flex-direction: column; 124 - align-items: center; 125 - gap: 0.5rem; 128 + .stat-counter { 129 + font-weight: bold; 130 + font-size: 1.5rem; 131 + margin: 0.5rem 0; 132 + } 126 133 127 - button { 128 - padding: 0.25rem 2rem; 129 - } 134 + form { 135 + display: flex; 136 + flex-direction: column; 137 + align-items: center; 138 + gap: 0.5rem; 139 + 140 + input { 141 + padding: 0.25rem; 142 + margin: 0.5rem; 130 143 } 144 + } 131 145 132 - .stat-counter { 133 - font-weight: bold; 134 - font-size: 1.5rem; 135 - margin: 0.5rem 0; 136 - } 146 + button { 147 + padding: 0.25rem 2rem; 148 + margin: 0 0 0.5rem 0; 137 149 } 138 150 139 151 footer { ··· 166 178 color: #8c8cfe; 167 179 } 168 180 169 - @media (max-width: 600px) { 181 + .silent-link { 182 + color: var(--fg); 183 + 184 + &:hover { 185 + font-style: revert; 186 + font-weight: revert; 187 + } 188 + } 189 + 190 + @media (max-width: 768px) { 170 191 body { 171 - width: 90%; 192 + width: 90vw; 172 193 } 173 194 174 195 header { ··· 177 198 } 178 199 179 200 #content { 180 - flex-direction: column-reverse; 201 + flex-direction: column; 181 202 } 182 203 183 204 footer {
+15 -85
frontend/src/views/home.tsx
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import { Header } from "../components/header.tsx"; 8 - import { Footer } from "../components/footer.tsx"; 7 + import { killSession, loginState } from "../components/loginForm.tsx"; 9 8 10 9 const Home = () => { 11 - return ( 12 - <> 13 - <Header /> 14 - <main> 15 - <div id="main-headings"> 16 - <h1>clippr</h1> 17 - <h2>social bookmarking for the AT Protocol</h2> 18 - </div> 19 - 20 - <div id="content"> 21 - <div id="main-content"> 22 - <h3>what is clippr?</h3> 23 - <p> 24 - Clippr is an application based on the{" "} 25 - <a href="https://atproto.com">AT Protocol</a> that allows you to 26 - bookmark, organize and share links with your friends. 27 - </p> 28 - <h3>is this app ready yet?</h3> 29 - <p> 30 - While you can use it right now, the application is still in{" "} 31 - <i>heavy</i> development, and things will eventually break. We do 32 - not recommend using Clippr as your primary bookmarking tool until 33 - it is out of beta. 34 - </p> 35 - <h3>what is the AT Protocol?</h3> 36 - <p> 37 - The AT Protocol (or "ATproto" for short) is a decentralized social 38 - networking protocol designed to allow users to have a single, 39 - portable identity across multiple interoperable applications. It 40 - is used mainly by the microblogging app Bluesky, but anyone can 41 - build an application that uses the protocol, even if it isn't 42 - related to Bluesky. 43 - </p> 44 - <h3> 45 - what's different about clippr compared to [other social 46 - bookmarking app]? 47 - </h3> 48 - <p> 49 - The main difference between Clippr and other bookmarking 50 - application such as Pocket, Instapaper, Wallabag, Linkding or 51 - Pinboard is that your data isn't locked to a specific platform. 52 - Anyone can build an extension or application that is interoperable 53 - with Clippr's API and data structures (or any other application), 54 - and we encourage you to do so. 55 - <br /> 56 - <br /> 57 - All of our code is available as{" "} 58 - <a href="https://tangled.sh/@hexmani.ac/clippr">free software</a>, 59 - and we provide a{" "} 60 - <a href="https://www.npmjs.com/package/@clipprjs/lexicons"> 61 - NPM package 62 - </a>{" "} 63 - to make it easier to develop with Clippr. 64 - </p> 65 - </div> 10 + if (!loginState()) { 11 + location.href = "/login"; 12 + } 66 13 67 - <div id="sidebar"> 68 - <div class="sidebar-item"> 69 - <h3>log in</h3> 70 - <form> 71 - <label for="handle">Bluesky handle or DID</label> 72 - <input 73 - type="text" 74 - name="handle" 75 - id="handle" 76 - placeholder="clippr.social" 77 - /> 78 - <button>log in</button> 79 - </form> 80 - <p>We can't create an account for you at the moment. Sorry :(</p> 81 - </div> 82 - <div class="sidebar-item"> 83 - <h3>stats</h3> 84 - <h4>clips</h4> 85 - <p class="stat-counter">0</p> 86 - <h4>tags</h4> 87 - <p class="stat-counter">0</p> 88 - <h4>users</h4> 89 - <p class="stat-counter">0</p> 90 - </div> 91 - </div> 14 + return ( 15 + <main> 16 + <div id="content"> 17 + <div id="main-content" class="centered"> 18 + <h2>home</h2> 19 + <p>OAuth!</p> 20 + <button type="button" onClick={killSession}> 21 + Log out 22 + </button> 92 23 </div> 93 - </main> 94 - <Footer /> 95 - </> 24 + </div> 25 + </main> 96 26 ); 97 27 }; 98 28
+86
frontend/src/views/landingPage.tsx
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { LoginForm } from "../components/loginForm.tsx"; 8 + 9 + const LandingPage = () => { 10 + return ( 11 + <> 12 + <main> 13 + <div id="main-headings"> 14 + <h1>clippr</h1> 15 + <h2>social bookmarking for the AT Protocol</h2> 16 + </div> 17 + 18 + <div id="content"> 19 + <div id="main-content"> 20 + <h3>what is clippr?</h3> 21 + <p> 22 + Clippr is an application based on the{" "} 23 + <a href="https://atproto.com">AT Protocol</a> that allows you to 24 + bookmark, organize and share links with your friends. 25 + </p> 26 + <h3>is this app ready yet?</h3> 27 + <p> 28 + While you can use it right now, the application is still in{" "} 29 + <i>heavy</i> development, and things will eventually break. We do 30 + not recommend using Clippr as your primary bookmarking tool until 31 + it is out of beta. 32 + </p> 33 + <h3>what is the AT Protocol?</h3> 34 + <p> 35 + The AT Protocol (or "ATproto" for short) is a decentralized social 36 + networking protocol designed to allow users to have a single, 37 + portable identity across multiple interoperable applications. It 38 + is used mainly by the microblogging app Bluesky, but anyone can 39 + build an application that uses the protocol, even if it isn't 40 + related to Bluesky. 41 + </p> 42 + <h3> 43 + what's different about clippr compared to [other social 44 + bookmarking app]? 45 + </h3> 46 + <p> 47 + The main difference between Clippr and other bookmarking 48 + application such as Pocket, Instapaper, Wallabag, Linkding or 49 + Pinboard is that your data isn't locked to a specific platform. 50 + Anyone can build an extension or application that is interoperable 51 + with Clippr's API and data structures (or any other application), 52 + and we encourage you to do so. 53 + <br /> 54 + <br /> 55 + All of our code is available as{" "} 56 + <a href="https://tangled.sh/@hexmani.ac/clippr">free software</a>, 57 + and we provide a{" "} 58 + <a href="https://www.npmjs.com/package/@clipprjs/lexicons"> 59 + NPM package 60 + </a>{" "} 61 + to make it easier to develop with Clippr. 62 + </p> 63 + </div> 64 + 65 + <div id="sidebar"> 66 + <div class="sidebar-item"> 67 + <h3>log in</h3> 68 + <LoginForm /> 69 + </div> 70 + <div class="sidebar-item"> 71 + <h3>stats</h3> 72 + <h4>clips</h4> 73 + <p class="stat-counter">0</p> 74 + <h4>tags</h4> 75 + <p class="stat-counter">0</p> 76 + <h4>users</h4> 77 + <p class="stat-counter">0</p> 78 + </div> 79 + </div> 80 + </div> 81 + </main> 82 + </> 83 + ); 84 + }; 85 + 86 + export { LandingPage };
+29
frontend/src/views/login.tsx
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { LoginForm, loginState } from "../components/loginForm.tsx"; 8 + 9 + const Login = () => { 10 + // TODO: Fix weird transition states 11 + if (loginState()) { 12 + location.href = "/home"; 13 + } 14 + 15 + return ( 16 + <> 17 + <main> 18 + <div id="content"> 19 + <div id="main-content" class="centered"> 20 + <h2>login</h2> 21 + <LoginForm /> 22 + </div> 23 + </div> 24 + </main> 25 + </> 26 + ); 27 + }; 28 + 29 + export { Login };
+25
frontend/src/views/notFound.tsx
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + const NotFound = () => { 8 + return ( 9 + <> 10 + <main> 11 + <div id="content"> 12 + <div id="main-content" class="centered"> 13 + <h2>404 | page not found</h2> 14 + <p>the party seems to be over...</p> 15 + <a href="/">go home</a> 16 + <br /> 17 + <br /> 18 + </div> 19 + </div> 20 + </main> 21 + </> 22 + ); 23 + }; 24 + 25 + export { NotFound };
+17
frontend/src/vite-env.d.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + interface ImportMetaEnv { 8 + readonly VITE_DEV_SERVER_PORT?: string; 9 + readonly VITE_CLIENT_URI: string; 10 + readonly VITE_OAUTH_CLIENT_ID: string; 11 + readonly VITE_OAUTH_REDIRECT_URI: string; 12 + readonly VITE_OAUTH_SCOPE: string; 13 + } 14 + 15 + interface ImportMeta { 16 + readonly env: ImportMetaEnv; 17 + }
+35 -1
frontend/vite.config.ts
··· 6 6 7 7 import { defineConfig } from "vite"; 8 8 import solidPlugin from "vite-plugin-solid"; 9 + import metadata from "./public/oauth/client-metadata.json"; 10 + import { devtoolsPlugin } from "solid-devtools/vite"; 9 11 10 12 const SERVER_HOST = "127.0.0.1"; 11 13 const SERVER_PORT = 3000; 12 14 13 15 export default defineConfig({ 14 - plugins: [solidPlugin()], 16 + plugins: [ 17 + devtoolsPlugin({ 18 + autoname: true, 19 + }), 20 + solidPlugin(), 21 + { 22 + // Shamelessly stolen from PDSls: https://github.com/notjuliet/pdsls/blob/main/vite.config.ts 23 + name: "oauth", 24 + config(_conf, { command }) { 25 + if (command === "build") { 26 + process.env.VITE_OAUTH_CLIENT_ID = metadata.client_id; 27 + process.env.VITE_OAUTH_REDIRECT_URI = metadata.redirect_uris[0]; 28 + } else { 29 + const redirectUri = ((): string => { 30 + const url = new URL(metadata.redirect_uris[0]); 31 + return `http://${SERVER_HOST}:${SERVER_PORT}${url.pathname}`; 32 + })(); 33 + 34 + const clientId = 35 + `http://localhost` + 36 + `?redirect_uri=${encodeURIComponent(redirectUri)}` + 37 + `&scope=${encodeURIComponent(metadata.scope)}`; 38 + 39 + process.env.VITE_DEV_SERVER_PORT = "" + SERVER_PORT; 40 + process.env.VITE_OAUTH_CLIENT_ID = clientId; 41 + process.env.VITE_OAUTH_REDIRECT_URI = redirectUri; 42 + } 43 + 44 + process.env.VITE_CLIENT_URI = metadata.client_uri; 45 + process.env.VITE_OAUTH_SCOPE = metadata.scope; 46 + }, 47 + }, 48 + ], 15 49 server: { 16 50 host: SERVER_HOST, 17 51 port: SERVER_PORT,