diff --git a/web/app/components/datasets/create/index.tsx b/web/app/components/datasets/create/index.tsx
index 943e32deb1..9dc498bcae 100644
--- a/web/app/components/datasets/create/index.tsx
+++ b/web/app/components/datasets/create/index.tsx
@@ -6,6 +6,7 @@ import { ModelTypeEnum } from '../../header/account-setting/model-provider-page/
import StepOne from './step-one'
import StepTwo from './step-two'
import StepThree from './step-three'
+import { Topbar } from './top-bar'
import { DataSourceType } from '@/models/datasets'
import type { CrawlOptions, CrawlResultItem, DataSet, FileItem, createDocumentResponse } from '@/models/datasets'
import { fetchDataSource } from '@/service/common'
@@ -119,6 +120,7 @@ const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
return (
+
-
-
-
{t('datasetCreation.steps.two')}
- {(isMobile || !showPreview) && (
-
- )}
-
+
{t('datasetCreation.stepTwo.segmentation')}
@@ -906,7 +888,7 @@ const StepTwo = ({
-
{t('datasetCreation.stepTwo.QATitle')}
+
{t('datasetCreation.stepTwo.QATitle')}
{t('datasetCreation.stepTwo.QALanguage')}
diff --git a/web/app/components/datasets/create/stepper/index.tsx b/web/app/components/datasets/create/stepper/index.tsx
new file mode 100644
index 0000000000..b416215c26
--- /dev/null
+++ b/web/app/components/datasets/create/stepper/index.tsx
@@ -0,0 +1,34 @@
+import type { FC } from 'react'
+import type { Step } from './step'
+import { StepperStep } from './step'
+
+export type StepperProps = {
+ steps: Step[]
+ activeStepIndex: number
+}
+
+function join
(array: T[], sep: R): Array {
+ return array.reduce((acc, item, index) => {
+ if (index === 0)
+ return [item]
+
+ return acc.concat([sep, item])
+ }, [] as Array)
+}
+
+export const Stepper: FC = (props) => {
+ const { steps, activeStepIndex } = props
+ return
+ {join(
+ steps.map((step, index) => (
+
+ )),
+
,
+ )}
+
+}
diff --git a/web/app/components/datasets/create/stepper/step.tsx b/web/app/components/datasets/create/stepper/step.tsx
new file mode 100644
index 0000000000..8ab77650d5
--- /dev/null
+++ b/web/app/components/datasets/create/stepper/step.tsx
@@ -0,0 +1,33 @@
+import type { FC } from 'react'
+import classNames from '@/utils/classnames'
+
+export type Step = {
+ name: string
+}
+
+export type StepperStepProps = Step & {
+ index: number
+ isActive: boolean
+}
+
+export const StepperStep: FC = (props) => {
+ const { name, isActive, index } = props
+ const label = isActive ? `STEP ${index + 1}` : `${index + 1}`
+ return
+}
diff --git a/web/app/components/datasets/create/top-bar/index.tsx b/web/app/components/datasets/create/top-bar/index.tsx
new file mode 100644
index 0000000000..86260cce70
--- /dev/null
+++ b/web/app/components/datasets/create/top-bar/index.tsx
@@ -0,0 +1,32 @@
+import type { FC } from 'react'
+import { RiArrowLeftLine } from '@remixicon/react'
+import { Stepper, type StepperProps } from '../stepper'
+import classNames from '@/utils/classnames'
+
+export type TopbarProps = Pick & {
+ className?: string
+}
+
+export const Topbar: FC = (props) => {
+ const { className, ...rest } = props
+ return
+
+
+
+ Create Knowledge
+
+
+
+
+
+
+}
diff --git a/web/app/dev-preview/page.tsx b/web/app/dev-preview/page.tsx
index e5529fcc25..176cf8360d 100644
--- a/web/app/dev-preview/page.tsx
+++ b/web/app/dev-preview/page.tsx
@@ -1,25 +1,16 @@
'use client'
-import Input from '../components/base/input'
-import { OptionCard } from '../components/datasets/create/step-two/option-card'
+import { Stepper } from '../components/datasets/create/stepper'
export default function Page() {
return
-
-
- Lorem ipsum
-
-
-
+
}