feat(WEB-167): update my pages layout to MVP wireframes
This commit is contained in:
@@ -28,32 +28,40 @@ export const challenges = {
|
|||||||
export const shortcuts = [
|
export const shortcuts = [
|
||||||
{
|
{
|
||||||
href: "#",
|
href: "#",
|
||||||
title: "Scandic Friends shop",
|
title: "My Benefit",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
href: "#",
|
href: "#",
|
||||||
title: "Fire and safety",
|
title: "Program overview",
|
||||||
},
|
|
||||||
{
|
|
||||||
href: "#",
|
|
||||||
title: "Our sustainability work",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
href: "#",
|
|
||||||
title: "How you earn points",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
href: "#",
|
|
||||||
title: "How you use points",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
href: "#",
|
|
||||||
title: "Missing points",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
href: "#",
|
|
||||||
title: "Our term and conditions",
|
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// href: "#",
|
||||||
|
// title: "Scandic Friends shop",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// href: "#",
|
||||||
|
// title: "Fire and safety",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// href: "#",
|
||||||
|
// title: "Our sustainability work",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// href: "#",
|
||||||
|
// title: "How you earn points",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// href: "#",
|
||||||
|
// title: "How you use points",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// href: "#",
|
||||||
|
// title: "Missing points",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// href: "#",
|
||||||
|
// title: "Our term and conditions",
|
||||||
|
// },
|
||||||
]
|
]
|
||||||
|
|
||||||
export const stays = [
|
export const stays = [
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
.content {
|
.content {
|
||||||
display: grid;
|
display: grid;
|
||||||
padding: 0 0 17.5rem;
|
padding: 0 0 17.5rem;
|
||||||
padding-bottom: 2.4rem;
|
padding-bottom: 7.7rem;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
@media screen and (min-width: 950px) {
|
@media screen and (min-width: 950px) {
|
||||||
.page {
|
.page {
|
||||||
gap: 4.4rem;
|
gap: 5.8rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts"
|
import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts"
|
||||||
|
|
||||||
import Breadcrumbs from "@/components/MyPages/Header/Breadcrumbs"
|
|
||||||
import Header from "@/components/MyPages/Header"
|
import Header from "@/components/MyPages/Header"
|
||||||
import Sidebar from "@/components/MyPages/Sidebar"
|
import Sidebar from "@/components/MyPages/Sidebar"
|
||||||
|
|
||||||
@@ -13,14 +12,12 @@ export default function MyPagesLayout({
|
|||||||
params,
|
params,
|
||||||
}: React.PropsWithChildren<LayoutArgs<LangParams>>) {
|
}: React.PropsWithChildren<LayoutArgs<LangParams>>) {
|
||||||
return (
|
return (
|
||||||
<section
|
<div className={`${firaMono.variable} ${firaSans.variable} ${styles.page}`}>
|
||||||
className={`${firaMono.variable} ${firaSans.variable} ${styles.page}`}
|
|
||||||
>
|
|
||||||
<Header lang={params.lang} />
|
<Header lang={params.lang} />
|
||||||
<section className={styles.content}>
|
<div className={styles.content}>
|
||||||
<Sidebar />
|
<Sidebar />
|
||||||
<main>{children}</main>
|
{children}
|
||||||
</section>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
.blocks {
|
.blocks {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 4.2rem;
|
gap: 4.2rem;
|
||||||
|
max-width: var(--max-width);
|
||||||
padding-left: 2rem;
|
padding-left: 2rem;
|
||||||
padding-right: 2rem;
|
padding-right: 2rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { serverClient } from "@/lib/trpc/server"
|
|||||||
|
|
||||||
import { challenges, shortcuts, stays } from "./_constants"
|
import { challenges, shortcuts, stays } from "./_constants"
|
||||||
|
|
||||||
import Challenges from "@/components/MyPages/Blocks/Challenges"
|
|
||||||
import Overview from "@/components/MyPages/Blocks/Overview"
|
import Overview from "@/components/MyPages/Blocks/Overview"
|
||||||
import Shortcuts from "@/components/MyPages/Blocks/Shortcuts"
|
import Shortcuts from "@/components/MyPages/Blocks/Shortcuts"
|
||||||
import UpcomingStays from "@/components/MyPages/Blocks/UpcomingStays"
|
import UpcomingStays from "@/components/MyPages/Blocks/UpcomingStays"
|
||||||
@@ -25,12 +24,10 @@ export default async function MyPage({ params }: PageArgs<LangParams>) {
|
|||||||
victories: challenges.victories,
|
victories: challenges.victories,
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<section className={styles.blocks}>
|
<main className={styles.blocks}>
|
||||||
<Overview user={user} />
|
<Overview user={user} />
|
||||||
<UpcomingStays lang={params.lang} stays={user.stays} />
|
<UpcomingStays lang={params.lang} stays={user.stays} />
|
||||||
{/* Deals You Can't Miss - TBD */}
|
|
||||||
<Challenges journeys={user.journeys} victories={user.victories} />
|
|
||||||
<Shortcuts shortcuts={user.shortcuts} />
|
<Shortcuts shortcuts={user.shortcuts} />
|
||||||
</section>
|
</main>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
"header"
|
"header"
|
||||||
"section"
|
"section"
|
||||||
"aside";
|
"aside";
|
||||||
max-width: var(--max-width);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
|
|||||||
68
components/MyPages/Blocks/Overview/Friend/friend.module.css
Normal file
68
components/MyPages/Blocks/Overview/Friend/friend.module.css
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
.friend {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.level {
|
||||||
|
color: var(--some-black-color, #000);
|
||||||
|
/* font-family: var(--ff-biro-script-plus); */
|
||||||
|
font-size: 2.1rem;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 4%;
|
||||||
|
line-height: 3.6rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
color: var(--some-black-color, #111);
|
||||||
|
/* font-family: var(--ff-brandon-text); */
|
||||||
|
font-size: 2.8rem;
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: -3%;
|
||||||
|
line-height: 2.8rem;
|
||||||
|
margin: 0;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.membershipContainer {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
gap: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.membershipId {
|
||||||
|
color: var(--some-black-color, #1e1e1e);
|
||||||
|
font-family: var(--ff-fira-mono);
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 6%;
|
||||||
|
line-height: 1.8rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 950px) {
|
||||||
|
.friend {
|
||||||
|
gap: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.level {
|
||||||
|
transform: translate(-60%, 40%) rotate(-20deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 950px) {
|
||||||
|
.friend {
|
||||||
|
justify-self: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
margin-bottom: 2.6rem;
|
||||||
|
margin-top: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
margin-bottom: 1.2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
24
components/MyPages/Blocks/Overview/Friend/index.tsx
Normal file
24
components/MyPages/Blocks/Overview/Friend/index.tsx
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import Image from "@/components/Image"
|
||||||
|
|
||||||
|
import styles from "./friend.module.css"
|
||||||
|
|
||||||
|
import type { FriendProps } from "@/types/components/myPages/friend"
|
||||||
|
|
||||||
|
export default function Friend({ user }: FriendProps) {
|
||||||
|
return (
|
||||||
|
<section className={styles.friend}>
|
||||||
|
<p className={styles.level}>Current level:</p>
|
||||||
|
<Image
|
||||||
|
alt="Good Friend"
|
||||||
|
className={styles.image}
|
||||||
|
height={70}
|
||||||
|
src="/good-friend.svg"
|
||||||
|
width={228}
|
||||||
|
/>
|
||||||
|
<h3 className={styles.name}>{user.name}</h3>
|
||||||
|
<div className={styles.membershipContainer}>
|
||||||
|
<p className={styles.membershipId}>{user.membershipId}</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import Breadcrumbs from "@/components/MyPages/Header/Breadcrumbs"
|
|
||||||
import Title from "@/components/MyPages/Title"
|
|
||||||
|
|
||||||
import styles from "./mobile.module.css"
|
|
||||||
|
|
||||||
export default function OverviewMobile() {
|
|
||||||
return (
|
|
||||||
<section className={styles.overviewMobile}>
|
|
||||||
<Breadcrumbs />
|
|
||||||
<Title uppercase>Good Morning [NAME]</Title>
|
|
||||||
</section>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
.overviewMobile {
|
|
||||||
background-color: var(--some-grey-color, #f2f2f2);
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -50vw;
|
|
||||||
margin-right: -50vw;
|
|
||||||
padding: 3.5rem 2rem 2rem;
|
|
||||||
position: relative;
|
|
||||||
right: 50%;
|
|
||||||
width: 100dvw;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: 950px) {
|
|
||||||
.overviewMobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
20
components/MyPages/Blocks/Overview/Stats/Progress/index.tsx
Normal file
20
components/MyPages/Blocks/Overview/Stats/Progress/index.tsx
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import Divider from "@/components/TempDesignSystem/Divider"
|
||||||
|
import Title from "../Title"
|
||||||
|
|
||||||
|
import styles from "./progress.module.css"
|
||||||
|
|
||||||
|
export default function Progress() {
|
||||||
|
return (
|
||||||
|
<section className={styles.progress}>
|
||||||
|
<header className={styles.header}>
|
||||||
|
<Title>14 680 points until next level</Title>
|
||||||
|
<Title>Progress</Title>
|
||||||
|
</header>
|
||||||
|
<Divider className={styles.divider} variant="dotted" />
|
||||||
|
<div className={styles.container}>
|
||||||
|
<p className={styles.nextLevel}>14 680 points until next level</p>
|
||||||
|
<p className={styles.target}>Close friend</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
.header :first-child {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.divider {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
align-items: baseline;
|
||||||
|
display: flex;
|
||||||
|
gap: 0.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nextLevel {
|
||||||
|
color: var(--some-black-color, #000);
|
||||||
|
/* font-family: var(--ff-brandon-text); */
|
||||||
|
font-size: 1.2rem;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 0.6%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.target {
|
||||||
|
color: var(--some-black-color, #000);
|
||||||
|
/* font-family: var(--ff-biro-script-plus); */
|
||||||
|
font-size: 1.8rem;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 4%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 950px) {
|
||||||
|
.progress {
|
||||||
|
display: grid;
|
||||||
|
gap: 0.2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 950px) {
|
||||||
|
.header :first-child {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header :nth-child(2n) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.divider {
|
||||||
|
display: block;
|
||||||
|
margin: 0.3rem 0 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nextLevel {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.target {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
line-height: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import Divider from "@/components/TempDesignSystem/Divider"
|
||||||
|
import Image from "@/components/Image"
|
||||||
|
|
||||||
|
import styles from "./points.module.css"
|
||||||
|
|
||||||
|
import type { QualifyingPointsProps } from "@/types/components/myPages/qualifyingPoints"
|
||||||
|
|
||||||
|
export default function QualifyingPoints({ user }: QualifyingPointsProps) {
|
||||||
|
return (
|
||||||
|
<div className={styles.qualifyingPoints}>
|
||||||
|
<h4 className={styles.title}>Progress</h4>
|
||||||
|
<Divider variant="dotted" />
|
||||||
|
<div className={styles.container}>
|
||||||
|
<div className={styles.points}>
|
||||||
|
<Image
|
||||||
|
alt="Arrow Up Icon"
|
||||||
|
height={24}
|
||||||
|
src="/arrow_upward.svg"
|
||||||
|
width={24}
|
||||||
|
/>
|
||||||
|
<p className={styles.point}>{user.qualifyingPoints}</p>
|
||||||
|
<h5 className={styles.pointTitle}>Qualifying points</h5>
|
||||||
|
</div>
|
||||||
|
<div className={styles.points}>
|
||||||
|
<Image
|
||||||
|
alt="Arrow Up Icon"
|
||||||
|
height={24}
|
||||||
|
src="/arrow_upward.svg"
|
||||||
|
width={24}
|
||||||
|
/>
|
||||||
|
<p className={styles.point}>{user.nights}</p>
|
||||||
|
<h5 className={styles.pointTitle}>Nights</h5>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
.qualifyingPoints {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
color: var(--some-grey-color, #000);
|
||||||
|
/* font-family: var(--ff-brandon-text); */
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.6%;
|
||||||
|
line-height: 1.7rem;
|
||||||
|
margin: 0 0 0.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 950px) {
|
||||||
|
.qualifyingPoints {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: grid;
|
||||||
|
gap: 3.8rem;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
color: var(--some-grey-color, #4f4f4f);
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.points {
|
||||||
|
align-items: center;
|
||||||
|
display: grid;
|
||||||
|
gap: 1rem;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.point {
|
||||||
|
/* font-family: var(--ff-brandon-text); */
|
||||||
|
font-size: 2.7rem;
|
||||||
|
font-weight: 900;
|
||||||
|
line-height: 2.7rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pointTitle {
|
||||||
|
font-family: var(--ff-fira-sans);
|
||||||
|
font-size: 1.2rem;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 0.6%;
|
||||||
|
line-height: 1.4rem;
|
||||||
|
grid-column: 1/-1;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
5
components/MyPages/Blocks/Overview/Stats/Title/index.tsx
Normal file
5
components/MyPages/Blocks/Overview/Stats/Title/index.tsx
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import styles from "./title.module.css"
|
||||||
|
|
||||||
|
export default function Title({ children }: React.PropsWithChildren) {
|
||||||
|
return <h4 className={styles.title}>{children}</h4>
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
.title {
|
||||||
|
color: var(--some-grey-color, #000);
|
||||||
|
/* font-family: var(--ff-brandon-text); */
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.6%;
|
||||||
|
line-height: 1.7rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 950px) {
|
||||||
|
.title {
|
||||||
|
color: var(--some-grey-color, #4f4f4f);
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import Divider from "@/components/TempDesignSystem/Divider"
|
||||||
|
import Title from "../Title"
|
||||||
|
|
||||||
|
import styles from "./totalPoints.module.css"
|
||||||
|
|
||||||
|
import type { TotalPointsProps } from "@/types/components/myPages/totalPoints"
|
||||||
|
|
||||||
|
export default function TotalPoints({ user }: TotalPointsProps) {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Title>Total Points</Title>
|
||||||
|
<Divider className={styles.divider} variant="dotted" />
|
||||||
|
<p className={styles.points}>{user.points}</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
.divider {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
margin-top: 0.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.points {
|
||||||
|
color: var(--some-black-color, #111);
|
||||||
|
/* font-family: var(--ff-brandon-text); */
|
||||||
|
font-size: 3.7rem;
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: -3%;
|
||||||
|
line-height: 3.7rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 950px) {
|
||||||
|
.divider {
|
||||||
|
margin-bottom: 1.2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
15
components/MyPages/Blocks/Overview/Stats/index.tsx
Normal file
15
components/MyPages/Blocks/Overview/Stats/index.tsx
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import Progress from "./Progress"
|
||||||
|
import TotalPoints from "./TotalPoints"
|
||||||
|
|
||||||
|
import styles from "./stats.module.css"
|
||||||
|
|
||||||
|
import type { StatsProps } from "@/types/components/myPages/stats"
|
||||||
|
|
||||||
|
export default function Stats({ user }: StatsProps) {
|
||||||
|
return (
|
||||||
|
<section className={styles.stats}>
|
||||||
|
<TotalPoints user={user} />
|
||||||
|
<Progress />
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
13
components/MyPages/Blocks/Overview/Stats/stats.module.css
Normal file
13
components/MyPages/Blocks/Overview/Stats/stats.module.css
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.stats {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 950px) {
|
||||||
|
.stats {
|
||||||
|
gap: 1.4rem;
|
||||||
|
justify-content: center;
|
||||||
|
max-width: 32rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,83 +1,20 @@
|
|||||||
import CopyButton from "./CopyButton"
|
import Friend from "./Friend"
|
||||||
import Divider from "@/components/TempDesignSystem/Divider"
|
import Stats from "./Stats"
|
||||||
import Image from "@/components/Image"
|
|
||||||
import MembershipCardButton from "./MembershipCardButton"
|
|
||||||
import ProgressBar from "@/components/TempDesignSystem/ProgressBar"
|
|
||||||
import Title from "@/components/MyPages/Title"
|
import Title from "@/components/MyPages/Title"
|
||||||
|
|
||||||
import styles from "./overview.module.css"
|
import styles from "./overview.module.css"
|
||||||
|
|
||||||
import type { OverviewProps } from "@/types/components/myPages/overview"
|
import type { OverviewProps } from "@/types/components/myPages/overview"
|
||||||
import Link from "next/link"
|
|
||||||
|
|
||||||
export default function Overview({ user }: OverviewProps) {
|
export default function Overview({ user }: OverviewProps) {
|
||||||
return (
|
return (
|
||||||
<section className={styles.container}>
|
<section className={styles.container}>
|
||||||
<header className={styles.header}>
|
<header>
|
||||||
<Title uppercase>Good morning {user.name}</Title>
|
<Title uppercase>Good morning</Title>
|
||||||
</header>
|
</header>
|
||||||
<section className={styles.overview}>
|
<section className={styles.overview}>
|
||||||
<section className={styles.friend}>
|
<Friend user={user} />
|
||||||
<p className={styles.level}>Current level:</p>
|
<Stats user={user} />
|
||||||
<Image
|
|
||||||
alt="Good Friend"
|
|
||||||
height={70}
|
|
||||||
src="/good-friend.svg"
|
|
||||||
width={228}
|
|
||||||
/>
|
|
||||||
<h3 className={styles.name}>{user.name}</h3>
|
|
||||||
<div className={styles.membershipContainer}>
|
|
||||||
<p className={styles.membershipId}>{user.membershipId}</p>
|
|
||||||
<CopyButton membershipId={user.membershipId} />
|
|
||||||
</div>
|
|
||||||
<MembershipCardButton />
|
|
||||||
</section>
|
|
||||||
<section className={styles.stats}>
|
|
||||||
<div>
|
|
||||||
<h4 className={styles.pointsTitle}>Total Points</h4>
|
|
||||||
<Divider variant="dotted" />
|
|
||||||
<p className={styles.points}>{user.points}</p>
|
|
||||||
</div>
|
|
||||||
<div className={styles.qualifyingPoints}>
|
|
||||||
<h4 className={styles.pointsTitle}>Progress</h4>
|
|
||||||
<Divider variant="dotted" />
|
|
||||||
<div className={styles.pointsContainer}>
|
|
||||||
<div className={styles.pointsProgress}>
|
|
||||||
<Image
|
|
||||||
alt="Arrow Up Icon"
|
|
||||||
height={24}
|
|
||||||
src="/arrow_upward.svg"
|
|
||||||
width={24}
|
|
||||||
/>
|
|
||||||
<p className={styles.point}>{user.qualifyingPoints}</p>
|
|
||||||
<h5 className={styles.pointsProgressTitle}>
|
|
||||||
Qualifying points
|
|
||||||
</h5>
|
|
||||||
</div>
|
|
||||||
<div className={styles.pointsProgress}>
|
|
||||||
<Image
|
|
||||||
alt="Arrow Up Icon"
|
|
||||||
height={24}
|
|
||||||
src="/arrow_upward.svg"
|
|
||||||
width={24}
|
|
||||||
/>
|
|
||||||
<p className={styles.point}>{user.nights}</p>
|
|
||||||
<h5 className={styles.pointsProgressTitle}>Nights</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className={styles.progress}>
|
|
||||||
<ProgressBar className={styles.progressbar} progress={70} />
|
|
||||||
<h4 className={styles.progressTitle}>Progress</h4>
|
|
||||||
<p className={styles.pointsRemaining}>
|
|
||||||
14 680 points until next level
|
|
||||||
</p>
|
|
||||||
<p className={styles.target}>Close friend</p>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<Link className={styles.link} href="#">
|
|
||||||
Go to my points
|
|
||||||
</Link>
|
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,121 +1,12 @@
|
|||||||
.container {
|
.container {
|
||||||
background-color: var(--some-grey-color, #f2f2f2);
|
background-color: var(--some-grey-color, #f2f2f2);
|
||||||
|
display: grid;
|
||||||
|
gap: 0.8rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.overview {
|
.overview {
|
||||||
display: grid;
|
display: grid;
|
||||||
}
|
gap: 1.7rem;
|
||||||
|
|
||||||
.friend {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.level {
|
|
||||||
color: var(--some-black-color, #000);
|
|
||||||
/* font-family: var(--ff-biro-script-plus); */
|
|
||||||
font-size: 2.1rem;
|
|
||||||
font-weight: 400;
|
|
||||||
letter-spacing: 4%;
|
|
||||||
line-height: 3.6rem;
|
|
||||||
margin-bottom: 0;
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.name {
|
|
||||||
color: var(--some-black-color, #111);
|
|
||||||
/* font-family: var(--ff-brandon-text); */
|
|
||||||
font-size: 2.8rem;
|
|
||||||
font-weight: 900;
|
|
||||||
letter-spacing: -3%;
|
|
||||||
line-height: 2.8rem;
|
|
||||||
margin: 1.6rem 0 1.8rem;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.membershipContainer {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.8rem;
|
|
||||||
margin-bottom: 2.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.membershipId {
|
|
||||||
color: var(--some-black-color, #1e1e1e);
|
|
||||||
font-family: var(--ff-fira-mono);
|
|
||||||
font-size: 1.5rem;
|
|
||||||
font-weight: 500;
|
|
||||||
letter-spacing: 6%;
|
|
||||||
line-height: 1.8rem;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.qualifyingPoints {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsTitle {
|
|
||||||
color: var(--some-grey-color, #000);
|
|
||||||
/* font-family: var(--ff-brandon-text); */
|
|
||||||
font-size: 1.5rem;
|
|
||||||
font-weight: 500;
|
|
||||||
letter-spacing: 0.6%;
|
|
||||||
line-height: 1.7rem;
|
|
||||||
margin: 0 0 0.7rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.points {
|
|
||||||
color: var(--some-black-color, #111);
|
|
||||||
/* font-family: var(--ff-brandon-text); */
|
|
||||||
font-size: 3.7rem;
|
|
||||||
font-weight: 900;
|
|
||||||
letter-spacing: -3%;
|
|
||||||
line-height: 3.7rem;
|
|
||||||
margin: 1.4rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progressTitle {
|
|
||||||
color: var(--some-black-color, #000);
|
|
||||||
/* font-family: var(--ff-brandon-text); */
|
|
||||||
font-size: 1.5rem;
|
|
||||||
font-weight: 500;
|
|
||||||
letter-spacing: 0.6%;
|
|
||||||
line-height: 1.7rem;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsRemaining {
|
|
||||||
color: var(--some-grey-color, #4f4f4f);
|
|
||||||
/* font-family: var(--ff-brandon-text); */
|
|
||||||
font-size: 1.5rem;
|
|
||||||
font-weight: 500;
|
|
||||||
letter-spacing: 0.6%;
|
|
||||||
line-height: 1.7rem;
|
|
||||||
margin: 1rem 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link {
|
|
||||||
color: var(--some-black-color, #111);
|
|
||||||
font-family: var(--ff-fira-sans);
|
|
||||||
font-size: 1.4rem;
|
|
||||||
font-weight: 600;
|
|
||||||
justify-self: flex-end;
|
|
||||||
letter-spacing: 1.2%;
|
|
||||||
line-height: 2rem;
|
|
||||||
margin-top: 2.8rem;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.target {
|
|
||||||
color: var(--some-black-color, #000);
|
|
||||||
/* font-family: var(--ff-biro-script-plus); */
|
|
||||||
font-size: 1.8rem;
|
|
||||||
font-weight: 400;
|
|
||||||
letter-spacing: 4%;
|
|
||||||
line-height: 3rem;
|
|
||||||
margin: 0;
|
|
||||||
text-align: right;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 950px) {
|
@media screen and (max-width: 950px) {
|
||||||
@@ -124,52 +15,17 @@
|
|||||||
left: 50%;
|
left: 50%;
|
||||||
margin-left: -50vw;
|
margin-left: -50vw;
|
||||||
margin-right: -50vw;
|
margin-right: -50vw;
|
||||||
padding: 0 2rem 2rem;
|
padding: 0 2rem 3.6rem;
|
||||||
position: relative;
|
position: relative;
|
||||||
right: 50%;
|
right: 50%;
|
||||||
width: 100dvw;
|
width: 100dvw;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.level {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
transform: translate(-60%, 40%) rotate(-20deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progressTitle {
|
|
||||||
order: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsRemaining {
|
|
||||||
margin-bottom: 0.8rem;
|
|
||||||
margin-top: 0.6rem;
|
|
||||||
order: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progressbar {
|
|
||||||
order: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.target {
|
|
||||||
position: absolute;
|
|
||||||
right: 2rem;
|
|
||||||
transform: rotate(-15deg) translateY(-50%);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 950px) {
|
@media screen and (min-width: 950px) {
|
||||||
.container {
|
.container {
|
||||||
background-color: var(--some-white-color, #fff);
|
background-color: var(--some-white-color, #fff);
|
||||||
display: grid;
|
gap: 1.5rem;
|
||||||
gap: 2.2rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.overview {
|
.overview {
|
||||||
@@ -181,114 +37,16 @@
|
|||||||
left: unset;
|
left: unset;
|
||||||
margin-left: unset;
|
margin-left: unset;
|
||||||
margin-right: unset;
|
margin-right: unset;
|
||||||
max-width: var(--max-width);
|
|
||||||
padding: 3.5rem 2rem;
|
padding: 3.5rem 2rem;
|
||||||
position: static;
|
position: static;
|
||||||
right: unset;
|
right: unset;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.friend {
|
|
||||||
justify-self: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.level {
|
|
||||||
margin-bottom: 2.4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.name {
|
|
||||||
margin: 3rem 0 1.8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.membershipContainer {
|
|
||||||
margin-bottom: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stats {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 3rem;
|
|
||||||
max-width: 32rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.qualifyingPoints {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsTitle {
|
|
||||||
color: var(--some-grey-color, #4f4f4f);
|
|
||||||
font-size: 1.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.points {
|
|
||||||
margin: 1.4rem 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsContainer {
|
|
||||||
display: grid;
|
|
||||||
gap: 3.8rem;
|
|
||||||
grid-template-columns: auto 1fr;
|
|
||||||
margin-top: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsProgress {
|
|
||||||
align-items: center;
|
|
||||||
display: grid;
|
|
||||||
gap: 1rem;
|
|
||||||
grid-template-columns: auto 1fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
.point {
|
|
||||||
/* font-family: var(--ff-brandon-text); */
|
|
||||||
font-size: 2.7rem;
|
|
||||||
font-weight: 900;
|
|
||||||
line-height: 2.7rem;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsProgressTitle {
|
|
||||||
font-family: var(--ff-fira-sans);
|
|
||||||
font-size: 1.2rem;
|
|
||||||
font-weight: 400;
|
|
||||||
letter-spacing: 0.6%;
|
|
||||||
line-height: 1.4rem;
|
|
||||||
grid-column: 1/-1;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progressTitle {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointsRemaining {
|
|
||||||
font-size: 1.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.target {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.target::after {
|
|
||||||
--height: 3.2rem;
|
|
||||||
--width: 4.5rem;
|
|
||||||
|
|
||||||
background-image: url("/arrow_biro.svg");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
content: " ";
|
|
||||||
display: inline-block;
|
|
||||||
height: var(--height);
|
|
||||||
position: relative;
|
|
||||||
top: calc(var(--height) - var(--width));
|
|
||||||
width: var(--width);
|
|
||||||
}
|
|
||||||
|
|
||||||
.link {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 1100px) {
|
@media screen and (min-width: 1100px) {
|
||||||
.overview {
|
.overview {
|
||||||
gap: 10rem;
|
gap: 10rem;
|
||||||
|
min-height: 35rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
.shortcuts {
|
.shortcuts {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 2rem;
|
gap: 2rem;
|
||||||
max-width: var(--max-width);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import styles from "./upcoming.module.css"
|
|||||||
|
|
||||||
import type { LangParams } from "@/types/params"
|
import type { LangParams } from "@/types/params"
|
||||||
import type { StaysProps } from "@/types/components/myPages/stays"
|
import type { StaysProps } from "@/types/components/myPages/stays"
|
||||||
|
import Link from "next/link"
|
||||||
|
|
||||||
export default function UpcomingStays({
|
export default function UpcomingStays({
|
||||||
lang,
|
lang,
|
||||||
@@ -12,10 +13,13 @@ export default function UpcomingStays({
|
|||||||
}: StaysProps & LangParams) {
|
}: StaysProps & LangParams) {
|
||||||
return (
|
return (
|
||||||
<section className={styles.container}>
|
<section className={styles.container}>
|
||||||
<header>
|
<header className={styles.header}>
|
||||||
<Title level="h2" uppercase>
|
<Title level="h2" uppercase>
|
||||||
Your upcoming stays
|
Your upcoming stays
|
||||||
</Title>
|
</Title>
|
||||||
|
<Link className={styles.link} href="#">
|
||||||
|
See all
|
||||||
|
</Link>
|
||||||
</header>
|
</header>
|
||||||
<section className={styles.stays}>
|
<section className={styles.stays}>
|
||||||
{stays.map((stay) => (
|
{stays.map((stay) => (
|
||||||
|
|||||||
@@ -2,15 +2,23 @@
|
|||||||
display: grid;
|
display: grid;
|
||||||
gap: 2.2rem;
|
gap: 2.2rem;
|
||||||
margin-right: -2rem;
|
margin-right: -2rem;
|
||||||
max-width: var(--max-width);
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
align-items: baseline;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.stays {
|
.stays {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 2rem;
|
gap: 2rem;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
padding-right: 2rem;
|
|
||||||
|
|
||||||
/* Hide scrollbar IE and Edge */
|
/* Hide scrollbar IE and Edge */
|
||||||
-ms-overflow-style: none;
|
-ms-overflow-style: none;
|
||||||
@@ -23,8 +31,25 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 950px) {
|
||||||
|
.stays {
|
||||||
|
padding-right: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 950px) {
|
@media screen and (min-width: 950px) {
|
||||||
.container {
|
.container {
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.link {
|
||||||
|
color: var(--some-black-color, #111);
|
||||||
|
display: inline-block;
|
||||||
|
font-family: var(--ff-fira-sans);
|
||||||
|
font-size: 1.4rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 1.2%;
|
||||||
|
line-height: 140%;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,3 +19,7 @@
|
|||||||
.link {
|
.link {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.currentPage {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ export default function Breadcrumbs() {
|
|||||||
<span>/</span>
|
<span>/</span>
|
||||||
</li>
|
</li>
|
||||||
<li className={styles.listItem}>
|
<li className={styles.listItem}>
|
||||||
<p>My Scandic</p>
|
<p className={styles.currentPage}>My Scandic</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
@@ -18,7 +18,9 @@
|
|||||||
.breadcrumbs {
|
.breadcrumbs {
|
||||||
background-color: var(--some-grey-color, #f2f2f2);
|
background-color: var(--some-grey-color, #f2f2f2);
|
||||||
display: block;
|
display: block;
|
||||||
|
padding-bottom: 0.8rem;
|
||||||
padding-left: 2rem;
|
padding-left: 2rem;
|
||||||
|
padding-top: 3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 950px) {
|
@media screen and (min-width: 950px) {
|
||||||
@@ -35,5 +37,6 @@
|
|||||||
.breadcrumbs {
|
.breadcrumbs {
|
||||||
background-color: var(--some-white-color, #fff);
|
background-color: var(--some-white-color, #fff);
|
||||||
padding-left: 2.4rem;
|
padding-left: 2.4rem;
|
||||||
|
padding-top: 2rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export default function Sidebar() {
|
|||||||
<aside className={styles.sidebar}>
|
<aside className={styles.sidebar}>
|
||||||
<nav className={styles.nav}>
|
<nav className={styles.nav}>
|
||||||
<Link className={`${styles.link} ${styles.active}`} href="#">
|
<Link className={`${styles.link} ${styles.active}`} href="#">
|
||||||
My Scandic
|
My Pages
|
||||||
</Link>
|
</Link>
|
||||||
<Link className={styles.link} href="#">
|
<Link className={styles.link} href="#">
|
||||||
My Stays
|
My Stays
|
||||||
@@ -19,12 +19,6 @@ export default function Sidebar() {
|
|||||||
<Link className={styles.link} href="#">
|
<Link className={styles.link} href="#">
|
||||||
My Benefits
|
My Benefits
|
||||||
</Link>
|
</Link>
|
||||||
<Link className={styles.link} href="#">
|
|
||||||
My Challenges
|
|
||||||
</Link>
|
|
||||||
<Link className={styles.link} href="#">
|
|
||||||
My Favourites
|
|
||||||
</Link>
|
|
||||||
<Link className={styles.link} href="#">
|
<Link className={styles.link} href="#">
|
||||||
About Scandic Friends
|
About Scandic Friends
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ import { dividerVariants } from "./variants"
|
|||||||
|
|
||||||
import type { DividerProps } from "./divider"
|
import type { DividerProps } from "./divider"
|
||||||
|
|
||||||
export default function Divider({ variant }: DividerProps) {
|
export default function Divider({ className, variant }: DividerProps) {
|
||||||
return <div className={dividerVariants({ variant })} />
|
return <div className={dividerVariants({ className, variant })} />
|
||||||
}
|
}
|
||||||
|
|||||||
5
types/components/myPages/friend.ts
Normal file
5
types/components/myPages/friend.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import type { User } from "@/types/user"
|
||||||
|
|
||||||
|
export type FriendProps = {
|
||||||
|
user: User
|
||||||
|
}
|
||||||
5
types/components/myPages/qualifyingPoints.ts
Normal file
5
types/components/myPages/qualifyingPoints.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import type { User } from "@/types/user"
|
||||||
|
|
||||||
|
export type QualifyingPointsProps = {
|
||||||
|
user: User
|
||||||
|
}
|
||||||
5
types/components/myPages/stats.ts
Normal file
5
types/components/myPages/stats.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import type { User } from "@/types/user"
|
||||||
|
|
||||||
|
export type StatsProps = {
|
||||||
|
user: User
|
||||||
|
}
|
||||||
5
types/components/myPages/totalPoints.ts
Normal file
5
types/components/myPages/totalPoints.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import type { User } from "@/types/user"
|
||||||
|
|
||||||
|
export type TotalPointsProps = {
|
||||||
|
user: User
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user