fix(SW-2603): Fixed image sizes on hotel pages and width of main section
Approved-by: Arvid Norlin Approved-by: Matilda Landström
This commit is contained in:
@@ -1,10 +1,9 @@
|
|||||||
import Card from "@/components/TempDesignSystem/Card"
|
import Card from "@/components/TempDesignSystem/Card"
|
||||||
import CardImage from "@/components/TempDesignSystem/Card/CardImage"
|
|
||||||
import Grids from "@/components/TempDesignSystem/Grids"
|
import CardImage from "./CardImage"
|
||||||
|
|
||||||
import styles from "./cardGrid.module.css"
|
import styles from "./cardGrid.module.css"
|
||||||
|
|
||||||
import { HotelHashValues } from "@/types/components/hotelPage/tabNavigation"
|
|
||||||
import type { ActivityCard } from "@/types/trpc/routers/contentstack/hotelPage"
|
import type { ActivityCard } from "@/types/trpc/routers/contentstack/hotelPage"
|
||||||
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
||||||
|
|
||||||
@@ -13,7 +12,6 @@ export default function ActivitiesCardGrid(activitiesCard: ActivityCard) {
|
|||||||
|
|
||||||
const updatedCard: CardProps = {
|
const updatedCard: CardProps = {
|
||||||
...activitiesCard,
|
...activitiesCard,
|
||||||
id: HotelHashValues.activities,
|
|
||||||
theme: hasImage ? "image" : "primaryDark",
|
theme: hasImage ? "image" : "primaryDark",
|
||||||
primaryButton: hasImage
|
primaryButton: hasImage
|
||||||
? {
|
? {
|
||||||
@@ -33,13 +31,13 @@ export default function ActivitiesCardGrid(activitiesCard: ActivityCard) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<section id={updatedCard.id}>
|
<div>
|
||||||
<Grids.Stackable className={styles.desktopGrid}>
|
<div className={styles.desktopCards}>
|
||||||
<Card {...updatedCard} className={styles.spanThree} />
|
<Card {...updatedCard} className={styles.spanThree} />
|
||||||
</Grids.Stackable>
|
</div>
|
||||||
<Grids.Stackable className={styles.mobileGrid}>
|
<div className={styles.mobileCards}>
|
||||||
<CardImage card={updatedCard} />
|
<CardImage card={updatedCard} />
|
||||||
</Grids.Stackable>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
.image {
|
.cardImage {
|
||||||
object-fit: cover;
|
display: grid;
|
||||||
|
gap: var(--Space-x025);
|
||||||
|
}
|
||||||
|
|
||||||
|
.imageWrapper {
|
||||||
|
position: relative;
|
||||||
|
height: 180px; /* Fixed height from Figma */
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
width: 100%;
|
|
||||||
min-height: 180px; /* Fixed height from Figma */
|
|
||||||
border-radius: var(--Corner-radius-md);
|
border-radius: var(--Corner-radius-md);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
.imageContainer {
|
.imageContainer {
|
||||||
|
position: relative;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||||||
gap: var(--Spacing-x-quarter);
|
gap: var(--Space-x025);
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
height: 254px; /* Fixed height from Figma */
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
display: grid;
|
|
||||||
gap: var(--Spacing-x-quarter);
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import Image from "@/components/Image"
|
||||||
|
import Card from "@/components/TempDesignSystem/Card"
|
||||||
|
|
||||||
|
import styles from "./cardImage.module.css"
|
||||||
|
|
||||||
|
import type { CardImageProps } from "@/types/components/cardImage"
|
||||||
|
|
||||||
|
export default function CardImage({
|
||||||
|
card,
|
||||||
|
imageCards,
|
||||||
|
className,
|
||||||
|
}: CardImageProps) {
|
||||||
|
return (
|
||||||
|
<div className={`${styles.cardImage} ${className}`}>
|
||||||
|
<div className={styles.imageContainer}>
|
||||||
|
{imageCards?.map(
|
||||||
|
({ backgroundImage }) =>
|
||||||
|
backgroundImage && (
|
||||||
|
<div key={backgroundImage.id} className={styles.imageWrapper}>
|
||||||
|
<Image
|
||||||
|
src={backgroundImage.url}
|
||||||
|
className={styles.image}
|
||||||
|
alt={backgroundImage.title}
|
||||||
|
fill
|
||||||
|
sizes="(max-width: 768px) 100vw, 900px"
|
||||||
|
focalPoint={backgroundImage.focalPoint}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<Card {...card} height="dynamic" className={styles.card} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -2,35 +2,44 @@
|
|||||||
scroll-margin-top: var(--hotel-page-scroll-margin-top);
|
scroll-margin-top: var(--hotel-page-scroll-margin-top);
|
||||||
}
|
}
|
||||||
|
|
||||||
.spanOne {
|
@media screen and (max-width: 767px) {
|
||||||
grid-column: span 1;
|
.desktopCards {
|
||||||
}
|
display: none;
|
||||||
|
}
|
||||||
.spanTwo {
|
.mobileCards {
|
||||||
grid-column: span 2;
|
display: grid;
|
||||||
}
|
gap: var(--Space-x025);
|
||||||
|
}
|
||||||
.spanThree {
|
|
||||||
grid-column: span 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
section .desktopGrid {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
section .mobileGrid {
|
|
||||||
display: grid;
|
|
||||||
gap: var(--Spacing-x-quarter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 768px) {
|
@media screen and (min-width: 768px) {
|
||||||
section .desktopGrid {
|
.mobileCards {
|
||||||
display: grid;
|
|
||||||
gap: var(--Spacing-x1);
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
}
|
|
||||||
|
|
||||||
section .mobileGrid {
|
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
.desktopCards {
|
||||||
|
display: grid;
|
||||||
|
gap: var(--Space-x1);
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
height: 320px;
|
||||||
|
}
|
||||||
|
.imageWrapper {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: var(--Corner-radius-md);
|
||||||
|
}
|
||||||
|
.image {
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spanOne {
|
||||||
|
grid-column: span 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spanTwo {
|
||||||
|
grid-column: span 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spanThree {
|
||||||
|
grid-column: span 3;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
|
import Image from "@/components/Image"
|
||||||
import Card from "@/components/TempDesignSystem/Card"
|
import Card from "@/components/TempDesignSystem/Card"
|
||||||
import CardImage from "@/components/TempDesignSystem/Card/CardImage"
|
import {
|
||||||
import Grids from "@/components/TempDesignSystem/Grids"
|
filterFacilityCards,
|
||||||
import { filterFacilityCards, isFacilityCard } from "@/utils/facilityCards"
|
isFacilityCard,
|
||||||
|
isFacilityImage,
|
||||||
|
} from "@/utils/facilityCards"
|
||||||
|
|
||||||
|
import CardImage from "./CardImage"
|
||||||
|
|
||||||
import styles from "./cardGrid.module.css"
|
import styles from "./cardGrid.module.css"
|
||||||
|
|
||||||
@@ -27,14 +32,29 @@ export default function FacilitiesCardGrid({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div id={imageCard.card.id} className={styles.cardContainer}>
|
<div id={imageCard.card.id} className={styles.cardContainer}>
|
||||||
<Grids.Stackable className={styles.desktopGrid}>
|
<div className={styles.desktopCards}>
|
||||||
{facilitiesCardGrid.map((card: FacilityCardType) => (
|
{facilitiesCardGrid.map((card: FacilityCardType) =>
|
||||||
<Card {...card} key={card.id} className={getCardClassName(card)} />
|
isFacilityImage(card) && card.backgroundImage ? (
|
||||||
))}
|
<div
|
||||||
</Grids.Stackable>
|
key={card.id}
|
||||||
<Grids.Stackable className={styles.mobileGrid}>
|
className={`${styles.imageWrapper} ${getCardClassName(card)}`}
|
||||||
|
>
|
||||||
|
<Image
|
||||||
|
className={styles.image}
|
||||||
|
src={card.backgroundImage.url}
|
||||||
|
alt={card.backgroundImage.meta.alt || ""}
|
||||||
|
fill
|
||||||
|
sizes="(min-width: 1367px) 700px, 900px"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<Card {...card} key={card.id} className={getCardClassName(card)} />
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className={styles.mobileCards}>
|
||||||
<CardImage card={imageCard.card} imageCards={imageCard.images} />
|
<CardImage card={imageCard.card} imageCards={imageCard.images} />
|
||||||
</Grids.Stackable>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,16 @@
|
|||||||
.grid {
|
.facilitiesSection,
|
||||||
gap: var(--Spacing-x2);
|
.activitiesCards {
|
||||||
|
display: grid;
|
||||||
|
gap: var(--Space-x2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.activitiesCards {
|
||||||
|
scroll-margin-top: var(--hotel-page-scroll-margin-top);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 768px) {
|
@media screen and (min-width: 768px) {
|
||||||
.grid {
|
.facilitiesSection,
|
||||||
gap: var(--Spacing-x7);
|
.activitiesCards {
|
||||||
|
gap: var(--Space-x7);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import SectionContainer from "@/components/Section/Container"
|
|
||||||
import { getIntl } from "@/i18n"
|
import { getIntl } from "@/i18n"
|
||||||
import { isFacilityCard, setFacilityCardGrids } from "@/utils/facilityCards"
|
import { isFacilityCard, setFacilityCardGrids } from "@/utils/facilityCards"
|
||||||
|
|
||||||
@@ -14,6 +13,7 @@ import {
|
|||||||
type FacilityCardType,
|
type FacilityCardType,
|
||||||
type FacilityGrid,
|
type FacilityGrid,
|
||||||
} from "@/types/components/hotelPage/facilities"
|
} from "@/types/components/hotelPage/facilities"
|
||||||
|
import { HotelHashValues } from "@/types/components/hotelPage/tabNavigation"
|
||||||
|
|
||||||
export default async function Facilities({
|
export default async function Facilities({
|
||||||
facilities,
|
facilities,
|
||||||
@@ -63,19 +63,23 @@ export default async function Facilities({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SectionContainer className={styles.grid}>
|
<section className={styles.facilitiesSection}>
|
||||||
{translatedFacilityGrids.map((cardGrid: FacilityGrid) => (
|
{translatedFacilityGrids.map((cardGrid: FacilityGrid) => (
|
||||||
<FacilitiesCardGrid
|
<FacilitiesCardGrid
|
||||||
key={cardGrid[0].id}
|
key={cardGrid[0].id}
|
||||||
facilitiesCardGrid={cardGrid}
|
facilitiesCardGrid={cardGrid}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
{activitiesCards.map((card) => (
|
{activitiesCards.length ? (
|
||||||
<ActivitiesCardGrid
|
<div id={HotelHashValues.activities} className={styles.activitiesCards}>
|
||||||
key={card.upcoming_activities_card.contentPage.href}
|
{activitiesCards.map((card) => (
|
||||||
{...card.upcoming_activities_card}
|
<ActivitiesCardGrid
|
||||||
/>
|
key={card.upcoming_activities_card.contentPage.href}
|
||||||
))}
|
{...card.upcoming_activities_card}
|
||||||
</SectionContainer>
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
|
</section>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
--hotel-page-navigation-height: 59px;
|
--hotel-page-navigation-height: 59px;
|
||||||
--hotel-page-scroll-margin-top: calc(
|
--hotel-page-scroll-margin-top: calc(
|
||||||
var(--hotel-page-navigation-height) + var(--booking-widget-mobile-height) +
|
var(--hotel-page-navigation-height) + var(--booking-widget-mobile-height) +
|
||||||
var(--Spacing-x2)
|
var(--Space-x2)
|
||||||
);
|
);
|
||||||
--hotel-page-intro-section-width: 607px; /* Max width according to Figma */
|
--hotel-page-intro-section-width: 607px; /* Max width according to Figma */
|
||||||
|
|
||||||
@@ -27,9 +27,11 @@
|
|||||||
.mainSection {
|
.mainSection {
|
||||||
grid-area: mainSection;
|
grid-area: mainSection;
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--Spacing-x9);
|
gap: var(
|
||||||
padding: var(--Spacing-x4) 0;
|
--Spacing-x9
|
||||||
max-width: var(--max-width-page);
|
); /* var(--Space-x9) does not exist in the design system, hence the "old" variable */
|
||||||
|
padding: var(--Space-x4) 0;
|
||||||
|
width: var(--max-width-page);
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +41,7 @@
|
|||||||
|
|
||||||
.overview {
|
.overview {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--Spacing-x3);
|
gap: var(--Space-x3);
|
||||||
scroll-margin-top: var(--hotel-page-scroll-margin-top);
|
scroll-margin-top: var(--hotel-page-scroll-margin-top);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,12 +49,12 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: var(--Spacing-x4);
|
gap: var(--Space-x4);
|
||||||
}
|
}
|
||||||
|
|
||||||
.alertsContainer {
|
.alertsContainer {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--Spacing-x2);
|
gap: var(--Space-x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 768px) {
|
@media screen and (min-width: 768px) {
|
||||||
@@ -61,8 +63,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.mainSection {
|
.mainSection {
|
||||||
max-width: 100%;
|
padding: var(--Space-x6) var(--Layout-Tablet-Margin-Margin-min);
|
||||||
padding: var(--Spacing-x6) var(--Layout-Tablet-Margin-Margin-min);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@
|
|||||||
.pageContainer {
|
.pageContainer {
|
||||||
--hotel-page-scroll-margin-top: calc(
|
--hotel-page-scroll-margin-top: calc(
|
||||||
var(--hotel-page-navigation-height) +
|
var(--hotel-page-navigation-height) +
|
||||||
var(--booking-widget-desktop-height) + var(--Spacing-x2)
|
var(--booking-widget-desktop-height) + var(--Space-x2)
|
||||||
);
|
);
|
||||||
grid-template-areas:
|
grid-template-areas:
|
||||||
"header mapContainer"
|
"header mapContainer"
|
||||||
@@ -80,7 +81,8 @@
|
|||||||
}
|
}
|
||||||
.mainSection {
|
.mainSection {
|
||||||
grid-area: mainSection;
|
grid-area: mainSection;
|
||||||
padding: var(--Spacing-x6) var(--max-width-single-spacing);
|
padding: var(--Space-x6) var(--max-width-single-spacing);
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
.mapContainer {
|
.mapContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -93,7 +95,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pageContainer > nav {
|
.pageContainer > nav {
|
||||||
padding-left: var(--Spacing-x5);
|
padding-left: var(--Space-x5);
|
||||||
padding-right: var(--Spacing-x5);
|
padding-right: var(--Space-x5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
import Image from "@/components/Image"
|
|
||||||
|
|
||||||
import Card from ".."
|
|
||||||
|
|
||||||
import styles from "./cardImage.module.css"
|
|
||||||
|
|
||||||
import type { CardImageProps } from "@/types/components/cardImage"
|
|
||||||
|
|
||||||
export default function CardImage({
|
|
||||||
card,
|
|
||||||
imageCards,
|
|
||||||
className,
|
|
||||||
}: CardImageProps) {
|
|
||||||
return (
|
|
||||||
<article className={`${styles.container} ${className}`}>
|
|
||||||
<div className={styles.imageContainer}>
|
|
||||||
{imageCards?.map(
|
|
||||||
({ backgroundImage }) =>
|
|
||||||
backgroundImage && (
|
|
||||||
<Image
|
|
||||||
key={backgroundImage.id}
|
|
||||||
src={backgroundImage.url}
|
|
||||||
className={styles.image}
|
|
||||||
alt={backgroundImage.title}
|
|
||||||
width={180}
|
|
||||||
height={180}
|
|
||||||
focalPoint={backgroundImage.focalPoint}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<Card {...card} className={styles.card} />
|
|
||||||
</article>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
border-radius: var(--Corner-radius-md);
|
border-radius: var(--Corner-radius-md);
|
||||||
margin-right: var(--Spacing-x2);
|
margin-right: var(--Space-x2);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
text-wrap: balance;
|
text-wrap: balance;
|
||||||
@@ -49,10 +49,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
margin: var(--Spacing-x0) var(--Spacing-x4);
|
|
||||||
position: absolute;
|
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--Spacing-x2);
|
padding: var(--Space-x4) var(--Space-x3);
|
||||||
|
gap: var(--Space-x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.themeOne {
|
.themeOne {
|
||||||
@@ -83,25 +82,22 @@
|
|||||||
background: var(--Primary-Strong-Surface-Normal);
|
background: var(--Primary-Strong-Surface-Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
.themeImage {
|
|
||||||
}
|
|
||||||
|
|
||||||
.themeImage .content {
|
.themeImage .content {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
|
|
||||||
.scriptContainer {
|
.scriptContainer {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--Spacing-x1);
|
gap: var(--Space-x1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.scriptedTitle {
|
.scriptedTitle {
|
||||||
padding: var(--Spacing-x1);
|
padding: var(--Space-x1);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.buttonContainer {
|
.buttonContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: var(--Spacing-x1);
|
gap: var(--Space-x1);
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user