diff --git a/invokeai/frontend/web/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx b/invokeai/frontend/web/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx
index e815b962e5..3d625baae5 100644
--- a/invokeai/frontend/web/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx
+++ b/invokeai/frontend/web/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx
@@ -1,3 +1,4 @@
+import type { SystemStyleObject } from '@invoke-ai/ui-library';
import {
$shift,
CompositeSlider,
@@ -16,7 +17,6 @@ import { useStore } from '@nanostores/react';
import { useCanvasManager } from 'features/controlLayers/contexts/CanvasManagerProviderGate';
import { snapToNearest } from 'features/controlLayers/konva/util';
import { round } from 'lodash-es';
-import { computed } from 'nanostores';
import type { KeyboardEvent } from 'react';
import { memo, useCallback, useEffect, useState } from 'react';
import { PiCaretDownBold, PiMagnifyingGlassMinusBold, PiMagnifyingGlassPlusBold } from 'react-icons/pi';
@@ -68,9 +68,16 @@ const sliderDefaultValue = mapRawValueToSliderValue(100);
const snapCandidates = marks.slice(1, marks.length - 1);
+const inputFieldSx = {
+ paddingInlineEnd: 7,
+ _focusVisible: {
+ zIndex: 0,
+ },
+} satisfies SystemStyleObject;
+
export const CanvasToolbarScale = memo(() => {
const canvasManager = useCanvasManager();
- const scale = useStore(computed(canvasManager.stage.$stageAttrs, (attrs) => attrs.scale));
+ const scale = useStore(canvasManager.stage.$scale);
const [localScale, setLocalScale] = useState(scale * 100);
const onChangeSlider = useCallback(
@@ -132,7 +139,7 @@ export const CanvasToolbarScale = memo(() => {
onKeyDown={onKeyDown}
clampValueOnBlur={false}
>
-
+
{
+const ZoomOutButton = memo(() => {
const canvasManager = useCanvasManager();
- const scale = useStore(computed(canvasManager.stage.$stageAttrs, (attrs) => attrs.scale));
+ const scale = useStore(canvasManager.stage.$scale);
const onClick = useCallback(() => {
+ const scale = canvasManager.stage.$scale.get();
const nextScale =
SCALE_SNAPS.slice()
.reverse()
.find((snap) => snap < scale) ?? canvasManager.stage.config.MIN_SCALE;
canvasManager.stage.setScale(Math.max(nextScale, canvasManager.stage.config.MIN_SCALE));
- }, [canvasManager.stage, scale]);
+ }, [canvasManager.stage]);
return (
{
isDisabled={scale <= canvasManager.stage.config.MIN_SCALE}
/>
);
-};
+});
+ZoomOutButton.displayName = 'ZoomOutButton';
-const ZoomInButton = () => {
+const ZoomInButton = memo(() => {
const canvasManager = useCanvasManager();
- const scale = useStore(computed(canvasManager.stage.$stageAttrs, (attrs) => attrs.scale));
+ const scale = useStore(canvasManager.stage.$scale);
const onClick = useCallback(() => {
+ const scale = canvasManager.stage.$scale.get();
const nextScale = SCALE_SNAPS.find((snap) => snap > scale) ?? canvasManager.stage.config.MAX_SCALE;
canvasManager.stage.setScale(Math.min(nextScale, canvasManager.stage.config.MAX_SCALE));
- }, [canvasManager.stage, scale]);
+ }, [canvasManager.stage]);
return (
{
isDisabled={scale >= canvasManager.stage.config.MAX_SCALE}
/>
);
-};
+});
+ZoomInButton.displayName = 'ZoomInButton';