diff --git a/apps/scandic-web/components/ContentType/HotelPage/Rooms/rooms.module.css b/apps/scandic-web/components/ContentType/HotelPage/Rooms/rooms.module.css index 9e0816b44..e1616bede 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/Rooms/rooms.module.css +++ b/apps/scandic-web/components/ContentType/HotelPage/Rooms/rooms.module.css @@ -17,7 +17,7 @@ transform: rotate(180deg); } -.grid:not(.allVisible) :nth-child(n + 4) { +.grid:not(.allVisible) > :nth-child(n + 4) { display: none; } diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/RoomFacilities/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/RoomFacilities/index.tsx new file mode 100644 index 000000000..b6e3f166d --- /dev/null +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/RoomFacilities/index.tsx @@ -0,0 +1,94 @@ +"use client" + +import { cx } from "class-variance-authority" +import { useRef, useState } from "react" +import { useIntl } from "react-intl" + +import { Typography } from "@scandic-hotels/design-system/Typography" + +import { FacilityIcon } from "@/components/SidePeeks/RoomSidePeek/facilityIcon" +import ShowMoreButton from "@/components/TempDesignSystem/ShowMoreButton" + +import styles from "./roomFacilities.module.css" + +import type { Room } from "@/types/hotel" + +interface RoomFacilitiesProps { + roomFacilities: Room["roomFacilities"] +} + +export default function RoomFacilities({ + roomFacilities, +}: RoomFacilitiesProps) { + const intl = useIntl() + const showMobileToggleButton = roomFacilities.length > 10 + const [allVisibleOnMobile, setAllVisibleOnMobile] = useState( + !showMobileToggleButton + ) + const scrollRef = useRef(null) + + const mappedFacilities = roomFacilities + .sort((a, b) => a.sortOrder - b.sortOrder) + .map((facility) => { + const facilityName = facility.availableInAllRooms + ? facility.name + : intl.formatMessage( + { + defaultMessage: "{facility} (available in some rooms)", + }, + { + facility: facility.name, + } + ) + return { + ...facility, + name: facilityName, + } + }) + + function handleShowMore() { + if (scrollRef.current && allVisibleOnMobile) { + scrollRef.current.scrollIntoView({ behavior: "smooth" }) + } + setAllVisibleOnMobile((state) => !state) + } + + return ( + <> + +

+ {intl.formatMessage({ + defaultMessage: "Room amenities", + })} +

+
+ + {showMobileToggleButton ? ( +
+ +
+ ) : null} + + ) +} diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/RoomFacilities/roomFacilities.module.css b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/RoomFacilities/roomFacilities.module.css new file mode 100644 index 000000000..9a5447d00 --- /dev/null +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/RoomFacilities/roomFacilities.module.css @@ -0,0 +1,38 @@ +.heading { + /* Custom value to make the heading visible with a bit of margin when scrolled programmatically */ + scroll-margin-top: 16px; +} + +.item { + display: flex; + gap: var(--Spacing-x1); + margin-bottom: var(--Spacing-x-half); + align-items: self-start; + justify-content: flex-start; + color: var(--Text-Secondary); +} + +.icon { + flex-shrink: 0; +} + +.ctaWrapper { + width: max-content; +} + +@media screen and (max-width: 767px) { + .facilities:not(.allVisibleMobile) > :nth-child(n + 11) { + display: none; + } +} + +@media screen and (min-width: 768px) { + .facilities { + column-count: 2; + column-gap: var(--Spacing-x2); + } + + .ctaWrapper { + display: none; + } +} diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx index 87373ac10..e2b33b8c6 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Room/index.tsx @@ -1,4 +1,3 @@ -import { cx } from "class-variance-authority" import Link from "next/link" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" @@ -9,7 +8,6 @@ import { dt } from "@/lib/dt" import ImageGallery from "@/components/ImageGallery" import { getBedIconName } from "@/components/SidePeeks/RoomSidePeek/bedIcon" -import { FacilityIcon } from "@/components/SidePeeks/RoomSidePeek/facilityIcon" import Button from "@/components/TempDesignSystem/Button" import SidePeek from "@/components/TempDesignSystem/SidePeek" import { getIntl } from "@/i18n" @@ -17,6 +15,7 @@ import { getLang } from "@/i18n/serverContext" import { mapApiImagesToGalleryImages } from "@/utils/imageGallery" import { getRoomNameAsParam } from "../../utils" +import RoomFacilities from "./RoomFacilities" import styles from "./room.module.css" @@ -95,45 +94,7 @@ export default async function RoomSidePeek({
- -

- {intl.formatMessage({ - defaultMessage: "Room amenities", - })} -

-
- +
@@ -155,16 +116,15 @@ export default async function RoomSidePeek({