feat: add initial version of Loyalty Overview Table

This commit is contained in:
Arvid Norlin
2024-05-20 14:14:29 +02:00
parent fffee84989
commit 1fd0e7164a
3 changed files with 298 additions and 2 deletions

View File

@@ -1,3 +1,143 @@
"use client"
import { useState } from "react"
import { _ } from "@/lib/translation"
import CheckCircle from "@/components/Icons/CheckCircle"
import ChevronDown from "@/components/Icons/ChevronDown"
import Image from "@/components/Image"
import Title from "@/components/Title"
import styles from "./overviewTable.module.css"
export default function OverviewTable() {
return <div></div>
const options = [
{ value: "a", label: "a" },
{ value: "b", label: "b" },
]
return (
<div className={styles.container}>
<Title
as="h1"
level="h1"
className={styles.title}
weight="semiBold"
uppercase
>
{_("7 delightful levels of friendship")}
</Title>
<div>
<p className={styles.preamble}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Arcu risus
quis varius quam quisque id diam vel. Rhoncus urna neque viverra
justo. Mattis aliquam faucibus purus in massa. Id cursus metus aliquam
eleifend mi in nulla posuere.
</p>
</div>
<div className={styles.columns}>
<div className={styles.leftColumn} />
<div className={styles.rightColumn} />
<div className={styles.columnHeaderContainer}>
<div className={styles.columnHeader}>
<Select options={options} />
<LevelSummary level={"1"} />
</div>
<div className={styles.columnHeader}>
<Select options={options} />
<LevelSummary level={"2"} />
</div>
</div>
<PerkCard />
<PerkCard />
<PerkCard />
<PerkCard />
</div>
</div>
)
}
type SelectProps = {
options: {
label: string
value: string
}[]
}
function Select({ options }: SelectProps) {
console.log({ options })
return (
<div className={styles.selectContainer}>
<select className={styles.select}>
{options.map((option) => (
<option key={option.label} value={option.value}>
{option.label}
</option>
))}
</select>
<label className={styles.selectLabel} htmlFor="">
{_("Level")}
</label>
<span className={styles.selectChevron}>
<ChevronDown />
</span>
</div>
)
}
function LevelSummary({ level }: { level: string }) {
return (
<div className={styles.levelSummary}>
<Image
src="/_static/icons/loyaltylevels/new-friend.svg"
alt="level"
height={50}
width={100}
/>
<span className={styles.levelRequirements}>10 000p or X nights</span>
<p className={styles.levelSummaryText}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Arcu risus quis
varius quam quisque id diam vel. Rhoncus urna neque viverra justo.
Mattis aliquam faucibus purus in massa. Id cursus metus aliquam eleifend
mi in nulla posuere.
</p>
</div>
)
}
function PerkCard() {
const [isExpanded, setIsExpanded] = useState(false)
return (
<div className={styles.perkCard}>
<div className={styles.perkInfo}>
<details className={styles.details}>
<summary className={styles.summary}>
<hgroup className={styles.perkCardHeader}>
<Title as="h5" level="h2" className={styles.perkCardTitle}>
title
</Title>
<span className={styles.chevron}>
<ChevronDown />
</span>
</hgroup>
</summary>
<p className={styles.perkCardDescription}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed
adipiscing diam donec adipiscing tristique risus nec feugiat.
</p>
</details>
</div>
<div className={styles.perkComparison}>
<div className={styles.comparisonItem}>
<CheckCircle />
</div>
<div className={styles.comparisonItem}>
<CheckCircle />
</div>
</div>
</div>
)
}

View File

@@ -0,0 +1,157 @@
.container {
background-color: var(--Main-Brand-PalePeach);
}
.title {
font-family: var(--typography-Title1-Desktop-fontFamily), inherit;
}
.preamble {
color: var(--Base-Text-Primary-High-contrast);
font-size: var(--typography-Body-Regular-fontSize);
line-height: 150%;
}
.columns {
display: flex;
flex-direction: column;
gap: 1.6rem;
padding: 1.6rem;
position: relative;
}
.columnHeaderContainer {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.6rem;
z-index: 2;
}
.columnHeader {
display: flex;
flex-direction: column;
gap: 1.6rem;
}
.selectContainer {
position: relative;
width: 100%;
}
.selectLabel {
color: var(--Base-Text-UI-Placeholder);
position: absolute;
top: 7px;
left: 1.6rem;
}
.select {
appearance: none;
border: 1px solid var(--Base-Input-Controls-Border-Normal, #b8a79a);
border-radius: 8px;
padding: 1.6rem;
width: 100%;
}
.selectChevron {
display: flex;
align-items: center;
position: absolute;
right: 1.6rem;
bottom: 1.6rem;
}
.leftColumn {
background-color: var(--Main-Brand-PalePeach);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 50%;
z-index: 1;
}
.rightColumn {
background-color: var(--Base-Background-Normal);
position: absolute;
position: absolute;
top: 0;
bottom: 0;
left: 50%;
right: 0;
z-index: 1;
border-top-left-radius: 8px;
}
.levelSummary {
display: flex;
flex-direction: column;
align-items: center;
gap: 1.6rem;
}
.levelRequirements {
background-color: var(--Main-Brand-Burgundy);
border-radius: 8px;
color: #f7e1d5;
padding: 4px 8px;
}
.levelSummaryText {
color: var(--Main-Brand-Burgundy);
font-size: var(--typography-Footnote-Regular-fontSize);
line-height: 150%;
margin: 0;
}
.perkCard {
background-color: var(--Main-Grey-White);
border: 1px solid var(--Base-Border-Subtle);
border-radius: 0.4rem;
color: var(--Main-Brand-Burgundy);
padding: 0 1.6rem;
z-index: 2;
}
.details[open] .chevron {
transform: rotate(180deg);
}
.chevron {
display: flex;
align-items: center;
}
.summary::-webkit-details-marker {
display: none;
}
.summary {
list-style: none;
}
.perkCardHeader {
display: grid;
grid-template-columns: 1fr auto;
}
.perkCardDescription {
line-height: 150%;
}
.perkInfo {
border-bottom: 1px solid var(--Base-Border-Subtle);
padding: 1.5rem 0;
}
.perkComparison {
display: grid;
grid-template-columns: 1fr 1fr;
}
.comparisonItem {
display: flex;
justify-content: center;
align-items: center;
padding: 1rem;
}

View File

@@ -20,7 +20,6 @@ function DynamicComponentBlock({ component }: DynamicComponentProps) {
case LoyaltyComponentEnum.loyalty_levels:
return <LoyaltyLevels />
case LoyaltyComponentEnum.overview_table:
// TODO: IMPLEMENT OVERVIEW TABLE!
return <OverviewTable />
default:
return null