diff --git a/packages/website/app/modules/navigation/main-navigation-menu.tsx b/packages/website/app/modules/navigation/main-navigation-menu.tsx new file mode 100644 index 0000000..be2a33d --- /dev/null +++ b/packages/website/app/modules/navigation/main-navigation-menu.tsx @@ -0,0 +1,59 @@ +import { Menu, Transition } from "@headlessui/react" +import { MenuAlt4Icon } from "@heroicons/react/outline" +import clsx from "clsx" +import { useGuideLinksContext } from "~/modules/navigation/guide-links-context" +import { Popper } from "~/modules/ui/popper" +import { AppLink } from "./app-link" +import { mainLinks } from "./main-links" + +export function MainNavigationMenu() { + const guideLinks = useGuideLinksContext() + return ( + + ( + + + Menu + + )} + renderPopover={() => ( + + + {mainLinks.map((link) => ( + + {({ active }) => ( + + )} + + ))} + +
+
+ {guideLinks.map(({ link }) => ( + + {({ active }) => ( + + )} + + ))} +
+
+ )} + /> +
+ ) +} + +const menuItemClass = ({ active = false }) => + clsx( + clsx`px-3 py-2 transition text-left font-medium block opacity-50`, + active && clsx`opacity-100 bg-black/75 text-emerald-400`, + ) diff --git a/packages/website/app/modules/navigation/main-navigation.tsx b/packages/website/app/modules/navigation/main-navigation.tsx index d0de44d..6e5b1df 100644 --- a/packages/website/app/modules/navigation/main-navigation.tsx +++ b/packages/website/app/modules/navigation/main-navigation.tsx @@ -1,12 +1,10 @@ import { AppLogo } from "~/modules/app/app-logo" -import { useGuideLinksContext } from "~/modules/navigation/guide-links-context" import { linkClass } from "../ui/components" -import { PopoverMenu } from "../ui/popover-menu" import { AppLink } from "./app-link" import { mainLinks } from "./main-links" +import { MainNavigationMenu } from "./main-navigation-menu" export function MainNavigation() { - const guideLinks = useGuideLinksContext() return ( ) diff --git a/packages/website/app/modules/ui/popover-menu.tsx b/packages/website/app/modules/ui/popover-menu.tsx deleted file mode 100644 index f099503..0000000 --- a/packages/website/app/modules/ui/popover-menu.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { MenuAlt4Icon } from "@heroicons/react/outline" -import clsx from "clsx" -import React from "react" -import { linkClass } from "./components" - -export function PopoverMenu({ children }: { children: React.ReactNode }) { - return ( -
- -
- {children} -
-
- ) -} - -PopoverMenu.itemClass = clsx` - px-3 py-2 transition text-left font-medium block - opacity-50 hover:opacity-100 hover:bg-black/30 -` diff --git a/packages/website/app/modules/ui/popper.tsx b/packages/website/app/modules/ui/popper.tsx new file mode 100644 index 0000000..d555f80 --- /dev/null +++ b/packages/website/app/modules/ui/popper.tsx @@ -0,0 +1,41 @@ +import { useRect } from "@reach/rect" +import * as React from "react" +import { Portal } from "~/modules/dom/portal" + +export function Popper({ + renderReference, + renderPopover, +}: { + renderReference: (referenceProps: { + ref: (element: HTMLElement | null | undefined) => void + }) => React.ReactNode + renderPopover: () => React.ReactNode +}) { + const [reference, referenceRef] = React.useState() + const referenceRect = useRect(useValueAsRefObject(reference)) + + return ( + <> + {renderReference({ ref: referenceRef })} + + {referenceRect && ( +
+ {renderPopover()} +
+ )} +
+ + ) +} + +function useValueAsRefObject(value: Value): { readonly current: Value } { + const ref = React.useRef(value) + ref.current = value + return ref +} diff --git a/packages/website/app/root.tsx b/packages/website/app/root.tsx index c108600..069eb29 100644 --- a/packages/website/app/root.tsx +++ b/packages/website/app/root.tsx @@ -73,11 +73,9 @@ export default function App() { -