fix: adjust LargeTable styling

This commit is contained in:
Arvid Norlin
2024-06-04 14:10:41 +02:00
parent 349c95fbc4
commit af33f18a6a
8 changed files with 178 additions and 14 deletions

View File

@@ -19,7 +19,12 @@ export default function BenefitCard({
<details className={styles.details}> <details className={styles.details}>
<summary className={styles.summary}> <summary className={styles.summary}>
<hgroup className={styles.benefitCardHeader}> <hgroup className={styles.benefitCardHeader}>
<Title as="h5" level="h2" className={styles.benefitCardTitle}> <Title
as="h5"
level="h2"
textTransform={"regular"}
className={styles.benefitCardTitle}
>
{title} {title}
</Title> </Title>
<span className={styles.chevron}> <span className={styles.chevron}>

View File

@@ -14,6 +14,6 @@
} }
.benefitValueDetails { .benefitValueDetails {
font-size: var(--typography-Footnote-Regular-fontSize); font-size: var(--typography-Caption-Regular-fontSize);
text-align: center; text-align: center;
} }

View File

@@ -1,19 +1,43 @@
import { ChevronDown } from "react-feather"
import Image from "@/components/Image"
import Title from "@/components/TempDesignSystem/Text/Title"
import BenefitValue from "../BenefitValue" import BenefitValue from "../BenefitValue"
import LevelSummary from "../LevelSummary" import LevelSummary from "../LevelSummary"
import styles from "./largeTable.module.css" import styles from "./largeTable.module.css"
import { LargeTableProps } from "@/types/components/loyalty/blocks" import {
BenefitTableHeaderProps,
LargeTableProps,
} from "@/types/components/loyalty/blocks"
export default function LargeTable({ levels }: LargeTableProps) { export default function LargeTable({ levels }: LargeTableProps) {
return ( return (
<table className={styles.table}> <table className={styles.table}>
<thead className={styles.thead}> <thead className={styles.thead}>
<tr className={styles.iconRow}>
<th className={styles.verticalTableHeader} />
{levels.map((level) => {
return (
<th key={level.tier} className={styles.iconTh}>
<Image
height={50}
width={100}
alt={level.name}
src={level.icon}
/>
</th>
)
})}
</tr>
<tr> <tr>
<th /> <th />
{levels.map((level) => { {levels.map((level) => {
return ( return (
<th key={level.tier} className={styles.th}> <th key={level.tier} className={styles.summaryTh}>
<LevelSummary level={level} /> <LevelSummary level={level} />
</th> </th>
) )
@@ -24,11 +48,11 @@ export default function LargeTable({ levels }: LargeTableProps) {
{levels[0].benefits.map((benefit, index) => { {levels[0].benefits.map((benefit, index) => {
return ( return (
<tr key={benefit.name} className={styles.tr}> <tr key={benefit.name} className={styles.tr}>
<th scope={"row"} className={styles.th}> <th scope={"row"} className={styles.benefitTh}>
<span className={styles.benefitName}>{benefit.name}</span> <BenefitTableHeader
<span className={styles.benefitDescription}> name={benefit.name}
{benefit.description} description={benefit.description}
</span> />
</th> </th>
{levels.map((level) => { {levels.map((level) => {
return ( return (
@@ -44,3 +68,26 @@ export default function LargeTable({ levels }: LargeTableProps) {
</table> </table>
) )
} }
function BenefitTableHeader({ name, description }: BenefitTableHeaderProps) {
return (
<details className={styles.details}>
<summary className={styles.summary}>
<hgroup className={styles.benefitHeader}>
<Title
as="h5"
level="h2"
textTransform={"regular"}
className={styles.benefitTitle}
>
{name}
</Title>
<span className={styles.chevron}>
<ChevronDown />
</span>
</hgroup>
</summary>
<p className={styles.benefitDescription}>{description}</p>
</details>
)
}

View File

@@ -6,26 +6,79 @@
.thead { .thead {
background-color: var(--Base-Surface-Secondary-Normal); background-color: var(--Base-Surface-Secondary-Normal);
}
.iconRow {
background-color: var(--Base-Surface-Secondary-Normal);
border-bottom: none;
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 1;
} }
.th, .verticalTableHeader {
.td { width: 242px;
}
.iconTh {
border: 1px solid var(--Base-Border-Subtle); border: 1px solid var(--Base-Border-Subtle);
padding: var(--Spacing-x3) var(--Spacing-x2); border-bottom: none;
padding: var(--Spacing-x3) var(--Spacing-x2) var(--Spacing-x-one-and-half);
} }
.th { .summaryTh {
border: 1px solid var(--Base-Border-Subtle);
border-top: none;
font-size: var(--typography-Caption-Regular-fontSize); font-size: var(--typography-Caption-Regular-fontSize);
font-weight: 400; font-weight: 400;
padding: 0 var(--Spacing-x3) var(--Spacing-x2);
} }
.td { .td {
border: 1px solid var(--Base-Border-Subtle);
font-size: var(--typography-Footnote-Regular-fontSize); font-size: var(--typography-Footnote-Regular-fontSize);
/* padding: var(--Spacing-x3) var(--Spacing-x2); */
text-align: center; text-align: center;
} }
.tr:nth-child(odd) { .tr:nth-child(odd) {
background-color: var(--Base-Background-Primary-Elevated, #faf6f2); background-color: var(--Base-Background-Primary-Elevated, #faf6f2);
} }
.benefitTh {
border: 1px solid var(--Base-Border-Subtle);
padding: var(--Spacing-x3) var(--Spacing-x2);
font-size: var(--typography-Caption-Regular-fontSize);
font-weight: 400;
}
.details[open] .chevron {
transform: rotate(180deg);
}
.benefitHeader {
display: grid;
gap: var(--Spacing-x1);
grid-template-columns: 1fr auto;
text-align: start;
}
.benefitDescription {
margin: 0;
padding-top: var(--Spacing-x1);
text-align: start;
padding-right: calc(24px + var(--Spacing-x1));
}
.chevron {
display: flex;
align-self: start;
}
.summary::-webkit-details-marker {
display: none;
}
.summary {
list-style: none;
}

View File

@@ -7,7 +7,6 @@ import { LevelSummaryProps } from "@/types/components/loyalty/blocks"
export default function LevelSummary({ level }: LevelSummaryProps) { export default function LevelSummary({ level }: LevelSummaryProps) {
return ( return (
<div className={styles.levelSummary}> <div className={styles.levelSummary}>
<Image src={level.icon} alt={level.name} height={50} width={100} />
<span className={styles.levelRequirements}>{level.requirement}</span> <span className={styles.levelRequirements}>{level.requirement}</span>
<p className={styles.levelSummaryText}>{level.description}</p> <p className={styles.levelSummaryText}>{level.description}</p>
</div> </div>

View File

@@ -6,6 +6,7 @@ import { useIntl } from "react-intl"
import { Lang } from "@/constants/languages" import { Lang } from "@/constants/languages"
import Image from "@/components/Image"
import Select from "@/components/TempDesignSystem/Form/Select" import Select from "@/components/TempDesignSystem/Form/Select"
import levelsData from "./data/EN.json" import levelsData from "./data/EN.json"
@@ -59,6 +60,16 @@ export default function OverviewTable() {
const [selectedLevelB, setSelectedLevelB] = useState(getLevelByTier(2)) const [selectedLevelB, setSelectedLevelB] = useState(getLevelByTier(2))
const [selectedLevelC, setSelectedLevelC] = useState(getLevelByTier(3)) const [selectedLevelC, setSelectedLevelC] = useState(getLevelByTier(3))
const defaultLevelA = levelsData.levels.find(
(level) => level.tier === selectedLevelA.tier
) as ComparisonLevel
const defaultLevelB = levelsData.levels.find(
(level) => level.tier === selectedLevelB.tier
) as ComparisonLevel
const defaultLevelC = levelsData.levels.find(
(level) => level.tier === selectedLevelC.tier
) as ComparisonLevel
function handleSelectChange( function handleSelectChange(
callback: Dispatch<SetStateAction<ComparisonLevel>> callback: Dispatch<SetStateAction<ComparisonLevel>>
) { ) {
@@ -97,6 +108,14 @@ export default function OverviewTable() {
defaultSelectedKey={selectedLevelA.tier} defaultSelectedKey={selectedLevelA.tier}
onSelect={handleSelectChange(setSelectedLevelA)} onSelect={handleSelectChange(setSelectedLevelA)}
/> />
<Image
className={styles.icon}
src={defaultLevelA.icon}
alt={defaultLevelA.name}
height={50}
width={100}
/>
<LevelSummary <LevelSummary
level={ level={
levelsData.levels.find( levelsData.levels.find(
@@ -113,6 +132,14 @@ export default function OverviewTable() {
defaultSelectedKey={selectedLevelB.tier} defaultSelectedKey={selectedLevelB.tier}
onSelect={handleSelectChange(setSelectedLevelB)} onSelect={handleSelectChange(setSelectedLevelB)}
/> />
<Image
className={styles.icon}
src={defaultLevelB.icon}
alt={defaultLevelB.name}
height={50}
width={100}
/>
<LevelSummary <LevelSummary
level={ level={
levelsData.levels.find( levelsData.levels.find(
@@ -134,6 +161,14 @@ export default function OverviewTable() {
defaultSelectedKey={selectedLevelA.tier} defaultSelectedKey={selectedLevelA.tier}
onSelect={handleSelectChange(setSelectedLevelA)} onSelect={handleSelectChange(setSelectedLevelA)}
/> />
<Image
className={styles.icon}
src={defaultLevelA.icon}
alt={defaultLevelA.name}
height={50}
width={100}
/>
<LevelSummary <LevelSummary
level={ level={
levelsData.levels.find( levelsData.levels.find(
@@ -150,6 +185,14 @@ export default function OverviewTable() {
defaultSelectedKey={selectedLevelB.tier} defaultSelectedKey={selectedLevelB.tier}
onSelect={handleSelectChange(setSelectedLevelB)} onSelect={handleSelectChange(setSelectedLevelB)}
/> />
<Image
className={styles.icon}
src={defaultLevelB.icon}
alt={defaultLevelB.name}
height={50}
width={100}
/>
<LevelSummary <LevelSummary
level={ level={
levelsData.levels.find( levelsData.levels.find(
@@ -166,6 +209,14 @@ export default function OverviewTable() {
defaultSelectedKey={selectedLevelC.tier} defaultSelectedKey={selectedLevelC.tier}
onSelect={handleSelectChange(setSelectedLevelC)} onSelect={handleSelectChange(setSelectedLevelC)}
/> />
<Image
className={styles.icon}
src={defaultLevelC.icon}
alt={defaultLevelC.name}
height={50}
width={100}
/>
<LevelSummary <LevelSummary
level={ level={
levelsData.levels.find( levelsData.levels.find(

View File

@@ -56,6 +56,10 @@
padding: var(--Spacing-x2); padding: var(--Spacing-x2);
} }
.icon {
align-self: center;
}
.columnHeader:nth-child(1) { .columnHeader:nth-child(1) {
padding-right: var(--Spacing-x1); padding-right: var(--Spacing-x1);
} }

View File

@@ -92,3 +92,8 @@ export type BenefitListProps = {
export type LargeTableProps = { export type LargeTableProps = {
levels: ComparisonLevel[] levels: ComparisonLevel[]
} }
export type BenefitTableHeaderProps = {
name: string
description: string
}