Merge branch 'feature/settings-menu' into 'main'

Feature/settings menu

See merge request vkuchenik/website-framework!7
This commit is contained in:
Dan Hansen
2025-07-14 22:03:30 +00:00
5 changed files with 79 additions and 23 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ export default function CanvasHeader() {
as="header" as="header"
position="sticky" position="sticky"
top="0" top="0"
zIndex="banner" // zIndex="banner"
bg="white" bg="white"
borderBottom="1px solid" borderBottom="1px solid"
borderColor="gray.200" borderColor="gray.200"
+1 -1
View File
@@ -10,7 +10,7 @@ const navItems = [
export function CanvasHeaderNav() { export function CanvasHeaderNav() {
return ( return (
<HStack as="nav" spacing={6}> <HStack as="nav" gap="8">
{navItems.map(({ label, href }) => ( {navItems.map(({ label, href }) => (
<Link key={href} href={href} fontWeight="medium"> <Link key={href} href={href} fontWeight="medium">
{label} {label}
+43 -14
View File
@@ -1,21 +1,50 @@
import { IconButton, Box } from "@chakra-ui/react"; // This component displays a drop down menu when clicked, with custom functionality
// for 'Add Widget', 'Edit Widgets', and 'Remove Widgets'. This component will
// control settings related to the Widgets on the main canvas.
import { Button, Menu, Portal } from "@chakra-ui/react";
import { FiSettings } from "react-icons/fi"; import { FiSettings } from "react-icons/fi";
export function SettingsButton(props) { export function SettingsButton(props) {
const handleAddWidget = () => {
console.log("Add Widget clicked");
// TODO: Implement widget-adding logic
}
const handleEditWidgdets = () => {
console.log("Edit Widgets clicked")
// TODO: Implement widget-editing logic
}
const handleDeleteWidgets = () => {
console.log("Delete Widgets clicked");
// TODO: Implement widget-deletion logic
}
return ( return (
<IconButton // This uses Chakra's built in menu component
aria-label="Settings" <Menu.Root>
size="sm" <Menu.Trigger asChild>
variant="ghost" <Button variant="ghost" size="md">
color="gray.600" <FiSettings />
_hover={{ </Button>
bg: "gray.100", </Menu.Trigger>
color: "gray.800", <Portal>
}} <Menu.Positioner>
{...props} <Menu.Content>
> <Menu.Item onClick={handleAddWidget} value="addwidget">Add Widget</Menu.Item>
<FiSettings /> <Menu.Item onClick={handleEditWidgdets} value ="editwidget">Edit Widgets</Menu.Item>
</IconButton> <Menu.Item
onClick={handleDeleteWidgets}
color="fg.error"
_hover={{ bg: "bg.error", color: "fg.error "}}
>
Delete Widgets
</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
); );
} }
+20 -5
View File
@@ -1,5 +1,5 @@
import { Box, Button, Avatar, HStack, Stack, Text } from "@chakra-ui/react" import { Box, Button, Avatar, HStack, Stack, Text, Menu, Portal } from "@chakra-ui/react"
export default function Header() { export default function Header() {
return ( return (
@@ -20,10 +20,25 @@ export default function Header() {
<Text color="#19332D" fontWeight="bold" textStyle="lg">{user.name}</Text> <Text color="#19332D" fontWeight="bold" textStyle="lg">{user.name}</Text>
<Text color="fg.muted" textStyle="sm">{user.email}</Text> <Text color="fg.muted" textStyle="sm">{user.email}</Text>
</Stack> </Stack>
<Avatar.Root> {/* Add a drop down menu to the avatar */}
<Avatar.Fallback name={user.name} /> <Menu.Root>
<Avatar.Image src={user.avatar} /> <Menu.Trigger rounded="full" focusRing="outside">
</Avatar.Root> <Avatar.Root>
<Avatar.Fallback name={user.name} />
<Avatar.Image src={user.avatar} />
</Avatar.Root>
</Menu.Trigger>
<Portal>
<Menu.Positioner zIndex="popover">
<Menu.Content>
<Menu.Item value="account">Account</Menu.Item>
<Menu.Item value="settings">Settings</Menu.Item>
<Menu.Item value="logout">Logout</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
{/* End drop down menu */}
</HStack> </HStack>
</Button> </Button>
</Box> </Box>
+14 -2
View File
@@ -74,7 +74,19 @@ export default function Sidebar () {
gap={4} paddingTop={4} gap={4} paddingTop={4}
paddingLeft={14} paddingRight={3} paddingLeft={14} paddingRight={3}
> >
<CloseButton color="secondary" _hover={{bg: "#EDF1F1"}} size="sm" variant="ghost" left="-10" onClick={() => setIsOpen(!isOpen)}></CloseButton> {/* <CloseButton color="secondary" _hover={{bg: "#EDF1F1"}} size="sm" variant="ghost" left="-10" onClick={() => setIsOpen(!isOpen)}></CloseButton> */}
{/* <RxHamburgerMenu color="secondary" _hover={{bg: "#EDF1F1"}} size="sm" variant="ghost" left="-10" onClick={() => setIsOpen(!isOpen)}></RxHamburgerMenu> */}
<Button
aria-lable="Toggle Sidebar"
color="secondary"
_hover={{bg: "#EDF1F1"}}
size="md" variant="ghost"
// left="-10"
ml="auto" // Margin-left: auto, pushes hamburger menu to right side
onClick={() => setIsOpen(!isOpen)}
>
<RxHamburgerMenu />
</Button>
<Button color="#19332D" _hover={activeButton === "Dashboard" ? {bg: "#A4B6B6"}:{bg:"#EDF1F1"}} fontSize="xl" variant="ghost" onClick={() => setActiveButton("Dashboard")} bg={activeButton === "Dashboard" ? "#A4B6B6" : "transparent"}> <Button color="#19332D" _hover={activeButton === "Dashboard" ? {bg: "#A4B6B6"}:{bg:"#EDF1F1"}} fontSize="xl" variant="ghost" onClick={() => setActiveButton("Dashboard")} bg={activeButton === "Dashboard" ? "#A4B6B6" : "transparent"}>
<PushPin fill="white" /> Dashboard <PushPin fill="white" /> Dashboard
</Button> </Button>
@@ -104,7 +116,7 @@ export default function Sidebar () {
alignItems="start" alignItems="start"
gap={4} padding={4} gap={4} padding={4}
> >
<IconButton color="#19332D" _hover={{bg: "#EDF1F1"}} size="sm" variant="ghost" onClick={() => setIsOpen(!isOpen)}> <IconButton color="#19332D" _hover={{bg: "#EDF1F1"}} size="md" variant="ghost" onClick={() => setIsOpen(!isOpen)}>
<RxHamburgerMenu /> <RxHamburgerMenu />
</IconButton> </IconButton>
<IconButton color="#19332D" _hover={activeButton === "Dashboard" ? {bg: "#A4B6B6"}:{bg:"#EDF1F1"}} variant="ghost" onClick={() => setActiveButton("Dashboard")} bg={activeButton === "Dashboard" ? "#A4B6B6" : "transparent"}> <IconButton color="#19332D" _hover={activeButton === "Dashboard" ? {bg: "#A4B6B6"}:{bg:"#EDF1F1"}} variant="ghost" onClick={() => setActiveButton("Dashboard")} bg={activeButton === "Dashboard" ? "#A4B6B6" : "transparent"}>