diff --git a/invokeai/frontend/web/src/app/App.tsx b/invokeai/frontend/web/src/app/App.tsx index 40c15b38c0..c57a529654 100644 --- a/invokeai/frontend/web/src/app/App.tsx +++ b/invokeai/frontend/web/src/app/App.tsx @@ -41,7 +41,12 @@ const App = (props: PropsWithChildren) => { h={APP_HEIGHT} > {props.children || } - + diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx index da97dea9bf..d1c38c4bf6 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryPanel.tsx @@ -26,6 +26,7 @@ import { import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors'; +import useResolution from 'common/hooks/useResolution'; const GALLERY_TAB_WIDTHS: Record< InvokeTabName, @@ -96,6 +97,8 @@ export default function ImageGalleryPanel() { shouldPinGallery && dispatch(requestCanvasRescale()); }; + const resolution = useResolution(); + useHotkeys( 'g', () => { @@ -178,6 +181,11 @@ export default function ImageGalleryPanel() { [galleryImageMinimumWidth] ); + const calcGalleryMinHeight = () => { + if (resolution == 'desktop') return; + return 600; + }; + return ( diff --git a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx index 18db74791b..594ec3d6c4 100644 --- a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx +++ b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx @@ -174,8 +174,10 @@ export default function InvokeTabs() { dispatch(setActiveTab(index)); }} flexGrow={1} + flexDir={{ base: 'column', xl: 'row' }} + gap={{ base: 4 }} > - {tabs} + {tabs} {tabPanels} ); diff --git a/invokeai/frontend/web/src/features/ui/components/InvokeWorkarea.tsx b/invokeai/frontend/web/src/features/ui/components/InvokeWorkarea.tsx index ea4cd5ba1a..218c708bbd 100644 --- a/invokeai/frontend/web/src/features/ui/components/InvokeWorkarea.tsx +++ b/invokeai/frontend/web/src/features/ui/components/InvokeWorkarea.tsx @@ -1,4 +1,4 @@ -import { Box, BoxProps, Flex } from '@chakra-ui/react'; +import { Box, BoxProps, Flex, Grid, GridItem } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { setInitialImage } from 'features/parameters/store/generationSlice'; @@ -54,12 +54,26 @@ const InvokeWorkarea = (props: InvokeWorkareaProps) => { }; return ( - + {parametersPanelContent} - - {children} - - + + + {children} + + + ); }; diff --git a/invokeai/frontend/web/src/features/ui/components/ParametersPanel.tsx b/invokeai/frontend/web/src/features/ui/components/ParametersPanel.tsx index 1f0bcaead3..fc27ccef4c 100644 --- a/invokeai/frontend/web/src/features/ui/components/ParametersPanel.tsx +++ b/invokeai/frontend/web/src/features/ui/components/ParametersPanel.tsx @@ -19,6 +19,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { activeTabNameSelector, uiSelector } from '../store/uiSelectors'; import { isEqual } from 'lodash'; import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors'; +import useResolution from 'common/hooks/useResolution'; const parametersPanelSelector = createSelector( [uiSelector, activeTabNameSelector, lightboxSelector], @@ -58,6 +59,8 @@ const ParametersPanel = ({ children }: ParametersPanelProps) => { dispatch(setShouldShowParametersPanel(false)); }; + const resolution = useResolution(); + useHotkeys( 'o', () => { @@ -88,21 +91,9 @@ const ParametersPanel = ({ children }: ParametersPanelProps) => { }, [] ); - return ( - + + const parametersPanelContent = () => { + return ( {!shouldPinParametersPanel && ( { /> )} - - ); + ); + }; + + const resizableParametersPanelContent = () => { + return ( + + {parametersPanelContent()} + + ); + }; + + const renderParametersPanel = () => { + if (['mobile', 'tablet'].includes(resolution)) + return parametersPanelContent(); + return resizableParametersPanelContent(); + }; + + return resizableParametersPanelContent(); }; export default memo(ParametersPanel);