diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json
index 3cf8ba070a..561efdd8e9 100644
--- a/invokeai/frontend/web/package.json
+++ b/invokeai/frontend/web/package.json
@@ -89,6 +89,7 @@
"react-konva": "^18.2.7",
"react-konva-utils": "^1.0.4",
"react-redux": "^8.0.5",
+ "react-resizable-panels": "^0.0.42",
"react-rnd": "^10.4.1",
"react-transition-group": "^4.4.5",
"react-use": "^17.4.0",
diff --git a/invokeai/frontend/web/src/app/components/App.tsx b/invokeai/frontend/web/src/app/components/App.tsx
index 3aebfa4097..c5f2c6ff04 100644
--- a/invokeai/frontend/web/src/app/components/App.tsx
+++ b/invokeai/frontend/web/src/app/components/App.tsx
@@ -1,6 +1,6 @@
import ImageUploader from 'common/components/ImageUploader';
-import ProgressBar from 'features/system/components/ProgressBar';
import SiteHeader from 'features/system/components/SiteHeader';
+import ProgressBar from 'features/system/components/ProgressBar';
import InvokeTabs from 'features/ui/components/InvokeTabs';
import useToastWatcher from 'features/system/hooks/useToastWatcher';
@@ -28,6 +28,9 @@ import { configChanged } from 'features/system/store/configSlice';
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
import { useLogger } from 'app/logging/useLogger';
import ProgressImagePreview from 'features/parameters/components/ProgressImagePreview';
+import ResizableDrawer from 'features/ui/components/common/ResizableDrawer/ResizableDrawer';
+import ImageGalleryContent from 'features/gallery/components/ImageGalleryContent';
+import CreateParametersDrawer from 'features/ui/components/CreateParametersDrawer';
const DEFAULT_CONFIG = {};
@@ -84,11 +87,13 @@ const App = ({ config = DEFAULT_CONFIG, children }: Props) => {
flexDir={{ base: 'column', xl: 'row' }}
>
-
+
+
+
{!isApplicationReady && !loadingOverridden && (
{
{ keyup: true, keydown: true },
[shift]
);
+
+ useHotkeys('o', () => {
+ dispatch(toggleParametersPanel());
+ });
+
+ useHotkeys(['shift+o'], () => {
+ dispatch(togglePinParametersPanel());
+ });
+
+ useHotkeys('g', () => {
+ dispatch(toggleGalleryPanel());
+ });
+
+ useHotkeys(['shift+g'], () => {
+ dispatch(togglePinGalleryPanel());
+ });
};
diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx
index 76442d340b..24ff1d72af 100644
--- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx
@@ -73,7 +73,7 @@ const galleryPanelSelector = createSelector(
}
);
-export const ImageGalleryPanel = () => {
+const ImageGalleryPanel = () => {
const dispatch = useAppDispatch();
const {
shouldPinGallery,
@@ -102,21 +102,21 @@ export const ImageGalleryPanel = () => {
const resolution = useResolution();
- useHotkeys(
- 'g',
- () => {
- handleToggleGallery();
- },
- [shouldPinGallery]
- );
+ // useHotkeys(
+ // 'g',
+ // () => {
+ // handleToggleGallery();
+ // },
+ // [shouldPinGallery]
+ // );
- useHotkeys(
- 'shift+g',
- () => {
- handleSetShouldPinGallery();
- },
- [shouldPinGallery]
- );
+ // useHotkeys(
+ // 'shift+g',
+ // () => {
+ // handleSetShouldPinGallery();
+ // },
+ // [shouldPinGallery]
+ // );
useHotkeys(
'esc',
@@ -162,55 +162,71 @@ export const ImageGalleryPanel = () => {
[galleryImageMinimumWidth]
);
- const calcGalleryMinHeight = () => {
- if (resolution === 'desktop') return;
- return 300;
- };
+ // const calcGalleryMinHeight = () => {
+ // if (resolution === 'desktop') return;
+ // return 300;
+ // };
- const imageGalleryContent = () => {
- return (
-
-
-
- );
- };
+ // const imageGalleryContent = () => {
+ // return (
+ //
+ //
+ //
+ // );
+ // };
- const resizableImageGalleryContent = () => {
- return (
-
-
-
- );
- };
+ // const resizableImageGalleryContent = () => {
+ // return (
+ //
+ //
+ //
+ // );
+ // };
- const renderImageGallery = () => {
- if (['mobile', 'tablet'].includes(resolution)) return imageGalleryContent();
- return resizableImageGalleryContent();
- };
+ // const renderImageGallery = () => {
+ // if (['mobile', 'tablet'].includes(resolution)) return imageGalleryContent();
+ // return resizableImageGalleryContent();
+ // };
- return renderImageGallery();
+ if (shouldPinGallery) {
+ return null;
+ }
+
+ return (
+
+
+
+ );
+
+ // return renderImageGallery();
};
export default memo(ImageGalleryPanel);
diff --git a/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx
index 4a1fa89eff..98698e2d81 100644
--- a/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx
@@ -10,7 +10,6 @@ import ConditioningInputFieldComponent from './fields/ConditioningInputFieldComp
import ModelInputFieldComponent from './fields/ModelInputFieldComponent';
import NumberInputFieldComponent from './fields/NumberInputFieldComponent';
import StringInputFieldComponent from './fields/StringInputFieldComponent';
-import ItemInputFieldComponent from './fields/ItemInputFieldComponent';
import ColorInputFieldComponent from './fields/ColorInputFieldComponent';
import ItemInputFieldComponent from './fields/ItemInputFieldComponent';
diff --git a/invokeai/frontend/web/src/features/parameters/components/AnimatedImageToImagePanel.tsx b/invokeai/frontend/web/src/features/parameters/components/AnimatedImageToImagePanel.tsx
index da9262ac0f..8778e043e6 100644
--- a/invokeai/frontend/web/src/features/parameters/components/AnimatedImageToImagePanel.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/AnimatedImageToImagePanel.tsx
@@ -20,7 +20,7 @@ const AnimatedImageToImagePanel = () => {
exit={{ opacity: 0, scale: 0, width: 0 }}
transition={{ type: 'spring', bounce: 0, duration: 0.35 }}
>
-
+
diff --git a/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx b/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx
index 4f6c2ecc1c..03e9643384 100644
--- a/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx
@@ -11,7 +11,7 @@ import {
CancelStrategy,
} from 'features/system/store/systemSlice';
import { isEqual } from 'lodash-es';
-import { useCallback, memo } from 'react';
+import { useCallback, memo, useMemo } from 'react';
import {
ButtonSpinner,
ButtonGroup,
@@ -102,39 +102,39 @@ const CancelButton = (
[isConnected, isProcessing, isCancelable]
);
+ const cancelLabel = useMemo(() => {
+ if (isCancelScheduled) {
+ return t('parameters.cancel.isScheduled');
+ }
+ if (cancelType === 'immediate') {
+ return t('parameters.cancel.immediate');
+ }
+
+ return t('parameters.cancel.schedule');
+ }, [t, cancelType, isCancelScheduled]);
+
+ const cancelIcon = useMemo(() => {
+ if (isCancelScheduled) {
+ return ;
+ }
+ if (cancelType === 'immediate') {
+ return ;
+ }
+
+ return ;
+ }, [cancelType, isCancelScheduled]);
+
return (
- {cancelType === 'immediate' ? (
- }
- tooltip={t('parameters.cancel.immediate')}
- aria-label={t('parameters.cancel.immediate')}
- isDisabled={!isConnected || !isProcessing || !isCancelable}
- onClick={handleClickCancel}
- colorScheme="error"
- {...rest}
- />
- ) : (
- :
- }
- tooltip={
- isCancelScheduled
- ? t('parameters.cancel.isScheduled')
- : t('parameters.cancel.schedule')
- }
- aria-label={
- isCancelScheduled
- ? t('parameters.cancel.isScheduled')
- : t('parameters.cancel.schedule')
- }
- isDisabled={!isConnected || !isProcessing || !isCancelable}
- onClick={handleClickCancel}
- colorScheme="error"
- {...rest}
- />
- )}
+