diff --git a/web/src/assets/images/workflow/deleteBg.svg b/web/src/assets/images/workflow/deleteBg.svg
new file mode 100644
index 00000000..f3827fef
--- /dev/null
+++ b/web/src/assets/images/workflow/deleteBg.svg
@@ -0,0 +1,21 @@
+
+
\ No newline at end of file
diff --git a/web/src/assets/images/workflow/deleteBg_hover.svg b/web/src/assets/images/workflow/deleteBg_hover.svg
new file mode 100644
index 00000000..9e92cf75
--- /dev/null
+++ b/web/src/assets/images/workflow/deleteBg_hover.svg
@@ -0,0 +1,22 @@
+
+
\ No newline at end of file
diff --git a/web/src/assets/images/workflow/delete_cycle.svg b/web/src/assets/images/workflow/delete_cycle.svg
new file mode 100644
index 00000000..0d85650d
--- /dev/null
+++ b/web/src/assets/images/workflow/delete_cycle.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/web/src/assets/images/workflow/recall.svg b/web/src/assets/images/workflow/recall.svg
new file mode 100644
index 00000000..756f9060
--- /dev/null
+++ b/web/src/assets/images/workflow/recall.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/web/src/assets/images/workflow/recall_hover.svg b/web/src/assets/images/workflow/recall_hover.svg
new file mode 100644
index 00000000..a2e949a0
--- /dev/null
+++ b/web/src/assets/images/workflow/recall_hover.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/web/src/components/FormItem/DescWrapper.tsx b/web/src/components/FormItem/DescWrapper.tsx
new file mode 100644
index 00000000..300fc2b6
--- /dev/null
+++ b/web/src/components/FormItem/DescWrapper.tsx
@@ -0,0 +1,12 @@
+import clsx from "clsx";
+import type { FC, ReactNode } from "react";
+
+const DescWrapper: FC<{desc: string | ReactNode, className?: string}> = ({desc, className}) => {
+ return (
+
+ {desc}
+
+ )
+}
+
+export default DescWrapper
\ No newline at end of file
diff --git a/web/src/components/FormItem/LabelWrapper.tsx b/web/src/components/FormItem/LabelWrapper.tsx
new file mode 100644
index 00000000..461250d8
--- /dev/null
+++ b/web/src/components/FormItem/LabelWrapper.tsx
@@ -0,0 +1,13 @@
+import clsx from "clsx";
+import type { FC, ReactNode } from "react";
+
+const LabelWrapper: FC<{ title: string | ReactNode, className?: string; children?: ReactNode}> = ({title, className, children}) => {
+ return (
+
+ )
+}
+
+export default LabelWrapper
\ No newline at end of file
diff --git a/web/src/components/FormItem/SwitchFormItem.tsx b/web/src/components/FormItem/SwitchFormItem.tsx
new file mode 100644
index 00000000..e17a8728
--- /dev/null
+++ b/web/src/components/FormItem/SwitchFormItem.tsx
@@ -0,0 +1,45 @@
+import { Switch, Form, ConfigProvider } from "antd";
+import useSize from 'antd/lib/config-provider/hooks/useSize'
+import type { FC, ReactNode } from "react";
+import { useContext } from "react";
+
+import LabelWrapper from './LabelWrapper'
+import DescWrapper from './DescWrapper'
+
+interface SwitchFormItemProps {
+ title: string | ReactNode;
+ desc?: string | ReactNode;
+ name: string | string[];
+ size?: 'small' | 'default'
+ className?: string;
+ disabled?: boolean;
+}
+
+const SwitchFormItem: FC = ({
+ title,
+ desc,
+ name,
+ size = 'default',
+ className,
+ disabled
+}) => {
+ const componentSize = useSize()
+ console.log('componentSize', componentSize)
+
+ return (
+
+
+ {desc && }
+
+
+
+
+
+ )
+}
+
+export default SwitchFormItem
\ No newline at end of file
diff --git a/web/src/components/Header/index.tsx b/web/src/components/Header/index.tsx
index 9aeeab6b..fac432f5 100644
--- a/web/src/components/Header/index.tsx
+++ b/web/src/components/Header/index.tsx
@@ -54,7 +54,7 @@ const AppHeader: FC<{source?: 'space' | 'manage';}> = ({source = 'manage'}) => {
key: '1',
label: (<>
{user.username}
- {user.email}
+ {user.email}
>),
},
{
diff --git a/web/src/components/Markdown/index.tsx b/web/src/components/Markdown/index.tsx
index d16b72e4..58650207 100644
--- a/web/src/components/Markdown/index.tsx
+++ b/web/src/components/Markdown/index.tsx
@@ -150,9 +150,19 @@ const RbMarkdown: FC = ({
)
}
+ // 处理键盘快捷键
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ if ((e.ctrlKey || e.metaKey) && e.key === 'c') {
+ const selection = window.getSelection()
+ if (selection && selection.toString()) {
+ navigator.clipboard.writeText(selection.toString())
+ }
+ }
+ }
+
// 预览模式
return (
-