diff --git a/app/lib/cubits/current_index.dart b/app/lib/cubits/current_index.dart index f59e65e313b9..076affa8262d 100644 --- a/app/lib/cubits/current_index.dart +++ b/app/lib/cubits/current_index.dart @@ -799,6 +799,7 @@ class CurrentIndexCubit extends Cubit { height: size.height.ceil(), width: size.width.ceil(), pixelRatio: ratio, + resolution: resolution, scale: transform.size, x: renderTransform.position.dx, y: renderTransform.position.dy, diff --git a/app/lib/models/viewport.dart b/app/lib/models/viewport.dart index 801756fd6d33..3755356d4413 100644 --- a/app/lib/models/viewport.dart +++ b/app/lib/models/viewport.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:ui' as ui; +import 'package:butterfly/cubits/settings.dart'; import 'package:butterfly/renderers/renderer.dart'; import 'package:butterfly_api/butterfly_api.dart'; import 'package:equatable/equatable.dart'; @@ -17,6 +18,7 @@ class CameraViewport extends Equatable { final double pixelRatio; final double scale; final double x, y; + final RenderResolution resolution; const CameraViewport.unbaked( [this.backgrounds = const [], @@ -32,7 +34,8 @@ class CameraViewport extends Equatable { pixelRatio = 1, x = 0, y = 0, - visibleElements = visibleElements ?? unbakedElements; + visibleElements = visibleElements ?? unbakedElements, + resolution = RenderResolution.performance; const CameraViewport.baked( {this.backgrounds = const [], @@ -47,6 +50,7 @@ class CameraViewport extends Equatable { required this.visibleElements, this.scale = 1, this.x = 0, + required this.resolution, this.y = 0}); get center => null; @@ -61,6 +65,8 @@ class CameraViewport extends Equatable { ui.Rect toRect() => toOffset() & toSize(true); + ui.Size toRealSize() => toSize() / resolution.multiplier; + Area toArea() => Area( name: '', position: toPoint(), @@ -93,6 +99,7 @@ class CameraViewport extends Equatable { y: y, aboveLayerImage: aboveLayerImage, belowLayerImage: belowLayerImage, + resolution: resolution, ); CameraViewport unbake({ @@ -123,6 +130,7 @@ class CameraViewport extends Equatable { double scale = 1, double x = 0, double y = 0, + required RenderResolution resolution, }) => CameraViewport.baked( backgrounds: backgrounds, @@ -138,6 +146,7 @@ class CameraViewport extends Equatable { visibleElements: visibleElements, aboveLayerImage: aboveLayerImage, belowLayerImage: belowLayerImage, + resolution: resolution, ); CameraViewport withoutLayers() => CameraViewport.baked( @@ -154,6 +163,7 @@ class CameraViewport extends Equatable { visibleElements: visibleElements, aboveLayerImage: null, belowLayerImage: null, + resolution: resolution, ); CameraViewport withBackgrounds(List> backgrounds) => @@ -171,6 +181,7 @@ class CameraViewport extends Equatable { visibleElements: visibleElements, aboveLayerImage: aboveLayerImage, belowLayerImage: belowLayerImage, + resolution: resolution, ); @override @@ -188,5 +199,6 @@ class CameraViewport extends Equatable { visibleElements, aboveLayerImage, belowLayerImage, + resolution, ]; } diff --git a/app/lib/selections/file.dart b/app/lib/selections/document.dart similarity index 95% rename from app/lib/selections/file.dart rename to app/lib/selections/document.dart index 09b9397868b1..500815cf6462 100644 --- a/app/lib/selections/file.dart +++ b/app/lib/selections/document.dart @@ -1,7 +1,7 @@ part of 'selection.dart'; -class FileSelection extends Selection { - FileSelection(CurrentIndexCubit cubit) : super([cubit]); +class DocumentSelection extends Selection { + DocumentSelection(CurrentIndexCubit cubit) : super([cubit]); @override IconGetter get icon => PhosphorIcons.wrench; @@ -141,25 +141,23 @@ class _UtilitiesViewState extends State<_UtilitiesView> onPressed: () async { final viewport = state.currentIndexCubit.state.cameraViewport; - final width = viewport.width?.toDouble() ?? - kThumbnailWidth.toDouble(); - final realHeight = viewport.height?.toDouble() ?? - kThumbnailHeight.toDouble(); + final size = viewport.toRealSize(); final height = - width * kThumbnailHeight / kThumbnailWidth; - final heightOffset = (realHeight - height) / 2; - final quality = kThumbnailWidth / width; + size.width * kThumbnailHeight / kThumbnailWidth; + final heightOffset = (size.height - height) / 2; + final quality = kThumbnailWidth / size.width; final thumbnail = await state.currentIndexCubit.render( state.data, state.page, state.info, ImageExportOptions( - width: width, + width: size.width, height: height, quality: quality, scale: viewport.scale, - x: viewport.x, - y: viewport.y + heightOffset, + x: viewport.x + size.width / viewport.scale, + y: viewport.y + + (heightOffset + size.height) / viewport.scale, ), ); if (thumbnail == null) return; diff --git a/app/lib/selections/selection.dart b/app/lib/selections/selection.dart index 3f05bee22ff3..0e0471207889 100644 --- a/app/lib/selections/selection.dart +++ b/app/lib/selections/selection.dart @@ -44,7 +44,7 @@ part 'properties/path.dart'; part 'properties/pen.dart'; part 'area.dart'; -part 'file.dart'; +part 'document.dart'; abstract class Selection { List _selected; @@ -64,7 +64,7 @@ abstract class Selection { return AreaSelection([selected]) as Selection; } if (selected is CurrentIndexCubit) { - return FileSelection(selected) as Selection; + return DocumentSelection(selected) as Selection; } throw UnsupportedError('Unsupported selection type: $T'); } diff --git a/app/lib/views/zoom.dart b/app/lib/views/zoom.dart index 24b9b9da11c9..b633c3c0b1f0 100644 --- a/app/lib/views/zoom.dart +++ b/app/lib/views/zoom.dart @@ -86,10 +86,10 @@ class _ZoomViewState extends State with TickerProviderStateMixin { if (state is! DocumentLoaded) { return; } - final viewport = currentIndex.cameraViewport; + final size = currentIndex.cameraViewport.toRealSize(); final center = Offset( - (viewport.width ?? 0) / 2, - (viewport.height ?? 0) / 2, + size.width / 2, + size.height / 2, ); currentIndex.transformCubit.size(value, center); if (bake) { diff --git a/app/pubspec.lock b/app/pubspec.lock index 6e38957b5a41..a93d39efda74 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1225,10 +1225,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "3c7e73920c694a436afaf65ab60ce3453d91f84208d761fbd83fc21182134d93" + sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.5" shared_preferences_android: dependency: transitive description: diff --git a/docs/package.json b/docs/package.json index 3b615a6fd1dc..d3e8dac6b7aa 100644 --- a/docs/package.json +++ b/docs/package.json @@ -16,7 +16,7 @@ "@phosphor-icons/react": "^2.1.7", "@types/react": "^19.0.2", "@types/react-dom": "^19.0.2", - "astro": "^5.1.1", + "astro": "^5.1.2", "react": "^19.0.0", "react-dom": "^19.0.0", "remark-gemoji": "^8.0.0", diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index c02a46adede8..c9102c6dd9ca 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 4.1.2(@types/react-dom@19.0.2(@types/react@19.0.2))(@types/react@19.0.2)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0)(terser@5.37.0)(yaml@2.7.0) '@astrojs/starlight': specifier: ^0.30.3 - version: 0.30.3(astro@5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)) + version: 0.30.3(astro@5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)) '@phosphor-icons/react': specifier: ^2.1.7 version: 2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -27,8 +27,8 @@ importers: specifier: ^19.0.2 version: 19.0.2(@types/react@19.0.2) astro: - specifier: ^5.1.1 - version: 5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) + specifier: ^5.1.2 + version: 5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) react: specifier: ^19.0.0 version: 19.0.0 @@ -895,17 +895,23 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.24.4': - resolution: {integrity: sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==} + '@shikijs/core@1.25.1': + resolution: {integrity: sha512-0j5k3ZkLTQViOuNzPVyWGoW1zgH3kiFdUT/JOCkTm7TU74mz+dF+NID+YoiCBzHQxgsDpcGYPjKDJRcuVLSt4A==} - '@shikijs/engine-javascript@1.24.4': - resolution: {integrity: sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==} + '@shikijs/engine-javascript@1.25.1': + resolution: {integrity: sha512-zQ7UWKnRCfD/Q1M+XOSyjsbhpE0qv8LUnmn82HYCeOsgAHgUZGEDIQ63bbuK3kU5sQg+2CtI+dPfOqD/mjSY9w==} - '@shikijs/engine-oniguruma@1.24.4': - resolution: {integrity: sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==} + '@shikijs/engine-oniguruma@1.25.1': + resolution: {integrity: sha512-iKPMh3H+0USHtWfZ1irfMTH6tGmIUFSnqt3E2K8BgI1VEsqiPh0RYkG2WTwzNiM1/WHN4FzYx/nrKR7PDHiRyw==} - '@shikijs/types@1.24.4': - resolution: {integrity: sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==} + '@shikijs/langs@1.25.1': + resolution: {integrity: sha512-hdYjq9aRJplAzGe2qF51PR9IDgEoyGb4IkXvr3Ts6lEdg4Z8M/kdknKRo2EIuv3IR/aKkJXTlBQRM+wr3t20Ew==} + + '@shikijs/themes@1.25.1': + resolution: {integrity: sha512-JO0lDn4LgGqg5QKvgich5ScUmC2okK+LxM9a3iLUH7YMeI2c8UGXThuJv6sZduS7pdJbYQHPrvWq9t/V4GhpbQ==} + + '@shikijs/types@1.25.1': + resolution: {integrity: sha512-dceqFUoO95eY4tpOj3OGq8wE8EgJ4ey6Me1HQEu5UbwIYszFndEll/bjlB8Kp9wl4fx3uM7n4+y9XCYuDBmcXA==} '@shikijs/vscode-textmate@9.3.1': resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} @@ -1071,8 +1077,8 @@ packages: peerDependencies: astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 - astro@5.1.1: - resolution: {integrity: sha512-prpWC2PRs4P3FKQg6gZaU+VNMqbZi5pDvORGB2nrjfRjkrvF6/l4BqhvkJ6YQ0Ohm5rIMVz8ljgaRI77mLHbwg==} + astro@5.1.2: + resolution: {integrity: sha512-+U5lXPEJZ6cQx0botGbPhzN6XGWRgDtXgy/RUkpTmUj18LW6pbzYo0O0k3hFWOazlI039bZ+4P2e/oSNlKzm0Q==} engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -1865,8 +1871,8 @@ packages: ohash@1.1.4: resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} - oniguruma-to-es@0.8.1: - resolution: {integrity: sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==} + oniguruma-to-es@0.10.0: + resolution: {integrity: sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -2131,8 +2137,8 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shiki@1.24.4: - resolution: {integrity: sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==} + shiki@1.25.1: + resolution: {integrity: sha512-/1boRvNYwRW3GLG9Y6dXdnZ/Ha+J5T/5y3hV7TGQUcDSBM185D3FCbXlz2eTGNKG2iWCbWqo+P0yhGKZ4/CUrw==} simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -2415,8 +2421,8 @@ packages: yaml: optional: true - vitefu@1.0.4: - resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} + vitefu@1.0.5: + resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: @@ -2672,7 +2678,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.1 remark-smartypants: 3.0.2 - shiki: 1.24.4 + shiki: 1.25.1 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 @@ -2681,12 +2687,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.0.3(astro@5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0))': + '@astrojs/mdx@4.0.3(astro@5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0))': dependencies: '@astrojs/markdown-remark': 6.0.1 '@mdx-js/mdx': 3.1.0(acorn@8.14.0) acorn: 8.14.0 - astro: 5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) + astro: 5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) es-module-lexer: 1.6.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.4 @@ -2733,16 +2739,16 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.24.1 - '@astrojs/starlight@0.30.3(astro@5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0))': + '@astrojs/starlight@0.30.3(astro@5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0))': dependencies: - '@astrojs/mdx': 4.0.3(astro@5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)) + '@astrojs/mdx': 4.0.3(astro@5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)) '@astrojs/sitemap': 3.2.1 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) - astro-expressive-code: 0.38.3(astro@5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)) + astro: 5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) + astro-expressive-code: 0.38.3(astro@5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.3 @@ -3086,7 +3092,7 @@ snapshots: '@expressive-code/plugin-shiki@0.38.3': dependencies: '@expressive-code/core': 0.38.3 - shiki: 1.24.4 + shiki: 1.25.1 '@expressive-code/plugin-text-markers@0.38.3': dependencies: @@ -3382,27 +3388,35 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.29.1': optional: true - '@shikijs/core@1.24.4': + '@shikijs/core@1.25.1': dependencies: - '@shikijs/engine-javascript': 1.24.4 - '@shikijs/engine-oniguruma': 1.24.4 - '@shikijs/types': 1.24.4 + '@shikijs/engine-javascript': 1.25.1 + '@shikijs/engine-oniguruma': 1.25.1 + '@shikijs/types': 1.25.1 '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@1.24.4': + '@shikijs/engine-javascript@1.25.1': dependencies: - '@shikijs/types': 1.24.4 + '@shikijs/types': 1.25.1 '@shikijs/vscode-textmate': 9.3.1 - oniguruma-to-es: 0.8.1 + oniguruma-to-es: 0.10.0 - '@shikijs/engine-oniguruma@1.24.4': + '@shikijs/engine-oniguruma@1.25.1': dependencies: - '@shikijs/types': 1.24.4 + '@shikijs/types': 1.25.1 '@shikijs/vscode-textmate': 9.3.1 - '@shikijs/types@1.24.4': + '@shikijs/langs@1.25.1': + dependencies: + '@shikijs/types': 1.25.1 + + '@shikijs/themes@1.25.1': + dependencies: + '@shikijs/types': 1.25.1 + + '@shikijs/types@1.25.1': dependencies: '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 @@ -3591,12 +3605,12 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.38.3(astro@5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)): + astro-expressive-code@0.38.3(astro@5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0)): dependencies: - astro: 5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) + astro: 5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0) rehype-expressive-code: 0.38.3 - astro@5.1.1(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0): + astro@5.1.2(jiti@2.4.2)(rollup@4.29.1)(sass@1.83.0)(terser@5.37.0)(typescript@5.7.2)(yaml@2.7.0): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.2 @@ -3641,7 +3655,7 @@ snapshots: prompts: 2.4.2 rehype: 13.0.2 semver: 7.6.3 - shiki: 1.24.4 + shiki: 1.25.1 tinyexec: 0.3.2 tsconfck: 3.1.4(typescript@5.7.2) ultrahtml: 1.5.3 @@ -3649,7 +3663,7 @@ snapshots: unstorage: 1.14.4 vfile: 6.0.3 vite: 6.0.6(jiti@2.4.2)(sass@1.83.0)(terser@5.37.0)(yaml@2.7.0) - vitefu: 1.0.4(vite@6.0.6(jiti@2.4.2)(sass@1.83.0)(terser@5.37.0)(yaml@2.7.0)) + vitefu: 1.0.5(vite@6.0.6(jiti@2.4.2)(sass@1.83.0)(terser@5.37.0)(yaml@2.7.0)) which-pm: 3.0.0 xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 @@ -4880,7 +4894,7 @@ snapshots: ohash@1.1.4: {} - oniguruma-to-es@0.8.1: + oniguruma-to-es@0.10.0: dependencies: emoji-regex-xs: 1.0.0 regex: 5.1.1 @@ -5268,12 +5282,14 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - shiki@1.24.4: + shiki@1.25.1: dependencies: - '@shikijs/core': 1.24.4 - '@shikijs/engine-javascript': 1.24.4 - '@shikijs/engine-oniguruma': 1.24.4 - '@shikijs/types': 1.24.4 + '@shikijs/core': 1.25.1 + '@shikijs/engine-javascript': 1.25.1 + '@shikijs/engine-oniguruma': 1.25.1 + '@shikijs/langs': 1.25.1 + '@shikijs/themes': 1.25.1 + '@shikijs/types': 1.25.1 '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 @@ -5505,7 +5521,7 @@ snapshots: terser: 5.37.0 yaml: 2.7.0 - vitefu@1.0.4(vite@6.0.6(jiti@2.4.2)(sass@1.83.0)(terser@5.37.0)(yaml@2.7.0)): + vitefu@1.0.5(vite@6.0.6(jiti@2.4.2)(sass@1.83.0)(terser@5.37.0)(yaml@2.7.0)): optionalDependencies: vite: 6.0.6(jiti@2.4.2)(sass@1.83.0)(terser@5.37.0)(yaml@2.7.0) diff --git a/metadata/en-US/changelogs/127.txt b/metadata/en-US/changelogs/127.txt index b3ffbc6451d7..cc6473145ed7 100644 --- a/metadata/en-US/changelogs/127.txt +++ b/metadata/en-US/changelogs/127.txt @@ -17,5 +17,6 @@ * Fix undo/redo tools not showing status correctly * Fix grid not working correctly * Fix capture thumbnail uses wrong position +* Fix zoom slider is not centered Read more here: https://linwood.dev/butterfly/2.3.0-beta.0 \ No newline at end of file