diff --git a/packages/account-v2/.eslintignore b/packages/account-v2/.eslintignore
index e0ea1d17ac5d..60d4d5c8c6fe 100644
--- a/packages/account-v2/.eslintignore
+++ b/packages/account-v2/.eslintignore
@@ -1,2 +1,4 @@
dist/*.js
*.config.*
+*.classnames.ts
+*.mock.*
diff --git a/packages/account-v2/.eslintrc.js b/packages/account-v2/.eslintrc.js
index d15b4c6385ed..cb5fe72635d2 100644
--- a/packages/account-v2/.eslintrc.js
+++ b/packages/account-v2/.eslintrc.js
@@ -25,7 +25,14 @@ module.exports = {
'typescript-sort-keys',
],
root: true,
- ignorePatterns: ['**/node_modules/**', '**/dist/**', '**/*.js', '**/*.config.*'],
+ ignorePatterns: [
+ '**/node_modules/**',
+ '**/dist/**',
+ '**/*.js',
+ '**/*.config.*',
+ '**/*.classnames.ts',
+ '**/*.mock.*',
+ ],
rules: {
'@typescript-eslint/array-type': 'error',
'@typescript-eslint/no-explicit-any': 'error',
diff --git a/packages/account-v2/src/App.tsx b/packages/account-v2/src/App.tsx
index f6cec65bcd41..dc3f8c377dbb 100644
--- a/packages/account-v2/src/App.tsx
+++ b/packages/account-v2/src/App.tsx
@@ -2,13 +2,20 @@ import React from 'react';
import { APIProvider } from '@deriv/api';
import { BrandDerivLogoCoralIcon } from '@deriv/quill-icons';
import './index.scss';
+import { BreakpointProvider } from '@deriv/quill-design';
+import { FormProgress } from './components/form-progress';
+import { stepProgress } from './mocks/form-progress.mock';
const App: React.FC = () => (
- Account V2
-
-
-
+
+ Account V2
+
+
+
+ {/* [TODO]:Mock - Remove hardcoded initial value once isActive comes from Modal */}
+
+
);
diff --git a/packages/account-v2/src/components/form-progress/form-progress.classnames.ts b/packages/account-v2/src/components/form-progress/form-progress.classnames.ts
new file mode 100644
index 000000000000..8c6666d30856
--- /dev/null
+++ b/packages/account-v2/src/components/form-progress/form-progress.classnames.ts
@@ -0,0 +1,37 @@
+import { cva } from 'class-variance-authority';
+
+const stepperBaseStyles = 'z-10 box-border flex h-800 w-800 items-center rounded-pill outline outline-2';
+
+export const stepperVariants = cva(stepperBaseStyles, {
+ variants: {
+ isActive: {
+ true: 'transition-all delay-700 duration-700 ease-out outline-solid-coral-700',
+ false: 'outline-solid-grey-5',
+ },
+ isFilled: {
+ true: '',
+ },
+ },
+ compoundVariants: [
+ {
+ isActive: false,
+ isFilled: true,
+ class: 'bg-solid-grey-5',
+ },
+ {
+ isActive: true,
+ isFilled: true,
+ class: 'bg-solid-coral-700',
+ },
+ ],
+});
+
+export const desktopStyle = {
+ stepper: 'lg:flex lg:w-fit lg:items-end lg:gap-gap-lg',
+ connector:
+ 'lg:h-2000 lg:w-100 lg:bg-[length:100%_200%] lg:bg-bottom lg:bg-gradient-to-b lg:aria-[current=true]:bg-top',
+};
+
+export const mobileStyle = {
+ connector: 'bg-[length:200%_100%] bg-right bg-gradient-to-r aria-[current=true]:bg-left w-auto h-general-2xs',
+};
diff --git a/packages/account-v2/src/components/form-progress/index.tsx b/packages/account-v2/src/components/form-progress/index.tsx
new file mode 100644
index 000000000000..a83813027a17
--- /dev/null
+++ b/packages/account-v2/src/components/form-progress/index.tsx
@@ -0,0 +1,66 @@
+import React, { useState } from 'react';
+import { useBreakpoint } from '@deriv/quill-design';
+import StepConnector from './step-connector';
+import Stepper, { TStep } from './stepper';
+
+type TFormProgressProps = {
+ activeStep: number;
+ steps: TStep[]; // [TODO]:Mock - Enable once isActive comes from Modal
+};
+
+/**
+ * @name FormProgress
+ * @param steps - List of steps to be rendered
+ * @returns React Component
+ */
+export const FormProgress = ({ steps = [] }: TFormProgressProps) => {
+ const [activeStep, setActiveStep] = useState(0); // [TODO]:Mock - remove once isActive comes from Modal
+
+ const { isMobile } = useBreakpoint();
+
+ // [TODO]:Mock - remove once isActive comes from Modal
+ const updateStep = (index: number) => {
+ if (steps[index - 1]?.isFilled || index === 0) {
+ setActiveStep(index + 1);
+ }
+ };
+
+ return (
+
+ {isMobile ? (
+
+ {' '}
+ {/* [TODO]:Mock - remove Fragment once isActive comes from Modal*/}
+
+ {steps.map((step, index) => (
+
+ ))}
+
+ {/* [TODO]:Mock - remove button once isActive comes from Modal*/}
+
+ {/* [TODO]:Mock - remove Fragment once isActive comes from Modal*/}
+
+ ) : (
+
+ {steps.map((step, index) => (
+ {
+ if (steps[index - 1]?.isFilled || index === 0) setActiveStep(index);
+ }}
+ step={step}
+ stepCount={index}
+ />
+ ))}
+
+ )}
+
+ );
+};
diff --git a/packages/account-v2/src/components/form-progress/step-connector.tsx b/packages/account-v2/src/components/form-progress/step-connector.tsx
new file mode 100644
index 000000000000..6c5ef317214d
--- /dev/null
+++ b/packages/account-v2/src/components/form-progress/step-connector.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+import { qtMerge } from '@deriv/quill-design';
+import { desktopStyle, mobileStyle } from './form-progress.classnames';
+
+const StepConnector = ({ isActive }: { isActive?: boolean }) => (
+
+ {' '}
+
+);
+
+export default StepConnector;
diff --git a/packages/account-v2/src/components/form-progress/stepper.tsx b/packages/account-v2/src/components/form-progress/stepper.tsx
new file mode 100644
index 000000000000..4da3095c6f21
--- /dev/null
+++ b/packages/account-v2/src/components/form-progress/stepper.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { qtMerge, Text } from '@deriv/quill-design';
+import { StandaloneCheckBoldIcon } from '@deriv/quill-icons';
+import { desktopStyle, stepperVariants } from './form-progress.classnames';
+import StepConnector from './step-connector';
+
+export type TStep = { isFilled: boolean; title: string };
+
+type TStepperProps = {
+ isActive: boolean;
+ onClick: React.MouseEventHandler;
+ step: TStep;
+ stepCount: number; // [TODO]:Mock - remove once isActive comes from Modal
+};
+
+const Stepper = ({ isActive, onClick, step, stepCount }: TStepperProps) => (
+
+
+ {stepCount !== 0 && }
+
+ {step.isFilled ? : null}
+
+
+
+ {step.title}
+
+
+);
+
+export default Stepper;
diff --git a/packages/account-v2/src/mocks/form-progress.mock.ts b/packages/account-v2/src/mocks/form-progress.mock.ts
new file mode 100644
index 000000000000..2409752b3f98
--- /dev/null
+++ b/packages/account-v2/src/mocks/form-progress.mock.ts
@@ -0,0 +1,6 @@
+export const stepProgress = [
+ { title: 'Step 1', isFilled: true },
+ { title: 'Step 2', isFilled: true },
+ { title: 'Step 3', isFilled: false },
+ { title: 'Step 4', isFilled: false },
+];
diff --git a/packages/account-v2/tailwind.config.ts b/packages/account-v2/tailwind.config.ts
index 78c3c65754f0..e32af19ada41 100644
--- a/packages/account-v2/tailwind.config.ts
+++ b/packages/account-v2/tailwind.config.ts
@@ -5,7 +5,17 @@ export default {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
presets: [QuillTailwindConfig],
theme: {
- extend: {},
+ extend: {
+ colors: {
+ solid: {
+ grey: {
+ '1': '#999999',
+ '5': '#d6dadb',
+ '6': '#d6d6d6',
+ },
+ },
+ },
+ },
},
plugins: [],
} satisfies Config;