Updated icons + Minor UI Tweaks (#5427)

* feat: 💄 updated icons + minor ui tweaks

* revert: 💄 removes ui tweaks

* revert: 💄 removed more ui tweaks

removed more ui tweaks and a commented-out icon import

* style: 🚨 satisfy the linter

---------

Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
This commit is contained in:
Josh Corbett 2024-01-06 20:14:44 -07:00 committed by GitHub
parent ebda81e96e
commit 5779542084
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
57 changed files with 281 additions and 234 deletions

View File

@ -42,9 +42,9 @@ const line = definePartsStyle(() => ({
px: 4, px: 4,
py: 1, py: 1,
fontSize: 'sm', fontSize: 'sm',
color: 'base.400', color: 'base.200',
_selected: { _selected: {
color: 'blue.400', color: 'blue.200',
}, },
}, },
tabpanel: { tabpanel: {

View File

@ -6,7 +6,7 @@ import { isStagingSelector } from 'features/canvas/store/canvasSelectors';
import { clearCanvasHistory } from 'features/canvas/store/canvasSlice'; import { clearCanvasHistory } from 'features/canvas/store/canvasSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaTrash } from 'react-icons/fa'; import { PiTrashSimpleFill } from 'react-icons/pi';
const ClearCanvasHistoryButtonModal = () => { const ClearCanvasHistoryButtonModal = () => {
const isStaging = useAppSelector(isStagingSelector); const isStaging = useAppSelector(isStagingSelector);
@ -23,7 +23,7 @@ const ClearCanvasHistoryButtonModal = () => {
<InvButton <InvButton
onClick={onOpen} onClick={onOpen}
size="sm" size="sm"
leftIcon={<FaTrash />} leftIcon={<PiTrashSimpleFill />}
isDisabled={isStaging} isDisabled={isStaging}
> >
{t('unifiedCanvas.clearCanvasHistory')} {t('unifiedCanvas.clearCanvasHistory')}

View File

@ -19,14 +19,14 @@ import { memo, useCallback } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { import {
FaArrowLeft, PiArrowLeftBold,
FaArrowRight, PiArrowRightBold,
FaCheck, PiCheckBold,
FaEye, PiEyeBold,
FaEyeSlash, PiEyeSlashBold,
FaSave, PiFloppyDiskBold,
FaTimes, PiXBold,
} from 'react-icons/fa'; } from 'react-icons/pi';
import { useGetImageDTOQuery } from 'services/api/endpoints/images'; import { useGetImageDTOQuery } from 'services/api/endpoints/images';
const selector = createMemoizedSelector(selectCanvasSlice, (canvas) => { const selector = createMemoizedSelector(selectCanvasSlice, (canvas) => {
@ -140,7 +140,7 @@ const IAICanvasStagingAreaToolbar = () => {
<InvIconButton <InvIconButton
tooltip={`${t('unifiedCanvas.previous')} (Left)`} tooltip={`${t('unifiedCanvas.previous')} (Left)`}
aria-label={`${t('unifiedCanvas.previous')} (Left)`} aria-label={`${t('unifiedCanvas.previous')} (Left)`}
icon={<FaArrowLeft />} icon={<PiArrowLeftBold />}
onClick={handlePrevImage} onClick={handlePrevImage}
colorScheme="invokeBlue" colorScheme="invokeBlue"
isDisabled={!shouldShowStagingImage} isDisabled={!shouldShowStagingImage}
@ -154,7 +154,7 @@ const IAICanvasStagingAreaToolbar = () => {
<InvIconButton <InvIconButton
tooltip={`${t('unifiedCanvas.next')} (Right)`} tooltip={`${t('unifiedCanvas.next')} (Right)`}
aria-label={`${t('unifiedCanvas.next')} (Right)`} aria-label={`${t('unifiedCanvas.next')} (Right)`}
icon={<FaArrowRight />} icon={<PiArrowRightBold />}
onClick={handleNextImage} onClick={handleNextImage}
colorScheme="invokeBlue" colorScheme="invokeBlue"
isDisabled={!shouldShowStagingImage} isDisabled={!shouldShowStagingImage}
@ -164,7 +164,7 @@ const IAICanvasStagingAreaToolbar = () => {
<InvIconButton <InvIconButton
tooltip={`${t('unifiedCanvas.accept')} (Enter)`} tooltip={`${t('unifiedCanvas.accept')} (Enter)`}
aria-label={`${t('unifiedCanvas.accept')} (Enter)`} aria-label={`${t('unifiedCanvas.accept')} (Enter)`}
icon={<FaCheck />} icon={<PiCheckBold />}
onClick={handleAccept} onClick={handleAccept}
colorScheme="invokeBlue" colorScheme="invokeBlue"
/> />
@ -180,7 +180,7 @@ const IAICanvasStagingAreaToolbar = () => {
: t('unifiedCanvas.showResultsOff') : t('unifiedCanvas.showResultsOff')
} }
data-alert={!shouldShowStagingImage} data-alert={!shouldShowStagingImage}
icon={shouldShowStagingImage ? <FaEye /> : <FaEyeSlash />} icon={shouldShowStagingImage ? <PiEyeBold /> : <PiEyeSlashBold />}
onClick={handleToggleShouldShowStagingImage} onClick={handleToggleShouldShowStagingImage}
colorScheme="invokeBlue" colorScheme="invokeBlue"
/> />
@ -188,14 +188,14 @@ const IAICanvasStagingAreaToolbar = () => {
tooltip={t('unifiedCanvas.saveToGallery')} tooltip={t('unifiedCanvas.saveToGallery')}
aria-label={t('unifiedCanvas.saveToGallery')} aria-label={t('unifiedCanvas.saveToGallery')}
isDisabled={!imageDTO || !imageDTO.is_intermediate} isDisabled={!imageDTO || !imageDTO.is_intermediate}
icon={<FaSave />} icon={<PiFloppyDiskBold />}
onClick={handleSaveToGallery} onClick={handleSaveToGallery}
colorScheme="invokeBlue" colorScheme="invokeBlue"
/> />
<InvIconButton <InvIconButton
tooltip={t('unifiedCanvas.discardAll')} tooltip={t('unifiedCanvas.discardAll')}
aria-label={t('unifiedCanvas.discardAll')} aria-label={t('unifiedCanvas.discardAll')}
icon={<FaTimes />} icon={<PiXBold />}
onClick={handleDiscardStagingArea} onClick={handleDiscardStagingArea}
colorScheme="error" colorScheme="error"
fontSize={20} fontSize={20}

View File

@ -25,7 +25,11 @@ import { memo, useCallback } from 'react';
import type { RgbaColor } from 'react-colorful'; import type { RgbaColor } from 'react-colorful';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaMask, FaSave, FaTrash } from 'react-icons/fa'; import {
PiExcludeBold,
PiFloppyDiskBackFill,
PiTrashSimpleFill,
} from 'react-icons/pi';
const IAICanvasMaskOptions = () => { const IAICanvasMaskOptions = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -110,7 +114,7 @@ const IAICanvasMaskOptions = () => {
<InvIconButton <InvIconButton
aria-label={t('unifiedCanvas.maskingOptions')} aria-label={t('unifiedCanvas.maskingOptions')}
tooltip={t('unifiedCanvas.maskingOptions')} tooltip={t('unifiedCanvas.maskingOptions')}
icon={<FaMask />} icon={<PiExcludeBold />}
isChecked={layer === 'mask'} isChecked={layer === 'mask'}
isDisabled={isStaging} isDisabled={isStaging}
/> />
@ -136,12 +140,16 @@ const IAICanvasMaskOptions = () => {
onChange={handleChangeMaskColor} onChange={handleChangeMaskColor}
/> />
</Box> </Box>
<InvButton size="sm" leftIcon={<FaSave />} onClick={handleSaveMask}> <InvButton
size="sm"
leftIcon={<PiFloppyDiskBackFill />}
onClick={handleSaveMask}
>
{t('unifiedCanvas.saveMask')} {t('unifiedCanvas.saveMask')}
</InvButton> </InvButton>
<InvButton <InvButton
size="sm" size="sm"
leftIcon={<FaTrash />} leftIcon={<PiTrashSimpleFill />}
onClick={handleClearMask} onClick={handleClearMask}
> >
{t('unifiedCanvas.clearMask')} {t('unifiedCanvas.clearMask')}

View File

@ -5,7 +5,7 @@ import { activeTabNameSelector } from 'features/ui/store/uiSelectors';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaRedo } from 'react-icons/fa'; import { PiArrowClockwiseBold } from 'react-icons/pi';
const IAICanvasRedoButton = () => { const IAICanvasRedoButton = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -34,7 +34,7 @@ const IAICanvasRedoButton = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.redo')} (Ctrl+Shift+Z)`} aria-label={`${t('unifiedCanvas.redo')} (Ctrl+Shift+Z)`}
tooltip={`${t('unifiedCanvas.redo')} (Ctrl+Shift+Z)`} tooltip={`${t('unifiedCanvas.redo')} (Ctrl+Shift+Z)`}
icon={<FaRedo />} icon={<PiArrowClockwiseBold />}
onClick={handleRedo} onClick={handleRedo}
isDisabled={!canRedo} isDisabled={!canRedo}
/> />

View File

@ -24,7 +24,7 @@ import type { ChangeEvent } from 'react';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaWrench } from 'react-icons/fa'; import { PiGearSixBold } from 'react-icons/pi';
const IAICanvasSettingsButtonPopover = () => { const IAICanvasSettingsButtonPopover = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -114,7 +114,7 @@ const IAICanvasSettingsButtonPopover = () => {
<InvIconButton <InvIconButton
tooltip={t('unifiedCanvas.canvasSettings')} tooltip={t('unifiedCanvas.canvasSettings')}
aria-label={t('unifiedCanvas.canvasSettings')} aria-label={t('unifiedCanvas.canvasSettings')}
icon={<FaWrench />} icon={<PiGearSixBold />}
/> />
</InvPopoverTrigger> </InvPopoverTrigger>
<InvPopoverContent> <InvPopoverContent>

View File

@ -26,13 +26,13 @@ import type { RgbaColor } from 'react-colorful';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { import {
FaEraser, PiEraserBold,
FaEyeDropper, PiEyedropperBold,
FaFillDrip, PiPaintBrushBold,
FaPaintBrush, PiPaintBucketBold,
FaSlidersH, PiSlidersHorizontalBold,
FaTimes, PiXBold,
} from 'react-icons/fa'; } from 'react-icons/pi';
const IAICanvasToolChooserOptions = () => { const IAICanvasToolChooserOptions = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -198,7 +198,7 @@ const IAICanvasToolChooserOptions = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.brush')} (B)`} aria-label={`${t('unifiedCanvas.brush')} (B)`}
tooltip={`${t('unifiedCanvas.brush')} (B)`} tooltip={`${t('unifiedCanvas.brush')} (B)`}
icon={<FaPaintBrush />} icon={<PiPaintBrushBold />}
isChecked={tool === 'brush' && !isStaging} isChecked={tool === 'brush' && !isStaging}
onClick={handleSelectBrushTool} onClick={handleSelectBrushTool}
isDisabled={isStaging} isDisabled={isStaging}
@ -206,7 +206,7 @@ const IAICanvasToolChooserOptions = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.eraser')} (E)`} aria-label={`${t('unifiedCanvas.eraser')} (E)`}
tooltip={`${t('unifiedCanvas.eraser')} (E)`} tooltip={`${t('unifiedCanvas.eraser')} (E)`}
icon={<FaEraser />} icon={<PiEraserBold />}
isChecked={tool === 'eraser' && !isStaging} isChecked={tool === 'eraser' && !isStaging}
isDisabled={isStaging} isDisabled={isStaging}
onClick={handleSelectEraserTool} onClick={handleSelectEraserTool}
@ -214,21 +214,21 @@ const IAICanvasToolChooserOptions = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.fillBoundingBox')} (Shift+F)`} aria-label={`${t('unifiedCanvas.fillBoundingBox')} (Shift+F)`}
tooltip={`${t('unifiedCanvas.fillBoundingBox')} (Shift+F)`} tooltip={`${t('unifiedCanvas.fillBoundingBox')} (Shift+F)`}
icon={<FaFillDrip />} icon={<PiPaintBucketBold />}
isDisabled={isStaging} isDisabled={isStaging}
onClick={handleFillRect} onClick={handleFillRect}
/> />
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.eraseBoundingBox')} (Del/Backspace)`} aria-label={`${t('unifiedCanvas.eraseBoundingBox')} (Del/Backspace)`}
tooltip={`${t('unifiedCanvas.eraseBoundingBox')} (Del/Backspace)`} tooltip={`${t('unifiedCanvas.eraseBoundingBox')} (Del/Backspace)`}
icon={<FaTimes />} icon={<PiXBold />}
isDisabled={isStaging} isDisabled={isStaging}
onClick={handleEraseBoundingBox} onClick={handleEraseBoundingBox}
/> />
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.colorPicker')} (C)`} aria-label={`${t('unifiedCanvas.colorPicker')} (C)`}
tooltip={`${t('unifiedCanvas.colorPicker')} (C)`} tooltip={`${t('unifiedCanvas.colorPicker')} (C)`}
icon={<FaEyeDropper />} icon={<PiEyedropperBold />}
isChecked={tool === 'colorPicker' && !isStaging} isChecked={tool === 'colorPicker' && !isStaging}
isDisabled={isStaging} isDisabled={isStaging}
onClick={handleSelectColorPickerTool} onClick={handleSelectColorPickerTool}
@ -238,7 +238,7 @@ const IAICanvasToolChooserOptions = () => {
<InvIconButton <InvIconButton
aria-label={t('unifiedCanvas.brushOptions')} aria-label={t('unifiedCanvas.brushOptions')}
tooltip={t('unifiedCanvas.brushOptions')} tooltip={t('unifiedCanvas.brushOptions')}
icon={<FaSlidersH />} icon={<PiSlidersHorizontalBold />}
/> />
</InvPopoverTrigger> </InvPopoverTrigger>
<InvPopoverContent> <InvPopoverContent>

View File

@ -30,15 +30,15 @@ import { memo, useCallback, useMemo } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { import {
FaArrowsAlt, PiCopyBold,
FaCopy, PiCrosshairSimpleBold,
FaCrosshairs, PiDownloadSimpleBold,
FaDownload, PiFloppyDiskBold,
FaLayerGroup, PiHandGrabbingBold,
FaSave, PiStackBold,
FaTrash, PiTrashSimpleBold,
FaUpload, PiUploadSimpleBold,
} from 'react-icons/fa'; } from 'react-icons/pi';
import IAICanvasMaskOptions from './IAICanvasMaskOptions'; import IAICanvasMaskOptions from './IAICanvasMaskOptions';
import IAICanvasRedoButton from './IAICanvasRedoButton'; import IAICanvasRedoButton from './IAICanvasRedoButton';
@ -217,14 +217,14 @@ const IAICanvasToolbar = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.move')} (V)`} aria-label={`${t('unifiedCanvas.move')} (V)`}
tooltip={`${t('unifiedCanvas.move')} (V)`} tooltip={`${t('unifiedCanvas.move')} (V)`}
icon={<FaArrowsAlt />} icon={<PiHandGrabbingBold />}
isChecked={tool === 'move' || isStaging} isChecked={tool === 'move' || isStaging}
onClick={handleSelectMoveTool} onClick={handleSelectMoveTool}
/> />
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.resetView')} (R)`} aria-label={`${t('unifiedCanvas.resetView')} (R)`}
tooltip={`${t('unifiedCanvas.resetView')} (R)`} tooltip={`${t('unifiedCanvas.resetView')} (R)`}
icon={<FaCrosshairs />} icon={<PiCrosshairSimpleBold />}
onClick={handleClickResetCanvasView} onClick={handleClickResetCanvasView}
/> />
</InvButtonGroup> </InvButtonGroup>
@ -233,14 +233,14 @@ const IAICanvasToolbar = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.mergeVisible')} (Shift+M)`} aria-label={`${t('unifiedCanvas.mergeVisible')} (Shift+M)`}
tooltip={`${t('unifiedCanvas.mergeVisible')} (Shift+M)`} tooltip={`${t('unifiedCanvas.mergeVisible')} (Shift+M)`}
icon={<FaLayerGroup />} icon={<PiStackBold />}
onClick={handleMergeVisible} onClick={handleMergeVisible}
isDisabled={isStaging} isDisabled={isStaging}
/> />
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.saveToGallery')} (Shift+S)`} aria-label={`${t('unifiedCanvas.saveToGallery')} (Shift+S)`}
tooltip={`${t('unifiedCanvas.saveToGallery')} (Shift+S)`} tooltip={`${t('unifiedCanvas.saveToGallery')} (Shift+S)`}
icon={<FaSave />} icon={<PiFloppyDiskBold />}
onClick={handleSaveToGallery} onClick={handleSaveToGallery}
isDisabled={isStaging} isDisabled={isStaging}
/> />
@ -248,7 +248,7 @@ const IAICanvasToolbar = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.copyToClipboard')} (Cmd/Ctrl+C)`} aria-label={`${t('unifiedCanvas.copyToClipboard')} (Cmd/Ctrl+C)`}
tooltip={`${t('unifiedCanvas.copyToClipboard')} (Cmd/Ctrl+C)`} tooltip={`${t('unifiedCanvas.copyToClipboard')} (Cmd/Ctrl+C)`}
icon={<FaCopy />} icon={<PiCopyBold />}
onClick={handleCopyImageToClipboard} onClick={handleCopyImageToClipboard}
isDisabled={isStaging} isDisabled={isStaging}
/> />
@ -256,7 +256,7 @@ const IAICanvasToolbar = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.downloadAsImage')} (Shift+D)`} aria-label={`${t('unifiedCanvas.downloadAsImage')} (Shift+D)`}
tooltip={`${t('unifiedCanvas.downloadAsImage')} (Shift+D)`} tooltip={`${t('unifiedCanvas.downloadAsImage')} (Shift+D)`}
icon={<FaDownload />} icon={<PiDownloadSimpleBold />}
onClick={handleDownloadAsImage} onClick={handleDownloadAsImage}
isDisabled={isStaging} isDisabled={isStaging}
/> />
@ -270,7 +270,7 @@ const IAICanvasToolbar = () => {
<InvIconButton <InvIconButton
aria-label={`${t('common.upload')}`} aria-label={`${t('common.upload')}`}
tooltip={`${t('common.upload')}`} tooltip={`${t('common.upload')}`}
icon={<FaUpload />} icon={<PiUploadSimpleBold />}
isDisabled={isStaging} isDisabled={isStaging}
{...getUploadButtonProps()} {...getUploadButtonProps()}
/> />
@ -278,7 +278,7 @@ const IAICanvasToolbar = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.clearCanvas')}`} aria-label={`${t('unifiedCanvas.clearCanvas')}`}
tooltip={`${t('unifiedCanvas.clearCanvas')}`} tooltip={`${t('unifiedCanvas.clearCanvas')}`}
icon={<FaTrash />} icon={<PiTrashSimpleBold />}
onClick={handleResetCanvas} onClick={handleResetCanvas}
colorScheme="error" colorScheme="error"
isDisabled={isStaging} isDisabled={isStaging}

View File

@ -5,7 +5,7 @@ import { activeTabNameSelector } from 'features/ui/store/uiSelectors';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaUndo } from 'react-icons/fa'; import { PiArrowCounterClockwiseBold } from 'react-icons/pi';
const IAICanvasUndoButton = () => { const IAICanvasUndoButton = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -33,7 +33,7 @@ const IAICanvasUndoButton = () => {
<InvIconButton <InvIconButton
aria-label={`${t('unifiedCanvas.undo')} (Ctrl+Z)`} aria-label={`${t('unifiedCanvas.undo')} (Ctrl+Z)`}
tooltip={`${t('unifiedCanvas.undo')} (Ctrl+Z)`} tooltip={`${t('unifiedCanvas.undo')} (Ctrl+Z)`}
icon={<FaUndo />} icon={<PiArrowCounterClockwiseBold />}
onClick={handleUndo} onClick={handleUndo}
isDisabled={!canUndo} isDisabled={!canUndo}
/> />

View File

@ -16,7 +16,7 @@ import { activeTabNameSelector } from 'features/ui/store/uiSelectors';
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaCopy, FaTrash } from 'react-icons/fa'; import { PiCopyBold, PiTrashSimpleBold } from 'react-icons/pi';
import { useToggle } from 'react-use'; import { useToggle } from 'react-use';
import ControlAdapterImagePreview from './ControlAdapterImagePreview'; import ControlAdapterImagePreview from './ControlAdapterImagePreview';
@ -106,7 +106,7 @@ const ControlAdapterConfig = (props: { id: string; number: number }) => {
tooltip={t('controlnet.duplicate')} tooltip={t('controlnet.duplicate')}
aria-label={t('controlnet.duplicate')} aria-label={t('controlnet.duplicate')}
onClick={handleDuplicate} onClick={handleDuplicate}
icon={<FaCopy />} icon={<PiCopyBold />}
/> />
<InvIconButton <InvIconButton
size="sm" size="sm"
@ -114,7 +114,7 @@ const ControlAdapterConfig = (props: { id: string; number: number }) => {
aria-label={t('controlnet.delete')} aria-label={t('controlnet.delete')}
colorScheme="error" colorScheme="error"
onClick={handleDelete} onClick={handleDelete}
icon={<FaTrash />} icon={<PiTrashSimpleBold />}
/> />
<InvIconButton <InvIconButton
size="sm" size="sm"
@ -132,8 +132,6 @@ const ControlAdapterConfig = (props: { id: string; number: number }) => {
variant="ghost" variant="ghost"
icon={ icon={
<ChevronUpIcon <ChevronUpIcon
boxSize={4}
color="base.300"
transform={isExpanded ? 'rotate(0deg)' : 'rotate(180deg)'} transform={isExpanded ? 'rotate(0deg)' : 'rotate(180deg)'}
transitionProperty="common" transitionProperty="common"
transitionDuration="normal" transitionDuration="normal"
@ -143,7 +141,7 @@ const ControlAdapterConfig = (props: { id: string; number: number }) => {
</Flex> </Flex>
<Flex w="full" flexDir="column" gap={4}> <Flex w="full" flexDir="column" gap={4}>
<Flex gap={4} w="full" alignItems="center"> <Flex gap={8} w="full" alignItems="center">
<Flex flexDir="column" gap={2} h={32} w="full"> <Flex flexDir="column" gap={2} h={32} w="full">
<ParamControlAdapterWeight id={id} /> <ParamControlAdapterWeight id={id} />
<ParamControlAdapterBeginEnd id={id} /> <ParamControlAdapterBeginEnd id={id} />

View File

@ -7,7 +7,7 @@ import {
} from 'features/canvas/store/actions'; } from 'features/canvas/store/actions';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaImage, FaMask } from 'react-icons/fa'; import { PiExcludeBold, PiImageSquareBold } from 'react-icons/pi';
type ControlNetCanvasImageImportsProps = { type ControlNetCanvasImageImportsProps = {
id: string; id: string;
@ -29,17 +29,17 @@ const ControlNetCanvasImageImports = (
}, [id, dispatch]); }, [id, dispatch]);
return ( return (
<Flex gap={2}> <Flex gap={4}>
<InvIconButton <InvIconButton
size="sm" size="sm"
icon={<FaImage />} icon={<PiImageSquareBold />}
tooltip={t('controlnet.importImageFromCanvas')} tooltip={t('controlnet.importImageFromCanvas')}
aria-label={t('controlnet.importImageFromCanvas')} aria-label={t('controlnet.importImageFromCanvas')}
onClick={handleImportImageFromCanvas} onClick={handleImportImageFromCanvas}
/> />
<InvIconButton <InvIconButton
size="sm" size="sm"
icon={<FaMask />} icon={<PiExcludeBold />}
tooltip={t('controlnet.importMaskFromCanvas')} tooltip={t('controlnet.importMaskFromCanvas')}
aria-label={t('controlnet.importMaskFromCanvas')} aria-label={t('controlnet.importMaskFromCanvas')}
onClick={handleImportMaskFromCanvas} onClick={handleImportMaskFromCanvas}

View File

@ -3,7 +3,7 @@ import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
import type { InvIconButtonProps } from 'common/components/InvIconButton/types'; import type { InvIconButtonProps } from 'common/components/InvIconButton/types';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaTrash } from 'react-icons/fa'; import { PiTrashSimpleBold } from 'react-icons/pi';
type DeleteImageButtonProps = Omit<InvIconButtonProps, 'aria-label'> & { type DeleteImageButtonProps = Omit<InvIconButtonProps, 'aria-label'> & {
onClick: () => void; onClick: () => void;
@ -17,7 +17,7 @@ export const DeleteImageButton = memo((props: DeleteImageButtonProps) => {
return ( return (
<InvIconButton <InvIconButton
onClick={onClick} onClick={onClick}
icon={<FaTrash />} icon={<PiTrashSimpleBold />}
tooltip={`${t('gallery.deleteImage')} (Del)`} tooltip={`${t('gallery.deleteImage')} (Del)`}
aria-label={`${t('gallery.deleteImage')} (Del)`} aria-label={`${t('gallery.deleteImage')} (Del)`}
isDisabled={isDisabled || !isConnected} isDisabled={isDisabled || !isConnected}

View File

@ -1,7 +1,7 @@
import { InvIconButton } from 'common/components/InvIconButton/InvIconButton'; import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaPlus } from 'react-icons/fa'; import { PiPlusBold } from 'react-icons/pi';
import { useCreateBoardMutation } from 'services/api/endpoints/boards'; import { useCreateBoardMutation } from 'services/api/endpoints/boards';
const AddBoardButton = () => { const AddBoardButton = () => {
@ -14,7 +14,7 @@ const AddBoardButton = () => {
return ( return (
<InvIconButton <InvIconButton
icon={<FaPlus />} icon={<PiPlusBold />}
isLoading={isLoading} isLoading={isLoading}
tooltip={t('boards.addBoard')} tooltip={t('boards.addBoard')}
aria-label={t('boards.addBoard')} aria-label={t('boards.addBoard')}

View File

@ -1,4 +1,3 @@
import { CloseIcon } from '@chakra-ui/icons';
import { Input, InputGroup, InputRightElement } from '@chakra-ui/react'; import { Input, InputGroup, InputRightElement } from '@chakra-ui/react';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InvIconButton } from 'common/components/InvIconButton/InvIconButton'; import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
@ -6,6 +5,7 @@ import { boardSearchTextChanged } from 'features/gallery/store/gallerySlice';
import type { ChangeEvent, KeyboardEvent } from 'react'; import type { ChangeEvent, KeyboardEvent } from 'react';
import { memo, useCallback, useEffect, useRef } from 'react'; import { memo, useCallback, useEffect, useRef } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { PiXBold } from 'react-icons/pi';
const BoardsSearch = () => { const BoardsSearch = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -66,7 +66,7 @@ const BoardsSearch = () => {
size="sm" size="sm"
variant="ghost" variant="ghost"
aria-label={t('boards.clearSearch')} aria-label={t('boards.clearSearch')}
icon={<CloseIcon boxSize={3} />} icon={<PiXBold />}
/> />
</InputRightElement> </InputRightElement>
)} )}

View File

@ -151,7 +151,7 @@ const DeleteBoardModal = (props: Props) => {
</Flex> </Flex>
</InvAlertDialogBody> </InvAlertDialogBody>
<InvAlertDialogFooter> <InvAlertDialogFooter>
<Flex w="full" gap={2} justifyContent="space-between"> <Flex w="full" gap={2} justifyContent="end">
<InvButton ref={cancelRef} onClick={handleClose}> <InvButton ref={cancelRef} onClick={handleClose}>
{t('boards.cancel')} {t('boards.cancel')}
</InvButton> </InvButton>

View File

@ -29,14 +29,15 @@ import { memo, useCallback } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { import {
FaAsterisk, PiAsteriskBold,
FaCode, PiDotsThreeOutlineFill,
FaHourglassHalf, PiFlowArrowBold,
FaQuoteRight, PiHourglassHighBold,
FaRulerVertical, PiInfoBold,
FaSeedling, PiPlantBold,
} from 'react-icons/fa'; PiQuotesBold,
import { FaCircleNodes, FaEllipsis } from 'react-icons/fa6'; PiRulerBold,
} from 'react-icons/pi';
import { useGetImageDTOQuery } from 'services/api/endpoints/images'; import { useGetImageDTOQuery } from 'services/api/endpoints/images';
import { useDebouncedMetadata } from 'services/api/hooks/useDebouncedMetadata'; import { useDebouncedMetadata } from 'services/api/hooks/useDebouncedMetadata';
@ -210,7 +211,7 @@ const CurrentImageButtons = () => {
aria-label={t('parameters.imageActions')} aria-label={t('parameters.imageActions')}
tooltip={t('parameters.imageActions')} tooltip={t('parameters.imageActions')}
isDisabled={!imageDTO} isDisabled={!imageDTO}
icon={<FaEllipsis />} icon={<PiDotsThreeOutlineFill />}
/> />
<InvMenuList> <InvMenuList>
{imageDTO && <SingleSelectionMenuItems imageDTO={imageDTO} />} {imageDTO && <SingleSelectionMenuItems imageDTO={imageDTO} />}
@ -220,7 +221,7 @@ const CurrentImageButtons = () => {
<InvButtonGroup isDisabled={shouldDisableToolbarButtons}> <InvButtonGroup isDisabled={shouldDisableToolbarButtons}>
<InvIconButton <InvIconButton
icon={<FaCircleNodes />} icon={<PiFlowArrowBold />}
tooltip={`${t('nodes.loadWorkflow')} (W)`} tooltip={`${t('nodes.loadWorkflow')} (W)`}
aria-label={`${t('nodes.loadWorkflow')} (W)`} aria-label={`${t('nodes.loadWorkflow')} (W)`}
isDisabled={!imageDTO?.has_workflow} isDisabled={!imageDTO?.has_workflow}
@ -229,7 +230,7 @@ const CurrentImageButtons = () => {
/> />
<InvIconButton <InvIconButton
isLoading={isLoadingMetadata} isLoading={isLoadingMetadata}
icon={<FaQuoteRight />} icon={<PiQuotesBold />}
tooltip={`${t('parameters.usePrompt')} (P)`} tooltip={`${t('parameters.usePrompt')} (P)`}
aria-label={`${t('parameters.usePrompt')} (P)`} aria-label={`${t('parameters.usePrompt')} (P)`}
isDisabled={!metadata?.positive_prompt} isDisabled={!metadata?.positive_prompt}
@ -237,7 +238,7 @@ const CurrentImageButtons = () => {
/> />
<InvIconButton <InvIconButton
isLoading={isLoadingMetadata} isLoading={isLoadingMetadata}
icon={<FaSeedling />} icon={<PiPlantBold />}
tooltip={`${t('parameters.useSeed')} (S)`} tooltip={`${t('parameters.useSeed')} (S)`}
aria-label={`${t('parameters.useSeed')} (S)`} aria-label={`${t('parameters.useSeed')} (S)`}
isDisabled={metadata?.seed === null || metadata?.seed === undefined} isDisabled={metadata?.seed === null || metadata?.seed === undefined}
@ -245,7 +246,7 @@ const CurrentImageButtons = () => {
/> />
<InvIconButton <InvIconButton
isLoading={isLoadingMetadata} isLoading={isLoadingMetadata}
icon={<FaRulerVertical />} icon={<PiRulerBold />}
tooltip={`${t('parameters.useSize')} (D)`} tooltip={`${t('parameters.useSize')} (D)`}
aria-label={`${t('parameters.useSize')} (D)`} aria-label={`${t('parameters.useSize')} (D)`}
isDisabled={ isDisabled={
@ -258,7 +259,7 @@ const CurrentImageButtons = () => {
/> />
<InvIconButton <InvIconButton
isLoading={isLoadingMetadata} isLoading={isLoadingMetadata}
icon={<FaAsterisk />} icon={<PiAsteriskBold />}
tooltip={`${t('parameters.useAll')} (A)`} tooltip={`${t('parameters.useAll')} (A)`}
aria-label={`${t('parameters.useAll')} (A)`} aria-label={`${t('parameters.useAll')} (A)`}
isDisabled={!metadata} isDisabled={!metadata}
@ -274,7 +275,7 @@ const CurrentImageButtons = () => {
<InvButtonGroup> <InvButtonGroup>
<InvIconButton <InvIconButton
icon={<FaCode />} icon={<PiInfoBold />}
tooltip={`${t('parameters.info')} (I)`} tooltip={`${t('parameters.info')} (I)`}
aria-label={`${t('parameters.info')} (I)`} aria-label={`${t('parameters.info')} (I)`}
isChecked={shouldShowImageDetails} isChecked={shouldShowImageDetails}
@ -286,7 +287,7 @@ const CurrentImageButtons = () => {
<InvIconButton <InvIconButton
aria-label={t('settings.displayInProgress')} aria-label={t('settings.displayInProgress')}
tooltip={t('settings.displayInProgress')} tooltip={t('settings.displayInProgress')}
icon={<FaHourglassHalf />} icon={<PiHourglassHighBold />}
isChecked={shouldShowProgressInViewer} isChecked={shouldShowProgressInViewer}
onClick={handleClickProgressImagesToggle} onClick={handleClickProgressImagesToggle}
/> />

View File

@ -19,7 +19,7 @@ import {
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaWrench } from 'react-icons/fa'; import { RiSettings4Fill } from 'react-icons/ri';
import BoardAutoAddSelect from './Boards/BoardAutoAddSelect'; import BoardAutoAddSelect from './Boards/BoardAutoAddSelect';
@ -61,7 +61,7 @@ const GallerySettingsPopover = () => {
tooltip={t('gallery.gallerySettings')} tooltip={t('gallery.gallerySettings')}
aria-label={t('gallery.gallerySettings')} aria-label={t('gallery.gallerySettings')}
size="sm" size="sm"
icon={<FaWrench />} icon={<RiSettings4Fill />}
/> />
</InvPopoverTrigger> </InvPopoverTrigger>
<InvPopoverContent> <InvPopoverContent>

View File

@ -2,6 +2,7 @@ import { useStore } from '@nanostores/react';
import { $customStarUI } from 'app/store/nanostores/customStarUI'; import { $customStarUI } from 'app/store/nanostores/customStarUI';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InvMenuItem } from 'common/components/InvMenu/InvMenuItem'; import { InvMenuItem } from 'common/components/InvMenu/InvMenuItem';
import { InvMenuDivider } from 'common/components/InvMenu/wrapper';
import { import {
imagesToChangeSelected, imagesToChangeSelected,
isModalOpenChanged, isModalOpenChanged,
@ -11,8 +12,13 @@ import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
import { addToast } from 'features/system/store/systemSlice'; import { addToast } from 'features/system/store/systemSlice';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaDownload, FaFolder, FaTrash } from 'react-icons/fa'; import {
import { MdStar, MdStarBorder } from 'react-icons/md'; PiDownloadSimpleBold,
PiFoldersBold,
PiStarBold,
PiStarFill,
PiTrashSimpleBold,
} from 'react-icons/pi';
import { import {
useBulkDownloadImagesMutation, useBulkDownloadImagesMutation,
useStarImagesMutation, useStarImagesMutation,
@ -90,7 +96,7 @@ const MultipleSelectionMenuItems = () => {
<> <>
{areAllStarred && ( {areAllStarred && (
<InvMenuItem <InvMenuItem
icon={customStarUi ? customStarUi.on.icon : <MdStarBorder />} icon={customStarUi ? customStarUi.on.icon : <PiStarBold />}
onClickCapture={handleUnstarSelection} onClickCapture={handleUnstarSelection}
> >
{customStarUi ? customStarUi.off.text : `Unstar All`} {customStarUi ? customStarUi.off.text : `Unstar All`}
@ -98,23 +104,27 @@ const MultipleSelectionMenuItems = () => {
)} )}
{(areAllUnstarred || (!areAllStarred && !areAllUnstarred)) && ( {(areAllUnstarred || (!areAllStarred && !areAllUnstarred)) && (
<InvMenuItem <InvMenuItem
icon={customStarUi ? customStarUi.on.icon : <MdStar />} icon={customStarUi ? customStarUi.on.icon : <PiStarFill />}
onClickCapture={handleStarSelection} onClickCapture={handleStarSelection}
> >
{customStarUi ? customStarUi.on.text : `Star All`} {customStarUi ? customStarUi.on.text : `Star All`}
</InvMenuItem> </InvMenuItem>
)} )}
{isBulkDownloadEnabled && ( {isBulkDownloadEnabled && (
<InvMenuItem icon={<FaDownload />} onClickCapture={handleBulkDownload}> <InvMenuItem
icon={<PiDownloadSimpleBold />}
onClickCapture={handleBulkDownload}
>
{t('gallery.downloadSelection')} {t('gallery.downloadSelection')}
</InvMenuItem> </InvMenuItem>
)} )}
<InvMenuItem icon={<FaFolder />} onClickCapture={handleChangeBoard}> <InvMenuItem icon={<PiFoldersBold />} onClickCapture={handleChangeBoard}>
{t('boards.changeBoard')} {t('boards.changeBoard')}
</InvMenuItem> </InvMenuItem>
<InvMenuDivider />
<InvMenuItem <InvMenuItem
color="error.300" color="error.300"
icon={<FaTrash />} icon={<PiTrashSimpleBold />}
onClickCapture={handleDeleteSelection} onClickCapture={handleDeleteSelection}
> >
{t('gallery.deleteSelection')} {t('gallery.deleteSelection')}

View File

@ -4,6 +4,7 @@ import { useAppToaster } from 'app/components/Toaster';
import { $customStarUI } from 'app/store/nanostores/customStarUI'; import { $customStarUI } from 'app/store/nanostores/customStarUI';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InvMenuItem } from 'common/components/InvMenu/InvMenuItem'; import { InvMenuItem } from 'common/components/InvMenu/InvMenuItem';
import { InvMenuDivider } from 'common/components/InvMenu/wrapper';
import { useCopyImageToClipboard } from 'common/hooks/useCopyImageToClipboard'; import { useCopyImageToClipboard } from 'common/hooks/useCopyImageToClipboard';
import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice';
import { import {
@ -25,18 +26,18 @@ import { memo, useCallback } from 'react';
import { flushSync } from 'react-dom'; import { flushSync } from 'react-dom';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { import {
FaAsterisk, PiAsteriskBold,
FaCopy, PiCopyBold,
FaDownload, PiDownloadSimpleBold,
FaExternalLinkAlt, PiFlowArrowBold,
FaFolder, PiFoldersBold,
FaQuoteRight, PiPlantBold,
FaSeedling, PiQuotesBold,
FaShare, PiShareFatBold,
FaTrash, PiStarBold,
} from 'react-icons/fa'; PiStarFill,
import { FaCircleNodes } from 'react-icons/fa6'; PiTrashSimpleBold,
import { MdStar, MdStarBorder } from 'react-icons/md'; } from 'react-icons/pi';
import { import {
useStarImagesMutation, useStarImagesMutation,
useUnstarImagesMutation, useUnstarImagesMutation,
@ -155,12 +156,12 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
as="a" as="a"
href={imageDTO.image_url} href={imageDTO.image_url}
target="_blank" target="_blank"
icon={<FaExternalLinkAlt />} icon={<PiShareFatBold />}
> >
{t('common.openInNewTab')} {t('common.openInNewTab')}
</InvMenuItem> </InvMenuItem>
{isClipboardAPIAvailable && ( {isClipboardAPIAvailable && (
<InvMenuItem icon={<FaCopy />} onClickCapture={handleCopyImage}> <InvMenuItem icon={<PiCopyBold />} onClickCapture={handleCopyImage}>
{t('parameters.copyImage')} {t('parameters.copyImage')}
</InvMenuItem> </InvMenuItem>
)} )}
@ -169,17 +170,18 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
download={true} download={true}
href={imageDTO.image_url} href={imageDTO.image_url}
target="_blank" target="_blank"
icon={<FaDownload />} icon={<PiDownloadSimpleBold />}
w="100%" w="100%"
> >
{t('parameters.downloadImage')} {t('parameters.downloadImage')}
</InvMenuItem> </InvMenuItem>
<InvMenuDivider />
<InvMenuItem <InvMenuItem
icon={ icon={
getAndLoadEmbeddedWorkflowResult.isLoading ? ( getAndLoadEmbeddedWorkflowResult.isLoading ? (
<SpinnerIcon /> <SpinnerIcon />
) : ( ) : (
<FaCircleNodes /> <PiFlowArrowBold />
) )
} }
onClickCapture={handleLoadWorkflow} onClickCapture={handleLoadWorkflow}
@ -188,7 +190,7 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
{t('nodes.loadWorkflow')} {t('nodes.loadWorkflow')}
</InvMenuItem> </InvMenuItem>
<InvMenuItem <InvMenuItem
icon={isLoadingMetadata ? <SpinnerIcon /> : <FaQuoteRight />} icon={isLoadingMetadata ? <SpinnerIcon /> : <PiQuotesBold />}
onClickCapture={handleRecallPrompt} onClickCapture={handleRecallPrompt}
isDisabled={ isDisabled={
isLoadingMetadata || isLoadingMetadata ||
@ -199,21 +201,22 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
{t('parameters.usePrompt')} {t('parameters.usePrompt')}
</InvMenuItem> </InvMenuItem>
<InvMenuItem <InvMenuItem
icon={isLoadingMetadata ? <SpinnerIcon /> : <FaSeedling />} icon={isLoadingMetadata ? <SpinnerIcon /> : <PiPlantBold />}
onClickCapture={handleRecallSeed} onClickCapture={handleRecallSeed}
isDisabled={isLoadingMetadata || metadata?.seed === undefined} isDisabled={isLoadingMetadata || metadata?.seed === undefined}
> >
{t('parameters.useSeed')} {t('parameters.useSeed')}
</InvMenuItem> </InvMenuItem>
<InvMenuItem <InvMenuItem
icon={isLoadingMetadata ? <SpinnerIcon /> : <FaAsterisk />} icon={isLoadingMetadata ? <SpinnerIcon /> : <PiAsteriskBold />}
onClickCapture={handleUseAllParameters} onClickCapture={handleUseAllParameters}
isDisabled={isLoadingMetadata || !metadata} isDisabled={isLoadingMetadata || !metadata}
> >
{t('parameters.useAll')} {t('parameters.useAll')}
</InvMenuItem> </InvMenuItem>
<InvMenuDivider />
<InvMenuItem <InvMenuItem
icon={<FaShare />} icon={<PiShareFatBold />}
onClickCapture={handleSendToImageToImage} onClickCapture={handleSendToImageToImage}
id="send-to-img2img" id="send-to-img2img"
> >
@ -221,34 +224,36 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
</InvMenuItem> </InvMenuItem>
{isCanvasEnabled && ( {isCanvasEnabled && (
<InvMenuItem <InvMenuItem
icon={<FaShare />} icon={<PiShareFatBold />}
onClickCapture={handleSendToCanvas} onClickCapture={handleSendToCanvas}
id="send-to-canvas" id="send-to-canvas"
> >
{t('parameters.sendToUnifiedCanvas')} {t('parameters.sendToUnifiedCanvas')}
</InvMenuItem> </InvMenuItem>
)} )}
<InvMenuItem icon={<FaFolder />} onClickCapture={handleChangeBoard}> <InvMenuDivider />
<InvMenuItem icon={<PiFoldersBold />} onClickCapture={handleChangeBoard}>
{t('boards.changeBoard')} {t('boards.changeBoard')}
</InvMenuItem> </InvMenuItem>
{imageDTO.starred ? ( {imageDTO.starred ? (
<InvMenuItem <InvMenuItem
icon={customStarUi ? customStarUi.off.icon : <MdStar />} icon={customStarUi ? customStarUi.off.icon : <PiStarFill />}
onClickCapture={handleUnstarImage} onClickCapture={handleUnstarImage}
> >
{customStarUi ? customStarUi.off.text : t('gallery.unstarImage')} {customStarUi ? customStarUi.off.text : t('gallery.unstarImage')}
</InvMenuItem> </InvMenuItem>
) : ( ) : (
<InvMenuItem <InvMenuItem
icon={customStarUi ? customStarUi.on.icon : <MdStarBorder />} icon={customStarUi ? customStarUi.on.icon : <PiStarBold />}
onClickCapture={handleStarImage} onClickCapture={handleStarImage}
> >
{customStarUi ? customStarUi.on.text : t('gallery.starImage')} {customStarUi ? customStarUi.on.text : t('gallery.starImage')}
</InvMenuItem> </InvMenuItem>
)} )}
<InvMenuDivider />
<InvMenuItem <InvMenuItem
color="error.300" color="error.300"
icon={<FaTrash />} icon={<PiTrashSimpleBold />}
onClickCapture={handleDelete} onClickCapture={handleDelete}
> >
{t('gallery.deleteImage')} {t('gallery.deleteImage')}

View File

@ -15,7 +15,8 @@ import { InvButtonGroup } from 'common/components/InvButtonGroup/InvButtonGroup'
import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; import { galleryViewChanged } from 'features/gallery/store/gallerySlice';
import { memo, useCallback, useRef } from 'react'; import { memo, useCallback, useRef } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaImages, FaServer } from 'react-icons/fa'; import { PiImagesBold } from 'react-icons/pi';
import { RiServerLine } from 'react-icons/ri';
import BoardsList from './Boards/BoardsList/BoardsList'; import BoardsList from './Boards/BoardsList/BoardsList';
import GalleryBoardName from './GalleryBoardName'; import GalleryBoardName from './GalleryBoardName';
@ -83,7 +84,7 @@ const ImageGalleryContent = () => {
isChecked={galleryView === 'images'} isChecked={galleryView === 'images'}
onClick={handleClickImages} onClick={handleClickImages}
w="full" w="full"
leftIcon={<FaImages />} leftIcon={<PiImagesBold size="16px" />}
data-testid="images-tab" data-testid="images-tab"
> >
{t('parameters.images')} {t('parameters.images')}
@ -94,7 +95,7 @@ const ImageGalleryContent = () => {
isChecked={galleryView === 'assets'} isChecked={galleryView === 'assets'}
onClick={handleClickAssets} onClick={handleClickAssets}
w="full" w="full"
leftIcon={<FaServer />} leftIcon={<RiServerLine size="16px" />}
data-testid="assets-tab" data-testid="assets-tab"
> >
{t('gallery.assets')} {t('gallery.assets')}

View File

@ -19,8 +19,7 @@ import { useScrollIntoView } from 'features/gallery/hooks/useScrollIntoView';
import type { MouseEvent } from 'react'; import type { MouseEvent } from 'react';
import { memo, useCallback, useMemo, useState } from 'react'; import { memo, useCallback, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaTrash } from 'react-icons/fa'; import { PiStarBold, PiStarFill, PiTrashSimpleFill } from 'react-icons/pi';
import { MdStar, MdStarBorder } from 'react-icons/md';
import { import {
useGetImageDTOQuery, useGetImageDTOQuery,
useStarImagesMutation, useStarImagesMutation,
@ -112,10 +111,10 @@ const GalleryImage = (props: HoverableImageProps) => {
const starIcon = useMemo(() => { const starIcon = useMemo(() => {
if (imageDTO?.starred) { if (imageDTO?.starred) {
return customStarUi ? customStarUi.on.icon : <MdStar size="20" />; return customStarUi ? customStarUi.on.icon : <PiStarFill size="20" />;
} }
if (!imageDTO?.starred && isHovered) { if (!imageDTO?.starred && isHovered) {
return customStarUi ? customStarUi.off.icon : <MdStarBorder size="20" />; return customStarUi ? customStarUi.off.icon : <PiStarBold size="20" />;
} }
}, [imageDTO?.starred, isHovered, customStarUi]); }, [imageDTO?.starred, isHovered, customStarUi]);
@ -177,7 +176,7 @@ const GalleryImage = (props: HoverableImageProps) => {
{isHovered && shift && ( {isHovered && shift && (
<IAIDndImageIcon <IAIDndImageIcon
onClick={handleDelete} onClick={handleDelete}
icon={<FaTrash />} icon={<PiTrashSimpleFill size="16px" />}
tooltip={t('gallery.deleteImage')} tooltip={t('gallery.deleteImage')}
styleOverrides={imageIconStyleOverrides} styleOverrides={imageIconStyleOverrides}
/> />

View File

@ -3,7 +3,7 @@ import type { InvButtonProps } from 'common/components/InvButton/types';
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaSync } from 'react-icons/fa'; import { PiArrowsClockwiseBold } from 'react-icons/pi';
import { useSyncModels } from './useSyncModels'; import { useSyncModels } from './useSyncModels';
@ -21,7 +21,7 @@ export const SyncModelsButton = memo(
<InvButton <InvButton
isLoading={isLoading} isLoading={isLoading}
onClick={syncModels} onClick={syncModels}
leftIcon={<FaSync />} leftIcon={<PiArrowsClockwiseBold />}
minW="max-content" minW="max-content"
{...props} {...props}
> >

View File

@ -3,7 +3,7 @@ import type { InvIconButtonProps } from 'common/components/InvIconButton/types';
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaSync } from 'react-icons/fa'; import { PiArrowsClockwiseBold } from 'react-icons/pi';
import { useSyncModels } from './useSyncModels'; import { useSyncModels } from './useSyncModels';
@ -19,7 +19,7 @@ export const SyncModelsIconButton = memo(
return ( return (
<InvIconButton <InvIconButton
icon={<FaSync />} icon={<PiArrowsClockwiseBold />}
tooltip={t('modelManager.syncModels')} tooltip={t('modelManager.syncModels')}
aria-label={t('modelManager.syncModels')} aria-label={t('modelManager.syncModels')}
isLoading={isLoading} isLoading={isLoading}

View File

@ -1,4 +1,3 @@
import { DeleteIcon } from '@chakra-ui/icons';
import { Badge, Flex, useDisclosure } from '@chakra-ui/react'; import { Badge, Flex, useDisclosure } from '@chakra-ui/react';
import { useAppDispatch } from 'app/store/storeHooks'; import { useAppDispatch } from 'app/store/storeHooks';
import { InvButton } from 'common/components/InvButton/InvButton'; import { InvButton } from 'common/components/InvButton/InvButton';
@ -11,6 +10,7 @@ import { addToast } from 'features/system/store/systemSlice';
import { makeToast } from 'features/system/util/makeToast'; import { makeToast } from 'features/system/util/makeToast';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { PiTrashSimpleBold } from 'react-icons/pi';
import type { import type {
LoRAModelConfigEntity, LoRAModelConfigEntity,
MainModelConfigEntity, MainModelConfigEntity,
@ -109,7 +109,7 @@ const ModelListItem = (props: ModelListItemProps) => {
</Flex> </Flex>
<InvIconButton <InvIconButton
onClick={onOpen} onClick={onOpen}
icon={<DeleteIcon />} icon={<PiTrashSimpleBold />}
aria-label={t('modelManager.deleteConfig')} aria-label={t('modelManager.deleteConfig')}
colorScheme="error" colorScheme="error"
/> />

View File

@ -8,11 +8,11 @@ import {
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { import {
FaExpand, PiFrameCornersBold,
// FaInfo, PiMagnifyingGlassMinusBold,
FaMapMarkerAlt, PiMagnifyingGlassPlusBold,
} from 'react-icons/fa'; PiMapPinBold,
import { FaMagnifyingGlassMinus, FaMagnifyingGlassPlus } from 'react-icons/fa6'; } from 'react-icons/pi';
import { useReactFlow } from 'reactflow'; import { useReactFlow } from 'reactflow';
const ViewportControls = () => { const ViewportControls = () => {
@ -52,19 +52,19 @@ const ViewportControls = () => {
tooltip={t('nodes.zoomInNodes')} tooltip={t('nodes.zoomInNodes')}
aria-label={t('nodes.zoomInNodes')} aria-label={t('nodes.zoomInNodes')}
onClick={handleClickedZoomIn} onClick={handleClickedZoomIn}
icon={<FaMagnifyingGlassPlus />} icon={<PiMagnifyingGlassPlusBold />}
/> />
<InvIconButton <InvIconButton
tooltip={t('nodes.zoomOutNodes')} tooltip={t('nodes.zoomOutNodes')}
aria-label={t('nodes.zoomOutNodes')} aria-label={t('nodes.zoomOutNodes')}
onClick={handleClickedZoomOut} onClick={handleClickedZoomOut}
icon={<FaMagnifyingGlassMinus />} icon={<PiMagnifyingGlassMinusBold />}
/> />
<InvIconButton <InvIconButton
tooltip={t('nodes.fitViewportNodes')} tooltip={t('nodes.fitViewportNodes')}
aria-label={t('nodes.fitViewportNodes')} aria-label={t('nodes.fitViewportNodes')}
onClick={handleClickedFitView} onClick={handleClickedFitView}
icon={<FaExpand />} icon={<PiFrameCornersBold />}
/> />
{/* <InvTooltip {/* <InvTooltip
label={ label={
@ -93,7 +93,7 @@ const ViewportControls = () => {
} }
isChecked={shouldShowMinimapPanel} isChecked={shouldShowMinimapPanel}
onClick={handleClickedToggleMiniMapPanel} onClick={handleClickedToggleMiniMapPanel}
icon={<FaMapMarkerAlt />} icon={<PiMapPinBold />}
/> />
</InvButtonGroup> </InvButtonGroup>
); );

View File

@ -3,7 +3,7 @@ import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
import { addNodePopoverOpened } from 'features/nodes/store/nodesSlice'; import { addNodePopoverOpened } from 'features/nodes/store/nodesSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaPlus } from 'react-icons/fa'; import { PiPlusBold } from 'react-icons/pi';
const AddNodeButton = () => { const AddNodeButton = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -16,7 +16,7 @@ const AddNodeButton = () => {
<InvIconButton <InvIconButton
tooltip={t('nodes.addNodeToolTip')} tooltip={t('nodes.addNodeToolTip')}
aria-label={t('nodes.addNode')} aria-label={t('nodes.addNode')}
icon={<FaPlus />} icon={<PiPlusBold />}
onClick={handleOpenAddNodePopover} onClick={handleOpenAddNodePopover}
pointerEvents="auto" pointerEvents="auto"
/> />

View File

@ -2,7 +2,7 @@ import { useAppDispatch } from 'app/store/storeHooks';
import { InvButton } from 'common/components/InvButton/InvButton'; import { InvButton } from 'common/components/InvButton/InvButton';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaSyncAlt } from 'react-icons/fa'; import { PiArrowsClockwiseBold } from 'react-icons/pi';
import { receivedOpenAPISchema } from 'services/api/thunks/schema'; import { receivedOpenAPISchema } from 'services/api/thunks/schema';
const ReloadNodeTemplatesButton = () => { const ReloadNodeTemplatesButton = () => {
@ -15,7 +15,7 @@ const ReloadNodeTemplatesButton = () => {
return ( return (
<InvButton <InvButton
leftIcon={<FaSyncAlt />} leftIcon={<PiArrowsClockwiseBold />}
tooltip={t('nodes.reloadNodeTemplates')} tooltip={t('nodes.reloadNodeTemplates')}
aria-label={t('nodes.reloadNodeTemplates')} aria-label={t('nodes.reloadNodeTemplates')}
onClick={handleReloadSchema} onClick={handleReloadSchema}

View File

@ -2,7 +2,7 @@ import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext'; import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaLock, FaLockOpen } from 'react-icons/fa6'; import { PiLockSimpleFill, PiLockSimpleOpenBold } from 'react-icons/pi';
export const LockAspectRatioButton = memo(() => { export const LockAspectRatioButton = memo(() => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -18,7 +18,13 @@ export const LockAspectRatioButton = memo(() => {
onClick={onClick} onClick={onClick}
variant={ctx.aspectRatioState.isLocked ? 'outline' : 'ghost'} variant={ctx.aspectRatioState.isLocked ? 'outline' : 'ghost'}
size="sm" size="sm"
icon={ctx.aspectRatioState.isLocked ? <FaLock /> : <FaLockOpen />} icon={
ctx.aspectRatioState.isLocked ? (
<PiLockSimpleFill />
) : (
<PiLockSimpleOpenBold />
)
}
/> />
); );
}); });

View File

@ -8,7 +8,7 @@ import {
} from 'features/parameters/util/optimalDimension'; } from 'features/parameters/util/optimalDimension';
import { memo, useCallback, useMemo } from 'react'; import { memo, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { IoSparkles } from 'react-icons/io5'; import { RiSparklingFill } from 'react-icons/ri';
export const SetOptimalSizeButton = memo(() => { export const SetOptimalSizeButton = memo(() => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -42,7 +42,7 @@ export const SetOptimalSizeButton = memo(() => {
onClick={onClick} onClick={onClick}
variant="ghost" variant="ghost"
size="sm" size="sm"
icon={<IoSparkles />} icon={<RiSparklingFill />}
colorScheme={isSizeTooSmall || isSizeTooLarge ? 'warning' : 'base'} colorScheme={isSizeTooSmall || isSizeTooLarge ? 'warning' : 'base'}
/> />
); );

View File

@ -2,7 +2,7 @@ import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext'; import { useImageSizeContext } from 'features/parameters/components/ImageSize/ImageSizeContext';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { IoSwapVertical } from 'react-icons/io5'; import { PiArrowsDownUpBold } from 'react-icons/pi';
export const SwapDimensionsButton = memo(() => { export const SwapDimensionsButton = memo(() => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -17,7 +17,7 @@ export const SwapDimensionsButton = memo(() => {
onClick={onClick} onClick={onClick}
variant="ghost" variant="ghost"
size="sm" size="sm"
icon={<IoSwapVertical />} icon={<PiArrowsDownUpBold />}
/> />
); );
}); });

View File

@ -12,7 +12,11 @@ import {
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaRulerVertical, FaUndo, FaUpload } from 'react-icons/fa'; import {
PiArrowCounterClockwiseBold,
PiRulerBold,
PiUploadSimpleBold,
} from 'react-icons/pi';
import type { PostUploadAction } from 'services/api/types'; import type { PostUploadAction } from 'services/api/types';
import InitialImage from './InitialImage'; import InitialImage from './InitialImage';
@ -80,20 +84,20 @@ const InitialImageDisplay = () => {
<InvIconButton <InvIconButton
tooltip="Upload Initial Image" tooltip="Upload Initial Image"
aria-label="Upload Initial Image" aria-label="Upload Initial Image"
icon={<FaUpload />} icon={<PiUploadSimpleBold />}
{...getUploadButtonProps()} {...getUploadButtonProps()}
/> />
<InvIconButton <InvIconButton
tooltip={`${t('parameters.useSize')} (Shift+D)`} tooltip={`${t('parameters.useSize')} (Shift+D)`}
aria-label={`${t('parameters.useSize')} (Shift+D)`} aria-label={`${t('parameters.useSize')} (Shift+D)`}
icon={<FaRulerVertical />} icon={<PiRulerBold />}
onClick={handleUseSizeInitialImage} onClick={handleUseSizeInitialImage}
isDisabled={!initialImage} isDisabled={!initialImage}
/> />
<InvIconButton <InvIconButton
tooltip="Reset Initial Image" tooltip="Reset Initial Image"
aria-label="Reset Initial Image" aria-label="Reset Initial Image"
icon={<FaUndo />} icon={<PiArrowCounterClockwiseBold />}
onClick={handleReset} onClick={handleReset}
isDisabled={!initialImage} isDisabled={!initialImage}
/> />

View File

@ -5,7 +5,7 @@ import randomInt from 'common/util/randomInt';
import { setSeed } from 'features/parameters/store/generationSlice'; import { setSeed } from 'features/parameters/store/generationSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaShuffle } from 'react-icons/fa6'; import { PiShuffleBold } from 'react-icons/pi';
export const ParamSeedShuffle = memo(() => { export const ParamSeedShuffle = memo(() => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
@ -24,7 +24,7 @@ export const ParamSeedShuffle = memo(() => {
size="sm" size="sm"
isDisabled={shouldRandomizeSeed} isDisabled={shouldRandomizeSeed}
onClick={handleClickRandomizeSeed} onClick={handleClickRandomizeSeed}
leftIcon={<FaShuffle />} leftIcon={<PiShuffleBold />}
flexShrink={0} flexShrink={0}
> >
{t('parameters.shuffle')} {t('parameters.shuffle')}

View File

@ -13,7 +13,7 @@ import { useIsAllowedToUpscale } from 'features/parameters/hooks/useIsAllowedToU
import { useIsQueueMutationInProgress } from 'features/queue/hooks/useIsQueueMutationInProgress'; import { useIsQueueMutationInProgress } from 'features/queue/hooks/useIsQueueMutationInProgress';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaExpand } from 'react-icons/fa'; import { PiFrameCornersBold } from 'react-icons/pi';
import type { ImageDTO } from 'services/api/types'; import type { ImageDTO } from 'services/api/types';
import ParamESRGANModel from './ParamRealESRGANModel'; import ParamESRGANModel from './ParamRealESRGANModel';
@ -42,7 +42,7 @@ const ParamUpscalePopover = (props: Props) => {
<InvIconButton <InvIconButton
tooltip={t('parameters.upscale')} tooltip={t('parameters.upscale')}
onClick={onOpen} onClick={onOpen}
icon={<FaExpand />} icon={<PiFrameCornersBold />}
aria-label={t('parameters.upscale')} aria-label={t('parameters.upscale')}
/> />
</InvPopoverTrigger> </InvPopoverTrigger>

View File

@ -3,7 +3,7 @@ import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
import { useCancelCurrentQueueItem } from 'features/queue/hooks/useCancelCurrentQueueItem'; import { useCancelCurrentQueueItem } from 'features/queue/hooks/useCancelCurrentQueueItem';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaTimes } from 'react-icons/fa'; import { PiXBold } from 'react-icons/pi';
type Props = { type Props = {
sx?: ChakraProps['sx']; sx?: ChakraProps['sx'];
}; };
@ -19,7 +19,7 @@ const CancelCurrentQueueItemIconButton = ({ sx }: Props) => {
isLoading={isLoading} isLoading={isLoading}
aria-label={t('queue.cancel')} aria-label={t('queue.cancel')}
tooltip={t('queue.cancelTooltip')} tooltip={t('queue.cancelTooltip')}
icon={<FaTimes />} icon={<PiXBold size="16px" />}
onClick={cancelQueueItem} onClick={cancelQueueItem}
colorScheme="error" colorScheme="error"
sx={sx} sx={sx}

View File

@ -5,7 +5,7 @@ import ClearQueueConfirmationAlertDialog from 'features/queue/components/ClearQu
import { useClearQueue } from 'features/queue/hooks/useClearQueue'; import { useClearQueue } from 'features/queue/hooks/useClearQueue';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaTrash } from 'react-icons/fa'; import { PiTrashSimpleFill } from 'react-icons/pi';
type Props = InvButtonProps; type Props = InvButtonProps;
@ -20,7 +20,7 @@ const ClearQueueButton = (props: Props) => {
isDisabled={isDisabled} isDisabled={isDisabled}
isLoading={isLoading} isLoading={isLoading}
tooltip={t('queue.clearTooltip')} tooltip={t('queue.clearTooltip')}
leftIcon={<FaTrash />} leftIcon={<PiTrashSimpleFill />}
colorScheme="error" colorScheme="error"
onClick={disclosure.onOpen} onClick={disclosure.onOpen}
data-testid={t('queue.clear')} data-testid={t('queue.clear')}

View File

@ -5,7 +5,7 @@ import ClearQueueConfirmationAlertDialog from 'features/queue/components/ClearQu
import { useClearQueue } from 'features/queue/hooks/useClearQueue'; import { useClearQueue } from 'features/queue/hooks/useClearQueue';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaTrash } from 'react-icons/fa'; import { PiTrashSimpleBold } from 'react-icons/pi';
type Props = Omit<InvIconButtonProps, 'aria-label'>; type Props = Omit<InvIconButtonProps, 'aria-label'>;
@ -21,7 +21,7 @@ const ClearQueueIconButton = (props: Props) => {
isLoading={isLoading} isLoading={isLoading}
aria-label={t('queue.clear')} aria-label={t('queue.clear')}
tooltip={t('queue.clearTooltip')} tooltip={t('queue.clearTooltip')}
icon={<FaTrash />} icon={<PiTrashSimpleBold size="16px" />}
colorScheme="error" colorScheme="error"
onClick={disclosure.onOpen} onClick={disclosure.onOpen}
data-testid={t('queue.clear')} data-testid={t('queue.clear')}

View File

@ -4,7 +4,7 @@ import { InvButton } from 'common/components/InvButton/InvButton';
import { QueueIterationsNumberInput } from 'features/queue/components/QueueIterationsNumberInput'; import { QueueIterationsNumberInput } from 'features/queue/components/QueueIterationsNumberInput';
import { useQueueBack } from 'features/queue/hooks/useQueueBack'; import { useQueueBack } from 'features/queue/hooks/useQueueBack';
import { memo } from 'react'; import { memo } from 'react';
import { IoSparkles } from 'react-icons/io5'; import { RiSparkling2Fill } from 'react-icons/ri';
import { QueueButtonTooltip } from './QueueButtonTooltip'; import { QueueButtonTooltip } from './QueueButtonTooltip';
@ -24,7 +24,7 @@ export const InvokeQueueBackButton = memo(() => {
isLoading={isLoading || isLoadingDynamicPrompts} isLoading={isLoading || isLoadingDynamicPrompts}
loadingText={invoke} loadingText={invoke}
isDisabled={isDisabled} isDisabled={isDisabled}
rightIcon={<IoSparkles />} rightIcon={<RiSparkling2Fill />}
tooltip={<QueueButtonTooltip />} tooltip={<QueueButtonTooltip />}
variant="solid" variant="solid"
zIndex={1} zIndex={1}

View File

@ -1,7 +1,7 @@
import { usePauseProcessor } from 'features/queue/hooks/usePauseProcessor'; import { usePauseProcessor } from 'features/queue/hooks/usePauseProcessor';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaPause } from 'react-icons/fa'; import { PiPauseFill } from 'react-icons/pi';
import QueueButton from './common/QueueButton'; import QueueButton from './common/QueueButton';
@ -20,7 +20,7 @@ const PauseProcessorButton = ({ asIconButton }: Props) => {
tooltip={t('queue.pauseTooltip')} tooltip={t('queue.pauseTooltip')}
isDisabled={isDisabled} isDisabled={isDisabled}
isLoading={isLoading} isLoading={isLoading}
icon={<FaPause />} icon={<PiPauseFill />}
onClick={pauseProcessor} onClick={pauseProcessor}
colorScheme="gold" colorScheme="gold"
/> />

View File

@ -1,7 +1,7 @@
import { usePruneQueue } from 'features/queue/hooks/usePruneQueue'; import { usePruneQueue } from 'features/queue/hooks/usePruneQueue';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { BsStars } from 'react-icons/bs'; import { RiSparklingFill } from 'react-icons/ri';
import QueueButton from './common/QueueButton'; import QueueButton from './common/QueueButton';
@ -20,7 +20,7 @@ const PruneQueueButton = ({ asIconButton }: Props) => {
asIconButton={asIconButton} asIconButton={asIconButton}
label={t('queue.prune')} label={t('queue.prune')}
tooltip={t('queue.pruneTooltip', { item_count: finishedCount })} tooltip={t('queue.pruneTooltip', { item_count: finishedCount })}
icon={<BsStars />} icon={<RiSparklingFill />}
onClick={pruneQueue} onClick={pruneQueue}
colorScheme="invokeBlue" colorScheme="invokeBlue"
/> />

View File

@ -17,8 +17,8 @@ import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
import { setActiveTab } from 'features/ui/store/uiSlice'; import { setActiveTab } from 'features/ui/store/uiSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaPause, FaPlay, FaTimes } from 'react-icons/fa'; import { PiPauseFill, PiPlayFill, PiXBold } from 'react-icons/pi';
import { FaList } from 'react-icons/fa6'; import { RiListCheck, RiPlayList2Fill } from 'react-icons/ri';
import { useGetQueueStatusQuery } from 'services/api/endpoints/queue'; import { useGetQueueStatusQuery } from 'services/api/endpoints/queue';
export const QueueActionsMenuButton = memo(() => { export const QueueActionsMenuButton = memo(() => {
@ -64,12 +64,12 @@ export const QueueActionsMenuButton = memo(() => {
<InvMenuButton <InvMenuButton
as={InvIconButton} as={InvIconButton}
aria-label="Queue Actions Menu" aria-label="Queue Actions Menu"
icon={<FaList />} icon={<RiListCheck />}
/> />
<InvMenuList> <InvMenuList>
<InvMenuItem <InvMenuItem
isDestructive isDestructive
icon={<FaTimes size="16px" />} icon={<PiXBold size="16px" />}
onClick={cancelQueueItem} onClick={cancelQueueItem}
isLoading={isLoadingCancelQueueItem} isLoading={isLoadingCancelQueueItem}
isDisabled={isDisabledCancelQueueItem} isDisabled={isDisabledCancelQueueItem}
@ -78,7 +78,7 @@ export const QueueActionsMenuButton = memo(() => {
</InvMenuItem> </InvMenuItem>
{isResumeEnabled && ( {isResumeEnabled && (
<InvMenuItem <InvMenuItem
icon={<FaPlay size="14px" />} icon={<PiPlayFill size="14px" />}
onClick={resumeProcessor} onClick={resumeProcessor}
isLoading={isLoadingResumeProcessor} isLoading={isLoadingResumeProcessor}
isDisabled={isDisabledResumeProcessor} isDisabled={isDisabledResumeProcessor}
@ -88,7 +88,7 @@ export const QueueActionsMenuButton = memo(() => {
)} )}
{isPauseEnabled && ( {isPauseEnabled && (
<InvMenuItem <InvMenuItem
icon={<FaPause size="14px" />} icon={<PiPauseFill size="14px" />}
onClick={pauseProcessor} onClick={pauseProcessor}
isLoading={isLoadingPauseProcessor} isLoading={isLoadingPauseProcessor}
isDisabled={isDisabledPauseProcessor} isDisabled={isDisabledPauseProcessor}
@ -97,7 +97,9 @@ export const QueueActionsMenuButton = memo(() => {
</InvMenuItem> </InvMenuItem>
)} )}
<InvMenuDivider /> <InvMenuDivider />
<InvMenuItem onClick={openQueue}>{t('queue.openQueue')}</InvMenuItem> <InvMenuItem icon={<RiPlayList2Fill />} onClick={openQueue}>
{t('queue.openQueue')}
</InvMenuItem>
</InvMenuList> </InvMenuList>
</InvMenu> </InvMenu>
{queueSize > 0 && ( {queueSize > 0 && (

View File

@ -2,7 +2,7 @@ import { InvIconButton } from 'common/components/InvIconButton/InvIconButton';
import { useQueueFront } from 'features/queue/hooks/useQueueFront'; import { useQueueFront } from 'features/queue/hooks/useQueueFront';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaBoltLightning } from 'react-icons/fa6'; import { AiFillThunderbolt } from 'react-icons/ai';
import { QueueButtonTooltip } from './QueueButtonTooltip'; import { QueueButtonTooltip } from './QueueButtonTooltip';
@ -16,7 +16,7 @@ const QueueFrontButton = () => {
isLoading={isLoading} isLoading={isLoading}
onClick={queueFront} onClick={queueFront}
tooltip={<QueueButtonTooltip prepend />} tooltip={<QueueButtonTooltip prepend />}
icon={<FaBoltLightning />} icon={<AiFillThunderbolt />}
size="lg" size="lg"
/> />
); );

View File

@ -1,7 +1,7 @@
import { useResumeProcessor } from 'features/queue/hooks/useResumeProcessor'; import { useResumeProcessor } from 'features/queue/hooks/useResumeProcessor';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaPlay } from 'react-icons/fa'; import { PiPlayFill } from 'react-icons/pi';
import QueueButton from './common/QueueButton'; import QueueButton from './common/QueueButton';
@ -20,7 +20,7 @@ const ResumeProcessorButton = ({ asIconButton }: Props) => {
tooltip={t('queue.resumeTooltip')} tooltip={t('queue.resumeTooltip')}
isDisabled={isDisabled} isDisabled={isDisabled}
isLoading={isLoading} isLoading={isLoading}
icon={<FaPlay />} icon={<PiPlayFill />}
onClick={resumeProcessor} onClick={resumeProcessor}
colorScheme="green" colorScheme="green"
/> />

View File

@ -20,7 +20,7 @@ import {
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
import { Fragment, memo } from 'react'; import { Fragment, memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaPlus } from 'react-icons/fa'; import { PiPlusBold } from 'react-icons/pi';
const selector = createMemoizedSelector( const selector = createMemoizedSelector(
selectControlAdaptersSlice, selectControlAdaptersSlice,
@ -103,7 +103,7 @@ export const ControlSettingsAccordion: React.FC = memo(() => {
> >
<InvButton <InvButton
tooltip={t('controlnet.addControlNet')} tooltip={t('controlnet.addControlNet')}
leftIcon={<FaPlus />} leftIcon={<PiPlusBold />}
onClick={addControlNet} onClick={addControlNet}
data-testid="add controlnet" data-testid="add controlnet"
flexGrow={1} flexGrow={1}
@ -113,7 +113,7 @@ export const ControlSettingsAccordion: React.FC = memo(() => {
</InvButton> </InvButton>
<InvButton <InvButton
tooltip={t('controlnet.addIPAdapter')} tooltip={t('controlnet.addIPAdapter')}
leftIcon={<FaPlus />} leftIcon={<PiPlusBold />}
onClick={addIPAdapter} onClick={addIPAdapter}
data-testid="add ip adapter" data-testid="add ip adapter"
flexGrow={1} flexGrow={1}
@ -123,7 +123,7 @@ export const ControlSettingsAccordion: React.FC = memo(() => {
</InvButton> </InvButton>
<InvButton <InvButton
tooltip={t('controlnet.addT2IAdapter')} tooltip={t('controlnet.addT2IAdapter')}
leftIcon={<FaPlus />} leftIcon={<PiPlusBold />}
onClick={addT2IAdapter} onClick={addT2IAdapter}
data-testid="add t2i adapter" data-testid="add t2i adapter"
flexGrow={1} flexGrow={1}

View File

@ -63,7 +63,7 @@ export const GenerationSettingsAccordion = memo(() => {
</InvTabList> </InvTabList>
<InvTabPanels> <InvTabPanels>
<InvTabPanel overflow="visible" px={4} pt={4}> <InvTabPanel overflow="visible" px={4} pt={4}>
<Flex gap={4}> <Flex gap={4} alignItems="center">
<ParamMainModelSelect /> <ParamMainModelSelect />
<SyncModelsIconButton /> <SyncModelsIconButton />
</Flex> </Flex>

View File

@ -88,7 +88,7 @@ export const ImageSettingsAccordion = memo(() => {
)} )}
<InvExpander> <InvExpander>
<Flex gap={4} pb={4} flexDir="column"> <Flex gap={4} pb={4} flexDir="column">
<Flex gap={4}> <Flex gap={4} alignItems="center">
<ParamSeedNumberInput /> <ParamSeedNumberInput />
<ParamSeedShuffle /> <ParamSeedShuffle />
<ParamSeedRandomize /> <ParamSeedRandomize />

View File

@ -12,8 +12,12 @@ import HotkeysModal from 'features/system/components/HotkeysModal/HotkeysModal';
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaBug, FaCog, FaDiscord, FaGithub, FaKeyboard } from 'react-icons/fa'; import {
import { FaWrench } from 'react-icons/fa6'; PiBugBeetleBold,
PiKeyboardBold,
PiToggleRightFill,
} from 'react-icons/pi';
import { RiDiscordFill, RiGithubFill, RiSettings4Line } from 'react-icons/ri';
import SettingsModal from './SettingsModal'; import SettingsModal from './SettingsModal';
const SettingsMenu = () => { const SettingsMenu = () => {
@ -34,7 +38,7 @@ const SettingsMenu = () => {
as={InvIconButton} as={InvIconButton}
variant="link" variant="link"
aria-label={t('accessibility.menu')} aria-label={t('accessibility.menu')}
icon={<FaCog fontSize={20} />} icon={<RiSettings4Line fontSize={20} />}
boxSize={8} boxSize={8}
/> />
@ -45,7 +49,7 @@ const SettingsMenu = () => {
as="a" as="a"
href={githubLink} href={githubLink}
target="_blank" target="_blank"
icon={<FaGithub />} icon={<RiGithubFill />}
> >
{t('common.githubLabel')} {t('common.githubLabel')}
</InvMenuItem> </InvMenuItem>
@ -55,7 +59,7 @@ const SettingsMenu = () => {
as="a" as="a"
href={`${githubLink}/issues`} href={`${githubLink}/issues`}
target="_blank" target="_blank"
icon={<FaBug />} icon={<PiBugBeetleBold />}
> >
{t('common.reportBugLabel')} {t('common.reportBugLabel')}
</InvMenuItem> </InvMenuItem>
@ -65,7 +69,7 @@ const SettingsMenu = () => {
as="a" as="a"
href={discordLink} href={discordLink}
target="_blank" target="_blank"
icon={<FaDiscord />} icon={<RiDiscordFill />}
> >
{t('common.discordLabel')} {t('common.discordLabel')}
</InvMenuItem> </InvMenuItem>
@ -73,12 +77,12 @@ const SettingsMenu = () => {
</InvMenuGroup> </InvMenuGroup>
<InvMenuGroup title={t('common.settingsLabel')}> <InvMenuGroup title={t('common.settingsLabel')}>
<HotkeysModal> <HotkeysModal>
<InvMenuItem as="button" icon={<FaKeyboard />}> <InvMenuItem as="button" icon={<PiKeyboardBold />}>
{t('common.hotkeysLabel')} {t('common.hotkeysLabel')}
</InvMenuItem> </InvMenuItem>
</HotkeysModal> </HotkeysModal>
<SettingsModal> <SettingsModal>
<InvMenuItem as="button" icon={<FaWrench />}> <InvMenuItem as="button" icon={<PiToggleRightFill />}>
{t('common.settingsLabel')} {t('common.settingsLabel')}
</InvMenuItem> </InvMenuItem>
</SettingsModal> </SettingsModal>

View File

@ -5,7 +5,7 @@ import { InvTooltip } from 'common/components/InvTooltip/InvTooltip';
import type { UsePanelReturn } from 'features/ui/hooks/usePanel'; import type { UsePanelReturn } from 'features/ui/hooks/usePanel';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { MdPhotoLibrary } from 'react-icons/md'; import { PiImagesSquareBold } from 'react-icons/pi';
type Props = { type Props = {
panelApi: UsePanelReturn; panelApi: UsePanelReturn;
@ -34,7 +34,7 @@ const FloatingGalleryButton = (props: Props) => {
<InvIconButton <InvIconButton
aria-label={t('accessibility.showGalleryPanel')} aria-label={t('accessibility.showGalleryPanel')}
onClick={props.panelApi.expand} onClick={props.panelApi.expand}
icon={<MdPhotoLibrary />} icon={<PiImagesSquareBold size="20px" />}
p={0} p={0}
h={48} h={48}
borderEndRadius={0} borderEndRadius={0}

View File

@ -10,8 +10,8 @@ import { useQueueBack } from 'features/queue/hooks/useQueueBack';
import type { UsePanelReturn } from 'features/ui/hooks/usePanel'; import type { UsePanelReturn } from 'features/ui/hooks/usePanel';
import { memo, useMemo } from 'react'; import { memo, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaSlidersH } from 'react-icons/fa'; import { PiSlidersHorizontalBold } from 'react-icons/pi';
import { IoSparkles } from 'react-icons/io5'; import { RiSparklingFill } from 'react-icons/ri';
import { useGetQueueStatusQuery } from 'services/api/endpoints/queue'; import { useGetQueueStatusQuery } from 'services/api/endpoints/queue';
import { spinAnimationSlow } from 'theme/animations'; import { spinAnimationSlow } from 'theme/animations';
@ -34,7 +34,7 @@ const FloatingSidePanelButtons = (props: Props) => {
!isDisabled && queueStatus?.processor.is_processing ? ( !isDisabled && queueStatus?.processor.is_processing ? (
<SpinnerIcon animation={spinAnimationSlow} /> <SpinnerIcon animation={spinAnimationSlow} />
) : ( ) : (
<IoSparkles /> <RiSparklingFill size="16px" />
), ),
[isDisabled, queueStatus?.processor.is_processing] [isDisabled, queueStatus?.processor.is_processing]
); );
@ -61,7 +61,7 @@ const FloatingSidePanelButtons = (props: Props) => {
aria-label={t('accessibility.showOptionsPanel')} aria-label={t('accessibility.showOptionsPanel')}
onClick={props.panelApi.expand} onClick={props.panelApi.expand}
sx={floatingButtonStyles} sx={floatingButtonStyles}
icon={<FaSlidersH />} icon={<PiSlidersHorizontalBold size="16px" />}
/> />
<InvIconButton <InvIconButton
aria-label={t('queue.queueBack')} aria-label={t('queue.queueBack')}

View File

@ -33,9 +33,14 @@ import type { CSSProperties, MouseEvent, ReactElement, ReactNode } from 'react';
import { memo, useCallback, useMemo, useRef } from 'react'; import { memo, useCallback, useMemo, useRef } from 'react';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaCube, FaFont, FaImage } from 'react-icons/fa'; import { PiFlowArrowBold } from 'react-icons/pi';
import { FaCircleNodes, FaList } from 'react-icons/fa6'; import {
import { MdGridOn } from 'react-icons/md'; RiBox2Line,
RiBrushLine,
RiImage2Line,
RiInputMethodLine,
RiPlayList2Fill,
} from 'react-icons/ri';
import type { ImperativePanelGroupHandle } from 'react-resizable-panels'; import type { ImperativePanelGroupHandle } from 'react-resizable-panels';
import { Panel, PanelGroup } from 'react-resizable-panels'; import { Panel, PanelGroup } from 'react-resizable-panels';
@ -59,37 +64,37 @@ const tabs: InvokeTabInfo[] = [
{ {
id: 'txt2img', id: 'txt2img',
translationKey: 'common.txt2img', translationKey: 'common.txt2img',
icon: <FaFont />, icon: <RiInputMethodLine />,
content: <TextToImageTab />, content: <TextToImageTab />,
}, },
{ {
id: 'img2img', id: 'img2img',
translationKey: 'common.img2img', translationKey: 'common.img2img',
icon: <FaImage />, icon: <RiImage2Line />,
content: <ImageTab />, content: <ImageTab />,
}, },
{ {
id: 'unifiedCanvas', id: 'unifiedCanvas',
translationKey: 'common.unifiedCanvas', translationKey: 'common.unifiedCanvas',
icon: <MdGridOn />, icon: <RiBrushLine />,
content: <UnifiedCanvasTab />, content: <UnifiedCanvasTab />,
}, },
{ {
id: 'nodes', id: 'nodes',
translationKey: 'common.nodes', translationKey: 'common.nodes',
icon: <FaCircleNodes />, icon: <PiFlowArrowBold />,
content: <NodesTab />, content: <NodesTab />,
}, },
{ {
id: 'modelManager', id: 'modelManager',
translationKey: 'modelManager.modelManager', translationKey: 'modelManager.modelManager',
icon: <FaCube />, icon: <RiBox2Line />,
content: <ModelManagerTab />, content: <ModelManagerTab />,
}, },
{ {
id: 'queue', id: 'queue',
translationKey: 'queue.queue', translationKey: 'queue.queue',
icon: <FaList />, icon: <RiPlayList2Fill />,
content: <QueueTab />, content: <QueueTab />,
}, },
]; ];

View File

@ -3,7 +3,7 @@ import { InvButton } from 'common/components/InvButton/InvButton';
import { WorkflowLibraryModalContext } from 'features/workflowLibrary/context/WorkflowLibraryModalContext'; import { WorkflowLibraryModalContext } from 'features/workflowLibrary/context/WorkflowLibraryModalContext';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaFolderOpen } from 'react-icons/fa'; import { PiBooksBold } from 'react-icons/pi';
import WorkflowLibraryModal from './WorkflowLibraryModal'; import WorkflowLibraryModal from './WorkflowLibraryModal';
@ -14,7 +14,7 @@ const WorkflowLibraryButton = () => {
return ( return (
<WorkflowLibraryModalContext.Provider value={disclosure}> <WorkflowLibraryModalContext.Provider value={disclosure}>
<InvButton <InvButton
leftIcon={<FaFolderOpen />} leftIcon={<PiBooksBold />}
onClick={disclosure.onOpen} onClick={disclosure.onOpen}
pointerEvents="auto" pointerEvents="auto"
> >

View File

@ -2,14 +2,18 @@ import { InvMenuItem } from 'common/components/InvMenu/InvMenuItem';
import { useDownloadWorkflow } from 'features/workflowLibrary/hooks/useDownloadWorkflow'; import { useDownloadWorkflow } from 'features/workflowLibrary/hooks/useDownloadWorkflow';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaDownload } from 'react-icons/fa'; import { PiDownloadSimpleBold } from 'react-icons/pi';
const DownloadWorkflowMenuItem = () => { const DownloadWorkflowMenuItem = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const downloadWorkflow = useDownloadWorkflow(); const downloadWorkflow = useDownloadWorkflow();
return ( return (
<InvMenuItem as="button" icon={<FaDownload />} onClick={downloadWorkflow}> <InvMenuItem
as="button"
icon={<PiDownloadSimpleBold />}
onClick={downloadWorkflow}
>
{t('workflows.downloadWorkflow')} {t('workflows.downloadWorkflow')}
</InvMenuItem> </InvMenuItem>
); );

View File

@ -8,7 +8,7 @@ import { addToast } from 'features/system/store/systemSlice';
import { makeToast } from 'features/system/util/makeToast'; import { makeToast } from 'features/system/util/makeToast';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaCircleNodes } from 'react-icons/fa6'; import { PiFlowArrowBold } from 'react-icons/pi';
const NewWorkflowMenuItem = () => { const NewWorkflowMenuItem = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -41,7 +41,7 @@ const NewWorkflowMenuItem = () => {
return ( return (
<> <>
<InvMenuItem as="button" icon={<FaCircleNodes />} onClick={onClick}> <InvMenuItem as="button" icon={<PiFlowArrowBold />} onClick={onClick}>
{t('nodes.newWorkflow')} {t('nodes.newWorkflow')}
</InvMenuItem> </InvMenuItem>

View File

@ -9,7 +9,7 @@ import { getWorkflowCopyName } from 'features/workflowLibrary/util/getWorkflowCo
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import { memo, useCallback, useRef, useState } from 'react'; import { memo, useCallback, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaClone } from 'react-icons/fa'; import { PiCopyBold } from 'react-icons/pi';
const SaveWorkflowAsButton = () => { const SaveWorkflowAsButton = () => {
const currentName = useAppSelector((s) => s.workflow.name); const currentName = useAppSelector((s) => s.workflow.name);
@ -35,7 +35,7 @@ const SaveWorkflowAsButton = () => {
return ( return (
<> <>
<InvMenuItem as="button" icon={<FaClone />} onClick={onOpenCallback}> <InvMenuItem as="button" icon={<PiCopyBold />} onClick={onOpenCallback}>
{t('workflows.saveWorkflowAs')} {t('workflows.saveWorkflowAs')}
</InvMenuItem> </InvMenuItem>

View File

@ -2,13 +2,13 @@ import { InvMenuItem } from 'common/components/InvMenu/InvMenuItem';
import { useSaveLibraryWorkflow } from 'features/workflowLibrary/hooks/useSaveWorkflow'; import { useSaveLibraryWorkflow } from 'features/workflowLibrary/hooks/useSaveWorkflow';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaSave } from 'react-icons/fa'; import { PiFloppyDiskBold } from 'react-icons/pi';
const SaveLibraryWorkflowMenuItem = () => { const SaveLibraryWorkflowMenuItem = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { saveWorkflow } = useSaveLibraryWorkflow(); const { saveWorkflow } = useSaveLibraryWorkflow();
return ( return (
<InvMenuItem as="button" icon={<FaSave />} onClick={saveWorkflow}> <InvMenuItem as="button" icon={<PiFloppyDiskBold />} onClick={saveWorkflow}>
{t('workflows.saveWorkflow')} {t('workflows.saveWorkflow')}
</InvMenuItem> </InvMenuItem>
); );

View File

@ -2,7 +2,7 @@ import { InvMenuItem } from 'common/components/InvMenu/InvMenuItem';
import WorkflowEditorSettings from 'features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings'; import WorkflowEditorSettings from 'features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaCog } from 'react-icons/fa'; import { RiSettings4Line } from 'react-icons/ri';
const DownloadWorkflowMenuItem = () => { const DownloadWorkflowMenuItem = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -10,7 +10,7 @@ const DownloadWorkflowMenuItem = () => {
return ( return (
<WorkflowEditorSettings> <WorkflowEditorSettings>
{({ onOpen }) => ( {({ onOpen }) => (
<InvMenuItem as="button" icon={<FaCog />} onClick={onOpen}> <InvMenuItem as="button" icon={<RiSettings4Line />} onClick={onOpen}>
{t('nodes.workflowSettings')} {t('nodes.workflowSettings')}
</InvMenuItem> </InvMenuItem>
)} )}

View File

@ -3,7 +3,7 @@ import { useLoadWorkflowFromFile } from 'features/workflowLibrary/hooks/useLoadW
import { memo, useCallback, useRef } from 'react'; import { memo, useCallback, useRef } from 'react';
import { useDropzone } from 'react-dropzone'; import { useDropzone } from 'react-dropzone';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaUpload } from 'react-icons/fa'; import { PiUploadSimpleBold } from 'react-icons/pi';
const UploadWorkflowMenuItem = () => { const UploadWorkflowMenuItem = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -27,7 +27,7 @@ const UploadWorkflowMenuItem = () => {
multiple: false, multiple: false,
}); });
return ( return (
<InvMenuItem as="button" icon={<FaUpload />} {...getRootProps()}> <InvMenuItem as="button" icon={<PiUploadSimpleBold />} {...getRootProps()}>
{t('workflows.uploadWorkflow')} {t('workflows.uploadWorkflow')}
<input {...getInputProps()} /> <input {...getInputProps()} />
</InvMenuItem> </InvMenuItem>

View File

@ -16,7 +16,7 @@ import SettingsMenuItem from 'features/workflowLibrary/components/WorkflowLibrar
import UploadWorkflowMenuItem from 'features/workflowLibrary/components/WorkflowLibraryMenu/UploadWorkflowMenuItem'; import UploadWorkflowMenuItem from 'features/workflowLibrary/components/WorkflowLibraryMenu/UploadWorkflowMenuItem';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaEllipsis } from 'react-icons/fa6'; import { PiDotsThreeOutlineFill } from 'react-icons/pi';
const WorkflowLibraryMenu = () => { const WorkflowLibraryMenu = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -31,7 +31,7 @@ const WorkflowLibraryMenu = () => {
<InvMenuButton <InvMenuButton
as={InvIconButton} as={InvIconButton}
aria-label={t('workflows.workflowEditorMenu')} aria-label={t('workflows.workflowEditorMenu')}
icon={<FaEllipsis />} icon={<PiDotsThreeOutlineFill />}
pointerEvents="auto" pointerEvents="auto"
/> />
<InvMenuList pointerEvents="auto"> <InvMenuList pointerEvents="auto">