Skip to content

Commit 4c7def6

Browse files
committed
Floatingmenu i stedet for knapp i toppen av arrangementsiden.
Tatt i bruk komponenten i omOss siden også Aria-label på dark mode knapper
1 parent 425425a commit 4c7def6

6 files changed

Lines changed: 84 additions & 35 deletions

File tree

app/(root)/arrangement/page.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { getFutureEvents, getPastAndFutureEvents, getPastEvents } from "@/sanity
22
import EventCardPaginated from "@/app/(root)/arrangement/eventCardPaginated"
33
import { type Metadata } from "next"
44
import CalendarModal from "@/components/modals/calendarModal"
5-
import { ButtonGroup } from "@nextui-org/react"
5+
import FloatingMenu from "@/components/floatingMenu"
66

77
export const metadata: Metadata = {
88
title: "Arrangementer | Root Linjeforening",
@@ -26,9 +26,11 @@ const EventsPage: AsyncPage = async () => {
2626
const { past, future } = await getPastAndFutureEvents(nrOfEvents)
2727
return (
2828
<div className={"pt-3 sm:px-10"}>
29-
<ButtonGroup className={"px-1 pb-3 sm:pb-0"}>
30-
<CalendarModal />
31-
</ButtonGroup>
29+
<FloatingMenu>
30+
<div className={"rounded-lg bg-white p-2"}>
31+
<CalendarModal />
32+
</div>
33+
</FloatingMenu>
3234
<div className={"flex flex-wrap items-baseline justify-center gap-5 sm:p-5"}>
3335
<EventCardPaginated
3436
cardTitle={"Kommende arrangementer"}

components/buttons/darkModeToggle.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const DarkModeToggle = () => {
3131
key={theme}
3232
onClick={() => setTheme(theme)}
3333
size="sm"
34+
aria-label={text}
3435
className={selectedTheme === theme ? "bg-root-primary text-white" : undefined}>
3536
{icon}
3637
{text}

components/floatingMenu.tsx

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"use client"
2+
3+
import { ChevronRightIcon } from "@heroicons/react/24/outline"
4+
import { defaultIconSize } from "@/components/icons/icon"
5+
import useToggle from "@/hooks/useToggle"
6+
7+
// TODO lukk når man trykker utenfor
8+
/**
9+
* En meny som flyter over innholdet på venstre side av skjermen. Dersom skjermen er for liten, vil menyen kunne åpnes og lukkes.
10+
* Ellers vil menyen alltid være åpen.
11+
* @param children Innholdet som skal vises i menyen.
12+
* @param className Klassenavn som skal legges til menyen.
13+
* @param props Andre props som sendes til menyen.
14+
*/
15+
const FloatingMenu: Component<ChildProps> = ({ children, className, ...props }) => {
16+
const [isMenuOpen, toggleMenu] = useToggle()
17+
18+
return (
19+
<div className={`fixed left-0 z-50 ${className}`} {...props}>
20+
<div className={"2xl:hidden"}>
21+
<button
22+
className={`h-fit w-fit divide-y rounded-r-2xl bg-white p-2 opacity-70 dark:bg-default-dark-background`}
23+
title={`${isMenuOpen ? "Lukk" : "Åpne"} meny`}
24+
onClick={() => toggleMenu()}>
25+
<ChevronRightIcon
26+
width={defaultIconSize}
27+
className={`transition-all duration-200 ${isMenuOpen && "rotate-180"}`}
28+
/>
29+
</button>
30+
<div
31+
className={`sticky h-full w-fit transition-all duration-200 ${
32+
isMenuOpen ? "translate-x-0" : "-translate-x-full"
33+
}`}>
34+
{children}
35+
</div>
36+
</div>
37+
<div className={"hidden 2xl:block"}>{children}</div>
38+
</div>
39+
)
40+
}
41+
42+
export default FloatingMenu

components/modals/calendarModal.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@ import Select from "@/components/select/select"
66
import { getEventTypeLabel } from "@/sanity/lib/utils"
77
import AddToCalendarDropdown from "@/components/dropdown/addToCalendarDropdown"
88

9-
const CalendarModal = () => (
9+
const CalendarModal: Component = () => (
1010
<Modal
1111
size={"xl"}
12-
label={"Abonner på kalender"}
13-
modalTitle={"Abonner på kalender"}
12+
label={"Abonner på arrangementer"}
13+
modalTitle={"Abonner på arrangementer i kalenderen din"}
1414
modalContent={<ModalContent />}
15+
trigger={toggle => (
16+
<button onClick={toggle} className={"text-root-primary"} aria-label={"Åpne meny"}>
17+
Abonner på arrangementer
18+
</button>
19+
)}
1520
/>
1621
)
1722

components/modals/modal.tsx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,26 @@ interface ModalProps extends DefaultProps {
1616
modalTitle?: string
1717
modalContent?: ReactNode
1818
size?: _ModalProps["size"]
19+
trigger?: (toggle: VoidFunction) => ReactNode
1920
}
2021

21-
const Modal: Component<ModalProps> = ({ label, size, modalTitle, modalContent, ...props }) => {
22+
/**
23+
* En modal som flyter over innholdet på siden.
24+
* @param label Tittelen på knappen som åpner modalen. Vises kun hvis trigger ikke er satt.
25+
* @param size Størrelsen på modalen.
26+
* @param modalTitle Tittelen på modalen. Vises på toppen av modalen.
27+
* @param modalContent Innholdet i modalen.
28+
* @param trigger En funksjon som returnerer en knapp som åpner modalen. Når denne er satt vil standard knappen ikke vises.
29+
* @param props Andre props som sendes til Modal komponenten.
30+
*/
31+
const Modal: Component<ModalProps> = ({
32+
label,
33+
size,
34+
modalTitle,
35+
modalContent,
36+
trigger,
37+
...props
38+
}) => {
2239
const [isOpen, toggleOpen] = useToggle()
2340

2441
function closeModal() {
@@ -27,9 +44,13 @@ const Modal: Component<ModalProps> = ({ label, size, modalTitle, modalContent, .
2744

2845
return (
2946
<>
30-
<Button onClick={() => toggleOpen()} aria-label={"Åpne dialogboks"}>
31-
{label}
32-
</Button>
47+
{trigger ? (
48+
trigger(toggleOpen)
49+
) : (
50+
<Button onClick={() => toggleOpen()} aria-label={"Åpne dialogboks"}>
51+
{label}
52+
</Button>
53+
)}
3354
<_Modal
3455
isOpen={isOpen}
3556
onClose={closeModal}

components/omOss/InfoPageContent.tsx

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ import SingleInfoCard from "@/components/cards/singleInfoCard"
33
import type { InfoSide } from "@/sanity/types"
44
import SideNavigator from "@/components/omOss/sideNavigator"
55
import { useMemo } from "react"
6-
import { ChevronRightIcon } from "@heroicons/react/24/outline"
76
import useToggle from "@/hooks/useToggle"
8-
import { defaultIconSize } from "@/components/icons/icon"
7+
import FloatingMenu from "@/components/floatingMenu"
98

109
/**
1110
* Representerer klient-siden av siden som viser informasjon om Root Linjeforeningen.
@@ -49,28 +48,7 @@ export const InfoPageContent: Component<{
4948
<div onClick={() => isMenuOpen && toggleMenu(false)}>
5049
{infoSider.length > 0 ? (
5150
<div className={`mt-24 flex justify-center`}>
52-
<div className={`fixed left-0 z-50 hidden h-full w-fit pr-1 2xl:flex`}>
53-
{navigator}
54-
</div>
55-
<div className={`fixed left-0 z-50 2xl:hidden`}>
56-
<button
57-
className={`h-fit w-fit divide-y rounded-r-2xl bg-white p-2 opacity-70 dark:bg-default-dark-background`}
58-
title={`${isMenuOpen ? "Lukk" : "Åpne"} meny`}
59-
onClick={() => toggleMenu()}>
60-
<ChevronRightIcon
61-
width={defaultIconSize}
62-
className={`transition-all duration-200 ${
63-
isMenuOpen && "rotate-180"
64-
}`}
65-
/>
66-
</button>
67-
<div
68-
className={`sticky h-full w-fit transition-all duration-200 ${
69-
isMenuOpen ? "translate-x-0" : "-translate-x-full"
70-
}`}>
71-
{navigator}
72-
</div>
73-
</div>
51+
<FloatingMenu>{navigator}</FloatingMenu>
7452
{infoPages}
7553
</div>
7654
) : (

0 commit comments

Comments
 (0)