diff --git a/client/App.tsx b/client/App.tsx index 19ef91a..7e93b54 100644 --- a/client/App.tsx +++ b/client/App.tsx @@ -99,7 +99,7 @@ function AdminShell({ children }: { children: ReactNode }) { const location = useLocation(); return ( -
+
diff --git a/client/pages/AboutPage.tsx b/client/pages/AboutPage.tsx index 53b8691..08c17a2 100644 --- a/client/pages/AboutPage.tsx +++ b/client/pages/AboutPage.tsx @@ -113,7 +113,7 @@ export default function AboutPage() {
- {about?.name || 'BillTracker'} + {about?.name || 'Bill Tracker'} {about?.description || ''} @@ -146,7 +146,7 @@ export default function AboutPage() {

Produced with AI assistance

- BillTracker is self-hosted software for personal bill planning and history. This product was produced with the assistance of AI. + Bill Tracker is self-hosted software for personal bill planning and history. This product was produced with the assistance of AI.

diff --git a/client/pages/AnalyticsPage.tsx b/client/pages/AnalyticsPage.tsx index bbdb2cb..f0c7b1f 100644 --- a/client/pages/AnalyticsPage.tsx +++ b/client/pages/AnalyticsPage.tsx @@ -586,7 +586,7 @@ export default function AnalyticsPage() { return (
-

BillTracker Analytics

+

Bill Tracker Analytics

{formatRange(data?.range)}

{filterSummary}

Visible charts: {activeCharts}

@@ -804,7 +804,7 @@ export default function AnalyticsPage() { )}
- Generated from BillTracker Analytics on {new Date(data?.generated_at || Date.now()).toLocaleString()}. + Generated from Bill Tracker Analytics on {new Date(data?.generated_at || Date.now()).toLocaleString()}.
); diff --git a/client/pages/LoginPage.tsx b/client/pages/LoginPage.tsx index 8d6e891..bd7ed5a 100644 --- a/client/pages/LoginPage.tsx +++ b/client/pages/LoginPage.tsx @@ -8,6 +8,8 @@ import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { APP_VERSION } from '@/lib/version'; +import { BRAND } from '@/lib/brand'; +import { BrandMark } from '@/components/brand/Brand'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog'; @@ -191,17 +193,16 @@ export default function LoginPage() { }; return ( -
+
{/* Logo / Brand */} -
- BillTracker +
+ +

+ {BRAND.tagline} +

{/* TOTP step — shown after password is accepted */} @@ -264,14 +265,14 @@ export default function LoginPage() { {/* Sign-in card — hidden while auth mode resolves or during TOTP step */} {!totpChallenge && (authMode === null ? ( -
+
Loading…
) : ( -
+
-

Sign in

+

Sign in

{localEnabled ? 'Enter your credentials to continue.' : `Continue with ${providerName}.`}

diff --git a/client/pages/RoadmapPage.tsx b/client/pages/RoadmapPage.tsx index bc2655d..6c68d5a 100644 --- a/client/pages/RoadmapPage.tsx +++ b/client/pages/RoadmapPage.tsx @@ -460,7 +460,7 @@ export default function RoadmapPage() { rel="noopener noreferrer" className="text-primary hover:underline underline-offset-4" > - BillTracker ↗ + Bill Tracker ↗

diff --git a/client/pages/SummaryPage.tsx b/client/pages/SummaryPage.tsx index c438291..cb2612b 100644 --- a/client/pages/SummaryPage.tsx +++ b/client/pages/SummaryPage.tsx @@ -482,7 +482,7 @@ export default function SummaryPage() { return (
-

BillTracker Summary

+

Bill Tracker Summary

{monthLabel(selected.year, selected.month)}

{generatedLabel &&

Generated {generatedLabel}

}
diff --git a/client/pages/TrackerPage.tsx b/client/pages/TrackerPage.tsx index 244f263..d314a95 100644 --- a/client/pages/TrackerPage.tsx +++ b/client/pages/TrackerPage.tsx @@ -13,6 +13,7 @@ import { downloadFile } from '@/lib/download'; import { formatUSD, asDollars, type Dollars } from '@/lib/money'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; +import { EmptyState, PageHeader, StatusDot } from '@/components/ui/app-primitives'; import SearchFilterPanel from '@/components/SearchFilterPanel'; import { Skeleton } from '@/components/ui/Skeleton'; import { @@ -791,20 +792,17 @@ export default function TrackerPage() {
{reorderAnnouncement}
{/* ── Header ── */} -
-
-

- Monthly Overview -

-

+ {MONTHS[month - 1]} - {year} -

-

- {rows.length} {rows.length === 1 ? 'bill' : 'bills'} -

-
- + {year} + + )} + glyph="tracker" + meta={`${rows.length} ${rows.length === 1 ? 'bill' : 'bills'}`} + actions={(
-
+ )} + /> {showSearchSort && ( setIncomeModalOpen(true)} className={cn( - 'flex-1 min-w-0 relative overflow-hidden rounded-xl border px-5 py-4 shadow-sm shadow-black/15 transition-all duration-300 text-left', + 'metric-card min-w-0 flex-1 text-left transition-all duration-200', 'hover:ring-2 hover:ring-primary/30 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', Number(bankTracking.remaining ?? 0) >= 0 - ? 'border-emerald-500/30 bg-card/95' - : 'border-destructive/30 bg-card/95', + ? 'border-emerald-500/25 bg-emerald-500/[0.07]' + : 'border-destructive/30 bg-destructive/[0.07]', )} title="Click to see income breakdown" > -
= 0 ? 'text-emerald-500' : 'text-destructive')} /> -

+

{bankTracking.account_name}

- - - - + Live
@@ -1194,35 +1189,35 @@ export default function TrackerPage() { {/* ── Fetch error state ── */} {isError && ( -
-
- -
-

Failed to load tracker data

-

{error?.message || 'An unexpected error occurred.'}

- -
+ refetch()} + className="gap-1.5 text-xs border-destructive/30 hover:bg-destructive/10 hover:text-destructive hover:border-destructive/50" + > + + Try again + + )} + /> )} {/* ── Empty state ── */} {!isError && rows.length === 0 && data != null && ( -
-
- -
-

No bills this month

- - Add a bill - -
+ + Add a bill + + )} + /> )} {/* ── Buckets — year and month passed so Row can open the correct monthly state dialog ── */} @@ -1260,19 +1255,17 @@ export default function TrackerPage() { )} {/* ── Filtered-to-empty state — bills exist this month but none match the active filters/search ── */} {!isError && !loading && rows.length > 0 && first.length === 0 && second.length === 0 && ( -
-
- -
-

No bills match your filters

-

{rows.length} bill{rows.length === 1 ? '' : 's'} this month are hidden by the current search or filters.

- {hasFilters && ( - - )} -
+ ) : undefined} + /> )} {!isError && (first.length > 0 || second.length > 0) && (