Card charges were showing as raw masked-card strings with no suggestion.
prettyMerchant/suggestCategory now extract the merchant after the last
:MCI: segment (e.g. "...:MCI:ANTHROPIC 1" -> "ANTHROPIC"), and the
keyword map is grounded in real uncategorized merchants (card-processed
software/cloud, cross-border marketplaces, local lenders, grocers,
carriers, electronics, gaming). Also fixes a Cyrillic \b word-boundary
bug (JS's \b never matches non-ASCII text) and moves CAFE/КАФЕ to the
Coffee rule instead of Food & Drink.
Adds a month navigator and category filter chips to the Тооцоо list, plus a
categorize-review flow at /accounting/review for bulk-assigning categories to
uncategorized merchants (grouped by matchKey, biggest spend first).
Elevate the Profile (Миний) tab and login/register/forgot screens to match
TransactionList's IconChip + Card row pattern:
- Profile: avatar medallion (initial + brand tint) + name/email header,
IconChip menu rows (Тохиргоо/Ангилал/Захиалга) with chevrons, IconChip +
EmptyState connected-banks list.
- Categories/Subscriptions: IconChip rows via categoryStyle, EmptyState for
empty lists, chevron-left back buttons.
- Auth: shared AuthHeader with a tinted monogram + wordmark lockup, more
comfortable field/CTA spacing in AuthForm.
Visual only — no changes to hooks, mutations, or auth actions.
Elevate the Planner page presentation to match the TransactionList
reference: category-limit and savings-goal rows now use IconChip for
the category/goal chip, SectionHeader for the "+" add actions, and
EmptyState for the empty limits/goals states (split from the existing
Mongolian copy, no new strings invented). The unset daily-limit card
now shows a subtle "Лимит тохируулаагүй" hint instead of "0₮ / —".
Pure presentation — usePutBudget's full-categories-echo save and all
mutation/dialog logic are untouched.
- Shell content widens to max-w-6xl on desktop (was phone-strip max-w-2xl)
- Dashboard reflows into a 2-col grid on desktop instead of stretching
- On 401, clear session cookie via logout before redirect (prevents /login<->/home loop when cookie outlives server session)
- Profile 'Subscriptions' -> 'Захиалга'
Default text resolved to white-on-white because globals.css set a background
but no base color, and <html> carried no data-seed attributes. Mirrors
daangn.com's live setup: html[data-seed][data-seed-color-mode] + body
color: var(--seed-color-fg-neutral). Fixes invisible text app-wide.