feat: Login Page

This commit is contained in:
boboiazumi
2025-03-28 11:46:27 +07:00
parent daeeb09798
commit a3887519f9
10 changed files with 90 additions and 1 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 MiB

@@ -0,0 +1,12 @@
import { FC, ReactElement } from 'react';
import { Outlet } from 'react-router-dom';
export const AppLayout: FC = (): ReactElement => {
return (
<main className="bg-primary-50 min-h-screen">
<Outlet />
</main>
);
};
export default AppLayout;
@@ -0,0 +1,46 @@
import { FC, ReactElement } from 'react';
import { LoginBanner } from "@imphnen-frontend-service/ui/organisms"
import { Button, Input, PasswordInput } from '@imphnen-frontend-service/ui/atoms';
import { useSearchParams } from 'react-router-dom';
export const Components: FC = (): ReactElement => {
const [searchParams] = useSearchParams();
const error = searchParams.get("error"); // Ambil nilai ?error=
return (
<div className='flex flex-col justify-center items-center min-h-screen py-[60px] px-[80px]'>
<div className='bg-white min-w-[1120px] min-h-[712px] p-10 rounded-2xl shadow-md flex gap-6'>
<LoginBanner />
<div className='border-2 border-primary-500/50 w-[596px] rounded-lg py-[70px] px-[96px] flex justify-center'>
<div className='w-[404px]'>
<h2 className='text-4xl font-semibold text-primary-500 text-center mb-2'>Hallo Minna-san</h2>
<h5 className='text-xl font-medium text-primary-500 text-center'>Welcome to Dimentorin by IMPHNEN</h5>
<h6 className='text-gray-600 mt-10 font-medium'>Email</h6>
<Input error={error ? error : undefined} size='lg' className='w-full' placeholder='Masukkan email-mu, Senpai~! ✨ (Pastikan tidak typo, ya~ 😆)' />
<h6 className='text-gray-600 mt-3 font-medium'>Password</h6>
<PasswordInput error={error ? error : undefined} className='w-full' size='lg' type='password' placeholder='Masukkan password rahasiamu!' />
<div className='flex justify-end my-5'>
<a href="/auth/forgot" className='text-primary-500 font-medium'>Lupa Password ?</a>
</div>
<Button className='w-full'>Enter Isekai</Button>
<div className='flex my-3 gap-3 justify-center'>
<h5>Belum Punya akun ?</h5>
<a href="/auth/register" className='text-primary-500 font-medium'>Daftar Disini</a>
</div>
<div className="flex items-center w-full">
<div className="flex-grow border-t border-blue-400 opacity-50"></div>
<span className="px-3 text-blue-400">Or</span>
<div className="flex-grow border-t border-blue-400 opacity-50"></div>
</div>
<Button className='w-full my-3 text-gray-500 gap-2' variant='secondary'>
<p>Log In With Google</p>
<img src="/image/33978ce5bed2da9bf9d73acad802182a.png" alt="Google Icon" width={24}/>
</Button>
</div>
</div>
</div>
</div>
);
};
export default Components;
+1 -1
View File
@@ -1 +1 @@
export {};
export * from "./forgot-step";
@@ -0,0 +1,29 @@
import { ArrowLeftOutlined } from "@ant-design/icons";
// eslint-disable-next-line @nx/enforce-module-boundaries
import { Button } from "@imphnen-frontend-service/ui/atoms";
import { FC, ReactElement } from "react";
function AuthBanner({text, href}: {text: string, href: string}){
return (
<div className='relative rounded-md'>
<img src="/image/95319c4f9953dfe6180200e529dfcea5.jpeg" alt="Banner" className='w-[420px] h-[632px] object-[80%] object-cover rounded-lg' />
<div className='absolute top-0 bg-gradient-to-b from-primary-500 to-transparent w-full rounded-t-lg h-[163px] py-5 px-5'>
<Button variant='secondary' className='gap-2' onClick={() => document.location.href = `${href}`}>
<ArrowLeftOutlined />
<p>{text}</p>
</Button>
</div>
<div className='absolute bottom-0 bg-gradient-to-t from-primary-500 to-transparent w-full rounded-b-lg h-[263px] flex flex-col items-center justify-center'>
<img src="/image/9261045e09137f3fcb925a78c55b6ddb.png" alt="Logo" width={317} />
</div>
</div>
)
}
export const LoginBanner: FC = (): ReactElement => {
return AuthBanner({text: "Back To Homepage", href: "/"})
}
export const RegisterResetBanner: FC = (): ReactElement => {
return AuthBanner({text: "Back To Login", href: "/auth/login"})
}
@@ -0,0 +1 @@
export * from './auth-banner';
+1
View File
@@ -1,2 +1,3 @@
export * from './navbar';
export * from "./modals-gacha";
export * from "./auth-banner";