diff --git a/client/src/components/layout/Sidebar.jsx b/client/src/components/layout/Sidebar.jsx index 4a513af..68d2dbf 100644 --- a/client/src/components/layout/Sidebar.jsx +++ b/client/src/components/layout/Sidebar.jsx @@ -3,7 +3,7 @@ import { ColorModeButton } from "@/components/ui/color-mode.jsx"; import { useState } from "react"; import { NavLink } from "react-router-dom"; import Tooltip from "../ui/Tooltip.jsx"; -import { Mountain, House, Earth, MapPin, ShieldUser, Menu } from 'lucide-react'; +import { Mountain, House, Earth, MapPin, ShieldUser, Menu, PanelLeftClose, PanelLeftOpen } from 'lucide-react'; const SIDEBAR_DEFAULT_BUTTONS = [ { icon: House, name: "Home", url: "/home" }, @@ -26,7 +26,7 @@ export default function Sidebar() { return ( - {/* Menu Trigger */} - - - + {/* Navigation Buttons */} {visibleButtons.map((button) => { const Icon = button.icon; return ( - + // - + // ); })} + + {/* Menu Trigger */} + + {isOpen ? : } + - {/* Theme Toggler */} - + {/* Theme Toggler */} + + ); } \ No newline at end of file diff --git a/client/src/constants/widgetRegistry.jsx b/client/src/constants/widgetRegistry.jsx index 5b547bd..3ee9d66 100644 --- a/client/src/constants/widgetRegistry.jsx +++ b/client/src/constants/widgetRegistry.jsx @@ -78,7 +78,7 @@ export const WIDGET_REGISTRY = { // The baseline data every new VAA widget starts with defaultSettings: { - yAxisScale: 'normal' // Options: 'normal' | 'symlog' + yAxisScale: 'log' // Options: 'normal' | 'symlog' }, allowedSizes: { medium: { w: 6, h: 12 } diff --git a/client/src/theme.js b/client/src/theme.js index a565b37..58ac230 100644 --- a/client/src/theme.js +++ b/client/src/theme.js @@ -33,38 +33,107 @@ const sidebarRecipe = defineSlotRecipe({ base: { root: { // 1. Semi-transparent backgrounds - bg: { base: "linear-gradient(to bottom right, #BBBBBB4C, #FFFFFF4C)", _dark: "rgba(20, 20, 20, 0.4)" }, + bg: { base: "linear-gradient(to bottom right, #99000040 20%, #FF660040 60%, #EEEE0040 100%)", _dark: "rgba(20, 20, 20, 0.4)" }, // 2. The glass blur effect backdropFilter: "blur(12px)", - WebkitBackdropFilter: "blur(12px)", // For Safari compatibility + WebkitBackdropFilter: "blur(12px)", - // 3. Subtle semi-transparent borders to catch the light + // 3. Subtle semi-transparent borders border: "1px solid", - borderColor: { base: "rgba(255, 255, 255, 0.3)", _dark: "rgba(255, 255, 255, 0.1)" }, + borderColor: { base: "rgba(255, 255, 255, 0.8)", _dark: "rgba(255, 255, 255, 0.1)" }, + + // CRITICAL: Remove the right border so it doesn't draw a line through your cutout + borderRight: "none", - // Your existing layout properties borderRadius: "2xl", - boxShadow: "0 4px 30px rgba(0, 0, 0, 0.1)", // A softer shadow helps the glass pop + // boxShadow: "0 4px 30px rgba(0, 0, 0, 0.1)", + // boxShadow: "-10px 4px 30px rgba(0, 0, 0, 0.1)", width: "100%", height: "calc(100% - 16px)", margin: "8px", display: "flex", flexDirection: "column", justifyContent: "start", - alignItems: "start", + alignItems: "stretch", gap: 2, - p: 2, + + // CRITICAL: Adjust padding and overflow to allow the button to touch the right edge + pl: 2, // Keep left padding + py: 2, // Keep top/bottom padding + pr: 0, // Remove right padding + overflow: "visible", // Allows the curved corner patches to render outside the button zIndex: 10, }, buttons: { + position: "relative", // Required to anchor the corner patches bg: "transparent", - _hover: {bg: "{testButton}", color: "{textInverted}"}, - "&.active": {bg: "{testButton}", color: "{textInverted}"}, - fontSize: "xl", + + transition: "background-color 0.4s ease, color 0.4s ease", + + "& svg": { + transition: "stroke-width 0.4s ease" + }, + + _hover: { + bg: "rgba(255, 255, 255, 0.1)", + color: "{text}", + fontWeight: "semibold", + "& svg": { + strokeWidth: "3" + } + }, + + fontSize: "l", color: {base: "{text}"}, variant: "ghost", width: "100%", + + // Flat on the right, rounded on the left + borderRightRadius: "0", + borderLeftRadius: "4xl", + + "&.active": { + bg: "{testBackground}", + color: "{textInverted}", + + _hover: { + bg: "{testBackground}", + color: "{textInverted}", + fontWeight: "normal", + "& svg": { + strokeWidth: "2" // Keeps the active icon at normal thickness on hover + } + }, + + // The Top Inverted Curve + _before: { + content: '""', + position: "absolute", + right: "-1px", + top: "-25px", + width: "25px", + height: "25px", + bg: "inherit", // This forces the curve to match {testButton} + WebkitMaskImage: "radial-gradient(circle at top left, transparent 25px, black 25.5px)", + maskImage: "radial-gradient(circle at top left, transparent 25px, black 25.5px)", + pointerEvents: "none", + }, + + // The Bottom Inverted Curve + _after: { + content: '""', + position: "absolute", + right: "-1px", + bottom: "-25px", + width: "25px", + height: "25px", + bg: "inherit", + WebkitMaskImage: "radial-gradient(circle at bottom left, transparent 25px, black 25.5px)", + maskImage: "radial-gradient(circle at bottom left, transparent 25px, black 25.5px)", + pointerEvents: "none", + } + }, }, } }); @@ -192,7 +261,7 @@ const config = defineConfig({ text: {value: {base: "#000000", _dark: "lightgrey"}}, textInverted: {value: "#000000"}, icon: {value: {base: "#000000", _dark: "lightgrey"}}, - testBackground: { value: {base: "linear-gradient(to bottom right, #BBBBBB, #FFFFFF)", _dark: "#191613"} }, + testBackground: { value: {base: "#F9F9F9", _dark: "#191613"} }, testSidebar: { value: {base: "#FBFBFB", _dark: "#272421"} }, testButton: { value: {base: "#FFFFFF", _dark: "#C09754"} },