aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/components/sidebar-menu.tsx
diff options
context:
space:
mode:
authorshu <nvcsadjkojf@outlook.com>2026-09-07 15:48:36 +0800
committershu <nvcsadjkojf@outlook.com>2026-09-07 15:48:36 +0800
commit481402e09fe760634b826b09e302e2e1bfec88b1 (patch)
tree9b55025bfcd6acd2c5d795f057de27028b422603 /src/components/sidebar-menu.tsx
feat: initialize React Spectrum template with layouts and showcases
Diffstat (limited to 'src/components/sidebar-menu.tsx')
-rw-r--r--src/components/sidebar-menu.tsx35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/components/sidebar-menu.tsx b/src/components/sidebar-menu.tsx
new file mode 100644
index 0000000..604c002
--- /dev/null
+++ b/src/components/sidebar-menu.tsx
@@ -0,0 +1,35 @@
+import iconStyles from './menu-icon.module.css'
+import { useMatches } from 'react-router'
+import { SideNav, SideNavItem, SideNavItemContent, SideNavItemLink, Text } from '@react-spectrum/s2/SideNav'
+import { defaultExpandedKeys, menuItems, type NavigationItem, type PageMetadata } from '../route-config'
+
+function renderItem(item: NavigationItem, level = 0) {
+ const Icon = item.Icon
+ const content = (
+ <>
+ {Icon && <Icon UNSAFE_className={level === 0 ? iconStyles.icon : undefined} />}
+ <Text>{item.title}</Text>
+ </>
+ )
+
+ return (
+ <SideNavItem key={item.id} id={item.id} href={item.path} textValue={item.title}>
+ <SideNavItemContent>
+ {item.path ? <SideNavItemLink>{content}</SideNavItemLink> : content}
+ </SideNavItemContent>
+ {item.children?.map((child) => renderItem(child, level + 1))}
+ </SideNavItem>
+ )
+}
+
+function SidebarMenu() {
+ const currentPage = useMatches().at(-1)?.handle as PageMetadata | undefined
+
+ return (
+ <SideNav aria-label="Pages" selectedRoute={currentPage?.path ?? null} defaultExpandedKeys={defaultExpandedKeys}>
+ {menuItems.map((item) => renderItem(item))}
+ </SideNav>
+ )
+}
+
+export default SidebarMenu