This is an automated email from the ASF dual-hosted git repository.
twice pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks-controller.git
The following commit(s) were added to refs/heads/unstable by this push:
new 9ae1849 feat(webui/header): move tabs to right & add breadcrumb
navigation (#314)
9ae1849 is described below
commit 9ae18494266a4f6df5f645636b6f7ab61eb6deca
Author: Agnik Misra <[email protected]>
AuthorDate: Wed Jun 4 09:16:42 2025 +0530
feat(webui/header): move tabs to right & add breadcrumb navigation (#314)
* Redesigned header: moved tabs to right and added breadcrumb
* prettier fix
---------
Co-authored-by: abc <[email protected]>
---
webui/src/app/globals.css | 40 ++++++-
webui/src/app/layout.tsx | 2 +
webui/src/app/page.tsx | 6 +-
webui/src/app/ui/banner.tsx | 199 ++++++++++++++++++++++++++---------
webui/src/app/ui/breadcrumb.tsx | 225 ++++++++++++++++++++++++++++++++++++++++
webui/src/app/ui/footer.tsx | 1 +
webui/src/app/ui/nav-links.tsx | 51 ++++++++-
webui/src/app/ui/sidebar.tsx | 8 +-
8 files changed, 467 insertions(+), 65 deletions(-)
diff --git a/webui/src/app/globals.css b/webui/src/app/globals.css
index 3f2afaa..a6f0c72 100644
--- a/webui/src/app/globals.css
+++ b/webui/src/app/globals.css
@@ -78,7 +78,6 @@
background: #777;
}
-/* smooth transitions for dark mode */
body {
transition: background-color 0.3s ease;
}
@@ -91,12 +90,19 @@ body {
.MuiAppBar-root {
transition:
background-color 0.3s ease,
- color 0.3s ease !important;
+ color 0.3s ease,
+ height 0.3s ease,
+ box-shadow 0.3s ease,
+ border-bottom 0.3s ease !important;
}
.dark .MuiAppBar-root {
- background-color: var(--primary-dark, #1565c0) !important;
- opacity: 0.9;
+ background-color: rgba(21, 101, 192, 0.95) !important;
+}
+
+.navbar-dark-mode {
+ background-color: rgba(21, 101, 192, 0.95) !important;
+ color: white !important;
}
.dark .MuiAppBar-root,
@@ -119,3 +125,29 @@ body {
.MuiAppBar-root[class*="navbar-dark-mode"] {
background-color: #1565c0 !important;
}
+
+.MuiButton-root,
+.MuiIconButton-root,
+.MuiListItemButton-root {
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;
+}
+
+.MuiButton-root:focus-visible,
+.MuiIconButton-root:focus-visible {
+ outline: 2px solid rgba(25, 118, 210, 0.5);
+ outline-offset: 2px;
+}
+
+img {
+ transition: all 0.3s ease;
+}
+
+.interactive-element {
+ transition:
+ transform 0.2s ease,
+ opacity 0.2s ease;
+}
+.interactive-element:hover {
+ transform: translateY(-2px);
+ opacity: 0.95;
+}
diff --git a/webui/src/app/layout.tsx b/webui/src/app/layout.tsx
index d2b4bef..6059eb0 100644
--- a/webui/src/app/layout.tsx
+++ b/webui/src/app/layout.tsx
@@ -24,6 +24,7 @@ import Banner from "./ui/banner";
import { Container } from "@mui/material";
import { ThemeProvider } from "./theme-provider";
import Footer from "./ui/footer";
+import Breadcrumb from "./ui/breadcrumb";
const inter = Inter({ subsets: ["latin"] });
@@ -47,6 +48,7 @@ export default function RootLayout({
maxWidth={false}
disableGutters
>
+ <Breadcrumb />
{children}
<Footer />
</Container>
diff --git a/webui/src/app/page.tsx b/webui/src/app/page.tsx
index 945f7fa..64ac1dd 100644
--- a/webui/src/app/page.tsx
+++ b/webui/src/app/page.tsx
@@ -102,10 +102,10 @@ export default function Home() {
<Image
src="/logo.svg"
alt="Kvrocks Logo"
- layout="fill"
- objectFit="contain"
+ fill
+ className="animate-[pulse_4s_ease-in-out_infinite]
object-contain"
priority
- className="animate-[pulse_4s_ease-in-out_infinite]"
+ style={{ objectFit: "contain" }}
/>
</div>
diff --git a/webui/src/app/ui/banner.tsx b/webui/src/app/ui/banner.tsx
index 904b969..9badd30 100644
--- a/webui/src/app/ui/banner.tsx
+++ b/webui/src/app/ui/banner.tsx
@@ -31,6 +31,7 @@ import FolderIcon from "@mui/icons-material/Folder";
import MenuBookIcon from "@mui/icons-material/MenuBook";
import { usePathname } from "next/navigation";
import { useEffect, useState } from "react";
+import Link from "next/link";
const links = [
{
@@ -55,6 +56,7 @@ export default function Banner() {
const { isDarkMode, toggleTheme } = useTheme();
const pathname = usePathname();
const [mounted, setMounted] = useState(false);
+ const [scrolled, setScrolled] = useState(false);
useEffect(() => {
const storedTheme = localStorage.getItem("theme");
@@ -65,80 +67,179 @@ export default function Banner() {
document.getElementById("navbar")?.classList.add("navbar-dark-mode");
}
+ const handleScroll = () => {
+ if (window.scrollY > 10) {
+ setScrolled(true);
+ } else {
+ setScrolled(false);
+ }
+ };
+
+ window.addEventListener("scroll", handleScroll);
setMounted(true);
- }, []);
- // Generate breadcrumb from pathname
- const breadcrumbs = pathname.split("/").filter(Boolean);
+ return () => {
+ window.removeEventListener("scroll", handleScroll);
+ };
+ }, []);
return (
<AppBar
position="fixed"
elevation={0}
id="navbar"
- className={`backdrop-blur-sm transition-colors duration-300 ${
- isDarkMode
- ? "navbar-dark-mode bg-opacity-95"
- : "bg-white bg-opacity-95 text-gray-800"
- }`}
+ className="transition-all duration-300"
sx={{
- bgcolor: isDarkMode
- ? "rgba(21, 101, 192, 0.98) !important"
- : "rgba(255, 255, 255, 0.98)",
- backdropFilter: "blur(8px)",
- borderBottom: isDarkMode
- ? "1px solid rgba(30, 64, 175, 0.3)"
- : "1px solid rgba(229, 231, 235, 0.6)",
+ backdropFilter: "blur(10px)",
+ backgroundColor: isDarkMode
+ ? scrolled
+ ? "rgba(21, 101, 192, 0.95)"
+ : "rgba(21, 101, 192, 0.85)"
+ : scrolled
+ ? "rgba(255, 255, 255, 0.95)"
+ : "rgba(255, 255, 255, 0.85)",
+ boxShadow: scrolled
+ ? isDarkMode
+ ? "0 4px 20px rgba(0,0,0,0.2)"
+ : "0 4px 20px rgba(0,0,0,0.1)"
+ : "none",
+ borderBottom: scrolled
+ ? "none"
+ : isDarkMode
+ ? "1px solid rgba(255,255,255,0.1)"
+ : "1px solid rgba(0,0,0,0.05)",
+ height: scrolled ? "60px" : "72px",
}}
>
- <Container maxWidth={false}>
- <Toolbar className="flex justify-between">
- <div className="flex items-center">
- <Image src="/logo.svg" width={40} height={40}
alt="logo" className="mr-4" />
- <Typography
- variant="h6"
- component="div"
- className="hidden font-medium text-primary
dark:text-primary-light sm:block"
- >
- Apache Kvrocks Controller
- </Typography>
- </div>
+ <Container maxWidth={false} sx={{ px: { xs: 2, md: 4 } }}>
+ <Toolbar
+ disableGutters
+ sx={{
+ height: scrolled ? "60px" : "72px",
+ minHeight: "unset !important",
+ transition: "height 0.3s ease",
+ }}
+ >
+ <Link
+ href="/"
+ className="flex items-center no-underline
transition-all duration-300"
+ >
+ <Box className="relative flex items-center
transition-all duration-300">
+ <Image
+ src="/logo.svg"
+ width={scrolled ? 36 : 40}
+ height={scrolled ? 36 : 40}
+ alt="Apache Kvrocks"
+ className={`mr-3 transition-all duration-300 ${
+ isDarkMode ? "brightness-110 filter" : ""
+ }`}
+ style={{ height: "auto" }} // Add style to
maintain aspect ratio
+ />
+ <Box className="flex flex-col">
+ <Typography
+ variant={scrolled ? "subtitle1" : "h6"}
+ component="div"
+ sx={{
+ lineHeight: 1.2,
+ letterSpacing: "0.01em",
+ fontSize: scrolled ? "1rem" :
"1.125rem",
+ fontWeight: 500,
+ transition: "all 0.3s ease",
+ color: isDarkMode ? "#fff" : "#1976d2",
+ }}
+ className="hidden sm:block"
+ >
+ Apache Kvrocks
+ </Typography>
+ <Typography
+ variant="caption"
+ sx={{
+ fontSize: scrolled ? "0.7rem" :
"0.75rem",
+ opacity: scrolled ? 0.9 : 1,
+ fontWeight: 500,
+ transition: "all 0.3s ease",
+ color: isDarkMode ?
"rgba(255,255,255,0.8)" : "#42a5f5",
+ }}
+ className="hidden sm:block"
+ >
+ Controller
+ </Typography>
+ </Box>
+ </Box>
+ </Link>
+
+ <Box sx={{ flexGrow: 1 }} />
- <Box className="hidden items-center space-x-1 md:flex">
- <NavLinks links={links} />
+ <Box className="hidden items-center gap-1 md:flex">
+ <NavLinks links={links} scrolled={scrolled} />
</Box>
<Box className="flex items-center">
- {breadcrumbs.length > 0 && (
- <Box className="mr-4 hidden items-center
rounded-md bg-gray-100 px-4 py-1 text-sm dark:bg-dark-border md:flex">
- {breadcrumbs.map((breadcrumb, i) => (
- <Typography
- key={i}
- variant="body2"
- className="text-gray-500
dark:text-gray-400"
- >
- {i > 0 && " / "}
- {breadcrumb}
- </Typography>
- ))}
- </Box>
- )}
-
<Tooltip title="Toggle dark mode">
- <IconButton onClick={toggleTheme} color="inherit"
size="small">
- {isDarkMode ? <Brightness7Icon /> :
<Brightness4Icon />}
+ <IconButton
+ onClick={toggleTheme}
+ size="small"
+ sx={{
+ width: scrolled ? 32 : 36,
+ height: scrolled ? 32 : 36,
+ padding: 0.75,
+ backgroundColor: isDarkMode
+ ? "rgba(255,255,255,0.1)"
+ : "rgba(0,0,0,0.05)",
+ transition: "all 0.3s ease",
+ "&:hover": {
+ backgroundColor: isDarkMode
+ ? "rgba(255,255,255,0.2)"
+ : "rgba(0,0,0,0.08)",
+ },
+ marginLeft: 1,
+ borderRadius: "50%",
+ }}
+ >
+ {isDarkMode ? (
+ <Brightness7Icon
+ fontSize="small"
+ sx={{ color: "rgba(255,255,255,0.9)" }}
+ />
+ ) : (
+ <Brightness4Icon
+ fontSize="small"
+ sx={{ color: "rgba(0,0,0,0.7)" }}
+ />
+ )}
</IconButton>
</Tooltip>
<Tooltip title="GitHub Repository">
<IconButton
- color="inherit"
href="https://github.com/apache/kvrocks-controller"
target="_blank"
size="small"
- className="ml-2"
+ sx={{
+ width: scrolled ? 32 : 36,
+ height: scrolled ? 32 : 36,
+ padding: 0.75,
+ backgroundColor: isDarkMode
+ ? "rgba(255,255,255,0.1)"
+ : "rgba(0,0,0,0.05)",
+ transition: "all 0.3s ease",
+ "&:hover": {
+ backgroundColor: isDarkMode
+ ? "rgba(255,255,255,0.2)"
+ : "rgba(0,0,0,0.08)",
+ },
+ marginLeft: 1,
+ borderRadius: "50%",
+ }}
>
- <GitHubIcon />
+ <GitHubIcon
+ fontSize="small"
+ sx={{
+ color: isDarkMode
+ ? "rgba(255,255,255,0.9)"
+ : "rgba(0,0,0,0.7)",
+ }}
+ />
</IconButton>
</Tooltip>
</Box>
diff --git a/webui/src/app/ui/breadcrumb.tsx b/webui/src/app/ui/breadcrumb.tsx
new file mode 100644
index 0000000..da7f20f
--- /dev/null
+++ b/webui/src/app/ui/breadcrumb.tsx
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+"use client";
+
+import { Box, Typography, Chip, Paper } from "@mui/material";
+import { usePathname } from "next/navigation";
+import Link from "next/link";
+import { useState, useEffect } from "react";
+import HomeIcon from "@mui/icons-material/Home";
+import ChevronRightIcon from "@mui/icons-material/ChevronRight";
+import FolderIcon from "@mui/icons-material/Folder";
+import StorageIcon from "@mui/icons-material/Storage";
+import DnsIcon from "@mui/icons-material/Dns";
+import DeviceHubIcon from "@mui/icons-material/DeviceHub";
+import { fetchClusters, listShards, listNodes } from "@/app/lib/api";
+
+interface BreadcrumbItem {
+ name: string;
+ displayName: string;
+ url: string;
+ icon: React.ReactNode | null;
+ isNumeric: boolean;
+ isLast: boolean;
+}
+
+export default function Breadcrumb() {
+ const pathname = usePathname();
+ const [breadcrumbItems, setBreadcrumbItems] =
useState<BreadcrumbItem[]>([]);
+ const [loading, setLoading] = useState(false);
+
+ useEffect(() => {
+ if (pathname === "/") {
+ setBreadcrumbItems([]);
+ setLoading(false);
+ return;
+ }
+
+ const generateBreadcrumbs = async () => {
+ setLoading(true);
+ const pathSegments = pathname.split("/").filter(Boolean);
+
+ if (pathSegments.length === 0) {
+ setBreadcrumbItems([]);
+ setLoading(false);
+ return;
+ }
+
+ const items: BreadcrumbItem[] = [];
+
+ for (let index = 0; index < pathSegments.length; index++) {
+ const segment = pathSegments[index];
+ const url = `/${pathSegments.slice(0, index + 1).join("/")}`;
+ const isLast = index === pathSegments.length - 1;
+ const isNumeric = !isNaN(Number(segment));
+
+ let icon = null;
+ let displayName = segment;
+
+ if (index === 0 && segment === "namespaces") {
+ icon = <FolderIcon fontSize="small"
className="text-primary/70" />;
+ displayName = "Namespaces";
+ } else if (segment === "clusters") {
+ icon = <StorageIcon fontSize="small"
className="text-primary/70" />;
+ displayName = "Clusters";
+ } else if (segment === "shards") {
+ icon = <DnsIcon fontSize="small"
className="text-primary/70" />;
+ displayName = "Shards";
+ } else if (segment === "nodes") {
+ icon = <DeviceHubIcon fontSize="small"
className="text-primary/70" />;
+ displayName = "Nodes";
+ } else if (isNumeric) {
+ const prevSegment = pathSegments[index - 1];
+ if (prevSegment === "shards") {
+ displayName = `Shard ${parseInt(segment) + 1}`;
+ icon = null;
+ } else if (prevSegment === "nodes") {
+ displayName = `Node ${parseInt(segment) + 1}`;
+ icon = null;
+ } else {
+ displayName = `ID: ${segment}`;
+ icon = null;
+ }
+ } else {
+ // For namespace and cluster names, capitalize first letter
+ displayName = segment.charAt(0).toUpperCase() +
segment.slice(1);
+
+ const prevSegment = pathSegments[index - 1];
+ if (prevSegment === "namespaces") {
+ icon = null;
+ } else if (prevSegment === "clusters") {
+ icon = null;
+ }
+ }
+
+ items.push({
+ name: segment,
+ displayName,
+ url,
+ icon,
+ isNumeric,
+ isLast,
+ });
+ }
+
+ setBreadcrumbItems(items);
+ setLoading(false);
+ };
+
+ generateBreadcrumbs();
+ }, [pathname]);
+
+ if (pathname === "/" || breadcrumbItems.length === 0) return null;
+
+ return (
+ <Paper elevation={0} className="mt-4 w-full border-0 bg-white px-6
py-3 dark:bg-dark-paper">
+ <Box className="flex items-center overflow-x-auto py-1 pt-2">
+ <Link
+ href="/"
+ className="flex items-center text-gray-600
transition-colors hover:text-primary dark:text-gray-300
dark:hover:text-primary-light"
+ >
+ <HomeIcon fontSize="small" className="mr-2" />
+ <Typography variant="body2" className="font-medium">
+ Home
+ </Typography>
+ </Link>
+
+ {breadcrumbItems.map((item, index) => (
+ <Box key={index} className="flex items-center">
+ <ChevronRightIcon
+ fontSize="small"
+ className="mx-3 text-gray-400 dark:text-gray-500"
+ />
+
+ {item.isLast ? (
+ <Box className="flex items-center">
+ {item.icon && <span
className="mr-2">{item.icon}</span>}
+ {item.isNumeric ? (
+ <Chip
+ label={item.displayName}
+ size="small"
+ className="border border-primary/20
font-medium dark:border-primary-dark/30"
+ sx={{
+ height: "24px",
+ backgroundColor: (theme) =>
+ theme.palette.mode === "dark"
+ ? "rgba(21, 101, 192,
0.95)"
+ : "rgba(25, 118, 210,
0.08)",
+ color: (theme) =>
+ theme.palette.mode === "dark"
+ ? "#ffffff"
+ : "#1976d2",
+ "& .MuiChip-label": {
+ px: 1.5,
+ fontSize: "0.75rem",
+ fontWeight: 600,
+ },
+ }}
+ />
+ ) : (
+ <Typography
+ variant="body2"
+ className="font-semibold"
+ sx={{
+ backgroundColor: (theme) =>
+ theme.palette.mode === "dark"
+ ? "rgba(21, 101, 192,
0.95)"
+ : "rgba(25, 118, 210,
0.08)",
+ color: (theme) =>
+ theme.palette.mode === "dark"
+ ? "#ffffff"
+ : "#1976d2",
+ padding: "4px 10px",
+ borderRadius: "16px",
+ }}
+ >
+ {item.displayName}
+ </Typography>
+ )}
+ </Box>
+ ) : item.name === "clusters" ||
+ item.name === "shards" ||
+ item.name === "nodes" ? (
+ <Box className="flex items-center">
+ {item.icon && <span
className="mr-2">{item.icon}</span>}
+ <Typography
+ variant="body2"
+ className="font-medium text-gray-500
dark:text-gray-400"
+ >
+ {item.displayName}
+ </Typography>
+ </Box>
+ ) : (
+ <Link
+ href={item.url}
+ className="flex items-center text-gray-600
transition-colors hover:text-primary dark:text-gray-300
dark:hover:text-primary-light"
+ >
+ {item.icon && <span
className="mr-2">{item.icon}</span>}
+ <Typography variant="body2"
className="font-medium">
+ {item.displayName}
+ </Typography>
+ </Link>
+ )}
+ </Box>
+ ))}
+ </Box>
+ </Paper>
+ );
+}
diff --git a/webui/src/app/ui/footer.tsx b/webui/src/app/ui/footer.tsx
index 5ab87db..5c16fa2 100644
--- a/webui/src/app/ui/footer.tsx
+++ b/webui/src/app/ui/footer.tsx
@@ -76,6 +76,7 @@ const Logo = ({ logo }: { logo: footerLogo }) => (
width={logo.width}
alt={logo.alt}
className="mt-4"
+ style={{ width: "auto" }}
/>
</Link>
</div>
diff --git a/webui/src/app/ui/nav-links.tsx b/webui/src/app/ui/nav-links.tsx
index 50227cb..ee5aa55 100644
--- a/webui/src/app/ui/nav-links.tsx
+++ b/webui/src/app/ui/nav-links.tsx
@@ -25,6 +25,7 @@ import { usePathname } from "next/navigation";
export default function NavLinks({
links,
+ scrolled = false,
}: {
links: Array<{
url: string;
@@ -32,6 +33,7 @@ export default function NavLinks({
icon?: React.ReactNode;
_blank?: boolean;
}>;
+ scrolled?: boolean;
}) {
const pathname = usePathname();
@@ -50,12 +52,51 @@ export default function NavLinks({
>
<Button
color="inherit"
- className={`mx-1 rounded-full px-4 py-1
transition-colors ${
- isActive
- ? "bg-primary-light/10 text-primary
dark:text-primary-light"
- : "hover:bg-gray-100
dark:hover:bg-dark-border"
- }`}
+ sx={{
+ textTransform: "none",
+ borderRadius: "20px",
+ paddingLeft: scrolled ? 2 : 2.5,
+ paddingRight: scrolled ? 2 : 2.5,
+ paddingTop: scrolled ? 0.6 : 0.8,
+ paddingBottom: scrolled ? 0.6 : 0.8,
+ fontSize: scrolled ? "0.875rem" : "0.9rem",
+ letterSpacing: "0.01em",
+ fontWeight: 500,
+ marginX: 0.5,
+ transition: "all 0.3s ease",
+ backgroundColor: isActive
+ ? (theme) =>
+ theme.palette.mode === "dark"
+ ? "rgba(255, 255, 255, 0.15)"
+ : "rgba(25, 118, 210, 0.08)"
+ : "transparent",
+ color: (theme) => {
+ if (theme.palette.mode === "dark") {
+ return isActive ? "#fff" : "rgba(255,
255, 255, 0.9)";
+ }
+ return isActive ? "#1976d2" : "rgba(0, 0,
0, 0.7)";
+ },
+ "&:hover": {
+ backgroundColor: (theme) =>
+ theme.palette.mode === "dark"
+ ? "rgba(255, 255, 255, 0.2)"
+ : "rgba(25, 118, 210, 0.12)",
+ boxShadow: isActive
+ ? (theme) =>
+ theme.palette.mode === "dark"
+ ? "0 2px 8px rgba(0, 0, 0,
0.3)"
+ : "0 2px 8px rgba(25, 118,
210, 0.2)"
+ : "none",
+ },
+ boxShadow: isActive
+ ? (theme) =>
+ theme.palette.mode === "dark"
+ ? "0 2px 5px rgba(0, 0, 0, 0.2)"
+ : "0 2px 5px rgba(25, 118, 210,
0.15)"
+ : "none",
+ }}
startIcon={link.icon}
+ size="small"
>
{link.title}
</Button>
diff --git a/webui/src/app/ui/sidebar.tsx b/webui/src/app/ui/sidebar.tsx
index 98e8b98..46018b7 100644
--- a/webui/src/app/ui/sidebar.tsx
+++ b/webui/src/app/ui/sidebar.tsx
@@ -84,7 +84,7 @@ export function NamespaceSidebar() {
return (
<Paper
- className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border shadow-sidebar dark:border-dark-border"
+ className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border dark:border-dark-border"
elevation={0}
square
>
@@ -137,7 +137,7 @@ export function ClusterSidebar({ namespace }: { namespace:
string }) {
return (
<Paper
- className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border shadow-sidebar dark:border-dark-border"
+ className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border dark:border-dark-border"
elevation={0}
square
>
@@ -197,7 +197,7 @@ export function ShardSidebar({ namespace, cluster }: {
namespace: string; cluste
return (
<Paper
- className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border shadow-sidebar dark:border-dark-border"
+ className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border dark:border-dark-border"
elevation={0}
square
>
@@ -275,7 +275,7 @@ export function NodeSidebar({
return (
<Paper
- className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border shadow-sidebar dark:border-dark-border"
+ className="flex h-full w-64 flex-col overflow-hidden border-r
border-light-border dark:border-dark-border"
elevation={0}
square
>