diff --git a/apps/scandic-web/components/HotelReservation/HotelCard/index.tsx b/apps/scandic-web/components/HotelReservation/HotelCard/index.tsx index f525626ba..42a6b9d21 100644 --- a/apps/scandic-web/components/HotelReservation/HotelCard/index.tsx +++ b/apps/scandic-web/components/HotelReservation/HotelCard/index.tsx @@ -168,7 +168,6 @@ function HotelCard({ defaultMessage: "See hotel details", })} hotelId={hotel.operaId} - hotel={hotel} showCTA={true} sidePeekKey={SidePeekEnum.hotelDetails} /> diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/HotelDescription/hotelDescription.module.css b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/HotelDescription/hotelDescription.module.css new file mode 100644 index 000000000..5fe63205b --- /dev/null +++ b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/HotelDescription/hotelDescription.module.css @@ -0,0 +1,75 @@ +.hotelDescription { + overflow: hidden; +} + +.descriptionWrapper { + display: flex; + flex-direction: column; + align-items: center; +} + +.collapsed { + display: -webkit-box; + -webkit-line-clamp: 2; + line-clamp: 2; + -webkit-box-orient: vertical; +} + +.expanded { + display: block; + max-height: none; +} + +.expandedContent { + display: flex; + flex-direction: column; + align-items: center; + margin-top: var(--Space-x2); +} + +.description { + display: flex; + gap: var(--Space-x025); +} + +.showMoreButton { + display: flex; + align-items: flex-end; + background-color: transparent; + border-width: 0; + padding: 0; + color: var(--Text-Interactive-Secondary); + cursor: pointer; + + &:hover { + color: var(--Text-Interactive-Hover-Secondary); + } +} + +.facilities { + display: flex; + flex-direction: column; + gap: var(--Space-x15); + align-items: center; +} + +.facilityList { + display: flex; + align-items: flex-start; + justify-content: center; + flex-wrap: wrap; + gap: var(--Space-x15); + padding-bottom: var(--Space-x2); +} + +.facilitiesItem { + display: flex; + align-items: center; + gap: var(--Space-x1); +} + +@media screen and (min-width: 1367px) { + .descriptionWrapper { + display: none; + } +} diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/HotelDescription/index.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/HotelDescription/index.tsx new file mode 100644 index 000000000..8258b2ba1 --- /dev/null +++ b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/HotelDescription/index.tsx @@ -0,0 +1,92 @@ +"use client" + +import { useState } from "react" +import { Button as ButtonRAC } from "react-aria-components" +import { useIntl } from "react-intl" + +import { Typography } from "@scandic-hotels/design-system/Typography" + +import { FacilityToIcon } from "@/components/ContentType/HotelPage/data" +import ReadMore from "@/components/HotelReservation/ReadMore" +import Alert from "@/components/TempDesignSystem/Alert" + +import styles from "./hotelDescription.module.css" + +import { SidePeekEnum } from "@/types/components/hotelReservation/sidePeek" +import type { Hotel } from "@/types/hotel" + +export default function HotelDescription({ + description, + hotel, + sortedFacilities, +}: { + description?: string + hotel: Hotel + sortedFacilities: Hotel["detailedFacilities"] +}) { + const intl = useIntl() + + const [expanded, setExpanded] = useState(false) + + const handleToggle = () => { + setExpanded((prev) => !prev) + } + + const textShowMore = intl.formatMessage({ + defaultMessage: "Show more", + }) + + const textShowLess = intl.formatMessage({ + defaultMessage: "Show less", + }) + + return ( +
+
+ {sortedFacilities?.map((facility) => ( +
+ + +

{facility.name}

+
+
+ ))} +
+ +

+ {description} +

+
+ + + {expanded ? textShowLess : textShowMore} + + + + {expanded && ( +
+ + {hotel.specialAlerts.map((alert) => ( + + ))} +
+ )} +
+ ) +} diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/hotelInfoCard.module.css b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/hotelInfoCard.module.css index 58cf7550a..af8af740a 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/hotelInfoCard.module.css +++ b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/hotelInfoCard.module.css @@ -1,21 +1,29 @@ .container { background-color: var(--Base-Surface-Subtle-Normal); - padding: var(--Spacing-x3) 0; + padding: var(--Space-x3) 0; } +.hotelName { + color: var(--Text-Heading); +} + +.hotelAddress { + color: var(--Text-Tertiary); +} .wrapper { display: flex; margin: 0 auto; max-width: var(--max-width-page); position: relative; flex-direction: column; - gap: var(--Spacing-x2); + gap: var(--Space-x2); +} +.hotelDescription { + display: none; } - .imageWrapper { position: relative; height: 200px; - max-width: 360px; width: 100%; border-radius: var(--Corner-radius-md); } @@ -23,77 +31,111 @@ .hotelContent { display: flex; flex-direction: column; + align-items: center; } .hotelInformation { display: flex; flex-direction: column; - gap: var(--Spacing-x1); - width: min(607px, 100%); + gap: var(--Space-x1); + align-items: center; + text-align: center; } .hotelAddressDescription { display: flex; flex-direction: column; - gap: var(--Spacing-x2); -} - -.facilities { - padding: var(--Spacing-x3) 0 var(--Spacing-x-quarter); - gap: var(--Spacing-x-one-and-half); -} - -.facilityList { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: var(--Spacing-x-one-and-half); - padding-bottom: var(--Spacing-x1); -} - -.facilitiesItem { - display: flex; + gap: var(--Space-x2); align-items: center; - gap: var(--Spacing-x1); + text-align: center; } .hotelAlert { - max-width: var(--max-width-page); - margin: 0 auto; - padding-top: var(--Spacing-x-one-and-half); + display: none; +} + +.facilities { + display: none; } @media screen and (min-width: 768px) { .container { - padding: var(--Spacing-x4) 0; + padding: var(--Space-x4) 0; } } @media screen and (min-width: 1367px) { .container { - padding: var(--Spacing-x4) var(--Spacing-x5); + padding: var(--Space-x4) var(--Space-x5); + } + .hotelDescription { + display: block; + } + + .hotelAlert { + display: block; + max-width: var(--max-width-page); + margin: 0 auto; + padding-top: var(--Space-x15); + } + + .facilities { + display: flex; + flex-direction: column; + padding: var(--Space-x3) 0 var(--Space-x025); + gap: var(--Space-x15); + align-items: center; + } + + .facilityList { + display: flex; + align-items: flex-start; + justify-content: center; + flex-wrap: wrap; + gap: var(--Space-x15); + padding-bottom: var(--Space-x1); + } + + .facilitiesItem { + display: flex; + align-items: center; + gap: var(--Space-x1); + } + + .imageWrapper { + max-width: 360px; } .hotelContent { - gap: var(--Spacing-x6); + gap: var(--Space-x6); + align-items: normal; } .hotelInformation { - padding-right: var(--Spacing-x3); + padding-right: var(--Space-x3); + width: min(607px, 100%); + align-items: normal; + text-align: left; + } + + .hotelAddressDescription { + align-items: normal; + text-align: left; } .wrapper { - gap: var(--Spacing-x3); + gap: var(--Space-x3); flex-direction: row; } .facilities { - padding: var(--Spacing-x3) var(--Spacing-x3) var(--Spacing-x-half); + padding: var(--Space-x3) var(--Space-x3) var(--Space-x05); } .facilityList { - gap: var(--Spacing-x1); - padding-bottom: var(--Spacing-x-half); + gap: var(--Space-x1); + padding-bottom: var(--Space-x05); + flex-direction: column; } .facilityTitle { display: none; diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx index b534203f9..92599cb69 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx @@ -1,17 +1,17 @@ +import { Typography } from "@scandic-hotels/design-system/Typography" + import { FacilityToIcon } from "@/components/ContentType/HotelPage/data" import ImageGallery from "@/components/ImageGallery" import SkeletonShimmer from "@/components/SkeletonShimmer" import Alert from "@/components/TempDesignSystem/Alert" import Divider from "@/components/TempDesignSystem/Divider" -import Body from "@/components/TempDesignSystem/Text/Body" -import Caption from "@/components/TempDesignSystem/Text/Caption" -import Title from "@/components/TempDesignSystem/Text/Title" import { getIntl } from "@/i18n" import { mapApiImagesToGalleryImages } from "@/utils/imageGallery" import { getSingleDecimal } from "@/utils/numberFormatting" import ReadMore from "../../ReadMore" import TripAdvisorChip from "../../TripAdvisorChip" +import HotelDescription from "./HotelDescription" import styles from "./hotelInfoCard.module.css" @@ -38,56 +38,56 @@ export default async function HotelInfoCard({ hotel }: HotelInfoCardProps) {
- - {hotel.name} - + +

{hotel.name}

+
- - {intl.formatMessage( - { - defaultMessage: - "{address}, {city} ∙ {distanceToCityCenterInKm} km to city center", - }, - { - address: hotel.address.streetAddress, - city: hotel.address.city, - distanceToCityCenterInKm: getSingleDecimal( - hotel.location.distanceToCentre / 1000 - ), - } - )} - - - {hotel.hotelContent.texts.descriptions?.medium} - + +

+ {intl.formatMessage( + { + defaultMessage: + "{address}, {city} ∙ {distanceToCityCenterInKm} km to city center", + }, + { + address: hotel.address.streetAddress, + city: hotel.address.city, + distanceToCityCenterInKm: getSingleDecimal( + hotel.location.distanceToCentre / 1000 + ), + } + )} +

+
+ +

+ {hotel.hotelContent.texts.descriptions?.medium} +

+
+
- - {intl.formatMessage({ - defaultMessage: "At the hotel", - })} - - {sortedFacilities?.map((facility) => { - const Icon = ( + {sortedFacilities?.map((facility) => ( +
- ) - return ( -
- {Icon && Icon} - {facility.name} -
- ) - })} + +

{facility.name}

+
+
+ ))}
@@ -113,38 +113,43 @@ export function HotelInfoCardSkeleton() {
- +
- +
- - - - - - - - + + + + +

+ + + +

+
- - - + + + {[1, 2, 3, 4, 5]?.map((id) => { return (
- +
) })}
- +
diff --git a/apps/scandic-web/types/components/hotelReservation/selectHotel/selectHotel.ts b/apps/scandic-web/types/components/hotelReservation/selectHotel/selectHotel.ts index 31a37a571..60273df24 100644 --- a/apps/scandic-web/types/components/hotelReservation/selectHotel/selectHotel.ts +++ b/apps/scandic-web/types/components/hotelReservation/selectHotel/selectHotel.ts @@ -14,7 +14,6 @@ export enum AvailabilityEnum { export interface ReadMoreProps { label: string hotelId: string - hotel: Hotel showCTA: boolean sidePeekKey: SidePeekEnum }