diff --git a/invokeai/frontend/web/src/common/components/ImageToImageButtons.tsx b/invokeai/frontend/web/src/common/components/ImageToImageButtons.tsx
index 00a6e70c1d..315571b6e7 100644
--- a/invokeai/frontend/web/src/common/components/ImageToImageButtons.tsx
+++ b/invokeai/frontend/web/src/common/components/ImageToImageButtons.tsx
@@ -23,16 +23,11 @@ const InitialImageButtons = () => {
}
aria-label={t('accessibility.reset')}
onClick={handleResetInitialImage}
/>
- }
- aria-label={t('common.upload')}
- />
+ } aria-label={t('common.upload')} />
);
diff --git a/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx b/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx
index c9c472a9b8..b3452f5587 100644
--- a/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx
@@ -410,7 +410,7 @@ const CurrentImageButtons = (props: CurrentImageButtonsProps) => {
}}
{...props}
>
-
+
{
)}
-
+
}
tooltip={`${t('parameters.usePrompt')} (P)`}
@@ -528,7 +528,7 @@ const CurrentImageButtons = (props: CurrentImageButtonsProps) => {
{(isUpscalingEnabled || isFaceRestoreEnabled) && (
-
+
{isFaceRestoreEnabled && (
{
)}
-
+
}
tooltip={`${t('parameters.info')} (I)`}
@@ -603,7 +603,7 @@ const CurrentImageButtons = (props: CurrentImageButtonsProps) => {
/>
-
+
}
diff --git a/invokeai/frontend/web/src/features/parameters/components/AdvancedParameters/ImageToImage/InitialImageDisplay.tsx b/invokeai/frontend/web/src/features/parameters/components/AdvancedParameters/ImageToImage/InitialImageDisplay.tsx
index 236146099f..c9c6e525b4 100644
--- a/invokeai/frontend/web/src/features/parameters/components/AdvancedParameters/ImageToImage/InitialImageDisplay.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/AdvancedParameters/ImageToImage/InitialImageDisplay.tsx
@@ -14,6 +14,8 @@ const InitialImageDisplay = () => {
borderRadius: 'base',
alignItems: 'center',
justifyContent: 'center',
+ bg: 'base.850',
+ p: 4,
}}
>
{
- const { shouldPinParametersPanel } = ui;
- return {
- shouldPinParametersPanel,
- activeTabName,
- };
- },
- {
- memoizeOptions: {
- resultEqualityCheck: isEqual,
- },
- }
-);
-
-type InvokeWorkareaProps = BoxProps & {
- parametersPanelContent: ReactNode;
- children: ReactNode;
-};
-
-const InvokeWorkarea = (props: InvokeWorkareaProps) => {
- const { parametersPanelContent, children, ...rest } = props;
- const dispatch = useAppDispatch();
- const { activeTabName } = useAppSelector(workareaSelector);
-
- const getImageByUuid = useGetImageByUuid();
-
- const handleDrop = (e: DragEvent) => {
- const uuid = e.dataTransfer.getData('invokeai/imageUuid');
- const image = getImageByUuid(uuid);
- if (!image) return;
- if (activeTabName === 'unifiedCanvas') {
- dispatch(setInitialCanvasImage(image));
- }
- };
-
- return (
-
- {parametersPanelContent}
-
-
- {children}
-
-
-
- );
-};
-
-export default InvokeWorkarea;
diff --git a/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx b/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx
index 72af8e6b14..512d43bcd6 100644
--- a/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx
@@ -1,32 +1,93 @@
-import { useAppSelector } from 'app/store/storeHooks';
-import { memo } from 'react';
-import { activeTabNameSelector } from '../store/uiSelectors';
+import { isEqual } from 'lodash-es';
+import { createSelector } from '@reduxjs/toolkit';
+import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors';
+import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+import { PropsWithChildren, memo, useMemo } from 'react';
+import { Box, Flex } from '@chakra-ui/react';
+import InvokeAILogoComponent from 'features/system/components/InvokeAILogoComponent';
+import OverlayScrollable from './common/OverlayScrollable';
+import { PARAMETERS_PANEL_WIDTH } from 'theme/util/constants';
+import {
+ activeTabNameSelector,
+ uiSelector,
+} from 'features/ui/store/uiSelectors';
+import { setShouldShowParametersPanel } from 'features/ui/store/uiSlice';
+import ResizableDrawer from './common/ResizableDrawer/ResizableDrawer';
+import PinParametersPanelButton from './PinParametersPanelButton';
import TextTabParametersDrawer from './tabs/text/TextTabParametersDrawer';
-import { RootState } from 'app/store/store';
+import TextTabParameters from './tabs/text/TextTabParameters';
+import ImageTabParameters from './tabs/image/ImageTabParameters';
+import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
+
+const selector = createSelector(
+ [uiSelector, activeTabNameSelector, lightboxSelector],
+ (ui, activeTabName, lightbox) => {
+ const {
+ shouldPinParametersPanel,
+ shouldShowParametersPanel,
+ shouldShowImageParameters,
+ } = ui;
+
+ const { isLightboxOpen } = lightbox;
+
+ return {
+ activeTabName,
+ shouldPinParametersPanel,
+ shouldShowParametersPanel,
+ shouldShowImageParameters,
+ };
+ },
+ defaultSelectorOptions
+);
const ParametersDrawer = () => {
- const activeTabName = useAppSelector(activeTabNameSelector);
- const shouldPinParametersPanel = useAppSelector(
- (state: RootState) => state.ui.shouldPinParametersPanel
+ const dispatch = useAppDispatch();
+ const { shouldPinParametersPanel, shouldShowParametersPanel, activeTabName } =
+ useAppSelector(selector);
+
+ const handleClosePanel = () => {
+ dispatch(setShouldShowParametersPanel(false));
+ };
+
+ const drawerContent = useMemo(() => {
+ if (activeTabName === 'text') {
+ return ;
+ }
+
+ if (activeTabName === 'image') {
+ return ;
+ }
+
+ if (activeTabName === 'unifiedCanvas') {
+ return null;
+ }
+ }, [activeTabName]);
+
+ return (
+
+
+
+
+
+
+
+
+ {drawerContent}
+
+
+
+
);
-
- if (shouldPinParametersPanel) {
- return null;
- }
-
- if (activeTabName === 'text') {
- return ;
- }
-
- if (activeTabName === 'image') {
- return null;
- }
-
- if (activeTabName === 'unifiedCanvas') {
- return null;
- }
-
- return null;
};
export default memo(ParametersDrawer);
diff --git a/invokeai/frontend/web/src/features/ui/components/ParametersPanel.tsx b/invokeai/frontend/web/src/features/ui/components/ParametersPanel.tsx
deleted file mode 100644
index b36199e263..0000000000
--- a/invokeai/frontend/web/src/features/ui/components/ParametersPanel.tsx
+++ /dev/null
@@ -1,155 +0,0 @@
-import { Flex } from '@chakra-ui/react';
-import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-
-import { memo, ReactNode } from 'react';
-
-import { PARAMETERS_PANEL_WIDTH } from 'theme/util/constants';
-import ResizableDrawer from 'features/ui/components/common/ResizableDrawer/ResizableDrawer';
-import {
- setShouldShowParametersPanel,
- toggleParametersPanel,
- togglePinParametersPanel,
-} from 'features/ui/store/uiSlice';
-import { useHotkeys } from 'react-hotkeys-hook';
-import InvokeAILogoComponent from 'features/system/components/InvokeAILogoComponent';
-import Scrollable from './common/Scrollable';
-import PinParametersPanelButton from './PinParametersPanelButton';
-import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale';
-import { createSelector } from '@reduxjs/toolkit';
-import { activeTabNameSelector, uiSelector } from '../store/uiSelectors';
-import { isEqual } from 'lodash-es';
-import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors';
-import useResolution from 'common/hooks/useResolution';
-
-const parametersPanelSelector = createSelector(
- [uiSelector, activeTabNameSelector, lightboxSelector],
- (ui, activeTabName, lightbox) => {
- const { shouldPinParametersPanel, shouldShowParametersPanel } = ui;
- const { isLightboxOpen } = lightbox;
-
- return {
- shouldPinParametersPanel,
- shouldShowParametersPanel,
- isResizable: activeTabName !== 'unifiedCanvas',
- isLightboxOpen,
- };
- },
- {
- memoizeOptions: {
- resultEqualityCheck: isEqual,
- },
- }
-);
-
-type ParametersPanelProps = {
- children: ReactNode;
-};
-
-const ParametersPanel = ({ children }: ParametersPanelProps) => {
- const dispatch = useAppDispatch();
-
- const {
- shouldPinParametersPanel,
- shouldShowParametersPanel,
- isResizable,
- isLightboxOpen,
- } = useAppSelector(parametersPanelSelector);
-
- const closeParametersPanel = () => {
- dispatch(setShouldShowParametersPanel(false));
- };
-
- const resolution = useResolution();
-
- useHotkeys(
- 'o',
- () => {
- dispatch(toggleParametersPanel());
- shouldPinParametersPanel && dispatch(requestCanvasRescale());
- },
- { enabled: () => !isLightboxOpen },
- [shouldPinParametersPanel, isLightboxOpen]
- );
-
- useHotkeys(
- 'esc',
- () => {
- dispatch(setShouldShowParametersPanel(false));
- },
- {
- enabled: () => !shouldPinParametersPanel,
- preventDefault: true,
- },
- [shouldPinParametersPanel]
- );
-
- useHotkeys(
- 'shift+o',
- () => {
- dispatch(togglePinParametersPanel());
- dispatch(requestCanvasRescale());
- },
- []
- );
-
- const parametersPanelContent = () => {
- return (
-
- {!shouldPinParametersPanel && (
-
-
- {resolution == 'desktop' && }
-
- )}
- {children}
- {shouldPinParametersPanel && resolution == 'desktop' && (
-
- )}
-
- );
- };
-
- const resizableParametersPanelContent = () => {
- return (
-
- {parametersPanelContent()}
-
- );
- };
-
- const renderParametersPanel = () => {
- if (['mobile', 'tablet'].includes(resolution))
- return parametersPanelContent();
- return resizableParametersPanelContent();
- };
-
- return renderParametersPanel();
-};
-
-export default memo(ParametersPanel);
diff --git a/invokeai/frontend/web/src/features/ui/components/common/ParametersSlide.tsx b/invokeai/frontend/web/src/features/ui/components/common/ParametersSlide.tsx
deleted file mode 100644
index 3342a9338b..0000000000
--- a/invokeai/frontend/web/src/features/ui/components/common/ParametersSlide.tsx
+++ /dev/null
@@ -1,143 +0,0 @@
-import { Box, Flex, useOutsideClick } from '@chakra-ui/react';
-import { Slide } from '@chakra-ui/react';
-import { createSelector } from '@reduxjs/toolkit';
-import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import { uiSelector } from 'features/ui/store/uiSelectors';
-import { isEqual } from 'lodash-es';
-import { memo, PropsWithChildren, useRef } from 'react';
-import PinParametersPanelButton from 'features/ui/components/PinParametersPanelButton';
-import {
- setShouldShowParametersPanel,
- toggleParametersPanel,
- togglePinParametersPanel,
-} from 'features/ui/store/uiSlice';
-import InvokeAILogoComponent from 'features/system/components/InvokeAILogoComponent';
-import Scrollable from 'features/ui/components/common/Scrollable';
-import { useLangDirection } from 'features/ui/hooks/useDirection';
-import { useHotkeys } from 'react-hotkeys-hook';
-import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale';
-import { generationSelector } from 'features/parameters/store/generationSelectors';
-import AnimatedImageToImagePanel from 'features/parameters/components/AnimatedImageToImagePanel';
-
-const parametersSlideSelector = createSelector(
- [uiSelector, generationSelector],
- (ui, generation) => {
- const { shouldPinParametersPanel, shouldShowParametersPanel } = ui;
- const { isImageToImageEnabled } = generation;
-
- return {
- shouldPinParametersPanel,
- shouldShowParametersPanel,
- isImageToImageEnabled,
- };
- },
- {
- memoizeOptions: {
- resultEqualityCheck: isEqual,
- },
- }
-);
-
-type ParametersSlideProps = PropsWithChildren;
-
-const ParametersSlide = (props: ParametersSlideProps) => {
- const dispatch = useAppDispatch();
-
- const {
- shouldShowParametersPanel,
- isImageToImageEnabled,
- shouldPinParametersPanel,
- } = useAppSelector(parametersSlideSelector);
-
- const langDirection = useLangDirection();
-
- const outsideClickRef = useRef(null);
-
- const closeParametersPanel = () => {
- dispatch(setShouldShowParametersPanel(false));
- };
-
- useOutsideClick({
- ref: outsideClickRef,
- handler: () => {
- closeParametersPanel();
- },
- enabled: shouldShowParametersPanel && !shouldPinParametersPanel,
- });
-
- useHotkeys(
- 'o',
- () => {
- dispatch(toggleParametersPanel());
- shouldPinParametersPanel && dispatch(requestCanvasRescale());
- },
- [shouldPinParametersPanel]
- );
-
- useHotkeys(
- 'esc',
- () => {
- dispatch(setShouldShowParametersPanel(false));
- },
- {
- enabled: () => !shouldPinParametersPanel,
- preventDefault: true,
- },
- [shouldPinParametersPanel]
- );
-
- useHotkeys(
- 'shift+o',
- () => {
- dispatch(togglePinParametersPanel());
- dispatch(requestCanvasRescale());
- },
- []
- );
-
- return (
-
-
-
-
-
-
-
-
- {props.children}
-
-
-
-
-
- );
-};
-
-export default memo(ParametersSlide);
diff --git a/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx b/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx
index d9fd765656..993dd45adb 100644
--- a/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx
@@ -20,7 +20,6 @@ import {
getMinMaxDimensions,
getSlideDirection,
getStyles,
- parseAndPadSize,
} from './util';
type ResizableDrawerProps = ResizableProps & {
@@ -72,7 +71,7 @@ const ResizableDrawer = ({
() =>
initialWidth ??
minWidth ??
- (['left', 'right'].includes(direction) ? 500 : '100%'),
+ (['left', 'right'].includes(direction) ? 'auto' : '100%'),
[initialWidth, minWidth, direction]
);
@@ -80,7 +79,7 @@ const ResizableDrawer = ({
() =>
initialHeight ??
minHeight ??
- (['top', 'bottom'].includes(direction) ? 500 : '100%'),
+ (['top', 'bottom'].includes(direction) ? 'auto' : '100%'),
[initialHeight, minHeight, direction]
);
@@ -105,18 +104,6 @@ const ResizableDrawer = ({
() =>
getMinMaxDimensions({
direction,
- // minWidth: isResizable
- // ? parseAndPadSize(minWidth, 18)
- // : parseAndPadSize(minWidth),
- // maxWidth: isResizable
- // ? parseAndPadSize(maxWidth, 18)
- // : parseAndPadSize(maxWidth),
- // minHeight: isResizable
- // ? parseAndPadSize(minHeight, 18)
- // : parseAndPadSize(minHeight),
- // maxHeight: isResizable
- // ? parseAndPadSize(maxHeight, 18)
- // : parseAndPadSize(maxHeight),
minWidth,
maxWidth,
minHeight,
@@ -154,24 +141,8 @@ const ResizableDrawer = ({
{
- if (!isResizable) {
- return { containerStyles: {}, handleStyles: {} };
- }
+ // if (!isResizable) {
+ // return { containerStyles: {}, handleStyles: {} };
+ // }
// Calculate the positioning offset of the handle hitbox so it is centered over the handle
const handleOffset = `calc((2 * ${HANDLE_INTERACT_PADDING} + ${HANDLE_WIDTH}) / -2)`;
@@ -190,13 +187,15 @@ export const getStyles = ({
borderBottomWidth: HANDLE_WIDTH,
paddingBottom: HANDLE_PADDING,
},
- handleStyles: {
- top: {
- paddingTop: HANDLE_INTERACT_PADDING,
- paddingBottom: HANDLE_INTERACT_PADDING,
- bottom: handleOffset,
- },
- },
+ handleStyles: isResizable
+ ? {
+ top: {
+ paddingTop: HANDLE_INTERACT_PADDING,
+ paddingBottom: HANDLE_INTERACT_PADDING,
+ bottom: handleOffset,
+ },
+ }
+ : {},
};
}
@@ -206,13 +205,15 @@ export const getStyles = ({
borderInlineEndWidth: HANDLE_WIDTH,
paddingInlineEnd: HANDLE_PADDING,
},
- handleStyles: {
- right: {
- paddingInlineStart: HANDLE_INTERACT_PADDING,
- paddingInlineEnd: HANDLE_INTERACT_PADDING,
- insetInlineEnd: handleOffset,
- },
- },
+ handleStyles: isResizable
+ ? {
+ right: {
+ paddingInlineStart: HANDLE_INTERACT_PADDING,
+ paddingInlineEnd: HANDLE_INTERACT_PADDING,
+ insetInlineEnd: handleOffset,
+ },
+ }
+ : {},
};
}
@@ -222,13 +223,15 @@ export const getStyles = ({
borderTopWidth: HANDLE_WIDTH,
paddingTop: HANDLE_PADDING,
},
- handleStyles: {
- bottom: {
- paddingTop: HANDLE_INTERACT_PADDING,
- paddingBottom: HANDLE_INTERACT_PADDING,
- top: handleOffset,
- },
- },
+ handleStyles: isResizable
+ ? {
+ bottom: {
+ paddingTop: HANDLE_INTERACT_PADDING,
+ paddingBottom: HANDLE_INTERACT_PADDING,
+ top: handleOffset,
+ },
+ }
+ : {},
};
}
@@ -238,13 +241,15 @@ export const getStyles = ({
borderInlineStartWidth: HANDLE_WIDTH,
paddingInlineStart: HANDLE_PADDING,
},
- handleStyles: {
- left: {
- paddingInlineStart: HANDLE_INTERACT_PADDING,
- paddingInlineEnd: HANDLE_INTERACT_PADDING,
- insetInlineStart: handleOffset,
- },
- },
+ handleStyles: isResizable
+ ? {
+ left: {
+ paddingInlineStart: HANDLE_INTERACT_PADDING,
+ paddingInlineEnd: HANDLE_INTERACT_PADDING,
+ insetInlineStart: handleOffset,
+ },
+ }
+ : {},
};
}
@@ -276,16 +281,3 @@ export const getSlideDirection = (
return 'left';
};
-
-// Hack to correct the width of panels while pinned and unpinned, due to different padding in pinned vs unpinned
-export const parseAndPadSize = (size?: number, padding?: number) => {
- if (!size) {
- return undefined;
- }
-
- if (!padding) {
- return size;
- }
-
- return size + padding;
-};
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx
index c62f82600b..d53a4d4fef 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx
@@ -1,13 +1,13 @@
-import { Box, Flex } from '@chakra-ui/react';
+import { Box, Flex, FlexProps } from '@chakra-ui/react';
import { memo } from 'react';
import { PanelResizeHandle } from 'react-resizable-panels';
-type ResizeHandleProps = {
+type ResizeHandleProps = FlexProps & {
direction?: 'horizontal' | 'vertical';
};
const ResizeHandle = (props: ResizeHandleProps) => {
- const { direction = 'horizontal' } = props;
+ const { direction = 'horizontal', ...rest } = props;
if (direction === 'horizontal') {
return (
@@ -19,12 +19,14 @@ const ResizeHandle = (props: ResizeHandleProps) => {
justifyContent: 'center',
alignItems: 'center',
}}
+ {...rest}
>
);
}
+
return (
{
justifyContent: 'center',
alignItems: 'center',
}}
+ {...rest}
>
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasWorkarea.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasWorkarea.tsx
index 53a7ca0d76..455ff4a32b 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasWorkarea.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasWorkarea.tsx
@@ -4,7 +4,7 @@ import { memo } from 'react';
import PinParametersPanelButton from '../../PinParametersPanelButton';
import { RootState } from 'app/store/store';
import Scrollable from '../../common/Scrollable';
-import ParametersSlide from '../../common/ParametersSlide';
+import ParametersSlide from '../../ParametersDrawer';
import UnifiedCanvasParameters from './UnifiedCanvasParameters';
import UnifiedCanvasContentBeta from './UnifiedCanvasBeta/UnifiedCanvasContentBeta';
import UnifiedCanvasContent from './UnifiedCanvasContent';
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/image/ImageTab.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/image/ImageTab.tsx
index c2d1b3ddea..b906ec4d97 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/image/ImageTab.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/image/ImageTab.tsx
@@ -1,6 +1,10 @@
-import { Portal, TabPanel } from '@chakra-ui/react';
-import { memo } from 'react';
-import { Panel, PanelGroup } from 'react-resizable-panels';
+import { Box, Flex, Portal, TabPanel } from '@chakra-ui/react';
+import { memo, useCallback, useRef } from 'react';
+import {
+ ImperativePanelHandle,
+ Panel,
+ PanelGroup,
+} from 'react-resizable-panels';
import PinParametersPanelButton from '../../PinParametersPanelButton';
import { createSelector } from '@reduxjs/toolkit';
import { uiSelector } from 'features/ui/store/uiSelectors';
@@ -12,6 +16,8 @@ import ImageTabImageParameters from './ImageTabImageParameters';
import TextTabMain from '../text/TextTabMain';
import InitialImagePreview from 'features/parameters/components/AdvancedParameters/ImageToImage/InitialImagePreview';
import InitialImageDisplay from 'features/parameters/components/AdvancedParameters/ImageToImage/InitialImageDisplay';
+import { PARAMETERS_PANEL_WIDTH } from 'theme/util/constants';
+import { ImperativePanelGroupHandle } from 'react-resizable-panels';
const selector = createSelector(uiSelector, (ui) => {
const {
@@ -33,6 +39,16 @@ const selector = createSelector(uiSelector, (ui) => {
const TextTab = () => {
const dispatch = useAppDispatch();
+ const panelGroupRef = useRef(null);
+
+ const handleDoubleClickHandle = useCallback(() => {
+ if (!panelGroupRef.current) {
+ return;
+ }
+
+ panelGroupRef.current.setLayout([50, 50]);
+ }, []);
+
const {
shouldPinGallery,
shouldShowGallery,
@@ -42,36 +58,31 @@ const TextTab = () => {
} = useAppSelector(selector);
return (
-
+
{shouldPinParametersPanel && shouldShowParametersPanel && (
- <>
-
-
-
-
-
- >
+
+
+
+
)}
-
+
{
>
-
+
{
-
-
+
+
);
};
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTab.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTab.tsx
index b28cac2581..4582a8a242 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTab.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTab.tsx
@@ -1,4 +1,4 @@
-import { Portal, TabPanel } from '@chakra-ui/react';
+import { Box, Flex, Portal, TabPanel } from '@chakra-ui/react';
import { memo } from 'react';
import { Panel, PanelGroup } from 'react-resizable-panels';
import PinParametersPanelButton from '../../PinParametersPanelButton';
@@ -9,6 +9,7 @@ import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvas
import TextTabMain from './TextTabMain';
import ResizeHandle from '../ResizeHandle';
import TextTabParameters from './TextTabParameters';
+import { PARAMETERS_PANEL_WIDTH } from 'theme/util/constants';
const selector = createSelector(uiSelector, (ui) => {
const {
@@ -39,32 +40,24 @@ const TextTab = () => {
} = useAppSelector(selector);
return (
-
+
{shouldPinParametersPanel && shouldShowParametersPanel && (
- <>
-
-
-
-
-
- >
+
+
+
+
)}
-
-
-
-
+
+
);
};
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTabMain.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTabMain.tsx
index 226d145e34..7970bb13f4 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTabMain.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTabMain.tsx
@@ -9,12 +9,12 @@ const TextTabMain = () => {
width: '100%',
height: '100%',
borderRadius: 'base',
- // bg: 'base.850',
+ bg: 'base.850',
+ p: 4,
}}
>
{
flexDirection: 'column',
h: 'full',
w: 'full',
- position: 'absolute',
}}
>
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTabParametersDrawer.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTabParametersDrawer.tsx
deleted file mode 100644
index d1de868ec7..0000000000
--- a/invokeai/frontend/web/src/features/ui/components/tabs/text/TextTabParametersDrawer.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import { isEqual } from 'lodash-es';
-import ResizableDrawer from '../../common/ResizableDrawer/ResizableDrawer';
-import TextTabParameters from './TextTabParameters';
-import { createSelector } from '@reduxjs/toolkit';
-import { activeTabNameSelector, uiSelector } from '../../../store/uiSelectors';
-import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors';
-import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import { setShouldShowParametersPanel } from '../../../store/uiSlice';
-import { memo } from 'react';
-import { Flex } from '@chakra-ui/react';
-import InvokeAILogoComponent from 'features/system/components/InvokeAILogoComponent';
-import PinParametersPanelButton from '../../PinParametersPanelButton';
-import { Panel, PanelGroup } from 'react-resizable-panels';
-
-const selector = createSelector(
- [uiSelector, activeTabNameSelector, lightboxSelector],
- (ui, activeTabName, lightbox) => {
- const {
- shouldPinParametersPanel,
- shouldShowParametersPanel,
- shouldShowImageParameters,
- } = ui;
-
- const { isLightboxOpen } = lightbox;
-
- return {
- activeTabName,
- shouldPinParametersPanel,
- shouldShowParametersPanel,
- shouldShowImageParameters,
- };
- },
- {
- memoizeOptions: {
- resultEqualityCheck: isEqual,
- },
- }
-);
-
-const TextTabParametersDrawer = () => {
- const dispatch = useAppDispatch();
- const { shouldPinParametersPanel, shouldShowParametersPanel } =
- useAppSelector(selector);
-
- const handleClosePanel = () => {
- dispatch(setShouldShowParametersPanel(false));
- };
-
- return (
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default memo(TextTabParametersDrawer);
diff --git a/invokeai/frontend/web/src/theme/util/constants.ts b/invokeai/frontend/web/src/theme/util/constants.ts
index 38b859913c..c73209ee75 100644
--- a/invokeai/frontend/web/src/theme/util/constants.ts
+++ b/invokeai/frontend/web/src/theme/util/constants.ts
@@ -11,7 +11,7 @@ export const APP_GALLERY_POPOVER_HEIGHT = `calc(100vh - (${APP_CONTENT_HEIGHT_CU
export const APP_METADATA_HEIGHT = `calc(100vh - (${APP_CONTENT_HEIGHT_CUTOFF} + 4.4rem))`;
// this is in pixels
-export const PARAMETERS_PANEL_WIDTH = 384;
+// export const PARAMETERS_PANEL_WIDTH = 384;
// do not touch ffs
export const APP_TEXT_TO_IMAGE_HEIGHT =
@@ -19,3 +19,5 @@ export const APP_TEXT_TO_IMAGE_HEIGHT =
// option bar
export const OPTIONS_BAR_MAX_WIDTH = '22.5rem';
+
+export const PARAMETERS_PANEL_WIDTH = '30rem';