From 301de3a110990af6ad2bac1945b5eac9397870cc Mon Sep 17 00:00:00 2001 From: Arvid Norlin Date: Tue, 2 Jul 2024 15:22:26 +0200 Subject: [PATCH] feat: add SidePeek --- .../ContentType/HotelPage/HotelPage.tsx | 12 +++ .../TempDesignSystem/SidePeek/index.tsx | 70 ++++++++++++++ .../SidePeek/sidePeek.module.css | 94 +++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 components/TempDesignSystem/SidePeek/index.tsx create mode 100644 components/TempDesignSystem/SidePeek/sidePeek.module.css diff --git a/components/ContentType/HotelPage/HotelPage.tsx b/components/ContentType/HotelPage/HotelPage.tsx index d57b3c36a..af170493f 100644 --- a/components/ContentType/HotelPage/HotelPage.tsx +++ b/components/ContentType/HotelPage/HotelPage.tsx @@ -1,8 +1,11 @@ +import Link from "next/link" + import { serverClient } from "@/lib/trpc/server" import AmenitiesList from "./AmenitiesList" import IntroSection from "./IntroSection" import { Rooms } from "./Rooms" +import SidePeek from "@/components/TempDesignSystem/SidePeek" import styles from "./hotelPage.module.css" @@ -35,6 +38,15 @@ export default async function HotelPage({ lang }: LangParams) { + + Restaurant and bar + + + Gym + + + Meetings + ) } diff --git a/components/TempDesignSystem/SidePeek/index.tsx b/components/TempDesignSystem/SidePeek/index.tsx new file mode 100644 index 000000000..0b03ed53a --- /dev/null +++ b/components/TempDesignSystem/SidePeek/index.tsx @@ -0,0 +1,70 @@ +"use client" + +import { usePathname, useRouter, useSearchParams } from "next/navigation" +import { ReactNode, useEffect, useState } from "react" +import { Button, Dialog, DialogTrigger, Modal } from "react-aria-components" +import { X } from "react-feather" + +import Title from "@/components/TempDesignSystem/Text/Title" + +import styles from "./sidePeek.module.css" + +type SidePeekProps = { + content: Record +} +export default function SidePeek({ content }: SidePeekProps) { + const [sidePeekContent, setSidePeekContent] = useState(null) + + const searchParams = useSearchParams() + const activeSidePeek = searchParams.get("sidepeek") + const router = useRouter() + const pathname = usePathname() + + useEffect(() => { + if (activeSidePeek) { + setSidePeekContent(activeSidePeek) + } + }, [activeSidePeek]) + + const activeContent = sidePeekContent && content[sidePeekContent] + + function handleClose(isOpen: boolean) { + if (!isOpen) { + console.log("closing the modal now") + setSidePeekContent(null) + + const nextSearchParams = new URLSearchParams(searchParams.toString()) + nextSearchParams.delete("sidepeek") + + router.push(`${pathname}?${nextSearchParams}`, { scroll: false }) + } + } + + return ( + + + + {({ close }) => ( + + )} + + + + ) +} diff --git a/components/TempDesignSystem/SidePeek/sidePeek.module.css b/components/TempDesignSystem/SidePeek/sidePeek.module.css new file mode 100644 index 000000000..b8cf09fc5 --- /dev/null +++ b/components/TempDesignSystem/SidePeek/sidePeek.module.css @@ -0,0 +1,94 @@ +.sidePeek { + position: fixed; + top: 0; + bottom: 0; + right: 0px; + width: 600px; + background-color: var(--Base-Background-Normal); + z-index: 100; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.85); +} + +.sidePeek[data-entering] { + animation: slide-in 250ms; +} + +.sidePeek[data-exiting] { + animation: slide-in 250ms reverse; +} + +.header { + display: flex; + justify-content: flex-end; +} + +.header:has(> h2) { + justify-content: space-between; +} + +.title { + text-transform: uppercase; + color: var(--Scandic-Brand-Burgundy); +} + +.closeBtn { + border: none; + background-color: transparent; + display: flex; + align-items: center; + padding: 0; + cursor: pointer; +} + +.closeIcon { + color: var(--Scandic-Brand-Burgundy); +} + +.dialog { + height: 100%; +} + +.content { + display: grid; + grid-template-rows: min-content auto; + gap: var(--Spacing-x4); + height: 100%; + padding: var(--Spacing-x4) var(--Spacing-x5); +} + +@keyframes slide-in { + from { + right: -600px; + } + + to { + right: 0; + } +} + +@keyframes slide-up { + from { + top: 100vh; + } + + to { + top: 70.047px; + } +} + +@media screen and (max-width: 1024px) { + .sidePeek { + right: auto; + top: 70.047px; + width: 100%; + height: calc(100vh - 70.047px); + } + + .sidePeek[data-entering] { + animation: slide-up 300ms; + } + + .sidePeek[data-exiting] { + animation: slide-up 300ms reverse; + } +}