@@ -2,7 +2,10 @@ import { useSession } from "next-auth/react";
22import React , { useState } from "react" ;
33import CloseIcon from "@mui/icons-material/Close" ;
44import MenuIcon from "@mui/icons-material/Menu" ;
5+ import ExpandLess from "@mui/icons-material/ExpandLess" ;
6+ import ExpandMore from "@mui/icons-material/ExpandMore" ;
57import Box from "@mui/material/Box" ;
8+ import Collapse from "@mui/material/Collapse" ;
69import Drawer from "@mui/material/Drawer" ;
710import IconButton from "@mui/material/IconButton" ;
811import List from "@mui/material/List" ;
@@ -15,6 +18,7 @@ import { MuiLink } from "@/components/MuiLink";
1518import { useIsLoggedIn } from "@/hooks/useIsLoggedIn" ;
1619import { getBaseUrl } from "@/util/url" ;
1720import { ThemeAppearanceToggle } from "./ThemeAppearanceToggle" ;
21+ import { themeDefinitions } from "@/theme" ;
1822
1923/**
2024 * The primary navigation component for the application. This nav is shared
@@ -25,6 +29,7 @@ export const NavPrimary = () => {
2529 const isLoggedIn = useIsLoggedIn ( ) ;
2630
2731 const [ isOpen , setIsOpen ] = useState ( false ) ;
32+ const [ demoThemesOpen , setDemoThemesOpen ] = useState ( false ) ;
2833
2934 const baseUrl = getBaseUrl ( ) ;
3035
@@ -39,6 +44,10 @@ export const NavPrimary = () => {
3944 setIsOpen ( open ) ;
4045 } ;
4146
47+ const toggleDemoThemes = ( ) => {
48+ setDemoThemesOpen ( ! demoThemesOpen ) ;
49+ } ;
50+
4251 const NavItemTitle = ( { text } : { text : string } ) => (
4352 < Box
4453 sx = { {
@@ -94,6 +103,83 @@ export const NavPrimary = () => {
94103 </ MuiLink >
95104 ) ;
96105
106+ const SubmenuItem = ( {
107+ text,
108+ icon,
109+ href,
110+ target = "_self" ,
111+ dataTestId = "" ,
112+ } : {
113+ text : string ;
114+ icon : string ;
115+ href : string ;
116+ target ?: "_self" | "_blank" ;
117+ dataTestId ?: string ;
118+ } ) => (
119+ < MuiLink
120+ href = { href }
121+ target = { target }
122+ sx = { {
123+ textDecoration : "none" ,
124+ } }
125+ >
126+ < ListItem
127+ component = "div"
128+ onClick = { ( ) => {
129+ setIsOpen ( false ) ;
130+ } }
131+ sx = { ( theme ) => ( {
132+ pl : 4 ,
133+ "&:hover" : {
134+ backgroundColor : "black" ,
135+ color : "white" ,
136+ borderRight : `4px solid ${ theme . palette . secondary . main } ` ,
137+ } ,
138+ } ) }
139+ { ...( dataTestId && { "data-testid" : dataTestId } ) }
140+ >
141+ < ListItemIcon >
142+ < Icon icon = { icon } width = { 24 } height = { 24 } />
143+ </ ListItemIcon >
144+ < ListItemText primary = { text } />
145+ </ ListItem >
146+ </ MuiLink >
147+ ) ;
148+
149+ const SubmenuHeader = ( {
150+ text,
151+ icon,
152+ isOpen,
153+ onClick,
154+ dataTestId = "" ,
155+ } : {
156+ text : string ;
157+ icon : string ;
158+ isOpen : boolean ;
159+ onClick : ( ) => void ;
160+ dataTestId ?: string ;
161+ } ) => (
162+ < ListItem
163+ component = "div"
164+ onClick = { onClick }
165+ sx = { ( theme ) => ( {
166+ cursor : "pointer" ,
167+ "&:hover" : {
168+ backgroundColor : "black" ,
169+ color : "white" ,
170+ borderRight : `4px solid ${ theme . palette . secondary . main } ` ,
171+ } ,
172+ } ) }
173+ { ...( dataTestId && { "data-testid" : dataTestId } ) }
174+ >
175+ < ListItemIcon >
176+ < Icon icon = { icon } width = { 36 } height = { 36 } />
177+ </ ListItemIcon >
178+ < ListItemText primary = { text } />
179+ { isOpen ? < ExpandLess /> : < ExpandMore /> }
180+ </ ListItem >
181+ ) ;
182+
97183 return (
98184 < Box >
99185 < IconButton
@@ -146,6 +232,25 @@ export const NavPrimary = () => {
146232 href = { baseUrl }
147233 dataTestId = "NavPrimaryMenuHome"
148234 />
235+ < SubmenuHeader
236+ text = "Demo Themes"
237+ icon = "fluent-color:image-48"
238+ isOpen = { demoThemesOpen }
239+ onClick = { toggleDemoThemes }
240+ dataTestId = "NavPrimaryMenuDemoThemes"
241+ />
242+ < Collapse in = { demoThemesOpen } timeout = "auto" unmountOnExit >
243+ < List component = "div" disablePadding >
244+ { Object . entries ( themeDefinitions ) . map ( ( [ key , theme ] ) => (
245+ < SubmenuItem
246+ text = { theme . name }
247+ icon = { theme . iconifyIcon }
248+ href = { `/demo/${ key } ` }
249+ key = { key }
250+ />
251+ ) ) }
252+ </ List >
253+ </ Collapse >
149254 { isLoggedIn ? (
150255 < >
151256 { session ?. data ?. user ?. slug ? (
0 commit comments