diff --git a/README.md b/README.md index 3494498..0917dc1 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Username: guest · Password: guest123 ## Screenshots -Screenshots below were refreshed from the linked demo server. +Screenshots below were refreshed from the current product build. ![Login screen](docs/images/login.png) diff --git a/client/components/ReleaseNotesDialog.tsx b/client/components/ReleaseNotesDialog.tsx index bab7119..baa6015 100644 --- a/client/components/ReleaseNotesDialog.tsx +++ b/client/components/ReleaseNotesDialog.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react'; +import { ListFilter, RefreshCw, ShieldCheck, Sparkles, type LucideIcon } from 'lucide-react'; import { Dialog, DialogContent, @@ -11,6 +12,14 @@ import { RELEASE_NOTES } from '@/lib/version'; import { BrandGlyph } from '@/components/brand/Brand'; import { useAuth } from '@/hooks/useAuth'; import { api } from '@/api'; +import type { ReleaseHighlightIcon } from '@/lib/version'; + +const releaseIcon: Record = { + sparkles: Sparkles, + filter: ListFilter, + sync: RefreshCw, + shield: ShieldCheck, +}; export function ReleaseNotesDialog() { const { hasNewVersion, setHasNewVersion } = useAuth(); @@ -55,17 +64,25 @@ export function ReleaseNotesDialog() {
- {RELEASE_NOTES.highlights.map((item, i) => ( -
- -
-

{item.title}

-

{item.desc}

+ {RELEASE_NOTES.highlights.map((item) => { + const Icon = releaseIcon[item.icon]; + return ( +
+ +
+

{item.title}

+

+ {item.desc} +

+
-
- ))} + ); + })}
{RELEASE_NOTES.image && ( diff --git a/client/components/ui/app-primitives.tsx b/client/components/ui/app-primitives.tsx index e444e05..d64061c 100644 --- a/client/components/ui/app-primitives.tsx +++ b/client/components/ui/app-primitives.tsx @@ -146,7 +146,7 @@ export function MetricCard({
{action} -

{value}

+
{value}
{hint &&

{hint}

} ); diff --git a/client/index.css b/client/index.css index c65671a..2f3e712 100644 --- a/client/index.css +++ b/client/index.css @@ -57,7 +57,9 @@ --color-sidebar-border: oklch(var(--sidebar-border)); --color-sidebar-ring: oklch(var(--sidebar-ring)); - --font-sans: var(--font-sans), ui-sans-serif, system-ui, sans-serif; + --font-sans: + Inter, Roboto, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', + sans-serif; --font-serif: var(--font-serif), ui-serif, serif; --font-mono: var(--font-mono), ui-monospace, SFMono-Regular, monospace; @@ -277,7 +279,7 @@ font-family: 'GeorgiaDigits'; src: local('Georgia'); unicode-range: - U+0030- U+0039, + U+0030-0039, /* 0–9 */ U+002C, /* , thousands separator */ U+002E, /* . decimal point */ U+002D, @@ -327,11 +329,11 @@ --sidebar-accent-foreground: 0.205 0.02 190; --sidebar-border: 0.875 0.01 235; --sidebar-ring: 0.64 0.15 154; - --font-sans: 'GeorgiaDigits', Inter, Roboto, ui-sans-serif, system-ui, sans-serif; + --font-sans: + Inter, Roboto, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', + sans-serif; --font-serif: Merriweather, ui-serif, serif; - --font-mono: - 'GeorgiaDigits', 'Roboto Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - monospace; + --font-mono: 'Roboto Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; --radius: 1rem; } diff --git a/client/lib/version.ts b/client/lib/version.ts index 7b034f7..cdb9972 100644 --- a/client/lib/version.ts +++ b/client/lib/version.ts @@ -4,8 +4,10 @@ declare const __APP_VERSION__: string; export const APP_VERSION = __APP_VERSION__; +export type ReleaseHighlightIcon = 'sparkles' | 'filter' | 'sync' | 'shield'; + export interface ReleaseHighlight { - icon: string; + icon: ReleaseHighlightIcon; title: string; desc: string; } @@ -19,42 +21,27 @@ export interface ReleaseNotes { export const RELEASE_NOTES: ReleaseNotes = { version: APP_VERSION, - date: '2026-05-31', + date: '2026-07-10', highlights: [ { - icon: '🚀', - title: 'v0.35.0', - desc: 'Version bump and container rebuild.', + icon: 'sparkles', + title: 'Product brand refresh', + desc: 'Updated the app identity surfaces, README artwork, favicon family, and preview imagery so Bill Tracker presents like one coherent product.', }, { - icon: '🧠', - title: 'Advisory non-bill transaction filters', - desc: '5,000+ advisory patterns with 83 bill-like override terms. High-confidence unmatched transactions show "Probably not a bill" instead of "Create Bill". Medium confidence mutes the button. Lazy in-memory cache, seeded on first startup.', + icon: 'filter', + title: 'Smarter transaction triage', + desc: 'Unmatched bank activity now gets advisory filtering, with bill-like overrides and gentler calls to action for transactions that probably are not bills.', }, { - icon: '🔄', - title: 'SimpleFIN transaction table fix', - desc: "Transaction table now uses fixed column sizing so long text can't push action buttons off-screen. Action buttons are compact icon-only with accessible labels.", + icon: 'sync', + title: 'Steadier SimpleFIN workflows', + desc: 'Transaction tables hold their shape, action buttons stay reachable, and subscription bills can backfill missing payment history from matched bank activity.', }, { - icon: '🔄', - title: 'SimpleFIN payment backfill', - desc: 'Subscription bills with merchant rules now have a Sync Payments button in the edit modal. It scans unmatched SimpleFIN transactions and auto-creates payment records for missing history.', - }, - { - icon: '🛡️', - title: 'Safer financial history', - desc: 'Bill, category, and payment deletes now use confirmations, recovery windows, and undo actions so accidental clicks do not immediately destroy important records.', - }, - { - icon: '🔐', - title: 'Security checks tightened', - desc: 'Logout-all now uses the normal CSRF header, password length rules match the backend, and CSRF SPA documentation now matches the actual cookie/header flow.', - }, - { - icon: '🔑', - title: 'Private login details', - desc: 'Your Profile now shows recent login date, IP, browser, OS, device type, and a short device ID. These details are shown only to you in the app UI.', + icon: 'shield', + title: 'Safer history and privacy details', + desc: 'Destructive actions use clearer confirmation and undo paths, while profile login details remain visible only to the signed-in user.', }, ], image: { diff --git a/docs/images/Analytics.png b/docs/images/Analytics.png index f6c1eb3..6aeedbc 100644 Binary files a/docs/images/Analytics.png and b/docs/images/Analytics.png differ diff --git a/docs/images/Calendar.png b/docs/images/Calendar.png index c7dcddf..f7fea43 100644 Binary files a/docs/images/Calendar.png and b/docs/images/Calendar.png differ diff --git a/docs/images/Data.png b/docs/images/Data.png index 1356aae..27955aa 100644 Binary files a/docs/images/Data.png and b/docs/images/Data.png differ diff --git a/docs/images/Snowball.png b/docs/images/Snowball.png index 89c3e6b..db37a41 100644 Binary files a/docs/images/Snowball.png and b/docs/images/Snowball.png differ diff --git a/docs/images/Subscriptions.png b/docs/images/Subscriptions.png index aee53da..52868cd 100644 Binary files a/docs/images/Subscriptions.png and b/docs/images/Subscriptions.png differ diff --git a/docs/images/login.png b/docs/images/login.png index 2b1d3cd..c78e029 100644 Binary files a/docs/images/login.png and b/docs/images/login.png differ diff --git a/docs/images/tracker.png b/docs/images/tracker.png index 85a1af5..c7c08dd 100644 Binary files a/docs/images/tracker.png and b/docs/images/tracker.png differ diff --git a/img/Analytics.png b/img/Analytics.png index a2b483f..6aeedbc 100644 Binary files a/img/Analytics.png and b/img/Analytics.png differ diff --git a/img/Calendar.png b/img/Calendar.png index 690b874..f7fea43 100644 Binary files a/img/Calendar.png and b/img/Calendar.png differ diff --git a/img/tracker.png b/img/tracker.png index c80cda4..c7c08dd 100644 Binary files a/img/tracker.png and b/img/tracker.png differ