From b7eafb0f37e332a5273ee5bd225b2c06f4d2f85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Mon, 16 Feb 2026 22:16:08 +0100 Subject: [PATCH] fix: improve sidebar buttons --- apps/start/src/components/feedback-button.tsx | 16 ++--- apps/start/src/components/profile-toggle.tsx | 18 ++--- .../components/sidebar-organization-menu.tsx | 65 +++++++++---------- .../src/components/sidebar-project-menu.tsx | 48 +++++++------- apps/start/src/components/sidebar.tsx | 56 +++++++++------- apps/start/src/routes/index.tsx | 24 +++---- 6 files changed, 119 insertions(+), 108 deletions(-) diff --git a/apps/start/src/components/feedback-button.tsx b/apps/start/src/components/feedback-button.tsx index 2c4d33f5..23432512 100644 --- a/apps/start/src/components/feedback-button.tsx +++ b/apps/start/src/components/feedback-button.tsx @@ -1,15 +1,12 @@ -import { op } from '@/utils/op'; import { useRouteContext } from '@tanstack/react-router'; -import { SparklesIcon } from 'lucide-react'; -import { Button } from './ui/button'; +import { cn } from '@/lib/utils'; +import { op } from '@/utils/op'; -export function FeedbackButton() { +export function FeedbackButton({ className }: { className?: string }) { const context = useRouteContext({ strict: false }); return ( - + ); } diff --git a/apps/start/src/components/profile-toggle.tsx b/apps/start/src/components/profile-toggle.tsx index 92f476b3..160e4798 100644 --- a/apps/start/src/components/profile-toggle.tsx +++ b/apps/start/src/components/profile-toggle.tsx @@ -1,4 +1,5 @@ -import { Button } from '@/components/ui/button'; +import { CheckIcon, UserIcon } from 'lucide-react'; +import { themeConfig } from './theme-provider'; import { DropdownMenu, DropdownMenuContent, @@ -10,11 +11,9 @@ import { DropdownMenuSubTrigger, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; -import { useTheme } from '@/hooks/use-theme'; -import { CheckIcon, UserIcon } from 'lucide-react'; - import { useLogout } from '@/hooks/use-logout'; -import { themeConfig } from './theme-provider'; +import { useTheme } from '@/hooks/use-theme'; +import { cn } from '@/lib/utils'; interface Props { className?: string; @@ -27,10 +26,13 @@ export function ProfileToggle({ className }: Props) { return ( - + @@ -44,9 +46,9 @@ export function ProfileToggle({ className }: Props) { {themes.map((themeOption) => ( setTheme(themeOption.key)} - className="capitalize" > {themeOption.icon} {themeOption.label} diff --git a/apps/start/src/components/sidebar-organization-menu.tsx b/apps/start/src/components/sidebar-organization-menu.tsx index bd46546b..a6dfa1ca 100644 --- a/apps/start/src/components/sidebar-organization-menu.tsx +++ b/apps/start/src/components/sidebar-organization-menu.tsx @@ -1,21 +1,15 @@ +import { Link, useNavigate } from '@tanstack/react-router'; +import { AnimatePresence, motion } from 'framer-motion'; import { + ChevronDownIcon, CogIcon, CreditCardIcon, LayoutListIcon, + PlusIcon, UsersIcon, WorkflowIcon, } from 'lucide-react'; - -import { Button } from '@/components/ui/button'; -import { useAppContext } from '@/hooks/use-app-context'; -import { useAppParams } from '@/hooks/use-app-params'; -import { pushModal } from '@/modals'; -import type { RouterOutputs } from '@/trpc/client'; -import { cn } from '@/utils/cn'; -import { Link, useNavigate, useRouteContext } from '@tanstack/react-router'; -import { AnimatePresence, motion } from 'framer-motion'; -import { ChevronDownIcon, PlusIcon } from 'lucide-react'; -import { useCallback, useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { Badge } from './ui/badge'; import { DropdownMenu, @@ -23,6 +17,11 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from './ui/dropdown-menu'; +import { Button } from '@/components/ui/button'; +import { useAppContext } from '@/hooks/use-app-context'; +import { pushModal } from '@/modals'; +import type { RouterOutputs } from '@/trpc/client'; +import { cn } from '@/utils/cn'; export default function SidebarOrganizationMenu({ organization, @@ -34,35 +33,35 @@ export default function SidebarOrganizationMenu({ return ( <>
Projects
Settings
{!isSelfHosted && (
Billing
@@ -74,20 +73,20 @@ export default function SidebarOrganizationMenu({ )}
Members
Integrations
@@ -138,20 +137,20 @@ export function ActionCTAButton() { - + {ACTIONS.map((action) => ( {action.label} diff --git a/apps/start/src/components/sidebar-project-menu.tsx b/apps/start/src/components/sidebar-project-menu.tsx index e1d480fb..50498c89 100644 --- a/apps/start/src/components/sidebar-project-menu.tsx +++ b/apps/start/src/components/sidebar-project-menu.tsx @@ -1,5 +1,3 @@ -import { Button } from '@/components/ui/button'; -import { pushModal } from '@/modals'; import type { IServiceDashboards } from '@openpanel/db'; import { useNavigate } from '@tanstack/react-router'; import { AnimatePresence, motion } from 'framer-motion'; @@ -30,6 +28,8 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from './ui/dropdown-menu'; +import { Button } from '@/components/ui/button'; +import { pushModal } from '@/modals'; interface SidebarProjectMenuProps { dashboards: IServiceDashboards; @@ -40,38 +40,42 @@ export default function SidebarProjectMenu({ }: SidebarProjectMenuProps) { return ( <> -
Analytics
- +
+ Analytics +
+ - - - - - -
Manage
+ + + + + +
+ Manage +
- + - + ); } @@ -143,20 +147,20 @@ export function ActionCTAButton() { - + {ACTIONS.map((action) => ( {action.label} diff --git a/apps/start/src/components/sidebar.tsx b/apps/start/src/components/sidebar.tsx index cc7869eb..2649bd91 100644 --- a/apps/start/src/components/sidebar.tsx +++ b/apps/start/src/components/sidebar.tsx @@ -1,6 +1,3 @@ -import { useAppContext } from '@/hooks/use-app-context'; -import { useTRPC } from '@/integrations/trpc/react'; -import { cn } from '@/utils/cn'; import type { IServiceOrganization } from '@openpanel/db'; import { useQuery } from '@tanstack/react-query'; import { Link, useLocation, useParams } from '@tanstack/react-router'; @@ -17,6 +14,9 @@ import SidebarProjectMenu, { ActionCTAButton as ActionProjectCTAButton, } from './sidebar-project-menu'; import { Button } from './ui/button'; +import { useAppContext } from '@/hooks/use-app-context'; +import { useTRPC } from '@/integrations/trpc/react'; +import { cn } from '@/utils/cn'; export function Sidebar() { const { organizationId, projectId } = useParams({ strict: false }); @@ -24,7 +24,7 @@ export function Sidebar() { // Get organizations data const { data: organizations = [] } = useQuery( - trpc.organization.list.queryOptions(), + trpc.organization.list.queryOptions() ); // Get projects data when we have an organization @@ -86,67 +86,75 @@ export function SidebarContainer({ return ( <> -
+
{children} - -
-
- - +
+
+ -
-
-
); diff --git a/apps/start/src/routes/index.tsx b/apps/start/src/routes/index.tsx index 4327dd5a..e040477f 100644 --- a/apps/start/src/routes/index.tsx +++ b/apps/start/src/routes/index.tsx @@ -1,3 +1,5 @@ +import { useSuspenseQuery } from '@tanstack/react-query'; +import { createFileRoute, Link, redirect } from '@tanstack/react-router'; import FullPageLoadingState from '@/components/full-page-loading-state'; import { LogoSquare } from '@/components/logo'; import { PageHeader } from '@/components/page-header'; @@ -6,11 +8,9 @@ import { useLogout } from '@/hooks/use-logout'; import { useNumber } from '@/hooks/use-numer-formatter'; import { useTRPC } from '@/integrations/trpc/react'; import { createTitle } from '@/utils/title'; -import { useQuery, useSuspenseQuery } from '@tanstack/react-query'; -import { Link, createFileRoute, redirect } from '@tanstack/react-router'; export const Route = createFileRoute('/')({ - beforeLoad: async ({ context }) => { + beforeLoad: ({ context }) => { if (!context.session.session) { throw redirect({ to: '/login' }); } @@ -28,7 +28,7 @@ export const Route = createFileRoute('/')({ context.trpc.organization.list.queryOptions(undefined, { staleTime: 0, gcTime: 0, - }), + }) ) .catch(() => []); @@ -50,28 +50,28 @@ function LandingPage() { const trpc = useTRPC(); const logout = useLogout(); const { data: organizations } = useSuspenseQuery( - trpc.organization.list.queryOptions(), + trpc.organization.list.queryOptions() ); const number = useNumber(); return ( -
-
+
+
- +
{organizations?.map((org) => (
{org.name} @@ -89,7 +89,7 @@ function LandingPage() {
-