diff --git a/invokeai/frontend/web/src/common/components/FocusRegionWrapper.tsx b/invokeai/frontend/web/src/common/components/FocusRegionWrapper.tsx index 4f0f0a2243..1d0cd0fee9 100644 --- a/invokeai/frontend/web/src/common/components/FocusRegionWrapper.tsx +++ b/invokeai/frontend/web/src/common/components/FocusRegionWrapper.tsx @@ -1,7 +1,10 @@ import { Box, type BoxProps, type SystemStyleObject } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; import { type FocusRegionName, useFocusRegion, useIsRegionFocused } from 'common/hooks/focus'; +import type { IDockviewPanelProps, IGridviewPanelProps } from 'dockview'; import { selectSystemShouldEnableHighlightFocusedRegions } from 'features/system/store/systemSlice'; +import type { PanelParameters } from 'features/ui/layouts/auto-layout-context'; +import type { PropsWithChildren } from 'react'; import { memo, useMemo, useRef } from 'react'; interface FocusRegionWrapperProps extends BoxProps { @@ -9,8 +12,11 @@ interface FocusRegionWrapperProps extends BoxProps { focusOnMount?: boolean; } -const BASE_FOCUS_REGION_STYLES: SystemStyleObject = { +export const BASE_FOCUS_REGION_STYLES: SystemStyleObject = { position: 'relative', + w: 'full', + h: 'full', + p: 2, '&[data-highlighted="true"]::after': { borderColor: 'invokeBlue.300', }, @@ -23,7 +29,6 @@ const BASE_FOCUS_REGION_STYLES: SystemStyleObject = { border: '1px solid', borderColor: 'transparent', pointerEvents: 'none', - // transition: 'border-color 0.1s ease-in-out', }, }; @@ -50,3 +55,26 @@ export const FocusRegionWrapper = memo((props: FocusRegionWrapperProps) => { }); FocusRegionWrapper.displayName = 'FocusRegionWrapper'; + +export const AutoLayoutPanelContainer = memo( + ( + props: + | PropsWithChildren> + | PropsWithChildren> + ) => { + const ref = useRef(null); + const shouldHighlightFocusedRegions = useAppSelector(selectSystemShouldEnableHighlightFocusedRegions); + + useFocusRegion(props.params.focusRegion, ref); + + const isFocused = useIsRegionFocused(props.params.focusRegion); + const isHighlighted = isFocused && shouldHighlightFocusedRegions; + + return ( + + {props.children} + + ); + } +); +AutoLayoutPanelContainer.displayName = 'AutoLayoutPanelContainer'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx b/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx index fe2ee6d223..3b28be2799 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx @@ -1,6 +1,5 @@ import { Divider, Flex } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; -import { FocusRegionWrapper } from 'common/components/FocusRegionWrapper'; import { CanvasAddEntityButtons } from 'features/controlLayers/components/CanvasAddEntityButtons'; import { CanvasEntityList } from 'features/controlLayers/components/CanvasEntityList/CanvasEntityList'; import { EntityListSelectedEntityActionBar } from 'features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBar'; @@ -15,14 +14,14 @@ export const CanvasLayersPanel = memo(() => { return ( - + {!hasEntities && } {hasEntities && } - + ); }); diff --git a/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx b/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx index afaf0586af..527c43e298 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx @@ -1,5 +1,4 @@ import { Button, Flex, Grid, Heading, Text } from '@invoke-ai/ui-library'; -import { FocusRegionWrapper } from 'common/components/FocusRegionWrapper'; import { useAutoLayoutContext } from 'features/ui/layouts/auto-layout-context'; import { WORKSPACE_PANEL_ID } from 'features/ui/layouts/shared'; import { memo, useCallback } from 'react'; @@ -18,7 +17,7 @@ export const CanvasLaunchpadPanel = memo(() => { ctx.focusPanel(WORKSPACE_PANEL_ID); }, [ctx]); return ( - + {t('ui.launchpad.canvasTitle')} @@ -44,7 +43,7 @@ export const CanvasLaunchpadPanel = memo(() => { - + ); }); CanvasLaunchpadPanel.displayName = 'CanvasLaunchpadPanel'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx b/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx index f27d6918cf..f9dba37298 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx @@ -1,6 +1,5 @@ import { Alert, Button, Flex, Grid, Heading, Text } from '@invoke-ai/ui-library'; import { useAppDispatch } from 'app/store/storeHooks'; -import { FocusRegionWrapper } from 'common/components/FocusRegionWrapper'; import { InitialStateMainModelPicker } from 'features/controlLayers/components/SimpleSession/InitialStateMainModelPicker'; import { LaunchpadAddStyleReference } from 'features/controlLayers/components/SimpleSession/LaunchpadAddStyleReference'; import { setActiveTab } from 'features/ui/store/uiSlice'; @@ -15,7 +14,7 @@ export const GenerateLaunchpadPanel = memo(() => { }, [dispatch]); return ( - + Generate images from text prompts. @@ -47,7 +46,7 @@ export const GenerateLaunchpadPanel = memo(() => { - + ); }); GenerateLaunchpadPanel.displayName = 'GenerateLaunchpad'; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/WorkflowsLaunchpadPanel.tsx b/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/WorkflowsLaunchpadPanel.tsx index df0a11450c..9ee01f2921 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/WorkflowsLaunchpadPanel.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/WorkflowsLaunchpadPanel.tsx @@ -1,5 +1,4 @@ import { Button, Flex, Heading, Icon, Text } from '@invoke-ai/ui-library'; -import { FocusRegionWrapper } from 'common/components/FocusRegionWrapper'; import { useWorkflowLibraryModal } from 'features/nodes/store/workflowLibraryModal'; import { useLoadWorkflowWithDialog } from 'features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog'; import { useNewWorkflow } from 'features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog'; @@ -46,7 +45,7 @@ export const WorkflowsLaunchpadPanel = memo(() => { }); return ( - + {t('ui.launchpad.workflowsTitle')} @@ -102,7 +101,7 @@ export const WorkflowsLaunchpadPanel = memo(() => { - + ); }); diff --git a/invokeai/frontend/web/src/features/gallery/components/BoardsListPanelContent.tsx b/invokeai/frontend/web/src/features/gallery/components/BoardsListPanelContent.tsx index a8a504d15a..a5623b65cb 100644 --- a/invokeai/frontend/web/src/features/gallery/components/BoardsListPanelContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/BoardsListPanelContent.tsx @@ -1,7 +1,6 @@ import { Box, Button, Collapse, Divider, Flex, IconButton } from '@invoke-ai/ui-library'; import { useStore } from '@nanostores/react'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { FocusRegionWrapper } from 'common/components/FocusRegionWrapper'; import { useDisclosure } from 'common/hooks/useBoolean'; import { BoardsListWrapper } from 'features/gallery/components/Boards/BoardsList/BoardsListWrapper'; import { BoardsSearch } from 'features/gallery/components/Boards/BoardsList/BoardsSearch'; @@ -46,7 +45,7 @@ export const BoardsPanel = memo(() => { }, [boardSearchText.length, searchDisclosure, collapsibleApi, dispatch]); return ( - +