From b79b62bee49a375a09fd66ea39dcdf3c78f2976c Mon Sep 17 00:00:00 2001 From: Eduard Gert Date: Wed, 20 May 2026 09:39:35 +0200 Subject: [PATCH] add default and advanced view items into dropdown --- .../ui/frontend/src/components/IconButton.tsx | 10 +-- .../frontend/src/i18n/locales/en/common.json | 4 + client/ui/frontend/src/layouts/Header.tsx | 81 +++++++++++++++++-- client/ui/main.go | 4 +- 4 files changed, 85 insertions(+), 14 deletions(-) diff --git a/client/ui/frontend/src/components/IconButton.tsx b/client/ui/frontend/src/components/IconButton.tsx index 1153307ac..10a808370 100644 --- a/client/ui/frontend/src/components/IconButton.tsx +++ b/client/ui/frontend/src/components/IconButton.tsx @@ -1,9 +1,8 @@ -import { ComponentType, forwardRef } from "react"; -import { motion, HTMLMotionProps } from "framer-motion"; +import { ButtonHTMLAttributes, ComponentType, forwardRef } from "react"; import { LucideProps } from "lucide-react"; import { cn } from "@/lib/cn"; -type Props = HTMLMotionProps<"button"> & { +type Props = ButtonHTMLAttributes & { icon: ComponentType; iconSize?: number; iconClassName?: string; @@ -14,10 +13,9 @@ export const IconButton = forwardRef(function IconButt ref, ) { return ( - (function IconButt {...props} > - + ); }); diff --git a/client/ui/frontend/src/i18n/locales/en/common.json b/client/ui/frontend/src/i18n/locales/en/common.json index ca330b3db..2ecd6451a 100644 --- a/client/ui/frontend/src/i18n/locales/en/common.json +++ b/client/ui/frontend/src/i18n/locales/en/common.json @@ -82,6 +82,10 @@ "profile.dialog.submit": "Add Profile", "profile.dialog.required": "Please enter a profile name, e.g. Work, Home", + "header.menu.settings": "Settings", + "header.menu.defaultView": "Default View", + "header.menu.advancedView": "Advanced View", + "profile.deregister.title": "Deregister Profile", "profile.deregister.message": "Are you sure you want to deregister \"{name}\"? You will need to log in again to use it.", "profile.deregister.confirm": "Deregister", diff --git a/client/ui/frontend/src/layouts/Header.tsx b/client/ui/frontend/src/layouts/Header.tsx index 3623a6246..daee9fbd1 100644 --- a/client/ui/frontend/src/layouts/Header.tsx +++ b/client/ui/frontend/src/layouts/Header.tsx @@ -1,14 +1,42 @@ -import { SettingsIcon } from "lucide-react"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { + Check, + MoreVertical, + PanelTop, + PanelsRightBottom, + Settings, + type LucideIcon, +} from "lucide-react"; import { WindowManager } from "@bindings/services"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/DropdownMenu"; import { IconButton } from "@/components/IconButton"; import { ProfileDropdown } from "@/components/ProfileDropdown"; import { cn } from "@/lib/cn"; +type ViewMode = "default" | "advanced"; + export const Header = () => { + const { t } = useTranslation(); + const [menuOpen, setMenuOpen] = useState(false); + const [viewMode, setViewMode] = useState("default"); + const openSettings = () => { + setMenuOpen(false); void WindowManager.OpenSettings().catch(() => {}); }; + const selectMode = (mode: ViewMode) => { + setMenuOpen(false); + setViewMode(mode); + }; + return (
{
- + + + + + + +
+ + {t("header.menu.settings")} +
+
+ + selectMode("default")} + /> + selectMode("advanced")} + /> +
+
); }; + +type ViewModeItemProps = { + icon: LucideIcon; + label: string; + selected: boolean; + onSelect: () => void; +}; + +const ViewModeItem = ({ icon: Icon, label, selected, onSelect }: ViewModeItemProps) => ( + +
+ + {label} + {selected && } +
+
+); diff --git a/client/ui/main.go b/client/ui/main.go index d3e5301db..fbd73db28 100644 --- a/client/ui/main.go +++ b/client/ui/main.go @@ -169,8 +169,8 @@ func main() { window := app.Window.NewWithOptions(application.WebviewWindowOptions{ Title: "NetBird", - Width: 310, - Height: 420, + Width: 380, + Height: 590, Hidden: true, BackgroundColour: application.NewRGB(24, 26, 29), URL: "/",