1
+ import type { SystemStyleObject } from '@invoke-ai/ui-library' ;
1
2
import {
2
3
$shift ,
3
4
CompositeSlider ,
@@ -16,7 +17,6 @@ import { useStore } from '@nanostores/react';
16
17
import { useCanvasManager } from 'features/controlLayers/contexts/CanvasManagerProviderGate' ;
17
18
import { snapToNearest } from 'features/controlLayers/konva/util' ;
18
19
import { round } from 'lodash-es' ;
19
- import { computed } from 'nanostores' ;
20
20
import type { KeyboardEvent } from 'react' ;
21
21
import { memo , useCallback , useEffect , useState } from 'react' ;
22
22
import { PiCaretDownBold , PiMagnifyingGlassMinusBold , PiMagnifyingGlassPlusBold } from 'react-icons/pi' ;
@@ -68,9 +68,16 @@ const sliderDefaultValue = mapRawValueToSliderValue(100);
68
68
69
69
const snapCandidates = marks . slice ( 1 , marks . length - 1 ) ;
70
70
71
+ const inputFieldSx = {
72
+ paddingInlineEnd : 7 ,
73
+ _focusVisible : {
74
+ zIndex : 0 ,
75
+ } ,
76
+ } satisfies SystemStyleObject ;
77
+
71
78
export const CanvasToolbarScale = memo ( ( ) => {
72
79
const canvasManager = useCanvasManager ( ) ;
73
- const scale = useStore ( computed ( canvasManager . stage . $stageAttrs , ( attrs ) => attrs . scale ) ) ;
80
+ const scale = useStore ( canvasManager . stage . $scale ) ;
74
81
const [ localScale , setLocalScale ] = useState ( scale * 100 ) ;
75
82
76
83
const onChangeSlider = useCallback (
@@ -132,7 +139,7 @@ export const CanvasToolbarScale = memo(() => {
132
139
onKeyDown = { onKeyDown }
133
140
clampValueOnBlur = { false }
134
141
>
135
- < NumberInputField paddingInlineEnd = { 7 } title = "" _focusVisible = { { zIndex : 0 } } />
142
+ < NumberInputField title = "" sx = { inputFieldSx } />
136
143
< PopoverTrigger >
137
144
< IconButton
138
145
aria-label = "open-slider"
@@ -171,16 +178,17 @@ CanvasToolbarScale.displayName = 'CanvasToolbarScale';
171
178
172
179
const SCALE_SNAPS = [ 0.1 , 0.15 , 0.2 , 0.25 , 0.5 , 0.75 , 1 , 1.5 , 2 , 2.5 , 5 , 7.5 , 10 , 15 , 20 ] ;
173
180
174
- const ZoomOutButton = ( ) => {
181
+ const ZoomOutButton = memo ( ( ) => {
175
182
const canvasManager = useCanvasManager ( ) ;
176
- const scale = useStore ( computed ( canvasManager . stage . $stageAttrs , ( attrs ) => attrs . scale ) ) ;
183
+ const scale = useStore ( canvasManager . stage . $scale ) ;
177
184
const onClick = useCallback ( ( ) => {
185
+ const scale = canvasManager . stage . $scale . get ( ) ;
178
186
const nextScale =
179
187
SCALE_SNAPS . slice ( )
180
188
. reverse ( )
181
189
. find ( ( snap ) => snap < scale ) ?? canvasManager . stage . config . MIN_SCALE ;
182
190
canvasManager . stage . setScale ( Math . max ( nextScale , canvasManager . stage . config . MIN_SCALE ) ) ;
183
- } , [ canvasManager . stage , scale ] ) ;
191
+ } , [ canvasManager . stage ] ) ;
184
192
185
193
return (
186
194
< IconButton
@@ -192,15 +200,17 @@ const ZoomOutButton = () => {
192
200
isDisabled = { scale <= canvasManager . stage . config . MIN_SCALE }
193
201
/>
194
202
) ;
195
- } ;
203
+ } ) ;
204
+ ZoomOutButton . displayName = 'ZoomOutButton' ;
196
205
197
- const ZoomInButton = ( ) => {
206
+ const ZoomInButton = memo ( ( ) => {
198
207
const canvasManager = useCanvasManager ( ) ;
199
- const scale = useStore ( computed ( canvasManager . stage . $stageAttrs , ( attrs ) => attrs . scale ) ) ;
208
+ const scale = useStore ( canvasManager . stage . $scale ) ;
200
209
const onClick = useCallback ( ( ) => {
210
+ const scale = canvasManager . stage . $scale . get ( ) ;
201
211
const nextScale = SCALE_SNAPS . find ( ( snap ) => snap > scale ) ?? canvasManager . stage . config . MAX_SCALE ;
202
212
canvasManager . stage . setScale ( Math . min ( nextScale , canvasManager . stage . config . MAX_SCALE ) ) ;
203
- } , [ canvasManager . stage , scale ] ) ;
213
+ } , [ canvasManager . stage ] ) ;
204
214
205
215
return (
206
216
< IconButton
@@ -212,4 +222,5 @@ const ZoomInButton = () => {
212
222
isDisabled = { scale >= canvasManager . stage . config . MAX_SCALE }
213
223
/>
214
224
) ;
215
- } ;
225
+ } ) ;
226
+ ZoomInButton . displayName = 'ZoomInButton' ;
0 commit comments