diff --git a/.github/ISSUE_TEMPLATE/do-not-submit-any-issue-here.md b/.github/ISSUE_TEMPLATE/do-not-submit-any-issue-here.md index 16dae38ed..0d77fbaac 100644 --- a/.github/ISSUE_TEMPLATE/do-not-submit-any-issue-here.md +++ b/.github/ISSUE_TEMPLATE/do-not-submit-any-issue-here.md @@ -2,9 +2,6 @@ name: Do not submit any issue here about: Please go to the `OpenList` repo if you have issues to submit. title: Do not submit any issue here -labels: '' -assignees: '' - +labels: "" +assignees: "" --- - - diff --git a/.github/workflows/build_media.yml b/.github/workflows/build_media.yml new file mode 100644 index 000000000..c55d3f117 --- /dev/null +++ b/.github/workflows/build_media.yml @@ -0,0 +1,79 @@ +# This workflow builds a media branch version of the OpenList frontend and publishes it on GitHub. +# +# This will: +# +# - Upload the release assets to GitHub (always git tagged `beta-media`). +# +# This workflow can be triggered on pushes to the `dev-media` branch, or manually via the GitHub Actions UI. + +name: Media Build + +on: + push: + branches: + - dev-media + workflow_dispatch: + inputs: + draft: + description: "Create draft release" + required: false + default: true + type: boolean + +jobs: + media: + name: Media Build + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version: "22" + registry-url: "https://registry.npmjs.org" + + - uses: pnpm/action-setup@v4 + name: Install pnpm + id: pnpm-install + with: + run_install: false + + - name: Build Media Pre-release + run: | + chmod +x build.sh + ./build.sh --dev --compress + env: + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + - name: Read version and determine tag name + id: version + run: | + version=$(cat dist/VERSION) + echo "version=$version" >> $GITHUB_OUTPUT + echo "tag_name=beta-media" >> $GITHUB_OUTPUT + + - name: Remove the existing pre-release + run: gh release delete ${{ steps.version.outputs.tag_name }} --cleanup-tag --yes || true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Publish media pre-release on GitHub + run: | + gh release create \ + --title "Media Pre-release ${{ steps.version.outputs.version }}" \ + --notes "Media branch pre-release build for ${{ steps.version.outputs.version }}
This is a development build for the media library feature and not intended for production use." \ + --prerelease \ + --draft=${{ github.event_name == 'workflow_dispatch' && github.event.inputs.draft || false }} \ + ${{ steps.version.outputs.tag_name }} \ + dist/openlist-frontend-dist-v*-*.tar.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +permissions: + contents: write diff --git a/package.json b/package.json index 0c9e0b89c..e243ce6a2 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "@embedpdf/snippet": "^2.12.1", "@github/webauthn-json": "^2.1.1", "@hope-ui/solid": "0.6.7", + "@mediabunny/ac3": "^1.40.1", "@monaco-editor/loader": "1.7.0", "@ruffle-rs/ruffle": "0.2.0-nightly.2026.3.23", "@solid-primitives/i18n": "^2.2.1", @@ -98,6 +99,7 @@ "libheif-js": "^1.19.8", "lightgallery": "^2.9.0", "mark.js": "^8.11.1", + "mediabunny": "^1.40.1", "mitt": "^3.0.1", "monaco-editor": "0.55.1", "mpegts.js": "^1.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed4988fb2..94395b314 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,13 +18,16 @@ importers: version: 4.0.0-beta.7 '@embedpdf/snippet': specifier: ^2.12.1 - version: 2.12.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + version: 2.14.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) '@github/webauthn-json': specifier: ^2.1.1 version: 2.1.1 '@hope-ui/solid': specifier: 0.6.7 version: 0.6.7(@stitches/core@1.2.8)(solid-js@1.9.12)(solid-transition-group@0.3.0(solid-js@1.9.12)) + '@mediabunny/ac3': + specifier: ^1.40.1 + version: 1.40.1(mediabunny@1.40.1) '@monaco-editor/loader': specifier: 1.7.0 version: 1.7.0 @@ -66,7 +69,7 @@ importers: version: 3.15.1 axios: specifier: ^1.13.6 - version: 1.13.6 + version: 1.14.0 bencode: specifier: ^4.0.0 version: 4.0.0 @@ -105,7 +108,7 @@ importers: version: 2.2.0 katex: specifier: ^0.16.44 - version: 0.16.44 + version: 0.16.45 libass-wasm: specifier: ^4.1.0 version: 4.1.0 @@ -118,6 +121,9 @@ importers: mark.js: specifier: ^8.11.1 version: 8.11.1 + mediabunny: + specifier: ^1.40.1 + version: 1.40.1 mitt: specifier: ^3.0.1 version: 3.0.1 @@ -190,7 +196,7 @@ importers: version: 8.11.12 '@types/node': specifier: ^24.12.0 - version: 24.12.0 + version: 24.12.2 '@types/qrcode': specifier: ^1.5.6 version: 1.5.6 @@ -202,7 +208,7 @@ importers: version: 2.0.5 '@vitejs/plugin-legacy': specifier: ^8.0.1 - version: 8.0.1(terser@5.46.1)(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)) + version: 8.0.1(terser@5.46.1)(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)) cross-env: specifier: ^10.1.0 version: 10.1.0 @@ -238,16 +244,16 @@ importers: version: 11.0.5 vite: specifier: ^8.0.3 - version: 8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3) + version: 8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3) vite-plugin-dynamic-base: specifier: ^1.3.0 - version: 1.3.0(patch_hash=f4fa41ac48d75445f7e2a86a74d6adcb12c3645ca9c6061ddca259d4ffcede77)(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)) + version: 1.3.0(patch_hash=f4fa41ac48d75445f7e2a86a74d6adcb12c3645ca9c6061ddca259d4ffcede77)(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)) vite-plugin-solid: specifier: ^2.11.11 - version: 2.11.11(solid-js@1.9.12)(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)) + version: 2.11.12(solid-js@1.9.12)(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)) vite-plugin-static-copy: specifier: ^3.4.0 - version: 3.4.0(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)) + version: 3.4.0(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)) packages: @@ -307,16 +313,17 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.7': - resolution: {integrity: sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==} + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0 '@babel/helper-define-polyfill-provider@0.6.8': resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} @@ -327,6 +334,10 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.28.5': resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} @@ -359,6 +370,10 @@ packages: resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} @@ -369,6 +384,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.28.6': resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} engines: {node: '>=6.9.0'} @@ -399,8 +420,8 @@ packages: resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} '@babel/parser@7.29.0': @@ -408,11 +429,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} @@ -848,8 +864,8 @@ packages: '@egjs/view360@4.0.0-beta.7': resolution: {integrity: sha512-prVTTxuQ1/k59NM7G0tm58k2vPHGoaExoFr5E7MoJaSGF56Otj4okQHAxxosXH87aQLN0feZMtBlsKz0b/7zEw==} - '@embedpdf/core@2.12.1': - resolution: {integrity: sha512-iiRIW+SZKWm4y3ncQiykiEWmbupU+PbTkXYSjQ8wRE259ROM4mh9GoFntj9l+G+bjdwBPnxk4HuQvgk9wFCYgw==} + '@embedpdf/core@2.14.0': + resolution: {integrity: sha512-Fd26Xs9EIXdgYn3fJU4H1nGugdKXzYG0hG/HGCeze8pSb5Fh1GsNOOKg6lFsglhulwNhei7aaoJCxdYOjt+vZg==} peerDependencies: preact: ^10.26.4 react: '>=16.8.0' @@ -857,8 +873,8 @@ packages: svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/engines@2.12.1': - resolution: {integrity: sha512-EfA6icrJevFdGmKHoflFfGyFNFRVzZ9Ajbas9hWZTv4+3TYOnnvW5OXneI5LBTwN8kkYJsA09BDbsOnka8VW2A==} + '@embedpdf/engines@2.14.0': + resolution: {integrity: sha512-fYK4eRaVydk9zt1cfoXERya68FCmUKFr/eAjXilLjb4pKPt5HBJZlsZsJ/eGGbchDmvJIGo02PBtH5KgAxhA5A==} peerDependencies: preact: ^10.26.4 react: '>=16.8.0' @@ -887,314 +903,325 @@ packages: '@embedpdf/fonts-tc@1.0.0': resolution: {integrity: sha512-rGZJbVD6DYS5BbXdpEMnWkpVF0Knar+bsiyb2o3+YRx7O8eyFubEBQUSUInirQk69HA6fc3GhYCg7TyC/oD76Q==} - '@embedpdf/models@2.12.1': - resolution: {integrity: sha512-/jDnHR+xO78N9y8Iowbfb8RFNuMwjOkxNwar2eJg5IV+jqHRgtCqUSQGL/IEvmvGWzNM1fYqqF+/yVEWs5qFYA==} + '@embedpdf/models@2.14.0': + resolution: {integrity: sha512-MAszh66Phe76oSabj8YMYaNuIKqS8UYBnL841MaTTRYxzfEuLTPrZwzqCDjIb7qUOAW75kWI9x/AdOukDQbHYw==} - '@embedpdf/pdfium@2.12.1': - resolution: {integrity: sha512-DcnqKjW4A+r4lX0918ZgAEUqBsIE6hXOfDIdlBXr5p//EX3SvBZIhObsjx/ze6kPquxzs4G+NEcUhra7TmK9ig==} + '@embedpdf/pdfium@2.14.0': + resolution: {integrity: sha512-yOg1VcIZPXASrzNmS4ZRjo78SUxf9ohey2zTSP7qOR+opMS0OenI/iXtbFGizpZFtk0gfK1Y1HQOxvDpuIiOEw==} - '@embedpdf/plugin-annotation@2.12.1': - resolution: {integrity: sha512-u1mcfmFWL6Qr7P12noinfeEN2R+w5piJtJLkD13mYDsNTIvkS39mWNzX17sAoAynm/W72LxZsPCNc48UOxMF1Q==} + '@embedpdf/plugin-annotation@2.14.0': + resolution: {integrity: sha512-58oUvcAcPw42gTwnvAYOG+0wcqzHJ7WGBdIn5MzKl96j9DKehc4rNr1iR66a5EXysivtSwlkbRByFDhdRAKGEg==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-history': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1 - '@embedpdf/plugin-scroll': 2.12.1 - '@embedpdf/plugin-selection': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-history': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0 + '@embedpdf/plugin-scroll': 2.14.0 + '@embedpdf/plugin-selection': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-attachment@2.12.1': - resolution: {integrity: sha512-+XkZW9Qif7idsS8Fa0WhD7ECJSJ9+64zxGkjKPkbK9LEZsu9y7ppgT+Gr+Ou6FCrL6CXKfpGoOr6RT5rnpOQVg==} + '@embedpdf/plugin-attachment@2.14.0': + resolution: {integrity: sha512-L272eOZvpfeE7h8dDVLLCfaGiIft2d87j/Ply94567rnaVIV+zYTiCwQOBKMyj6rJzihBWYtHPGJLcGBdGVuPw==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-bookmark@2.12.1': - resolution: {integrity: sha512-MXweNn6GjU5I8Hv2W4XlYPHw8TTMnFxAvMAxgDuO5DPnGT1WCx038/YJ83AjPWxQ2NCGvlxtMuxEa04WONXugw==} + '@embedpdf/plugin-bookmark@2.14.0': + resolution: {integrity: sha512-F71L/YaRHNjpeqbkybDvVdFwif9gxoK9KG5ewAJV5n4TabtxDOO0ZlujXu+4SU5RNOqXMV10VluQGSKk4Bz3zw==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-capture@2.12.1': - resolution: {integrity: sha512-DKfolSBoTvhSw9YhmXuCYhVB1ni8gzRhmUV5jAKNdGXHvZ8/9oA3j/rovkMMmxND95EIgfzz0TQuzwImKqj5Yg==} + '@embedpdf/plugin-capture@2.14.0': + resolution: {integrity: sha512-26I/6YEdLWzKo2xIYCUrLOF0M3AlfIGTvlkZDZxc6Vwg8gCmyyFtedxfev8I+xPPPiuXcXsr7uSLOdJRg0L0Jg==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1 - '@embedpdf/plugin-render': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0 + '@embedpdf/plugin-render': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-commands@2.12.1': - resolution: {integrity: sha512-NO/sN3HJh+nJywu4IfuWlGqevEYT5WCSvP0Br/Xp3hwsDJ3avtfp9qd5o9dHSVf6y+wJVFY2YR+4GhSQqYddhg==} + '@embedpdf/plugin-commands@2.14.0': + resolution: {integrity: sha512-1IiDsuLYgHbQ94kVSBSXP5jhTA8FZgj6VDQSzn6j/NYJwBaSJ3lEHcbUtVOWhrqnzMS/MDT3JCLlVMfxxzelUQ==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-document-manager@2.12.1': - resolution: {integrity: sha512-RA23YOD4JQgrzGZFW61vQR+jBOWxEX8oDlURuoqwsNgfP/0s563rA4IkkYVmyS8rK46LROFHLzZDT7ms3YK98w==} + '@embedpdf/plugin-document-manager@2.14.0': + resolution: {integrity: sha512-p/qwPeygrWi6H5YmWxiRQ/PBWMswi/nm22DDQa7HOabQNAI5glHrz5bv1Z7P5dwkupYiz5qCI5ObAbY/WWtEQQ==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-export@2.12.1': - resolution: {integrity: sha512-odxfEVaCyGuho/hjOgfVXwqzcYrJWfHzwrbv2QSkr6b61tC/RiCeIuY4AUw4TYeGxQJNxzkPfOZt37nncHR3wg==} + '@embedpdf/plugin-export@2.14.0': + resolution: {integrity: sha512-QrML9qr5lCBjOOUkBJ88B8sW5olF7szibdo20XMjLSwULW+yGmMJ0M3GgPqT0MlJWu0gZQiMjzx5N8fGPB98aw==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-form@2.12.1': - resolution: {integrity: sha512-FVwNT4TtVdV26kYypa0P9m5l7qR7sMWw4NU809SeE41i1GDE+Mq46j4VakM3hbuj86lH/YQrrC8VXKdRckjQYA==} + '@embedpdf/plugin-form@2.14.0': + resolution: {integrity: sha512-OyMz5NKQnA6I9lrWZ+9+mwpCEpkVDUsWpVQgKkVqvVulWz2skO99sE7c7GbvIzaH/vNmIsmgunDGvN7CACdCMA==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-annotation': 2.12.1 - '@embedpdf/plugin-history': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0 + '@embedpdf/plugin-history': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-fullscreen@2.12.1': - resolution: {integrity: sha512-ZEvirw6WOMm7bv2aanwhBQcAbF915TlXXerCUNHabyND05sfnyOCPV4wqI262iVTEojzLWIgwDcddve8VzVBVw==} + '@embedpdf/plugin-fullscreen@2.14.0': + resolution: {integrity: sha512-C59GLgzCCV1VPZ3Y4S8YVkE9GksVVovdq0FX/XloTlg6wa8sHv26GRfvD12zyFTQ5pAPkcsQG5DV0Gm7ABeoow==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-history@2.12.1': - resolution: {integrity: sha512-+zj0fp1gfn5zf9Khd7OMYmJon4RW/tDn0ZdCgJ6zO2inhLgJ4Xt59D7ld9MioubcgzXfeTAcRINsBQSbR6Mzow==} + '@embedpdf/plugin-history@2.14.0': + resolution: {integrity: sha512-dNbvoECx9IiPHmSGkSrLyr7pPUeDaPBN+piqn9V7mNWJ1UlNngaNsM01IRlCuEBUBexF4DRTiFhP7iKZqGlbyg==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-i18n@2.12.1': - resolution: {integrity: sha512-AT7lujIdFo1uayY9FRRpZCkt6weTVh0t2YXprtmKyRAB7NSK6G2Lq9xcJlGj5z2djlvE4rNf89yUj1HZzzWtVQ==} + '@embedpdf/plugin-i18n@2.14.0': + resolution: {integrity: sha512-hSgyMvshCKrYnnr3sSNmqyK9UUcjcOzfLjUve+exB2onuzKQGdDsP8fFoxOJq+kgFqED1pKd9cI/Ib2Nc2mZRA==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-interaction-manager@2.12.1': - resolution: {integrity: sha512-Z1aYivM48EwTyRJVPHWaV3nIILoQOOm3/WJGvuahEwSjnnaIriAY+S/8RSZ5kmlJOliwYp/3lMGWtYp/jeK2mQ==} + '@embedpdf/plugin-interaction-manager@2.14.0': + resolution: {integrity: sha512-gajd1rbfXl7kyPkKnohoMHEK0BwecKB18ZWl+SnK8Nd/bdm9MaSJZEYfevinO2qqjRmHO28mCz/J5fYlvPimiA==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-pan@2.12.1': - resolution: {integrity: sha512-F93LHYqnbvHjCLh6zd61HQiNYpv+F5SGG6IFiUOSQLmls+yNrHspAsIWdgbkIChwK/GOA1o6M+5qqkuFIDeBvQ==} + '@embedpdf/plugin-pan@2.14.0': + resolution: {integrity: sha512-F9E9xZxZi4omq4S9Pvd/dW2EA/w7qn58SrdARfQQYWbctG1SdENg9RXFFDEbVDwqhVjhaCvWjfEf1r50UVNI6Q==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1 - '@embedpdf/plugin-viewport': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0 + '@embedpdf/plugin-viewport': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-print@2.12.1': - resolution: {integrity: sha512-RWLN0RjJw1loesWBh6B23o/wWKKuXnn2sH/F5NrBRsnuRhYBxhUzMBul1h/MACQQJoHX7jPQ4NW2zCbC/CmlMQ==} + '@embedpdf/plugin-print@2.14.0': + resolution: {integrity: sha512-DZosvbqLDBB/U+bK46IEsr2VdHV29x1gfXsglRBf77ZGr4TQpROEOuSn0dpWtnuI27oqxmMxILHw5i7gWMpgpA==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=18.0.0' react-dom: '>=18.0.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-redaction@2.12.1': - resolution: {integrity: sha512-bEJixVBIRt0XeZJnQ4TJcIX9Tvd083GTDYLNm3wXYBLyydunCzZY0zIeo9e5O17ApXIYibchxaprut+qpSgHhg==} + '@embedpdf/plugin-redaction@2.14.0': + resolution: {integrity: sha512-HAYhLfou4g4F1Kj5hjtFuTU1aJvPcmfVpYs7cQN/GpuDz96NK6pWdyGrZrnOmizyXBpK5o3RYfCz0Hb4gHSsow==} + peerDependencies: + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0 + '@embedpdf/plugin-history': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0 + '@embedpdf/plugin-selection': 2.14.0 + preact: ^10.26.4 + react: '>=16.8.0' + react-dom: '>=16.8.0' + svelte: '>=5 <6' + vue: '>=3.2.0' + + '@embedpdf/plugin-render@2.14.0': + resolution: {integrity: sha512-VcypqFBBypixGiq0dXcxyUO3B05Gae3PafzRrP52uJ0R/PY2IfLQ/eQ6gmRIQpXX1MZ9Q7X1Gm1Ql1iWC8ZAWw==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-annotation': 2.12.1 - '@embedpdf/plugin-history': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1 - '@embedpdf/plugin-selection': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-render@2.12.1': - resolution: {integrity: sha512-IpIrHtpDZFynpLX2eFSbiV0rqSuB+KvjEhchdRYp3DDL/NjUMIvXQw2J1Hy36XiIxqvz0AIXwe+Se1qcbGFvUQ==} + '@embedpdf/plugin-rotate@2.14.0': + resolution: {integrity: sha512-KjGHNXA8C3sXY+lUzEAM+IK1WB1XtO20HyAP6cTkUxIchkDpWuyLjxxSGIfIfVnVfmQb7O4yUZE/Cott9ttxlg==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-rotate@2.12.1': - resolution: {integrity: sha512-I1HKMS1qjLq6u23Xk5/tSP6S43Cy3tMh1zoUsC7Yzht4c9FAOm26fWQpFhs98bp7ojmVs8vWxm7nhUa91ubmfg==} + '@embedpdf/plugin-scroll@2.14.0': + resolution: {integrity: sha512-eQhz+lTMEr/0dPAoavP/HXfUppy1S50YZpt0kn5pHfjPZb1HuWMDUkmq8DCL0BcGnt3wT2m2Z30RK1LEUkyfvA==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-viewport': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-scroll@2.12.1': - resolution: {integrity: sha512-pKEHa9TQqZ4Gyxocb1xL9FK3iJfIn+C8zOeQ+QRUMfMdTiQR5F4M6ily0S+K431xyp0EOzt+qb9+eHSA20Qehw==} + '@embedpdf/plugin-search@2.14.0': + resolution: {integrity: sha512-OoS23d665f4W69zQr0wwVPq2Vh8nQkNzlaH029yTZx/H9hFT22b0Do23wbA0DA3QalvPEfJYbe2sKoHV+qY4ZA==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-viewport': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-search@2.12.1': - resolution: {integrity: sha512-4L9PyDSukLa6/zF/VFjaE9JUrGKOBvXpG5okoF8/r7q/Sfu5OhwIupj0fF+5kJvKovE/zZ59VuwReTLCqmVcrw==} + '@embedpdf/plugin-selection@2.14.0': + resolution: {integrity: sha512-yBrcGHUGCGZayG9O0uK4Cq3QbxIdypaBuFpveAAvLiq6zIrPPJ0iVI07jbTfweGXN/AJLjqTXHriMA4XWU0/7A==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-selection@2.12.1': - resolution: {integrity: sha512-vonDnppopvmE4VXmib9GRhD+PCtAZxfFB2pFWouMTQvCruk+UENVNXesY1S4QdC94A0T83y7NMLLfpVFH4Y2Pw==} + '@embedpdf/plugin-signature@2.14.0': + resolution: {integrity: sha512-RGwgko42oqy1sWFXmLBDE3GuBh/j3vN7+fw2mz6lBSvTlUv5cMUhh0RPmRYFZaj5mSl5rBPeV+kwrivzbC2UjA==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-spread@2.12.1': - resolution: {integrity: sha512-o4hQCy3unMl5UetJz1EslLDfm+RmvlU1Bpvg3n5o9uffAX0hLsL2sv4yIs8O6l0W+XleyWLF8AFKYBGF350mGA==} + '@embedpdf/plugin-spread@2.14.0': + resolution: {integrity: sha512-OGsu5OSJYf1VHtSPBEwMR/BgPmeaol/e5lMEWaaeO4MdLbp5Wl01W/bSbLcz5rYZP1H1XbeXc3QZBAAFULpQqA==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-stamp@2.12.1': - resolution: {integrity: sha512-lifelAmPdvvebrPqRtE44dXLwNV7U2DNtxzEeDnn8jqIcOKONFiYGrMk6WQjQ068VjmRBb30St893KmlruANEQ==} + '@embedpdf/plugin-stamp@2.14.0': + resolution: {integrity: sha512-sCKDGJWcidfBZOxfNVJgmOpErxF3zazuoYWfa1CsDObKtwn1Ci6m2UGQem+Tytm+V9DOqpFvQEWJ/b6uK8CqUA==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-annotation': 2.12.1 - '@embedpdf/plugin-i18n': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0 + '@embedpdf/plugin-i18n': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-thumbnail@2.12.1': - resolution: {integrity: sha512-NnViGAIuPlXIWI6BDf9k901nx6/+e5jHBhFDY73cCe8dX0hUOaKwAvtAWIbYj5LilTyEx7+PPw0otJRqhjaLFQ==} + '@embedpdf/plugin-thumbnail@2.14.0': + resolution: {integrity: sha512-rmyLN+6+Aqyfbnk1CMpxA3+xlMqzK1hvPBFqBVl2tEjwoeeLg63kCAwJXZSUfoowdm1Tbf+UscwBZ3h8jVS4OA==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-render': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-render': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-tiling@2.12.1': - resolution: {integrity: sha512-9A/gcrOe6/iX86IyGeYp17kuwDhJJu/ptdfetFFWzRA9y6wwFBzpBNiCW0EJJfpSaaNU2dhMIE9arrKwrEIk1g==} + '@embedpdf/plugin-tiling@2.14.0': + resolution: {integrity: sha512-cLJSPVArohMlLbUl9ni4NXSCbc0xkInzH13v2dlxcsJ7anQnpvXAuok3kWlvvBJPsmd8eCs0t+Nkxchj1hRISw==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-render': 2.12.1 - '@embedpdf/plugin-scroll': 2.12.1 - '@embedpdf/plugin-viewport': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-render': 2.14.0 + '@embedpdf/plugin-scroll': 2.14.0 + '@embedpdf/plugin-viewport': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-ui@2.12.1': - resolution: {integrity: sha512-XCJ2nOmpiPZqzvGjSQj0qFoTg8si6r7AnX8bnxTPqCLZ7GBpPhJAmBHHTcEU/a1x1Ex2pEiV5+eva21oGxsLcQ==} + '@embedpdf/plugin-ui@2.14.0': + resolution: {integrity: sha512-FPG25+JDOaEBgpE7gWuHWe6QgZxcwNSozx3hMfSWBTs/98pa4fU9pGm3I9maJ2upWuBFQa/q1Cnjzx9h7zPNTg==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-render': 2.12.1 - '@embedpdf/plugin-scroll': 2.12.1 - '@embedpdf/plugin-viewport': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-render': 2.14.0 + '@embedpdf/plugin-scroll': 2.14.0 + '@embedpdf/plugin-viewport': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-viewport@2.12.1': - resolution: {integrity: sha512-xpfbv097/T1h9Ta3VJZrB732kuI7zwrkNmyljppqSh8vuz5iKKOq7fIu7gmrG9huJ66wxU2lSb/6kyWnP4dwiw==} + '@embedpdf/plugin-viewport@2.14.0': + resolution: {integrity: sha512-O7GIm90uMopqvJsBwt4y3Hwry/vVXiegAMubSnlQxbrBhDufDP0CkIvSK7f9wkialBLP+VfrVgZ+ycDFjpWJFw==} peerDependencies: - '@embedpdf/core': 2.12.1 + '@embedpdf/core': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/plugin-zoom@2.12.1': - resolution: {integrity: sha512-XxquyB4sdfR/JkWie5QYPKtgqeFU18MPEKRdxshFeBxgLJS14TlihxN29VLHweYqPI9qKHxqIY+y8F0pzB5mPg==} + '@embedpdf/plugin-zoom@2.14.0': + resolution: {integrity: sha512-BkGim8aUvApZECvmVB4uzkmaD76KenRnJuKMaHVZznGm7BvOHWuX/1sg9zzhF4dvyZRmH0tzIMovUgdn89f9AQ==} peerDependencies: - '@embedpdf/core': 2.12.1 - '@embedpdf/plugin-scroll': 2.12.1 - '@embedpdf/plugin-viewport': 2.12.1 + '@embedpdf/core': 2.14.0 + '@embedpdf/plugin-scroll': 2.14.0 + '@embedpdf/plugin-viewport': 2.14.0 preact: ^10.26.4 react: '>=16.8.0' react-dom: '>=16.8.0' svelte: '>=5 <6' vue: '>=3.2.0' - '@embedpdf/snippet@2.12.1': - resolution: {integrity: sha512-NJchuOsLMUkTc3nT4ygZGNXYZHNlOn0NCVTBodIk2ggZmiRU/u8c6dD9lPUF7OjkPI8uDeYw+vVptF6u2t8PcA==} + '@embedpdf/snippet@2.14.0': + resolution: {integrity: sha512-bQvCp72m0mBFjuBGaI3zfaPOC9KNdhUsAkS60hQSHnBO1wWc1YqsnNytaRQ0LZybOtGrj+h3+j4RfutJwjv3cw==} - '@embedpdf/utils@2.12.1': - resolution: {integrity: sha512-lqT4JrlVjT+81Aqc36903Aa4gae2DoVUJ3sd9IcJ8SoN4FrTKiEczkkvfvCPjqzl2vK/IAq7AHiK2V4cKxyBPw==} + '@embedpdf/utils@2.14.0': + resolution: {integrity: sha512-VIaQ1vDBBQNxYT+1njROIzoEKYcpDxnw8DWnnETl75ZrANIbPZBA07jVYVMT2reh5tO8sVLS0sia5CmVLtm8Qg==} peerDependencies: preact: ^10.26.4 react: '>=16.8.0' @@ -1202,11 +1229,11 @@ packages: svelte: '>=5 <6' vue: '>=3.2.0' - '@emnapi/core@1.9.0': - resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} - '@emnapi/runtime@1.9.0': - resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} @@ -1265,6 +1292,11 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mediabunny/ac3@1.40.1': + resolution: {integrity: sha512-A9aUZnQ1tNia2i9TZjOzAPVi4sOXRsnozXtq3WMsoGbco6yBPgIZLOWPVugwpJMQglVSAPARlgH+chpzNAkHOg==} + peerDependencies: + mediabunny: ^1.0.0 + '@mermaid-js/parser@1.1.0': resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} @@ -1289,8 +1321,8 @@ packages: '@motionone/utils@10.18.0': resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} - '@napi-rs/wasm-runtime@1.1.2': - resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + '@napi-rs/wasm-runtime@1.1.3': + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -1307,106 +1339,106 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.123.0': + resolution: {integrity: sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==} - '@rolldown/binding-android-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} + '@rolldown/binding-android-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.12': - resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + '@rolldown/binding-darwin-x64@1.0.0-rc.13': + resolution: {integrity: sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': - resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': + resolution: {integrity: sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': - resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': + resolution: {integrity: sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': + resolution: {integrity: sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': + resolution: {integrity: sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': - resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': + resolution: {integrity: sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': + resolution: {integrity: sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': + resolution: {integrity: sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.12': - resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + '@rolldown/pluginutils@1.0.0-rc.13': + resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} '@ruffle-rs/ruffle@0.2.0-nightly.2026.3.23': resolution: {integrity: sha512-yAvB3fgN+gWLfr3llUGIpIlgoSj6QVysjrCtM/OP533dutZBZ/Juu6EUykpsVI4/zhjYwKS7t8wwLGBIVGnXcg==} @@ -1685,6 +1717,12 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/dom-mediacapture-transform@0.1.11': + resolution: {integrity: sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==} + + '@types/dom-webcodecs@0.1.13': + resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1712,8 +1750,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@24.12.0': - resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} '@types/qrcode@1.5.6': resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} @@ -1736,10 +1774,6 @@ packages: '@types/webxr@0.5.22': resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} - '@typescript-eslint/types@8.58.0': - resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -1833,8 +1867,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.13.6: - resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + axios@1.14.0: + resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -1845,8 +1879,8 @@ packages: peerDependencies: '@babel/core': ^7.20.12 - babel-plugin-polyfill-corejs2@0.4.16: - resolution: {integrity: sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==} + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1879,11 +1913,15 @@ packages: resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} engines: {node: '>= 0.6.0'} - baseline-browser-mapping@2.10.7: - resolution: {integrity: sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==} + baseline-browser-mapping@2.10.16: + resolution: {integrity: sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==} engines: {node: '>=6.0.0'} hasBin: true + baseline-browser-mapping@2.8.25: + resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + hasBin: true + bencode@4.0.0: resolution: {integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==} engines: {node: '>=12.20.0'} @@ -1906,8 +1944,13 @@ packages: peerDependencies: browserslist: '*' - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1925,8 +1968,11 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001778: - resolution: {integrity: sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==} + caniuse-lite@1.0.30001754: + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + + caniuse-lite@1.0.30001787: + resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2032,8 +2078,8 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - core-js-compat@3.48.0: - resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} core-js@3.49.0: resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} @@ -2265,8 +2311,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.6.4: - resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==} + devalue@5.6.3: + resolution: {integrity: sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2290,9 +2336,8 @@ packages: dompurify@3.2.7: resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} - dompurify@3.3.2: - resolution: {integrity: sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==} - engines: {node: '>=20'} + dompurify@3.3.3: + resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -2301,8 +2346,11 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.313: - resolution: {integrity: sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==} + electron-to-chromium@1.5.249: + resolution: {integrity: sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==} + + electron-to-chromium@1.5.334: + resolution: {integrity: sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2355,8 +2403,8 @@ packages: esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - esrap@2.2.4: - resolution: {integrity: sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg==} + esrap@2.2.3: + resolution: {integrity: sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==} estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -2629,6 +2677,11 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -2645,8 +2698,8 @@ packages: just-once@2.2.0: resolution: {integrity: sha512-Wo547FgUOUZ98jbrZ1KX8nRezdEdtgIlC2NK1u1RvR1oZ/WoU++FjprP8J8hRbaox776MHyeMZZED4DvhhHVjg==} - katex@0.16.44: - resolution: {integrity: sha512-EkxoDTk8ufHqHlf9QxGwcxeLkWRR3iOuYfRpfORgYfqc8s13bgb+YtRY59NK5ZpRaCwq1kqA6a5lpX8C/eLphQ==} + katex@0.16.45: + resolution: {integrity: sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==} hasBin: true khroma@2.1.0: @@ -2858,6 +2911,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mediabunny@1.40.1: + resolution: {integrity: sha512-HU/stGzAkdWaJIly6ypbUVgAUvT9kt39DIg0IaErR7/1fwtTmgUYs4i8uEPYcgcjPjbB9gtBmUXOLnXi6J2LDw==} + meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} @@ -3032,6 +3088,9 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3102,10 +3161,14 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -3126,8 +3189,12 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.9: + resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} engines: {node: ^10 || ^12 || >=14} preact@10.28.2: @@ -3147,8 +3214,9 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} qrcode@1.5.4: resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} @@ -3177,6 +3245,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + regenerate-unicode-properties@10.2.2: resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} @@ -3187,6 +3259,10 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + regexpu-core@6.4.0: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} @@ -3194,8 +3270,12 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + regjsparser@0.13.1: + resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} hasBin: true rehype-katex@7.0.1: @@ -3251,8 +3331,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rolldown@1.0.0-rc.12: - resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + rolldown@1.0.0-rc.13: + resolution: {integrity: sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3440,8 +3520,8 @@ packages: tailwind-merge@3.4.0: resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} - tar@7.5.11: - resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} + tar@7.5.9: + resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} engines: {node: '>=18'} terser@5.46.1: @@ -3449,8 +3529,12 @@ packages: engines: {node: '>=10'} hasBin: true - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} tinyglobby@0.2.15: @@ -3510,6 +3594,10 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + unicode-match-property-value-ecmascript@2.2.1: resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} @@ -3542,6 +3630,12 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -3572,8 +3666,8 @@ packages: peerDependencies: vite: '>= 2.9.5' - vite-plugin-solid@2.11.11: - resolution: {integrity: sha512-YMZCXsLw9kyuvQFEdwLP27fuTQJLmjNoHy90AOJnbRuJ6DwShUxKFo38gdFrWn9v11hnGicKCZEaeI/TFs6JKw==} + vite-plugin-solid@2.11.12: + resolution: {integrity: sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA==} peerDependencies: '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* solid-js: ^1.7.2 @@ -3588,8 +3682,8 @@ packages: peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - vite@8.0.5: - resolution: {integrity: sha512-nmu43Qvq9UopTRfMx2jOYW5l16pb3iDC1JH6yMuPkpVbzK0k+L7dfsEDH4jRgYFmsg0sTAqkojoZgzLMlwHsCQ==} + vite@8.0.7: + resolution: {integrity: sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3722,8 +3816,8 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} - yauzl@3.2.1: - resolution: {integrity: sha512-k1isifdbpNSFEHFJ1ZY4YDewv0IH9FR61lDetaRMD3j2ae3bIXGV+7c+LHCqtQGofSd8PIyV4X6+dHMAnSr60A==} + yauzl@3.2.0: + resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} engines: {node: '>=12'} zimmerframe@1.1.4: @@ -3737,7 +3831,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.5.0 - tinyexec: 1.0.4 + tinyexec: 1.0.2 '@antfu/utils@9.3.0': {} @@ -3783,7 +3877,7 @@ snapshots: '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 + '@babel/helpers': 7.29.2 '@babel/parser': 7.29.0 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 @@ -3821,7 +3915,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.27.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -3829,7 +3923,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -3846,23 +3940,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 + regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.7(@babel/core@7.29.0)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - debug: 4.4.3 - lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': dependencies: @@ -3877,6 +3967,13 @@ snapshots: '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: '@babel/traverse': 7.29.0 @@ -3890,7 +3987,7 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -3907,7 +4004,16 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -3924,6 +4030,8 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': @@ -3935,6 +4043,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -3946,7 +4063,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -3959,7 +4076,7 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: - '@babel/template': 7.28.6 + '@babel/template': 7.27.2 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 transitivePeerDependencies: @@ -3967,10 +4084,10 @@ snapshots: '@babel/helpers@7.28.4': dependencies: - '@babel/template': 7.28.6 + '@babel/template': 7.27.2 '@babel/types': 7.29.0 - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 @@ -3979,15 +4096,11 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -4035,12 +4148,12 @@ snapshots: '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': @@ -4114,7 +4227,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -4138,7 +4251,7 @@ snapshots: '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': dependencies: @@ -4171,7 +4284,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -4198,7 +4311,7 @@ snapshots: '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -4224,7 +4337,7 @@ snapshots: '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -4265,7 +4378,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -4367,7 +4480,7 @@ snapshots: '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': @@ -4444,10 +4557,10 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) - babel-plugin-polyfill-corejs2: 0.4.16(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.48.0 + core-js-compat: 3.49.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -4463,7 +4576,7 @@ snapshots: '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.27.1 '@babel/parser': 7.29.0 '@babel/types': 7.29.0 @@ -4475,11 +4588,11 @@ snapshots: '@babel/traverse@7.28.5': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 + '@babel/template': 7.27.2 '@babel/types': 7.29.0 debug: 4.4.3 transitivePeerDependencies: @@ -4530,8 +4643,8 @@ snapshots: command-exists-promise: 2.0.2 node-fetch: 2.7.0 shelljs: 0.10.0 - tar: 7.5.11 - yauzl: 3.2.1 + tar: 7.5.9 + yauzl: 3.2.0 transitivePeerDependencies: - encoding @@ -4549,17 +4662,17 @@ snapshots: '@types/webxr': 0.5.22 gl-matrix: 3.4.3 - '@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/engines': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/engines': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/engines@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/engines@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: '@embedpdf/fonts-arabic': 1.0.0 '@embedpdf/fonts-hebrew': 1.0.0 @@ -4568,8 +4681,8 @@ snapshots: '@embedpdf/fonts-latin': 1.0.0 '@embedpdf/fonts-sc': 1.0.0 '@embedpdf/fonts-tc': 1.0.0 - '@embedpdf/models': 2.12.1 - '@embedpdf/pdfium': 2.12.1 + '@embedpdf/models': 2.14.0 + '@embedpdf/pdfium': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -4590,344 +4703,356 @@ snapshots: '@embedpdf/fonts-tc@1.0.0': {} - '@embedpdf/models@2.12.1': {} + '@embedpdf/models@2.14.0': {} - '@embedpdf/pdfium@2.12.1': {} + '@embedpdf/pdfium@2.14.0': {} - '@embedpdf/plugin-annotation@2.12.1(8e19351f8628f5fc855de79fbfc05002)': + '@embedpdf/plugin-annotation@2.14.0(2e4efae90ac24190bb2779edf87aa020)': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-history': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-interaction-manager': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-scroll': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-selection': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/utils': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-history': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-interaction-manager': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-scroll': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-selection': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/utils': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-attachment@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-attachment@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-bookmark@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-bookmark@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-capture@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-capture@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-render': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-render': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-commands@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-commands@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-document-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-document-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-export@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-export@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-form@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.12.1(8e19351f8628f5fc855de79fbfc05002))(@embedpdf/plugin-history@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-form@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.14.0(2e4efae90ac24190bb2779edf87aa020))(@embedpdf/plugin-history@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-annotation': 2.12.1(8e19351f8628f5fc855de79fbfc05002) - '@embedpdf/plugin-history': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/utils': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0(2e4efae90ac24190bb2779edf87aa020) + '@embedpdf/plugin-history': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/utils': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-fullscreen@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-fullscreen@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-history@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-history@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-i18n@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-i18n@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-pan@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-pan@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-viewport': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-viewport': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-print@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-print@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-redaction@2.12.1(849ab695afcbe739a895956f54ec5bdd)': + '@embedpdf/plugin-redaction@2.14.0(2e1f65ab1237612df101046d45ab5f23)': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-annotation': 2.12.1(8e19351f8628f5fc855de79fbfc05002) - '@embedpdf/plugin-history': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-interaction-manager': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-selection': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/utils': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0(2e4efae90ac24190bb2779edf87aa020) + '@embedpdf/plugin-history': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-interaction-manager': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-selection': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/utils': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-render@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-render@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-rotate@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-rotate@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-scroll@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-scroll@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-viewport': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-viewport': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-search@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-search@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-selection@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-selection@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-interaction-manager': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/utils': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-interaction-manager': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/utils': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-spread@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-signature@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.14.0(2e4efae90ac24190bb2779edf87aa020))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0(2e4efae90ac24190bb2779edf87aa020) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-stamp@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.12.1(8e19351f8628f5fc855de79fbfc05002))(@embedpdf/plugin-i18n@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-spread@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-annotation': 2.12.1(8e19351f8628f5fc855de79fbfc05002) - '@embedpdf/plugin-i18n': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-thumbnail@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-stamp@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.14.0(2e4efae90ac24190bb2779edf87aa020))(@embedpdf/plugin-i18n@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-render': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0(2e4efae90ac24190bb2779edf87aa020) + '@embedpdf/plugin-i18n': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-tiling@2.12.1(4016b6378b8afd213e1d56b260c75016)': + '@embedpdf/plugin-thumbnail@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-render': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-scroll': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-viewport': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-render': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-ui@2.12.1(4016b6378b8afd213e1d56b260c75016)': + '@embedpdf/plugin-tiling@2.14.0(b458afb969e958c9ab706bcc0269613d)': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-render': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-scroll': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-viewport': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-render': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-scroll': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-viewport': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/plugin-ui@2.14.0(b458afb969e958c9ab706bcc0269613d)': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-render': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-scroll': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-viewport': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/plugin-zoom@2.12.1(616cc596d44b4ecc99e841caf6c498d4)': + '@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/plugin-scroll': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-viewport': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 preact: 10.28.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@embedpdf/snippet@2.12.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': - dependencies: - '@embedpdf/core': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/engines': 2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/models': 2.12.1 - '@embedpdf/pdfium': 2.12.1 - '@embedpdf/plugin-annotation': 2.12.1(8e19351f8628f5fc855de79fbfc05002) - '@embedpdf/plugin-attachment': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-bookmark': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-capture': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-commands': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-document-manager': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-export': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-form': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.12.1(8e19351f8628f5fc855de79fbfc05002))(@embedpdf/plugin-history@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-fullscreen': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-history': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-i18n': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-interaction-manager': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-pan': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-print': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-redaction': 2.12.1(849ab695afcbe739a895956f54ec5bdd) - '@embedpdf/plugin-render': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-rotate': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-scroll': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-search': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-selection': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-spread': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-stamp': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.12.1(8e19351f8628f5fc855de79fbfc05002))(@embedpdf/plugin-i18n@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-thumbnail': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-tiling': 2.12.1(4016b6378b8afd213e1d56b260c75016) - '@embedpdf/plugin-ui': 2.12.1(4016b6378b8afd213e1d56b260c75016) - '@embedpdf/plugin-viewport': 2.12.1(@embedpdf/core@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) - '@embedpdf/plugin-zoom': 2.12.1(616cc596d44b4ecc99e841caf6c498d4) + '@embedpdf/plugin-zoom@2.14.0(f40274209a164366b94d5828223f5427)': + dependencies: + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/plugin-scroll': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-viewport': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + preact: 10.28.2 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + svelte: 5.46.1 + vue: 3.5.26(typescript@5.9.3) + + '@embedpdf/snippet@2.14.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@embedpdf/core': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/engines': 2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/models': 2.14.0 + '@embedpdf/pdfium': 2.14.0 + '@embedpdf/plugin-annotation': 2.14.0(2e4efae90ac24190bb2779edf87aa020) + '@embedpdf/plugin-attachment': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-bookmark': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-capture': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-commands': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-document-manager': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-export': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-form': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.14.0(2e4efae90ac24190bb2779edf87aa020))(@embedpdf/plugin-history@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-fullscreen': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-history': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-i18n': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-interaction-manager': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-pan': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-print': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-redaction': 2.14.0(2e1f65ab1237612df101046d45ab5f23) + '@embedpdf/plugin-render': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-rotate': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-scroll': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-viewport@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-search': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-selection': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-interaction-manager@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-signature': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.14.0(2e4efae90ac24190bb2779edf87aa020))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-spread': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-stamp': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-annotation@2.14.0(2e4efae90ac24190bb2779edf87aa020))(@embedpdf/plugin-i18n@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-thumbnail': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(@embedpdf/plugin-render@2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-tiling': 2.14.0(b458afb969e958c9ab706bcc0269613d) + '@embedpdf/plugin-ui': 2.14.0(b458afb969e958c9ab706bcc0269613d) + '@embedpdf/plugin-viewport': 2.14.0(@embedpdf/core@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)))(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3)) + '@embedpdf/plugin-zoom': 2.14.0(f40274209a164366b94d5828223f5427) preact: 10.28.2 tailwind-merge: 3.4.0 transitivePeerDependencies: @@ -4936,7 +5061,7 @@ snapshots: - svelte - vue - '@embedpdf/utils@2.12.1(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': + '@embedpdf/utils@2.14.0(preact@10.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svelte@5.46.1)(vue@3.5.26(typescript@5.9.3))': dependencies: preact: 10.28.2 react: 19.2.3 @@ -4944,13 +5069,13 @@ snapshots: svelte: 5.46.1 vue: 3.5.26(typescript@5.9.3) - '@emnapi/core@1.9.0': + '@emnapi/core@1.9.1': dependencies: '@emnapi/wasi-threads': 1.2.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.0': + '@emnapi/runtime@1.9.1': dependencies: tslib: 2.8.1 optional: true @@ -5026,6 +5151,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@mediabunny/ac3@1.40.1(mediabunny@1.40.1)': + dependencies: + mediabunny: 1.40.1 + '@mermaid-js/parser@1.1.0': dependencies: langium: 4.2.1 @@ -5069,10 +5198,10 @@ snapshots: hey-listen: 1.0.8 tslib: 2.8.1 - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)': + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': dependencies: - '@emnapi/core': 1.9.0 - '@emnapi/runtime': 1.9.0 + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -5088,59 +5217,58 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.123.0': {} - '@rolldown/binding-android-arm64@1.0.0-rc.12': + '@rolldown/binding-android-arm64@1.0.0-rc.13': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.12': + '@rolldown/binding-darwin-x64@1.0.0-rc.13': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': optional: true - '@rolldown/pluginutils@1.0.0-rc.12': {} + '@rolldown/pluginutils@1.0.0-rc.13': {} '@ruffle-rs/ruffle@0.2.0-nightly.2026.3.23': {} @@ -5295,7 +5423,7 @@ snapshots: '@types/bencode@2.0.4': dependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 '@types/crypto-js@4.2.2': {} @@ -5420,6 +5548,12 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/dom-mediacapture-transform@0.1.11': + dependencies: + '@types/dom-webcodecs': 0.1.13 + + '@types/dom-webcodecs@0.1.13': {} + '@types/estree@1.0.8': {} '@types/geojson@7946.0.16': {} @@ -5446,17 +5580,17 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@24.12.0': + '@types/node@24.12.2': dependencies: undici-types: 7.16.0 '@types/qrcode@1.5.6': dependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 '@types/sha256@0.2.2': dependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 '@types/sizzle@2.3.9': {} @@ -5469,8 +5603,6 @@ snapshots: '@types/webxr@0.5.22': {} - '@typescript-eslint/types@8.58.0': {} - '@ungap/structured-clone@1.3.0': {} '@upsetjs/venn.js@2.0.0': @@ -5480,7 +5612,7 @@ snapshots: '@viselect/vanilla@3.9.0': {} - '@vitejs/plugin-legacy@8.0.1(terser@5.46.1)(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3))': + '@vitejs/plugin-legacy@8.0.1(terser@5.46.1)(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) @@ -5488,20 +5620,20 @@ snapshots: '@babel/preset-env': 7.29.2(@babel/core@7.29.0) babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) - browserslist: 4.28.1 - browserslist-to-esbuild: 2.1.1(browserslist@4.28.1) + browserslist: 4.28.2 + browserslist-to-esbuild: 2.1.1(browserslist@4.28.2) core-js: 3.49.0 magic-string: 0.30.21 regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.46.1 - vite: 8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3) transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.26': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.0 '@vue/shared': 3.5.26 entities: 7.0.1 estree-walker: 2.0.2 @@ -5514,14 +5646,14 @@ snapshots: '@vue/compiler-sfc@3.5.26': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.0 '@vue/compiler-core': 3.5.26 '@vue/compiler-dom': 3.5.26 '@vue/compiler-ssr': 3.5.26 '@vue/shared': 3.5.26 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.8 + postcss: 8.5.6 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.26': @@ -5572,7 +5704,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.2 + picomatch: 2.3.1 aplayer@1.10.1: dependencies: @@ -5596,11 +5728,11 @@ snapshots: asynckit@0.4.0: {} - axios@1.13.6: + axios@1.14.0: dependencies: follow-redirects: 1.15.11 form-data: 4.0.5 - proxy-from-env: 1.1.0 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -5615,11 +5747,11 @@ snapshots: html-entities: 2.3.3 parse5: 7.3.0 - babel-plugin-polyfill-corejs2@0.4.16(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -5628,7 +5760,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.48.0 + core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color @@ -5652,7 +5784,9 @@ snapshots: base64-arraybuffer@1.0.2: {} - baseline-browser-mapping@2.10.7: {} + baseline-browser-mapping@2.10.16: {} + + baseline-browser-mapping@2.8.25: {} bencode@4.0.0: dependencies: @@ -5666,18 +5800,26 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist-to-esbuild@2.1.1(browserslist@4.28.1): + browserslist-to-esbuild@2.1.1(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 meow: 13.2.0 - browserslist@4.28.1: + browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.10.7 - caniuse-lite: 1.0.30001778 - electron-to-chromium: 1.5.313 + baseline-browser-mapping: 2.8.25 + caniuse-lite: 1.0.30001754 + electron-to-chromium: 1.5.249 node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + update-browserslist-db: 1.1.4(browserslist@4.27.0) + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.16 + caniuse-lite: 1.0.30001787 + electron-to-chromium: 1.5.334 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-crc32@0.2.13: {} @@ -5690,7 +5832,9 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001778: {} + caniuse-lite@1.0.30001754: {} + + caniuse-lite@1.0.30001787: {} ccount@2.0.1: {} @@ -5787,9 +5931,9 @@ snapshots: dependencies: toggle-selection: 1.0.6 - core-js-compat@3.48.0: + core-js-compat@3.49.0: dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 core-js@3.49.0: {} @@ -6038,7 +6182,7 @@ snapshots: detect-libc@2.1.2: {} - devalue@5.6.4: {} + devalue@5.6.3: {} devlop@1.1.0: dependencies: @@ -6066,7 +6210,7 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 - dompurify@3.3.2: + dompurify@3.3.3: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -6082,7 +6226,9 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.313: {} + electron-to-chromium@1.5.249: {} + + electron-to-chromium@1.5.334: {} emoji-regex@10.6.0: {} @@ -6119,10 +6265,9 @@ snapshots: esm-env@1.2.2: {} - esrap@2.2.4: + esrap@2.2.3: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@typescript-eslint/types': 8.58.0 estree-walker@2.0.2: {} @@ -6423,6 +6568,8 @@ snapshots: js-tokens@4.0.0: {} + jsesc@3.0.2: {} + jsesc@3.1.0: {} json5@2.2.3: {} @@ -6436,7 +6583,7 @@ snapshots: just-once@2.2.0: {} - katex@0.16.44: + katex@0.16.45: dependencies: commander: 8.3.0 @@ -6521,9 +6668,9 @@ snapshots: dependencies: commander: 14.0.3 listr2: 9.0.5 - picomatch: 4.0.4 + picomatch: 4.0.3 string-argv: 0.3.2 - tinyexec: 1.0.4 + tinyexec: 1.1.1 yaml: 2.8.3 listr2@9.0.5: @@ -6707,6 +6854,11 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mediabunny@1.40.1: + dependencies: + '@types/dom-mediacapture-transform': 0.1.11 + '@types/dom-webcodecs': 0.1.13 + meow@13.2.0: {} merge-anything@5.1.7: @@ -6731,8 +6883,8 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 dayjs: 1.11.19 - dompurify: 3.3.2 - katex: 0.16.44 + dompurify: 3.3.3 + katex: 0.16.45 khroma: 2.1.0 lodash-es: 4.17.23 marked: 16.4.2 @@ -6824,7 +6976,7 @@ snapshots: dependencies: '@types/katex': 0.16.8 devlop: 1.1.0 - katex: 0.16.44 + katex: 0.16.45 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 @@ -6947,7 +7099,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.2 + picomatch: 2.3.1 mime-db@1.52.0: {} @@ -7003,6 +7155,8 @@ snapshots: node-releases@2.0.27: {} + node-releases@2.0.37: {} + normalize-path@3.0.0: {} npm-run-path@4.0.1: @@ -7059,7 +7213,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.1: {} + + picomatch@4.0.3: {} picomatch@4.0.4: {} @@ -7084,7 +7240,13 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - postcss@8.5.8: + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.9: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -7100,7 +7262,7 @@ snapshots: property-information@7.1.0: {} - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} qrcode@1.5.4: dependencies: @@ -7131,7 +7293,11 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.2 + picomatch: 2.3.1 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 regenerate-unicode-properties@10.2.2: dependencies: @@ -7141,18 +7307,31 @@ snapshots: regenerator-runtime@0.14.1: {} + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.13.0 + regjsparser: 0.13.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.13.0: + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + regjsparser@0.13.1: dependencies: jsesc: 3.1.0 @@ -7162,7 +7341,7 @@ snapshots: '@types/katex': 0.16.8 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 - katex: 0.16.44 + katex: 0.16.45 unist-util-visit-parents: 6.0.2 vfile: 6.0.3 @@ -7247,29 +7426,26 @@ snapshots: robust-predicates@3.0.2: {} - rolldown@1.0.0-rc.12(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0): + rolldown@1.0.0-rc.13: dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.12 + '@oxc-project/types': 0.123.0 + '@rolldown/pluginutils': 1.0.0-rc.13 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-x64': 1.0.0-rc.12 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@rolldown/binding-android-arm64': 1.0.0-rc.13 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.13 + '@rolldown/binding-darwin-x64': 1.0.0-rc.13 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.13 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.13 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.13 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.13 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.13 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.13 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.13 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.13 roughjs@4.6.6: dependencies: @@ -7448,9 +7624,9 @@ snapshots: aria-query: 5.3.2 axobject-query: 4.1.0 clsx: 2.1.1 - devalue: 5.6.4 + devalue: 5.6.3 esm-env: 1.2.2 - esrap: 2.2.4 + esrap: 2.2.3 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.21 @@ -7462,7 +7638,7 @@ snapshots: tailwind-merge@3.4.0: {} - tar@7.5.11: + tar@7.5.9: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -7477,7 +7653,9 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - tinyexec@1.0.4: {} + tinyexec@1.0.2: {} + + tinyexec@1.1.1: {} tinyglobby@0.2.15: dependencies: @@ -7522,6 +7700,8 @@ snapshots: unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 + unicode-match-property-value-ecmascript@2.2.0: {} + unicode-match-property-value-ecmascript@2.2.1: {} unicode-property-aliases-ecmascript@2.1.0: {} @@ -7569,9 +7749,15 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.1.4(browserslist@4.27.0): dependencies: - browserslist: 4.28.1 + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -7599,15 +7785,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-plugin-dynamic-base@1.3.0(patch_hash=f4fa41ac48d75445f7e2a86a74d6adcb12c3645ca9c6061ddca259d4ffcede77)(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)): + vite-plugin-dynamic-base@1.3.0(patch_hash=f4fa41ac48d75445f7e2a86a74d6adcb12c3645ca9c6061ddca259d4ffcede77)(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)): dependencies: '@swc/core': 1.12.14 node-html-parser: 5.4.2 - vite: 8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3) transitivePeerDependencies: - '@swc/helpers' - vite-plugin-solid@2.11.11(solid-js@1.9.12)(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)): + vite-plugin-solid@2.11.12(solid-js@1.9.12)(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)): dependencies: '@babel/core': 7.28.5 '@types/babel__core': 7.20.5 @@ -7615,38 +7801,35 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.12 solid-refresh: 0.6.3(solid-js@1.9.12) - vite: 8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3) - vitefu: 1.1.1(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)) + vite: 8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3) + vitefu: 1.1.1(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)) transitivePeerDependencies: - supports-color - vite-plugin-static-copy@3.4.0(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)): + vite-plugin-static-copy@3.4.0(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3) - vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3): + vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.8 - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) + postcss: 8.5.9 + rolldown: 1.0.0-rc.13 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 fsevents: 2.3.3 terser: 5.46.1 yaml: 2.8.3 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - vitefu@1.1.1(vite@8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3)): + vitefu@1.1.1(vite@8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3)): optionalDependencies: - vite: 8.0.5(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@24.12.0)(terser@5.46.1)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(terser@5.46.1)(yaml@2.8.3) vscode-jsonrpc@8.2.0: {} @@ -7733,7 +7916,7 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 - yauzl@3.2.1: + yauzl@3.2.0: dependencies: buffer-crc32: 0.2.13 pend: 1.2.0 diff --git a/public/streamer/mitm.html b/public/streamer/mitm.html index 1ab15adc7..560e55614 100644 --- a/public/streamer/mitm.html +++ b/public/streamer/mitm.html @@ -58,7 +58,7 @@ sw = swReg.active resolve() } - }) + }), ) }) ) @@ -89,7 +89,7 @@ // pass along version for possible backwards compatibility in sw.js data.streamSaverVersion = new URLSearchParams(location.search).get( - "version" + "version", ) if (data.streamSaverVersion === "1.2.0") { @@ -99,7 +99,7 @@ /** @since v2.0.0 */ if (!data.headers) { console.warn( - "[StreamSaver] pass `data.headers` that you would like to pass along to the service worker\nit should be a 2D array or a key/val object that fetch's Headers api accepts" + "[StreamSaver] pass `data.headers` that you would like to pass along to the service worker\nit should be a 2D array or a key/val object that fetch's Headers api accepts", ) } else { // test if it's correct @@ -110,7 +110,7 @@ /** @since v2.0.0 */ if (typeof data.filename === "string") { console.warn( - "[StreamSaver] You shouldn't send `data.filename` anymore. It should be included in the Content-Disposition header option" + "[StreamSaver] You shouldn't send `data.filename` anymore. It should be included in the Content-Disposition header option", ) // Do what File constructor do with fileNames data.filename = data.filename.replace(/\//g, ":") @@ -119,21 +119,21 @@ /** @since v2.0.0 */ if (data.size) { console.warn( - "[StreamSaver] You shouldn't send `data.size` anymore. It should be included in the content-length header option" + "[StreamSaver] You shouldn't send `data.size` anymore. It should be included in the content-length header option", ) } /** @since v2.0.0 */ if (data.readableStream) { console.warn( - "[StreamSaver] You should send the readableStream in the messageChannel, not through mitm" + "[StreamSaver] You should send the readableStream in the messageChannel, not through mitm", ) } /** @since v2.0.0 */ if (!data.pathname) { console.warn( - "[StreamSaver] Please send `data.pathname` (eg: /pictures/summer.jpg)" + "[StreamSaver] Please send `data.pathname` (eg: /pictures/summer.jpg)", ) data.pathname = Math.random().toString().slice(-6) + "/" + data.filename } diff --git a/public/streamer/sw.js b/public/streamer/sw.js index f9df1600c..f8b8d45da 100644 --- a/public/streamer/sw.js +++ b/public/streamer/sw.js @@ -112,7 +112,7 @@ self.onfetch = (event) => { if (headers.has("Content-Disposition")) { responseHeaders.set( "Content-Disposition", - headers.get("Content-Disposition") + headers.get("Content-Disposition"), ) } @@ -131,7 +131,7 @@ self.onfetch = (event) => { .replace(/\*/g, "%2A") responseHeaders.set( "Content-Disposition", - "attachment; filename*=UTF-8''" + fileName + "attachment; filename*=UTF-8''" + fileName, ) } diff --git a/src/app/App.tsx b/src/app/App.tsx index fcc5b25eb..aa8f5c495 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -19,11 +19,17 @@ import { base_path, bus, handleRespWithoutAuthAndNotify, r } from "~/utils" import { MustUser, UserOrGuest } from "./MustUser" import "./index.css" import { globalStyles } from "./theme" +import { MusicPlayer } from "~/pages/media/music/MusicLibrary" +import { RootLayout } from "./RootLayout" const Home = lazy(() => import("~/pages/home/Layout")) const Manage = lazy(() => import("~/pages/manage")) const Login = lazy(() => import("~/pages/login")) const Test = lazy(() => import("~/pages/test")) +const VideoLibrary = lazy(() => import("~/pages/media/video/VideoLibrary")) +const MusicLibrary = lazy(() => import("~/pages/media/music/MusicLibrary")) +const ImageLibrary = lazy(() => import("~/pages/media/image/ImageLibrary")) +const BookLibrary = lazy(() => import("~/pages/media/book/BookLibrary")) const App: Component = () => { const t = useT() @@ -91,11 +97,58 @@ const App: Component = () => { } /> + {/* 带侧边栏的路由:媒体库各页面 */} + + + + + + + } + /> + + + + + + + } + /> + + + + + + + } + /> + + + + + + + } + /> - + + + } /> @@ -103,7 +156,9 @@ const App: Component = () => { path="*" element={ - + + + } /> diff --git a/src/app/RootLayout.tsx b/src/app/RootLayout.tsx new file mode 100644 index 000000000..5ba45cf6f --- /dev/null +++ b/src/app/RootLayout.tsx @@ -0,0 +1,248 @@ +import { + JSX, + createSignal, + onMount, + onCleanup, + createMemo, + Show, +} from "solid-js" +import { + GlobalSidebar, + sidebarCollapsed, + setSidebarCollapsed, +} from "~/components/GlobalSidebar" +import { useColorMode, Icon } from "@hope-ui/solid" +import { TbChevronLeft, TbChevronRight } from "solid-icons/tb" +import { Nav } from "~/pages/home/Nav" +import { Layout } from "~/pages/home/header/layout" +import { TopBarActions } from "~/pages/home/toolbar/Right" +import { useRouter } from "~/hooks" +import { getSetting, objStore, State } from "~/store" +import { BsSearch } from "solid-icons/bs" +import { bus } from "~/utils" + +interface RootLayoutProps { + children: JSX.Element +} + +// ─── 顶栏组件 ──────────────────────────────────────────────── +const TopBar = () => { + const { colorMode } = useColorMode() + const isDark = createMemo(() => colorMode() === "dark") + const { pathname } = useRouter() + + // 只在文件浏览路由下显示面包屑和文件操作 + const isFileBrowser = createMemo(() => !pathname().startsWith("/@media")) + const isFolder = createMemo(() => objStore.state === State.Folder) + + const bg = createMemo(() => + isDark() ? "rgba(15,20,35,0.95)" : "rgba(250,251,253,0.97)", + ) + const borderColor = createMemo(() => + isDark() ? "rgba(255,255,255,0.07)" : "rgba(0,0,0,0.07)", + ) + const textColor = createMemo(() => (isDark() ? "#e2e8f0" : "#1e293b")) + const mutedColor = createMemo(() => (isDark() ? "#64748b" : "#94a3b8")) + + return ( +
+ {/* 面包屑导航 / 页面标题 */} +
+ + 📺 媒体库 + + } + > +
+ + {/* 右侧工具区 */} +
+ {/* 侧边栏收起/展开按钮 */} + + + {/* 搜索按钮和布局切换(仅文件浏览时显示) */} + + {/* 搜索按钮 */} + + + + + {/* 工具操作按钮 */} + + + {/* 布局切换 */} + + + + +
+
+ ) +} + +// ─── 根布局 ────────────────────────────────────────────────── +export const RootLayout = (props: RootLayoutProps) => { + const [isMobile, setIsMobile] = createSignal( + typeof window !== "undefined" ? window.innerWidth < 768 : false, + ) + + onMount(() => { + const handler = () => setIsMobile(window.innerWidth < 768) + window.addEventListener("resize", handler) + onCleanup(() => window.removeEventListener("resize", handler)) + }) + + // 与 GlobalSidebar 中的 sidebarWidth 保持一致:180px / 56px + const marginLeft = createMemo(() => { + if (isMobile()) return "0px" + return sidebarCollapsed() ? "48px" : "120px" + }) + + return ( +
+ + {/* 右侧内容区:自动填充剩余空间 */} +
+ {/* 顶栏 */} + + {/* 页面内容 */} +
+ {props.children} +
+
+
+ ) +} diff --git a/src/components/GlobalSidebar.tsx b/src/components/GlobalSidebar.tsx new file mode 100644 index 000000000..b39df53fc --- /dev/null +++ b/src/components/GlobalSidebar.tsx @@ -0,0 +1,575 @@ +import { + createSignal, + Show, + createMemo, + onMount, + onCleanup, + For, +} from "solid-js" +import { useLocation } from "@solidjs/router" +import { useColorMode, useColorModeValue, Icon, Image } from "@hope-ui/solid" +import { IconTypes } from "solid-icons" +import { + TbFolder, + TbMusic, + TbChevronLeft, + TbChevronRight, + TbMenu2, + TbLayersIntersect, + TbSettings, + TbAdjustments, +} from "solid-icons/tb" +import { BsPlayCircleFill, BsCardImage } from "solid-icons/bs" +import { BiSolidBookContent } from "solid-icons/bi" +import { FiSun, FiMoon } from "solid-icons/fi" +import { joinBase } from "~/utils" +import { getSetting } from "~/store" + +// ─── 导航项定义 ─────────────────────────────────────────────── +interface NavItem { + label: string + path: string + icon: IconTypes + desc: string +} + +const navItems: NavItem[] = [ + { icon: TbFolder, label: "文件", path: "/", desc: "文件管理" }, + { + icon: BsPlayCircleFill, + label: "影视", + path: "/@media/video", + desc: "电影剧集", + }, + { icon: TbMusic, label: "音乐", path: "/@media/music", desc: "专辑歌曲" }, + { icon: BsCardImage, label: "图片", path: "/@media/image", desc: "相册图库" }, + { + icon: BiSolidBookContent, + label: "书籍", + path: "/@media/books", + desc: "图书文档", + }, +] + +// ─── 全局状态(供 RootLayout 读取宽度) ────────────────────── +export const [sidebarCollapsed, setSidebarCollapsed] = createSignal(false) +export const [sidebarVisible, setSidebarVisible] = createSignal(false) + +// ─── 透明模式持久化 ─────────────────────────────────────────── +const TRANSPARENT_KEY = "sidebar_transparent" +const initTransparent = () => { + try { + return localStorage.getItem(TRANSPARENT_KEY) === "true" + } catch { + return false + } +} +export const [sidebarTransparent, setSidebarTransparent] = + createSignal(initTransparent()) + +// ─── 主组件 ────────────────────────────────────────────────── +export const GlobalSidebar = () => { + const location = useLocation() + const { colorMode, toggleColorMode } = useColorMode() + + // 是否暗色模式 + const isDark = createMemo(() => colorMode() === "dark") + + // 移动端检测 + const [isMobile, setIsMobile] = createSignal( + typeof window !== "undefined" ? window.innerWidth < 768 : false, + ) + onMount(() => { + const handler = () => setIsMobile(window.innerWidth < 768) + window.addEventListener("resize", handler) + onCleanup(() => window.removeEventListener("resize", handler)) + }) + + const isVisible = createMemo(() => !isMobile() || sidebarVisible()) + const sidebarWidth = createMemo(() => (sidebarCollapsed() ? "48px" : "130px")) + + // Logo:从设置读取,支持亮/暗两套(与 Header.tsx 保持完全一致) + const logos = getSetting("logo").split("\n") + const logo = useColorModeValue(logos[0], logos.pop()) + // 站点标题:从数据库设置读取 + const siteTitle = getSetting("site_title") + + // ─── 主题色 token(亮/暗自适应) ───────────────────────── + const bg = createMemo(() => { + if (sidebarTransparent()) { + return isDark() ? "rgba(15,20,35,0.55)" : "rgba(255,255,255,0.55)" + } + return isDark() ? "rgba(18,22,36,0.98)" : "rgba(250,251,253,0.98)" + }) + + const borderColor = createMemo(() => + isDark() ? "rgba(255,255,255,0.07)" : "rgba(0,0,0,0.07)", + ) + + const textPrimary = createMemo(() => (isDark() ? "#e2e8f0" : "#1e293b")) + const textSecondary = createMemo(() => (isDark() ? "#64748b" : "#94a3b8")) + const textMuted = createMemo(() => + isDark() ? "rgba(100,116,139,0.5)" : "rgba(148,163,184,0.7)", + ) + + // 激活态:使用品牌蓝而非紫色 + const activeBg = createMemo(() => + isDark() ? "rgba(59,130,246,0.18)" : "rgba(59,130,246,0.10)", + ) + const activeBorder = createMemo(() => + isDark() ? "rgba(59,130,246,0.35)" : "rgba(59,130,246,0.25)", + ) + const activeText = createMemo(() => (isDark() ? "#93c5fd" : "#2563eb")) + const activeBar = createMemo(() => "#3b82f6") + + const hoverBg = createMemo(() => + isDark() ? "rgba(255,255,255,0.05)" : "rgba(0,0,0,0.04)", + ) + const hoverText = createMemo(() => (isDark() ? "#cbd5e1" : "#475569")) + + const btnBg = createMemo(() => + isDark() ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.05)", + ) + const btnBorder = createMemo(() => + isDark() ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.08)", + ) + + const shadowStyle = createMemo(() => + sidebarTransparent() + ? `4px 0 24px rgba(0,0,0,${isDark() ? "0.4" : "0.08"}), inset -1px 0 0 ${borderColor()}` + : `2px 0 16px rgba(0,0,0,${isDark() ? "0.3" : "0.06"}), inset -1px 0 0 ${borderColor()}`, + ) + + // ─── 激活判断 ───────────────────────────────────────────── + const isActive = (path: string) => { + const cur = location.pathname + if (path === "/") return !cur.startsWith("/@media") + return cur.startsWith(path) + } + + // ─── 导航跳转 ───────────────────────────────────────────── + const handleNav = (path: string) => { + window.location.href = joinBase(path) + if (isMobile()) setSidebarVisible(false) + } + + // ─── 系统设置跳转 ───────────────────────────────────────── + const handleSettings = () => { + window.location.href = joinBase("/@manage/settings/site") + if (isMobile()) setSidebarVisible(false) + } + + // ─── 透明模式切换 ───────────────────────────────────────── + const toggleTransparent = () => { + const next = !sidebarTransparent() + setSidebarTransparent(next) + try { + localStorage.setItem(TRANSPARENT_KEY, String(next)) + } catch {} + } + + // ─── 渲染 ───────────────────────────────────────────────── + return ( + <> + {/* 移动端遮罩 */} + +
setSidebarVisible(false)} + style={{ + position: "fixed", + inset: "0", + background: "rgba(0,0,0,0.5)", + "z-index": "99", + "backdrop-filter": "blur(3px)", + }} + /> + + + {/* ══════════════ 侧边栏主体 ══════════════ */} +
+ {/* ── Logo / 标题区 ── */} +
+ +
+ {/* Logo 图片(从设置读取,与 Header 保持一致) */} + + } + /> + {/* 站点标题(从数据库设置读取) */} + + + {siteTitle} + + +
+
+
+ + {/* ── 导航菜单 ── */} + + + {/* ── 底部工具栏 ── */} +
+ {/* 亮/暗模式切换 */} + + + {/* 系统设置 */} + + + {/* 透明模式切换 */} + +
+
+ + {/* ══════════════ 移动端汉堡按钮 ══════════════ */} + + + + + ) +} diff --git a/src/components/artplayer-proxy-mediabunny/AudioEngine.js b/src/components/artplayer-proxy-mediabunny/AudioEngine.js new file mode 100644 index 000000000..129144b48 --- /dev/null +++ b/src/components/artplayer-proxy-mediabunny/AudioEngine.js @@ -0,0 +1,291 @@ +/** + * Audio Engine for MediaBunny + * Handles audio playback using Web Audio API + */ +import { + ALL_FORMATS, + AudioBufferSink, + BlobSource, + Input, + ReadableStreamSource, + UrlSource, +} from "mediabunny" + +export default class AudioEngine { + constructor(events) { + this.events = events + + // MediaBunny instances + this.input = null + this.audioSink = null + this.audioIterator = null + + // Web Audio API + this.audioContext = null + this.gainNode = null + + // Playback state + this.audioContextStartTime = 0 + this.playbackTimeAtStart = 0 + this.latestScheduledEndTime = 0 + this.duration = Number.NaN + this.paused = true + + // Audio settings + this.volume = 0.7 + this.muted = false + this.playbackRate = 1 + + // Async control + this.asyncId = 0 + this.queuedNodes = new Set() + } + + get currentTime() { + if (this.paused) return this.playbackTimeAtStart + + return ( + (this.audioContext.currentTime - this.audioContextStartTime) * + this.playbackRate + + this.playbackTimeAtStart + ) + } + + normalizeSource(src) { + if (typeof src === "string") return new UrlSource(src) + if (src instanceof Blob) return new BlobSource(src) + if ( + typeof ReadableStream !== "undefined" && + src instanceof ReadableStream + ) { + return new ReadableStreamSource(src) + } + return src + } + + ensureAudioContext(sampleRate) { + if (this.audioContext) return + + const AudioContext = window.AudioContext || window.webkitAudioContext + + try { + this.audioContext = new AudioContext({ sampleRate }) + } catch { + this.audioContext = new AudioContext() + } + + this.gainNode = this.audioContext.createGain() + this.gainNode.connect(this.audioContext.destination) + this.updateGain() + } + + updateGain() { + if (!this.gainNode) return + const v = this.muted ? 0 : this.volume + this.gainNode.gain.value = v * v + } + + stopQueuedNodes() { + this.queuedNodes.forEach((node) => node.stop()) + this.queuedNodes.clear() + } + + async stopIterator() { + await this.audioIterator?.return() + this.audioIterator = null + } + + async load(src, onMetadata) { + const id = ++this.asyncId + + await this.stopIterator() + this.stopQueuedNodes() + + this.paused = true + this.playbackTimeAtStart = 0 + this.audioContextStartTime = 0 + + const source = this.normalizeSource(src) + if (!source) return + + this.input = new Input({ + source, + formats: ALL_FORMATS, + }) + + this.duration = await this.input.computeDuration() + if (id !== this.asyncId) return + + const audioTrack = await this.input.getPrimaryAudioTrack() + if (!audioTrack) { + this.audioSink = null + this.ensureAudioContext() + onMetadata?.() + return + } + + if (audioTrack.codec === null || !(await audioTrack.canDecode())) { + this.audioSink = null + this.ensureAudioContext() + onMetadata?.() + return + } + + this.ensureAudioContext(audioTrack.sampleRate) + this.audioSink = new AudioBufferSink(audioTrack) + + onMetadata?.() + } + + async runIterator(localId) { + if (!this.audioSink) return + + await this.stopIterator() + this.audioIterator = this.audioSink.buffers(this.currentTime) + + while (true) { + if (localId !== this.asyncId || this.paused) return + + const nextPromise = this.audioIterator.next() + + // Monitor for buffer starvation + const checkStarvation = setInterval(() => { + if (localId !== this.asyncId || this.paused) { + clearInterval(checkStarvation) + return + } + + if ( + this.audioContext.state === "running" && + this.audioContext.currentTime >= this.latestScheduledEndTime - 0.2 + ) { + this.audioContext.suspend() + this.events.emit("waiting") + } + }, 50) + + let result + try { + result = await nextPromise + } catch (e) { + console.error("Audio iterator error:", e) + break + } finally { + clearInterval(checkStarvation) + } + + if (localId !== this.asyncId || this.paused) return + + // Resume if was suspended + if (this.audioContext.state === "suspended") { + await this.audioContext.resume() + this.events.emit("canplay") + this.events.emit("playing") + } + + if (result.done) break + + const { buffer, timestamp } = result.value + + // Schedule audio buffer + const node = this.audioContext.createBufferSource() + node.buffer = buffer + node.connect(this.gainNode) + node.playbackRate.value = this.playbackRate + + const startAt = + this.audioContextStartTime + + (timestamp - this.playbackTimeAtStart) / this.playbackRate + + const duration = buffer.duration + const endAt = startAt + duration / this.playbackRate + + if (endAt > this.latestScheduledEndTime) { + this.latestScheduledEndTime = endAt + } + + if (startAt >= this.audioContext.currentTime) { + node.start(startAt) + } else { + node.start( + this.audioContext.currentTime, + (this.audioContext.currentTime - startAt) * this.playbackRate, + ) + } + + this.queuedNodes.add(node) + node.onended = () => this.queuedNodes.delete(node) + } + } + + async play() { + if (!this.paused) return + + if (!this.audioContext) { + this.ensureAudioContext() + } + + if (this.audioContext.state === "suspended") { + await this.audioContext.resume() + } + + this.audioContextStartTime = this.audioContext.currentTime + this.latestScheduledEndTime = this.audioContextStartTime + this.paused = false + + const id = ++this.asyncId + this.runIterator(id) + } + + pause() { + if (this.paused) return + + this.playbackTimeAtStart = this.currentTime + this.paused = true + + this.stopIterator() + this.stopQueuedNodes() + } + + async seek(time) { + this.playbackTimeAtStart = Math.max(0, time) + this.audioContextStartTime = this.audioContext.currentTime + this.latestScheduledEndTime = this.audioContextStartTime + + const id = ++this.asyncId + if (!this.paused) { + this.runIterator(id) + } + } + + setVolume(volume, muted) { + this.volume = volume + this.muted = muted + this.updateGain() + } + + setPlaybackRate(rate) { + if (rate === this.playbackRate) return + + if (!this.paused) { + this.playbackTimeAtStart = this.currentTime + this.audioContextStartTime = this.audioContext.currentTime + } + + this.playbackRate = rate + + if (!this.paused) { + const id = ++this.asyncId + this.runIterator(id) + } + } + + destroy() { + this.asyncId++ + this.pause() + this.audioContext?.close() + this.audioContext = null + this.input = null + this.audioSink = null + } +} diff --git a/src/components/artplayer-proxy-mediabunny/EventTarget.js b/src/components/artplayer-proxy-mediabunny/EventTarget.js new file mode 100644 index 000000000..ac260da84 --- /dev/null +++ b/src/components/artplayer-proxy-mediabunny/EventTarget.js @@ -0,0 +1,36 @@ +/** + * Event Target Implementation + * Simple event system for video events + */ +export default class EventTarget { + constructor() { + this.listeners = new Map() + } + + addEventListener(type, fn) { + if (!this.listeners.has(type)) { + this.listeners.set(type, []) + } + this.listeners.get(type).push(fn) + } + + removeEventListener(type, fn) { + const list = this.listeners.get(type) + if (!list) return + + const index = list.indexOf(fn) + if (index >= 0) { + list.splice(index, 1) + } + } + + emit(type, detail) { + const evt = new Event(type) + evt.detail = detail + + const list = this.listeners.get(type) + if (list) { + list.forEach((fn) => fn(evt)) + } + } +} diff --git a/src/components/artplayer-proxy-mediabunny/MediaBunnyEngine.js b/src/components/artplayer-proxy-mediabunny/MediaBunnyEngine.js new file mode 100644 index 000000000..d7101f5fd --- /dev/null +++ b/src/components/artplayer-proxy-mediabunny/MediaBunnyEngine.js @@ -0,0 +1,206 @@ +/** + * Main MediaBunny Engine + * Coordinates audio and video playback + */ +import AudioEngine from "./AudioEngine.js" +import VideoEngine from "./VideoEngine.js" + +export default class MediaBunnyEngine { + constructor({ canvas, ctx, events, option = {} }) { + this.events = events + this.option = option + + // Create audio and video engines + this.audio = new AudioEngine(events) + this.video = new VideoEngine({ + canvas, + ctx, + events, + timeupdateInterval: option.timeupdateInterval ?? 250, + avSyncTolerance: option.avSyncTolerance ?? 0.12, + dropLateFrames: option.dropLateFrames ?? false, + poster: option.poster ?? "", + preflightRange: option.preflightRange ?? false, + }) + + // Playback state + this.paused = true + this.ended = false + this.readyState = 0 + this.networkState = 0 + this.error = null + this.seeking = false + this.loadSeq = 0 + + // Listen to ended event + events.addEventListener?.("ended", () => { + this.ended = true + this.paused = true + }) + } + + async load(src) { + const id = ++this.loadSeq + + this.pause() + this.ended = false + this.error = null + this.networkState = 2 // NETWORK_LOADING + this.readyState = 0 // HAVE_NOTHING + + setTimeout(() => this.events.emit("waiting"), 0) + setTimeout(() => this.events.emit("loadstart"), 0) + + const loadTimeout = Number.isFinite(this.option.loadTimeout) + ? this.option.loadTimeout + : 0 + + try { + await Promise.race([ + this.performLoad(src, id), + loadTimeout > 0 + ? this.createTimeout(loadTimeout) + : new Promise(() => {}), + ]) + } catch (err) { + if (id !== this.loadSeq) return + + this.loadSeq++ + this.error = { code: 4, message: err.message } + this.networkState = 3 // NETWORK_NO_SOURCE + this.events.emit("error") + } + } + + async performLoad(src, id) { + let videoMetadataLoaded = false + let audioMetadataLoaded = false + + const checkMetadata = () => { + if (videoMetadataLoaded && audioMetadataLoaded) { + this.readyState = 1 // HAVE_METADATA + this.events.emit("loadedmetadata") + this.events.emit("durationchange") + this.events.emit("progress") + } + } + + try { + await Promise.all([ + this.video.load(src, () => { + if (id !== this.loadSeq) return + videoMetadataLoaded = true + checkMetadata() + }), + this.audio.load(src, () => { + if (id !== this.loadSeq) return + audioMetadataLoaded = true + checkMetadata() + }), + ]) + + if (id !== this.loadSeq) return + + this.readyState = 4 // HAVE_ENOUGH_DATA + this.networkState = 1 // NETWORK_IDLE + this.events.emit("loadeddata") + this.events.emit("canplay") + this.events.emit("canplaythrough") + this.events.emit("progress") + } catch (err) { + if (id !== this.loadSeq) return + + this.error = { code: 4, message: err.message } + this.networkState = 3 + this.events.emit("error") + console.error("MediaBunny load error:", err) + } + } + + createTimeout(ms) { + return new Promise((_, reject) => { + setTimeout(() => reject(new Error("Load timeout")), ms) + }) + } + + async play() { + if (!this.paused) return + + if (this.ended) { + this.ended = false + await this.seek(0) + } + + this.paused = false + + await this.audio.play() + this.video.start(this.audio) + + this.events.emit("play") + this.events.emit("playing") + } + + pause() { + if (this.paused) return + + this.paused = true + + this.audio.pause() + this.video.stop() + + this.events.emit("pause") + } + + async seek(time) { + const shouldResume = !this.paused + + this.ended = false + this.seeking = true + + this.events.emit("seeking") + this.events.emit("waiting") + + this.pause() + + await Promise.all([this.audio.seek(time), this.video.seek(time)]) + + this.seeking = false + this.events.emit("seeked") + + if (shouldResume && !this.ended) { + await this.play() + } + } + + setVolume(volume, muted) { + this.audio.setVolume(volume, muted) + } + + setPlaybackRate(rate) { + this.audio.setPlaybackRate(rate) + this.video.setPlaybackRate(rate) + } + + destroy() { + this.pause() + this.audio.destroy() + this.video.destroy() + } + + // Getters + get currentTime() { + return this.audio.currentTime + } + + get duration() { + return this.audio.duration || this.video.duration + } + + get videoWidth() { + return this.video.width + } + + get videoHeight() { + return this.video.height + } +} diff --git a/src/components/artplayer-proxy-mediabunny/VideoEngine.js b/src/components/artplayer-proxy-mediabunny/VideoEngine.js new file mode 100644 index 000000000..b8fa0c544 --- /dev/null +++ b/src/components/artplayer-proxy-mediabunny/VideoEngine.js @@ -0,0 +1,352 @@ +/** + * Video Engine for MediaBunny + * Handles video frame rendering and synchronization + */ +import { + ALL_FORMATS, + BlobSource, + CanvasSink, + Input, + ReadableStreamSource, + UrlSource, +} from "mediabunny" + +export default class VideoEngine { + constructor({ + canvas, + ctx, + events, + timeupdateInterval = 250, + avSyncTolerance = 0.12, + dropLateFrames = false, + poster = "", + preflightRange = false, + }) { + this.canvas = canvas + this.ctx = ctx + this.events = events + this.timeupdateInterval = timeupdateInterval + this.avSyncTolerance = avSyncTolerance + this.dropLateFrames = dropLateFrames + this.poster = poster + this.preflightRange = preflightRange + + // MediaBunny instances + this.input = null + this.videoSink = null + this.videoIterator = null + + // Frame rendering + this.nextFrame = null + this.rafId = 0 + this.asyncId = 0 + + // Video properties + this.width = 0 + this.height = 0 + this.duration = Number.NaN + + // Playback state + this.audioClock = null + this.lastTimeUpdate = 0 + this.stalled = false + this.playbackRate = 1 + this.posterDrawn = false + this.isFetching = false + } + + normalizeSource(src) { + if (typeof src === "string") return new UrlSource(src) + if (src instanceof Blob) return new BlobSource(src) + if ( + typeof ReadableStream !== "undefined" && + src instanceof ReadableStream + ) { + return new ReadableStreamSource(src) + } + return src + } + + async preflight(url) { + if (!this.preflightRange || typeof url !== "string") return true + + try { + const res = await fetch(url, { method: "HEAD" }) + const acceptRanges = res.headers.get("accept-ranges") + if (!acceptRanges || acceptRanges === "none") { + this.events.emit("error", new Event("RangeNotSupported")) + return false + } + return true + } catch (e) { + console.warn("Preflight check failed:", e) + return true + } + } + + drawPoster() { + if (!this.poster || this.posterDrawn) return + + const img = new Image() + img.onload = () => { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + this.canvas.width = img.naturalWidth || this.canvas.width + this.canvas.height = img.naturalHeight || this.canvas.height + this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height) + this.posterDrawn = true + } + img.src = this.poster + } + + async stopIterator() { + await this.videoIterator?.return() + this.videoIterator = null + } + + clear() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + } + + async load(src, onMetadata) { + const id = ++this.asyncId + + await this.stopIterator() + this.clear() + this.posterDrawn = false + + if (!(await this.preflight(src))) return + + const source = this.normalizeSource(src) + if (!source) { + this.drawPoster() + return + } + + this.input = new Input({ + source, + formats: ALL_FORMATS, + }) + + this.duration = await this.input.computeDuration() + if (id !== this.asyncId) return + + const videoTrack = await this.input.getPrimaryVideoTrack() + if (!videoTrack) { + this.handleNoVideoTrack() + onMetadata?.() + return + } + + if (videoTrack.codec === null || !(await videoTrack.canDecode())) { + this.handleNoVideoTrack() + onMetadata?.() + return + } + + let transparent = false + try { + transparent = await videoTrack.canBeTransparent() + } catch { + // 某些视频轨道无法检测透明度,默认为不透明 + } + + try { + this.videoSink = new CanvasSink(videoTrack, { + poolSize: 2, + fit: "contain", + alpha: transparent, + }) + } catch (err) { + console.warn("MediaBunny: 无法创建视频渲染器,回退到无视频模式:", err) + this.handleNoVideoTrack() + onMetadata?.() + return + } + + this.width = videoTrack.displayWidth + this.height = videoTrack.displayHeight + + this.canvas.width = this.width + this.canvas.height = this.height + + onMetadata?.() + + try { + await this.resetIterator(0) + } catch (err) { + console.warn("MediaBunny: 视频帧初始化失败,回退到无视频模式:", err) + this.handleNoVideoTrack() + } + } + + handleNoVideoTrack() { + this.videoSink = null + this.width = 0 + this.height = 0 + this.canvas.width = 0 + this.canvas.height = 0 + this.clear() + this.drawPoster() + } + + async resetIterator(time) { + await this.stopIterator() + + if (!this.videoSink) return + + this.videoIterator = this.videoSink.canvases(time) + + try { + const first = (await this.videoIterator.next()).value ?? null + const second = (await this.videoIterator.next()).value ?? null + + this.nextFrame = second + + if (first) { + this.ctx.drawImage(first.canvas, 0, 0) + this.events.emit("loadeddata") + } else { + this.drawPoster() + } + } catch (err) { + console.warn("MediaBunny: 视频帧解码失败:", err) + // 视频解码失败时,停止视频迭代器但不阻止音频播放 + await this.stopIterator() + this.videoSink = null + this.drawPoster() + } + } + + async updateNextFrame(localId) { + if (!this.videoIterator || this.isFetching) return + + this.isFetching = true + try { + while (true) { + let frame + try { + frame = (await this.videoIterator.next()).value ?? null + } catch (err) { + console.warn("MediaBunny: 视频帧解码错误,停止视频渲染:", err) + // VideoDecoder 进入错误状态(如关键帧校验失败)后,迭代器已损坏, + // 继续调用 next() 只会反复抛出同样的错误导致无限循环。 + // 正确做法:中止迭代器,停止视频渲染,允许音频继续播放。 + await this.stopIterator() + this.videoSink = null + this.drawPoster() + return + } + if (!frame || localId !== this.asyncId) return + + const t = this.audioClock.currentTime + const tolerance = this.dropLateFrames + ? Math.max( + 0.06, + this.avSyncTolerance / Math.max(1, this.playbackRate), + ) + : 0 + + if (this.dropLateFrames && frame.timestamp < t - tolerance) { + // Skip late frame + continue + } + + if (frame.timestamp <= t + tolerance) { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + this.ctx.drawImage(frame.canvas, 0, 0) + + if (!this.dropLateFrames && frame.timestamp > t) { + this.nextFrame = null + return + } + } else { + this.nextFrame = frame + return + } + } + } finally { + this.isFetching = false + } + } + + render() { + if (!this.audioClock) return + + const t = this.audioClock.currentTime + const now = Date.now() + + // Emit timeupdate event + if (now - this.lastTimeUpdate >= this.timeupdateInterval) { + this.events.emit("timeupdate") + this.lastTimeUpdate = now + } + + // Check if reached end + if (Number.isFinite(this.duration) && t >= this.duration) { + this.stop() + this.stalled = false + this.events.emit("ended") + this.events.emit("pause") + this.events.emit("canplay") + return + } + + // Render next frame if ready + if (this.nextFrame && this.nextFrame.timestamp <= t) { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + this.ctx.drawImage(this.nextFrame.canvas, 0, 0) + this.nextFrame = null + this.updateNextFrame(this.asyncId) + + if (this.stalled) { + this.events.emit("canplay") + this.events.emit("playing") + this.stalled = false + } + } else if (!this.nextFrame) { + this.updateNextFrame(this.asyncId) + + if ( + !this.nextFrame && + Number.isFinite(this.duration) && + t < this.duration && + !this.stalled + ) { + this.stalled = true + this.events.emit("waiting") + } + } + + this.rafId = requestAnimationFrame(() => this.render()) + } + + start(audioEngine) { + this.audioClock = audioEngine + this.asyncId++ + this.stalled = false + this.updateNextFrame(this.asyncId) + this.rafId = requestAnimationFrame(() => this.render()) + } + + stop() { + cancelAnimationFrame(this.rafId) + } + + async seek(time) { + this.asyncId++ + await this.resetIterator(time) + } + + setPlaybackRate(rate) { + this.playbackRate = Math.max(0.1, Number(rate) || 1) + } + + destroy() { + this.asyncId++ + this.stop() + this.stopIterator() + this.posterDrawn = false + this.input = null + this.videoSink = null + } +} diff --git a/src/components/artplayer-proxy-mediabunny/VideoShim.js b/src/components/artplayer-proxy-mediabunny/VideoShim.js new file mode 100644 index 000000000..64e5ca436 --- /dev/null +++ b/src/components/artplayer-proxy-mediabunny/VideoShim.js @@ -0,0 +1,312 @@ +import EventTarget from "./EventTarget.js" +/** + * Video Element Shim + * Simulates HTMLVideoElement interface for MediaBunny + */ +import MediaBunnyEngine from "./MediaBunnyEngine.js" + +function clamp(v, min, max) { + return Math.max(min, Math.min(max, Number(v) || 0)) +} + +export default class VideoShim { + constructor({ art, canvas, ctx, option }) { + this.art = art + this.canvas = canvas + this.option = option + + // Event system + this.events = new EventTarget() + + // MediaBunny engine + this.engine = new MediaBunnyEngine({ + canvas, + ctx, + events: this.events, + option, + }) + + // Internal state + this._src = null + this._volume = option.volume ?? 0.7 + this._muted = !!option.muted + this._playbackRate = 1 + + // Apply initial volume + this.engine.setVolume(this._volume, this._muted) + + // Forward events to ArtPlayer + this.setupEventForwarding() + + // Auto-load source + if (option.source) { + this.src = option.source + } else if (art.option?.url) { + this.src = art.option.url + } + } + + setupEventForwarding() { + const { events: artEvents } = this.art.constructor.config + artEvents.forEach((name) => { + this.events.addEventListener(name, (e) => { + this.art.emit(`video:${e.type}`, e) + }) + }) + } + + // Event methods + addEventListener(type, fn) { + this.events.addEventListener(type, fn) + } + + removeEventListener(type, fn) { + this.events.removeEventListener(type, fn) + } + + // Source + get src() { + return this._src + } + + set src(v) { + this._src = v + if (v) this.engine.load(v) + } + + get currentSrc() { + return this._src + } + + // Time + get currentTime() { + return this.engine.currentTime + } + + set currentTime(t) { + this.engine.seek(Number(t) || 0) + } + + get duration() { + return this.engine.duration + } + + // Buffered/Played/Seekable + get buffered() { + return this.createTimeRanges(0, this.engine.duration) + } + + get played() { + return this.createTimeRanges(0, this.engine.currentTime) + } + + get seekable() { + return this.createTimeRanges(0, this.engine.duration) + } + + createTimeRanges(start, end) { + const duration = this.engine.duration + if (!duration || Number.isNaN(duration) || end <= 0) { + return { length: 0, start: () => 0, end: () => 0 } + } + return { + length: 1, + start: () => start, + end: () => end, + } + } + + // Playback state + get paused() { + return this.engine.paused + } + + get playing() { + return !this.engine.paused && !this.engine.ended + } + + get ended() { + return this.engine.ended + } + + get seeking() { + return this.engine.seeking + } + + // Ready state + get readyState() { + return this.engine.readyState + } + + get networkState() { + return this.engine.networkState + } + + get error() { + return this.engine.error + } + + // Playback rate + get playbackRate() { + return this._playbackRate + } + + set playbackRate(v) { + const rate = Number(v) + if (Number.isNaN(rate) || rate <= 0) return + + this._playbackRate = rate + this.engine.setPlaybackRate(rate) + this.events.emit("ratechange") + } + + // Volume + get volume() { + return this._volume + } + + set volume(v) { + this._volume = clamp(v, 0, 1) + this._muted = false + this.engine.setVolume(this._volume, this._muted) + this.events.emit("volumechange") + } + + get muted() { + return this._muted + } + + set muted(v) { + this._muted = !!v + this.engine.setVolume(this._volume, this._muted) + this.events.emit("volumechange") + } + + // Playback methods + play() { + return this.engine.play() + } + + pause() { + this.engine.pause() + } + + load() { + if (this._src) this.engine.load(this._src) + } + + // Video dimensions + get videoWidth() { + return this.engine.videoWidth + } + + get videoHeight() { + return this.engine.videoHeight + } + + // Other properties + get poster() { + return this.option.poster || "" + } + + set poster(v) { + this.option.poster = v + } + + get autoplay() { + return this.option.autoplay || false + } + + set autoplay(v) {} + + get loop() { + return this.option.loop || false + } + + set loop(v) {} + + get controls() { + return false + } + + set controls(v) {} + + get playsInline() { + return true + } + + set playsInline(v) {} + + get crossOrigin() { + return this.option.crossOrigin || "" + } + + set crossOrigin(v) {} + + get preload() { + return "auto" + } + + set preload(v) {} + + get defaultMuted() { + return false + } + + set defaultMuted(v) {} + + get defaultPlaybackRate() { + return 1 + } + + set defaultPlaybackRate(v) {} + + // Methods + canPlayType(_type) { + return "maybe" + } + + getBoundingClientRect() { + return this.canvas.getBoundingClientRect() + } + + requestVideoFrameCallback(callback) { + const id = requestAnimationFrame((time) => { + callback(time, { + presentationTime: this.engine.currentTime, + expectedDisplayTime: time + 16.6, + width: this.engine.videoWidth, + height: this.engine.videoHeight, + mediaTime: this.engine.currentTime, + presentedFrames: 0, + processingDuration: 0, + captureTime: time, + receiveTime: time, + rtpTimestamp: 0, + }) + }) + return id + } + + cancelVideoFrameCallback(id) { + cancelAnimationFrame(id) + } + + setAttribute(name, value) { + if (name === "src") { + this.src = value + } else if (name === "autoplay") { + this.autoplay = value + } else if (name === "loop") { + this.loop = value + } else if (name === "muted") { + this.muted = true + } else { + this.canvas.setAttribute(name, value) + } + } + + destroy() { + this.engine.destroy() + } +} diff --git a/src/components/artplayer-proxy-mediabunny/index.d.ts b/src/components/artplayer-proxy-mediabunny/index.d.ts new file mode 100644 index 000000000..733d3a35b --- /dev/null +++ b/src/components/artplayer-proxy-mediabunny/index.d.ts @@ -0,0 +1,80 @@ +import type Artplayer from "artplayer" + +interface Option { + /** + * Timeout for loading media in milliseconds + * @default 0 + */ + loadTimeout?: number + + /** + * Interval for timeupdate events in milliseconds + * @default 250 + */ + timeupdateInterval?: number + + /** + * Audio-video synchronization tolerance in seconds + * @default 0.12 + */ + avSyncTolerance?: number + + /** + * Whether to drop late video frames + * @default false + */ + dropLateFrames?: boolean + + /** + * Poster image URL + */ + poster?: string + + /** + * Media source (URL, Blob, or ReadableStream) + */ + source?: string | Blob | ReadableStream + + /** + * Check if server supports range requests before loading + * @default false + */ + preflightRange?: boolean + + /** + * Initial volume (0-1) + * @default 0.7 + */ + volume?: number + + /** + * Initial muted state + * @default false + */ + muted?: boolean + + /** + * Autoplay + * @default false + */ + autoplay?: boolean + + /** + * Loop playback + * @default false + */ + loop?: boolean + + /** + * Cross-origin setting + */ + crossOrigin?: string +} + +type Result = HTMLCanvasElement + +declare const artplayerProxyMediabunny: ( + option?: Option, +) => (art: Artplayer) => Result + +export default artplayerProxyMediabunny diff --git a/src/components/artplayer-proxy-mediabunny/index.js b/src/components/artplayer-proxy-mediabunny/index.js new file mode 100644 index 000000000..343e40d09 --- /dev/null +++ b/src/components/artplayer-proxy-mediabunny/index.js @@ -0,0 +1,83 @@ +/** + * ArtPlayer MediaBunny Proxy + * Main entry point + */ +import VideoShim from "./VideoShim.js" + +export default function artplayerProxyMediabunny(option = {}) { + return (art) => { + const { constructor } = art + const { createElement } = constructor.utils + + // Create canvas element + const canvas = createElement("canvas") + const ctx = canvas.getContext("2d") + + // Create video shim + const shim = new VideoShim({ + art, + canvas, + ctx, + option, + }) + + // Proxy canvas methods to shim + const originalCanvasMethods = {} + for (const prop in canvas) { + if (typeof canvas[prop] === "function") { + originalCanvasMethods[prop] = canvas[prop].bind(canvas) + } + } + + // Get all properties from shim instance and prototype + const propertyNames = new Set([ + ...Object.getOwnPropertyNames(shim), + ...Object.getOwnPropertyNames(Object.getPrototypeOf(shim)), + ]) + + // Add shim properties to canvas + for (const prop of propertyNames) { + if (prop === "constructor") continue + if (!(prop in canvas)) { + Object.defineProperty(canvas, prop, { + get() { + const value = shim[prop] + return typeof value === "function" ? value.bind(shim) : value + }, + set(v) { + shim[prop] = v + }, + configurable: true, + enumerable: true, + }) + } + } + + // Restore original canvas methods + for (const prop in originalCanvasMethods) { + canvas[prop] = (...args) => originalCanvasMethods[prop](...args) + } + + // Handle resize + function resize() { + const player = art.template?.$player + if (!player || art.option.autoSize) return + + Object.assign(canvas.style, { + width: "100%", + height: "100%", + objectFit: "contain", + }) + } + + art.on("resize", resize) + art.on("video:loadedmetadata", resize) + + // Cleanup on destroy + art.on("destroy", () => { + shim.destroy() + }) + + return canvas + } +} diff --git a/src/hooks/usePath.ts b/src/hooks/usePath.ts index ef37cbc22..0a939df85 100644 --- a/src/hooks/usePath.ts +++ b/src/hooks/usePath.ts @@ -157,6 +157,9 @@ export const usePath = () => { if (size !== undefined && pagination.type === "all") { size = undefined } + if (!append && !onlyList) { + ObjStore.setObjs([]) + } !onlyList && ObjStore.setState(append ? State.FetchingMore : State.FetchingObjs) const resp = await getObjs({ path, index, size, force }) diff --git a/src/lang/en/manage.json b/src/lang/en/manage.json index 5829c6ee7..0f23a94c4 100644 --- a/src/lang/en/manage.json +++ b/src/lang/en/manage.json @@ -27,7 +27,13 @@ "ldap": "LDAP", "s3": "S3", "ftp": "FTP", - "traffic": "Traffic" + "traffic": "Traffic", + "media": "Media Library", + "media_video": "Video", + "media_music": "Music", + "media_image": "Images", + "media_book": "Books", + "media_settings": "Settings" }, "title": "OpenList Management", "not_admin": "You are not an admin user, please login with an admin account.", diff --git a/src/lang/en/settings.json b/src/lang/en/settings.json index d11a06e0b..7d0e0d83b 100755 --- a/src/lang/en/settings.json +++ b/src/lang/en/settings.json @@ -142,5 +142,14 @@ "version": "Version", "video_autoplay": "Video autoplay", "video_types": "Video types", - "webauthn_login_enabled": "WebAuthn login enabled" + "webauthn_login_enabled": "Webauthn login enabled", + "media_tmdb_key": "TMDB API Key", + "media_discogs_token": "Discogs Token", + "media_store_thumbnail": "Store thumbnail", + "media_thumbnail_mode": "Thumbnail storage mode", + "media_thumbnail_modes": { + "base64": "Base64 (Database)", + "local": "Local file" + }, + "media_thumbnail_path": "Thumbnail storage path" } diff --git a/src/pages/home/Body.tsx b/src/pages/home/Body.tsx index a8d032dcc..185af2f02 100644 --- a/src/pages/home/Body.tsx +++ b/src/pages/home/Body.tsx @@ -1,24 +1,13 @@ import { VStack } from "@hope-ui/solid" -import { Nav } from "./Nav" import { Obj } from "./Obj" import { Readme } from "./Readme" -import { Container } from "./Container" import { Sidebar } from "./Sidebar" export const Body = () => { return ( - - +
+ -
) } diff --git a/src/pages/home/Layout.tsx b/src/pages/home/Layout.tsx index d5a485f1b..69184fad5 100644 --- a/src/pages/home/Layout.tsx +++ b/src/pages/home/Layout.tsx @@ -4,7 +4,6 @@ import { getSetting } from "~/store" import { notify } from "~/utils" import { Body } from "./Body" import { Footer } from "./Footer" -import { Header } from "./header/Header" import { Toolbar } from "./toolbar/Toolbar" import { onMount } from "solid-js" @@ -21,12 +20,17 @@ const Index = () => { } }) return ( - <> -
+
- +
) } diff --git a/src/pages/home/previews/aliyun_video.tsx b/src/pages/home/previews/aliyun_video.tsx index 414839249..43853efa7 100644 --- a/src/pages/home/previews/aliyun_video.tsx +++ b/src/pages/home/previews/aliyun_video.tsx @@ -8,6 +8,7 @@ import Artplayer from "artplayer" import { type Option } from "artplayer/types/option" import { type Setting } from "artplayer/types/setting" import { type Events } from "artplayer/types/events" +import artplayerProxyMediabunny from "~/components/artplayer-proxy-mediabunny" import artplayerPluginDanmuku from "artplayer-plugin-danmuku" import { type Option as DanmukuOption } from "artplayer-plugin-danmuku" import artplayerPluginAss from "~/components/artplayer-plugin-ass" @@ -18,6 +19,20 @@ import { ArtPlayerIconsSubtitle } from "~/components/icons" import { useNavigate } from "@solidjs/router" import { TiWarning } from "solid-icons/ti" import "./artplayer.css" +import { registerAc3Decoder } from "@mediabunny/ac3" + +// MediaBunny 播放器开关:从 localStorage 读取用户偏好 +const MEDIABUNNY_KEY = "use_mediabunny_player" +function isMediaBunnyEnabled(): boolean { + return localStorage.getItem(MEDIABUNNY_KEY) === "true" +} +function setMediaBunnyEnabled(enabled: boolean) { + localStorage.setItem(MEDIABUNNY_KEY, enabled ? "true" : "false") +} +// 仅在启用 MediaBunny 时注册 AC3 解码器 +if (isMediaBunnyEnabled()) { + registerAc3Decoder() +} export interface Data { drive_id: string @@ -121,6 +136,7 @@ const Preview = () => { theme: getMainColor(), quality: [], plugins: [AutoHeightPlugin], + ...(isMediaBunnyEnabled() ? { proxy: artplayerProxyMediabunny() } : {}), whitelist: [], screenshot: true, settings: [], @@ -301,6 +317,26 @@ const Preview = () => { }), ) } + // 添加 MediaBunny 播放器开关到设置菜单 + option.settings?.push({ + id: "setting_mediabunny", + html: "MediaBunny 播放器", + tooltip: isMediaBunnyEnabled() ? "已启用" : "已禁用", + icon: '', + switch: isMediaBunnyEnabled(), + onSwitch: function (item: Setting) { + const newVal = !item.switch + setMediaBunnyEnabled(newVal) + item.tooltip = newVal ? "已启用" : "已禁用" + // 提示用户需要刷新页面 + setTimeout(() => { + if (confirm("切换播放器需要刷新页面才能生效,是否立即刷新?")) { + location.reload() + } + }, 100) + return newVal + }, + }) const [loading, post] = useFetch( (): PResp => r.post("/fs/other", { diff --git a/src/pages/home/previews/video.tsx b/src/pages/home/previews/video.tsx index 396b55cf8..95d56fdd2 100644 --- a/src/pages/home/previews/video.tsx +++ b/src/pages/home/previews/video.tsx @@ -8,7 +8,17 @@ import Artplayer from "artplayer" import { type Option } from "artplayer/types/option" import { type Setting } from "artplayer/types/setting" import { type Events } from "artplayer/types/events" +import artplayerProxyMediabunny from "~/components/artplayer-proxy-mediabunny" import artplayerPluginDanmuku from "artplayer-plugin-danmuku" + +// MediaBunny 播放器开关:从 localStorage 读取用户偏好 +const MEDIABUNNY_KEY = "use_mediabunny_player" +function isMediaBunnyEnabled(): boolean { + return localStorage.getItem(MEDIABUNNY_KEY) === "true" +} +function setMediaBunnyEnabled(enabled: boolean) { + localStorage.setItem(MEDIABUNNY_KEY, enabled ? "true" : "false") +} import { type Option as DanmukuOption } from "artplayer-plugin-danmuku" import artplayerPluginAss from "~/components/artplayer-plugin-ass" import mpegts from "mpegts.js" @@ -18,6 +28,11 @@ import { AutoHeightPlugin, VideoBox } from "./video_box" import { ArtPlayerIconsSubtitle } from "~/components/icons" import { useNavigate } from "@solidjs/router" import "./artplayer.css" +import { registerAc3Decoder } from "@mediabunny/ac3" +// 仅在启用 MediaBunny 时注册 AC3 解码器 +if (isMediaBunnyEnabled()) { + registerAc3Decoder() +} const Preview = () => { const { pathname, searchParams } = useRouter() @@ -101,6 +116,7 @@ const Preview = () => { quality: [], // highlight: [], plugins: [AutoHeightPlugin], + ...(isMediaBunnyEnabled() ? { proxy: artplayerProxyMediabunny() } : {}), whitelist: [], settings: [], // subtitle:{} @@ -292,6 +308,27 @@ const Preview = () => { }), ) } + // 添加 MediaBunny 播放器开关到设置菜单 + option.settings?.push({ + id: "setting_mediabunny", + html: "MediaBunny 播放器", + tooltip: isMediaBunnyEnabled() ? "已启用" : "已禁用", + icon: '', + switch: isMediaBunnyEnabled(), + onSwitch: function (item: Setting) { + const newVal = !item.switch + setMediaBunnyEnabled(newVal) + item.tooltip = newVal ? "已启用" : "已禁用" + // 提示用户需要刷新页面 + setTimeout(() => { + if (confirm("切换播放器需要刷新页面才能生效,是否立即刷新?")) { + location.reload() + } + }, 100) + return newVal + }, + }) + onMount(() => { player = new Artplayer(option) let auto_fullscreen: boolean diff --git a/src/pages/home/toolbar/Right.tsx b/src/pages/home/toolbar/Right.tsx index 9ae109fcd..2004deb0a 100644 --- a/src/pages/home/toolbar/Right.tsx +++ b/src/pages/home/toolbar/Right.tsx @@ -1,4 +1,4 @@ -import { Box, createDisclosure, VStack } from "@hope-ui/solid" +import { Box, createDisclosure, HStack, VStack } from "@hope-ui/solid" import { createMemo, Show } from "solid-js" import { RightIcon } from "./Icon" import { CgMoreO } from "solid-icons/cg" @@ -14,180 +14,104 @@ import { Motion } from "solid-motionone" import { isTocVisible, setTocDisabled } from "~/components" import { BiSolidBookContent } from "solid-icons/bi" -export const Right = () => { - const { isOpen, onToggle } = createDisclosure({ - defaultIsOpen: localStorage.getItem("more-open") === "true", - onClose: () => localStorage.setItem("more-open", "false"), - onOpen: () => localStorage.setItem("more-open", "true"), - }) - const margin = createMemo(() => (isOpen() ? "$4" : "$5")) +// ─── 顶栏工具按钮(水平排列,嵌入顶栏使用)──────────────────── +export const TopBarActions = () => { const isFolder = createMemo(() => objStore.state === State.Folder) const { refresh } = usePath() const { isShare } = useRouter() return ( - + + { + refresh(undefined, true) + }} + /> { - onToggle() - }} - /> - } + when={isFolder() && !isShare() && (userCan("write") || objStore.write)} > - - - - { - refresh(undefined, true) - }} - /> - { - bus.emit("tool", "new_file") - }} - /> - { - bus.emit("tool", "mkdir") - }} - /> - - - { - bus.emit("tool", "recursiveMove") - }} - /> - - - { - bus.emit("tool", "removeEmptyDirectory") - }} - /> - - - { - selectAll(true) - bus.emit("tool", "batchRename") - }} - /> - - - { - bus.emit("tool", "upload") - }} - /> - - - { - bus.emit("tool", "offline_download") - }} - /> - - - { - setTocDisabled((disabled) => !disabled) - }} - /> - - - { - bus.emit("tool", "local_settings") - }} - /> - - - + { + bus.emit("tool", "new_file") + }} + /> + { + bus.emit("tool", "mkdir") + }} + /> + { + bus.emit("tool", "recursiveMove") + }} + /> + { + bus.emit("tool", "removeEmptyDirectory") + }} + /> + { + selectAll(true) + bus.emit("tool", "batchRename") + }} + /> + { + bus.emit("tool", "upload") + }} + /> + + + { + bus.emit("tool", "offline_download") + }} + /> + + + { + setTocDisabled((disabled) => !disabled) + }} + /> - + + { + bus.emit("tool", "local_settings") + }} + /> + ) } + +// ─── 原右下角浮动按钮(已迁移到顶栏,保留空组件避免引用报错)──── +export const Right = () => { + return null +} diff --git a/src/pages/manage/media/MediaManage.tsx b/src/pages/manage/media/MediaManage.tsx new file mode 100644 index 000000000..11d5cd064 --- /dev/null +++ b/src/pages/manage/media/MediaManage.tsx @@ -0,0 +1,1709 @@ +import { + createSignal, + createResource, + Show, + For, + createEffect, + onCleanup, +} from "solid-js" +import { + adminGetMediaConfigs, + adminSaveMediaConfig, + adminGetMediaItems, + adminUpdateMediaItem, + adminDeleteMediaItem, + adminStartMediaScan, + adminStartMediaScrape, + adminClearMediaDB, + adminGetMediaScanProgress, + adminListMediaScanPaths, + adminCreateMediaScanPath, + adminUpdateMediaScanPath, + adminDeleteMediaScanPath, + adminClearMediaScanPathDB, +} from "~/utils/media_api" +import type { MediaType, MediaItem, MediaConfig, MediaScanPath } from "~/types" + +// ==================== 通知组件 ==================== +interface ToastProps { + message: string + type: "success" | "error" | "warning" | "info" + onClose: () => void +} + +const Toast = (props: ToastProps) => { + const colors = { + success: { bg: "#f0fdf4", border: "#86efac", text: "#166534", icon: "✓" }, + error: { bg: "#fef2f2", border: "#fca5a5", text: "#991b1b", icon: "✕" }, + warning: { bg: "#fffbeb", border: "#fcd34d", text: "#92400e", icon: "⚠" }, + info: { bg: "#eff6ff", border: "#93c5fd", text: "#1e40af", icon: "ℹ" }, + } + const c = colors[props.type] + return ( +
+ + {c.icon} + + + {props.message} + + +
+ ) +} + +// ==================== 确认弹窗 ==================== +interface ConfirmDialogProps { + title: string + message: string + confirmText?: string + cancelText?: string + type?: "danger" | "warning" | "info" + onConfirm: () => void + onCancel: () => void +} + +const ConfirmDialog = (props: ConfirmDialogProps) => { + const confirmColor = + props.type === "danger" + ? "#ef4444" + : props.type === "warning" + ? "#f59e0b" + : "#6366f1" + return ( +
+
+
+ {props.title} +
+
+ {props.message} +
+
+ + +
+
+
+ ) +} + +// ==================== 通用媒体管理页 ==================== +interface MediaManagePageProps { + mediaType: MediaType + title: string + icon: string +} + +export const MediaManagePage = (props: MediaManagePageProps) => { + // Toast 通知 + const [toast, setToast] = createSignal<{ + message: string + type: "success" | "error" | "warning" | "info" + } | null>(null) + const showToast = ( + message: string, + type: "success" | "error" | "warning" | "info" = "success", + ) => { + setToast({ message, type }) + setTimeout(() => setToast(null), 3500) + } + + // 确认弹窗 + const [confirmDialog, setConfirmDialog] = + createSignal(null) + const showConfirm = (opts: Omit) => + new Promise((resolve) => { + setConfirmDialog({ + ...opts, + onCancel: () => { + setConfirmDialog(null) + resolve(false) + }, + onConfirm: () => { + setConfirmDialog(null) + opts.onConfirm() + resolve(true) + }, + }) + }) + + // 配置状态 + const [config, setConfig] = createSignal({ + media_type: props.mediaType, + enabled: false, + last_scan_at: null, + last_scrape_at: null, + }) + const [configSaving, setConfigSaving] = createSignal(false) + + // 扫描路径状态 + const [scanPaths, setScanPaths] = createSignal([]) + const [showScanPathModal, setShowScanPathModal] = createSignal(false) + const [editingScanPath, setEditingScanPath] = + createSignal | null>(null) + const [scanPathSaving, setScanPathSaving] = createSignal(false) + + // 扫描/刮削状态 + const [scanning, setScanning] = createSignal(false) + const [scraping, setScraping] = createSignal(false) + const [progress, setProgress] = createSignal<{ + status: string + current: number + total: number + } | null>(null) + + // 数据库管理状态 + const [page, setPage] = createSignal(1) + const [pageSize, setPageSize] = createSignal( + props.mediaType === "image" ? 25 : 10, + ) + const [filterScanPathId, setFilterScanPathId] = createSignal(0) + const [filterKeyword, setFilterKeyword] = createSignal("") + const [searchInput, setSearchInput] = createSignal("") + const [editingItem, setEditingItem] = createSignal(null) + const [showEditModal, setShowEditModal] = createSignal(false) + + // 搜索防抖 + let searchTimer: ReturnType | undefined + const handleSearchInput = (value: string) => { + setSearchInput(value) + if (searchTimer) clearTimeout(searchTimer) + searchTimer = setTimeout(() => { + setFilterKeyword(value) + setPage(1) + }, 500) + } + onCleanup(() => { + if (searchTimer) clearTimeout(searchTimer) + }) + + // 加载配置 + const [configData] = createResource( + () => props.mediaType, + async (mt) => { + const resp = await adminGetMediaConfigs() + if (resp.code === 200) { + const found = (resp.data as MediaConfig[]).find( + (c) => c.media_type === mt, + ) + if (found) setConfig(found) + } + return null + }, + ) + + // 加载扫描路径 + const loadScanPaths = async () => { + const resp = await adminListMediaScanPaths(props.mediaType) + if (resp.code === 200) setScanPaths(resp.data as MediaScanPath[]) + } + createEffect(() => { + if (props.mediaType) loadScanPaths() + }) + + // 加载媒体条目 + const [itemsData, { refetch: refetchItems }] = createResource( + () => ({ + media_type: props.mediaType, + page: page(), + page_size: pageSize(), + scan_path_id: filterScanPathId() || undefined, + keyword: filterKeyword() || undefined, + }), + async (params) => { + const resp = await adminGetMediaItems(params) + if (resp.code === 200) return resp.data + return { content: [], total: 0 } + }, + ) + + const items = () => (itemsData()?.content as MediaItem[]) ?? [] + const total = () => itemsData()?.total ?? 0 + const totalPages = () => Math.ceil(total() / pageSize()) + + // 保存配置 + const handleSaveConfig = async () => { + setConfigSaving(true) + const resp = await adminSaveMediaConfig(config()) + setConfigSaving(false) + if (resp.code === 200) showToast("配置保存成功") + else showToast("保存失败: " + resp.message, "error") + } + + // 扫描路径操作 + const handleOpenCreateScanPath = () => { + setEditingScanPath({ + media_type: props.mediaType, + name: "", + path: "/", + path_merge: false, + type_tag: "", + content_tags: "", + enable_scrape: true, + }) + setShowScanPathModal(true) + } + + const handleOpenEditScanPath = (sp: MediaScanPath) => { + setEditingScanPath({ ...sp }) + setShowScanPathModal(true) + } + + const handleSaveScanPath = async () => { + const sp = editingScanPath() + if (!sp) return + setScanPathSaving(true) + let resp + if (sp.id) { + resp = await adminUpdateMediaScanPath( + sp as MediaScanPath & { id: number }, + ) + } else { + resp = await adminCreateMediaScanPath(sp) + } + setScanPathSaving(false) + if (resp.code === 200) { + showToast(sp.id ? "扫描路径已更新" : "扫描路径已创建") + setShowScanPathModal(false) + setEditingScanPath(null) + await loadScanPaths() + } else { + showToast("操作失败: " + resp.message, "error") + } + } + + const handleDeleteScanPath = async (sp: MediaScanPath) => { + showConfirm({ + title: "删除扫描路径", + message: `确定要删除扫描路径「${sp.name || sp.path}」吗?此操作不会删除已扫描的媒体数据。`, + confirmText: "删除", + type: "danger", + onConfirm: async () => { + const resp = await adminDeleteMediaScanPath(sp.id!) + if (resp.code === 200) { + showToast("扫描路径已删除") + await loadScanPaths() + } else { + showToast("删除失败: " + resp.message, "error") + } + }, + }) + } + + const handleClearScanPathDB = async (sp: MediaScanPath) => { + showConfirm({ + title: "清空路径数据", + message: `确定要清空「${sp.name || sp.path}」下的所有媒体数据吗?此操作不可恢复!`, + confirmText: "清空", + type: "danger", + onConfirm: async () => { + const resp = await adminClearMediaScanPathDB(sp.id!) + if (resp.code === 200) { + showToast("路径数据已清空") + refetchItems() + } else { + showToast("清空失败: " + resp.message, "error") + } + }, + }) + } + + // 扫描单个路径 + const handleScanPath = async (sp: MediaScanPath) => { + if (!config().enabled) { + showToast("请先启用该媒体库", "warning") + return + } + setScanning(true) + setProgress({ status: "扫描中...", current: 0, total: 0 }) + await adminStartMediaScan(props.mediaType, sp.id) + const timer = setInterval(async () => { + const resp = await adminGetMediaScanProgress(props.mediaType) + if (resp.code === 200 && resp.data) { + const d = resp.data + setProgress({ + status: d.message || (d.running ? "扫描中..." : "完成"), + current: d.done, + total: d.total, + }) + if (!d.running) { + clearInterval(timer) + setScanning(false) + refetchItems() + showToast("扫描完成") + } + } + }, 1000) + } + + // 扫描全部 + const handleScanAll = async () => { + if (!config().enabled) { + showToast("请先启用该媒体库", "warning") + return + } + setScanning(true) + setProgress({ status: "扫描中...", current: 0, total: 0 }) + await adminStartMediaScan(props.mediaType) + const timer = setInterval(async () => { + const resp = await adminGetMediaScanProgress(props.mediaType) + if (resp.code === 200 && resp.data) { + const d = resp.data + setProgress({ + status: d.message || (d.running ? "扫描中..." : "完成"), + current: d.done, + total: d.total, + }) + if (!d.running) { + clearInterval(timer) + setScanning(false) + refetchItems() + showToast("扫描完成") + } + } + }, 1000) + } + + // 刮削 + const handleScrape = async () => { + setScraping(true) + const resp = await adminStartMediaScrape(props.mediaType) + setScraping(false) + if (resp.code === 200) { + showToast("刮削任务已启动,请稍后刷新查看结果", "info") + refetchItems() + } else { + showToast("刮削失败: " + resp.message, "error") + } + } + + // 清空整个媒体库 + const handleClearAll = async () => { + showConfirm({ + title: `清空 ${props.title} 数据库`, + message: `确定要清空 ${props.title} 的所有媒体数据吗?此操作不可恢复!`, + confirmText: "清空全部", + type: "danger", + onConfirm: async () => { + const resp = await adminClearMediaDB(props.mediaType) + if (resp.code === 200) { + showToast("数据库已清空") + refetchItems() + } else { + showToast("清空失败: " + resp.message, "error") + } + }, + }) + } + + // 保存编辑 + const handleSaveItem = async () => { + if (!editingItem()) return + const resp = await adminUpdateMediaItem(editingItem()!) + if (resp.code === 200) { + showToast("保存成功") + setShowEditModal(false) + setEditingItem(null) + refetchItems() + } else { + showToast("保存失败: " + resp.message, "error") + } + } + + // 删除条目 + const handleDeleteItem = async (id: number, name: string) => { + showConfirm({ + title: "删除媒体条目", + message: `确定删除「${name}」吗?`, + confirmText: "删除", + type: "danger", + onConfirm: async () => { + const resp = await adminDeleteMediaItem(id) + if (resp.code === 200) { + showToast("已删除") + refetchItems() + } else { + showToast("删除失败: " + resp.message, "error") + } + }, + }) + } + + const getScanPathName = (id: number) => { + const sp = scanPaths().find((p) => p.id === id) + return sp ? sp.name || sp.path : "-" + } + + return ( +
+ {/* CSS 动画 */} + + + {/* Toast 通知 */} + + setToast(null)} + /> + + + {/* 确认弹窗 */} + + + + + {/* 页面标题 */} +
+ {props.icon} +
+

+ {props.title}管理 +

+

+ 管理媒体库配置、扫描路径和媒体数据 +

+
+
+ + {/* 基础配置卡片 */} +
+
+ + 基础配置 + +
+
+ {/* 启用开关 */} +
+ + {/* 扫描路径管理 */} +
+
+ + 扫描路径({scanPaths().length} 个) + + +
+ +
+ + + + {[ + "路径名称", + "扫描路径", + "类型标签", + "内容标签", + "路径合并", + "刮削", + "最后扫描", + "操作", + ].map((h) => ( + + ))} + + + + 0} + fallback={ + + + + } + > + + {(sp) => ( + { + e.currentTarget.style.background = "#f8fafc" + }} + onMouseLeave={(e) => { + e.currentTarget.style.background = "transparent" + }} + > + + + + + + + + + + )} + + + +
{h}
+ 暂无扫描路径,点击「添加路径」开始配置 +
+ + {sp.name || "-"} + + + + {sp.path} + + + + + {sp.type_tag} + + + +
+ + {(tag) => ( + + {tag.trim()} + + )} + +
+
+ + {sp.path_merge ? "✓ 是" : "否"} + + + + {sp.enable_scrape ? "✓ 是" : "否"} + + + {sp.last_scan_at + ? new Date(sp.last_scan_at).toLocaleString("zh-CN", { + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + }) + : "从未"} + +
+ + + + +
+
+
+
+ + {/* 数据库管理 */} +
+
+ + 数据库管理(共 {total()} 条) + + {/* 筛选工具栏 */} +
+ + handleSearchInput(e.currentTarget.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + if (searchTimer) clearTimeout(searchTimer) + setFilterKeyword(searchInput()) + setPage(1) + } + }} + style={{ ...inputStyle, width: "160px" }} + /> +
+ + 每页 + + + + {props.mediaType === "image" ? "张" : "条"} + +
+
+
+ +
+ + + + {[ + "文件名", + "名称", + "封面", + "扫描路径", + "发布时间", + "评分", + "隐藏", + "操作", + ].map((h) => ( + + ))} + + + + + + + } + > + + {(item) => ( + { + e.currentTarget.style.background = "#f8fafc" + }} + onMouseLeave={(e) => { + e.currentTarget.style.background = "transparent" + }} + > + + + + + + + + + + )} + + + +
{h}
+ 加载中... +
+
+ {item.file_name} +
+
+
+ {item.scraped_name || item.file_name} +
+
+ + + + + + {getScanPathName(item.scan_path_id)} + + + {item.release_date?.slice(0, 10) || "-"} + + {item.rating > 0 ? item.rating.toFixed(1) : "-"} + +
{ + await adminUpdateMediaItem({ + ...item, + hidden: !item.hidden, + }) + refetchItems() + }} + style={{ + width: "36px", + height: "20px", + "border-radius": "10px", + background: item.hidden ? "#6366f1" : "#d1d5db", + position: "relative", + cursor: "pointer", + transition: "background 0.2s", + }} + > +
+
+
+
+ + +
+
+
+ + {/* 分页 */} + 0}> +
+ + + + 第 {page()} / {totalPages()} 页,共 {total()} 条 + + + +
+
+
+ + {/* 扫描路径编辑弹窗 */} + +
{ + if (e.target === e.currentTarget) setShowScanPathModal(false) + }} + > +
+

+ {editingScanPath()?.id ? "编辑扫描路径" : "添加扫描路径"} +

+
+ + + setEditingScanPath((sp) => ({ + ...sp!, + name: e.currentTarget.value, + })) + } + style={inputStyle} + /> + + + + setEditingScanPath((sp) => ({ + ...sp!, + path: e.currentTarget.value, + })) + } + style={inputStyle} + /> + + + + setEditingScanPath((sp) => ({ + ...sp!, + type_tag: e.currentTarget.value, + })) + } + style={inputStyle} + /> + + + + setEditingScanPath((sp) => ({ + ...sp!, + content_tags: e.currentTarget.value, + })) + } + style={inputStyle} + /> + +
+ + setEditingScanPath((sp) => ({ ...sp!, path_merge: v })) + } + /> + + setEditingScanPath((sp) => ({ ...sp!, enable_scrape: v })) + } + /> +
+
+
+ + +
+
+
+
+ + {/* 媒体条目编辑弹窗 */} + +
{ + if (e.target === e.currentTarget) setShowEditModal(false) + }} + > +
+

编辑媒体信息

+
+ {[ + { key: "scraped_name", label: "名称" }, + { key: "cover", label: "封面URL" }, + { key: "release_date", label: "发布时间 (YYYY-MM-DD)" }, + { key: "genre", label: "类型(逗号分隔)" }, + { key: "authors", label: "作者/演员(JSON数组)" }, + ].map(({ key, label }) => ( + + + setEditingItem((item) => ({ + ...item!, + [key]: e.currentTarget.value, + })) + } + style={inputStyle} + /> + + ))} + + + setEditingItem((item) => ({ + ...item!, + rating: parseFloat(e.currentTarget.value), + })) + } + style={inputStyle} + /> + + +