diff --git a/package.json b/package.json index e4251e8..08258a3 100644 --- a/package.json +++ b/package.json @@ -11,21 +11,21 @@ "serve": "vite preview" }, "devDependencies": { - "@iconify-json/lucide": "^1.2.102", + "@iconify-json/lucide": "^1.2.104", "@iconify/tailwind4": "^1.2.3", - "@tailwindcss/vite": "^4.2.2", + "@tailwindcss/vite": "^4.2.4", "esbuild": "^0.28.0", - "prettier": "^3.8.2", + "prettier": "^3.8.3", "prettier-plugin-organize-imports": "^4.3.0", - "prettier-plugin-tailwindcss": "^0.7.2", - "tailwindcss": "^4.2.2", - "typescript": "^6.0.2", - "vite": "^8.0.8", + "prettier-plugin-tailwindcss": "^0.7.4", + "tailwindcss": "^4.2.4", + "typescript": "^6.0.3", + "vite": "^8.0.10", "vite-plugin-solid": "^2.11.12" }, "dependencies": { "@atcute/atproto": "^3.1.11", - "@atcute/bluesky": "^3.3.2", + "@atcute/bluesky": "^3.3.3", "@atcute/car": "^5.1.1", "@atcute/cbor": "^2.3.2", "@atcute/cid": "^2.4.1", @@ -45,16 +45,16 @@ "@codemirror/lang-json": "^6.0.2", "@codemirror/lint": "^6.9.5", "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.41.0", + "@codemirror/view": "^6.41.1", "@fsegurai/codemirror-theme-basic-dark": "^6.2.5", "@fsegurai/codemirror-theme-basic-light": "^6.2.5", "@mary/exif-rm": "jsr:^0.2.2", "@mary/zip": "jsr:^0.1.1", "@skyware/firehose": "^0.5.2", "@solidjs/router": "^0.16.1", - "@takumi-rs/image-response": "^1.0.9", - "@takumi-rs/wasm": "^1.0.9", - "@tanstack/solid-virtual": "^3.13.23", + "@takumi-rs/image-response": "^1.1.2", + "@takumi-rs/wasm": "^1.1.2", + "@tanstack/solid-virtual": "^3.13.24", "codemirror": "^6.0.2", "solid-js": "^1.9.12" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e19bf9d..3cfaf72 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^3.1.11 version: 3.1.11 '@atcute/bluesky': - specifier: ^3.3.2 - version: 3.3.2 + specifier: ^3.3.3 + version: 3.3.3 '@atcute/car': specifier: ^5.1.1 version: 5.1.1 @@ -72,14 +72,14 @@ importers: specifier: ^6.6.0 version: 6.6.0 '@codemirror/view': - specifier: ^6.41.0 - version: 6.41.0 + specifier: ^6.41.1 + version: 6.41.1 '@fsegurai/codemirror-theme-basic-dark': specifier: ^6.2.5 - version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-basic-light': specifier: ^6.2.5 - version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3) '@mary/exif-rm': specifier: jsr:^0.2.2 version: '@jsr/mary__exif-rm@0.2.2' @@ -93,14 +93,14 @@ importers: specifier: ^0.16.1 version: 0.16.1(solid-js@1.9.12) '@takumi-rs/image-response': - specifier: ^1.0.9 - version: 1.0.9(react@19.2.5) + specifier: ^1.1.2 + version: 1.1.2(react@19.2.5) '@takumi-rs/wasm': - specifier: ^1.0.9 - version: 1.0.9(react@19.2.5) + specifier: ^1.1.2 + version: 1.1.2(react@19.2.5) '@tanstack/solid-virtual': - specifier: ^3.13.23 - version: 3.13.23(solid-js@1.9.12) + specifier: ^3.13.24 + version: 3.13.24(solid-js@1.9.12) codemirror: specifier: ^6.0.2 version: 6.0.2 @@ -109,38 +109,38 @@ importers: version: 1.9.12 devDependencies: '@iconify-json/lucide': - specifier: ^1.2.102 - version: 1.2.102 + specifier: ^1.2.104 + version: 1.2.104 '@iconify/tailwind4': specifier: ^1.2.3 - version: 1.2.3(tailwindcss@4.2.2) + version: 1.2.3(tailwindcss@4.2.4) '@tailwindcss/vite': - specifier: ^4.2.2 - version: 4.2.2(vite@8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)) + specifier: ^4.2.4 + version: 4.2.4(vite@8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)) esbuild: specifier: ^0.28.0 version: 0.28.0 prettier: - specifier: ^3.8.2 - version: 3.8.2 + specifier: ^3.8.3 + version: 3.8.3 prettier-plugin-organize-imports: specifier: ^4.3.0 - version: 4.3.0(prettier@3.8.2)(typescript@6.0.2) + version: 4.3.0(prettier@3.8.3)(typescript@6.0.3) prettier-plugin-tailwindcss: - specifier: ^0.7.2 - version: 0.7.2(prettier-plugin-organize-imports@4.3.0(prettier@3.8.2)(typescript@6.0.2))(prettier@3.8.2) + specifier: ^0.7.4 + version: 0.7.4(prettier-plugin-organize-imports@4.3.0(prettier@3.8.3)(typescript@6.0.3))(prettier@3.8.3) tailwindcss: - specifier: ^4.2.2 - version: 4.2.2 + specifier: ^4.2.4 + version: 4.2.4 typescript: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 vite: - specifier: ^8.0.8 - version: 8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) + specifier: ^8.0.10 + version: 8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) vite-plugin-solid: specifier: ^2.11.12 - version: 2.11.12(solid-js@1.9.12)(vite@8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)) + version: 2.11.12(solid-js@1.9.12)(vite@8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)) packages: @@ -150,8 +150,8 @@ packages: '@atcute/atproto@3.1.11': resolution: {integrity: sha512-yh+ASvA+iHHQij6UeHEKp2+rwvFvQR8A6/5Dk/xvqDslIikWEFx9VlprNwm/clQIPl2bLuQg+LHS8uY9o5nFTA==} - '@atcute/bluesky@3.3.2': - resolution: {integrity: sha512-BqVXghoNFbBm38hveWqPQQ25VZxHXmqYk5h0NG8YFiwNLrI8Ww1nXHAJzS65zyHwV5QeSA6EDFaTrQwm+7cCFQ==} + '@atcute/bluesky@3.3.3': + resolution: {integrity: sha512-R1VyEmbvIUhub6ONnt7sm6FcRoKJISWf+I0qraXtk59KLmNCsJYMX8fLdIcdv5o1i9XtDg8/Um/wqLrl84IuFg==} '@atcute/car@3.1.3': resolution: {integrity: sha512-WJ13bAEt7TjDMVi09ubjLtvhdljbWInGm9Kfy7Y6NhrmiyC/aZYaA/zHX/bHI6xv1c/h3SQduWqxOr4ae49eqA==} @@ -227,8 +227,8 @@ packages: '@atcute/util-fetch@1.0.5': resolution: {integrity: sha512-qjHj01BGxjSjIFdPiAjSARnodJIIyKxnCMMEcXMESo9TAyND6XZQqrie5fia+LlYWVXdpsTds8uFQwc9jdKTig==} - '@atcute/util-text@1.2.0': - resolution: {integrity: sha512-b8WSh+Z7K601eUFFmTFj8QPKDO8Ic0VDDj63sdKzpkm+ySQKsYT5nXekViGqFVKbyKj1V5FyvZvgXad6/aI4QQ==} + '@atcute/util-text@1.3.1': + resolution: {integrity: sha512-MRgJXkx67znuBXuoAYCJkBZyd3OApL7zZlNf5kXhuoCXcdiu1nblRDycYTADSkym4epBSQWxh26kmI9sewaq6A==} '@atcute/varint@1.0.4': resolution: {integrity: sha512-0nGBaRyJLoxVvCHTSLGwPZKs64PPi/0lDA4viF3I5zxsRmVPsXaE92J8VQj3KoZfk0+Z+liXklG1Onw7G9S4oQ==} @@ -336,23 +336,23 @@ packages: '@codemirror/lint@6.9.5': resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==} - '@codemirror/search@6.6.0': - resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==} + '@codemirror/search@6.7.0': + resolution: {integrity: sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==} '@codemirror/state@6.6.0': resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} - '@codemirror/view@6.41.0': - resolution: {integrity: sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==} + '@codemirror/view@6.41.1': + resolution: {integrity: sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg==} - '@cyberalien/svg-utils@1.2.9': - resolution: {integrity: sha512-bd5I3TQ2k/xqcNB6P6GpFKeid3OgqgGSRz704+XHoGNBAsI7wwYKS6nuxAn26ciUtRjGKovfEy66ryEY9UGUwQ==} + '@cyberalien/svg-utils@1.2.13': + resolution: {integrity: sha512-/fEcy0VRnG/7Znmjx6ib4wSbb/ILRmEV6t4b1adFZyTHw64+K+DEAoWp8wKHUV0QmbZ18RFf9VeQtvQm83Fnyg==} - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -673,8 +673,8 @@ packages: '@codemirror/view': ^6.0.0 '@lezer/highlight': ^1.0.0 - '@iconify-json/lucide@1.2.102': - resolution: {integrity: sha512-Dm3EEqu5NrmzyDMB2U1+8yroEj2/dB9V4KlH0m/szwwF/ofSf0cPaGTZqkd1aExXjCor+vU53ttRMCGuXf+/cg==} + '@iconify-json/lucide@1.2.104': + resolution: {integrity: sha512-Vh4VPA/UNFhSPzEdDnSuOPA1xO6b/kI1w4SLBEiKnsFYPWimq2tVDynMgKnwddz6iZpuZfZU4PXR6kn0hJayKw==} '@iconify/tailwind4@1.2.3': resolution: {integrity: sha512-z8SKiMHRASJKF/IY//87MF88lcB7ulxh8vlhQXXLWsBkNtOh6ese9R41MyGpQeqXdRvQVt+/fX2glQtHFjQ+MA==} @@ -687,8 +687,8 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/utils@3.1.1': + resolution: {integrity: sha512-MwzoDtw9rO1x+qfgLTV/IVXsHDBqeYZoMIQC8SfxfYSlaSUG+oWiAcoiB1yajAda6mqblm4/1/w2E8tRu7a7Tw==} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -733,14 +733,14 @@ packages: '@lezer/json@1.0.3': resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - '@lezer/lr@1.4.8': - resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} + '@lezer/lr@1.4.10': + resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -748,106 +748,106 @@ packages: '@noble/secp256k1@3.1.0': resolution: {integrity: sha512-+F7iS7tUMaNGXcc9X3PjmjvuQnXEuSjCRNzVVA2xAcKXgCaP0dHYz4SFyt4FKNHef7sOP//xihowcySSS7PK9g==} - '@oxc-project/types@0.124.0': - resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} - '@rolldown/binding-android-arm64@1.0.0-rc.15': - resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.15': - resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.15': - resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==} + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.15': - resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': - resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': - resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': - resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': - resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': - resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==} - engines: {node: '>=14.0.0'} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': - resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': - resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.15': - resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} '@skyware/firehose@0.5.2': resolution: {integrity: sha512-Ayg/cF0BkakBNQVA51ClDka0+nC96WiARNrGElMQxfqbwao0PBaCXkunfr8qS4DWS3TqLnR6hA9mvm1vAYlxJQ==} @@ -860,69 +860,69 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tailwindcss/node@4.2.2': - resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + '@tailwindcss/node@4.2.4': + resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} - '@tailwindcss/oxide-android-arm64@4.2.2': - resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + '@tailwindcss/oxide-android-arm64@4.2.4': + resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.2': - resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + '@tailwindcss/oxide-darwin-arm64@4.2.4': + resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.2': - resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + '@tailwindcss/oxide-darwin-x64@4.2.4': + resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.2': - resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + '@tailwindcss/oxide-freebsd-x64@4.2.4': + resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': - resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': + resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': - resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': + resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': - resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + '@tailwindcss/oxide-linux-arm64-musl@4.2.4': + resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': - resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + '@tailwindcss/oxide-linux-x64-gnu@4.2.4': + resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.2': - resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + '@tailwindcss/oxide-linux-x64-musl@4.2.4': + resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.2': - resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + '@tailwindcss/oxide-wasm32-wasi@4.2.4': + resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -933,105 +933,107 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': - resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': + resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': - resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + '@tailwindcss/oxide-win32-x64-msvc@4.2.4': + resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.2': - resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + '@tailwindcss/oxide@4.2.4': + resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.2.2': - resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} + '@tailwindcss/vite@4.2.4': + resolution: {integrity: sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 - '@takumi-rs/core-darwin-arm64@1.0.9': - resolution: {integrity: sha512-yOzafcUfoHx2+iR9zhN1TaqweD2Mf14me20qqrDFxtDA2LgJjiv8S7IubXhG4E0As0fDns8iM5NMcq7liVqeQQ==} + '@takumi-rs/core-darwin-arm64@1.1.2': + resolution: {integrity: sha512-CLPzikYAND2xFm0Lg5HKImCOnl+Sue4F/WIcm1Z2ykL7h2r9rWDBzcFqGhAEFj9onMJH6c60Mph8kDa1jdj2rQ==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [darwin] - '@takumi-rs/core-darwin-x64@1.0.9': - resolution: {integrity: sha512-cgs2b2BmNe+wH73p8vqL2S0XBTv5s/L1YTQZ/vGQrbwIzgSmz4bq/Y4I0nLsiBF2lExUQMedhrixplvjThuhow==} + '@takumi-rs/core-darwin-x64@1.1.2': + resolution: {integrity: sha512-eH351x+BJOMdLQgUoVKEIfTQbBjR6Dv7rzTLZUdWwbbwjEe38geCNsxQunHQ96nsB7M+0sGc8aJjOkd+0qoK3g==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [darwin] - '@takumi-rs/core-linux-arm64-gnu@1.0.9': - resolution: {integrity: sha512-v1pgv+a9pY8CKeROx7wUshvTr9JDqx6rbXrkvWCUw7u/5VGsLHcJwoxPMTbcyx36Fc0fKxxuXOGPM+1RBGZpvw==} + '@takumi-rs/core-linux-arm64-gnu@1.1.2': + resolution: {integrity: sha512-2cuSnKWAfQjQwS+7aprz0LRkztPVsGqWGTto0TydVI81z7sNyC4kZWoJMTpkNb3439HB03UBStQVacgUeVOL+w==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@takumi-rs/core-linux-arm64-musl@1.0.9': - resolution: {integrity: sha512-L6aXsre2/GIf80UBAWJgKIQtp6NPzBSBfYLQqVd3dKlT4PSu+SJrlEV5SQkIuP067F/9VJ0JIocvwdh1+gGf+Q==} + '@takumi-rs/core-linux-arm64-musl@1.1.2': + resolution: {integrity: sha512-7OIdvVy6lbr49LIBe96uvlOg4Awmye5w+DgL4d0rRi1Zv7bmY23ciBCGaM+7jjkZgcThGrlZKz1Ecopx56pPqA==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@takumi-rs/core-linux-x64-gnu@1.0.9': - resolution: {integrity: sha512-a6iVjLxaNC86Fw7s74SA48BLIGQrCDkWJu1p1y3E0uQ+vFzTW00M9jKjjHAETjslkE7uCf87ACk7BME68F/evQ==} + '@takumi-rs/core-linux-x64-gnu@1.1.2': + resolution: {integrity: sha512-IXEhQjGSGye+kwawDad00kN2cLpj1rPF5u0K4KsANvWxa/dho32Nnw+RX8cCtPGiuvEKhtENxtdc7pVSx1E84g==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@takumi-rs/core-linux-x64-musl@1.0.9': - resolution: {integrity: sha512-o6lLpmJ6lSE3zj78p6m2Phbcb1xGkPApgmoHNHh+7QJrJkrzOvIlD7EmfiAjI98hDtW+nPFD3MPyEE+ntLpkCg==} + '@takumi-rs/core-linux-x64-musl@1.1.2': + resolution: {integrity: sha512-Q2vuZCwQ/XmHwwbJxSKNNEKdWdhsvBMhTF8pyyGti5s44yx7W6+a0MkDdMRAkStzDhH6HeZlpknpHcUk4R4g8w==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@takumi-rs/core-win32-arm64-msvc@1.0.9': - resolution: {integrity: sha512-IvrE++Xn0IXqkPI+ERo+WhUBETB9mYYjYI4HlPEYOkNV4WiRYw01TdIddrtmmYgocExUCJHS/AIHvodfGU7Z7Q==} + '@takumi-rs/core-win32-arm64-msvc@1.1.2': + resolution: {integrity: sha512-CKpslxYCltih/lL+h7xkVzsfIZtDcXp3WGk01fudgx82Ic87b/jjRMX5KE4f/exkgrKxshRF4yCQGGeQ3vIhiw==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [win32] - '@takumi-rs/core-win32-x64-msvc@1.0.9': - resolution: {integrity: sha512-FUvDxIaegUrjaZwppzQcClunw9sqNsh+t0c+kgsLJc/hnCVlGMvSIYaIHlrj4K7qlo4NyIQTqA1DMYDcLXUYAQ==} + '@takumi-rs/core-win32-x64-msvc@1.1.2': + resolution: {integrity: sha512-c+n2vPpDscMuTHZ29eJp8did5tlJ/KKBKicc51D6AdkA5jhr7MLeryzIKe3ob59iQttWYd/1j4+tUwoO6yEusg==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [win32] - '@takumi-rs/core@1.0.9': - resolution: {integrity: sha512-jTXaO8nnzN9javu7lA0hmzkZtShMVQFuQOxY4jsgA2ylDbqcES+G41EQBoVJVyvcwRLRTvqOxPuya2LrCB6SAA==} + '@takumi-rs/core@1.1.2': + resolution: {integrity: sha512-JI0kUis5MCPzOt2sCahBZLVJERpp1t1fXTRBaBbCGploUa/hqRA9HW6Nr+tccDM/C6wy9FDrJnI4SB56W0HfDA==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} - '@takumi-rs/helpers@1.0.9': - resolution: {integrity: sha512-Q4O5eINwqybLXI2LE3VO4qk8/7eLmV51oG3S8DfGJJjHI5mRx/aQ91RfvFnsvFDWByrswBnBet46IyXnQU2s4A==} + '@takumi-rs/helpers@1.1.2': + resolution: {integrity: sha512-Edvmk7UzPhlbUCYpIqeBBfq9h/lAeWAhtwIhJJ10vxv7qNWjgfIPakzNWeAYhFVj8KT5y47S3RLT3cKVniqI5g==} peerDependencies: react: ^19.2.5 react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: + react: + optional: true react-dom: optional: true - '@takumi-rs/image-response@1.0.9': - resolution: {integrity: sha512-ja87V9bW0F3MWdDgtLHhw1UH/SYN3xcRjdebd7n6CF+4iNCjptJRj1mQAi0Cy2JmwLBTV8qvNeiCcJ6qLIQM3g==} + '@takumi-rs/image-response@1.1.2': + resolution: {integrity: sha512-kXkGzHdFBAXH/05KEFkgVP2oJScTeWD7nORQzEiBajYthRyU44ZBctZzEBobvWfagDhfeS86sD+OZB1AjSE1KA==} - '@takumi-rs/wasm@1.0.9': - resolution: {integrity: sha512-GdCzb0G2WauDfJhLYHQ2Y+56d0kWS7okxzgEeZAlzzYay10r/zduBNdhRcgRSU5Xo8tYYKQyh9FnxHV1nj8zIA==} + '@takumi-rs/wasm@1.1.2': + resolution: {integrity: sha512-in2kLgFp6nuXie5q7blvRk8m/3UuvNDtc5SEFUh6Eu2yn20PcElj1VMdXhQhn+IN0h119BUWWdJ3AuEuh8PiDg==} - '@tanstack/solid-virtual@3.13.23': - resolution: {integrity: sha512-knSNOb1ev78yaf4CnhCY+JS2NZXzp6WO/8pzI/P9GitrG6QLgBzltOl3duN8+13QkVdSMxRrUKl8mioWNlTQxA==} + '@tanstack/solid-virtual@3.13.24': + resolution: {integrity: sha512-sLGjpsAWLK8oxciqN+FNjs5JLs9N27DKwwoOPN8FMrmFMeXdiPQvRg3CqUAv8pYfXKD9KmcbhBxNwlmcP22a8Q==} peerDependencies: solid-js: ^1.3.0 - '@tanstack/virtual-core@3.13.23': - resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} + '@tanstack/virtual-core@3.14.0': + resolution: {integrity: sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==} '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -1070,8 +1072,8 @@ packages: solid-js: optional: true - baseline-browser-mapping@2.10.18: - resolution: {integrity: sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A==} + baseline-browser-mapping@2.10.23: + resolution: {integrity: sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==} engines: {node: '>=6.0.0'} hasBin: true @@ -1083,8 +1085,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - caniuse-lite@1.0.30001787: - resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==} + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} codemirror@6.0.2: resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} @@ -1150,11 +1152,11 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - electron-to-chromium@1.5.336: - resolution: {integrity: sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==} + electron-to-chromium@1.5.344: + resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.21.0: + resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -1203,8 +1205,8 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1342,13 +1344,13 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.7: - resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + nanoid@5.1.9: + resolution: {integrity: sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==} engines: {node: ^18 || >=20} hasBin: true - node-releases@2.0.37: - resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -1372,8 +1374,8 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.12: + resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} engines: {node: ^10 || ^12 || >=14} prettier-plugin-organize-imports@4.3.0: @@ -1386,8 +1388,8 @@ packages: vue-tsc: optional: true - prettier-plugin-tailwindcss@0.7.2: - resolution: {integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==} + prettier-plugin-tailwindcss@0.7.4: + resolution: {integrity: sha512-UKii4RjY05SNt/WQi6/NcOn/LsT0/ILLXsxygjbRg5/YZelsSu5jTqorYHPDGq4nZy5q5hpCu+XdGZ1xaJEQgw==} engines: {node: '>=20.19'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -1441,8 +1443,8 @@ packages: prettier-plugin-svelte: optional: true - prettier@3.8.2: - resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -1453,8 +1455,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rolldown@1.0.0-rc.15: - resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -1496,14 +1498,14 @@ packages: engines: {node: '>=16'} hasBin: true - tailwindcss@4.2.2: - resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + tailwindcss@4.2.4: + resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} - takumi-js@1.0.9: - resolution: {integrity: sha512-R3PdMihWL30EYfHiqQq3yRyvEjyZrbUndtfV0lCaK4UJXdZuvPffEfc11iyQg3hzfrNXi5i/RBsTfJFR1/jQTg==} + takumi-js@1.1.2: + resolution: {integrity: sha512-S8Ff0zBUQJ8VC40r7y1RPBo5QXFXV3U868M+T8B8JGt5Tko8l83DVEr1BYLOxqUenEeev853S708oE0aD50eZA==} - tapable@2.3.2: - resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tinyexec@1.1.1: @@ -1522,8 +1524,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -1552,8 +1554,8 @@ packages: '@testing-library/jest-dom': optional: true - vite@8.0.8: - resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==} + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1624,7 +1626,7 @@ snapshots: dependencies: '@atcute/lexicons': 1.3.0 - '@atcute/bluesky@3.3.2': + '@atcute/bluesky@3.3.3': dependencies: '@atcute/atproto': 3.1.11 '@atcute/lexicons': 1.3.0 @@ -1695,7 +1697,7 @@ snapshots: '@atcute/identity': 1.1.4 '@atcute/lexicons': 1.3.0 '@atcute/uint8array': 1.1.1 - '@atcute/util-text': 1.2.0 + '@atcute/util-text': 1.3.1 '@badrap/valita': 0.4.6 '@atcute/lexicon-resolver@0.1.6(@atcute/identity-resolver@1.2.2(@atcute/identity@1.1.4))(@atcute/identity@1.1.4)': @@ -1712,7 +1714,7 @@ snapshots: '@atcute/lexicons@1.3.0': dependencies: '@atcute/uint8array': 1.1.1 - '@atcute/util-text': 1.2.0 + '@atcute/util-text': 1.3.1 '@standard-schema/spec': 1.1.0 esm-env: 1.2.2 @@ -1734,7 +1736,7 @@ snapshots: '@atcute/multibase': 1.2.0 '@atcute/oauth-crypto': 0.1.0 '@atcute/oauth-types': 0.1.1 - nanoid: 5.1.7 + nanoid: 5.1.9 transitivePeerDependencies: - '@atcute/identity' @@ -1743,7 +1745,7 @@ snapshots: '@atcute/multibase': 1.2.0 '@atcute/uint8array': 1.1.1 '@badrap/valita': 0.4.6 - nanoid: 5.1.7 + nanoid: 5.1.9 '@atcute/oauth-keyset@0.1.0': dependencies: @@ -1778,7 +1780,7 @@ snapshots: dependencies: '@badrap/valita': 0.4.6 - '@atcute/util-text@1.2.0': + '@atcute/util-text@1.3.1': dependencies: unicode-segmenter: 0.14.5 @@ -1903,14 +1905,14 @@ snapshots: dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 '@lezer/common': 1.5.2 '@codemirror/commands@6.10.3': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 '@lezer/common': 1.5.2 '@codemirror/lang-json@6.0.2': @@ -1921,46 +1923,46 @@ snapshots: '@codemirror/language@6.12.3': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 style-mod: 4.1.3 '@codemirror/lint@6.9.5': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 crelt: 1.0.6 - '@codemirror/search@6.6.0': + '@codemirror/search@6.7.0': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 crelt: 1.0.6 '@codemirror/state@6.6.0': dependencies: '@marijn/find-cluster-break': 1.0.2 - '@codemirror/view@6.41.0': + '@codemirror/view@6.41.1': dependencies: '@codemirror/state': 6.6.0 crelt: 1.0.6 style-mod: 4.1.3 w3c-keyname: 2.2.8 - '@cyberalien/svg-utils@1.2.9': + '@cyberalien/svg-utils@1.2.13': dependencies: '@iconify/types': 2.0.0 - '@emnapi/core@1.9.2': + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.2': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true @@ -2120,36 +2122,36 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@fsegurai/codemirror-theme-basic-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-basic-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-basic-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-basic-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 '@lezer/highlight': 1.2.3 - '@iconify-json/lucide@1.2.102': + '@iconify-json/lucide@1.2.104': dependencies: '@iconify/types': 2.0.0 - '@iconify/tailwind4@1.2.3(tailwindcss@4.2.2)': + '@iconify/tailwind4@1.2.3(tailwindcss@4.2.4)': dependencies: '@iconify/tools': 5.0.11 '@iconify/types': 2.0.0 - '@iconify/utils': 3.1.0 - tailwindcss: 4.2.2 + '@iconify/utils': 3.1.1 + tailwindcss: 4.2.4 '@iconify/tools@5.0.11': dependencies: - '@cyberalien/svg-utils': 1.2.9 + '@cyberalien/svg-utils': 1.2.13 '@iconify/types': 2.0.0 - '@iconify/utils': 3.1.0 + '@iconify/utils': 3.1.1 fflate: 0.8.2 modern-tar: 0.7.6 pathe: 2.0.3 @@ -2157,7 +2159,7 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': + '@iconify/utils@3.1.1': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 @@ -2209,75 +2211,75 @@ snapshots: dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 - '@lezer/lr@1.4.8': + '@lezer/lr@1.4.10': dependencies: '@lezer/common': 1.5.2 '@marijn/find-cluster-break@1.0.2': {} - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true '@noble/secp256k1@3.1.0': {} - '@oxc-project/types@0.124.0': {} + '@oxc-project/types@0.127.0': {} - '@rolldown/binding-android-arm64@1.0.0-rc.15': + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.15': + '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true - '@rolldown/pluginutils@1.0.0-rc.15': {} + '@rolldown/pluginutils@1.0.0-rc.17': {} '@skyware/firehose@0.5.2': dependencies: @@ -2291,138 +2293,138 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@tailwindcss/node@4.2.2': + '@tailwindcss/node@4.2.4': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.1 + enhanced-resolve: 5.21.0 jiti: 2.6.1 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.2 + tailwindcss: 4.2.4 - '@tailwindcss/oxide-android-arm64@4.2.2': + '@tailwindcss/oxide-android-arm64@4.2.4': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.2': + '@tailwindcss/oxide-darwin-arm64@4.2.4': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.2': + '@tailwindcss/oxide-darwin-x64@4.2.4': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.2': + '@tailwindcss/oxide-freebsd-x64@4.2.4': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + '@tailwindcss/oxide-linux-arm64-musl@4.2.4': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + '@tailwindcss/oxide-linux-x64-gnu@4.2.4': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.2': + '@tailwindcss/oxide-linux-x64-musl@4.2.4': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.2': + '@tailwindcss/oxide-wasm32-wasi@4.2.4': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + '@tailwindcss/oxide-win32-x64-msvc@4.2.4': optional: true - '@tailwindcss/oxide@4.2.2': + '@tailwindcss/oxide@4.2.4': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-x64': 4.2.2 - '@tailwindcss/oxide-freebsd-x64': 4.2.2 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-x64-musl': 4.2.2 - '@tailwindcss/oxide-wasm32-wasi': 4.2.2 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + '@tailwindcss/oxide-android-arm64': 4.2.4 + '@tailwindcss/oxide-darwin-arm64': 4.2.4 + '@tailwindcss/oxide-darwin-x64': 4.2.4 + '@tailwindcss/oxide-freebsd-x64': 4.2.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 + '@tailwindcss/oxide-linux-x64-musl': 4.2.4 + '@tailwindcss/oxide-wasm32-wasi': 4.2.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 - '@tailwindcss/vite@4.2.2(vite@8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2))': + '@tailwindcss/vite@4.2.4(vite@8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2))': dependencies: - '@tailwindcss/node': 4.2.2 - '@tailwindcss/oxide': 4.2.2 - tailwindcss: 4.2.2 - vite: 8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) + '@tailwindcss/node': 4.2.4 + '@tailwindcss/oxide': 4.2.4 + tailwindcss: 4.2.4 + vite: 8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) - '@takumi-rs/core-darwin-arm64@1.0.9': + '@takumi-rs/core-darwin-arm64@1.1.2': optional: true - '@takumi-rs/core-darwin-x64@1.0.9': + '@takumi-rs/core-darwin-x64@1.1.2': optional: true - '@takumi-rs/core-linux-arm64-gnu@1.0.9': + '@takumi-rs/core-linux-arm64-gnu@1.1.2': optional: true - '@takumi-rs/core-linux-arm64-musl@1.0.9': + '@takumi-rs/core-linux-arm64-musl@1.1.2': optional: true - '@takumi-rs/core-linux-x64-gnu@1.0.9': + '@takumi-rs/core-linux-x64-gnu@1.1.2': optional: true - '@takumi-rs/core-linux-x64-musl@1.0.9': + '@takumi-rs/core-linux-x64-musl@1.1.2': optional: true - '@takumi-rs/core-win32-arm64-msvc@1.0.9': + '@takumi-rs/core-win32-arm64-msvc@1.1.2': optional: true - '@takumi-rs/core-win32-x64-msvc@1.0.9': + '@takumi-rs/core-win32-x64-msvc@1.1.2': optional: true - '@takumi-rs/core@1.0.9(react@19.2.5)': + '@takumi-rs/core@1.1.2(react@19.2.5)': dependencies: - '@takumi-rs/helpers': 1.0.9(react@19.2.5) + '@takumi-rs/helpers': 1.1.2(react@19.2.5) optionalDependencies: - '@takumi-rs/core-darwin-arm64': 1.0.9 - '@takumi-rs/core-darwin-x64': 1.0.9 - '@takumi-rs/core-linux-arm64-gnu': 1.0.9 - '@takumi-rs/core-linux-arm64-musl': 1.0.9 - '@takumi-rs/core-linux-x64-gnu': 1.0.9 - '@takumi-rs/core-linux-x64-musl': 1.0.9 - '@takumi-rs/core-win32-arm64-msvc': 1.0.9 - '@takumi-rs/core-win32-x64-msvc': 1.0.9 + '@takumi-rs/core-darwin-arm64': 1.1.2 + '@takumi-rs/core-darwin-x64': 1.1.2 + '@takumi-rs/core-linux-arm64-gnu': 1.1.2 + '@takumi-rs/core-linux-arm64-musl': 1.1.2 + '@takumi-rs/core-linux-x64-gnu': 1.1.2 + '@takumi-rs/core-linux-x64-musl': 1.1.2 + '@takumi-rs/core-win32-arm64-msvc': 1.1.2 + '@takumi-rs/core-win32-x64-msvc': 1.1.2 transitivePeerDependencies: - react - react-dom - '@takumi-rs/helpers@1.0.9(react@19.2.5)': - dependencies: + '@takumi-rs/helpers@1.1.2(react@19.2.5)': + optionalDependencies: react: 19.2.5 - '@takumi-rs/image-response@1.0.9(react@19.2.5)': + '@takumi-rs/image-response@1.1.2(react@19.2.5)': dependencies: - takumi-js: 1.0.9(react@19.2.5) + takumi-js: 1.1.2(react@19.2.5) transitivePeerDependencies: - react - react-dom - '@takumi-rs/wasm@1.0.9(react@19.2.5)': + '@takumi-rs/wasm@1.1.2(react@19.2.5)': dependencies: - '@takumi-rs/helpers': 1.0.9(react@19.2.5) + '@takumi-rs/helpers': 1.1.2(react@19.2.5) transitivePeerDependencies: - react - react-dom - '@tanstack/solid-virtual@3.13.23(solid-js@1.9.12)': + '@tanstack/solid-virtual@3.13.24(solid-js@1.9.12)': dependencies: - '@tanstack/virtual-core': 3.13.23 + '@tanstack/virtual-core': 3.14.0 solid-js: 1.9.12 - '@tanstack/virtual-core@3.13.23': {} + '@tanstack/virtual-core@3.14.0': {} '@tybys/wasm-util@0.10.1': dependencies: @@ -2473,19 +2475,19 @@ snapshots: optionalDependencies: solid-js: 1.9.12 - baseline-browser-mapping@2.10.18: {} + baseline-browser-mapping@2.10.23: {} boolbase@1.0.0: {} browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.18 - caniuse-lite: 1.0.30001787 - electron-to-chromium: 1.5.336 - node-releases: 2.0.37 + baseline-browser-mapping: 2.10.23 + caniuse-lite: 1.0.30001791 + electron-to-chromium: 1.5.344 + node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) - caniuse-lite@1.0.30001787: {} + caniuse-lite@1.0.30001791: {} codemirror@6.0.2: dependencies: @@ -2493,9 +2495,9 @@ snapshots: '@codemirror/commands': 6.10.3 '@codemirror/language': 6.12.3 '@codemirror/lint': 6.9.5 - '@codemirror/search': 6.6.0 + '@codemirror/search': 6.7.0 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.41.1 commander@11.1.0: {} @@ -2555,12 +2557,12 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - electron-to-chromium@1.5.336: {} + electron-to-chromium@1.5.344: {} - enhanced-resolve@5.20.1: + enhanced-resolve@5.21.0: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.2 + tapable: 2.3.3 entities@4.5.0: {} @@ -2638,7 +2640,7 @@ snapshots: gensync@1.0.0-beta.2: {} - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 optional: true @@ -2737,9 +2739,9 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.7: {} + nanoid@5.1.9: {} - node-releases@2.0.37: {} + node-releases@2.0.38: {} nth-check@2.1.1: dependencies: @@ -2763,50 +2765,51 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - postcss@8.5.9: + postcss@8.5.12: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier-plugin-organize-imports@4.3.0(prettier@3.8.2)(typescript@6.0.2): + prettier-plugin-organize-imports@4.3.0(prettier@3.8.3)(typescript@6.0.3): dependencies: - prettier: 3.8.2 - typescript: 6.0.2 + prettier: 3.8.3 + typescript: 6.0.3 - prettier-plugin-tailwindcss@0.7.2(prettier-plugin-organize-imports@4.3.0(prettier@3.8.2)(typescript@6.0.2))(prettier@3.8.2): + prettier-plugin-tailwindcss@0.7.4(prettier-plugin-organize-imports@4.3.0(prettier@3.8.3)(typescript@6.0.3))(prettier@3.8.3): dependencies: - prettier: 3.8.2 + prettier: 3.8.3 optionalDependencies: - prettier-plugin-organize-imports: 4.3.0(prettier@3.8.2)(typescript@6.0.2) + prettier-plugin-organize-imports: 4.3.0(prettier@3.8.3)(typescript@6.0.3) - prettier@3.8.2: {} + prettier@3.8.3: {} - react@19.2.5: {} + react@19.2.5: + optional: true resolve-pkg-maps@1.0.0: optional: true - rolldown@1.0.0-rc.15: + rolldown@1.0.0-rc.17: dependencies: - '@oxc-project/types': 0.124.0 - '@rolldown/pluginutils': 1.0.0-rc.15 + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.15 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.15 - '@rolldown/binding-darwin-x64': 1.0.0-rc.15 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.15 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 sax@1.6.0: {} @@ -2847,18 +2850,18 @@ snapshots: picocolors: 1.1.1 sax: 1.6.0 - tailwindcss@4.2.2: {} + tailwindcss@4.2.4: {} - takumi-js@1.0.9(react@19.2.5): + takumi-js@1.1.2(react@19.2.5): dependencies: - '@takumi-rs/core': 1.0.9(react@19.2.5) - '@takumi-rs/helpers': 1.0.9(react@19.2.5) - '@takumi-rs/wasm': 1.0.9(react@19.2.5) + '@takumi-rs/core': 1.1.2(react@19.2.5) + '@takumi-rs/helpers': 1.1.2(react@19.2.5) + '@takumi-rs/wasm': 1.1.2(react@19.2.5) transitivePeerDependencies: - react - react-dom - tapable@2.3.2: {} + tapable@2.3.3: {} tinyexec@1.1.1: {} @@ -2873,12 +2876,12 @@ snapshots: tsx@4.19.2: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 optional: true - typescript@6.0.2: {} + typescript@6.0.3: {} ufo@1.6.3: {} @@ -2893,7 +2896,7 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - vite-plugin-solid@2.11.12(solid-js@1.9.12)(vite@8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)): + vite-plugin-solid@2.11.12(solid-js@1.9.12)(vite@8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -2901,17 +2904,17 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.12 solid-refresh: 0.6.3(solid-js@1.9.12) - vite: 8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) - vitefu: 1.1.3(vite@8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)) + vite: 8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) + vitefu: 1.1.3(vite@8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)) transitivePeerDependencies: - supports-color - vite@8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2): + vite@8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.9 - rolldown: 1.0.0-rc.15 + postcss: 8.5.12 + rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 25.3.4 @@ -2920,9 +2923,9 @@ snapshots: jiti: 2.6.1 tsx: 4.19.2 - vitefu@1.1.3(vite@8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)): + vitefu@1.1.3(vite@8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2)): optionalDependencies: - vite: 8.0.8(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) + vite: 8.0.10(@types/node@25.3.4)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.19.2) w3c-keyname@2.2.8: {} diff --git a/src/components/json.tsx b/src/components/json.tsx index 36dd2b9..dafb4f3 100644 --- a/src/components/json.tsx +++ b/src/components/json.tsx @@ -7,11 +7,9 @@ import { createSignal, ErrorBoundary, For, - onCleanup, Show, useContext, } from "solid-js"; -import { Portal } from "solid-js/web"; import { resolveLexiconAuthority } from "../lib/api"; import { formatFileSize } from "../utils/format"; import { hideMedia } from "../views/settings"; @@ -19,6 +17,7 @@ import DidHoverCard from "./hover-card/did"; import RecordHoverCard from "./hover-card/record"; import { addNotification, removeNotification } from "./notification"; import VideoPlayer from "./video-player"; +import { ZoomableImage } from "./zoomable-image"; interface JSONContext { repo: string; @@ -57,6 +56,7 @@ const JSONString = (props: { data: string; isType?: boolean; isLink?: boolean }) const ctx = useJSONCtx(); const navigate = useNavigate(); const params = useParams(); + const location = useLocation(); const handleClick = async (lex: string) => { try { @@ -103,9 +103,8 @@ const JSONString = (props: { data: string; isType?: boolean; isLink?: boolean }) : isCid(part) && props.isLink && ctx.parentIsBlob && params.repo ? {part} @@ -323,25 +322,7 @@ const JSONObject = (props: { data: { [x: string]: JSONType } }) => { const MediaDisplay = () => { const [overrideShow, setOverrideShow] = createSignal(false); const hidden = () => hideMedia() && !overrideShow(); - const [expanded, setExpanded] = createSignal(false); - const [closing, setClosing] = createSignal(false); - const closeExpanded = () => { - setClosing(true); - setTimeout(() => { - setExpanded(false); - setClosing(false); - }, 200); - }; - - createEffect(() => { - if (!expanded()) return; - const handler = (e: KeyboardEvent) => { - if (e.key === "Escape") closeExpanded(); - }; - window.addEventListener("keydown", handler); - onCleanup(() => window.removeEventListener("keydown", handler)); - }); const [imageUrl] = createResource( () => (blob.mimeType.startsWith("image/") ? blob.ref.$link : null), async (cid) => { @@ -371,26 +352,7 @@ const JSONObject = (props: { data: { [x: string]: JSONType } }) => { } > - setExpanded(true)} - /> - - - - - - - + diff --git a/src/components/zoomable-image.tsx b/src/components/zoomable-image.tsx new file mode 100644 index 0000000..b65f44f --- /dev/null +++ b/src/components/zoomable-image.tsx @@ -0,0 +1,49 @@ +import { createEffect, createSignal, onCleanup, Show } from "solid-js"; +import { Portal } from "solid-js/web"; + +export const ZoomableImage = (props: { src: string | undefined; class?: string }) => { + const [expanded, setExpanded] = createSignal(false); + const [closing, setClosing] = createSignal(false); + + const close = () => { + setClosing(true); + setTimeout(() => { + setExpanded(false); + setClosing(false); + }, 200); + }; + + createEffect(() => { + if (!expanded()) return; + const handler = (e: KeyboardEvent) => { + if (e.key === "Escape") close(); + }; + window.addEventListener("keydown", handler); + onCleanup(() => window.removeEventListener("keydown", handler)); + }); + + return ( + <> + setExpanded(true)} + /> + + + + + + + + > + ); +}; diff --git a/src/index.tsx b/src/index.tsx index 3d7b4c5..ac2b7c3 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -9,6 +9,7 @@ import { Home } from "./views/home.tsx"; import { LabelView } from "./views/labels.tsx"; import { PdsLayout } from "./views/pds.tsx"; import { RecordView } from "./views/record.tsx"; +import { BlobDebugView } from "./views/repo/blob-debug.tsx"; import { RepoLayout, repoPreload } from "./views/repo/index.tsx"; import { Settings } from "./views/settings.tsx"; import { StreamView } from "./views/stream"; @@ -25,6 +26,7 @@ render( + diff --git a/src/views/repo/blob-debug.tsx b/src/views/repo/blob-debug.tsx new file mode 100644 index 0000000..1613ba2 --- /dev/null +++ b/src/views/repo/blob-debug.tsx @@ -0,0 +1,317 @@ +import * as CID from "@atcute/cid"; +import { A, useLocation, useParams } from "@solidjs/router"; +import { + createEffect, + createMemo, + createResource, + createSignal, + ErrorBoundary, + Match, + onCleanup, + Show, + Switch, +} from "solid-js"; +import { Button } from "../../components/button.jsx"; +import { Spinner } from "../../components/spinner.jsx"; +import VideoPlayer from "../../components/video-player.jsx"; +import { ZoomableImage } from "../../components/zoomable-image.jsx"; +import { useRepo } from "../../lib/repo-context.jsx"; +import { formatFileSize } from "../../utils/format.js"; + +const SIZE_CAP = 50 * 1024 * 1024; // 50 MiB + +const toHex = (bytes: Uint8Array) => + Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(""); + +type BlobResult = + | { kind: "oversized"; size: number; mimeType: string | undefined } + | { + kind: "loaded"; + bytes: Uint8Array; + size: number; + mimeType: string; + digest: Uint8Array; + expected: Uint8Array; + matches: boolean; + }; + +export const BlobDebugView = () => { + const params = useParams(); + const location = useLocation(); + const repo = useRepo(); + const [overrideCap, setOverrideCap] = createSignal(false); + + const back = () => { + const state = location.state as { from?: string; label?: string } | undefined; + return { + href: state?.from ?? `/at://${params.repo}#blobs`, + label: state?.label ?? "Back to blobs", + }; + }; + + const parsedCid = createMemo(() => { + try { + return { ok: true as const, cid: CID.fromString(params.cid!) }; + } catch (e) { + return { ok: false as const, error: (e as Error).message }; + } + }); + + const blobUrl = () => + `${repo.pds()}/xrpc/com.atproto.sync.getBlob?did=${params.repo}&cid=${params.cid}`; + + const [blob] = createResource( + () => { + const pds = repo.pds(); + if (!pds || !parsedCid().ok) return null; + return { url: blobUrl(), override: overrideCap() }; + }, + async ({ url, override }): Promise => { + let size: number | undefined; + let mimeType: string | undefined; + try { + const head = await fetch(url, { method: "HEAD" }); + if (head.ok) { + const cl = head.headers.get("content-length"); + size = cl ? parseInt(cl, 10) : undefined; + mimeType = head.headers.get("content-type") ?? undefined; + } + } catch {} + + if (size !== undefined && size > SIZE_CAP && !override) { + return { kind: "oversized", size, mimeType }; + } + + const res = await fetch(url); + if (!res.ok) throw new Error(`${res.status} ${res.statusText}`); + const finalMime = res.headers.get("content-type") ?? mimeType ?? "application/octet-stream"; + const bytes = new Uint8Array(await res.arrayBuffer()); + const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes)); + const parsed = parsedCid(); + const expected = + parsed.ok && parsed.cid.digest.codec === CID.HASH_SHA256 ? + parsed.cid.digest.contents + : new Uint8Array(); + const matches = + expected.length === digest.length && digest.every((b, i) => b === expected[i]); + + return { + kind: "loaded", + bytes, + size: bytes.byteLength, + mimeType: finalMime, + digest, + expected, + matches, + }; + }, + ); + + const blobValue = createMemo(() => { + if (blob.loading || blob.error) return undefined; + return blob(); + }); + + const objectUrl = createMemo((prev) => { + if (prev) URL.revokeObjectURL(prev); + const b = blobValue(); + if (b?.kind !== "loaded") return undefined; + return URL.createObjectURL(new Blob([b.bytes], { type: b.mimeType })); + }); + onCleanup(() => { + const u = objectUrl(); + if (u) URL.revokeObjectURL(u); + }); + + createEffect(() => { + document.title = `Blob ${params.cid?.slice(0, 12)}… - PDSls`; + }); + + const previewKind = (mime: string) => + mime.startsWith("image/") ? "image" + : mime === "video/mp4" ? "video" + : mime.startsWith("audio/") ? "audio" + : "none"; + + const unsupportedHash = () => { + const p = parsedCid(); + return p.ok && p.cid.digest.codec !== CID.HASH_SHA256 ? p.cid.digest.codec : undefined; + }; + + return ( + ( + + {String(err)} + + )} + > + + + + {back().label} + + + + + Invalid CID: {(parsedCid() as { ok: false; error: string }).error} + + + + + + PDS unavailable for this repo. + + + + + + + + + + + + Failed to fetch blob: {String(blob.error)} + + + ) + } + > + {(b) => ( + + + Blob is {formatFileSize(b().size)} (over the {formatFileSize(SIZE_CAP)} auto-fetch + cap). The hash will not be verified until you fetch it. + + + + Content-Type: {b().mimeType} + + + + setOverrideCap(true)}>Fetch anyway + + + Open raw + + + + )} + + ) + } + > + {(b) => { + const unsupported = unsupportedHash(); + return ( + <> + + + CID + + {params.cid} + + + Hash + + + + + {unsupported !== undefined ? + "Unsupported" + : b().matches ? + "Valid" + : "Mismatch"} + + + + + Fetched bytes do not match the requested CID. + + expected + {toHex(b().expected)} + actual + {toHex(b().digest)} + + + + + + Hash multicodec 0x{unsupported!.toString(16)} not recognized. + + + + Size + {formatFileSize(b().size)} + MIME + {b().mimeType} + + + + + + + + Failed to load video}> + + + + + + + + + + + + + Open raw + + > + ); + }} + + + + + ); +}; diff --git a/src/views/repo/blob.tsx b/src/views/repo/blob.tsx index 9b06926..7a31708 100644 --- a/src/views/repo/blob.tsx +++ b/src/views/repo/blob.tsx @@ -1,4 +1,5 @@ import { Client, simpleFetchHandler } from "@atcute/client"; +import { A } from "@solidjs/router"; import { createResource, createSignal, For, Show } from "solid-js"; import { Button } from "../../components/button"; @@ -33,14 +34,14 @@ export const BlobView = (props: { pds: string; repo: string }) => { {(cid) => ( - {cid} - + )} diff --git a/src/views/repo/index.tsx b/src/views/repo/index.tsx index 3a2978e..a9f57e9 100644 --- a/src/views/repo/index.tsx +++ b/src/views/repo/index.tsx @@ -52,7 +52,7 @@ export const RepoLayout = (props: RouteSectionProps) => { const params = useParams(); const location = useLocation(); const navigate = useNavigate(); - const hasChild = () => !!params.collection; + const hasChild = () => !!params.collection || !!params.cid; // Redirect non-DID identifiers (handles, NSIDs) via effect — must be separate from // the resource because navigate inside a resource fetcher doesn't reliably re-trigger it @@ -224,7 +224,7 @@ const downloadRepo = async (pdsUrl: string, did: string) => { const RepoView = () => { const repo = useRepo(); const params = useParams(); - const hidden = () => !!params.collection; + const hidden = () => !!params.collection || !!params.cid; const location = useLocation(); const [error, setError] = createSignal(); const [downloading, setDownloading] = createSignal(false);