feat(ui): replace some icons

This commit is contained in:
Fu Diwei
2025-07-20 17:26:18 +08:00
parent ec2a29f6c2
commit 676861b06d
12 changed files with 64 additions and 68 deletions
+2 -3
View File
@@ -191,7 +191,6 @@ const MultipleInputItem = forwardRef<MultipleInputItemInstance, MultipleInputIte
allowUp,
disabled,
showSortButton,
size,
onEntryAdd,
onEntryDown,
onEntryUp,
@@ -254,12 +253,12 @@ const MultipleInputItem = forwardRef<MultipleInputItemInstance, MultipleInputIte
onChange={handleInputChange}
/>
</div>
<Space.Compact size={size}>
<div className="flex items-center justify-end">
{removeBtn}
{upBtn}
{downBtn}
{addBtn}
</Space.Compact>
</div>
</div>
);
}
@@ -244,7 +244,7 @@ const AccessFormSSHConfig = ({ form: formInst, formName, disabled, initialValues
key: field.key,
label: <Label />,
extra: (
<Space.Compact>
<div className="flex items-center justify-end">
<Button
icon={<IconChevronUp size="1.25em" />}
color="default"
@@ -278,7 +278,7 @@ const AccessFormSSHConfig = ({ form: formInst, formName, disabled, initialValues
e.stopPropagation();
}}
/>
</Space.Compact>
</div>
),
children: <Fields />,
};
@@ -1,5 +1,5 @@
import { useState } from "react";
import { ExpandOutlined as ExpandOutlinedIcon, MinusOutlined as MinusOutlinedIcon, PlusOutlined as PlusOutlinedIcon } from "@ant-design/icons";
import { IconMaximize, IconMinus, IconPlus } from "@tabler/icons-react";
import { Button, Card, Typography } from "antd";
import WorkflowElements from "@/components/workflow/WorkflowElements";
@@ -30,13 +30,13 @@ const WorkflowElementsContainer = ({ className, style, disabled }: WorkflowEleme
</div>
</div>
<div className="absolute bottom-4 right-6 z-2">
<div className="absolute right-6 bottom-4 z-2">
<Card className="rounded-lg p-2 shadow-lg" styles={{ body: { padding: 0 } }}>
<div className="flex items-center gap-2">
<Button icon={<MinusOutlinedIcon />} disabled={scale <= MIN_SCALE} onClick={() => setScale((s) => Math.max(MIN_SCALE, s - STEP_SCALE))} />
<Button icon={<IconMinus size="1.25em" />} disabled={scale <= MIN_SCALE} onClick={() => setScale((s) => Math.max(MIN_SCALE, s - STEP_SCALE))} />
<Typography.Text className="min-w-12 text-center">{Math.round(scale * 100)}%</Typography.Text>
<Button icon={<PlusOutlinedIcon />} disabled={scale >= MAX_SCALE} onClick={() => setScale((s) => Math.min(MAX_SCALE, s + STEP_SCALE))} />
<Button icon={<ExpandOutlinedIcon />} onClick={() => setScale(1)} />
<Button icon={<IconPlus size="1.25em" />} disabled={scale >= MAX_SCALE} onClick={() => setScale((s) => Math.min(MAX_SCALE, s + STEP_SCALE))} />
<Button icon={<IconMaximize size="1.25em" />} onClick={() => setScale(1)} />
</div>
</Card>
</div>
+4 -4
View File
@@ -4,11 +4,11 @@ import {
CloudUploadOutlined as CloudUploadOutlinedIcon,
DeploymentUnitOutlined as DeploymentUnitOutlinedIcon,
MonitorOutlined as MonitorOutlinedIcon,
PlusOutlined as PlusOutlinedIcon,
SendOutlined as SendOutlinedIcon,
SisternodeOutlined as SisternodeOutlinedIcon,
SolutionOutlined as SolutionOutlinedIcon,
} from "@ant-design/icons";
import { IconPlus } from "@tabler/icons-react";
import { Dropdown } from "antd";
import { WorkflowNodeType, newNode } from "@/domain/workflow";
@@ -63,10 +63,10 @@ const AddNode = ({ node, disabled }: AddNodeProps) => {
}, [node.id, disabled, node.type]);
return (
<div className="relative py-6 before:absolute before:left-1/2 before:top-0 before:h-full before:w-[2px] before:-translate-x-1/2 before:bg-stone-200 before:content-['']">
<div className="relative py-6 before:absolute before:top-0 before:left-1/2 before:h-full before:w-[2px] before:-translate-x-1/2 before:bg-stone-200 before:content-['']">
<Dropdown menu={{ items: dropdownMenus }} trigger={["click"]}>
<div className="relative z-1 flex size-5 cursor-pointer items-center justify-center rounded-full text-white bg-stone-400 hover:bg-stone-500">
<PlusOutlinedIcon />
<div className="relative z-1 flex size-5 cursor-pointer items-center justify-center rounded-full bg-stone-400 text-white hover:bg-stone-500">
<IconPlus size="1em" />
</div>
</Dropdown>
</div>
@@ -1,12 +1,7 @@
import { forwardRef, memo, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { Link } from "react-router";
import {
CloseOutlined as CloseOutlinedIcon,
PlusOutlined as PlusOutlinedIcon,
QuestionCircleOutlined as QuestionCircleOutlinedIcon,
RightOutlined as RightOutlinedIcon,
} from "@ant-design/icons";
import { IconChevronRight, IconHelp, IconPlus, IconX } from "@tabler/icons-react";
import { useControllableValue } from "ahooks";
import { AutoComplete, Button, Divider, Flex, Form, type FormInstance, Input, InputNumber, Select, Switch, Tooltip, Typography } from "antd";
import { createSchemaFieldRule } from "antd-zod";
@@ -325,7 +320,7 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
<span>{t("workflow_node.apply.form.provider_access.label")}</span>
<Tooltip title={t("workflow_node.apply.form.provider_access.tooltip")}>
<Typography.Text className="ms-1" type="secondary">
<QuestionCircleOutlinedIcon />
<IconHelp size="1.25em" />
</Typography.Text>
</Tooltip>
</div>
@@ -335,7 +330,7 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
trigger={
<Button size="small" type="link">
{t("workflow_node.apply.form.provider_access.button")}
<PlusOutlinedIcon className="text-xs" />
<IconPlus size="1.25em" />
</Button>
}
usage="both-dns-hosting"
@@ -386,7 +381,7 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
<Link className="ant-typography" to="/settings/ssl-provider" target="_blank">
<Button size="small" type="link">
{t("workflow_node.apply.form.ca_provider.button")}
<RightOutlinedIcon className="text-xs" />
<IconChevronRight size="1.25em" />
</Button>
</Link>
</Show>
@@ -417,7 +412,7 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
trigger={
<Button size="small" type="link">
{t("workflow_node.apply.form.ca_provider_access.button")}
<PlusOutlinedIcon className="text-xs" />
<IconChevronRight size="1.25em" />
</Button>
}
usage="ca-only"
@@ -607,12 +602,12 @@ const EmailInput = memo(
const renderOptionLabel = (email: string, removable: boolean = false) => (
<div className="flex items-center gap-2 overflow-hidden">
<span className="flex-1 overflow-hidden truncate">{email}</span>
<span className="flex-1 truncate overflow-hidden">{email}</span>
{removable && (
<Button
color="default"
disabled={disabled}
icon={<CloseOutlinedIcon />}
icon={<IconX size="1.25em" />}
size="small"
type="text"
onClick={(e) => {
@@ -1,5 +1,5 @@
import { memo, useRef, useState } from "react";
import { FilterFilled as FilterFilledIcon, FilterOutlined as FilterOutlinedIcon, MoreOutlined as MoreOutlinedIcon } from "@ant-design/icons";
import { IconDotsVertical, IconFilter, IconFilterFilled } from "@tabler/icons-react";
import { Button, Card, Popover } from "antd";
import { produce } from "immer";
@@ -59,25 +59,25 @@ const ConditionNode = ({ node, disabled, branchId, branchIndex }: ConditionNodeP
branchId={branchId}
branchIndex={branchIndex}
disabled={disabled}
trigger={<Button color="primary" icon={<MoreOutlinedIcon />} variant="text" />}
trigger={<Button color="primary" icon={<IconDotsVertical size="1em" />} variant="text" />}
/>
}
placement="rightTop"
>
<div className="relative w-[256px] z-1 mt-10">
<div className="relative z-1 mt-10 w-[256px]">
<Card className="shadow-md" styles={{ body: { padding: 0 } }} hoverable onClick={() => setDrawerOpen(true)}>
<div className="flex h-[48px] flex-col items-center justify-center truncate px-4 py-2">
<div className="relative w-full overflow-hidden" onClick={(e) => e.stopPropagation()}>
<SharedNode.Title
className="focus:bg-background focus:text-foreground overflow-hidden outline-slate-200 focus:rounded-xs"
className="overflow-hidden outline-slate-200 focus:rounded-xs focus:bg-background focus:text-foreground"
node={node}
disabled={disabled}
/>
<div className="absolute right-0 top-1/2 -translate-y-1/2" onClick={() => setDrawerOpen(true)}>
<div className="absolute top-1/2 right-0 -translate-y-1/2" onClick={() => setDrawerOpen(true)}>
{node.config?.expression ? (
<Button color="primary" icon={<FilterFilledIcon />} variant="link" />
<Button color="primary" icon={<IconFilterFilled size="1em" />} variant="link" />
) : (
<Button color="default" icon={<FilterOutlinedIcon />} variant="link" />
<Button color="default" icon={<IconFilter size="1em" />} variant="link" />
)}
</div>
</div>
@@ -1,6 +1,6 @@
import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { CloseOutlined as CloseOutlinedIcon, PlusOutlined } from "@ant-design/icons";
import { IconPlus, IconX } from "@tabler/icons-react";
import { useControllableValue } from "ahooks";
import { Button, Form, Input, Radio, Select, theme } from "antd";
@@ -372,7 +372,7 @@ const ConditionNodeConfigFormExpressionEditor = forwardRef<ConditionNodeConfigFo
className="my-1"
color="default"
disabled={disabled}
icon={<CloseOutlinedIcon />}
icon={<IconX size="1.25em" />}
size="small"
type="text"
onClick={() => remove(index)}
@@ -381,7 +381,7 @@ const ConditionNodeConfigFormExpressionEditor = forwardRef<ConditionNodeConfigFo
))}
<Form.Item>
<Button type="dashed" block icon={<PlusOutlined />} onClick={() => add({})}>
<Button type="dashed" block icon={<IconPlus size="1.25em" />} onClick={() => add({})}>
{t("workflow_node.condition.form.expression.add_condition.button")}
</Button>
</Form.Item>
@@ -1,6 +1,6 @@
import { forwardRef, memo, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { PlusOutlined as PlusOutlinedIcon, QuestionCircleOutlined as QuestionCircleOutlinedIcon } from "@ant-design/icons";
import { IconHelp, IconPlus } from "@tabler/icons-react";
import { Button, Divider, Flex, Form, type FormInstance, Select, Switch, Tooltip, Typography, theme } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod/v4";
@@ -482,7 +482,7 @@ const DeployNodeConfigForm = forwardRef<DeployNodeConfigFormInstance, DeployNode
<span>{t("workflow_node.deploy.form.provider_access.label")}</span>
<Tooltip title={t("workflow_node.deploy.form.provider_access.tooltip")}>
<Typography.Text className="ms-1" type="secondary">
<QuestionCircleOutlinedIcon />
<IconHelp size="1.25em" />
</Typography.Text>
</Tooltip>
</div>
@@ -493,7 +493,7 @@ const DeployNodeConfigForm = forwardRef<DeployNodeConfigFormInstance, DeployNode
trigger={
<Button size="small" type="link">
{t("workflow_node.deploy.form.provider_access.button")}
<PlusOutlinedIcon className="text-xs" />
<IconPlus size="1.25em" />
</Button>
}
usage="both-dns-hosting"
@@ -1,9 +1,5 @@
import { memo } from "react";
import {
CheckCircleOutlined as CheckCircleOutlinedIcon,
CloseCircleOutlined as CloseCircleOutlinedIcon,
MoreOutlined as MoreOutlinedIcon,
} from "@ant-design/icons";
import { IconCircleCheck, IconCircleX, IconDotsVertical } from "@tabler/icons-react";
import { Button, Card, Popover, theme } from "antd";
import { WorkflowNodeType } from "@/domain/workflow";
@@ -30,7 +26,7 @@ const ExecuteResultNode = ({ node, disabled, branchId, branchIndex }: ConditionN
branchId={branchId}
branchIndex={branchIndex}
disabled={disabled}
trigger={<Button color="primary" icon={<MoreOutlinedIcon />} variant="text" />}
trigger={<Button color="primary" icon={<IconDotsVertical size="1em" />} variant="text" />}
/>
}
placement="rightTop"
@@ -40,12 +36,12 @@ const ExecuteResultNode = ({ node, disabled, branchId, branchIndex }: ConditionN
<div className="flex h-[48px] flex-col items-center justify-center truncate px-4 py-2">
<div className="flex items-center space-x-2">
{node.type === WorkflowNodeType.ExecuteSuccess ? (
<CheckCircleOutlinedIcon style={{ color: themeToken.colorSuccess }} />
<IconCircleCheck style={{ color: themeToken.colorSuccess }} size="1.5em" />
) : (
<CloseCircleOutlinedIcon style={{ color: themeToken.colorError }} />
<IconCircleX style={{ color: themeToken.colorError }} size="1.5em" />
)}
<SharedNode.Title
className="focus:bg-background focus:text-foreground overflow-hidden outline-slate-200 focus:rounded-xs"
className="overflow-hidden outline-slate-200 focus:rounded-xs focus:bg-background focus:text-foreground"
node={node}
disabled={disabled}
/>
@@ -1,6 +1,6 @@
import { forwardRef, memo, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { PlusOutlined as PlusOutlinedIcon } from "@ant-design/icons";
import { IconPlus } from "@tabler/icons-react";
import { Button, Divider, Flex, Form, type FormInstance, Input, Switch, Typography } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod/v4";
@@ -203,7 +203,7 @@ const NotifyNodeConfigForm = forwardRef<NotifyNodeConfigFormInstance, NotifyNode
trigger={
<Button size="small" type="link">
{t("workflow_node.notify.form.provider_access.button")}
<PlusOutlinedIcon className="text-xs" />
<IconPlus size="1.25em" />
</Button>
}
usage="notification-only"
@@ -1,5 +1,5 @@
import { memo } from "react";
import { CloseCircleOutlined as CloseCircleOutlinedIcon } from "@ant-design/icons";
import { IconTrashX } from "@tabler/icons-react";
import { Alert, Button, Card } from "antd";
import { useZustandShallowSelector } from "@/hooks";
@@ -21,7 +21,7 @@ const UnknownNode = ({ node, disabled }: MonitorNodeProps) => {
<>
<div className="relative w-[256px] overflow-hidden">
<Card className="shadow-md" styles={{ body: { padding: 0 } }} hoverable variant="borderless">
<div className="cursor-pointer ">
<div className="cursor-pointer">
<Alert
type="error"
message={
@@ -31,7 +31,7 @@ const UnknownNode = ({ node, disabled }: MonitorNodeProps) => {
<br />
PLEASE REMOVE
</div>
<Button color="primary" icon={<CloseCircleOutlinedIcon />} variant="text" onClick={handleClickRemove} />
<Button color="primary" icon={<IconTrashX size="1.25em" />} variant="text" onClick={handleClickRemove} />
</div>
}
/>
+21 -15
View File
@@ -1,12 +1,6 @@
import { memo, useMemo, useRef } from "react";
import { useTranslation } from "react-i18next";
import {
CloseCircleOutlined as CloseCircleOutlinedIcon,
EllipsisOutlined as EllipsisOutlinedIcon,
FormOutlined as FormOutlinedIcon,
MoreOutlined as MoreOutlinedIcon,
SnippetsOutlined as SnippetsOutlinedIcon,
} from "@ant-design/icons";
import { IconCopy, IconDotsVertical, IconLabel, IconTrashX } from "@tabler/icons-react";
import { useControllableValue } from "ahooks";
import { Button, Card, Drawer, Dropdown, Input, type InputRef, type MenuProps, Modal, Popover, Space } from "antd";
import { produce } from "immer";
@@ -150,14 +144,18 @@ const SharedNodeMenu = ({ menus, trigger, node, disabled, branchId, branchIndex,
key: "rename",
disabled: disabled,
label: isNodeBranchLike(node) ? t("workflow_node.action.rename_branch") : t("workflow_node.action.rename_node"),
icon: <FormOutlinedIcon />,
icon: (
<span className="anticon scale-125">
<IconLabel size="1em" />
</span>
),
onClick: () => {
nameRef.current = node.name;
const dialog = modalApi.confirm({
title: isNodeBranchLike(node) ? t("workflow_node.action.rename_branch") : t("workflow_node.action.rename_node"),
content: (
<div className="pb-2 pt-4">
<div className="pt-4 pb-2">
<Input
ref={nameInputRef}
autoFocus
@@ -181,7 +179,11 @@ const SharedNodeMenu = ({ menus, trigger, node, disabled, branchId, branchIndex,
key: "duplicate",
disabled: disabled || isNodeUnduplicatable(node),
label: isNodeBranchLike(node) ? t("workflow_node.action.duplicate_branch") : t("workflow_node.action.duplicate_node"),
icon: <SnippetsOutlinedIcon />,
icon: (
<span className="anticon scale-125">
<IconCopy size="1em" />
</span>
),
onClick: handleDuplicateClick,
},
{
@@ -191,7 +193,11 @@ const SharedNodeMenu = ({ menus, trigger, node, disabled, branchId, branchIndex,
key: "remove",
disabled: disabled || isNodeUnremovable(node),
label: isNodeBranchLike(node) ? t("workflow_node.action.remove_branch") : t("workflow_node.action.remove_node"),
icon: <CloseCircleOutlinedIcon />,
icon: (
<span className="anticon scale-125">
<IconTrashX size="1em" />
</span>
),
danger: true,
onClick: handleRemoveClick,
},
@@ -248,14 +254,14 @@ const SharedNodeBlock = ({ children, node, disabled, onClick }: SharedNodeBlockP
classNames={{ root: "shadow-md" }}
styles={{ body: { padding: 0 } }}
arrow={false}
content={<SharedNodeMenu node={node} disabled={disabled} trigger={<Button color="primary" icon={<MoreOutlinedIcon />} variant="text" />} />}
content={<SharedNodeMenu node={node} disabled={disabled} trigger={<Button color="primary" icon={<IconDotsVertical size="1em" />} variant="text" />} />}
placement="rightTop"
>
<div className="relative w-[256px] overflow-hidden">
<Card className="shadow-md" styles={{ body: { padding: 0 } }} hoverable>
<div className="bg-primary flex h-[48px] flex-col items-center justify-center truncate px-4 py-2 text-white">
<div className="flex h-[48px] flex-col items-center justify-center truncate bg-primary px-4 py-2 text-white">
<SharedNodeTitle
className="focus:bg-background focus:text-foreground overflow-hidden outline-hidden focus:rounded-xs"
className="overflow-hidden outline-hidden focus:rounded-xs focus:bg-background focus:text-foreground"
node={node}
disabled={disabled}
/>
@@ -353,7 +359,7 @@ const SharedNodeConfigDrawer = ({
menus={["rename", "remove"]}
node={node}
disabled={disabled}
trigger={<Button icon={<EllipsisOutlinedIcon />} type="text" />}
trigger={<Button icon={<IconDotsVertical size="1.25em" />} type="text" />}
afterDelete={() => {
setOpen(false);
}}