diff --git a/components/Icons/FilledHeart.tsx b/components/Icons/FilledHeart.tsx
new file mode 100644
index 000000000..f254dade7
--- /dev/null
+++ b/components/Icons/FilledHeart.tsx
@@ -0,0 +1,27 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function FilledHeartIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/SidePeeks/HotelSidePeek/Accordions/Accessibility.tsx b/components/SidePeeks/HotelSidePeek/Accordions/Accessibility.tsx
new file mode 100644
index 000000000..be0fac660
--- /dev/null
+++ b/components/SidePeeks/HotelSidePeek/Accordions/Accessibility.tsx
@@ -0,0 +1,21 @@
+import { useIntl } from "react-intl"
+
+import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem"
+import Body from "@/components/TempDesignSystem/Text/Body"
+
+import { AccessibilityProps } from "@/types/components/hotelReservation/selectHotel/selectHotel"
+import { IconName } from "@/types/components/icon"
+
+export default function Accessibility({
+ accessibilityElevatorPitchText,
+}: AccessibilityProps) {
+ const intl = useIntl()
+ return (
+
+ {accessibilityElevatorPitchText}
+
+ )
+}
diff --git a/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx b/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx
new file mode 100644
index 000000000..d005e6688
--- /dev/null
+++ b/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx
@@ -0,0 +1,22 @@
+import { useIntl } from "react-intl"
+
+import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem"
+import Body from "@/components/TempDesignSystem/Text/Body"
+
+import { CheckInCheckOutProps } from "@/types/components/hotelReservation/selectHotel/selectHotel"
+import { IconName } from "@/types/components/icon"
+
+export default function CheckinCheckOut({ checkin }: CheckInCheckOutProps) {
+ const intl = useIntl()
+
+ return (
+
+ {intl.formatMessage({ id: "Hours" })}
+ {`${intl.formatMessage({ id: "Check in from" })}: ${checkin.checkInTime}`}
+ {`${intl.formatMessage({ id: "Check out at latest" })}: ${checkin.checkOutTime}`}
+
+ )
+}
diff --git a/components/SidePeeks/HotelSidePeek/Accordions/MeetingsAndConferences.tsx b/components/SidePeeks/HotelSidePeek/Accordions/MeetingsAndConferences.tsx
new file mode 100644
index 000000000..558046d4b
--- /dev/null
+++ b/components/SidePeeks/HotelSidePeek/Accordions/MeetingsAndConferences.tsx
@@ -0,0 +1,21 @@
+import { useIntl } from "react-intl"
+
+import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem"
+import Body from "@/components/TempDesignSystem/Text/Body"
+
+import { MeetingsAndConferencesProps } from "@/types/components/hotelReservation/selectHotel/selectHotel"
+import { IconName } from "@/types/components/icon"
+
+export default function MeetingsAndConferences({
+ meetingDescription,
+}: MeetingsAndConferencesProps) {
+ const intl = useIntl()
+ return (
+
+ {meetingDescription}
+
+ )
+}
diff --git a/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx b/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx
new file mode 100644
index 000000000..0e5ffcec0
--- /dev/null
+++ b/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx
@@ -0,0 +1,55 @@
+import { useIntl } from "react-intl"
+
+import FilledHeartIcon from "@/components/Icons/FilledHeart"
+import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem"
+import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
+
+import styles from "./sidePeekAccordion.module.css"
+
+import { ParkingProps } from "@/types/components/hotelReservation/selectHotel/selectHotel"
+import { IconName } from "@/types/components/icon"
+
+export default function Parking({ parking }: ParkingProps) {
+ const intl = useIntl()
+ return (
+
+ {parking.map((p) => (
+
+
+ {`${intl.formatMessage({ id: p.type })} ${p?.name ? ` (${p.name})` : ""}`}
+
+
+ {p?.address && (
+ -
+
+ {`${intl.formatMessage({ id: "Address" })}: ${p.address}`}
+
+ )}
+ {p?.numberOfParkingSpots !== undefined && (
+ -
+
+ {intl.formatMessage(
+ { id: "Number of parking spots" },
+ { number: p.numberOfParkingSpots }
+ )}
+
+ )}
+ {p?.numberOfChargingSpaces !== undefined && (
+ -
+
+ {intl.formatMessage(
+ { id: "Number of charging points for electric cars" },
+ { number: p.numberOfChargingSpaces }
+ )}
+
+ )}
+
+
+ ))}
+
+ )
+}
diff --git a/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx b/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx
new file mode 100644
index 000000000..a8d1cd047
--- /dev/null
+++ b/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx
@@ -0,0 +1,22 @@
+import { useIntl } from "react-intl"
+
+import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem"
+import Body from "@/components/TempDesignSystem/Text/Body"
+
+import { RestaurantProps } from "@/types/components/hotelReservation/selectHotel/selectHotel"
+import { IconName } from "@/types/components/icon"
+
+export default function Restaurant({
+ restaurantsContentDescriptionMedium,
+}: RestaurantProps) {
+ const intl = useIntl()
+
+ return (
+
+ {restaurantsContentDescriptionMedium}
+
+ )
+}
diff --git a/components/SidePeeks/HotelSidePeek/Accordions/sidePeekAccordion.module.css b/components/SidePeeks/HotelSidePeek/Accordions/sidePeekAccordion.module.css
new file mode 100644
index 000000000..bd2ae8933
--- /dev/null
+++ b/components/SidePeeks/HotelSidePeek/Accordions/sidePeekAccordion.module.css
@@ -0,0 +1,23 @@
+.list {
+ font-family: var(--typography-Body-Regular-fontFamily);
+ list-style-position: inside;
+ list-style-type: none;
+ margin-top: var(--Spacing-x-one-and-half);
+}
+
+.list li {
+ display: flex;
+ align-items: center;
+ gap: var(--Spacing-x1);
+ padding-left: var(--Spacing-x1);
+}
+
+.list li svg {
+ flex-shrink: 0;
+}
+
+.parking details > div {
+ display: flex;
+ flex-direction: column;
+ gap: var(--Spacing-x2);
+}
diff --git a/components/SidePeeks/HotelSidePeek/hotelSidePeek.module.css b/components/SidePeeks/HotelSidePeek/hotelSidePeek.module.css
index 37fb3aeab..23b92b792 100644
--- a/components/SidePeeks/HotelSidePeek/hotelSidePeek.module.css
+++ b/components/SidePeeks/HotelSidePeek/hotelSidePeek.module.css
@@ -22,8 +22,3 @@
.noIcon {
margin-left: var(--Spacing-x4);
}
-
-.list {
- font-family: var(--typography-Body-Regular-fontFamily);
- list-style: inside;
-}
diff --git a/components/SidePeeks/HotelSidePeek/index.tsx b/components/SidePeeks/HotelSidePeek/index.tsx
index e1e0d55ca..4fc5bab8c 100644
--- a/components/SidePeeks/HotelSidePeek/index.tsx
+++ b/components/SidePeeks/HotelSidePeek/index.tsx
@@ -2,29 +2,21 @@ import { useIntl } from "react-intl"
import { mapFacilityToIcon } from "@/components/ContentType/HotelPage/data"
import Contact from "@/components/HotelReservation/Contact"
-import { AccessibilityIcon } from "@/components/Icons"
import Accordion from "@/components/TempDesignSystem/Accordion"
-import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem"
-import Button from "@/components/TempDesignSystem/Button"
import SidePeek from "@/components/TempDesignSystem/SidePeek"
import Body from "@/components/TempDesignSystem/Text/Body"
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
+import Accessibility from "./Accordions/Accessibility"
+import CheckinCheckOut from "./Accordions/CheckInCheckOut"
+import MeetingsAndConferences from "./Accordions/MeetingsAndConferences"
+import Parking from "./Accordions/Parking"
+import Restaurant from "./Accordions/Restaurant"
+
import styles from "./hotelSidePeek.module.css"
import type { HotelSidePeekProps } from "@/types/components/hotelReservation/hotelSidePeek"
-import type { ParkingProps } from "@/types/components/hotelReservation/selectHotel/selectHotel"
import { SidePeekEnum } from "@/types/components/hotelReservation/sidePeek"
-import { IconName } from "@/types/components/icon"
-import type { Amenities, Hotel } from "@/types/hotel"
-
-function getAmenitiesList(hotel: Hotel) {
- const detailedAmenities: Amenities = hotel.detailedFacilities.filter(
- // Remove Parking facilities since parking accordion is based on hotel.parking
- (facility) => !facility.name.startsWith("Parking") && facility.public
- )
- return detailedAmenities
-}
export default function HotelSidePeek({
hotel,
@@ -33,7 +25,12 @@ export default function HotelSidePeek({
showCTA,
}: HotelSidePeekProps) {
const intl = useIntl()
- const amenitiesList = getAmenitiesList(hotel)
+ const amenitiesList = hotel.detailedFacilities.filter(
+ (facility) => facility.public
+ )
+ const parking = hotel.parking.filter(
+ (p) => p?.numberOfParkingSpots || p?.numberOfChargingSpaces || p?.address
+ )
return (
-
+
{intl.formatMessage({ id: "Practical information" })}
- {/* parking */}
- {hotel.parking.length ? (
-
- {hotel.parking.map((p) => (
-
- ))}
-
- ) : null}
-
-
0 && }
+ {hotel.hotelContent?.restaurantsOverviewPage
+ ?.restaurantsContentDescriptionMedium && (
+
- {intl.formatMessage({ id: "Accessibility" })}
-
+ )}
+ {hotel?.accessibilityElevatorPitchText && (
+
+ )}
+ {hotel.hotelFacts?.checkin && (
+
+ )}
+ {hotel.hotelContent.texts?.meetingDescription?.medium && (
+
+ )}
{amenitiesList.map((amenity) => {
const Icon = mapFacilityToIcon(amenity.id)
return (
@@ -84,54 +89,13 @@ export default function HotelSidePeek({
)
})}
- {showCTA && (
- /* TODO: handle linking to Hotel Page */
-
- )}
+ {/* TODO: handle linking to Hotel Page */}
+ {/* {showCTA && (
+
+ )} */}
)
}
-
-function Parking({ parking }: ParkingProps) {
- const intl = useIntl()
- return (
-
-
- {`${intl.formatMessage({ id: parking.type })}${parking?.name ? ` (${parking.name})` : ""}`}
-
-
- {parking?.numberOfChargingSpaces !== undefined && (
- -
- {intl.formatMessage(
- { id: "Number of charging points for electric cars" },
- { number: parking.numberOfChargingSpaces }
- )}
-
- )}
- {parking?.canMakeReservation && (
- - {`${intl.formatMessage({ id: "Parking can be reserved in advance" })}: ${parking.canMakeReservation ? intl.formatMessage({ id: "Yes" }) : intl.formatMessage({ id: "No" })}`}
- )}
- {parking?.numberOfParkingSpots !== undefined && (
- -
- {intl.formatMessage(
- { id: "Number of parking spots" },
- { number: parking.numberOfParkingSpots }
- )}
-
- )}
- {parking?.distanceToHotel !== undefined && (
- -
- {intl.formatMessage(
- { id: "Distance to hotel" },
- { distance: parking.distanceToHotel }
- )}
-
- )}
- {parking?.address && (
- - {`${intl.formatMessage({ id: "Address" })}: ${parking.address}`}
- )}
-
-
- )
-}
diff --git a/components/TempDesignSystem/Accordion/AccordionItem/index.tsx b/components/TempDesignSystem/Accordion/AccordionItem/index.tsx
index be877dd9e..5831be33e 100644
--- a/components/TempDesignSystem/Accordion/AccordionItem/index.tsx
+++ b/components/TempDesignSystem/Accordion/AccordionItem/index.tsx
@@ -5,6 +5,8 @@ import { useRef } from "react"
import { ChevronDownIcon } from "@/components/Icons"
import { getIconByIconName } from "@/components/Icons/get-icon-by-icon-name"
+import Body from "../../Text/Body"
+import Subtitle from "../../Text/Subtitle"
import { accordionItemVariants } from "./variants"
import styles from "./accordionItem.module.css"
@@ -49,7 +51,23 @@ export default function AccordionItem({
{IconComp && }
- {title}
+ {variant === "card" ? (
+
+ {title}
+
+ ) : (
+
+ {title}
+
+ )}
export type GalleryImage = z.infer
+export type CheckInData = z.infer
export type PointOfInterest = z.output