From b78ac40a22c7f0439083a68f9bd5be5448d67630 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:32:44 +1000 Subject: [PATCH] feat(ui): workflows panel redesign WIP --- invokeai/frontend/web/public/locales/en.json | 2 ++ .../sidePanel/NewWorkflowButton.tsx | 2 +- .../ActiveWorkflowDescription.tsx | 2 +- .../WorkflowListMenu/SaveWorkflowButton.tsx | 2 +- .../WorkflowListMenuTrigger.tsx | 10 +++++-- .../WorkflowViewEditToggleButton.tsx | 8 +++--- .../sidePanel/WorkflowsTabLeftPanel.tsx | 3 +-- .../builder/ContainerElementComponent.tsx | 6 ++--- .../builder/DndListDropIndicator.tsx | 2 +- .../builder/FormElementEditModeHeader.tsx | 18 +++++++------ .../builder/FormElementEditModeWrapper.tsx | 6 ++--- .../builder/NodeFieldElementComponent.tsx | 2 +- .../sidePanel/builder/WorkflowBuilder.tsx | 27 ++++--------------- .../components/sidePanel/builder/dnd-hooks.ts | 2 +- 14 files changed, 42 insertions(+), 50 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index ee9791eb1c..d51dcc7e72 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1707,7 +1707,9 @@ "copyShareLink": "Copy Share Link", "copyShareLinkForWorkflow": "Copy Share Link for Workflow", "delete": "Delete", + "openLibrary": "Open Library", "builder": { + "resetForm": "Reset Form", "builder": "Form Builder", "layout": "Layout", "row": "Row", diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/NewWorkflowButton.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/NewWorkflowButton.tsx index 7df5f34340..1fa11e2dbe 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/NewWorkflowButton.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/NewWorkflowButton.tsx @@ -22,7 +22,7 @@ export const NewWorkflowButton = memo(() => { return ( { } return ( - + {description} ); diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx index 544e0a1155..dc3b66250c 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx @@ -37,7 +37,7 @@ const SaveWorkflowButton = () => { icon={} onClick={handleClickSave} pointerEvents="auto" - variant="outline" + variant="ghost" size="sm" /> ); diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuTrigger.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuTrigger.tsx index f7d6afce00..9e59e8dfcc 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuTrigger.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuTrigger.tsx @@ -2,7 +2,7 @@ import { IconButton, Popover, PopoverBody, PopoverContent, PopoverTrigger, Porta import { WorkflowListMenuContent } from 'features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuContent'; import { useWorkflowListMenu } from 'features/nodes/store/workflowListMenu'; import { useTranslation } from 'react-i18next'; -import { PiCaretDownBold } from 'react-icons/pi'; +import { PiFolderOpenFill } from 'react-icons/pi'; export const WorkflowListMenuTrigger = () => { const workflowListMenu = useWorkflowListMenu(); @@ -11,7 +11,13 @@ export const WorkflowListMenuTrigger = () => { return ( - } size="sm" /> + } + size="sm" + /> diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx index d9efd092d3..90cf7ae5a6 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx @@ -4,7 +4,7 @@ import { selectWorkflowMode, workflowModeChanged } from 'features/nodes/store/wo import type { MouseEventHandler } from 'react'; import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { PiEyeBold, PiPencilBold } from 'react-icons/pi'; +import { PiEyeBold, PiPencilSimpleFill } from 'react-icons/pi'; export const WorkflowViewEditToggleButton = memo(() => { const dispatch = useAppDispatch(); @@ -33,8 +33,8 @@ export const WorkflowViewEditToggleButton = memo(() => { aria-label={t('nodes.editMode')} tooltip={t('nodes.editMode')} onClick={onClickEdit} - icon={} - variant="outline" + icon={} + variant="ghost" size="sm" /> ); @@ -47,7 +47,7 @@ export const WorkflowViewEditToggleButton = memo(() => { tooltip={t('nodes.viewMode')} onClick={onClickView} icon={} - variant="outline" + variant="ghost" size="sm" /> ); diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx index e441739245..8dfd0a2aff 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx @@ -1,4 +1,4 @@ -import { Divider, Flex } from '@invoke-ai/ui-library'; +import { Flex } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; import { EditModeLeftPanelContent } from 'features/nodes/components/sidePanel/EditModeLeftPanelContent'; import { ActiveWorkflowDescription } from 'features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowDescription'; @@ -15,7 +15,6 @@ const WorkflowsTabLeftPanel = () => { - {mode === 'view' && } {mode === 'edit' && } diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/ContainerElementComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/ContainerElementComponent.tsx index 841d32127c..f94ba6a786 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/ContainerElementComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/ContainerElementComponent.tsx @@ -27,7 +27,7 @@ import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; const sx: SystemStyleObject = { - gap: 2, + gap: 4, flex: '1 1 0', '&[data-depth="0"]': { flex: 1, @@ -71,7 +71,7 @@ const ContainerElementComponentViewMode = memo(({ el }: { el: ContainerElement } ))} {children.length === 0 && ( - + {t('workflows.builder.containerPlaceholder')} )} @@ -97,7 +97,7 @@ const ContainerElementComponentEditMode = memo(({ el }: { el: ContainerElement } ))} {children.length === 0 && ( - + {t('workflows.builder.containerPlaceholderDesc')} )} diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/DndListDropIndicator.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/DndListDropIndicator.tsx index 9ce6294fd2..55f0ef56c3 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/DndListDropIndicator.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/DndListDropIndicator.tsx @@ -9,7 +9,7 @@ import type { CenterOrEdge } from 'features/nodes/components/sidePanel/builder/c */ const line = { thickness: 2, - backgroundColor: 'base.500', + backgroundColor: 'base.600', }; type DropIndicatorProps = { diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx index 4174a2d315..98caa959c5 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx @@ -21,12 +21,12 @@ const sx: SystemStyleObject = { maxH: 8, borderTopRadius: 'base', alignItems: 'center', - cursor: 'grab', color: 'base.300', bg: 'baseAlpha.250', '&[data-depth="0"]': { bg: 'baseAlpha.100' }, '&[data-depth="1"]': { bg: 'baseAlpha.150' }, '&[data-depth="2"]': { bg: 'baseAlpha.200' }, + '&[data-is-root="false"]': { cursor: 'grab' }, }; export const FormElementEditModeHeader = memo( @@ -42,18 +42,20 @@ export const FormElementEditModeHeader = memo( dispatch(formElementRemoved({ id: element.id })); }, [dispatch, element.id, isRootElement]); const label = useMemo(() => { - if (isContainerElement(element)) { - const baseLabel = isRootElement ? 'Root Container' : 'Container'; - if (element.data.layout === 'column') { - return `${baseLabel} (column layout)`; - } - return `${baseLabel} (row layout)`; + if (isRootElement) { + return 'Root Container'; + } + if (isContainerElement(element) && element.data.layout === 'column') { + return `Container (column layout)`; + } + if (isContainerElement(element) && element.data.layout === 'row') { + return `Container (row layout)`; } return startCase(element.type); }, [element, isRootElement]); return ( - + {label} diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeWrapper.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeWrapper.tsx index 4b42ddcbb1..a1a975483e 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeWrapper.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/FormElementEditModeWrapper.tsx @@ -36,7 +36,7 @@ const innerSx: SystemStyleObject = { }, '&[data-active-drop-region="center"]': { opacity: 1, - bg: 'base.700', + bg: 'base.850', }, '&[data-element-type="divider"]&[data-layout="row"]': { w: 'min-content', @@ -49,8 +49,8 @@ const innerSx: SystemStyleObject = { const contentWrapperSx: SystemStyleObject = { w: 'full', h: 'full', - p: 2, - gap: 2, + p: 4, + gap: 4, borderWidth: 1, borderRadius: 'base', borderTopRadius: 'unset', diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/NodeFieldElementComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/NodeFieldElementComponent.tsx index 6b54ae00a8..c903c14394 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/NodeFieldElementComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/NodeFieldElementComponent.tsx @@ -54,7 +54,7 @@ const NodeFieldElementComponentViewMode = memo(({ el }: { el: NodeFieldElement } ); return ( - + {_label} diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx index 6e9506d7e5..a5d54c9b28 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx @@ -1,6 +1,6 @@ import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine'; import { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'; -import { Alert, AlertDescription, AlertIcon, Button, ButtonGroup, Flex, Spacer } from '@invoke-ai/ui-library'; +import { Button, ButtonGroup, Flex, Spacer } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent'; import { firefoxDndFix } from 'features/dnd/util'; @@ -28,19 +28,15 @@ export const WorkflowBuilder = memo(() => { return ( - - - - {t('workflows.builder.workflowBuilderAlphaWarning')} - - + + @@ -106,20 +102,7 @@ const AddFormElementDndButton = ({ type }: { type: Parameters + ); diff --git a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts index 3f285a04e3..e5cf72041a 100644 --- a/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts +++ b/invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts @@ -65,7 +65,7 @@ const isFormElementDndData = (data: Record): data is F const flashElement = (elementId: ElementId) => { const element = document.querySelector(`#${getEditModeWrapperId(elementId)}`); if (element instanceof HTMLElement) { - triggerPostMoveFlash(element, colorTokenToCssVar('base.700')); + triggerPostMoveFlash(element, colorTokenToCssVar('base.800')); } };