diff --git a/invokeai/frontend/web/src/common/components/InvButton/theme.ts b/invokeai/frontend/web/src/common/components/InvButton/theme.ts index afd9aa4e98..5b54c36f97 100644 --- a/invokeai/frontend/web/src/common/components/InvButton/theme.ts +++ b/invokeai/frontend/web/src/common/components/InvButton/theme.ts @@ -204,7 +204,7 @@ export const buttonTheme = defineStyleConfig({ _hover: { bg: 'none', svg: { - fill: 'base.500', + fill: 'base.400', }, }, '&[data-selected="true"]': { diff --git a/invokeai/frontend/web/src/common/components/InvProgress/theme.ts b/invokeai/frontend/web/src/common/components/InvProgress/theme.ts index 7b9ecea23a..4ca58154cb 100644 --- a/invokeai/frontend/web/src/common/components/InvProgress/theme.ts +++ b/invokeai/frontend/web/src/common/components/InvProgress/theme.ts @@ -1,35 +1,57 @@ import { progressAnatomy as parts } from '@chakra-ui/anatomy'; -import { - createMultiStyleConfigHelpers, - defineStyle, -} from '@chakra-ui/styled-system'; +import { createMultiStyleConfigHelpers } from '@chakra-ui/styled-system'; +import { generateStripe, getColorVar } from '@chakra-ui/theme-tools'; const { defineMultiStyleConfig, definePartsStyle } = createMultiStyleConfigHelpers(parts.keys); -const invokeAIFilledTrack = defineStyle((_props) => ({ - bg: 'blue.500', -})); - -const invokeAITrack = defineStyle((_props) => { - return { - bg: 'base.800', - }; -}); - -const invokeAI = definePartsStyle((props) => ({ - filledTrack: invokeAIFilledTrack(props), - track: invokeAITrack(props), -})); - export const progressTheme = defineMultiStyleConfig({ - baseStyle: { - track: { borderRadius: '2px' }, - }, - variants: { - invokeAI, - }, - defaultProps: { - variant: 'invokeAI', - }, + baseStyle: definePartsStyle( + ({ theme: t, colorScheme: c, hasStripe, isIndeterminate }) => { + const bgColor = `${c}.300`; + const addStripe = !isIndeterminate && hasStripe; + const gradient = `linear-gradient( + to right, + transparent 0%, + ${getColorVar(t, bgColor)} 50%, + transparent 100% + )`; + return { + track: { + borderRadius: '2px', + bg: 'base.800', + }, + filledTrack: { + borderRadius: '2px', + ...(addStripe && generateStripe()), + ...(isIndeterminate ? { bgImage: gradient } : { bgColor }), + }, + }; + } + ), }); +// export const progressTheme = defineMultiStyleConfig({ +// baseStyle: definePartsStyle( +// ({ theme: t, colorScheme: c, hasStripe, isIndeterminate }) => { +// const bgColor = `${c}.500`; +// const addStripe = !isIndeterminate && hasStripe; +// const gradient = `linear-gradient( +// to right, +// transparent 0%, +// ${getColorVar(t, bgColor)} 50%, +// transparent 100% +// )`; +// return { +// track: { +// borderRadius: '2px', +// bg: 'base.800', +// }, +// filledTrack: { +// borderRadius: '2px', +// ...(addStripe && generateStripe("xs")), +// ...(isIndeterminate ? { bgImage: gradient } : { bgColor }), +// }, +// }; +// } +// ), +// }); diff --git a/invokeai/frontend/web/src/common/components/InvTooltip/InvTooltip.tsx b/invokeai/frontend/web/src/common/components/InvTooltip/InvTooltip.tsx index 226681e4b0..684490fc24 100644 --- a/invokeai/frontend/web/src/common/components/InvTooltip/InvTooltip.tsx +++ b/invokeai/frontend/web/src/common/components/InvTooltip/InvTooltip.tsx @@ -12,6 +12,7 @@ export const InvTooltip = memo( ref={ref} hasArrow={hasArrow} placement={placement} + arrowSize={8} {...rest} > {children} diff --git a/invokeai/frontend/web/src/common/components/InvTooltip/theme.ts b/invokeai/frontend/web/src/common/components/InvTooltip/theme.ts index 42f7d83c48..2e7f2190aa 100644 --- a/invokeai/frontend/web/src/common/components/InvTooltip/theme.ts +++ b/invokeai/frontend/web/src/common/components/InvTooltip/theme.ts @@ -3,14 +3,15 @@ import { cssVar } from '@chakra-ui/theme-tools'; const $arrowBg = cssVar('popper-arrow-bg'); -// define the base component styles const baseStyle = defineStyle(() => ({ borderRadius: 'md', shadow: 'dark-lg', bg: 'base.200', color: 'base.800', [$arrowBg.variable]: 'colors.base.200', - pb: 1.5, + pt: 1, + px: 2, + pb: 1, })); // export the component theme diff --git a/invokeai/frontend/web/src/features/queue/components/InvokeQueueBackButton.tsx b/invokeai/frontend/web/src/features/queue/components/InvokeQueueBackButton.tsx index a8b56c91ad..155a77858f 100644 --- a/invokeai/frontend/web/src/features/queue/components/InvokeQueueBackButton.tsx +++ b/invokeai/frontend/web/src/features/queue/components/InvokeQueueBackButton.tsx @@ -28,6 +28,7 @@ const selector = createMemoizedSelector([stateSelector], (state) => { const { initial, min, sliderMax, inputMax, fineStep, coarseStep } = state.config.sd.iterations; const { iterations } = state.generation; + const isLoadingDynamicPrompts = state.dynamicPrompts.isLoading; return { iterations, @@ -37,15 +38,14 @@ const selector = createMemoizedSelector([stateSelector], (state) => { inputMax, step: coarseStep, fineStep, + isLoadingDynamicPrompts, }; }); export const InvokeQueueBackButton = memo(() => { - const isLoadingDynamicPrompts = useAppSelector( - (state) => state.dynamicPrompts.isLoading - ); const { queueBack, isLoading, isDisabled } = useQueueBack(); - const { iterations, step, fineStep } = useAppSelector(selector); + const { iterations, step, fineStep, isLoadingDynamicPrompts } = + useAppSelector(selector); const dispatch = useAppDispatch(); const handleChange = useCallback( (v: number) => { diff --git a/invokeai/frontend/web/src/features/queue/components/QueueControls.tsx b/invokeai/frontend/web/src/features/queue/components/QueueControls.tsx index e5ce3a30d9..61dd0f5473 100644 --- a/invokeai/frontend/web/src/features/queue/components/QueueControls.tsx +++ b/invokeai/frontend/web/src/features/queue/components/QueueControls.tsx @@ -3,7 +3,6 @@ import { InvButtonGroup } from 'common/components/InvButtonGroup/InvButtonGroup' import ClearQueueButton from 'features/queue/components/ClearQueueButton'; import QueueFrontButton from 'features/queue/components/QueueFrontButton'; import ProgressBar from 'features/system/components/ProgressBar'; -import StatusIndicator from 'features/system/components/StatusIndicator'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { memo } from 'react'; @@ -31,10 +30,7 @@ const QueueControls = () => { {isPauseEnabled && } */} - - - - + ); }; diff --git a/invokeai/frontend/web/src/features/system/components/ProgressBar.tsx b/invokeai/frontend/web/src/features/system/components/ProgressBar.tsx index ceee058a62..9e8fd6db1e 100644 --- a/invokeai/frontend/web/src/features/system/components/ProgressBar.tsx +++ b/invokeai/frontend/web/src/features/system/components/ProgressBar.tsx @@ -16,12 +16,7 @@ const progressBarSelector = createMemoizedSelector( } ); -type ProgressBarProps = { - height?: number | string; -}; - -const ProgressBar = (props: ProgressBarProps) => { - const { height = 'full' } = props; +const ProgressBar = () => { const { t } = useTranslation(); const { data: queueStatus } = useGetQueueStatusQuery(); const { hasSteps, value, isConnected } = useAppSelector(progressBarSelector); @@ -30,13 +25,12 @@ const ProgressBar = (props: ProgressBarProps) => { ); }; diff --git a/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx b/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx index fc137274dc..5d7d375cd7 100644 --- a/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx +++ b/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx @@ -1,81 +1,28 @@ -import { Flex, Icon } from '@chakra-ui/react'; -import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; -import { stateSelector } from 'app/store/store'; +import { Icon } from '@chakra-ui/react'; import { useAppSelector } from 'app/store/storeHooks'; -import { InvText } from 'common/components/InvText/wrapper'; import { InvTooltip } from 'common/components/InvTooltip/InvTooltip'; -import { STATUS_TRANSLATION_KEYS } from 'features/system/store/types'; -import type { ResourceKey } from 'i18next'; -import { memo, useMemo, useRef } from 'react'; +import { memo } from 'react'; import { useTranslation } from 'react-i18next'; -import { FaCircle } from 'react-icons/fa'; -import { useHoverDirty } from 'react-use'; -import { useGetQueueStatusQuery } from 'services/api/endpoints/queue'; - -const statusIndicatorSelector = createMemoizedSelector( - stateSelector, - ({ system }) => { - const { isConnected, status } = system; - - return { - isConnected, - statusTranslationKey: STATUS_TRANSLATION_KEYS[status], - }; - } -); - -const COLOR_MAP = { - ok: 'invokeYellow.500', - working: 'blue.500', - error: 'red.500', -}; +import { FaExclamationTriangle } from 'react-icons/fa'; const StatusIndicator = () => { - const { isConnected, statusTranslationKey } = useAppSelector( - statusIndicatorSelector - ); + const isConnected = useAppSelector((state) => state.system.isConnected); const { t } = useTranslation(); - const ref = useRef(null); - const { data: queueStatus } = useGetQueueStatusQuery(); - const statusColor = useMemo(() => { - if (!isConnected) { - return 'error'; - } - - if (queueStatus?.queue.in_progress) { - return 'working'; - } - - return 'ok'; - }, [queueStatus?.queue.in_progress, isConnected]); - - const isHovered = useHoverDirty(ref); - - return ( - + if (!isConnected) { + return ( - {t(statusTranslationKey as ResourceKey)} - - ) - } + label={t('common.statusDisconnected')} + placement="end" + shouldWrapChildren + gutter={10} > - + - - ); + ); + } + + return null; }; export default memo(StatusIndicator); diff --git a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx index b7176260b8..07c4167709 100644 --- a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx +++ b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx @@ -15,6 +15,7 @@ import ImageGalleryContent from 'features/gallery/components/ImageGalleryContent import NodeEditorPanelGroup from 'features/nodes/components/sidePanel/NodeEditorPanelGroup'; import InvokeAILogoComponent from 'features/system/components/InvokeAILogoComponent'; import SettingsMenu from 'features/system/components/SettingsModal/SettingsMenu'; +import StatusIndicator from 'features/system/components/StatusIndicator'; import type { UsePanelOptions } from 'features/ui/hooks/usePanel'; import { usePanel } from 'features/ui/hooks/usePanel'; import { usePanelStorage } from 'features/ui/hooks/usePanelStorage'; @@ -125,17 +126,17 @@ const InvokeTabs = () => { () => enabledTabs.map((tab) => ( - + + + )), [enabledTabs, t, handleClickTab, activeTabName] @@ -254,13 +255,14 @@ const InvokeTabs = () => { p={4} isLazy > - + - + {tabs} - - + + +