@burdenoff/microfe-brainyrich 2026.828.2 → 2026.830.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Skeleton,\n ResponsiveDialog,\n ResponsiveDialogClose,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n FileText,\n Printer,\n Download,\n Wallet,\n Layers,\n Receipt,\n ChevronDown,\n Users,\n Target,\n TrendingUp,\n CalendarClock,\n Pause,\n Play,\n Plus,\n Sparkles as SparklesIcon,\n Palette,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useBrainyRich } from '../providers/BrainyRichProvider';\nimport {\n useNetWorthSummary,\n useAllTransactions,\n fetchAllAccounts,\n fetchAllHoldings,\n useHouseholds,\n useAccounts,\n useGoals,\n useGoalFundings,\n useScheduledReports,\n useCreateScheduledReport,\n useSetScheduledReportStatus,\n useReportRuns,\n useGenerateReportNow,\n useDownloadReportRunPdf,\n useMyAdvisorBranding,\n useUpsertMyAdvisorBranding,\n} from '../hooks/useBrainyRichApi';\nimport type {\n BraHolding,\n BraTransaction,\n BraHousehold,\n BraAccount,\n BraGoal,\n BraGoalProjection,\n BraTransactionType,\n BraScheduledReport,\n BraReportFrequency,\n BraReportRun,\n BraAdvisorBranding,\n BraUpsertAdvisorBrandingInput,\n} from '../types/bra';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatCompact,\n formatDate,\n deltaToneClass,\n statusBadgeVariant,\n} from './_shared';\nimport {\n DonutChart,\n StatTile,\n TrendBars,\n Sparkline,\n ProgressRing,\n GlassCard,\n FadeIn,\n type VizTone,\n} from '../components/viz';\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\ntype StatementView = 'networth' | 'holdings' | 'transactions' | 'statement' | 'scheduled';\n\n/** Minimal read-query surface the statement sub-cards need for their states. */\ninterface QueryStatus {\n isLoading: boolean;\n isError: boolean;\n refetch: () => void;\n}\n\n// ============================================================================\n// Asset-class presentation (labels + semantic tones) — display only\n// ============================================================================\n\nconst ASSET_CLASS_LABEL: Record<string, string> = {\n EQUITY: 'Equity',\n FIXED_INCOME: 'Fixed Income',\n CASH: 'Cash',\n REAL_ESTATE: 'Real Estate',\n COMMODITY: 'Commodity',\n CRYPTO: 'Crypto',\n ALTERNATIVE: 'Alternatives',\n};\n\nconst ASSET_CLASS_TONE: Record<string, VizTone> = {\n EQUITY: 'brand',\n FIXED_INCOME: 'blue',\n CASH: 'teal',\n REAL_ESTATE: 'warning',\n COMMODITY: 'indigo',\n CRYPTO: 'purple',\n ALTERNATIVE: 'info',\n};\n\nfunction assetClassLabel(ac: string): string {\n return ASSET_CLASS_LABEL[ac] ?? ac.replace(/_/g, ' ');\n}\n\n// ============================================================================\n// Cash-flow derivation — REAL ledger rows bucketed by month\n// ----------------------------------------------------------------------------\n// Inflow = money arriving (deposits, dividends, interest, sale proceeds).\n// Outflow = money leaving (withdrawals, fees, buys). TRANSFER is treated as\n// balance-neutral. Every value comes straight from recorded transactions.\n// ============================================================================\n\nconst INFLOW_TYPES: BraTransactionType[] = ['DEPOSIT', 'DIVIDEND', 'INTEREST', 'SELL'];\nconst OUTFLOW_TYPES: BraTransactionType[] = ['WITHDRAWAL', 'FEE', 'BUY'];\n\nfunction monthKey(iso: string): string | null {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return null;\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction monthLabel(key: string): string {\n const [y, m] = key.split('-').map(Number);\n return new Intl.DateTimeFormat('en-US', { month: 'short' }).format(new Date(y, m - 1, 1));\n}\n\ninterface CashflowDatum {\n label: string;\n inflow: number;\n outflow: number;\n}\n\nfunction buildCashflow(\n txns: BraTransaction[],\n months = 6\n): { bars: CashflowDatum[]; netSeries: number[] } {\n const map = new Map<string, { inflow: number; outflow: number }>();\n for (const t of txns) {\n const k = monthKey(t.tradeDate);\n if (!k) continue;\n const bucket = map.get(k) ?? { inflow: 0, outflow: 0 };\n const amt = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) bucket.inflow += amt;\n else if (OUTFLOW_TYPES.includes(t.type)) bucket.outflow += amt;\n map.set(k, bucket);\n }\n const recent = Array.from(map.keys()).sort().slice(-months);\n const bars = recent.map((k) => {\n const b = map.get(k)!;\n return { label: monthLabel(k), inflow: b.inflow, outflow: b.outflow };\n });\n let run = 0;\n const netSeries = recent.map((k) => {\n const b = map.get(k)!;\n run += b.inflow - b.outflow;\n return run;\n });\n return { bars, netSeries };\n}\n\nfunction cashflowTotals(txns: BraTransaction[]): { inflow: number; outflow: number; net: number } {\n let inflow = 0;\n let outflow = 0;\n for (const t of txns) {\n const a = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) inflow += a;\n else if (OUTFLOW_TYPES.includes(t.type)) outflow += a;\n }\n return { inflow, outflow, net: inflow - outflow };\n}\n\n// ============================================================================\n// Statement math — net worth composition for a set of accounts + their holdings\n// ============================================================================\n\ninterface StatementData {\n netWorth: number;\n invested: number;\n cash: number;\n allocation: { label: string; value: number; tone?: VizTone }[];\n /** Per-account total value (cash + holdings) — used to resolve goal funding %. */\n accountValues: Map<string, number>;\n}\n\nfunction computeStatement(accounts: BraAccount[], holdings: BraHolding[]): StatementData {\n const accountValues = new Map<string, number>();\n let cash = 0;\n for (const a of accounts) {\n accountValues.set(a.id, a.cashBalance);\n cash += a.cashBalance;\n }\n let invested = 0;\n const byClass = new Map<string, number>();\n for (const h of holdings) {\n invested += h.marketValue;\n byClass.set(h.assetClass, (byClass.get(h.assetClass) ?? 0) + h.marketValue);\n accountValues.set(h.accountId, (accountValues.get(h.accountId) ?? 0) + h.marketValue);\n }\n const allocation = Array.from(byClass.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([ac, v]) => ({ label: assetClassLabel(ac), value: v, tone: ASSET_CLASS_TONE[ac] }));\n return { netWorth: cash + invested, invested, cash, allocation, accountValues };\n}\n\nfunction projectionTone(p: BraGoalProjection): VizTone {\n switch (p) {\n case 'AHEAD':\n return 'success';\n case 'BEHIND':\n return 'warning';\n case 'AT_RISK':\n return 'error';\n default:\n return 'brand';\n }\n}\n\n// ============================================================================\n// CSV helpers — client-side export built from REAL rows only\n// ============================================================================\n\nfunction toCsv(headers: string[], rows: (string | number)[][]): string {\n const escape = (cell: string | number) => {\n const s = String(cell ?? '');\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n return [headers, ...rows].map((row) => row.map(escape).join(',')).join('\\n');\n}\n\nfunction downloadCsv(filename: string, csv: string) {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'household'\n );\n}\n\n// ============================================================================\n// Full holdings schedule\n// ----------------------------------------------------------------------------\n// `braListPortfolios`/`braListAccounts` never inline `holdings`, and\n// `braListHoldings` is scoped to a single account/portfolio AND paginated\n// (default page size 50). To build a COMPLETE holdings schedule (every\n// position, not a truncated first page) we enumerate the full account set via\n// the foundation `fetchAllAccounts` pager, then page through each account's\n// holdings via `fetchAllHoldings` and flatten. Real server rows only — no\n// fabrication.\n// ============================================================================\n\nfunction useAllHoldings() {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: ['brainyrich', 'holdings', 'report-all'],\n queryFn: async () => {\n const accounts = await fetchAllAccounts(apiGatewayUrl);\n const perAccount = await Promise.all(\n accounts.map((account) => fetchAllHoldings(apiGatewayUrl, { accountId: account.id }))\n );\n return perAccount.flat();\n },\n });\n return { ...query, data: query.data ?? [] };\n}\n\n// ============================================================================\n// Reports page — real, generatable statement views\n// (net worth / holdings / ledger / client statement)\n// ============================================================================\n\nexport function ReportsPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const [view, setView] = useState<StatementView>('networth');\n const [selectedHouseholdId, setSelectedHouseholdId] = useState<string | undefined>();\n\n const summaryQuery = useNetWorthSummary();\n // Aggregation sources: page through the FULL set so statements + CSV cover\n // every holding and every ledger entry, not a truncated first page.\n const holdingsQuery = useAllHoldings();\n const transactionsQuery = useAllTransactions();\n const householdsQuery = useHouseholds();\n\n const summary = summaryQuery.data;\n const currency = summary?.currency ?? 'USD';\n const households = householdsQuery.data;\n\n // Active household for the Client Statement (defaults to the first one).\n const activeHouseholdId = selectedHouseholdId ?? households[0]?.id;\n const activeHousehold = households.find((h) => h.id === activeHouseholdId);\n\n // Household-scoped sources. React-Query dedupes these against the statement\n // sub-tree, so passing an id here does not double-fetch.\n const householdAccountsQuery = useAccounts({ householdId: activeHouseholdId });\n const householdGoalsQuery = useGoals({ householdId: activeHouseholdId });\n const householdAccounts = householdAccountsQuery.data;\n const householdGoals = householdGoalsQuery.data;\n\n // Holdings schedule: every holding across every account, richest first.\n const holdings: BraHolding[] = useMemo(\n () => holdingsQuery.data.slice().sort((a, b) => b.marketValue - a.marketValue),\n [holdingsQuery.data]\n );\n\n const transactions: BraTransaction[] = useMemo(\n () =>\n transactionsQuery.data\n .slice()\n .sort((a, b) => new Date(b.tradeDate).getTime() - new Date(a.tradeDate).getTime()),\n [transactionsQuery.data]\n );\n\n const cashflow = useMemo(() => buildCashflow(transactions), [transactions]);\n\n // Household slices for the statement (built from already-loaded page data).\n const householdAccountIds = useMemo(\n () => new Set(householdAccounts.map((a) => a.id)),\n [householdAccounts]\n );\n const householdHoldings = useMemo(\n () =>\n holdings\n .filter((h) => householdAccountIds.has(h.accountId))\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue),\n [holdings, householdAccountIds]\n );\n const householdTxns = useMemo(\n () => transactions.filter((tx) => householdAccountIds.has(tx.accountId)),\n [transactions, householdAccountIds]\n );\n const statementData = useMemo(\n () => computeStatement(householdAccounts, householdHoldings),\n [householdAccounts, householdHoldings]\n );\n\n // Header KPIs — premium tiles, net worth carrying an emerald glow + a real\n // cumulative net-cash-flow spark (decorative, aria-hidden inside StatTile).\n const holdingsUnrealized = useMemo(\n () => holdings.reduce((sum, h) => sum + (h.marketValue - h.costBasis), 0),\n [holdings]\n );\n\n // Primary \"Print / Export\" action for the currently selected statement.\n // Each branch emits the COMPLETE dataset (full holdings / full ledger).\n const exportCurrent = () => {\n if (view === 'networth') {\n if (!summary) return;\n const headers = ['Metric', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Total Net Worth', summary.totalNetWorth, currency],\n ['Total Market Value', summary.totalMarketValue, currency],\n ['Total Cash', summary.totalCash, currency],\n ['Account Count', summary.accountCount, ''],\n ...summary.byAssetClass.map((row) => [\n `Asset Class: ${assetClassLabel(row.assetClass)}`,\n row.marketValue,\n currency,\n ]),\n ];\n downloadCsv('brainyrich-net-worth-statement.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'holdings') {\n const headers = [\n 'Symbol',\n 'Name',\n 'Asset Class',\n 'Quantity',\n 'Cost Basis',\n 'Market Value',\n 'Currency',\n ];\n const rows = holdings.map((h) => [\n h.symbol,\n h.name ?? '',\n assetClassLabel(h.assetClass),\n h.quantity,\n h.costBasis,\n h.marketValue,\n h.currency,\n ]);\n downloadCsv('brainyrich-holdings-schedule.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'statement') {\n if (!activeHousehold) return;\n const cur = activeHousehold.currency ?? currency;\n const headers = ['Section', 'Label', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Summary', 'Net Worth', statementData.netWorth, cur],\n ['Summary', 'Invested Value', statementData.invested, cur],\n ['Summary', 'Cash & Liquidity', statementData.cash, cur],\n ...statementData.allocation.map((a) => ['Allocation', a.label, a.value, cur]),\n ...householdHoldings.map((h) => [\n 'Holding',\n `${h.symbol}${h.name ? ` — ${h.name}` : ''}`,\n h.marketValue,\n h.currency,\n ]),\n ...householdGoals.map((g) => ['Goal', g.name, g.targetAmount, g.currency]),\n ];\n downloadCsv(\n `brainyrich-${slugify(activeHousehold.name)}-statement.csv`,\n toCsv(headers, rows)\n );\n return;\n }\n const headers = [\n 'Trade Date',\n 'Type',\n 'Symbol',\n 'Quantity',\n 'Price',\n 'Amount',\n 'Fee',\n 'Currency',\n ];\n const rows = transactions.map((tx) => [\n formatDate(tx.tradeDate),\n tx.type,\n tx.symbol ?? '',\n tx.quantity,\n tx.price,\n tx.amount,\n tx.fee,\n tx.currency,\n ]);\n downloadCsv('brainyrich-transaction-ledger.csv', toCsv(headers, rows));\n };\n\n // The export action only produces a file for a statement that actually has\n // rows; disable it while the active statement is still loading / empty.\n const exportDisabled =\n (view === 'networth' && (summaryQuery.isLoading || !summary)) ||\n (view === 'holdings' && (holdingsQuery.isLoading || holdings.length === 0)) ||\n (view === 'transactions' && (transactionsQuery.isLoading || transactions.length === 0)) ||\n (view === 'statement' && (!activeHousehold || householdAccountsQuery.isLoading));\n\n return (\n <SectionShell\n title={translate('brainyrich.reports.title', 'Reports & Statements')}\n description={translate(\n 'brainyrich.reports.description',\n 'Generate statements directly from your live portfolio data — no fabricated schedules.'\n )}\n actions={\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"sm\"\n disabled={exportDisabled}\n aria-label={translate('brainyrich.reports.actions.export', 'Print / Export')}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.export', 'Print / Export')}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={exportCurrent}>\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.downloadCsv', 'Download CSV')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => window.print()}>\n <Printer className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.print', 'Print statement')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n }\n >\n <FadeIn>\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label={translate('brainyrich.reports.kpis.netWorth', 'Net Worth')}\n value={summary ? formatMoney(summary.totalNetWorth, currency) : '—'}\n spark={cashflow.netSeries}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.marketValue', 'Invested Value')}\n value={summary ? formatMoney(summary.totalMarketValue, currency) : '—'}\n icon={<TrendingUp className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.holdings', 'Holdings on Schedule')}\n value={String(holdings.length)}\n icon={<Layers className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.transactions', 'Ledger Entries')}\n value={String(transactions.length)}\n icon={<Receipt className=\"size-4\" aria-hidden=\"true\" />}\n />\n </div>\n </FadeIn>\n\n <Tabs value={view} onValueChange={(value) => setView(value as StatementView)}>\n <TabsList>\n <TabsTrigger value=\"networth\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.netWorth', 'Net Worth')}\n </TabsTrigger>\n <TabsTrigger value=\"holdings\">\n <Layers className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.holdings', 'Holdings')}\n </TabsTrigger>\n <TabsTrigger value=\"transactions\">\n <Receipt className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.ledger', 'Ledger')}\n </TabsTrigger>\n <TabsTrigger value=\"statement\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.statement', 'Client Statement')}\n </TabsTrigger>\n <TabsTrigger value=\"scheduled\">\n <CalendarClock className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.scheduled', 'Scheduled Reports')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n\n {view === 'networth' ? (\n <NetWorthStatement\n query={summaryQuery}\n cashflow={cashflow.bars}\n netSeries={cashflow.netSeries}\n translate={translate}\n />\n ) : view === 'holdings' ? (\n <HoldingsSchedule\n query={holdingsQuery}\n holdings={holdings}\n unrealized={holdingsUnrealized}\n translate={translate}\n />\n ) : view === 'transactions' ? (\n <TransactionLedger\n query={transactionsQuery}\n transactions={transactions}\n cashflow={cashflow.bars}\n currency={currency}\n translate={translate}\n />\n ) : view === 'statement' ? (\n <ClientStatementPanel\n householdsQuery={householdsQuery}\n households={households}\n activeHousehold={activeHousehold}\n onSelect={setSelectedHouseholdId}\n accountsQuery={householdAccountsQuery}\n goals={householdGoals}\n holdings={householdHoldings}\n transactions={householdTxns}\n statement={statementData}\n translate={translate}\n />\n ) : (\n <ScheduledReportsPanel households={households} translate={translate} />\n )}\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Scheduled client reporting (BOFF-4244) — real backend-generated PDF report\n// runs, plus the advisor-brandable client-portal identity (logo/colors) that\n// stamps both the PDF and `braClientPortalSummary`. Delivery is a real\n// in-app \"report ready\" notification (see report-schedule.ts on the svc) —\n// this platform's transport has no email attachments today, so the PDF is\n// downloaded on demand from `braReportRunPdf` instead.\n// ============================================================================\n\nfunction ScheduledReportsPanel({\n households,\n translate,\n}: {\n households: BraHousehold[];\n translate: Translate;\n}) {\n const scheduledQuery = useScheduledReports();\n const runsQuery = useReportRuns();\n const createSchedule = useCreateScheduledReport();\n const setStatus = useSetScheduledReportStatus();\n const generateNow = useGenerateReportNow();\n const downloadPdf = useDownloadReportRunPdf();\n const brandingQuery = useMyAdvisorBranding();\n const upsertBranding = useUpsertMyAdvisorBranding();\n\n const [createOpen, setCreateOpen] = useState(false);\n const [name, setName] = useState('');\n const [frequency, setFrequency] = useState<BraReportFrequency>('MONTHLY');\n const [householdId, setHouseholdId] = useState<string>('');\n\n const branding = brandingQuery.data;\n\n const submitSchedule = () => {\n if (!name.trim()) return;\n createSchedule.mutate(\n { name: name.trim(), frequency, householdId: householdId || undefined },\n { onSuccess: () => setCreateOpen(false) }\n );\n setName('');\n setFrequency('MONTHLY');\n setHouseholdId('');\n };\n\n return (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-4\">\n <div>\n <CardTitle>\n {translate('brainyrich.reports.scheduled.title', 'Scheduled Client Reports')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.scheduled.description',\n 'Real recurring PDF report generation, regenerated on demand from a stored snapshot — no fabricated schedules.'\n )}\n </CardDescription>\n </div>\n <ResponsiveDialog open={createOpen} onOpenChange={setCreateOpen}>\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.scheduled.new', 'New schedule')}\n </Button>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {translate('brainyrich.reports.scheduled.newTitle', 'New scheduled report')}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {translate(\n 'brainyrich.reports.scheduled.newDescription',\n 'Recurring reports render the same real path as an on-demand generation.'\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"schedule-name\">\n {translate('brainyrich.reports.scheduled.fields.name', 'Name')}\n </Label>\n <Input\n id=\"schedule-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Quarterly household review\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label>\n {translate('brainyrich.reports.scheduled.fields.frequency', 'Frequency')}\n </Label>\n <Select\n value={frequency}\n onValueChange={(v) => setFrequency(v as BraReportFrequency)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"WEEKLY\">Weekly</SelectItem>\n <SelectItem value=\"MONTHLY\">Monthly</SelectItem>\n <SelectItem value=\"QUARTERLY\">Quarterly</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <Label>\n {translate(\n 'brainyrich.reports.scheduled.fields.household',\n 'Household (optional — whole book if omitted)'\n )}\n </Label>\n <Select value={householdId} onValueChange={setHouseholdId}>\n <SelectTrigger>\n <SelectValue placeholder=\"Whole book\" />\n </SelectTrigger>\n <SelectContent>\n {households.map((h) => (\n <SelectItem key={h.id} value={h.id}>\n {h.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <ResponsiveDialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </ResponsiveDialogClose>\n <Button\n onClick={submitSchedule}\n disabled={!name.trim() || createSchedule.isPending}\n >\n {createSchedule.isPending ? 'Creating…' : 'Create schedule'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </CardHeader>\n <CardContent>\n {scheduledQuery.isLoading ? (\n <LoadingState />\n ) : scheduledQuery.isError ? (\n <ErrorState onRetry={() => scheduledQuery.refetch()} />\n ) : scheduledQuery.data.length === 0 ? (\n <EmptyState\n icon={<CalendarClock className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.scheduled.empty', 'No scheduled reports yet')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Frequency</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Next run</TableHead>\n <TableHead>Last run</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {scheduledQuery.data.map((sr: BraScheduledReport) => (\n <TableRow key={sr.id}>\n <TableCell className=\"font-medium\">{sr.name}</TableCell>\n <TableCell>{sr.frequency}</TableCell>\n <TableCell>\n <Badge variant={sr.status === 'ACTIVE' ? 'default' : 'secondary'}>\n {sr.status}\n </Badge>\n </TableCell>\n <TableCell>{formatDate(sr.nextRunAt)}</TableCell>\n <TableCell>{sr.lastRunAt ? formatDate(sr.lastRunAt) : '—'}</TableCell>\n <TableCell className=\"flex justify-end gap-1.5\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={generateNow.isPending}\n onClick={() => generateNow.mutate({ scheduledReportId: sr.id })}\n >\n <SparklesIcon className=\"size-4\" aria-hidden=\"true\" />\n Generate now\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={setStatus.isPending}\n onClick={() =>\n setStatus.mutate({ id: sr.id, pause: sr.status === 'ACTIVE' })\n }\n >\n {sr.status === 'ACTIVE' ? (\n <Pause className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <Play className=\"size-4\" aria-hidden=\"true\" />\n )}\n {sr.status === 'ACTIVE' ? 'Pause' : 'Resume'}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>{translate('brainyrich.reports.runs.title', 'Report Runs')}</CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.runs.description',\n 'Every generated run — download the real, regenerated-on-demand PDF for any GENERATED run.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {runsQuery.isLoading ? (\n <LoadingState />\n ) : runsQuery.isError ? (\n <ErrorState onRetry={() => runsQuery.refetch()} />\n ) : runsQuery.data.length === 0 ? (\n <EmptyState\n icon={<FileText className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.runs.empty', 'No report runs yet')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Period</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Generated</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {runsQuery.data.map((run: BraReportRun) => (\n <TableRow key={run.id}>\n <TableCell>\n {formatDate(run.periodStart)} – {formatDate(run.periodEnd)}\n </TableCell>\n <TableCell>\n <Badge variant={statusBadgeVariant(run.status)}>{run.status}</Badge>\n </TableCell>\n <TableCell>{run.generatedAt ? formatDate(run.generatedAt) : '—'}</TableCell>\n <TableCell className=\"text-right\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={run.status !== 'GENERATED' || downloadPdf.isPending}\n onClick={() => downloadPdf.mutate(run)}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n PDF\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Palette className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.branding.title', 'Client-Portal Branding')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.branding.description',\n 'Stamps both the client portal and generated PDF reports with your firm identity.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {brandingQuery.isLoading ? (\n <LoadingState />\n ) : (\n <AdvisorBrandingForm\n key={branding?.id ?? 'new'}\n branding={branding ?? null}\n isSaving={upsertBranding.isPending}\n onSave={(input) => upsertBranding.mutate(input)}\n />\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Uncontrolled-until-touched branding form. Initial values come from\n * `useState(() => ...)` (a lazy initializer), never from an effect —\n * `key={branding?.id ?? 'new'}` on the parent remounts this component\n * exactly once the query result actually changes, which is the\n * React-idiomatic way to seed edit state from server data without the\n * setState-in-effect cascading-render lint violation.\n */\nfunction AdvisorBrandingForm({\n branding,\n isSaving,\n onSave,\n}: {\n branding: BraAdvisorBranding | null;\n isSaving: boolean;\n onSave: (input: BraUpsertAdvisorBrandingInput) => void;\n}) {\n const [firmName, setFirmName] = useState(() => branding?.firmName ?? '');\n const [primaryColor, setPrimaryColor] = useState(() => branding?.primaryColor ?? '');\n const [contactEmail, setContactEmail] = useState(() => branding?.contactEmail ?? '');\n const [disclaimer, setDisclaimer] = useState(() => branding?.disclaimer ?? '');\n\n return (\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"branding-firm\">Firm name</Label>\n <Input id=\"branding-firm\" value={firmName} onChange={(e) => setFirmName(e.target.value)} />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"branding-color\">Primary color (hex)</Label>\n <Input\n id=\"branding-color\"\n value={primaryColor}\n onChange={(e) => setPrimaryColor(e.target.value)}\n placeholder=\"Primary brand color\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"branding-email\">Contact email</Label>\n <Input\n id=\"branding-email\"\n type=\"email\"\n value={contactEmail}\n onChange={(e) => setContactEmail(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5 md:col-span-2\">\n <Label htmlFor=\"branding-disclaimer\">Disclaimer</Label>\n <Textarea\n id=\"branding-disclaimer\"\n value={disclaimer}\n onChange={(e) => setDisclaimer(e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"md:col-span-2\">\n <Button\n disabled={isSaving}\n onClick={() =>\n onSave({\n firmName: firmName || undefined,\n primaryColor: primaryColor || undefined,\n contactEmail: contactEmail || undefined,\n disclaimer: disclaimer || undefined,\n })\n }\n >\n {isSaving ? 'Saving…' : 'Save branding'}\n </Button>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Net-worth statement — hero figure + allocation donut + asset-class schedule\n// ============================================================================\n\nfunction NetWorthStatement({\n query,\n cashflow,\n netSeries,\n translate,\n}: {\n query: ReturnType<typeof useNetWorthSummary>;\n cashflow: CashflowDatum[];\n netSeries: number[];\n translate: Translate;\n}) {\n const summary = query.data;\n const currency = summary?.currency ?? 'USD';\n\n const allocation = useMemo(() => {\n if (!summary) return [];\n return summary.byAssetClass\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue)\n .map((row) => ({\n label: assetClassLabel(row.assetClass),\n value: row.marketValue,\n tone: ASSET_CLASS_TONE[row.assetClass],\n }));\n }, [summary]);\n\n if (query.isLoading) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n );\n }\n if (query.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => query.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (!summary) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Wallet className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.netWorth.emptyTitle', 'No net-worth data yet')}\n description={translate(\n 'brainyrich.reports.netWorth.emptyDesc',\n 'Link an account and add holdings to generate a net-worth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const asOf = translate('brainyrich.reports.netWorth.asOf', 'as of {date}', {\n date: formatDate(new Date().toISOString()),\n });\n\n return (\n <div className=\"space-y-6\">\n <div className=\"grid gap-6 lg:grid-cols-[1.1fr_1fr]\">\n {/* Hero net-worth figure with emerald glow + real cumulative-flow spark */}\n <FadeIn>\n <GlassCard glow className=\"h-full\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.netWorth.title', 'Net Worth Statement')} — {asOf}\n </p>\n <p className=\"mt-2 text-4xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(summary.totalNetWorth, currency)}\n </p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalMarketValue, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalCash, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.accounts', 'Accounts')}\n <span className=\"font-medium text-text-primary\">{summary.accountCount}</span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <div className=\"mt-5\">\n <p className=\"mb-1 text-[11px] text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.netFlow',\n 'Cumulative net cash flow (recent months)'\n )}\n </p>\n <Sparkline data={netSeries} height={48} />\n </div>\n ) : null}\n </GlassCard>\n </FadeIn>\n\n {/* Allocation donut */}\n <FadeIn index={1}>\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle className=\"text-base\">\n {translate('brainyrich.reports.netWorth.allocation', 'Allocation by Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <DonutChart\n data={allocation}\n centerLabel={translate('brainyrich.reports.netWorth.invested', 'Invested')}\n centerValue={formatCompact(summary.totalMarketValue, currency)}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n\n {/* Asset-class schedule (statement table) */}\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.netWorth.schedule', 'By Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.netWorth.assetClass', 'Asset class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.netWorth.total', 'Total')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {allocation.map((row) => (\n <TableRow\n key={row.label}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell className=\"font-medium text-text-primary\">{row.label}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(row.value, currency)}\n </TableCell>\n </TableRow>\n ))}\n <TableRow>\n <TableCell className=\"font-semibold text-text-primary\">\n {translate('brainyrich.reports.netWorth.totals', 'Totals')}\n </TableCell>\n <TableCell className=\"text-right font-semibold tabular-nums text-status-success-text\">\n {formatMoney(summary.totalMarketValue, currency)}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n\n {/* Cash flow */}\n {cashflow.length > 0 ? (\n <FadeIn index={3}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.cashflow.description',\n 'Inflows and outflows recorded on your ledger, by month.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// Holdings schedule\n// ============================================================================\n\nfunction HoldingsSchedule({\n query,\n holdings,\n unrealized,\n translate,\n}: {\n query: QueryStatus;\n holdings: BraHolding[];\n unrealized: number;\n translate: Translate;\n}) {\n const marketValue = holdings.reduce((sum, h) => sum + h.marketValue, 0);\n const costBasis = holdings.reduce((sum, h) => sum + h.costBasis, 0);\n const currency = holdings[0]?.currency ?? 'USD';\n\n return (\n <div className=\"space-y-6\">\n {!query.isLoading && !query.isError && holdings.length > 0 ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n value={formatMoney(marketValue, currency)}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n value={formatMoney(costBasis, currency)}\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n value={formatMoney(unrealized, currency)}\n delta={costBasis > 0 ? (unrealized / costBasis) * 100 : undefined}\n sparkTone={unrealized >= 0 ? 'success' : 'error'}\n />\n </div>\n </FadeIn>\n ) : null}\n\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Layers className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.holdings.title', 'Holdings Schedule')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.holdings.description',\n 'Every position across your portfolios with cost basis and market value.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : holdings.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((holding) => {\n const gain = holding.marketValue - holding.costBasis;\n return (\n <TableRow\n key={holding.id}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell>\n <div className=\"font-medium text-text-primary\">{holding.symbol}</div>\n {holding.name ? (\n <div className=\"text-xs text-text-secondary\">{holding.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(holding.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {holding.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.costBasis, holding.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.marketValue, holding.currency)}\n </TableCell>\n <TableCell\n className={`text-right tabular-nums font-medium ${deltaToneClass(gain)}`}\n >\n {gain > 0 ? '+' : ''}\n {formatMoney(gain, holding.currency)}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<Layers className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.holdings.emptyTitle', 'No holdings on file')}\n description={translate(\n 'brainyrich.reports.holdings.emptyDesc',\n 'Add holdings to your portfolios to generate a holdings schedule.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Transaction ledger\n// ============================================================================\n\nfunction TransactionLedger({\n query,\n transactions,\n cashflow,\n currency,\n translate,\n}: {\n query: QueryStatus;\n transactions: BraTransaction[];\n cashflow: CashflowDatum[];\n currency: string;\n translate: Translate;\n}) {\n const totals = useMemo(() => cashflowTotals(transactions), [transactions]);\n const showSummary = !query.isLoading && !query.isError && transactions.length > 0;\n\n return (\n <div className=\"space-y-6\">\n {showSummary ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.ledger.inflow', 'Total Inflow')}\n value={formatMoney(totals.inflow, currency)}\n sparkTone=\"success\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.outflow', 'Total Outflow')}\n value={formatMoney(totals.outflow, currency)}\n sparkTone=\"error\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.net', 'Net Flow')}\n value={formatMoney(totals.net, currency)}\n glow={totals.net >= 0}\n delta={totals.inflow > 0 ? (totals.net / totals.inflow) * 100 : undefined}\n />\n </div>\n </FadeIn>\n ) : null}\n\n {showSummary && cashflow.length > 0 ? (\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Receipt className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.ledger.title', 'Transaction Ledger')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.ledger.description',\n 'Every recorded transaction across your accounts, newest first.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : transactions.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.ledger.date', 'Trade Date')}\n </TableHead>\n <TableHead>{translate('brainyrich.reports.ledger.type', 'Type')}</TableHead>\n <TableHead>\n {translate('brainyrich.reports.ledger.symbol', 'Symbol')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.price', 'Price')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.amount', 'Amount')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {transactions.map((tx) => (\n <TableRow key={tx.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell className=\"text-text-primary\">\n {formatDate(tx.tradeDate)}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{tx.type}</Badge>\n </TableCell>\n <TableCell className=\"text-text-primary\">{tx.symbol ?? '—'}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {tx.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.price, tx.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.amount, tx.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<FileText className=\"size-6\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.reports.ledger.emptyTitle',\n 'No transactions recorded'\n )}\n description={translate(\n 'brainyrich.reports.ledger.emptyDesc',\n 'Record transactions on your accounts to build a ledger statement.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Client statement — branded, per-household wealth statement (real data)\n// ============================================================================\n\nfunction ClientStatementPanel({\n householdsQuery,\n households,\n activeHousehold,\n onSelect,\n accountsQuery,\n goals,\n holdings,\n transactions,\n statement,\n translate,\n}: {\n householdsQuery: QueryStatus;\n households: BraHousehold[];\n activeHousehold: BraHousehold | undefined;\n onSelect: (id: string) => void;\n accountsQuery: QueryStatus;\n goals: BraGoal[];\n holdings: BraHolding[];\n transactions: BraTransaction[];\n statement: StatementData;\n translate: Translate;\n}) {\n if (householdsQuery.isLoading) {\n return (\n <Card>\n <CardContent className=\"space-y-3 p-6\">\n <Skeleton className=\"h-8 w-64\" />\n <Skeleton className=\"h-40 w-full\" />\n </CardContent>\n </Card>\n );\n }\n if (householdsQuery.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => householdsQuery.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (households.length === 0 || !activeHousehold) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Users className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.statement.emptyTitle', 'No households yet')}\n description={translate(\n 'brainyrich.reports.statement.emptyDesc',\n 'Create a household to generate a branded client wealth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const currency = activeHousehold.currency ?? 'USD';\n const netSeries = buildCashflow(transactions).netSeries;\n const asOf = formatDate(new Date().toISOString());\n\n return (\n <div className=\"space-y-4\">\n {/* Household picker */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-sm text-text-secondary\">\n {translate('brainyrich.reports.statement.for', 'Statement for')}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {activeHousehold.name}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-72 overflow-y-auto\">\n {households.map((h) => (\n <DropdownMenuItem key={h.id} onSelect={() => onSelect(h.id)}>\n {h.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {accountsQuery.isLoading ? (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n ) : accountsQuery.isError ? (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => accountsQuery.refetch()} />\n </CardContent>\n </Card>\n ) : (\n <FadeIn>\n <GlassCard glow className=\"space-y-6\">\n {/* Branded header */}\n <div className=\"flex items-start justify-between gap-4 border-b border-border-subtle pb-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-xl bg-[var(--color-action-primary-bg)] text-sm font-bold text-[var(--color-action-primary-text)]\">\n BR\n </div>\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {activeHousehold.name}\n </h2>\n <p className=\"text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.subtitle', 'Wealth Statement')} ·{' '}\n {asOf}\n </p>\n </div>\n </div>\n <Badge variant={statusBadgeVariant(activeHousehold.status)}>\n {activeHousehold.status}\n </Badge>\n </div>\n\n {/* Net worth + allocation */}\n <div className=\"grid gap-6 md:grid-cols-2\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.netWorth', 'Net Worth')}\n </p>\n <p className=\"mt-1 text-3xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(statement.netWorth, currency)}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-2 text-xs text-text-secondary\">\n <span>\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.invested, currency)}\n </span>\n </span>\n <span>·</span>\n <span>\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.cash, currency)}\n </span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <Sparkline data={netSeries} height={44} className=\"mt-4\" />\n ) : null}\n </div>\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.allocation', 'Asset Allocation')}\n </p>\n {statement.allocation.length > 0 ? (\n <DonutChart\n data={statement.allocation}\n height={200}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </div>\n </div>\n\n {/* Holdings schedule */}\n {holdings.length > 0 ? (\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.holdings', 'Holdings Schedule')}\n </p>\n <div className=\"overflow-x-auto rounded-lg border border-border-subtle\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((h) => (\n <TableRow key={h.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell>\n <div className=\"font-medium text-text-primary\">{h.symbol}</div>\n {h.name ? (\n <div className=\"text-xs text-text-secondary\">{h.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(h.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {h.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(h.marketValue, h.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n ) : null}\n\n {/* Progress to goals */}\n {goals.length > 0 ? (\n <div>\n <p className=\"mb-3 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.goals', 'Progress-to-Goals')}\n </p>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {goals.map((g) => (\n <GoalProgressCard\n key={g.id}\n goal={g}\n accountValues={statement.accountValues}\n translate={translate}\n />\n ))}\n </div>\n </div>\n ) : null}\n\n {/* Footer */}\n <p className=\"border-t border-border-subtle pt-4 text-center text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.footer', 'BrainyRich · Confidential')}\n </p>\n </GlassCard>\n </FadeIn>\n )}\n </div>\n );\n}\n\n/**\n * One goal's progress ring. Funded amount is derived from the goal's REAL\n * fundings: a fixed amount when set, otherwise the funding's allocation\n * percentage applied to that account's total value (cash + holdings).\n */\nfunction GoalProgressCard({\n goal,\n accountValues,\n translate,\n}: {\n goal: BraGoal;\n accountValues: Map<string, number>;\n translate: Translate;\n}) {\n const fundings = useGoalFundings(goal.id);\n const funded = useMemo(\n () =>\n fundings.data.reduce((sum, f) => {\n if (f.fixedAmount != null) return sum + f.fixedAmount;\n const value = accountValues.get(f.accountId) ?? 0;\n return sum + (f.allocationPct / 100) * value;\n }, 0),\n [fundings.data, accountValues]\n );\n const pct = goal.targetAmount > 0 ? Math.min(100, (funded / goal.targetAmount) * 100) : 0;\n\n return (\n <div className=\"flex flex-col items-center gap-2 rounded-xl border border-border-subtle bg-bg-surface p-4 text-center transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <ProgressRing value={pct} tone={projectionTone(goal.projection)} size={104} />\n <div className=\"flex items-center gap-1.5\">\n <Target className=\"size-3.5 text-text-secondary\" aria-hidden=\"true\" />\n <span className=\"text-sm font-medium text-text-primary\">{goal.name}</span>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {formatMoney(funded, goal.currency)} / {formatMoney(goal.targetAmount, goal.currency)}\n </p>\n <Badge variant={statusBadgeVariant(goal.projection)}>\n {translate(\n `brainyrich.goals.projection.${goal.projection}`,\n goal.projection.replace(/_/g, ' ')\n )}\n </Badge>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Skeleton,\n ResponsiveDialog,\n ResponsiveDialogClose,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n FileText,\n Printer,\n Download,\n Wallet,\n Layers,\n Receipt,\n ChevronDown,\n Users,\n Target,\n TrendingUp,\n CalendarClock,\n Pause,\n Play,\n Plus,\n Sparkles as SparklesIcon,\n Palette,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useBrainyRich } from '../providers/BrainyRichProvider';\nimport {\n useNetWorthSummary,\n useAllTransactions,\n fetchAllAccounts,\n fetchAllHoldings,\n useHouseholds,\n useAccounts,\n useGoals,\n useGoalFundings,\n useScheduledReports,\n useCreateScheduledReport,\n useSetScheduledReportStatus,\n useReportRuns,\n useGenerateReportNow,\n useDownloadReportRunPdf,\n useMyAdvisorBranding,\n useUpsertMyAdvisorBranding,\n} from '../hooks/useBrainyRichApi';\nimport type {\n BraHolding,\n BraTransaction,\n BraHousehold,\n BraAccount,\n BraGoal,\n BraGoalProjection,\n BraTransactionType,\n BraScheduledReport,\n BraReportFrequency,\n BraReportRun,\n BraAdvisorBranding,\n BraUpsertAdvisorBrandingInput,\n} from '../types/bra';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatCompact,\n formatDate,\n deltaToneClass,\n statusBadgeVariant,\n} from './_shared';\nimport {\n DonutChart,\n StatTile,\n TrendBars,\n Sparkline,\n ProgressRing,\n GlassCard,\n FadeIn,\n type VizTone,\n} from '../components/viz';\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\ntype StatementView = 'networth' | 'holdings' | 'transactions' | 'statement' | 'scheduled';\n\n/** Minimal read-query surface the statement sub-cards need for their states. */\ninterface QueryStatus {\n isLoading: boolean;\n isError: boolean;\n refetch: () => void;\n}\n\n// ============================================================================\n// Asset-class presentation (labels + semantic tones) — display only\n// ============================================================================\n\nconst ASSET_CLASS_LABEL: Record<string, string> = {\n EQUITY: 'Equity',\n FIXED_INCOME: 'Fixed Income',\n CASH: 'Cash',\n REAL_ESTATE: 'Real Estate',\n COMMODITY: 'Commodity',\n CRYPTO: 'Crypto',\n ALTERNATIVE: 'Alternatives',\n};\n\nconst ASSET_CLASS_TONE: Record<string, VizTone> = {\n EQUITY: 'brand',\n FIXED_INCOME: 'blue',\n CASH: 'teal',\n REAL_ESTATE: 'warning',\n COMMODITY: 'indigo',\n CRYPTO: 'purple',\n ALTERNATIVE: 'info',\n};\n\nfunction assetClassLabel(ac: string): string {\n return ASSET_CLASS_LABEL[ac] ?? ac.replace(/_/g, ' ');\n}\n\n// ============================================================================\n// Cash-flow derivation — REAL ledger rows bucketed by month\n// ----------------------------------------------------------------------------\n// Inflow = money arriving (deposits, dividends, interest, sale proceeds).\n// Outflow = money leaving (withdrawals, fees, buys). TRANSFER is treated as\n// balance-neutral. Every value comes straight from recorded transactions.\n// ============================================================================\n\nconst INFLOW_TYPES: BraTransactionType[] = ['DEPOSIT', 'DIVIDEND', 'INTEREST', 'SELL'];\nconst OUTFLOW_TYPES: BraTransactionType[] = ['WITHDRAWAL', 'FEE', 'BUY'];\n\nfunction monthKey(iso: string): string | null {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return null;\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction monthLabel(key: string): string {\n const [y, m] = key.split('-').map(Number);\n return new Intl.DateTimeFormat('en-US', { month: 'short' }).format(new Date(y, m - 1, 1));\n}\n\ninterface CashflowDatum {\n label: string;\n inflow: number;\n outflow: number;\n}\n\nfunction buildCashflow(\n txns: BraTransaction[],\n months = 6\n): { bars: CashflowDatum[]; netSeries: number[] } {\n const map = new Map<string, { inflow: number; outflow: number }>();\n for (const t of txns) {\n const k = monthKey(t.tradeDate);\n if (!k) continue;\n const bucket = map.get(k) ?? { inflow: 0, outflow: 0 };\n const amt = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) bucket.inflow += amt;\n else if (OUTFLOW_TYPES.includes(t.type)) bucket.outflow += amt;\n map.set(k, bucket);\n }\n const recent = Array.from(map.keys()).sort().slice(-months);\n const bars = recent.map((k) => {\n const b = map.get(k)!;\n return { label: monthLabel(k), inflow: b.inflow, outflow: b.outflow };\n });\n let run = 0;\n const netSeries = recent.map((k) => {\n const b = map.get(k)!;\n run += b.inflow - b.outflow;\n return run;\n });\n return { bars, netSeries };\n}\n\nfunction cashflowTotals(txns: BraTransaction[]): { inflow: number; outflow: number; net: number } {\n let inflow = 0;\n let outflow = 0;\n for (const t of txns) {\n const a = Math.abs(t.amount);\n if (INFLOW_TYPES.includes(t.type)) inflow += a;\n else if (OUTFLOW_TYPES.includes(t.type)) outflow += a;\n }\n return { inflow, outflow, net: inflow - outflow };\n}\n\n// ============================================================================\n// Statement math — net worth composition for a set of accounts + their holdings\n// ============================================================================\n\ninterface StatementData {\n netWorth: number;\n invested: number;\n cash: number;\n allocation: { label: string; value: number; tone?: VizTone }[];\n /** Per-account total value (cash + holdings) — used to resolve goal funding %. */\n accountValues: Map<string, number>;\n}\n\nfunction computeStatement(accounts: BraAccount[], holdings: BraHolding[]): StatementData {\n const accountValues = new Map<string, number>();\n let cash = 0;\n for (const a of accounts) {\n accountValues.set(a.id, a.cashBalance);\n cash += a.cashBalance;\n }\n let invested = 0;\n const byClass = new Map<string, number>();\n for (const h of holdings) {\n invested += h.marketValue;\n byClass.set(h.assetClass, (byClass.get(h.assetClass) ?? 0) + h.marketValue);\n accountValues.set(h.accountId, (accountValues.get(h.accountId) ?? 0) + h.marketValue);\n }\n const allocation = Array.from(byClass.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([ac, v]) => ({ label: assetClassLabel(ac), value: v, tone: ASSET_CLASS_TONE[ac] }));\n return { netWorth: cash + invested, invested, cash, allocation, accountValues };\n}\n\nfunction projectionTone(p: BraGoalProjection): VizTone {\n switch (p) {\n case 'AHEAD':\n return 'success';\n case 'BEHIND':\n return 'warning';\n case 'AT_RISK':\n return 'error';\n default:\n return 'brand';\n }\n}\n\n// ============================================================================\n// CSV helpers — client-side export built from REAL rows only\n// ============================================================================\n\nfunction toCsv(headers: string[], rows: (string | number)[][]): string {\n const escape = (cell: string | number) => {\n const s = String(cell ?? '');\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n return [headers, ...rows].map((row) => row.map(escape).join(',')).join('\\n');\n}\n\nfunction downloadCsv(filename: string, csv: string) {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'household'\n );\n}\n\n// ============================================================================\n// Full holdings schedule\n// ----------------------------------------------------------------------------\n// `braListPortfolios`/`braListAccounts` never inline `holdings`, and\n// `braListHoldings` is scoped to a single account/portfolio AND paginated\n// (default page size 50). To build a COMPLETE holdings schedule (every\n// position, not a truncated first page) we enumerate the full account set via\n// the foundation `fetchAllAccounts` pager, then page through each account's\n// holdings via `fetchAllHoldings` and flatten. Real server rows only — no\n// fabrication.\n// ============================================================================\n\nfunction useAllHoldings() {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: ['brainyrich', 'holdings', 'report-all'],\n queryFn: async () => {\n const accounts = await fetchAllAccounts(apiGatewayUrl);\n const perAccount = await Promise.all(\n accounts.map((account) => fetchAllHoldings(apiGatewayUrl, { accountId: account.id }))\n );\n return perAccount.flat();\n },\n });\n return { ...query, data: query.data ?? [] };\n}\n\n// ============================================================================\n// Reports page — real, generatable statement views\n// (net worth / holdings / ledger / client statement)\n// ============================================================================\n\nexport function ReportsPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const [view, setView] = useState<StatementView>('networth');\n const [selectedHouseholdId, setSelectedHouseholdId] = useState<string | undefined>();\n\n const summaryQuery = useNetWorthSummary();\n // Aggregation sources: page through the FULL set so statements + CSV cover\n // every holding and every ledger entry, not a truncated first page.\n const holdingsQuery = useAllHoldings();\n const transactionsQuery = useAllTransactions();\n const householdsQuery = useHouseholds();\n\n const summary = summaryQuery.data;\n const currency = summary?.currency ?? 'USD';\n const households = householdsQuery.data;\n\n // Active household for the Client Statement (defaults to the first one).\n const activeHouseholdId = selectedHouseholdId ?? households[0]?.id;\n const activeHousehold = households.find((h) => h.id === activeHouseholdId);\n\n // Household-scoped sources. React-Query dedupes these against the statement\n // sub-tree, so passing an id here does not double-fetch.\n const householdAccountsQuery = useAccounts({ householdId: activeHouseholdId });\n const householdGoalsQuery = useGoals({ householdId: activeHouseholdId });\n const householdAccounts = householdAccountsQuery.data;\n const householdGoals = householdGoalsQuery.data;\n\n // Holdings schedule: every holding across every account, richest first.\n const holdings: BraHolding[] = useMemo(\n () => holdingsQuery.data.slice().sort((a, b) => b.marketValue - a.marketValue),\n [holdingsQuery.data]\n );\n\n const transactions: BraTransaction[] = useMemo(\n () =>\n transactionsQuery.data\n .slice()\n .sort((a, b) => new Date(b.tradeDate).getTime() - new Date(a.tradeDate).getTime()),\n [transactionsQuery.data]\n );\n\n const cashflow = useMemo(() => buildCashflow(transactions), [transactions]);\n\n // Household slices for the statement (built from already-loaded page data).\n const householdAccountIds = useMemo(\n () => new Set(householdAccounts.map((a) => a.id)),\n [householdAccounts]\n );\n const householdHoldings = useMemo(\n () =>\n holdings\n .filter((h) => householdAccountIds.has(h.accountId))\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue),\n [holdings, householdAccountIds]\n );\n const householdTxns = useMemo(\n () => transactions.filter((tx) => householdAccountIds.has(tx.accountId)),\n [transactions, householdAccountIds]\n );\n const statementData = useMemo(\n () => computeStatement(householdAccounts, householdHoldings),\n [householdAccounts, householdHoldings]\n );\n\n // Header KPIs — premium tiles, net worth carrying an emerald glow + a real\n // cumulative net-cash-flow spark (decorative, aria-hidden inside StatTile).\n const holdingsUnrealized = useMemo(\n () => holdings.reduce((sum, h) => sum + (h.marketValue - h.costBasis), 0),\n [holdings]\n );\n\n // Primary \"Print / Export\" action for the currently selected statement.\n // Each branch emits the COMPLETE dataset (full holdings / full ledger).\n const exportCurrent = () => {\n if (view === 'networth') {\n if (!summary) return;\n const headers = ['Metric', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Total Net Worth', summary.totalNetWorth, currency],\n ['Total Market Value', summary.totalMarketValue, currency],\n ['Total Cash', summary.totalCash, currency],\n ['Account Count', summary.accountCount, ''],\n ...summary.byAssetClass.map((row) => [\n `Asset Class: ${assetClassLabel(row.assetClass)}`,\n row.marketValue,\n currency,\n ]),\n ];\n downloadCsv('brainyrich-net-worth-statement.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'holdings') {\n const headers = [\n 'Symbol',\n 'Name',\n 'Asset Class',\n 'Quantity',\n 'Cost Basis',\n 'Market Value',\n 'Currency',\n ];\n const rows = holdings.map((h) => [\n h.symbol,\n h.name ?? '',\n assetClassLabel(h.assetClass),\n h.quantity,\n h.costBasis,\n h.marketValue,\n h.currency,\n ]);\n downloadCsv('brainyrich-holdings-schedule.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'statement') {\n if (!activeHousehold) return;\n const cur = activeHousehold.currency ?? currency;\n const headers = ['Section', 'Label', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Summary', 'Net Worth', statementData.netWorth, cur],\n ['Summary', 'Invested Value', statementData.invested, cur],\n ['Summary', 'Cash & Liquidity', statementData.cash, cur],\n ...statementData.allocation.map((a) => ['Allocation', a.label, a.value, cur]),\n ...householdHoldings.map((h) => [\n 'Holding',\n `${h.symbol}${h.name ? ` — ${h.name}` : ''}`,\n h.marketValue,\n h.currency,\n ]),\n ...householdGoals.map((g) => ['Goal', g.name, g.targetAmount, g.currency]),\n ];\n downloadCsv(\n `brainyrich-${slugify(activeHousehold.name)}-statement.csv`,\n toCsv(headers, rows)\n );\n return;\n }\n const headers = [\n 'Trade Date',\n 'Type',\n 'Symbol',\n 'Quantity',\n 'Price',\n 'Amount',\n 'Fee',\n 'Currency',\n ];\n const rows = transactions.map((tx) => [\n formatDate(tx.tradeDate),\n tx.type,\n tx.symbol ?? '',\n tx.quantity,\n tx.price,\n tx.amount,\n tx.fee,\n tx.currency,\n ]);\n downloadCsv('brainyrich-transaction-ledger.csv', toCsv(headers, rows));\n };\n\n // The export action only produces a file for a statement that actually has\n // rows; disable it while the active statement is still loading / empty.\n const exportDisabled =\n (view === 'networth' && (summaryQuery.isLoading || !summary)) ||\n (view === 'holdings' && (holdingsQuery.isLoading || holdings.length === 0)) ||\n (view === 'transactions' && (transactionsQuery.isLoading || transactions.length === 0)) ||\n (view === 'statement' && (!activeHousehold || householdAccountsQuery.isLoading));\n\n return (\n <SectionShell\n title={translate('brainyrich.reports.title', 'Reports & Statements')}\n description={translate(\n 'brainyrich.reports.description',\n 'Generate statements directly from your live portfolio data — no fabricated schedules.'\n )}\n actions={\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"sm\"\n disabled={exportDisabled}\n aria-label={translate('brainyrich.reports.actions.export', 'Print / Export')}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.export', 'Print / Export')}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={exportCurrent}>\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.downloadCsv', 'Download CSV')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => window.print()}>\n <Printer className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.print', 'Print statement')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n }\n >\n <FadeIn>\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label={translate('brainyrich.reports.kpis.netWorth', 'Net Worth')}\n value={summary ? formatMoney(summary.totalNetWorth, currency) : '—'}\n spark={cashflow.netSeries}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.marketValue', 'Invested Value')}\n value={summary ? formatMoney(summary.totalMarketValue, currency) : '—'}\n icon={<TrendingUp className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.holdings', 'Holdings on Schedule')}\n value={String(holdings.length)}\n icon={<Layers className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.reports.kpis.transactions', 'Ledger Entries')}\n value={String(transactions.length)}\n icon={<Receipt className=\"size-4\" aria-hidden=\"true\" />}\n />\n </div>\n </FadeIn>\n\n <Tabs value={view} onValueChange={(value) => setView(value as StatementView)}>\n <TabsList>\n <TabsTrigger value=\"networth\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.netWorth', 'Net Worth')}\n </TabsTrigger>\n <TabsTrigger value=\"holdings\">\n <Layers className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.holdings', 'Holdings')}\n </TabsTrigger>\n <TabsTrigger value=\"transactions\">\n <Receipt className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.ledger', 'Ledger')}\n </TabsTrigger>\n <TabsTrigger value=\"statement\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.statement', 'Client Statement')}\n </TabsTrigger>\n <TabsTrigger value=\"scheduled\">\n <CalendarClock className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.scheduled', 'Scheduled Reports')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n\n {view === 'networth' ? (\n <NetWorthStatement\n query={summaryQuery}\n cashflow={cashflow.bars}\n netSeries={cashflow.netSeries}\n translate={translate}\n />\n ) : view === 'holdings' ? (\n <HoldingsSchedule\n query={holdingsQuery}\n holdings={holdings}\n unrealized={holdingsUnrealized}\n translate={translate}\n />\n ) : view === 'transactions' ? (\n <TransactionLedger\n query={transactionsQuery}\n transactions={transactions}\n cashflow={cashflow.bars}\n currency={currency}\n translate={translate}\n />\n ) : view === 'statement' ? (\n <ClientStatementPanel\n householdsQuery={householdsQuery}\n households={households}\n activeHousehold={activeHousehold}\n onSelect={setSelectedHouseholdId}\n accountsQuery={householdAccountsQuery}\n goals={householdGoals}\n holdings={householdHoldings}\n transactions={householdTxns}\n statement={statementData}\n translate={translate}\n />\n ) : (\n <ScheduledReportsPanel households={households} translate={translate} />\n )}\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Scheduled client reporting (BOFF-4244) — real backend-generated PDF report\n// runs, plus the advisor-brandable client-portal identity (logo/colors) that\n// stamps both the PDF and `braClientPortalSummary`. Delivery is a real\n// in-app \"report ready\" notification (see report-schedule.ts on the svc) —\n// this platform's transport has no email attachments today, so the PDF is\n// downloaded on demand from `braReportRunPdf` instead.\n// ============================================================================\n\nfunction ScheduledReportsPanel({\n households,\n translate,\n}: {\n households: BraHousehold[];\n translate: Translate;\n}) {\n const scheduledQuery = useScheduledReports();\n const runsQuery = useReportRuns();\n const createSchedule = useCreateScheduledReport();\n const setStatus = useSetScheduledReportStatus();\n const generateNow = useGenerateReportNow();\n const downloadPdf = useDownloadReportRunPdf();\n const brandingQuery = useMyAdvisorBranding();\n const upsertBranding = useUpsertMyAdvisorBranding();\n\n const [createOpen, setCreateOpen] = useState(false);\n const [name, setName] = useState('');\n const [frequency, setFrequency] = useState<BraReportFrequency>('MONTHLY');\n const [householdId, setHouseholdId] = useState<string>('');\n\n const branding = brandingQuery.data;\n\n const submitSchedule = () => {\n if (!name.trim()) return;\n createSchedule.mutate(\n { name: name.trim(), frequency, householdId: householdId || undefined },\n { onSuccess: () => setCreateOpen(false) }\n );\n setName('');\n setFrequency('MONTHLY');\n setHouseholdId('');\n };\n\n return (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-4\">\n <div>\n <CardTitle>\n {translate('brainyrich.reports.scheduled.title', 'Scheduled Client Reports')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.scheduled.description',\n 'Real recurring PDF report generation, regenerated on demand from a stored snapshot — no fabricated schedules.'\n )}\n </CardDescription>\n </div>\n <ResponsiveDialog open={createOpen} onOpenChange={setCreateOpen}>\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.scheduled.new', 'New schedule')}\n </Button>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {translate('brainyrich.reports.scheduled.newTitle', 'New scheduled report')}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {translate(\n 'brainyrich.reports.scheduled.newDescription',\n 'Recurring reports render the same real path as an on-demand generation.'\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"schedule-name\">\n {translate('brainyrich.reports.scheduled.fields.name', 'Name')}\n </Label>\n <Input\n id=\"schedule-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Quarterly household review\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label>\n {translate('brainyrich.reports.scheduled.fields.frequency', 'Frequency')}\n </Label>\n <Select\n value={frequency}\n onValueChange={(v) => setFrequency(v as BraReportFrequency)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"WEEKLY\">\n {translate('brainyrich.reports.scheduled.frequency.weekly', 'Weekly')}\n </SelectItem>\n <SelectItem value=\"MONTHLY\">\n {translate('brainyrich.reports.scheduled.frequency.monthly', 'Monthly')}\n </SelectItem>\n <SelectItem value=\"QUARTERLY\">\n {translate('brainyrich.reports.scheduled.frequency.quarterly', 'Quarterly')}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <Label>\n {translate(\n 'brainyrich.reports.scheduled.fields.household',\n 'Household (optional — whole book if omitted)'\n )}\n </Label>\n <Select value={householdId} onValueChange={setHouseholdId}>\n <SelectTrigger>\n <SelectValue placeholder=\"Whole book\" />\n </SelectTrigger>\n <SelectContent>\n {households.map((h) => (\n <SelectItem key={h.id} value={h.id}>\n {h.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <ResponsiveDialogClose asChild>\n <Button variant=\"secondary\">\n {translate('brainyrich.common.cancel', 'Cancel')}\n </Button>\n </ResponsiveDialogClose>\n <Button\n onClick={submitSchedule}\n disabled={!name.trim() || createSchedule.isPending}\n >\n {createSchedule.isPending ? 'Creating…' : 'Create schedule'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </CardHeader>\n <CardContent>\n {scheduledQuery.isLoading ? (\n <LoadingState />\n ) : scheduledQuery.isError ? (\n <ErrorState onRetry={() => scheduledQuery.refetch()} />\n ) : scheduledQuery.data.length === 0 ? (\n <EmptyState\n icon={<CalendarClock className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.scheduled.empty', 'No scheduled reports yet')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.scheduled.columns.name', 'Name')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.scheduled.columns.frequency', 'Frequency')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.scheduled.columns.status', 'Status')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.scheduled.columns.nextRun', 'Next run')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.scheduled.columns.lastRun', 'Last run')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.scheduled.columns.actions', 'Actions')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {scheduledQuery.data.map((sr: BraScheduledReport) => (\n <TableRow key={sr.id}>\n <TableCell className=\"font-medium\">{sr.name}</TableCell>\n <TableCell>{sr.frequency}</TableCell>\n <TableCell>\n <Badge variant={sr.status === 'ACTIVE' ? 'default' : 'secondary'}>\n {sr.status}\n </Badge>\n </TableCell>\n <TableCell>{formatDate(sr.nextRunAt)}</TableCell>\n <TableCell>{sr.lastRunAt ? formatDate(sr.lastRunAt) : '—'}</TableCell>\n <TableCell className=\"flex justify-end gap-1.5\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={generateNow.isPending}\n onClick={() => generateNow.mutate({ scheduledReportId: sr.id })}\n >\n <SparklesIcon className=\"size-4\" aria-hidden=\"true\" />\n Generate now\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={setStatus.isPending}\n onClick={() =>\n setStatus.mutate({ id: sr.id, pause: sr.status === 'ACTIVE' })\n }\n >\n {sr.status === 'ACTIVE' ? (\n <Pause className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <Play className=\"size-4\" aria-hidden=\"true\" />\n )}\n {sr.status === 'ACTIVE' ? 'Pause' : 'Resume'}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>{translate('brainyrich.reports.runs.title', 'Report Runs')}</CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.runs.description',\n 'Every generated run — download the real, regenerated-on-demand PDF for any GENERATED run.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {runsQuery.isLoading ? (\n <LoadingState />\n ) : runsQuery.isError ? (\n <ErrorState onRetry={() => runsQuery.refetch()} />\n ) : runsQuery.data.length === 0 ? (\n <EmptyState\n icon={<FileText className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.runs.empty', 'No report runs yet')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.runs.columns.period', 'Period')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.runs.columns.status', 'Status')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.runs.columns.generated', 'Generated')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.runs.columns.actions', 'Actions')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {runsQuery.data.map((run: BraReportRun) => (\n <TableRow key={run.id}>\n <TableCell>\n {formatDate(run.periodStart)} – {formatDate(run.periodEnd)}\n </TableCell>\n <TableCell>\n <Badge variant={statusBadgeVariant(run.status)}>{run.status}</Badge>\n </TableCell>\n <TableCell>{run.generatedAt ? formatDate(run.generatedAt) : '—'}</TableCell>\n <TableCell className=\"text-right\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={run.status !== 'GENERATED' || downloadPdf.isPending}\n onClick={() => downloadPdf.mutate(run)}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n PDF\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Palette className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.branding.title', 'Client-Portal Branding')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.branding.description',\n 'Stamps both the client portal and generated PDF reports with your firm identity.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {brandingQuery.isLoading ? (\n <LoadingState />\n ) : (\n <AdvisorBrandingForm\n key={branding?.id ?? 'new'}\n branding={branding ?? null}\n isSaving={upsertBranding.isPending}\n onSave={(input) => upsertBranding.mutate(input)}\n />\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Uncontrolled-until-touched branding form. Initial values come from\n * `useState(() => ...)` (a lazy initializer), never from an effect —\n * `key={branding?.id ?? 'new'}` on the parent remounts this component\n * exactly once the query result actually changes, which is the\n * React-idiomatic way to seed edit state from server data without the\n * setState-in-effect cascading-render lint violation.\n */\nfunction AdvisorBrandingForm({\n branding,\n isSaving,\n onSave,\n}: {\n branding: BraAdvisorBranding | null;\n isSaving: boolean;\n onSave: (input: BraUpsertAdvisorBrandingInput) => void;\n}) {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n const [firmName, setFirmName] = useState(() => branding?.firmName ?? '');\n const [primaryColor, setPrimaryColor] = useState(() => branding?.primaryColor ?? '');\n const [contactEmail, setContactEmail] = useState(() => branding?.contactEmail ?? '');\n const [disclaimer, setDisclaimer] = useState(() => branding?.disclaimer ?? '');\n\n return (\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"branding-firm\">\n {translate('brainyrich.reports.branding.firmName', 'Firm name')}\n </Label>\n <Input id=\"branding-firm\" value={firmName} onChange={(e) => setFirmName(e.target.value)} />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"branding-color\">\n {translate('brainyrich.reports.branding.primaryColor', 'Primary color (hex)')}\n </Label>\n <Input\n id=\"branding-color\"\n value={primaryColor}\n onChange={(e) => setPrimaryColor(e.target.value)}\n placeholder={translate(\n 'brainyrich.reports.branding.primaryColorPlaceholder',\n 'Primary brand color'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"branding-email\">\n {translate('brainyrich.reports.branding.contactEmail', 'Contact email')}\n </Label>\n <Input\n id=\"branding-email\"\n type=\"email\"\n value={contactEmail}\n onChange={(e) => setContactEmail(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5 md:col-span-2\">\n <Label htmlFor=\"branding-disclaimer\">\n {translate('brainyrich.reports.branding.disclaimer', 'Disclaimer')}\n </Label>\n <Textarea\n id=\"branding-disclaimer\"\n value={disclaimer}\n onChange={(e) => setDisclaimer(e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"md:col-span-2\">\n <Button\n disabled={isSaving}\n onClick={() =>\n onSave({\n firmName: firmName || undefined,\n primaryColor: primaryColor || undefined,\n contactEmail: contactEmail || undefined,\n disclaimer: disclaimer || undefined,\n })\n }\n >\n {isSaving ? 'Saving…' : 'Save branding'}\n </Button>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Net-worth statement — hero figure + allocation donut + asset-class schedule\n// ============================================================================\n\nfunction NetWorthStatement({\n query,\n cashflow,\n netSeries,\n translate,\n}: {\n query: ReturnType<typeof useNetWorthSummary>;\n cashflow: CashflowDatum[];\n netSeries: number[];\n translate: Translate;\n}) {\n const summary = query.data;\n const currency = summary?.currency ?? 'USD';\n\n const allocation = useMemo(() => {\n if (!summary) return [];\n return summary.byAssetClass\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue)\n .map((row) => ({\n label: assetClassLabel(row.assetClass),\n value: row.marketValue,\n tone: ASSET_CLASS_TONE[row.assetClass],\n }));\n }, [summary]);\n\n if (query.isLoading) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n );\n }\n if (query.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => query.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (!summary) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Wallet className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.netWorth.emptyTitle', 'No net-worth data yet')}\n description={translate(\n 'brainyrich.reports.netWorth.emptyDesc',\n 'Link an account and add holdings to generate a net-worth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const asOf = translate('brainyrich.reports.netWorth.asOf', 'as of {date}', {\n date: formatDate(new Date().toISOString()),\n });\n\n return (\n <div className=\"space-y-6\">\n <div className=\"grid gap-6 lg:grid-cols-[1.1fr_1fr]\">\n {/* Hero net-worth figure with emerald glow + real cumulative-flow spark */}\n <FadeIn>\n <GlassCard glow className=\"h-full\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.netWorth.title', 'Net Worth Statement')} — {asOf}\n </p>\n <p className=\"mt-2 text-4xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(summary.totalNetWorth, currency)}\n </p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalMarketValue, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(summary.totalCash, currency)}\n </span>\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\">\n {translate('brainyrich.reports.netWorth.accounts', 'Accounts')}\n <span className=\"font-medium text-text-primary\">{summary.accountCount}</span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <div className=\"mt-5\">\n <p className=\"mb-1 text-[11px] text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.netFlow',\n 'Cumulative net cash flow (recent months)'\n )}\n </p>\n <Sparkline data={netSeries} height={48} />\n </div>\n ) : null}\n </GlassCard>\n </FadeIn>\n\n {/* Allocation donut */}\n <FadeIn index={1}>\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle className=\"text-base\">\n {translate('brainyrich.reports.netWorth.allocation', 'Allocation by Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <DonutChart\n data={allocation}\n centerLabel={translate('brainyrich.reports.netWorth.invested', 'Invested')}\n centerValue={formatCompact(summary.totalMarketValue, currency)}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n\n {/* Asset-class schedule (statement table) */}\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.netWorth.schedule', 'By Asset Class')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {allocation.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.netWorth.assetClass', 'Asset class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.netWorth.total', 'Total')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {allocation.map((row) => (\n <TableRow\n key={row.label}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell className=\"font-medium text-text-primary\">{row.label}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(row.value, currency)}\n </TableCell>\n </TableRow>\n ))}\n <TableRow>\n <TableCell className=\"font-semibold text-text-primary\">\n {translate('brainyrich.reports.netWorth.totals', 'Totals')}\n </TableCell>\n <TableCell className=\"text-right font-semibold tabular-nums text-status-success-text\">\n {formatMoney(summary.totalMarketValue, currency)}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n\n {/* Cash flow */}\n {cashflow.length > 0 ? (\n <FadeIn index={3}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.cashflow.description',\n 'Inflows and outflows recorded on your ledger, by month.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// Holdings schedule\n// ============================================================================\n\nfunction HoldingsSchedule({\n query,\n holdings,\n unrealized,\n translate,\n}: {\n query: QueryStatus;\n holdings: BraHolding[];\n unrealized: number;\n translate: Translate;\n}) {\n const marketValue = holdings.reduce((sum, h) => sum + h.marketValue, 0);\n const costBasis = holdings.reduce((sum, h) => sum + h.costBasis, 0);\n const currency = holdings[0]?.currency ?? 'USD';\n\n return (\n <div className=\"space-y-6\">\n {!query.isLoading && !query.isError && holdings.length > 0 ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n value={formatMoney(marketValue, currency)}\n glow\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n value={formatMoney(costBasis, currency)}\n />\n <StatTile\n label={translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n value={formatMoney(unrealized, currency)}\n delta={costBasis > 0 ? (unrealized / costBasis) * 100 : undefined}\n sparkTone={unrealized >= 0 ? 'success' : 'error'}\n />\n </div>\n </FadeIn>\n ) : null}\n\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Layers className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.holdings.title', 'Holdings Schedule')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.holdings.description',\n 'Every position across your portfolios with cost basis and market value.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : holdings.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((holding) => {\n const gain = holding.marketValue - holding.costBasis;\n return (\n <TableRow\n key={holding.id}\n className=\"transition-colors hover:bg-bg-elevated/60\"\n >\n <TableCell>\n <div className=\"font-medium text-text-primary\">{holding.symbol}</div>\n {holding.name ? (\n <div className=\"text-xs text-text-secondary\">{holding.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(holding.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {holding.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.costBasis, holding.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.marketValue, holding.currency)}\n </TableCell>\n <TableCell\n className={`text-right tabular-nums font-medium ${deltaToneClass(gain)}`}\n >\n {gain > 0 ? '+' : ''}\n {formatMoney(gain, holding.currency)}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<Layers className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.holdings.emptyTitle', 'No holdings on file')}\n description={translate(\n 'brainyrich.reports.holdings.emptyDesc',\n 'Add holdings to your portfolios to generate a holdings schedule.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Transaction ledger\n// ============================================================================\n\nfunction TransactionLedger({\n query,\n transactions,\n cashflow,\n currency,\n translate,\n}: {\n query: QueryStatus;\n transactions: BraTransaction[];\n cashflow: CashflowDatum[];\n currency: string;\n translate: Translate;\n}) {\n const totals = useMemo(() => cashflowTotals(transactions), [transactions]);\n const showSummary = !query.isLoading && !query.isError && transactions.length > 0;\n\n return (\n <div className=\"space-y-6\">\n {showSummary ? (\n <FadeIn>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatTile\n label={translate('brainyrich.reports.ledger.inflow', 'Total Inflow')}\n value={formatMoney(totals.inflow, currency)}\n sparkTone=\"success\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.outflow', 'Total Outflow')}\n value={formatMoney(totals.outflow, currency)}\n sparkTone=\"error\"\n />\n <StatTile\n label={translate('brainyrich.reports.ledger.net', 'Net Flow')}\n value={formatMoney(totals.net, currency)}\n glow={totals.net >= 0}\n delta={totals.inflow > 0 ? (totals.net / totals.inflow) * 100 : undefined}\n />\n </div>\n </FadeIn>\n ) : null}\n\n {showSummary && cashflow.length > 0 ? (\n <FadeIn index={1}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.cashflow.title', 'Cash Flow')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <TrendBars data={cashflow} valueFormatter={(v) => formatCompact(v, currency)} />\n </CardContent>\n </Card>\n </FadeIn>\n ) : null}\n\n <FadeIn index={2}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Receipt className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.ledger.title', 'Transaction Ledger')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.ledger.description',\n 'Every recorded transaction across your accounts, newest first.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : transactions.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.ledger.date', 'Trade Date')}\n </TableHead>\n <TableHead>{translate('brainyrich.reports.ledger.type', 'Type')}</TableHead>\n <TableHead>\n {translate('brainyrich.reports.ledger.symbol', 'Symbol')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.price', 'Price')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.amount', 'Amount')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {transactions.map((tx) => (\n <TableRow key={tx.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell className=\"text-text-primary\">\n {formatDate(tx.tradeDate)}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{tx.type}</Badge>\n </TableCell>\n <TableCell className=\"text-text-primary\">{tx.symbol ?? '—'}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {tx.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.price, tx.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.amount, tx.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<FileText className=\"size-6\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.reports.ledger.emptyTitle',\n 'No transactions recorded'\n )}\n description={translate(\n 'brainyrich.reports.ledger.emptyDesc',\n 'Record transactions on your accounts to build a ledger statement.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n );\n}\n\n// ============================================================================\n// Client statement — branded, per-household wealth statement (real data)\n// ============================================================================\n\nfunction ClientStatementPanel({\n householdsQuery,\n households,\n activeHousehold,\n onSelect,\n accountsQuery,\n goals,\n holdings,\n transactions,\n statement,\n translate,\n}: {\n householdsQuery: QueryStatus;\n households: BraHousehold[];\n activeHousehold: BraHousehold | undefined;\n onSelect: (id: string) => void;\n accountsQuery: QueryStatus;\n goals: BraGoal[];\n holdings: BraHolding[];\n transactions: BraTransaction[];\n statement: StatementData;\n translate: Translate;\n}) {\n if (householdsQuery.isLoading) {\n return (\n <Card>\n <CardContent className=\"space-y-3 p-6\">\n <Skeleton className=\"h-8 w-64\" />\n <Skeleton className=\"h-40 w-full\" />\n </CardContent>\n </Card>\n );\n }\n if (householdsQuery.isError) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => householdsQuery.refetch()} />\n </CardContent>\n </Card>\n );\n }\n if (households.length === 0 || !activeHousehold) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <EmptyState\n icon={<Users className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.statement.emptyTitle', 'No households yet')}\n description={translate(\n 'brainyrich.reports.statement.emptyDesc',\n 'Create a household to generate a branded client wealth statement.'\n )}\n />\n </CardContent>\n </Card>\n );\n }\n\n const currency = activeHousehold.currency ?? 'USD';\n const netSeries = buildCashflow(transactions).netSeries;\n const asOf = formatDate(new Date().toISOString());\n\n return (\n <div className=\"space-y-4\">\n {/* Household picker */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-sm text-text-secondary\">\n {translate('brainyrich.reports.statement.for', 'Statement for')}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <Users className=\"size-4\" aria-hidden=\"true\" />\n {activeHousehold.name}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-72 overflow-y-auto\">\n {households.map((h) => (\n <DropdownMenuItem key={h.id} onSelect={() => onSelect(h.id)}>\n {h.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {accountsQuery.isLoading ? (\n <Card>\n <CardContent className=\"p-6\">\n <LoadingState rows={3} />\n </CardContent>\n </Card>\n ) : accountsQuery.isError ? (\n <Card>\n <CardContent className=\"p-6\">\n <ErrorState onRetry={() => accountsQuery.refetch()} />\n </CardContent>\n </Card>\n ) : (\n <FadeIn>\n <GlassCard glow className=\"space-y-6\">\n {/* Branded header */}\n <div className=\"flex items-start justify-between gap-4 border-b border-border-subtle pb-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-xl bg-[var(--color-action-primary-bg)] text-sm font-bold text-[var(--color-action-primary-text)]\">\n BR\n </div>\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {activeHousehold.name}\n </h2>\n <p className=\"text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.subtitle', 'Wealth Statement')} ·{' '}\n {asOf}\n </p>\n </div>\n </div>\n <Badge variant={statusBadgeVariant(activeHousehold.status)}>\n {activeHousehold.status}\n </Badge>\n </div>\n\n {/* Net worth + allocation */}\n <div className=\"grid gap-6 md:grid-cols-2\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.netWorth', 'Net Worth')}\n </p>\n <p className=\"mt-1 text-3xl font-semibold tracking-tight text-text-primary\">\n {formatMoney(statement.netWorth, currency)}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-2 text-xs text-text-secondary\">\n <span>\n {translate('brainyrich.reports.netWorth.invested', 'Invested')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.invested, currency)}\n </span>\n </span>\n <span>·</span>\n <span>\n {translate('brainyrich.reports.netWorth.cash', 'Cash')}{' '}\n <span className=\"font-medium text-text-primary\">\n {formatMoney(statement.cash, currency)}\n </span>\n </span>\n </div>\n {netSeries.length > 1 ? (\n <Sparkline data={netSeries} height={44} className=\"mt-4\" />\n ) : null}\n </div>\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.allocation', 'Asset Allocation')}\n </p>\n {statement.allocation.length > 0 ? (\n <DonutChart\n data={statement.allocation}\n height={200}\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </div>\n </div>\n\n {/* Holdings schedule */}\n {holdings.length > 0 ? (\n <div>\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.holdings', 'Holdings Schedule')}\n </p>\n <div className=\"overflow-x-auto rounded-lg border border-border-subtle\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>\n {translate('brainyrich.reports.holdings.symbol', 'Symbol')}\n </TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((h) => (\n <TableRow key={h.id} className=\"transition-colors hover:bg-bg-elevated/60\">\n <TableCell>\n <div className=\"font-medium text-text-primary\">{h.symbol}</div>\n {h.name ? (\n <div className=\"text-xs text-text-secondary\">{h.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{assetClassLabel(h.assetClass)}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {h.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(h.marketValue, h.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n ) : null}\n\n {/* Progress to goals */}\n {goals.length > 0 ? (\n <div>\n <p className=\"mb-3 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.reports.statement.goals', 'Progress-to-Goals')}\n </p>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {goals.map((g) => (\n <GoalProgressCard\n key={g.id}\n goal={g}\n accountValues={statement.accountValues}\n translate={translate}\n />\n ))}\n </div>\n </div>\n ) : null}\n\n {/* Footer */}\n <p className=\"border-t border-border-subtle pt-4 text-center text-xs text-text-secondary\">\n {translate('brainyrich.reports.statement.footer', 'BrainyRich · Confidential')}\n </p>\n </GlassCard>\n </FadeIn>\n )}\n </div>\n );\n}\n\n/**\n * One goal's progress ring. Funded amount is derived from the goal's REAL\n * fundings: a fixed amount when set, otherwise the funding's allocation\n * percentage applied to that account's total value (cash + holdings).\n */\nfunction GoalProgressCard({\n goal,\n accountValues,\n translate,\n}: {\n goal: BraGoal;\n accountValues: Map<string, number>;\n translate: Translate;\n}) {\n const fundings = useGoalFundings(goal.id);\n const funded = useMemo(\n () =>\n fundings.data.reduce((sum, f) => {\n if (f.fixedAmount != null) return sum + f.fixedAmount;\n const value = accountValues.get(f.accountId) ?? 0;\n return sum + (f.allocationPct / 100) * value;\n }, 0),\n [fundings.data, accountValues]\n );\n const pct = goal.targetAmount > 0 ? Math.min(100, (funded / goal.targetAmount) * 100) : 0;\n\n return (\n <div className=\"flex flex-col items-center gap-2 rounded-xl border border-border-subtle bg-bg-surface p-4 text-center transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <ProgressRing value={pct} tone={projectionTone(goal.projection)} size={104} />\n <div className=\"flex items-center gap-1.5\">\n <Target className=\"size-3.5 text-text-secondary\" aria-hidden=\"true\" />\n <span className=\"text-sm font-medium text-text-primary\">{goal.name}</span>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {formatMoney(funded, goal.currency)} / {formatMoney(goal.targetAmount, goal.currency)}\n </p>\n <Badge variant={statusBadgeVariant(goal.projection)}>\n {translate(\n `brainyrich.goals.projection.${goal.projection}`,\n goal.projection.replace(/_/g, ' ')\n )}\n </Badge>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RiskPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/RiskPage.tsx"],"names":[],"mappings":"AAwQA,wBAAgB,QAAQ,4CAmkCvB"}
1
+ {"version":3,"file":"RiskPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/RiskPage.tsx"],"names":[],"mappings":"AAyQA,wBAAgB,QAAQ,4CA4kCvB"}