From 28cf0b258db7dc1538bfda5ad89a5f218aa5d8d2 Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Mon, 21 Oct 2024 15:54:36 +0200 Subject: [PATCH 01/15] wip --- .prettierrc | 3 +- .vscode/settings.json | 9 + bun.lockb | Bin 211362 -> 281456 bytes components.json | 20 ++ components/TourMap.js | 303 ------------------ components/TourMap.tsx | 336 ++++++++++++++++++++ components/ui/button.tsx | 56 ++++ components/ui/card.tsx | 79 +++++ components/ui/carousel.tsx | 260 +++++++++++++++ components/ui/dialog.tsx | 120 +++++++ components/ui/dropdown-menu.tsx | 198 ++++++++++++ components/ui/footer.tsx | 52 +++ components/ui/navbar.tsx | 82 +++++ lib/{date-utils.js => date-utils.ts} | 41 ++- lib/providers/themeProvider.tsx | 9 + lib/utils.ts | 6 + next-env.d.ts | 5 + package.json | 23 +- pages/_app.js | 21 -- pages/_app.tsx | 27 ++ pages/_document.tsx | 23 ++ pages/guide/campus.js | 8 - pages/guide/glossary.js | 8 - pages/guide/life.js | 4 - pages/guide/studies.js | 8 - pages/index.js | 456 --------------------------- pages/index.tsx | 419 ++++++++++++++++++++++++ pages/scavenger/[id].js | 4 - pages/scavenger/index.js | 4 - pages/tour/[city].js | 46 --- pages/tour/[city].tsx | 68 ++++ postcss.config.js | 6 + public/favicon.ico | Bin 15086 -> 0 bytes public/pin_gray.svg | 77 ----- public/pin_green.svg | 77 ----- public/pin_indigo.svg | 77 ----- public/pin_orange.svg | 77 ----- public/pin_red.svg | 77 ----- public/vercel.svg | 4 - styles/Home.module.css | 84 ----- styles/Scavenger.module.css | 39 --- styles/TourMap.module.css | 93 ------ styles/globals.css | 94 ++++-- tailwind.config.js | 71 +++++ tsconfig.json | 21 ++ 45 files changed, 1990 insertions(+), 1505 deletions(-) create mode 100644 components.json delete mode 100644 components/TourMap.js create mode 100644 components/TourMap.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/carousel.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/dropdown-menu.tsx create mode 100644 components/ui/footer.tsx create mode 100644 components/ui/navbar.tsx rename lib/{date-utils.js => date-utils.ts} (84%) create mode 100644 lib/providers/themeProvider.tsx create mode 100644 lib/utils.ts create mode 100644 next-env.d.ts delete mode 100644 pages/_app.js create mode 100644 pages/_app.tsx create mode 100644 pages/_document.tsx delete mode 100644 pages/index.js create mode 100644 pages/index.tsx delete mode 100644 pages/tour/[city].js create mode 100644 pages/tour/[city].tsx create mode 100644 postcss.config.js delete mode 100644 public/favicon.ico delete mode 100644 public/pin_gray.svg delete mode 100644 public/pin_green.svg delete mode 100644 public/pin_indigo.svg delete mode 100644 public/pin_orange.svg delete mode 100644 public/pin_red.svg delete mode 100644 public/vercel.svg delete mode 100644 styles/Home.module.css delete mode 100644 styles/Scavenger.module.css delete mode 100644 styles/TourMap.module.css create mode 100644 tailwind.config.js create mode 100644 tsconfig.json diff --git a/.prettierrc b/.prettierrc index 2ec0843..866e69f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,6 @@ "singleQuote": true, "jsxSingleQuote": false, "endOfLine": "lf", - "singleAttributePerLine": true + "singleAttributePerLine": true, + "plugins": ["prettier-plugin-tailwindcss"] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 69bcd71..f0b5460 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,14 @@ "editor.formatOnPaste": true, "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "typescript.preferences.importModuleSpecifier": "non-relative", + "files.associations": { + "*.css": "tailwindcss" + }, + "editor.quickSuggestions": { + "other": "on", + "comments": "off", + "strings": "on" } } diff --git a/bun.lockb b/bun.lockb index dea1ba48a5987f0f3ffe2e81722ce756253692e8..62e45153a4f8980d091ff91d6b23e5b2af80efd7 100755 GIT binary patch delta 90310 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 - ) - }, -} - -const icons = {} -for (const category of Object.keys(ICONS)) { - icons[category] = L.icon({ - iconUrl: ICONS[category], - iconSize: [20, 35], - iconAnchor: [10, 35], - popupAnchor: [0, -35], - }) -} - -function getGoogleMapsLink(lat, lon) { - return `https://www.google.com/maps/search/?api=1&query=${lat},${lon}` -} -function getAppleMapsLink(name, lat, lon) { - return `https://maps.apple.com/?q=${encodeURIComponent(name)}&ll=${lat},${lon}` -} -function getOSMLink(lat, lon) { - return `https://www.openstreetmap.org/index.html?lat=${lat}&lon=${lon}&mlat=${lat}&mlon=${lon}&zoom=19&layers=M` -} - -export default function TourMap({ center, data }) { - const [showModal, setShowModal] = useState(true) - - const markerRefs = useMemo(() => data.map(() => createRef()), [data]) - - const categorizedData = useMemo(() => { - return data - .map((elem) => elem.category) - .filter((v, i, a) => a.indexOf(v) === i) - .map((category) => { - const items = data - .map((elem, idx) => ({ - id: idx, - ...elem, - })) - .filter((elem) => elem.category === category) - .sort((a, b) => a.title.localeCompare(b.title)) - - return { category, items } - }) - }, [data]) - - const openElem = useCallback( - (idx) => { - const marker = markerRefs[idx].current - if (marker) { - marker.openPopup() - } - }, - [markerRefs] - ) - - return ( - <> - setShowModal(false)} - > - - Virtuelle Stadt- und Campusführung - - - -

- Klicke auf eine Markierung, um mehr über diesen Ort zu erfahren. - Viele der Orte haben auch ein kurzes Video. -

-

- Die virtuelle Stadt- und Campusführung ist ein Projekt der{' '} - - Fachschaft Informatik - {' '} - in Kooperation mit{' '} - - Neuland Ingolstadt - - . -

-
- - - - -
- -
- - Studierendenvertretung TH Ingolstadt - - -
- - - -
- - {categorizedData.map(({ category, items }) => ( - - - - {HEADINGS[category]} - - {items - .filter((elem) => !elem.hide) - .map((elem) => ( - openElem(elem.id)} - > - {elem.title} - {elem.video && ( -
- -
- )} -
- ))} -
- ))} -
- - - - - - - {data.map((elem, idx) => ( - - -

{elem.title}

-
- {navigator.language.startsWith('de') ? ( - - {elem.description_de} - - ) : ( - - {elem.description_en} - - )} -
- {elem.video && ( - - )} -

- Öffnen in{' '} - - OpenStreetMap - - {', '} - - Google Maps - - {', '} - - Apple Maps - -

-
-
- ))} -
-
- - ) -} -TourMap.propTypes = { - center: PropTypes.array, - data: PropTypes.array, -} diff --git a/components/TourMap.tsx b/components/TourMap.tsx new file mode 100644 index 0000000..0dd2fa1 --- /dev/null +++ b/components/TourMap.tsx @@ -0,0 +1,336 @@ +import React, { useState, createRef, useMemo } from 'react' +import ListGroup from 'react-bootstrap/ListGroup' +import ReactMarkdown from 'react-markdown' +import PropTypes from 'prop-types' +const styles = {} +import Link from 'next/link' +import Image from 'next/image' + +import Map, { Marker, Popup } from 'react-map-gl/maplibre' +import useMediaQuery from '@restart/hooks/useMediaQuery' +import { ImagePlay, MapPin, X } from 'lucide-react' +import { CityData } from '@/pages/tour/[city]' +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' +import { Button } from '@/components/ui/button' + +const COLORS = { + gastro: { + fill: '#2ECC71', + stroke: '#27AE60', + }, + hochschule: { + fill: '#3498DB', + stroke: '#2980B9', + }, + chill: { + fill: '#F39C12', + stroke: '#D35400', + }, + sehenswuerdig: { + fill: '#E74C3C', + stroke: '#C0392B', + }, + nuetzlich: { + fill: '#BDC3C7', + stroke: '#7F8C8D', + }, +} + +const HEADINGS = { + gastro: 'Bars & Cafés', + hochschule: 'Hochschule', + chill: 'Chillen', + sehenswuerdig: 'Sehenswürdigkeiten', + nuetzlich: 'Nützliches', +} + +// use custom link implementation to open links in new tab +const COMPONENTS = { + a(props) { + return ( + + ) + }, +} + +function getGoogleMapsLink(lat: number, lon: number) { + return `https://www.google.com/maps/search/?api=1&query=${lat},${lon}` +} +function getAppleMapsLink(name: string, lat: number, lon: number) { + return `https://maps.apple.com/?q=${encodeURIComponent( + name + )}&ll=${lat},${lon}` +} +function getOSMLink(lat: number, lon: number) { + return `https://www.openstreetmap.org/index.html?lat=${lat}&lon=${lon}&mlat=${lat}&mlon=${lon}&zoom=19&layers=M` +} + +interface TourMapProps { + center: [number, number] + data: CityData +} + +export default function TourMap({ center, data }: TourMapProps) { + const [dialogOpen, showDialog] = useState(true) + const [popup, setPopup] = useState(null) + + const mapRef = createRef() + + // use less padding on small devices + // because they do not have enough space to fit the popup plus the padding + const PADDING = useMediaQuery('(max-width: 768px)') ? 10 : 50 + + const categorizedData = useMemo(() => { + return data + .map((elem) => elem.category) + .filter((v, i, a) => a.indexOf(v) === i) + .map((category) => { + const items = data + .map((elem, idx) => ({ + id: idx, + ...elem, + })) + .filter((elem) => elem.category === category) + .sort((a, b) => a.title.localeCompare(b.title)) + + return { category, items } + }) + }, [data]) + + return ( + <> + + + + Virtuelle Stadt- und Campusführung + + +

+ Klicke auf eine Markierung, um mehr über diesen Ort zu erfahren. + Viele der Orte haben auch ein kurzes Video. +

+

+ Die virtuelle Stadt- und Campusführung ist ein Projekt der{' '} + + Fachschaft Informatik + {' '} + in Kooperation mit{' '} + + Neuland Ingolstadt + + . +

+ + + +
+
+ +
+
+ + Studierendenvertretung TH Ingolstadt + + +
+ + + +
+ + {categorizedData.map(({ category, items }) => ( + + + + {HEADINGS[category]} + + {items + .filter((elem) => !elem.hide) + .map((elem) => ( + { + mapRef.current.getMap().flyTo({ + center: [elem.lon, elem.lat], + zoom: 16, + padding: PADDING, + }) + setPopup(elem) + }} + className="d-flex align-items-center gap-1" + > + {elem.title} + {elem.video && ( + + )} + + ))} + + ))} +
+ +
+ + {data.map((elem, idx) => ( + { + e.originalEvent.stopPropagation() + mapRef.current.getMap().flyTo({ + center: [elem.lon, elem.lat], + zoom: 16, + padding: PADDING, + }) + setPopup(elem) + }} + > + + + ))} + + {popup && ( + setPopup(null)} + > +

+ {popup.title} + + +

+
+ + {navigator.language.startsWith('de') + ? popup.description_de + : popup.description_en} + +
+ {popup.video && ( + + )} +

+ Öffnen in{' '} + + OpenStreetMap + + {', '} + + Google Maps + + {', '} + + Apple Maps + +

+
+ )} +
+
+
+ + ) +} +TourMap.propTypes = { + center: PropTypes.array, + data: PropTypes.array, +} diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 0000000..36496a2 --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/components/ui/card.tsx b/components/ui/card.tsx new file mode 100644 index 0000000..afa13ec --- /dev/null +++ b/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/components/ui/carousel.tsx b/components/ui/carousel.tsx new file mode 100644 index 0000000..9c2b9bf --- /dev/null +++ b/components/ui/carousel.tsx @@ -0,0 +1,260 @@ +import * as React from "react" +import useEmblaCarousel, { + type UseEmblaCarouselType, +} from "embla-carousel-react" +import { ArrowLeft, ArrowRight } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui/button" + +type CarouselApi = UseEmblaCarouselType[1] +type UseCarouselParameters = Parameters +type CarouselOptions = UseCarouselParameters[0] +type CarouselPlugin = UseCarouselParameters[1] + +type CarouselProps = { + opts?: CarouselOptions + plugins?: CarouselPlugin + orientation?: "horizontal" | "vertical" + setApi?: (api: CarouselApi) => void +} + +type CarouselContextProps = { + carouselRef: ReturnType[0] + api: ReturnType[1] + scrollPrev: () => void + scrollNext: () => void + canScrollPrev: boolean + canScrollNext: boolean +} & CarouselProps + +const CarouselContext = React.createContext(null) + +function useCarousel() { + const context = React.useContext(CarouselContext) + + if (!context) { + throw new Error("useCarousel must be used within a ") + } + + return context +} + +const Carousel = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & CarouselProps +>( + ( + { + orientation = "horizontal", + opts, + setApi, + plugins, + className, + children, + ...props + }, + ref + ) => { + const [carouselRef, api] = useEmblaCarousel( + { + ...opts, + axis: orientation === "horizontal" ? "x" : "y", + }, + plugins + ) + const [canScrollPrev, setCanScrollPrev] = React.useState(false) + const [canScrollNext, setCanScrollNext] = React.useState(false) + + const onSelect = React.useCallback((api: CarouselApi) => { + if (!api) { + return + } + + setCanScrollPrev(api.canScrollPrev()) + setCanScrollNext(api.canScrollNext()) + }, []) + + const scrollPrev = React.useCallback(() => { + api?.scrollPrev() + }, [api]) + + const scrollNext = React.useCallback(() => { + api?.scrollNext() + }, [api]) + + const handleKeyDown = React.useCallback( + (event: React.KeyboardEvent) => { + if (event.key === "ArrowLeft") { + event.preventDefault() + scrollPrev() + } else if (event.key === "ArrowRight") { + event.preventDefault() + scrollNext() + } + }, + [scrollPrev, scrollNext] + ) + + React.useEffect(() => { + if (!api || !setApi) { + return + } + + setApi(api) + }, [api, setApi]) + + React.useEffect(() => { + if (!api) { + return + } + + onSelect(api) + api.on("reInit", onSelect) + api.on("select", onSelect) + + return () => { + api?.off("select", onSelect) + } + }, [api, onSelect]) + + return ( + +
+ {children} +
+
+ ) + } +) +Carousel.displayName = "Carousel" + +const CarouselContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const { carouselRef, orientation } = useCarousel() + + return ( +
+
+
+ ) +}) +CarouselContent.displayName = "CarouselContent" + +const CarouselItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const { orientation } = useCarousel() + + return ( +
+ ) +}) +CarouselItem.displayName = "CarouselItem" + +const CarouselPrevious = React.forwardRef< + HTMLButtonElement, + React.ComponentProps +>(({ className, variant = "outline", size = "icon", ...props }, ref) => { + const { orientation, scrollPrev, canScrollPrev } = useCarousel() + + return ( + + ) +}) +CarouselPrevious.displayName = "CarouselPrevious" + +const CarouselNext = React.forwardRef< + HTMLButtonElement, + React.ComponentProps +>(({ className, variant = "outline", size = "icon", ...props }, ref) => { + const { orientation, scrollNext, canScrollNext } = useCarousel() + + return ( + + ) +}) +CarouselNext.displayName = "CarouselNext" + +export { + type CarouselApi, + Carousel, + CarouselContent, + CarouselItem, + CarouselPrevious, + CarouselNext, +} diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx new file mode 100644 index 0000000..c23630e --- /dev/null +++ b/components/ui/dialog.tsx @@ -0,0 +1,120 @@ +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..9113763 --- /dev/null +++ b/components/ui/dropdown-menu.tsx @@ -0,0 +1,198 @@ +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/components/ui/footer.tsx b/components/ui/footer.tsx new file mode 100644 index 0000000..d4dc59e --- /dev/null +++ b/components/ui/footer.tsx @@ -0,0 +1,52 @@ +import { Button } from '@/components/ui/button' +import Link from 'next/link' + +export default function Footer() { + return ( +
+
+

+ Ein Projekt der{' '} + + Fachschaft Informatik (StudVer) + {' '} + in Kooperation mit{' '} + + Neuland Ingolstadt e.V. + +

+

+ Wir würden uns über euer Feedback freuen – entweder über Discord + oder per E-Mail. +

+
+ +
    + + + + + + +
+
+ ) +} diff --git a/components/ui/navbar.tsx b/components/ui/navbar.tsx new file mode 100644 index 0000000..5317594 --- /dev/null +++ b/components/ui/navbar.tsx @@ -0,0 +1,82 @@ +import { Button } from '@/components/ui/button' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuPortal, + DropdownMenuSeparator, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { Palette, Settings } from 'lucide-react' +import { useTheme } from 'next-themes' +import Image from 'next/image' +import Link from 'next/link' + +export default function NavBar() { + const { setTheme } = useTheme() + + return ( +
+
+ + Neuland e.V. Logo + + + + + + + + + + + + + +

Design

+
+ + + setTheme('light')}> + Hell + + setTheme('dark')}> + Dunkel + + + setTheme('system')}> + System + + + +
+
+
+
+
+
+ ) +} diff --git a/lib/date-utils.js b/lib/date-utils.ts similarity index 84% rename from lib/date-utils.js rename to lib/date-utils.ts index 8f57f4c..b939826 100644 --- a/lib/date-utils.js +++ b/lib/date-utils.ts @@ -8,7 +8,7 @@ export const DATE_LOCALE = 'de-DE' /** * Formats a date like "Mo., 1.10.2020" */ -export function formatFriendlyDate(datetime) { +export function formatFriendlyDate(datetime: Date | string) { if (typeof datetime === 'string') { datetime = new Date(datetime) } @@ -34,7 +34,7 @@ export function formatFriendlyDate(datetime) { /** * Formats a date range like "Mo., 1.10.2021 - Di., 2.10.2021" */ -export function formatFriendlyDateRange(begin, end) { +export function formatFriendlyDateRange(begin: Date, end: Date) { let str = formatFriendlyDate(begin) if (end && begin.toDateString() !== end.toDateString()) { str += ' – ' + formatFriendlyDate(end) @@ -45,7 +45,7 @@ export function formatFriendlyDateRange(begin, end) { /** * Formats a time like "8:15" */ -export function formatFriendlyTime(datetime) { +export function formatFriendlyTime(datetime: Date | string) { if (typeof datetime === 'string') { datetime = new Date(datetime) } @@ -59,7 +59,18 @@ export function formatFriendlyTime(datetime) { /** * Formats a date range like "Mo., 1.10.2021 08:00 – 12:00" or "Mo., 1.10.2021 08:00 – Do., 2.10.2021 08:00" */ -export function formatFriendlyDateTimeRange(begin, end) { +export function formatFriendlyDateTimeRange( + begin: Date | string, + end: Date | string +) { + if (typeof begin === 'string') { + begin = new Date(begin) + } + + if (typeof end === 'string') { + end = new Date(end) + } + let str = formatFriendlyDate(begin) + ', ' + formatFriendlyTime(begin) if (end) { if (begin.toDateString() === end.toDateString()) { @@ -74,7 +85,7 @@ export function formatFriendlyDateTimeRange(begin, end) { /** * Formats a date and time like "Mo., 1.10.2020, 08:15" */ -export function formatFriendlyDateTime(datetime) { +export function formatFriendlyDateTime(datetime: Date | string) { const date = formatFriendlyDate(datetime) const time = formatFriendlyTime(datetime) @@ -84,7 +95,7 @@ export function formatFriendlyDateTime(datetime) { /** * Formats a day like "Morgen" or "Montag, 1.10." */ -export function formatNearDate(datetime) { +export function formatNearDate(datetime: Date | string) { if (typeof datetime === 'string') { datetime = new Date(datetime) } @@ -106,7 +117,7 @@ export function formatNearDate(datetime) { } } -export function formatFriendlyTimeDelta(delta) { +export function formatFriendlyTimeDelta(delta: number) { const rtl = new Intl.RelativeTimeFormat(DATE_LOCALE, { numeric: 'auto', style: 'long', @@ -134,7 +145,7 @@ export function formatFriendlyTimeDelta(delta) { /** * Formats a relative date and time like "in 5 Minuten" or "vor 10 Minuten" */ -export function formatFriendlyRelativeTime(date) { +export function formatFriendlyRelativeTime(date: Date) { const startOfDay = new Date() startOfDay.setHours(0) startOfDay.setMinutes(0) @@ -158,7 +169,7 @@ export function formatFriendlyRelativeTime(date) { /** * Formats a relative date and time like "5 min" */ -export function formatRelativeMinutes(datetime) { +export function formatRelativeMinutes(datetime: Date | string) { if (typeof datetime === 'string') { datetime = new Date(datetime) } @@ -173,7 +184,7 @@ export function formatRelativeMinutes(datetime) { /** * Formats a date like "2020-10-01" */ -export function formatISODate(date) { +export function formatISODate(date: Date) { return ( date.getFullYear().toString().padStart(4, '0') + '-' + @@ -186,7 +197,7 @@ export function formatISODate(date) { /** * Formats a time like "08:15" */ -export function formatISOTime(date) { +export function formatISOTime(date: Date) { return ( date.getHours().toString().padStart(2, '0') + ':' + @@ -198,7 +209,7 @@ export function formatISOTime(date) { * Returns the start of the week * https://stackoverflow.com/a/4156516 */ -export function getMonday(date) { +export function getMonday(date: Date) { date = new Date(date) const day = date.getDay() date.setHours(0, 0, 0, 0) @@ -209,7 +220,7 @@ export function getMonday(date) { /** * Returns the start end the end of the week */ -export function getWeek(date) { +export function getWeek(date: Date) { const start = getMonday(date) const end = getMonday(date) end.setDate(end.getDate() + 7) @@ -219,7 +230,7 @@ export function getWeek(date) { /** * Adds weeks to a date */ -export function addWeek(date, delta) { +export function addWeek(date: Date, delta: number) { date = new Date(date) date.setDate(date.getDate() + delta * 7) return date @@ -228,7 +239,7 @@ export function addWeek(date, delta) { /** * Formats a date like 'Nächste Woche' or '17.5. – 23.5.' */ -export function getFriendlyWeek(date) { +export function getFriendlyWeek(date: Date) { const [currStart, currEnd] = getWeek(new Date()) const [nextStart, nextEnd] = getWeek(addWeek(new Date(), 1)) if (date >= currStart && date < currEnd) { diff --git a/lib/providers/themeProvider.tsx b/lib/providers/themeProvider.tsx new file mode 100644 index 0000000..93c7537 --- /dev/null +++ b/lib/providers/themeProvider.tsx @@ -0,0 +1,9 @@ +'use client' + +import { ThemeProvider as NextThemesProvider } from 'next-themes' +import { type ThemeProviderProps } from 'next-themes/dist/types' +import * as React from 'react' + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children} +} diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..bd0c391 --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..a4a7b3f --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/package.json b/package.json index c5eb50b..2c70e8b 100644 --- a/package.json +++ b/package.json @@ -12,21 +12,34 @@ "@fortawesome/free-brands-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-slot": "^1.1.0", + "@restart/hooks": "^0.4.16", "bootstrap": "^5.1.3", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "embla-carousel-react": "^8.3.0", "graphql-request": "^7.1.0", "hamburger-react": "^2.5.0", "idb": "^7.0.1", "js-levenshtein": "^1.1.6", - "leaflet": "^1.8.0", + "lucide-react": "^0.453.0", + "maplibre-gl": "^4.7.1", "next": "^14.2.15", + "next-themes": "^0.3.0", "react": "^18.1.0", "react-bootstrap": "^2.4.0", "react-dom": "^18.1.0", - "react-leaflet": "^4.0.0", - "react-markdown": "^8.0.3" + "react-icons": "^5.3.0", + "react-map-gl": "^7.1.7", + "react-markdown": "^8.0.3", + "tailwind-merge": "^2.5.4", + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@types/bun": "^1.1.11", + "autoprefixer": "^10.4.20", "eslint": "^8.57.1", "eslint-config-next": "14.2.3", "eslint-config-prettier": "^9.1.0", @@ -36,6 +49,10 @@ "eslint-plugin-promise": "^6.6.0", "eslint-plugin-react": "^7.36.1", "eslint-plugin-react-hooks": "^4.6.2", + "postcss": "^8.4.47", + "prettier-plugin-tailwindcss": "^0.6.8", + "tailwindcss": "^3.4.14", + "typescript": "^5.6.2", "typescript-eslint": "^7.18.0" } } diff --git a/pages/_app.js b/pages/_app.js deleted file mode 100644 index 9bbf091..0000000 --- a/pages/_app.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import 'bootstrap/dist/css/bootstrap.min.css' -import 'leaflet/dist/leaflet.css' -import '@fortawesome/fontawesome-svg-core/styles.css' -import '../styles/globals.css' - -// workaround for this iOS 14.6 bug -// https://bugs.webkit.org/show_bug.cgi?id=226547 -// eslint-disable-next-line no-unused-expressions -typeof window !== 'undefined' && window.indexedDB - -function MyApp({ Component, pageProps }) { - return -} -MyApp.propTypes = { - Component: PropTypes.elementType, - pageProps: PropTypes.any, -} - -export default MyApp diff --git a/pages/_app.tsx b/pages/_app.tsx new file mode 100644 index 0000000..4d44319 --- /dev/null +++ b/pages/_app.tsx @@ -0,0 +1,27 @@ +import React from 'react' +import 'maplibre-gl/dist/maplibre-gl.css' +import '@/styles/globals.css' +import type { AppProps } from 'next/app' + +import { Inter } from 'next/font/google' +import { ThemeProvider } from '@/lib/providers/themeProvider' + +export const inter = Inter({ + subsets: ['latin'], + variable: '--font-inter', + display: 'swap', +}) + +export default function App({ Component, pageProps }: AppProps) { + return ( + +
+ +
+
+ ) +} diff --git a/pages/_document.tsx b/pages/_document.tsx new file mode 100644 index 0000000..d0cbd0a --- /dev/null +++ b/pages/_document.tsx @@ -0,0 +1,23 @@ +import { inter } from '@/pages/_app' +import { Html, Head, Main, NextScript } from 'next/document' + +export default function Document() { + return ( + + + + + + +
+ + + + ) +} diff --git a/pages/guide/campus.js b/pages/guide/campus.js index db7c250..6d11b97 100644 --- a/pages/guide/campus.js +++ b/pages/guide/campus.js @@ -26,14 +26,6 @@ export default function Studies() { <> Studienguide - - Studienguide - - - Studienguide - - - {firstCard} - {secondCard} - {thirdCard} - - ) - carousel.push(carouselItem) - p = p + 3 - } - - return carousel -} - -function getSingleCard(item) { - const date = new Date(item.begin) - const club = clubs.find((it) => it.club === item.organizer) - - if (item.organizer != null && club != null) { - return ( - - - {item.title} - {formatFriendlyDateTime(date)} - - - {item.organizer} - {' '} - - - - - - - ) - } else { - return ( - - - {item.title} - {formatFriendlyDateTime(date)} - - {item.organizer.length > 0 && item.organizer} - - - - ) - } -} - -function getNeulandCard() { - return ( - - - -

Mehr in der Neuland.App

-
- Deine zuverlässige THI-App! - - - JETZT IM BROWSER ÖFFNEN - - -
-
- ) -} - -function Home({ rawData }) { - return ( - - - Ersti-Hilfe-Kit - - - - - - Studierendenvertretung TH Ingolstadt - -
-

Ersti-Hilfe-Kit

- -

Willkommen an der Technischen Hochschule Ingolstadt!

- -

- Um euch die Ankunft in Ingolstadt beziehungsweise Neuburg und den - Studienbeginn etwas angenehmer zu gestalten, haben wir entschlossen, - eine digitale O-Phase zu erproben. Wir hoffen, eure Zeit an unserer - Hochschule damit etwas angenehmer gestalten zu können. -

- -

– Eure Fachschaft Informatik <3

- - {rawData && rawData.length > 0 && ( - <> -
- -

- - <> Veranstaltungen -

- - - {getCards(rawData).map((item) => { - return item - })} - - - )} - -
- -

- - <> Studienguide -

- -

- In den folgenden Themenbereichen versuchen wir das wichtigste Know-How - zu eurem Studierendenleben an der THI zusammenzufassen. -

- -

- - - -

- -

- Bei allen Informationen, die auf euch einprasseln, vergesst eines - nicht: Macht euch nicht verrückt! -

- -
- -

- - <> Virtuelle Stadt- und Campusführung -

- -

- Eine virtuelle Stadt- und Campusführung als interaktive Karte, damit - ihr Ingolstadt und Neuburg selbst erkunden könnt. -

- -

- - - -

- -

- - - -

- -
- -

- - <> App -

- -

- Die neuland.app ist eine alternative App für die THI. Hier habt ihr - euren Stundenplan, die Speisepläne sowie wichtige Termine und - Veranstaltungen auf einen Blick. -

- -

- - Download im App Store - - - Get it on Google Play - - - - - -

- -
- -

- - <> Discord-Server der Fakultäten -

- -

Hier könnt Ihr die Discord-Server der Fakultäten finden:

- -

- - - -

- -

- - - -

- -

- - - -

- -

- - - -

- -
-
- - -
- ) -} - -export async function getServerSideProps() { - const data = await request( - GRAPHQL_ENDPOINT, - gql` - query { - clEvents { - id - organizer - title - location - begin - end - } - } - `.replace(/\s+/g, ' ') - ) - - const events = data.clEvents.map((event) => { - return { - ...event, - begin: new Date(Number(event.begin)).toISOString(), - end: event.end != null ? new Date(Number(event.end)).toISOString() : null, - } - }) - - const rawData = calendar - .concat(events) - .sort((a, b) => a.begin.localeCompare(b.begin)) - .filter((x) => { - if (x.end != null) { - const date = new Date(x.end) - return date > Date.now() - } else { - const date = new Date(x.begin) - return date > Date.now() - } - }) - - const finalRawData = rawData.filter((x) => { - const xDate = new Date(x.begin) - const startDay = new Date(rawData[0].begin) - xDate.setHours(12, 0, 0) - startDay.setHours(12, 0, 0) - - const dateDelta = xDate - startDay - const roundedDateDelta = Math.round(dateDelta / 86400000) - - return roundedDateDelta <= 14 - }) - - return { props: { rawData: finalRawData } } -} - -Home.propTypes = { - rawData: PropTypes.array, -} - -export default Home diff --git a/pages/index.tsx b/pages/index.tsx new file mode 100644 index 0000000..5889b32 --- /dev/null +++ b/pages/index.tsx @@ -0,0 +1,419 @@ +import React, { useMemo } from 'react' +import Head from 'next/head' +import Link from 'next/link' + +import Image from 'next/image' +import request, { gql } from 'graphql-request' +import { Button } from '@/components/ui/button' +import NavBar from '@/components/ui/navbar' +import Footer from '@/components/ui/footer' +import { + BookText, + Calendar, + ExternalLink, + Globe, + Map, + MapPin, + Milestone, + Smartphone, +} from 'lucide-react' +import { SiDiscord, SiInstagram } from 'react-icons/si' +import { + Card, + CardHeader, + CardContent, + CardDescription, + CardTitle, +} from '@/components/ui/card' +import { + Carousel, + CarouselContent, + CarouselItem, + CarouselNext, + CarouselPrevious, +} from '@/components/ui/carousel' +import { + formatFriendlyDateTime, + formatFriendlyDateTimeRange, +} from '@/lib/date-utils' +import clubs from '@/data/clubs.json' + +interface CLEventsResponse { + clEvents: CLEvent[] +} + +export interface CLEvent { + id: string + organizer: string + title: string + begin: Date | null + end: Date | null + location: string | null + description: string | null + link: string | null +} + +interface HomeProps { + events: CLEvent[] +} + +const GRAPHQL_ENDPOINT = + process.env.NEXT_PUBLIC_NEULAND_GRAPHQL_ENDPOINT || + 'https://api.neuland.app/graphql' + +const SERVERS = [ + { + name: 'Fakultät Informatik', + link: 'https://discord.gg/pTvQEZpga7', + }, + { + name: 'Fakultät Elektro- und Informationstechnik', + link: 'https://discord.gg/2gzsCD744V', + }, + { + name: 'Fakultät Maschinenbau', + link: 'https://discord.gg/gP4hQaxmRS', + }, + { + name: 'Fakultät Wirtschaftsingenieurwesen', + link: 'https://discord.gg/geebhm5UKF', + }, +] + +export default function Home({ events }: HomeProps) { + const cards = useMemo(() => { + const data = [ + ...events, + { + title: 'Mehr in der Neuland.App', + organizer: 'Neuland Ingolstadt e.V.', + link: 'https://neuland.app', + } as CLEvent, + ] + .map((event) => { + const club = clubs.find((club) => club.club === event.organizer) + + if (club) { + return { ...event, club } + } + + return event + }) + + .map((event, index) => { + return ( + + +
+ {event.title} + {event.organizer} +
+ + {'club' in event && ( +
+ + + + + + + +
+ )} +
+ + + {event.begin != null && ( + + + + {event.end != null + ? formatFriendlyDateTimeRange(event.begin, event.end) + : formatFriendlyDateTime(event.begin)} + + + )} + + {event.location != null && ( + + + {event.location} + + )} + {event.link != null && ( + + + + )} + +
+ ) + }) + + // combine 3 cards into one carousel item + return data.reduce((acc, _, index) => { + if (index % 2 === 0) { + acc.push(data.slice(index, index + 2)) + } + return acc + }, [] as JSX.Element[][]) + }, [events]) + + return ( +
+ + Ersti-Hilfe-Kit + +
+ + +
+

Ersti-Hilfe-Kit

+ +

Willkommen an der Technischen Hochschule Ingolstadt!

+ +

+ Um euch die Ankunft in Ingolstadt beziehungsweise Neuburg und den + Studienbeginn etwas angenehmer zu gestalten, haben wir entschlossen, + eine digitale O-Phase zu erproben. Wir hoffen, eure Zeit an unserer + Hochschule damit etwas angenehmer gestalten zu können. +

+ +

– Eure Fachschaft Informatik <3

+ + {events.length > 0 && ( + <> +
+ +

+ + Veranstaltungen +

+ +
+ + + {cards.map((cards, idx) => ( + + {cards} + + ))} + + + + +
+ + )} + +
+ +

+ + Studienguide +

+ +

+ In den folgenden Themenbereichen versuchen wir das wichtigste + Know-How zu eurem Studierendenleben an der THI zusammenzufassen. +

+ + + + + +

+ Bei allen Informationen, die auf euch einprasseln, vergesst eines + nicht: Macht euch nicht verrückt! +

+ +
+ +

+ + Virtuelle Stadt- und Campusführung +

+ +

+ Eine virtuelle Stadt- und Campusführung als interaktive Karte, damit + ihr Ingolstadt und Neuburg selbst erkunden könnt. +

+ +
+ + + + + + + +
+ +
+ +

+ + App +

+ +

+ Die neuland.app ist eine alternative App für die THI. Hier habt ihr + euren Stundenplan, die Speisepläne sowie wichtige Termine und + Veranstaltungen auf einen Blick. +

+ +
+ + Download im App Store + + + Get it on Google Play + + + + + +
+ +
+ +

+ + Discord +

+ +

Hier könnt Ihr die Discord-Server der Fakultäten finden:

+ +
+ {SERVERS.map((server) => ( + + + + ))} +
+
+ +
+
+
+ ) +} + +export async function getServerSideProps() { + const data = await request( + GRAPHQL_ENDPOINT, + gql` + query { + clEvents { + id + organizer + title + location + begin + end + } + } + `.replace(/\s+/g, ' ') + ) + + const eventsData = data.clEvents.map((event) => { + return { + ...event, + begin: new Date(Number(event.begin)).toISOString(), + end: event.end != null ? new Date(Number(event.end)).toISOString() : null, + } + }) + + const events = eventsData + .sort((a, b) => a.begin.localeCompare(b.begin)) + .filter((x) => { + if (x.end != null) { + const date = new Date(x.end) + return date > new Date() + } else { + const date = new Date(x.begin) + return date > new Date() + } + }) + .slice(0, 5) + + return { props: { events } } +} diff --git a/pages/scavenger/[id].js b/pages/scavenger/[id].js index a1ac128..35c0c4b 100644 --- a/pages/scavenger/[id].js +++ b/pages/scavenger/[id].js @@ -90,10 +90,6 @@ export default function Scavenger({ id, entry, error }) { name="description" content="Eine digitale Schnitzeljagd für die Erstis an der TH Ingolstadt." /> - - import('../../components/TourMap'), { - ssr: false, -}) - -const data = { - ingolstadt: require('../../data/tour/ingolstadt.json'), - neuburg: require('../../data/tour/neuburg.json'), -} - -const centers = { - ingolstadt: [48.76415, 11.42434], - neuburg: [48.73719, 11.18038], -} - -export default function Map() { - const router = useRouter() - const { city } = router.query - - // the page contents are in a separate component - // because Leaflet can't handle SSR - return ( - <> - - Virtuelle Stadt- und Campusführung - - - - - - - ) -} diff --git a/pages/tour/[city].tsx b/pages/tour/[city].tsx new file mode 100644 index 0000000..0883579 --- /dev/null +++ b/pages/tour/[city].tsx @@ -0,0 +1,68 @@ +import React from 'react' +import Head from 'next/head' +import dynamic from 'next/dynamic' + +import INGOLSTADT from '@/data/tour/ingolstadt.json' +import NEUBURG from '@/data/tour/neuburg.json' +import { GetStaticProps } from 'next' + +const TourMap = dynamic(() => import('../../components/TourMap'), { + ssr: false, +}) + +type Cities = 'ingolstadt' | 'neuburg' +type City = keyof typeof CENTERS +export type CityData = typeof INGOLSTADT | typeof NEUBURG + +const CENTERS: Record = { + ingolstadt: [48.76415, 11.42434], + neuburg: [48.73719, 11.18038], +} + +interface MapProps { + city: City + data: CityData +} + +export default function Map({ city, data }: MapProps) { + return ( + <> + + Virtuelle Stadt- und Campusführung + + + + + + ) +} + +export const getStaticPaths = async () => { + return { + paths: Object.keys(CENTERS).map((city) => ({ + params: { city }, + })), + fallback: false, + } +} + +export const getStaticProps: GetStaticProps = async ({ params }) => { + if (!params || !('city' in params)) { + return { + notFound: true, + } + } + + return { + props: { + city: params.city, + data: params.city === 'ingolstadt' ? INGOLSTADT : NEUBURG, + }, + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 4965832f2c9b0605eaa189b7c7fb11124d24e48a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeHOOH5Q(7(R0cc?bh2AT>N@1PWL!LLfZKyG5c!MTHoP7_p!sBz0k$?pjS;^lmgJ zU6^i~bWuZYHL)9$wuvEKm~qo~(5=Lvx5&Hv;?X#m}i|`yaGY4gX+&b>tew;gcnRQA1kp zBbm04SRuuE{Hn+&1wk%&g;?wja_Is#1gKoFlI7f`Gt}X*-nsMO30b_J@)EFNhzd1QM zdH&qFb9PVqQOx@clvc#KAu}^GrN`q5oP(8>m4UOcp`k&xwzkTio*p?kI4BPtIwX%B zJN69cGsm=x90<;Wmh-bs>43F}ro$}Of@8)4KHndLiR$nW?*{Rl72JPUqRr3ta6e#A z%DTEbi9N}+xPtd1juj8;(CJt3r9NOgb>KTuK|z7!JB_KsFW3(pBN4oh&M&}Nb$Ee2 z$-arA6a)CdsPj`M#1DS>fqj#KF%0q?w50GN4YbmMZIoF{e1yTR=4ablqXHBB2!`wM z1M1ke9+<);|AI;f=2^F1;G6Wfpql?1d5D4rMr?#f(=hkoH)U`6Gb)#xDLjoKjp)1;Js@2Iy5yk zMXUqj+gyk1i0yLjWS|3sM2-1ECc;MAz<4t0P53%7se$$+5Ex`L5TQO_MMXXi04UDIU+3*7Ez&X|mj9cFYBXqM{M;mw_ zpw>azP*qjMyNSD4hh)XZt$gqf8f?eRSFX8VQ4Y+H3jAtvyTrXr`qHAD6`m;aYmH2zOhJC~_*AuT} zvUxC38|JYN94i(05R)dVKgUQF$}#cxV7xZ4FULqFCNX*Forhgp*yr6;DsIk=ub0Hv zpk2L{9Q&|uI^b<6@i(Y+iSxeO_n**4nRLc`P!3ld5jL=nZRw6;DEJ*1z6Pvg+eW|$lnnjO zjd|8>6l{i~UxI244CGn2kK@cJ|#ecwgSyt&HKA2)z zrOO{op^o*- - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/public/pin_green.svg b/public/pin_green.svg deleted file mode 100644 index ef54fe4..0000000 --- a/public/pin_green.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/public/pin_indigo.svg b/public/pin_indigo.svg deleted file mode 100644 index b905681..0000000 --- a/public/pin_indigo.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/public/pin_orange.svg b/public/pin_orange.svg deleted file mode 100644 index 2c3dd74..0000000 --- a/public/pin_orange.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/public/pin_red.svg b/public/pin_red.svg deleted file mode 100644 index 90953d9..0000000 --- a/public/pin_red.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index fbf0e25..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/styles/Home.module.css b/styles/Home.module.css deleted file mode 100644 index 6162e17..0000000 --- a/styles/Home.module.css +++ /dev/null @@ -1,84 +0,0 @@ -.container { - max-width: 1000px; - padding: 20px; -} - -.logo { - max-width: 300px; -} - -.title { - font-size: 18pt; - margin: 20px 0; -} - -.subtitle { - font-size: 14pt; - margin: 20px 0; -} - -.calendarTitle { - font-weight: bold; -} - -.left { - flex: 1; - text-align: left; -} - -.button { - margin: 0.5vh; -} - -.details { - color: gray; -} - -.organizer { - color: gray; -} - -.instagram { - margin-left: 1vh; - color: gray; -} - -.item { - display: flex; - flex: 1; -} - -.navigation { - background: #bbbbbb; -} - -.centered { - display: flex; - align-items: center; - align-content: center; - margin: auto; -} - -@media only screen and (min-width: 800px) { - .card { - margin: 10px auto; - width: 60%; - } - .card:last-child { - margin-bottom: 50px; - } -} - -@media only screen and (max-width: 800px) { - .card { - margin: 10px auto; - width: 75%; - } - .card:last-child { - margin-bottom: 50px; - } -} - -.card span { - color: #aaaaaa; -} diff --git a/styles/Scavenger.module.css b/styles/Scavenger.module.css deleted file mode 100644 index 16f3cdb..0000000 --- a/styles/Scavenger.module.css +++ /dev/null @@ -1,39 +0,0 @@ -.logo { - width: 30px; -} - -.title { - font-size: 18pt; - margin: 10px 0; -} - -.subtitle { - font-size: 14pt; - margin: 5px 0; -} - -.question { - margin-bottom: 10px; -} - -.footer { - margin-top: 10px; -} - -.navbar li { - display: flex; - justify-content: center; - align-items: center; - color: #818078; - list-style-type: none; - margin: 3vh 0; - vertical-align: center; -} - -.navbar li:hover { - color: #005a9b; -} - -.active { - color: #005a9b; -} diff --git a/styles/TourMap.module.css b/styles/TourMap.module.css deleted file mode 100644 index 71f5c18..0000000 --- a/styles/TourMap.module.css +++ /dev/null @@ -1,93 +0,0 @@ -.container { - display: flex; - flex-direction: row; - - padding: 0; - max-width: 100vw; - - /* fill entire viewport height since we don't need scrolling on this page */ - height: 100vh; - /* fix for iOS since Safari would otherwise include the status bar in the viewport height */ - max-height: stretch; -} - -.mapContainer { - flex: 1; -} - -.popup { - min-width: min(400px, 80vw); -} - -.popupHeading { - font-size: 18px; - font-weight: bold; -} - -.popupDescription { - font-size: 10pt; - margin: 0px !important; -} - -.popupVideo { - width: 800px; - height: 450px; - - border-radius: 4px !important; -} - -@media (max-device-width: 768px) { - .popupVideo { - width: 80vmin; - height: 45vmin; - } -} - -.sidebar { - width: 300px; - max-height: 100vh; - overflow-y: scroll; -} - -.sidebarLogo { - margin: 10px 20px; -} - -.sidebarHeading { - font-weight: bold; -} - -.sidebarPin { - height: 20px; - margin: 0 5px; -} - -.sidebarVideoIcon { - float: right; -} - -@media (max-width: 1024px) { - .sidebar { - display: none; - } -} - -/* Firefox */ -.sidebar { - scrollbar-width: thin; -} -/* WebKit */ -.sidebar::-webkit-scrollbar { - width: 8px; -} -.sidebar::-webkit-scrollbar-track { - background: #eeeeee; -} -.sidebar::-webkit-scrollbar-thumb { - background: #cccccc; - border: 1px solid #eeeeee; -} -.sidebar::-webkit-scrollbar-thumb:hover { - background: #bbbbbb; - border: 1px solid #eeeeee; -} diff --git a/styles/globals.css b/styles/globals.css index 5493c67..e72aaf5 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -1,27 +1,83 @@ -a { - text-decoration: none; -} +@tailwind base; +@tailwind components; +@tailwind utilities; -/* leaflet popup styling */ +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --primary: 221.2 83.2% 53.3%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 221.2 83.2% 53.3%; + --radius: 0.5rem; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + } -.leaflet-popup-content-wrapper, -.leaflet-popup-tip { - box-shadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.2); + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 217.2 91.2% 59.8%; + --primary-foreground: 222.2 47.4% 11.2%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 224.3 76.3% 48%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } } -.leaflet-popup-content-wrapper { - border-radius: 4px; -} +@layer components { + h1 { + @apply mb-4 text-3xl font-bold; + } + + h2 { + @apply mb-4 text-2xl font-semibold; + } -.leaflet-container a.leaflet-popup-close-button { - font: - 24px/14px Tahoma, - Verdana, - sans-serif; - margin-top: 4px; - margin-right: 6px; + hr { + @apply my-6 border-t; + } } -.leaflet-popup-content { - margin: 15px; +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } } diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..8e9f52e --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,71 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ['class'], + content: [ + './app/**/*.{js,ts,jsx,tsx,mdx}', + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + fontFamily: { + sans: ['var(--font-inter)'], + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + 1: 'hsl(var(--chart-1))', + 2: 'hsl(var(--chart-2))', + 3: 'hsl(var(--chart-3))', + 4: 'hsl(var(--chart-4))', + 5: 'hsl(var(--chart-5))', + }, + }, + }, + }, + plugins: [require('tailwindcss-animate')], +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0376a11 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"], + "exclude": ["node_modules"] +} From 498431ae21c779d6ba8195f364e90fb33180f75c Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Mon, 21 Oct 2024 18:37:56 +0200 Subject: [PATCH 02/15] =?UTF-8?q?=F0=9F=92=84=20update=20tour=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 281456 -> 283779 bytes components/TourDetails.tsx | 171 ++++++++++++ components/TourMap.tsx | 387 +++++++++++++++------------ components/ui/AttributionControl.tsx | 111 ++++++++ components/ui/MapStyleControl.tsx | 55 ++++ components/ui/collapsible.tsx | 9 + components/ui/drawer.tsx | 116 ++++++++ components/ui/footer.tsx | 6 +- components/ui/scroll-area.tsx | 46 ++++ lib/hooks/tourDetails.tsx | 34 +++ package.json | 5 +- pages/index.tsx | 30 ++- pages/tour/[city].tsx | 22 +- 13 files changed, 794 insertions(+), 198 deletions(-) create mode 100644 components/TourDetails.tsx create mode 100644 components/ui/AttributionControl.tsx create mode 100644 components/ui/MapStyleControl.tsx create mode 100644 components/ui/collapsible.tsx create mode 100644 components/ui/drawer.tsx create mode 100644 components/ui/scroll-area.tsx create mode 100644 lib/hooks/tourDetails.tsx diff --git a/bun.lockb b/bun.lockb index 62e45153a4f8980d091ff91d6b23e5b2af80efd7..f36e4a2b0751502697a09d01d51cd14195c074c0 100755 GIT binary patch delta 60492 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И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 MgItH(V(`fS0dJGEssI20 delta 59224 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 void +} + +const COMPONENTS = { + a(props: Omit, 'ref'>) { + return ( + + + + + ) + }, +} + +export default function TourDetails({ popup, setPopup }: TourDialogProps) { + const open = useMemo(() => !!popup, [popup]) + const isDesktop = useMediaQuery('(min-width: 1024px)') + const onOpenChange = useCallback( + (open: boolean) => { + if (!open) setPopup(undefined) + }, + [setPopup] + ) + + const { osmLink, googleMapsLink, appleMapsLink, description } = + useTourDetails(popup!) + + const body = useMemo(() => { + if (!popup) return null + + return ( +
+ {description && ( +
+ {description} +
+ )} + {popup.video && ( + + )} +
+ ) + }, [description, popup]) + + if (!popup) return null + + if (!isDesktop) { + return ( + + + + {popup.title} + + +
+ + <> + {body} + + + +
+
+
+ ) + } + + return ( + + + {popup.title} + + {body} + + + + + + + + + + + + + + + + + ) +} diff --git a/components/TourMap.tsx b/components/TourMap.tsx index 0dd2fa1..3b51e0f 100644 --- a/components/TourMap.tsx +++ b/components/TourMap.tsx @@ -1,15 +1,17 @@ import React, { useState, createRef, useMemo } from 'react' -import ListGroup from 'react-bootstrap/ListGroup' -import ReactMarkdown from 'react-markdown' -import PropTypes from 'prop-types' -const styles = {} import Link from 'next/link' import Image from 'next/image' -import Map, { Marker, Popup } from 'react-map-gl/maplibre' +import Map, { MapRef, Marker } from 'react-map-gl/maplibre' import useMediaQuery from '@restart/hooks/useMediaQuery' -import { ImagePlay, MapPin, X } from 'lucide-react' -import { CityData } from '@/pages/tour/[city]' +import { + ChevronsLeft, + ImagePlay, + MapPin, + Menu, + Map as MapIcon, +} from 'lucide-react' +import { TourData } from '@/pages/tour/[city]' import { Dialog, DialogContent, @@ -18,31 +20,63 @@ import { DialogTitle, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' +import { ScrollArea } from '@/components/ui/scroll-area' +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from '@/components/ui/collapsible' +import TourDetails from '@/components/TourDetails' +import { cn } from '@/lib/utils' +import { + Drawer, + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, +} from '@/components/ui/drawer' +import { AttributionControl } from '@/components/ui/AttributionControl' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import MapStyleControl from '@/components/ui/MapStyleControl' + +interface CategoryProps { + fill: string + stroke: string +} -const COLORS = { +const COLORS: Record = { gastro: { fill: '#2ECC71', - stroke: '#27AE60', + stroke: '#367a4b', }, hochschule: { fill: '#3498DB', - stroke: '#2980B9', + stroke: '#2c6189', }, chill: { fill: '#F39C12', - stroke: '#D35400', + stroke: '#9f6b26', }, sehenswuerdig: { fill: '#E74C3C', - stroke: '#C0392B', + stroke: '#8f392c', }, nuetzlich: { fill: '#BDC3C7', - stroke: '#7F8C8D', + stroke: '#74787a', }, } -const HEADINGS = { +const HEADINGS: Record = { gastro: 'Bars & Cafés', hochschule: 'Hochschule', chill: 'Chillen', @@ -50,41 +84,21 @@ const HEADINGS = { nuetzlich: 'Nützliches', } -// use custom link implementation to open links in new tab -const COMPONENTS = { - a(props) { - return ( - - ) - }, -} - -function getGoogleMapsLink(lat: number, lon: number) { - return `https://www.google.com/maps/search/?api=1&query=${lat},${lon}` -} -function getAppleMapsLink(name: string, lat: number, lon: number) { - return `https://maps.apple.com/?q=${encodeURIComponent( - name - )}&ll=${lat},${lon}` -} -function getOSMLink(lat: number, lon: number) { - return `https://www.openstreetmap.org/index.html?lat=${lat}&lon=${lon}&mlat=${lat}&mlon=${lon}&zoom=19&layers=M` -} - interface TourMapProps { center: [number, number] - data: CityData + data: TourData[] } +export type MapStyle = 'bright' | 'light' | 'dark' + export default function TourMap({ center, data }: TourMapProps) { + const [mapStyle, setMapStyle] = useState('bright') const [dialogOpen, showDialog] = useState(true) - const [popup, setPopup] = useState(null) + const [drawerOpen, setDrawer] = useState(false) + const [popup, setPopup] = useState(undefined) + const isDesktop = useMediaQuery('(min-width: 1024px)') - const mapRef = createRef() + const mapRef = createRef() // use less padding on small devices // because they do not have enough space to fit the popup plus the padding @@ -107,6 +121,59 @@ export default function TourMap({ center, data }: TourMapProps) { }) }, [data]) + const menuEntries = useMemo(() => { + return ( +
+ {categorizedData.map(({ category, items }) => ( + + + + {HEADINGS[category]} + + + + + {items + .filter((elem) => ('hide' in elem ? !elem.hide : true)) + .map((elem) => ( + + ))} + + + ))} +
+ ) + }, [PADDING, categorizedData, mapRef]) + return ( <> - Virtuelle Stadt- und Campusführung + + Virtuelle Stadt- und Campusführung +

@@ -152,72 +221,69 @@ export default function TourMap({ center, data }: TourMapProps) {

-
-
- - Studierendenvertretung TH Ingolstadt - + + + + Virtuelle Stadt- und Campusführung + + + + {menuEntries} + + + + + + + + + + -
- - +
+
+
+ + Studierendenvertretung TH Ingolstadt -
- {categorizedData.map(({ category, items }) => ( - - - - {HEADINGS[category]} - - {items - .filter((elem) => !elem.hide) - .map((elem) => ( - { - mapRef.current.getMap().flyTo({ - center: [elem.lon, elem.lat], - zoom: 16, - padding: PADDING, - }) - setPopup(elem) - }} - className="d-flex align-items-center gap-1" - > - {elem.title} - {elem.video && ( - - )} - - ))} - - ))} + + +
+ + + {menuEntries} +
-
) } -TourMap.propTypes = { - center: PropTypes.array, - data: PropTypes.array, -} diff --git a/components/ui/AttributionControl.tsx b/components/ui/AttributionControl.tsx new file mode 100644 index 0000000..7ee9dae --- /dev/null +++ b/components/ui/AttributionControl.tsx @@ -0,0 +1,111 @@ +import { useMap } from 'react-map-gl/maplibre' +import 'maplibre-gl/dist/maplibre-gl.css' +import React, { useCallback, useEffect, useRef, useState } from 'react' +import { CircleChevronRight, Info } from 'lucide-react' +import { cn } from '@/lib/utils' + +interface AttributionControlProps { + attribution: string | React.ReactNode +} + +export function AttributionControl({ attribution }: AttributionControlProps) { + const [collapsed, setCollapsed] = useState(false) + const map = useMap().current + + const attributionRef = useRef(null) + const [targetWidth, setTargetWidth] = useState(0) + + useEffect(() => { + function getTargetWidth() { + if (!attributionRef.current) { + return + } + + attributionRef.current.style.width = 'auto' + const width = attributionRef.current.offsetWidth + 6 + attributionRef.current.style.width = width + 'px' + + attributionRef.current.style.transition = + 'width 0.3s ease-in-out, opacity 0.3s ease-in-out' + + setTargetWidth(width) + } + + getTargetWidth() + }, [attributionRef]) + + const toggleCollapsed = useCallback( + (value?: boolean) => { + if (!attributionRef.current) { + return + } + + const collapsedTemp = value ?? !collapsed + + if (value !== undefined) { + setCollapsed(value) + } else { + setCollapsed((prev) => !prev) + } + + if (!collapsedTemp) { + attributionRef.current.style.width = targetWidth + 'px' + attributionRef.current.style.opacity = '1' + } else { + attributionRef.current.style.width = '0px' + attributionRef.current.style.opacity = '0' + } + }, + [collapsed, targetWidth] + ) + + useEffect(() => { + if (!map) { + return + } + + map.on('move', () => { + toggleCollapsed(true) + }) + }, [collapsed, map, toggleCollapsed]) + + useEffect(() => { + // close attribution after 5 seconds + const timeout = setTimeout(() => { + toggleCollapsed(true) + }, 5000) + + return () => clearTimeout(timeout) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + if (!map) { + return null + } + + return ( +
+
+
+
{attribution}
+
+ + { + e.preventDefault() + toggleCollapsed() + }} + className="cursor-pointer text-black dark:text-white" + > +
+ {collapsed ? : } +
+
+
+
+ ) +} diff --git a/components/ui/MapStyleControl.tsx b/components/ui/MapStyleControl.tsx new file mode 100644 index 0000000..a76bb9e --- /dev/null +++ b/components/ui/MapStyleControl.tsx @@ -0,0 +1,55 @@ +import { MapStyle } from '@/components/TourMap' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { cn } from '@/lib/utils' +import { Map } from 'lucide-react' +import { useCallback } from 'react' +import { useMap } from 'react-map-gl/dist/esm/exports-maplibre' + +interface MapStyleControlProps { + className?: string + onStyleChange: (style: MapStyle) => void +} + +export default function MapStyleControl({ + className, + onStyleChange, +}: MapStyleControlProps) { + const map = useMap().current + + return ( +
+
+ + + + + + + + Kartenstil + + onStyleChange('bright')}> + Standard + + onStyleChange('light')}> + Modern Hell + + onStyleChange('dark')}> + Modern Dunkel + + + +
+
+ ) +} diff --git a/components/ui/collapsible.tsx b/components/ui/collapsible.tsx new file mode 100644 index 0000000..a23e7a2 --- /dev/null +++ b/components/ui/collapsible.tsx @@ -0,0 +1,9 @@ +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/components/ui/drawer.tsx b/components/ui/drawer.tsx new file mode 100644 index 0000000..c17b0cc --- /dev/null +++ b/components/ui/drawer.tsx @@ -0,0 +1,116 @@ +import * as React from "react" +import { Drawer as DrawerPrimitive } from "vaul" + +import { cn } from "@/lib/utils" + +const Drawer = ({ + shouldScaleBackground = true, + ...props +}: React.ComponentProps) => ( + +) +Drawer.displayName = "Drawer" + +const DrawerTrigger = DrawerPrimitive.Trigger + +const DrawerPortal = DrawerPrimitive.Portal + +const DrawerClose = DrawerPrimitive.Close + +const DrawerOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName + +const DrawerContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + +
+ {children} + + +)) +DrawerContent.displayName = "DrawerContent" + +const DrawerHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DrawerHeader.displayName = "DrawerHeader" + +const DrawerFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DrawerFooter.displayName = "DrawerFooter" + +const DrawerTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerTitle.displayName = DrawerPrimitive.Title.displayName + +const DrawerDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerDescription.displayName = DrawerPrimitive.Description.displayName + +export { + Drawer, + DrawerPortal, + DrawerOverlay, + DrawerTrigger, + DrawerClose, + DrawerContent, + DrawerHeader, + DrawerFooter, + DrawerTitle, + DrawerDescription, +} diff --git a/components/ui/footer.tsx b/components/ui/footer.tsx index d4dc59e..6870e57 100644 --- a/components/ui/footer.tsx +++ b/components/ui/footer.tsx @@ -3,8 +3,8 @@ import Link from 'next/link' export default function Footer() { return ( -
-
+
+

Ein Projekt der{' '}

-
    +
      , + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/lib/hooks/tourDetails.tsx b/lib/hooks/tourDetails.tsx new file mode 100644 index 0000000..6f98083 --- /dev/null +++ b/lib/hooks/tourDetails.tsx @@ -0,0 +1,34 @@ +import { TourData } from '@/pages/tour/[city]' +import { useMemo } from 'react' + +export function useTourDetails(tour: TourData) { + const osmLink = useMemo(() => { + if (!tour) return '' + + return `https://www.openstreetmap.org/index.html?lat=${tour.lat}&lon=${tour.lon}&mlat=${tour.lat}&mlon=${tour.lon}&zoom=19&layers=M` + }, [tour]) + + const googleMapsLink = useMemo(() => { + if (!tour) return '' + + return `https://www.google.com/maps/search/?api=1&query=${tour.lat},${tour.lon}` + }, [tour]) + + const appleMapsLink = useMemo(() => { + if (!tour) return '' + + return `https://maps.apple.com/?q=${encodeURIComponent(tour.title)}&ll=${tour.lat},${tour.lon}` + }, [tour]) + + const description = useMemo(() => { + if (!tour) return '' + + const isGerman = navigator.language.toLowerCase().startsWith('de') + + const description = isGerman ? tour.description_de : tour.description_en + + return description ?? '' + }, [tour]) + + return { osmLink, googleMapsLink, appleMapsLink, description } +} diff --git a/package.json b/package.json index 2c70e8b..e6ef03d 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ "@fortawesome/free-brands-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", + "@radix-ui/react-collapsible": "^1.1.1", "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-scroll-area": "^1.2.0", "@radix-ui/react-slot": "^1.1.0", "@restart/hooks": "^0.4.16", "bootstrap": "^5.1.3", @@ -35,7 +37,8 @@ "react-map-gl": "^7.1.7", "react-markdown": "^8.0.3", "tailwind-merge": "^2.5.4", - "tailwindcss-animate": "^1.0.7" + "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.0" }, "devDependencies": { "@types/bun": "^1.1.11", diff --git a/pages/index.tsx b/pages/index.tsx index 5889b32..1d13bc6 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -104,13 +104,13 @@ export default function Home({ events }: HomeProps) { return ( -
      - {event.title} +
      + {event.title} {event.organizer}
      {'club' in event && ( -
      +
      - + {event.end != null ? formatFriendlyDateTimeRange(event.begin, event.end) : formatFriendlyDateTime(event.begin)} @@ -175,7 +175,7 @@ export default function Home({ events }: HomeProps) { ) }) - // combine 3 cards into one carousel item + // combine 2 cards into one carousel item return data.reduce((acc, _, index) => { if (index % 2 === 0) { acc.push(data.slice(index, index + 2)) @@ -215,13 +215,13 @@ export default function Home({ events }: HomeProps) { Veranstaltungen

-
+
{cards.map((cards, idx) => ( {cards} @@ -278,7 +278,6 @@ export default function Home({ events }: HomeProps) {
- - )} - - - ))} - - - - ))} - -
- -

Navigation

- -

- - - -

- -

- - - -

- -

- - - -

- -

- - - -

- - - - - - ) -} diff --git a/pages/guide/studies.tsx b/pages/guide/studies.tsx new file mode 100644 index 0000000..fbf0274 --- /dev/null +++ b/pages/guide/studies.tsx @@ -0,0 +1,114 @@ +import React, { useState } from 'react' +import Head from 'next/head' +import { Accordion, Container } from 'react-bootstrap' +const styles = {} +import Link from 'next/link' +import Button from 'react-bootstrap/Button' +import rawData from '../../data/guide/studies.json' +import AccordionItem from 'react-bootstrap/AccordionItem' +import AccordionHeader from 'react-bootstrap/AccordionHeader' +import AccordionBody from 'react-bootstrap/AccordionBody' +import ReactMarkdown from 'react-markdown' +import Hamburger from 'hamburger-react' +import Image from 'next/image' +import NavBar from '@/components/ui/navbar' +import Footer from '@/components/ui/footer' + +export default function Studies() { + const [isOpen, setOpen] = useState(false) + const handleToggle = () => { + if (isOpen) { + setOpen(false) + } else { + setOpen(true) + } + } + + return ( +
+ + Studienguide + + + + +
+

Dein Studium

+ +

+ Der klare Unterschied zwischen Schule und Studium ist, dass man sich + selbst darum kümmern muss, alle wichtigen Informationen zu erhalten. + Dennoch können Fragen aufkommen, dafür findet ihr auf dieser Seite die + meisten Informationen unter anderem wo ihr nachfragen könnt. +

+ +

+ Wichtig: Termine und Noten werden meist nur noch auf + elektronischem Wege bekannt gegeben. +

+ + + {rawData.map((item) => ( + + {item.title} + + + {item.content.map((content) => ( + + {content.title} + + {content.content} + {content.link.length > 0 && ( + + + + )} + + + ))} + + + + ))} + +
+ +

Navigation

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+
+ +
+
+ ) +} From fcf6d88e0b07d4ea5d9678db0458b3a72cf8420f Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Tue, 22 Oct 2024 00:13:59 +0200 Subject: [PATCH 04/15] =?UTF-8?q?=F0=9F=92=84=20update=20guide=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 283779 -> 285302 bytes components/guide/glossaryAccordion.tsx | 42 ++++ components/guide/guideAccordion.tsx | 84 ++++++++ components/guide/guideTabs.tsx | 57 +++++ .../attributionControl.tsx} | 0 .../styleControl.tsx} | 6 +- .../{TourDetails.tsx => tour/tourDetails.tsx} | 18 +- components/{TourMap.tsx => tour/tourMap.tsx} | 22 +- components/ui/accordion.tsx | 56 +++++ components/ui/input.tsx | 37 ++++ components/ui/markdownComponents.tsx | 18 ++ components/ui/tabs.tsx | 53 +++++ lib/utils.ts | 4 +- package.json | 2 + pages/guide/campus.js | 191 ----------------- pages/guide/campus.tsx | 36 ++++ pages/guide/glossary.js | 172 --------------- pages/guide/glossary.tsx | 99 +++++++++ pages/guide/life.js | 196 ------------------ pages/guide/life.tsx | 41 ++++ pages/guide/studies.tsx | 95 +-------- tailwind.config.js | 140 +++++++------ 22 files changed, 625 insertions(+), 744 deletions(-) create mode 100644 components/guide/glossaryAccordion.tsx create mode 100644 components/guide/guideAccordion.tsx create mode 100644 components/guide/guideTabs.tsx rename components/{ui/AttributionControl.tsx => map/attributionControl.tsx} (100%) rename components/{ui/MapStyleControl.tsx => map/styleControl.tsx} (89%) rename components/{TourDetails.tsx => tour/tourDetails.tsx} (90%) rename components/{TourMap.tsx => tour/tourMap.tsx} (95%) create mode 100644 components/ui/accordion.tsx create mode 100644 components/ui/input.tsx create mode 100644 components/ui/markdownComponents.tsx create mode 100644 components/ui/tabs.tsx delete mode 100644 pages/guide/campus.js create mode 100644 pages/guide/campus.tsx delete mode 100644 pages/guide/glossary.js create mode 100644 pages/guide/glossary.tsx delete mode 100644 pages/guide/life.js create mode 100644 pages/guide/life.tsx diff --git a/bun.lockb b/bun.lockb index f36e4a2b0751502697a09d01d51cd14195c074c0..f699eb20041daac24ff7147b7dafd7c3a19b44ab 100755 GIT binary patch delta 52536 zcmeFad7O=9{QrN>8HYK9?8c0JNy%=^jA4c%vK0|pXfPQ2p0UkLvSgobx)fOwSz1UE zQAR0Ji4rA6MWjuoQ0n)5-S>5vN`3o$zn{N;kIrLW^S<7%>wRC#`+8r?eb0TEw7SSo z&lQ)ND@MXq zCNB%PiubFi&zCtmWz;}v2gwMb4^K_$H4=SQgwJ;sdQ+|z{~Wqxj^F1iiL8^?=PQOR zmCxrZfE+nuU|LVEn}A*jJsK;}epeFljalt3OPqZG0#QU&}T^!chG8|U}= zDj*BfpyJ4A_!#5~WEApkWNGA&TvQSH0=gQs5~&W&Kt>~nAaz}Pr0fdNs*Fk`A|cfB zIHVd-jGjq9PV3c>J~UhWyGZq<*N73RBYOFKx1q~!e_^i!=_!L;&)o>mPiCyOA39{j zNUrf6q%{TMzr~(DWe!dmoG~P=x6gNtH5{HgV#vVJslF7tSssHfNEzOYRK@*LMhv-k zu+O&;|EZvh)UN!YX?@aZtM3%LJQQWiD}+=BBCJdsQM2#BAw7MI=#8#BUl{)@Q4as9 zz~i=MtI;(iJ%^|CN*#gw@w4puAk~l;knWIK`>+RgTTcv19o{#!p3fJq_{B1wNBX3U z7&(lF4o@95LTw%&&%nrqO&Ayj*8@n($XshL=+$q?fVAEz!~2X#9i2LOZ zTpLloTLMl}e}|?GPZ>!&2aS~%h=vL_1pB29c3orj0!VeUI@c9Jy3WA<1mS>-GH)gt zP{&wr zAt>C?%l`#kVe<`A`R^jNK+KBsR;Dpl-h)(w7RSrJxi522?@_~5<2Ei(1%Gb&P4Md3 zdMj7bQw>;28X~?}qEjhv!;FHBeLi9;^Gu?*AZlpv;^2K`A^5wH>Q+K) zuQ@SD#X)`~D`Nl5-*5KZ^l}?d7HR7>WEfHn>x5K6tI5}R^+Yd>OdBzzXaCe*BmM3E zm>;%ZioF}(*h@a|9LrZeO901e0bA1K{t{|Zb z!jUkshv$*rNCkQ}`Kq`*x?CD>Wq7E1^z`zp!fW>^YNa1p1pPa%mpqEp5bQ=OaJC|y zUqe+Yt|OtI59m#s`}us~1}%hF#Tibs{N*!R_Vpb1oRw**si|?X4ScC7!+VWlC|1%x zm9hY-flKR6yZAhSt^pitW#8c`L;DRI=qugd9z2k0&i(<|_;KD*J0*D{&w zNyzYVE9W8ApZlHjG_S#6ui8FTqv4Di;(4(EQqAc#aKsoD*PeXELs)NtuIUhtx8AA4 zMx_j7NwVc^8Rjh)*AMqbBYZ4c2Cq2#(eEyo8JW{Yc+EKop@6Q1Pt=fUNDW)UD6is* zR-S}c!wR4)fADDU`aMV%g3K*Q4ckxHl|ZiaD$1ONRK-J(<&XuC6@3xD%nMHFs%tWO zj`#W4QZt()m0ius=f-)_Q2;#}zS~5vUw_`GTV{BJ-aEDDC`Q^hh;HfgJ=d$+!^l#| z*OBVp<4BD{be4Nv(ahm#gNCQ{@%h5XiFceFnzfVc0+{s~m@;xC+t@sN+15#3v-*#y z=^hwUhW8zsGJHhpI(S9XiTgeI0aAlMaWHDkQ{f++ z;@PG28Zw;7aQYUkn6YxI*W{T?V$X!U)eXErJ3Fdto`G3hq6m*T~^%gHuyS zj2f9nr~0G~?p<@#P~Y{ly$UN@Ike`$A-y=`Az7?P`YO)x@>53)8*O!oFyqEYybw8sEC7A(Q7@7^E%y99WRb`B9WvCN z;uX;~wtbLt1I?A&E*jXN+pc~O+3UtH^z1e)^bL*8Fj=;CF39!VPW!&j4mtMruli8&JmDui|=j^dRLG z)t>SZ1<3K?9&IN>lV-J*#x?Y1PC%A{|B!~MA&2moDhR-$mWVH;#L zvOZEhy$(+(LPw+y8lB408@?I58eR?g?P0IH?~wBJXGrmMFvCp@uo-_2!b?L#MQX7( zW|xQJ?_3@BXxMXq_Sj`lv4G}wRc_bFGht7Jd%B&57K5+(qSvDtNHy%N)#q;YJoG(M zE%-LM5e8vrLc&CZH zdpz&|gs!+6nKCq`CpTUnqpQ>5Qo`{RewYxhCA>1G^1Nm+-re|?SB^W)h7P^7-zf2QZpxIOlnOw$<(n{ABt3*%{l1F?~odw&yniT z0i=d|^C2&6Vi>cl?uJw6#gQxvZiU4@ z@+!Iqsq0rDb$yqQHauJ6oBVZNFr$80{_&F0+w=HeJ36Y*p)aOK-{tR7t;FI&1NTj9 z{o;dTJNL<#-J{6Nnvn_JUcABok+ZHsY3FE#TO;Sh^-R2Zf6clZ>Qs!(AE*}LG^&vl z8WiF4C8~C(S&g{RHnjR-&HtTqzD9EB<~%-MBe*QBmsF~#N<0RBd_P^nz*GdlL2{~J8CHa$_ z^R<#g^YCX9CHtMMT5-YsX#I6v@Gkt`-A!#Fb(5QtD{faR@^(_Ua+TS)*I&n}QzO#9 z(%D=mIamTG-6M;@sH>bU*Cz#EhPc7K*pHt(xv9>iZg;lTNer$fb&s2>$?*4dbLWt1 z?p&@=#MjU@F~C)p?zq>*M^#ob&aQgSDCa4V)$kiJ@Mk z+PjX*c`-f`MP7@LY49{!9p~cpiGk>%PNUeQ&|QpnbGM{sv2p&T&gR(U(C2VB!1G;MfRj@vF7&C@@;EuQ;zBi8ZPY39YQ^~nIp-TC`=50Z z5|cw;k)wu1sHD(!tRgBSpL^9vG`T0}YB^}~Wj;3oe{s?qCx_z7cwE4Z+hJCtENa=~ zBs575{SK$-3OfGj@y_NZ$^JRcd4BJ35|Wbr=bZE;Vmrp?Yl;mnr>_f~^Kc)-CBxyc z#JEt|vOZrt8YS0^^Y?N#Cntv%!l`v`-NEnBT07g~6GM&4<+dH}Y;KzD-{+j?cRMGc zS#oG`d7rN#*WsB}vynfJX`5b?vxX{mN^{{k9BJ$eGo_1+IMcxT>6Zw~z z;L|WnC4&4rQq~`-@%}2#*cM3y=;jv5p|w@K97gc^xX@>48nck=#p|njCAv`%$gJvI zsGk&k6|#|Yu@;k}n$xIdQt0k#-ZhbKL{z-S)7()H^+8j7F!hM4C#~ki$4RuN52#8eNgg&+!9*mEVyf$}Oj&e5NoE%yYrzT^L%TA+t0V(a8>%!Gb z>xHHYsh+N`M^iZX6hxu3XsR^iWHpWp)vw`cc{Qg)!_ZWNJBa?Z&iOXUEQJYell^m@ z^tKG)_1>_$i$ zbMRuLIDc;^y?t`%>Dreft45svbLV{fn%iA@mloN_U^+V6Y9$7Lyp+0$S<%(q zMV=*ft8=k_<2-n)p3FiGNU2GlL#Cn0Soz}sjXo=3n+Y^Hw z8N|EXi=QT?j(Y_U-4)75H}1MbuzN>#hv|QrY2%vQewnBd87fEk+yTRK*DNj=!*H_E zZ)u#5M6N3->x8m$UmCoLsc^fR5?mBcMSf38VSTB$p-$|qo~N?9#D%7yF%#7-w)tnB z&E1pzKRV~TCx@yNa|#o0y#z&%PIii^6@p+`U0a=D&^JcFCY66;S_PVtV4G-xOP7H;aE}R$$;tr%V z=h*g=;z9L)iaY27~Vo+o2Z{{Qn z=a5C9E7prE{(~1tHjKh4=ZGC8!2($rM%tZ@X5d8%p2mRqIQrA;|8F4!OK zMrXq8#*rixfnE%Mi>CSH?v#TTS4ovdf$ zBT;HmEbBQfnTn=L*ylUDS@I>D2y^xqvb^JZLLaXyE*~0&W@D>GT;wxoY;x9<-)#)# zfoR}tYnm8}>g&}+BRETTM^pHFXYD;!V|n1rTCty3hh0ZxXS2A-EHvd^4(9bR8Y0@kd^_!I&PonlGwjk{-6$@2C)!Q!jqCfQ+|tE|v{Oc-xG(JT5>ZI9NpAC&h}PmeHddMux{l+F~?z6uU@u7^Q=f z%3pFR^))G`B;{N)+M6NXemT)epPU>z0+-D7^s`A^Am(1@!sMi2w|liR>XK!oI=RK? z+!h~+a;sNYt++soG0v7LNufu__Ymfilj`j5V(lm3Dy;1=qP0gO&|AcXLKD4)_#8hw+$gjT|q*dJWROGK{?uvTpeA{S}yNr)Y3=JivMTW~*P4}W%Z!sn{ z?)Rp?cjiw)vlYqcxM5r2Mea-i}Q zr%`rNp!*bOY<5y;;gs;4@Kf|TGWqCbDYOMrZlb;> z9DLDi%V>4AY2h(e-e|PD-2Sor1oxvcwVEadOFy6#E(~=i)!gj~Q4o0S0cY&Iq|m33 z>RvwgCNFlnH%8vtF$_(CqWjFa&{{M(*V~RxSxfgg6R0}FxiCK|w0K51h_tYLXf=01 z4V9ef4KWwc+MCc68r~h)Y&5OkZqdP4(Rd6oGBHqSmeXh&TkkA6S5Yv56vrm+h&Phb zC0zZy_R}WILd17`Wf1QCKq~^r_of3x7l4kC)`8b&Gbi8p1Y}smZEtx zLTk!VG`W(so^`#-T(3+oDDFbzoIW)%SSDL>tkhys-QCo$q&m5&TOV`>W@=*SAyOIx zj&vM~K6N%PN)FU;oC}MRLOmRBpD&r1Y?p=`%Dgbk#hs0mLX_)eg-Y zHaTM|nug7L#IqC4Yh3hvqQ`B>08&H<4OvgB0k+;9^l>yD9?%|Tdwj^dcVtDG5*NC4 z!KE5`P%#bd4rju=#6Zl$&X%P~k@r2~?X#B-3fy%hEK3fA7CU2?B?WseR*e%@H;yEs z#?kYq>7rVu>Iae>68&X(m# z!E{KLbZ(YjBh}uS(3r(!na-KI5zHjjmZB~-FZ3qN4Q}CCc(Bl8o(J6l3ARGxWO*}N z5-Fa(QbOM4xo`fyYZA%>ffK247pabJs@>ymBRIZK^-^4zLrQ0cOH~K+tx%LuXyBF= z?$h3fAqe*!jq|vPCR|@|C4O=);xH0wxx3zl3|b3UYsTHjM`#*%_f8^M@(FjOY0yA7 zrB!MNskUlbpwKF((VC>l{;U4fn$S9!)?Sg^09-)hHmgozWc+GxhxOY1-Gopc5l)je ziT;z$=C#S8Mr*vHyxKF-xL>(BG4R3~bt)8CduhJ%L@*w$lUGaExX`0$s?)pu`vr}_ zOiB#3dD0scb{ba1Sx-6_o=OVthit4qgbFv2^*6GQ5&7H8xG?xD z8eLnS7}$e=w>lWOmlMSJp~u%y>a40YTd9*>++ zaiKM6c95Ur=zykB)es!opY~tvgYyJ4o%_18K7odp!N=D%gafj2|K)Y5hJXK z@1uFcqN6~}E8g5;Vs?#-9Ec|GT=H+|Ihc4DjuBk@6`GvFX31o)@T#{;dE4mJ{ilIl!RMcgNtMR$7v5OTFX zXzj==q^I$rk#Bg<=-6`E4zJx4j!fJW7_i4_^jcEzImm`ilUj-XFP+V=C5IB;ytHT5 z<~b8uoZIRwo`b#Zq`&^>Ru_BAx$t^Y;Lf+4M!S-NJKxd@(WGhP$hSQwF%(Sp8`0$4 zf=;s?alvtDceo460a>{Ry#jkZhjTB9`;*byWA82m!C7d`Ax=C%Bj(*1*QcmD? zaNj%5g*TEyYalzgE%x`1kF*xvrkJ?TJ<+_L7F*Kf(CV}fw|6V8kt>i%Td(M`(l0s+S^PY@yKBv*Q90+w39lhnF;e+qhtJG$!$y#L$DJ6b=Ltci!(i>3fqyg%5fh$IUg|)uL(6y7!`? zhpom8=J0YJjibW2#9;kH@{P_EBS4#l2pFLJM}R($P`_)i2t^He6qE!TfG%X8azDAHdb-*2 zSCYDpb>FRsmDl}TNvfP3SMf_N+9@+<*6C6qHG@?~+WVy{D#424esW7$v6}e&&XLpQ zGgKwB)%{2+m)Yn_W|=FQU+(8hQa&Z--H)WMKL}Lr2UhT_8pUMAF&3qS?`>d~%LLB9hP z$iE_80cX$a!Xy%(_Wa0lq>rpW!g`_tW+|MU$P&F)XW}(RKvz2`SDHAuPaM$ z3}hgiiTu)q_gQ_CmG>)?kEDiXK2mlM+x$nYT!>UdAGLA`@@n*Fkorifq0b_9{quh6 z*W7v05-(eW9Y}tBujrSRO1^6Kf0C-;b!&Gesaf+D`7(Js!y3MgRK|N&zmin`hvci} zA6xk;QkQ(jFZKMm)lXRYg);eENh&Mjq&4^_se-?>1)jF{l1hGM_1sd_*ZeAs{1qwv zBERJ6fC{q`D#I6H2}$)ZgcMbPUvgz3DSwhGP~Y<`fGlJ4C6$b^vYh25m8`(863AG~ zd(xTxeO_ng_mTgA3ho?9u$SeQYF=Z@=ay<-6U$4MLGOapWbbbIf08OU#o8gA8b5^G zHuSPwZmGI@!%L=GsjqtIb0w*=)2v;8Yj-87@&?#^q&H7<5h_2ofjd@%xj@$p<(CQ= zW(&BIRQ_BCS+M_o3@# zmhlCNLL|;2)v|L|{({s;Qv7d7my)6nQVsJXHUIJ=)u5tCRahR$kFOHHWLH^=mC~zt ze0yJ25^~kG$ZE)2tYL1ciaS_dQprwMmsEkBkpbt?pUS%-)z#+ama^(5E99N_s=JU{ z9eP@ON!j(XdTy!fQZ1ib>L@(e^2mB_0YfYysSAf$T~ZYcx4J8xZ9kXtM>t1*F6B1< zUh?FUan^Rcwf(=5s(YfnUQ%^uSUtCt6DCL4v(pr7AgKbTS^eKgRq%kdm(=w$tS+hi znO4rSa<S2AG-@wXPo8Jhjk0fpJHL>|g9-rY;Lg^d$ zr2<gJbs%P!2yv6djBK46}gKoEc7t2eEzZ6@K9b^R zB2~d`q+FPdidzp?mf#NLdw-gkd=_XBQ*p;Nb&iDc0VTJ7F^KEtF0_% zWl1Zetc*eGBdMO1wYsDlSi#E5R#ro*Vbzhe!FRpoYX|YaGU`HTS4u|m<7>_@ZQN~; z@<11)F1!;d`@50)TuG`y-N~2iVdXvcx}H|=h2+QAuahOxkg8x1QZ5={WxCBDi&R6V zAZ0flsfNt7`LmGvNb*qO*HZ3*e6G#Swz-nUv08ytDXT4?TdLV>;N{1skkX&F@)^rN zi`4bcBh}iiNPQ&5Z`Z);!W;;#pKn@u5Gno;QqBJmsZVYx{v&ub;1g?q)XHN>etakR zRT&vl?SGOgKYv~=f^NdAumFY;PTAkQ4ex3+RZ~jjUrza-HVhy#@b6t*Qc(9%KO*P9<|{8FFky8 zJ=mM_)Sy(LhV%n!_}@Ky%=q7X_~=#iKYaFh`~Tjh)8hUr%hj@6C1Tt0Ou*)pGX31((cz>iC<#e)4#BpncCnTS#+w#quem%YVofFHu6l>FO_^6F9 zSL=Su6W$v+zZL$Cxirjlm_V^zCsNPG3Dh&f_$NX{WM86pjJ4HNfip+p0JriQo42Xp$N5n1>RcAsxYKF~(7&8mv zfQTig;w*^jvmqwWf>>tui8v%8b~eOvlQkP++8l`EB378Xb0Fg9Ld>57@q{@h;-rWc zb0Jon?70vNvLVijSZkVPL$rF(U&yS?_P6#wr5BU&$AegOeh`ai%(4d|Ryh!Sd#jCq zz3JdUbe#vWQN#x0p9c{+A0l-g#747T#0w%y%!k-yQszVSdkA8uh|Q+RLlC76#HfcL zUNku(c8REJAhwxd24c(thyx;CHWe2@RDT#^@&bq)vroh!5wQ^9j8Ar>rxI4fe0X|@QW)uRwA7D2pa&WJcCqVuB= zd(E;(AyzGh2rh=$XF4o~=(+@AqlkBne+fk7Qi#+g5C_b95if`+u@vHUz;-`&WY%}3gTO{Y!$?+)eyne5NAw>)ev3RKx`E8gYmC{h+GSix(4E`Suf%R z5hd0_{A^OzLiBqQVyB4nrpS{JrJsTr^(4eECP&0B5mldpxM+qw1u^Dnhyx;iHx-|T zsQwJZHnVyB2GQ)ClF=@%eIZGwn4 zIU;t6sQLm#Su^Yfh%uWX4u~jkDsG0Tz6E0PW{8SrpNK;uVz)q4Hd$LBro9MpTtrn< z_eF^Ktq}8Hgt*2W6LC^Ri>(mXn(VC*3${U=6;Z=9+Xm65E{1QZM zv+N~^RWCyXUxuh_I=l?gbvwjH5%rCKJ49p-MCx{kShHTl3nEJ7K*X7p9Eg59Aa;sK zFhzDilzs(b)DDP5lOtl6h^ntZG%>?off(~D!~qe>rsAs*)ptTneifpb*(c(Vh}fMF zH=3-S5Yt|RI4+`vsrwp4{Ob_&UxR3Aj)^!aqQ&bFH=FF&Ar|a{I4h!!X|@ZZ)ozFt zyCB+`Ga}B3=)4=^7PD+O#Hu$Sf^R@{Fdg22=(-1Dqlnv#e-A|Dn-HmcAUd1%B3=+t z;!TJyCgn|j^?M6qr-*K*$XgJl--a0V7Q~$Ro{lV+YEafV$5EM10s5uihCid zzXLIOFGPyIHikb$#J&U3%VfO+F>N2jaS^Ge?mme4{Sfo_LG(4pM4S}SVn0Nh$=(mK z;9ZEbA_kad??SYC4`Ri;5QEGa5$8m7eh*@ZS@s^pssj+g0}#VZhXW8@--p;JVubO( z4-t6~BK3WUQC>S<5K-bF#JwivAQt@&LF^QfZi*a&DE$G%s6!CrOpb_MBC37>F~JP` z0AkFC5C=qLn2H}lR6h(c`9p{-vroh!5wV9MCYh|m5Ys+_I4)wcsrwN`{1J%xA3;nt z$3&bI(c%ci119?j#Db3@&We~}ntcq>>Jx|+A4AMCXGEM6(fJdIIcC`>5UY+t1dl>w zn+``Ix*mhrD8e!RV-S&_LZlvpm~YmLctJ#oPa%v+`4pnxXAnC@JZy@522uKRh*6(G zEHpVHc8RF^ImDx8*yj*qjzb&}vBXq74pIFC#N^`;%gjCzheX7lfLLy_PC!ii0^+!c z6{hYN5b-A==6?b4ggFM`U$rUWq(3<#Se5r0@|$Hbf!gND)Ba3 zN=;qfGvc9qfsZ!bQ!Ee@a0}YB>b!qUgn#R%iWmL80{MeI-M4fygFVgc-~BILDslra z0bFG$a*tbLb$?)Ma9tX&b*P%t5iYqd7>M+Lv}t`*prxN$jt0x#Phq;~UDQ16f!iVj z(ZO%0@Ir+yi?dxReN`YPSkB=kQ?~-Ie~|?Pb%IS7&_9_b=24R$_q+8}C>Dq;>Dv4F zPN*Jw+W+Oo^Uw`>Y+?9il3Q`6DOfu2VlZ;I{0ciqY%m|M=@gLK(lv4$emW4S_JLU( z6R1}*{7O~@?<1}i zS-RD>?{xTDnKMfQ#WLDJ>moh0*Gnb(w6mNZ@ar{reQvRrbHlEG72N&YYB?2I&2k+q zrx#MLwOmKb={2+KEq9y8Ww@2TqEh*EvWEIX$ZMACY&pGAw99h0!|~(39Q6>K`qkCi z>Am2Gtz9?E=`F8`mb=4p>ex}e3aZbYmeltxj>{E%?y{WT>3Q5`c=gM2dYNT~<@7SV z8labt)?2QJ<@DZFRa@RYa7yYu{%R!T-ClY%Tclo-zQ!8r&37eBf#Q}6zx7@k?h*3! z(VOq8I0}rkoL+L*C3-if>bgihF=v)X$*&1Qses#S7;3NHoGn^ z2fkH;k1FFw|9_M3tmQ^qy9#jn;)urjUTas8wBDA|C*9grBF&3kp8xf#yvnHzKC|Pb zx8>E7D&TWC#l%EwSCzEh9#c%ngSu7$c-V58mb(USKb$^Uma9&Bq~-1lznZT|9c9T$ z81m!04%}LcqSO%vcbF5th(hIEJ zd}|jA_Xu2u0`DP9HYB|WQk=0D$C3V!v_218JAKDgF4jlEsEQMST&!SRXt_qD`;k^K zF0!1y_jiYF%%l2hhAwUl!f(SZwuVjMMq4i|u^eBm_5BPgf~A&ACVdX*qvcQKH3ioZ zaFvjcS*{uB@^F=r%Pn_<;;(`wAGhR<7*vGQXNBdOldfX9m6mG(*PjL|pq{YYO{9ON zcZ#P~mTO76fbGa?%e8`w5~uNBW67IIm$8OxE!P@OZ`3Myp0r#W(jQn(U&&C9+ky`* z_cWZwza2PixmV!$(U-v8H+5?xcS30P=-+Pg9l%iJ>kumNR-o6!6^y&!WY+;aLGKid zZ&U&c;>_a+=k{gVoAU@FG;!ttZ;+-JB`MggTSi>Tt;!B8dm?6+JO z()U{KUCVWa>tMO}EY}ULwH>Admb*jO(hsvhTp>R;~NUDvfLSKHw;ca?t%Q?a>GfhG4~*Uu-pjCr67N_+(^>x ztf$Yq9R42#d8;LVvWBDKG{$o8&v5+s?ghteW6oQr0LlZP%?yL8fJu#-1_wRU4k zmxfa(FIsLK=|Y_$)yv;3Ii9pCRxf|I1x_HXuS%)`e#VugZz52S)qsHIj%v~1^VKHv z+Umf^`mf>K>8sa$^^R~~&<~`6{$M~}bKTlNt&9d-9}60SI1mpKKqHU{8iOVv2_%E2 zpc%LU+z6V37T_k(60`z0gVvx8Xbakb_CP1SSHVu86CNkJ4Bu`NdQ1I5;DC8xKF~4l z5wH*}21~$Funar~mV*gEN4rdLAD9F_prXUz2>2Kr1)l<)>`sDH;6xxHqc8nIt=LSrL)#3kZx8#8R!+&ndI%D0;mKkgDRjZPuBwF zJJcds8^lq%zQn2%+jrm$_#XTKbYlAn{0z>4^FYUeUC2tHGN=Nof@)?y#b(qdSqJC^ z@zG!~7y^cZF?28;j0ID`RG@EG%>`Y+2rv@pYg*HRzKgb->INe_0eu-I6J!B>5C2#4 zE`r~{c)0%hzRn;L2O$oDuB2}Rdf&b_(0|HW7t{mwK^$lV5`j*g`uf19;4`4FBO#7cc%&C0ZBmTyPfn*XSyBW74RxJMLA!BufW&f8}KbS0zLsp!KdJJ>i6vf?}4|#8{lQI z5o`d@0UZSA0Uh)nMDGpSf_C5*a4XObrepO4prf=l|4eWn&C6d&<$kh zR;V$E0}Vkug$0mBKrxUX_&@`C`3}%`>idJXKriLq2%3Wy;3m)#B!OfQ4-$aBbTAC) z`-uAY7WAz=eU*=|TxR%gC!uxkcZ9y|I20Tv{Q>AkS|>^!Ae#am8qdQ21kQo;K<7D~ z-#%bC^d+|IK^hnU^liCsz_;KG_#XTK&Vlpb7u_UAV3-F4L0%9E@&g_0t^!3taZm!3 z1f@V}phKR{bgjS~D!&1YCp`(2r9olOdh@n8=w?6>h2l|id4uKC$+WJ6rXe7x|;9fIpeV|l^wwv2Q383#s>WiWuQB5m+ zqk~gha4YBxZU;f^@`7Km(bpTF0ULnML`~?zGSD3)1AXsE$CwJ(|A75o@C&Wem-9~n zzWtx!J3?X-xF1Xf)4&5@I+y`wfjJ->q=T_w9GFF=cY(V>cW@6#k))9+pf}K$32y|= zK{pz52hedu$B+D=fd0V*9Va$(p^gE!0PXzm&{A!{+Hmzx1L)r;I104ezXFzmWnejY z96SM50sRvZy(udOSq$jkE%*%Rk%R#Yz*sO2e1zQzt#!Kf*Bx9%pquR1K|@-vd)yDf zVW6*G={9pV&@JO@*c_vg?}Fz+4rROobVs-tECtJezPb7cSOjzz@E8~mvcM#e(T`tu zfIC4WkO<0vqM$e^0QOSZe(*CD=_X1yP3}DsatHiT8l|sl>1$oO|M`{53L)cw8a^F7 zPFlAux=qn-iEcyqf?$Swo1xo^6XRUxewp+ZpdP6=I%-Y@`eH*G@=mypG(xBO z2)F>KjxMNSI=ojUt@D!(<2ronuw5SLi=z+aVf^*A#E-#I@G1Bl90w=CDWF65SKu4) z9rzyn2!00Vz1`~rRjzky1i3Q#3Fl<9aH=G0KZ?WD$kH3;`uJ(~>103EvTr1jxK zLg>$9tMBB73sb@2{IG0`yDI@TKs^svD3A08I-V*|N79}}`K3xrg3_Q6&_yy3dQgzQ z-Waa%Q}V+V={iAWg!4Zqt?Np^!1(a_b)Sx&l`?cMy$I;0Z6I<0=nuMs+dxO~0eM=f z^h`x7S0$uYvC&{S(6XiFYZw>`hJbw7s8c;bang4q?*w;%uAmF(ly9peFo3igf-il8NDmauv7A85GHRFn_2&kZ@tLQ$2g+pV zBq1N`@)5`|-X;Aicm-(emV)(QJIDfyz{B8W@B-Kj9s!Lh$3boa&x46zBX}B&B=0F? zZ)75PQv1Ma2rZ#nN>_lDKx@99ZA?LG&DYGhA4~#TYPA=ngE2t)YM>gW$|iseFof$f zk@tbAU@n*j9st@`W`kMU2Xv7(9Bn)^ZCX-24);_&Q*Y-3^-kA32<8C;9s&!%La+op z3e>R0K%IIVECEIiUgNS0}BJxdvGcR0WD}-4^NgNViEJ+Oqtl50lpBTLFAc`UEIXx*RAAPNAPx zjA~-V0Bw*_;7c+}BTIr$NS_41fRBM1q7781;p6DqP<1-a2d)O+!(9M{Nf!b-Jr@Kz zIY)xLAPDk+-?95mF?x~2ui!lR7JLN4E&iOe8gT@u0Y|}S;8So6h?B0y*dDoedFsR$ z;445cFLB`x$yPR}Gi+wKF!eB8kc__pKY?>Vm3;?(24}&KKs`PKl=nj}scWRGacZ=# z*ARp|B#+8d8LHq)Jq{aO=^}CJl?qT=#7ryfU;mg`kdf(*A<7lt## z1*^5HOk*64l)L3x6`;6K!Qtx^kbjrfY{*@vTaU(H(X8lIrqX{llB-mi;z7OC3{XVN z8|qPg8c+|^wG9amNA7a0yDtsZbzFBX$dJ3_f!ywsUIS?S6ktiD^~^)IO^}+Zx=~fW z&bHyHs#zgVhJ!hQbUcvfbW^Kg){U*otchfrX1M>@mc~u3(JfegP!H4vbwF*PX?Z;| z+=y@#YZz3}m3TE)cFGTTQl0u^+KzuXLp=%yqr9MT*9C&|RG6fCs*`<~kIj|NU4gC- z+pDq4lSeKMjmBSrpcOEd@zXfBA)R~G(|9)pTER57ve9rgBV7PoDhw_hyei`cpcPd? z+8U|gy&1Fu>ZDf53{5dDDmNmv4zxtx1X_URK!t}RU1=4jMkpAyasIjT_T+_UgzPkX z#QoV$0STY+hYXRbOaY=zNjvTv;1N&<@7zKDMABW6iu&7;oxoT)+3UHTcI2?GYsGhg z*CUoY!Cl~PkOn$v{`Vu%7u*6;L0h0_GrfU&qKdRrt77eZy?}PV%0L@Q51>kVBCkQF zAn&p1+`U%Wdhj5rGS#6I8vlRcCbxpz$9h%x0T4F}%mg#QXmALAIC2osDOR?_Nb6WI z1gVbcPb2bT#$bM_cQVvR#&TP6FqFJeU<4Qm!i$WeUp<))_W+m-^u+95|F3ZxZa3K&O*4zOd9;bY;G@ZrPn7}D#(Dxe`*37!V& z*pKA82TAK7JO+Isat&Av9tEm26R4qU-8{yB5{g==!qjS|Y1tnd;OJtY!qwwx_L@ED zYM26R3YZFZTN_mtwoSq2A#|Ox6le3nJmAO`4}vTVl939yY~&oE3Kej9!EB(R$sJI0 z;Z&f4_gbK!G@v4o-6O~^kq;xauW0_~1KMjsU;#+c(pwN{Ln#4ruLa@CBsK3PRp7@! zg|-AY0ZmsGxDaTuS^|o|Ek-_SI_wP;Yq*@`V_+#*25QnznXLe;z)J9hm38)$;4^lt zd1NpD=P=1lFYgT$47A}cE;IZ;5(oU<>(;7Qi%oAORdKJEnfHT_7tQEhVzir6S2;Q4 za8H?e_4#MU7d&xuWt&4BA2b*D1)^@z5lWYa|KDR7K<>Q-V0otU+%A~l5@<| z_X0JV=;1MU*qH|@T3sJkI`Kl<)J}b__J?y;VWCb04i3vS&FZNWwutA%d$M^Y_<82F<#n5v6(a%nU9OQJS}8kCl!n5!5NEy?OZn zUKqkNm>9}qSuM~QFb-=Io$Y6%~wnRjff2Bz-i+I5_DT#R7G49A>?EdP}aL!>YL83MXSnTtG_M@;UWLSxK#<;|NXdy>-*8N2lKy3q_e#>#aY23kUHIseMWt$BJrf&r_%4EmU5 z$Jh_vH3ua2o6x6$c7B&EZU%fBNZ@T;T3bA?+q;A2!l7tB*! z%Ga>k)T9+Jnqz2kaAwVjdVF7p0jTdEZ+ac4!E4R>%Moe0$9>q2``8?G+x#X;wLzWV*b+?1c(&bVicE9S5T zUmDGr$nxG=ys*TkFUw5cI)H2Iu%lB~`SPaY7lC?#>gCOpF9L0260p?P@nwfz<8GZ% zeWGhww^jlhKn3&77sO713hv8~nH?W^|LJmFTj$5Z4sYoSrqap4b@@}U(6Vi>FoRD9 ziZ*$sqWi!*b2n1qyuD1-yf5~+=cwC_`n3qv{Whn3;M49MzWIiIw0nZ*>ceK+NdoHx z1~@GY53-rZi=vAFQkV8H(# z41Yh!{MoFf*68Bbc;2m>|IF#@ZYrK9;P=63MD8@7U=VwS${To2c!QD@#APcTtGqo_ zX*12z#H2@$nVP4$^luE94%MrBvG`T*J31d}yuCS>#(S66H{-Z8I_6rhSv`kUY0|Vn z;dl({d1EucJfpJjq?L;1_O*9B7WKv}#ofx?d3=Qi+Zkki@)(z@-FNsG9lq)3B^r0T zpm+v>>eWr#uNboB*LlwC_FBV^U$#E~6^3;z`BHlK) zpf&uwmNz!bCVo_@<-|N!Q>@%Vi_VdwPSt$+zJe7Kca&F!>UJF;-=J9hb)a5M$=Y5N zefNEr+ZQ~ReOwmgV^OKL`RZ%>TN?}AA>7^RM8n5l-*fVE=`Bq8ZwT~G<~E5N%~Xl? z=EZMl+G2A+nr-MJGv_FFScYYv+xHl zPGq@Y4a(e5tyGDb3wu4u#a@qmf3V}?X5TUWyqW`5>YFv+1=>cpXF1ZY5X?7h?u$*< zq;N|1mg2C3Z!$H`(9({k#TlA!y>7|%<|*ZEGp{S}T~qTM?fHf^L!H@hi z%qKr1W|^FyE{nyc?s+uZLhpj;D-`@k2mie~} z4^_ub;=u$9Z{`!j9-3QofBa1PWEZsMq6-Ir_E`hzoKKEaONGIP(8 z;0rwp&3^TAd7RP~UkH@`7oPchm)N@g;1YJ-+=KG3^E_8xslA^6iYOf&)7rZkz3@~1 z;0wO&J=AFDe1iFf0{u%(?cZtWYIF1NXwRDoXt6K1@ixqk(ML8kE5G6?J3>TvWLvL+ zulHQCePxLbZQb(R>FO3#vOLS$YOdDWceq)Jrt8M8o{NoLPK&gi7g0L46J_X}(d(`9 z(`R(fOd#Lx*MEOy&-r_KKvbXSv0Qu=7yF)WJ^b+XtG;p@;2z*R&CkNs{&w>h(eEpi zqy>i_sHFN=%2yj%<2ISH{)qbiUrh%;M`u@*Fq!^{a(q2>i75N9ijGd|;JIl^=yZqZ zl5>8fEqby>A+ycbm`1O~KpX9XTh`^jZ{Eg+ZcjND^7etL$j!XHr;on!h8&OKb~6OK z=yxbcyY2l;?|HvTrF=R(G~kH9rgy^Z4o1{Z`}6Jm)&3v3M4>c1HKo@`AFmpGap>cy zxv$Q<+JDjJ{56)sIe-5MVU$UZpgn)CF5u7X=vC)ErQkkdRs>#bU~(|WbB86|PV06F z2Y55Xf6iQ+2fKsjZsrMg_vVSnx|LV-u zyW`69Tx?c&8ueCs#9skgAq7yEW>SAuiBDNkD zitzdm_8Ob>=+X%Re^nSws3fHJ%B;EvMi#H(bj{V!Ldj>n5MW4yYI9W9G?Sjj8yG;2=431&I8$g+@rubT4|3p{k zvcWIrw#bP3F(tZshm@CAY}ncAspnc1SLip;9b(n4=CMfbG7p*q7)GzX)9cMmYkprH zv;Ky{^j8y&nLNl;4n@@9{BlbuqM~x z(>IN>53hfs+Gab{oU|62IoQRnz(D8xo?Y`l5!39EkE{V>zK$IEwBW&l1LNK}(uo}1 zLlB2s%@JL?8w0uckw;%#GqcEnsu*a!;L`V5lC@gh{B30CN4_evKHz`fw&SR&Q6M5J z<~!6P7*txl?xw?Yo~!HD>MkWbGr6Y#4^r)798xJtVMT@*Vz3hugZX;dKJ!ify6j3Akt$yzNcUM@$R-5{TBPzxe=-Ng!cK+OD0Fu zZgco*+_T>lE`nys+;$Dj-9<2X$z&s93JkHK_WDcBpL*{l{9*sJ;foq#juwfyE`LKT zH0}k4nBqklwZ^7p(TH{d`+zX_llo<5S*{21xu3vC1-1+`GfVPd-+SQhJ>vZzJe~9& z?*FmUD4uAz6?)GmW3C_WEg)Y^kG{*_qgsi}4<*BoaP7m!E4ATYJi!0^N6PMBEA+>P z+|ObE@SOQyJPG~NgJMs;^n7~S2ro#YufFZv{m(9+cDZwZeo~w3Pbbzte;5hI&wa?A z`%!XuATHJR*PSK&octeZ^TsH;7CXOojIA|)Xx8x2S7@o8F|rD<3-ZU9s4IrRzpwdU z4D(+-@IU(-QuH*spe6Cimd`amc};;`a<+TM@?GJtOP69h`tJk8^ZEb#pPBwe7@ahG zqSzsRq6>PAc2)k=q?mr?f4&?q1x7toCj1w+sF;eQyoVTDe_nAu{ljh?yTgAcNf>3? z%kYm;{SVReFB+FS=q^9)_nK_~>~rZa5Q9gX_o7)%{~C+#?FW157E>{Xc-mtUa|s({ zf0%v$KDw^-2T1#e#Xrs>yN2ZM(EofEHT>&e!{vQee&7FjG5c$j+lKzbH2W7r#Ob(P zL_7ZllU)wq{y_w0j5STK<8ZNjtT|c^xpnNO3*{p2_Xo<2Gno~LmHp;OU4rkLao(w^ zWUyP=_GKsS)}|86->i92Y@B%;!+&`6nrN@>{K2srMa#Dt>u#^^)$cj-CG+fr{6fUm}>*0 z$C)?#a!8(xWns!FarOEa$IcnN!0xqd+VjSludwv~q){>$&%Qj)RH#HRp5q!F#J_kt zJ-f@N!IV7&Kewn_V;>18MHXiN?#8XX_1jW=7VHl{fi<+!#{-8P-dWPS1^7CJa`ZO`%M zJ1hdvjWhWxM_d=Vbb?ownOh^GR00N9_?v?6%{k9@o9I1BNt)K-vGY9!j;B!FA=4NB zLNK#3)&Bio2wG;C?Uf_y1){UekCh|(@UPX~S%nzdZwd_1pPs7l$H{lhktz|V0_!H3 zT~#?mc!3hwI>{_eizs1gREsFv@Pqrk)6Uw8T_3wJ`S)DUq)w2d@%`#t&m%pGMK*Aq z<$81EWHYfEW3$_QokmsbszsCuJUGR?2`49vwjww0&pnS57tUuZd_Is5IRyx`r}qOgHc3mMJsLm)Fqqu`^7$ z>d5Ic%+l)E&6{BcN{02Ygx?~&inGl(%D;ZLiM%$VZA`^E-fcwfCz7_GnB0>aFb%qn zjMO;vT8`;g_=AG|JI8*r{8|oVb`A!foolXQlKw+L+i4to#Te8xci&5My)$3-|5w_T z$5mD3ao)RNE-A>qTt{hPN(AAtxL}C5kcxmCU@EeSU?^xPvLu*RHfezwKY<6X`9b}} zP)<^#sbuCTE+{xED!F~81WHpI{mhuo_uO;tdp_XRG}Aw?d(ZE8&hPy8^ZT8PwTBL+ zJ>!cQ4(o--#T7x)cq@M4G=AvdK=2#h;L^3X z?#~JCfG?XjF0l};AB5G{e?T>ZpixKZ`XFiEueBdtv}4xONiT5Sgi=41V+QxeNj7Xq z3%g67g^m4-*rvsfblQRv8Za1MU`q+N^@ony=~aneFSOUF2bVn<=?}gAa`RWZ9n*H+ zGmf041%u%Q{sn+%0dVY@g50}a*(;3z{fNi!%HruCCoQ-TYaG!L?ZdM2L_oL!*RnZ% z**7;frW+wrh;9QSFi*_Un7wgg^jBGTjSxi`835dq7bj#_xSTj<9H}7+_JO)J3W!^g zF{x22Z{doex~aRg$Ol}o-au;rs2#Y0w);q9p1ZaIw`?)xtEK!v;ow{`$WeQO9k7^{ z!E5G}QXgMn6qi!X0{m8$Qm8NV=3ps>FT^u6y$H{4*D(V-^-Q~%`+}!DG)1dv#2XvD z;aN?fp~Jk zWLxU4<#;r{$2$2+zt-1cbQx9aq=7wN0mKV{I8RqG8#?ZqmnD0$_LHo%e&sYElV41l zSWZ5EAUma;iYDUK5PXtTPK610^=3IO$57yhK{q9o~AL!dhEaUYnznIgijC#6@8}EsU0&DJ~q=6QQRDpvfr!XO+8t@-GF& zJHJE3R_KBE&(PDs2>_P^0G_L-N;do30B6B+LD@d{;)MNb-weiFqNnr#(6L!hHRJI6 zv7R;sK*(R}sW41(u*8gw^g{r4c8T0aJ7n8zxt0ZG zCNDso6S!8kS)XqzAIENYu#rG~8bWJ_U}q2LKn!-)SxxA@V98%Qt&(b{LVYk5SY5Oj z7Ii77YdCQ}k3Fj@=4rh%vbYa$wb`UKj3t7`vy}B4u%<($ztY_$?4s zJG8quQT{MYXTO>L5NcF56DXak99l7#imj@qfbKvV9Ul&QO_ukQ+qdulyLVaZXA8Zg4ZU_~5UGAhqa zUJ0s&@KjMT2HnOa<~9Qog@;f??`GcUxNW$ZXB(92CG$%4n=@;F7ac0JDtJzv;q7@! zh=t>_KjC0P#^6^qY_RAddoKvkm>_q2t9V`~$;X1v&4#axHK;2+3W28K z9aA7x6zUYJvZ@wCWurJSbI|Il+{emmc5%I_>D9bo*_(TwC|q{1kMC%5D7Y@1rdZm6 zT`S|;P!}`oRwYi|t&wvI&0q$cwSy%TgOft5M}x}6)wG5=K^2RSsXG#`5_@3LsS|_w zk_u6#cq*rW=$im};Ud`#{O~=Q^Ca--{xx(vnuk1YBqo-?x1h4$f$GLe{n$!R$jJ~3 zI_zh&2oYwWp9r;2>`Ca0LcEjY2fq1+feV6@{SjWw$0im>U;y zW$MkzFN_lI98$vyHdA0A-g+9uqT&-NjlaPlI>aS87t^t{(sRle8>2jO#~XeB+we(j z8Z~!8&f+u4kh3`BevL6Zv^GT~QLj!V~fVM=WEKu_!fxQ5a!KQ{L9d z2?^E5Qw0GCPf-;V0o(vHnF?}=*MaK_TxXB(+*^vu_{R}SmT`{CBNS^E$;K%>iDX0J z^`=N1UqvY6IhPYUk~|yf1i-Wg2s#evXoc+QS4I7Q4>H4L%0i1L8-2NOZE#I>ld&1G zh~ZaA-?$m^f@V!Ib)L+~t-xN4D`EK_G=R0$#^!{U?X4Tj^8=-Gqb>nRH99c|trEgd z0NrqJ!pA}o1xSVN^;5B?nkk5B%%#W1_>YN|n0b?Yry0D8Ig5Z#GfB))0K!IkVk5f8 zd-_FK{fYO5l(Y1IozELmd9S@Z_Z{V}O--M7Ulvw|MMZ`!XjNS-`zAxUgTQxz%XHnM zA?oX2!meKz8Vz?~#?N)d0r*uX$yWqGHOQ$ZE&nXY``efUr)u91jxds^o_It8-5&|` z)O|dV=iR^KRX1llPL9eci6wwa5ObE30l|EV_XhVDTSqFdY-bquKArw4E7uPAmxKK^2svAoPTt$2zKr z`Yf1Bmtt`g5I9{bhqn9x<<5Xp5;_K;C!#nTeK-Tlbef`b)RM~&@Tz6ZOpUy^rFNx} z2VG;E1UuCmQus{CRvS`B@iV2>qMYZpxsKQA9QurZB`NjXaLnxQjf>;>l$BjkcNmUN zkj2LU>IaMA$|@F|_W7>FGGI zQSn29H#f;u*!ImDNTydUv^NPt_$S>0zS|Hm%MNdQ{Ux%WTWR_d z(4_Nbx12x|J||Jy37hLEI2qFJR!_0Xh?aKsw4MF-iJ^PR&?QBA?I~lfWM%S^1?!Sr zo(pwh^~7{cfWo0|iZrIDT5(>VNAW3m-z%STQ>1VW?_kj76lsWTzC#d|M?S10QFMY^ z)3>E}blVHIhZyCI$~MaTuC#m}s1ywht!PSU^(RVFu_k&XuBoUj*R15TwCvesoiyd6 zO~zS7_k_w);d{_IXh=oz&3wZ|^mfemNzmJwk|yb7^VjNmx!*a!e2?cd?AZq5dZTvR z{mF|)oL9u97z?lPvmzlYhtq)h&|p#N@48g1T(|(IGUvlCoY2k! zm}SjvK+4ksH;_lsN%c9-Zln=j@Pf8JWZA!pxOL_E$Xkm9-w9y@Y$d z1C>jh_!~>?ud(94)%g^?L<&Vr$Vx~{&rVyI95(Ze$B&+${IQUBERp(a3h5|*3U;Ey z%4WJaJ#Smgt^qEe;hC+u!fAS+$M*g$b$Di;>hQ2RQ%5cxe(w44Tu=AZRDa;{)KmNY z@yueK`>R{+CdIYi563fucdgM>^tib%c@~~s@O&ic=ctw+{Z=i(b6-3M%k__^+_6ji z@GZPxN505%>vw+oM^57JoS+kaCj#l{QfVaa(e=odM!Noe9pB!np#jG=%lbU}JfE|x zWkzjcwsc6-BOxg%V{vj?#zH#%qvS?DIa0E1LUP(NuO(@Nl`E=VSqX`+)vn8tA~X83 z{~hf0#Cw|cCgN4xO{oVpx8m!>1Fcdt(Fz2qkT$6&&Goaylxi5zx zvTX!#Lp#u_Zb}!ar40k>JL_6JzAUj}Yc~UVhGh+J=(N`Id3tP?n8Qs3Iqx1^A{ F{{iVf13>@) delta 51823 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 diff --git a/components/guide/glossaryAccordion.tsx b/components/guide/glossaryAccordion.tsx new file mode 100644 index 0000000..09e261e --- /dev/null +++ b/components/guide/glossaryAccordion.tsx @@ -0,0 +1,42 @@ +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from '@/components/ui/accordion' +import { COMPONENTS } from '@/components/ui/markdownComponents' +import ReactMarkdown from 'react-markdown' + +export interface GlossaryItem { + title: string + content: string +} + +interface GlossaryAccordionProps { + glossary: GlossaryItem[] +} + +export default function GlossaryAccordion({ + glossary, +}: GlossaryAccordionProps) { + return ( + + {glossary.map((item) => ( + + {item.title} + + + {item.content} + + + + ))} + + ) +} diff --git a/components/guide/guideAccordion.tsx b/components/guide/guideAccordion.tsx new file mode 100644 index 0000000..5cc5d15 --- /dev/null +++ b/components/guide/guideAccordion.tsx @@ -0,0 +1,84 @@ +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from '@/components/ui/accordion' +import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' +import { COMPONENTS } from '@/components/ui/markdownComponents' +import { ExternalLink } from 'lucide-react' +import Link from 'next/link' +import ReactMarkdown from 'react-markdown' + +export interface GuideSection { + category: string + title: string + content: GuideItem[] +} + +export interface GuideItem { + title: string + content: string + link: string + linktitle?: string +} + +interface GuideAccordionProps { + guide: GuideSection[] +} + +export default function GuideAccordion({ guide }: GuideAccordionProps) { + return ( + + {guide.map((item) => ( + + {item.title} + + + + + {item.content.map((content) => ( + + {content.title} + + + {content.content} + + {content.link.length > 0 && ( + + + + )} + + + ))} + + + + + + ))} + + ) +} diff --git a/components/guide/guideTabs.tsx b/components/guide/guideTabs.tsx new file mode 100644 index 0000000..b7bb175 --- /dev/null +++ b/components/guide/guideTabs.tsx @@ -0,0 +1,57 @@ +import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { useRouter } from 'next/router' +import { useEffect } from 'react' + +export const TABS = [ + { + title: 'Studium', + link: '/guide/studies', + }, + { + title: 'Studierendenleben', + link: '/guide/life', + }, + { + title: 'Campus', + link: '/guide/campus', + }, + { + title: 'Glossar', + link: '/guide/glossary', + }, +] + +export default function GuideTabs() { + const router = useRouter() + + const { pathname } = router + + // prefetch all tabs + useEffect(() => { + TABS.forEach((tab) => { + router.prefetch(tab.link) + }) + }, [router]) + + return ( + + + {TABS.map((link) => ( + { + e.preventDefault() + router.push(link.link) + }} + > + {link.title} + + ))} + + + ) +} diff --git a/components/ui/AttributionControl.tsx b/components/map/attributionControl.tsx similarity index 100% rename from components/ui/AttributionControl.tsx rename to components/map/attributionControl.tsx diff --git a/components/ui/MapStyleControl.tsx b/components/map/styleControl.tsx similarity index 89% rename from components/ui/MapStyleControl.tsx rename to components/map/styleControl.tsx index a76bb9e..c5443cc 100644 --- a/components/ui/MapStyleControl.tsx +++ b/components/map/styleControl.tsx @@ -1,4 +1,4 @@ -import { MapStyle } from '@/components/TourMap' +import { MapStyle } from '@/components/tour/tourMap' import { DropdownMenu, DropdownMenuContent, @@ -9,8 +9,6 @@ import { } from '@/components/ui/dropdown-menu' import { cn } from '@/lib/utils' import { Map } from 'lucide-react' -import { useCallback } from 'react' -import { useMap } from 'react-map-gl/dist/esm/exports-maplibre' interface MapStyleControlProps { className?: string @@ -21,8 +19,6 @@ export default function MapStyleControl({ className, onStyleChange, }: MapStyleControlProps) { - const map = useMap().current - return (
diff --git a/components/TourDetails.tsx b/components/tour/tourDetails.tsx similarity index 90% rename from components/TourDetails.tsx rename to components/tour/tourDetails.tsx index 7ffdffc..6e37c5d 100644 --- a/components/TourDetails.tsx +++ b/components/tour/tourDetails.tsx @@ -11,12 +11,12 @@ import { DrawerHeader, DrawerTitle, } from '@/components/ui/drawer' +import { COMPONENTS } from '@/components/ui/markdownComponents' import { ScrollArea } from '@/components/ui/scroll-area' import { useTourDetails } from '@/lib/hooks/tourDetails' import { cn } from '@/lib/utils' import { TourData } from '@/pages/tour/[city]' import useMediaQuery from '@restart/hooks/useMediaQuery' -import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { useCallback, useMemo } from 'react' import { SiApple, SiGooglemaps, SiOpenstreetmap } from 'react-icons/si' @@ -27,22 +27,6 @@ interface TourDialogProps { setPopup: (popup: TourData | undefined) => void } -const COMPONENTS = { - a(props: Omit, 'ref'>) { - return ( - - - - - ) - }, -} - export default function TourDetails({ popup, setPopup }: TourDialogProps) { const open = useMemo(() => !!popup, [popup]) const isDesktop = useMediaQuery('(min-width: 1024px)') diff --git a/components/TourMap.tsx b/components/tour/tourMap.tsx similarity index 95% rename from components/TourMap.tsx rename to components/tour/tourMap.tsx index 3b51e0f..c978c61 100644 --- a/components/TourMap.tsx +++ b/components/tour/tourMap.tsx @@ -4,13 +4,7 @@ import Image from 'next/image' import Map, { MapRef, Marker } from 'react-map-gl/maplibre' import useMediaQuery from '@restart/hooks/useMediaQuery' -import { - ChevronsLeft, - ImagePlay, - MapPin, - Menu, - Map as MapIcon, -} from 'lucide-react' +import { ChevronsLeft, ImagePlay, MapPin, Menu } from 'lucide-react' import { TourData } from '@/pages/tour/[city]' import { Dialog, @@ -26,7 +20,7 @@ import { CollapsibleContent, CollapsibleTrigger, } from '@/components/ui/collapsible' -import TourDetails from '@/components/TourDetails' +import TourDetails from '@/components/tour/tourDetails' import { cn } from '@/lib/utils' import { Drawer, @@ -37,16 +31,8 @@ import { DrawerHeader, DrawerTitle, } from '@/components/ui/drawer' -import { AttributionControl } from '@/components/ui/AttributionControl' -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu' -import MapStyleControl from '@/components/ui/MapStyleControl' +import { AttributionControl } from '@/components/map/attributionControl' +import MapStyleControl from '@/components/map/styleControl' interface CategoryProps { fill: string diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx new file mode 100644 index 0000000..e6a723d --- /dev/null +++ b/components/ui/accordion.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/components/ui/input.tsx b/components/ui/input.tsx new file mode 100644 index 0000000..dad6f59 --- /dev/null +++ b/components/ui/input.tsx @@ -0,0 +1,37 @@ +import * as React from 'react' + +import { cn } from '@/lib/utils' + +export interface InputProps + extends React.InputHTMLAttributes { + icon?: React.ReactNode +} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( +
+ {props.icon && ( +
{props.icon}
+ )} + +
+ ) + } +) +Input.displayName = 'Input' + +export { Input } diff --git a/components/ui/markdownComponents.tsx b/components/ui/markdownComponents.tsx new file mode 100644 index 0000000..e892bd7 --- /dev/null +++ b/components/ui/markdownComponents.tsx @@ -0,0 +1,18 @@ +import { ExternalLink } from 'lucide-react' +import Link from 'next/link' + +export const COMPONENTS = { + a(props: Omit, 'ref'>) { + return ( + + + + + ) + }, +} diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000..f57fffd --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,53 @@ +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/lib/utils.ts b/lib/utils.ts index bd0c391..fed2fe9 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,5 +1,5 @@ -import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) diff --git a/package.json b/package.json index e6ef03d..0682bb3 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,13 @@ "@fortawesome/free-brands-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", + "@radix-ui/react-accordion": "^1.2.1", "@radix-ui/react-collapsible": "^1.1.1", "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-scroll-area": "^1.2.0", "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.1", "@restart/hooks": "^0.4.16", "bootstrap": "^5.1.3", "class-variance-authority": "^0.7.0", diff --git a/pages/guide/campus.js b/pages/guide/campus.js deleted file mode 100644 index 6d11b97..0000000 --- a/pages/guide/campus.js +++ /dev/null @@ -1,191 +0,0 @@ -import React, { useState } from 'react' -import Head from 'next/head' -import { Accordion, Container, Navbar, Offcanvas } from 'react-bootstrap' -import styles from '../../styles/Scavenger.module.css' -import Link from 'next/link' -import Button from 'react-bootstrap/Button' -import rawData from '../../data/guide/campus.json' -import AccordionItem from 'react-bootstrap/AccordionItem' -import AccordionHeader from 'react-bootstrap/AccordionHeader' -import AccordionBody from 'react-bootstrap/AccordionBody' -import ReactMarkdown from 'react-markdown' -import Hamburger from 'hamburger-react' -import Image from 'next/image' - -export default function Studies() { - const [isOpen, setOpen] = useState(false) - const handleToggle = () => { - if (isOpen) { - setOpen(false) - } else { - setOpen(true) - } - } - - return ( - <> - - Studienguide - - - - - - Studierendenvertretung TH Ingolstadt{' '} - Studienguide - - - - - - <> -
  • - -

    Dein Studium

    - -
  • -
  • - -

    Dein Studierendenleben

    - -
  • -
  • - -

    Dein Campus

    - -
  • -
  • - -

    Glossar

    - -
  • -
  • - -

    Zurück

    - -
  • -
  • - -
  • - -
    -
    -
    - - -
    -

    Dein Campus

    - -

    - Die THI hat zwei Hochschulgelände. Der Campus der Fakultät - Nachhaltige Infrastruktur befindet sich in Neuburg. Der Stammcampus - mit Mensa, Bibliothek und den restlichen Fakultäten befindet sich an - der Esplanade in Ingolstadt. -

    - - - {rawData.map((item) => ( - - {item.title} - - - {item.content.map((content) => ( - - {content.title} - - {content.content} - {content.link.length > 0 && ( - - - - )} - - - ))} - - - - ))} - -
    - -

    Navigation

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    -
    - - -
    - - ) -} diff --git a/pages/guide/campus.tsx b/pages/guide/campus.tsx new file mode 100644 index 0000000..63f675d --- /dev/null +++ b/pages/guide/campus.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import Head from 'next/head' +import guide from '@/data/guide/campus.json' +import Footer from '@/components/ui/footer' +import GuideAccordion from '@/components/guide/guideAccordion' +import GuideTabs from '@/components/guide/guideTabs' +import NavBar from '@/components/ui/navbar' + +export default function Campus() { + return ( +
    + + Studienguide + + + + +
    + + +

    Dein Campus

    + +

    + Die THI hat zwei Hochschulgelände. Der Campus der Fakultät Nachhaltige + Infrastruktur befindet sich in Neuburg. Der Stammcampus mit Mensa, + Bibliothek und den restlichen Fakultäten befindet sich an der + Esplanade in Ingolstadt. +

    + + +
    + +
    +
    + ) +} diff --git a/pages/guide/glossary.js b/pages/guide/glossary.js deleted file mode 100644 index 543839b..0000000 --- a/pages/guide/glossary.js +++ /dev/null @@ -1,172 +0,0 @@ -import React, { useState } from 'react' -import Head from 'next/head' -import { Accordion, Container, Navbar, Offcanvas } from 'react-bootstrap' -import styles from '../../styles/Scavenger.module.css' -import Link from 'next/link' -import Button from 'react-bootstrap/Button' -import rawData from '../../data/guide/glossary.json' -import AccordionItem from 'react-bootstrap/AccordionItem' -import AccordionHeader from 'react-bootstrap/AccordionHeader' -import AccordionBody from 'react-bootstrap/AccordionBody' -import ReactMarkdown from 'react-markdown' -import Hamburger from 'hamburger-react' -import Image from 'next/image' - -export default function Studies() { - const data = rawData.sort((a, b) => a.title.localeCompare(b.title)) - const [isOpen, setOpen] = useState(false) - const handleToggle = () => { - if (isOpen) { - setOpen(false) - } else { - setOpen(true) - } - } - - return ( - <> - - Studienguide - - - - - - Studierendenvertretung TH Ingolstadt{' '} - Studienguide - - - - - - <> -
  • - -

    Dein Studium

    - -
  • -
  • - -

    Dein Studierendenleben

    - -
  • -
  • - -

    Dein Campus

    - -
  • -
  • - -

    Glossar

    - -
  • -
  • - -

    Zurück

    - -
  • -
  • - -
  • - -
    -
    -
    - - -
    -

    Glossar

    - -

    - Damit du dich in der “Hochschulsprache“ gut zurechtfindest, haben - wir ein Glossar angelegt, in dem wir dir Abkürzungen, Begriffe und - Formulierungen kurz und knapp erläutern. -

    - - - {data.map((item) => ( - - {item.title} - - {item.content} - - - ))} - -
    - -

    Navigation

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    -
    - - -
    - - ) -} diff --git a/pages/guide/glossary.tsx b/pages/guide/glossary.tsx new file mode 100644 index 0000000..d3b16b1 --- /dev/null +++ b/pages/guide/glossary.tsx @@ -0,0 +1,99 @@ +import React, { useCallback, useMemo, useState } from 'react' +import Head from 'next/head' +import rawData from '../../data/guide/glossary.json' +import GuideTabs from '@/components/guide/guideTabs' +import NavBar from '@/components/ui/navbar' +import GlossaryAccordion, { + GlossaryItem, +} from '@/components/guide/glossaryAccordion' +import { GetServerSideProps } from 'next' +import Footer from '@/components/ui/footer' +import { ScrollArea } from '@/components/ui/scroll-area' +import { Input } from '@/components/ui/input' +import { Search } from 'lucide-react' + +interface GlossaryProps { + data: GlossaryItem[] + searchQuery?: string +} + +export default function GlossaryGuide({ data, searchQuery }: GlossaryProps) { + const [search, setSearch] = useState(searchQuery || '') + + const updateQuery = useCallback((value: string) => { + if (!value) { + window.history.pushState({}, '', '/guide/glossary') + return + } + + window.history.pushState({}, '', `/guide/glossary?search=${value}`) + }, []) + + const handleSearch = useCallback( + (value: string) => { + updateQuery(value) + setSearch(value) + }, + [updateQuery] + ) + + const filteredData = useMemo(() => { + return data.filter((item) => + item.title.toLowerCase().includes(search.toLowerCase()) + ) + }, [data, search]) + + return ( +
    + + Studienguide + + + + +
    + + +

    Glossar

    + +

    + Damit du dich in der “Hochschulsprache“ gut zurechtfindest, haben wir + ein Glossar angelegt, in dem wir dir Abkürzungen, Begriffe und + Formulierungen kurz und knapp erläutern. +

    + + handleSearch(e.target.value)} + icon={} + /> + + + + +
    + +
    +
    + ) +} + +export const getServerSideProps: GetServerSideProps = async ({ + query, +}) => { + const sortedData = rawData.sort((a, b) => a.title.localeCompare(b.title)) + + const { search } = query + console.log(query) + + const searchQuery = Array.isArray(search) ? search[0] : search || '' + + return { + props: { + data: sortedData, + searchQuery, + }, + } +} diff --git a/pages/guide/life.js b/pages/guide/life.js deleted file mode 100644 index e8deab2..0000000 --- a/pages/guide/life.js +++ /dev/null @@ -1,196 +0,0 @@ -import React, { useState } from 'react' -import Head from 'next/head' -import { Accordion, Container, Navbar, Offcanvas } from 'react-bootstrap' -import styles from '../../styles/Scavenger.module.css' -import Link from 'next/link' -import Button from 'react-bootstrap/Button' -import rawData from '../../data/guide/life.json' -import AccordionItem from 'react-bootstrap/AccordionItem' -import AccordionHeader from 'react-bootstrap/AccordionHeader' -import AccordionBody from 'react-bootstrap/AccordionBody' -import ReactMarkdown from 'react-markdown' -import Hamburger from 'hamburger-react' -import Image from 'next/image' - -export default function Studies() { - const [isOpen, setOpen] = useState(false) - const handleToggle = () => { - if (isOpen) { - setOpen(false) - } else { - setOpen(true) - } - } - - return ( - <> - - Studienguide - - - - - - - Studierendenvertretung TH Ingolstadt{' '} - Studienguide - - - - - - <> -
  • - -

    Dein Studium

    - -
  • -
  • - -

    Dein Studierendenleben

    - -
  • -
  • - -

    Dein Campus

    - -
  • -
  • - -

    Glossar

    - -
  • -
  • - -

    Zurück

    - -
  • -
  • - -
  • - -
    -
    -
    - - -
    -

    Dein Studierendenleben

    - -

    - Studium ist mehr als Bücher wälzen, Vorlesungen besuchen und - Leistung zeigen. Der Campus, die Stadt Ingolstadt und zahlreiche - Einrichtungen bieten eine Vielzahl von Möglichkeiten, neben dem - Lernen das Leben nicht zu kurz kommen zu lassen. Ob Konzert, Kickern - oder Kirche – auf dieser Seiten ist sicher was für dich dabei. -

    - - - {rawData.map((item) => ( - - {item.title} - - - {item.content.map((content) => ( - - {content.title} - - {content.content} - {content.link.length > 0 && ( - - - - )} - - - ))} - - - - ))} - -
    - -

    Navigation

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    -
    - - -
    - - ) -} diff --git a/pages/guide/life.tsx b/pages/guide/life.tsx new file mode 100644 index 0000000..504525a --- /dev/null +++ b/pages/guide/life.tsx @@ -0,0 +1,41 @@ +import React from 'react' +import Head from 'next/head' +import guide from '@/data/guide/life.json' +import Footer from '@/components/ui/footer' +import NavBar from '@/components/ui/navbar' +import GuideAccordion from '@/components/guide/guideAccordion' +import GuideTabs from '@/components/guide/guideTabs' + +export default function LifeGuide() { + return ( +
    + + Studienguide + + + + + +
    + + +

    Dein Studierendenleben

    + +

    + Studium ist mehr als Bücher wälzen, Vorlesungen besuchen und Leistung + zeigen. Der Campus, die Stadt Ingolstadt und zahlreiche Einrichtungen + bieten eine Vielzahl von Möglichkeiten, neben dem Lernen das Leben + nicht zu kurz kommen zu lassen. Ob Konzert, Kickern oder Kirche – auf + dieser Seiten ist sicher was für dich dabei. +

    + + +
    + +
    +
    + ) +} diff --git a/pages/guide/studies.tsx b/pages/guide/studies.tsx index fbf0274..9e24ce5 100644 --- a/pages/guide/studies.tsx +++ b/pages/guide/studies.tsx @@ -1,39 +1,24 @@ -import React, { useState } from 'react' +import React from 'react' import Head from 'next/head' -import { Accordion, Container } from 'react-bootstrap' -const styles = {} -import Link from 'next/link' -import Button from 'react-bootstrap/Button' -import rawData from '../../data/guide/studies.json' -import AccordionItem from 'react-bootstrap/AccordionItem' -import AccordionHeader from 'react-bootstrap/AccordionHeader' -import AccordionBody from 'react-bootstrap/AccordionBody' -import ReactMarkdown from 'react-markdown' -import Hamburger from 'hamburger-react' -import Image from 'next/image' +import guide from '@/data/guide/studies.json' import NavBar from '@/components/ui/navbar' import Footer from '@/components/ui/footer' +import GuideTabs from '@/components/guide/guideTabs' +import GuideAccordion from '@/components/guide/guideAccordion' -export default function Studies() { - const [isOpen, setOpen] = useState(false) - const handleToggle = () => { - if (isOpen) { - setOpen(false) - } else { - setOpen(true) - } - } - +export default function StudiesGuide() { return ( -
    +
    Studienguide -
    -

    Dein Studium

    +
    + + +

    Dein Studium

    Der klare Unterschied zwischen Schule und Studium ist, dass man sich @@ -47,65 +32,7 @@ export default function Studies() { elektronischem Wege bekannt gegeben.

    - - {rawData.map((item) => ( - - {item.title} - - - {item.content.map((content) => ( - - {content.title} - - {content.content} - {content.link.length > 0 && ( - - - - )} - - - ))} - - - - ))} - -
    - -

    Navigation

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    +
    diff --git a/tailwind.config.js b/tailwind.config.js index 8e9f52e..1de5b84 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -7,65 +7,87 @@ module.exports = { './components/**/*.{js,ts,jsx,tsx,mdx}', ], theme: { - container: { - center: true, - padding: '2rem', - screens: { - '2xl': '1400px', - }, - }, - extend: { - fontFamily: { - sans: ['var(--font-inter)'], - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)', - }, - colors: { - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))', - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))', - }, - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))', - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))', - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))', - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))', - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))', - }, - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - chart: { - 1: 'hsl(var(--chart-1))', - 2: 'hsl(var(--chart-2))', - 3: 'hsl(var(--chart-3))', - 4: 'hsl(var(--chart-4))', - 5: 'hsl(var(--chart-5))', - }, - }, - }, + container: { + center: 'true', + padding: '2rem', + screens: { + '2xl': '1400px' + } + }, + extend: { + fontFamily: { + sans: ['var(--font-inter)'] + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))' + } + }, + keyframes: { + 'accordion-down': { + from: { + height: '0' + }, + to: { + height: 'var(--radix-accordion-content-height)' + } + }, + 'accordion-up': { + from: { + height: 'var(--radix-accordion-content-height)' + }, + to: { + height: '0' + } + } + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out' + } + } }, plugins: [require('tailwindcss-animate')], } From 9fac3a058a20d231bb4fa30ab96422c600aeccef Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Tue, 22 Oct 2024 00:40:14 +0200 Subject: [PATCH 05/15] =?UTF-8?q?=F0=9F=90=9B=20fix=20some=20bugs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 285302 -> 285282 bytes components/guide/glossaryAccordion.tsx | 4 ++- components/guide/guideTabs.tsx | 2 +- components/tour/tourDetails.tsx | 2 +- components/tour/tourMap.tsx | 7 +++-- data/tour/neuburg.json | 40 ++++++++++++------------- package.json | 2 +- pages/guide/glossary.tsx | 2 +- pages/index.tsx | 14 +++++++-- pages/tour/[city].tsx | 6 +--- 10 files changed, 44 insertions(+), 35 deletions(-) diff --git a/bun.lockb b/bun.lockb index f699eb20041daac24ff7147b7dafd7c3a19b44ab..2f38b4ae422707edd4ce2408f9227bf90e074576 100755 GIT binary patch delta 43564 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 delta 43384 zcmeFad3;S*_dkBmxw+hvm_kA(B4Un2BEt>gUO~)L5EAoEgoGe6m`PNX7OnJ@Ev8D* z8mg6|wB{i-wB~s#X=~ORN=s3{_d0u@B$R$X&-42I`P`Rv*Iw_v_TFo+z4ma7Zo7Ler%Pnk8QEY^ z42JBqM0-Mp!C+WvG#JW2ZtlSG4Uj2+mt-(h1`jM{FjNAsQrci}0?$ZKNsdRkNs!Ay zE)8A*`~mb_!FQQ?`OSh~0A2-nEpU|2%6?%o7-|D(>S!=j2QLqUT);hndx2jAcLzTV z?gsu4rF_6QLnebh1+NG`6WkMgBsi7p3{HAZu&M^Q88R7e0Ve}0p<|T{S%&PZu%3D{ z7-mz(32^F3LV9{)dV;~w9WoU>UY_@4oPBr-iWph~$G_}Qp`SW3Jp*M7XJAcP;CG>q zK4p)vj~JOe$Y7`=^wJX3N2ZKUG}zHg?<^?vLV^_Afm6dt_VkfsMi>kW;XkVAIa;Uu z)a1eAsNtKC$wTgHb4fM#dW!p*K|Si7=!Z+(-3Y74j;`Sv0osY4(J~ zbhsaWrUHY($&k(9lz%}K&^>SfGU3A$(}pBAG8puRw|H=m47R6djDn$QiJ9qS^F)jb zd9WGAg<|Vna8!}K#>3#PxiBGV zDZqUj@R{NW?oKn{G7^;W$dAw2p~)G^aF=0F%4lK+d)g3ziC8z;TrMiXk6`_0>&wmP;=F4y3 zlz#%8R*Kmc-rcc+4+N*ymxOcu;e#^MQegfz=u`c|%KF*5nXQpQ{m2*mQ}l}lt}+ZE zypkGJ%92&KslkBI%Dx}L7p9%yL6E0{R|l_X{FOUg83{HmLmU%rB+ww3t4PK7ot1lAOq0qQJ zx6lim3~>aX)b$mPM4(?`Y+O-#s;I=!5) z>o0}Ak_AOG3Xp5RCICErWLk#5Jv||QTt?!UX+5u7U62~KN-?#eZg z$+ho;lV_$1y|@@&u>}p12iilXhMNj}n=oiZ;@Au_@o6s}JB5Pp?*;!;kbDV%I0L5` z&k{Tdyb9!Q;AEf`oW`^fIJw?k@HKt7Tn;jIzyX{L9^RMBPkVCD{&N$A|4A`EGd+If zID_F)KVH#S!g4(}X7uM3tN^D5^ca~uKm;u~&59i4Q+=HwlfmJF>q9jlp6AyBPM)t= zPb4I8X8`w50r4x~Gz160DX6ygR~;Q|XRU)s9UnFb7GufL?O6z%+RXx|5K0}Hk!nvE zW*D8}pBg{dV9>rW0&Os}svv)Z;K_-JiI&h1L!vz`AroWtDf&(I&j+UwO&$b;@p%_A zMz&A(c%H}}l4eg$8kJ&j8!FB*;AH3VVcbF61s^{WXA67|KqkZT!AWnq;2(igKi?jv zIyzO$3K_xM9gJpZpxsAu|2lz_Jqao4W2w5%$frQjIRk(~JpfK2LuP=}fHuzL4f_aw12`Gx1ex+j zjOOLP2dBm3TW}iBKQhz@PPOH~#;P7=YDdOTG#Ie|X14;b23}k64HI}+I6?LV9yghr z{pzOPMx9coN|OiBCgU%F)1dAHCtH_;Qy)C1@SsRb9-d}L5a@tOixWq z#J2jOnq0PF)~D0CNwdIdevC#Nv_ec1JPDlK*B6}X?kc$7d))LI;54pLz{%DKa7XYU z!9SYG<@W?nNgRy`G8o1~h6_Bfn& zIB=}283rG9RJkgRkAJ|8#L3qm&Kk0HJl`;ufm5C1bFlY=UzmdBrGQ$!Xfbx7A0yOCPDc?Y~f}I<&WgQ^d_w-OF3DS}x#YdK26U=;Osaj(RNN4jj3N z<3mQKY7@){G7ZLHaB>)IB|j9M(g%-B^T#z*(mYXa;zF*sekmX9&cMm$9l#N{S=oAp z$AqFw9v{iUkSjy+&L@0CZ^AGd(e=ytai!IAUhxTGh;DEQaEwT{FE~vI-2e}vzY^uC zqi0ZGMcS4xq5=vHy+=EdK~cU+aHc65vL}Ii06!1I$dI$}7&RaRrwa9+B|@eib_I6@ zj|3-uT#uwB4oMsv2${+yr`yxgvh3pw9ssDPv)1s8>)KNJSu0;ibV22T2G z!KtTt;1tu-!KtC~;8ZT{3y!yfOyzWg10Yj*NAM`>=~L08kagS>HzCuSvKpLvFjw$t z;M8CTa8K}HaO!D&HOIM1Rt5Njn*BSMm%ay1e*GDoaJ@Uj1paEo6^#RGCG+?I75n{7 zeiiP^D)Q5-{&|yMO8SA^pm$sE)=n5od#C>v-l3V`WY{Ai&)Le|@c`VBBI$;f&_)`E zDT4tcKHQ#aFiZeWejEf&4Rr^n2+#*+(8z?0wB!+qE72hNbKwr&a1LbBA183#bMIol zQGMgVX~4Jdf`M5`c>}GLlE&%6|ChMC?@hwcR*- zN(#<-2CU&)1jZKdA^ZiL%3lDdNk24w`m{Y>ozz!S0=oI?5bUcTlO z?o|&~sutJcAm7YOea}PV56Bc)8TM3rJg${~giMamtI_Wj=(h&+X7q(I5qDokz~LL! zNS7*Eiw^PSGBJHrW@6engT7Pfo8BDcQ*U%x-wR&d3_qH{tjP%TmmN;I> zso*q`KRCnrJ#ZS1U%;tDr@+e_h8eQIIm;XN!WdD;qH{bBa=>Y+8VgSNlJnd!+~BdN z*as!%KqkW`fxCcX5zrc}bdfhS5S+@d0H^Z3*6(sHFRi~)`KVH1f8fXJx?92T{5UYA z$Mle&XRKdWeWjyRTaELxDZ`BhLj={Q+WjobHb}v`B;8Zp8`zX~4hBOLU=FHJiba~L z<~FcN+tqXUo~^q3+f26727^_-)F47yspk6Il=F~VL0?h}2ZXEc0XAu{8i((LYA(JV z)N}Z@s_qSK%17{!RnyE1u$YcR8mjj5i!k+tC;MxuZ;@(EDTO-Mlj|0Qmxj<40*gE* z1*%>B%+jaoxj>uA6+ItF>T+fo^?U=XX$OE7T1^t1*F#IiAk|a76c}MzgVaDR<&QCq z*K$8Vs+E>HfmBDzmAut+!8ZB5@~TIORhfj@K!%i33maJE!V2nw5UZ&nrgVr}H6=nx zK&msc9n`!Ki;@qCd}kzO(``tBYE}OT$x}TSYE$}R5Xn=hD%2t`t*G`6vnsy;YynVG z?QjZB-KJ!OoLWisuvnGl0HTmxp2kb6sODO1=4=E6)`e`AKb^b7bPWiK1xH9V)VOe) zG6ZW<2sC8X-ZR_*LJJx&^DU&BmMlm?(b%T+#FQZaI*?(ePa(CU&Y5l@W!1V_w+bJ+ zQd&0$LkiRMeZCAgL!e4!wJ^}4{3Ik)6<|^Puyj!8kQZQ)hr6i@BCPUPZtD36t8xc< zWTR25vc5a7rLVinC)JZ)TX_J?Ds~#<^@=0&CcMGfHTV0#DA|z6dkFl_;SLa*s8t(kQ>Bef=~tTbdXV}ghD-I--tDbQJ}@%etoiLW zBxA3+zf#l)PhXOheUlcP$VgjAW@@=>eI}k1p9HR6iswx6eMau8%cSM zpSqx<70cwgjy8Et1J$Dw2C@MkU2QEsiC@{ixmsOxh^(kXdsUQ6U`&5J$ z%q?&Z!kVc`w9=(RY79wMeOh1;AW?7lWVr^3LJ;l^3^yahVj-9`->rc}Rl;2e;9ntG zAUVvv zAj0&pDAgL%BUam2zCx<2x;P}lB*S5iNKXktip=6pnE{FX1wS_mH$xzQX@P;MmD|f^ ziid9-Qx)>UCaOoQRXGkI5=w9!y5)xror-Ad7j}emu{ODXQ`IBRs=SY|X@%>983eF@nQq-POQ!LFDQ zMZE!_$`%%r7e-Y(2$&}#^>Wc`lvh*~hX+$@%!r=ah%C}m<_AbobQc++^oY`(FiKr8z^c?m^ii~6$(D`|9M4KF@tt4qnV6_fKYZGE79ulohm{8aX4hjhiNz-t;H_azA1=l1<)IK^# z2S!Nn6cr1xn95`N;ADY-jz)^+AlzfMC=3#!9$Kiud;}7e;jWz%p*UckwNMv#Z)!$@ za`=Xj3yHT&OUel$@pj90;dy*vZ3Btw=TerC5dLxD<|2XmrNFZY6h1Rd9Y|6a+agS} zkqTG)StFDJq-b2xbNKE)B=QR8B{qhJ(R!!I*`>Ov3z}G!rro&B7!P=7DI|(Z^wesR z|LCTkPqs>JRQI7ad0uz5_fV^Ht9wzE(65VurKygv%?hXSH>Co>(JdlE{=A2}V3<`Y z9b+(HW#Tr=Lt<2q6sx>EM(v$qRW2isT%@hYG}BXT$}qG~HfzhDe4wY=d$`qP!Fqt@ zXLy9^gQC=RqVQN?g0MZF8;QNXkLrj#gt?5BMJ)02A#v*v3Z~PL!nAtIsJWwTrk4G*5y7%D4Jj%m zR)rkJ3?KvmJmqgON&OLpw46$j>bW$VvJml3A@4%-!1NcAI6b69m_snrskx$sTS)^# z6I;8SQBFdF(c~i13XG?V2ZyDi5!pE#=+|wNCYiznljGIinN}qa z^^vWmR3Ds9Az;GN{KOtyGeO^`ad?x5CaAqfTa~o{DGGTg--SdIO4~Wj4F~bO;&o?~ zK)As>An_%ew!!;C!uZqqFOl!#IFuvS;~)i~UM%h~WI7~j#jNcR`yi1swW}1QUz`oXY81DwwgNYX95~SkQ!8L_P1P)<1xpz-dJtkY_w^G#JldZ}&v?f{{Q z2G<$QXO32tG+8}2&8A!eW~08ScB@75QsdsSnc~J^K&XT%52+s13*`|~U9~E)3QJLH z+;p3=c&x#IMT4#j0xc%*aRx)8+HXcvGZICxQV59_4oyjFuIA3L$v4NVz31B;CgS%Y z+9~b{QZd@L)_D?K1Z^>zkfi? zwWjbEw9QDdL!vp)kIZu+1wzt}5vD7U+G>5R`xbDuYJ&(>ZQ;K`Svt*L5@}ORnO(vr2eY=hu9q6(Wi$G zYJUugJdKqw&7#zwZqV*{VGbg|`l;@!P5BlWUmXi^o%S0fVH@nOJwqR5${P)-FYlor z?qET}-Kxk4liRzLf)|zkNVU@Xf@vpxqPowuDL(|KZQ0=|gD*36oi*3pPmGAdX z6q2ToAvMx^e+((QMT&`&YEjC3#0|itLNIlL#D|M~F&z>O7ry~i0ErvtITt~r88Qqh zZb&{-A<*TQ)>k3XnvHAq#TLb99>1i-5WQnjy3W^I#F5lA15$6b>f8ug4fAZ~w-)ft zw&=hhKU|=m&$CL3>i&t%l(0l=5VLp{Qe+(N4q*eh4k=KZM^!%Nn;wsxI7rkXXdMnW zLkK7;vWpb8)z-L_TLk->TcijzZn@1g4p>;l^^G=&fQ@Ol=`y*J+Q92q`S^!4c+C%U-!CG{pmfD{&pYAE|Cys?&1K z2y29CI!~eGE~M!6z?+`aU2#~UEq1{Xa+ej_UE*8-O|bQ*Nbx&6^i&F%N~*y2z-myA(5k z_FBEzz)XKZ!aeoC2y^%kPxai^!sx@LYQeb3-0yjeql2m2iBB#XRTfb zoi*bjwdHjnwpK%GuEo|Zq^O(P4rB`aLJOea2xT%-d=}EB-F8S6{M`7zAYnzq=(qZk zM!#SGrVdEpmi>eXdAylaYvgh91Nm~)V#8jC!uTm{mTTVt~*5#Q=Q!3t@f z4v8!+(l%WN!ViMBEnE|$iOG})iCap2D!r9@PGPVVDJ<i%!y}BS5gl!rx9i_!`I8@|KWr{S0fqK&mrY zV|s=Z?k3|X(ru?c8url^Wi=!*#2avYfJAYK9T7M4d+*|B+zP7CT#IrP5=9U0zx!Ko z<27!lO_{Wt+l1i3!gv}I9}zkZcO zSzdiFU#a-U+#6CD^0Zx4nxp3Kwn_8UbGvQwy#m!^kJVKFJ6aOyna?1k8fo62hZOZo zo2K&l?^KVyR;AuPzE{KCza@E`)Y*L(h?gyJ`)^Tkz?~gED zK?++UQngQLF}^=SnTQm{zUEH($O+ZsuocfA;||-DM<@9`Q`my0x}4H|>(j*|ty0~O z*cAD+zLMp2v?#40QJ)Y1!4~C1NE8m*30^*ZTJ<<;Rmz{?ATENS(j5}bSM9n~$rTc2 zFP_CbfrRtIga}jcS#4#(Ra`n!6z$r2U_J_|CnOQylX0LqZd2Br<2pFn;&6B$l2tRp z2bWC^&-1&XxP6ghF>QdvuMV9r@WIoDQfjB>p0G)?)N?0nrc1~PQ!l-zou*FO5K_7L z&R5T!w8;-HuJ<_ALdud12E$@dWzc$%48pRkeM)i%AXo^s&+9mq!xCpOg0ReJpVx7! z2h(2DE6{$}1OW-{L!1o4Tr^1Pucxc{5RB=heO|{Uwd|QHlB~|YGL{H9r=r%^-#snNDCk0RM86%Rm8tICt1?Km$|Gi zK3hfeqXTkD!6dYZQ|+aNOuQ82vf$K81#rr8rZ2$>cM)<)PLM0Uh*uW*#7W;>!Vj7V z^AH)tDWj^8|BaJgb)iR`46Y&M|2xmpe#2x4MnS4DOjPhXPQlznG}IKFRGSI?lAP*k zF7#T6eBu-U?Sx#!HUGboK|1Y)Vo6R0bO!DS9t%z?aYBzcC41wG4Cp8DlAJs=K;Sx8 z*PVCBq5|=vU?Mmv4gn|KB>EDZlF9fY{S@#r;A6qbu!-RKXP87^{|`iJb6UlaT~W#aQXPFXiZ{;NEzBtRA45*6MS1&CAfj*v@of_}wUdGKf8BtOR&xmu>m z1Si}mWa8981swmf3{LnaSC#{(Pf1P%>F*Ssz&%7haY}j#UQOV{DOnv~uHc~p|99T- z|EkFKux?(eqBi~AO`A7OMH3}CncPg^#62MQ0;d(Azrg>ElPl~(uOufZLEzx(%pVmk zb_M~XHWLM>zc--I>p0b&EcAv7z1MN7ZI# zr}}d!0_l?@6h8zf=p*`CKj~4T7ck(K668qoDOPe`wJb4{;WzU_Y4s5=YRF=h*kvd4eEU%2z zi?uBSz*H7MEf!rCz+(b75>SUpX@JA>eBtK>^55Qa=Kmh^% z%(()9%>-mt0ML-_A|R;(fLhJ~g4if$0B+6zP7x5yd@2IiPr$T_07BU@0>)MZ5LyX< zg-xjhpl&4qR|#m$f?NQcC19=#fCyGdzzi1vQLX@*u^d+b;jRE45nyAHl>yu!U`1sB zk?cMJ^D6_0sRE!S%c}yQZ503}HvmyA+6};C0yYxRhDq)KR=NR5bO+Fm37A$D zKny!Zz}Tt)LaPDj#imrlSKVp=t`ZQ(g1iBoC19>MfIh5{fEnHZqN)Sv$8xFz2(J#{ z5di~OkR*3xvwb8dc7xCrK0xj4z7N#q`v8ck0U&|p)d0}81^|;UfJ7GU3*a#U8wnV~ zq?!O$`T|I-2_Tu}6A)VyfNL!P!1q2Ld&b0w-CLpsmfRSt$0ZFw1)T#qu z6dP3sfLk2^rwB-AK6L@?CtzA#0GaF<0b}a|2(1TT44YC9K;3!(t`abg1=R;|mVmkS z0Zd?p1k9)pAj%KGB$nd`AlwhYBLcEmWCH*<2w2eoz!Y|$fcXso#P|c4%JTdHwDkvI z3IH&TMF#+QOu$A0rZcG_fRzCN5*q?|m*o=>+Yo?jAb^?79tgl32%vy~*~~czz-9t6 zg8+QMb`g*i1fW(U06A<_BLHrV0GuK~Wj?_G_7gBI7{FY1jDWGh0763mFg7IwK-~}k zR|&{vL7@Q75->Luz(Q6?z>H7;QDFcUvz#yh;b8zC5%4jKv;eq4zzPe1Ja(Ue`4#{% z;Q*Ggyl?<*!vUBY16aYL8v}Suz(xW-V^R|UD;onyYyw~v%O@bV2>{m!0Be{%0)ROJ zKmh@3nR8PBn+eEl3gAn&i-4r20BSV@kk3Xn1K`#Sz$pUOGaoB}{RB+20@%oo5ir&Y zAk+q66PscKP}c_FDgocHpymM15-_(pfGw<$fEmpJL`4GF#&RM7ghv8+M8FOf*#f`~ z0#>vDu#4R%V15e#F)ab?VR;~X2+eJW9HvqM| z1GvvdbqC|KB?ds<7ywrZc*25u0ys;+ z+@1iQvO)r8^aK#q3&3-h(+fa&F94U|Wch`GwTP8^vKxe~h=q#8?#Du9ek_2PH~>bL z7YCqi8~{^q045gQ8^B`%HWE;pNqwYVl9|O3Q&>JRN2c@zb7FR4W!N{w$};DEVC7gc zvGQyeu?oz+KbSKcMXVw_K&%q;8GuIi_eYs&1JH;oJ4V3R0RTb=0;s~K3Sac$Q#{_I7pbnD;16Y{|AaO8&dMuxS*uel?hXC+n_8|bwLjV*I z;Ln_s0Bj~8GYLRLwu^wIBmlLN0R*v8$pGAv0h}TrnE4C^u%CcwLji=cV+4#H3LtbC z01KNk3_#ss0Im|ym<6Q(I7`6X6aW#dkboH}0HTHiXvT7e0|*}u;1K~f7C8dI4FXn- z01(OU6EJ@SfS8d0TC%*60NRcOU`hoL#iCOIJSJcx0d1Hx3c$)#0Ewdjv}5@M#Et^s zng*Z)v!?+trvWG+pc8XW2e6rd%ya-<*e(K+(gD=U01(YaWdLx?0C0+c?#w3>z+836Y_cxy z^5^{ihhn$H^xWn=?2z;7JzM{%wB`Jc`F~G1`sK%~k43iraJs|XpuYm=)Z12N?(|RE zbnRK^+z+8~#|kd9Nn<3p=Ep7DS3a0t;h@j9huzKXEspEIySX!1no;|Q&+}W?uGqG5 z#hZoij;Ymd;l>36%e7LL8vm4cowGVP-}%%yZ(7WERm_`Cjgh|3n0H@tU_acES|Qq; zf0fpo;w#~vI=la?R0Thvc2M-cbT7T>*I%U*M$>Q~JUXFl8)cWhT!a5X_D%3|n*i^S zHC+F%%HHwEUD!=ijPd{@>*^>wutjG1?52AzvX@LPZ)*Nj8f!Fd?TH75RCnw!>@mA#~Dn+}zgjgr)S)3I{$ zU6WLe?Q)STnM%8ej_xtC=8`;CtKC#hg$-oC<`Ytq1BRw^+m~#bR86ihRocMb&y(9X zZY%S<;q(ZFJ|xr4YB24tIbj_jkW9Ej06v%|pU9Q6x&Wuhr6)913CE|az^KaF8iJp0 z2#jvT*ArMbfziY71_J9YFluHGRf z%4Su=*Ii2CLyeK5H|UYTMhnI2!04GKjrACz=YzDLh`Vt@uLiI}F(mqf8ed>P3ydDx zP)BNlelfxS6cm$1;aW(aha$yHO<@yA0% z!wE{@GaDHG(O)GPb_h&=k`zSow-^4PfTG7qq}T}bG5H7|dV)j^2ZQo}QIM%ZF9hlN zLT|3n3k9|S7zN%ufrTNxNMKBqwE#Phv=;xlLNOd5xtKl_jMQ*r5V@FwaiPFyQAVY@;L8No0_o}kTQ0Dczh)xeIKyz}f-x5ZD@lwFh<GJ~n z0vL^dC(s3f?E!{=^z${tNnjLs1p@1W^eKVu14f?i3i1I)!MGn7%`*B~p5Zg}E(rXf zQ0yi!3cT+H)*a~`(4)Zn0T`0>!&WUYDaeih!$0~3r1lJ!;^~+u+Y{+jvH+js0_#Qb zH%5Rb1Q-j2Xn~y+SRAnSVwg?|tT(VR=m`bXX<+zAfAMJ0f3|d1==BA*4wkkAKPRw$ zNMF{bG5k-{fZFR1NWDVJMRKjsGA}XMi+@zX-)dq~`&nF}y0U!AR3E(J)*S*bsryFkBZ{ z64KMqBXao-fh8kt2S(n#DX^hPXSGBl^tmO#VMvoPa`7!AX30vn06lhC^h4F3$NpfViGGTax6qX1Hm$>k3OmWDJLGZ6fDfu#$~4*pPJ z8Ax{$u6`u2OkiCF_J_bm1EV1(@BRsl)*r(d2!+DJCqi*7untfp7yYFv8Vuu*_JAIF zg98RO+dOFFzV&s0-K05HB6m+A?lli^iK_-NCrq4S0oLSLDXY1Ko-~) zS~c*wvuXGm*;j771?g>|)5u>8z6A6!Xc=fZXa(p~&}X2Ppw*zyL2KErwQ?19Wv$$| z7VRrJAo_^|ZBTR`pzS{sL|b_?kd?)JAt$(3N3sUU7gQ5e3seVGmmT{;_KvooX8Oqw z9U|_5?t>nHeh1MZ;t$ZDpvRymAljk!gVzB0f@*?lfog;5g6grTFJ*6*`lZ~q@d4B5PJqP^_nh0zti2l>3Gmy`+`(Mh#+`mI|1w!Cc&}X2Ppgq9$ zvdndIaK8f7LL2gK&>qlU&`o6D0^I@q3i=In7jy}98FU5o6X+MvG0;iSA<#k44$wx> zde8=D%9s7J=(IBlLKL8yDT?Or9 z=f0A?>&<}0bUI1}(Qn;OflhfkuEvGWYeer$W0zS5P!-wjOP|A~_3Yi~?O` z$)sTdR0{Nz&0a72MOR1icQkhd^b~E-Gt`?P`q|ti&{WXdpy{9)pm#y;WwW z<$;!gmV-V6tpw4JBnP1`FYrnr`sLowAiDBlp!p^P+p|G-ElUSO9}peh_p!navTxb% zkSs*ICqQ2_=Z$j1P7|Rq1vC|u1nLdy18M?_0C|8af?PmOpd+Z_IOtDQL5C_jL}`a6 z@ZD_6MtNkt=}>crN-}sKSlSI)wC5Uu$)LKBiFPyhuVvPlV4@XJrHyJ8NKaEW(?DZE zv=Q||u}-Lp7CVJq{aUv8>&15?dk}~g;F=&>bSr|Wipn52P&w9alkDAyegvu4LfJ&5 zT0<251!=0nZ8Lg+&$DA}#2UE<+qp?@pwOY8La+vVv`MyTH*k7Gj0N=q^#HX3wFI>Q zMS_}xDA*}1DEQDp?Pu9k`$N!K&}`7GP2)DpTcoU+NWTYq7euFFYBCTM3!)PiofqgF z(Hhho9Mstxi5)dJN7)dkf7y$~PDqc#FSs4GjmET;t|3`7l6 zW-zD`h>m+9AX<@W6(<9mfovesYXOP`wFI>SMS-G09YF0t?Lf^zRIW3qBd8OIbh?1L z((X!?kU}pI9Z0BP4-oaNJ17Q3jSvy`HfSoy4jKsR1ERA?9H>8N0H`mhpO9%cP6Z7I z4F$!627wYl$!Om&1e6FG45E_}6&MB@0U8OSGsY+o>C*XN5-0;S5tI%Z2O^xXOu@&3 zj{(v4KLPX>h{{vh$%0QIEE``lK<|L2fu;-o6?hJ4F6a#CH0UIVrt@*odeA4JJkZCW z1t13c5cEFC2%_?HKp%jpo_U~;K&p_D&eAd{GZ!>pWKf#0C7{J1D!2%=5JU|u1(AX4 zK+8bXxGv`-y%zL2=rho#pcSCyATp5ZC0Y$yMLt=H1koB0RY;j%2u_B4St6|$CcO9CHM$osQZ$O(tU(=Xu0+A9`Kvq#<-KZT%9|0W#QT}(J z0ubr#2JHor{wfePwg*JL-UZSdrbbD(q^zg2D1&-V6%waLegJ(BqJ|EF4uJFq_anUz zq&N0zL!_ryt{eI$8HR;v73&IQX~_x>Lp};}01W`00$l)|WA@#+Gk6}!-$4&Rmq9;* zE`ctBegoYC-2nXxx&yibx((9tLZokkNarf(C(zHJ>!4pigk1ws{(aD0&^-1%PN! z{lV$F!;k*hf=0DIgnFRbpjsebPz?|r>1ecxNY4i{MMHIPiVVFWs+9EWg6e=srh16e z-_kS!1%iS=WGv-Tn-NkLKbba#&97l^GpG}Yj=z)8 zU_0;*AgZG+h-AXMgLe}$<@E%`kSnQC65>E6P+tw(RBpE%AWJ7%v%PW`sVSSiSN1HM z0oAq09t0l2Htv=2V-t32uWZ9lI9v-f>d^8&e#sVVY@vwq*ne(tnM{(vIU;2l8i zL4-ADdEdzkr4ZI^pIima#O#wtLMqrNFLMn={wz5wRv|<>V}@*6 zv0v^bq15vO;2|vLpq!-yL!%KWXw#*GID+8OUhWU_KIGaD$=#g;kwXW=$tX{E)`MBW zAvr+_0Zav(vY^9q9e)}`x*Qn@qVzS8g!BdQMDW8GsbW92?y%g|r!8cvl`d__ z2m092Y5pL{h4~zjD^=CZL-tRAsH*p%PS*x>Rdk3&ACaq=$is)&@FQ|V*9auXBPSQy zb3vbjnzH;OvagiEP92dgWoh}Q4lM;8V(v%fItoGGYl`iTLeb8KAC4cIEKB_Z1406V!VFQ!QIIp)VRl%-)J><56B-Z{0N-_H`6uOIPr3kffx_&eV?Met zczR_hga-r%V5r8k7bj(R{Dj8+lpHM0XPr*T?w+4Qy$sa%8g6!fFnfp}Zz&W7zG72I zZyVbP7D~7G%0n-xW(RdxGyE@IQvXJ<2-Thu7EN%A_$zsOkHN?Z3WrI7hAXV_Gp0kqqoIwXSu!u7-oJ*d~u`rXvZmfK-{OQxBQe`O+NChB5-He~R z8Qt+jKJO9=TiAW7qcd|l3pSE{>506V%tq3utf8yX-BW*K*_l<|KW__J^Or0Ip*s|Y zhgpyp)UUBoKg#ZG=ULf9dckr$P)58aE&F?qdo@S8vd^@xp%_Jc`E#hdC3C(4)`b;b zk^OuJl+qUH*Ys7-xxjL$*aNoa9Qs6vvsHt@Xc@ftN=-OFm8`pe>~t*<8{->iPs(#4I7MbxMjPWZL@vxHq%gRa?EAG3fQ`lM3UH`qEFHb1Zf~eYw zt)(#kPyJZZuwvu6e@xmCvBE;xRUTfRJuZ|_%LmG{qd&=RVfvfy#(E_mEu7K+0Rpg* zwlo>^cj4uit@g{ivsd|Rq1lLL@zwHd-F4YD9Gj#5>c8}N+y1>_Ma_xD@vFa!&vRAQ z?nd(JCJ} z@ z;}^M+e4+yDN&I+u_TDdYM;Z88;&;ol5#x+*@|lXP`BmA?OMeUDig%a#*6;j@Rn!D4 zpI2fTSLKfQk<6~E7_(mN0+?)fVHG+X-B`J6vWL9Tl`XYGXmL#r@zmc_=(xD>{M)5} z4n|GnZ1|)a%ef|Zl2^I0E7ve8)!q4zK$`u&Gyh>T#&l>H_41 z@|?}?EZ{oK#k&Tz#e3$UkMg&kKX6%VB#_2!iwA4k$moV2g-y6F2g`gI8_5$r*)P}S zj-LN4*a$V#38)$Ca04BC*NY9lA!mCUF)B_Nl_l?NX}R)wIc!&xX;9EY43loc5$??M zCK|Y0m36%-yM@y07ioiu8F=T#Uvun#XcnR4xX^oD4)$?906g_K`7LzabjxGf)?p|b zh`kz3d9!0^L#oS6x8zQq`im29MJG(?I`C?AC3L(ErYeePfw(rU4ZbrGL`*J5+-$ZlPoYKz@^ z+}|UEmwHAzkdK0Bl86^CWe?yVd^59Vqf4GCcB|cNbRhH%{WcF84Q{y8tafriTsSZ6BxCXEn-{@TTESO3Ucd}c=o%2My)wfq3K z2xaBn0j&80@WTP@C}c1F&4qcBFV<)?*`Y#liN^u+e2p$9Dvc)!_b`&9bPYBP z%u|2YWWOHQ!j|v*{zh@hDE2X__h2W8wPdC5Bbs4A)B9+6Nki82J{DEokVS#4!tcOW z1hVbO_u36(%OXVHj`<+zQR#ZSQLR|=^%6p}s0M*c0nGCcxL$uH<@(xHTxTsz_#73` zD5Bbz74`D$`~x{e7G_8_S-s!oPNDh>HBF^Q&DqjywH-%Zz7GG3i(9ibzr#J2;K4TmHoAsk=hBKo3k-X*nXI~RUkM%amk?5K_Xh@QxzrRz2p_!Q!E8*4yAskbbK7C(ojZsA9h(a+Ja zh%zah4I{BcXO})l5bBkcz?;7SUP7k0DALoNBy17lzqn^?3)UHd=QXzl-%adIUbJa; z=EpCoY3_lh7l!tmq4mpW8{R4`)_mCko|mDBtu_1mk4>8glzV?~v7&)h zMQ303#G5=Y(87*BgR+~zAY@hJZ9F{K3QGI^K_FBT&{$e=Y9(F6$iM z`ed)wQg%09k1+Dx zZme7>Vg>@T~5=me2n(cL$6WXE4!7`%X>P=fzxerl{kQQh5ov1*QpS^cfZXWpuuubgP$P^_W9H+jyzl|Qr| z{ey3D4(r8IP}WO-)AE;DSvM*wcjp&t?C-^vl13rypzEi$?-<%Q_$*c})_B^Bopdxd z@^p>m*Dl*vtS@N0c0*ei?KDi+lC_wRlQ9^>9|Pv4zm>W5>KCiL@>`UL6KI}dEg0UH zEq5~3m&f*HN1cq-z21CB0@w3p%3x)C)Q{CJV_e{+zu?&SoBie9`s^9*QX)D+sLmPv zS$28YufKx%w3070SYY`b(4JV;w*9id=9}XdsUC*DIGjQ#QqN z@KO)tg!8p$Yk$_C%Ifc9Ua)w}>RHaGYC%IBcli6n4cYDPnqwB+@yM5@)BX7kfh+yl z=P2u`zuURSs&%a|e6S%%Ygb#hBzCzhRzSYCdsf6_wMrO)pL#qS=DxJmU9AmmU8%+V zvG|ASZsTIh@6G<# zC%d+jxyh3Uu)`QAc|bh7K?OPN^-t3$3)4@xWnC*67s#Clusap71y*DxXJaQX{ax1A zD?0CZuj&@M#e*3}i~NQmY=pD1zUfdBo>gcori_`p!P!{d(`hK5W#4wWHSm*Djr(cc zZ%l>U*j;C1uxDc^IK%l#{k-dk{k$m-!A&3SJUzy6NvQaR4Eo(-F*0&Pec6=C{gE~Urtoi2JL)fKC7`pAlSVb31X#MTl?e=YN zwf5w8cv3uD!D=~zN zPk(K^`?T1WRZaa*Vw#JaLp-j$X@q?;u{vQ%+WO~;C*#h?;S`VMg_Z&=$j7P{`~Bsp z{x65QWHCQSy^o?Nd|DPisu;m~d29RqOmCc<^mpB_>QeRCq7RR6(bhX{&H8>c+v$xZ zUvNE8{?jS)Zz1?{sEa9GvNQj2sI%{U5F7s%jw1TSyno#?@_z^t?cCf^{%b7j>qSBL)VavwaogAAVJquu))r#gDwkZ#wF0d|UFWHh~}J_r?YO={W1_ z55#r@72NPn#ckQJI?!-LC6!HaRXbOmieqbdKq%_L4AB;e#S=s$sV8xGvqEM2aD>N)`j`z-4e@iQgZ4N&^VYb>v_t3sjpnLQqo-}^k zX=pc3D1=}q!*L=BIdtviGV}aTF+UXGeztbfN28-zUJ6>7#>!HgAK}0Lz~u;@gj}qR z?SDDjLYW&_`8q)NO<;G1;aqb8mC>#6uiU*m?5gBj8kONhN)CE3f%UJ0bB+EU>1Lf% z$5oxSyD7Jnw)WaA2USU}*cvd;_=(zYN3(l+v_0m1e?7dU9r56$4eW9qqo1^tIn_1# z$na`*JzU%3WEnS^-w(0Qi2mfsfE0S7M$;HQsmkniVWqhJk3ZF(TNe|?lO3pQ93mG? zVU6nH+Md_cNIp7+ZK!9wA+2MJ>tlNs!zOQ?%I?(1j(_fLR^1Q7c`aWO;tN^D47renwa2)I0pZuQ|PP zHS}}VbdJ1jJL%c}=>9gMJE-PU=G(y73AdX^H9#$XY-R~&XFD38Z{ykT#NK0l{Gsv@ zizFtbBJcx$9JPGj=b_Ux`uooI3LEyJ8Sy-!0lVanW_*}mfY!_*CC;~7;j(@<$ z2N*kgzB%5%Vue&rgb$xVGQuFRAp&Ll9DbI`*|cX*a*ZJDr20&{FlSyM&A>TqaznUk z8U9libR?cd2ch+sGTqS2UBSj+HaO6jMB{|#Np6y8_N4+MOnEKAaL2SDj4U4Hej8*Q z{GUGdbMtKV5g*_$E^fKwlit9ic<5hhmECKErAyeu`!6gO-H~duNIQDP`>J=xGi#pq z)9LIvSHd<~3IZKnB>n9E2`e9hE03?C;Eh?fEpK($NGn0{#9js7hIAPvo>M)x!7WjMl1)F<7Z-Pz&r;Fy@c!I4mmDeIHFi@0=rB` z%z;96G6K`?4dBCKAR9~j8cA@ul=|@dl*|A51Yp2@-3M8+8Uf6(Tr~5)9Qk$pTnM0v6ZY! z7zTD{F6$VEQ1D}k5WRjzF}kPL>Y4i|JDoZ7<5R5{K^Al)n0?#<-R!WCKj*ra{e9Q^ zwVy1|6ts10F!K&aHz%_ErqG)PJ?h25mD9_gHMO}U^sscyWy7K8wHgYpP&hwzms{n- z_i=keTSKve>{!UQ+c3+HEo3`egP&i>y0!wpxscrp$64tqO42W~ejW77%|B*L=%|&X z8>t4zMSO+t-}y@So6&V6wVa@UFdUGWj}68JFe%zt*#SFCD>kYzrfz2z*#`JvHl-PG zti~hR2LRZE#+V)B+5I?VPG`rc5caEiEV2oJJl2QUT9(-aBe)HXR)#rl)Ar|Xk6rb% z=m_dMv4|ZW1H&&an%7IK{njED&=+2Qh$6JDMU88*V9TzkvfNI(ewSIpcJN-=#XKs) zI*#`X`1me`sJ+Z#W4bf9{ERtpw zo7EkCdc2se8*Qv?3^kM-_fB|xIHf&W;%>z9936|uN z1qB(=aS?TSwt^zvsa=}u80P)WEPgLXn^7ZK`AAgQgXIu=SrQiTypmq@VN-fRdnLO} zg|yk&NyN7aF4*ClR(y&RUF*P-Zw0Z#jS z&0nW~n#FGjHlm}SSba3VRyJXFi+<_TNAz77%2!sgnrP0|f>4_hmFcG{!ZOysEv!ys z_R+--6Ir5rUTwA&nT|G*fd3%kG)`;Wa(j2mCl z#M&x$C$S;CIU3X0u1+xUwLfMPQC}3>#na`bkk_qxL$(eNWBy&-&ACkmUi9U2i4jrUcJ{UVaHrHp92u%zAwtzJw4{4i! zWp8ZWZ`jrmv@dV#t`3dymwqMv%iix{3=umKUxD1PsgxLik_uu;AjpF&YZdZk>>mUC z-@qa&SlgaO>p0b`9bwLh=xq52Bz_(TT;Uc!E zSMdR$XjjtXnk=Butrm-&{mqtWK~2B4(sp*SzKcZx5&X|Zp?L=C70a1^5Y~T$$_*D$ ztesQeaH`c0wEoPgH;#dCK0}JtNO*+KW@4(&WV2Dy^9_s5Yc1C{;vju*ddXII`Oy~E zzYje1=7YO9Pj+W(`XH3GZNgm|#4eLGfj#MiD=I#t8sUHM)XraX*aRHI^m7gSyst6L z>&8}oTWjgTAr*f8)?onV2wgiNCLU~Mf8$6l7DC;;mj{MR6kv3UVPEybRQUHH!vBhT ztUqFjwKsauI#V3usNo-bB-hq2o%D7njNrWDVb_;gUN>FD{L=`nfUd}QN;+uLWeBS= z5Eq8c@gFrB-_>s%dFJinH;P=#wdT z6|vAXYTiGfaNopv(8Yxz>1wwMg1x+U^QV%NL%vXsC%jbv1$yX+u)v*_Id*tiyN%|; zw%Lu{J@-MIRm}_Wts4d@Cr5 zyW8T@`!*D+q9(_t&8B=Q%~_=>XqVo&9gJ&p{KvO+155Hd@ zuNfIkKPk4bgalj?@{Y656O7f0-1O#a@Am9P0$Sjg;H*`=v67j7lY>5sORrcqWDxEM z4rb~gV}yL6fE^u#G5w{0-5P{DNUtA3HZ;-LS?t*Cc;ZWI-2ZO@#C{!YY$re3&%%co zM})0Ez^`KeT=!8MW1rFV+nX>10{U?PIdrvHQEGSb;ie(WH1A@h@TaN=*u^16w=Vy@ z^ZXcPd{8DIPaxdEduIGLF7Acv9$9ifsQn3k_8W!)n^X(dGRYX_m;gm*6#ela`!ESn z@CW1ykdy9ixZ5oxqaMsaXi@lC*ySWlc>bpkuJi{8Z-{Cfyh<_uWZX8a#3m3c#||VL zhrrQ6LotT0{LX*!P(;gLbNG#<5!HU*aq4VM{GtgD(Y5&z&yI{jq4DhcP-B#@euwm< z3EaxW$v4NO#TD{Dcha5>JFzaq&?LV*&b}UI4AE~)dv--3y8pc}x90Xv>Sy#jB6yyB zKZkkq8`-$4?8$nh7&}Vh#y7vk?YZa>cktz>wGOW?_&P!x9Ngd$e~!@!H;S7LhnZ2V z*YN+Zl5-DfDvIN{?oeh@&X(rf$Wkh(sN7U$FGYx`EbSptgf&YDv}T)@X6ZBu1EnnT zC#aREK~F}ci{1vk=xJrE4F8CTqD&K_7gXQh&K>1eQ2Xa{?#?~u{O-BG$Nik&J?K4? zS~eh9`8#k|ppyrT#?XX~&_sps>(1|x3Z8nRV@r=q%Qy*-I$HqA{`IXG4o^~Mr>_=K_Gj!J4zYMH7{G24 z*8=Z%xOa-MD>LLq^4bA)!YSSgrOKtnR`f2dh+-r#p$DxX&lQg(qS1f02c5ojycCis zIqo&o!&k|aaSzU;={6Ce^M!eClZNN+2w6a7{=uFo_@<3qHms`O!zhrRZ}&A591z4+ zcS`0MBTluyUcHkc8)qUIruk(97BXQ94R4qnrnYvymry)l9oE8ucj(92|Jfc0}KlwL#9DcxtA`o!^z0^AjMG|RTt{%T0WGw z4=wQPQ>lM^<+$YewMq+U+dJ3=-Et333BaUJ*YAP<=I83+;l^cYM*3~RMRF*Q|MvJ! zPmDLvkIPpH<+Vd4N1UR#M+0{9#ty5j(13nnC5VYVyM|h7?*$iEq!0#;6fU-WzNuN| zPbILc#*z8y+{+nM6gtW3zQ)L(eAeS1c6ZwiQzEZuL=^tv~A}cBhl*H8D{fM!=gaO{=QtLO;Qb2t4$c33GiOk5(=zY>ZTV}hW?PnD+tu8lx`mYmX-R&szqj5E1_0q)6(_Q1{$@|>qIJs|pKtRdGSe)Rs@v+%W znuQtfKBb_{7eqMx8v@^)U$+WnEy~x|eoX6rZ!FJ8IRxd|`ddGi^lSF-L^%TG)VknZ zA6^w^{@?Y{z72Sd@M0`A7Kudlvkq=6B(*u zN!WKd&uq<`y53^RrkY~$f}$=9o%2A6_!8tysuW9-orms - {item.title} + +
    {item.title}
    +
    {item.content} diff --git a/components/guide/guideTabs.tsx b/components/guide/guideTabs.tsx index b7bb175..92acfda 100644 --- a/components/guide/guideTabs.tsx +++ b/components/guide/guideTabs.tsx @@ -8,7 +8,7 @@ export const TABS = [ link: '/guide/studies', }, { - title: 'Studierendenleben', + title: 'Leben', link: '/guide/life', }, { diff --git a/components/tour/tourDetails.tsx b/components/tour/tourDetails.tsx index 6e37c5d..da33509 100644 --- a/components/tour/tourDetails.tsx +++ b/components/tour/tourDetails.tsx @@ -16,7 +16,7 @@ import { ScrollArea } from '@/components/ui/scroll-area' import { useTourDetails } from '@/lib/hooks/tourDetails' import { cn } from '@/lib/utils' import { TourData } from '@/pages/tour/[city]' -import useMediaQuery from '@restart/hooks/useMediaQuery' +import { useMediaQuery } from 'usehooks-ts' import Link from 'next/link' import { useCallback, useMemo } from 'react' import { SiApple, SiGooglemaps, SiOpenstreetmap } from 'react-icons/si' diff --git a/components/tour/tourMap.tsx b/components/tour/tourMap.tsx index c978c61..cc5509b 100644 --- a/components/tour/tourMap.tsx +++ b/components/tour/tourMap.tsx @@ -3,7 +3,7 @@ import Link from 'next/link' import Image from 'next/image' import Map, { MapRef, Marker } from 'react-map-gl/maplibre' -import useMediaQuery from '@restart/hooks/useMediaQuery' +import { useMediaQuery } from 'usehooks-ts' import { ChevronsLeft, ImagePlay, MapPin, Menu } from 'lucide-react' import { TourData } from '@/pages/tour/[city]' import { @@ -82,7 +82,10 @@ export default function TourMap({ center, data }: TourMapProps) { const [dialogOpen, showDialog] = useState(true) const [drawerOpen, setDrawer] = useState(false) const [popup, setPopup] = useState(undefined) - const isDesktop = useMediaQuery('(min-width: 1024px)') + const isDesktop = useMediaQuery('(min-width: 1024px)', { + defaultValue: true, + initializeWithValue: true, + }) const mapRef = createRef() diff --git a/data/tour/neuburg.json b/data/tour/neuburg.json index 1bd0f6f..bf5a6f5 100644 --- a/data/tour/neuburg.json +++ b/data/tour/neuburg.json @@ -481,8 +481,8 @@ }, { "title": "Parkplatz Schlösslwiese", - "description_de": "Ein oberirdischer Parkplatz nahe der Elisenbrücke nördlich der Donau mit 170 Stellplätzen. Befindet sich im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "A surface parking lot near the Elisenbrücke north of the Danube with 170 parking spaces. Included in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Ein oberirdischer Parkplatz nahe der Elisenbrücke nördlich der Donau mit 170 Stellplätzen. Befindet sich im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "A surface parking lot near the Elisenbrücke north of the Danube with 170 parking spaces. Included in the parking guidance system of the city. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -491,8 +491,8 @@ }, { "title": "Tiefgarage Spitalplatz", - "description_de": "Eine Tiefgarage unter dem Spitalplatz mit 46 Stellplätzen. Befindet sich im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "An underground car park under the Spitalplatz with 46 parking spaces. Included in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Eine Tiefgarage unter dem Spitalplatz mit 46 Stellplätzen. Befindet sich im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "An underground car park under the Spitalplatz with 46 parking spaces. Included in the parking guidance system of the city. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -501,8 +501,8 @@ }, { "title": "Tiefgarage Schrannenplatz", - "description_de": "Eine Tiefgarage unter dem Schrannenplatz mit 37 Stellplätzen. Befindet sich NICHT im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "An underground garage under the Schrannenplatz with 37 parking spaces. Is NOT included in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Eine Tiefgarage unter dem Schrannenplatz mit 37 Stellplätzen. Befindet sich NICHT im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "An underground garage under the Schrannenplatz with 37 parking spaces. Is NOT included in the parking guidance system of the city. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -511,8 +511,8 @@ }, { "title": "Tiefgarage Fürstgarten", - "description_de": "Eine Tiefgarage direkt am Bücherturm der Stadt mit 90 Stellplätzen. Befindet sich im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "An underground parking garage with 90 parking spaces is located directly at the city's book tower and is part of the city's parking guidance system. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Eine Tiefgarage direkt am Bücherturm der Stadt mit 90 Stellplätzen. Befindet sich im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "An underground parking garage with 90 parking spaces is located directly at the city's book tower and is part of the city's parking guidance system. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -521,8 +521,8 @@ }, { "title": "Parkplatz Lassigny-Kaserne (Campus Neuburg)", - "description_de": "Ein oberirdischer Parkplatz direkt am Campusgelände mit 90 Stellplätzen. Befindet sich im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "A surface parking lot directly on campus with 90 spaces. Included in the city's parking guidance system. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Ein oberirdischer Parkplatz direkt am Campusgelände mit 90 Stellplätzen. Befindet sich im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "A surface parking lot directly on campus with 90 spaces. Included in the city's parking guidance system. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -531,8 +531,8 @@ }, { "title": "Parkplatz Am Graben", - "description_de": "Ein oberirdischer Parkplatz an der Hofgartenstraße mit 90 Stellplätzen. Befindet sich im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "A surface parking lot on Hofgartenstraße with 90 parking spaces. Included in the city's parking guidance system. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Ein oberirdischer Parkplatz an der Hofgartenstraße mit 90 Stellplätzen. Befindet sich im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "A surface parking lot on Hofgartenstraße with 90 parking spaces. Included in the city's parking guidance system. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -541,8 +541,8 @@ }, { "title": "Parkdeck am Hofgarten", - "description_de": "Ein oberirdisches Parkdeck direkt am Hofgarten mit 50 Stellplätzen. Befindet sich NICHT im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "An above-ground parking deck directly at the Hofgarten with 50 parking spaces is NOT in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Ein oberirdisches Parkdeck direkt am Hofgarten mit 50 Stellplätzen. Befindet sich NICHT im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "An above-ground parking deck directly at the Hofgarten with 50 parking spaces is NOT in the parking guidance system of the city. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -551,8 +551,8 @@ }, { "title": "Parkplatz am Bahnhof", - "description_de": "Ein oberirdischer Parkplatz für Park and Ride Fahrgäste der Bahn. Befindet sich NICHT im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "A surface parking lot for Park and Ride rail passengers. Is NOT in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Ein oberirdischer Parkplatz für Park and Ride Fahrgäste der Bahn. Befindet sich NICHT im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "A surface parking lot for Park and Ride rail passengers. Is NOT in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -561,8 +561,8 @@ }, { "title": "Parkplatz am Brandlbad", - "description_de": "Ein oberirdischer Parkplatz direkt am Brandl mit 120 Stellplätzen. Befindet sich NICHT im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": "A surface parking lot directly at the Brandl with 120 parking spaces. Is NOT in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Ein oberirdischer Parkplatz direkt am Brandl mit 120 Stellplätzen. Befindet sich NICHT im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": "A surface parking lot directly at the Brandl with 120 parking spaces. Is NOT in the parking guidance system of the city. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", @@ -571,8 +571,8 @@ }, { "title": "Parkhaus am Parkbad", - "description_de": "Ein Parkhaus direkt am Parkbad mit 240 Stellplätzen. Befindet sich NICHT im Parkleitsystemder Stadt. ([Parkgebühren findet man hier] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", - "description_en": " A parking garage directly at the Parkbad with 240 parking spaces. Is NOT in the parking guidance system of the city. ([Parking fees can be found here] (https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems))", + "description_de": "Ein Parkhaus direkt am Parkbad mit 240 Stellplätzen. Befindet sich NICHT im Parkleitsystem der Stadt. [Parkgebühren](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", + "description_en": " A parking garage directly at the Parkbad with 240 parking spaces. Is NOT in the parking guidance system of the city. [Parking fees](https://www.neuburg-donau.de/leben/parken-in-neuburg#collapse-parkplaetze-ausserhalb-des-parkleitsystems)", "category": "nuetzlich", "video": "", "poster": "", diff --git a/package.json b/package.json index 0682bb3..fc7ec4e 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "@radix-ui/react-scroll-area": "^1.2.0", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-tabs": "^1.1.1", - "@restart/hooks": "^0.4.16", "bootstrap": "^5.1.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", @@ -40,6 +39,7 @@ "react-markdown": "^8.0.3", "tailwind-merge": "^2.5.4", "tailwindcss-animate": "^1.0.7", + "usehooks-ts": "^3.1.0", "vaul": "^1.1.0" }, "devDependencies": { diff --git a/pages/guide/glossary.tsx b/pages/guide/glossary.tsx index d3b16b1..9e7a68c 100644 --- a/pages/guide/glossary.tsx +++ b/pages/guide/glossary.tsx @@ -70,7 +70,7 @@ export default function GlossaryGuide({ data, searchQuery }: GlossaryProps) { icon={} /> - +
    diff --git a/pages/index.tsx b/pages/index.tsx index 1d13bc6..bc36f19 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -319,7 +319,12 @@ export default function Home({ events }: HomeProps) {

    - + Download im App Store - + Get it on Google Play + + + + )} From aff148fe4b921e170b95ac3cce711bb4d54f2046 Mon Sep 17 00:00:00 2001 From: Philipp Opheys Date: Tue, 22 Oct 2024 14:03:57 +0200 Subject: [PATCH 09/15] =?UTF-8?q?=F0=9F=92=84=20update=20scavenger=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ui/input.tsx | 4 +- pages/scavenger/[id].tsx | 153 +++++++++++++++++++++++++-------------- 2 files changed, 100 insertions(+), 57 deletions(-) diff --git a/components/ui/input.tsx b/components/ui/input.tsx index dad6f59..f3fc86a 100644 --- a/components/ui/input.tsx +++ b/components/ui/input.tsx @@ -12,7 +12,7 @@ const Input = React.forwardRef( return (
    @@ -22,7 +22,7 @@ const Input = React.forwardRef( import('react-confetti'), { ssr: false }) interface ScavengerProps { id: string @@ -105,12 +107,12 @@ export const getServerSideProps: GetServerSideProps = async ({ export default function Scavenger({ id, entry }: ScavengerProps) { const [score, setScore] = useState() const [quizzes, setQuizzes] = useState([]) - const [showConfetti, setShowConfetti] = useState(true) - const { width = 0, height = 0 } = useWindowSize() + const [showConfetti, setShowConfetti] = useState(false) + const { width, height } = useWindowSize() const handleShowConfetti = useCallback(() => { setShowConfetti(true) - setTimeout(() => setShowConfetti(false), 1000) + setTimeout(() => setShowConfetti(false), 2000) }, []) useEffect(() => { @@ -143,48 +145,57 @@ export default function Scavenger({ id, entry }: ScavengerProps) { update() }, [entry, id]) - async function changeQuizAnswer( - quiz: Quiz | undefined, - newAnswer: string | undefined - ) { - if (!quiz || !newAnswer) { - return false - } + const changeQuizAnswer = useCallback( + async (quiz: Quiz | undefined, newAnswer: string | undefined) => { + if (!quiz || !newAnswer) { + return false + } - quiz.answer = newAnswer - quiz.isCorrect = checkAnswerSimilarity(newAnswer, quiz.correctAnswers) + quiz.answer = newAnswer + quiz.isCorrect = checkAnswerSimilarity(newAnswer, quiz.correctAnswers) - if (quiz.isCorrect && !quiz.isUnlocked) { - const db = new ScavengerDatabase() - await db.addItemQuestion(`${id}-${quiz.id}`, quiz, quiz.points) - setScore(await db.getScore()) + if (quiz.isCorrect && !quiz.isUnlocked) { + const db = new ScavengerDatabase() + await db.addItemQuestion(`${id}-${quiz.id}`, quiz, quiz.points) + setScore(await db.getScore()) - quiz.isUnlocked = true - } + quiz.isUnlocked = true + } - setQuizzes((prev) => [...prev.filter((q) => q.id !== quiz.id), quiz]) + setQuizzes((prev) => { + const index = prev.findIndex((q) => q.id === quiz.id) + prev[index] = quiz - return quiz.isCorrect - } + return [...prev] + }) - const schema = z.object( - Object.fromEntries( - entry.questions.map((question) => [ - question.id, - z - .string() - .optional() - .refine( - (x) => - changeQuizAnswer( - quizzes.find((q) => q.id === question.id), - x - ), - 'Das ist nicht die richtige Antwort.' - ) - .optional(), - ]) - ) + return quiz.isCorrect + }, + [id] + ) + + const schema = useMemo( + () => + z.object( + Object.fromEntries( + entry.questions.map((question) => [ + question.id, + z + .string() + .optional() + .refine( + (x) => + changeQuizAnswer( + quizzes.find((q) => q.id === question.id), + x + ), + 'Das ist nicht die richtige Antwort.' + ) + .optional(), + ]) + ) + ), + [entry.questions, quizzes, changeQuizAnswer] ) type FormValues = z.infer @@ -199,17 +210,33 @@ export default function Scavenger({ id, entry }: ScavengerProps) { }) const onSubmit = useCallback(() => { - console.log('submit') - - // check if all answers are correct - const allCorrect = quizzes.every((quiz) => quiz.isCorrect) - - if (allCorrect) { - console.log('all correct') + if ( + form.formState.isValid && + Object.values(form.getValues()).some(Boolean) + ) { + handleShowConfetti() + return } - handleShowConfetti() - }, [handleShowConfetti]) + console.log('error') + + // check if every question is empty and show error message + const emptyQuestions = Object.values(form.getValues()) + .map((value) => !value) + .every(Boolean) + console.log(emptyQuestions) + + if (emptyQuestions) { + // get all fields and set them to error + const fields = Object.keys(form.getValues()) + fields.forEach((field) => { + form.setError(field, { + type: 'manual', + message: 'Bitte gib eine Antwort ein.', + }) + }) + } + }, [form, handleShowConfetti]) return (
    @@ -226,19 +253,19 @@ export default function Scavenger({ id, entry }: ScavengerProps) {
    -

    +

    {entry.heading}

    {entry.text} {quizzes.length > 0 && ( - - Fragen + + Fragen Für die richtige Antwort gibt es extra Punkte. @@ -274,6 +301,22 @@ export default function Scavenger({ id, entry }: ScavengerProps) { )} + + + + + + Dein Punktestand + + + + +

    + Dein aktueller Punktestand beträgt:{' '} + {score} Punkte. +

    +
    +