From cd80d00960a6c81cf31ba4acda09a72f64042de0 Mon Sep 17 00:00:00 2001 From: "Md.Saifur Rahman Rasel" Date: Wed, 12 Nov 2025 18:08:03 +0600 Subject: [PATCH 1/7] feat: login with passkey setup in signup page and integrate in login page --- .../authentications/default/LoginForm.tsx | 77 ++++ .../authentications/default/SignupForm.tsx | 414 ++++++++++++------ 2 files changed, 350 insertions(+), 141 deletions(-) diff --git a/apps/client/src/components/sections/authentications/default/LoginForm.tsx b/apps/client/src/components/sections/authentications/default/LoginForm.tsx index cd4a205..b27f1a2 100644 --- a/apps/client/src/components/sections/authentications/default/LoginForm.tsx +++ b/apps/client/src/components/sections/authentications/default/LoginForm.tsx @@ -22,6 +22,8 @@ import SocialAuth from './SocialAuth'; import { rootPaths } from 'routes/paths'; import PasswordTextField from 'components/common/PasswordTextField'; import DefaultCredentialAlert from '../common/DefaultCredentialAlert'; +import IconifyIcon from 'components/base/IconifyIcon'; +import { useState, useEffect } from 'react'; interface LoginFormProps { signUpLink: string; @@ -50,6 +52,9 @@ const LoginForm = ({ defaultCredential, }: LoginFormProps) => { const router = useRouter(); + const [passkeyError, setPasskeyError] = useState(""); + const [isSigningInWithPasskey, setIsSigningInWithPasskey] = useState(false); + const [passkeyAvailable, setPasskeyAvailable] = useState(false); const searchParams = useSearchParams(); const callbackUrl = searchParams.get('callbackUrl'); @@ -66,6 +71,21 @@ const LoginForm = ({ }, }); + useEffect(() => { + const checkPasskeyAvailability = async () => { + if (window.PublicKeyCredential) { + const available = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(); + setPasskeyAvailable(available); + + if (available) { + handlePasskeySignIn(true); + } + } + }; + + checkPasskeyAvailability(); + }, []); + const onSubmit = async (data: LoginFormValues) => { const { data: loginData, error } = await authClient.signIn.email({ email: data.email, @@ -81,6 +101,31 @@ const LoginForm = ({ } }; + const handlePasskeySignIn = async (autoFill: boolean = false) => { + setIsSigningInWithPasskey(true); + setPasskeyError(""); + + try { + const { data, error } = await authClient.signIn.passkey({ + autoFill, + }); + + if (error) { + if (!autoFill) { + setPasskeyError(error.message || "Failed to sign in with passkey"); + } + } else if (data) { + router.push(callbackUrl ? callbackUrl : rootPaths.root); + } + } catch (err) { + if (!autoFill) { + setPasskeyError("An unexpected error occurred"); + } + } finally { + setIsSigningInWithPasskey(false); + } + }; + return ( + + {passkeyAvailable && ( + + + {passkeyError && ( + + {passkeyError} + + )} + + )} + + {passkeyAvailable && ( + + or + + )} + {socialAuth && ( <> diff --git a/apps/client/src/components/sections/authentications/default/SignupForm.tsx b/apps/client/src/components/sections/authentications/default/SignupForm.tsx index 6a5a478..c0d340b 100644 --- a/apps/client/src/components/sections/authentications/default/SignupForm.tsx +++ b/apps/client/src/components/sections/authentications/default/SignupForm.tsx @@ -4,8 +4,18 @@ import { Alert, Box, Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, Divider, Link, + Radio, + RadioGroup, + FormControlLabel, + FormControl, + FormLabel, Stack, TextField, Typography, @@ -20,6 +30,7 @@ import paths, { rootPaths } from "routes/paths"; import IconifyIcon from "components/base/IconifyIcon"; import { yupResolver } from "@hookform/resolvers/yup"; import PasswordTextField from "components/common/PasswordTextField"; +import { useState } from "react"; interface SignupFormProps { socialAuth?: boolean; @@ -46,6 +57,11 @@ const SignupForm = ({ socialAuth, }: SignupFormProps) => { const router = useRouter(); + const [showPasskeyDialog, setShowPasskeyDialog] = useState(false); + const [passkeyName, setPasskeyName] = useState(""); + const [authenticatorType, setAuthenticatorType] = useState<"platform" | "cross-platform">("platform"); + const [passkeyError, setPasskeyError] = useState(""); + const [isAddingPasskey, setIsAddingPasskey] = useState(false); const { register, @@ -64,164 +80,280 @@ const SignupForm = ({ }); if (signupData) { - router.push(rootPaths.root); + setShowPasskeyDialog(true); } if (error) { setError('root.credential', { type: 'manual', message: error.message }); } }; + const handleAddPasskey = async () => { + setIsAddingPasskey(true); + setPasskeyError(""); + + try { + const response = await authClient.passkey.addPasskey({ + name: passkeyName || "My Device", + authenticatorAttachment: authenticatorType, + }); + + if (response?.error) { + setPasskeyError(response.error.message || "Failed to add passkey"); + } else if (response?.data) { + router.push(rootPaths.root); + } else { + setPasskeyError("Unexpected response from the server"); + } + } catch (err) { + setPasskeyError("An unexpected error occurred"); + } finally { + setIsAddingPasskey(false); + } + }; + + const handleSkipPasskey = () => { + setShowPasskeyDialog(false); + router.push(rootPaths.root); + }; + return ( - -
- - + - - - Sign up - + + + + - Already have an account? - - Log in - - - - - {socialAuth && ( - <> - - - - - or use email - - - )} - - - {errors.root?.credential?.message && ( - - {errors.root?.credential?.message} - - )} - - - {errors.name?.message}} - {...register("name")} - /> - - Sign up + - {errors.email?.message}} - {...register("email")} - /> - - - {errors.password?.message}} - {...register("password")} - /> - - - - {" "} - This site is protected by reCAPTCHA and the Google Privacy - Policy and Terms of Service apply. By clicking the Create - Account button, you are agreeing to the{" "} - terms and conditions. - + color: "text.secondary", + }}> + Already have an account? + + Log in + + + + + {socialAuth && ( + <> + + - + or use email + + + )} + + + {errors.root?.credential?.message && ( + + {errors.root?.credential?.message} + + )} + + + {errors.name?.message}} + {...register("name")} + /> + + + {errors.email?.message}} + {...register("email")} + /> + + + {errors.password?.message}} + {...register("password")} + /> + + + + {" "} + This site is protected by reCAPTCHA and the Google Privacy + Policy and Terms of Service apply. By clicking the Create + Account button, you are agreeing to the{" "} + terms and conditions. + + + + + - - + + - - - Trouble signing in? - - + + Trouble signing in? + + + + + + + + Set Up Passkey + + + + + Enhance your account security with a passkey. Use your fingerprint, face, or device PIN for quick and secure access. + + + {passkeyError && ( + + {passkeyError} + + )} + + setPasskeyName(e.target.value)} + sx={{ mb: 3 }} + variant="outlined" + /> + + + + Authentication Method + + setAuthenticatorType(e.target.value as "platform" | "cross-platform")} + > + } + label={ + + + + This Device + + + (Use biometrics or PIN on this device) + + + } + /> + } + label={ + + + + Security Key + + + (Use a USB security key or another device) + + + } + /> + + + + + + + + + ); }; From 29d3093c51f85d8ebc272ebfbabc147ebf7816a6 Mon Sep 17 00:00:00 2001 From: "Md.Saifur Rahman Rasel" Date: Thu, 13 Nov 2025 12:47:52 +0600 Subject: [PATCH 2/7] feat: passkey integration when signup and login --- .../components/sections/authentications/default/SignupForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/components/sections/authentications/default/SignupForm.tsx b/apps/client/src/components/sections/authentications/default/SignupForm.tsx index c0d340b..f987a6f 100644 --- a/apps/client/src/components/sections/authentications/default/SignupForm.tsx +++ b/apps/client/src/components/sections/authentications/default/SignupForm.tsx @@ -102,7 +102,7 @@ const SignupForm = ({ } else if (response?.data) { router.push(rootPaths.root); } else { - setPasskeyError("Unexpected response from the server"); + router.push(rootPaths.root); } } catch (err) { setPasskeyError("An unexpected error occurred"); From 43f220ccb23f6df8601b649c901bfbe18f2f5a80 Mon Sep 17 00:00:00 2001 From: "Md.Saifur Rahman Rasel" Date: Thu, 13 Nov 2025 18:43:07 +0600 Subject: [PATCH 3/7] feat: side navigation bar update --- apps/client/package.json | 1 + .../public/assets/images/avatar/avatar_5.webp | Bin 0 -> 17148 bytes .../assets/images/logo/harvard_logo.webp | Bin 0 -> 2700 bytes .../assets/images/logo/mailbluster_logo.webp | Bin 0 -> 1362 bytes .../public/assets/images/logo/ndc_logo.webp | Bin 0 -> 2194 bytes .../assets/images/logo/technext_logo.webp | Bin 0 -> 1146 bytes .../assets/images/logo/themewagon_logo.webp | Bin 0 -> 1256 bytes .../accessibility/blue-tick.webp | Bin 0 -> 422 bytes .../accessibility/color-donut.webp | Bin 0 -> 8522 bytes .../accessibility/unsplash-wall-paint.webp | Bin 0 -> 39648 bytes .../accounts-page/audio-video/camera.webp | Bin 0 -> 25890 bytes .../credit-cards/american_express_icon.webp | Bin 0 -> 1204 bytes .../credit-cards/mastercard_icon.webp | Bin 0 -> 1084 bytes .../accounts-page/credit-cards/visa_icon.webp | Bin 0 -> 372 bytes .../privacy-protection/qr-code.webp | Bin 0 -> 5326 bytes .../assets/images/sections/misc/faq-dark.webp | Bin 0 -> 4986 bytes .../images/sections/misc/faq-light.webp | Bin 0 -> 5360 bytes .../images/sections/sidebar-vibrant.webp | Bin 0 -> 30416 bytes .../images/sections/topbar-vibrant.webp | Bin 0 -> 13774 bytes apps/client/src/app/pages/account/page.tsx | 7 + .../src/components/base/AvatarDropBox.tsx | 132 ++++ .../src/components/base/PhoneTextfield.tsx | 118 ++++ .../src/components/common/CountrySelect.tsx | 62 ++ .../sections/account/SideTabList.tsx | 128 ++++ .../sections/account/common/AccountDialog.tsx | 80 +++ .../account/common/AccountFormDialog.tsx | 115 ++++ .../sections/account/common/AccountTab.tsx | 35 + .../account/common/AccountTabPanel.tsx | 56 ++ .../account/common/AccountTabPanelSection.tsx | 46 ++ .../sections/account/common/InfoCard.tsx | 56 ++ .../account/common/InfoCardAttribute.tsx | 21 + .../src/components/sections/account/index.tsx | 108 +++ .../account/personal-info/Address.tsx | 188 ++++++ .../account/personal-info/Birthday.tsx | 125 ++++ .../sections/account/personal-info/Email.tsx | 117 ++++ .../sections/account/personal-info/Names.tsx | 102 +++ .../personal-info/PersonalInfoTabPanel.tsx | 69 ++ .../sections/account/personal-info/Phone.tsx | 107 +++ .../account/personal-info/UserName.tsx | 89 +++ .../sections/account/touch-id/Biometrics.tsx | 100 +++ .../account/touch-id/TouchIdFeatures.tsx | 39 ++ .../account/touch-id/TouchIdTabPanel.tsx | 27 + apps/client/src/data/account/account-tabs.tsx | 24 + apps/client/src/data/account/personal-info.ts | 16 + .../data/account/shipping-billing-address.ts | 25 + apps/client/src/data/account/storage.ts | 62 ++ .../src/data/account/user-permissions.tsx | 46 ++ .../data/account/work-education-history.ts | 59 ++ apps/client/src/data/countries.ts | 634 ++++++++++++++++++ .../src/layouts/main-layout/MainLayout.tsx | 124 ++-- .../src/layouts/main-layout/NavProvider.tsx | 4 + .../main-layout/common/ThemeToggler.tsx | 5 + .../common/search-box/SearchResult.tsx | 3 +- .../layouts/main-layout/sidenav/NavItem.tsx | 10 +- .../main-layout/sidenav/SlimNavItem.tsx | 10 +- .../main-layout/sidenav/StackedSidenav.tsx | 8 +- .../src/layouts/main-layout/sidenav/index.tsx | 81 ++- .../main-layout/topnav/NavItemPopover.tsx | 8 +- .../client/src/providers/AccountsProvider.tsx | 71 ++ apps/client/src/routes/paths.ts | 2 + apps/client/src/routes/sitemap.ts | 172 ++--- apps/client/src/types/accounts.ts | 146 ++++ apps/client/src/types/common.ts | 8 + apps/client/src/types/countries.ts | 6 + pnpm-lock.yaml | 30 + 65 files changed, 3288 insertions(+), 194 deletions(-) create mode 100644 apps/client/public/assets/images/avatar/avatar_5.webp create mode 100644 apps/client/public/assets/images/logo/harvard_logo.webp create mode 100644 apps/client/public/assets/images/logo/mailbluster_logo.webp create mode 100644 apps/client/public/assets/images/logo/ndc_logo.webp create mode 100644 apps/client/public/assets/images/logo/technext_logo.webp create mode 100644 apps/client/public/assets/images/logo/themewagon_logo.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/accessibility/blue-tick.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/accessibility/color-donut.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/accessibility/unsplash-wall-paint.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/audio-video/camera.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/credit-cards/american_express_icon.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/credit-cards/mastercard_icon.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/credit-cards/visa_icon.webp create mode 100644 apps/client/public/assets/images/sections/accounts-page/privacy-protection/qr-code.webp create mode 100644 apps/client/public/assets/images/sections/misc/faq-dark.webp create mode 100644 apps/client/public/assets/images/sections/misc/faq-light.webp create mode 100644 apps/client/public/assets/images/sections/sidebar-vibrant.webp create mode 100644 apps/client/public/assets/images/sections/topbar-vibrant.webp create mode 100644 apps/client/src/app/pages/account/page.tsx create mode 100644 apps/client/src/components/base/AvatarDropBox.tsx create mode 100644 apps/client/src/components/base/PhoneTextfield.tsx create mode 100644 apps/client/src/components/common/CountrySelect.tsx create mode 100644 apps/client/src/components/sections/account/SideTabList.tsx create mode 100644 apps/client/src/components/sections/account/common/AccountDialog.tsx create mode 100644 apps/client/src/components/sections/account/common/AccountFormDialog.tsx create mode 100644 apps/client/src/components/sections/account/common/AccountTab.tsx create mode 100644 apps/client/src/components/sections/account/common/AccountTabPanel.tsx create mode 100644 apps/client/src/components/sections/account/common/AccountTabPanelSection.tsx create mode 100644 apps/client/src/components/sections/account/common/InfoCard.tsx create mode 100644 apps/client/src/components/sections/account/common/InfoCardAttribute.tsx create mode 100644 apps/client/src/components/sections/account/index.tsx create mode 100644 apps/client/src/components/sections/account/personal-info/Address.tsx create mode 100644 apps/client/src/components/sections/account/personal-info/Birthday.tsx create mode 100644 apps/client/src/components/sections/account/personal-info/Email.tsx create mode 100644 apps/client/src/components/sections/account/personal-info/Names.tsx create mode 100644 apps/client/src/components/sections/account/personal-info/PersonalInfoTabPanel.tsx create mode 100644 apps/client/src/components/sections/account/personal-info/Phone.tsx create mode 100644 apps/client/src/components/sections/account/personal-info/UserName.tsx create mode 100644 apps/client/src/components/sections/account/touch-id/Biometrics.tsx create mode 100644 apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx create mode 100644 apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx create mode 100644 apps/client/src/data/account/account-tabs.tsx create mode 100644 apps/client/src/data/account/personal-info.ts create mode 100644 apps/client/src/data/account/shipping-billing-address.ts create mode 100644 apps/client/src/data/account/storage.ts create mode 100644 apps/client/src/data/account/user-permissions.tsx create mode 100644 apps/client/src/data/account/work-education-history.ts create mode 100644 apps/client/src/data/countries.ts create mode 100644 apps/client/src/providers/AccountsProvider.tsx create mode 100644 apps/client/src/types/accounts.ts create mode 100644 apps/client/src/types/common.ts create mode 100644 apps/client/src/types/countries.ts diff --git a/apps/client/package.json b/apps/client/package.json index 5b71d06..52ed930 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -74,6 +74,7 @@ "eslint-plugin-react-refresh": "^0.4.24", "globals": "^16.4.0", "prettier": "^3.6.2", + "react-dropzone": "^14.3.8", "typescript": "^5.9.3" }, "overrides": { diff --git a/apps/client/public/assets/images/avatar/avatar_5.webp b/apps/client/public/assets/images/avatar/avatar_5.webp new file mode 100644 index 0000000000000000000000000000000000000000..040b21110aef4bc5c103ffbb0688f5c13cafcfe1 GIT binary patch literal 17148 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 Dv*Xb- literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/logo/harvard_logo.webp b/apps/client/public/assets/images/logo/harvard_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..ad2b760f2e1704426d20df0c24fa991276a67d28 GIT binary patch literal 2700 zcmV;73Ul>RNk&G53IG6CMM6+kP&il$0000G0000e001Ze06|PpNT>q<00E$O+qNl5 z)_&WzZQHhO+qP}nwr$&G+h#iBy?eYrL_}6pN5llAS)MPYG{>gr&5>sJy03k5)#~e= z)~-{ZoNwJ@8@9+}i?24Cl$s74j>zSw@Aqre){8d{YLl`wd-{yYs?^PzHrn&D2CV(a zkb9-qhylNG`TT_^onKZS>eJ_Uc{M-1&swvv#tYi`hu7-bUm1<(zq+(b&}>lMu?tTO zX9ZkXltdYD7jqXU1Jt^`Qt#xP9S{Q?(5z4*Kmbxe%5uLto6r9v3z*nEs|ikGN|Dl+-ngDJis~>Z%}ibicdLySm?8DXl*3&ZePXP5{V6SWPux z1!Yr(WMI(eEzLJiUOlC`b-SrDbr7H$o>f%=D>AV##DI}sJ~MLvmN`?pG&hxW+Fd9` z0R~7sq!fSwa>mVP{W_tQFHGrG;>w2=C->m2K=W#;TS?5+J}#x_**(O5Ug@F-!G2by$l}YGDgfoo`N6NN z;)93EHVFW6pEMs{Z?S$O2LWO#UdZVC0v&g?=F-d%z@Hue%vUe1ah$_NG%QSed@En} zbXVsH1N7A8QkQR?X$k?mI%kAMR#$~a<>oZ2OWg~0&SvUG1Q~+h)_&iDseya+;867v z!KN13M84fPHF&QNvzi$c;vutdySfO{_Wi24A2yn1B*%X|%f-G0w|MCJf?0sU9$C)K{{eUJ3}_A~oVVLzDu zHvZxNfYu8BBmB?t*ZG(F-}b)1Kbig@bb$Vo_|585@gM6S%KuqEa(~Hk0RGMDWB7mb zzsGM-4nPm$Kf?d3|3Ln8{fqnuy+7>Vk$>!cj{Il+H}Xs93;3V$Kk47uKVtv3|Kj?L z^_%)j>$&_pYe=!tvXhC;jjKT z_`?OO2N^xv0nhT)v46#)*(VRa0092~_9QzzNUiQa0B~4YMYpkNaNR&t%i~-0e}WL z6Q-20#ZG%Q4-D4k4p-r7B$Y)1M-(Uy`--&f1Stv>!#{&SrO%jzRA=I_ftgaMU)#yz z^*>L-$Nvnj-HsslvXSsW@!M7_G-OD#Zx&)txQHV@V^@b?D&LO<`PR~teiOI$33txJ zB&ZjI-<1GL*K2sdtGSHpzWHmMWRyOK;;NjLg6@nopV%<9t{|B>U`4fkv2>V$+hs7` z!S=UG8564fqs^!W=2XZXy*`YhNK%AZYO*h!#3Nt2!jy0|=%U(trN2>XGMG4=(FCf7 zm&KpK`nj?u*>xfqf?xmap_`nS=xHqfCKutQq|&p;;;Gdqb$sp~jcM?Y_A(YY9;(`j z$h|S&N^M2!^yVWS)#L1=)j)|5}j55aaTOC$$VV*FNM!eIbD! z>1XBvF;<;l|611|iK+Z?I6~fFx?^^DBuCAbH$6brwx>Yt(voqcCwydU`7{4(mOR?xH;4fk_ZCUfH&biug?7Ote$%Ri0%N$a zvveezt1D!wNnh+Q-#L!Mp4wiQDw)3ElL&W3{QEdJQ}{YmNgy;|PzJXtsB4wqM6Wcm6J zLRg>f_?mSl90LWG!7X?TdmN_)+P4W=&khKB(7@q@x%NCxi^1SnV8o})qfYh;=sskV-f35>n< z{v)?qHFxf5SCFm;ALVx)vi$RO>jA(1K!9WM%GCr>!p`M2nYG|$VP5JL>c7JWog7;* z6xrpW;CMJbcOy;0`d5bG6-*sHgB-1Mm(C6}*GdK>N)KUoA$wq9q~M+yn?9!-aqm1?T<0h0L20Hd-->qjD$FZ=S5KljEz79!9VgSum0M)hXKKE)BqZzpvsPvQT^kX zJ9SYMqc?gTn0>{3Pu?86Vzpq&+Be+$L*EaC52^{rI>W$#5aWILMYwu;@bdtu1;bnb G0000UFJRLE literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/logo/mailbluster_logo.webp b/apps/client/public/assets/images/logo/mailbluster_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..4661087bdfec389108775ac57265a334a9f66e10 GIT binary patch literal 1362 zcmV-Y1+Ds0Nk&FW1pok7MM6+kP&il$0000G0000e001Ze06|PpNEHD900DrOZClXl zjqpYIA{c=PM))GoKpM;j*kEh0HSjd}A`s#IfdX=!01+_(=#>!nobw)o;7N&Jwth`V z$yV4~vJQ!bBi;Js&Cyvp)H&X@Nu5u+Hi+}tQ|?}T`gLP`e!cPuTq@&?sq!fbfR%Fw z;Fu%>K1spCS#_Oejni0~CjCb?jfH7~Od~jN?0u1sK_`%|5<+zXgLWWXIPk6%+aLw- ztqewz8Cu5t03eV&0VnB-gJVO5^!HP2BpIO`o6)FF(gCjy?ksSaz(4aZ=RfX0Kls2q4*ozp;(h>Fnf+JsbM`w%2jjo&22%&( zZ{aQAENFPSeV}_^`d9upxEJwX#E*0D2kzs2!VB$Nfctrd+<%AA(%^lKRF+ z{`eygcCt|2(0YZJ#UZYiL#e8V>p%bi{`Ak?9gIkAzNinpb9ci$Lat@>+tGj1tEW?7 z#svO#Eh=`E#w>LI`sU=`sqKnej3)-zY5*jC7#&Lp$-HXFQW|La9s zgQ}#OX?W5Oyc_nG@XjXr{vZ8IO6cvLg#zc*+o3FhHt;jVP{U%Mp5^CE_%rYQ|0dl*ukd|0Tct%|NFSAkPY7b3_jmtf7|tc#wSohPyg~}6Wh*9BpZiLY(w`1 UzyFaDKPTc5q5EHcI((s0h@ z&(wW+WOCVH17Ry3`c0GXHWc&`aolT~f7B?@D?*P?^#1$c?3Ve{m+d|MR6NMLbye9v zQ2lawtHi z7o2e_ga(l0GtJ(O03Z~!uhR55_-#$&zq9xV|G*q)`lvvQzar~Rw!zAJcdZQ4`%j9w zomvrud~fInc}6R;taC0HI{oPKd94tO0{U+@^LusH1dFr~8Hn@M$f3AEG(Go0FA<9J^ zd@Y9U_v~g|FAslw{E+`0?gN<5`>*8hXb;lAP#?xWn*Wji6~Y1frPcxH0s5=yXZsQG zA^R==BmD=!7xC}tzwd7VzFYWj`x)5L){j^JSbwnlfqqxCBk1qU{}q2~Kh$dme+d3@ z_?!Eg{@*xj;vdhy7{748&+LT$Dg6iWGxwjBU-Lh359A-jzn}gye}MWJ{7d@(<4>qB zgFmYNME_O$0sa;IQ~AI3zwMvgKeYel|5Nq>>I3xy*n{+^=luL+rpA5u7lV)?VI1WJ zO+YFt)P)wRZoD%I*3W}<{Q$WBA|5UYeG!l ziw|UXs&q$t+3X7fRk69nd#^v~?mrH1iDLapmRI#$aI{jStSu-KEZ-6u;@&SCb@v~c z|Iq*V-`k@deK!`MpoTCt$JZUptcUfikuy={uLGa|9dct}Z-PpxBevUL|NAtJ4GGk3 zmT(ui^jvufpQL|Nr~{hZxp-C8D8}w+vOC;;oLD7N93xfTf{H4i{t=u)RRa_@erE{_wd(MY3+8#Gq3v>M#7R|MkjKr9jv8 z2SD-Y2RKlK<@HPbzKU0OlkDrAdK6=BSTHyeDTD?2rT8~1*N#l%g^6eODW-+jp%QE4 z3XbW7iS`?TVqUG3$mn8B$*jJ}5=ZG9;b0X+dg4+|++U|DrnQ-t8x)yDJ#yzcx zAL%9BUlwI~1S`+Cy#Z=<9{Q^Rjt=5gTzLoR3kM9H4^&QNnmK|+;Rl&MPom0&V&}9L zNr=;ay;qrE0&g>e&ACOsqmtGh!S{V-r}*2#;_vaz zvs06tXLC|zaa-R!gwOkeLPCI`f8+x1pG?PdO6<#ZQF|oW_;U^b{^1Q=h@^^)bV(2_ zdWv?9?bfuVMwO}?D6GbnUyn4pv0-mKnGv#jjA8+^+BZYe4VTF$`v$CM7yW7pn^}iA zAB%+M_5@V+gPUw;0kUN*`lNwO&IBPu6%(%$De~}UaddPh^ zpGoAsdR9O9PHSlQw$DaYFn+xMfG-Fcg$DJ?X{i%wc=(_*3Mzp=wFrOe8Oj`BT2{nM z)oW7kGE>r&5HdhKV1WoKeTqRm@KO(pTsG!i)E5p)Q-|C78XZ$$q)OQKDqvmzyJ2CZM0Om9gOea z&TFIo_+6o!;%8UPbe?;oa$9vFnM09{hIF>VE7JO?PyZP-BqdKf{D-yF zvdKVqhf&9cjQ=NvEK&MV{Iz~*mdV!t+5E@W@c#c?B-nj_1+d#cgA8?#@>%m4*g@~n zhk<;M*uQwPxVoeq@#9uWU;oq@9>&DK^`dO4_#mC?^4x&=N#cB|I?K2E=q>OFL+hU7 z-$d5U4u+9@@y7`MfTd5$)#clqgb94Z+t8Xmo3W&QpJ7u1@0NN@k!~YFVIJN+p&l!Cx3Ny|Lw-b U7-Sf6ErM(SUg`eq)Bpeg099XYEdT%j literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/logo/technext_logo.webp b/apps/client/public/assets/images/logo/technext_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..984e8c09073ea6ce12eba5e62215a489f6445bb1 GIT binary patch literal 1146 zcmV-=1cm!jNk&F;1ONb6MM6+kP&il$0000G0000e001Ze06|PpNGbsU00EG5Tidb6 z(y!RItuit8PmcYRzxOEMMdZv)dIj7R?z6aD5lRZi2cYwb#0>y>Vwyp~9+4TSe!7$;H&c+&W04d5J!MF5DS@W)e5?IM9y zDD?fu?VY(I)bTorhw>p2pF*gpJ|g1qzYr>`wf|xEF9||pA2GV(1>u&H-x&O9Rs&Pl z>6ZdtcIbh*Zo2Leb z={z7G%fFWOocaKMw|W+Ts{do~NBZIaL;CN)H}c=*U-iE~`2atFb)5Yb_}BfL=>o?e z;s@%h#hYBm_HW1!;2knDsbb(2OaX7UuJVE42~1&yHWv5=iBrPxBu*T*pL8ieSh>q z6fF%hFtK+>Ij{#e#tTt=vGO*bEO?wHSw|0AL#dbfDy}qQ+rq3&hN2d(EYh-na@nA( zb9tBFR|B58eJq>&Q z2l0muhDSZ)gD7*TL>dY+!L8#L#01=b0uVMM!$Q4#%OxpKo055#hb?tMbrTDQs6;fk z_-&i=^Q|N*_p!SS>%Dzsj<^dHzxnf3_3{?K{^rmV_zpJ3S=kzu@{&UHkeK_xz4uh( zrJ(r;H$B4had(<;!r}73_wZjG@Bh)B#sb;$k^lYw;AwL9>hqmeNq}$v@@?ggeiT#h MA4Z?%em#N!09yh*WdHyG literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/logo/themewagon_logo.webp b/apps/client/public/assets/images/logo/themewagon_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..1937070fbfc30b4550cc80d5cbcf54bcd8c15e87 GIT binary patch literal 1256 zcmV&3Qh+jdH}?WAPewpp@m+qP{xM|&2|KKso3z91qdKnxQNOd!#;E^bwe4r!Jr?+92+ z5=E{u9#j}|e^JLAX;R0DPzB)c@E&U)JAnIg=jhT=yo?r1zhBrpt9D#g+_yUK&#N!^ zv42GIC}F4jp#$*d{O-*^@nA|pPRz|Pe=?)j7TY~qCyG$d2?2axP;u%{b*5sd6mLNM zJT&Kg+g_bI#4vDglr3=;&zqXf#fPy^2>3lP={)s+WR%G=)KB&`K$$>oO4P;jW<~|2 z{)9cJ5qQT4IG(hTW%UkP3gdao3?~w|S8tQ)(*HL4*C7n{#Gi>Vx`8lW*9c+NyC#-4Y5vD%Agy(bpIHm*W~%%o5ed3Wu`^HdgbMR+`JHL`3p@1JP<&q=7H# zN6i57w*qx%j6^=^q}ztdqjO+yjkcX{0d)Jp&|XZVAre zQAPzBXZT4OP09R^(wkBdOt&Uw6y<#yM!XZ04Z>{fGJaQKWV{9DJRxQ~2j;cZ;o@|D z3g*L{Vje$FlNnDzJ&{vF7P|_rJtu{Pj??2M<6>>0ChT%rnYo9X#Swar9?P%(2B6*_ zncFFwL^?+1a%IvA6IM_-AkqQ=0Pqq3odGH-04V?f001Sh0{z7WTlZ!3zr(NFPw@Qt z@N4zU5eM!6bz8yyWWTDtKtF(gTK_xhG5%-yU$_rI57ch34?%y^KSrfK|~e{AT6`h!5=FkR1;72L2cPyZWExFYo_`zd>);L%RFa+P}la>06b( zY$WG14SPYJfFNBJ%VK`h>`iagD983SRhqT7X~lpRzAww_{Z-_OlL zCqE5+&ipDzqkBo)jh5zF+vz{y_3m($4r4&s8EPeW<|WhXt;G>HWIz-Gpx|~YEGx7E zn1IU<|MZ9zSaHefZd0#z`q<#_OAzVev4%mMznG4$QoTVuoO#VZ*>;N1957~&l*&Z?V{lE9T4>W4;O{bLNMlQc*N65(P z!0=~)|GLwjt@Jg;8EAF~0Psx%2pV8|DHqL#U)^Yox=5Q<1L&%ZT}EF9c&J_r#e)48ex SF~#yGx(mUM!WIsc0001JeQfmr literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/accounts-page/accessibility/blue-tick.webp b/apps/client/public/assets/images/sections/accounts-page/accessibility/blue-tick.webp new file mode 100644 index 0000000000000000000000000000000000000000..c26e418cc0a6e490809f90431503303f6f6b5019 GIT binary patch literal 422 zcmV;X0a^Z1Nk&GV0RRA3MM6+kP&il$0000G0000J000vJ06|PpNP++W00D3mNs`<& zgoPkz17R2p1et-vz{|j9AP6G{3!xr+QHY2MP+$C;kYCfHH>PQmi{*20vUy1|wp}In zS~1oufdAG^4^ZDFQvf7=9hic}M+TUJ@e2?#Ou;y7N9a&6{riAWFt^eMJj}DmN2@03 z-ubA%*KUnHXU#P~?BC$6Uep6tP&gp=0002c2mqY{Dii<|00000C9z(87-a%{1MmZ- z*@SQpzz@(5@Ef2QfL~_(RowvE0R4dX|K|YU0R3+30R3$JjQ0TkXa8h1Zip9PfL8pO z-~a&r^FPGNx|`9(MT#fB@vrZ1I{zj*^45A3v5z2;kI=8ku3Vr)!w!~FXm+$mHzzzp zPMma3gdBr{=OCMFR%kgXftfl|$Am3eoEvg0I)H-1kbN|fE&-A<_Y}rCKz)FGU7Gt3~5`)t<2~9+19Fozm(7?2C4XPkX>yk)CMv z$Z?Tg=oX1yvpfSAq-gSJowJ6qzP#*NE^}>sVI^&js&s_Qp`97O30C%VGN3BM~WGx1oBR_LOElIL0yTCP;tgM z2lSChu|g3vu$73xjN20fVr)TU*M8sv{_qc2xSvtK~^N5J8P6vL(QtB3&F0W`R58cenBVB!k_H>dq zdU+nB@*4XP$!k-gwjS)9}AZjsEoyt z+N>inQ>)uJ?9?pVD44WEVq;)JEgyUY{6K9_BQR0xrGJImFTE>-So&57v-GSG>g2uh zLbwO(lOG6KtVbq|<~*Gz6oos=~RuSy-2VtD(^)LUI0$*WSI zr`0ihRi=(>{cY`DmHIDb{cYvG7N%ijJzjsm;=k)rnFds}%UW&|!}S6DtNLg8 zFYli2U*mmIdH{bf{)P9g^I88F*gw!8`7iiCR$uhr@4wA|+yC?QPx}G?L;Q#DkI+Z) zzv&-%-@pI#KL9`f`ha?!e*pDA=$G-2!|&J+7C)T+FaFv8fbFjDXR80QzvX@tKY;F) z%^oB^qJ2;L&+KRBXR~*QzM;Pvz5u@q{w4iK@=yDp?BA>h<2Q^2g!BUS>*asj|G56l z|APIl^m6nc!~^*^^FQzZ*MDe#wSVCGoBJR5UlK2=|8f66{a5m5>;w3}^Uw3Y+5cs~ z!~G(Dzy1sRC+%nV&;K6mzbF39{$KoG?Qi)H|Nnr0#Q&3jY5vFlKm9-VPyavhe%XC| z{?dC2{+WFLr<)1l*()$&XsPHZNYn@JAskK!&C30 z6Vkw&!osB|1tTSS9?I>&TU>g`X52y&J+mmeOmD(pBK9F9UWVdI`m?RFxP`Cx=RwEe zY&d#n(c+#sj_F@(ibox1*k2HbQ-=uObat&|(oz*F`u;cs8papxr8zJ-R06VAMAkT* zVI=v!Kf@`Z4K=s;|JJXAS!5^h>AG;BRQ}Vj35@;kzSASpdNwt}B*a^pu?aMft}VKM zsG@RUn9azx0E|_G^p=}ilP)2LAC8$J{fRnVidF7~3KaReLw`y@+b;P@Jo4tnj68Kp zj)i%3u0Ke6Q4EO}*{%lCqq^`9>%Lod8NM4xtzhBT0Pe)&I+}A5!IH~>0RH{d7Gtb|kAKve;!P^cu4sk>caPtng?Qq^)Wd=WNAi3F+kJAG zNYkW|*rQhxnU_x`r;iFMQ>S~sziqK3T7WMrB6M&U3!`rX8g*2e1$2|9ajKdjjLJ1- z!biz_ucDV0z)YR{s|Jgi3dB&e^;37tr(VmnhW72$Ti%MjN00iV0rO1v4aZd`gOS3U zV8Ze>ri$pR(!>&qT%qDxR6h>3-K%MRW>PR5%xYi%1U#=fBaifHF)SFJEz=xE_&xPk zMUtordhZ$ag_GGii46P&bXfchsLZIaY7mfRA-c4ruAl+`sm^~jdz0+#m6I90C%g_U z{h#{7_aMt+%|qF}mEf z@{_?th7gzsY8^D0M(+c1?}%cV0*Dk_I}%XJ3+xIgn14J%FIOw9%%G>){ECB!z;=}~ z=}kqhdegGG+J~`us)p6U_bc=^kc6#~hVFm@3;$&mX8T}fdQ>P_Ks)^=rGNGyZD1Kc z{Q&4X8tZ>+jB@F5!&Q{HWM|xUh;C5^;QR5P=svVidMpD*k5p@I|bUanOzk@}! zZstcZj5)g8TLBz}kW4x3WJq}mJC#qPyqbud)6ay}KXQW;QhFJ&g>(qI@Q0RLw*RaT;T!Wy{h~<6 z3KRXopf}IF1fWKm{l}Uv5Z=xzB#r_LuP2Zr7$yLRD7Msza5u?dZoXzy!TRhBAvW`z zF)9_1;v)Gtm;t;r)>?ubsyK2QOwE-8g+z1sG~K|@o91+mX&C61dSX2OfWx$a9$dtO!_C!k#R@h#DSQ?QuYv)gAWhe zXVbQlfLx%?nI*3JlTOW&fBBAvbtHJT3V>NJ#jsi2I#XxF(d z16?G;Xh{?xn$MRWwX1Hq3R`EJh*8L-HGXpRWVRr1t(FZWmPta~->lj_pqU>uqLx!B#{UxPW7t-%rX^tw`&-R>>pSApRrW16&{+}1(WX=d#&Lw>>aIY2 zyX+s0ErJhP!@)<4TI5;sm+N9tcR?j4Jt#1g*SO5BSl`ly_+T}wZEA;b58CMAV9e)a z=s}HX?(inN30Q&P!T#iFy_hM~q9yqibfdy@VV}KCiEoi$g5HtdiyM*frmk@i4!`45 zpS$9vk`<}oW-))k_cfLqVDuxfYMLhce`&YkfVWG;2L(})1W>d=_{tgo#LhlBX$C72 zvac0hB4-f|O8|NGS%VU+(x739XUz)gqFJ9K>5bhHHaOgY5`f#$^2VnbbJat~p41I1>_3Ht{zf zB%JdJnj{I;kWnW*= z`WaAX7g-ie?OCGc(U6p{-dU&C3}W#yXyZUrF~Ma?B5!eGB-f`gg-!C(M#=>t5aAoc zVU=L?*0URj0RZ!$2)nZ?*nt(S0mZE7JWjBg zZ~=R`iZY7H;zLmNXm`}h5gM<6nCk`m#9w>{{B3l7nKK9)VOF}=n4Iv+}oOOJXHmyPVql?j>n2A zL?OJu+IckQ?5G1S+t2ByUq(?-UxxeiEfJ@AF=LRWBfmcoT|WK~&6oXS^SP@`q_2*C z*!8z@59Cf-hrxXLn^V~%`_%mZ&>(wFR4lZM2m2!F0&XM}LS|vn$aQr)V7c7CWJiHX znK?HZF-xK{PEWSvkFhuS%&)2?9Rqpw~iQ&7a2z*88ge?E{w_e>7+CmTw|(LU5>SLm_}+$4u@wm0-Rgu0Uv`%yh-~(;DpyM!Z)Z%fb4B6=FiSdpSQ98>LW7Vs$Ti zF9k#JHg4XHE0Sd3`Sa6qE5Q@Q7Vhif-A(0vg)+YqxD^QU`}m^$yW|V04tLtkgFOZh z3=b9!H{%@NN07)3EW=5Iw=bNkZXN7O+-3x=AL&wdc0kg9Kq@UCiUw<)A0|bB%Wc~R z`ZB2vvWnfy5-Q`^7Ph_%GMrU?oQmt(CzHMHd0sMUZJnQ;YqRaw<5Dx+;7%O+-XYWS zvFl+)^`|ycUCTfJGw8+Ft$@fe9LApZ8Q_I)+&%R|bb`%DYDDX*z`j0wxhXjP5T7Qu zo&c*qvFs+y6dxFhGEc`uAfgv*A%(@qbOwZWQqEshpwU3Cierg#Crq-%#YdpOaFRzO&NnI&Q*XK#);d>u|$yi%d^s&~i#9x*S3V@uVWr43iWpIJEqohj;% zf?+e{1c2y(N2!rFl~NXMA;=V zMFM{bvT)i_2OM{SCFHZ&>^M(F(?Y8O-(}*QV}wxC($5%BkbKfAa4gn!ODNRw*!pk9CIvxp08+Lr*(C*f6jTU+NlH)NDzb?|K>E$myG zHvuvZNdxZ@W2&jlo62c66_aDz<%uT36}>^aD4BC2>o#-%YU*mX7A7Eu1*pI z;1Quj7<0Kg@t>04Iv`zXT+n_@`opLCgU?T0xB_A<$6N3#@h=$0KgIh37Qr{?h33ep zvQ*gVRrs^qQuIj5qYkMt`l(|uRcr9fiHO&-#|P<1e!HLpIlOP@_pJhU-(OB#6fmoy$^cyw z`BR9bS*U4BM~bo8(Ht0!CzQ$&iL;#yAN(O(G%RA#I_Ex(X~rvNM2oN`F( zYA6*yGK+{AL~Wqeu)fjCKCGP%`oD1A#qks~Z?}@oQKYn&#QuPNAtVK-M97!5?W8cA zE3;@lw3|y6CqyJZst^JCZE~r8fWq`X%cL;FL^9Es4HdC-0i`;&WJ(q4dg-t=*S>fk zobC{gtCFG%x)b>>oX`m)F)zhZ=izKRhd&&k8v}>uy~#x;)F z8K^mfOw>dzK24fXwt`*h!Daex`tVR{RJ1(YBlP#dtG)5Db1+wqR4-i7m? z^e^l^1pdUa4Ed?qf>3+H(#0}HW{r}C#Yge^5HSCbUhhu%t~ znQGK}MZS>!+eBE;=u5dWTlBk2HB`RYI&4YHjWoz@ivaTJ*zhkI@;E)IrbeFPn9(%4 zKooXvvIOl zTSu6T-2a(fhAFcVdN{mmX2XfYE&vY2mu}{zN>3%Xshwn%m`bi~NmtQXpZc-+ee=*? z%8qXzs>MvO@bB<2lI1brrQkVt4Fct?W(pU%-?eNKH}!|)5hHK><%a&3jWH?P8kKkY zY#D!}E=46yP+RR-S`MaA&Dq`?h$~=S6ufOzr0z85X_Fb4&}hKBEbx9SfeuC5@G*Nr ztvha%b-e3*|K{zOslM0@z1Z+fv77yZ3A^jMnr|9fF^?o~-7S8dNlv_U{Ra$ks;2cj z&b6BPvQXiuJQQL7G_xHuP~ETEgzU3qQ=aBJ&`B%^mDC47j_B5{i8&Qj(?4U*M) zww?&b?pCR)kh_lB5R$Iosma$eS07T|6=3;zcEiUQ=MXKwX6ur@#3uK@#VFgauR;Qb zwZ*+OS3Dp{&4>o}x+>?=^CL#b(k>Mx-v`vWYzG1icR!~ zCavs2&9LT^gKHdHb(pNa=FPFJloc^dsUcbpTsLa4^p^^a9t>Gxw1Nh)!?XYrBB|tT zV{Kzk97gnW7j{4Y+@V16|8e&SXA(|EYH#TxgRT}s51H1^2b_z{%_|ITZXB+_n$@`$ z+TrKu@E`!k6&dNOC*8#0nKOMt*qYP{^zu=B{(MGaTX?sSD7kv~A_ib)8<^8En8jh= zjkY#vUwFm9Pc^l{q=DR)@{WOD{Kb1)_WFDNV`L%8)g_NzGXjmrMBn!Ui&)f%qP80; zv(<4F<1k5p3F_qem^0j%2(i4vw0mi(+6?}8_fT&)G=%VSH3|qTT0<1J7gF?!Oj>TK zS_~=~?(jsIBaM&h)*eSWL34D~{mER(FE0;8YldqM{RNWl0=5kqFqAN%Q!R*2kTvju zvpx^G#6fNxJP#@8@&MjJn40Z+-j*9Z!iZ@-`290)VAo5-UuhP?CWMPpbHmK{G<*wF zMMHAY{lO4nWnSTlKDJk*ZqG!Z!rEm3pf1PwL>#e*Odva?Io^^i=r#$XS2CdCa@^*K zp=L}*RFR=WkFkV+27{u#W$cfgq9nMfp-@6>aw!jMdC8_>pjzIv62**hcm zyO$?P5O2}hTEH70Rxv}bO;=-TZdk0m0CN)TV!MeM3V{(ng+r z;paoWNdH~V3+KEHK2xs)@Rd|pHV&7sJOGHI@}w`%EAuw4?8S=tR$C+V4W1qFk2G%h z)=iH{|C>eyKKPbHl$Smws56(NpQvYrDnps_8^ylm90%v6mA~kV;ZUgI{4)5KHS1|U zmbZunE6T9gX4Q?S02)y2FONKZmqjwPYGcQ|oJ=CSn|71HdoaC={6}~8FvQO`UTA z+*?9Gr_wh#!;K(PLWa)sP#Ru)QMOEQ;1&X@d;4v++T!#Q)nm6s3vT~r;lHiLN>sY8 zF_{-PQ9yvjl3O~(?zH0n+6bm{!cOfBn+S&Y-`q*Qi&>#^{9oN|lcCp={hcCtnqNFE zWmT`>l^Y*c9oHi|*9=93WGf=oy>KTO;r)vi6gtA7?ZbPke~72y4Wihe^$sz;L(Naxu?Ygm z4)BJ6h;-%sG`EYr=K1MNoe^`#7ogsBaR1z2Z~#fB9q85DFQzx@?8lu98$}@xgVmic z{yjmPS^9T~d;wc}x_>k8Lrs(=tDVoZW(h3ff+@TutyhC=3mp^~hD$u%+?OGy>?vBC z^YO3Q3m>5AZN=ECf$kYy_jNMvLFG)0(SFf4X<$X2Xl}lKhKAZt(gfJ{Y#u!DAZ*QbhezXuG;Dwk zoG(ucg@FZ;?T@xjPmpi@zq|kd1)IPb2ytO94+yQcSoys;PJ0hj6H~PTU{Vd+ox!H7 zrVLh$#6hzaqdd5Og~W;OJ9tCStq-BBsE!G_-r!2+83 z^3wd%*?UjnF#nbWM2NuuX`@Z0LO-_9)<%Ckt#p&XYlo;!S*9Oz$AW+#|NY|L00000 E09{7Ds{jB1 literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/accounts-page/accessibility/unsplash-wall-paint.webp b/apps/client/public/assets/images/sections/accounts-page/accessibility/unsplash-wall-paint.webp new file mode 100644 index 0000000000000000000000000000000000000000..f82bf183b8885924465ceca03ddc25fd2f9e9133 GIT binary patch literal 39648 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 s4lq+V1cBHE3&Z8K*L` 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 literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/accounts-page/credit-cards/american_express_icon.webp b/apps/client/public/assets/images/sections/accounts-page/credit-cards/american_express_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..3ac3ac53f1e23cf12d6633ebc3842c3883e979ad GIT binary patch literal 1204 zcmV;l1WWr;Nk&Gj1ONb6MM6+kP&il$0000G0000e001Wd06|PpND}}6009s1!2gJd zAS6ie|9ERe|0C!W09H^qAaVo%0I(bYodGH-04M+e001SB0^9`!_y<0;XX$^1f2`lx zxkMhrmVes+8@@n(K>jt_9K_5l5W^pO3q_!s?r|E>O? z;1~7F{^jA{#XkkVV>4&RZX<{vH0{f57(x_y^%H01xMXgkQ72@pFK_A^czQ zKla1?Z-@st@8rMJe-C)s{{Z{|`40X|{IBsN`**@O?w^nzy8c@J+4(c{3H&qouk-Kg zpRC{5|M2pX{+XSc+_F0nreX)(Z}38#z=;S1G?&K7HQXb2G*r3>$kwuyCCg;GXXD@i z{{O3i_;aE#IuirWxJE5Rm;WFO#naAOkQ9-?`LQqz8acBjGHCDYKg8(3H7SDuZ-@8V zbjXl6%D=x`-p#JLO3?h8&ci^>u6@xTFa5Xs-QC20qA$qb5hq)6fz8tB%z8mXb^m6Y z_*9^Wtp$ve^46^d+Fqrod`KTh{x3|R3E1XNC&AisGzEQdbyQM+A}m6K*{r9N5cIF88ZdhkqtbOEmO&G`_Uj$E zZY6^F+!7aFA!g>0NlV}P4V*omq-cj|@W3-MQ_t*DSfak?*VT6r8AqQ*ERE|pVtbxa zXY}`~e-2~hW<8*2=drlyOtZ01R|I0SpIL$FiSjL@fTYR`ZKh_f$P%wq%ozHq@(bSKJz^2ghh?KZ%0$ ze7s)7<1oxeH%JA)JAa#Xh%5A|eic==f>Si~Ex6hxDvhC^dQJ^>KCt7H3m`zI0KxH# zy|r@UTFHD=wpdmMW?ydwd}F7pFhvep@;l4f9o4pA^yQ^7`C?2Y)WE%Z)4GyJ^j*D) zGQdKm?5?MHD&07sdIkP8Ms)_^&t9#+hkyU8Vx^z@hJ)CldHUAjhD__n{)?HDx>Y45aSS8h! zph`i3vKZud=y_}nKfz*)+$z*I-n59D*4H{+?`w#mlB?z8g46S4N6*3B+04FcPuh4(c1PJ0mId%v?n)HEiKeHXS&%KT?X+Z;U SvsW_c3NV1&0w3+pwg3Rr!Des( literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/accounts-page/credit-cards/mastercard_icon.webp b/apps/client/public/assets/images/sections/accounts-page/credit-cards/mastercard_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..7338b4bd9af30c2e157df9376ab8831486360690 GIT binary patch literal 1084 zcmV-C1jGAMNk&FA1ONb6MM6+kP&il$0000G0000e001Wd06|PpNT>h+00D4R+jiAl z2~R>KAR!Wv@FYY64!{98pbo%6>L7Ix2?^gv?}%YUFmT&QQL@Z?@Cm$4MaNW1iL+kL z(O%DC5pubj)IP@@ZYlRJjdhObt}&H=P3ItX%uj+G^o3y$z!i=jm`DsjCXvM#mOjwX zjz&jBX$0aBp)CXqBu0Q$bzo()0FXo=iEw`yz(s@A`~_Es8}+U+hX>~{)X#V4H??A& zLj^BW09H^qAZ7yq0B{%podGH-04M+e001Sh131+MRCi7GFTfAiZ|>aTn}yg9)m%dV zpna+h%%MqVWYze~BSH$uGt3=KkXn;J~dnu&< z{FyStAGx{+f0)lDg|H(2DK=3o!tW6d3kP*6u<@f~hP=lv$Gy%6|F#KH0uJ^qum0&l zkNN_oPoh!)QEhE$2ZuKc{R=r=QO>b4DKLU0T7l{96E#VE&q_5 zeN%_;N7`+_{HDsE(!B**Mt4^kMyH`NVcgWsywS1$WFG~4+Uw5;=Zg-IW1k7B|IT&} zzy53NAK#mBm6znz72lGltL5V2B!TC)*v{Fm^4k$gEw}&8#J(dM&SfuWTLtJjA^;IU zMILfFCUoWW@2)?Cce;;3iw%1kzhhW~lsd03vu(9m`!3L&G3{03 z>S}m4YCToEb+LkFw{TzP{zImVN^#2E!3eh$)=6J=?>KuuC0#%N$89`VzFvR;0000r Chz_3s literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/accounts-page/credit-cards/visa_icon.webp b/apps/client/public/assets/images/sections/accounts-page/credit-cards/visa_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..1cdfc0109a6e2c8d66071195508667301f5cacac GIT binary patch literal 372 zcmV-)0gL`pNk&F&0RRA3MM6+kP&il$0000G0000e001Wd06|PpNQ?jg00D4R+g9CN z2}nQ!5|9uHk$?moBo07A9K1M)gjWYhIQ^G#M-edr`dg0Gy-1rc%~Q02NsD`!AZ1)~ z;ze+d-Xw=KMT4-?0v;Jr(uz^$bdr%WhYU8!$h0|yolBJ>)j^G%8a^iitBf3_LhHPS zDZ1g(Aedi}eAH^>IcqNpeOEoto>MPU?vwt50aj2rAi4km0I&rBodGH-04M+e001Qb zN`U!S_|3Qh`2lzVzybPK=q>$ssAwZa4{3ht`@K)&&zDVH$4~$O{{P=@+rR(!dCUM% zfGfm*{{cll#IVzHe0Q=wl%*{4Km1%)x7O+T0?Uu9?N!&T$+< zou94xjDNGinqFb1)9q*_U&jUM5&!C90JmVL{O4o!pJadkPhRb?-a$1V>;LIU3QT|2 S>6OqiA?ED*>9MY40000bG^5}E literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/accounts-page/privacy-protection/qr-code.webp b/apps/client/public/assets/images/sections/accounts-page/privacy-protection/qr-code.webp new file mode 100644 index 0000000000000000000000000000000000000000..d8a600a8df12ccf56ec3fb5b109e8ea257ce3d0c GIT binary patch literal 5326 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 literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/misc/faq-dark.webp b/apps/client/public/assets/images/sections/misc/faq-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..444b8ea691d6fed698cb24c596ac4e81089e3cb0 GIT binary patch literal 4986 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 E0G=@5t^fc4 literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/misc/faq-light.webp b/apps/client/public/assets/images/sections/misc/faq-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..9d07c41755a73ab031b9a444d4354c7019b97ca1 GIT binary patch literal 5360 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 Ox>erjkk|kK0002(b))tG literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/sidebar-vibrant.webp b/apps/client/public/assets/images/sections/sidebar-vibrant.webp new file mode 100644 index 0000000000000000000000000000000000000000..d088fdf2073d7272ab3b0c89dae0b7b18dd8aefe GIT binary patch literal 30416 zcmZ^qV`C;@nr36$wr$(CDrUvDE4FRhHY#?-72CFxcdL4Px_fqJKRo~8xz0JainN5p zm>Up~rnrcbh7y++3=j|y(w|2Q48#crBrK;S)y4?~1dKQf2#1OdY_&}f7QDD(2@i+v zAFhI;u(rPeoU5#Bt=rf1xHUbM{;bM^;KX{Z-n80Hjb?`*pt+!`XvvbWW4djwzxatG zUzueHN$tjPFlU<0b6?+SSpZ?A7-a}Hjwueh$n@(3Ng@QDSi zz3E}^3W0mLW#(x0TpHQw7GAGgnF0rXTANdr7~tc-;Wj@HOQEXA{Ukk`8@YD7lG{f1z(0?2*TZ3rS>)`S)w7P?us-IgJ*yie_6s)oqijVZ4x z4SCS1J;-(b>V9o^d)o*hDGNubNK__4?TK5{VA>2wNf^MR$3NEQ39M#j`;PAug8cJQ zxRDGzbZvI6!bwiu?s`V$K|4lSHgfoZUoo;1Ndb%%GngGC3~Mn)Nk&Ki9a})WsjzhM%Ji&QdtGM|ofbX4oJ}nq7vpk3K{&4H0l>%_S)jH@TB2T%41zvQq=+ z+@6&!Bd;tCiw!9qw1cesDu#MBouy554Hhy_Ty&eW60{?>iT*V35ha{PL{=d~-Iqm~swY%_ z5^owe8az+d0X>m%087TPyoz$aVL|E`B()W`y-dWPnx$(5VkHi6=u@cmTYmfF5y=Hq z^Y}qe+sc{N{xtGaTkIO}Yjb0fa7*|V=z+i)IAXDzBXTVu=aVRh%p}Sv07y-`RL2Ei z)hwxGY@$f4Ac8wc+gzr8}%1(y8V`h+VXaJ<)5(gewZ}FaF74!Rj%k znu;LWhp+{McWG8o81EKm!%^`!+B?!E?9SxW#^@%gX3%vCQzW^P22mF*h75*sn`nHh zSkku#orK)+so(dJ)7|YbBMoh-Pzsp-A77D&vKIcj%gYiT(NQ zA-1}$iC*QOKEaa?wpH4J-B=o(=|a}Rl#fL zb1_aIgvHRESS@Yr3ye6lRVtr(MMiH+*Hfp;{i6;el09_V10RgS<`(q6W)53e6jV85 zNn#+i%9s$Ydzt~`)j~=}s&E)4BH6^4r~YzvQR6HptfsqQ6Q^J_BXAKW3q5>Yj6f#e z(gS&-0|k+CV;3+Df?rY+7vI#LlYJ-@&MnIY24@unF;S8hTX?G!8u~mVD7k-kDi^cp zAMS0^(rJuc4(pvTsF%!GQ1$LK5OEyuHGb57q?-E|kmNC0jr36+FLF&#y1;vKgCsW; zpjK~G9*ORcYr0U-Dt;JuGCnVKPJSl2!61jgaFi&8@QEKmpRC*0a?8ij@FdSD8TEL! zu-K0kD7sF!xtCXd^lX{9pX}7Rr(B`AajjWX!?z%$ZH_lMB5vat|IAcl$`+FN4AW~b zm^cUMe?NOnj-?nX>tqcKpMf#mADH<(eP~*xy~r2v5%J4Hgr30hq~yStR5_BZ@@Mag znY5`kUF%{xQt>1flA9J-)}VAFXkeXpr0gOGr^24n`j+2gjxq4MM!E=?XF>4ho8)|z~+OOwb3!qvy=vi>ABaoca7E> zXSN>SkK{*rM>&Ip-dl-*fhpPE_>~rdF9087AM<$`uqxg$c(iO3kH;a>!SNDXuhBRH zKNFLA5RS5oNd7MUHs3)TX-(aQnyFBPBpG~LFsfep$hp^+X(Rbl=)^%`GIm8lB0e9LO zm&N2Vh>oF;EGt;-xCV8)!~!;oiN#UKYbD#_7jQ-Cansoi_M9atVwu!IVZ{?Z?}IiT zL933J2wHt+oVsN_Saoaa1{YJO}})4bpVO#OcTa~Ve=HNyjOQ)=D`#*;-H%!U^IuBuzN43y%`1p#9Mj}3$3I?Wp za9;hO`^FZ$LX?$fMm_`W{;*hos$L3Vo_!j{#3Aac-o~(-Pmq8fJi>*)bdD@ll4tH9 z9B9GS`0J))dOm0PXNI6X_Sn8oOr`s}QpdF*Jk1TUOp=*NE{TS5bY@&Pe7%z|y!dD~ z`Y~-@ZvM7&!FI1%DC8^a#46R8n9u{1$$TC*3>91e_h*7+Yh6NQ8J~BSr<0jW`AO-Y zPZs=YV?rj5TUbI061=zza{-Qqael&YsmOB1nVYDf^xTzngHbpdP$RdG{YzF^(4vLBx`0m?j-gBG>AV;?m3bHBxi=hx>@ zXPZfd1NDB3rnEtPg?uV!irxjk^ps<|oMe$4jZooRJ$b*O96Y9Y6Q ze8-@)rRWP{B#oYDWt&3c)5}Uw0rOfIgl8Mffo|hpaPRXL{yH z9Dj*Ici9YEsE~~fWpg)NNoY)CR+MGaVVB-p%R-N=0{nvR1S@jR#wPT%jFL4c_A2na zB)^5R9T;D36beg0&T3w=n9hM?n>t7p@OpTk0=lBSZY%6i?`u@|hsYbObepn8w`R4G`Dp#v*~EnQtbZL0u_WnXBo7C_hKQ z;3BBc0CTy6DisEM7AF&o=~XWz8@6tSN@5DZ`lhzr-Lnoh=G9)sLxJ;pCWk(;;(xFA z0DQ<&K9>*XmL15Fl_d>s1GUbDFV78WEbPmNDckVzdukKJJAQUo&0d@iV7T~&jJXHG zf`d;-42uVaiZSq=3jrK4O_O%%#Dgomm)G@zlTj~4G=8bY56K3H6yaVwbr_Tm0K$!1*5>-;F3C`oLB)boxRgkK5S=%a2Hr!4- z5I$rxZIz!v4|07{%XR_4Waye<2xpPV4+A0p413@YjeKQZFYg0;vV^3f! z6#(o%;xffkpupYE%sr0#a31p;?TKyS*SAvH*O)YS7}1jBaxxckl}9bgWJA4cV;yx! zAu5#ywFb)c(@3$_T{ZI5oH68+WcmEd364mQn~5Ps04H?jWn@dBh8K6C<@*O7>EdFp zLfojLdFK@QGGQMr_9;6%BTzRt2kdiz5plh0i26|-dBT>1rx+pBuVDQIB{GHrp3Nb) zmWB=lINIB#h*XQ%t8_V+AvG_<)V72@Ds-qu7LF+A+hmoWKi0!+UiqGyX&6dyQ(7qx zufF8yISTnQD^p2V7p2*+DwegOPb3TCnTN0}zxDR;W?dT6;fQ3!%l!bMTvC;oN>U7C zlu7mKp@6rcrQlgmZ{=DuEsmfwq%mQZ2KrVRS`1=mVG?s>!Ee<>2YTWn96HgY_Cs1- z|d|JdFG%69ZeFkZ5=1`KK-T3!&GxQh38pQR z_tZ$?*(ekv{t@_!$+>! zHpk+OuCaq}%>w~~lD|uK1Y8bA6wfe^2?=pX1}qQTKi34RdwDbjTcMI`N68sGDY_PL zW1THU->o1NXd0fJy_4pPeXn2l;85`ef+Lm=gdCVz>`yP3j|=GkfsHpNqQj)lGST}p zRD)nt*BhoW*oWCNAH{z5#!JtZ|Lp$inFk*VqdHePvZ6L@3CQJfz3D-`9+S zZU)oD`Ej=(1-#b@k+WSDX5= ziD^Z6)bhO|dI^lN%`MCMes^IfqHszT+PZ;F?4*J$eiCRJWa1?Xts-yWc^)hnk+v#u z4f|U7)n3pU!&hJ>p9-|&YLH4Vn+HIrRhT9M+%{Nreg`0DkWJZefeUhlW?)puN=1)6 z$!2+JdWmHAOqgn%nxYSEUZEN%-CU1!dT4RH-4oeELK^|zyW+mXSpz=uid=JvBL+Wl zU^EHE$b-jgYYxqcBcxquCQ9GN#BFhi3wDOj5c!4#=@vz#uz&opn1sk;2xWWSP92Pk zHRIze;#9g`-!_H!011>{>MzkJKl|F6g(MqHJoY_Fx=nL3v%Xk_JUaXP9~hvjt#orp zq?+Rzxo3&GekCKm&7M{C?I2$X701lIxA=DSz)~I^;>J0WpX7+PZ@Z2x@)|RtDqA9A zvni56NDmh%k$-xHs}=61N==gtpqLQf>efBBkVcull`9u`a=YFI+84t&eqG~m%oVnb zuXI0YbR;D%=#$xh`_{lIY6z{fd|trmyysAo(f=djC5X5so$jwGCkRH*1U6 zWBSW%P94yz{-y&EVtAlmJ6)GZOYZ?aa(3<W^I-qpxmx8*2y@D?SU)ry>$L1e?kuLL`n`)07{rDhqG zLIP#cED6Qzdi=f~!J*siMfFB*NktH?yECi!LckfVYv~m472(-QBRE3Ky!0MywM*}4 z_1{HP%)Ak2p9~O3hUS&Z(r@^nR?u)AQM6lWC-@-q1wj;6KKFt{)!%ef>xURFYLY-Y za*_^}64DI`NlLeDBQ2S&NXmA|OGXF`(@;(^q?51<2HMiqh0-fd_E}gqa=~%|EKdjG zW3tXv%H}W3`&#ioQq>)vc45r317lGxs(W@f!Y&1!WEYj57;3U7=SGJDX>pcSu!t2g z8gOxsLJvTc@n>e8O7u^e!{5mVI%gXuZ8ByxvcR+kjH;QoVqUCkt-KrNholI0)*CEn zE{Yk(*&IMFu7G9422#mM?sQuXb`>NZErURfRzNF+a9T0*Y$3#G!&W3uoFtgN-pW>V z#zJ(TJRMrv5Krqjp|A2I)xn>Lf$A{5yM!@RD%FTe;Vd|owWRoU8ay%8=I3XCRbH`BKg#n-7^3zA0$J3A@r4A}qYc@W z>*dg7bXqfIi4(i)J%W)Aw~q`fH1tjqN)^I#fh5El2qhU4A&vLw%Nfk{hg6Yla99O` zuqrh4U183Lw)e-~Ukh+w2wf-k_W^sa|Yv?EmC(eEThP`3?gQo&8d zL;vhyI$LX6VX_4Z=>yr@oXlZJpl%JywV;%U!%q)YPgxnkt9@aKp|vUMUjQ?%MVboA zVh|kK?4Vr{7$N?pwgo#uOssYSx#@Dr3AXXh&16&<`)3!a!m3ud+Ki5e$M1jgsH8Gz z^@=6s+7hkD$bXY)U;O20%B4=`ooy1U`j61IenptyMT?XV3ERh6e}Q26ElpeQWC zh=7~{M=|c(pJ4;H&bkCmsaK7pb&D#u56Yx1inyp8(Xp%vS;fB+TSQhY(+UR08IMw; zd^_wDhxFK-Ts+KFPfAQ;J#*g#XVMDI4&z0@FA@*!7nCcKFl}t_t)ER-tNs-NVS2^X zbH(%_Inc1k#8?(&i4X!miYammLv3tYz@Fw-Ov|-_fp03asJg?%flgwT(5r%-ILQV| z%Z3BlkWxfKMboI$8-~AT;u)KLKs+~4Rr33%6mHC?HB|^8n+3^FidKnG^`!u~A!IJo-v9%O0Y3z3v)o)qp~xstuT|FD?j@9aAv|3_b&N@{fa#^&HJ zAQZy+qj;A4mpuiN?;25rK_C52q-u%dO&&7@vWJP{A(kdTZL{;g=Or(Tim`$L2D4 zj3V!jbmk-yN^gkYv?UKYNcJot)XvbQ-c2F53SXC^YGMt$z@AWCSYMv6MQV^Lnsb|L zg~T%QJoY!5@u!R0Pk^_AhQedu)9frGRk7LDa>#edA~piJg1}MMU`=^-oFI?t$YlM@ zJ~0A1K<#9+DRH?tN)St8Im=Jb-?H-6^$h6O38~&XnA)AD>zQYuSK}b$CR%f3q$HZD zu4%TG74z4fK$lTgysFllU^xy$t!Rzz*0a8lO5KO4Xk)f|F-|p;B0H6~FeP;8)%nBV zEH(X32=zYRm@VC);n$0$azE6^UJMhaormN|kUONq?5_h6!(ovsNXC{x7S(Ja^yL^f z!QhTzBuZ+C9D%d`p8uX`(LQ z9ZHMhkXrnH3WM2qt|CU=qrpXZu5Pa`X9Ok4(Aj!d{2UI^<8xqgD8Xh0-t;9|vsPIBMj#~6 z8zHKZ(`cYZ1JHK^+zUuM^qK&T41UOK<)1(FfPSE&MFF9A(GKuXrAI1BRrRPa*3;@m z?mwY#eZ!b3WD|*|o!<(%%S2v02-y(Ig1wWF1VRT6 zCfpB{@1QDNr%D4F@D5lGpBD)ymC5Zm27?Z^OR{|!k!Tt#popws z>BQ?r1NG*0=BFOd5>Ehp1&f*`-jB+r-vj!RYz(vlx#IxO6c&Imp5FKlo#86`twbP1 z5HDGj{`9k;tBcxqZFpl|GoQ_I{9~+vq~ESAgqVVaxMIoEqIjRK4tW7X7z2f%tgWh7 zv810?WEoN|v7sR>j*pwVxp~I9#zd6nrlNr|e%F5XzGE8<^x<7`aoqHyu@^Iad>%|c zdE_z~3fLq>3OFoZDGZdd-L%`gK>S>pdv{0G`v0TI-o)DYRNqfY?3f-x&nFS)%y>Vx zX4-xNsA#3{W7r3%UXyQdf1J=BBH*Kc$_k#56Ce-2zO(}HWPJ@`BNQ$FS3{-;!+JKa z_}Wz5Qh5a-crVYK(OcSEMi{Bs0s4;OX-&0Q0GgLL=1;}urjg0$jOr9gHqPWQadIFg zj>RR=BC$+5XO(m@`~s3MHHgc&MDkN zt1%~~S5uY~w-#zTJ*bD;1hlCgCUNc)y#8@zgQXap`$@v`uPfV=Xc@DY-Tieq*!O`m zlQ6f>(r$`mXdud1pxFES!LPvilnDKHo8eNVA9!DJqU6FuT?jA%@m!&^ZW z&wS^D(U}9}Nf{15)iKhNkJ?_PO(mdT*@Gj8XrvE2po5vKj9Xm zIIkVeNtvE=Afvqd^IdbAGuqM|pgBetKKpY7LbOd-P_ys2kO^Ws#!8CP{mcYBDon6L z=Oj?7FO$K=1h3y))0$)8e-T{?A0mf5t5W7CD%uk)GbD2eHd*n)OewjbybLQ6D*=04 zg^GRXrx{Z|{B58F|R;(Mk$=;KJ})%!wa=+DP*t z{`gaH*^va5f~4@0=r*DWX~|&Rd5I0Ey^i9}n5OQn6iCpXMk47K-D*9>;BZ_{sk!VX zvqC}pD~hofE>C_Zs; z9vG=&7Feht`*!lIFY2`{qw1v=08Nk9fDYp{; z4`GGPzj=6V(_Qv^*cAH#yU_vU&;}7kZ|Hn_|V({3aaeaizPvRoTGoh=a3@^S%z+6y+2)T{B3;O+&RvQ4r`{ zM8RDs_98m&m)Pra6}k7YGUbJV5D9Zm-h`Itr0qnE5*J-KAI=Us zQ#HuZG#ou5=&N@yA#TH3z-?^NP=2vth(F3znmBA@FD4n z>f)lWH0y*O;rnG28ld!i;C$2qHwf1&oL39M8Fh#?P1om5v3KeWogs&!(ZYZ1XVVIX zfwTImp8`!+4&3>&$h*kw2$IE7;;adbzosRbPC6~kBc1w?C8j#+GvohAO?#SVzDc*ChRlA8oZ8Uw`Z%YeO`9-dL0MzuGb z$wFSGNYhrDKE(8LN=`2I2g}PMt{Ercb$f)1cQjQ1`;HmhQivf4wCFPGFUHAiVlBI_w!;| zI6Yx#*N0gXPki&>cnePkpE=?+b2t<1^XYZk0q4vQ%0ke7tPXRtz2S=V zSqKp9c-A6g%`Jyh=JsxS_fM{paT4K(Ir9{Mo<+Od6?xu2EKHA17(ut`v^aI>vJnZM zGL*=h$i(siIlUN^m{%XFAfl+ZZlC-<=*H*okeEr^1pm-;A| zgGc}2JvQh})CH?i&ys_1lajiH`?fsf<(1jCnmHxO3uqH6M|lds&b@xi37Th^Iw#n2 zsYjSmI)U++p{lt81>4o4H_uNZ%da0FV-xGUyCo4RArBrAmCQ|dqmC&J42R63O{y;ZKRel0T046FJ{ z2?@f4L=%rlO|tw!n(BvHs*2dmiURn(RNu}XGubl#SPL1S`gF1%bn2oiz?_j0GcGBw zSd;&D5j@KlvCD&D|5gy|C*tg6ny2^HZKr6dThvoG7Jq^{fF3!w!9m?^8m*ErOxbb{WtMEIGrW6ex(66IJzsyYo8~}f40Hxd+6ynfa`#TXan+Syi7Fk^sOQ8bke{9B z!q)mTApNkA2Y-l~c3ic5o%>IkUlen~a0U4BV`80j}PlI*lR_xE3YQhW;TDfMGsEuT) zMydufuC-^msob+gU{T}{cJF)NA;3Zf!h1pb@pN5`>Z951}`Wi;ZrMMko>zEAmSetUMtEy*# zr7MaZblCI_BWoV*JrWyt&*fS+HgV_%)*kji3(Z5f`&wgbhv}<9aRR~x8 z1;y!tR^%W9Lw9KMw>QSQ)-SAJ->};%(vh{jDhdbyGh zuNU0v{N`XW)jwd?@V$mSNZN_efdcovcY{N;LJ{(;d`S1aDrhNJ&UHZgeTh_zpPt;3 z84iz}c-RNUG;lk=Ov$tf8u^>^*^Vy>W!;FgNE>yb6at<5lKJ?xpV~Vu}xjUB+2Nf~MS8 zp!<3CL$zW1QKk1Z?IhuZOA5c!{RNco2=YOu>`T=e@4`=0625)3jr-kqO2V)w&NqGK zWk_`r!RFN2(eId_O*mszemI5l&te7bfYE5wH&Ebgpg(Z2*W{_-8-jxJQ~>5Q^4WWP zSg4;cF}*73In=ge{eOYMrXuBu591Km3XiyEUHWfh{_+PCjaQBI^y-NWt4DyAYoN%s zjYNz`?a^#0qCW07kgic0>O#p6( zKf#&~y!hmBiH4{Q05mdJ`Z&|uB>!xHSPCK~O?;*={-z`bCs!oMbmW>hU?9@!NB zDl7PJ{9K9FqhYf67RQq0@OApTy88(=l4pCdsw4|uGx+<|&#mNLKtxD0(dZUcj2_LV z?uH2czo|{z&IDzqgZo7;>V8iAxEu){%zEu3i!H;ixB}dEp0evRkgJMWdK>R4a59zq#UqWaJHVAe%oCK% z1(g+~+u9d1Kh9JE)Ze)Hrf&d96_Zd_Y5;9@K+%-4Lq*Nw=1bif0JjP8sr#85HGsud z0WeAMW7j(w;rj7hyZrLplE=oHUynJ?s8(yg>#-gT7g+Itx8m3kl4;D!SR3d#XVgx1 z;vfHylJ{@qYyCO8xB)eMN>%NR>fj+8{fLTgLJyETvS-|I0QU+zwu)KKXQ;X1@J zOEYl{HXCNF@K?((`XNTs^nu#~?gEy9N+Pe3HI=-#j)Ges-Vo~Dcn?B-=s%m$ z;m!rkBh=nOYsiurHh4l!ZVHpH{e+b?B|#~qUpcfJI_w{n6Zjl$2tfzs`ARp|dX0I- zj5%F}?Mk)q+oS)CJ!2br3o7inA(zT}dFuNAhM#b~zyD*G`(DpsU>KS1{di!jv%UHB zOo}R9bHA9icJ!cJa|U{(-mR33g>g_hNXk zW-xd+kKW^&InIf_K=b-QT4|p6Ow|RmDKq4aUF|Xa$uU=-H{o0r1Mf$0PBeEQ_+4oeV*O;|J=*>G$a+${D zU7?(7Nt6E=&-FgrF4&hga*~iEb2;l-slBHZx{UazR8Gr`Qrj#aGWYKUN>UQ-V1bcu ztyl;9uzjnpj=}ue4Oh%?fc4_Q;YrB>9E{fbJ@fv3#0P(Y)<4bT2^vCXc&b%T{G<0Mtjjvz}SOjrat#1p*&NbfDhO_AmxMkrnYJso-x zDuWYbTE@5u!4811eCfhQe{n9Z?h!iem4j>n9&@WPOnkshFLgI-QO}_VtvQOUWk*K^ zqU`H_@|YG<-vN~8#Q#4A>_*=|OF<`fX@zh=UO4P#Tw0Xz-)eBjfBIibmFc!l7lIup z8HwoJ=*WO>_|AaUJxW#S`#pvq&2#{h5itr+_F0JkKZ?HiT`siNd=dB74()`I@E{%& z*fg$x6nprBMDKepu%pKRX!O*yPReY3VE5tcMd%A0J?6+-k^a3kS6~n?>KW8c{w8_! zc!Tq+*zQZ|e=EFJqS4YZSiTk$8Y~$s9icFl%fUFyt~9atdT{0eSx|?jX!W*W&XeD` zbrsZ+BUw)vWd9zIus}JD(3LzuB5iwr1GtO7ZJYzGVCcVhBCJ|jR(feGOx2Wu32hV% z*tb_6rs`I)iOtW9wc!pAE9<|-S}0XqX{8UX*1twzE82g}KOKDSDuyqbfmX4CtO8U-kmY4JWZ4s$BWCrVsr7`@ z3A&6m3!pBtD&cuDCjw*UtrGXxs+kZI!8Vt)|25jCYQT9X;FlWeo9bJDmndXHQKfTC zbVMVjv`kTwMwY?;Im>J=Yjz(y!BxqNbntK=5|fV z8~WS0PDJrqn}TsiFoI57q4wAaHVTW^t&j2r`!#+qP*@KnlIT1-|KEvZ>w01tn_lqgHxI>e|=|9k11*)pN!`F$8MOx zuSKigwb5hp1~~7@1iDnL_MWvKgTLv|`E5EIQx1#9JDZ0Zbldk9cic%e@Ugo=>kaNM zP_5c?UzofA&ONebI0koL6{5BU?JNG360tRX|GzPf&u76?s54>o;|de!!ScR}Es9|t z@L8hVpt%Dc9@HShci#gMhAN%9KLtx9y3L%*5?4isH9u zuDrSB=*-_lK_0N<%!QeXanPr%nZ;Pctv7X;|fMIX_b01(g( z9dHgX4IMBS*q_rr@|;pa^q9|g9{bg6LBM^@Dg6EY_|lcv;gLV!+zs3rR}>cza`pJp z@HN>cm<6yte4hqX_}$t6R)Tza1}NZN?=Enye~$U_2u?Ip-tz;l`%WMo=z^}|JOEmK zW`eE0)OUzM9j@=JU!rGgt@5FOXU)D5gUh~Wf%3QWucb5ox1>+V+q8GWPlN7WS6?)L z;jf}E*pIkA$WnVD#QnbcPX~T|e<%I`L1V!;Z*{;tAneQkdErd;N%NEPh4F{tK4ALG z|Er%Lh+kCjhg+Hd^Fzl4VsCEXhx;*N*_ZnlD*&Ji&?)x^{4(^r|7Bmqt!?3c4GGB8 zjQHU<%IJ#17GM`QHfAGzwmOn#+dDyok1BPUFXNlO0o-3hHeNHILcc<9l66u8iGl22 zLZoSuRyOOYL5@bl>V3mH&vq#+M7=1G$2R6Z#zY^RoNK18?3Ehj$yGcf%XOC5fr7Me zw@+GW+TKHi@YMQ)ue}R;4b@sa#8uBt8vAX_9wbRV*uDDXN$45u5sNGs$KeOSDjXMA6@uJ|RnAL(^c3R)&*k?8u`M~T}v9;~#i zoejqqiTOc>bW#s1#FGtzquYv;FNh44Et`3OsFzPEN=9s?fRjTz{pXbGk(55LeWeNJKU{=4PYs98W4%`)*ls4oQGK^G>VR& z&V3#zj90tt&BdkLJoqSbY(g8}{T8=FV6*_$i5oFH-g8b3mL-B8CSMY^Dn)PgvPCJ4 zV2rWBM1GfSM(WUiOM#Tf+!a5K#CJ7 z>DKrG(C)qD#O+vifO|8wk)jJZCe~L;=u3zjEHvjc4ux=Ci676pf}HeT7=;JJ&p^QL z#$8`Gj6&NQ`@ydmMdLe*iTNX){gP)z1!JN?ltRv)i;B+Y_w{yQO)8rTwjzXB!vSo4 z{=>w1Xm>N7ZBm)e2cG%lo8MmS5z1&;5|S?TC~3)!95Zky@Mx#$*{)2!FXL7nBjL(| zzgi&dy`SBbROIigIU_5glSU*MNqko4-!4L$M13>HPC+hwqzXc=hGCEb3&ha}7+~IJrojF~A6xRMT;GP-ghreJ+mg7~gOCM)>1e z+^c+$t@lSCT^nj2N&&lQl7p)B-L7lJ-K}CY0cP_)oZ8s?uehnri*}BKBO8svhZo`} zEhBi94CJ?**Qa<-$Kcq${d(iB|8;c}8kzs(Yg*j$!@sJneb?7{Hu25j+){tvF%9 zmtz`>Kh9F%b1`@3E~VT84E)eiYmLwZ9ei8)qh_k(PLui2)pW$&>S&w@+ZAFkK#k!% zZ<;vHDNH_1aZ64G&gW6$S2zoy(^gH%s@~QZ%dzrrY62&mz9UU5piMa)m0DNmrKb-2 zI-WD#gy{ZWPP(`+KP9Agc0gtgxL)Jes2&t3S;k;*K@-uyf^#puK<5HI0&A7f+IE?m zg%Uyqob{TKhxQk`ojgk&UpsfB39)6MKTPNj*mo>GqiS(J9O3s$ZVyqJpq;+xNoh{f zZAG7fB6(qLFDUnTx|iW6-1HxRtlS?Ri{qjo8jDPb(mDYJgLPjZ3|g=OYNE6Cysla# zC$lr8r!~@k1=umfVjwND;LChbg;ESuVIBV(V~qG_!D8BR)byz;;$pO`q$8^zMPQ-B zp-MOMLV4k4w7C-C;|2M%sBIM9!8SmHJ?=F7f|7D>~_Y;=ayP=s_AO80Rr8 zEXty#?GrLr5e|iCAG4%1?>%4p9^Vu@(gjY=j4mZr+(D{=^*z+olvx|12A{W@jYQB& z2|_@Fyoy!qcHkq6OhkCMcn9(qA5V5MQ2J!|jvd&y&%4c$ns_04oH=OBh9Ff~l^Mr4 z6qF+D2%mM)c|UrA&7|A=40YA#!d`N{(;W*NBrbb9V``@=)Iu|C$x`jx#V|kCNP;Ds zmXv_aWegA=)f*I1N~?^rAd9;m!YEB5DdRCB=s*#pYQMEYlF#VoHYcaT#7H5qN@CE+IiK8^v091%#O?_7H2q}$s$q@p#B0FR5)RkxowEo&_r zAFeSJ_z^0FJ<|&Va^XIs{qR?V#qNcP@;+>4?6K4IPjLae=?2R3^ zw&$=leO*nh)E_mygPUOwElM|)f$vuJ{C)$09gn4tm-nmMa$BJF9Q#hM*4#pS%`d<| z>!>Oq^w=QD7^I*!e7>^!%M`PKnMv_3xb88ch-k~SAQ-};1VWZxg>`or3Bi!r56UU4 zx5d%J6IVgDR*aS3n+j6&A=If}0sXG7nzjX%Vx1!y$U~J3Uf(%pX|CpCWjoD|Sz_ z9pIA)Gto{n@0j@}wF$O^QjKTtX_KKN!>c(SUh!F0)>IbkQjrSOMX((_53je_?;pSH zd9UM3QdWh#d(H^Uh0`MQ@wh?(~Jq-3?) zLwET+;Vu_fIqf1x2KMDQR0U_RV`Q~D082mLhkb`%u&!%43nLYrm&Q6kbjIr>;|@mu zVe7Nnz<|Ghy8)k{UcHq#=VmzVN~(q&F(2 zR(y3EqbF^u6q@!fV9R-*czAuT@n|RV869|>uiE6P(9`kkZ{QBXA(_L!Y=!Xls1({r zjnA~pXFhr2h1+!tR4x01z#y!wQOwxzuh2+v@zh@8jy8YZ#Gz)iVdZ$-ia)PfZ}DeR z`LiNjCPL%EY?RI|rI6i}J|2<`oT0)R8mnmg+$gOORvSfWC{NsbkX(v&B1aVkQ-T+_ z46XDm8-*nMw$;l{H5*kZ6xLrPev75h(o_r=nI6>oC`hGKY^f+(TC3W)z{Y)g50|py zwfdeOFs)rhMsle-^#OWnX4()p^pH6s|lUFSh{wQx6{7#;fE7@3JEX zI@9x6gP$xNzr|!Cr;KR88#*6aZ%=e9eGJ3azqD0lMxyDR$`Au}Cb;+|h4(PDYnXb1 zC9$v}&^<>$_v|Wsri1wZ1h6wt%!LPW@WJ){(=niHhhu;bqw&${Jk<_flG2A!LZmuL zA3^eguUAR=E`L{8&p!76w>V4{JF5O4&y$v7(fv+^Bq2KIONZe~#m2YbWvo#EnBjnI z90yXY^AjF|!Ly9N#&in?!^=?P&~92ZKuvUzy+6*<;Cwo2o=wTGcQ<6r{FRoRi)x#W z2)Nf#K;?3lKzdB6{5w|PCLY~0_f9z;8sj*ln0KN7D;`N_HB`nZt%*%)3@LbXlw1yu z;m{>h9pTcj0h*sJ< zT!JwwZRJWt9pFaOEwa)D$uM2r|8f9f_RQ+6CL|<|Gp(9b*N-sYyfncta8bd^k_fN+ z076A+Qy6No`4caC(gkaQ>B-7{*Rf9qIksc@M+wCcKV zkH~Lvk8D4B1`cG$vB9EkE9Gl@Y~FLrb_;`gqu);qtQ&ZKg=^uvj9kFG7-TK>retY? z5|=Emh7O#aK8*eD+#fO0eml4BI@a{utdy+`CPJR~Vqm4pB^-r04*rd@P%o3wyyd3q zuw78Tvxylh9hfhZHq>{@xx9GRJa9K}@^MJ%e;x7c4LD!KSfZuXZy{Zox(7k5DNStzPTZ3Q?GW`FWC9>cYOlbFA9Qv-hQNy5)) zMllhYjfhknCA_*H9agG(ZNkvMBJVCafJr9r-Z_*GK{IRth1<_Dzx$u5?C&|GVwp|d zKE_3ei90D#c8jnPF^b}`jojo z-1+gJMqbL8_%?r!4Zn?f?XH}w6?MOh@*4V&h~~*6WJHSjBj}$sORYcBZFE*=_v2=j zEWzpf&sY{Cuef4*g;80u;rmAi;?$6Cjpld1r-h6M5kg3aSR$WIdC7Fq={kzy^bSZQ3Jg_u*i(TQhi{2 z$*J8|Iz7W-B3?q03mUV68=}oWi^EToNCJxPI6M|J}>Mj2=8ma}@G50fjWh4%7y0e1NXV zw{w?)=d(onrr63-XLz-J)u(xhQ}5zg-i9V<2KDZ6x|zU=UkuhJk@Py7W^Qsb>gVre zBK)XGNkT*{g~LLM2u}=0n`H#utd0U5sJ0Ln63y%ZCFF2yi9XY61@w0C6Pk1 z!9u#z!}J>7X}h89`iF^k+D+_DWRqI^-UFU9(>f46E71_N{cYPAH)I!rX-y9D@_OH* zr$Rcr$9>6Ci9M)p>B=>o7F;&Bn=J**Xgd?Sgo6Ca23axxmB+kuD?R<|c!`nZQNl^w zmWC=2N8X_76hxn6i(J5$w_2P{LBqWYo z>fmFw5d9F479F~B2iZ1$8YH*88(MQP2!*<6GMjEUiZ(ShpwOsj!Rl;PH_LmnJcWi#2Bvg>qnC)iEw`ZT{AFdFM`h?hUp>Z_uLVjTH2w3JLFt0kDVQ?dcl%Yd!zHmqRz6d zS{LQT36!7z+oXp;bOQ7CktdG^Wiu)e^pr3OjV??Ho_pmCsu+I5?Uyn5{L$leOVgs- zRx|=d7k|||VAPXPaittuzP-5=%bZ!Nt&56ETap{rTNiy0h3!3)MA3m_ z?bb39hh6YJ@fxe|m&Z3`@cf)hXUmMT$kO_1PL?b$XA!v41g5b5ihN5s2pvps7ydy2 zn?ZJ%Q=C)T3q#jrf$}@u#Jrp>?abuwdNSMpn}#N-lwOk2 zPms#k+>&Qh2o4DvdSLG-FexStg!KW`q}2h|7t90!Qe-pvrap?(fJ( zIsm}TSswL?^kwPueA0pv$D6Wq^)=!P@bnmzvG%8z(18q>V@`+gC6H^7=RD%vR292c z&;g+sVQ`w(^9vT?%FuAzup>mhY*kxujG)68Nk{{haphCs1GIm&OC&bE1UJp;Z7D$khW-EOaWPYs>v z{!6?0Orj>6pA-aKwmmZ$ofyc3&d)uq1NU5fPyJ8Tev{6`q2=gwLf(#=hP1gGY zPK`nQ2pUv;jy*pzo8T8U2twWjQveX#I|8_c3M~c>_++zV8BU)f+!?#cT81tw?Dd|7 zLye2F@yLrUw%i5K;Vsh7_yhGNDcGAp?@k9djv3Jv$u*#J0<7$Jna(Pax)XBDQ=$G^ z9vahph#>)?oH=(!9I9Kr8Cox9W*qy>u9)$c1aDh%L zbIF~fpAJCCSu1JH+mj#1wfPoy%EWsckct1J^dAvXavy~&O6gHbx#44t4M~?s)H|&I zIK+97rAcz&|NzXo#R?C1B?WeBeZ9J^FAg(7zd74L)xamnwnWgnaMP zj%|s4*O71W{!ed0vZ-J7sRDN6qh0O*$hh|X;D0{^p2uW^Vq%1OG4bhUgR|Fp#n{?Y7dHqt9~D2 zy@;6oKvqMtHS(P&5u%9iwJ==7XUTx&ao}okh@o)s50Z*N4;NQB$SBuTfn41#tB=Dh z2AkJ0i@`Y^c;4%|&EUbxnyt5TMN9$7Z6l47gglD;vvg2@v$A1ut#A)HDMKmB{*S^W*vm!q1_C;a2-`JR zjfuG))dI3CYAIDDGD4U95Y2EZaS9S={<$8-7WO+8H(^YDfyO2p!Vpp`g_YDk@ii2% zHWDrGa)eVfM?<=L(3n3$k8IUvnJcc2yqnnDcA1b|;O1()fDNg68p^k2C?1;oMUM&2 zM|<_Qp_ht)hkAqpFG&m{$W0>7CC`s+u{i0x$u`y1{Zqn3Qb@gu>y+alB@)h%GBxd~ z!D4f|Dtqp9T(8QJ`Cqcim??ec@6NuFeLCtW7)R@!!~9((X2)B03hS;kCgW~d0$f!6GA>C z6E{a)#H$oUAc3Y;i_G%*YWKi37Bmcd(R-*o5e=hAs2Pkw{H8fz2$TYWK)n2O0*-C3BjQ|Sr56%%e(A6(>&QmDDiqSxW;z1J|D8ENCK>I zDs)7oK}H4mr>bMi^i#`79&h)=$C!IEA<^RBqTkn6uNPLQW*!46C-pwg%U5 zXIo^WAOs?(M!kXOK0u7Qtw@*brh~x&xvy}L))M$hZdmrZ`Wv9A`MQ&acvjnAOb=WR zSnT~~z9Do6xgGXVT&|6$&mVx*i}Yg5ZrDE$?+VsGE>-xjg$%gM#za*K1KV%`3d#Yk z{{353UzjA5dIY{}UEeYQ>vDxx0B77^=s3miLkX+2zi(c)QGj1UPbSk;472p09bfb7OPoQzu8JQhtDKlJm71Ybo^Rh zWBr(_#%3<1Xk?v=N%F2FMTh%RC4q2h!3>BCj^d_~;Gor$y2%LFrs^uG#p?*JRC~bF zciw%Fz0#-?fNb1`g++h>O^`Xr{8$x;CYSwnuWd}j`x21s`Ky}ditsGh-MYjYr(btI`k)sIorsQ^!IkH)?VP97DO8HAFH^yhFdaHyygvH7?s zKinQ$HMrR-j!j%3@@gGfEv~BR$NYOEOBwiDh z^%+8%ld$Nzzxi0#JMSICli!=uTJO4)q_$H$kYSkUcMu$fqBlhu`T+p_6^@btsN@DU zTsS0Ao`XjHM22$2MHpwyF<)9=6PoJufE&f$CdK&|*&ssi&l6MX&mUjfdagy;b*wlM zO%KhC2~t&C081G`40rwmuWi=&WzLR@;`9T=cdnnKCZGrC*&*G;U~R|Ny{}iS#hP`E z!i8x(cAL-a?%8=ybPSj63+GoR>0_X|5w`5|oP=cFjgsyzxIZIp)R6)bL4GsR`RwIo zfmH#{y}_t9Ko+N^56f9!`x~@t^s&!@->h!#D#IId8J-o(z|(f@RR3Mpo0h}iU;q*z z0sG24F|CLb^R7?4pa7myKxPa!bCJiGw97(-q&Wv8;Iw#?39dJc@U4`;(GgIuQ}5we zf_srhWP!%fE?+m7^#J!GN8&J`^Y@v%6C3tSq~i_DesAPYa(@FL%=}5|M-phk5rLMF zY5*})bQ>uJqOCyRdi!%HZn(_H`qg@RzxQ|K?>K$Qv?B81GZk!M`_Ugj$Qo8=Q!A0u zpu^dZZ#~pXO%EO4Z2Q+6fB*(GZmm&gJA(s$Ey0tl2m-(dd1H9~oydZBmu^v}HS2R@ zvMZ1hYr^ry=Xl7~3%51EFw0F#rkTufLQg0>_RW=+bdchKj$KW)lNW$Fwatq0 zcY(g%0p}ut;$d}fA%@_=uP9;g5Sidb0g=+CVM z<)*xGFu3(3UU5O*CnD?N7KFCB6DL5-rb~r5N>>e+Vut7vbt13C{*{tn;s(l~rGPc% zN!`)UARF9Ww8$8Zov~3VIs&_hV<51ntEo`i2-TCWumFkZ-(yc(s-cC}e)ENhFD;oF z=YRQO@ye-llB-Dd9VRgnMbSnleeYm!1tMYKio2~L`&mrp6j4@IT7$e-sz+=WG`UuG z2muuf!0_r0Fs%u1alS33G)B$kd+VZ&99hANtAihB&%mmVU~wRa=~AsKx+eY>)z?0X55sDKLB zwzHz(%mLn?2|Q|~z!*eaa3WkIqNb5Ua;K9a*iYUVI(D|%<;k7F2m$2clV*ID5TLbPaZD=9$I*>u6+@rBeVJ+GHc))d~ z0|}355C8x!WO>l-at*SGiuVpVjSt6>!R_E{nIN-U8*t{=ghw#Hd^~glnKo@S$DZ?`K1LJcT{Lsh79Jixf#vTd%oTA6JDAXFOERn5BoM_dP(tl@Fa4jKcaiR}ETviV*pi%>vmXPDkyW zTxyqKz=&%LULz*byfsL+6ol!PLN!TEUhwST?D_m3SUpW5{-K?8LO?L6x5A zt#-P#k1 zyveJ;U(Erwown|w+A=Dlr(m<`;(8{CA#`<0d=lsGk<4m?7qjYjeM#HFK%dn|v!2&g z1WE(EW0w$BK$R<0W+Myp4Xd$Lrw`WrPfu1;xioaCm4epDjt)*g1FGv=gM;tZYR% zL+!bnjki3m4yA;6`edeX*?`FoAw#3@_{|981fiZ4Rr8OVNngGi49EkT|#jM}p=nGm9* zPmmW>H%fUDang2{mmV5A#O)8FlU3vb9(&hHgfRNxwuKW?^|c9BG=iJ;f;}uQ6GF#q zPZ6eBqe!`TT-_|hax<^jCw#D7yww`ko;O##%$zB?RrpXg2s|y*2?dd!adiKjBAfE? z&y8sI;ocy<_=s>q<)VHcu$vOdn+3CMGm5X8FhG6*Y;#=(Iq=Gm;J^z}QI1xt?^IbaIvaQ?J6Cu)_uqQa<&t4*G zS>~-sGNLOZ)CZF@*jzaaZ14OmomXZryB7nO3ydP4fzB7;#g6hLj6{GO3S1CwoG<6` zlnqyH6}ZlHM~h_5*A+IJiFBCu-5SSyxChyytf5GR7e1jCB!TnEqo%QsL+Z~sCG^GK zqBbiZmbI-W?BDF-(Pbtnc#+0@nMsV0>MutiWZF;_ph&#<`55@^^h)*$J!^i?2LgR_ zz^zywvz;d##XGv-ILTjcn#DFb)yjl1=MEags7`6!h|{>p{S53zJsq4{j?u5SA7poE zYJ}hW&_Y6?(5JuL?vF)~iUg-KJWbAi(t?uG%w;g~>jX`x37`%ZAv`LAPUo)t??%F- zqujpeLOxFXiRHn&qphOC2gmZTj37H~J$<(Yp2spBnZzd{stK;#f;K8s3^z)GTemP(K4xyR9WsE+_zQ9+aap)+1{CYILYss-&qdk z@IT!^mY;$7j+!0|tX?6M;2R7}_H(j!`PzaX0F?STn$DM5K?#2iqJ8xtjD<{_p>?kD zO4t(w$Kr2;k|x$*i$)Hu(2o}R5sNLRp9exd3~sF`+5_2kM~gw?TX;z`a6v(s+nQDVJND&xRAEaIITPZOJ<(mtFx-?xojSc|pnP9}&#L z7Y+VG1iq^D)qCBq<2WqE1gPgkPQX5(n(C+Y=smb6u|49wBBk)WDao0^L9mUDx{WB! zLtOkB`f@ADRKo|30^ejf-24K9bE7|TY|-ora#<+WWSm|d*$OI8i=Bak9nv-esYk$; zL4K@P?}cerT}5%7*Hq#hYgk=?wNW92Duqs71gM~~65se@hB?>J>>vG{+W zBW7YA;OQ_v8Juo7uLAq;F!L8P{i#noyYYq9U%2tRGuhYo7e&fQpS}LbK;e*NFIk@f z-6hO4u}=fBJSI^*z>>oxKN>^0_SLjSAj*aAA*|Dhjz=YgIJDeY!>8#bQt=)_MoD&g z{IL=yg^`4Sr%9p}T#<(nF5acDX3jG$ik}6MAhe7u>xyi*Ho|b*GJ}h{gIdLaBfzE> zO?K4RL_}LP&U=jiwBy0t$@bIc`{$4=p^+vFcFlW}NMieTNPML&gOEq4okt5QZe6Xk zUb{fVzsF;oXr!p-(3`eA?o9|W-@p2WiZ@L_s=82a-hkVsr}IPYHLbS^t%OI+bQ_0y zVCEpe8K;np?SFS5oo>uVjHS}036z_daN%lnqMg=jPtPdnILQ-=J1FJqxb1J1p1Epe z52?#oDM$BY6JAGEty|%4r=Lj zm4L}*E$O|@H-m5Me3{7i~*M%OtxzdWtlnG~(ylfmb@;G&vu>Y(I$(68g{ zz14Qk5a(%-xB_T&A^R2is^j9rYVDk(dxQ3Wga(=hv;?FqIbGSS48`vL^nIJ)m9)ve z2WHjj#6_t6t9cMy2mluyCj0))t8ZBmTNG6kN@N~yLrbp6QAXSud)Nbj7n|cHR@9k> z5h*3d#<~cGQ?FFA=vBwk_pf9B^&p)q*Z322fNd1ud7DP(oxMv(C!D;n8~nU) zQAcr*WaA?iOD(H@=B6wSxFO=&t%x9}E(XcLz#`_EeZTk0PSFU^yN-boR|4Vq?gRQv zBVLMK+KwKt>51hh$F*c!wrrEYL>JOuCu&u$qAeUYx3CQ}FnX|Wk1|h^DYi^U!z2l- zP3ydttd!L&qC_r=<6d-m8KJimVxBqC11DkhXlIK(!8epeh+@nQT z>DH$|Xe7hYUo>q4dqz;!@v$3DKvcpzxx1r{__|V~4wM*h-w|kj7%`KE2ia{ez9L83 zA5PML$0ZA|^%Deu=pSUV(_Zfi;OI`2L*I4# z>sipw#?zb7i-yWyq}|tkuE(qHY{<5efX5$X%=uCuu~`S?J0>0+!Dofn$T&T}Y6LC+ zTcgx4zLCA>u-=^&0sUV>( zulGqiuPNPz?Y&X#j)ivk*FHZ29DmbLH$SuHygJ0?y>|}j#sBq~A{1*FmUybG?0TL~ z1*ONy5ZMe+M)zvgz2H>4p6;Cuq#RP5#l7@9HyrX017RPPa2dOgVAPO#l!!;JUj_}--bw(bkz ziz-#PYBA5v@yYU^6*xc)i(!LBjL6qSwnHh`VLcvZlc;-;-ooBJ3gaLg>EYH}ufL_0 zLN$6pI8dRLwrn{Q+%+hm7OALL$}wcV%58QlSDvNR#)2EhY{x~#?xdP z6ZwVN|7&aWhB4!?;;Y_Luakohc}9!!i|QM}0@hSL6FrF|0DUW1X7WPnx-03Pj+Td2 zUuql}mj+}GZY!1Ao$or*nP=He*3@p5vAQN6uF^{%&vBlk#GSnWZ0eGLhR*+Se_i}y z@m;lJd7JA&9Me>l=U$P&?x}+e)khjL_v@SSMS4eo_T!qa>&Ep zNaiU=89^B4cN+A%w5(OJ3JI7jk~I?CCR?pQ`V-T*mhJYmH78!kfoRnmp~+C1V+kYx>l&4^hTx}~R;tpAdzzgF zHpYx?bE~RzB-^tI!`Wh;oHI5?;48uCL7?ZC5C}PtvmC1p1P+qS>j?jJJSb@M?y4=yi@1=b=CYd*m3 zyi9jFz!blGOAbO`opm~fNzikMQvKC_ux3;d?@*qT=Igx>#`E9ri#g%Ix3 z5mS5*;d8McBa`|5gf{fcNAzL0%K8C}HMO?03DyKK8SOGiC=6{0NHBD7K4$b^Yy1_j z+slEw6aac>?kK|VhjK!zTIWpvYcl*LMl9)Br+&v5f)Ya3zA-$j`?;or(Gl|5^7s0t z$EB?I4{=;xVvsu6!vp-7KYF-T=` zQGb>z2*|Nk$K1`c!j^2}>);S~r;32+HcbwHlYrgMED2%zPYr_;FMQb*YqRr@Arlg2 zZL1?5p|sq|NLR}(bs-1DsPz+B@FO~Cx8SswT4*CZRMZe?3J%=kv&T*l0ieyggi>~XU%?zC71|?U`ItM8g>5p5 zid6kDh*zMtWVUXJovF$42%+Z5s1Vt1eZOGQH7gI6C)rUX8{ zIrEKTGEMMWJ&Fq}Ui~+!#14wsfGTVEEHSFhb9zvy@<8SSlocdZ(avJ%X3Ta^2#pYiT>%w zk4sBBsaQ-gC}4bZGJ%?;jZW#Sif!_%ofZihPeTbYdgA{P$=Uatd$lq=XSQKCyEndN zN_Fsrcrh!%A11-F)ASOR4%qUO8YO&Cr8#W4Pb^9iOziJ3D-r4k)(EHeRzT5sx z(+c0>H_vVn-6ydBn>Gxrokk^-bJlRitO33zE-F|)a@eg9qr$pcQCQsXmBeOU#iP~i zWOVFZVBC!_{G$LZ1gf*@^4HogQmG0rC@h&wRJzt2vhCz32s2o?%O*MKLQ zO;~G)@vd1ICHeo;`faQT?nJdcQ?Hwir`gEWBV5Uo|)5FoKCUI ztu=pJ(*-ZEWaNn5<}!GHbRX`;wSNk~kk~k&AScKyKolf=_17yWx^xPxX*826R#wCj ztr2QtBtFepId?H^^T~j)>`G7yEH*Qd_Z{{x8@l2x5V~L@mGoV0hW}{{IhJ_LohZH5 zUagv9#1X%q-tl*#JjjY_tJF{-Ia#BJC1e`Ja6H|mlM?H^b%v9(Jr5UtRg^yEKT&o? z2W(V{O)ErCmbq0MM80xCBH%0$KhMKz?bA1u!V!0KfQQCxo!$1|q6SUDU9(T>~VaBkL* z3My%|k5wb}^`WJUJAlQecv}c6IjPf%(2SJkp4UG$KM@CQE&o)=c-ch!I8fpH30iul z(cM$b*itF%r4lC>uqDIDwj6@PCW_NO% zScbjz^SzJNfWQQq*lvQXQ?H8V8^m?HVS$tD(Ka zB=3uU1F9hq`R+j*-O%Gv+!{XggNlBt-p;o%^4(e+NPo%i^DSszt$0k($ zgE;x01h1A~#>A|%Pxy-to)h393HYrwidL|e;ac0RTc58#DB*DK`3hBfnc-R+=dcW#vSTm$RZYco z1nb4M*NCg(?i6H%<$_)IDyV-({EE8-kyU8JJCeyZ6Y%V61ltJTw!-j`>4B4)CMi5R zqcH)-fud13F;n$8<@kfmA+BZA88h)4vx9{y{q!VSMgjpW_ut$4QB}?S-$%!$>C6ZK zieNSSj3F_e$JWlP_Q)0a18rc=02d@HAoRd*cv`jQ+oh!KBY4SGN|FQE(c= z1;>`>S5o7qe3}sHcaN^0Yb~EkW8=Rya2cpNUcPJi*@UyXWOXQY*3p)i4CRRx!Ya$G zui&=PQycuWl6GS)kS%zqE^~3z2-!!j4IlJswgtc2JNMCfCd`6PLe`dOpKz+kEh z>4@d(hoS6_S1_+D6aTO_C*I$B&<2_V@*0aMG%Rhs83sTa!2%kD=~bx3Tphv0rQZvd zCU?-TW1+zqdv1@WRsMjo=bw}FE?98sy6nxH(PE!|`NG?^k%;oRzPj!&={Mi=5sJDl zZk-wkwkke-3R`lQ55JG)T2DFoGtl~{=@H*~WtMmxsb1up8v@$XRSE(liXfM{B*=#N zx#u4hNnzy>sJutIQvkpy77$hR6-Q?|SEdejabG}_;b&@2F>8CfKn4UC3!tvH0y+<*OmoCUoTLd`n+xU0 z9aPaJ>&-tI?%s;OxIxJI{LVg@hu~rac^}+mR)K|I?=U+@!kPhBShvBN%>0 z%MlPZ@E&+9px0f`cHN;CwzWSvP6#&R@?{yeO;knE{&M9) z9o;i|fbsi}$CU)$N}=awF9m!2=KudHhAdMFf&`%eneH9Bc=z>KYJ1)dUnZ@rEuUhjDaoo5 zsDWhTR|eHx0?$-vXT>$jt|AuAcy6wqxx=4KWZ7Own}XzHg+dw$l=XK=TlxEMO5Tli zYL>m6lGU_49>8Q^WR{DkWVW=vuQ!^Vh77P56|QJWYm&bc=l&RWq$lX93T9s>4P_Z; zy+fm4^42y1RFrY__|ep3p}lWSllaxpLBho{Y%>`+yHeMD^XSX}O*DNmSPdS4Sw*+z zhK@&qbK`l42>UlcUiLCT`!6ZRr;uyq3*rypxKnrQNhuF-e6hGf+0aDu83G!|=JYGP zgpSql&hmdaO0iORIi_(?KOFU=);)|ayi7xrj2Sy6J0{U4S@LuU#olU!)}m`!@jU)! zdUevg0VBv3^b0H0!OYUbFQ2c`yZU9&Ev^ep>8uJxF zJeiHSyrt5=?b(B9ehdnmm%uUVrN)Z5i!P>|Gr>HBae|||y;d2;HR_Z5Pz^xz)DMnO z?4Gru>FVW*a&w6Xjvj)!&nc1^9g_2kzaCf_A{ z+(Fc6hT$0OP0eKow42g`?=}lQ%BPj_?XCmhQG~rKX1lc0PoyCEtR$OV-4_543!;Qy wSW^KswSro0yRelp}oT#0Q%nC;ZHCzAy0HnX`sQ>@~ literal 0 HcmV?d00001 diff --git a/apps/client/public/assets/images/sections/topbar-vibrant.webp b/apps/client/public/assets/images/sections/topbar-vibrant.webp new file mode 100644 index 0000000000000000000000000000000000000000..290cf8e58e6a6645aa03e8b3c4d79a9b9875a8bc GIT binary patch literal 13774 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 E0DklDHvj+t literal 0 HcmV?d00001 diff --git a/apps/client/src/app/pages/account/page.tsx b/apps/client/src/app/pages/account/page.tsx new file mode 100644 index 0000000..5715696 --- /dev/null +++ b/apps/client/src/app/pages/account/page.tsx @@ -0,0 +1,7 @@ +import Account from '../../../components/sections/account'; + +const Page = () => { + return ; +}; + +export default Page; diff --git a/apps/client/src/components/base/AvatarDropBox.tsx b/apps/client/src/components/base/AvatarDropBox.tsx new file mode 100644 index 0000000..16a85dc --- /dev/null +++ b/apps/client/src/components/base/AvatarDropBox.tsx @@ -0,0 +1,132 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { DropzoneOptions, useDropzone } from 'react-dropzone'; +import { Box, Stack, SxProps, Typography } from '@mui/material'; +import { convertFileToAttachment, getFileNameFromUrl } from 'lib/utils'; +import { FileAttachment } from 'types/common'; +import IconifyIcon from 'components/base/IconifyIcon'; +import Image from './Image'; + +interface AvatarDropBoxProps extends DropzoneOptions { + error?: string; + sx?: SxProps; + defaultFile?: File | string; +} + +const AvatarDropBox = ({ onDrop, error, defaultFile, sx, ...rest }: AvatarDropBoxProps) => { + const [preview, setPreview] = useState(null); + + const { getRootProps, getInputProps } = useDropzone({ + onDrop: (...args) => { + const [acceptedFiles] = args; + if (acceptedFiles.length > 0) { + setPreview(convertFileToAttachment(acceptedFiles[0])); + if (onDrop) { + onDrop(...args); + } + } + }, + multiple: false, + accept: { + 'image/*': ['.jpeg', '.jpg', '.png', '.gif'], + }, + ...rest, + }); + + useEffect(() => { + if (defaultFile) { + if (typeof defaultFile === 'string') { + setPreview({ + name: getFileNameFromUrl(defaultFile), + preview: defaultFile, + format: 'image', + }); + } else { + setPreview(convertFileToAttachment(defaultFile)); + } + } + }, [defaultFile]); + + return ( + + transitions.create(['background-color'], { + duration: transitions.duration.enteringScreen, + easing: transitions.easing.easeInOut, + }), + '&:hover': { + bgcolor: 'background.elevation3', + }, + ...sx, + }} + > + + {preview && ( + {preview?.name} + )} + + + transitions.create(['background-color', 'opacity'], { + duration: transitions.duration.enteringScreen, + easing: transitions.easing.easeInOut, + }), + }, + !!preview?.preview && { + opacity: 0, + '&:hover': { + opacity: 1, + bgcolor: 'rgba(255, 255, 255, 0.8)', + }, + }, + ]} + > + + {!((sx as any)?.width < 100) && Upload Avatar} + + + ); +}; + +export default AvatarDropBox; diff --git a/apps/client/src/components/base/PhoneTextfield.tsx b/apps/client/src/components/base/PhoneTextfield.tsx new file mode 100644 index 0000000..a2362f8 --- /dev/null +++ b/apps/client/src/components/base/PhoneTextfield.tsx @@ -0,0 +1,118 @@ +'use client'; + +import IconifyIcon from './IconifyIcon'; +import { Country } from 'types/countries'; +import NumberTextField from './NumberTextField'; +import React, { useEffect, useState } from 'react'; +import { InputAdornment, Stack } from '@mui/material'; +import { countries as countriesData } from 'data/countries'; +import CountrySelect from 'components/common/CountrySelect'; +import StyledTextField from 'components/styled/StyledTextField'; + +interface PhoneTextfieldProps { + countries?: Country[]; + onChange?: (value: string, event?: React.ChangeEvent) => void; + defaultValue?: { + number: string; + code: string; + }; +} + +const PhoneTextfield = ({ + countries = countriesData, + onChange, + defaultValue, +}: PhoneTextfieldProps) => { + const [country, setCountry] = useState(countries[0]); + const [phoneNo, setPhoneNo] = useState(''); + + useEffect(() => { + if (defaultValue) { + const country = countries.find((country) => country.phone === defaultValue.code); + + setCountry(country || countries[0]); + setPhoneNo(defaultValue.number); + } + }, []); + + return ( + + { + if (value) { + setCountry(value); + } + if (onChange) { + onChange(`(+${value?.phone})${phoneNo}`); + } + }} + options={countries} + value={country} + getOptionLabel={(option) => { + return `+${option.phone}`; + }} + fields={{ flag: true, name: false, phone: true, code: false }} + disableClearable + forcePopupIcon={false} + renderInput={(params) => { + return ( + + + + ) : undefined, + }, + }} + size="large" + /> + ); + }} + slotProps={{ + popper: { + sx: { + '& .MuiAutocomplete-option': { + pl: '8px !important', + pr: '8px !important', + fontSize: 14, + }, + }, + }, + }} + /> + { + setPhoneNo(e.target.value); + if (onChange) { + onChange(`(+${country?.phone})${e.target.value}`, e); + } + }} + /> + + ); +}; + +export default PhoneTextfield; diff --git a/apps/client/src/components/common/CountrySelect.tsx b/apps/client/src/components/common/CountrySelect.tsx new file mode 100644 index 0000000..6678f23 --- /dev/null +++ b/apps/client/src/components/common/CountrySelect.tsx @@ -0,0 +1,62 @@ +import { + Autocomplete, + AutocompleteProps, + AutocompleteRenderInputParams, + Box, + TextField, +} from '@mui/material'; +import { countries } from 'data/countries'; +import { Country } from 'types/countries'; +import IconifyIcon from 'components/base/IconifyIcon'; + +interface CountrySelectProps + extends Omit< + AutocompleteProps, + 'options' | 'renderInput' + > { + fields?: { + flag?: boolean; + name?: boolean; + phone?: boolean; + code?: boolean; + }; + options?: ReadonlyArray; + renderInput?: (params: AutocompleteRenderInputParams) => React.ReactNode; +} + +const CountrySelect = ({ + options = countries, + fields = { flag: true, name: true, phone: false, code: false }, + renderInput = (params) => , + ref, + ...props +}: CountrySelectProps) => { + return ( + option.label} + renderOption={(props, option) => { + const { key, ...optionProps } = props; + return ( + img': { mr: 2, flexShrink: 0 } }} + {...optionProps} + > + {fields?.flag && } + {fields?.name && option.label} {fields?.code && `(${option.code})`}{' '} + {fields?.phone && '+' + option.phone} + + ); + }} + renderInput={renderInput} + {...props} + /> + ); +}; + +export default CountrySelect; diff --git a/apps/client/src/components/sections/account/SideTabList.tsx b/apps/client/src/components/sections/account/SideTabList.tsx new file mode 100644 index 0000000..5ccb133 --- /dev/null +++ b/apps/client/src/components/sections/account/SideTabList.tsx @@ -0,0 +1,128 @@ +'use client'; + +import { Dispatch, SetStateAction, SyntheticEvent, useEffect } from 'react'; +import { TabList } from '@mui/lab'; +import { InputAdornment, PaperProps, Stack, SxProps, tabsClasses, Typography } from '@mui/material'; +import { accountTabs } from 'data/account/account-tabs'; +import { useBreakpoints } from 'providers/BreakpointsProvider'; +import IconifyIcon from 'components/base/IconifyIcon'; +import StyledTextField from 'components/styled/StyledTextField'; +import AccountTab from './common/AccountTab'; + +interface SideTabListProps extends PaperProps { + setShowTabList: Dispatch>; + handleChange: (event: SyntheticEvent, newValue: string) => void; + sx?: SxProps; +} + +const SideTabList = ({ setShowTabList, handleChange, sx }: SideTabListProps) => { + const { down, currentBreakpoint } = useBreakpoints(); + + const downMd = down('md'); + + useEffect(() => { + if (!downMd) { + setShowTabList(false); + } + }, [downMd]); + + return ( + + + + Account Settings + + + + + + ), + }, + }} + sx={{ maxWidth: { xs: 1, sm: 0.5, md: 1 } }} + /> + + + {accountTabs.map((tab) => ( + + } + label={ + + {tab.label} + + } + onClick={() => { + if (downMd) { + setShowTabList(false); + } + window.scrollTo(0, 0); + }} + sx={{ + maxWidth: 'none', + '&:hover': { bgcolor: 'background.elevation3' }, + }} + /> + ))} + + + + ); +}; + +export default SideTabList; diff --git a/apps/client/src/components/sections/account/common/AccountDialog.tsx b/apps/client/src/components/sections/account/common/AccountDialog.tsx new file mode 100644 index 0000000..ea75164 --- /dev/null +++ b/apps/client/src/components/sections/account/common/AccountDialog.tsx @@ -0,0 +1,80 @@ +import { ReactNode } from 'react'; +import { + Button, + Dialog, + IconButton, + DialogTitle, + DialogActions, + DialogContent, + DialogContentText, + DialogProps, + dialogClasses, +} from '@mui/material'; +import IconifyIcon from 'components/base/IconifyIcon'; + +interface AccountDialogProps extends DialogProps { + handleDialogClose: () => void; + subtitle?: ReactNode; + handleConfirm?: () => void; + handleDiscard?: () => void; +} + +const AccountDialog = (props: AccountDialogProps) => { + const { title, subtitle, children, sx, open, handleDialogClose, handleConfirm, handleDiscard } = + props; + + return ( + + + {title} + + + + + + {subtitle && ( + + {subtitle} + + )} + {children} + + + + + + + ); +}; + +export default AccountDialog; diff --git a/apps/client/src/components/sections/account/common/AccountFormDialog.tsx b/apps/client/src/components/sections/account/common/AccountFormDialog.tsx new file mode 100644 index 0000000..29c45ee --- /dev/null +++ b/apps/client/src/components/sections/account/common/AccountFormDialog.tsx @@ -0,0 +1,115 @@ +import { ReactNode } from 'react'; +import { useFormContext } from 'react-hook-form'; +import { + Button, + Dialog, + IconButton, + DialogTitle, + DialogActions, + DialogContent, + DialogContentText, + DialogProps, + dialogClasses, +} from '@mui/material'; +import IconifyIcon from 'components/base/IconifyIcon'; + +interface AccountFormDialogProps extends DialogProps { + handleDialogClose: () => void; + subtitle?: ReactNode; + onSubmit: (data: any) => void; + handleDiscard?: () => void; + handleRemove?: () => void; +} + +const AccountFormDialog = (props: AccountFormDialogProps) => { + const { + open, + handleDialogClose, + title, + subtitle, + onSubmit, + handleDiscard, + handleRemove, + children, + sx, + } = props; + + const { handleSubmit, reset } = useFormContext(); + + return ( + + + {title} + + + + + + {subtitle && ( + + {subtitle} + + )} + {children} + + + {handleRemove && ( + + )} + + + + + ); +}; + +export default AccountFormDialog; diff --git a/apps/client/src/components/sections/account/common/AccountTab.tsx b/apps/client/src/components/sections/account/common/AccountTab.tsx new file mode 100644 index 0000000..ca7a0be --- /dev/null +++ b/apps/client/src/components/sections/account/common/AccountTab.tsx @@ -0,0 +1,35 @@ +import { MouseEventHandler } from 'react'; +import { Tab, tabClasses, TabOwnProps } from '@mui/material'; + +interface AccountTabProps extends TabOwnProps { + onClick?: MouseEventHandler | undefined; +} +const AccountTab = (props: AccountTabProps) => { + return ( + + ); +}; + +export default AccountTab; diff --git a/apps/client/src/components/sections/account/common/AccountTabPanel.tsx b/apps/client/src/components/sections/account/common/AccountTabPanel.tsx new file mode 100644 index 0000000..6b171ab --- /dev/null +++ b/apps/client/src/components/sections/account/common/AccountTabPanel.tsx @@ -0,0 +1,56 @@ +import { ReactElement, PropsWithChildren } from 'react'; +import { TabPanel } from '@mui/lab'; +import { IconButton, Stack, Typography } from '@mui/material'; +import IconifyIcon from 'components/base/IconifyIcon'; + +interface AccountTabPanelProps { + label: string; + title: string; + value: string; + panelIcon: string; + setShowTabList: (value: boolean) => void; +} + +const AccountTabPanel = ({ + title, + value, + panelIcon, + setShowTabList, + children, +}: PropsWithChildren): ReactElement => { + return ( + + + setShowTabList(true)} sx={{ display: { md: 'none' }, ml: -1.5 }}> + + + + + + {title} + + + {children} + + ); +}; + +export default AccountTabPanel; diff --git a/apps/client/src/components/sections/account/common/AccountTabPanelSection.tsx b/apps/client/src/components/sections/account/common/AccountTabPanelSection.tsx new file mode 100644 index 0000000..59996aa --- /dev/null +++ b/apps/client/src/components/sections/account/common/AccountTabPanelSection.tsx @@ -0,0 +1,46 @@ +import { ReactElement, PropsWithChildren } from 'react'; +import { Box, Stack, SxProps, Typography } from '@mui/material'; +import IconifyIcon from 'components/base/IconifyIcon'; + +interface AccountTabPanelSectionProps { + title: string; + subtitle?: string; + subtitleEl?: ReactElement; + icon: string; + sx?: SxProps; + actionComponent?: ReactElement; +} + +const AccountTabPanelSection = ({ + title, + subtitle, + subtitleEl, + icon, + children, + sx, + actionComponent, +}: PropsWithChildren) => { + return ( + + + + + {title} + + {actionComponent} + + {subtitle && ( + + {subtitle} + + )} + {subtitleEl} + {children} + + ); +}; + +export default AccountTabPanelSection; diff --git a/apps/client/src/components/sections/account/common/InfoCard.tsx b/apps/client/src/components/sections/account/common/InfoCard.tsx new file mode 100644 index 0000000..9cd9971 --- /dev/null +++ b/apps/client/src/components/sections/account/common/InfoCard.tsx @@ -0,0 +1,56 @@ +import { Dispatch, PropsWithChildren, SetStateAction } from 'react'; +import { Paper, PaperProps } from '@mui/material'; + +interface InfoCardProps extends PaperProps { + setOpen?: Dispatch> | null; + onClick?: () => void; +} + +const InfoCard = ({ + sx, + setOpen, + onClick, + children, + ...props +}: PropsWithChildren) => { + return ( + { + if (setOpen) { + setOpen(true); + } else { + onClick?.(); + } + }} + sx={{ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'flex-start', + px: 3, + py: 2, + border: '0 !important', + ...sx, + ...(setOpen || onClick + ? { + '&:hover': { + cursor: 'pointer', + bgcolor: 'background.elevation2', + '& .iconify': { + visibility: 'visible', + }, + }, + } + : {}), + }} + > + {children} + + ); +}; + +export default InfoCard; diff --git a/apps/client/src/components/sections/account/common/InfoCardAttribute.tsx b/apps/client/src/components/sections/account/common/InfoCardAttribute.tsx new file mode 100644 index 0000000..f4a84b0 --- /dev/null +++ b/apps/client/src/components/sections/account/common/InfoCardAttribute.tsx @@ -0,0 +1,21 @@ +import { Stack, Typography } from '@mui/material'; + +interface InfoCardAttributeProps { + label: string; + value: string; +} + +const InfoCardAttribute = ({ label, value }: InfoCardAttributeProps) => { + return ( + + + {label} + + + {value} + + + ); +}; + +export default InfoCardAttribute; diff --git a/apps/client/src/components/sections/account/index.tsx b/apps/client/src/components/sections/account/index.tsx new file mode 100644 index 0000000..141a0ff --- /dev/null +++ b/apps/client/src/components/sections/account/index.tsx @@ -0,0 +1,108 @@ +'use client'; + +import { SyntheticEvent, useState } from 'react'; +import { TabContext } from '@mui/lab'; +import { Container, Drawer, Paper, Stack } from '@mui/material'; +import { accountTabs } from '../../../data/account/account-tabs'; +import { useNavContext } from 'layouts/main-layout/NavProvider'; +import { useBreakpoints } from 'providers/BreakpointsProvider'; +import { useSettingsContext } from 'providers/SettingsProvider'; +import SimpleBar from 'components/base/SimpleBar'; +import SideTabList from 'components/sections/account/SideTabList'; +import AccountTabPanel from 'components/sections/account/common/AccountTabPanel'; +import AccountsProvider from 'providers/AccountsProvider'; + +const Account = () => { + const [activeTab, setActiveTab] = useState(accountTabs[0].value); + const { down } = useBreakpoints(); + const [showTabList, setShowTabList] = useState(true); + const { + config: { textDirection }, + } = useSettingsContext(); + const { topbarHeight } = useNavContext(); + + const downMd = down('md'); + const handleChange = (_event: SyntheticEvent, newValue: string): void => setActiveTab(newValue); + + return ( + + + + {downMd ? ( + setShowTabList(false)} + ModalProps={{ + keepMounted: true, + disablePortal: true, + }} + slotProps={{ + paper: { + sx: { + bgcolor: 'background.elevation1', + width: 1, + overflow: 'hidden', + pointerEvents: 'auto', + height: ({ mixins }) => mixins.contentHeight(topbarHeight), + top: ({ mixins }) => mixins.topOffset(topbarHeight, 1), + }, + }, + }} + sx={{ + pointerEvents: 'none', + }} + > + + + + + ) : ( + mixins.topOffset(topbarHeight), + height: ({ mixins }) => mixins.contentHeight(topbarHeight), + }} + > + + + + + )} + + + + {accountTabs.map((tab) => ( + + {tab.tabPanel} + + ))} + + + + + + ); +}; + +export default Account; diff --git a/apps/client/src/components/sections/account/personal-info/Address.tsx b/apps/client/src/components/sections/account/personal-info/Address.tsx new file mode 100644 index 0000000..e9f2f1d --- /dev/null +++ b/apps/client/src/components/sections/account/personal-info/Address.tsx @@ -0,0 +1,188 @@ +import { useState } from 'react'; +import { useForm, Controller, FormProvider, SubmitHandler } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { + Radio, + Stack, + TextField, + RadioGroup, + Typography, + FormControl, + FormControlLabel, +} from '@mui/material'; +import { countries } from 'data/countries'; +import { useSnackbar } from 'notistack'; +import { useAccounts } from 'providers/AccountsProvider'; +import { useBreakpoints } from 'providers/BreakpointsProvider'; +import * as yup from 'yup'; +import IconifyIcon from 'components/base/IconifyIcon'; +import CountrySelect from 'components/common/CountrySelect'; +import AccountFormDialog from '../common/AccountFormDialog'; +import InfoCard from '../common/InfoCard'; +import InfoCardAttribute from '../common/InfoCardAttribute'; + +export interface AddressFormValues { + country: string; + state: string; + city: string; + street: string; + zip: string; + visibility?: 'only_me' | 'followers_only' | 'everyone'; +} + +const addressSchema = yup.object().shape({ + country: yup.string().required('Country name is required'), + state: yup.string().required('State name is required'), + city: yup.string().required('City name is required'), + street: yup.string().required('Street name is required'), + zip: yup.string().required('ZIP is required'), +}); + +const Address = () => { + const [open, setOpen] = useState(false); + const { personalInfo } = useAccounts(); + const { up } = useBreakpoints(); + const { enqueueSnackbar } = useSnackbar(); + const [currentAddress, setCurrentAddress] = useState({ + country: personalInfo.country, + state: personalInfo.state, + city: personalInfo.city, + street: personalInfo.street, + zip: personalInfo.zip, + }); + const methods = useForm({ + defaultValues: { + country: currentAddress.country, + state: currentAddress.state, + city: currentAddress.city, + street: currentAddress.street, + zip: currentAddress.zip, + visibility: 'followers_only', + }, + resolver: yupResolver(addressSchema), + }); + const { + control, + getValues, + reset, + register, + formState: { errors }, + } = methods; + + const upSm = up('sm'); + + const onSubmit: SubmitHandler = (data) => { + console.log(data); + const updatedData = getValues(); + setCurrentAddress(updatedData); + setOpen(false); + enqueueSnackbar('Updated successfully!', { variant: 'success', autoHideDuration: 3000 }); + }; + + const handleDiscard = () => { + reset(currentAddress); + setOpen(false); + }; + + return ( + + + + + + + + + + + + setOpen(false)} + handleDiscard={handleDiscard} + sx={{ + maxWidth: 463, + }} + > + + ( + onChange(value ? value.label : '')} + value={countries.find((country) => country.label === value) || null} + renderInput={(params) => ( + + )} + /> + )} + /> + + + + + + + + + Who can see your address? + + ( + + } label="Only me" /> + } label="Followers only" /> + } label="Everyone" /> + + )} + /> + + + ); +}; + +export default Address; diff --git a/apps/client/src/components/sections/account/personal-info/Birthday.tsx b/apps/client/src/components/sections/account/personal-info/Birthday.tsx new file mode 100644 index 0000000..57a3781 --- /dev/null +++ b/apps/client/src/components/sections/account/personal-info/Birthday.tsx @@ -0,0 +1,125 @@ +import { useState } from 'react'; +import { useForm, Controller, FormProvider, SubmitHandler } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Radio, Stack, RadioGroup, Typography, FormControl, FormControlLabel } from '@mui/material'; +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; +import dayjs from 'dayjs'; +import { useSnackbar } from 'notistack'; +import { useAccounts } from 'providers/AccountsProvider'; +import { useBreakpoints } from 'providers/BreakpointsProvider'; +import * as yup from 'yup'; +import IconifyIcon from 'components/base/IconifyIcon'; +import AccountFormDialog from '../common/AccountFormDialog'; +import InfoCard from '../common/InfoCard'; +import InfoCardAttribute from '../common/InfoCardAttribute'; + +export interface BirthdayFormValues { + birthDate: string; + visibility?: 'only_me' | 'followers_only' | 'everyone'; +} + +const birthdaySchema = yup.object().shape({ + birthDate: yup.string().required('Birth date is required'), +}); + +const Birthday = () => { + const [open, setOpen] = useState(false); + const { personalInfo } = useAccounts(); + const { up } = useBreakpoints(); + const { enqueueSnackbar } = useSnackbar(); + const [currentBirthDate, setCurrentBirthDate] = useState(personalInfo.birthDate); + const methods = useForm({ + defaultValues: { + birthDate: currentBirthDate, + visibility: 'only_me', + }, + resolver: yupResolver(birthdaySchema), + }); + const { + control, + reset, + getValues, + formState: { errors }, + } = methods; + + const upSm = up('sm'); + + const onSubmit: SubmitHandler = (data) => { + console.log(data); + const updatedData = getValues(); + setCurrentBirthDate(updatedData.birthDate); + setOpen(false); + enqueueSnackbar('Updated successfully!', { variant: 'success', autoHideDuration: 3000 }); + }; + const handleDiscard = () => { + reset({ birthDate: currentBirthDate }); + setOpen(false); + }; + + return ( + + + + + + + + setOpen(false)} + handleDiscard={handleDiscard} + sx={{ + maxWidth: 463, + }} + > + + ( + + )} + /> + + + + + Who can see your birthday? + + ( + + } label="Only me" /> + } label="Followers only" /> + } label="Everyone" /> + + )} + /> + + + ); +}; + +export default Birthday; diff --git a/apps/client/src/components/sections/account/personal-info/Email.tsx b/apps/client/src/components/sections/account/personal-info/Email.tsx new file mode 100644 index 0000000..9af4b38 --- /dev/null +++ b/apps/client/src/components/sections/account/personal-info/Email.tsx @@ -0,0 +1,117 @@ +import { useState } from 'react'; +import { useForm, FormProvider, SubmitHandler } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Stack, TextField, Typography } from '@mui/material'; +import { useSnackbar } from 'notistack'; +import { useAccounts } from 'providers/AccountsProvider'; +import * as yup from 'yup'; +import IconifyIcon from 'components/base/IconifyIcon'; +import AccountFormDialog from '../common/AccountFormDialog'; +import InfoCard from '../common/InfoCard'; +import InfoCardAttribute from '../common/InfoCardAttribute'; + +interface EmailFormValues { + primaryEmail: string; + secondaryEmail: string; +} + +const emailSchema = yup.object().shape({ + primaryEmail: yup + .string() + .email('Primary email must be a valid email') + .required('Primary email is required'), + secondaryEmail: yup + .string() + .email('Secondary email must be a valid email') + .required('Secondary email is required'), +}); + +const Email = () => { + const [open, setOpen] = useState(false); + const { personalInfo } = useAccounts(); + const { enqueueSnackbar } = useSnackbar(); + const [currentEmail, setCurrentEmail] = useState({ + primaryEmail: personalInfo.primaryEmail, + secondaryEmail: personalInfo.secondaryEmail, + }); + const methods = useForm({ + defaultValues: { + primaryEmail: personalInfo.primaryEmail, + secondaryEmail: personalInfo.secondaryEmail, + }, + resolver: yupResolver(emailSchema), + }); + const { + getValues, + register, + reset, + formState: { errors }, + } = methods; + + const onSubmit: SubmitHandler = (data) => { + console.log(data); + const updatedData = getValues(); + setCurrentEmail(updatedData); + setOpen(false); + enqueueSnackbar('Updated successfully!', { variant: 'success', autoHideDuration: 3000 }); + }; + + const handleDiscard = () => { + reset(currentEmail); + setOpen(false); + }; + + return ( + + + + + + + + + setOpen(false)} + handleDiscard={handleDiscard} + sx={{ + maxWidth: 463, + }} + > + + + + + + + + + Your alternate email will be used to gain access to your account if you ever have issues + with logging in with your primary email. + + + + ); +}; + +export default Email; diff --git a/apps/client/src/components/sections/account/personal-info/Names.tsx b/apps/client/src/components/sections/account/personal-info/Names.tsx new file mode 100644 index 0000000..8a67258 --- /dev/null +++ b/apps/client/src/components/sections/account/personal-info/Names.tsx @@ -0,0 +1,102 @@ +import { useState } from 'react'; +import { useForm, FormProvider, SubmitHandler } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Stack, TextField } from '@mui/material'; +import { useSnackbar } from 'notistack'; +import { useAccounts } from 'providers/AccountsProvider'; +import * as yup from 'yup'; +import IconifyIcon from 'components/base/IconifyIcon'; +import AccountFormDialog from '../common/AccountFormDialog'; +import InfoCard from '../common/InfoCard'; +import InfoCardAttribute from '../common/InfoCardAttribute'; + +interface NameFormValues { + firstName: string; + lastName: string; +} + +const nameSchema = yup.object().shape({ + firstName: yup.string().required('First name is required'), + lastName: yup.string().required('Last name is required'), +}); + +const Names = () => { + const { personalInfo } = useAccounts(); + const [open, setOpen] = useState(false); + const { enqueueSnackbar } = useSnackbar(); + const [currentName, setCurrentName] = useState({ + firstName: personalInfo.firstName, + lastName: personalInfo.lastName, + }); + const methods = useForm({ + defaultValues: { + firstName: currentName.firstName, + lastName: currentName.lastName, + }, + resolver: yupResolver(nameSchema), + }); + const { + register, + getValues, + reset, + formState: { errors }, + } = methods; + + const onSubmit: SubmitHandler = (data) => { + console.log(data); + const updatedData = getValues(); + setCurrentName(updatedData); + setOpen(false); + enqueueSnackbar('Updated successfully!', { variant: 'success', autoHideDuration: 3000 }); + }; + + const handleDiscard = () => { + reset({ firstName: currentName.firstName, lastName: currentName.lastName }); + setOpen(false); + }; + + return ( + + + + + + + + + setOpen(false)} + handleDiscard={handleDiscard} + sx={{ maxWidth: 463 }} + > + + + + + + + ); +}; + +export default Names; diff --git a/apps/client/src/components/sections/account/personal-info/PersonalInfoTabPanel.tsx b/apps/client/src/components/sections/account/personal-info/PersonalInfoTabPanel.tsx new file mode 100644 index 0000000..95cd760 --- /dev/null +++ b/apps/client/src/components/sections/account/personal-info/PersonalInfoTabPanel.tsx @@ -0,0 +1,69 @@ +import { Stack, Divider } from '@mui/material'; +import AvatarDropBox from 'components/base/AvatarDropBox'; +import AccountTabPanelSection from '../common/AccountTabPanelSection'; +import Address from './Address'; +import Birthday from './Birthday'; +import Email from './Email'; +import Names from './Names'; +import Phone from './Phone'; +import UserName from './UserName'; + +const PersonalInfoTabPanel = () => { + return ( + <> + + { + console.log({ acceptedFiles }); + }} + /> + + } spacing={5}> + + + + + + + + + + + + +
+ + + + + + + + + + + + ); +}; + +export default PersonalInfoTabPanel; diff --git a/apps/client/src/components/sections/account/personal-info/Phone.tsx b/apps/client/src/components/sections/account/personal-info/Phone.tsx new file mode 100644 index 0000000..84fc73c --- /dev/null +++ b/apps/client/src/components/sections/account/personal-info/Phone.tsx @@ -0,0 +1,107 @@ +import { useState } from 'react'; +import { Controller, FormProvider, SubmitHandler, useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Link, Stack, Typography } from '@mui/material'; +import { useSnackbar } from 'notistack'; +import { useAccounts } from 'providers/AccountsProvider'; +import * as yup from 'yup'; +import IconifyIcon from 'components/base/IconifyIcon'; +import PhoneTextfield from 'components/base/PhoneTextfield'; +import AccountFormDialog from '../common/AccountFormDialog'; +import InfoCard from '../common/InfoCard'; +import InfoCardAttribute from '../common/InfoCardAttribute'; + +interface PhoneFormValues { + phoneNumber: string; +} + +const phoneSchema = yup + .object({ + phoneNumber: yup.string().required('Phone number is required'), + }) + .required(); + +const Phone = () => { + const [open, setOpen] = useState(false); + const { personalInfo } = useAccounts(); + const { enqueueSnackbar } = useSnackbar(); + const [currentPhone, setCurrentPhone] = useState(personalInfo.phoneNumber); + const methods = useForm({ + defaultValues: { + phoneNumber: currentPhone, + }, + resolver: yupResolver(phoneSchema), + }); + const { control, reset, getValues } = methods; + + const onSubmit: SubmitHandler = (data) => { + console.log(data); + const updatedData = getValues(); + setCurrentPhone(updatedData.phoneNumber); + setOpen(false); + enqueueSnackbar('Updated successfully!', { variant: 'success', autoHideDuration: 3000 }); + }; + const handleDiscard = () => { + reset({ phoneNumber: currentPhone }); + setOpen(false); + }; + const match = currentPhone.match(/\(\+(\d+)\)(\d+)/); + + return ( + + + + + + + + setOpen(false)} + handleDiscard={handleDiscard} + sx={{ + maxWidth: 463, + }} + > + ( + + )} + /> + + + + This phone number has to be confirmed to ensure its authenticity first before being + connected with your profile. + + + Confirm your number{' '} + + + + + ); +}; + +export default Phone; diff --git a/apps/client/src/components/sections/account/personal-info/UserName.tsx b/apps/client/src/components/sections/account/personal-info/UserName.tsx new file mode 100644 index 0000000..aa9bdcf --- /dev/null +++ b/apps/client/src/components/sections/account/personal-info/UserName.tsx @@ -0,0 +1,89 @@ +import { useState } from 'react'; +import { useForm, FormProvider, SubmitHandler } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Stack, TextField } from '@mui/material'; +import { useSnackbar } from 'notistack'; +import { useAccounts } from 'providers/AccountsProvider'; +import * as yup from 'yup'; +import IconifyIcon from 'components/base/IconifyIcon'; +import AccountFormDialog from '../common/AccountFormDialog'; +import InfoCard from '../common/InfoCard'; +import InfoCardAttribute from '../common/InfoCardAttribute'; + +interface UserNameFormValues { + userName: string; +} + +const userNameSchema = yup.object().shape({ + userName: yup.string().required('User name is required'), +}); + +const UserName = () => { + const { personalInfo } = useAccounts(); + const [open, setOpen] = useState(false); + const { enqueueSnackbar } = useSnackbar(); + const [currentUserName, setCurrentUserName] = useState(personalInfo.userName); + const methods = useForm({ + defaultValues: { + userName: currentUserName, + }, + resolver: yupResolver(userNameSchema), + }); + const { + register, + getValues, + reset, + formState: { errors }, + } = methods; + + const onSubmit: SubmitHandler = (data) => { + console.log(data); + const updatedData = getValues(); + setCurrentUserName(updatedData.userName); + setOpen(false); + enqueueSnackbar('Updated successfully!', { variant: 'success', autoHideDuration: 3000 }); + }; + + const handleDiscard = () => { + reset({ userName: currentUserName }); + setOpen(false); + }; + + return ( + + + + + + + + setOpen(false)} + handleDiscard={handleDiscard} + sx={{ + maxWidth: 463, + }} + > + + + + + + ); +}; + +export default UserName; diff --git a/apps/client/src/components/sections/account/touch-id/Biometrics.tsx b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx new file mode 100644 index 0000000..0a1b3c1 --- /dev/null +++ b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx @@ -0,0 +1,100 @@ +import { useState } from 'react'; +import { Box, Button, Stack, Typography } from '@mui/material'; +import IconifyIcon from 'components/base/IconifyIcon'; +import AccountDialog from '../common/AccountDialog'; +import InfoCard from '../common/InfoCard'; + +const Biometrics = () => { + const [open, setOpen] = useState(false); + + return ( + <> + + + Manage Touch ID Features + + + {Array.from({ length: 3 }).map((_, index) => ( + + + + + Fingerprint {index + 1} + + + + + ))} + + + + setOpen(false)} + title="Add Fingerprint" + subtitle="Touch ID enrollment was interrupted" + handleDiscard={() => setOpen(false)} + handleConfirm={() => setOpen(false)} + sx={{ width: 1 }} + > + + + + + + Your fingerprint can be used to unlock your account + + + + + ); +}; + +export default Biometrics; diff --git a/apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx b/apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx new file mode 100644 index 0000000..3b74cfe --- /dev/null +++ b/apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx @@ -0,0 +1,39 @@ +import { FormControl, FormControlLabel, Stack, Switch, Typography } from '@mui/material'; + +const TouchIdFeatures = () => { + return ( + + + + Manage Touch ID Features + + } + label="Use Touch ID to unlock your login page" + sx={{ gap: 2, ml: 0 }} + /> + } + label="Use Touch ID for online payment" + sx={{ gap: 2, ml: 0 }} + /> + } + label="Use Touch ID for Autofilling passwords" + sx={{ gap: 2, ml: 0 }} + /> + } + label="Use Touch ID for fast user switching" + sx={{ gap: 2, ml: 0 }} + /> + + + ); +}; + +export default TouchIdFeatures; diff --git a/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx b/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx new file mode 100644 index 0000000..f1c5a8a --- /dev/null +++ b/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx @@ -0,0 +1,27 @@ +import { Divider, Stack } from '@mui/material'; +import AccountTabPanelSection from '../common/AccountTabPanelSection'; +import Biometrics from './Biometrics'; +import TouchIdFeatures from './TouchIdFeatures'; + +const TouchIDTabPanel = () => { + return ( + } spacing={5}> + + + + + + + + ); +}; + +export default TouchIDTabPanel; diff --git a/apps/client/src/data/account/account-tabs.tsx b/apps/client/src/data/account/account-tabs.tsx new file mode 100644 index 0000000..88a3c95 --- /dev/null +++ b/apps/client/src/data/account/account-tabs.tsx @@ -0,0 +1,24 @@ +import { AccountTab } from 'types/accounts'; +import PersonalInfoTabPanel from 'components/sections/account/personal-info/PersonalInfoTabPanel'; +import TouchIDTabPanel from 'components/sections/account/touch-id/TouchIdTabPanel'; + +export const accountTabs: AccountTab[] = [ + { + id: 1, + label: 'Personal Information', + title: 'Personal Info', + value: 'personal_information', + icon: 'material-symbols:person-outline', + panelIcon: 'material-symbols:person-outline', + tabPanel: , + }, + { + id: 12, + label: 'Fingerprint Access Setup', + title: 'Fingerprint Access Setup', + value: 'touch_id', + icon: 'material-symbols:touch-app-outline', + panelIcon: 'material-symbols:touch-app-outline', + tabPanel: , + }, +]; diff --git a/apps/client/src/data/account/personal-info.ts b/apps/client/src/data/account/personal-info.ts new file mode 100644 index 0000000..47e85c6 --- /dev/null +++ b/apps/client/src/data/account/personal-info.ts @@ -0,0 +1,16 @@ +import { PersonalInfo } from 'types/accounts'; + +export const personalInfoData: PersonalInfo = { + firstName: 'Luke', + lastName: 'Skywalker', + userName: 'LukeSkywalker212', + birthDate: '2004-06-03', + country: 'United States', + state: 'Pennsylvania', + city: 'Essington', + street: '500 Powhattan Ave', + zip: '19029', + phoneNumber: '(+880)1795448106', + primaryEmail: 'something@email.com', + secondaryEmail: 'something.alternate@email.com', +}; diff --git a/apps/client/src/data/account/shipping-billing-address.ts b/apps/client/src/data/account/shipping-billing-address.ts new file mode 100644 index 0000000..a988702 --- /dev/null +++ b/apps/client/src/data/account/shipping-billing-address.ts @@ -0,0 +1,25 @@ +import { AddressInfo } from 'types/accounts'; + +export const shippingAddressData: AddressInfo = { + name: 'Tsamina Mina', + phoneNumber: '+8801234567890', + emailAddress: 'tsaminamina@gmail.com', + country: 'United States', + state: 'Pennsylvania', + city: 'Essington', + street: '500 Powhattan Ave', + zip: '19029', + addressType: 'Office', +}; + +export const billingAddressData: AddressInfo = { + name: 'Megumi Fushigoro', + phoneNumber: '+8800987654321', + emailAddress: 'megumifushigoro@gmail.com', + country: 'United Kingdom', + state: 'London', + city: 'Birmingham', + street: '200 Street', + zip: '12222', + addressType: 'Office', +}; diff --git a/apps/client/src/data/account/storage.ts b/apps/client/src/data/account/storage.ts new file mode 100644 index 0000000..29105f3 --- /dev/null +++ b/apps/client/src/data/account/storage.ts @@ -0,0 +1,62 @@ +import { Storage, BackupSyncSettings } from 'types/accounts'; + +export const backupSyncSettings: BackupSyncSettings[] = [ + { name: 'Photos', enabled: true }, + { name: 'Email', enabled: false }, + { name: 'Contacts', enabled: true }, + { name: 'Videos', enabled: true }, + { name: 'Chats', enabled: true }, + { name: 'Calendar', enabled: false }, + { name: 'Notes', enabled: false }, + { name: 'Passwords', enabled: true }, + { name: 'Map', enabled: false }, +]; + +export const storageData: Storage = { + totalSpaceinKb: 20971520, + totalSpaceUsedinKb: 19115540.48, + categories: [ + { + name: 'Photos', + icon: 'material-symbols:imagesmode-outline', + color: 'info.main', + fileCount: 580, + spaceUsedinKb: 6920601.6, + }, + { + name: 'Videos', + icon: 'material-symbols:video-file-outline-rounded', + color: 'primary.main', + fileCount: 32, + spaceUsedinKb: 3355443.2, + }, + { + name: 'Documents', + icon: 'material-symbols:description-outline-rounded', + color: 'warning.main', + fileCount: 580, + spaceUsedinKb: 3879731.2, + }, + { + name: 'Email', + icon: 'material-symbols:mail-outline-rounded', + color: 'success.main', + fileCount: 356, + spaceUsedinKb: 1887436.8, + }, + { + name: 'Chats', + icon: 'material-symbols:chat-outline-rounded', + color: 'error.main', + fileCount: 39, + spaceUsedinKb: 524288, + }, + { + name: 'Others', + icon: 'material-symbols:article-outline-rounded', + color: 'grey.500', + fileCount: 948, + spaceUsedinKb: 2202009.6, + }, + ], +}; diff --git a/apps/client/src/data/account/user-permissions.tsx b/apps/client/src/data/account/user-permissions.tsx new file mode 100644 index 0000000..37aa96d --- /dev/null +++ b/apps/client/src/data/account/user-permissions.tsx @@ -0,0 +1,46 @@ +import { Stack, Typography } from '@mui/material'; +import { Permission } from 'types/accounts'; + +export const globalPermissions: Permission[] = [ + { + name: 'administrator', + checked: false, + label: ( + + + Administrator + + + Has full access but can't transfer ownership + + + ), + }, + { + name: 'billing', + checked: false, + label: ( + + + Billing + + + Users can modify plans, but domains and Google Workspace are excluded. + + + ), + }, +]; + +export const userPermissions: Permission[] = [ + { + name: 'deleteAccount', + checked: false, + label: 'Permit Users to Delete Their Accounts', + }, + { + name: 'createOrganizatio', + checked: true, + label: 'Enable Users to Create Organizations', + }, +]; diff --git a/apps/client/src/data/account/work-education-history.ts b/apps/client/src/data/account/work-education-history.ts new file mode 100644 index 0000000..5dde515 --- /dev/null +++ b/apps/client/src/data/account/work-education-history.ts @@ -0,0 +1,59 @@ +import harvardLogo from 'assets/images/logo/harvard_logo.webp'; +import mailblusterLogo from 'assets/images/logo/mailbluster_logo.webp'; +import ndcLogo from 'assets/images/logo/ndc_logo.webp'; +import technextLogo from 'assets/images/logo/technext_logo.webp'; +import themewagonLogo from 'assets/images/logo/themewagon_logo.webp'; +import { EducationHistory, WorkHistory } from 'types/accounts'; + +export const workHistory: WorkHistory[] = [ + { + id: 1, + companyName: 'ThemeWagon Inc.', + companyLogo: themewagonLogo, + designation: 'UX/UI Designer', + location: 'Dhaka, Bangladesh', + startDate: '2023-12-01', + currentlyWorking: true, + }, + { + id: 2, + companyName: 'MailBluster Inc.', + companyLogo: mailblusterLogo, + designation: 'Jr. UX/UI Designer', + location: 'Dhaka, Bangladesh', + startDate: '2022-04-01', + endDate: '2023-11-01', + currentlyWorking: false, + }, + { + id: 3, + companyName: 'TechNext Ltd.', + companyLogo: technextLogo, + designation: 'Intern', + location: 'Dhaka, Bangladesh', + startDate: '2021-04-01', + endDate: '2022-03-01', + currentlyWorking: false, + }, +]; + +export const educationHistory: EducationHistory[] = [ + { + id: 1, + institutionName: 'Harvard University', + institutionLogo: harvardLogo, + subject: 'Human Interaction Design', + location: 'Sylhet, Bangladesh', + startDate: '2014-01-01', + endDate: '2019-12-01', + }, + { + id: 2, + institutionName: 'Notre Dame College', + institutionLogo: ndcLogo, + subject: '', + location: 'Dhaka, Bangladesh', + startDate: '2012-01-01', + endDate: '2013-12-01', + }, +]; diff --git a/apps/client/src/data/countries.ts b/apps/client/src/data/countries.ts new file mode 100644 index 0000000..993a915 --- /dev/null +++ b/apps/client/src/data/countries.ts @@ -0,0 +1,634 @@ +import { Country } from 'types/countries'; + +export const countries: Country[] = [ + { code: 'AD', label: 'Andorra', phone: '376', flag: 'flag:ad-4x3' }, + { + code: 'AE', + label: 'United Arab Emirates', + phone: '971', + flag: 'flag:ae-4x3', + }, + { + code: 'AF', + label: 'Afghanistan', + phone: '93', + flag: 'flag:af-4x3', + }, + { + code: 'AG', + label: 'Antigua and Barbuda', + phone: '268', + flag: 'flag:ag-4x3', + }, + { code: 'AI', label: 'Anguilla', phone: '264', flag: 'flag:ai-4x3' }, + { code: 'AL', label: 'Albania', phone: '355', flag: 'flag:al-4x3' }, + { code: 'AM', label: 'Armenia', phone: '374', flag: 'flag:am-4x3' }, + { code: 'AO', label: 'Angola', phone: '244', flag: 'flag:ao-4x3' }, + { + code: 'AQ', + label: 'Antarctica', + phone: '672', + flag: 'flag:aq-4x3', + }, + { code: 'AR', label: 'Argentina', phone: '54', flag: 'flag:ar-4x3' }, + { + code: 'AS', + label: 'American Samoa', + phone: '684', + flag: 'flag:as-4x3', + }, + { code: 'AT', label: 'Austria', phone: '43', flag: 'flag:at-4x3' }, + { code: 'AU', label: 'Australia', phone: '61', flag: 'flag:au-4x3' }, + { code: 'AW', label: 'Aruba', phone: '297', flag: 'flag:aw-4x3' }, + { + code: 'AX', + label: 'Alland Islands', + phone: '358', + flag: 'flag:ax-4x3', + }, + { + code: 'AZ', + label: 'Azerbaijan', + phone: '994', + flag: 'flag:az-4x3', + }, + { + code: 'BA', + label: 'Bosnia and Herzegovina', + phone: '387', + flag: 'flag:ba-4x3', + }, + { code: 'BB', label: 'Barbados', phone: '246', flag: 'flag:bb-4x3' }, + { + code: 'BD', + label: 'Bangladesh', + phone: '880', + flag: 'flag:bd-4x3', + }, + { code: 'BE', label: 'Belgium', phone: '32', flag: 'flag:be-4x3' }, + { + code: 'BF', + label: 'Burkina Faso', + phone: '226', + flag: 'flag:bf-4x3', + }, + { code: 'BG', label: 'Bulgaria', phone: '359', flag: 'flag:bg-4x3' }, + { code: 'BH', label: 'Bahrain', phone: '973', flag: 'flag:bh-4x3' }, + { code: 'BI', label: 'Burundi', phone: '257', flag: 'flag:bi-4x3' }, + { code: 'BJ', label: 'Benin', phone: '229', flag: 'flag:bj-4x3' }, + { + code: 'BL', + label: 'Saint Barthelemy', + phone: '590', + flag: 'flag:bl-4x3', + }, + { code: 'BM', label: 'Bermuda', phone: '441', flag: 'flag:bm-4x3' }, + { + code: 'BN', + label: 'Brunei Darussalam', + phone: '673', + flag: 'flag:bn-4x3', + }, + { code: 'BO', label: 'Bolivia', phone: '591', flag: 'flag:bo-4x3' }, + { code: 'BR', label: 'Brazil', phone: '55', flag: 'flag:br-4x3' }, + { code: 'BS', label: 'Bahamas', phone: '242', flag: 'flag:bs-4x3' }, + { code: 'BT', label: 'Bhutan', phone: '975', flag: 'flag:bt-4x3' }, + { + code: 'BV', + label: 'Bouvet Island', + phone: '47', + flag: 'flag:bv-4x3', + }, + { code: 'BW', label: 'Botswana', phone: '267', flag: 'flag:bw-4x3' }, + { code: 'BY', label: 'Belarus', phone: '375', flag: 'flag:by-4x3' }, + { code: 'BZ', label: 'Belize', phone: '501', flag: 'flag:bz-4x3' }, + { code: 'CA', label: 'Canada', phone: '1', flag: 'flag:ca-4x3' }, + { + code: 'CD', + label: 'Congo, Democratic Republic of the', + phone: '243', + flag: 'flag:cd-4x3', + }, + { + code: 'CF', + label: 'Central African Republic', + phone: '236', + flag: 'flag:cf-4x3', + }, + { + code: 'CH', + label: 'Switzerland', + phone: '41', + flag: 'flag:ch-4x3', + }, + { + code: 'CI', + label: "Cote d'Ivoire", + phone: '225', + flag: 'flag:ci-4x3', + }, + { + code: 'CK', + label: 'Cook Islands', + phone: '682', + flag: 'flag:ck-4x3', + }, + { code: 'CL', label: 'Chile', phone: '56', flag: 'flag:cl-4x3' }, + { code: 'CM', label: 'Cameroon', phone: '237', flag: 'flag:cm-4x3' }, + { code: 'CN', label: 'China', phone: '86', flag: 'flag:cn-4x3' }, + { code: 'CO', label: 'Colombia', phone: '57', flag: 'flag:co-4x3' }, + { + code: 'CR', + label: 'Costa Rica', + phone: '506', + flag: 'flag:cr-4x3', + }, + { code: 'CU', label: 'Cuba', phone: '53', flag: 'flag:cu-4x3' }, + { + code: 'CV', + label: 'Cape Verde', + phone: '238', + flag: 'flag:cv-4x3', + }, + { code: 'CW', label: 'Curacao', phone: '599', flag: 'flag:cw-4x3' }, + { code: 'CY', label: 'Cyprus', phone: '357', flag: 'flag:cy-4x3' }, + { + code: 'CZ', + label: 'Czech Republic', + phone: '420', + flag: 'flag:cz-4x3', + }, + { code: 'DE', label: 'Germany', phone: '49', flag: 'flag:de-4x3' }, + { code: 'DJ', label: 'Djibouti', phone: '253', flag: 'flag:dj-4x3' }, + { code: 'DK', label: 'Denmark', phone: '45', flag: 'flag:dk-4x3' }, + { code: 'DM', label: 'Dominica', phone: '767', flag: 'flag:dm-4x3' }, + { + code: 'DO', + label: 'Dominican Republic', + phone: '809', + flag: 'flag:do-4x3', + }, + { code: 'DZ', label: 'Algeria', phone: '213', flag: 'flag:dz-4x3' }, + { code: 'EC', label: 'Ecuador', phone: '593', flag: 'flag:ec-4x3' }, + { code: 'EE', label: 'Estonia', phone: '372', flag: 'flag:ee-4x3' }, + { code: 'EG', label: 'Egypt', phone: '20', flag: 'flag:eg-4x3' }, + { + code: 'EH', + label: 'Western Sahara', + phone: '212', + flag: 'flag:eh-4x3', + }, + { code: 'ER', label: 'Eritrea', phone: '291', flag: 'flag:er-4x3' }, + { code: 'ES', label: 'Spain', phone: '34', flag: 'flag:es-4x3' }, + { code: 'ET', label: 'Ethiopia', phone: '251', flag: 'flag:et-4x3' }, + { code: 'FJ', label: 'Fiji', phone: '679', flag: 'flag:fj-4x3' }, + { + code: 'FK', + label: 'Falkland Islands (Malvinas)', + phone: '500', + flag: 'flag:fk-4x3', + }, + { + code: 'FM', + label: 'Micronesia, Federated States of', + phone: '691', + flag: 'flag:fm-4x3', + }, + { + code: 'FO', + label: 'Faroe Islands', + phone: '298', + flag: 'flag:fo-4x3', + }, + { code: 'FR', label: 'France', phone: '33', flag: 'flag:fr-4x3' }, + { code: 'GA', label: 'Gabon', phone: '241', flag: 'flag:ga-4x3' }, + { + code: 'GB', + label: 'United Kingdom', + phone: '44', + flag: 'flag:gb-4x3', + }, + { code: 'GD', label: 'Grenada', phone: '473', flag: 'flag:gd-4x3' }, + { code: 'GE', label: 'Georgia', phone: '995', flag: 'flag:ge-4x3' }, + { + code: 'GF', + label: 'French Guiana', + phone: '594', + flag: 'flag:gf-4x3', + }, + { code: 'GH', label: 'Ghana', phone: '233', flag: 'flag:gh-4x3' }, + { code: 'GI', label: 'Gibraltar', phone: '350', flag: 'flag:gi-4x3' }, + { code: 'GL', label: 'Greenland', phone: '299', flag: 'flag:gl-4x3' }, + { code: 'GM', label: 'Gambia', phone: '220', flag: 'flag:gm-4x3' }, + { code: 'GN', label: 'Guinea', phone: '224', flag: 'flag:gn-4x3' }, + { + code: 'GQ', + label: 'Equatorial Guinea', + phone: '240', + flag: 'flag:gq-4x3', + }, + { code: 'GR', label: 'Greece', phone: '30', flag: 'flag:gr-4x3' }, + { code: 'GT', label: 'Guatemala', phone: '502', flag: 'flag:gt-4x3' }, + { code: 'GU', label: 'Guam', phone: '671', flag: 'flag:gu-4x3' }, + { + code: 'GW', + label: 'Guinea-Bissau', + phone: '245', + flag: 'flag:gw-4x3', + }, + { code: 'GY', label: 'Guyana', phone: '592', flag: 'flag:gy-4x3' }, + { code: 'HK', label: 'Hong Kong', phone: '852', flag: 'flag:hk-4x3' }, + { code: 'HN', label: 'Honduras', phone: '504', flag: 'flag:hn-4x3' }, + { code: 'HR', label: 'Croatia', phone: '385', flag: 'flag:hr-4x3' }, + { code: 'HT', label: 'Haiti', phone: '509', flag: 'flag:ht-4x3' }, + { code: 'HU', label: 'Hungary', phone: '36', flag: 'flag:hu-4x3' }, + { code: 'ID', label: 'Indonesia', phone: '62', flag: 'flag:id-4x3' }, + { code: 'IE', label: 'Ireland', phone: '353', flag: 'flag:ie-4x3' }, + { code: 'IL', label: 'Israel', phone: '972', flag: 'flag:il-4x3' }, + { code: 'IN', label: 'India', phone: '91', flag: 'flag:in-4x3' }, + { code: 'IQ', label: 'Iraq', phone: '964', flag: 'flag:iq-4x3' }, + { + code: 'IR', + label: 'Iran, Islamic Republic of', + phone: '98', + flag: 'flag:ir-4x3', + }, + { code: 'IS', label: 'Iceland', phone: '354', flag: 'flag:is-4x3' }, + { code: 'IT', label: 'Italy', phone: '39', flag: 'flag:it-4x3' }, + { code: 'JM', label: 'Jamaica', phone: '876', flag: 'flag:jm-4x3' }, + { code: 'JO', label: 'Jordan', phone: '962', flag: 'flag:jo-4x3' }, + { code: 'JP', label: 'Japan', phone: '81', flag: 'flag:jp-4x3' }, + { code: 'KE', label: 'Kenya', phone: '254', flag: 'flag:ke-4x3' }, + { + code: 'KG', + label: 'Kyrgyzstan', + phone: '996', + flag: 'flag:kg-4x3', + }, + { code: 'KH', label: 'Cambodia', phone: '855', flag: 'flag:kh-4x3' }, + { code: 'KI', label: 'Kiribati', phone: '686', flag: 'flag:ki-4x3' }, + { code: 'KM', label: 'Comoros', phone: '269', flag: 'flag:km-4x3' }, + { + code: 'KN', + label: 'Saint Kitts and Nevis', + phone: '869', + flag: 'flag:kn-4x3', + }, + { + code: 'KP', + label: "Korea, Democratic People's Republic of", + phone: '850', + flag: 'flag:kp-4x3', + }, + { + code: 'KR', + label: 'Korea, Republic of', + phone: '82', + flag: 'flag:kr-4x3', + }, + { code: 'KW', label: 'Kuwait', phone: '965', flag: 'flag:kw-4x3' }, + { + code: 'KY', + label: 'Cayman Islands', + phone: '345', + flag: 'flag:ky-4x3', + }, + { code: 'KZ', label: 'Kazakhstan', phone: '7', flag: 'flag:kz-4x3' }, + { + code: 'LA', + label: "Lao People's Democratic Republic", + phone: '856', + flag: 'flag:la-4x3', + }, + { code: 'LB', label: 'Lebanon', phone: '961', flag: 'flag:lb-4x3' }, + { + code: 'LC', + label: 'Saint Lucia', + phone: '758', + flag: 'flag:lc-4x3', + }, + { + code: 'LI', + label: 'Liechtenstein', + phone: '423', + flag: 'flag:li-4x3', + }, + { code: 'LK', label: 'Sri Lanka', phone: '94', flag: 'flag:lk-4x3' }, + { code: 'LR', label: 'Liberia', phone: '231', flag: 'flag:lr-4x3' }, + { code: 'LS', label: 'Lesotho', phone: '266', flag: 'flag:ls-4x3' }, + { code: 'LT', label: 'Lithuania', phone: '370', flag: 'flag:lt-4x3' }, + { + code: 'LU', + label: 'Luxembourg', + phone: '352', + flag: 'flag:lu-4x3', + }, + { code: 'LV', label: 'Latvia', phone: '371', flag: 'flag:lv-4x3' }, + { code: 'LY', label: 'Libya', phone: '218', flag: 'flag:ly-4x3' }, + { code: 'MC', label: 'Monaco', phone: '377', flag: 'flag:mc-4x3' }, + { + code: 'MD', + label: 'Moldova, Republic of', + phone: '373', + flag: 'flag:md-4x3', + }, + { + code: 'ME', + label: 'Montenegro', + phone: '382', + flag: 'flag:me-4x3', + }, + { + code: 'MG', + label: 'Madagascar', + phone: '261', + flag: 'flag:mg-4x3', + }, + { + code: 'MH', + label: 'Marshall Islands', + phone: '692', + flag: 'flag:mh-4x3', + }, + { + code: 'MK', + label: 'Macedonia, the Former Yugoslav Republic of', + phone: '389', + flag: 'flag:mk-4x3', + }, + { code: 'ML', label: 'Mali', phone: '223', flag: 'flag:ml-4x3' }, + { code: 'MM', label: 'Myanmar', phone: '95', flag: 'flag:mm-4x3' }, + { code: 'MN', label: 'Mongolia', phone: '976', flag: 'flag:mn-4x3' }, + { code: 'MO', label: 'Macao', phone: '853', flag: 'flag:mo-4x3' }, + { + code: 'MP', + label: 'Northern Mariana Islands', + phone: '670', + flag: 'flag:mp-4x3', + }, + { + code: 'MQ', + label: 'Martinique', + phone: '596', + flag: 'flag:mq-4x3', + }, + { + code: 'MR', + label: 'Mauritania', + phone: '222', + flag: 'flag:mr-4x3', + }, + { + code: 'MS', + label: 'Montserrat', + phone: '664', + flag: 'flag:ms-4x3', + }, + { code: 'MT', label: 'Malta', phone: '356', flag: 'flag:mt-4x3' }, + { code: 'MU', label: 'Mauritius', phone: '230', flag: 'flag:mu-4x3' }, + { code: 'MV', label: 'Maldives', phone: '960', flag: 'flag:mv-4x3' }, + { code: 'MW', label: 'Malawi', phone: '265', flag: 'flag:mw-4x3' }, + { code: 'MX', label: 'Mexico', phone: '52', flag: 'flag:mx-4x3' }, + { code: 'MY', label: 'Malaysia', phone: '60', flag: 'flag:my-4x3' }, + { + code: 'MZ', + label: 'Mozambique', + phone: '258', + flag: 'flag:mz-4x3', + }, + { + code: 'NC', + label: 'New Caledonia', + phone: '687', + flag: 'flag:nc-4x3', + }, + { code: 'NE', label: 'Niger', phone: '227', flag: 'flag:ne-4x3' }, + { code: 'NG', label: 'Nigeria', phone: '234', flag: 'flag:ng-4x3' }, + { code: 'NI', label: 'Nicaragua', phone: '505', flag: 'flag:ni-4x3' }, + { + code: 'NL', + label: 'Netherlands', + phone: '31', + flag: 'flag:nl-4x3', + }, + { code: 'NP', label: 'Nepal', phone: '977', flag: 'flag:np-4x3' }, + { code: 'NR', label: 'Nauru', phone: '674', flag: 'flag:nr-4x3' }, + { code: 'NU', label: 'Niue', phone: '683', flag: 'flag:nu-4x3' }, + { + code: 'NZ', + label: 'New Zealand', + phone: '64', + flag: 'flag:nz-4x3', + }, + { code: 'OM', label: 'Oman', phone: '968', flag: 'flag:om-4x3' }, + { code: 'PA', label: 'Panama', phone: '507', flag: 'flag:pa-4x3' }, + { code: 'PE', label: 'Peru', phone: '51', flag: 'flag:pe-4x3' }, + { + code: 'PF', + label: 'French Polynesia', + phone: '689', + flag: 'flag:pf-4x3', + }, + { + code: 'PG', + label: 'Papua New Guinea', + phone: '675', + flag: 'flag:pg-4x3', + }, + { + code: 'PH', + label: 'Philippines', + phone: '63', + flag: 'flag:ph-4x3', + }, + { code: 'PK', label: 'Pakistan', phone: '92', flag: 'flag:pk-4x3' }, + { code: 'PL', label: 'Poland', phone: '48', flag: 'flag:pl-4x3' }, + { + code: 'PM', + label: 'Saint Pierre and Miquelon', + phone: '508', + flag: 'flag:pm-4x3', + }, + { code: 'PN', label: 'Pitcairn', phone: '870', flag: 'flag:pn-4x3' }, + { + code: 'PS', + label: 'Palestine, State of', + phone: '970', + flag: 'flag:ps-4x3', + }, + { code: 'PT', label: 'Portugal', phone: '351', flag: 'flag:pt-4x3' }, + { code: 'PW', label: 'Palau', phone: '680', flag: 'flag:pw-4x3' }, + { code: 'PY', label: 'Paraguay', phone: '595', flag: 'flag:py-4x3' }, + { code: 'QA', label: 'Qatar', phone: '974', flag: 'flag:qa-4x3' }, + { code: 'RE', label: 'Reunion', phone: '262', flag: 'flag:re-4x3' }, + { code: 'RO', label: 'Romania', phone: '40', flag: 'flag:ro-4x3' }, + { code: 'RS', label: 'Serbia', phone: '381', flag: 'flag:rs-4x3' }, + { code: 'RW', label: 'Rwanda', phone: '250', flag: 'flag:rw-4x3' }, + { + code: 'SA', + label: 'Saudi Arabia', + phone: '966', + flag: 'flag:sa-4x3', + }, + { + code: 'SB', + label: 'Solomon Islands', + phone: '677', + flag: 'flag:sb-4x3', + }, + { + code: 'SC', + label: 'Seychelles', + phone: '248', + flag: 'flag:sc-4x3', + }, + { code: 'SD', label: 'Sudan', phone: '249', flag: 'flag:sd-4x3' }, + { code: 'SE', label: 'Sweden', phone: '46', flag: 'flag:se-4x3' }, + { code: 'SG', label: 'Singapore', phone: '65', flag: 'flag:sg-4x3' }, + { + code: 'SH', + label: 'Saint Helena', + phone: '290', + flag: 'flag:sh-4x3', + }, + { code: 'SI', label: 'Slovenia', phone: '386', flag: 'flag:si-4x3' }, + { code: 'SK', label: 'Slovakia', phone: '421', flag: 'flag:sk-4x3' }, + { + code: 'SL', + label: 'Sierra Leone', + phone: '232', + flag: 'flag:sl-4x3', + }, + { + code: 'SM', + label: 'San Marino', + phone: '378', + flag: 'flag:sm-4x3', + }, + { code: 'SN', label: 'Senegal', phone: '221', flag: 'flag:sn-4x3' }, + { code: 'SO', label: 'Somalia', phone: '252', flag: 'flag:so-4x3' }, + { code: 'SR', label: 'Suriname', phone: '597', flag: 'flag:sr-4x3' }, + { + code: 'SS', + label: 'South Sudan', + phone: '211', + flag: 'flag:ss-4x3', + }, + { + code: 'ST', + label: 'Sao Tome and Principe', + phone: '239', + flag: 'flag:st-4x3', + }, + { + code: 'SV', + label: 'El Salvador', + phone: '503', + flag: 'flag:sv-4x3', + }, + { + code: 'SX', + label: 'Sint Maarten (Dutch part)', + phone: '721', + flag: 'flag:sx-4x3', + }, + { + code: 'SY', + label: 'Syrian Arab Republic', + phone: '963', + flag: 'flag:sy-4x3', + }, + { + code: 'TC', + label: 'Turks and Caicos Islands', + phone: '649', + flag: 'flag:tc-4x3', + }, + { code: 'TD', label: 'Chad', phone: '235', flag: 'flag:td-4x3' }, + { code: 'TG', label: 'Togo', phone: '228', flag: 'flag:tg-4x3' }, + { code: 'TH', label: 'Thailand', phone: '66', flag: 'flag:th-4x3' }, + { + code: 'TJ', + label: 'Tajikistan', + phone: '992', + flag: 'flag:tj-4x3', + }, + { code: 'TK', label: 'Tokelau', phone: '690', flag: 'flag:tk-4x3' }, + { + code: 'TM', + label: 'Turkmenistan', + phone: '993', + flag: 'flag:tm-4x3', + }, + { code: 'TN', label: 'Tunisia', phone: '216', flag: 'flag:tn-4x3' }, + { code: 'TO', label: 'Tonga', phone: '676', flag: 'flag:to-4x3' }, + { code: 'TR', label: 'Turkey', phone: '90', flag: 'flag:tr-4x3' }, + { + code: 'TT', + label: 'Trinidad and Tobago', + phone: '868', + flag: 'flag:tt-4x3', + }, + { code: 'TV', label: 'Tuvalu', phone: '688', flag: 'flag:tv-4x3' }, + { code: 'TW', label: 'Taiwan', phone: '886', flag: 'flag:tw-4x3' }, + { + code: 'TZ', + label: 'United Republic of Tanzania', + phone: '255', + flag: 'flag:tz-4x3', + }, + { code: 'UA', label: 'Ukraine', phone: '380', flag: 'flag:ua-4x3' }, + { code: 'UG', label: 'Uganda', phone: '256', flag: 'flag:ug-4x3' }, + { code: 'US', label: 'United States', phone: '1', flag: 'flag:us-4x3' }, + { code: 'UY', label: 'Uruguay', phone: '598', flag: 'flag:uy-4x3' }, + { + code: 'UZ', + label: 'Uzbekistan', + phone: '998', + flag: 'flag:uz-4x3', + }, + { + code: 'VA', + label: 'Holy See (Vatican City State)', + phone: '379', + flag: 'flag:va-4x3', + }, + { + code: 'VC', + label: 'Saint Vincent and the Grenadines', + phone: '784', + flag: 'flag:vc-4x3', + }, + { code: 'VE', label: 'Venezuela', phone: '58', flag: 'flag:ve-4x3' }, + { + code: 'VG', + label: 'British Virgin Islands', + phone: '284', + flag: 'flag:vg-4x3', + }, + { + code: 'VI', + label: 'US Virgin Islands', + phone: '340', + flag: 'flag:vi-4x3', + }, + { code: 'VN', label: 'Vietnam', phone: '84', flag: 'flag:vn-4x3' }, + { code: 'VU', label: 'Vanuatu', phone: '678', flag: 'flag:vu-4x3' }, + { + code: 'WF', + label: 'Wallis and Futuna', + phone: '681', + flag: 'flag:wf-4x3', + }, + { code: 'WS', label: 'Samoa', phone: '685', flag: 'flag:ws-4x3' }, + { code: 'XK', label: 'Kosovo', phone: '383', flag: 'flag:xk-4x3' }, + { code: 'YE', label: 'Yemen', phone: '967', flag: 'flag:ye-4x3' }, + { + code: 'ZA', + label: 'South Africa', + phone: '27', + flag: 'flag:za-4x3', + }, + { code: 'ZM', label: 'Zambia', phone: '260', flag: 'flag:zm-4x3' }, + { code: 'ZW', label: 'Zimbabwe', phone: '263', flag: 'flag:zw-4x3' }, +]; diff --git a/apps/client/src/layouts/main-layout/MainLayout.tsx b/apps/client/src/layouts/main-layout/MainLayout.tsx index 732cca9..1af8445 100644 --- a/apps/client/src/layouts/main-layout/MainLayout.tsx +++ b/apps/client/src/layouts/main-layout/MainLayout.tsx @@ -1,24 +1,24 @@ -"use client"; +'use client'; -import { Drawer, drawerClasses } from "@mui/material"; -import Box from "@mui/material/Box"; -import Toolbar, { ToolbarOwnProps } from "@mui/material/Toolbar"; -import clsx from "clsx"; -import VibrantBackground from "components/common/VibrantBackground"; -import AppBar from "layouts/main-layout/app-bar"; -import Sidenav from "layouts/main-layout/sidenav"; -import { mainDrawerWidth } from "lib/constants"; -import { useSettingsContext } from "providers/SettingsProvider"; -import { PropsWithChildren, useMemo } from "react"; -import { sidenavVibrantStyle } from "theme/styles/vibrantNav"; -import NavProvider from "./NavProvider"; -import Footer from "./footer"; -import SidenavDrawerContent from "./sidenav/SidenavDrawerContent"; -import SlimSidenav from "./sidenav/SlimSidenav"; -import StackedSidenav from "./sidenav/StackedSidenav"; -import Topnav from "./topnav"; -import TopNavStacked from "./topnav/TopNavStacked"; -import TopnavSlim from "./topnav/TopnavSlim"; +import { PropsWithChildren, useMemo } from 'react'; +import { Drawer, drawerClasses } from '@mui/material'; +import Box from '@mui/material/Box'; +import Toolbar, { ToolbarOwnProps } from '@mui/material/Toolbar'; +import clsx from 'clsx'; +import AppBar from 'layouts/main-layout/app-bar'; +import Sidenav from 'layouts/main-layout/sidenav'; +import { mainDrawerWidth } from 'lib/constants'; +import { useSettingsContext } from 'providers/SettingsProvider'; +import { sidenavVibrantStyle } from 'theme/styles/vibrantNav'; +import VibrantBackground from 'components/common/VibrantBackground'; +import NavProvider from './NavProvider'; +import Footer from './footer'; +import SidenavDrawerContent from './sidenav/SidenavDrawerContent'; +import SlimSidenav from './sidenav/SlimSidenav'; +import StackedSidenav from './sidenav/StackedSidenav'; +import Topnav from './topnav'; +import TopNavStacked from './topnav/TopNavStacked'; +import TopnavSlim from './topnav/TopnavSlim'; const MainLayout = ({ children }: PropsWithChildren) => { const { @@ -39,48 +39,47 @@ const MainLayout = ({ children }: PropsWithChildren) => { }); }; - const toolbarVarint: ToolbarOwnProps["variant"] = useMemo(() => { - if (navigationMenuType !== "sidenav") { - if (topnavType === "slim") { - return "appbarSlim"; + const toolbarVarint: ToolbarOwnProps['variant'] = useMemo(() => { + if (navigationMenuType !== 'sidenav') { + if (topnavType === 'slim') { + return 'appbarSlim'; } - if (topnavType === "stacked") { - return "appbarStacked"; + if (topnavType === 'stacked') { + return 'appbarStacked'; } } - return "appbar"; + return 'appbar'; }, [navigationMenuType, topnavType]); return ( + sx={{ display: 'flex', zIndex: 1, position: 'relative' }} + > - {navigationMenuType === "sidenav" && } + {navigationMenuType === 'sidenav' && } - {(navigationMenuType === "sidenav" || - navigationMenuType === "combo") && ( + {(navigationMenuType === 'sidenav' || navigationMenuType === 'combo') && ( <> - {sidenavType === "default" && } - {sidenavType === "slim" && } - {sidenavType === "stacked" && } + {sidenavType === 'default' && } + {sidenavType === 'slim' && } + {sidenavType === 'stacked' && } )} - {(navigationMenuType === "topnav" || - navigationMenuType === "combo") && ( + {(navigationMenuType === 'topnav' || navigationMenuType === 'combo') && ( <> - {topnavType === "default" && } - {topnavType === "slim" && } - {topnavType === "stacked" && } + {topnavType === 'default' && } + {topnavType === 'slim' && } + {topnavType === 'stacked' && } )} { }} sx={[ { - display: { xs: "block", md: "none" }, + display: { xs: 'block', md: 'none' }, [`& .${drawerClasses.paper}`]: { pt: 3, - boxSizing: "border-box", + boxSizing: 'border-box', width: mainDrawerWidth.full, }, }, - navigationMenuType === "topnav" && { - display: { md: "block", lg: "none" }, + navigationMenuType === 'topnav' && { + display: { md: 'block', lg: 'none' }, }, - navColor === "vibrant" && sidenavVibrantStyle, - ]}> - {navColor === "vibrant" && } - + navColor === 'vibrant' && sidenavVibrantStyle, + ]} + > + {navColor === 'vibrant' && } + + ]} + > @@ -135,9 +136,10 @@ const MainLayout = ({ children }: PropsWithChildren) => { sx={[ { height: 1, - bgcolor: "background.default", + bgcolor: 'background.default', }, - ]}> + ]} + > {children} diff --git a/apps/client/src/layouts/main-layout/NavProvider.tsx b/apps/client/src/layouts/main-layout/NavProvider.tsx index 6a30d95..cf53ca4 100644 --- a/apps/client/src/layouts/main-layout/NavProvider.tsx +++ b/apps/client/src/layouts/main-layout/NavProvider.tsx @@ -16,6 +16,7 @@ import { mainDrawerWidth } from 'lib/constants'; import { useBreakpoints } from 'providers/BreakpointsProvider'; import { useSettingsContext } from 'providers/SettingsProvider'; import { COLLAPSE_NAVBAR, EXPAND_NAVBAR } from 'reducers/SettingsReducer'; +import paths from 'routes/paths'; import { SubMenuItem } from 'routes/sitemap'; interface NavContextInterface { @@ -47,6 +48,9 @@ const NavProvider = ({ children }: PropsWithChildren) => { } = useSettingsContext(); const isNestedItemOpen = (items: SubMenuItem[] = []) => { + if (pathname === paths.comingSoon) { + return false; + } const checkLink = (children: SubMenuItem) => { if ( `${children.path}` === pathname || diff --git a/apps/client/src/layouts/main-layout/common/ThemeToggler.tsx b/apps/client/src/layouts/main-layout/common/ThemeToggler.tsx index 5611645..1e1dc1f 100644 --- a/apps/client/src/layouts/main-layout/common/ThemeToggler.tsx +++ b/apps/client/src/layouts/main-layout/common/ThemeToggler.tsx @@ -1,6 +1,7 @@ 'use client'; import { useCallback, useRef } from 'react'; +import { usePathname, useRouter } from 'next/navigation'; import { Button } from '@mui/material'; import { useThemeMode } from 'hooks/useThemeMode'; import IconifyIcon from 'components/base/IconifyIcon'; @@ -12,12 +13,16 @@ interface ThemeTogglerProps { const ThemeToggler = ({ type = 'default' }: ThemeTogglerProps) => { const { isDark, setThemeMode } = useThemeMode(); const lastClickTimeRef = useRef(0); + const router = useRouter(); + const pathname = usePathname(); const icon = isDark ? `material-symbols${type === 'slim' ? '' : '-light'}:light-off-outline-rounded` : `material-symbols${type === 'slim' ? '' : '-light'}:lightbulb-outline-rounded`; const handleClick = useCallback(() => { + router.replace(pathname); + const now = Date.now(); if (now - lastClickTimeRef.current < 300) return; diff --git a/apps/client/src/layouts/main-layout/common/search-box/SearchResult.tsx b/apps/client/src/layouts/main-layout/common/search-box/SearchResult.tsx index 63501e8..ddd89df 100644 --- a/apps/client/src/layouts/main-layout/common/search-box/SearchResult.tsx +++ b/apps/client/src/layouts/main-layout/common/search-box/SearchResult.tsx @@ -24,7 +24,6 @@ import { } from '@mui/material'; import searchResult from 'data/search-result'; import IconifyIcon from 'components/base/IconifyIcon'; -import Image from 'components/base/Image'; import SearchTextField from './SearchTextField'; const SearchResult = ({ handleClose }: { handleClose: () => void }) => { @@ -193,7 +192,7 @@ const SearchResult = ({ handleClose }: { handleClose: () => void }) => { )} {file.image && ( - {file.name} + {file.name} )} diff --git a/apps/client/src/layouts/main-layout/sidenav/NavItem.tsx b/apps/client/src/layouts/main-layout/sidenav/NavItem.tsx index 559885d..387d324 100644 --- a/apps/client/src/layouts/main-layout/sidenav/NavItem.tsx +++ b/apps/client/src/layouts/main-layout/sidenav/NavItem.tsx @@ -15,6 +15,7 @@ import { cssVarRgba } from 'lib/utils'; import { useBreakpoints } from 'providers/BreakpointsProvider'; import { useSettingsContext } from 'providers/SettingsProvider'; import { COLLAPSE_NAVBAR } from 'reducers/SettingsReducer'; +import paths from 'routes/paths'; import { SubMenuItem } from 'routes/sitemap'; import IconifyIcon from 'components/base/IconifyIcon'; import { useNavContext } from '../NavProvider'; @@ -128,10 +129,11 @@ const NavItem = ({ item, level }: NavItemProps) => { onMouseLeave={sidenavCollapsed ? handleClose : undefined} aria-expanded={openPopperMenu} selected={ - pathname === item.path || - (item.selectionPrefix && pathname!.includes(item.selectionPrefix)) || - (sidenavCollapsed && sidenavType === 'default' && isNestedItemOpen(item.items)) || - (openItems[level] !== item.pathName && isNestedItemOpen(item.items)) + pathname !== paths.comingSoon && + (pathname === item.path || + (item.selectionPrefix && pathname!.includes(item.selectionPrefix)) || + (sidenavCollapsed && sidenavType === 'default' && isNestedItemOpen(item.items)) || + (openItems[level] !== item.pathName && isNestedItemOpen(item.items))) } sx={[ (theme) => ({ diff --git a/apps/client/src/layouts/main-layout/sidenav/SlimNavItem.tsx b/apps/client/src/layouts/main-layout/sidenav/SlimNavItem.tsx index 858226f..13e3c82 100644 --- a/apps/client/src/layouts/main-layout/sidenav/SlimNavItem.tsx +++ b/apps/client/src/layouts/main-layout/sidenav/SlimNavItem.tsx @@ -18,6 +18,7 @@ import List from '@mui/material/List'; import DocSearch from 'layouts/main-layout/sidenav/doc-search/DocSearch'; import { cssVarRgba } from 'lib/utils'; import { useSettingsContext } from 'providers/SettingsProvider'; +import paths from 'routes/paths'; import { SubMenuItem } from 'routes/sitemap'; import IconifyIcon from 'components/base/IconifyIcon'; import { useNavContext } from '../NavProvider'; @@ -75,9 +76,10 @@ const SlimNavItem = ({ item, level }: SlimNavItemProps) => { onClick={toggleCollapseItem} aria-expanded={openPopperMenu} selected={ - pathname === item.path || - (item.selectionPrefix && pathname!.includes(item.selectionPrefix)) || - isNestedItemOpen(item.items) + pathname !== paths.comingSoon && + (pathname === item.path || + (item.selectionPrefix && pathname!.includes(item.selectionPrefix)) || + isNestedItemOpen(item.items)) } sx={[ { @@ -133,7 +135,7 @@ const SlimNavItem = ({ item, level }: SlimNavItemProps) => { href={item.path} onClick={toggleCollapseItem} aria-expanded={openPopperMenu} - // selected={pathname === item.path} + selected={pathname !== paths.comingSoon && pathname === item.path} sx={[ { color: 'text.secondary', diff --git a/apps/client/src/layouts/main-layout/sidenav/StackedSidenav.tsx b/apps/client/src/layouts/main-layout/sidenav/StackedSidenav.tsx index ae94d76..463de16 100644 --- a/apps/client/src/layouts/main-layout/sidenav/StackedSidenav.tsx +++ b/apps/client/src/layouts/main-layout/sidenav/StackedSidenav.tsx @@ -1,6 +1,5 @@ 'use client'; - import { useEffect, useState } from 'react'; import { usePathname } from 'next/navigation'; import { @@ -45,8 +44,7 @@ const StackedSidenav = () => { const { currentBreakpoint } = useBreakpoints(); const { isDark } = useThemeMode(); - // const { data } = useSession(); - // const user = data?.user; + const user = null; const isMenuActive = (item: MenuItem) => { const checkLink = (subMenuItem: SubMenuItem) => { @@ -208,7 +206,7 @@ const StackedSidenav = () => { > @@ -219,7 +217,7 @@ const StackedSidenav = () => { textWrap: 'nowrap', }} > - {"USER NAME"} + name diff --git a/apps/client/src/layouts/main-layout/sidenav/index.tsx b/apps/client/src/layouts/main-layout/sidenav/index.tsx index 4fe5e6d..622fece 100644 --- a/apps/client/src/layouts/main-layout/sidenav/index.tsx +++ b/apps/client/src/layouts/main-layout/sidenav/index.tsx @@ -1,11 +1,21 @@ -import { Backdrop, useTheme } from '@mui/material'; +import { + Backdrop, + ListItem, + ListItemButton, + ListItemIcon, + ListItemText, + listItemTextClasses, + useTheme, +} from '@mui/material'; import Box from '@mui/material/Box'; +import Divider from '@mui/material/Divider'; import Drawer, { drawerClasses } from '@mui/material/Drawer'; +import Toolbar from '@mui/material/Toolbar'; import { useBreakpoints } from 'providers/BreakpointsProvider'; import { useSettingsContext } from 'providers/SettingsProvider'; import { sidenavVibrantStyle } from 'theme/styles/vibrantNav'; +import IconifyIcon from 'components/base/IconifyIcon'; import VibrantBackground from 'components/common/VibrantBackground'; -import SidenavCollapse from './SidenavCollapse'; import SidenavDrawerContent from './SidenavDrawerContent'; const Sidenav = () => { @@ -42,7 +52,6 @@ const Sidenav = () => { display: { xs: 'none', md: 'flex' }, flexDirection: 'column', [`& .${drawerClasses.paper}`]: { - overflow: 'visible', boxSizing: 'border-box', width: drawerWidth, border: 0, @@ -60,7 +69,71 @@ const Sidenav = () => { > {navColor === 'vibrant' && } - + + + + ({ + minWidth: 180, + flexDirection: 'row', + justifyContent: 'flex-start', + alignItems: 'center', + textAlign: 'left', + p: theme.spacing(0.75, 5.75), + })), + ]} + onClick={toggleNavbarCollapse} + > + + {sidenavCollapsed ? ( + + ) : ( + + )} + + + {!sidenavCollapsed && ( + + + {sidenavCollapsed ? 'Expand' : 'Collapse'} + + + )} + + + {currentBreakpoint === 'md' && ( diff --git a/apps/client/src/layouts/main-layout/topnav/NavItemPopover.tsx b/apps/client/src/layouts/main-layout/topnav/NavItemPopover.tsx index 92b345c..5f3b48a 100644 --- a/apps/client/src/layouts/main-layout/topnav/NavItemPopover.tsx +++ b/apps/client/src/layouts/main-layout/topnav/NavItemPopover.tsx @@ -11,6 +11,7 @@ import { Popover, popoverClasses, } from '@mui/material'; +import paths from 'routes/paths'; import { SubMenuItem } from 'routes/sitemap'; import IconifyIcon from 'components/base/IconifyIcon'; import { useNavContext } from '../NavProvider'; @@ -103,9 +104,10 @@ const NavitemPopover = ({ anchorEl, open, handleClose, items, level }: NavItemPo }, }} selected={ - pathname === item.path || - (item.selectionPrefix && pathname!.includes(item.selectionPrefix)) || - isNestedItemOpen(item.items) + pathname !== paths.comingSoon && + (pathname === item.path || + (item.selectionPrefix && pathname!.includes(item.selectionPrefix)) || + isNestedItemOpen(item.items)) } > { + const personalInfoValues: PersonalInfo = personalInfoData; + const workHistoryValues: WorkHistory[] = workHistory; + const educationHistoryValues: EducationHistory[] = educationHistory; + + return ( + + {children} + + ); +}; + +export const useAccounts = () => use(AccountsContext); + +export default AccountsProvider; diff --git a/apps/client/src/routes/paths.ts b/apps/client/src/routes/paths.ts index ec00a58..8a949a6 100644 --- a/apps/client/src/routes/paths.ts +++ b/apps/client/src/routes/paths.ts @@ -15,6 +15,8 @@ const paths = { defaultLoggedOut: `/${rootPaths.authRoot}/default/logged-out`, + account: `/${rootPaths.pagesRoot}/account`, + comingSoon: `/${rootPaths.pagesRoot}/coming-soon`, 404: `/${rootPaths.errorRoot}/404`, }; diff --git a/apps/client/src/routes/sitemap.ts b/apps/client/src/routes/sitemap.ts index 0b3d0ec..31b30f3 100644 --- a/apps/client/src/routes/sitemap.ts +++ b/apps/client/src/routes/sitemap.ts @@ -17,7 +17,7 @@ export interface SubMenuItem { export interface MenuItem { id: string; - key?: string; + key?: string; // used for the locale subheader: string; icon: string; iconSx?: SxProps; @@ -26,144 +26,70 @@ export interface MenuItem { const sitemap: MenuItem[] = [ { - id: 'pages', - subheader: 'Pages', - key: 'pages', - icon: 'material-symbols:view-quilt-outline', + id: 'homepage', + subheader: 'Homepage', + key: 'homepage', + icon: 'material-symbols:data-exploration-outline-rounded', items: [ { - name: 'Error 404', - key: 'error_404', - pathName: 'error', - active: true, - icon: 'material-symbols:warning-outline-rounded', + name: 'E-commerce', + key: 'e_commerce', path: paths[404], - }, - ], - }, - { - id: 'authentication', - subheader: 'Authentication', - key: 'authentication', - icon: 'material-symbols:security-rounded', - items: [ - { - name: 'Login', - key: 'login', - icon: 'material-symbols:login', - path: paths.login, - pathName: 'login', - active: true, - }, - { - name: 'Sign up', - key: 'signup', - icon: 'material-symbols:person-add-outline', - path: paths.signup, - pathName: 'signup', - active: true, - }, - { - name: 'Forgot password', - key: 'forgot_password', - icon: 'material-symbols:key-outline', - path: paths.forgotPassword, - pathName: 'forgot-password', + pathName: 'e-commerce', + icon: 'material-symbols:shopping-cart-outline', active: true, }, ], }, { - id: 'misc', - subheader: 'Misc', - key: 'misc', - icon: 'material-symbols:dashboard-customize-outline-rounded', + id: 'apps', + subheader: 'Apps', + key: 'apps', + icon: 'material-symbols:widgets-outline-rounded', items: [ { - name: 'Multi level', - key: 'multi_level', - pathName: 'multi-level', - icon: 'material-symbols:layers-outline-rounded', + name: 'E-commerce', + key: 'e_commerce', + pathName: 'ecommerce', + icon: 'material-symbols:storefront-outline-rounded', active: true, + hasNew: true, items: [ { - name: 'Level two (1)', - key: 'level_two_1', - path: '#!', - pathName: 'multi-level-2', - active: true, - }, - { - name: 'Level two (2)', - key: 'level_two_2', - pathName: 'multi-level-3', + name: 'Admin', + key: 'admin', + pathName: 'admin', active: true, + hasNew: true, items: [ { - name: 'Level three (1)', - key: 'level_three_1', - path: '#!', - pathName: 'multi-level-item-3', + name: 'Product listing', + key: 'product_listing', + path: paths[404], + pathName: 'product-listing', active: true, }, { - name: 'Level three (2)', - key: 'level_three_2', - path: '#!', - pathName: 'multi-level-item-4', + name: 'Product list', + key: 'product_list', + path: paths[404], + pathName: 'product-list', active: true, }, ], }, { - name: 'Level two (3)', - key: 'level_two_3', - pathName: 'multi-level-4', + name: 'Customer', + key: 'customer', + pathName: 'customer', active: true, items: [ { - name: 'Level three (3)', - key: 'level_three_3', - path: '#!', - pathName: 'multi-level-item-6', - active: true, - }, - { - name: 'Level three (4)', - key: 'level_three_4', - pathName: 'multi-level-item-7', + name: 'Homepage', + key: 'homepage', + path: paths[404], + pathName: 'homepage', active: true, - items: [ - { - name: 'Level four (1)', - key: 'level_four_1', - path: '#!', - pathName: 'multi-level-item-8', - active: true, - }, - { - name: 'Level four (2)', - key: 'level_four_2', - pathName: 'multi-level-item-9', - active: true, - items: [ - { - name: 'Level five (1)', - key: 'level_five_1', - path: '#!', - pathName: 'multi-level-item-10', - active: true, - }, - { - name: 'Level five (2)', - key: 'level_five_2', - path: '#!', - pathName: 'multi-level-item-11', - active: true, - }, - ], - }, - ], }, ], }, @@ -171,6 +97,30 @@ const sitemap: MenuItem[] = [ }, ], }, + { + id: 'pages', + subheader: 'Pages', + key: 'pages', + icon: 'material-symbols:view-quilt-outline', + items: [ + { + name: 'Account', + key: 'account', + path: paths.account, + pathName: 'account', + active: true, + icon: 'material-symbols:admin-panel-settings-outline-rounded', + }, + { + name: 'Error 404', + key: 'error_404', + pathName: 'error', + active: true, + icon: 'material-symbols:warning-outline-rounded', + path: paths[404], + }, + ], + }, ]; export default sitemap; diff --git a/apps/client/src/types/accounts.ts b/apps/client/src/types/accounts.ts new file mode 100644 index 0000000..475db9a --- /dev/null +++ b/apps/client/src/types/accounts.ts @@ -0,0 +1,146 @@ +import { JSX, ReactNode } from 'react'; +import { StaticImageData } from 'next/image'; + +export interface AccountTab { + id?: number; + label: string; + title: string; + value: string; + icon: string; + panelIcon: string; + tabPanel: JSX.Element; +} + +export interface PersonalInfo { + firstName: string; + lastName: string; + userName: string; + birthDate: string; + country: string; + state: string; + city: string; + street: string; + zip: string; + phoneNumber: string; + primaryEmail: string; + secondaryEmail: string; +} + +export interface WorkHistory { + id?: number; + companyName: string; + companyLogo: string | StaticImageData; + designation: string; + location: string; + startDate: string; + endDate?: string; + currentlyWorking: boolean; +} + +export interface EducationHistory { + id?: number; + institutionName: string; + institutionLogo: string | StaticImageData; + subject: string; + location: string; + startDate: string; + endDate: string; +} + +export interface LoggedInDevice { + id: number; + name: string; + icon: string | StaticImageData; + location: string; + currentlyLoggedIn: boolean; + firstLoggedTime: Date; + lastLoggedTime: Date; + browsersAppsServices?: { + icon: string | StaticImageData; + name: string; + }[]; +} + +export interface ConnectedInDevice { + id: number; + securityKey: string; + deviceName: string; + connected: boolean; + used: boolean; + currentlyUsed: boolean; + lastUsedDate: Date; + deviceIcon: string; +} + +export interface Language { + id: number; + name: string; + label: string; +} + +export interface Notification { + name: string; + checked: boolean; + label: ReactNode; +} + +export interface NotificationMethodOptions { + newNotifications: boolean; + directNotifications: boolean; + postsEmailed: boolean; + notificationFrequency: 'Daily' | 'Weekly' | 'Periodically' | 'Off' | null; + feedback: boolean; + deals: boolean; + personalizedDeals: boolean; + updates: boolean; + accountSecurity: boolean; + packageUpdates: boolean; +} + +export interface CardInfo { + id?: number; + cardName: string; + cardNumber: string; + cardHolder: string; + expireDate: string; + subscriptions: number; + icon: string | StaticImageData; + cvc: string; +} + +export interface AddressInfo { + name: string; + phoneNumber: string; + emailAddress: string; + country: string; + state: string; + city: string; + street: string; + zip: string; + addressType: string; +} + +export interface Permission { + name: string; + checked: boolean; + label: ReactNode; +} + +export interface StorageCategory { + name: string; + icon?: string; + color?: string; + fileCount: number; + spaceUsedinKb: number; +} + +export interface Storage { + totalSpaceinKb: number; + totalSpaceUsedinKb: number; + categories: StorageCategory[]; +} + +export interface BackupSyncSettings { + name: string; + enabled: boolean; +} diff --git a/apps/client/src/types/common.ts b/apps/client/src/types/common.ts new file mode 100644 index 0000000..6afa1db --- /dev/null +++ b/apps/client/src/types/common.ts @@ -0,0 +1,8 @@ +export interface FileAttachment { + name: string; + size?: string; + src?: string; + format: string; + date?: string; + preview?: string; +} diff --git a/apps/client/src/types/countries.ts b/apps/client/src/types/countries.ts new file mode 100644 index 0000000..2246319 --- /dev/null +++ b/apps/client/src/types/countries.ts @@ -0,0 +1,6 @@ +export interface Country { + code: string; + label: string; + phone: string; + flag: string; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83a58d7..40d1431 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -205,6 +205,9 @@ importers: prettier: specifier: ^3.6.2 version: 3.6.2 + react-dropzone: + specifier: ^14.3.8 + version: 14.3.8(react@19.2.0) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -2619,6 +2622,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + attr-accept@2.2.5: + resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} + engines: {node: '>=4'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -3579,6 +3586,10 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-selector@2.1.2: + resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} + engines: {node: '>= 12'} + file-type@21.0.0: resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} engines: {node: '>=20'} @@ -5042,6 +5053,12 @@ packages: peerDependencies: react: ^19.2.0 + react-dropzone@14.3.8: + resolution: {integrity: sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + react-hook-form@7.65.0: resolution: {integrity: sha512-xtOzDz063WcXvGWaHgLNrNzlsdFgtUWcb32E6WFaGTd7kPZG3EeDusjdZfUsPwKCKVXy1ZlntifaHZ4l8pAsmw==} engines: {node: '>=18.0.0'} @@ -8655,6 +8672,8 @@ snapshots: asynckit@0.4.0: {} + attr-accept@2.2.5: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -9777,6 +9796,10 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-selector@2.1.2: + dependencies: + tslib: 2.8.1 + file-type@21.0.0: dependencies: '@tokenizer/inflate': 0.2.7 @@ -11449,6 +11472,13 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 + react-dropzone@14.3.8(react@19.2.0): + dependencies: + attr-accept: 2.2.5 + file-selector: 2.1.2 + prop-types: 15.8.1 + react: 19.2.0 + react-hook-form@7.65.0(react@19.2.0): dependencies: react: 19.2.0 From f95fd5b02060b56010bb678b24efdcad0085eabe Mon Sep 17 00:00:00 2001 From: "Md.Saifur Rahman Rasel" Date: Fri, 14 Nov 2025 00:08:21 +0600 Subject: [PATCH 4/7] feat: account settings page create --- apps/client/public/assets/json/bird_dark.json | 1679 +++++++++++++++++ .../public/assets/json/character_dark.json | 1 + .../app/{ => (main)}/pages/account/page.tsx | 2 +- .../src/app/(main)/pages/coming-soon/page.tsx | 114 ++ apps/client/src/routes/sitemap.ts | 2 +- 5 files changed, 1796 insertions(+), 2 deletions(-) create mode 100644 apps/client/public/assets/json/bird_dark.json create mode 100644 apps/client/public/assets/json/character_dark.json rename apps/client/src/app/{ => (main)}/pages/account/page.tsx (52%) create mode 100644 apps/client/src/app/(main)/pages/coming-soon/page.tsx diff --git a/apps/client/public/assets/json/bird_dark.json b/apps/client/public/assets/json/bird_dark.json new file mode 100644 index 0000000..d953592 --- /dev/null +++ b/apps/client/public/assets/json/bird_dark.json @@ -0,0 +1,1679 @@ +{ + "v": "5.12.1", + "fr": 23.976, + "ip": 0, + "op": 144, + "w": 226, + "h": 250, + "nm": "Bird_Dark", + "assets": [ + { + "id": "image_0", + "w": 223, + "h": 350, + "u": "", + "p": "data:image/webp;base64,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", + "e": 1 + }, + { + "id": "image_1", + "w": 40, + "h": 60, + "u": "", + "p": "data:image/webp;base64,UklGRjQCAABXRUJQVlA4WAoAAAAQAAAAJwAAOwAAQUxQSAQBAAABgBDZbt1KEATBEAzBEAJBEAzBEAJBEArBEALBEMRAfR/Lui2BiJgA+vrWx5ACq2r+7xIIq0efktfM41azxI+t5IgnPiniqSNBPLkcNc++T6qlrQN+PL/G1IE91B05ItWhM8DrU4ZjdccGGjtx8LW7UXU3UbS/QTMgoBFgw7QAdYhRWBEao2vlyUHRNONQUc9XinZzYIuoIxft+XGoBNShi/bi2LFjwxjvhmMH7Q1jvBPH3rR/gUrAMDftq0ONA4IZFBwQ44hChKIT8dCntNgLoBQfecafctFhS3vRKWcZH9GT1Ohccjplrgyl1JqglCxHSumXxToBiwZmIWzpc7nPu9DXA1ZQOCAKAQAA0AYAnQEqKAA8AD5tMpJHJCMhoSq0DACADYloALszcfpHsnHe8VbgG2A5530PbwBvKgGjYO2IBmuXlDGoxVAgAP75m3//LkyhOlo3gXovCSXfuzEAr77g4uU5X0IXXfCrjbnLlbEJBSV38DtqPzySwJJtLa5OTavXSHkALKGY9ywXKq2rhs3QvvAYdK383/nlOnv/TY0I0FagDGx1/ZvDrYWXbgb05czmwFRe2y0WgturafRP+HfoTKqznU6EQWxR/e68X/HD0QZW3Iqn9gevv69//5i3VMQM8o0yb3gGSau14bd/vgWOsGSBp8Y8/dF9Az891+z4t5RLo9RxhLkEytB5JvzS27wAAAA=", + "e": 1 + }, + { + "id": "image_2", + "w": 342, + "h": 334, + "u": "", + "p": "data:image/webp;base64,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", + "e": 1 + }, + { + "id": "image_3", + "w": 77, + "h": 96, + "u": "", + "p": "data:image/webp;base64,UklGRkoEAABXRUJQVlA4WAoAAAAQAAAATAAAXwAAQUxQSKIBAAABkFXbTmRBV0IkIAEJSEACPQgoCUh4EpCABCQgAQlxQA9UFSTp4TMiJgD/pUMIMd9eIYSgJFy59bmXW/vkGEgKxU+fIlvN0R9yV5/Ce83R76HUp9bqX7nCUzG7Z65M5dcTKlN9fnDx1B9vXJsGdqwTTwMbLahM/d+Dx5L61N9wP6aB4S5NAzvuqwXJlIGH0YD0BF0d0yOq2jJeFl1Mb5BUffA+aXIb4FlNwVbPWtwe+KGjYjd1FWEbqCtoOEhdXjwB6tIGzlIXlg7Bs6iB454lXefgBTEJQJKTITJLYZKBKqRAKHUZTgo8SyiQmyR4QajnGiQTHwuiEE81CK+HkjTiIwPiryNJHsYBhsJ4IGtA28akImzL0Nl2OSVpU4HWscepyVsK1LotQQ/qhgbFaUPQRO8GVPdXSVd+M6A7vEnK8IJJW3uWob08YlKXH32gPjxy+vyTAgOfOFMaTAmmNJjYb6INc80wpdqSbYk2hJtgQ7zxNuQb2FhXw4ixaja4uc42XDfBhnoDE2mumw3p5rIh3zgbrlWDjcS/sTcCVFqvHv+AVlA4IIICAADQEACdASpNAGAAPm0skkYkIqGhLvN8+IANiWQGKAQID8AP0A/gCLCGP+gawT3r8lcTu4D5T50G2A8wH65etn6E94Z9ADy1vZRyI/wAxQRfO6lU3xkrd/MrQHfkkE8Tp4j0EUplVrpsTA4U96FmH/1kUb+eZxe/IUiyT5jUs/uymdTcuiIcjGYcGqIGI500KAD9Mf//7f6Z/2Y0kgeCbvAG4RvIy6j1uVYnEIqbrOg90kYfvp7WIyhxKGhXx890hZiIEes9tVWy9DksF23HfHgeECcZs4dRdWdge7YLzG5VjQ+ixbpmln6fSFCDxvXPOOZW0RuyetVtj8F6vzIAwcMY/OflEPjR3/9q8vrep4T27mkjrrO92jGZlCnf+gOWqkRVcX/PCMY25aYPLUvWlLVUNGee0BuUs7Mh3JSfi47HbpLbUrLmqchpWWeY65940uQOT6QOlutWvUPWAT4WI7jRG0IIq91j2+bcQrY7uFySvR+phtlbX9BSaoQKzdLId9qTu9e/LsAnLftu7/PLL0XRcFbk1GK/RYv7t74Oe+xgY0eItEBPeDa5f/70ef/+9WrN9Q/2M4o9lCPFZ5I6QlUEYEnfNGeB90IHcPRGQrHiPqtwBTXl3tBc+DZbQHVC6/aqVSMb1p9rgVYv7t74qEM9fctEI2zZA3/1p+4uZ//9v6ZicvJY8Alwid490xl0aDrJaJHRqYugjZU774U8hLLIlKHJPWJT/siowwAfnvNKVdJ2J9Fg66fZo52dCGeAo9+VJVp/H3pC1avsqSxrQFBzwddut+I/74lXDbF6fmklLF9kI3AQrK5lz4huCjcAJjx1dYxyzXYJP/+9Hn//vVQAAAA=", + "e": 1 + }, + { + "id": "image_4", + "w": 117, + "h": 135, + "u": "", + "p": "data:image/webp;base64,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", + "e": 1 + }, + { + "id": "image_5", + "w": 113, + "h": 362, + "u": "", + "p": "data:image/webp;base64,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", + "e": 1 + }, + { + "id": "image_6", + "w": 115, + "h": 354, + "u": "", + "p": "data:image/webp;base64,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", + "e": 1 + }, + { + "id": "image_7", + "w": 156, + "h": 271, + "u": "", + "p": "data:image/webp;base64,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", + "e": 1 + }, + { + "id": "comp_0", + "nm": "Bird Comp_Export_Dark", + "fr": 23.976, + "layers": [ + { + "ind": 1, + "ty": 0, + "nm": "Bird Comp_Dark", + "refId": "comp_1", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [450, 489, 0], "l": 2 }, + "a": { "a": 0, "k": [450, 489, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "w": 900, + "h": 978, + "ip": 0, + "op": 144, + "st": 0 + } + ] + }, + { + "id": "comp_1", + "nm": "Bird Comp_Dark", + "fr": 23.976, + "layers": [ + { + "ind": 1, + "ty": 4, + "nm": "Shape Layer 4", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [450, 489, 0], "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "shapes": [], + "ip": 0, + "op": 144, + "st": 0, + "ct": 1 + }, + { + "ind": 2, + "ty": 4, + "nm": "Shape Layer 3", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 104 }, + "p": { "a": 0, "k": [620.371, 195.863, 0], "l": 2 }, + "a": { "a": 0, "k": [-103.478, -258.572, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0] + ], + "v": [ + [-108.755, -265.608], + [-179.115, -332.45] + ], + "c": false + } + }, + "nm": "Path 1" + }, + { + "ty": "st", + "c": { "a": 0, "k": [0.776, 0.867, 0.984, 1] }, + "o": { "a": 0, "k": 100 }, + "w": { "a": 0, "k": 4 }, + "lc": 2, + "lj": 1, + "ml": 4, + "nm": "Stroke 1" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0] }, + "a": { "a": 0, "k": [0, 0] }, + "s": { "a": 0, "k": [100, 100] }, + "r": { "a": 0, "k": 0 }, + "o": { "a": 0, "k": 100 }, + "sk": { "a": 0, "k": 0 }, + "sa": { "a": 0, "k": 0 }, + "nm": "Transform" + } + ], + "nm": "Shape 1" + }, + { + "ty": "tm", + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 57, + "s": [0] + }, + { "t": 60, "s": [100] } + ] + }, + "e": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 54, + "s": [0] + }, + { "t": 57.667, "s": [100] } + ] + }, + "o": { "a": 0, "k": 0 }, + "m": 1, + "nm": "Trim Paths 1" + } + ], + "ip": 0, + "op": 144, + "st": 0, + "ct": 1 + }, + { + "ind": 3, + "ty": 4, + "nm": "Shape Layer 2", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 87 }, + "p": { "a": 0, "k": [599.371, 173.863, 0], "l": 2 }, + "a": { "a": 0, "k": [-103.478, -258.572, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0] + ], + "v": [ + [-108.755, -265.608], + [-179.115, -332.45] + ], + "c": false + } + }, + "nm": "Path 1" + }, + { + "ty": "st", + "c": { "a": 0, "k": [0.776, 0.867, 0.984, 1] }, + "o": { "a": 0, "k": 100 }, + "w": { "a": 0, "k": 4 }, + "lc": 2, + "lj": 1, + "ml": 4, + "nm": "Stroke 1" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0] }, + "a": { "a": 0, "k": [0, 0] }, + "s": { "a": 0, "k": [100, 100] }, + "r": { "a": 0, "k": 0 }, + "o": { "a": 0, "k": 100 }, + "sk": { "a": 0, "k": 0 }, + "sa": { "a": 0, "k": 0 }, + "nm": "Transform" + } + ], + "nm": "Shape 1" + }, + { + "ty": "tm", + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 57, + "s": [0] + }, + { "t": 60, "s": [100] } + ] + }, + "e": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 54, + "s": [0] + }, + { "t": 57.667, "s": [100] } + ] + }, + "o": { "a": 0, "k": 0 }, + "m": 1, + "nm": "Trim Paths 1" + } + ], + "ip": 0, + "op": 144, + "st": 0, + "ct": 1 + }, + { + "ind": 4, + "ty": 4, + "nm": "Shape Layer 1", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 71 }, + "p": { "a": 0, "k": [568.155, 160.068, 0], "l": 2 }, + "a": { "a": 0, "k": [-103.478, -258.572, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0] + ], + "v": [ + [-108.755, -265.608], + [-179.115, -332.45] + ], + "c": false + } + }, + "nm": "Path 1" + }, + { + "ty": "st", + "c": { "a": 0, "k": [0.776, 0.867, 0.984, 1] }, + "o": { "a": 0, "k": 100 }, + "w": { "a": 0, "k": 4 }, + "lc": 2, + "lj": 1, + "ml": 4, + "nm": "Stroke 1" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0] }, + "a": { "a": 0, "k": [0, 0] }, + "s": { "a": 0, "k": [100, 100] }, + "r": { "a": 0, "k": 0 }, + "o": { "a": 0, "k": 100 }, + "sk": { "a": 0, "k": 0 }, + "sa": { "a": 0, "k": 0 }, + "nm": "Transform" + } + ], + "nm": "Shape 1" + }, + { + "ty": "tm", + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 57, + "s": [0] + }, + { "t": 60, "s": [100] } + ] + }, + "e": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 54, + "s": [0] + }, + { "t": 57.667, "s": [100] } + ] + }, + "o": { "a": 0, "k": 0 }, + "m": 1, + "nm": "Trim Paths 1" + } + ], + "ip": 0, + "op": 144, + "st": 0, + "ct": 1 + }, + { + "ind": 5, + "ty": 2, + "nm": "Left Wing", + "parent": 10, + "refId": "image_0", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 13, + "s": [0] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 17, + "s": [-18] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 31, + "s": [-18] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 35, + "s": [11] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 43, + "s": [11] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 46, + "s": [-18] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 53, + "s": [-18] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 61, + "s": [26] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 64, + "s": [11] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 67, + "s": [26] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 70, + "s": [11] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 73, + "s": [26] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 76, + "s": [11] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 88, + "s": [11] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 100.745, + "s": [-122] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 122.223, + "s": [-122] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 136, + "s": [0] + }, + { "t": 144, "s": [0] } + ] + }, + "p": { "a": 0, "k": [62.251, 226.268, 0], "l": 2 }, + "a": { "a": 0, "k": [205.076, 292.705, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.11, 0.286, 0.518, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 6, + "ty": 4, + "nm": "Shape Layer 5", + "parent": 5, + "tt": 1, + "tp": 10, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 41 }, + "r": { "a": 0, "k": -3 }, + "p": { "a": 0, "k": [318.686, 327.323, 0], "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [-86.937, -26.603], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [26.09, 7.983], + [0, 0], + [0, 0] + ], + "v": [ + [-213, -158], + [-280.921, -78.443], + [-163.806, 8.204], + [-110, 14], + [-98.75, -84] + ], + "c": true + } + }, + "nm": "Path 1" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.078, 0.208, 0.376, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0] }, + "a": { "a": 0, "k": [0, 0] }, + "s": { "a": 0, "k": [100, 100] }, + "r": { "a": 0, "k": 0 }, + "o": { "a": 0, "k": 100 }, + "sk": { "a": 0, "k": 0 }, + "sa": { "a": 0, "k": 0 }, + "nm": "Transform" + } + ], + "nm": "Shape 1" + } + ], + "ip": 0, + "op": 144, + "st": 0, + "ct": 1 + }, + { + "ind": 7, + "ty": 2, + "nm": "Eye", + "parent": 10, + "refId": "image_1", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 22 }, + "p": { "a": 0, "k": [116.077, 89.268, 0], "l": 2 }, + "a": { "a": 0, "k": [19.501, 29.596, 0], "l": 2 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.571, 0.571, 0.571], "y": [1, 1, 1] }, + "o": { "x": [0.191, 0.191, 0.191], "y": [0, 0, 0] }, + "t": 0, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.664, 0.664, 0.664], "y": [1, 1, 1] }, + "o": { "x": [0.331, 0.331, 0.331], "y": [0, 0, 0] }, + "t": 20, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.571, 0.571, 0.571], "y": [1, 1, 1] }, + "o": { "x": [0.338, 0.338, 0.338], "y": [0, 0, 0] }, + "t": 22.5, + "s": [100, 10, 100] + }, + { + "i": { "x": [0.704, 0.704, 0.704], "y": [1, 1, 1] }, + "o": { "x": [0.331, 0.331, 0.331], "y": [0, 0, 0] }, + "t": 25, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 46, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 49, + "s": [100, 10, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 55, + "s": [100, 130, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 58, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 89, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 100.745, + "s": [100, 10, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 120.001, + "s": [100, 10, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 123.334, + "s": [100, 100, 100] + }, + { "t": 144, "s": [100, 100, 100] } + ], + "l": 2 + } + }, + "ao": 0, + "ef": [ + { + "ty": 35, + "nm": "Transform", + "np": 14, + "en": 1, + "ef": [ + { "ty": 3, "nm": "Anchor Point", "v": { "a": 0, "k": [20, 30] } }, + { "ty": 3, "nm": "Position", "v": { "a": 0, "k": [20, 30] } }, + { "ty": 7, "nm": "Uniform Scale", "v": { "a": 0, "k": 1 } }, + { "ty": 0, "nm": "Scale", "v": { "a": 0, "k": 100 } }, + { "ty": 0, "nm": " ", "v": { "a": 0, "k": 100 } }, + { "ty": 0, "nm": "Skew", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Skew Axis", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Rotation", "v": { "a": 0, "k": -22 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 100 } }, + { "ty": 7, "nm": "Use Composition’s Shutter Angle", "v": { "a": 0, "k": 1 } }, + { "ty": 0, "nm": "Shutter Angle", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "Sampling", "v": { "a": 0, "k": 1 } } + ] + }, + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.039, 0.106, 0.188, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 8, + "ty": 3, + "nm": "Null 4", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 0 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [450, 489, 0], "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 9, + "ty": 2, + "nm": "Head 2", + "parent": 8, + "refId": "image_2", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 0, + "s": [3] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 46, + "s": [3] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 50, + "s": [-5] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 54, + "s": [3] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 87, + "s": [3] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 100.745, + "s": [-19] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 118.334, + "s": [-19] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 133, + "s": [3] + }, + { "t": 144, "s": [3] } + ] + }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.333, "y": 0.333 }, + "t": 0, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 46, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 49, + "s": [33.251, -34.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 55, + "s": [33.251, -64.973, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 59, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 88, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 100, + "s": [33.251, -25.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 117.779, + "s": [33.251, -25.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.333, "y": 0.333 }, + "t": 133, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { "t": 144, "s": [33.251, -50.307, 0] } + ], + "l": 2 + }, + "a": { "a": 0, "k": [198.73, 206.751, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.11, 0.286, 0.518, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 10, + "ty": 2, + "nm": "Head", + "parent": 8, + "td": 1, + "refId": "image_2", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 0, + "s": [3] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 46, + "s": [3] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 50, + "s": [-5] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 54, + "s": [3] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 87, + "s": [3] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 100.745, + "s": [-19] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 118.334, + "s": [-19] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 133, + "s": [3] + }, + { "t": 144, "s": [3] } + ] + }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.333, "y": 0.333 }, + "t": 0, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 46, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 49, + "s": [33.251, -34.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 55, + "s": [33.251, -64.973, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 59, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 88, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 100, + "s": [33.251, -25.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 117.779, + "s": [33.251, -25.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.667, "y": 0.667 }, + "o": { "x": 0.333, "y": 0.333 }, + "t": 133, + "s": [33.251, -50.307, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { "t": 144, "s": [33.251, -50.307, 0] } + ], + "l": 2 + }, + "a": { "a": 0, "k": [198.73, 206.751, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.776, 0.867, 0.984, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 11, + "ty": 2, + "nm": "Beak", + "parent": 10, + "refId": "image_3", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [57.129, 110.304, 0], "l": 2 }, + "a": { "a": 0, "k": [47.283, 39.924, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.078, 0.208, 0.376, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 12, + "ty": 4, + "nm": "Shape Layer 6", + "parent": 13, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": -105.178 }, + "p": { "a": 0, "k": [145.646, -87.164, 0], "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [ + [1.5, 0], + [6.612, 7.238], + [-2.376, 0] + ], + "o": [ + [-1.226, 0], + [-4.067, 24.261], + [13, 0] + ], + "v": [ + [-109.5, -144], + [-145.991, -163.184], + [-120.836, -120.957] + ], + "c": false + } + }, + "nm": "Path 1" + }, + { + "ty": "fl", + "c": { "a": 0, "k": [0.037, 0.139, 0.273, 1] }, + "o": { "a": 0, "k": 100 }, + "r": 1, + "nm": "Fill 1" + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0] }, + "a": { "a": 0, "k": [0, 0] }, + "s": { "a": 0, "k": [100, 100] }, + "r": { "a": 0, "k": 0 }, + "o": { "a": 0, "k": 100 }, + "sk": { "a": 0, "k": 0 }, + "sa": { "a": 0, "k": 0 }, + "nm": "Transform" + } + ], + "nm": "Shape 1" + } + ], + "ip": 0, + "op": 144, + "st": 0, + "ct": 1 + }, + { + "ind": 13, + "ty": 2, + "nm": "Beak 2", + "parent": 10, + "refId": "image_3", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 0, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 4, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 8, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 12, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 16, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 20, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 24, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 28, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 32, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 36, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 40, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 47, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 52, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 89, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 127, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 131, + "s": [96.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 135, + "s": [118.678] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 139, + "s": [96.678] + }, + { "t": 144, "s": [118.678] } + ] + }, + "p": { "a": 0, "k": [65.182, 150.499, 0], "l": 2 }, + "a": { "a": 0, "k": [61.573, 36.324, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.035, 0.141, 0.275, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 14, + "ty": 2, + "nm": "Comb", + "parent": 10, + "refId": "image_4", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [237.2, 12.084, 0], "l": 2 }, + "a": { "a": 0, "k": [50.248, 81.606, 0], "l": 2 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1.25, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 50, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0.125, 0] }, + "t": 53, + "s": [100, 78, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 56, + "s": [100, 122, 100] + }, + { "t": 61, "s": [100, 100, 100] } + ], + "l": 2 + } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.016, 0.251, 0.165, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 15, + "ty": 2, + "nm": "Left Leg", + "refId": "image_5", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [382.643, 537.776, 0], "l": 2 }, + "a": { "a": 0, "k": [51.011, 38.263, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.016, 0.251, 0.165, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 16, + "ty": 2, + "nm": "Right Leg", + "refId": "image_6", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [547.327, 540.764, 0], "l": 2 }, + "a": { "a": 0, "k": [31.921, 44.111, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.016, 0.251, 0.165, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + }, + { + "ind": 17, + "ty": 2, + "nm": "Right Wing", + "parent": 10, + "refId": "image_7", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 53, + "s": [0] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 61, + "s": [206] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 64, + "s": [195] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 67, + "s": [206] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 70, + "s": [195] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 73, + "s": [206] + }, + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 76, + "s": [195] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 88, + "s": [195] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 100.745, + "s": [51] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 118.334, + "s": [51] + }, + { "t": 135, "s": [0] } + ] + }, + "p": { "a": 0, "k": [249.876, 181.978, 0], "l": 2 }, + "a": { "a": 0, "k": [-44.314, 3.47, 0], "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "l": 2 } + }, + "ao": 0, + "ef": [ + { + "ty": 21, + "nm": "Fill", + "np": 9, + "en": 1, + "ef": [ + { "ty": 10, "nm": "Fill Mask", "v": { "a": 0, "k": 0 } }, + { "ty": 7, "nm": "All Masks", "v": { "a": 0, "k": 0 } }, + { "ty": 2, "nm": "Color", "v": { "a": 0, "k": [0.078, 0.208, 0.376, 1] } }, + { "ty": 7, "nm": "Invert", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Horizontal Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Vertical Feather", "v": { "a": 0, "k": 0 } }, + { "ty": 0, "nm": "Opacity", "v": { "a": 0, "k": 1 } } + ] + } + ], + "ip": 0, + "op": 144, + "st": 0 + } + ] + } + ], + "layers": [ + { + "ind": 1, + "ty": 0, + "nm": "Bird Comp_Export_Dark", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100 }, + "r": { "a": 0, "k": 0 }, + "p": { "a": 0, "k": [136.234, 134, 0], "l": 2 }, + "a": { "a": 0, "k": [450, 489, 0], "l": 2 }, + "s": { "a": 0, "k": [29, 29, 100], "l": 2 } + }, + "ao": 0, + "w": 900, + "h": 978, + "ip": 0, + "op": 144, + "st": 0 + } + ], + "markers": [] +} diff --git a/apps/client/public/assets/json/character_dark.json b/apps/client/public/assets/json/character_dark.json new file mode 100644 index 0000000..62cdec9 --- /dev/null +++ b/apps/client/public/assets/json/character_dark.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":23.976,"ip":0,"op":97,"w":513,"h":478,"nm":"Coming Soon_Ladder Dark","assets":[{"id":"image_0","w":67,"h":29,"u":"","p":"data:image/webp;base64,UklGRlYCAABXRUJQVlA4WAoAAAAQAAAAQgAAHAAAQUxQSLIAAAABcEhbbyYFoQiDMAgfQhAWYRA+hEUIQhGCsAiDMAb7v5t+HYCImAAbjAsjfw3SsZiy93t1xrZq4HYfewTG8S6YGBR3zesQv6vGgHbI3K91vAuvZbtSVPlduhWFlhftWqxZ79pRs4llze0ElvsJ8ATaoRZmIAn8wrs6ze9fM0msC+8T8Nu8bn0+nIEZputmtkXOdbHPDRsz50j7t8HJzF2pt79+BZxkz8xjxB4w4YbCxX4EVlA4IH4BAADwCACdASpDAB0APm0ukUWkIqGWbf6oQAbEswbAAPEPAdBhOoYOEBtm+foeIAxQRhy3CS9xenibbt0wIy4AOFK/822kMPNeFZAJhM6MBz3vgAD+/qU2yf301HZ1G2jCwclp8FLQixtki4p0vXseVrNyyzs8S+PjGwTzFZToKeVqaEPFmZtuBi3CViEFnuFjWpL/6aHXBRCB7vz0TznBc/JW2xLkC5UcRE8VZ0kILmGetm7GB13iZeAU+iNi2adAkDMPcLzQevM3ZAD82ZU6BFKvBs+Y3FfS/7iJTwQ4P/hEdHSZm+Yn4hQJbr7XhD47KGcYisl0sC9Un6KIQlatDGh8kaOvMir/W87/RPd8ig2QCSzx3vkaIGF3VddYftPsamWfQf7bLgRBRZ7WbGTwW1qHSntIsTdcT4Cf5o+wUMk5k5/ZKcbUND6Ovtt18RzNbLSSiuEu/S2B57wyWGhhohh9X4aiyrKQK7nAFQgFq0jpcbRigKE9V08I6c2hYAAA","e":1},{"id":"image_1","w":11,"h":16,"u":"","p":"data:image/webp;base64,UklGRrQAAABXRUJQVlA4WAoAAAAQAAAACgAADwAAQUxQSFMAAAABYEhtW50X4UcYwhBCGMIQQgghhBBCCGEIQ2gEt/8yhYiYANY2qqBl3vd9GOXWSY1/orqa911hV3pBppOhOB3ksgaQI5yRZFRFV8mQed8NW/IGAABWUDggOgAAALABAJ0BKgsAEAABQCYlsAJ0OIABiAAA/vlnH/YiBw0F2EL0vlbPB7PMGefoNX5gK4TNWQteEnoAAAA=","e":1},{"id":"image_2","w":54,"h":73,"u":"","p":"data:image/webp;base64,UklGRmoDAABXRUJQVlA4WAoAAAAQAAAANQAASAAAQUxQSD8BAAABkFbbdt5GF8KDIAiCIAiB8CAYgiAIgiAIgiAIghjUQfD6NTP3ymv+R8QE4OTS52U4vkdEvPNBdUfMEb/ukk9Z8a/Ljmjx7+uEFMxyQKPUA/YzUlBd55yi6xzTbcqGPAV16JxTdY1TdItjMgvqgrxwmq5yXDc5pgvqgrxwmq5xsm5RbshTULvu4rx0i3JDnoLadY2TdTdlQ+5BvXSbYzIPaofaNifLalAn1Dm4RWWLM6HuwS2qK7gTYg9yEXmQB7Qe7KSpwa5Q2gj2NkXZQS/gWw9+A93qO/jbWKm9Q5lBTdcMbcW/p6uvUA8QR+i3MV4fsncGdcoKuEvlIIfY8QjHIxyPcDzC8YQ7Q5loK0FaWN3wgPsFNWcmPOB2HEhohgeMhDP970bBqfUv7p5wrI0/TDcc7PFzXAlnpzlqwf8SAFZQOCAEAgAAUA0AnQEqNgBJAD5lKo9FpCKhGZ3+AEAGRKANGo1KQDbAbhveFqBL+SvPAK1KwTt7GOzXAm5M/7UDkN2F9yhv5do0P/d1oMusG1KR8cbLdQGVpiforXAOgvr59f57U5haJUkT40Q39ShbE/6PREhmxYB2kAD+/gbVj/7zQy+k0Z3FTB0MHnkhVGhrFUnkj4/dFeeLrl6x5C2z8/tHyWEt91spYJzVR9IlUQLO/MXHNX1Hi88QDYXLdYKrOyLEqsCCAzsLYvvB9aI3Yam99n/0gcS8bVaHLPpkHa1dbGnnG1R7X/uDnk9JkQqPRRj8rr0hzh7QtAsSzh5p0z3TYuva9l+2dFZzlFpXJyUxV/pF1fVCHWCse+3Ap4e9OMyjv/c0DN0q/gBd6rgw7/8lGoxF0RdLKaRcr97lGo4MpwA8rueGyhrHw2onXogSUfK0OKrwE0ZR/kmFyaHiMBUsYpjsBsXqAZuqEs0CL6RuGEf/QgODn45h/Xa3uYIR3oPTCEOOKVPDxKpWHEX7mtqu1miH2f7gTj7vqYGW5mQ82mHg5S7eo3czWAmtUDPc3NuenspHQ6W+awVIZ7BbhXxn5FUs/WIWVs3HrMJcjnBNFRHOeeKZ8gAUY2/1OtfOiT7VHLb/sqMjUgHp/+4AiccDsdDVyNcUz31c1wVt+kDBdSS20HEAAAAA","e":1},{"id":"image_3","w":90,"h":76,"u":"","p":"data:image/webp;base64,UklGRhYEAABXRUJQVlA4WAoAAAAQAAAAWQAASwAAQUxQSHABAAABcE5bW2Y9CCGEEEIIgxBCCCGEEMIghBBC6xIUwfvjzvQxPQARMQE42D4rEDU2xFxksKaLgHEhF1lar5OsT0W2ZnWEcanIB5v5mg13k6928yHjs3y7m29ofzf5flH7rljl0LTJpiYH2w06Vjm7LtNJzg9rVBKGXa24unAMC6KwbHNJeLqZJETLhBeqZkh3LmkoCdeuBrSwdQOJThnodES/XMLXv0RC9SUTEvMkjCOx8mAoif6znDyxTEyYWQCKVAAAUvmvcZK/TEoDiKQsAEcqADDE0Djdfzen/OeJaWKoxCKxi1J6QGcUnm5G7skxMk+aUMNr4ZPeIp/rzdLpGKQTRjIbPRLIBIxeXH5qyHCxGKcSMVmIZMx6HkVNWRpFYZ5FUViYOSSFlY5Bd1ir+nlZY7U7rTpsvI+qDltVOSc77FbljOI1Pqjuz7Xba3z1qh/K0Rl829V9OQdvNY40PrcVJecYvLU4Xlnrw6Oz1hqcCVZQOCCAAgAAUBAAnQEqWgBMAD5pLpNFpCKhmIsFbEAGhLGAaPYKju6YBtq+eq0yufHfoAuJY0U0G6yzPlTrhGxQ9mOGLu6Zx/O7f9zKpDltGBgLNeodb+LLGf+Jb5smKbYTMc+SgXJZdfALTr7nMc+ma3G9YZJeaCfvlMjNn/k5qXVnTNhkhCLGNXurIf/lP58DAAD+WCF9swb0nFX6XDxsurDjFDnjHrlNYZzq13mv5tcR7Fbd4YqJY5wgEJDMc7rKv6sDIeswLTGdrj0XS035skh7rOr4QTtjfmeBxV2s6Vl0W4GDfQae36qPOZtxvXuebnzTFt/0tHu6Gzk8fI6uzfiVd4EQYxsrlR4ukDLDSq226uHKuEy+mzNn92moPdh/sg+10k/fZ7//90S//unf//7oqxTwi/3q7GAWleTebD/0NVwhM0JfbWwpS/TFE3QxdPw5vhmczyjcJYBjxS79UGywwA+mk90zP9zAr38cOEYET5xW/gnD8Y6TRj6/zoF2ofqOJvH6cJG/wDMVvQvRZsnICmVVql72EKrDhN/U5XHGe4wwAznQ846UAu1WniumCt8ww0TDR2OpEoh+fRPQZdv5cS61ziOjaCUMCJoUmWKjyNs402LToY3i+RzsKTtZ3Lc4IFrurVaS6sAtcNDevdbuXNs+pLt6hMSEZlTKqfU0EXaMuK1bzP7+I8gMbx1w7zs67gxoSSu/fMTGtyyi/5Ba5uXmby4RwpL8speD4vUygMoQJc+RQ0f2w5bXeukAsHbMS1JSi3BodUlAi6fLbGo/Z5oXbxbOOebarrbB0Mr8ZA0ZButp9353Pkr/LwRbA3V9kdNun/4h0dHnWdBSiPf+t3gAAA==","e":1},{"id":"image_4","w":19,"h":65,"u":"","p":"data:image/webp;base64,UklGRvwBAABXRUJQVlA4WAoAAAAQAAAAEgAAQAAAQUxQSJoAAAABcBVJkhWVhJWAhJUwEk7CSkDCSEACEpAwEpCABBy873riXt8RMQG83hn6vNlL1o/ztm0O1Ki1jfP2dAR8EwPolQ0wqUCRDJAeQCieMQCuRFZTNsDeoWQYlAzewb9d/A01w75KLw3gkr/PlBGSvc8qFdhk3iPA3mHM8CSXWoa/yZSxFkLaWsaSsdUMN23p6NcX1hhax9XuK08BVlA4IDwBAAAQCACdASoTAEEAPm0ylEckIyIhKbVaSIANiWIAwxlsvA7Y/oAwnL0AdCB6nYBCmuDL0kKBqotYXRIRcO6ABZtirH5deazqwioAAP74+qpIPdnH7VO/GAMfxPo6Rj0xfSlb+b70TTbP8Jw/ZeZ9TfSTJCj2zF7E//gEIcjRp+SBxqsq95QQmyR6P8ifbmMMWYUcptz3RpWTmIaiAYVzcOt8Zyvdihttd3WsW/Zq2RxShRLyPNEvOBWeZzCk10uWhnIqkgBH1WTTtgKSg27Ad+pbnXuXHDYS+zTBr8xvmtnId5vObN8J4ylGLY23TPg3eoU6u1tiq/xcnBDLtFVt2FywPrHfENbfxkQGy0Azy0F1kNG0hXNye0wh8WCTIazv47/UV2e3ZqlF2rODCcLjDBYjUt4G0X//0IYAAAAA","e":1},{"id":"image_5","w":28,"h":63,"u":"","p":"data:image/webp;base64,UklGRuYCAABXRUJQVlA4WAoAAAAQAAAAGwAAPgAAQUxQSOYAAAABgE3bdlhrIwQhCEE4CEUoQhAOQhEOwkUIQhGCkBKcr+7dvCcQEROAT4sVfN4iL8oqgGKHx5iZmYOxnGMkz7TUG4GlncxPc6Zrg2naYrCkrMzQjHHNGdN+TNFuBlNKamjGuHYyh+ZM0wYDbVG3lIUZmjGuOdO1YEwbWxZTtWTwb9oW23JuCW0wUwuipn4QXXtATi0IS70SoQXea+qVCC3wXlN+ChFax3tN+QYZmhEt5QA5pKcSlrKDnFohPOUAubRGHClPkK7Fls40zRjMLccWXErnEIILOB/KFJRrvYyKL83dvVf8XVZQOCDaAQAAkAwAnQEqHAA/AD5tMJNHpCKhoSgYDACADYlsAMgXRztfoHmCUT+q7OwoDQAbhTeFPQAqwD+AVmnefhrGdN2Su7IGDMaD7owzSCWE5CdSSFmP6O0kO5OIeLR0AHGNWPKyPhZbuiOITbbuE323gAD+22YsAmdqwX+txaeVp+FhVZGyrtSV//5Ldv/ycieBTezr/8Oa4nl0FCJ4HVCOEQf1/NkOXCff/9tlv77LHMeBgrSSj1qJX86nQWBQLnK1Vrxj1tbvyuU+zCjj/LE6/Cr11j3jmS5xdefNhyB6QToov9r5hO+sG5/dzFi1wbJivP2iB5DcjWxmBk3xpRel7QQFpue3W91Gyq6KfAq7Ww5HagfmENG84hX9hpS5Pl2xfhdWjChaSUkYv7gUw1Zzqw/TNxFZklRCpOCe7kstIkuxVWk9BLZ0S7/E3ywslcIJ2fYTiTvxkmFhwIjah6bAzWT7en0peDlDICEy7ZzFYZKQJTQQPIv/xonTChLs0+cLmg/7VeHcTX9HsW27TGQpFZq3BsC8dkfe5kVAegzTAoJyVYe+y1OEXQnmsIsbJ8tJfO+Dyb27x6+OQHHFobyi/J2vLGhY3T/yIJ4Jml2x9+eT0ZXg/0eBxL4gAAAA","e":1},{"id":"image_6","w":202,"h":202,"u":"","p":"data:image/webp;base64,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","e":1},{"id":"image_7","w":50,"h":153,"u":"","p":"data:image/webp;base64,UklGRuYCAABXRUJQVlA4WAoAAAAQAAAAMQAAmAAAQUxQSPAAAAABgFBbe9vmg/BDEARB+CEYgiEIgiAYQiAIgiAIgiD8DL5Oj697noiYgJoh37mZHmPRI3vSI+sL4HQ9spkeo+iRI+uRm+kxFj2yJz2yvgBO1yOb6TGKHjmyHrmZHmPRI3vSI6vpcboe2ZIeo+iRw/XIzfQYqx7Zkx5ZTY/T9Uj/10fWm9DLcrFAat7qalCKFc/qZMhV6CW9gF7/zLst7mUqjYQni84wPLvKZOxsIg17s0jdBRHf138ItH2mse6a0MDc4yo5ntuggtyfiAU6QC61OI5fc/ZvOHVXE/FdqwjajgFVG89EkgHqEzeDdHY3HAVWUDgg0AEAAFAMAJ0BKjIAmQA+bTCVRiQjIiEudVnQgA2JQMUAIWw1P6Br1fXt6PlNvAbZvzAeRL+s3uU/xe+Abx6RF4U5wvrTKsj/+KQ0oiD0yiH4RSJ3OkfSS8PtfrgJ6K3vGaUTvjQ7tIl+8WK9j5wAAP7uJx+CyezhS70zJ+SKGlXxN9kTMxsY5jz4pdl+f//trUTw1slETo0QFnRSZFb+gkfv9PgyqgiTevH1jEESSdBNmt+la51ZfHSUBT/IWYf7zm30qpk2AvlSIUa9HfLgNLGwAZps/ZqyiFpTCbd+w9fNd3csBSr+yiaa+Acs0/jkB9F+iAoVUxkwriU8Dp1VOe4YqCIHI7+rc+Rajtyio6pAiooTqDOePc0QAUCceTScbjghKOTiYn7iaNvSyaM8lwLItSf+z9xrT5VyjAgNa+GKf5bzZ/3Es7HNocY5tFIdjKsODrvX/10uN2m5C4QNy3PnN7S2+5pdx/1LoXut8Io4fciVlFf/+2sLSJC0J1OMfeRNjoVdJvhU6MIiYe2mFIAatfxhfPGDzfyPDntP/1Z/Ge91qsnWiBJddEHzvi5dKko3+4HXAL+CCGNglYa1sKOciomMd4kj+SHqcUe8D/P0AAAA","e":1},{"id":"image_8","w":27,"h":55,"u":"","p":"data:image/webp;base64,UklGRqICAABXRUJQVlA4WAoAAAAQAAAAGgAANgAAQUxQSN4AAAABgFTbVlzpSUDCk4CEJwEJSEACEpCABCQgIRIiIfmjmt1qaC6lICImQLiWhK0dMFIGcDuKXgBQhBle/O2MiDGjYr5XwctY9RsRy7bmsR6W3LuRlzp4Cbt9wb0HKrafmYE46wwdGZg2apQwUFC/7E/hIP25KW8SEQlg3l7+FsajMrwZJkMFsco4MnRSCE2mnRBnD8HPQJSpP2H/TE/EE/UE9EQ+8dGBoyAPhPO6wUVBHDROGSROH/gT8lDKqFJsZIwm02uvuVlYCzF5WW0LT5Rddw0uMyf7rgJoKmSnQgRWUDggngEAABAKAJ0BKhsANwA+aSaPRaQiIRn8zqhABoS0AGOigBdgG8oYA1/HfoA7CCUA7AawMYtz4lsIwy5c9RqgGyYJz1X8DQs3qJ9g0SXXWKtfAJYFy/x+43PW7igAAP2zSYFMpowUXTRAcurSbUbs8/X9nfL9naJFeagOL8g//DXhgo1vapMaiMe9Ah0iv4Y2a8gt0+f3h+mPCFXvLBN+Pl5Y7ZV8UZt/UwQMfjeV3c4JeaKG/FPLK3yH/IfOIQ6j0mcc+rIAtQovIpo1sG+XVuD/mfo+/14xzwm9YFNZWcj0NP9ErishZ1mTZ/4iTitOvE090wtVOYWW3/vEKa0aZ3pbkcKYSaN8aNNr9b2G2Ru8wzDG9etHvl+TX+E8tWVEMBJ0n7L6AYrEsTrYzg9yubvMMWlUsbrKnEjr9EY/CNU6CnOhFE4mq3+MMhI/CxRF+amqOSLWfa6SrsNRcmfvkfVIRAjhwyjGu/Gb3KGNS+7+mwv77t1fwJL45uUZuLYqF+zms6UoO6ISTLMXvyQpkKt6g+FfGn///uKFWeK+qkAAAA==","e":1},{"id":"image_9","w":76,"h":194,"u":"","p":"data:image/webp;base64,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","e":1},{"id":"comp_0","nm":"Character + BG Dark","fr":23.976,"layers":[{"ind":1,"ty":0,"nm":"Character Dark","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[350,239,0],"l":2},"a":{"a":0,"k":[300,239,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"w":600,"h":478,"ip":0,"op":144,"st":0},{"ind":2,"ty":0,"nm":"Background Dark","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[320,151,0],"l":2},"a":{"a":0,"k":[256.5,150,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"w":513,"h":300,"ip":0,"op":144,"st":0}]},{"id":"comp_1","nm":"Character Dark","fr":23.976,"layers":[{"ind":1,"ty":3,"nm":"Main Null","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":0,"k":[300,239,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ip":0,"op":144,"st":0},{"ind":2,"ty":2,"nm":"Hat","parent":8,"refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":67,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[-10]},{"t":90,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[45.581,-4.439,0],"to":[2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":67,"s":[60.581,-4.439,0],"to":[0,0,0],"ti":[15.023,0.655,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":75,"s":[45.697,-46.874,0],"to":[-1.949,-0.085,0],"ti":[0.703,0,0]},{"t":82,"s":[45.581,-4.439,0]}],"l":2},"a":{"a":0,"k":[33.133,14.23,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.024,0.435,0.286,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":3,"ty":2,"nm":"Eyes","parent":8,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":-18},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[69.257,22.635,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[69.257,22.635,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[66.027,27.232,0],"to":[0,0,0],"ti":[0,0,0]},{"t":66,"s":[69.257,22.635,0]}],"l":2},"a":{"a":0,"k":[5.089,7.974,0],"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":66,"s":[100,10,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":78,"s":[100,10,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":101,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":103,"s":[100,10,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":105,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":108,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":110,"s":[100,10,100]},{"t":112,"s":[100,100,100]}],"l":2}},"ao":0,"ef":[{"ty":35,"nm":"Transform","np":14,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","v":{"a":0,"k":[5.5,8]}},{"ty":3,"nm":"Position","v":{"a":0,"k":[5.5,8]}},{"ty":7,"nm":"Uniform Scale","v":{"a":0,"k":1}},{"ty":0,"nm":"Scale Height","v":{"a":0,"k":100}},{"ty":0,"nm":"Scale Width","v":{"a":0,"k":100}},{"ty":0,"nm":"Skew","v":{"a":0,"k":0}},{"ty":0,"nm":"Skew Axis","v":{"a":0,"k":0}},{"ty":0,"nm":"Rotation","v":{"a":0,"k":21}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":100}},{"ty":7,"nm":"Use Composition’s Shutter Angle","v":{"a":0,"k":1}},{"ty":0,"nm":"Shutter Angle","v":{"a":0,"k":0}},{"ty":7,"nm":"Sampling","v":{"a":0,"k":1}}]},{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.039,0.106,0.188,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":4,"ty":2,"nm":"Right Hand","parent":8,"refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[79.223,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[70.723,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[79.223,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[70.723,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":48,"s":[79.223,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[70.723,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":72,"s":[79.223,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84,"s":[70.723,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":96,"s":[79.223,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":108,"s":[70.723,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120,"s":[79.223,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":132,"s":[70.723,47.54,0],"to":[0,0,0],"ti":[0,0,0]},{"t":144,"s":[79.223,47.54,0]}],"l":2},"a":{"a":0,"k":[5.405,59.062,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.11,0.286,0.518,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":5,"ty":4,"nm":"Shape Layer 2","parent":4,"tt":1,"tp":8,"sr":1,"ks":{"o":{"a":0,"k":52},"r":{"a":0,"k":-11},"p":{"a":0,"k":[145.359,29.094,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-253.857,47.861]],"c":false}},"nm":"Path 1"},{"ty":"fl","c":{"a":0,"k":[0.039,0.106,0.188,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-118.057,-13.905],[-143.573,-8.462],[-149.25,14.5],[-140.5,23.25],[-114,17.5]],"c":true}},"nm":"Path 1"},{"ty":"fl","c":{"a":0,"k":[0.039,0.106,0.188,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1"}],"ip":0,"op":144,"st":0,"ct":1},{"ind":6,"ty":3,"nm":"Null 1","parent":9,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[18]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":64,"s":[18]},{"t":69,"s":[0]}]},"p":{"a":0,"k":[8.955,5.655,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[14.5,14.5,100],"l":2}},"ao":0,"ip":0,"op":144,"st":0},{"ind":7,"ty":2,"nm":"Head 2","parent":6,"refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":189,"s":[11]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":201,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":258,"s":[15]},{"t":273,"s":[11]}]},"p":{"a":0,"k":[-97.877,-247.176,0],"l":2},"a":{"a":0,"k":[44.657,37.904,0],"l":2},"s":{"a":0,"k":[689.655,689.655,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.11,0.286,0.518,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":8,"ty":2,"nm":"Head","parent":6,"td":1,"refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":189,"s":[11]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":201,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":258,"s":[15]},{"t":273,"s":[11]}]},"p":{"a":0,"k":[-97.877,-247.176,0],"l":2},"a":{"a":0,"k":[44.657,37.904,0],"l":2},"s":{"a":0,"k":[689.655,689.655,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.11,0.286,0.518,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":9,"ty":2,"nm":"Right Leg","parent":19,"refId":"image_4","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[59.53,2.877,0],"l":2},"a":{"a":0,"k":[9.306,32.243,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.078,0.208,0.376,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":10,"ty":2,"nm":"Left Leg","parent":8,"refId":"image_5","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-11]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":19,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":65,"s":[6]},{"t":72,"s":[-11]}]},"p":{"a":0,"k":[41.124,75.39,0],"l":2},"a":{"a":0,"k":[14.497,3.557,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.078,0.208,0.376,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":11,"ty":2,"nm":"Brush","parent":4,"refId":"image_6","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":7},"p":{"a":0,"k":[-73.296,106.626,0],"l":2},"a":{"a":0,"k":[18.265,190.145,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.141,0.365,0.659,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":13,"ty":2,"nm":"Paint","refId":"image_7","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[233.001,200.001,0],"l":2},"a":{"a":0,"k":[24.751,76.251,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.078,0.208,0.376,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":14,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[300,239,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10.25,40.75]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.075,0.086,0.102,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10.25,40.75]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.075,0.086,0.102,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[43.625,-7.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[118.182,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 5"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10.25,40.75]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.075,0.086,0.102,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[21.875,7.75]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[112.5,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 4"},{"ty":"tr","p":{"a":0,"k":[-47.375,1.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 4"}],"ip":0,"op":144,"st":0,"ct":1},{"ind":15,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[300,239,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.078,0.208,0.376,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10.25,65.75]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":190},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.078,0.208,0.376,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-14.625,14.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 3"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10.25,40.75]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.078,0.208,0.376,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[7.375,17.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 2"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10.25,40.75]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.078,0.208,0.376,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-36.625,1.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-9,-1],[0.928,-15.189],[-9,0],[-5,-18.5],[0,0],[0,0],[0.62,77.498],[-3.875,3.875],[0,0]],"o":[[0,0],[4.275,0.475],[-0.723,11.837],[6.021,0],[2.822,10.442],[0,0],[0,0],[-0.25,-31.25],[17.477,-17.477],[0,0]],"v":[[-48.5,-108.5],[-42.75,-93.25],[-26.928,-78.311],[-15.5,-55.5],[11,-46.5],[12.5,3],[-58,-7.25],[-91,-91],[-85.625,-129.5],[-48.5,-118]],"c":true}},"nm":"Path 1"},{"ty":"fl","c":{"a":0,"k":[0.078,0.208,0.376,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1"}],"ip":0,"op":144,"st":0,"ct":1},{"ind":16,"ty":2,"nm":"Left Hand 2","parent":4,"refId":"image_8","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-67.142,85.27,0],"l":2},"a":{"a":0,"k":[13.078,27.199,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.078,0.208,0.376,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":17,"ty":2,"nm":"Left Hand","parent":4,"td":1,"refId":"image_8","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-67.142,85.27,0],"l":2},"a":{"a":0,"k":[13.078,27.199,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.078,0.208,0.376,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0},{"ind":18,"ty":3,"nm":"Null 2","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.281],"y":[0.005]},"t":71,"s":[0]},{"i":{"x":[0.792],"y":[1]},"o":{"x":[0.273],"y":[-0.004]},"t":79,"s":[-7]},{"t":86,"s":[0]}]},"p":{"a":0,"k":[81.125,478.062,0],"l":2},"a":{"a":0,"k":[0,100,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ip":0,"op":144,"st":0},{"ind":19,"ty":2,"nm":"Ladder","parent":18,"refId":"image_9","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.955],"y":[0.993]},"o":{"x":[0.56],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[-0.001]},"t":68,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"t":144,"s":[0]}]},"p":{"a":0,"k":[37.925,98.997,0],"l":2},"a":{"a":0,"k":[39.23,191.848,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","v":{"a":0,"k":0}},{"ty":7,"nm":"All Masks","v":{"a":0,"k":0}},{"ty":2,"nm":"Color","v":{"a":0,"k":[0.016,0.251,0.165,1]}},{"ty":7,"nm":"Invert","v":{"a":0,"k":0}},{"ty":0,"nm":"Horizontal Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Vertical Feather","v":{"a":0,"k":0}},{"ty":0,"nm":"Opacity","v":{"a":0,"k":1}}]}],"ip":0,"op":144,"st":0}]},{"id":"comp_2","nm":"Background Dark","fr":23.976,"layers":[{"ind":1,"ty":4,"nm":"Shape Layer 2","tt":1,"tp":3,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[251.5,189.156,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[99.086,99.086,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[215.512,10.226]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":4},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.106,0.129,0.141,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[104.131,-46.619]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 8"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[215.512,10.226]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":4},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.106,0.129,0.141,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[104.131,-70.354]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 7"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[215.512,10.226]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":4},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.106,0.129,0.141,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[104.131,-94.619]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 6"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[215.512,10.226]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":4},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.106,0.129,0.141,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[104.131,-119.119]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 5"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[12,0],[8.5,0],[10,0],[8,0],[0,0],[0,0],[0,17.5]],"o":[[-12.5,0],[-8.5,0],[-11.5,0],[0,21],[0,0],[0,0],[-7,0]],"v":[[-130,-108.656],[-162.5,-80.656],[-188,-96.656],[-217.75,-62.656],[-217.5,-24.156],[-97.859,-22.406],[-98,-76.656]],"c":true}},"nm":"Path 1"},{"ty":"fl","c":{"a":0,"k":[0.176,0.2,0.212,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[0,8.771]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[120,53]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.175,0.2,0.21,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-157.628,30.254]},"a":{"a":0,"k":[0.018,59.947]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 4"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[120,120]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.149,0.176,0.188,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-157.777,-63.229]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 3"},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15.734,15.734]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1"},{"ty":"fl","c":{"a":0,"k":[0.149,0.176,0.188,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-218.157,-174.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[52.028,52.028]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 3"},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15.734,15.734]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1"},{"ty":"fl","c":{"a":0,"k":[0.149,0.176,0.188,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-228.407,-174.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[52.028,52.028]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 2"},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15.734,15.734]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1"},{"ty":"fl","c":{"a":0,"k":[0.149,0.176,0.188,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-239.157,-174.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[52.028,52.028]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[511.148,53.09]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.106,0.129,0.141,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[-0.541,-175.368]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[101.696,51.394]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 2"}],"ip":0,"op":144,"st":0,"ct":1},{"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[251.5,189,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[99.086,99.086,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[513.957,297.82]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.074,0.088,0.102,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[1.963,-39.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[99.782,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1"}],"ip":0,"op":144,"st":0,"ct":1},{"ind":3,"ty":4,"nm":"Shape Layer 1","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[251.5,189,0],"l":2},"a":{"a":0,"k":[0,0,0],"l":2},"s":{"a":0,"k":[99.086,99.086,100],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[513.957,297.82]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1"},{"ty":"fl","c":{"a":0,"k":[0.074,0.088,0.102,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1"},{"ty":"tr","p":{"a":0,"k":[1.963,-39.512]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[99.782,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1"}],"ip":0,"op":144,"st":0,"ct":1}]}],"layers":[{"ind":2,"ty":0,"nm":"Character + BG Dark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[289.5,239,0],"l":2},"a":{"a":0,"k":[350,239,0],"l":2},"s":{"a":0,"k":[100,100,100],"l":2}},"ao":0,"w":700,"h":478,"ip":0,"op":144,"st":0}],"markers":[]} \ No newline at end of file diff --git a/apps/client/src/app/pages/account/page.tsx b/apps/client/src/app/(main)/pages/account/page.tsx similarity index 52% rename from apps/client/src/app/pages/account/page.tsx rename to apps/client/src/app/(main)/pages/account/page.tsx index 5715696..f712dd4 100644 --- a/apps/client/src/app/pages/account/page.tsx +++ b/apps/client/src/app/(main)/pages/account/page.tsx @@ -1,4 +1,4 @@ -import Account from '../../../components/sections/account'; +import Account from '../../../../components/sections/account'; const Page = () => { return ; diff --git a/apps/client/src/app/(main)/pages/coming-soon/page.tsx b/apps/client/src/app/(main)/pages/coming-soon/page.tsx new file mode 100644 index 0000000..d1677dd --- /dev/null +++ b/apps/client/src/app/(main)/pages/coming-soon/page.tsx @@ -0,0 +1,114 @@ +'use client'; + +import Lottie from 'lottie-react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import bird from 'assets/json/bird.json'; +import bird_dark from 'assets/json/bird_dark.json'; +import charcter from 'assets/json/character.json'; +import charcter_dark from 'assets/json/character_dark.json'; +import { useThemeMode } from 'hooks/useThemeMode'; + +const ComingSoon = () => { + const { t } = useTranslation(); + const { isDark } = useThemeMode(); + return ( + + + + + + + + + + + + {t('coming_soon')}! + + + + + + + + (theme.direction === 'rtl' ? { transform: 'scaleX(-1)' } : {})}> + + + + + + (theme.direction === 'rtl' ? { transform: 'scaleX(-1)' } : {})}> + + + + + + + + + + + + + + + ); +}; + +export default ComingSoon; diff --git a/apps/client/src/routes/sitemap.ts b/apps/client/src/routes/sitemap.ts index 31b30f3..dc772ab 100644 --- a/apps/client/src/routes/sitemap.ts +++ b/apps/client/src/routes/sitemap.ts @@ -34,7 +34,7 @@ const sitemap: MenuItem[] = [ { name: 'E-commerce', key: 'e_commerce', - path: paths[404], + path: paths.comingSoon, pathName: 'e-commerce', icon: 'material-symbols:shopping-cart-outline', active: true, From 62ad799bb9e6d4c4417faadee4a7eb05085164f5 Mon Sep 17 00:00:00 2001 From: "Md.Saifur Rahman Rasel" Date: Fri, 14 Nov 2025 12:42:14 +0600 Subject: [PATCH 5/7] feat: passkey add, update and delete from account settings --- .../sections/account/touch-id/Biometrics.tsx | 344 ++++++++++++++---- .../account/touch-id/PasskeySetupDialog.tsx | 166 +++++++++ .../account/touch-id/TouchIdFeatures.tsx | 17 +- .../account/touch-id/TouchIdTabPanel.tsx | 8 +- .../authentications/default/SignupForm.tsx | 144 +------- apps/client/src/data/account/account-tabs.tsx | 4 +- 6 files changed, 459 insertions(+), 224 deletions(-) create mode 100644 apps/client/src/components/sections/account/touch-id/PasskeySetupDialog.tsx diff --git a/apps/client/src/components/sections/account/touch-id/Biometrics.tsx b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx index 0a1b3c1..ef42d7b 100644 --- a/apps/client/src/components/sections/account/touch-id/Biometrics.tsx +++ b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx @@ -1,98 +1,294 @@ -import { useState } from 'react'; -import { Box, Button, Stack, Typography } from '@mui/material'; -import IconifyIcon from 'components/base/IconifyIcon'; -import AccountDialog from '../common/AccountDialog'; +import { authClient } from '@/auth'; import InfoCard from '../common/InfoCard'; +import { useState, useEffect } from 'react'; +import IconifyIcon from 'components/base/IconifyIcon'; +import PasskeySetupDialog from './PasskeySetupDialog'; +import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Stack, TextField, Typography } from '@mui/material'; const Biometrics = () => { const [open, setOpen] = useState(false); + const [passkeys, setPasskeys] = useState([]); + const [loading, setLoading] = useState(true); + const [confirmDialogOpen, setConfirmDialogOpen] = useState(false); + const [passkeyToDelete, setPasskeyToDelete] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); + const [editDialogOpen, setEditDialogOpen] = useState(false); + const [passkeyToEdit, setPasskeyToEdit] = useState<{ id: string; name: string } | null>(null); + const [newPasskeyName, setNewPasskeyName] = useState(""); + const [isUpdating, setIsUpdating] = useState(false); + const [updateError, setUpdateError] = useState(""); + + const fetchPasskeys = async () => { + try { + const { data, error } = await authClient.passkey.listUserPasskeys(); + if (error) { + console.error('Error fetching passkeys:', error); + } else if (data) { + setPasskeys(data); + } + } catch (err) { + console.error('Failed to fetch passkeys:', err); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchPasskeys(); + }, []); + + const handleDeletePasskey = async (passkeyId: string) => { + setPasskeyToDelete(passkeyId); + setConfirmDialogOpen(true); + }; + + const confirmDelete = async () => { + if (!passkeyToDelete) return; + + setIsDeleting(true); + try { + const { data, error } = await authClient.passkey.deletePasskey({ + id: passkeyToDelete, + }); + + if (error) { + console.error('Error deleting passkey:', error); + } else { + setPasskeys((prev) => prev.filter((pk) => pk.id !== passkeyToDelete)); + } + } catch (err) { + console.error('Failed to delete passkey:', err); + } finally { + setIsDeleting(false); + setConfirmDialogOpen(false); + setPasskeyToDelete(null); + } + }; + + const handleEditPasskey = (passkeyId: string, currentName: string) => { + setPasskeyToEdit({ id: passkeyId, name: currentName }); + setNewPasskeyName(currentName); + setEditDialogOpen(true); + setUpdateError(""); + }; + + const confirmUpdate = async () => { + if (!passkeyToEdit || !newPasskeyName.trim()) { + setUpdateError("Passkey name is required"); + return; + } + + setIsUpdating(true); + setUpdateError(""); + + try { + const { error } = await authClient.passkey.updatePasskey({ + id: passkeyToEdit.id, + name: newPasskeyName.trim(), + }); + + if (error) { + setUpdateError(error.message || "Failed to update passkey"); + } else { + // Refetch passkeys to sync with server + await fetchPasskeys(); + setEditDialogOpen(false); + setPasskeyToEdit(null); + setNewPasskeyName(""); + } + } catch (err) { + setUpdateError("An unexpected error occurred"); + } finally { + setIsUpdating(false); + } + }; + + const handlePasskeySuccess = () => { + fetchPasskeys(); + }; return ( <> - Manage Touch ID Features + Manage Passkey Features - {Array.from({ length: 3 }).map((_, index) => ( - Loading... + ) : passkeys.length > 0 ? ( + passkeys.map((passkey, index) => ( + - - - - Fingerprint {index + 1} - - - - - ))} + }} + > + + + + {passkey.name || `Fingerprint ${index + 1}`} + + + + { + e.stopPropagation(); + handleEditPasskey(passkey.id, passkey.name || `Fingerprint ${index + 1}`); + }} + /> + { + e.stopPropagation(); + handleDeletePasskey(passkey.id); + }} + /> + + + )) + ) : ( + No passkeys found + )} - + {passkeys.length < 1 && ( + + )} - setOpen(false)} - title="Add Fingerprint" - subtitle="Touch ID enrollment was interrupted" - handleDiscard={() => setOpen(false)} - handleConfirm={() => setOpen(false)} - sx={{ width: 1 }} + onClose={() => setOpen(false)} + onSuccess={handlePasskeySuccess} + /> + + { + setEditDialogOpen(false); + setPasskeyToEdit(null); + setNewPasskeyName(""); + setUpdateError(""); + }} + maxWidth="sm" + fullWidth > - Edit Passkey Name + + {updateError && ( + + {updateError} + + )} + { + setNewPasskeyName(e.target.value); + if (updateError === "Passkey name is required") { + setUpdateError(""); + } + }} + variant="outlined" + sx={{ mt: 1 }} + error={updateError === "Passkey name is required"} + /> + + + + + + + + setConfirmDialogOpen(false)} + sx={{ + '& .MuiDialog-paper': { + width: 450, + }, + }} + > + - + + - - - - Your fingerprint can be used to unlock your account - - - + This action cannot be undone. You will need to set up a new passkey if you want to use this feature again. + + + + + + + ); }; diff --git a/apps/client/src/components/sections/account/touch-id/PasskeySetupDialog.tsx b/apps/client/src/components/sections/account/touch-id/PasskeySetupDialog.tsx new file mode 100644 index 0000000..e0d9e10 --- /dev/null +++ b/apps/client/src/components/sections/account/touch-id/PasskeySetupDialog.tsx @@ -0,0 +1,166 @@ +import { useState } from 'react'; +import { authClient } from '@/auth'; +import IconifyIcon from 'components/base/IconifyIcon'; +import { + Alert, + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + FormControl, + FormControlLabel, + FormLabel, + Radio, + RadioGroup, + Stack, + TextField, + Typography, +} from '@mui/material'; + +interface PasskeySetupDialogProps { + open: boolean; + onClose: () => void; + onSuccess?: () => void; +} + +const PasskeySetupDialog = ({ open, onClose, onSuccess }: PasskeySetupDialogProps) => { + const [passkeyName, setPasskeyName] = useState(""); + const [passkeyError, setPasskeyError] = useState(""); + const [isAddingPasskey, setIsAddingPasskey] = useState(false); + const [authenticatorType, setAuthenticatorType] = useState<"platform" | "cross-platform">("platform"); + + const handleAddPasskey = async () => { + if (!passkeyName.trim()) { + setPasskeyError("Passkey name is required"); + return; + } + + setIsAddingPasskey(true); + setPasskeyError(""); + + try { + const response = await authClient.passkey.addPasskey({ + name: passkeyName.trim(), + authenticatorAttachment: authenticatorType, + }); + + if (response?.error) { + setPasskeyError(response.error.message || "Failed to add passkey"); + } else { + setPasskeyName(""); + setAuthenticatorType("platform"); + onSuccess?.(); + onClose(); + } + } catch (err) { + setPasskeyError("An unexpected error occurred"); + } finally { + setIsAddingPasskey(false); + } + }; + + const handleClose = () => { + setPasskeyName(""); + setPasskeyError(""); + setAuthenticatorType("platform"); + onClose(); + }; + + return ( + + + + + Set Up Passkey + + + + + Enhance your account security with a passkey. Use your fingerprint or device PIN for quick and secure access. + + + {passkeyError && ( + + {passkeyError} + + )} + + { + setPasskeyName(e.target.value); + if (passkeyError === "Passkey name is required") { + setPasskeyError(""); + } + }} + sx={{ mb: 3 }} + variant="outlined" + error={passkeyError === "Passkey name is required"} + /> + + + + Authentication Method + + setAuthenticatorType(e.target.value as "platform" | "cross-platform")} + > + } + label={ + + + + This Device + + + (Use biometrics or PIN on this device) + + + } + /> + } + label={ + + + + Security Key + + + (Use a USB security key or another device) + + + } + /> + + + + + + + + + ); +}; + +export default PasskeySetupDialog; diff --git a/apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx b/apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx index 3b74cfe..744bd2c 100644 --- a/apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx +++ b/apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx @@ -9,28 +9,13 @@ const TouchIdFeatures = () => { sx={{ gap: 2, alignItems: 'flex-start' }} > - Manage Touch ID Features + Manage 2FA Features } label="Use Touch ID to unlock your login page" sx={{ gap: 2, ml: 0 }} /> - } - label="Use Touch ID for online payment" - sx={{ gap: 2, ml: 0 }} - /> - } - label="Use Touch ID for Autofilling passwords" - sx={{ gap: 2, ml: 0 }} - /> - } - label="Use Touch ID for fast user switching" - sx={{ gap: 2, ml: 0 }} - /> ); diff --git a/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx b/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx index f1c5a8a..10285ea 100644 --- a/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx +++ b/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx @@ -7,15 +7,15 @@ const TouchIDTabPanel = () => { return ( } spacing={5}> diff --git a/apps/client/src/components/sections/authentications/default/SignupForm.tsx b/apps/client/src/components/sections/authentications/default/SignupForm.tsx index f987a6f..948894e 100644 --- a/apps/client/src/components/sections/authentications/default/SignupForm.tsx +++ b/apps/client/src/components/sections/authentications/default/SignupForm.tsx @@ -4,18 +4,8 @@ import { Alert, Box, Button, - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, Divider, Link, - Radio, - RadioGroup, - FormControlLabel, - FormControl, - FormLabel, Stack, TextField, Typography, @@ -30,7 +20,7 @@ import paths, { rootPaths } from "routes/paths"; import IconifyIcon from "components/base/IconifyIcon"; import { yupResolver } from "@hookform/resolvers/yup"; import PasswordTextField from "components/common/PasswordTextField"; -import { useState } from "react"; +// import PasskeySetupDialog from "components/sections/account/touch-id/PasskeySetupDialog"; interface SignupFormProps { socialAuth?: boolean; @@ -57,11 +47,7 @@ const SignupForm = ({ socialAuth, }: SignupFormProps) => { const router = useRouter(); - const [showPasskeyDialog, setShowPasskeyDialog] = useState(false); - const [passkeyName, setPasskeyName] = useState(""); - const [authenticatorType, setAuthenticatorType] = useState<"platform" | "cross-platform">("platform"); - const [passkeyError, setPasskeyError] = useState(""); - const [isAddingPasskey, setIsAddingPasskey] = useState(false); + // const [showPasskeyDialog, setShowPasskeyDialog] = useState(false); const { register, @@ -80,41 +66,22 @@ const SignupForm = ({ }); if (signupData) { - setShowPasskeyDialog(true); + // setShowPasskeyDialog(true); + router.push(rootPaths.root); } if (error) { setError('root.credential', { type: 'manual', message: error.message }); } }; - const handleAddPasskey = async () => { - setIsAddingPasskey(true); - setPasskeyError(""); + // const handlePasskeySuccess = () => { + // router.push(rootPaths.root); + // }; - try { - const response = await authClient.passkey.addPasskey({ - name: passkeyName || "My Device", - authenticatorAttachment: authenticatorType, - }); - - if (response?.error) { - setPasskeyError(response.error.message || "Failed to add passkey"); - } else if (response?.data) { - router.push(rootPaths.root); - } else { - router.push(rootPaths.root); - } - } catch (err) { - setPasskeyError("An unexpected error occurred"); - } finally { - setIsAddingPasskey(false); - } - }; - - const handleSkipPasskey = () => { - setShowPasskeyDialog(false); - router.push(rootPaths.root); - }; + // const handleSkipPasskey = () => { + // setShowPasskeyDialog(false); + // router.push(rootPaths.root); + // }; return ( <> @@ -269,90 +236,11 @@ const SignupForm = ({ - - - - - Set Up Passkey - - - - - Enhance your account security with a passkey. Use your fingerprint, face, or device PIN for quick and secure access. - - - {passkeyError && ( - - {passkeyError} - - )} - - setPasskeyName(e.target.value)} - sx={{ mb: 3 }} - variant="outlined" - /> - - - - Authentication Method - - setAuthenticatorType(e.target.value as "platform" | "cross-platform")} - > - } - label={ - - - - This Device - - - (Use biometrics or PIN on this device) - - - } - /> - } - label={ - - - - Security Key - - - (Use a USB security key or another device) - - - } - /> - - - - - - - - + {/* */} ); }; diff --git a/apps/client/src/data/account/account-tabs.tsx b/apps/client/src/data/account/account-tabs.tsx index 88a3c95..b3ca18c 100644 --- a/apps/client/src/data/account/account-tabs.tsx +++ b/apps/client/src/data/account/account-tabs.tsx @@ -14,8 +14,8 @@ export const accountTabs: AccountTab[] = [ }, { id: 12, - label: 'Fingerprint Access Setup', - title: 'Fingerprint Access Setup', + label: 'Configure MFA', + title: 'Configure MFA', value: 'touch_id', icon: 'material-symbols:touch-app-outline', panelIcon: 'material-symbols:touch-app-outline', From 5f75eb9dc1ed2f94315b26f9c55161fd3e446d0d Mon Sep 17 00:00:00 2001 From: "Md.Saifur Rahman Rasel" Date: Fri, 14 Nov 2025 17:38:23 +0600 Subject: [PATCH 6/7] feat: passkey delete update and 2fa integrate --- .../sections/account/touch-id/Biometrics.tsx | 22 +- .../account/touch-id/TouchIdFeatures.tsx | 24 - .../account/touch-id/TouchIdTabPanel.tsx | 4 +- .../account/touch-id/TwoFactorFeatures.tsx | 179 +++++ .../authentications/default/LoginForm.tsx | 636 +++++++++++++----- .../authentications/default/SignupForm.tsx | 144 +++- 6 files changed, 782 insertions(+), 227 deletions(-) delete mode 100644 apps/client/src/components/sections/account/touch-id/TouchIdFeatures.tsx create mode 100644 apps/client/src/components/sections/account/touch-id/TwoFactorFeatures.tsx diff --git a/apps/client/src/components/sections/account/touch-id/Biometrics.tsx b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx index ef42d7b..f38579b 100644 --- a/apps/client/src/components/sections/account/touch-id/Biometrics.tsx +++ b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx @@ -161,17 +161,17 @@ const Biometrics = () => { No passkeys found )} - {passkeys.length < 1 && ( - - )} + {/* {passkeys.length < 1 && ( */} + + {/* )} */} { - return ( - - - - Manage 2FA Features - - } - label="Use Touch ID to unlock your login page" - sx={{ gap: 2, ml: 0 }} - /> - - - ); -}; - -export default TouchIdFeatures; diff --git a/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx b/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx index 10285ea..318b124 100644 --- a/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx +++ b/apps/client/src/components/sections/account/touch-id/TouchIdTabPanel.tsx @@ -1,7 +1,7 @@ import { Divider, Stack } from '@mui/material'; import AccountTabPanelSection from '../common/AccountTabPanelSection'; import Biometrics from './Biometrics'; -import TouchIdFeatures from './TouchIdFeatures'; +import TwoFactorFeatures from './TwoFactorFeatures'; const TouchIDTabPanel = () => { return ( @@ -18,7 +18,7 @@ const TouchIDTabPanel = () => { subtitle="Enable two-factor authentication to add an extra layer of security to your account." icon="material-symbols:lock-clock-outline" > - + ); diff --git a/apps/client/src/components/sections/account/touch-id/TwoFactorFeatures.tsx b/apps/client/src/components/sections/account/touch-id/TwoFactorFeatures.tsx new file mode 100644 index 0000000..f8d17d2 --- /dev/null +++ b/apps/client/src/components/sections/account/touch-id/TwoFactorFeatures.tsx @@ -0,0 +1,179 @@ +import { authClient } from '@/auth'; +import { useState, useEffect } from 'react'; +import { FormControl, FormControlLabel, Stack, Switch, Typography, Dialog, DialogTitle, DialogContent, DialogActions, Button, TextField, Alert, CircularProgress } from '@mui/material'; + +const TwoFactorFeatures = () => { + const [twoFactorEnabled, setTwoFactorEnabled] = useState(false); + const [loading, setLoading] = useState(false); + const [openPasswordDialog, setOpenPasswordDialog] = useState(false); + const [dialogMode, setDialogMode] = useState<'enable' | 'disable'>('enable'); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + + useEffect(() => { + const fetchUser = async () => { + try { + const { data } = await authClient.getSession(); + setTwoFactorEnabled(data?.user?.twoFactorEnabled || false); + } catch (err) { + console.error('Failed to fetch user session:', err); + } + }; + fetchUser(); + }, []); + + const handleSwitchChange = async (event: React.ChangeEvent) => { + const isChecked = event.target.checked; + + if (isChecked) { + setDialogMode('enable'); + setOpenPasswordDialog(true); + } else { + setDialogMode('disable'); + setOpenPasswordDialog(true); + } + }; + + const handleEnable2FA = async () => { + if (!password) { + setError('Password is required'); + return; + } + + setLoading(true); + setError(''); + + try { + const { data, error } = await authClient.twoFactor.enable({ + password, + issuer: 'my-app-name', + }); + + if (error) { + setError(error.message || 'Failed to enable 2FA'); + return; + } + + if (data) { + setTwoFactorEnabled(true); + setOpenPasswordDialog(false); + setPassword(''); + console.log('2FA enabled:', data); + } + } catch (err: any) { + setError(err.message || 'An error occurred'); + } finally { + setLoading(false); + } + }; + + const handleDisable2FA = async () => { + if (!password) { + setError('Password is required'); + return; + } + + setLoading(true); + setError(''); + + try { + const { error } = await authClient.twoFactor.disable({ + password, + }); + + if (error) { + setError(error.message || 'Failed to disable 2FA'); + setTwoFactorEnabled(true); + return; + } + + setTwoFactorEnabled(false); + setOpenPasswordDialog(false); + setPassword(''); + } catch (err: any) { + setError(err.message || 'An error occurred'); + setTwoFactorEnabled(true); + } finally { + setLoading(false); + } + }; + + const handleCloseDialog = () => { + setOpenPasswordDialog(false); + setPassword(''); + setError(''); + }; + + const handleSubmit = () => { + if (dialogMode === 'enable') { + handleEnable2FA(); + } else { + handleDisable2FA(); + } + }; + + return ( + <> + + + + Manage 2FA Features + + + } + label="Enable Two-Factor Authentication (2FA)" + sx={{ gap: 2, ml: 0 }} + /> + + + + + + {dialogMode === 'enable' ? 'Enable' : 'Disable'} Two-Factor Authentication + + + + + Please enter your password to {dialogMode === 'enable' ? 'enable' : 'disable'} 2FA + + setPassword(e.target.value)} + fullWidth + autoFocus + error={!!error} + helperText={error} + /> + + + + + + + + + ); +}; + +export default TwoFactorFeatures; diff --git a/apps/client/src/components/sections/authentications/default/LoginForm.tsx b/apps/client/src/components/sections/authentications/default/LoginForm.tsx index b27f1a2..c6aca49 100644 --- a/apps/client/src/components/sections/authentications/default/LoginForm.tsx +++ b/apps/client/src/components/sections/authentications/default/LoginForm.tsx @@ -14,16 +14,21 @@ import { Stack, TextField, Typography, + Dialog, + DialogContent, } from '@mui/material'; +import dayjs from 'dayjs'; import * as yup from 'yup'; import { authClient } from '@/auth'; import Grid from '@mui/material/Grid'; import SocialAuth from './SocialAuth'; import { rootPaths } from 'routes/paths'; +import useCountdown from 'hooks/useCountdown'; +import IconifyIcon from 'components/base/IconifyIcon'; +import StyledTextField from 'components/styled/StyledTextField'; import PasswordTextField from 'components/common/PasswordTextField'; import DefaultCredentialAlert from '../common/DefaultCredentialAlert'; -import IconifyIcon from 'components/base/IconifyIcon'; -import { useState, useEffect } from 'react'; +import { useState, useEffect, useRef, ChangeEvent, Fragment } from 'react'; interface LoginFormProps { signUpLink: string; @@ -44,6 +49,8 @@ const schema = yup.object({ export type LoginFormValues = yup.InferType; +const totalInputLength = 6; + const LoginForm = ({ signUpLink, forgotPasswordLink, @@ -56,6 +63,15 @@ const LoginForm = ({ const [isSigningInWithPasskey, setIsSigningInWithPasskey] = useState(false); const [passkeyAvailable, setPasskeyAvailable] = useState(false); + const [show2FADialog, setShow2FADialog] = useState(false); + const [twoFactorError, setTwoFactorError] = useState(''); + const [isVerifying2FA, setIsVerifying2FA] = useState(false); + + const [otp, setOtp] = useState(''); + const inputRefs = useRef<(HTMLInputElement | null)[]>([]); + const [otpSent, setOtpSent] = useState(false); + const { time, startTimer } = useCountdown(); + const searchParams = useSearchParams(); const callbackUrl = searchParams.get('callbackUrl'); @@ -87,20 +103,117 @@ const LoginForm = ({ }, []); const onSubmit = async (data: LoginFormValues) => { - const { data: loginData, error } = await authClient.signIn.email({ - email: data.email, - password: data.password, - rememberMe: data.rememberMe, - }); + const { data: loginData, error } = await authClient.signIn.email( + { + email: data.email, + password: data.password, + rememberMe: data.rememberMe, + }, + { + async onSuccess(context) { + if (context.data.twoFactorRedirect) { + setShow2FADialog(true); + sentOtp(); // Start countdown timer + } else { + router.push(callbackUrl ? callbackUrl : rootPaths.root); + } + }, + } + ); - if (loginData) { - router.push(callbackUrl ? callbackUrl : rootPaths.root); - } if (error) { setError('root.credential', { type: 'manual', message: error.message }); } }; + const handleVerify2FA = async () => { + if (!otp || otp.length !== totalInputLength) { + setTwoFactorError('Please enter a valid 6-digit code'); + return; + } + + setIsVerifying2FA(true); + setTwoFactorError(''); + + try { + const { data, error } = await authClient.twoFactor.verifyTotp({ + code: otp, + }); + + if (error) { + setTwoFactorError(error.message || 'Invalid verification code'); + inputRefs.current.forEach((input) => { + if (input) input.value = ''; + }); + setOtp(''); + inputRefs.current[0]?.focus(); + return; + } + + if (data) { + setShow2FADialog(false); + router.push(callbackUrl ? callbackUrl : rootPaths.root); + } + } catch (err: any) { + setTwoFactorError(err.message || 'An error occurred during verification'); + } finally { + setIsVerifying2FA(false); + } + }; + + const handleClose2FADialog = () => { + setShow2FADialog(false); + setOtp(''); + setTwoFactorError(''); + inputRefs.current.forEach((input) => { + if (input) input.value = ''; + }); + }; + + const handleChange = (e: ChangeEvent, index: number): void => { + const { value } = e.target; + if (value) { + [...value].slice(0, totalInputLength).forEach((char, charIndex) => { + if (inputRefs.current && inputRefs.current[index + charIndex]) { + inputRefs.current[index + charIndex]!.value = char; + inputRefs.current[index + charIndex + 1]?.focus(); + } + }); + const updatedOtp = inputRefs.current.reduce((acc, input) => acc + (input?.value || ''), ''); + setOtp(updatedOtp); + } + }; + + const handleKeydown = (event: React.KeyboardEvent, index: number) => { + if (event.key === 'Backspace') { + inputRefs.current[index]!.value = ''; + inputRefs.current[index - 1]?.focus(); + inputRefs.current[index - 1]?.select(); + + const updatedOtp = inputRefs.current.reduce((acc, input) => acc + (input?.value || ''), ''); + setOtp(updatedOtp); + } + if (event.key === 'ArrowLeft') { + inputRefs.current[index - 1]?.focus(); + inputRefs.current[index - 1]?.select(); + } + if (event.key === 'ArrowRight') { + inputRefs.current[index + 1]?.focus(); + inputRefs.current[index + 1]?.select(); + } + }; + + const sentOtp = () => { + setOtpSent(true); + startTimer(30, () => { + setOtpSent(false); + }); + }; + + useEffect(() => { + sentOtp(); + }, []); + const handlePasskeySignIn = async (autoFill: boolean = false) => { setIsSigningInWithPasskey(true); setPasskeyError(""); @@ -127,193 +240,368 @@ const LoginForm = ({ }; return ( - -
- - + - - - Log in - - Don't have an account? - - Sign up - - - - - - {passkeyAvailable && ( + - - {passkeyError && ( - - {passkeyError} - - )} - - )} - - {passkeyAvailable && ( - - or + Log in + + Don't have an account? + + Sign up + + + - )} - {socialAuth && ( - <> + {passkeyAvailable && ( - - - - or use email - - - )} - - - - {errors.root?.credential?.message && ( - - {errors.root?.credential?.message} - - )} - {defaultCredential && } - - handlePasskeySignIn(false)} + loading={isSigningInWithPasskey} + loadingPosition="start" + startIcon={} sx={{ - mb: 3, + borderStyle: 'dashed', + py: 1.5, }} - size={12} > - {errors.email?.message}} - {...register('email')} - /> + Sign in with Passkey + + {passkeyError && ( + + {passkeyError} + + )} + + )} + + {passkeyAvailable && ( + + or + + )} + + {socialAuth && ( + <> + + - - {errors.password?.message}} - {...register('password')} - /> + + or use email - - + )} + + + + {errors.root?.credential?.message && ( + + {errors.root?.credential?.message} + + )} + {defaultCredential && } + + + {errors.email?.message}} + {...register('email')} + /> + + - {rememberDevice && ( - } - label={ - - Remember this device - - } - /> - )} - - {forgotPasswordLink && ( - - Forgot Password? - - )} - + {errors.password?.message}} + {...register('password')} + /> + + + + {rememberDevice && ( + } + label={ + + Remember this device + + } + /> + )} + + {forgotPasswordLink && ( + + Forgot Password? + + )} + + + + + + + + + + Trouble signing in? + + + + {/* 2FA Verification Dialog */} + + + + - + Enter the OTP + + + A 6-digit one time password (OTP) has been sent to your authenticator app + + {twoFactorError && ( + + {twoFactorError} + + )} + + Didn't receive the code?{' '} + sentOtp()} + sx={{ + fontWeight: 'medium', + ml: 0.5, + }} + > + Send again {otpSent && <>in {dayjs(time * 1000).format('m:ss')} s} + + + + + + + + + {Array(totalInputLength) + .fill('') + .map((_, index) => ( + + + { + inputRefs.current[index] = el; + }} + type="number" + disabledSpinButton + sx={{ width: '42px', textAlign: 'center' }} + slotProps={{ + input: { + sx: { + '& .MuiInputBase-input': { + textAlign: 'center', + px: '12px !important', + }, + }, + }, + }} + onClick={() => inputRefs.current[index]?.select()} + onFocus={() => inputRefs.current[index]?.select()} + onKeyUp={(e) => handleKeydown(e, index)} + onChange={(e: ChangeEvent) => handleChange(e, index)} + size="large" + disabled={isVerifying2FA} + /> + + {index === totalInputLength / 2 - 1 && ( + - + )} + + ))} + + + + } + label={ + + Remember this device + + } + /> + + + + + + + + + - - - - - Trouble signing in? - - + + + + ); }; diff --git a/apps/client/src/components/sections/authentications/default/SignupForm.tsx b/apps/client/src/components/sections/authentications/default/SignupForm.tsx index 948894e..f987a6f 100644 --- a/apps/client/src/components/sections/authentications/default/SignupForm.tsx +++ b/apps/client/src/components/sections/authentications/default/SignupForm.tsx @@ -4,8 +4,18 @@ import { Alert, Box, Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, Divider, Link, + Radio, + RadioGroup, + FormControlLabel, + FormControl, + FormLabel, Stack, TextField, Typography, @@ -20,7 +30,7 @@ import paths, { rootPaths } from "routes/paths"; import IconifyIcon from "components/base/IconifyIcon"; import { yupResolver } from "@hookform/resolvers/yup"; import PasswordTextField from "components/common/PasswordTextField"; -// import PasskeySetupDialog from "components/sections/account/touch-id/PasskeySetupDialog"; +import { useState } from "react"; interface SignupFormProps { socialAuth?: boolean; @@ -47,7 +57,11 @@ const SignupForm = ({ socialAuth, }: SignupFormProps) => { const router = useRouter(); - // const [showPasskeyDialog, setShowPasskeyDialog] = useState(false); + const [showPasskeyDialog, setShowPasskeyDialog] = useState(false); + const [passkeyName, setPasskeyName] = useState(""); + const [authenticatorType, setAuthenticatorType] = useState<"platform" | "cross-platform">("platform"); + const [passkeyError, setPasskeyError] = useState(""); + const [isAddingPasskey, setIsAddingPasskey] = useState(false); const { register, @@ -66,22 +80,41 @@ const SignupForm = ({ }); if (signupData) { - // setShowPasskeyDialog(true); - router.push(rootPaths.root); + setShowPasskeyDialog(true); } if (error) { setError('root.credential', { type: 'manual', message: error.message }); } }; - // const handlePasskeySuccess = () => { - // router.push(rootPaths.root); - // }; + const handleAddPasskey = async () => { + setIsAddingPasskey(true); + setPasskeyError(""); - // const handleSkipPasskey = () => { - // setShowPasskeyDialog(false); - // router.push(rootPaths.root); - // }; + try { + const response = await authClient.passkey.addPasskey({ + name: passkeyName || "My Device", + authenticatorAttachment: authenticatorType, + }); + + if (response?.error) { + setPasskeyError(response.error.message || "Failed to add passkey"); + } else if (response?.data) { + router.push(rootPaths.root); + } else { + router.push(rootPaths.root); + } + } catch (err) { + setPasskeyError("An unexpected error occurred"); + } finally { + setIsAddingPasskey(false); + } + }; + + const handleSkipPasskey = () => { + setShowPasskeyDialog(false); + router.push(rootPaths.root); + }; return ( <> @@ -236,11 +269,90 @@ const SignupForm = ({ - {/* */} + + + + + Set Up Passkey + + + + + Enhance your account security with a passkey. Use your fingerprint, face, or device PIN for quick and secure access. + + + {passkeyError && ( + + {passkeyError} + + )} + + setPasskeyName(e.target.value)} + sx={{ mb: 3 }} + variant="outlined" + /> + + + + Authentication Method + + setAuthenticatorType(e.target.value as "platform" | "cross-platform")} + > + } + label={ + + + + This Device + + + (Use biometrics or PIN on this device) + + + } + /> + } + label={ + + + + Security Key + + + (Use a USB security key or another device) + + + } + /> + + + + + + + + ); }; From 1b918de4f67e8ef71c0d804707464da372b9070e Mon Sep 17 00:00:00 2001 From: "Md.Saifur Rahman Rasel" Date: Mon, 17 Nov 2025 14:15:17 +0600 Subject: [PATCH 7/7] feat: 2fa and passkey functionality add to the signup page --- apps/client/package.json | 1 + .../sections/account/touch-id/Biometrics.tsx | 22 +- .../account/touch-id/TwoFactorFeatures.tsx | 117 +++++++- .../authentications/default/LoginForm.tsx | 6 +- .../authentications/default/SignupForm.tsx | 270 +++++++++++++----- pnpm-lock.yaml | 19 ++ 6 files changed, 337 insertions(+), 98 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 52ed930..4d05a1b 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -51,6 +51,7 @@ "react-dom": "19.2.0", "react-hook-form": "^7.65.0", "react-i18next": "^16.1.0", + "react-qr-code": "^2.0.18", "simplebar-core": "^1.3.2", "simplebar-react": "^3.3.2", "stylis": "^4.3.6", diff --git a/apps/client/src/components/sections/account/touch-id/Biometrics.tsx b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx index f38579b..ef42d7b 100644 --- a/apps/client/src/components/sections/account/touch-id/Biometrics.tsx +++ b/apps/client/src/components/sections/account/touch-id/Biometrics.tsx @@ -161,17 +161,17 @@ const Biometrics = () => { No passkeys found )} - {/* {passkeys.length < 1 && ( */} - - {/* )} */} + {passkeys.length < 1 && ( + + )} { const [twoFactorEnabled, setTwoFactorEnabled] = useState(false); const [loading, setLoading] = useState(false); const [openPasswordDialog, setOpenPasswordDialog] = useState(false); + const [openQRDialog, setOpenQRDialog] = useState(false); const [dialogMode, setDialogMode] = useState<'enable' | 'disable'>('enable'); const [password, setPassword] = useState(''); + const [totpCode, setTotpCode] = useState(''); + const [totpURI, setTotpURI] = useState(''); const [error, setError] = useState(''); useEffect(() => { @@ -46,7 +50,6 @@ const TwoFactorFeatures = () => { try { const { data, error } = await authClient.twoFactor.enable({ password, - issuer: 'my-app-name', }); if (error) { @@ -55,10 +58,21 @@ const TwoFactorFeatures = () => { } if (data) { - setTwoFactorEnabled(true); - setOpenPasswordDialog(false); - setPassword(''); - console.log('2FA enabled:', data); + const totpRes = await authClient.twoFactor.getTotpUri({ + password + }); + + if (totpRes.error) { + setError(totpRes.error.message || 'Failed to get QR code'); + return; + } + + if (totpRes.data?.totpURI) { + setTotpURI(totpRes.data.totpURI); + setOpenPasswordDialog(false); + setOpenQRDialog(true); + setPassword(''); + } } } catch (err: any) { setError(err.message || 'An error occurred'); @@ -67,6 +81,36 @@ const TwoFactorFeatures = () => { } }; + const handleVerifyTOTP = async () => { + if (!totpCode || totpCode.length !== 6) { + setError('Please enter a valid 6-digit code'); + return; + } + + setLoading(true); + setError(''); + + try { + const { error } = await authClient.twoFactor.verifyTotp({ + code: totpCode, + }); + + if (error) { + setError(error.message || 'Invalid TOTP code'); + return; + } + + // Successfully verified - show backup codes + setTwoFactorEnabled(true); + setOpenQRDialog(false); + setTotpCode(''); + } catch (err: any) { + setError(err.message || 'An error occurred'); + } finally { + setLoading(false); + } + }; + const handleDisable2FA = async () => { if (!password) { setError('Password is required'); @@ -104,6 +148,13 @@ const TwoFactorFeatures = () => { setError(''); }; + const handleCloseQRDialog = () => { + setOpenQRDialog(false); + setTotpCode(''); + setError(''); + setTotpURI(''); + }; + const handleSubmit = () => { if (dialogMode === 'enable') { handleEnable2FA(); @@ -137,14 +188,15 @@ const TwoFactorFeatures = () => { + {/* Password Dialog */} - + {dialogMode === 'enable' ? 'Enable' : 'Disable'} Two-Factor Authentication - + - Please enter your password to {dialogMode === 'enable' ? 'enable' : 'disable'} 2FA + Enter password { + + {/* QR Code and Verification Dialog */} + + Scan QR Code + + + + Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.) + + {totpURI ? ( + + + + ) : ( + + + + )} + + After scanning, enter the 6-digit code from your authenticator app: + + setTotpCode(e.target.value.replace(/\D/g, '').slice(0, 6))} + fullWidth + autoFocus + error={!!error} + helperText={error} + inputProps={{ maxLength: 6 }} + /> + + + + + + + ); }; diff --git a/apps/client/src/components/sections/authentications/default/LoginForm.tsx b/apps/client/src/components/sections/authentications/default/LoginForm.tsx index c6aca49..9597bcf 100644 --- a/apps/client/src/components/sections/authentications/default/LoginForm.tsx +++ b/apps/client/src/components/sections/authentications/default/LoginForm.tsx @@ -113,7 +113,7 @@ const LoginForm = ({ async onSuccess(context) { if (context.data.twoFactorRedirect) { setShow2FADialog(true); - sentOtp(); // Start countdown timer + sentOtp(); } else { router.push(callbackUrl ? callbackUrl : rootPaths.root); } @@ -422,9 +422,9 @@ const LoginForm = ({ - + {/* Trouble signing in? - + */} {/* 2FA Verification Dialog */} diff --git a/apps/client/src/components/sections/authentications/default/SignupForm.tsx b/apps/client/src/components/sections/authentications/default/SignupForm.tsx index f987a6f..dbedf68 100644 --- a/apps/client/src/components/sections/authentications/default/SignupForm.tsx +++ b/apps/client/src/components/sections/authentications/default/SignupForm.tsx @@ -19,8 +19,13 @@ import { Stack, TextField, Typography, + Tabs, + Tab, + CircularProgress, } from "@mui/material"; import * as yup from "yup"; +import { useState } from "react"; +import QRCode from "react-qr-code"; import { authClient } from "@/auth"; import Grid from "@mui/material/Grid"; import SocialAuth from "./SocialAuth"; @@ -30,7 +35,6 @@ import paths, { rootPaths } from "routes/paths"; import IconifyIcon from "components/base/IconifyIcon"; import { yupResolver } from "@hookform/resolvers/yup"; import PasswordTextField from "components/common/PasswordTextField"; -import { useState } from "react"; interface SignupFormProps { socialAuth?: boolean; @@ -57,11 +61,16 @@ const SignupForm = ({ socialAuth, }: SignupFormProps) => { const router = useRouter(); - const [showPasskeyDialog, setShowPasskeyDialog] = useState(false); + const [showSecurityDialog, setShowSecurityDialog] = useState(false); const [passkeyName, setPasskeyName] = useState(""); const [authenticatorType, setAuthenticatorType] = useState<"platform" | "cross-platform">("platform"); const [passkeyError, setPasskeyError] = useState(""); const [isAddingPasskey, setIsAddingPasskey] = useState(false); + const [activeTab, setActiveTab] = useState(0); + const [totpCode, setTotpCode] = useState(''); + const [totpURI, setTotpURI] = useState(''); + const [qrError, setQrError] = useState(''); + const [isSettingUp2FA, setIsSettingUp2FA] = useState(false); const { register, @@ -80,13 +89,62 @@ const SignupForm = ({ }); if (signupData) { - setShowPasskeyDialog(true); + setShowSecurityDialog(true); + await fetch2FAuth(data.password); } if (error) { setError('root.credential', { type: 'manual', message: error.message }); } }; + const fetch2FAuth = async (password: string) => { + try { + const { data, error } = await authClient.twoFactor.enable({ + password, + }); + + if (!error && data) { + const totpRes = await authClient.twoFactor.getTotpUri({ + password + }); + + if (totpRes.data?.totpURI) { + setTotpURI(totpRes.data.totpURI); + } + } + } catch (err) { + console.error('Failed to fetch 2FA URI:', err); + } + }; + + const handleVerifyTOTP = async () => { + if (!totpCode || totpCode.length !== 6) { + setQrError('Please enter a valid 6-digit code'); + return; + } + + setIsSettingUp2FA(true); + setQrError(''); + + try { + const { error } = await authClient.twoFactor.verifyTotp({ + code: totpCode, + }); + + if (error) { + setQrError(error.message || 'Invalid TOTP code'); + return; + } + + setShowSecurityDialog(false); + router.push(rootPaths.root); + } catch (err: any) { + setQrError(err.message || 'An error occurred'); + } finally { + setIsSettingUp2FA(false); + } + }; + const handleAddPasskey = async () => { setIsAddingPasskey(true); setPasskeyError(""); @@ -112,7 +170,7 @@ const SignupForm = ({ }; const handleSkipPasskey = () => { - setShowPasskeyDialog(false); + setShowSecurityDialog(false); router.push(rootPaths.root); }; @@ -264,93 +322,155 @@ const SignupForm = ({ - + {/* Trouble signing in? - + */} - + - - - Set Up Passkey - + setActiveTab(newValue)}> + } + iconPosition="start" + label="Set Up Passkey" + /> + } + iconPosition="start" + label="Set QR Code" + /> + - - Enhance your account security with a passkey. Use your fingerprint, face, or device PIN for quick and secure access. - + {activeTab === 0 && ( + <> + + Enhance your account security with a passkey. Use your fingerprint, face, or device PIN for quick and secure access. + + + {passkeyError && ( + + {passkeyError} + + )} + + setPasskeyName(e.target.value)} + sx={{ mb: 3 }} + variant="outlined" + /> - {passkeyError && ( - - {passkeyError} - + + + Authentication Method + + setAuthenticatorType(e.target.value as "platform" | "cross-platform")} + > + } + label={ + + + + This Device + + + (Use biometrics or PIN on this device) + + + } + /> + } + label={ + + + + Security Key + + + (Use a USB security key or another device) + + + } + /> + + + )} - setPasskeyName(e.target.value)} - sx={{ mb: 3 }} - variant="outlined" - /> + {activeTab === 1 && ( + + + Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.) + + {totpURI ? ( + + + + ) : ( + + + + )} + + After scanning, enter the 6-digit code from your authenticator app: + - - - Authentication Method - - setAuthenticatorType(e.target.value as "platform" | "cross-platform")} - > - } - label={ - - - - This Device - - - (Use biometrics or PIN on this device) - - - } - /> - } - label={ - - - - Security Key - - - (Use a USB security key or another device) - - - } + {qrError && ( + + {qrError} + + )} + + setTotpCode(e.target.value.replace(/\D/g, '').slice(0, 6))} + fullWidth + autoFocus + error={!!qrError} + inputProps={{ maxLength: 6 }} /> - - + + )} - + {activeTab === 0 ? ( + + ) : ( + + )} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40d1431..e5094d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,6 +141,9 @@ importers: react-i18next: specifier: ^16.1.0 version: 16.2.3(i18next@25.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react-qr-code: + specifier: ^2.0.18 + version: 2.0.18(react@19.2.0) simplebar-core: specifier: ^1.3.2 version: 1.3.2 @@ -5024,6 +5027,9 @@ packages: resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} engines: {node: '>=16.0.0'} + qr.js@0.0.0: + resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} + qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -5090,6 +5096,11 @@ packages: react-is@19.2.0: resolution: {integrity: sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==} + react-qr-code@2.0.18: + resolution: {integrity: sha512-v1Jqz7urLMhkO6jkgJuBYhnqvXagzceg3qJUWayuCK/c6LTIonpWbwxR1f1APGd4xrW/QcQEovNrAojbUz65Tg==} + peerDependencies: + react: '*' + react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -11441,6 +11452,8 @@ snapshots: pvutils@1.1.5: {} + qr.js@0.0.0: {} + qs@6.14.0: dependencies: side-channel: 1.1.0 @@ -11500,6 +11513,12 @@ snapshots: react-is@19.2.0: {} + react-qr-code@2.0.18(react@19.2.0): + dependencies: + prop-types: 15.8.1 + qr.js: 0.0.0 + react: 19.2.0 + react-transition-group@4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.28.4