From 23f79c31e089d7e99c77fc9bc68e08888ec34be4 Mon Sep 17 00:00:00 2001 From: null Date: Mon, 6 Jul 2026 12:28:25 -0500 Subject: [PATCH] =?UTF-8?q?feat(ui):=20layout=20refinements=20=E2=80=94=20?= =?UTF-8?q?sidebar,=20nav=20pill,=20command=20palette,=20brand=20block?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/components/CommandPalette.tsx | 74 +++++++++++++++---------- client/components/layout/BrandBlock.tsx | 12 +++- client/components/layout/Layout.tsx | 16 ++++-- client/components/layout/NavPill.tsx | 6 +- client/components/layout/Sidebar.tsx | 65 ++++++++++++++++------ 5 files changed, 118 insertions(+), 55 deletions(-) diff --git a/client/components/CommandPalette.tsx b/client/components/CommandPalette.tsx index 9dc09e6..9337af1 100644 --- a/client/components/CommandPalette.tsx +++ b/client/components/CommandPalette.tsx @@ -12,6 +12,7 @@ import { scheduleLabel, scheduleValue } from '@/lib/billingSchedule'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; +import { BrandGlyph } from '@/components/brand/Brand'; import type { Bill } from '@/types'; // ─── Navigation commands ────────────────────────────────────────────────────── @@ -281,38 +282,47 @@ export default function CommandPalette() { return ( - + Command palette -
- - setQuery(event.target.value)} - onKeyDown={event => { - if (event.key === 'Enter') { - if (billResults[0]) openBills(billResults[0]); - else if (commandResults[0]) runCommand(commandResults[0]); - } - }} - placeholder="Search bills or type a command…" - className="h-9 border-0 bg-transparent px-0 text-base shadow-none focus-visible:ring-0" - /> - {query && ( - - )} +
+
+ +
+

Find your next move

+

Search bills, jump to a month, or open a workspace.

+
+
+
+ + setQuery(event.target.value)} + onKeyDown={event => { + if (event.key === 'Enter') { + if (billResults[0]) openBills(billResults[0]); + else if (commandResults[0]) runCommand(commandResults[0]); + } + }} + placeholder="Search bills, months, pages..." + className="h-9 border-0 bg-transparent px-0 text-base shadow-none focus-visible:ring-0" + /> + {query && ( + + )} +
@@ -322,8 +332,12 @@ export default function CommandPalette() { Loading…
) : !hasResults ? ( -
- No results. +
+
+
+

Nothing matched that search.

+

Try a bill name, amount, category, or month.

) : ( <> diff --git a/client/components/layout/BrandBlock.tsx b/client/components/layout/BrandBlock.tsx index 17d6eef..962d9f7 100644 --- a/client/components/layout/BrandBlock.tsx +++ b/client/components/layout/BrandBlock.tsx @@ -8,12 +8,20 @@ export const BrandBlock = React.memo(function BrandBlock({ adminMode = false }: + + + {adminMode ? 'Admin workspace' : 'Home workspace'} + + + {adminMode ? 'System care and access' : 'Bills, timing, and clarity'} + + {adminMode && ( - + Admin )} diff --git a/client/components/layout/Layout.tsx b/client/components/layout/Layout.tsx index 09052f6..471ee4f 100644 --- a/client/components/layout/Layout.tsx +++ b/client/components/layout/Layout.tsx @@ -2,6 +2,8 @@ import { useState, useEffect } from 'react'; import { Link, Outlet, useLocation } from 'react-router-dom'; import AppNavigation from './Sidebar'; import { api } from '@/api'; +import { APP_VERSION } from '@/lib/version'; +import { BRAND } from '@/lib/brand'; import PageTransition from '@/components/PageTransition'; import { FormatSync } from '@/components/FormatSync'; @@ -45,12 +47,18 @@ export default function Layout({ mainContentId }: { mainContentId?: string }) {
-
- About - Release Notes - + + + + About + Release Notes + +
); diff --git a/client/components/layout/NavPill.tsx b/client/components/layout/NavPill.tsx index b2843cb..2898a80 100644 --- a/client/components/layout/NavPill.tsx +++ b/client/components/layout/NavPill.tsx @@ -30,11 +30,11 @@ export const NavPill = React.memo(function NavPill({ item, onNavigate, badge = 0 end={end} onClick={onNavigate} className={({ isActive }) => cn( - 'inline-flex items-center gap-2 rounded-full px-3 py-2 text-sm font-medium transition-all', + 'inline-flex items-center gap-2 rounded-full border px-3 py-2 text-sm font-medium transition-all', 'focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50', isActive - ? 'bg-primary text-primary-foreground shadow-sm shadow-primary/20' - : 'text-muted-foreground hover:bg-accent/85 hover:text-accent-foreground hover:shadow-sm' + ? 'border-primary/25 bg-primary text-primary-foreground shadow-sm shadow-primary/20' + : 'border-transparent text-muted-foreground hover:border-border/60 hover:bg-accent/85 hover:text-accent-foreground hover:shadow-sm' )} > diff --git a/client/components/layout/Sidebar.tsx b/client/components/layout/Sidebar.tsx index ad993d3..541ce55 100644 --- a/client/components/layout/Sidebar.tsx +++ b/client/components/layout/Sidebar.tsx @@ -7,6 +7,7 @@ import { } from 'lucide-react'; import { api } from '@/api'; import { cn } from '@/lib/utils'; +import { BRAND } from '@/lib/brand'; import { useAuth } from '@/hooks/useAuth'; import { useOverdueCount } from '@/hooks/useQueries'; import { ThemeToggle } from '@/components/ui/theme-toggle'; @@ -77,11 +78,11 @@ function TrackerMenu({ onNavigate, badge = 0, badgeNames = [], items = trackerIt - - {name} + + + {name} + + {adminMode ? 'Admin workspace' : 'Welcome back'} + + {userRole === 'admin' && !adminMode && ( <> @@ -237,11 +247,11 @@ export default function Sidebar({ adminMode = false }: { adminMode?: boolean; ma }, [adminMode]); return ( -
-
+
+
-
+